English
SGL User's ManualPROGRAMMER'S TUTORIAL
戻る進む
PROGRAMMER'S TUTORIAL

13.バックアップライブラリ


 セガサターンでは32kbyteの内蔵バッファメモリを持っています。本章では、この内臓バッファメモリを使用するためのバックアップライブラリについて解説します。
バックアップライブラリの本体は、セガサターンのB00TROM内に圧縮されて格納されています。 このバックアップライブラリを使用して、バッファメモリや外付けカートリッジとデータのやり取りをすることができます。

13-1. バックアップライブラリの特長

デバイス

 ●サポートするデバイス
 内蔵バックアップメモリ、外付けカートリッジ等(現在はこの2種類)のデバイスを、階層構造を持たないファイル形式でアクセスできます(表13-1)。さらに、これらのデバイスは、図13-1に示すようにパーティションで区別されます。

 ●各デバイスの接続情報(Config)
 各デバイスの接続情報(Config)はバックアップライブラリのイニシャル時に取得することができます。

 ●各デバイス毎の情報(Status:接続/非接続、フォーマット/未フォーマット等)
 バックアップライブラリ関数を用いて取得することができます。また、書き込みたいファイルのサイズを指定し、書き込み可能かどうかも調べることができます。

表13-1 デバイス一覧
デバイス(装置)番号デバイス(装置)種類
0内蔵メモリカートリッジ
1メモリカートリッジまたはパラレルインタフェース

図13-1 デバイス構成

ファイル

 各ファイル毎の情報(Dir:名称、作成時間等)を、バックアップライブラリ関数を用いて、同様に取得することができます。
ファイル作成時のファイル情報設定はファイル作成時にユーザーの責任で行われ、バックアップライブラリ自身がファイル情報を作成することはありません。

ライブラリの展開

 バックアップライブラリの本体は、セガサターンのBOOTROM内に圧縮されて格納されています。ユーザーはバックアップライブラリ使用時に、プログラム展開領域とワーク領域を確保して、イニシャル処理を行います。以後、各関数が使用可能となります。

注 意
バックアップライブラリは、データ書き込み中に処理を中断されるとデータを破壊します。そのため、バックアップライブラリの初期化、フォーマット、書き込み、削除処理を実行するときは、システムライブラリ中の“slResetDisable()”(ペリフェラル関数)を使用して、リセットボタンを無効にしてください。

13-2. 基本的な処理の流れ

 基本的な処理の流れに沿ってバックアップライブラリ関数を説明します。

1)初期化 [BUP_Init()]
BOOTROMから、バックアップライブラリを読み出し、指定したアドレス空間に展開します。その時の各デバイス情報を返します。

2)パーティションの選択 [BUP_SelPart()]
使用するデバイスのパーティションを指定します。デフォルトのパーティションは0番(内蔵メモリカートリッジ)です。

3)ステータスの取得 [BUP_Stat()]
読み書きしたいデバイスのステータスを取得します。書き込みの場合は、書き込みたいデータのサイズをバイト数で指定します。戻り値により書込可能かどうかが分かります。

4)フォーマット [BUP_Format()]
ステータスの取得により、使用したいデバイスが未フォーマットであった場合は、フォーマット処理を行う必要があります。フォーマットの範囲は、指定されたデバイスの、指定されたパーティションです。

5)ディレクトリ情報の取得 [BUP_Dir()]
ファイル名を指定して(もしくは全ファイルに関して)ディレクトリ情報の取得を行います。全ファイルに関しての情報が欲しい場合は、ファイル名にNULLを指定します。

6)データの書き込み [BUP_Write()]
デバイスを指定して、ファイルの書き込みを行います。その際に必要なファイル情報はユーザー側で作成します。

7)データの照会 [BUP_Verify()]
デバイスを指定して、書き込まれているファイルの照会を行います。

8)データの読み込み [BUP_Read()]
デバイスを指定して、ファイルの読み込みを行います。

9)データの削除 [BUP_Delete()]
デバイスを指定して、ファイルの削除を行います。

10)日付データの展開 [BUP_GetDate()]
ファイル情報に圧縮して、格納されている日付データを展開します。

11)日付データの圧縮 [BUP_SetDate()]
ファイル情報に日付データを格納するために圧縮を行います。

13-3. サンプルプログラム

 次に、一通りバックアップライブラリを使用するサンプルプログラムの流れをフローチャートで示します。

フロー13-1 バックアップライブラリを使用するサンプルプログラム

 リスト13-1に、サンプルプログラムのプログラムリストを示します。

リスト13-1 サンプルプログラム

#include	"sgl.h"
#define		BUP_START_ADDR	0x6070000
#include	"sega_bup.h"

#define	FILE_NAME	"FILE_NAME01"
#define	BACKUP_DEVICE	(Uint32)0
#define	TEST_DATA	"It's a pen"
#define	TEST_SIZE	10
#define	DIR_SIZE	8
#define	HEX2DEC(x)	( ( 0x0f&(x) ) + ( (x) >> 4 )*10 )

/***************************************************

  sample for backupram

***************************************************/

Uint32  BackUpRamWork[2048 + 30];

void	BackUpInit(BupConfig cntb[3] )
{
	slResetDisable();
	BUP_Init((Uint32 *)BUP_START_ADDR,BackUpRamWork,cntb);
	slResetEnable();
}

Sint32	BackUpWrite(Uint32 device, BupDir *dir, Uint8 *data, Uint8 sw)
{
	Sint32		ret;
	SmpcDateTime	*time;
	BupDate		date;
	
	if(!dir->date){
		time = &(Smpc_Status->rtc);
		date.year  = (Uint8 )( slDec2Hex((Uint32)time->year)-1980 ); /* Modify K.T */
		date.month = (Uint8 )( time->month & 0x0f);
		date.week  = (Uint8 )( time->month >> 4  );
		date.day   = (Uint8 )( slDec2Hex((Uint32)time->date));   /* Modify K.T */
		date.time  = (Uint8 )( slDec2Hex((Uint32)time->hour));   /* Modify K.T */
		date.min   = (Uint8 )( slDec2Hex((Uint32)time->minute)); /* Modify K.T */
		dir->date = BUP_SetDate(&date);
	}
	slResetDisable();
	ret = BUP_Write(device,dir,data,sw);
	slResetEnable();

	return(ret);
}

Sint32	BackUpDelete(Uint32 device,Uint8 *filename)
{
	Sint32	ret;

	slResetDisable();
	ret = BUP_Delete(device,filename);
	slResetEnable();

	return(ret);
}


Sint32	BackUpFormat(Uint32 device)
{
	Sint32	ret;

	slResetDisable();
	ret = BUP_Format(device);
	slResetEnable();

	return(ret);
}


void	ss_main()
{
    BupConfig	conf[3];
    BupStat	sttb;
    BupDir	dir, dirs[DIR_SIZE];
    BupDate	datetb, date;
    Uint8	*time;
    Sint32	status;
    Uint8	buf[256];
    int		i,lin=4;

    slInitSystem(TV_352x224,(TEXTURE *)NULL,1) ;

    slPrint("Sample program Backup Library" , slLocate(9,2));

    slGetStatus(); 
    for(i=0;i<100;i++)
      {
	  slSynch() ;
      }

    BackUpInit( conf );
                                                
    if( ( status = BUP_Stat( BACKUP_DEVICE, 10, &sttb ) ) == BUP_UNFORMAT  )
      {
	  status = BackUpFormat(BACKUP_DEVICE);
	  slPrint("Formatting device" , slLocate(10,lin));
	  BUP_Stat( BACKUP_DEVICE, TEST_SIZE, &sttb );
      }

    if( sttb.freeblock > 0 )
      {
	  strncpy( dir.filename, FILE_NAME  , 11 );
	  strncpy( dir.comment , "Test desu", 10 );
	  dir.language = BUP_ENGLISH;
	  dir.datasize = TEST_SIZE;
	  dir.date     = 0;
 	  slPrint("Writing file." , slLocate(10,++lin));
	  slPrint("Filename= "    , slLocate(13,++lin));
	  slPrint(  FILE_NAME     , slLocate(23,lin  ));
	  status = BackUpWrite(BACKUP_DEVICE, &dir, (Uint8 *)TEST_DATA,OFF);
	  status = BUP_Verify (BACKUP_DEVICE,(Uint8 *)FILE_NAME,(Uint8 *)TEST_DATA);
      }

    status = BUP_Dir ( BACKUP_DEVICE, (Uint8 *)FILE_NAME  , DIR_SIZE, dirs );
    status = BUP_Dir ( BACKUP_DEVICE, (Uint8 *)"", DIR_SIZE, dirs );
    for ( i = 0; i<status && i<10; i++ )
      {
	  char	cmnt[11] = "Dirs    = ";

	  cmnt[6] = (char)(i+20);
	  slPrint("Dirs   = "     , slLocate(10,++lin));
	  slPrint(dirs[i].filename, slLocate(20,  lin));
      }
    status = BackUpWrite(BACKUP_DEVICE, &dir, (Uint8 *)TEST_DATA,OFF);
    status = BUP_Read( BACKUP_DEVICE, (Uint8 *)FILE_NAME, buf );
    slPrint("Reading file." , slLocate(10,++lin));
    slPrint("Filename= "    , slLocate(13,++lin));
    slPrint( FILE_NAME      , slLocate(23,lin  ));
#if 0
    status = BackUpDelete( BACKUP_DEVICE, (Uint8 *)FILE_NAME );
    status = BUP_Dir ( BACKUP_DEVICE, (Uint8 *)"", DIR_SIZE, dirs );
    slPrint("Deleting ="    , slLocate(10,++lin));
    slPrint("Filename= "    , slLocate(13,++lin));
    slPrint( FILE_NAME      , slLocate(23,lin  ));
#endif
    for ( i = 0; i<status && i<10; i++ )
      {
	  char	cmnt[11] = "Dirs    = ";

	  cmnt[6] = (char)(i+20);
	  slPrint("Dirs   = "     , slLocate(10,++lin));
	  slPrint(dirs[i].filename, slLocate(20,  lin));
      }

    for(;;)
      {
	  slSynch() ;
      }
}

付記 バックアップライブラリ関数

 バックアップライブラリで使用する関数の一覧を、表13-2に示します。
なお、関数の詳細なリファレンスは、PROGRAMMER'S GUIDE VOL.1を参照してください。

表13-2 バックアップライブラリ関数
番号
 関 数 名 
   機  能   
1BUP_Initバックアップライブラリの初期化
2BUP_SelPartパーティションの選択
3BUP_Formatフォーマットの実行
4BUP_Statステータスの取得
5BUP_Writeデータの書き込み
6BUP_Readデータの読み込み
7BUP_Deleteデータの削除
8BUP_Dirディレクトリ情報の取得
9BUP_Verifyデータの照会
10BUP_GetDate日付けデータの展開
11BUP_SetDate日付けデータの圧縮


戻る進む
SGL User's ManualPROGRAMMER'S TUTORIAL
Copyright SEGA ENTERPRISES, LTD., 1997