前回でシリアル通信ができるようになりましたので、これまでの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

次回は”最初のモニタ”を完成したいと思います。

おすすめの記事