主な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:ファイルがオープンできない) |
;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 |
;**** 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 |
;**** 通常ファイル読み込み **** ; 通常ファイル読み込み ; 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 |