MZ2000_SDのプログラム作成、主なAPI解説

MZ2000_SDにアクセスするとマイクロSDカードのデータを読み書きすることができます。
MZ2000_SDのAPIはArduinoのプログラムを見ればわかりますがとりあえず良く使いそうな物だけ表にしてみました。
API番号081hのMZTバイナリファイル読み込み以外は動作未確認です。

主なAPI
API番号 機能 Z80側から見たデータ転送
080h MZTバイナリファイル保存 1バイト 送信 コマンド 080h
1バイト 受信 状態 (0:正常, 0F0h:SDカード初期化エラー, 0F4h:コマンドエラー)
33バイト 送信 ファイル名(0で終わる文字列、33バイトよりも短い場合は0埋め)
17バイト 送信 MZファイル名(有効文字数は15文字、0Dh,0で終わる文字列)
2バイト 送信 スタートアドレス
2バイト 送信 エンドアドレス
2バイト 送信 実行アドレス
1バイト 送信 状態 (0:正常, 0F1h:ファイルがオープンできない)
ファイルサイズ分のバイト数 送信 ファイルデータ
ファイルモードは「1固定」、ファイルサイズは「エンドアドレス-スタートアドレス+1」になる。
081h MZTバイナリファイル読み込み 1バイト 送信 コマンド 081h
1バイト 受信 状態 (0:正常, 0F0h:SDカード初期化エラー, 0F4h:コマンドエラー)
33バイト 送信 ファイル名(0で終わる文字列、33バイトよりも短い場合は0埋め)
1バイト 受信 状態 (0:正常, 0F1h:ファイルが無い, 0FFh: ファイルがオープンできない)
17バイト 受信 MZファイル名(0Dhで終わる文字列)
2バイト 受信 読み込みアドレス
2バイト 受信 ファイルサイズ
2バイト 受信 実行アドレス
ファイルサイズ分のバイト数 受信 ファイルデータ
083h ファイル一覧 1バイト 送信 コマンド 083h
1バイト 受信 状態 (0:正常, 0F0h:SDカード初期化エラー, 0F4h:コマンドエラー)
33バイト 送信 ファイル比較文字列(0で終わる文字列、33バイトよりも短い場合は0埋め)
(*A)ファイル名一覧最大20個 受信 ファイル名は00Dh, 0で区切られている。
1バイト 受信 状態 (0FFh:ファイル一覧終了, 0FEh:ファイル一覧の続きがある)
状態が0FEhだった場合は以下、状態が0FFhだった場合は(*B)へ
1バイト 送信 コマンド (0:継続(*A)に戻る, 'B'(0x62):前ページ(*Aに戻る), それ以外:打ち切り(*B)へ
(*B)1バイト 受信 状態 (0:正常)
084h ファイル削除 1バイト 送信 コマンド 084h
1バイト 受信 状態 (0:正常, 0F0h:SDカード初期化エラー, 0F4h:コマンドエラー)
33バイト 送信 ファイル名(0で終わる文字列、33バイトよりも短い場合は0埋め)
1バイト 受信 状態 (0:正常, 0F1h: エラー)
1バイト 送信 処理選択 (0:継続, 0以外:キャンセル)
1バイト 受信 状態 (0:正常, 0F1h: エラー)
085h ファイル名変更 1バイト 送信 コマンド 085h
1バイト 受信 状態 (0:正常, 0F0h:SDカード初期化エラー, 0F4h:コマンドエラー)
33バイト 送信 現ファイル名(0で終わる文字列、33バイトよりも短い場合は0埋め)
1バイト 受信 状態 (0:正常, 0F1h:現ファイルが無い)
33バイト 送信 新ファイル名(0で終わる文字列、33バイトよりも短い場合は0埋め)
1バイト 受信 状態 (0:正常)
1バイト 受信 状態 (0:正常, 0F1h:ファイルがオープンできない, 0FFh:ファイル名変更できない)
087h ファイルコピー 1バイト 送信 コマンド 087h
1バイト 受信 状態 (0:正常, 0F0h:SDカード初期化エラー, 0F4h:コマンドエラー)
33バイト 送信 現ファイル名(0で終わる文字列、33バイトよりも短い場合は0埋め)
1バイト 受信 状態 (0:正常, 0F1h:現ファイルが無い)
33バイト 送信 新ファイル名(0で終わる文字列、33バイトよりも短い場合は0埋め)
1バイト 受信 状態 (0:正常, 0F3h:新ファイルがすでにある)
1バイト 受信 状態 (0:正常, 0F1h:ファイルがオープンできない)

サンプルプログラム
下記はMZ2000_SDのソースファイルから抜き出したものです。一部私が変更した部分も含まれます。
Z80ASでアセンブルできることを確認しています。

■MZ2000_SDの初期化
	;PORTC下位BITをOUTPUT、上位BITをINPUT、PORTBをINPUT、PORTAをOUTPUT
INIT_2000SD:	LD	A, 8Ah
	OUT	(0A3h), A
	;出力BITをリセット
INIT2:	LD	A, 00h      ;PORTA <- 0
	OUT	(0A0h), A
	OUT	(0A2h), A   ;PORTC <- 0
	RET
■MZ2000_SDへ1バイト受信、送信
;**** 1BYTE受信 ****
;受信DATAをAレジスタにセットしてリターン
RCVBYTE:
	CALL	F1CHK ; PORTC BIT7が1になるまでLOOP
	IN	A, (0A1h) ; PORTB -> A
	PUSH 	AF
	LD	A, 05h
	OUT	(0A3h), A ; PORTC BIT2 <- 1
	CALL	F2CHK ; PORTC BIT7が0になるまでLOOP
	LD	A, 04h
	OUT	(0A3h), A ; PORTC BIT2 <- 0
	POP 	AF
	RET

;**** 1BYTE送信 ****
;Aレジスタの内容をPORTA下位4BITに4BITずつ送信
SNDBYTE:
	PUSH	AF
	RRA
	RRA
	RRA
	RRA
	AND	0Fh
	CALL	SND4BIT
	POP	AF
	AND	0Fh
	CALL	SND4BIT
	RET

;**** 4BIT送信 ****
;Aレジスタ下位4ビットを送信する
SND4BIT:
	OUT	(0A0h), A
	LD	A,05h
	OUT	(0A3h), A ; PORTC BIT2 <- 1
	CALL	F1CHK ; PORTC BIT7が1になるまでLOOP
	LD	A,04h
	OUT	(0A3h), A ; PORTC BIT2 <- 0
	CALL	F2CHK
	RET

;**** BUSYをCHECK(1) ****
; 82H BIT7が1になるまでLOP
F1CHK:
	IN	A, (0A2h)
	AND	80h ; PORTC BIT7 = 1?
	JR	Z, F1CHK
	RET

;**** BUSYをCHECK(0) ****
; 82H BIT7が0になるまでLOOP
F2CHK:
	IN	A, (0A2h)
	AND	80h ; PORTC BIT7 = 0?
	JR	NZ, F2CHK
	RET
■MZ2000_SDからMZTファイル読み込み
;**** 通常ファイル読み込み ****
; 通常ファイル読み込み
; HL: SDファイル名
; Result Cf: 0:正常, 1:エラー
SD_LOAD:
	LD	A, 81h       ;LOADコマンド81h
	CALL	SNDBYTE
	CALL	RCVBYTE      ;状態取得(00h=OK)
	OR	A
	JR	NZ, SD_LOAD1
	CALL	SENDFILENAME ;ファイル名送信
	OR	A
	JR	NZ, SD_LOAD1
	CALL	HDRCV        ;ヘッダ情報受信
	CALL	DBRCV        ;データ受信
	RET
SD_LOAD1:
	SCF
	RET

;ファイル名送信
; HL: SDファイル名 (0で終わる文字列)
SENDFILENAME:
	LD	B, 33
SENDFILENAME1:
	LD	A, (HL)
	INC	HL
	OR	A
	JR	Z, SENDFILENAME2
	CALL	SNDBYTE
	DEC	B
	JR	NZ, SENDFILENAME1
	JR	SENDFILENAME3
SENDFILENAME2:
	XOR	A
	CALL	SNDBYTE
	DEC	B
	JR	NZ, SENDFILENAME2
SENDFILENAME3:
	CALL	RCVBYTE      ;状態取得(00H=OK)
	RET

;ファイル読み込みヘッダ受信
;Result: MZファイル名 (17bytes)
;        読み込みアドレス (2bytes)
;        データサイズ (2bytes)
;        実行アドレス (2bytes)
HDRCV:	LD	HL, FILEINFO
	LD	B, 11h
HDRC1:	CALL	RCVBYTE     ;MZファイル名受信 (17bytes)
	LD	(HL), A
	INC	HL
	DEC	B
	JR	NZ, HDRC1

	;SADRS取得
	CALL	RCVBYTE
	LD	(HL), A
	INC	HL
	CALL	RCVBYTE
	LD	(HL), A
	INC	HL

	;FSIZE取得
	CALL	RCVBYTE
	LD	(HL), A
	INC	HL
	CALL	RCVBYTE
	LD	(HL), A
	INC	HL

	;EXEAD取得
	CALL	RCVBYTE
	LD	(HL), A
	INC	HL
	CALL	RCVBYTE
	LD	(HL), A

	RET

;データ受信
;Result: データ (FSIZE bytes)
DBRCV:	LD	DE, (FSIZE)
	LD	HL, (SADRS)
DBRLOP:	CALL	RCVBYTE
	LD	(HL), A
	DEC	DE
	LD	A, D
	OR	E
	INC	HL
	JR	NZ, DBRLOP   ;DE=0までLOOP
	RET

; ファイル情報
FILEINFO:
FNAME:
	DS	17
SADRS:
	DW	0
FSIZE:
	DW	0
EXEAD:
	DW	0
STATUS:
	DB      0
戻る