Last Updated on 2018年10月17日 by kabekin
Z80Bカードと6809側のデータやり取りでループバックするテストプログラム その1
ポンコツプログラムですが一応、目的の動作をしているので参考に晒しておきます^^
Z80側のプログラム
;CP/M-80 BIOS Program for the MB-S1 ;BIOS09とのループバックテスト(6809⇔Z80切替&データ交換) org 0000h jp Start Start: ld SP,0100h IOLoop: ld A,(IOSTAT) ld B,80h and B jp NZ,IOLoop ld HL,(CMDNO) ld D,(HL) ld (HL),00h ld HL,(DATAREG) ld E,(HL) ld (HL),00h nop ld HL,(CMDNO) ld (HL),D ld HL,(DATAREG) ld (HL),E call To09Change ;6809にバス切替 EndLoop: jp IOLoop ;//+++ Z80を停止して6809にバスを渡す To09Change: ld A,80h ld (BUSCTRL),A ret ;+++ 6809とZ80のレジスタデータ受渡共有領域(16バイト) ;BIOS09との共有領域 正式には後で構造を決める ;データ内容(6809側からは0xEA00) CMDNO: defb 00h IOSTAT: defb 00h DATAREG: defb 00h SH6809: defb 11h, 00h, 00h, 00h, 00h, 00h, 00h, 00h defb 00h, 00h, 00h, 00h, 00h, 00h, 00h, 99h defm "Shared area for BIOS09" defc BUSCTRL = 0FE19h
6809側のプログラム
;*** S1 CP/M 6809 BIOS TEST InOut Loop Back (Poling) 動作OK v1.0 .area .ABS. (ABS) .org 0xE000 bra BIOS09 ;//+++ CP/M BIOS80との共通エリア(空間8, 0x3000=0xE000) SH_BASE .equ 0x0030 ;BIOS80との共通領域先頭アドレス(ループバックテスト用) CMDNO .equ SH_BASE ;コマンド番号(1) 1=N/A, 2=CONST&CONIN, 3=CONOUT, 4=LIST, 5=PUNCH, 6=READER, 7=HOME ;8=SELDSK, 8=SETTRK, 9=SETSEC, A=SETDMA, B=READ, C=WRITE, D=LISTST, E=SECTRAN IOSTAT .equ CMDNO + 1 ;I/O Status情報(1) ;b7: 0:6809終了/Z80ポーリング終了 1:Z80リクエストあり/6809busy ;b6-b0: ステータスコード DATAREG .equ IOSTAT + 1 ;BIOSデータレジスタ(予備,1) SH6809 .equ DATAREG + 1 ;その他共有情報 BIOS09: clra sta CMDNO ;共有メモリCMDNO初期化 sta IOSTAT ;共有メモリIOSTAT初期化 sta DATAREG ;共有メモリDATAREG初期化 bsr Z80Standby ;Z80Standby bsr Z80Start ;Z80Start POLKBDCheck: ;//+++コンソール入力チェック lda 0xFFC8 ;KBDMNI anda #0x80 bne exit ;BREAKで中止 swi2 .byte #0x41,#0x01 ;POLKBD beq RequestCheck ;入力されていない→goto RequestCheck bsr Z80BusRequest bsr Z80BusReqAckWait ldb #0x02 ;CmdNo=2(CONST&CONIN) stb CMDNO ;コマンド番号セット sta DATAREG ;データセット ldb #0x80 ;Bit7オン stb IOSTAT ;ステータスセット bsr Z80Start ;Z80Start ;//+++ Z80からの要求 RequestCheck: bsr Z80BusRequest bsr Z80BusReqAckWait ldb IOSTAT andb #0x80 beq ReqChkExit ;I/Oステータスのフラグ無しでexit ldb CMDNO cmpb #0x02 bne Cmd3 ;CmdNo=2(CONST&CONINの処理) lda DATAREG swi2 .byte #0x41,#0x05 ;OUTSCRで画面に表示 clr CMDNO ;コマンド番号クリア clr DATAREG ;データクリア clr IOSTAT ;I/Oステータスクリア bsr Z80Start Cmd3: nop ReqChkExit: bsr Z80Start bra POLKBDCheck exit: rts ;BASICに戻る ;+++ Z80 スタンバイ要求 Z80Standby: pshs A lda #0xFF sta 0xFF7F ;Z80スタンバイ puls A,PC ;+++ Z80開始要求 Z80Start: clr 0xFE19 ;Z80スタート rts ;+++ Z80 バス開放要求 Z80BusRequest: pshs A lda #0x80 sta 0xFE19 ;Z80バスリクエスト要求 puls A,PC ;+++ Z80 バスリクエストACK待ち Z80BusReqAckWait: pshs A Z80BusReqAckLp: lda 0xFE19 cmpa #0xFF ;Z80バス開放中はFE19に$FFが返る bne Z80BusReqAckLp puls A,PC ; other defined area. .area .bss .area .text .area .data .area .ctors .area .dtors .area vector
割込み無しですが上記のプログラムで6809⇔Z80の切替と、共有メモリへのデータ読み書きやフラグ読書きができています。
MPUの切替部分はサブルーチン化したので、CP/MのBIOSに実装しやすくなりました^^
しかし、改めて見るとラベル名が長いなぁ でもこれがクロス環境の特権かと・・・
クロスコンパイル環境の特権はCコンパイラでは決定的ですよん :-)
おもしろくなってきましたね
(samより)
初めはS1実機を使うことが目的でS1実機のツールを使っていましたが、クロス環境を使うと便利さが違います。
S1やFM実機を使うという満足感はありませんが、エディタや差分管理など開発環境の便利さは比べ物になりません・・・
開発はクロス環境で頑張って、できたソフトを使って実機で楽しみたいところです