diff --git a/avr-asm-macros.S b/avr-asm-macros.S new file mode 100644 index 0000000..2acb4a1 --- /dev/null +++ b/avr-asm-macros.S @@ -0,0 +1,90 @@ +/* avr-asm-macros.S */ +/* + This file is part of the Crypto-avr-lib/microcrypt-lib. + Copyright (C) 2008 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 . +*/ + +/* + * File: avr-asm-macros.S + * Author: Daniel Otte + * Date: 2008-08-13 + * License: GPLv3 or later + * Description: some macros which are quite usefull + * + */ + +#include + +/******************************************************************************* +* MACRO SECTION * +*******************************************************************************/ + +.macro push_ p1:req, p2:vararg + push \p1 +.ifnb \p2 + push_ \p2 +.endif +.endm + +.macro pop_ p1:req, p2:vararg + pop \p1 +.ifnb \p2 + pop_ \p2 +.endif +.endm + +.macro push_range from:req, to:req + push \from +.if \to-\from + push_range "(\from+1)",\to +.endif +.endm + +.macro pop_range from:req, to:req + pop \to +.if \to-\from + pop_range \from,"(\to-1)" +.endif +.endm + +.macro stack_alloc size:req, reg1=r30, reg2=r31 + in r0, _SFR_IO_ADDR(SREG) + in \reg1, _SFR_IO_ADDR(SPL) + in \reg2, _SFR_IO_ADDR(SPH) + sbiw \reg1, \size + cli + out _SFR_IO_ADDR(SPH), \reg2 + out _SFR_IO_ADDR(SPL), \reg1 + out _SFR_IO_ADDR(SREG), r0 +.endm + +.macro stack_free size:req, reg1=r30, reg2=r31 + in r0, _SFR_IO_ADDR(SREG) + in \reg1, _SFR_IO_ADDR(SPL) + in \reg2, _SFR_IO_ADDR(SPH) + adiw \reg1, \size + cli + out _SFR_IO_ADDR(SPH), \reg2 + out _SFR_IO_ADDR(SPL), \reg1 + out _SFR_IO_ADDR(SREG), r0 +.endm + +/******************************************************************************* +* END of MACRO SECTION * +*******************************************************************************/ + + + diff --git a/test_src/cli.c b/test_src/cli.c index f01547d..e8ed063 100644 --- a/test_src/cli.c +++ b/test_src/cli.c @@ -75,18 +75,13 @@ void cli_auto_help_P(PGM_P dbzstr){ #endif int16_t execcommand_d0_P(const char* str, PGM_P v, void(*fpt[])(void) ){ - uint8_t i=0; - PGM_P commands=v; - while(pgm_read_byte(v)){ - if(!strcmp_P(str, v)){ - (fpt[i])(); - return i; - } - while(pgm_read_byte(v++)) /* go to the next string */ - ; - ++i; + int16_t i=0; + i=findstring_d0_P(str, v); + if(i!=-1){ + if(fpt[i]) + fpt[i](); } - cli_auto_help_P(commands); + cli_auto_help_P(v); return -1; }