KZ80シリーズ、SBC8080 8085でCP M - kuninet/KZ80_CPM GitHub Wiki

概要

  • KZ80-CPUB、SBC8080/8085 CPUルーズキットとCFカードアダプタ(KZ80-CF)、128kBメモリーボード(KZ80-1MSRAM REV2)を組み合わせて、CP/M 2.2を動かす手順をまとめてみます。
    • 128kBメモリーボード(KZ80-1MSRAM)はREV2から64kバイトモード切り替えに対応しています。それ以前のリビジョンではCP/M稼働はできません。
    • Grant氏のブレッドボードマイコンの構成はZ80 CPU+SIO(シリアルA/B)となっていますので、シリアル通信部分の変更が必要です。
    • KZ80-CPUB、SBC8080/8085 CPUルーズキットではシリアル通信をインテル8251で実施していますので、SBC8080データパックのソース(MSBAS80.ASM)を参考に移植します。
    • CP/Mの機種依存部分はBIOSに集まっていますので、cbiosxxx.asmの移植がメインですが、起動するためのROMモニター、CFフォーマッター、システム転送プログラムも環境に合わせた修正が必要です。
    • SBC8080/8085については、最後に記載しているとおり、Z80命令を8080命令に書き換える修行が追加で必要です。^^)/

参考サイト

注意点

  • CFカードをFDにみたててCP/Mを起動しますが、"TrueIDE"対応の128M/64MバイトCFカードが必要です。いままで確認できたカードは以下の通りです。(同品種で必ず動くとは限りませんが...)
メーカー CFカード型番 備考
バッファロー RCF-X 128M RCF-XシリーズはメーカーFAQで"TrueIDE"対応と出ています
I/Oデータ CFS-128M
Hagiwara Sys-com CFI-128MDG
Hagiwara Sys-com NFD10-256B

各種ソースのアセンブル環境整備

  • CP/Mを動かすための各種ソースを変更した際、Grant氏提供のzipファイルに同梱されているTASM(A Table Driven Cross Assembler for the MSDOS* Environment)でアセンブルするのが簡単です。
    • MS-DOSが必要です。私はMac上の仮想Win2000でTASMを実行してアセンブルしました。
    • 簡易にMS-DOS環境を手に入れるにはDOSBoxもオススメです。英語DOS環境が手軽に動かせます。ホストOSのディレクトリもマウント可能です。
      • MacでDOSBoxを動かす場合はディレクトリ名/ファイル名を8文字以内にするのが無難です。"~"を入力するのが困難です。
    • Windows7/8/10環境でMS-DOS用プログラムを動かす場合は、MS-DOS Playerがおすすめです。
msdos\source\binary\i486_x64\msdos.exe tasm -80 source\basic.asm hexFiles\basic.hex lst\basic.lst

まずは、KZ80-CPUB(Z80マイコン)でCP/Mを動かす際の移植/変更ポイントを以下にまとめます。

ROMモニター(monitor.asm)の移植

  • ROMモニターのソース(monitor.asm)はZ80 SIO前提となっていますので変更が必要です。
  • CP/Mのシステム部分をCFカードからロードするルーチンを持っていますので、このROMモニターを使う方が今後の運用が楽です。

変更箇所について

  • ROMモニターの変更箇所は以下のとおりです。
    1. CFレジスターのI/Oアドレス
    2. バッファ等の定義
    3. シリアル割り込み入力ルーチン
    4. coninルーチン (シリアル1文字入力処理)
    5. conoutルーチン (シリアル1文字出力処理)
    6. CKINCHARルーチン (シリアル入力バッファチェック処理)
    7. INITルーチン (各種初期化処理)

CFレジスターのI/Oアドレス

  • KZ80-CFのI/Oアドレスジャンパで設定した値に合わせてください。
    • 例) $1x → $Ex へ変更
CF_BASE	.EQU	$E0   ; CompactFlash BASE I/O Address 
; CF registers 
CF_DATA		.EQU	CF_BASE+0 
CF_FEATURES	.EQU	CF_BASE+1 
CF_ERROR	.EQU	CF_BASE+1 
CF_SECCOUNT	.EQU	CF_BASE+2 
CF_SECTOR	.EQU	CF_BASE+3 
CF_CYL_LOW	.EQU	CF_BASE+4 
CF_CYL_HI	.EQU	CF_BASE+5 
CF_HEAD		.EQU	CF_BASE+6 
CF_STATUS	.EQU	CF_BASE+7 
CF_COMMAND	.EQU	CF_BASE+7 
CF_LBA0		.EQU	CF_BASE+3 
CF_LBA1		.EQU	CF_BASE+4 
CF_LBA2		.EQU	CF_BASE+5 
CF_LBA3		.EQU	CF_BASE+6 

バッファ等の定義

  • シリアルバッファ等の定義を実施します。もともとのZ80 SIO用バッファ領域などは適宜削除してください。
UARTRD	.EQU	00H 
UARTRC	.EQU	01H 
; 
BUFSIZ	.EQU	3FH 
BUFFUL	.EQU	30H 
BUFEMP	.EQU	5 
; 
RTSHIG	.EQU	00010111B 
RTSLOW	.EQU	00110111B 
 
		.ORG	4000h 
; 
SERBUF	.ds	BUFSIZ 
SERINP	.ds	2 
SERRDP	.ds	2 
SERCNT	.ds	1 
BASFLG	.ds	1 

シリアル割り込み入力ルーチン

  • 元ソースではZ80 SIOをZ80 CPUの割り込みモード2で使用するルーチンとなっています。KZ80-IOB/SBC8080サブルーズキットのインテル8251を使用する場合 割り込みモード0/モード1を使用してアドレス0038hからシリアル割り込みルーチンを配置(または0038hへシリアル割り込み処理へのJP命令を配置)が必要です。
	.ORG	0038H
RST38:	JP	SERINT 
;
;	8251 -> BUFFER BY INTERRUPT 
SERINT:	PUSH	AF 
	PUSH	HL 
	IN	A,(UARTRC) 
	AND	00000010B 
	JP	Z,RTS0 
	IN	A,(UARTRD) 
	PUSH	AF 
	LD	A,(SERCNT) 
	CP	BUFSIZ 
	JP	NZ,NOTFUL 
	POP	AF 
	JP	RTS0 
NOTFUL:	LD	HL,(SERINP) 
	INC	HL 
	LD	A,L 
	CP	SERINP & 0FFH 
	JP	NZ,NOTWRP 
	LD	HL,SERBUF 
NOTWRP:	LD	(SERINP),HL 
	POP	AF 
	LD	(HL),A 
	LD	A,(SERCNT) 
	INC	A 
	LD	(SERCNT),A 
	CP	BUFFUL 
	JP	C,RTS0 
	LD	A,RTSHIG 
	OUT	(UARTRC),A 
RTS0:	POP	HL 
	POP	AF 
	EI 
	RET 
  • もともとのserialIntルーチンは削除して、SBC8080データパックのソース(MSBAS80.ASM)から SERINTルーチンを移植します。

coninルーチン (シリアル1文字入力処理)

  • coninルーチン (シリアル1文字入力処理)はエントリーポイントの名称はそのままに、SBC8080データパックのソース(MSBAS80.ASM)から RXAルーチンを移植します。
  • coninルーチンの戻り値はAレジスタに入力文字をセットして返すかたちとなります。
conin: 
	LD	A,(SERCNT) 
	CP	00H 
	JP	Z,conin 
	PUSH	HL 
	LD	HL,(SERRDP) 
	INC	HL 
	LD	A,L	;Only need to check low byte becasuse buffer<256 bytes 
	CP	SERINP & 0FFH	;(SERBUF+BUFSIZ) & 0FFH 
	JP	NZ,NRWRAP 
	LD	HL,SERBUF 
NRWRAP:	DI 
	LD	(SERRDP),HL 
	LD	A,(SERCNT) 
	DEC	A 
	LD	(SERCNT),A 
	CP	BUFEMP 
	JP	NC,RTS1 
	LD	A,RTSLOW 
	OUT	(UARTRC),A 
RTS1:	LD	A,(HL) 
	EI 
	POP	HL 
	RET		;Char ready in A 

conoutルーチン (シリアル1文字出力処理)

  • conoutルーチン (シリアル1文字出力処理)はエントリーポイントの名称はそのままに、SBC8080データパックのソース(MSBAS80.ASM)から TXAルーチンを移植します。
  • conoutルーチンで出力したい文字はAレジスタで渡ってきますのでインターフェースはいっしょです。
conout:		PUSH	AF	;Store character 
COUT1:	IN	A,(UARTRC)	;Status byte        
	AND	01H	;Set Zero flag if still transmitting character        
	JP	Z,COUT1	;Loop until flag signals ready 
	POP	AF	;Retrieve character 
	OUT	(UARTRD),A	;Output the character 
	RET 

CKINCHARルーチン (シリアル入力バッファチェック処理)

  • CKINCHARルーチン (シリアル入力バッファチェック処理)はエントリーポイントの名称はそのままに、SBC8080データパックのソース(MSBAS80.ASM)から CHKCHRルーチンを移植します。
  • CKINCHARルーチンの戻り値はフラグレジスタです。
CKINCHAR	LD	A,(SERCNT) 
	CP	00H 
	RET 

INITルーチン (各種初期化処理)

  • INITルーチン (各種初期化処理)はエントリーポイントの名称はそのままに、SBC8080データパックのソース(MSBAS80.ASM)から SINITルーチンのシリアルバッファ初期化/8251の初期化ルーチンを移植します。
  • 元ソースではEI命令(割り込み許可)のあと、SIOA、SIOBの2つのシリアル端末へ「スペースバーを押せ」というメッセージを出力してスペースバーを押下された側をやりとりするシリアル端末として決定する処理が入っています。しかし今回はシリアル端末は1つなのでその部分は削除して構いません。
INIT		LD   SP,STACK		; Set the Stack Pointer 
 
	LD	HL,SERBUF 
	LD	(SERINP),HL 
	LD	(SERRDP),HL 
	XOR	A 
	LD	(SERCNT),A 
	OUT	(UARTRC),A 
	OUT	(UARTRC),A 
	OUT	(UARTRC),A 
	LD	A,01000000B 
	OUT	(UARTRC),A 
	LD	A,01001110B 
	OUT	(UARTRC),A 
	LD	A,RTSLOW 
	OUT	(UARTRC),A 
	EI 
	; Clear message on  consoles 
		LD	A,$0C 
		CALL	conout 
	;
		IM 0

動作確認

  • 上記修正を実施したmonitor.asmをTASMでアセンブリして作成されたインテルHEXファイルを元にROMを焼いて起動確認を実施してください。
  • 8251の初期設定値をSBC8080データパックのソース(MSBAS80.ASM)に合わせた場合、9600bpsで通信可能で初期メッセージが出力されれば移植成功です。

CFフォーマッター(form128/64.asm)、CP/Mシステム転送ユーティリティ(putsys.asm)の移植ポイント

  • CFフォーマッター(form128/64.asm)、CP/Mシステム転送ユーティリティ(putsys.asm)の変更点はCFカードのI/Oアドレスのみです。
    • KZ80-CFのI/Oアドレスジャンパで設定した値に合わせてください。
    • 例) $1x → $Ex へ変更
CF_BASE	.EQU	$E0   ; CompactFlash BASE I/O Address 
; CF registers 
CF_DATA		.EQU	CF_BASE+0 
CF_FEATURES	.EQU	CF_BASE+1 
CF_ERROR	.EQU	CF_BASE+1 
CF_SECCOUNT	.EQU	CF_BASE+2 
CF_SECTOR	.EQU	CF_BASE+3 
CF_CYL_LOW	.EQU	CF_BASE+4 
CF_CYL_HI	.EQU	CF_BASE+5 
CF_HEAD		.EQU	CF_BASE+6 
CF_STATUS	.EQU	CF_BASE+7 
CF_COMMAND	.EQU	CF_BASE+7 
CF_LBA0		.EQU	CF_BASE+3 
CF_LBA1		.EQU	CF_BASE+4 
CF_LBA2		.EQU	CF_BASE+5 
CF_LBA3		.EQU	CF_BASE+6 

BIOSの移植

  • CP/Mの機種依存部分であるBIOSの移植を行います。
  • ベースとするソースは、CBIOS128.ASM/CBIOS64.ASMです。

変更箇所について

  • BIOSの以下の箇所が変更対象です。
    1. 各種EQU定義
    2. CFレジスターのI/Oアドレス
    3. bootルーチン (バンク切り替え&シリアルLSI等初期化)
    4. wbootルーチン (割り込みモード2用初期化ルーチン削除)
    5. gocpmルーチン (RAM 0038番地のジャンプ命令初期配置)
    6. serialIntルーチン (シリアル割り込み処理)
    7. constルーチン (シリアル状況返却処理)
    8. readerルーチン (紙テープリーダー処理)
    9. coninルーチン (シリアル1文字入力処理)
    10. listルーチン (リストプリンタ処理)
    11. punchルーチン (紙テープ出力処理)
    12. conoutルーチン (シリアル1文字出力処理)
    13. popAndRunルーチン (ROMモニタからのスタート処理)
    14. シリアルバッファの定義
    15. アドレス0FFE8Hからのユーティリティ

各種EQU定義

  • 後続のルーチンで使用するEQU定義を実施してください。
UARTRD	.EQU	00H 
UARTRC	.EQU	01H 
; 
BUFSIZ	.EQU	3FH 
BUFFUL	.EQU	30H 
BUFEMP	.EQU	5 
; 
RTSHIG	.EQU	00010111B 
RTSLOW	.EQU	00110111B 

;ROM BANK I/O 
ROM_BANK_IO	.EQU	80h 

CFレジスターのI/Oアドレス

  • KZ80-CFのI/Oアドレスジャンパで設定した値に合わせてください。
    • 例) $1x → $Ex へ変更
CF_BASE	.EQU	$E0   ; CompactFlash BASE I/O Address 
; CF registers 
CF_DATA		.EQU	CF_BASE+0 
CF_FEATURES	.EQU	CF_BASE+1 
CF_ERROR	.EQU	CF_BASE+1 
CF_SECCOUNT	.EQU	CF_BASE+2 
CF_SECTOR	.EQU	CF_BASE+3 
CF_CYL_LOW	.EQU	CF_BASE+4 
CF_CYL_HI	.EQU	CF_BASE+5 
CF_HEAD		.EQU	CF_BASE+6 
CF_STATUS	.EQU	CF_BASE+7 
CF_COMMAND	.EQU	CF_BASE+7 
CF_LBA0		.EQU	CF_BASE+3 
CF_LBA1		.EQU	CF_BASE+4 
CF_LBA2		.EQU	CF_BASE+5 
CF_LBA3		.EQU	CF_BASE+6 

bootルーチン (バンク切り替え&シリアルLSI等初期化)

  • ブート時に64kB フルRAM構成への切り替えルーチンを128kB メモリーボード(KZ80-1MSRAM)の仕様にあわせて修正します。
boot: 
		DI				; Disable interrupts. 
		LD	SP,biosstack		; Set default stack. 
 
;		Turn off ROM (KZ80-1MSRAM) 
 
		LD	A,$00 
		OUT (ROM_BANK_IO),A 
 
;	Initialise 8251 
		LD	HL,SERBUF 
		LD	(SERINP),HL 
		LD	(SERRDP),HL 
		XOR	A 
		LD	(SERCNT),A 
		OUT	(UARTRC),A 
		OUT	(UARTRC),A 
		OUT	(UARTRC),A 
		LD	A,01000000B 
		OUT	(UARTRC),A 
		LD	A,01001110B 
		OUT	(UARTRC),A 
		LD	A,RTSLOW 
		OUT	(UARTRC),A 
  • ブート時の8251初期化/シリアルバッファ初期化ルーチンを、SBC8080データパックのソース(MSBAS80.ASM) SINITルーチンから移植します。

wbootルーチン (割り込みモード2用初期化ルーチン削除)

  • 元ソースでは、Z80 割り込みモード2で使用する Iレジスタへ$FFをセットしているルーチンがありますが、不要なので削除します。
; Interrupt vector in page FF 
;   LD	A,$FF 
;   LD	I,A 

gocpmルーチン (RAM 0038番地のジャンプ命令初期配置)

  • CP/M起動前にアドレス0000h、0005hにそれぞれ 起動時処理アドレス、BDOS Callアドレスをセットしているルーチンですので、あわせて シリアル割り込み処理のアドレスとジャンプ命令(0C3h)を0038hからセットします。
    • ここをセットし忘れるとCP/M起動後シリアル入力ができなくなります。
gocpm: 

          :
          :
          :

		LD	(38h),A			; Opcode for 'JP'. 
		LD	HL,serialInt		; ADDress of serial interrupt. 
		LD	(39h),HL 

serialIntルーチン (シリアル割り込み処理)

  • serialIntルーチン (シリアル割り込み処理)は、エントリーポイントはそのままに、SBC8080データパックのソース(MSBAS80.ASM)から SERINTルーチンを移植します。
serialInt:	PUSH	AF 
	PUSH	HL 
	IN	A,(UARTRC) 
	AND	00000010B 
	JP	Z,RTS0 
	IN	A,(UARTRD) 
	PUSH	AF 
	LD	A,(SERCNT) 
	CP	BUFSIZ 
	JP	NZ,NOTFUL 
	POP	AF 
	JP	RTS0 
NOTFUL:	LD	HL,(SERINP) 
	INC	HL 
	LD	A,L 
	CP	SERINP & 0FFH 
	JP	NZ,NOTWRP 
	LD	HL,SERBUF 
NOTWRP:	LD	(SERINP),HL 
	POP	AF 
	LD	(HL),A 
	LD	A,(SERCNT) 
	INC	A 
	LD	(SERCNT),A 
	CP	BUFFUL 
	JP	C,RTS0 
	LD	A,RTSHIG 
	OUT	(UARTRC),A 
RTS0:	POP	HL 
	POP	AF 
	EI 
	RETI 

constルーチン (シリアル状況返却処理)

  • constルーチン (シリアル状況返却処理)はエントリーポイントの名称はそのままに、SBC8080データパックのソース(MSBAS80.ASM)から CHKCHRルーチンを移植します。
  • ROMモニターの場合と異なり戻り値はAレジスタに0(データなし)、0ffh(データあり)を返します。
const: 
		LD	A,(SERCNT) 
		CP	$00 
		JR	Z, dataAEmpty 
 		LD	A,0FFH 
		RET 
dataAEmpty: 
		LD	A,0 
        RET 
 

readerルーチン (紙テープリーダー処理)

  • 紙テープリーダーは対象マイコンには装備されていないので、coninルーチン (シリアル1文字入力処理)へジャンプする命令に変更します。
reader:		 
		JR	conin 

coninルーチン (シリアル1文字入力処理)

  • coninルーチン (シリアル1文字入力処理)エントリーポイントの名称はそのままに、SBC8080データパックのソース(MSBAS80.ASM)から RXAルーチンを移植します。
  • ROMモニターと同様Aレジスタへ入力文字をセットして返します。
conin: 
	LD	A,(SERCNT) 
	CP	00H 
	JP	Z,conin 
	PUSH	HL 
	LD	HL,(SERRDP) 
	INC	HL 
	LD	A,L				;Only need to check low byte becasuse buffer<256 bytes 
	CP	SERINP & 0FFH	;(SERBUF+BUFSIZ) & 0FFH 
	JP	NZ,NRWRAP 
	LD	HL,SERBUF 
NRWRAP:	DI 
	LD	(SERRDP),HL 
	LD	A,(SERCNT) 
	DEC	A 
	LD	(SERCNT),A 
	CP	BUFEMP 
	JP	NC,RTS1 
	LD	A,RTSLOW 
	OUT	(UARTRC),A 
RTS1:	LD	A,(HL) 
	EI 
	POP	HL 
	RET					;Char ready in A 

listルーチン (リストプリンタ処理)、punchルーチン (紙テープ出力処理)

  • listルーチン (リストプリンタ処理)、punchルーチン (紙テープ出力処理)は対象マイコンには装備されていないので、conoutルーチン (シリアル1文字出力処理)へジャンプする命令に変更します。
list:		 
		JR	conout 
punch:	 
		JR	conout 

conoutルーチン (シリアル1文字出力処理)

  • conoutルーチン (シリアル1文字出力処理)はエントリーポイントの名称はそのままに、SBC8080データパックのソース(MSBAS80.ASM)から TXAルーチンを移植します。
  • ★注意
    • ROMモニターと異なり、conoutルーチンで出力したい文字は C レジスタで渡ってきますので、OUT命令の前に以下のロード命令を追加してください。
  conout:		PUSH	AF	;Store character 
COUT1:	IN	A,(UARTRC)	;Status byte        
	AND	01H				;Set Zero flag if still transmitting character        
	JP	Z,COUT1			;Loop until flag signals ready 
	POP	AF				;Retrieve character 
	LD  A,C				; 
	OUT	(UARTRD),A		;Output the character 
	RET 

popAndRunルーチン (ROMモニタからのスタート処理)

  • ROMモニターからCP/Mが起動された場合に飛び込んでくるルーチンです。元のソースでは2つのシリアル入出力(SIOA/SIOB)のうちシリアルAをデフォルトとするために使っているルーチンですが、今回のマイコンではシリアルは1つなのであまり意味はないルーチンです。
  • RAMをフルRAMモードへ切り替えるルーチンと POP AF でROMモニタでセットした出力先を取得する(特に判別しないのでPOPしたデータは捨てる...)ルーチンだけが必須となります。
PopAndRun: 
		LD	A,$00 
		OUT	(ROM_BANK_IO),A 
 
		POP	AF 
		LD	A,$00 			;(List is TTY:, Punch is TTY:, Reader is TTY:, Console is CRT:) 
setIOByte:	LD (iobyte),A 
		JP	bios 

シリアルバッファの定義

  • SIO-A、B用バッファの代わりに8251用バッファを定義してください。
hstBufEnd:	.EQU	$ 
 
SERBUF	.ds	BUFSIZ 
SERINP	.ds	2 
SERRDP	.ds	2 
SERCNT	.ds	1 
BASFLG	.ds	1 

アドレス0FFE0hの割り込みベクタ、アドレス0FFE8Hからのユーティリティ

  • アドレス0FFE0hの割り込みベクタはZ80 SIOを割り込みモード2で使用するためのポインタベクタアドレスです。今回は不要なので削除します。
  • アドレス0FFE8Hからのユーティリティは、Grant氏の手順で各種実行ファイルを転送するためのDOWNLOAD.COMをCFカードへ保存するために使うユーティリティです。ここもRAMをフルRAMモードへ切り替えるルーチンがありますので、環境にあわせます。
		.org	0FFE8H 
;Turn off ROM (KZ80-1MSRAM)
		LD	A,$00
		OUT (ROM_BANK_IO),A

CP/M起動までの流れ

  • CP/Mの起動の流れはGrant氏のページの"INSTALLING CP/M"の項に詳細に説明があります。
  • ちなみに ROMモニターは入力待ち">"のモードに直接インテルHEX形式のオブジェクトを流し込むとメモリーへプログラムがロードされます。(一般的なモニターだと Lコマンドで入力待ちになったりしますが...)
    • TeraTERM等の端末端末プログラムで送信の際の送信遅延として1行送信時100ms程度の待ちを入れるのが無難です。

ドライブのフォーマット

  • ROMモニターを起動し、form128.hex/form64.hexをロードします。
  • G5000 で5000番地からプログラムを起動してCFカードをフォーマットします。

システムの配置と転送

  • CP/M本体(cpm22.hex)とBIOS(cbios128/64.hex)をそれぞれロードします。
    • ソースを読むとわかりますがロードする順番はCP/M本体→BIOSとしてください。
  • つづいて、システム転送プログラム(putsys.hex)もロードします。
  • G5000 でシステム転送プログラム起動してCFカードへCP/Mシステム(D000h〜FFFFh)を転送します。

CP/Mの起動

  • 一旦マイコンの電源をOFFにしてから、再度電源投入。
  • モニタROMのXコマンドでCP/Mを起動します。起動メッセージと "A>"プロンプトが出てくれば起動成功です。
    • "A>"プロンプトが出ない場合はcbiosの移植に足りないところがあります。適宜 メッセージを出すルーチン等を追加して動作を確認(原始的printfデバグ的な...)しましょう。その際 Cレジスタに文字を入れて conoutルーチンを直接呼び出すのがオススメです。

アプリケーションの導入等

  • Grant氏のページの"INSTALLING APPLICATIONS"の項を参考に各種アプリケーションを転送してください。
    • その際 私の環境では DOWNLOAD.COMへ各種コマンドを送る際 TeraTERM等の端末端末プログラムで送信の際の送信遅延として1行単位の遅延100msに加えて「1文字あたり1ms」を追加しないとダメでした。(転送が遅くなりますが....)
    • Grant氏提供のzipパッケージのCPM211FilesPkg.txtに入っている基本的なCOMファイル以外のツール類を送りたい場合は、同じくzipファイルに入っている WindowsアプリケーションFilePackage.exeでDOWNLOAD.COMが解釈できるテキストファイルを生成することができます。
  • DLOWNLOAD.COMでの転送は1文字ごとの送信遅延設定が必要なため多くのファイルを送る場合時間がかかりますので、XMODEM.COMやUNZIP.COMを使っての転送が便利です。

SBC8080/8085でのCP/M稼働について

  • Grant氏提供の各種CP/M用プログラム(cbios、formxx、download、putsys...)はZ80命令がだいぶ入っていますので、8080命令のみへ変更して再アセンブリが必要です。
  • アドレス0FFE8HからのユーティリティについてはLDIR命令を置き換える際にルーチンが長くなるためエントリーポイントを 0FFE0hあたりにずらすことをお勧めします。
  • CP/M本体(CPM22.ASM)はZ80命令が使われていないようなので、そのまま使用可能です。

謝辞

  • みなさまのおかげでCP/Mが動作しました。ありがとうございます。
  • Grant Searle さま
    • いつもマイコンに関する有益な情報をWeb上に公開いただきありがとうございます。
  • ‏ @vintagechips さま
    • SBCシリーズをはじめ様々なマイコンのハード/ソフトを提供いただき活用させていただいています。
  • @tomi9tw さま
    • CFカードコネクタフットプリントをご提供をいただきました。またCFカードのTrueIDE対応情報をいただきました。
  • @electrelic さま
    • Z80ニーモニックで8080ベースの開発方法についてクロスアセンブラASの情報をいただきました。