]> git.cryptolib.org Git - avr-crypto-lib.git/blobdiff - test_src/cli-core.S
backporting uart_i and cli
[avr-crypto-lib.git] / test_src / cli-core.S
diff --git a/test_src/cli-core.S b/test_src/cli-core.S
new file mode 100644 (file)
index 0000000..f074b04
--- /dev/null
@@ -0,0 +1,406 @@
+/* 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
+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_P
+       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)
+       ldi r22, lo8(none_str)
+       ldi r23, hi8(none_str)
+       rcall cli_putstr_P
+       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
+       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
+
+
+
+