# Shinobi Library

### Ver 1.00

1998/10/4

# ファイルシステム関数

目次

## 0. 概要

> GD-ROM のアクセス機能を提供します。
> - ディレクトリのアクセス
> - ファイルのオープン/クローズ
> - ファイルの読み込み(完了復帰)

## 1. データ仕様

### 1.1 定数

  gdFsSeekのモード

  名称 | 機能
  --- | ---
  GDD_SEEK_SET | ファイルの先頭
  GDD_SEEK_CUR | ファイルの現在の読み込み位置
  GDD_SEEK_END | ファイルの最後

  再生ステータス

  名称 | 機能
  --- | ---
  GDD_STAT_IDLE | アイドル
  GDD_STAT_COMPLETE | 動作完了
  GDD_STAT_READ | 読み込み中
  GDD_STAT_ERR | エラー発生
  GDD_STAT_FATAL | 致命的なエラーが発生

  ドライブステータス

  名称 | 機能
  --- | ---
  GDD_DRVSTAT_BUSY | 稼働中
  GDD_DRVSTAT_PAUSE | ポーズ状態
  GDD_DRVSTAT_STANDBY | スタンバイ状態
  GDD_DRVSTAT_SEEK | シーク中
  GDD_DRVSTAT_PLAY | 再生中
  GDD_DRVSTAT_SCAN | スキャン再生中
  GDD_DRVSTAT_OPEN | トレイが開いている
  GDD_DRVSTAT_NODISC | ディスクがない
  GDD_DRVSTAT_RETRY | リトライ
  GDD_DRVSTAT_ERROR | エラー

  エラーステータス

  名称 | 機能
  --- | ---
  GDD_ERR_OK | 正常終了
  GDD_ERR_INIT | ライブラリ初期化に失敗しました
  GDD_ERR_RESET | ドライブの初期化に失敗しました
  GDD_ERR_LIBOV | オーバーレイの初期化に失敗しました
  GDD_ERR_MOUNT | マウントできませんでした
  GDD_ERR_DISC | 不正なディスクを使用しました
  GDD_ERR_DIRREC | 不正なディレクトリレコードハンドルを使用しました
  GDD_ERR_CANTOPEN | ファイルがオープンできませんでした
  GDD_ERR_NOTFOUND | ファイルが見つかりませんでした
  GDD_ERR_NOHNDL | 未使用のハンドルが見つかりませんでした
  GDD_ERR_ILLHNDL | 不正なハンドルを使用しました
  GDD_ERR_NOTDIR | ディレクトリではありません
  GDD_ERR_DIROVER | 格納できるエントリー数を超えました
  GDD_ERR_BUSY | 実行中です
  GDD_ERR_32ALIGN | 32バイト境界からはずれています
  GDD_ERR_SIZE | 32バイト単位ではありません
  GDD_ERR_SEEK | シークの指定が不正です
  GDD_ERR_OFS | 指定された位置が不正です
  GDD_ERR_ILLTMODE | 転送モードが正しくありません
  GDD_ERR_READ | 読み込みに失敗しました
  GDD_ERR_NOTREAD | 読み込み中ではありません
  GDD_ERR_TOUT | タイムアウトしました
  GDD_ERR_EOF | ファイルの終端に達しました
  GDD_ERR_TRAYOPEND | トレイがオープンされています
  GDD_ERR_SIZEOVER | 要求サイズが大きすぎます
  GDD_ERR_FATAL | 致命的なエラーが発生しました
  GDD_ERR_UNDEF | 未定義なエラーです
  GDD_ERR_NOERR | エラーはありませんでした
  GDD_ERR_RECOVER | エラーが発生しましたが復帰しました
  GDD_ERR_NOTREADY | ドライブの準備ができていません
  GDD_ERR_MEDIA | メディアエラー
  GDD_ERR_HWARE | ハードウエアエラー
  GDD_ERR_ILLREQ | 不正なリクエストを発行しました
  GDD_ERR_UNITATTENT | 媒体の交換を検出しました
  GDD_ERR_PROTECT | プロテクトされています
  GDD_ERR_ABORT | 中断されました
  GDD_ERR_NOREADABLE | 読み込みできません
  GDD_ERR_CHECKBUSY | メディアのチェック中です

  転送ステータス

  GDD_FS_TRANS_READY | 転送可能
  GDD_FS_TRANS_BUSY | 転送中
  GDD_FS_TRANS_COMPLETE | 転送完了
  GDD_FS_TRANS_ERROR | 転送エラー

  ファイルフラグ

  Bit7 | Bit6 | Bit5 | Bit4 | Bit3 | Bit2 | Bit1 | Bit0
  --- | --- | --- | --- | --- | --- | --- | ---
  Multi Extent | **** | **** | Protection | Record | Associated | Directory | Existence

  ### 1.2 データ型

  GDFS
    ファイルハンドル

  GDFS_DIRREC
    ディレクトリレコードハンドル

  GDFS_DIRINFO
    ディレクトリ情報

    型 | 名称 | 機能
    --- | --- | ---
    Sint32 | fad | 先頭FAD
    Sint32 | fsize | ファイルサイズ
    Uint8 | flag | ファイルフラグ
    Uint8 | pad[3] | 予約

  GDFS_FUNC
    コールバック関数

    型 | 名称 | 機能
    --- | --- | ---
    void * | obj | コールバック関数に渡される第一引数

  GDFS_ERRFUNC
    エラーコールバック関数

    型 | 名称 | 機能
    --- | --- | ---
    void * | obj | コールバック関数に渡される第一引数
    Sint32 | errcode | エラーコード

  GDFS_DAINFO
    ディレクトリ情報

    型 | 名称 | 機能
    --- | --- | ---
    Sint32 | track | トラック番号
    Sint32 | min | 経過時間(分)
    Sint32 | sec | 経過時間(秒)
    Sint32 | frame | 経過時間(フレーム)
    Sint32 | fad | フレームアドレス

  ### 1.3 マクロ

  ## gdFsGetWorkSize

  ［SYNOPSIS］
    gdFsGetWorkSize(max_open)
  ［ARGUMENTS］
    max_open
    同時にオープンできるファイル数
  ［RETURN］
    必要なライブラリワークエリアのバイト数
  ［DESCRIPTION］
    ライブラリのワークエリアの必要とするバイト数を求めます
  ［EXAMPLES］
    Uint32 gdfswork[gdFsGetWorkSize(8)/4];

  ## gdFsGetDirrecSize

  ［SYNOPSIS］
    gdFsGetDirrecSize(max_dirent)
  ［ARGUMENTS］
    max_dirent
    ディレクトリの最大エントリ数
  ［RETURN］
    必要なディレクトリバッファのバイト数
  ［DESCRIPTION］
    ディレクトリバッファのバイト数を求めます
  ［EXAMPLES］
    Uint32 gdfscurdir[gdFsGetDirrecSize(64)/4];

  ## gdFsCalcSctSize

  ［SYNOPSIS］
    gdFsCalcSctSize(bytes)
  ［ARGUMENTS］
    bytes
    ファイルのバイトサイズ
  ［RETURN］
    セクタサイズ
  ［DESCRIPTION］
    バイト数からセクタ数を算出します
  ［EXAMPLES］

      	GDFS gf;
      	Sint32 flen;
      	Sint32 fslen;

      	gf = gdFsOpen("TEST.BIN", NULL);
      	gdFsGetFileSize(gdfs, &flen);
      	fslen = gdFsCalcSctSize(flen);

  ## 2. 関数仕様

  ### 2.1関数一覧

  関数 | 機能
  --- | ---
  gdFsInit | GDFSの初期化
  gdFsReinit | ファイルシステムの再マウント
  gdFsFinish | ファイルシステムの終了
  gdFsCreateDirhn | ディレクトリハンドルの生成
  gdFsLoadDir | ディレクトリの読み取り
  gdFsSetDir | カレントディレクトリを設定
  gdFsChangeDir | カレントディレクトリの変更
  gdFsGetDirInfo | ファイルの情報を取得
  gdFsOpen | ファイルのオープン
  gdFsOpenRange | ファイルのセクタ指定オープン
  gdFsClose | ファイルのクローズ
  gdFsSeek | ファイルの読み出し位置変更
  gdFsTell | ファイルの次の読み出し位置を取得
  gdFsCheckEof | ファイルがEOFに到達したかを調べる
  gdFsGetFileSize | ファイルサイズの取得
  gdFsGetFileSctSize | ファイルのセクタサイズ取得
  gdFsGetFad | ファイルのFADを取得
  gdFsRead | ファイルの読み込み
  gdFsReqRd32 | ファイルの読み込み
  gdFsGetStat | ファイルの状態取得
  gdFsGetErrStat | ファイルのエラー状態取得
  gdFsGetNumRd | ファイルの読み込み済みサイズの取得
  gdFsStopRd | ファイルの読み込み中断
  gdFsMovePickup | ピックアップ (読取装置) の移動
  gdFsReqGdRd | GDバッファへの先読みのリクエスト発行
  gdFsTrans32 | GDバッファからの転送指定
  gdFsGetWorkHn | 現在実行中のハンドルの取得
  gdFsGetSysHn＜新規＞ | システムハンドルの取得
  gdFsGetTransStat | 転送状態を取得
  gdFsGetToc | TOCの取得
  gdFsGetDrvStat | ドライブの状態の取得
  gdFsReqDrvStat＜新規＞ | ドライブ状態の更新
  gdFsEntryRdEndFunc | 読み込み終了時のコールバック関数を登録
  gdFsEntryTrEndFunc | 転送終了時のコールバック関数を登録
  gdFsEntryErrFunc | エラー発生時のコールバック関数を登録
  gdFsDaPlay | DAのトラック再生
  gdFsDaPlaySct | DAのセクタ指定再生
  gdFsDaStop | DAの再生停止
  gdFsDaPause | DAの再生の一時停止
  gdFsDaRelease | DAの再生の一時停止解除
  gdFsDaGetInfo＜新規＞ | DAの再生情報を取得

  ### 2.2関数API

  ## gdFsInit

  ［関数］
    Sint32 gdFsInit(Sint32 max_open, void *gdfs_work, Sint32 max_dirent, void *dirbuf)
  ［入力］
  max_open
    同時にオープンできるファイル数
  gdfs_work
    ワークエリアのポインタ（ユーザー領域から提供）
  max_dirent
    カレントディレクトリのエントリ数
  dirbuf
    カレントディレクトリのバッファ（ユーザー領域から提供）
  ［出力］
    なし
  ［戻値］
    この関数で返される主なエラーコードは以下の通りです。

    返される値 | 意味
    --- | ---
    GDD_ERR_OK | 初期化完了
    GDD_ERR_32ALIGN | gdfs_workが32バイト境界にない
    GDD_ERR_RESET | ドライブのリセットに失敗した
    GDD_ERR_TRAYOPEND | GDトレイが空いている
    GDD_ERR_DISC | このディスクは扱えません
    GDD_ERR_MOUNT | マウントに失敗した
    GDD_ERR_DIROVER | ルートディレクトリのエントリー数が多すぎるエラーステータス

  ［機能］
    GDファイルシステムを初期化します。
  ［使用例］

        Uint32 gdfswork[gdFsGetWorkSize(8)/4];
        Uint32 gdfscurdir[gdFsGetDirrecSize(64)/4];

        gdFsInit(8, gdfswork, 64, gdfscurdir);

  ［注意］
    gdfs_workは32 Byte alignでなければなりません。(dirbuf は 4 Byte align で結構です。)
    一度初期化が完了した後、gdFsFinish関数を呼び出さずにgdFsInit関数を呼び出しても再初期化されません。
    gdFsInit関数で処理される主な内容は、以下のとおりです。
    1. デバイスドライバの初期化
    2. ワークエリアの初期化
    3. デバイスの初期化
    4. マウント処理

  ## gdFsReinit

  ［関数］
    Sint32 gdFsReinit(void)
  ［入力］
    なし
  ［出力］
    なし
  ［戻値］
    エラーコード
  ［機能］
    GDファイルシステムの再マウントをします。
    デバイスの初期化からマウント処理までを行います。
    メディアの交換時などに使用してください。
  ［使用例］

        gdFsReinit();

  ［注意］

  ## gdFsFinish

  ［関数］
    gdFsFinish(void)
  ［入力］
    なし
  ［出力］
    なし
  ［戻値］
    なし
  ［機能］
    GDファイルシステムの使用を停止します
  ［使用例］

        Uint32 gdfswork[gdFsGetWorkSize(8)/4];
        Uint32 gdfscurdir[gdFsGetDirrecSize(64)/4];

        gdFsInit(8, gdfswork, 64, gdfscurdir);
        gdFsFinish();

  ［注意］

  ## gdFsCreateDirhn

  ［関数］
    GDFS_DIRREC gdFsCreateDirhn(void *dirbuf, Sint32 max_dirent)
  ［入力］
  dirbuf
    ディレクトリのバッファ
  max_dirent
    ディレクトリのエントリ数
  ［出力］
    なし
  ［戻値］
    ディレクトリレコードハンドル
  ［機能］
    ディレクトリハンドルを生成します
  ［使用例］

        Uint32 dirbuf[gdFsGetDirrecSize(64)];
        GDFS_DIRREC g_dir;

        g_dir = gdFsCreateDirhn(dirbuf, 64);

  ［注意］

  ## gdFsLoadDir

  ［関数］
    Sint32 gdFsLoadDir(const char *dirname, GDFS_DIRREC gf_dirrec)
  ［入力］
  dirname
    ディレクトリ名
  ［出力］
  gf_dirrec
    ディレクトリレコードハンドル
    (NULLの場合はカレントディレクトリへ)
  ［戻値］
    エラーコード
  ［機能］
    ディレクトリレコードを読み込みます。
  ［使用例］

        /* サンプル 1 */
        /* MOVIE directory を g_dir へ読み取る */
        Uint32 dirbuf[gdFsGetDirrecSize(64)];
        GDFS_DIRREC g_dir;

        g_dir = gdFsCreateDirhn(dirbuf, 64);
        gdFsLoadDir("MOVIE", g_dir);

        /* サンプル 2 */
        /* カレントディレクトリを DATA directory へ移動する */
        gdFsLoadDir("DATA", NULL);

  ［注意］
    大文字と小文字は同一視します。

  ## gdFsSetDir

  ［関数］
    Sint32 gdFsSetDir(GDFS_DIRREC gf_dirrec)
  ［入力］
  gf_dirrec
    ディレクトリレコードハンドル
  ［出力］
    なし
  ［戻値］
    エラーコード
  ［機能］
    カレントディレクトリを設定します。
  ［使用例］

        /* MOVIE directory を g_dir へ読み取る */
        Uint32 dirbuf[gdFsGetDirrecSize(64)];
        GDFS_DIRREC g_dir;

        g_dir = gdFsCreateDirhn(dirbuf, 64);
        gdFsLoadDir("MOVIE", g_dir);
        gdFsSetDir(g_dir);

  ［注意］

  ## gdFsChangeDir

  ［関数］
    Sint32 gdFsChangeDir(const char *dirname)
  ［入力］
  dirname
    ディレクトリ名
  ［出力］
    なし
  ［戻値］
    エラーコード
  ［機能］
    カレントディレクトリを変更します。
  ［使用例］

        /* カレントディレクトリを DATA directory へ移動する */
        gdFsChangeDir("DATA");

  ［注意］
    大文字と小文字は同一視します。

  ## gdFsGetDirInfo

  ［関数］
    Sint32 gdFsGetDirInfo(const char *name, GDFS_DIRINFO dirinfo)
  ［入力］
  name
    ファイル名／ディレクトリ名
  ［出力］
  dirinfo
    ファイル情報
  ［戻値］
    エラーコード
  ［機能］
    ファイルの情報を取得します
  ［使用例］

        GDFS_DIRINFO dinfo;
        gdFsGetDirInfo("ABC.DAT", &dinfo);

  ［注意］

  ## gdFsOpen

  ［関数］
    GDFS gdFsOpen(const char *fname, GDFS_DIRREC gf_dirrec)
  ［入力］
  fname
    ファイル名
  gf_dirrec
    ファイル名を検索するディレクトリレコードハンドル
  NULL の場合はカレントから検索します。
  ［出力］
    なし
  ［戻値］
  NULL
    失敗
  それ以外
    ファイルハンドル
  ［機能］
    ファイルをオープンします
  ［使用例］

        /* サンプル 1 */
        GDFS gf;

        gf = gdFsOpen("A.BIN", NULL);

        /* サンプル 2 */
        GDFS gf;
        Uint32 dirbuf[gdFsGetDirSize(64)];
        GDFS_DIRREC g_dir;

        g_dir = gdFsCreateDirhn(dirbuf, 64);
        gdFsLoadDir("MOVIE", g_dir);
        gf = gdFsOpen("SMP.MOV", g_dir);

  ［注意］

  ## gdFsOpenRange

  ［関数］
    GDFS gdFsOpenRange(Sint32 stsct, Sint32 nsct)
  ［入力］
  stsct開始セクタ
  endsct終了セクタ
  ［出力］
    なし
  ［戻値］
  NULL
    失敗
  それ以外
    ファイルハンドル
  ［機能］
    セクタを指定してファイルをオープンします。
  ［使用例］

        GDFS gf;

        gf = gdFsOpenRange(0xB555, 0x10);
        gdFsClose(gf);

  ［注意］
    単密領域のファイルオープンは出来ません。

  ## gdFsClose

  ［関数］
    void gdFsClose(GDFS gdfs);
  ［入力］
  gdfs
    ファイルハンドル
  ［出力］
    なし
  ［戻値］
    なし
  ［機能］
    ファイルをクローズします
  ［使用例］

        GDFS gf;

        gf = gdFsOpen("TEST.BIN", NULL);
        gdFsClose(gf);

  ［注意］

  ## gdFsSeek

  ［関数］
    Sint32 gdFsSeek(GDFS gdfs, Sint32 sctno, Sint32 type)
  ［入力］
  gdfs
    ファイルハンドル
  sctno
    セクタ番号
  type

    GDD_SEEK_SET | ファイルの先頭
    GDD_SEEK_CUR | ファイルの現在の読み込み位置
    GDD_SEEK_END | ファイルの最後

  ［出力］
    なし
  ［戻値］
    エラーコード
  ［機能］
    ファイルの読み込みポインタを移動します
  ［使用例］

        GDFS gf;

        gf = gdFsOpen("TEST.BIN", NULL);

        /* 先頭から 5 セクタ目にシークする */
        gdFsSeek(gf, 5, SEEK_SET);

  ［注意］

  ## gdFsTell

  ［関数］
    Sint32 gdFsTell(GDFS gdfs);
  ［入力］
  gdfs
    ファイルハンドル
  ［出力］
    なし
  ［戻値］
    読み込み位置
  ［機能］
    セクタ単位でファイルの読み込みポインタの位置を取得します。
  ［使用例］

        Sint32 pos;
        GDFS gf;

        gf = gdFsOpen("TEST.BIN", NULL);

        pos = gdFsTell(gf);

  ［注意］

  ## gdFsCheckEof

  ［関数］
    Sint32 gdFsCheckEof(GDFS gdfs, Bool *iseof)
  ［入力］
  gdfs
    ファイルハンドル
  ［出力］
  iseof

    0 | ファイルの終了ではない
    0以外 | ファイルの終了

  ［戻値］
    エラーコード
  ［機能］
    ファイルが EOF に到達したかを調べます。
  ［使用例］

        GDFS gf;
        Bool flag;
        Sint32 ret;

        gf = gdFsOpen("TEST.BIN", NULL);

        /* 読み込み処理の後 */

        ret = gdFsCheckEof(gf, &flag);
        if (ret == GDD_ERR_OK && flag == TRUE) {
          gdFsClose(gf);
          return;
        }

  ［注意］

  ## gdFsGetFileSize

  ［関数］
    Bool gdFsGetFileSize(GDFS gdfs, Sint32 *fsize)
  ［入力］
  gdfs
    ファイルハンドル
  ［出力］
  fsize
    ファイルサイズ(バイト)
  ［戻値］
    エラーコード
  ［機能］
    ファイルサイズを取得します
  ［使用例］

        GDFS gf;
        Sint32 flen;

        gf = gdFsOpen("TEST.BIN", NULL);
        gdFsGetFileSize(gdfs, &flen);

  ［注意］

  ## gdFsGetFileSctSize

  ［関数］
    Bool gdFsGetFileSctSize(GDFS gdfs, Sint32 *fsctsize)
  ［入力］
  gdfs
    ファイルハンドル
  ［出力］
  fsctsizeファイルサイズ (バイト)
  ［戻値］
    エラーコード
  ［機能］
    ファイルのセクタサイズを取得します
  ［使用例］

        GDFS gf;

        Sint32 fslen;

        gf = gdFsOpen("TEST.BIN", NULL);
        gdFsGetFileSctSize(gdfs, &fslen);

  ［注意］

  ## gdFsGetFad

  ［関数］
    Bool gdFsGetFad(GDFS gdfs, Sint32 *fad)
  ［入力］
  gdfs
    ファイルハンドル
  ［出力］
  fad
    フレームアドレス (物理セクタ)
  ［戻値］
    エラーコード
  ［機能］
    ファイルの FAD を取得します
  ［使用例］

        Sint32 fad;
        Sint32 gf;

        gf = gdFsOpen("TEST.BIN", NULL);
        gdFsGetFad(gf, &fad);

  ［注意］

  ## gdFsRead

  ［関数］
    Sint32 gdFsRead(GDFS gdfs, Sint32 nsct, void *buf)
  ［入力］
  gdfs
    ファイルハンドル
  nsct
    読み込むセクタ数
  ［出力］
  buf
    格納バッファ
  ［戻値］
    エラーコード
  ［機能］
    ファイルを読み込みます。
    読み込みが終了するまでは関数から戻ってきません。（完了復帰）
  ［使用例］

        GDFS gf;
        Sint32 buf[32*2048/4];

        gf = gdFsOpen("TEST.BIN", NULL);
        gdFsRead(gf, 32, buf);
        gdFsClose(gf);

  ［注意］

  ## gdFsReqRd32

  ［関数］
    Sint32 gdFsReqRd32(GDFS gdfs, Sint32 nsct, void *buf)
  ［入力］
  gdfs
    ファイルハンドル
  nsct
    読み込むセクタ数
  ［出力］
  buf
    格納バッファ
  ［戻値］
    実際にリクエストされたセクタ数 (> 0)。負のときはエラーコード
  ［機能］
    ファイルの読み込みリクエストします。
    関数は読み込みのリクエストをかけただけで戻ってきます。実際の読み込みが終了したかどうかについては、別途調べる必要があります。（即時復帰）
  ［使用例］

        GDFS gf;
        Uint32 buf[32*2048/4];

        gf = gdFsOpen("TEST.BIN", NULL);
        gdFsReqRd32(gf, 32, buf);

        while (gdFsGetStat(gf) == GDD_STAT_READ);

        gdFsClose(gf);

  ［注意］
    bufは32 bytes alignにする必要があります。
    また、リクエストの受付は同時に1つのみです。

  ## gdFsGetStat

  ［関数］
    Sint32 gdFsGetStat(GDFS gdfs)
  ［入力］
  gdfs
    ファイルハンドル
  ［出力］
    なし
  ［戻値］

    GDD_STAT_IDLE | アイドル
    GDD_STAT_COMPLETE | 動作完了
    GDD_STAT_READ | 読み込み中
    GDD_STAT_ERR | エラー発生
    GDD_STAT_FATAL | 致命的なエラーが発生

  ［機能］
    ハンドルの状態を取得します
  ［使用例］

        GDFS gf;
        Uint32 buf[32*2048/4];

        gf = gdFsOpen("TEST.BIN", NULL);
        gdFsReqRd32(gf, 32, buf);

        while (gdFsGetStat(gf) == GDD_STAT_READ);

        gdFsClose(gf);

  ［注意］

  ## gdFsGetErrStat

  ［関数］
    Sint32 gdFsGetErrStat(GDFS gdfs)
  ［入力］
  gdfs
    ファイルハンドル
  ［出力］
    なし
  ［戻値］
    エラーコード
  ［機能］
    ハンドルのエラー状態を取得します
  ［使用例］

        GDFS gf;
        Uint32 buf[32*2048/4];
        Sint32 stat;
        Sint32 err;

        gf = gdFsOpen("TEST.BIN", NULL);
        gdFsReqRd32(gf, 32, buf);

        while ((stat = gdFsGetStat(gf)) == GDD_STAT_READ);

        if (stat == GDD_STAT_ERR) {
          err = gdFsGetErrStat(gf);
          /* error 処理 */
        }
        gdFsClose(gf);

  ［注意］

  ## gdFsGetNumRd

  ［関数］
    Sint32 gdFsGetNumRd(GDFS gdfs);
  ［入力］
  gdfs
    ファイルハンドル
  ［出力］
    なし
  ［戻値］
    0以上 読み込んだバイト数
  ［機能］
    読み込んだバイト数を取得します
  ［使用例］

        GDFS gf;
        Uint32 buf[32*2048/4];

        gf = gdFsOpen("TEST.BIN", NULL);
        gdFsReqRd32(gf, 32, buf);

        while (gdFsGetStat(gf) != GDD_STAT_COMPLETE) {
          readnum = gdFsGetNumRd(gdfs);
        }

        gdFsClose(gf);

  ［注意］

  ## gdFsStopRd

  ［関数］
    Sint32 gdFsStopRd(GDFS gdfs)
  ［入力］
  gdfs
    ファイルハンドル
  ［出力］
    なし
  ［戻値］
    エラーコード
  ［機能］
    リクエストを中断します
  ［使用例］

        gdFsStopRd(gf);

  ［注意］

  ## gdFsMovePickup

  ［関数］
    Sint32 gdFsMovePickup(GDFS gdfs)
  ［入力］
  gdfs
    ファイルハンドル
  ［出力］
    なし
  ［戻値］
    エラーコード
  ［機能］
    次の読み込み位置に、ピックアップを移動する
  ［使用例］

        gdFsMovePickup(gf);

  ［注意］

  ## gdFsReqGdRd

  ［関数］
    Sint32 gdFsReqGdRd(GDFS gdfs, Sint32 nsct)
  ［入力］
  gdfs
    ファイルハンドル
  nsct
    読み込みセクタ数
  ［出力］
    なし
  ［戻値］
    実際にリクエストされたセクタ数 (> 0)。負のときはエラーコード
  ［機能］
    GD バッファへの先読みリクエスト発行
  ［使用例］

        gdFsReqGdRd(gf, 128);

  ［注意］

  ## gdFsTrans32

  ［関数］
    Sint32 gdFsTrans32(GDFS gdfs, Sint32 nbytes, void *buf)
  ［入力］
  gdfs
    ファイルハンドル
  nbytes
    転送するバイト数 (32 バイト単位)
  ［出力］
  buf
    転送先アドレス
  ［戻値］
    エラーコード
  ［機能］
    GD バッファからの転送指定
  ［使用例］

        while ((stat = gdFsGetStat(gf)) == GDD_STAT_READ) {
          if (gdFsGetTransStat(gf) == GDD_TRANS_READY)
          gdFsTrans32(gf, 2048, buf);
        }

  ［注意］

  ## gdFsGetTransStat

  ［関数］
    Sint32 gdFsGetTransStat(GDFS gdfs)
  ［入力］
  gdfs
    ファイルハンドル
  ［出力］
    なし
  ［戻値］
    転送状態
  ［機能］
    転送状態を取得
  ［使用例］

        gdFsGetTransStat(gf);

  ［注意］

  ## gdFsGetWorkHn

  ［関数］
    GDFS gdFsGetWorkHn(void)
  ［入力］
    なし
  ［出力］
    なし
  ［戻値］
    現在実行中のハンドル。なければNULL。
  ［機能］
    動作中のハンドルを取得
  ［使用例］

        GDFS gf;
        gf = gdFsGetWorkHn();

  ［注意］

  ## gdFsGetSysHn

  ［関数］
    GDFS gdFsGetSysHn(void)
  ［入力］
    なし
  ［出力］
    なし
  ［戻値］
    システムハンドル。
  ［機能］
    システムハンドルを取得します。
    システムハンドルが実行中かどうかを調査するために使用します。
  ［使用例］

        GDFS sys;
        sys = gdFsGetSysHn();
        stat = gdFsGetStat(sys);

  ［注意］

  ## gdFsGetToc

  ［関数］
    Sint32 gdFsGetToc(Sint32 type, void *buf)
  ［入力］
  type
    TOC のタイプ
    1
      高密
  ［出力］
  buf
    TOC を読み込むためのバッファ
    必要バイト数は408バイトです。
  ［戻値］
    エラーコード
  ［機能］
    TOC の取得します
  ［使用例］

        gdFsGetToc(0, &buf);

  ［注意］
    単密領域のTOC情報は取得できなくなりました。

  ## gdFsGetDrvStat

  ［関数］
    Sint32 gdFsGetDrvStat(void)
  ［入力］
    なし
  ［出力］
    なし
  ［戻値］
    ドライブステータス

    名称 | 機能
    --- | ---
    GDD_DRVSTAT_BUSY | 稼働中
    GDD_DRVSTAT_PAUSE | ポーズ状態
    GDD_DRVSTAT_STANDBY | スタンバイ状態
    GDD_DRVSTAT_SEEK | シーク中
    GDD_DRVSTAT_PLAY | 再生中
    GDD_DRVSTAT_SCAN | スキャン再生中
    GDD_DRVSTAT_OPEN | トレイが開いている
    GDD_DRVSTAT_NODISC | ディスクがない
    GDD_DRVSTAT_RETRY | リトライ
    GDD_DRVSTAT_ERROR | エラー

  ［機能］
    ドライブ状態の取得します
  ［使用例］

        Sint32 dstat;
        dstat = gdFsGetDrvStat();

  ［注意］

  ## gdFsReqDrvStat

  ［関数］
    Sint32 gdFsReqDrvStat(void)
  ［入力］なし
  ［出力］なし
  ［戻値］
    エラーコード
  ［機能］
    ドライブ状態を更新させます。
  ［使用例］

        Sint32 dstat;
        gdFsReqDrvStat();
        /* リクエスト動作完了の後 */
        dstat = gdFsGetDrvStat();

  ［注意］

  ## gdFsEntryRdEndFunc

  ［関数］
    void gdFsEntryRdEndFunc(GDFS gdfs, GDFS_FUNC func, void *obj);
  ［入力］
  gdfs
    ファイルハンドル
  func
    コールバック関数
  obj
    コールバック関数に渡す第1引数
  ［出力］
    なし
  ［戻値］
    なし
  ［機能］
    読み込み完了時のコールバック関数を登録します
  ［使用例］

        void rdend_callback(void *obj)
        {
        /* 処理 */
        }

        gdFsEntryRdEndFunc(gf, rdend_callback, (void *) 0x1234);

  ［注意］

  ## gdFsEntryTrEndFunc

  ［関数］
    void gdFsEntryTrEndFunc(GDFS gdfs, GDFS_FUNC func, void *obj)
  ［入力］
  gdfs
    ファイルハンドル
  func
    コールバック関数
  obj
    コールバック関数にわたす第一引数
  ［出力］
    なし
  ［戻値］
    なし
  ［機能］
    転送完了時のコールバック関数を登録します
  ［使用例］

        void trend_callback(void *obj)
        {
        /* 処理 */
        }

        gdFsEntryTrEndFunc(gf, trend_callback, (void *) 0x1234);

  ［注意］

  ## gdFsEntryErrFunc

  ［関数］
    void gdFsEntryErrFunc(GDFS gdfs, GDFS_ERRFUNC func, void *obj)
  ［入力］
  gdfs
    ファイルハンドル
  func
    コールバック関数
  obj
    コールバック関数にわたす第一引数
  ［出力］
    なし
  ［戻値］
    なし
  ［機能］
    エラー発生時のコールバック関数を登録します
  ［使用例］

        void err_callback(void *obj, Sint32 errcode)
        {
        /* 処理 */
        }

        gdFsEntryErrFunc(gf, err_callback, (void *) 0x1234);

  ［注意］

  ## gdFsDaPlay

  ［関数］
    Sint32 gdFsDaPlay(Sint32 st_track, Sint32 end_track, Sint32 reptime)
  ［入力］
  st_track
    開始トラック番号
  end_track
    終了トラック番号
  reptime
    繰り返し回数(0-14: くり返し回数, 15: 無限ループ)
  ［出力］
    なし
  ［戻値］
    エラーコード
  ［機能］
    DA再生を開始します
  ［使用例］

        gdFsDaPlay(4, 4, 0);

  ［注意］
    単密領域のDA再生は出来ません。

  ## gdFsDaPlaySct

  ［関数］
    Sint32 gdFsDaPlaySct(Sint32 st_sct, Sint32 end_sct, Sint32 reptime)
  ［入力］
  st_sct
    開始セクタ
  end_sct
    終了セクタ
  reptime
    繰り返し回数(0-14: くり返し回数, 15: 無限ループ)
  ［出力］
    なし
  ［戻値］
    エラーコード
  ［機能］
    DA 再生をセクタ指定で開始します
  ［使用例］

        gdFsDaPlaySct(0xC000, 0xD000, 2);

  ［注意］
    単密領域のDA再生は出来ません。

  ## gdFsDaStop

  ［関数］
    Sint32 gdFsDaStop(void)
  ［入力］
    なし
  ［出力］
    なし
  ［戻値］
    エラーコード
  ［機能］
    DA 再生を停止させます
  ［使用例］

        gdFsDaStop();

  ［注意］

  ## gdFsDaPause

  ［関数］
    Sint32 gdFsDaPause(void)
  ［入力］
    なし
  ［出力］
    なし
  ［戻値］
    エラーコード
  ［機能］
    DA 再生の一時停止
  ［使用例］

        gdFsDaPause();

  ［注意］

  ## gdFsDaRelease

  ［関数］
    Sint32 gdFsDaRelease(Sint32 reptime)
  ［入力］
  reptime
    くり返し回数
  ［出力］
    なし
  ［戻値］
    エラーコード
  ［機能］
    DA 再生の一時停止解除
  ［使用例］

        gdFsDaRelease(0);

  ［注意］

  ## gdFsDaGetInfo

  ［関数］
    Sint32 gdFsDaGetInfo(GDFS_DAINFO info)
  ［入力］
    なし
  ［出力］
  info
    DA再生情報
  ［戻値］
    エラーコード
  ［機能］
    DAの再生情報を取得します。
  ［使用例］

        gdFsDaGetInfo(info);

  ［注意］
    システムハンドルを取得しステータスを監視してください。
    GDD_STAT_COMPLETE になった時だけ情報が格納されます。
  オーバービューに戻る