- 62KB BIOS
- Z80ニーモニックで記述
- Mode2 割り込みを使用
- CON: をサポート。 LST:, PUN:, RDR: は未サポート。
- DISK I/O
- 5 ドライブ (A: to E:) をサポート
- Blocking and Deblocking をサポート
AVRファームウェアは電源ONおよびリセット時に以下を実行する。
- DIPSW-1がON、かつmicroSD CardがマウントできたらCP/Mモードで起動する。
- EEPROMの0番地から
EntryAddress
とLength
をリードする。 (1) - SRAMの0x0000番地に
JP EntryAddress
命令を書き込む。 (2) - EEPROM内のBIOSを
EntryAddress
にLength
分コピーする。 (3) - Z80をリセットし、CP/Mを起動。
- TinyMonitorを起動。
Z80はCP/Mを以下のように起動する。
- 0番地のJP命令によりBIOSが起動される。
- CCP+BDOSを
EntryAddress
にロードするために、BIOS BOOTルーチンがAVRにDISK READを要求する。
AVRは CCP+BDOS を microSD Card上のディスクイメージファイルのTrack 0相当から読み出し、SRAMにコピーする。 - BIOS BOOTルーチンがCCPを起動する。
BOOTとWBOOTの違いは以下。
- パワーオン時のみ呼ばれる。
- Z80の割り込み設定、Emulated I/O deviceの初期化
- ドライブをA:に設定
- CCP+3番地にジャンプ
- ドライブは直前まで使用していたものをセット。
- CCPの先頭にジャンプ
BDOSが指定する論理トラックと論理セクタを、絶対セクタ番号に変換して扱っている。絶対セクタの定義は以下。
TRK
とSEC
は、それぞれSETTRK
、SETSEC
のBIOSコールで事前にセットされるものとする。
SPT
はDPB(Disk Parameter Block)で定義される値である。詳細はBIOSのソースとこちらを参照。
- 論理トラック番号 :
TRK
- 論理セクタ番号 :
SCT
- 論理トラックあたりのセクタ数 :
SPT
- 絶対セクタ番号 :
AS
= TRK * SPT + SCT
AVRとのデータ共有用に、SRAM上に512bytesのバッファ(DMABUF
)を確保しており、READ
,WRITE
のBIOSコールで排他使用する。CP/Mの論理セクタ長は128byteなので、4セクタ分、すなわちBlocking Factor=4のBlocking/Deblockingをサポートする。
READ要求を受けると、指定されたセクタがDMABUF
に存在するかチェックする。
存在する場合は、そのセクタをDMA_ADRS
にコピーする。
存在しない場合は、AVRに512bytesのリードを要求する。先頭128byte(1セクタ分)をDMA_ADRS
にコピーする。残りの3セクタ分は先読みキャッシュとして保存しておく。
AVRのEmulated DISK I/Oは、任意のアドレスとデータ長を指定して、ディスクイメージファイルにWRITEすることができる。しかしmicroSD Cardは、512byteのセクタ境界から512byte単位でライトする必要があるため、境界が一致しなかったり、データ長が512の倍数にならない場合はRead/Modify/Writeが必要になる。 これは顕著なライト速度の低下を招くため、BIOSはなるべく512bytes境界から512bytesを書き込むように、バッファとバッファフラッシュ(AVRへのライト要求)のタイミングを管理する。
WRITE要求を受けると、以下で定義されるIDX
の位置にデータがコピーされる。
- 格納されるバッファの位置 : IDX = AS % 4
+----------+ IDX=0 | 128bytes | +----------+ IDX=1 | 128bytes | +----------+ IDX=2 | 128bytes | +----------+ IDX=3 | 128bytes | +----------+
これがバッファフラッシュ後の初回のWRITE要求であれば、あわせてIDX
とイメージファイルの書き込み先アドレスを記憶しておく。これは次のバッファフラッシュ時に使用される。
WRITE要求元は、Cレジスタに以下のDeblocking Codeをセットする。
- C = 0: deferred write
- C = 1: nondeferred write
- C = 2: deferred write to the first sector of a new data block
もしも以下のいずれか、または両方条件を満たす場合はバッファフラッシュを行う。
- C = 1
- IDX = 3 それ以外は、キャッシュされているセクタ数(0-3)をインクリメントし、リターンする。
バッファフラッシュ時は、記憶しているIDX
からキャッシュされているセクタ数x128byte分
を、イメージファイルの書き込み先アドレス
にライトする。
Emulated DISK I/Oは、アクセスするディスクイメージを指定されたドライブのものに切り替える。
論理トラック番号をCURRENT_TRACK_NO
に保存するだけ。次回のREAD/WRITEで使用される。
論理セクタ番号をCURRENT_SECTOR_NO
に保存するだけ。次回のREAD/WRITEで使用される。
データの転送アドレスをDMA_ADRS
に保存するだけ。次回のREAD/WRITEで使用される。
microSD Cardではインターリーブが不要なため、未サポート。