Categories: R10コンピュータ

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

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

kabekin

View Comments

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

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