KCEJ CD/DVD MANAGER (cdbios)

	$Id: readme.txt,v 1.4 2001/01/12 06:26:06 usr01475 Exp $



SCEのcdvdmanを使ったCD/DVDリードライブラリ。

EE側でsceCd系の関数をリンクしたくない。

IOP側で32*2のダブルバッファを確保。

EEに転送する。

IOP側のステータスはつねにEE側に転送。



任意セクタ転送時に割り込みをおこすことができる。



低レベルのライブラリに徹しているため、EE側のキャッシュの整合などは

呼び出し側がとることが前提。



--- 2000/01/12 追加 HD対応 ---



外づけハードディスクや開発環境でのHDからのストリームに対応するため、

open系の関数を使ったデータの読み込みをサポートする。



EEから同じインターフェースで呼び出せるようにするため、

セクタ番号の指定を拡張し、

((ファイルID)<<24)|(先頭からのセクタ単位のオフセット)

で、ファイルIDが０の時CDから、それ以外の時はファイルから読みだすようにする。

したがって、１ファイルの最大サイズは0x00FFFFFF*2048=32Gに制限。



cdbios_get_fileposで、先頭がcdrom0:以外の場合、

そのファイル名IOP側に登録して、((ファイルID)<<24)の値を返すことで

EEから同等の処理ができるようにする。ファイルIDは１はじまりだが、EE側から

気にする必要はない。



現状は毎回読み込み開始時にファイルをオープンしなおす。

速度の問題があるようならオープンしっぱなしも検討する。



------------------------------



・ファイル構成



cdbios.c		; IOPプログラム本体

entry.o			; IOPのエントリルーチン(tblから生成)

cdbios_ee.c		; EEからの呼出しルーチン

cdbios.tbl		; IOPからの呼出しエントリ



・EE側から見たインターフェース



// 



typedef struct {

	int pos;			// 現在の読み取り位置

	void *ee_buffer;	// EE側の読み込みバッファ

	int read_size;		// 全体の読み取りサイズ

	int	intr_size;		// 現在からの割り込みサイズ(-1:割り込みなし)

	int total_size;		// 終了サイズ

} CDBIOS_READ_STATUS;



// 外側



--------------------------------------------------------------

void cdbios_init( void );



IOPプログラムと通信し、システムの初期化を行なう。必ず最初に呼び出すこと。



--------------------------------------------------------------

int cdbios_get_status( void );



IOPプログラムのステータスをえる。アイドル状態なら０。



--------------------------------------------------------------

int cdbios_get_read_size( void );



リード中に進行状況を取得する。

読み取り完了サイズをバイト単位で返す。

	int cdbios_get_read_remain( void );(旧形式)



--------------------------------------------------------------

void cdbios_read( void *buffer, int pos, int size );



bufferに、posのセクタからsizeバイト読み込む。

非同期に実行を行なう。

読み込み終了は cdbios_get_status()が０になることで取得できる。

エラー発生時は無限リトライを行なう。cdbios_get_status()で

エラー状態のチェックは行なう必要がある。



--------------------------------------------------------------

void cdbios_callback_read( void *buffer, int pos, int size

						   , void (*callback)(CDBIOS_READ_STATUS *), int intr_size );



bufferに、posのセクタからsizeバイト読み込む。

非同期に実行を行なう。

読み込み終了は cdbios_get_status()が０になることで取得できる。



int_sizeバイト読み取り後にcallbackを呼び出す。

callbackが必要ない時は、int_size = -1, callback = NULLを設定する。

callbackは割り込みコンテキストで実行される。

callback中で、CDBIOS_READ_STATUSを変更し、読み取りサイズや転送位置を

変更することができる。intr_sizeはcallbackの呼出し毎にリセットされるので

注意すること。

CDBIOS_READ_STATUS *は、キャッシュスルーアドレスが渡される。



--------------------------------------------------------------

int cdbios_preseek( int pos );



posから読み込むために先行シークを行なう。

先読みキャッシュを利用するため、内部ではその直前の1セクタをリードしている。

もし、エラーが発生しても、とくにリトライは行なわれない。

seek完了を待たずにreadを発行できるが、その場合はseekが完了し次第、

readがスタートする。



--------------------------------------------------------------

int cdbios_stop( void );



CDのread, seekを強制的に終了する。



--------------------------------------------------------------

int cdbios_get_time( sceCdClock *rtc );



ドライブのRTCから時間を読み込む。

sceCdClockを使用するためにライブラリのlibcdvd.hをインクルードすること。

連続呼出しは300msec = 0.3sec程度の間隔を開ける必要があるようだ。



--------------------------------------------------------------

int cdbios_get_filepos( char *name );



nameというパス名のファイルの先頭セクタを取得する。

ブロック関数。同じパスを連続すると早い。

他の関数実行中はおかしくなる。

