]> cloudbase.mooo.com Git - avrcpm.git/blame - avr/utils.asm
* Z80/8080 registers BC, DE, HL moved from RAM to AVR CPU registers. 'temp4' removed.
[avrcpm.git] / avr / utils.asm
CommitLineData
5985ce1c
L
1; Print and Debug functions
2;
3; Copyright (C) 2010 Leo C.
4;
5; This file is part of avrcpm.
6;
7; avrcpm is free software: you can redistribute it and/or modify it
8; under the terms of the GNU General Public License as published by
9; the Free Software Foundation, either version 3 of the License, or
10; (at your option) any later version.
11;
12; avrcpm is distributed in the hope that it will be useful,
13; but WITHOUT ANY WARRANTY; without even the implied warranty of
14; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15; GNU General Public License for more details.
16;
17; You should have received a copy of the GNU General Public License
18; along with avrcpm. If not, see <http://www.gnu.org/licenses/>.
19;
20; $Id$
21;
22
23
24 .cseg
25
26
27;Print a unsigned lonng value to the uart
825ecc9d 28; r15:r14:temp2:temp = value
5985ce1c
L
29
30print_ultoa:
31 push yh
32 push yl
33 push z_flags
825ecc9d
L
34 push r15
35 push r14
5985ce1c
L
36 push temp2
37 push temp
38
39 clr yl ;yl = stack level
40
825ecc9d
L
41ultoa1: ldi z_flags, 32 ;yh = r15:temp % 10
42 clr yh ;r15:temp /= 10
5985ce1c
L
43ultoa2: lsl temp
44 rol temp2
825ecc9d
L
45 rol r14
46 rol r15
5985ce1c
L
47 rol yh
48 cpi yh,10
49 brcs ultoa3
50 subi yh,10
51 inc temp
52ultoa3: dec z_flags
53 brne ultoa2
54 cpi yh, 10 ;yh is a numeral digit '0'-'9'
55 subi yh, -'0'
56 push yh ;Stack it
57 inc yl
825ecc9d 58 cp temp,_0 ;Repeat until r15:temp gets zero
5985ce1c 59 cpc temp2,_0
825ecc9d
L
60 cpc r14,_0
61 cpc r15,_0
5985ce1c
L
62 brne ultoa1
63
64 ldi temp, '0'
65ultoa5: cpi yl,3 ; at least 3 digits (ms)
66 brge ultoa6
67 push temp
68 inc yl
69 rjmp ultoa5
70
71ultoa6: pop temp ;Flush stacked digits
72 rcall uartputc
73 dec yl
74 brne ultoa6
75
76 pop temp
77 pop temp2
825ecc9d
L
78 pop r14
79 pop r15
5985ce1c
L
80 pop z_flags
81 pop yl
82 pop yh
83 ret
84
85
86;Prints temp2:temp in hex to the uart
87printhexw:
88 push temp
89 mov temp,temp2
90 rcall printhex
91 pop temp
92 ;fall thru
93
94;Prints temp in hex to the uart
95printhex:
96 swap temp
97 rcall printhexn
98 swap temp
99 ;fall thru
100
101;Prints the lower nibble
102printhexn:
103 push temp
104 andi temp,0xf
105 cpi temp,0xA
106 brlo printhexn_isno
107 subi temp,-7
108printhexn_isno:
109 subi temp,-'0'
110 rcall uartputc
111 pop temp
112 ret
113
dd7aea8c
L
114
115; Prints a single space
116
117dbg_printspace:
118 ldi temp,' '
119 rjmp uartputc
120
121; Prints 16 bytes pointed to by Z in hex.
122
123dbg_hexdump_line: ;Address in z
124 push temp2
125 push temp
126 printnewline
127 movw temp,z ;Print address
128 rcall printhexw
129 ldi temp2,16 ;16 byte per line
130 rcall dbg_printspace
131dbg_hdl1:
132 cpi temp2,8
133 brne PC+2
134 rcall dbg_printspace
135
136 rcall dbg_printspace
137 ld temp,z+
138 rcall printhex
139 dec temp2
140 brne dbg_hdl1
141 sbiw z,16
142
143 rcall dbg_printspace
144 rcall dbg_printspace
145 ldi temp2,16
146dbg_hdl2:
147 ld temp,z+
148 cpi temp,' '
149 brlo dbg_hdpd
150 cpi temp,0x7F
151 brlo dbg_hdp
152dbg_hdpd:
153 ldi temp,'.'
154dbg_hdp:
155 rcall uartputc
156 dec temp2
157 brne dbg_hdl2
158 sbiw z,16
159 rcall dbg_printspace
160 pop temp
161 pop temp2
162 ret
163
164
5985ce1c
L
165;Prints the zero-terminated string following the call statement.
166
167printstr:
5482d75f
L
168 push zh ;SP+5
169 push zl ; 4
170 push yh ; 3
171 push yl ; 2
172 push temp ; 1
5985ce1c
L
173 in yh,sph
174 in yl,spl
5482d75f
L
175 ldd zl,y+7 ;SP+7 == "return adr." == String adr.
176 ldd zh,y+6 ;SP+6
5985ce1c 177
5482d75f 178 lsl zl ;word to byte conv.
5985ce1c
L
179 rol zh
180printstr_loop:
181 lpm temp,z+
182 cpi temp,0
183 breq printstr_end
184 rcall uartputc
185 cpi temp,13
186 brne printstr_loop
187 ldi temp,10
188 rcall uartputc
189 rjmp printstr_loop
190
191printstr_end:
5482d75f
L
192 adiw zl,1 ;rounding up
193 lsr zh ;byte to word conv.
5985ce1c
L
194 ror zl
195
196 std y+7,zl
197 std y+6,zh
198 pop temp
199 pop yl
200 pop yh
201 pop zl
202 pop zh
203 ret
204
623dd899
L
205; ------------------------ String functions -------------------------
206;
207
208#if 0
209; String compare (z, y), one z-string in flash.
210
211strcmp_p:
212 lpm _tmp0,z+
213 tst _tmp0
214 breq strcmp_pex
215
216 ld temp, y+
217 lpm _tmp0, z+
218 sub temp,_tmp0
219 brne strcmp_pex
220 tst _tmp0
221 brne strcmp_p
222strcmp_pex:
223 ret
224#endif
225
226; String compare (x, y, temp2). Max temp2 bytes are compared.
227
228strncmp_p:
229 subi temp2,1
230 brcs strncmp_peq
231 ld temp,y+
232 lpm _tmp0, z+
233 sub temp,_tmp0
234 brne strncmp_pex
235 tst _tmp0
236 brne strncmp_p
237strncmp_peq:
238 sub temp,temp
239strncmp_pex:
240 ret
241
242
5985ce1c 243; --------------- Debugging stuff ---------------
80e1fa71 244; Print a line with the 8080/Z80 registers
5985ce1c 245
5985ce1c 246printregs:
80e1fa71
L
247 mov temp,z_flags
248 rcall printflags
5985ce1c
L
249 printstring " A ="
250 mov temp,z_a
251 rcall printhex
252 printstring " BC ="
825ecc9d
L
253#if 1
254 movw temp,z_c
255#else
e7a0f403
L
256 ldd temp2,y+oz_b
257 ldd temp,y+oz_c
825ecc9d 258#endif
5985ce1c
L
259 rcall printhexw
260 printstring " DE ="
825ecc9d
L
261#if 1
262 movw temp,z_e
263#else
e7a0f403
L
264 ldd temp2,y+oz_d
265 ldd temp,y+oz_e
825ecc9d 266#endif
5985ce1c
L
267 rcall printhexw
268 printstring " HL ="
825ecc9d
L
269#if 1
270 movw temp,z_l
271#else
e7a0f403 272 ldd temp,y+oz_l
825ecc9d
L
273 ldd temp2,y+oz_h
274#endif
5985ce1c 275 rcall printhexw
80e1fa71 276 printstring " SP="
5985ce1c
L
277 movw temp, z_spl
278 rcall printhexw
80e1fa71 279 printstring " PC="
5985ce1c
L
280 movw temp, z_pcl
281 rcall printhexw
282 printstring " "
283 movw xl,z_pcl
096f3a91 284 lcall dram_read_pp
5985ce1c
L
285 rcall printhex
286 printstring " "
096f3a91 287 lcall dram_read_pp
5985ce1c
L
288 rcall printhex
289 printstring " "
096f3a91 290 lcall dram_read
5985ce1c
L
291 rcall printhex
292 printstring " "
80e1fa71
L
293
294#if EM_Z80
e7a0f403 295 ldd temp,y+oz_f2
80e1fa71 296 rcall printflags
096f3a91 297 printstring " a'="
e7a0f403 298 ldd temp,y+oz_a2
80e1fa71 299 rcall printhex
096f3a91 300 printstring " bc'="
e7a0f403
L
301 ldd temp2,y+oz_b2
302 ldd temp,y+oz_c2
80e1fa71 303 rcall printhexw
096f3a91 304 printstring " de'="
e7a0f403
L
305 ldd temp2,y+oz_d2
306 ldd temp,y+oz_e2
80e1fa71 307 rcall printhexw
096f3a91 308 printstring " hl'="
e7a0f403
L
309 ldd temp2,y+oz_h2
310 ldd temp,y+oz_l2
80e1fa71
L
311 rcall printhexw
312 printstring " IX="
e7a0f403
L
313 ldd temp2,y+oz_xh
314 ldd temp,y+oz_xl
80e1fa71
L
315 rcall printhexw
316 printstring " IY="
e7a0f403
L
317 ldd temp2,y+oz_yh
318 ldd temp,y+oz_yl
80e1fa71
L
319 rcall printhexw
320 printstring " I="
e7a0f403 321 ldd temp,y+oz_i
80e1fa71
L
322 rcall printhex
323
324 printstring " "
325#endif
326 ret
327
328
329#if EM_Z80
330zflags_to_ch:
331 .db "SZ H VNC",0,0
332#else
333zflags_to_ch:
334 .db "SZ H PNC",0,0
335#endif
336
337printflags:
338 push temp2
339 mov temp2,temp
340 printnewline
341 push zl
342 push zh
343 ldiw z,zflags_to_ch*2
344pr_zfl_next:
345 lpm temp,z+
346 tst temp
347 breq pr_zfl_end
348 cpi temp,' ' ; Test if no flag
349 breq pr_zfl_noflag
350 sbrs temp2,7 ;
351 ldi temp,' ' ; Flag not set
352 rcall uartputc
353pr_zfl_noflag:
354 rol temp2
355 rjmp pr_zfl_next
356pr_zfl_end:
357 pop zh
358 pop zl
359 pop temp2
5985ce1c 360 ret
5985ce1c
L
361
362; vim:set ts=8 noet nowrap
363