/*
 *-----------------------------------------------------------------------------
 *  FILE: sg_bup.h
 *
 *      Copyright(c) 1998 SEGA System R&D Dept.
 *
 *  PURPOSE:
 *
 *      VMS用ファイルシステムヘッダ
 *
 *  DESCRIPTION:
 *
 *  AUTHOR(S):
 *
 *      1998/3/30   S.Uchida Ver.0.90
 *
 *-----------------------------------------------------------------------------
 */

#ifndef _SG_BUP_H_
#define _SG_BUP_H_

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/*
 * C VIRTUAL TYPES DEFINITIONS
 */

#include <sg_xpt.h>


/******** タイムスタンプ構造体 *********************************************/
typedef struct {
	Uint16 year;                /* 年(1998〜)                              */
	Uint8 month;                /* 月(1〜12)                               */
	Uint8 day;                  /* 日(1〜31)                               */
	Uint8 hour;                 /* 時(0〜23)                               */
	Uint8 minute;               /* 分(0〜59)                               */
	Uint8 second;               /* 秒(0〜59)                               */
	Uint8 dayofweek;            /* 曜日(日 = 0,月 = 1, ... 土 = 6)         */
} BUS_TIME;


/******** ディスク情報構造体 ***********************************************/
typedef struct {
	Sint8 volume[36];           /* ボリュームラベル                        */
	Uint16 total_blocks;        /* 全ブロック数                            */
	Uint16 total_user_blocks;   /* 全ユーザーブロック数(最大ファイル数)    */
	Uint16 free_blocks;         /* 空きブロック数                          */
	Uint16 free_user_blocks;    /* 空きユーザーブロック数                  */
	Uint16 block_size;          /* ブロックサイズ(512固定)                 */
	Uint16 icon_no;             /* アイコン番号(0〜255)                    */
	BUS_TIME time;              /* フォーマットされた時刻                  */
} BUS_DISKINFO;

/******** ディスク情報構造体 ***********************************************/
typedef struct {
	Uint32 filesize;            /* ファイルサイズ(バイト数)                */
	Uint16 blocks;              /* 使用ブロック数                          */
	Uint8 type;                 /* ファイルタイプ(通常/実行可能)           */
	Uint8 copyflag;             /* コピーフラグ(ff=コピー不可)             */
	Uint16 headerofs;           /* ヘッダオフセット                        */
	BUS_TIME time;              /* タイムスタンプ                          */
} BUS_FILEINFO;


/******** ファイルハンドル(メンバの直接参照禁止) ***************************/
typedef struct {
	Uint8 isOpen;
	Uint8 copyflag;
	Uint16 hdrofs;
	Sint32 open_mode;
	Sint32 type;
	Sint32 open_num;
	char fname[16];
	Uint8 date_time[8];
	Sint32 drive;
	Sint32 fentry_ofs;
	Sint32 write_block;
	Sint32 rest_block;
	Sint32 start_fat;
	Sint32 prev_fat;
	Sint32 next_fat;
	Sint32 current_fat;
} BUS_FILE;

typedef BUS_FILE* BUFILE;


/******** バックアップファイルヘッダ ***************************************/
typedef struct {
	char vms_comment[20];       /* VMS用コメント                           */
	char btr_comment[36];       /* BOOT ROM用コメント                      */
	char game_name[20];         /* ゲーム名                                */
	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;

/******** ボリュームアイコンファイル ***************************************/
typedef struct {
	char vms_comment[16];              /* VMS用コメント                    */
	Uint8 mono_icon[128];              /* モノクロアイコンデータ           */
	Uint8 color_icon[544];             /* カラーアイコンデータ             */
	Uint8 reserved[1024-16-128-544-4]; /* 予約                             */
	Uint32 aligndata;                  /* 4バイトアラインのためのデータ    */
} BUS_VOLUMEICONFILE;


typedef void (*BU_INITCALLBACK)(void);
typedef Sint32 (*BU_COMPLETECALLBACK)(Sint32 drive, Sint32 op,
										Sint32 status, Uint32 param);
typedef Sint32 (*BU_PROGRESSCALLBACK)(Sint32 drive, Sint32 op,
										Sint32 count, Sint32 max);


Sint32 buInit(Sint32 capacity, Sint32 drives, void* work,
													BU_INITCALLBACK func);
Sint32 buExit(void);
void buExecServer(void);
void buSetCompleteCallback(BU_COMPLETECALLBACK func);
void buSetProgressCallback(BU_PROGRESSCALLBACK func);
void buSetCallbackParam(Uint32 param);
void buGetVersion(Sint32* major, Sint32* minor);
Sint32 buIsReady(void);
Sint32 buMount(Sint32 drive);
Sint32 buRemount(Sint32 drive);
Sint32 buUnmount(Sint32 drive);
Sint32 buIsFormat(Sint32 drive);
Sint32 buFormatDisk(Sint32 drive, const char* volume, Sint32 icon,
													const BUS_TIME* time);
Sint32 buGetDiskInfo(Sint32 drive, BUS_DISKINFO* info);
Sint32 buGetDiskFree(Sint32 drive, Sint32 type);
Sint32 buFindFirstFile(Sint32 drive, char* fname);
Sint32 buFindNextFile(Sint32 drive, char* fname);
Sint32 buFindExecFile(Sint32 drive, char* fname);
Sint32 buOpenFile(Sint32 drive, const char* fname, BUFILE* file);
Sint32 buCreateFile(Sint32 drive, const char* fname, const BUS_TIME* time,
															BUFILE* file);
Sint32 buSetFileParam(BUFILE file, Uint16 hdrofs, Uint8 copyflag);
Sint32 buCloseFile(BUFILE file);
Sint32 buReadFile(BUFILE file, void* buf, Sint32 nblock);
Sint32 buWriteFile(BUFILE file, const void* buf, Sint32 nblock);
Sint32 buDeleteFile(Sint32 drive, const char* fname);
Sint32 buSetFileAttr(Sint32 drive, const char* fname, Uint16 hdrofs,
															Uint8 copyflag);
Sint32 buIsExistFile(Sint32 drive, const char* fname);
Sint32 buGetFileInfo(Sint32 drive, const char* fname, BUS_FILEINFO* finfo);
Sint32 buStat(Sint32 drive);
Sint32 buGetFileSize(Sint32 drive, const char* fname);
Sint32 buRenameFile(Sint32 drive, const char* from, const char* to);
Sint32 buCreateExecFile(Sint32 drive, const char* fname, const BUS_TIME* time,
																BUFILE* file);
Sint32 buDefragDisk(Sint32 drive, void* work);
Sint32 buCloseFile(BUFILE file);
void buSetPrintFunc(void (*func)(const char* str));
void buSetRetryCount(Sint32 count);



Sint32 buSaveFile(Sint32 drive, const char* fname, const void* buf,
																Uint32 nblock);
Sint32 buLoadFile(Sint32 drive, const char* fname, void* buf);

Uint32 buMakeBackupFileImage(void* buf, const BUS_BACKUPFILEHEADER* hdr);
Uint32 buCalcBackupFileSize(Uint32 inum, Uint32 vtype, Uint32 size);
Sint32 buAnalyzeBackupFileImage(BUS_BACKUPFILEHEADER* hdr, const void* buf);
Uint16 buCalcCRC(const void* buf, Uint32 size);


/******** ワーク容量 *******************************************************/
#define BUD_WORK_GAP 512

#define BUM_WORK_SIZE(_cap_, _max_) \
	(((_cap_ * _max_) * 512) + (BUD_WORK_GAP * _max_))


/******** 対応最大容量 *****************************************************/
#define BUD_CAPACITY_128KB   (1 + 1 + 13)   /* 容量128KBのみ               */
#define BUD_CAPACITY_256KB   (1 + 2 + 25)   /* 容量256KBまで               */
#define BUD_CAPACITY_512KB   (1 + 4 + 50)   /* 容量512KBまで               */
#define BUD_CAPACITY_1MB     (1 + 8 + 100)  /* 容量1MBまで                 */

/******** 対応ドライブ *****************************************************/
#define BUD_USE_DRIVE_A1    (1 << 0)        /* ポートAの拡張デバイス1      */
#define BUD_USE_DRIVE_A2    (1 << 1)        /* ポートAの拡張デバイス2      */
#define BUD_USE_DRIVE_B1    (1 << 2)        /* ポートBの拡張デバイス1      */
#define BUD_USE_DRIVE_B2    (1 << 3)        /* ポートBの拡張デバイス2      */
#define BUD_USE_DRIVE_C1    (1 << 4)        /* ポートCの拡張デバイス1      */
#define BUD_USE_DRIVE_C2    (1 << 5)        /* ポートCの拡張デバイス2      */
#define BUD_USE_DRIVE_D1    (1 << 6)        /* ポートDの拡張デバイス1      */
#define BUD_USE_DRIVE_D2    (1 << 7)        /* ポートDの拡張デバイス2      */
#define BUD_USE_DRIVE_ALL   0xff            /* 全部                        */

/******** ドライブ番号 *****************************************************/
#define BUD_DRIVE_A1   0                    /* ポートAの拡張デバイス1      */
#define BUD_DRIVE_A2   1                    /* ポートAの拡張デバイス2      */
#define BUD_DRIVE_B1   2                    /* ポートBの拡張デバイス1      */
#define BUD_DRIVE_B2   3                    /* ポートBの拡張デバイス2      */
#define BUD_DRIVE_C1   4                    /* ポートCの拡張デバイス1      */
#define BUD_DRIVE_C2   5                    /* ポートCの拡張デバイス2      */
#define BUD_DRIVE_D1   6                    /* ポートDの拡張デバイス1      */
#define BUD_DRIVE_D2   7                    /* ポートDの拡張デバイス2      */

/******** ファイルタイプ ***************************************************/
#define BUD_FILETYPE_NORMAL       0         /* 通常ファイル                */
#define BUD_FILETYPE_EXECUTABLE   1         /* 実行ファイル                */


/******** ステータス *******************************************************/
#define BUD_STAT_READY   0x00000000         /* コマンド発行可能            */
#define BUD_STAT_BUSY    0xffffffff         /* コマンド実行中              */

/******** コールバックオペレーションパラメータ *****************************/
#define BUD_OP_NOP           0x00000000     /* nop                         */
#define BUD_OP_MOUNT         0x00000001     /* buRemount()/接続            */
#define BUD_OP_FORMATDISK    0x00000002     /* buFormatDisk()              */
#define BUD_OP_CLOSEFILE     0x00000003     /* buCloseFile()               */
#define BUD_OP_READFILE      0x00000004     /* buReadFile()                */
#define BUD_OP_WRITEFILE     0x00000005     /* buWriteFile()               */
#define BUD_OP_DELETEFILE    0x00000006     /* buDeleteFile()              */
#define BUD_OP_RENAMEFILE    0x00000007     /* buRenameFile()              */
#define BUD_OP_DEFRAGDISK    0x00000008     /* buDefragDisk()              */
#define BUD_OP_SETFILEATTR   0x00000009     /* buSetFileAttr()             */

/******** コールバックオペレーションパラメータ *****************************/
#define BUD_CBRET_OK   0x00000000           /* 処理継続                    */

/******** エラーコード *****************************************************/
#define BUD_ERR_OK              0x00000000  /* エラーなし                  */
#define BUD_ERR_BUSY            0xffffffff  /* コマンド実行中              */
#define BUD_ERR_INVALID_PARAM   0xffffff00  /* 関数パラメータが異常        */
#define BUD_ERR_ILLEGAL_DISK    0xffffff81  /* 最終ブロック不良            */
#define BUD_ERR_ILLEGAL_FORMAT  0xffffff82  /* 最終ブロック不良            */
#define BUD_ERR_UNKNOWN_DISK    0xffffff83  /* 対応していないディスク      */
#define BUD_ERR_NO_DISK         0xffffff01  /* ディスクが入っていない      */
#define BUD_ERR_UNMOUNT         0xffffff02  /* ディスクが入っていない      */
#define BUD_ERR_UNFORMAT        0xffffff03  /* 未フォーマット              */
#define BUD_ERR_DISK_FULL       0xffffff04  /* ディスクフル                */
#define BUD_ERR_FILE_NOT_FOUND  0xffffff05  /* ファイルが見つからない      */
#define BUD_ERR_FILE_EXIST      0xffffff06  /* 同じ名前のファイルがある    */
#define BUD_ERR_CANNOT_OPEN     0xffffff07  /* ファイルが開けない          */
#define BUD_ERR_CANNOT_CREATE   0xffffff08  /* 実行ファイルを作成できない  */
#define BUD_ERR_ACCESS_DENIED   0xffffff0b  /* ファイルアクセス拒否        */
#define BUD_ERR_WRITE_ERROR     0xffffff40  /* ライトエラー                */
#define BUD_ERR_GENERIC         0xffff0000  /* 未定義エラー                */

               /* リードオープンされているファイルに対して書き込もうとした */
               /* クリエイトオープンされているファイルから読み込もうとした */
               /* オープンされているファイルに対してリード、ライト、       */
               /* クローズ以外の操作を実行しようとした                     */

/******** バックアップファイルのビジュアルデータタイプ *********************/
#define BUD_VISUALTYPE_NONE   0             /* ビジュアルデータなし        */
#define BUD_VISUALTYPE_A      1             /* タイプA                     */
#define BUD_VISUALTYPE_B      2             /* タイプB                     */
#define BUD_VISUALTYPE_C      3             /* タイプC                     */


#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /* _SG_BUP_H_ */

