# Shinobi Library

1998/09/21

# バックアップ関数

## 0. 概要

> 本関数を用いることで、Dreamcast本体に接続されたビジュアルメモリへのデータのセーブやロード、プログラムデータの登録を行います。
> 本ライブラリは、所定のデータ形式に併せて作成されているデータを前提として動作しますので、ビジュアルメモリ等に転送するデータは、期待するデータフォーマットにしたがっている必要が有ります。

### 0.1複数のバックアップRAMの識別

本関数では、複数のバックアップの接続をサポートしており、それぞれのペリフェラルを次のマクロによって識別することが可能です。

マクロ | 機能
--- | ---
BUD_DRIVE_A1 | ポートAのコントローラの拡張コネクタ1に接続されたバックアップRAM
BUD_DRIVE_A2 | ポートAのコントローラの拡張コネクタ2に接続されたバックアップRAM
BUD_DRIVE_B1 | ポートBのコントローラの拡張コネクタ1に接続されたバックアップRAM
BUD_DRIVE_B2 | ポートBのコントローラの拡張コネクタ2に接続されたバックアップRAM
BUD_DRIVE_C1 | ポートCのコントローラの拡張コネクタ1に接続されたバックアップRAM
BUD_DRIVE_C2 | ポートCのコントローラの拡張コネクタ2に接続されたバックアップRAM
BUD_DRIVE_D1 | ポートDのコントローラの拡張コネクタ1に接続されたバックアップRAM
BUD_DRIVE_D2 | ポートDのコントローラの拡張コネクタ2に接続されたバックアップRAM

### 0.2バックアップファイルの属性

バックアップファイルは次に示すような属性を持っています。

コピーフラグ
  00hからFFhまでの値を取る。セーブ時に指定可能で、FFhの時は、GUIやバックアップ管理画面でのコピー不可
実行可能
  携帯ゲームなどの目的で独立して動かすことの出来るプログラムデータ

### 0.3 関数の種類

バックアップに関する関数は即時復帰型応答の関数と、完了復帰型応答の関数の2種類が存在します。
即時復帰型関数は、buStat()によってステータスを毎フレーム取得して終了を待つ必要があります。ステータスが終了を示さない限り、同じドライブに対してファイルシステム関数を呼び出すことはできません。呼び出した場合はエラーを返します。
また、処理終了時に指定の完了コールバック関数をコールバックし、 処理中には経過コールバック関数をコールバックします。
このタイプの関数の返値は、BUD_ERR_OKまたはBUD_ERR_BUSYです。
引数で示されるアドレスにデータを取得する関数(buLoadFile()など)の場合、ステータスが完了を示すまでは有効データが格納されないので注意してください。
引数で示されるアドレスのデータをバックアップRAMに書き込む関数(buSaveFile()等)の場合、ステータスが完了を示すまでデータの内容を保証してください。

完了復帰型 | buInit
buExit
buMountDisk
buUnmount
buSetCompleteCallback
buSetProgressCallback
buIsReady
buIsFormat
buGetDiskFree
buGetDiskInfo
buIsExistFile
buGetFileSize
buGetFileInfo
buStat
buFindFirstFile
buFindNextFile
buFindExecFile
buMakeBackupFileImage
buCalcBackupFileSize
buAnalyzeBackupFileImage
即時復帰型 | buGetLastError
buSaveFile
buLoadFile
buDeleteFile
buSetFileAttr
buLoadFileEx
buFormatDisk
buSaveExecFile
buDefragDisk

## 1.データ仕様

### 1.1 構造体仕様

BUS_DISKINFO構造体

定義

      typedef struct {
        Sint8 volume[32];
        Uint16 total_blocks;
        Uint16 total_user_blocks;
        Uint16 free_blocks;
        Uint16 free_user_blocks
        Uint16 total_exe_blocks;
        Uint16 free_exe_blocks
        Uint16 block_size;
        Uint16 icon_no;
        BUS_TIME time;
      } BUS_DISKINFO

説明
  バックアップRAMの情報を格納する構造体です。

メンバ

  volume | ボリュームデータ
  total_blocks | 全ブロック数
  total_user_blocks | 全ユーザーブロック数(最大ファイル数)
  free_blocks | 空きブロック数
  free_user_blocks | 空きユーザーブロック数
  total_exe_blocks | 全実行ファイル用ブロック数
  free_exe_blocks | 空き実行ファイル用ブロック数
  block_size | ブロックサイズ(512固定)
  icon_no | アイコン番号(0〜255)
  time | フォーマットされた時刻

参照
  buDiskInfo()、BUS_TIME

BUS_FILEINFO構造体

定義

      typedef struct {
        Uint32 filesize;
        Uint16 blocks;
        Uint8 type;
        Uint8 copyflag;
        Uint16 headerofs;
        BUS_TIME time;
      } BUS_FILEINFO;

説明
  ファイルの情報を格納する構造体です。

メンバ

  filesize | ファイルサイズ(バイト数)
  blocks | 使用ブロック数
  type | ファイルタイプ

  BUD_FILETYPE_NORMAL | 通常ファイル
  BUD_FILETYPE_EXECUTABLE | 実行ファイル

  copyflag | コピーフラグ(FFH=コピー不可)
  headerofs | ヘッダオフセット(0固定)
  time | タイムスタンプ

参照
  buGetFileInfo()、BUS_TIME

BUS_TIME構造体

定義

      typedef struct {
        Uint16 year;
        Uint8 month;
        Uint8 day;
        Uint8 hour;
        Uint8 minute;
        Uint8 second;
        Uint8 dayofweek;
      } BUS_TIME;

説明
  タイムスタンプを格納する構造体です。

メンバ

  year | 年(1998〜)
  month | 月(1〜12)
  day | 日(1〜31)
  hour | 時(0〜23)
  minute | 分(0〜59)
  second | 秒(0〜59)
  dayofweek | 曜日(日 = 0,月 = 1, ... 土 = 6)

参照
  buSaveFile()、BUS_DISKINFO、BUS_FILEINFO

BUS_BACKUPFILEHEADER構造体

定義

      typedef struct {
      	char vms_comment[18];
      	char btr_comment[34];
      	Uint8 game_name[16];
      	void* icon_palette;
      	void* icon_data;
      	Uint16 icon_num;
      	Uint16 icon_speed;
      	void* visual_data;
      	Uint16 visual_type;
      	Uint16 reserved;
      	void* save_data;
      	Uint32 save_size;
      } BUS_BACKUPFILEHEADER;

説明
  バックアップファイルイメージ作成／解析用の情報を格納した構造体です。

メンバ

  vms_comment | VMS用コメント
  btr_comment | BOOT ROM用コメント
  game_name | ゲーム名（ソートアイテム）
  icon_palette | アイコンパレットアドレス
  icon_data | アイコンデータアドレス
  icon_num | アイコン枚数
  icon_speed | アイコンアニメーションスピード
  visual_data | ビジュアルデータアドレス
  visual_type | ビジュアルタイプ
  reserved | 予約
  save_data | アプリケーションセーブデータアドレス
  save_size | アプリケーションセーブデータサイズ

参照
  buMakeBackupFileImage()、buAnalyzeBackupFileImage()

### 1.2 データ型仕様

## BU_COMPLETECALLBACK

［関数］
  Sint32 ( *BU_COMPLETECALLBACK )(Sint32 drive, Sint32 op, Sint32 status, Uint32 param );
［入力］
  drive
    ドライブ番号
  op
    オペレーションコード

    BUD_OP_NOP | 何もしない。
    BUD_OP_MOUNT | 接続(マウント)時
    BUD_OP_UNMOUNT | 切断時
    BUD_OP_FORMATDISK | buFormatDisk関数終了時
    BUD_OP_CLOSEFILE | buCloseFile関数終了時
    BUD_OP_READFILE | buReadFile関数終了時
    BUD_OP_WRITEFILE | buWriteFile関数終了時
    BUD_OP_DELETEFILE | buDeleteFile関数終了時
    BUD_OP_RENAMEFILE | buRenameFile関数終了時
    BUD_OP_DEFRAGDISK | buDefragDisk関数終了時
    BUD_OP_SETFILEATTR | buSetFileAttr関数終了時
    BUD_OP_LOADFILE | buLoadFile関数終了時
    BUD_OP_SAVEFILE | buSaveFile関数終了時
    BUD_OP_SAVEEXECFILE | buSaveExecFile関数終了時
    BUD_OP_LOADFILEEX | buLoadFileEx関数終了時
    BUD_OP_READIMAGE | buReadDiskImage関数終了時
    BUD_OP_WRITEIMAGE | buWriteDiskImage関数終了時
    BUD_OP_DELETEFILEEX | buDeleteFileEx関数終了時
    BUD_OP_CONNECT | 接続(MOUNT前)
    BUD_OP_REMOVE | 切断

  status
    ステータス
    通常、BUD_ERR_*が返りますが、opがBUD_OP_CONNECTの時には、BUD_CAPACITY_*が返ります。
  param
    ユーザーパラメータ
［出力］
  なし
［戻値］
  BUD_CBRET_OKを返してください。
［使用例］

        Sint32 complete_callback(Sint32 drive, Sint32 op, Sint32 status, Uint32 param)
        {
          switch (op) {
          case BUD_OP_FORMATDISK:
            printf("フォーマットが終了しました。\n");
            break;
          case BUD_OP_MOUNT:
            printf("ドライブ%dにバックアップRAMが接続されました。\n");
            break;
              :
          }
          return BUD_CBRET_OK;
        }

［備考］

## BU_PROGRESSCALLBACK

［関数］
  Sint32 ( *BU_PROGRESSCALLBACK )(Sint32 drive, Sint32 op, Sint32 count, Uint32 max );
［入力］
  drive
    ドライブ番号
  op
    オペレーションコード
  count
    進行状況カウント
  max
    進行状況最大値
［出力］
  なし
［戻値］
  BUD_CBRET_OKを返してください。
［使用例］

        Sint32 progress_callback(Sint32 drive, Sint32 op, Sint32 count, Sint32 max)
        {
          switch (op) {
          case BUD_OP_FORMATDISK:
            printf("フォーマット中です．．．%d/%d\n", count, max);
            break;
              :
          }
        }

［備考］
  ・進行状況カウントはあくまでも目安です。カウントと最大値を比較して終了を判定するなどの処理は行わないでください。
  ・進行状況カウントは最大値を超える場合があります。

## 2. 関数仕様

### 2.1関数一覧

関数 | 機能
--- | ---
buInit | バックアップ関数を初期化する
buExit | バックアップ関数を終了する
buMountDisk＜新規＞ | ドライブのマウント
buUnmount＜新規＞ | ドライブのアンマウント
buSetCompleteCallback | 処理完了時のコールバック関数を登録する
buSetProgressCallback | 一定処理経過時のコールバック関数を登録する
buIsReady | バックアップRAMが接続されているかどうかを調べる
buIsFormat | バックアップRAMがフォーマット済みかどうかを調べる
buGetDiskFree | 空き容量を調べる
buGetDiskInfo | バックアップRAMの各種情報を取得する
buIsExistFile | 指定ファイルが存在するかどうか調べる
buGetFileSize | 指定ファイルのサイズを調べる
buGetFileInfo | 指定ファイルの各種情報を取得する
buStat | 処理が完了しているかどうか調べる
buGetLastError | 最後に発生したエラーを取得する
buSaveFile | ファイルをセーブする
buLoadFile | ファイルをロードする
buDeleteFile | ファイルを削除する
buSetFileAttr | ファイル属性を変更する
buFindFirstFile | 第１ファイルのファイル名を取得する
buFindNextFile | 次のファイルのファイル名を取得する
buLoadFileEx | 読み込み開始ブロックとブロック数を指定してファイルをロードする
buFormatDisk | バックアップRAMをフォーマットする
buFindExecFile | 実行ファイルのファイル名を取得する
buSaveExecFile | 実行ファイルをセーブする
buDefragDisk | 連続空きブロックを確保する
buMakeBackupFileImage＜新規＞ | バックアップファイル形式メモリイメージを作成する
buCalcBackupFileSize＜新規＞ | バックアップファイルイメージのブロックサイズを計算する
buAnalyzeBackupFileImage＜新規＞ | メモリ上のファイルイメージを解析する

## buInit

［関数］
  Sint32 buInit( Sint32 capa, Sint32 drive, void *work, BU_INITCALLBACK func )
［入力］
  capa
    メディアの最大容量
      BUD_CAPACITY_128KB
      BUD_CAPACITY_256KB
      BUD_CAPACITY_512KB
      BUD_CAPACITY_1MB
  drive
    対象ドライブ

    BUD_USE_DRIVE_ALL | すべてのドライブ
    BUD_USE_DRIVE_A1 | ポートAの１番ドライブ
    BUD_USE_DRIVE_A2 | ポートAの２番ドライブ
    BUD_USE_DRIVE_B1 | ポートBの１番ドライブ
    BUD_USE_DRIVE_B2 | ポートBの２番ドライブ
    BUD_USE_DRIVE_C1 | ポートCの１番ドライブ
    BUD_USE_DRIVE_C2 | ポートCの２番ドライブ
    BUD_USE_DRIVE_D1 | ポートDの１番ドライブ
    BUD_USE_DRIVE_D2 | ポートDの２番ドライブ

  work
    ワークバッファ
    NULLを指定した場合、capaの値は無視されます。
  func
    初期化終了コールバック
［出力］
  なし
［戻値］
  BUD_ERR_OK
    正常終了
  BUD_ERR_INVALID_PARAM
    パラメータ異常
［機能］
  バックアップファイルシステムを初期化します。
  ・初期化に成功した場合、指定の関数をコールバックします。コールバック関数はbuInit()からリターンする前に呼び出されます。
  その場合、BUD_OP_CONNECTコールバックを検知した後、ささっているメディアのサイズに見合ったバッファをアプリケーション側で確保し、buMountDisk関数でマウント処理を行います。その後が通常の使い方と同様な使い方が出来ます。
  このような使い方をすることで、予め大きいバッファサイズを確保すること無く、大容量のメディアにも対応することが可能になります。
［使用例］

        /* 128KBまでのバックアップRAM ２個分のバッファを確保 */
        Uint32 work[BUM_WORK_SIZE(BUD_CAPACITY_128KB, 2) / sizeof(Uint32)];

        void init_callback(void)
        {
        }

        /* ポートAの１番、２番ドライブに対応する */
        buInit(BUD_CAPACITY_128KB,
               BUD_USE_DRIVE_A1 | BUD_USE_DRIVE_A2,
               work, init_callback);

［備考］
  - 最大容量やドライブ数によって、必要なワーク容量が大幅に異なります。アプリケーションで対応する必要のない容量のバックアップRAMやドライブはなるべく指定しないようにしてください。
  - 不要なドライブは指定しないことにより、ワーク容量の削減と、ライブラリの高速化が可能です。
  - 以下に、ワーク容量の目安を記します。

    最大容量 | 1ドライブあたりのワーク容量 | 8ドライブでのワーク容量
    --- | --- | ---
    128KB | 8KB | 64KB
    256KB | 14KB | 112KB
    512KB | 28KB | 220KB
    1MB | 55KB | 440KB

  - 使用ドライブ指定にはBUD_USE_DRIVE_XXX定数を必ず指定してください。BUD_DRIVE_XXX定数を誤って指定することのないようにしてください。
  - workにNULLを指定した場合、capaの設定は無視されバックアップ用のバッファを動的に管理することが出来ます。

## buExit

［関数］
  Sint32 buExit( void );
［入力］
  なし
［出力］
  なし
［戻値］
  BUD_ERR_OK
    正常終了
  BUD_ERR_BUSY
    何らかのTYPE B関数が処理中である
［機能］
  バックアップファイルシステムを終了します。
［使用例］

        do {} while(buExit() != BUD_ERR_OK);

［備考］
  ・何らかのファイル処理が行われている場合、終了することができないため、BUD_ERR_BUSYを返します。

## buMountDisk

［関数］
  Sint32 buMountDisk( Sint32 drive, void *addr, Sint32 size );
［入力］
  drive
    ドライブ番号
  addr
    ワークアドレス
  size
    ワークサイズ
［出力］
  なし
［戻値］
  BUD_INVALID_PARAM
    接続されたバックアップRAMに対してバッファが足りない。
  BUD_ERR_OK
    正常終了
［機能］
  ドライブをマウントします。
［使用例］

［備考］
  addrは4バイトバウンダリにする必要があります。
  addrにNULLを入れた場合、又は、バッファが少ない場合はマウントされません。
  buInitのワークバッファにNULLを入れ、本関数を呼び出さなかった場合も同様に、マウントされません。

## buUnmount

［関数］
  Sint32 buUnmount( Sint32 drive );
［入力］
  drive
    ドライブ番号
［出力］
  なし
［戻値］
  BUD_ERR_OK
    正常終了
  BUD_ERR_BUSY
    ドライブにアクセス中である。
［機能］
  ドライブをアンマウントします。
［使用例］

［備考］
  BUD_OP_UNMOUNTコールバックが発生します。
  また、同様にメモリカードが抜かれた時にもBUD_OP_UNMOUNTコールバックが発生します。
  BUD_OP_UNMOUNTコールバック発生時にはそのドライブで使用していたワークバッファは開放されます。

## buSetCompleteCallback

［関数］
  void buSetCompleteCallback( BU_COMPLETECALLBACK func )
［入力］
  func
    完了コールバック関数アドレス
［出力］
  なし
［戻値］
  なし
［機能］
  ・処理完了時のコールバック関数を指定します。
［使用例］

        Sint32 complete_callback(Sint32 drive, Sint32 op, Sint32 status, Uint32 param)
        {
          return BUD_CBRET_OK;
        }

        Sint32 progress_callback(Sint32 drive, Sint32 op, Sint32 count, Uint32 max)
        {
          return BUD_CBRET_OK;
        }

        void init_callback(void)
        {
          buSetCompleteCallback(complete_callback);
          buSetProgressCallback(progress_callback);
        }

## buSetProgressCallback

［関数］
  void buSetProgressCallback( BU_PROGRESSCALLBACK func )
［入力］
  func
    経過コールバック関数アドレス
［出力］
  なし
［戻値］
  なし
［機能］
  ・処理中の経過コールバック関数を指定します。
［備考］
  ・初期化終了コールバック関数中で呼び出してください。 経過コールバック関数は、次のような場合に呼ばれます。
  即時復帰型関数を呼んだ場合
    経過コールバックは、1ブロックの読み書きが完了する毎に呼ばれます。
    メモリカードの1ブロック読み込みには約1Int、
    書き込みには5Int
    かかかりますので、その度に経過コールバックが発生することになります。
  メモリカードが挿された場合。
    メモリカードが挿されると、システム領域、FAT、ディレクトリエントリなどの管理領域を読み込みます。
    管理領域は全部で15ブロックあり、全て読み込むのに16Intかかります。

## buIsReady

［関数］
  Sint32 buIsReady( Sint32 drive )
［入力］
  drive
    ドライブ番号
［出力］
  なし
［戻値］
  TRUE
    ドライブが接続されていて、アクセス可能である
  FALSE
    ドライブが接続されていない
［機能］
  ・ドライブの接続状況を返します。
［使用例］

        if (buIsReady(BUD_DRIVE_A1)) {
          /* バックアップRAMが接続されている */
        }

## buIsFormat

［関数］
  Sint32 buIsFormat( Sint32 drive )
［入力］
  drive
    ドライブ番号
［出力］
  なし
［戻値］
  BUD_ERR_OK
    フォーマットされている
  BUD_ERR_UNFORMAT
    ォーマットされていない
  BUD_ERR_NO_DISK
    ディスクがない
  BUD_ERR_BUSY
    何らかのTYPE B関数が処理中である
［機能］
  ・指定ドライブのディスクがフォーマット済みかどうかを調べます。
［使用例］

        switch (buIsFormat(BUD_DRIVE_A1)) {
        case BUD_ERR_OK:
          /* フォーマットされている */
          break;
        case BUD_ERR_NO_DISK:
          /* バックアップRAMが接続されていない */
          break;
        case BUD_ERR_BUSY:
          /* バックアップRAMはBUSY状態のため調べられない */
          break;
        }

## buGetDiskFree

［関数］
  Sint32 buGetDiskFree( Sint32 drive, Sint32 type )
［入力］
  drive
    ドライブ番号
  type
    調べる空きブロック数のタイプ

    BUD_FILETYPE_NORMAL | 通常ファイル空き容量
    BUD_FILETYPE_EXECUTABLE | 実行ファイル空き容量

［出力］
  なし
［戻値］
  0あるいは正
    空きブロック数
  BUD_ERR_UNFORMAT
    フォーマットされていない
  BUD_ERR_NO_DISK
    ディスクがない
  BUD_ERR_BUSY
    何らかのTYPE B関数が処理中である
［機能］
  ・指定ドライブの空き容量をブロック数で取得します。
  ・通常ファイル空き容量には、実行ファイル空き容量も含まれます。
［使用例］

        Sint32 free;

        free = buGetDiskFree(BUD_DRIVE_A1, BUD_FILETYPE_NORMAL);

        if (free < 0) return NG;

## buGetDiskInfo

［関数］
  Sint32 buGetDiskInfo( Sint32 drive, BUS_DISKINFO* info )
［入力］
  drive
    ドライブ番号
  info
    ディスク情報構造体のアドレス
［出力］
  なし
［戻値］
  BUD_ERR_OK
    正常終了
  BUD_ERR_UNFORMAT
    フォーマットされていない
  BUD_ERR_NO_DISK
    ディスクがない
  BUD_ERR_BUSY
    何らかのTYPE B関数が処理中である
［機能］
  ・指定ドライブのディスク情報を取得します。
［使用例］

        BUS_DISKINFO info;
        Sint32 ret;

        ret = buGetDiskInfo(BUD_DRIVE_A1, &info);

        if (ret < 0) return NG;

## buIsExistFile

［関数］
  Sint32 buIsExistFile( Sint32 drive, const char* fname )
［入力］
  drive
    ドライブ番号
  fname
    ファイル名
［出力］
  なし
［戻値］
  BUD_ERR_OK
    ファイルあり
  BUD_ERR_FILE_NOT_FOUND
    ファイルなし
  BUD_ERR_UNFORMAT
    フォーマットされていない
  BUD_ERR_NO_DISK
    ディスクがない
  BUD_ERR_BUSY
    何らかのTYPE B関数が処理中である
［機能］
  ・指定ファイルが存在するかどうかを調べます
［使用例］

        Sint32 ret;

        ret = buIsExistFile(BUD_DRIVE_A1, "SAVEDATA_001");

        switch (ret) {
        case BUD_ERR_OK:
          /* ファイルがある */
          break;
        case BUD_ERR_FILE_NOT_FOUND:
          /* ファイルなし */
          break;
        defalut:
          /* その他のエラー */
        break;
        }

## buGetFileSize

［関数］
  Sint32 buGetFileSize( Sint32 drive, const char* fname )
［入力］
  drive
    ドライブ番号
  fname
    ファイル名
［出力］
  なし
［戻値］
  BUD_ERR_OK
    ファイルあり
  BUD_ERR_FILE_NOT_FOUND
    ファイルなし
  BUD_ERR_UNFORMAT
    フォーマットされていない
  BUD_ERR_NO_DISK
    ディスクがない
  BUD_ERR_BUSY
    何らかのTYPE B関数が処理中である
［機能］
  ・ファイルのサイズをブロック数で取得します。
［使用例］

        Sint32 size = buGetFileSize(BUD_DRIVE_A1, "SAVEDATA_001");

## buGetFileInfo

［関数］
  Sint32 buGetFileInfo( Sint32 drive, const char* fname, BUS_FILEINFO* info )
［入力］
  drive
    ドライブ番号
  fname
    ファイル名
  info
    ファイル情報構造体のアドレス
［出力］
  なし
［戻値］
  BUD_ERR_OK
    ファイルあり
  BUD_ERR_FILE_NOT_FOUND
    ファイルなし
  BUD_ERR_UNFORMAT
    フォーマットされていない
  BUD_ERR_NO_DISK
    ディスクがない
  BUD_ERR_BUSY
    何らかのTYPE B関数が処理中である
［機能］
  ・ファイルの情報を取得します。
［使用例］

        BUS_FILEINFO info
        buGetFileInfo(BUD_DRIVE_A1, "SAVEDATA_001", &info);

## buStat

［関数］
  Sint32 buStat( Sint32 drive )
［入力］
  drive
    ドライブ番号
［出力］
  なし
［戻値］
  BUD_STAT_READY
    処理は終了している
  BUD_STAT_BUSY
    何らかのTYPE B関数が処理中である
［機能］
  ・処理が終了しているかどうかを調べます。
［使用例］

        if (buStat(BUD_DRIVE_A1) == BUD_STAT_BUSY) {
          /* 処理中 */
        }

## buGetLastError

［関数］
  Sint32 buGetLastError( Sint32 drive )
［入力］
  drive
    ドライブ番号
［出力］
  なし
［戻値］
  エラーコード
［機能］
  ・指定ドライブで最後に発生したエラーを調べます。
［使用例］

        if (buGetLastError(BUD_DRIVE_A1) == BUD_ERR_OK) {
          /* セーブ成功 */
        } else {
          /* エラー発生 */
        }

## buSaveFile

［関数］
  Sint32 buSaveFile( Sint32 drive, const char* fname, const void* buf, Uint32 nblock, const BUS_TIME* time, Sint32 flag )
［入力］
  drive
    ドライブ番号
  fname
    ファイル名
  buf
    読み込みアドレス
  nblock
    読み込むブロック数
  time
    タイムスタンプ
  flag
    フラグ
    BUD_FLAG_VERIFY
      ベリファイあり
    BUD_FLAG_COPY(n)
      コピーフラグ(nはコピーフラグ値)
［出力］
  なし
［戻値］
  BUD_ERR_OK
    処理要求を受け付けた
  BUD_ERR_BUSY
    処理中のため要求を受け付けられなかった
［機能］
  ・ファイルをセーブします。
  ・通常のアプリケーションであればこの関数でファイルを丸ごとセーブします。
  ・同名ファイルがある場合、古いファイルは消去されます。ただし同名ファイルが実行ファイルであった場合はエラーとなります。
［使用例］

        Sint32 ret;
        Sint32 blocks, flag;
        BUS_TIME time;
        SYS_RTC_DATE rtc;
        extern char SaveData[];                      /* セーブするデータ(512*10バイト) */

        blocks = 10;                                  /* ファイルサイズは10ブロック */
        flag = BUD_FLAG_VERIFY | BUD_FLAG_COPY(0x00); /* ベリファイを行う | コピーフラグを00Hに設定する */
        syRtcGetDate( &rtc );
        time = ( BUS_TIME )rtc;  /* タイムスタンプの設定 */

        ret = buSaveFile(BUD_DRIVE_A1, "SAVEDATA", SaveData, blocks, &time, flag);

        if (ret == BUD_ERR_OK) {
          /* セーブリクエストに成功した */
        } else {
          /* セーブリクエストに失敗した(BUSY) */
        }

［備考］
  ・ベリファイエラーが発生した場合でも、ファイルはセーブされています。

  BUD_ERR_OK | 正常終了
  BUD_ERR_NO_DISK | ディスクがない
  BUD_ERR_UNFORMAT | フォーマットされていない
  BUD_ERR_FILE_NOT_FOUND | ファイルがない
  BUD_ERR_CANNOT_OPEN | ファイルが開けない

  セーブには、セーブブロック数×5Intかかります。(他のドライブの状態等によっては、多少時間は変動します。)
  また、bufには必ず、4バイト境界でアドレスを与えるようにしてください。

## buLoadFile

［関数］
  Sint32 buLoadFile( Sint32 drive, const char* fname, void* buf, Uint32 nblock )
［入力］
  drive
    ドライブ番号
  fname
    ファイル名
  buf
    読み込みアドレス
  nblock
    読み込むブロック数
［出力］
  buf
    読み込まれたバッファ(但し即時復帰なので関数終了後では不定)
［戻値］
  BUD_ERR_OK
    処理要求を受け付けた
  BUD_ERR_BUSY
    処理中のため要求を受け付けられなかった
［機能］
  ・ファイルをロードします。
  ・通常のアプリケーションであればこの関数でファイル全体をロードします。
  ・読み込むブロック数に0を指定するとファイル全体をロードします。
［使用例］

        Sint32 ret;
        Sint32 blocks;
        extern char SaveData[];	/* ロードバッファ */

        blocks = buGetFileSize(BUD_DRIVE_A1, "SAVEDATA");  /* ファイルサイズを取得 */

        if (blocks <= 0) return NG;
        ret = buLoadFile(BUD_DRIVE_A1, "SAVEDATA", SaveData, blocks);

        if (ret == BUD_ERR_OK) {
          /* ロードリクエストに成功した */
        } else {
          /* ロードリクエストに失敗した(BUSY) */
        }

［備考］
  buStat関数による本関数の完了ステータスとしては

  BUD_ERR_OK | 正常終了
  BUD_ERR_NO_DISK | ディスクがない
  BUD_ERR_UNFORMAT | フォーマットされていない
  BUD_ERR_FILE_NOT_FOUND | ファイルがない
  BUD_ERR_CANNOT_OPEN | ファイルが開けない
  BUD_ERR_FILE_BROKEN | ファイルが壊れている

  ロードには、大体、ロードブロック数×1Intかかります。(他のドライブの状態等によっては、多少時間は変動します。)
  また、bufには必ず、4バイト境界でアドレスを与えるようにしてください。

## buDeleteFile

［関数］
  Sint32 buDeleteFile( Sint32 drive, const char* fname )
［入力］
  drive
    ドライブ番号
  fname
    ファイル名
［出力］
  なし
［戻値］
  BUD_ERR_OK
    処理要求を受け付けた
  BUD_ERR_BUSY
    処理中のため要求を受け付けられなかった
［機能］
  ・ファイルを削除します。
［使用例］

        Sint32 ret;

        ret = buDeleteFile(BUD_DRIVE_A1, "SAVEDATA");

        if (ret == BUD_ERR_OK) {
          /* 削除リクエストに成功した */
        } else {
          /* 削除リクエストに失敗した(BUSY) */
        }

［備考］
  buStat関数による本関数の完了ステータスとしては

  BUD_ERR_OK | 正常終了
  BUD_ERR_NO_DISK | ディスクがない
  BUD_ERR_UNFORMAT | フォーマットされていない
  BUD_ERR_FILE_NOT_FOUND | ファイルがない

  削除には、大体、5Intかかります。(他のドライブの状態等によっては、多少時間は変動します。)

## buSetFileAttr

［関数］
  buSetFileAttr( Sint32 drive, const char* fname, Uint16 header, Uint8 copyflag )
［入力］
  drive
    ドライブ番号
  fname
    ファイル名
  header
    ヘッダオフセット(無視されます)
  copyflag
    コピーフラグ(00H〜FFH)
［出力］
  なし
［戻値］
  BUD_ERR_OK
    処理要求を受け付けた
  BUD_ERR_BUSY
    処理中のため要求を受け付けられなかった
［機能］
  ・ファイルの属性をを変更します。
［使用例］

        /* コピー不可フラグを付ける(コピーフラグをFFHにする) */
        buSetFileAttr(BUD_DRIVE_A1, "SAVEFILE_001", 0, 0xff);
        if (ret != BUD_ERR_OK) return NG;
        while (1) {
          if (buStat(BUD_DRIVE_A1) == BUD_STAT_READY) break;
        }
        if (buGetLastError(BUD_DRIVE_A1) != BUD_ERR_OK) return NG;
        return OK;

［備考］
  ・すでにあるファイルのコピーフラグを変更する場合に使用してください。
  ・ヘッダオフセットは無視されます。0を指定してください。

## buFindFirstFile

［関数］
  Sint32 buFindFirstFile( Sint32 drive, char* fname )
［入力］
  drive
    ドライブ番号
  fname
    ファイル名を出力するアドレス
［出力］
  fname
    ファイル名
［戻値］
  BUD_ERR_OK
    正常終了
  BUD_ERR_FILE_NOT_FOUND
    ファイルがない
  BUD_ERR_UNFORMAT
    フォーマットされていない
  BUD_ERR_NO_DISK
    ディスクがない
  BUD_ERR_BUSY
    何らかのTYPE B関数が処理中である
［機能］
  ・第１ファイルのファイル名を取得します。
  ・ファイルが存在しない場合、fname[0] = '\0'となります。
  ・通常、buFindNextFile()と組み合わせて、ドライブにある全ファイル名を取得するのに使用します。
［使用例］

        Sint32 ret, files, blocks, totel;
        char fname[16];
        BUS_FILEINFO info;

        files = blocks = total = 0;

        /* 第１ファイルのファイル名取得 */
        ret = buFindFirstFile(drive, fname);
        if (ret < 0) {
          if (ret == BUD_ERR_FILE_NOT_FOUND) goto end;
          else goto err;
        }
        if (buGetFileInfo(drive, fname, &info) < 0) goto err;
          blocks = info.blocks;
          total += blocks;
          files++;

          do {
            printf("%12s %10d bytes(%3d blocks)\n", files, blocks * 512, blocks);
            /* 第２ファイル以降のファイル名取得 */
            ret = buFindNextFile(drive, fname);
            if (ret < 0) {
              if (ret == BUD_ERR_FILE_NOT_FOUND) goto end;
              else goto err;
            }
            if (buGetFileInfo(drive, fname, &info) < 0) goto err;
            blocks = info.blocks;
            total += blocks;
            files++;
          } while (files < FILE_MAX);

        end:
          return OK;
        err:
          return NG;

［備考］
  ・ファイル名を格納する領域には最低１３バイトの領域が必要です

## buFindNextFile

［関数］
  Sint32 buFindNextFile( Sint32 drive, char* fname )
［入力］
  drive
    ドライブ番号
  fname
    ファイル名を出力するアドレス
［出力］
  fname
    ファイル名
［戻値］
  BUD_ERR_OK
    正常終了
  BUD_ERR_FILE_NOT_FOUND
    ファイルがない
  BUD_ERR_UNFORMAT
    フォーマットされていない
  BUD_ERR_NO_DISK
    ディスクがない
  BUD_ERR_BUSY
    何らかのTYPE B関数が処理中である
［機能］
  ・次のファイルのファイル名を取得します。
  ・通常、buFindFistFile()と組み合わせて、ドライブにある全ファイル名を取得するのに使用します。
［使用例］

        Sint32 ret, files, blocks, totel;
        char fname[16];
        BUS_FILEINFO info;

        files = blocks = total = 0;

        /* 第１ファイルのファイル名取得 */
        ret = buFindFirstFile(drive, fname);
        if (ret < 0) {
          if (ret == BUD_ERR_FILE_NOT_FOUND) goto end;
          else goto err;
        }
        if (buGetFileInfo(drive, fname, &info) < 0) goto err;
          blocks = info.blocks;
          total += blocks;
          files++;

          do {
            printf("%12s %10d bytes(%3d blocks)\n", files, blocks * 512, blocks);
            /* 第２ファイル以降のファイル名取得 */
            ret = buFindNextFile(drive, fname);
            if (ret < 0) {
              if (ret == BUD_ERR_FILE_NOT_FOUND) goto end;
              else goto err;
            }
            if (buGetFileInfo(drive, fname, &info) < 0) goto err;
            blocks = info.blocks;
            total += blocks;
            files++;
          } while (files < FILE_MAX);

        end:
          return OK;
        err:
          return NG;

［備考］
  ・ファイル名を格納する領域には最低１３バイトの領域が必要です
  ・ファイルが存在しない場合、fname[0] = '\0'となります。

## buLoadFileEx

［関数］
  buLoadFileEx(Sint32 drive, const char* fname, void* buf, Uint32 start, Uint32 nblock)
［入力］
  drive
    ドライブ番号
  fname
    ファイル名
  buf
    読み込みアドレス
  start
    読み込み開始アドレス
  nblock
    読み込むブロック数
［出力］
  buf
    読み込んだデータ
［戻値］
  BUD_ERR_OK
    処理要求を受け付けた
  BUD_ERR_BUSY
    処理中のため要求を受け付けられなかった
［機能］
  ・ファイルをロードします。
  ・読み込み開始ブロックに0を指定するとファイルの先頭からロードします。
  ・読み込むブロック数に0を指定するとファイル全体をロードします。
［使用例］

        Sint32 ret;
        Sint32 blocks;
        Sint32 start_block;
        extern char LoadBuffer[];  /* ロードバッファ */

        /* ファイル一部ロード */

        start_block = 0;
        blocks = 1;
        ret = buLoadFileEx(BUD_DRIVE_A1, "SAVEDATA_001", LoadBuffer, start_block, blocks);
        if (ret != BUD_ERR_OK) return NG;
        while (buStat(BUD_DRIVE_A1) == BUD_STAT_BUSY) {
        }
        if (buGetLastError(BUD_DRIVE_A1) != BUD_ERR_OK) return NG;

        return OK;

［備考］
  buStat関数による本関数の完了ステータスとしては

  BUD_ERR_OK | 正常終了
  BUD_ERR_NO_DISK | ディスクがない
  BUD_ERR_UNFORMAT | フォーマットされていない
  BUD_ERR_FILE_NOT_FOUND | ファイルがない
  BUD_ERR_CANNOT_OPEN | ファイルが開けない
  BUD_ERR_FILE_BROKEN | ファイルが壊れている

  ロードには、大体、ロードブロック数×1Intかかります。(他のドライブの状態等によっては、多少時間は変動します。)
  また、bufには必ず、4バイト境界でアドレスを与えるようにしてください。

## buFormatDisk

［関数］
  buFormatDisk( Sint32 drive, const Uint8* volume, Sint32 icon, BUS_TIME* time, Sint32 flag )
［入力］
  drive
    ドライブ番号
  volume
    ボリュームデータ
  icon
    アイコン番号(0〜123)
  time
    タイムスタンプ
  flag
    フォーマットフラグ
    TRUE
      完全フォーマット
    FALSE
      クイックフォーマット
［出力］
  なし
［戻値］
  BUD_ERR_OK
    処理要求を受け付けた
  BUD_ERR_BUSY
    処理中のため要求を受け付けられなかった
［機能］
  ・ディスクをフォーマットします。
［使用例］

        Sint32 ret;
        BUS_TIME time;
        SYS_RTC_DATE rtc;
        Uint8 volume[32];
        Sint32 icon_no;

        syRtcGetDate( &rtc );
        time = ( BUS_TIME )rtc;  /* タイムスタンプの設定 */

        icon_no = 0; /* アイコン番号の設定 */

        /* ボディカラー青を設定する */
        memset(volume, 0, sizeof(volume));
        volume[0] = 0x01;  /* ボディカラー情報あり */
        volume[1] = 0xbf;  /* B */
        volume[2] = 0x00;  /* G */
        volume[3] = 0x00;  /* R */
        volume[4] = 0xff;  /* A */

        ret = buFormatDisk(BD_DRIVE_A1, volume, icon_no, &time, TRUE);
        while (buStat(BUD_DRIVE_A1) == BUD_STAT_BUSY) {
        }
        if (buGetLastError(BUD_DRIVE_A1) != BUD_ERR_OK) return NG;

        return OK;

［備考］
  buStat関数による本関数の完了ステータスとしては

  BUD_ERR_OK | 正常終了
  BUD_ERR_NO_DISK | ディスクがない

## buFindExecFile

［関数］
  Sint32 buFindExecFile( Sint32 drive, char* fname )
［入力］
  drive
    ドライブ番号
  fname
    ファイル名
［出力］
  なし
［戻値］
  BUD_ERR_OK
    正常終了
  BUD_ERR_FILE_NOT_FOUND
    実行ファイルがない
  BUD_ERR_UNFORMAT
    フォーマットされていない
  BUD_ERR_NO_DISK
    ディスクがない
  BUD_ERR_BUSY
    何らかのTYPE B関数が処理中である
［機能］
  ・実行ファイルのファイル名を取得します。
［使用例］
  ・ファイル名を格納する領域には最低１３バイトの領域が必要です
  ・ファイルが存在しない場合、fname[0] = '\0'となります。
  ・buFindFirstFile()、buFindNextFile()とはまったく独立に、互いに影響なく使用できます。

        Sint32 ret;
        char fname[16];

        /* 実行ファイルのファイル名取得 */
        ret = buFindExecFile(BUD_DRIVE_A1, fname);

        switch (ret) {
        case BUD_ERR_OK:
          /* 実行ファイルあり。 fnameにはファイル名が格納されている。 */
          printf("実行ファイル:%s\n", fname);
          break;
        case BUD_ERR_FILE_NOT_FOUND:
          printf("実行ファイルはありません。\n");
          break;
        default:
          printf("エラー\n");
          break;
        }

［備考］

## buSaveExecFile

［関数］
  Sint32 buSaveExecFile( Sint32 drive, const char* fname, const void* buf, Uint32 nblock, BUS_TIME* time, Sint32 flag )
［入力］
  drive
    ドライブ番号
  fname
    ファイル名
  buf
    読み込みアドレス
  nblock
    読み込むプロック数
  time
    タイムスタンプ
  flag
    フラグ
    BUD_FLAG_VERIFY
      ベリファイあり
    BUD_FLAG_COPY(n)
      コピーフラグ(nはコピーフラグ値)
［出力］
  なし
［戻値］
  BUD_ERR_OK
    処理要求を受け付けた
  BUD_ERR_BUSY
    処理中のため要求を受け付けられなかった
［機能］
  ・実行ファイルをセーブします。
  ・通常のアプリケーションであればこの関数でファイルを丸ごとセーブします。
  ・実行ファイルが存在する場合、および同名ファイルが存在する場合はエラーとなります。
［使用例］

        Sint32 ret;
        Sint32 blocks, flag;
        BUS_TIME time;
        SYS_RTC_DATE rtc;
        extern char SaveData[];  /* セーブするデータ(512*10バイト) */

        blocks = 10; /* ファイルサイズは10ブロック */
        flag = BUD_FLAG_VERIFY | BUD_FLAG_COPY(0xff); /* ベリファイを行う | コピーフラグをFFHに設定する */
        syRtcGetDate( &rtc );
        time = ( BUS_TIME )rtc;  /* タイムスタンプの設定 */

        ret = buSaveExecFile(BUD_DRIVE_A1, "SAVEDATA", SaveData, blocks, &time, flag);

        if (ret != BUD_ERR_OK) return NG;
        while (buStat(BUD_DRIVE_A1) == BUD_STAT_BUSY) {
        }
        if (buGetLastError(BUD_DRIVE_A1) != BUD_ERR_OK) return NG;

        return OK;

［備考］
  ベリファイエラーが発生した場合でも、ファイルはセーブされています。
  buStat関数による本関数の完了ステータスとしては

  BUD_ERR_OK | 正常終了
  BUD_ERR_UNFORMAT | フォーマットされていない
  BUD_ERR_NO_DISK | ディスクがない
  BUD_ERR_DISK_FULL | 実行ファイルはすでに存在する
  BUD_ERR_FILE_EXIST | 同名ファイルが存在する

  セーブには、セーブブロック数×5Intかかります。(他のドライブの状態等によっては、多少時間は変動します。)
  また、bufには必ず、4バイト境界でアドレスを与えるようにしてください。

## buDefragDisk

［関数］
  Sint32 buDefragDisk(Sint32 drive, void* work)
［入力］
  drive
    ドライブ番号
  work
    ワークバッファ(512バイト)
［出力］
  なし
［戻値］
  BUD_ERR_OK
    処理要求を受け付けた
  BUD_ERR_BUSY
    処理中のため要求を受け付けられなかった
［機能］
  ・実行ファイル書き込みエリアを確保するために、ディスクの最適化を行います。
  セーブしたい実行ファイルのサイズがビジュアルメモリの空き容量よりも大きいが、連続した空き容量が、セーブしたい実行ファイルよりも少ない場合に、この関数を利用することで、実行ファイルのセーブ領域を確保することが出来ます。
［使用例］

        Sint32 ret;
        Uint32 DefragWork[512 / sizeof(Uint32)];

        ret = buDefragDisk(BUD_DRIVE_A1, DefragWork);
        if (ret != BUD_ERR_OK) return NG;
        while (buStat(BUD_DRIVE_A1) == BUD_STAT_BUSY) {
        }
        if (buGetLastError(BUD_DRIVE_A1) != BUD_ERR_OK) return NG;

        return OK;

［備考］
  最適化処理中はworkで示されるワークバッファの内容を書き換えないでください。
  また、workには必ず、4バイト境界で512バイトのバッファを与えるようにしてください。
  Defrag中にメモリカードが抜かれた場合、ほぼ間違いなくすべてのデータが消失します。
  アプリケーションは、Defrag中はメモリカードの抜き先を決して行わないように、ユーザに促すことを強く勧めます

## buMakeBackupFileImage

［関数］
  Sint32 buMakeBackupFileImage(void *, BUS_BACKUPFILEHEADER *)
［入力］
  buf
    バックアップファイル形式イメージ作成アドレス（４バイト境界）
  hdr
    バックアップファイルヘッダアドレス
［出力］
  なし
［戻値］
  正数
    バックアップファイルの使用ブロック数
  BUD_ERR_INVALID_PARAM
    ヘッダ不正
［機能］
  メモリ上にDreamcastバックアップファイル形式イメージを作成します。
［使用例］

        extern Uint8 game_name[];     /* ゲーム名(ソートアイテム) */
        extern Uint16 icon_palette[]; /* アイコンパレットデータ */
        extern Uint8 icon_data[];     /* アイコンピクセルデータ */
        extern Uint8 visual_data[];   /* ビジュアルデータ */
        extern Uint8 save_data[];     /* アプリケーションセーブデータ */
        Sint32 nblock1, nblock2;
        void* buf;

        BUS_BACKUPFILEHEADER hdr;     /* バックアップファイルヘッダ */

        memset(&hdr, 0, sizeof(hdr));
        strcpy(hdr.vms_comment, "VMS_COMMENT");          /* VMSコメントの設定 */
        strcpy(hdr.btr_comment, "BOOT ROM全角コメント"); /* BOOT ROMコメントの設定 */
        memcpy(hdr.game_name,   game_name, 16);          /* ゲーム名(ソートアイテム)の設定 */
        hdr.icon_palette = icon_palette;                 /* アイコンパレットデータの設定 */
        hdr.icon_data    = icon_data;                    /* アイコンピクセルデータの設定 */
        hdr.icon_num     = 1;                            /* アイコン枚数の設定 */
        hdr.icon_speed   = 1;                            /* アイコンスピードの設定 */
        hdr.visual_data  = visual_data;                  /* ビジュアルコメントの設定 */
        hdr.visual_type  = BUD_VISUALTYPE_C;             /* ビジュアルタイプの設定 */
        hdr.save_data    = save_data;                    /* アプリケーションセーブデータ */
        hdr.save_size    = 0x400;                        /* アプリケーションセーブデータサイズ */

        nblock = buCalcBackupFileSize(hdr.icon_num, hdr.visual_type, hdr.save_size);

        buf = syMalloc(nblock * 512); /* 使用ブロック数×512バイトを確保する */
        if (buf == NULL) {
          /* メモリが確保できない */
          return NG;
        }

        nblock = buMakeBackupFileImage(buf, &hdr);
        if (nblock < 0) {
          /* 構造体に不正なパラメータがある */
          return NG;
        }

［備考］

## buCalcBackupFileSize

［関数］
  Sint32 buCalcBackupFileSize(Uint32 inum, Uint32 vtype, Uint32 size)
［入力］
  inum
    アイコンの枚数
  vtype
    ビジュアルタイプ
  size
    アプリケーションセーブデータのバイト数
［出力］
  なし
［戻値］
  正数
    バックアップファイルの使用ブロック数
  BUD_ERR_INVALID_PARAM
    パラメータが不正
［機能］
  Dreamcastバックアップファイル形式イメージサイズを計算します。
［使用例］

        extern Uint8 game_name[];     /* ゲーム名(ソートアイテム) */
        extern Uint16 icon_palette[]; /* アイコンパレットデータ */
        extern Uint8 icon_data[];     /* アイコンピクセルデータ */
        extern Uint8 visual_data[];   /* ビジュアルデータ */
        extern Uint8 save_data[];     /* アプリケーションセーブデータ */
        Sint32 nblock1, nblock2;
        void* buf;

        BUS_BACKUPFILEHEADER hdr;     /* バックアップファイルヘッダ */

        memset(&hdr, 0, sizeof(hdr));
        strcpy(hdr.vms_comment, "VMS_COMMENT");          /* VMSコメントの設定 */
        strcpy(hdr.btr_comment, "BOOT ROM全角コメント"); /* BOOT ROMコメントの設定 */
        memcpy(hdr.game_name,   game_name, 16);          /* ゲーム名(ソートアイテム)の設定 */
        hdr.icon_palette = icon_palette;                 /* アイコンパレットデータの設定 */
        hdr.icon_data    = icon_data;                    /* アイコンピクセルデータの設定 */
        hdr.icon_num     = 1;                            /* アイコン枚数の設定 */
        hdr.icon_speed   = 1;                            /* アイコンスピードの設定 */
        hdr.visual_data  = visual_data;                  /* ビジュアルコメントの設定 */
        hdr.visual_type  = BUD_VISUALTYPE_C;             /* ビジュアルタイプの設定 */
        hdr.save_data    = save_data;                    /* アプリケーションセーブデータ */
        hdr.save_size    = 0x400;                        /* アプリケーションセーブデータサイズ */

        nblock = buCalcBackupFileSize(hdr.icon_num, hdr.visual_type, hdr.save_size);

        buf = syMalloc(nblock * 512); /* 使用ブロック数×512バイトを確保する */
        if (buf == NULL) {
          /* メモリが確保できない */
          return NG;
        }

        nblock = buMakeBackupFileImage(buf, &hdr);
        if (nblock < 0) {
          /* 構造体に不正なパラメータがある */
          return NG;
        }

［備考］

## buAnalyzeBackupFileImage

［関数］
  Sint32 buAnalyzeBackupFileImage(BUS_BACKUPFILEHEADER *hdr, void *buf)
［入力］
  hdr
    バックアップファイルヘッダアドレス
  buf
    解析したいファイルを読み込んだアドレス（４バイト境界）
［出力］
  なし
［戻値］
  BUD_ERR_OK
    正常終了
  BUD_ERR_BUPFILE_ILLEGAL
    正しい形式のファイルではない
  BUD_ERR_BUPFILE_CRC
    CRCが異なっている
［機能］
  メモリ上のデータを解析し、BUS_BACKUPFILEHEADER構造体を作成します。
［使用例］

        Sint32 ret, nblock;
        extern Uint8 buf[];
        BUS_BACKUPFILEHEADER hdr;

        ret = buLoadFile(BUD_DRIVE_A1, "SAVEDATA_001", buf, 0);
        if (ret != BUD_ERR_OK) return NG;
        while (1) {
          if (buStat(BUD_DRIVE_A1) == BUD_STAT_READY) break;
        }

        ret = buAnalyzeBackupFileImage(&hdr, buf);
        switch (ret) {
        case BUD_ERR_OK:
          return OK;
        default:
          return NG;
        }

［備考］
  bufには必ず、4バイト境界でアドレスを与えるようにしてください。

オーバービューに戻る
TOPに戻る