最初のモニタでHEXファイルをダウンロードするとエラーが発生してうまくダウンロードできない状況が発生していました。
原因を探るべく、rabbit2000に萌えてみました^^。

原因は、シリアルクロックが微妙に合っていないことのようです。シリアルクロックはメインクロックから分周しているので、メインクロックが微妙にずれているためのようです。
ここでは、水晶発振子を使っているので、問題にしていなかったのですが、これが落とし穴でした^^。

参考の回路図では、メインクロックの水晶発振子に接続されているコンデンサーC1、C2は、33pFですが、この値は大きいようで、手持ちの水晶発振子19.6608MHzでは、C1,C2とも10pFすることで、文字化けが発生しにくいようになりました。(なぜか時間がたつとまれに発生する。Rabbit2000のシリアルは手ごわいです^^;)

モニタのソフト面では、HEXファイルのデータブロックを受信処理しているときにエコーバックしていましたが、この部分をエコーバックせずに、新たにソフトを作り直しました。
下記は作り直した変更部分を抜粋しました。

data_hex_load:
        call    getchar         ;read hex 1byte in Lreg(hex)
        call	ascii_hex
        cp	0xff
        jr	z,loadhexlineerr
        sla	a
        sla	a
        sla	a
        sla	a
        ld      (ix+0),a        ;offset address < hex data
        call    getchar         ;read hex 1byte in Lreg(hex)
        call	ascii_hex
        cp	0xff
        jr	z,loadhexlineerr
        and	a,0x0f
        or	a,(ix+0)
        ld      (ix+0),a        ;offset address < hex data
        ld      a,d
        add     a,(ix+0)        ;cheksum Dreg = Dreg + Lreg
        ld      d,a
        inc     ix              ;offset address +1	
        djnz	data_hex_load   ;Breg(data size) == 0?

rabbit2000は、製造バージョンが4種類あり、GREVレジスタを読むことでrabbit2000、rabbit2000A、rabbit2000B、rabbit2000Cのように確認することができます。
モニタの起動時に表記するように、プログラムを追加しました。

cpu_msg0:
        ld      hl,cpu_msg_revision	;Revision disply
        call    msgout
        ioi ld	a,(GREV)
        and	0x0f			;4-0bit 0> rabbit2000
        cp	0x00			;       1> rabbit2000A
        jr	z,cpu_msg1_01           ;       2> rabbit2000B
        or	0x40                    ;       3> rabbit2000C
        call	putchar
cpu_msg1_01:
        call	cr
        ret

また同様に、DATASEG、STACKSEG、SEGSIZE及びXPCの値をモニタ起動時に表示するようにしました。

cpu_msg1:
        ld      hl,cpu_msg_dataseg	;DATASEG reg disply
        call    msgout
        ioi ld	a,(DATASEG)
        call    hex_a_disp
        ld      hl,cpu_msg_stackseg  	;STACKSEG reg disply
        call    msgout
        ioi ld	a,(STACKSEG)
        call    hex_a_disp
        ld      hl,cpu_msg_segsize 	;SEGSIZE reg disply
        call    msgout
        ioi ld	a,(SEGSIZE)
        call    hex_a_disp
        ld      hl,cpu_msg_xpc 		;XPC disply
        call    msgout
        ld	a,xpc
        call    hex_a_disp        
        call    cr
        ret        

オールRAM化のモニタのtコマンドを追加しました。
ROMのモニタをRAMに転送して、RAM上でモニタを起動します。

ROMからRAMに転送する方法として、XPCを使用しました。
XPCは論理アドレス(64Kアドレス空間)では0xe000に開始アドレスが固定されています。この機能を使って、モニタを転送したいと思います。

モニタ起動時のXPCは物理アドレス0x4e000に紐付けされているので、0xe000の論理アドレスは、実は物理アドレスの0x4e000を指しています。
また、RAM上での0x0000の論理アドレスは、物理アドレス0x40000に紐付けするように、SEGSIZEレジスタを変更することで簡単に変更できます。

そこで、XPCの物理アドレスを0x40000に紐付けするよう変更すれば、0x0000から0xe000へのコピーで簡単にモニタを転送することができます。

実際のtコマンドのプログラムを確認したいと思います。
tコマンドを実行でyを入力します。

xpcにtrance_xpc_set(0x40-0x0e)すなわち0x32をセットします。

trance: 
        call    call_yes_msg
        call    getchar
        cp      "y"
        jr      nz,crret_t
        call    cr
        ld      a,trance_xpc_set              	;ram  xpc  0xe0000 to 0xffff 
        ld  	xpc,a				;XPC Physics address 0x00000

ROMのモニタをXPC領域(0xe000~)物理アドレス0x40000にコピーします。

        ld      hl,0x0000       ;moni   copy at temp_addr(XPC)
        ld      de,temp_addr
        ld      bc,prog_end
        ldir

これでXPC領域にモニタがコピーされたので、XPC領域のモニタへジャンプします。ジャンプ後、ROMをRAMに切り替えるために、SEGSIZEレジスタに0x00を書き込みます。この時点で、物理アドレス0x40000は論理アドレス0x0000に紐付けされました。RAM上のモニタ(0x0000~)物理アドレス0x40000のモニタにジャンプします。

        ld      hl,move_prog+temp_addr
        jp      (hl)            ;temprary address jump
;
move_prog:
        xor     a               ;ram 0x0000 to 0xdfff setting
        ioi ld	(SEGSIZE),a
        ld      hl,go_moni
        jp      (hl)            ;ram monitor jump
 

ram上のモニタにジャンプした後は、XPCの物理アドレスを0x4e000に変更し、ramに切り替えたメッセージを表示、スタックポインタを0x0100に設定したのち、モニタの入力待ちに戻ります。

go_moni:
        ld	a,RamPhysicsAddr
        ld	xpc,a		;XPC 0xe000 setting
	call	cr
	ld	hl,ram_msg
	call	msgout
	ld	sp,0x0100        
        jp	ram_main

実際にtコマンドを実行してみました。
ramモニタ上で0x0000番地の内容が変更できるか確認してみました。

Monitor Rabbit2000 ver0.72  by Pinecone 2021/2/21                              
 Revision Rabbit2000C                                                           
 DATASEG:40 STACKSEG:40 SEGSIZE:A8 XPC:40                                       
>t Yes:                                                                         
                                                                                
RAM area switching monitor                                                      
Monitor Rabbit2000 ver0.72  by Pinecone 2021/2/21                               
 Revision Rabbit2000C                                                           
 DATASEG:40 STACKSEG:40 SEGSIZE:00 XPC:40                                       
>d 0000                                                                         
addr  +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F                           
0000  C3 80 00 FF FF FF FF FF FF FF FF FF FF FF FF FF                           
>m 0000 C3 00                                                                   
>d 0000                                                                         
addr  +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F                           
0000  00 80 00 FF FF FF FF FF FF FF FF FF FF FF FF FF                           
>m 0000 00 c3                                                                   
>d 0000                                                                         
addr  +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F                           
0000  C3 80 00 FF FF FF FF FF FF FF FF FF FF FF FF FF                           
>

今回のモニタソースです。

; rabbit2000 monitor ver0.72 by Pinecone 2021/2/21
;
; rabbit2000 cpu
; rom 0000h -- 7fffh
; ram 8000h -- ffffh
; External clock 19.6608MHz


; Rabbit2000 serial communication (TXA or RXA :C port)
; 38400bps 8N1
 
; assembler
;  program start 0000H
;  main          0100H
;
; assemblers  ASxxxx and ASlink V5.10
; file name rabbit2000_moni072.asm
; $ asrab -l -s -o rabbit2000_moni072.asm
; $ aslink -i rabbit2000_moni072
; $ rom-writer TL866-2 plus rabbit2000_moni072.ihx
;

        .r2k
 
        .area TEST(ABS)
 
;;Global Control/Status Register
GCSR	.equ	0x00
;;Global Output Control Register
GOCR	.equ	0x0e
;;Global Clock Double Register
GCDR	.equ	0x0f
;;MMU: MMU Instruction/Data Register
MMIDR	.equ	0x10
;;MMU: Data Segment Register(Z180 BBR)
DATASEG	.equ	0x12
;;MMU: Segment Size Register(Z180 CBAR)
SEGSIZE	.equ	0x13
;;MMU: Stack Segment Register(Z180 CBR)
STACKSEG	.equ	0x11
;;MMU: Memory Bank 0 Control Ragister
MB0CR	.equ	0x14
;;MMU: Memory Bank 1 Control Ragister
MB1CR	.equ	0x15

;;Global Revision Register
GREV	.equ	0x2f

;;External Interrupt
;;Interupt 0 Control Register
I0CR	.equ	0x98
;;Interupt 1 Control Register
I1CR	.equ	0x99

;;Parallel ports 
;;PPA
;;Port A Data Register
PADR	.equ	0x30
;;Slave	Port Control Ragister
SPCR	.equ	0x24

;;PPB
;;Port B Data Register
PBDR	.equ	0x40

;;PPC
;;Port C Data Ragister
PCDR	.equ	0x50
;;Port C Function Ragister
PCFR	.equ	0x55

;;PPD
;;Port D Data Ragister
PDDR	.equ	0x60
;;Port D Function Ragister
PDFR	.equ	0x65
;;Port D Control Ragister
PDCR	.equ	0x64
;;Port D Drive Control Ragister
PDDCR	.equ	0x66

;;PPE
;;Port E Data Ragister
PEDR	.equ	0x70
;;Port E Function Ragister
PEFR	.equ	0x75
;;Port E Control Ragister
PECR	.equ	0x74
;;Port E Data Direction Ragister
PEDDR	.equ	0x77

;;Timer A
;;Timer A Control/Status Register
TACSR	.equ	0xa0
;;Timer A Control Register
TACR	.equ	0xa4
;;Timer A1 Constant register
TAT1R	.equ	0xA3
;;Timer A4 Constant register
TAT4R	.equ	0xA9

;;Serial A port
;;Serial A Port Status Register
SASR	.equ	0xc3
;;Serial A port Control Register
SACR	.equ	0xc4
;;Serial A port Data Register
SADR	.equ	0xc0
;;Serial A port Address Register
SAAR	.equ	0xc1
;;Serial A port Long Register
SALR	.equ	0xc2

;;Watchdog Timer
;;Watchdog Timer Control Register
WDTCR	.equ	0x08
;;Watchdog Timer Test Register
WDTTR	.equ	0x09

;;ram Physics address setting 
RamPhysicsAddr	.equ	0x40  		;ram Physics address 0x40000

;;monitor trance address setting
trance_xpc_set	.equ	0x40-0x0e	;xpc 0xe000 >> 0x40000 setting
temp_addr       .equ    0xe000  	;moni move temprary address (XPC)


        .org    0x0000
        jp      start
        
        .org	0x0080
        
start:
	ld	a,0b00001000		;proc=OSC,pclk=osc,periodic interrupt=disable
	ioi ld	(GCSR),a
	ld	a,0x00			;0x000000 Use /OE0 or /WE0 Use CS0
	ioi ld	(MB0CR),a		;use ROM
	ld	a,0b00000101		;0x400000 Use /OE1 or /WE1 Use CS1
	ioi ld	(MB1CR),a		;use RAM
	
	ld	a,0x0f			;A-ch Clock timer :=(PCLK/2/16/38400)-1 (PCLK=19.6608MHz >> 38400bps)
	ioi ld	(TAT4R),a
	ld	a,0x01			;PCLK/2 Timer A Enabled
	ioi ld	(TACSR),a
;	ld	a,0b00000000		;Timer A4~A7 Clocked by PCLK/2,interrupts disabled
;	ioi ld	(TACR),a


	ld	a,0x40			;MMU Data Reg Physics address 0x40000 (CS1)
	ioi ld	(DATASEG),a
	ld	a,0x40			;MMU Stack Reg Physics address 0x40000 (CS1)
	ioi ld 	(STACKSEG),a
	ld	a,0xa8			;MMU Segsize logic Data address 0x8000 (CS1:0x48000)
	ioi ld	(SEGSIZE),a		;MMU Segsize logic Stack address 0xa000 (CS1:0x4a000)
	
	ld	a,0x40			;MMU XPC Physics address 0x40000 (CS1:0x4e000)
	ld	xpc,a

	ld	a,0x00
	ld	iir,a
	ld	eir,a
	ipset	3			;All interrupt suppessed (except RST)
	
	jp	main

       .org    0x100

main:                          	;cold start
        ld      sp,0xe000     	;stack pointer set
	call	ppinit		;parallel ports initialize
	call	sioinit		;serial channel initialize

ram_main:
        ld      hl,msg_op       ;opening message display
        call    msgout
        call	cpu_msg0
        call    cpu_msg1
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      "t"
        jr	nz,prompt08
        call    trance        	;moni 64Kmemory trance
prompt08:
        cp      0x0d
        jr	z,prompt
        cp 	0x00
        jr	z,prompt
        call	cr
        jr      prompt
        
cpu_msg0:
        ld      hl,cpu_msg_revision	;Revision disply
        call    msgout
        ioi ld	a,(GREV)
        and	0x0f			;4-0bit 0> rabbit2000
        cp	0x00			;       1> rabbit2000A
        jr	z,cpu_msg1_01           ;       2> rabbit2000B
        or	0x40                    ;       3> rabbit2000C
        call	putchar
cpu_msg1_01:
        call	cr
        ret
      
cpu_msg1:
        ld      hl,cpu_msg_dataseg	;DATASEG reg disply
        call    msgout
        ioi ld	a,(DATASEG)
        call    hex_a_disp
        ld      hl,cpu_msg_stackseg  	;STACKSEG reg disply
        call    msgout
        ioi ld	a,(STACKSEG)
        call    hex_a_disp
        ld      hl,cpu_msg_segsize 	;SEGSIZE reg disply
        call    msgout
        ioi ld	a,(SEGSIZE)
        call    hex_a_disp
        ld      hl,cpu_msg_xpc 		;XPC disply
        call    msgout
        ld	a,xpc
        call    hex_a_disp        
        call    cr
        ret        
        
help:   ld      hl,help_msg     ;help ?
        call    msgout
        ret
cr:
	push	af
	ld	a,0x0d
	call	putchar
	pop	af
	ret
crret_t:
        call    cr
        ret	
trance: 
        call    call_yes_msg
        call    getchar
        cp      "y"
        jr      nz,crret_t
        call    cr
        ld      a,trance_xpc_set              	;ram  xpc  0xe0000 to 0xffff 
        ld  	xpc,a				;XPC Physics address 0x00000

        ld      hl,0x0000       ;moni   copy at temp_addr(XPC)
        ld      de,temp_addr
        ld      bc,prog_end
        ldir
        
        ld      hl,move_prog+temp_addr
        jp      (hl)            ;temprary address jump
;
move_prog:
        xor     a               ;ram 0x0000 to 0xdfff setting
        ioi ld	(SEGSIZE),a
        ld      hl,go_moni
        jp      (hl)            ;ram monitor jump
 
go_moni:
        ld	a,RamPhysicsAddr
        ld	xpc,a		;XPC 0xe000 setting
	call	cr
	ld	hl,ram_msg
	call	msgout
	ld	sp,0x0100        
        jp	ram_main
        
call_yes_msg:
        push    hl
        ld      hl,yes_msg
        call    msgout
        pop     hl
        ret

jump:                           ;address jump?
        ld      a," "
        call    putchar
        call    input_hl        ;dump address input
        cp      0x00
        jr      nz,crret
        ld      a," "
        call    putchar
        ld      a,"y"
        call    putchar
        ld      a,":"

        call    putchar
        call    getchar
        cp      "y"
        jr      nz,crret
        call    cr
        jp      (HL)       
crret:
        call    cr
        ret

calling:                         ;address call?
        ld      a," "
        call    putchar
        call    input_hl       	 ;call address input
        cp      0x00
        jr      nz,crret
        ld      a," "
        call    putchar
        ld      a,"y"
        call    putchar
        ld      a,":"
        call    putchar
        call    getchar
        cp      "y"
        jr      nz,crret
        call	cr
        ld	de,callret
        push	de
        jp	(HL)
callret:
        ret


loadhex:
        call    loadhexline     ;load 1line Hex file
        cp      0xff            ;hex file read err
        jr      z,loadhexerr
        cp      0x01            ;hex file end?
        jr      nz,loadhex
        ld      a,0x0d
        call    putchar
        ld      a,"O"
        call    putchar
        ld      a,"K"
        call    putchar
        ld      a,0x0d
        call    putchar
        ret

loadhexerr:
        ld      a,0x0d          ;hex file read skip
        call    putchar
        ld      a,"E"
        call    putchar
        ld      a,"R"
        call    putchar
        ld      a,"R"
        call    putchar
        ld      a,0x0d
        call    putchar
        ret
        
loadhexline:
        ld      a,0x0d
        call    putchar
        ld      d,0x00          ;checksum count clr
        call    getchar         ;record mark is ":"
        cp      ":"
        jr      nz,loadhexlineerr
        call    input_l         ;data size 1byte
        ld      b,l             ;B reg << Data size
        ld      a,d
        add     b		;checksum = checksum + data size
        ld      d,a
        call    input_hl        ;offset address 2byte
        ld	ix,hl
        		        ;offset address HLreg >> IXreg
        ld      a,d             ;checksum = checksum + address Low      
        add     l               
        add     h               ;checksum = checksum + address Hi
        ld      d,a
        call    input_l         ;record type
        ld      a,l
        cp      0x00            ;data record
        jr      nz,checkrecord

        ;; *** data record job ****
        
data_hex_load:
        call    getchar         ;read hex 1byte in Lreg(hex)
        call	ascii_hex
        cp	0xff
        jr	z,loadhexlineerr
        sla	a
        sla	a
        sla	a
        sla	a
        ld      (ix+0),a        ;offset address < hex data
        call    getchar         ;read hex 1byte in Lreg(hex)
        call	ascii_hex
        cp	0xff
        jr	z,loadhexlineerr
        and	a,0x0f
        or	a,(ix+0)
        ld      (ix+0),a        ;offset address < hex data
        ld      a,d
        add     a,(ix+0)        ;cheksum Dreg = Dreg + Lreg
        ld      d,a
        inc     ix              ;offset address +1	
        djnz	data_hex_load   ;Breg(data size) == 0?
 
        call    input_l         ;chechsum OK?
        ld      a,d
        add     l
        cp      0x00
        jr      nz,loadhexlineerr
        call    getchar
        cp      0x0a            ;load 1line hex LF?
        jr      nz,loadhexlineerr
        ld      a,0x00
        ret

checkrecord:                    ;end record ?
        cp      0x01
        jr      nz,loadhexlineerr
        call    input_l
        ld      a,l
        cp      0xff
        jr      nz,loadhexlineerr
        ld      a,0x01
        ret

loadhexlineerr:
        ld      a,0xff          ;read record err (no support)
        ret     
             
dump:                           ;memory dump
        ld      a," "
        call    putchar
        call    input_hl        ;dump address input
        cp      0x00
        jr      z,dump1
        push    iy              ;memory dump address set
        pop     hl
dump1:
        call    dump_hl         ;memory dump
        push    hl              ;memory address IY set
        pop     iy
        ret

memory:                         ;memory change
        ld      a," "           ;space
        call    putchar         
        call    input_hl        ;change memory address 
        cp      0x00
        jr      z,memory1       ;no address hex code 
        ld      a,0x0d
        call    putchar
        ret
memory1:
        ld      a," "           ;current memory display
        call    putchar
        ld      a,(HL)
        call    hex_a_disp
        ld      a," "
        call    putchar
        push    hl
        call    input_l         ;new memory conntents input
        cp      0x00
        jr      z,memory2
        pop     hl
        xor	a
        ret
memory2:
        ld      c,l             ;memory contents update
        pop     hl
        ld      (hl),c
        ld      a,0x0d
        call    putchar
        ret

ioreg:                         ;ioreg change
        ld      a," "           ;space
        call    putchar
        call    input_l        ;change i/o register
        cp      0x00
        jr      z,ioreg1       ;no address hex code
        ld      a,0x0d
        call    putchar
        ret
ioreg1:
        ld      a," "           ;current i/o address display
        call    putchar
        ld	b,0x00
        ld	c,l
        ioi ld  a,(bc)
        call    hex_a_disp
        ld      a," "
        call    putchar
        call    input_l         ;new i/o conntents address input
        cp      0x00
        jr      z,ioreg2
        xor	a
        ret
ioreg2:
        ld      a,l             ;new i/o address update
        ioi ld  (bc),a
        ld      a,0x0d
        call    putchar
        ret


input_l:                        ;input Lreg hex (1byte)
        push    bc
        ld      b,0x02
        jr      input_prompt

input_hl:                       ;input HLreg hex (2byte)
        push    bc
        ld      b,0x04
input_prompt:
        ld      hl,0x0000       ;HL reg cler
        jr      input_hl2
shift_hl:
        add     hl,hl           ;HL reg shift left 4bit
        add     hl,hl
        add     hl,hl
        add     hl,hl
input_hl2:
        call    getchar         ;input ascii hex 1char
        call    putchar
        
        call    ascii_hex       ;ascii hex 1char >> Areg
        cp      0xff
        jr      z,input_hl_err
        and     0x0f            ;Areg low order 4bit >> Lreg
        or      l
        ld      l,a
        djnz    shift_hl
input_hl_end:
        pop     bc
        xor     a               ;OK >> Areg 0x00
        ret
input_hl_err:
        ld      a,0xff          ;NG >> Areg 0xff
        pop     bc
        ret

dump_hl:                        ;memory dump 1line(+0 -- +f)
        ld      a,0x0d
        call    putchar
        push    hl
        ld      hl,dump_msg     ;dump address msg output
        call    msgout
        pop     hl
        ld      a,h             ;dump address HLreg
        call    hex_a_disp      ;dump address output
        ld      a,l
        call    hex_a_disp
        ld      a," "
        call    putchar
        call    putchar
        ld      b,0x10          ;address --> address +0f
hl_disp:
        ld      a,(HL)          ;dump addres data (HL)
        inc     HL
        call    hex_a_disp
        ld      a," "
        call    putchar
        djnz    hl_disp

        ld      a,0x0d
        call    putchar
        ret

hex_a_disp:                     ;Areg(HEX) >> putchar(areg)
        push    af
        rrca                    ;7-4bit Right shift
        rrca
        rrca
        rrca
        call    hex_ascii       ;3-0bit Hex >> Hex ascii(0-F)
        call    putchar         ;7-4bit putchar
        pop     af
        call    hex_ascii       ;3-0bit Hex >> Hex ascii(0-F)
        call    putchar         ;3-0bit putchar
        ret


ascii_hex:
        sub     0x30
        jr      c,err_hex
        cp      0x0A            ;0-9
        jr      c,hex_1_9
        sub     0x11
        cp      0x06            ;A-F
        jr      c,hex_A_F
        sub     0x20
        cp      0x06            ;a-f
        jr      nc,err_hex
hex_A_F:
        add     0x0a
hex_1_9:
        ret
err_hex:ld      a,0xff
        ret

hex_ascii:                      ;Areg(HEX) >> Areg(ascii code)  
        and     a,0x0f
        cp      0x0a
        jr      c,ascii0_9
        add     0x37
        ret
ascii0_9:
        add     0x30
        ret
       
msgout:
        ld      a,(hl)          ;(HL)reg is output disp at 0x00
        cp      0x00
        ret     z
        call    putchar
        inc     hl
        jr      msgout

putchar:				
	push	af
putchar01:
	ioi ld	a,(SASR)		;Serial A port Status in
      	bit     3,a			
        jr      nz,putchar01		;XMIT DATA REG > Full(bit3==1) check
 	pop	af
 	push	af
	ioi ld	(SADR),a		;no full(Empty) >> TxA data out
putchar_busy:
	ioi ld	a,(SASR)		;Serial A port Status in
	bit	3,a			;XMIT DATA REG > Full(bit3==1) check 
	jr	nz,putchar_busy
	pop	af			;no full(Empty) >> return
	ret
	
getchar:
	ioi ld 	a,(SASR)		;Serial A port Status in
	bit	7,a			;RCV DATA REG > EMPTY(bit7==0) check
	jr	z,getchar
	ioi ld	a,(SADR)		;No EMPTY(Full) > RxA data in
	push	af
getchar01:
	ioi ld	a,(SASR)		;Serial A port Status in
	bit	7,a			;RCV DATA REG >EMPTY(bit7==0) check
	jr	nz,getchar01
	pop	af			;EMPTY >> return
	ret
ppinit:
	ld	a,0x40
	ioi ld	(PCFR),a		;C Port TxA set
	ret
sioinit:
	ld	a,0b00000000
	ioi ld	(SACR),a		;Asynch mode, C port used, 8bit, Interrupt Disabled
	ret
	
msg_op: .str    "Monitor Rabbit2000 ver0.72  by Pinecone 2021/2/21"
        .db     0x0d
        .db     0x00
help_msg:
        .db     0x0d    
        .str    "?  Help"
        .db     0x0d
        .str    "d  memory dump"
        .db     0x0d
        .str    "m  memory change   address old new"
        .db     0x0d
        .str    "l  hex file load"
        .db     0x0d
        .str    "j  jump"
        .db     0x0d
        .str	"i  i/o register    i/o-address old new"
        .db	0x0d
        .str	"c  call"
        .db     0x0d
        .str    "t  ram area trance monitor jump"
        .db	0x0d	
        .db     0x00
dump_msg:
        .str    "addr  +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F"
        .db     0x0d
        .db     0x00
        
yes_msg:
        .str    " Yes:"
        .db     0x00
cpu_msg_stackseg:
        .str    " STACKSEG:"
        .db     0x00
cpu_msg_dataseg:
        .str    " DATASEG:"
        .db     0x00   
cpu_msg_segsize:
        .str    " SEGSIZE:"
        .db     0x00
cpu_msg_xpc:
        .str    " XPC:"
        .db     0x00
ram_msg:
	.str	"RAM area switching monitor"
	.db     0x0d
	.db	0x00               
cpu_msg_revision:
	.str	" Revision Rabbit2000"
  	.db	0x00 

prog_end:
	.end

HEXファイルです。

:03000000C38000BA
:200080003E08D33200003E00D33214003E05D33215003E0FD332A9003E01D332A0003E4004
:1F00A000D33212003E40D33211003EA8D33213003E40ED673E00ED47ED4FED5EC3000109
:200100003100E0CD6504CD6C04217304CD2B04CD6501CD7E013E3ECD3504CD4E04CD3504A1
:20012000FE3F2003CDB401FE642003CD1603FE6D2003CD2C03FE6C2003CD6102FE6A2003A0
:20014000CD0C02FE692003CD6003FE632003CD3602FE742003CDC701FE0D28B9FE0028B590
:20016000CDBB0118B021C805CD2B04D33A2F00E60FFE002805F640CD3504CDBB01C92192A7
:2001800005CD2B04D33A1200CDF203218705CD2B04D33A1100CDF203219C05CD2B04D33A29
:2001A0001300CDF20321A605CD2B04ED77CDF203CDBB01C921A604CD2B04C9F53E0DCD3558
:2001C00004F1C9CDBB01C9CD0302CD4E04FE7920F2CDBB013E32ED672100001100E001DD58
:2001E00005EDB021E7E1E9AFD332130021F001E93E40ED67CDBB0121AC05CD2B043100016E
:20020000C30901E5218105CD2B04E1C93E20CD3504CD9B03FE00201A3E20CD35043E79CDF0
:2002200035043E3ACD3504CD4E04FE792004CDBB01E9CDBB01C93E20CD3504CD9B03FE00BC
:2002400020F03E20CD35043E79CD35043E3ACD3504CD4E04FE7920DACDBB01116002D5E9A5
:20026000C9CD9B02FEFF2819FE0120F53E0DCD35043E4FCD35043E4BCD35043E0DCD350435
:20028000C93E0DCD35043E45CD35043E52CD35043E52CD35043E0DCD3504C93E0DCD350424
:2002A0001600CD4E04FE3A206ACD9603457A8057CD9B03DD7D7A858457CD96037DFE0020AB
:2002C00043CD4E04CD0504FEFF2848CB27CB27CB27CB27DD7700CD4E04CD0504FEFF283310
:2002E000E60FDDB600DD77007ADD860057DD2310D0CD96037A85FE002019CD4E04FE0A202B
:20030000123E00C9FE01200BCD96037DFEFF20033E01C93EFFC93E20CD3504CD9B03FE00BC
:200320002803FDE5E1CDC103E5FDE1C93E20CD3504CD9B03FE0028063E0DCD3504C93E203F
:20034000CD35047ECDF2033E20CD3504E5CD9603FE002803E1AFC94DE1713E0DCD3504C96D
:200360003E20CD3504CD9603FE0028063E0DCD3504C93E20CD350406004DD30ACDF2033ED9
:2003800020CD3504CD9603FE002802AFC97DD3023E0DCD3504C9C506021803C506042100ED
:2003A00000180429292929CD4E04CD3504CD0504FEFF2809E60FB56F10E9C1AFC93EFFC10B
:2003C000C93E0DCD3504E5214A05CD2B04E17CCDF2037DCDF2033E20CD3504CD35040610D4
:2003E0007E23CDF2033E20CD350410F43E0DCD3504C9F50F0F0F0FCD1F04CD3504F1CD1F14
:2004000004CD3504C9D6303813FE0A380ED611FE063806D620FE063003C60AC93EFFC9E68F
:200420000FFE0A3803C637C9C630C97EFE00C8CD35042318F6F5D33AC300CB5F20F8F1F57D
:20044000D332C000D33AC300CB5F20F8F1C9D33AC300CB7F28F8D33AC000F5D33AC300CB74
:200460007F20F8F1C93E40D3325500C93E00D332C400C94D6F6E69746F72205261626269D2
:20048000743230303020766572302E3732202062792050696E65636F6E6520323032312F72
:2004A000322F32310D000D3F202048656C700D6420206D656D6F72792064756D700D6D209C
:2004C000206D656D6F7279206368616E676520202061646472657373206F6C64206E6577CE
:2004E0000D6C20206865782066696C65206C6F61640D6A20206A756D700D692020692F6F4E
:2005000020726567697374657220202020692F6F2D61646472657373206F6C64206E6577F3
:200520000D63202063616C6C0D74202072616D2061726561207472616E6365206D6F6E6945
:20054000746F72206A756D700D006164647220202B30202B31202B32202B33202B34202BE6
:2005600035202B36202B37202B38202B39202B41202B42202B43202B44202B45202B460DD8
:2005800000205965733A0020535441434B5345473A0020444154415345473A0020534547CF
:2005A00053495A453A00205850433A0052414D206172656120737769746368696E67206D6B
:1D05C0006F6E69746F720D00205265766973696F6E205261626269743230303000D1
:00000001FF
おすすめの記事