avr-crypto-lib/test_src/cli-hexdump.S

206 lines
3.6 KiB
ArmAsm

/* 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
sbci r17, 0
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