412 lines
6.8 KiB
ArmAsm
412 lines
6.8 KiB
ArmAsm
/* cli-core.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"
|
|
|
|
#define CMDLIST_ENTRY_SIZE 8
|
|
|
|
/******************************************************************************/
|
|
/* uint16_t max_cmd_length(PGM_VOID_P cmdlist){
|
|
uint16_t t,ret=0;
|
|
char *str;
|
|
for(;;){
|
|
str = (char*)pgm_read_word(cmdlist);
|
|
cmdlist = (uint8_t*)cmdlist + CMDLIST_ENTRY_SIZE;
|
|
if(str==NULL)
|
|
return ret;
|
|
t = strlen_P(str);
|
|
if(t>ret)
|
|
ret=t;
|
|
}
|
|
}
|
|
* param cmdlist: r24:r25
|
|
*/
|
|
TMP_CNT_0 = 26
|
|
TMP_CNT_1 = 27
|
|
|
|
.global max_cmd_length
|
|
max_cmd_length:
|
|
movw r30, r24
|
|
clr r24
|
|
clr r25
|
|
1:
|
|
lpm r26, Z+
|
|
lpm r27, Z+
|
|
movw r20, r30
|
|
adiw r26, 0
|
|
brne 3f
|
|
ret
|
|
3:
|
|
movw r30, r26
|
|
clr TMP_CNT_0
|
|
clr TMP_CNT_1
|
|
4:
|
|
lpm r1, Z+
|
|
adiw TMP_CNT_0, 1
|
|
tst r1
|
|
brne 4b
|
|
sbiw TMP_CNT_0, 1
|
|
movw r30, r20
|
|
adiw r30, CMDLIST_ENTRY_SIZE-2
|
|
cp r24, TMP_CNT_0
|
|
cpc r25, TMP_CNT_1
|
|
brge 1b
|
|
movw r24, TMP_CNT_0
|
|
rjmp 1b
|
|
|
|
/******************************************************************************/
|
|
.global echo_ctrl
|
|
echo_ctrl:
|
|
call strstrip
|
|
tst r24
|
|
brne 3f
|
|
tst r25
|
|
breq print_echo_status
|
|
3:
|
|
call strlwr
|
|
movw r26, r24
|
|
ld r20, X+
|
|
tst r20
|
|
breq print_echo_status
|
|
cpi r20, '1'
|
|
breq exit_1
|
|
cpi r20, '0'
|
|
breq exit_0
|
|
cpi r20, 't'
|
|
breq exit_1
|
|
cpi r20, 'f'
|
|
breq exit_0
|
|
ld r20, X+
|
|
cpi r20, 'n'
|
|
breq exit_1
|
|
cpi r20, 'f'
|
|
breq exit_0
|
|
ret
|
|
exit_1:
|
|
ldi r20, 1
|
|
rjmp exit
|
|
exit_0:
|
|
ldi r20, 0
|
|
exit:
|
|
sts cli_echo, r20
|
|
ret
|
|
print_echo_status:
|
|
ldi r24, lo8(pecho)
|
|
ldi r25, hi8(pecho)
|
|
rcall cli_putstr_P
|
|
lds r20, cli_echo
|
|
tst r20
|
|
breq 3f
|
|
clr r25
|
|
ldi r24, 'n'
|
|
rcall cli_putc
|
|
rjmp 4f
|
|
3: clr r25
|
|
ldi r24, 'f'
|
|
rcall cli_putc
|
|
clr r25
|
|
ldi r24, 'f'
|
|
rcall cli_putc
|
|
4: clr r25
|
|
ldi r24, '\r'
|
|
rcall cli_putc
|
|
clr r25
|
|
ldi r24, '\n'
|
|
rcall cli_putc
|
|
ret
|
|
pecho:
|
|
.asciz "\r\necho is o"
|
|
|
|
/******************************************************************************/
|
|
/* int8_t search_and_call(char *cmd, uint16_t maxcmdlength, PGM_VOID_P cmdlist)
|
|
* param cmd: r24:r25
|
|
* param maxcmdlength: r22:r23
|
|
* param cmdlist: r20:r21
|
|
*/
|
|
LEN_0 = 14
|
|
LEN_1 = 15
|
|
CMD_0 = 16
|
|
CMD_1 = 17
|
|
|
|
snc_auto_help:
|
|
movw r24, r22
|
|
movw r22, r20
|
|
rcall cli_auto_help
|
|
snc_return_1:
|
|
ldi r24, 1
|
|
rjmp snc_return
|
|
snc_return_2:
|
|
ldi r24, 2
|
|
snc_return:
|
|
clr r25
|
|
ret
|
|
|
|
.global search_and_call
|
|
search_and_call:
|
|
adiw r24, 0
|
|
breq snc_return_1
|
|
1: movw r26, r24
|
|
ld r18, X+
|
|
cpi r18, 0
|
|
breq snc_return_1
|
|
cpi r18, '#'
|
|
breq snc_return_1
|
|
cpi r18, '?'
|
|
breq 2f
|
|
cpi r18, 'h'
|
|
brne 1f
|
|
ld r18, X+
|
|
cpi r18, 'e'
|
|
brne 1f
|
|
ld r18, X+
|
|
cpi r18, 'l'
|
|
brne 1f
|
|
ld r18, X+
|
|
cpi r18, 'p'
|
|
brne 1f
|
|
ld r18, X+
|
|
tst r18
|
|
brne 1f
|
|
2: rjmp snc_auto_help
|
|
1:
|
|
push r28
|
|
push r29
|
|
push CMD_0
|
|
push CMD_1
|
|
push LEN_0
|
|
push LEN_1
|
|
movw CMD_0, r24
|
|
movw r28, r20
|
|
rcall firstword_length
|
|
movw LEN_0, r24
|
|
movw r26, CMD_0
|
|
add r26, LEN_0
|
|
adc r27, LEN_1
|
|
st X, r1
|
|
movw r24, CMD_0
|
|
ldi r22, lo8(exit_str)
|
|
ldi r23, hi8(exit_str)
|
|
call strcmp_P
|
|
adiw r24, 0
|
|
breq snc_return_0
|
|
1:
|
|
movw r30, r28
|
|
lpm r24, Z+
|
|
lpm r25, Z+
|
|
adiw r24, 0
|
|
brne 3f
|
|
ldi r24, lo8(nocommand_str)
|
|
ldi r25, hi8(nocommand_str)
|
|
rcall cli_putstr_P
|
|
ldi r24, 1
|
|
rjmp 5f
|
|
3: movw r22, r24
|
|
movw r24, CMD_0
|
|
call strcmp_P
|
|
adiw r24, 0
|
|
breq snc_found
|
|
adiw r28, CMDLIST_ENTRY_SIZE
|
|
rjmp 1b
|
|
snc_found:
|
|
movw r24, CMD_0
|
|
add r24, LEN_0
|
|
adc r25, LEN_1
|
|
adiw r24, 1
|
|
movw r30, r28
|
|
adiw r30, 4
|
|
lpm r22, Z+
|
|
lpm r23, Z+
|
|
movw r30, r22
|
|
adiw r30, 0
|
|
breq 4f ;snc_return_2
|
|
icall
|
|
ldi r24, 1
|
|
rjmp 5f
|
|
4: ldi r24, 2
|
|
snc_return_0:
|
|
clr r24
|
|
5: pop LEN_1
|
|
pop LEN_0
|
|
pop CMD_1
|
|
pop CMD_0
|
|
pop r29
|
|
pop r28
|
|
rjmp snc_return
|
|
|
|
exit_str:
|
|
.asciz "exit"
|
|
help_str:
|
|
.asciz "help"
|
|
nocommand_str:
|
|
.asciz "\r\ncommand not found, try 'help'"
|
|
|
|
/******************************************************************************/
|
|
/* void cli_option_listing(char *buffer, PGM_VOID_P cmdlist)
|
|
* param buffer: r24:r25
|
|
* param cmdlist: r22:r23
|
|
*/
|
|
ITM_0 = 12
|
|
ITM_1 = 13
|
|
CMD_0 = 14
|
|
CMD_1 = 15
|
|
LEN_0 = 16
|
|
LEN_1 = 17
|
|
LST_0 = 28
|
|
LST_1 = 29
|
|
.global cli_option_listing
|
|
cli_option_listing:
|
|
push_range 12, 17
|
|
push_range 28, 29
|
|
movw CMD_0, r24
|
|
movw LST_0, r22
|
|
call strlen
|
|
sbiw r24, 1
|
|
movw LEN_0, r24
|
|
brpl 1f
|
|
clr LEN_0
|
|
clr LEN_1
|
|
1:
|
|
movw r30, LST_0
|
|
lpm r24, Z+
|
|
lpm r25, Z+
|
|
movw ITM_0, r24
|
|
adiw r24, 0
|
|
breq 99f
|
|
movw r22, r24
|
|
movw r24, CMD_0
|
|
movw r20, LEN_0
|
|
adiw r28, CMDLIST_ENTRY_SIZE
|
|
call strncmp_P
|
|
adiw r24, 0
|
|
brne 1b
|
|
ldi r24, lo8(itemprefix_str)
|
|
ldi r25, hi8(itemprefix_str)
|
|
rcall cli_putstr_P
|
|
movw r24, ITM_0
|
|
rcall cli_putstr_P
|
|
rjmp 1b
|
|
99:
|
|
ldi r24, lo8(prompt_str)
|
|
ldi r25, hi8(prompt_str)
|
|
rcall cli_putstr_P
|
|
movw r24, CMD_0
|
|
rcall cli_putstr
|
|
pop_range 28, 29
|
|
pop_range 12, 17
|
|
ret
|
|
|
|
prompt_str:
|
|
.asciz "\r\n>"
|
|
itemprefix_str:
|
|
.asciz "\r\n "
|
|
|
|
/******************************************************************************/
|
|
/* void cli_auto_help(uint16_t maxcmdlength, PGM_VOID_P cmdlist)
|
|
* param maxcmdlength: r24:r25
|
|
* param cmdlist: r22:r23
|
|
*/
|
|
|
|
TMP_0 = 14
|
|
TMP_1 = 15
|
|
LEN_0 = 16
|
|
LEN_1 = 17
|
|
LST_0 = 28
|
|
LST_1 = 29
|
|
cli_auto_help:
|
|
push_range 16, 17
|
|
push_range 28, 29
|
|
movw LEN_0, r24
|
|
movw r28, r22
|
|
ldi r24, lo8(ahelphead_str)
|
|
ldi r25, hi8(ahelphead_str)
|
|
rcall cli_putstr_P
|
|
1:
|
|
movw r30, r28
|
|
lpm r24, Z+
|
|
lpm r25, Z+
|
|
movw r28, r30
|
|
adiw r24, 0
|
|
breq 99f
|
|
movw TMP_0, r24
|
|
rcall cli_putstr_P
|
|
movw r24, TMP_0
|
|
call strlen_PF
|
|
movw TMP_0, LEN_0
|
|
sub TMP_0, r24
|
|
sbc TMP_1, r25
|
|
breq 4f
|
|
2: ldi r24, ' '
|
|
clr r25
|
|
rcall cli_putc
|
|
dec TMP_0
|
|
brne 2b
|
|
4: ldi r24, lo8(sep_str)
|
|
ldi r25, hi8(sep_str)
|
|
rcall cli_putstr_P
|
|
ldi r22, lo8(none_str)
|
|
ldi r23, hi8(none_str)
|
|
movw r30, r28
|
|
lpm r24, Z+
|
|
lpm r25, Z+
|
|
movw r28, r30
|
|
adiw r24, 0
|
|
breq 5f
|
|
ldi r22, lo8(yes_str)
|
|
ldi r23, hi8(yes_str)
|
|
5: movw r24, r22
|
|
rcall cli_putstr_P
|
|
ldi r24, lo8(sep2_str)
|
|
ldi r25, hi8(sep2_str)
|
|
rcall cli_putstr_P
|
|
movw r30, r28
|
|
adiw r30, 1
|
|
lpm r24, Z
|
|
rcall cli_hexdump_byte
|
|
movw r30, r28
|
|
lpm r24, Z
|
|
rcall cli_hexdump_byte
|
|
ldi r24, '\r'
|
|
clr r25
|
|
rcall cli_putc
|
|
ldi r24, '\n'
|
|
clr r25
|
|
rcall cli_putc
|
|
adiw r28, CMDLIST_ENTRY_SIZE-4
|
|
rjmp 1b
|
|
99:
|
|
pop_range 28, 29
|
|
pop_range 14, 17
|
|
ori r24, 1
|
|
ret
|
|
ahelphead_str:
|
|
.asciz "\r\n[auto help] available commands:\r\n <command> - <params> - <address>\r\n"
|
|
sep_str:
|
|
.asciz " - "
|
|
none_str:
|
|
.asciz "none"
|
|
yes_str:
|
|
.asciz "yes "
|
|
sep2_str:
|
|
.asciz" \t - 0x"
|
|
.byte 0
|
|
|
|
|
|
|
|
|