日立 MB-S1 S1-CP/M80 移植作戦 その16 BIOSの作成準備2

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に実装しやすくなりました^^
しかし、改めて見るとラベル名が長いなぁ でもこれがクロス環境の特権かと・・・

2件のコメント

  1. クロスコンパイル環境の特権はCコンパイラでは決定的ですよん :-)
    おもしろくなってきましたね
    (samより)

    1. 初めはS1実機を使うことが目的でS1実機のツールを使っていましたが、クロス環境を使うと便利さが違います。
      S1やFM実機を使うという満足感はありませんが、エディタや差分管理など開発環境の便利さは比べ物になりません・・・
      開発はクロス環境で頑張って、できたソフトを使って実機で楽しみたいところです

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください