]> git.cryptolib.org Git - avr-crypto-lib.git/blob - test_src/dump-asm.S
fixing E-Mail-Address & Copyright
[avr-crypto-lib.git] / test_src / dump-asm.S
1 /* dump-asm.S */
2 /*
3     This file is part of the AVR-Huffman.
4     Copyright (C) 2006-2015 Daniel Otte (bg@nerilex.org)
5
6     This program is free software: you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation, either version 3 of the License, or
9     (at your option) any later version.
10
11     This program is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15
16     You should have received a copy of the GNU General Public License
17     along with this program.  If not, see <http://www.gnu.org/licenses/>.
18 */
19
20 #include "avr-asm-macros.S"
21 #include <avr/io.h>
22 #include <avr/sfr_defs.h>
23 #define DUMP_WIDTH 16
24
25 #define ADDR_BASE 16
26 /******************************************************************************/
27 /* uint8_t charisinstr_P(char c, PGM_P str)
28  *   param c:    r24
29  *   param str:  r22:r23
30  */
31 charisinstr_P:
32         movw r30, r22
33 1:
34         lpm r22, Z+
35         tst r22
36         brne 2f
37         clr r24
38         ret
39 2:
40         cp r22, r24
41         brne 1b
42         ldi r24, 1
43         ret
44         
45 /******************************************************************************/
46 /* void dump_chars(uint8_t *buffer, uint8_t len)
47  *   param buffer:  r24:r25
48  *   param len:     r22
49  */
50 dump_chars:
51         push r16
52         push r17
53         push r28
54         push r29
55         movw r28, r24
56         mov r16, r22
57         ldi r24, '|'
58         clr r25
59         call cli_putc
60         mov r17, r16
61 1:
62         ld r24, Y
63         clr     r25
64         call isprint
65         tst r24
66         brne 2f
67         ldi r24, '.'
68         adiw r28, 1
69         rjmp 3f
70 2:      ld r24, Y+      
71 3:      
72         clr r25
73         call cli_putc
74         dec r17
75         brne 1b
76         subi r16, DUMP_WIDTH
77         tst r16
78         breq 5f
79         neg r16
80 4:      
81         ldi r24, ' '
82         clr r25
83         call cli_putc
84         dec r16
85         brne 4b
86 5:
87         ldi r24, '|'
88         clr r25
89         call cli_putc   
90         pop r29
91         pop r28
92         pop r17
93         pop r16
94         ret
95  
96  /*****************************************************************************/
97  /* void print_aligned(unsigned long value, uint8_t align)
98   *    param value: r22:r25
99   *    param align: r20
100   */
101 print_aligned:
102         push r16
103         push r28
104         push r29
105         stack_alloc 12, r28, r29
106         adiw r28, 1
107         mov r16, r20
108         movw r20, r28
109         ldi  r18, ADDR_BASE
110         clr  r19
111         call ultoa
112         movw r24, r28
113         call strlen
114         sub r16, r24
115         brmi 3f
116         breq 3f
117 1:
118         ldi r24, ' '
119         clr r25
120         call cli_putc
121         dec r16
122         brne 1b
123 3:      
124         movw r24, r28
125         call cli_putstr
126         stack_free 12
127         pop r29
128         pop r28
129         pop r16
130         ret 
131
132  /*****************************************************************************/
133  /* void dump(char *s)
134   *    param s: r24:r25
135   */
136
137 STR_0    =  4
138 STR_1    =  5
139 ADDR_0   =  6
140 ADDR_1   =  7
141 ADDR_2   =  8
142 ADDR_3   =  9
143 SIZE_0   = 10
144 SIZE_1   = 11
145 SIZE_2   = 12
146 SIZE_3   = 13
147 MEM_0    = 14
148 MEM_1    = 15
149 xREADLEN = 16
150 TMP      = 17
151
152 .global dump
153 dump:
154         call strstrip
155         push_range 4, 17
156         push_range 28, 29
157         movw r26, r24
158         ld TMP, X
159         movw STR_0, r26
160         ldi r30, lo8(memtype_desc)
161         ldi r31, hi8(memtype_desc)
162 1:
163         lpm r22, Z+
164         lpm r23, Z+
165         tst r22
166         brne 2f
167         tst r23
168         breq 5f
169 2:
170         movw r28, r30
171         mov r24, TMP
172         clr r25
173         rcall charisinstr_P
174         movw r30, r28
175         tst r24
176         brne 6f
177         adiw r30, 4
178         rjmp 1b
179 5:
180         ldi r30, lo8(memtype_desc+2)
181         ldi r31, hi8(memtype_desc+2)
182 6:      
183         movw MEM_0, r30
184         movw r26, STR_0
185 61:
186         ld r20, X+
187         ori r20, 'A'^'a'
188         cpi r20, 'a'
189         brmi 7f
190         cpi r20, 'z'+1
191         brge 7f
192         rjmp 61b
193 7:
194         sbiw r26, 1
195         stack_alloc 2+DUMP_WIDTH, r28, r29
196         adiw r28, 1
197         movw r24, r26
198         movw r22, r28
199         clr r20
200         clr r21
201         call strtoul
202         movw ADDR_0, r22
203         movw ADDR_2, r24
204         ld r24, Y+
205         ld r25, Y+
206         clr r23
207         clr r22
208         clr r21
209         clr r20
210         call strtoul
211         movw SIZE_0, r22
212         movw SIZE_2, r24
213         tst SIZE_0
214         brne 72f
215         tst SIZE_1
216         brne 72f
217         tst SIZE_2
218         brne 72f
219         tst SIZE_3
220         brne 72f
221         ldi TMP, 128
222         mov SIZE_0, TMP
223 72:     
224         ldi r24, lo8(dumping)
225         ldi r25, hi8(dumping)
226         call cli_putstr_P
227         movw r24, SIZE_2
228         movw r22, SIZE_0
229         movw r20, r28
230         clr r19
231         ldi r18, 10
232         call ultoa
233         movw r24, r28
234         call cli_putstr
235         ldi r24, lo8(bytesof)
236         ldi r25, hi8(bytesof)
237         call cli_putstr_P
238         movw r30, MEM_0
239         lpm r24, Z+
240         lpm r25, Z+
241         call cli_putstr_P       
242         ldi r24, lo8(beginning)
243         ldi r25, hi8(beginning)
244         call cli_putstr_P
245         movw r24, ADDR_2
246         movw r22, ADDR_0
247         movw r20, r28
248         clr r19
249         ldi r18, 16
250         call ultoa
251         movw r24, r28
252         call cli_putstr
253         ldi r24, lo8(suffix)
254         ldi r25, hi8(suffix)
255         call cli_putstr_P
256         
257         movw r30, MEM_0
258         adiw r30, 2
259         lpm MEM_0, Z+
260         lpm MEM_1, Z
261         
262 1:      
263         ldi xREADLEN, DUMP_WIDTH
264         tst SIZE_3
265         brne 3f
266         tst SIZE_2
267         brne 3f
268         tst SIZE_1
269         brne 3f
270         tst SIZE_0
271         brne 2f
272         rjmp 90f
273 2:      
274         cp DUMP_WIDTH, SIZE_0
275         brmi 3f
276         mov xREADLEN, SIZE_0
277 3:      
278         movw r24, r28
279         movw r22, ADDR_2
280         movw r20, ADDR_0
281         clr r19
282         mov r18, xREADLEN
283         movw r30, MEM_0
284         icall
285         movw r24, ADDR_2
286         movw r22, ADDR_0
287         clr r21
288         ldi r20, 6
289         rcall print_aligned     
290         clr r25
291         ldi r24, ':'
292         call cli_putc
293         clr r25
294         ldi r24, ' '
295         call cli_putc
296         movw r24, r28
297         clr r23
298         mov r22, xREADLEN
299         call cli_hexdump2
300         ldi TMP, DUMP_WIDTH
301         sub TMP, xREADLEN
302         tst TMP
303         breq 5f
304 4:
305         clr r25
306         ldi r24, ' '
307         call cli_putc
308         clr r25
309         ldi r24, ' '
310         call cli_putc
311         clr r25
312         ldi r24, ' '
313         call cli_putc
314         dec TMP
315         brne 4b
316 5:
317         clr r25
318         ldi r24, '\t'
319         call cli_putc
320         movw r24, r28
321         clr r23
322         mov r22, xREADLEN
323         rcall dump_chars
324         add ADDR_0, xREADLEN
325         adc ADDR_1, r1
326         adc ADDR_2, r1
327         adc ADDR_3, r1
328         sub SIZE_0, xREADLEN
329         sbc SIZE_1, r1
330         sbc SIZE_2, r1
331         sbc SIZE_3, r1
332         clr r25
333         ldi r24, '\r'
334         call cli_putc
335         clr r25
336         ldi r24, '\n'
337         call cli_putc
338         rjmp 1b
339 90:     
340         stack_free 2+DUMP_WIDTH
341         
342         pop_range 28,29
343         pop_range 4, 17
344         ret
345          
346 dumping:         
347 .asciz "\r\ndumping "
348 bytesof:
349 .asciz " bytes of "
350 beginning:
351 .asciz ", beginnig at 0x"
352 suffix:
353 .asciz ":\r\n"
354 .byte 0
355
356 /******************************************************************************/
357 /* void pgm_read_block(void *buffer, uint32_t addr, uint8_t length)
358  *   param buffer:  r24:r25
359  *   param addr:    r20:r23
360  *   param length:  r18
361  */
362 .global pgm_read_block
363 pgm_read_block:
364 #if RAMEND<0x10000
365         movw r26, r24
366         movw r30, r20
367         tst r18
368         breq 3f
369 1:
370         lpm r20, Z+
371         st X+, r20
372         dec r18
373         brne 1b
374 3:      
375         ret
376 #else
377         movw r26, r24
378         movw r30, r20
379         out RAMPZ, r22
380         tst r18
381         breq 3f
382 1:
383         elpm r20, Z+
384         st X+, r20
385         dec r18
386         brne 1b
387 3:      
388         ret
389
390 #endif  
391         
392 /******************************************************************************/
393 /* void ram_read_block(void *buffer, uint32_t addr, uint8_t length)
394  *   param buffer:  r24:r25
395  *   param addr:    r20:r23
396  *   param length:  r18
397  */
398 .global ram_read_block
399 ram_read_block:
400         movw r26, r24
401         movw r30, r20
402         tst r18
403         breq 3f
404 1:
405         ld r20, Z+
406         st X+, r20
407         dec r18
408         brne 1b
409 3:      
410         ret
411
412 /******************************************************************************/
413 /* void ee_read_block(void *buffer, uint32_t addr, uint8_t length)
414  *   param buffer:  r24:r25
415  *   param addr:    r20:r23
416  *   param length:  r18
417  */
418 #ifdef EEWE
419 # define EEPE EEWE
420 #endif
421
422 .global ee_read_block
423 ee_read_block:
424         movw r26, r24
425         movw r30, r20
426         tst r18
427         breq 3f
428 1:
429         sbic _SFR_IO_ADDR(EECR), EEPE
430         rjmp 1b
431         out _SFR_IO_ADDR(EEARH), r31
432         out _SFR_IO_ADDR(EEARL), r30
433         sbi _SFR_IO_ADDR(EECR), EERE
434         adiw r30, 1
435         in r20, _SFR_IO_ADDR(EEDR)
436         st X+, r20
437         dec r18
438         brne 1b
439 3:      
440         ret