オール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ブロックを確認したいと思います。

おすすめの記事