]> git.cryptolib.org Git - avr-crypto-lib.git/blobdiff - test_src/cli-hexdump.S
backporting uart_i and cli
[avr-crypto-lib.git] / test_src / cli-hexdump.S
diff --git a/test_src/cli-hexdump.S b/test_src/cli-hexdump.S
new file mode 100644 (file)
index 0000000..0a34984
--- /dev/null
@@ -0,0 +1,205 @@
+/* cli-hexdump.S */
+/*
+    This file is part of the AVR-Huffman.
+    Copyright (C) 2009  Daniel Otte (daniel.otte@rub.de)
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "avr-asm-macros.S"
+/******************************************************************************/
+/* cli_hexdump_byte 
+ *   param data:   r24
+ */
+.global cli_hexdump_byte
+cli_hexdump_byte:
+       push r24
+       swap r24
+       andi r24, 0x0f
+       ldi r30, lo8(hexdigit_tab_P)
+       ldi r31, hi8(hexdigit_tab_P)
+       add r30, r24
+       adc r31, r1
+       clr r25
+       lpm r24, Z
+       rcall cli_putc
+       pop r24
+       andi r24, 0x0f
+       ldi r30, lo8(hexdigit_tab_P)
+       ldi r31, hi8(hexdigit_tab_P)
+       add r30, r24
+       adc r31, r1
+       clr r25
+       lpm r24, Z
+       rcall cli_putc
+       ret     
+
+/******************************************************************************/
+/* cli_hexdump 
+ *   param data:   r24:r25
+ *   param length: r22:r23
+ */
+.global cli_hexdump
+cli_hexdump:
+       push r28
+       push r29
+       push r16
+       push r17
+       movw r28, r24
+       movw r16, r22
+       movw r26, r22
+       adiw r26, 0
+       breq hexdump_exit
+2:
+       ld r24, Y+
+       rcall cli_hexdump_byte  
+       subi r16, 1
+       sbc  r17, r1
+       brne 2b
+hexdump_exit:  
+       pop r17
+       pop r16
+       pop r29
+       pop r28
+       ret
+       
+/******************************************************************************/
+/* cli_hexdump_rev 
+ *   param data:   r24:r25
+ *   param length: r22:r23
+ */
+.global cli_hexdump_rev
+cli_hexdump_rev:
+       push r28
+       push r29
+       push r16
+       push r17
+       movw r28, r24
+       movw r16, r22
+       add r28, r22
+       adc r29, r23
+       movw r26, r22
+       adiw r26, 0
+1:
+       breq hexdump_exit
+       ld r24, -Y
+       rcall cli_hexdump_byte  
+       subi r16, 1
+       sbci r17, 0
+       rjmp 1b
+       
+/******************************************************************************/
+/* cli_hexdump2
+ *   param data:   r24:r25
+ *   param length: r22:r23
+ */
+.global cli_hexdump2
+cli_hexdump2:
+       push r28
+       push r29
+       push r16
+       push r17
+       movw r28, r24
+       movw r16, r22
+       movw r26, r16
+       adiw r26, 0
+1:     
+       breq hexdump_exit
+       ld r24, Y+
+       rcall cli_hexdump_byte
+       clr r25
+       ldi r24,' '
+       rcall cli_putc
+       
+       subi r16, 1
+       sbci r17, 0
+       rjmp 1b
+
+/******************************************************************************/
+/* void cli_hexdump_block(const void* data, uint16_t length, uint8_t indent, uint8_t width)
+ *   param data:     r24:r25
+ *   param length:   r22:r23
+ *   param indent:   r20
+ *   param width:    r18
+ */
+WIDTH  =  2
+INDENT =  3
+DATA_0 = 28
+DATA_1 = 29
+LENG_0 = 16
+LENG_1 = 17
+
+.global cli_hexdump_block
+cli_hexdump_block:
+       tst r22
+       brne 1f
+       tst r23
+       brne 1f
+       ret
+1:
+       push WIDTH
+       push INDENT
+       push DATA_0
+       push DATA_1
+       push LENG_0
+       push LENG_1
+       push r4
+       mov WIDTH, r18
+       mov INDENT, r20
+       movw DATA_0, r24
+       movw LENG_0, r22 
+2:
+       clr r25
+       ldi r24, '\r'
+       rcall cli_putc
+       clr r25
+       ldi r24, '\n'
+       rcall cli_putc
+       mov r4, INDENT
+       tst r4
+       breq 4f
+3:     clr r25
+       ldi r24, ' '
+       rcall cli_putc
+       dec r4
+       brne 3b
+4:
+       movw r24, DATA_0
+       clr r23
+       mov r22, WIDTH
+       tst LENG_1
+       brne 7f
+       cp WIDTH, LENG_0
+       breq 6f
+       brmi 7f
+       mov r22, LENG_0
+6:     inc r4  
+7:     
+       rcall cli_hexdump2
+       add DATA_0, WIDTH
+       adc DATA_1, r1
+       sub LENG_0, WIDTH
+       sbc LENG_0, r1
+       tst r4
+       breq 2b 
+       pop r4
+       pop LENG_1
+       pop LENG_0
+       pop DATA_1
+       pop DATA_0
+       pop INDENT
+       pop WIDTH
+       ret
+       
+