; > Debug
; Debug routines

; Debug_Hex
; Debug_Hex2
; Debug_Oct
; Debug_Char
; Debug_Spc
; Debug_DumpRegsOct
; Debug_DumpRegsHex
; Debug_DumpLine
; Debug_DumpMem
; Debug_DumpMemOne


; Print R0 as hex byte
; --------------------
.Debug_Hex
mov r0,-(sp)
jsr pc,prhex
mov (sp)+,r0
rts pc

; Print R0 as hex word
; --------------------
.Debug_Hex2
mov r0,-(sp)
jsr pc,pr2hex
mov (sp)+,r0
rts pc

; Print R0 as octal word
; ----------------------
.Debug_Oct
mov r0,-(sp)
jsr pc,proct
mov (sp)+,r0
rts pc

; Print R0 as character or dot
; ----------------------------
.Debug_Char
mov r0,-(sp)
bic #&FF80,r0
cmp r0,#127
beq Debug_CharDot
cmp r0,#32
bcc Debug_CharOk
.Debug_CharDot
mov #ASC".",r0
.Debug_CharOk
jsr pc,IO_WRCH
mov (sp)+,r0
rts pc

; Print a space
; -------------
.Debug_Spc
mov #32,r0
jsr pc,IO_WRCH
rts pc

; Dump registers
; --------------
.Debug_DumpRegsOct
mov r0,-(sp)
jsr pc,Debug_Oct
jsr pc,Debug_Spc
mov r1,r0
jsr pc,Debug_Oct
jsr pc,Debug_Spc
mov r2,r0
jsr pc,Debug_Oct
jsr pc,Debug_Spc
mov r3,r0
jsr pc,Debug_Oct
jsr pc,Debug_Spc
mov r4,r0
jsr pc,Debug_Oct
jsr pc,Debug_Spc
mov r5,r0
jsr pc,Debug_Oct
jsr pc,Debug_Spc
mov r6,r0
jsr pc,Debug_Oct
jsr pc,Debug_Spc
jsr pc,IO_NEWL
mov (sp)+,r0
rts pc

; Dump registers
; --------------
.Debug_DumpRegsHex
mov r0,-(sp)
jsr pc,Debug_Hex2
jsr pc,Debug_Spc
mov r1,r0
jsr pc,Debug_Hex2
jsr pc,Debug_Spc
mov r2,r0
jsr pc,Debug_Hex2
jsr pc,Debug_Spc
mov r3,r0
jsr pc,Debug_Hex2
jsr pc,Debug_Spc
mov r4,r0
jsr pc,Debug_Hex2
jsr pc,Debug_Spc
mov r5,r0
jsr pc,Debug_Hex2
jsr pc,Debug_Spc
mov r6,r0
jsr pc,Debug_Hex2
jsr pc,IO_NEWL
mov (sp)+,r0
rts pc

; Dump line at R5
; ---------------
.Debug_DumpLine
mov r0,-(sp)	; push r0
mov r5,-(sp)	; push r5

.DumpLineLp1
movb (r5)+,r0
jsr pc,prhex
mov #32,r0
jsr pc,IO_WRCH
movb &FFFD(r5),r0
cmp r0,#13
bne DumpLineLp1
jsr pc,IO_NEWL
;
mov (sp),r5	; get r5 back
.DumpLineLp2
mov #32,r0
jsr pc,IO_WRCH
movb (r5)+,r0
jsr pc,Debug_Char
mov #32,r0
jsr pc,IO_WRCH
movb &FFFD(r5),r0
cmp r0,#13
bne DumpLineLp2
jsr pc,IO_NEWL
;
mov (sp)+,r5	; pop R5
mov (sp)+,r0	; restore R0
rts pc

; Dump one line of memory at R5
; -----------------------------
.Debug_DumpMemOne
mov r0,-(sp)	; push r0
mov r1,-(sp)	; push r1
mov r2,-(sp)	; push r2
mov r5,-(sp)	; push r5
mov r5,-(sp)	; push r5
mov #1,r2	; Dump one line
br  DumpMemLp0

; Dump three lines of memory at R5
; --------------------------------
.Debug_DumpMem
mov r0,-(sp)	; push r0
mov r1,-(sp)	; push r1
mov r2,-(sp)	; push r2
mov r5,-(sp)	; push r5
mov r5,-(sp)	; push r5

mov #3,r2	; Dump three lines
.DumpMemLp0
mov r5,r0
jsr pc,pr2hex
mov #32,r0
jsr pc,IO_WRCH
mov #16,r1	; Dump 16 bytes
.DumpMemLp1
movb (r5)+,r0
jsr pc,prhex
mov #32,r0
jsr pc,IO_WRCH
dec r1
bne DumpMemLp1
jsr pc,IO_NEWL
;
mov #32,r0
jsr pc,IO_WRCH
jsr pc,IO_WRCH
jsr pc,IO_WRCH
jsr pc,IO_WRCH
jsr pc,IO_WRCH
mov (sp),r5	; get r5 back
mov #16,r1
.DumpMemLp2
mov #32,r0
jsr pc,IO_WRCH
movb (r5)+,r0
jsr pc,Debug_Char
mov #32,r0
jsr pc,IO_WRCH
dec r1
bne DumpMemLp2
jsr pc,IO_NEWL
;
mov r5,(sp)
dec r2
bne DumpMemLp0

mov (sp)+,r5	; pop R5
mov (sp)+,r5	; pop R5
mov (sp)+,r2	; pop R2
mov (sp)+,r1	; pop R1
mov (sp)+,r0	; pop R0
rts pc

.pr2hex
mov r0,-(sp)
ror r0
ror r0
ror r0
ror r0
ror r0
ror r0
ror r0
ror r0
jsr pc,prhex
mov (sp)+,r0
.prhex
mov r0,-(sp)
ror r0
ror r0
ror r0
ror r0
jsr pc,prnybble
mov (sp)+,r0
.prnybble
bic #&FFF0,r0
cmp #9,r0
bcc prdigit
add #7,r0
br prdigit
.proctdigit
bic #&FFF8,r0
.prdigit
add #48,r0
jmp IO_WRCH

.proct
mov r0,-(sp)
ror r0
ror r0
ror r0
ror r0
ror r0
ror r0
ror r0
ror r0
ror r0
ror r0
ror r0
ror r0
ror r0
ror r0
ror r0
bic #&FFFE,r0
jsr pc,proctdigit
mov (sp),r0
ror r0
ror r0
ror r0
ror r0
ror r0
ror r0
ror r0
ror r0
ror r0
ror r0
ror r0
ror r0
jsr pc,proctdigit
mov (sp),r0
ror r0
ror r0
ror r0
ror r0
ror r0
ror r0
ror r0
ror r0
ror r0
jsr pc,proctdigit
mov (sp),r0
ror r0
ror r0
ror r0
ror r0
ror r0
ror r0
jsr pc,proctdigit
mov (sp),r0
ror r0
ror r0
ror r0
jsr pc,proctdigit
mov (sp)+,r0
jsr pc,proctdigit
rts pc
