; Print and Debug functions
;
-; Copyright (C) 2010 Leo C.
+; Copyright (C) 2010-2013 Leo C.
;
; This file is part of avrcpm.
;
;Print a unsigned lonng value to the uart
-; temp4:temp3:temp2:temp = value
+; r15:r14:temp2:temp = value
print_ultoa:
push yh
push yl
push z_flags
- push temp4
- push temp3
+ push r15
+ push r14
push temp2
push temp
clr yl ;yl = stack level
-ultoa1: ldi z_flags, 32 ;yh = temp4:temp % 10
- clr yh ;temp4:temp /= 10
+ultoa1: ldi z_flags, 32 ;yh = r15:temp % 10
+ clr yh ;r15:temp /= 10
ultoa2: lsl temp
rol temp2
- rol temp3
- rol temp4
+ rol r14
+ rol r15
rol yh
cpi yh,10
brcs ultoa3
subi yh, -'0'
push yh ;Stack it
inc yl
- cp temp,_0 ;Repeat until temp4:temp gets zero
+ cp temp,_0 ;Repeat until r15:temp gets zero
cpc temp2,_0
- cpc temp3,_0
- cpc temp4,_0
+ cpc r14,_0
+ cpc r15,_0
brne ultoa1
ldi temp, '0'
pop temp
pop temp2
- pop temp3
- pop temp4
+ pop r14
+ pop r15
pop z_flags
pop yl
pop yh
; Prints a single space
-dbg_printspace:
- ldi temp,' '
- rjmp uartputc
-
-; Prints 16 bytes pointed to by Z in hex.
-
-dbg_hexdump_line: ;Address in z
- push temp2
+printspace:
push temp
- printnewline
- movw temp,z ;Print address
- rcall printhexw
- ldi temp2,16 ;16 byte per line
- rcall dbg_printspace
-dbg_hdl1:
- cpi temp2,8
- brne PC+2
- rcall dbg_printspace
-
- rcall dbg_printspace
- ld temp,z+
- rcall printhex
- dec temp2
- brne dbg_hdl1
- sbiw z,16
-
- rcall dbg_printspace
- rcall dbg_printspace
- ldi temp2,16
-dbg_hdl2:
- ld temp,z+
- cpi temp,' '
- brlo dbg_hdpd
- cpi temp,0x7F
- brlo dbg_hdp
-dbg_hdpd:
- ldi temp,'.'
-dbg_hdp:
+ ldi temp,' '
rcall uartputc
- dec temp2
- brne dbg_hdl2
- sbiw z,16
- rcall dbg_printspace
pop temp
- pop temp2
ret
-
+;-----------------------------------------------------------------------
;Prints the zero-terminated string following the call statement.
printstr:
pop zh
ret
+; ------------------------ String functions -------------------------
+;
+
+#if 0
+; String compare (z, y), one z-string in flash.
+
+strcmp_p:
+ ld temp,y+
+ lpm _tmp0, z+
+ sub temp,_tmp0
+ brne strcmp_pex
+ tst _tmp0
+ brne strcmp_p
+ sub temp,temp
+strcmp_pex:
+ ret
+
+#endif
+
+#if 0
+
+strcmp_p:
+ ld temp,y+
+ lpm _tmp0,z+
+ sub temp,_tmp0
+ cpse _tmp0,_0
+ breq strcmp_p
+ ret
+
+
+#endif
+
+;-----------------------------------------------------------------------
+; String compare (x, y, temp2). Max temp2 bytes are compared.
+
+strncmp_p:
+ subi temp2,1
+ brcs strncmp_peq
+ ld temp,y+
+ lpm _tmp0, z+
+ sub temp,_tmp0
+ brne strncmp_pex
+ tst _tmp0
+ brne strncmp_p
+strncmp_peq:
+ sub temp,temp
+strncmp_pex:
+ ret
+
+;-----------------------------------------------------------------------
+; Memory compare: DRAM - AVR-RAM
+; DRAM-Addr. in x, AVRRAM-Addr. in y
+; Compare temp3 bytes.
+;
+; Return Z-Flag == 1 if match
+; temp, _tmp0 destroyed
+;
+
+memcmp_d:
+ rcall dram_read_pp
+ ld _tmp0,y+
+ cp temp,_tmp0
+ brne memcmpd_nomatch
+ dec temp3
+ brne memcmp_d
+memcmpd_nomatch:
+ ret
+
; --------------- Debugging stuff ---------------
-; Print a line with the Z80 main registers
-;.if INS_DEBUG
-zflags_to_ch:
- .db "SZ H PNC",0,0
-
-printregs:
+.if SRAM_FILL
+
+stackusage_print:
+ ldiw z,ramtop
+ ldi temp, low(RAMEND+1)
+ ldi temp2,high(RAMEND+1)
+ ldi temp3,SRAMFILL_VAL
+stack_search_l:
+ ld _tmp0,z+
+ cp temp3,_tmp0
+ brne stack_search_found
+ cp zl,temp
+ cpc zh,temp2
+ brne stack_search_l
+
+stack_search_found:
+ sbiw z,1
+ sub temp, zl
+ sbc temp2,zh
printnewline
+ printstring "Stack used (bytes): "
+ push r15
+ push r14
+ clr r14
+ clr r15
+ rcall print_ultoa
+ pop r14
+ pop r15
+ ret
+.endif
- push zl
- push zh
- ldiw z,zflags_to_ch*2
- mov temp2,z_flags
-pr_zfl_next:
- lpm temp,z+
- tst temp
- breq pr_zfl_end
- cpi temp,' ' ; Test if no flag
- breq pr_zfl_noflag
- sbrs temp2,7 ;
- ldi temp,' ' ; Flag not set
+
+
+;-----------------------------------------------------------------------
+; Prints 16 bytes RAM, pointed to by Z in hex.
+
+#if 0
+
+dbg_hexdump_line: ;Address in z
+ push temp2
+ push temp
+ printnewline
+ movw temp,z ;Print address
+ rcall printhexw
+ ldi temp2,16 ;16 byte per line
+ rcall printspace
+dbg_hdl1:
+ cpi temp2,8
+ brne PC+2
+ rcall printspace
+
+ rcall printspace
+ ld temp,z+
+ rcall printhex
+ dec temp2
+ brne dbg_hdl1
+ sbiw z,16
+
+ rcall printspace
+ rcall printspace
+ ldi temp2,16
+dbg_hdl2:
+ ld temp,z+
+ cpi temp,' '
+ brlo dbg_hdpd
+ cpi temp,0x7F
+ brlo dbg_hdp
+dbg_hdpd:
+ ldi temp,'.'
+dbg_hdp:
rcall uartputc
-pr_zfl_noflag:
- rol temp2
- rjmp pr_zfl_next
-pr_zfl_end:
- pop zh
- pop zl
+ dec temp2
+ brne dbg_hdl2
+ sbiw z,16
+ rcall printspace
+ pop temp
+ pop temp2
+ ret
+#endif
+
+;-----------------------------------------------------------------------
+; Print a line with the 8080/Z80 registers
+printregs:
+ mov temp,z_flags
+ rcall printflags
printstring " A ="
mov temp,z_a
rcall printhex
printstring " BC ="
- lds temp2,z_b
- lds temp, z_c
+#if 1
+ movw temp,z_c
+#else
+ ldd temp2,y+oz_b
+ ldd temp,y+oz_c
+#endif
rcall printhexw
printstring " DE ="
- lds temp2,z_d
- lds temp, z_e
+#if 1
+ movw temp,z_e
+#else
+ ldd temp2,y+oz_d
+ ldd temp,y+oz_e
+#endif
rcall printhexw
printstring " HL ="
- lds temp2,z_h
- lds temp, z_l
+#if 1
+ movw temp,z_l
+#else
+ ldd temp,y+oz_l
+ ldd temp2,y+oz_h
+#endif
rcall printhexw
- printstring " SP ="
+ printstring " SP="
movw temp, z_spl
rcall printhexw
- printstring " PC ="
+ printstring " PC="
movw temp, z_pcl
rcall printhexw
printstring " "
movw xl,z_pcl
- mem_read
+ lcall dram_read_pp
rcall printhex
printstring " "
- adiw x,1
- mem_read
+ lcall dram_read_pp
rcall printhex
printstring " "
- adiw x,1
- mem_read
+ lcall dram_read
rcall printhex
printstring " "
+
+#if EM_Z80
+ ldd temp,y+oz_f2
+ rcall printflags
+ printstring " a'="
+ ldd temp,y+oz_a2
+ rcall printhex
+ printstring " bc'="
+ ldd temp2,y+oz_b2
+ ldd temp,y+oz_c2
+ rcall printhexw
+ printstring " de'="
+ ldd temp2,y+oz_d2
+ ldd temp,y+oz_e2
+ rcall printhexw
+ printstring " hl'="
+ ldd temp2,y+oz_h2
+ ldd temp,y+oz_l2
+ rcall printhexw
+ printstring " IX="
+ ldd temp2,y+oz_xh
+ ldd temp,y+oz_xl
+ rcall printhexw
+ printstring " IY="
+ ldd temp2,y+oz_yh
+ ldd temp,y+oz_yl
+ rcall printhexw
+ printstring " I="
+ ldd temp,y+oz_i
+ rcall printhex
+
+ printstring " "
+#endif
+ ret
+
+
+#if EM_Z80
+zflags_to_ch:
+ .db "SZ H VNC",0,0
+#else
+zflags_to_ch:
+ .db "SZ H PNC",0,0
+#endif
+
+printflags:
+ push temp2
+ mov temp2,temp
+ printnewline
+ push zl
+ push zh
+ ldiw z,zflags_to_ch*2
+pr_zfl_next:
+ lpm temp,z+
+ tst temp
+ breq pr_zfl_end
+ cpi temp,' ' ; Test if no flag
+ breq pr_zfl_noflag
+ sbrs temp2,7 ;
+ ldi temp,' ' ; Flag not set
+ rcall uartputc
+pr_zfl_noflag:
+ rol temp2
+ rjmp pr_zfl_next
+pr_zfl_end:
+ pop zh
+ pop zl
+ pop temp2
ret
-;.endif
; vim:set ts=8 noet nowrap