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実機を使うという満足感はありませんが、エディタや差分管理など開発環境の便利さは比べ物になりません・・・
開発はクロス環境で頑張って、できたソフトを使って実機で楽しみたいところです