オールRAM化とSPIによるSDCARD読み書きができるようになったので、CP/Mの移植に挑戦したいと思います。
CP/M関連の情報については先人さんのブログなどを参考にさせていただきました。
移植方法として、まずBIOSを作成してから、CPM.SYSをHEXファイルに変換して、モニタでダウンロードし、メモリ上でまず、CP/Mシステムを起動させてみたいと思います。
まずは、CP/M本体がないと進まないので入手していきます。
「Digital Research Binary Files」「OPERATING SYSTEMS」からCP/M 2.2 のCP/M 2.2 BINARYをダウンロードします
BIOSの移植方法について参考になるスケルトンのCBIOSのソースプログラムをダウンロードします(i8080表記です)
「Digital Research CP/M Operating System Manual」様のサイトから B- A Skeletal CBIOS を参照します。
まずは、BIOSを作成していきますが、i8080表記になっていますので、中身を読みながら、Z80表記に翻訳していきたいと思います。
アセンブラは、MACを通常使用しますが、手元に動作するCP/Mシステムがないという設定(Z80エミュレータ上のCP/Mで使用可能ですが^^)なので、今まで使用してきたASxxxx(Z80)でアセンブルしていきます。
i8080からZ80へのニモニック変換は変換表を見ながら手作業で行いますw
CP/M2.2 Binary(cpm22-b)に含まれているBIOS.asmとCBIOSを参考にまず冒頭部分を翻訳してみました。
MSIZE=20 メモリモデルは最小の20KバイトCP/Mシステムとします。
MSIZEを設定すれば、CCP、BDOS、BIOSの開始アドレスが計算されるようになっています。
20Kモデルでは CCP=0x3400 BDOS=0x3c06 BIOS=0x4a00になりました。
NSECTS=0x2cで ccp,bdosを含めてシステムのセクタ数となります。このセクターの後にBIOSがdisk上に設定されるはずです。
BIOSの最初のアドレスには、各サブルーチンに飛ぶためのテーブルが配置されています。
各サブルーチンの並びは固定となっています。
Z80に翻訳した冒頭のBIOSは下記のようになりました。
.z80
VERS .equ 22 ;Version 2.2
MSIZE .equ 20 ;CP/M memory size
BIAS .equ (MSIZE-20)*1024
CCP .equ 0x3400 + BIAS ;base of cpm console processor
BDOS .equ 0x806 + CCP ;basic dos
BIOS .equ CCP + 0x1600 ;BIOS
CDISK .equ 0x0004 ;disk number 0=A 1=B ..
IOBYTE .equ 0x0003 ;intel i/o byte
.area BIOS(ABS)
.org BIOS
NSECTS .equ (#. - CCP)/128 ;warm start sector count
;; jump vector for indiviual routines
;
jp boot ;cold start
wboote: jp wboot ;warm start
jp const ;console status
jp conin ;console character in
jp conout ;console character out
jp list ;list character out
jp punch ;punch character out
jp reader ;reader character out
jp home ;move head to home position
jp seldsk ;select disk
jp settrk ;set track number
jp setsec ;set sector number
jp setdma ;set dma address
jp read ;read disk
jp write ;write disk
jp listst ;return list status
jp sectran ;sector translate
次回はdisksブロックを確認したいと思います。