diff --git a/avr/common/0BUILD b/avr/common/0BUILD index 5247bd2..f9d5223 100644 --- a/avr/common/0BUILD +++ b/avr/common/0BUILD @@ -21,6 +21,7 @@ m_ringbuffer.asm m_ringbuffer_y.asm multiply.asm + multiply8.asm random.asm ressource.asm ringbuffer.asm diff --git a/avr/common/multiply8.asm b/avr/common/multiply8.asm new file mode 100644 index 0000000..ac788dd --- /dev/null +++ b/avr/common/multiply8.asm @@ -0,0 +1,55 @@ +; *************************************************************************** +; copyright : (C) 2026 by Martin Preuss +; email : martin@libchipcard.de +; +; *************************************************************************** +; * This file is part of the project "AqHome". * +; * Please see toplevel file COPYING of that project for license details. * +; *************************************************************************** + +#ifndef COMMON_MULTIPLY8_H +#define COMMON_MULTIPLY8_H + + +; --------------------------------------------------------------------------- +; @routine Utils_Mulu8x8_16 +; +; Multiplies two unsigned 8 bit values resulting in one 16 bit value. +; This is a rather simple but reasonable fast routine working just like you would +; when doing multiplications with pen and paper. +; +; R17:R16 = R18 * R19 +; +; TODO: adapt for signed values +; +; @param R18 8 bit value A +; @param R19 8 bit value B +; @return R17:R16 16 bit result +; @clobbers R19, R20, R21 + +Utils_Mulu8x8_16: + clr r17 + clr r16 + clr r20 + ldi r21, 8 ; 8 bit multiplicator +Utils_Mulu8x8_16_loop: + lsr r19 + brcc Utils_Mulu8x8_16_noadd ; current digit in B is 0, don't add shifted A to result + add r16, r18 + adc r17, r20 +Utils_Mulu8x8_16_noadd: + dec r21 + breq Utils_Mulu8x8_16_done + lsl r18 + rjmp Utils_Mulu8x8_16_loop +Utils_Mulu8x8_16_done: + clc + ret +; @end + + + + + +#endif ; COMMON_MULTIPLY8_H +