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_DISKINFOBUS_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_commentVMS用コメント
btr_commentBOOT 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_FORMATDISKbuFormatDisk関数終了時
BUD_OP_CLOSEFILEbuCloseFile関数終了時
BUD_OP_READFILEbuReadFile関数終了時
BUD_OP_WRITEFILEbuWriteFile関数終了時
BUD_OP_DELETEFILEbuDeleteFile関数終了時
BUD_OP_RENAMEFILEbuRenameFile関数終了時
BUD_OP_DEFRAGDISKbuDefragDisk関数終了時
BUD_OP_SETFILEATTRbuSetFileAttr関数終了時
BUD_OP_LOADFILEbuLoadFile関数終了時
BUD_OP_SAVEFILEbuSaveFile関数終了時
BUD_OP_SAVEEXECFILEbuSaveExecFile関数終了時
BUD_OP_LOADFILEEXbuLoadFileEx関数終了時
BUD_OP_READIMAGEbuReadDiskImage関数終了時
BUD_OP_WRITEIMAGEbuWriteDiskImage関数終了時
BUD_OP_DELETEFILEEXbuDeleteFileEx関数終了時
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第1ファイルのファイル名を取得する
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の1番ドライブ
BUD_USE_DRIVE_A2ポートAの2番ドライブ
BUD_USE_DRIVE_B1ポートBの1番ドライブ
BUD_USE_DRIVE_B2ポートBの2番ドライブ
BUD_USE_DRIVE_C1ポートCの1番ドライブ
BUD_USE_DRIVE_C2ポートCの2番ドライブ
BUD_USE_DRIVE_D1ポートDの1番ドライブ
BUD_USE_DRIVE_D2ポートDの2番ドライブ
work
ワークバッファ
NULLを指定した場合、capaの値は無視されます。
func
初期化終了コールバック
[出力]
なし
[戻値]
BUD_ERR_OK
正常終了
BUD_ERR_INVALID_PARAM
パラメータ異常
[機能]
バックアップファイルシステムを初期化します。
・初期化に成功した場合、指定の関数をコールバックします。コールバック関数はbuInit()からリターンする前に呼び出されます。
その場合、BUD_OP_CONNECTコールバックを検知した後、ささっているメディアのサイズに見合ったバッファをアプリケーション側で確保し、buMountDisk関数でマウント処理を行います。その後が通常の使い方と同様な使い方が出来ます。
このような使い方をすることで、予め大きいバッファサイズを確保すること無く、大容量のメディアにも対応することが可能になります。
[使用例]
  /* 128KBまでのバックアップRAM 2個分のバッファを確保 */
  Uint32 work[BUM_WORK_SIZE(BUD_CAPACITY_128KB, 2) / sizeof(Uint32)];

  void init_callback(void)
  {
  }

  /* ポートAの1番、2番ドライブに対応する */
  buInit(BUD_CAPACITY_128KB,
         BUD_USE_DRIVE_A1 | BUD_USE_DRIVE_A2,
         work, init_callback);
[備考]
  • 最大容量やドライブ数によって、必要なワーク容量が大幅に異なります。アプリケーションで対応する必要のない容量のバックアップRAMやドライブはなるべく指定しないようにしてください。
  • 不要なドライブは指定しないことにより、ワーク容量の削減と、ライブラリの高速化が可能です。
  • 以下に、ワーク容量の目安を記します。
    最大容量1ドライブあたりのワーク容量8ドライブでのワーク容量
    128KB8KB64KB
    256KB14KB112KB
    512KB28KB220KB
    1MB55KB440KB
  • 使用ドライブ指定には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関数が処理中である
    [機能]
    ・第1ファイルのファイル名を取得します。
    ・ファイルが存在しない場合、fname[0] = '\0'となります。
    ・通常、buFindNextFile()と組み合わせて、ドライブにある全ファイル名を取得するのに使用します。
    [使用例]
      Sint32 ret, files, blocks, totel;
      char fname[16];
      BUS_FILEINFO info;
    
      files = blocks = total = 0;
    
      /* 第1ファイルのファイル名取得 */
      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);
          /* 第2ファイル以降のファイル名取得 */
          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;
    
    [備考]
    ・ファイル名を格納する領域には最低13バイトの領域が必要です

    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;
    
      /* 第1ファイルのファイル名取得 */
      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);
          /* 第2ファイル以降のファイル名取得 */
          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;
    
    [備考]
    ・ファイル名を格納する領域には最低13バイトの領域が必要です
    ・ファイルが存在しない場合、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関数が処理中である
    [機能]
    ・実行ファイルのファイル名を取得します。
    [使用例]
    ・ファイル名を格納する領域には最低13バイトの領域が必要です
    ・ファイルが存在しない場合、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
    バックアップファイル形式イメージ作成アドレス(4バイト境界)
    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
    解析したいファイルを読み込んだアドレス(4バイト境界)
    [出力]
    なし
    [戻値]
    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に戻る
    Copyright 1998 SEGA Enterprises, LTD.