前回でシリアル通信ができるようになりましたので、これまでのZ80 ボードに使用した「最初のモニタ」を移植していきたいと思います。
モニタを移植する上で、これまでのZ80との相違点はおおまかに次の3点です。
1、条件付きCALL命令がない。条件付きJR(JP)命令とcall命令に置き換えます。
条件付きCALL命令はモニタにも使用しているので変更が必要です。
例:
cp "m"
call z,memory
変更後
cp "m"
jr nz,next01
call memory
next01:
2、IN,OUT命令がない。代わりに、rabbit内蔵I/O(レジスタ)はioi ld命令を
rabbit外部i/oについては、ioe ld命令を使用します。
例1:
in a,(DATA)
変更後
ioi ld a,(DATA) /ioe ld a,(DATA)
例2:
out (DATA),a
変更後
ioi ld (DATA),a /ioe ld (DATA),a
3、メモリの制御をレジスタの設定により、有効にする必要があります。
前々回で、ROMとRAMの設定していますが、今回のハードで最低限設定が
必要なレジスタは次の通りです。
ハード条件:モード SMODE0、SMODE1端子をGND(L)にする。
0x00000番地からスタート
ROM CS0、OE0を使用して、0x00000から配置
MB0CRレジスタに0x00を設定(デフォルト0x00)
RAM CS1、OE1、WE1を使用して、0x40000から配置
MB1CRレジスタに0x05を設定
シリアル通信
cポートのRxA(PC7)、TxA(PC6)を使用。
設定するレジスタは、前回のシリアル通信を参照
実際のモニタの主な変更部分です。
コマンド処理部
prompt: ld a,">" ;main routine
call putchar ;prompt display
call getchar
call putchar
cp "?" ;help ?
jr nz,prompt01
call help
prompt01:
cp "d" ;memory display?
jr nz,prompt02
call dump
prompt02:
cp "m" ;memory rewrite ?
jr nz,prompt03
call memory
prompt03:
cp "l" ;hex file load?
jr nz,prompt04
call loadhex
prompt04:
cp "j" ;address jump?
jr nz,prompt05
call jump
prompt05:
cp "i" ;i/o register rewite
jr nz,prompt06
call ioreg
prompt06:
cp "c"
jr nz,prompt07
call calling ;address call
prompt07:
cp 0x0d
jr z,prompt
cp 0x00
jr z,prompt
call cr
jr prompt
シリアル通信(1文字入出力、初期化)
putchar:
push af
putchar01:
ioi ld a,(SASR)
bit 3,a
jr nz,putchar01
pop af
push af
ioi ld (SADR),a
putchar_busy:
ioi ld a,(SASR)
bit 3,a
jr nz,putchar_busy
pop af
ret
getchar:
ioi ld a,(SASR)
bit 7,a
jr z,getchar
ioi ld a,(SADR)
push af
getchar01:
ioi ld a,(SASR)
bit 7,a
jr nz,getchar01
pop af
ret
ppi_init:
ld a,0x40
ioi ld (PCFR),a ;C Port TxA set
ld a,0x00
ioi ld (PDFR),a ;D Port Bit Normally as I/O
ld a,0x00
ioi ld (PEFR),a ;E Port Bit Normally as I/O
ret
com_init:
ld a,0b00000000
ioi ld (SACR),a ;Asynch mode, C port used, 8bit, Interrupt Disabled
ld a,0b00010000
ioi ld (PDCR),a ;TxA Clock Timer A1
ret
次回は”最初のモニタ”を完成したいと思います。