diff --git a/avr/apps/network/main.asm b/avr/apps/network/main.asm index 0e159c3..2f3c3e3 100644 --- a/avr/apps/network/main.asm +++ b/avr/apps/network/main.asm @@ -488,14 +488,9 @@ appNetworkResetState_setRangeEnd: ; @clobbers X appNetworkGetAddressFromEeprom: - push r15 - in r15, SREG - cli - ldi xl, LOW(EEPROM_OFFS_COMADDR) - ldi xh, HIGH(EEPROM_OFFS_COMADDR) - bigcall Utils_ReadEepromIncr ; (R16) - out SREG, r15 - pop r15 + ldi xl, LOW(EEPROM_OFFS_COMADDR) + ldi xh, HIGH(EEPROM_OFFS_COMADDR) + rcall Eeprom_ReadByte ; r16=addr (none) ret ; @end diff --git a/avr/common/random.asm b/avr/common/random.asm new file mode 100644 index 0000000..25fd917 --- /dev/null +++ b/avr/common/random.asm @@ -0,0 +1,226 @@ +; *************************************************************************** +; 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 AQH_AVR_DEVICES_COMMON_RANDOM_ASM +#define AQH_AVR_DEVICES_COMMON_RANDOM_ASM + + +; *************************************************************************** +; data + + +.dseg + +randSeed: .byte 2 + + + + +; *************************************************************************** +; code + + +.cseg + + +; --------------------------------------------------------------------------- +; @routine RAND_PseudoRandom +; +; Generate a pseudo random number. +; (see https://www.avrfreaks.net/s/topic/a5C3l000000URNfEAO/t119045?comment=P-1021038) +; +; @return R16 8 bit pseudo random number +; @clobbers R16, R17, R18, R19 + +RAND_PseudoRandom: + lds r16, randSeed + lds r17, randSeed+1 + ldi r18, 0x9c + ldi r19, 8 +RAND_PseudoRandom_step: + lsr r17 + ror r16 + brcc RAND_PseudoRandom_nomask + eor r17, r18 +RAND_PseudoRandom_nomask: + dec r19 + brne RAND_PseudoRandom_step + sts randSeed, r16 + sts randSeed+1, r17 + ret ; result in r16 +; @end + + + +; --------------------------------------------------------------------------- +; @routine RAND_SetupSeed @global +; +; @clobbers R16, R18, R19, R20, R21, R24, R25, X, Z + +RAND_SetupSeed: + rcall RAND_ReadSeed ; R18:R19=seed (r16, X) + mov r20, r18 + mov r21, r19 + + ; default initial seed + ldi r18, 0xe1 + ldi r19, 0xac + + ; work stored seed into it + mov r16, r20 + rcall randWorkByteIntoSeed ; (none) + mov r16, r21 + rcall randWorkByteIntoSeed ; (none) + + ; work date string into seed + ldi zl, LOW(utilsDateString*2) + ldi zh, HIGH(utilsDateString*2) + rcall randWorkProgStringIntoSeed ; (R16, Z) + + ; work sram content into seed + rcall randWorkSramContentIntoSeed ; (R16, R24, R25, X) + + ; store seed in EEPROM + rcall RAND_WriteSeed ; (R16, R17, X) + ret +; @end + + + +; --------------------------------------------------------------------------- +; @routine RAND_ReadSeed +; +; Read seed from EEPROM. +; +; @return R18:R19 seed read +; @clobbers R16, X + +RAND_ReadSeed: + ldi xl, LOW(EEPROM_OFFS_SEED) + ldi xh, HIGH(EEPROM_OFFS_SEED) + rcall Eeprom_ReadByte ; (none) + brcc RAND_ReadSeed_ret + mov r18, r16 + adiw xh:xl, 1 + rcall Eeprom_ReadByte ; (none) + mov r19, r16 +RAND_ReadSeed_ret: + ret +; @end + + + +; --------------------------------------------------------------------------- +; @routine RAND_WriteSeed +; +; Write seed from EEPROM. +; +; @param R18:R19 seed +; @clobbers R16, R17, X + +RAND_WriteSeed: + ldi xl, LOW(EEPROM_OFFS_SEED) + ldi xh, HIGH(EEPROM_OFFS_SEED) + mov r16, r18 + rcall Eeprom_WriteByteIfChanged ; (r17) + brcc RAND_WriteSeed_ret + adiw xh:xl, 1 + mov r16, r19 + rcall Eeprom_WriteByteIfChanged ; (r17) +RAND_WriteSeed_ret: + ret +; @end + + + +; --------------------------------------------------------------------------- +; @routine RAND_UpdateSeedInEeprom +; +; @clobbers R18, R19, (R16, R17, X) + +RAND_UpdateSeedInEeprom: + lds r18, randSeed + lds r19, randSeed+1 + rcall RAND_WriteSeed ; (R16, R17, X) + ret +; @end + + + +; --------------------------------------------------------------------------- +; @routine randWorkProgStringIntoSeed +; +; @param Z pointer to string to work into seed +; @param R18 low byte of current seed +; @param R19 high byte of current seed +; @return R18 low byte of updated seed +; @return R19 high byte of updated seed +; @clobbers R16, Z + +randWorkProgStringIntoSeed: + lpm r16, Z+ + tst r16 + breq randWorkProgStringIntoSeed_done + rcall randWorkByteIntoSeed + rjmp randWorkProgStringIntoSeed +randWorkProgStringIntoSeed_done: + ret +; @end + + + +; --------------------------------------------------------------------------- +; @routine randWorkSramContentIntoSeed +; IN: +; @param Z pointer to string to work into seed +; @param R18 low byte of current seed +; @param R19 high byte of current seed +; @return R18 low byte of updated seed +; @return R19 high byte of updated seed +; @clobbers R16, R24, R25, X + +randWorkSramContentIntoSeed: + ldi xl, LOW(SRAM_START) + ldi xh, HIGH(SRAM_START) + ldi r24, LOW(RAMEND-SRAM_START) + ldi r25, HIGH(RAMEND-SRAM_START) +randWorkSramContentIntoSeed_loop: + ld r16, X+ + rcall randWorkByteIntoSeed + sbiw r25:r24, 1 + brne randWorkSramContentIntoSeed_loop + ret +; @end + + + +; --------------------------------------------------------------------------- +; @routine randWorkByteIntoSeed +; +; @param R16 byte to work into the seed +; @param R18 low byte of current seed +; @param R19 high byte of current seed +; @return R18 low byte of updated seed +; @return R19 high byte of updated seed + +randWorkByteIntoSeed: + eor r18, r16 + clc + sbrc r19, 7 + sec ; only executed if bit 7 is set in r19 + rol r18 + rol r19 + ret +; @end + + + + +#endif + diff --git a/avr/common/utils.asm b/avr/common/utils.asm index d8db6a8..d50ad0a 100644 --- a/avr/common/utils.asm +++ b/avr/common/utils.asm @@ -1,5 +1,5 @@ ; *************************************************************************** -; copyright : (C) 2023 by Martin Preuss +; copyright : (C) 2026 by Martin Preuss ; email : martin@libchipcard.de ; ; *************************************************************************** @@ -7,19 +7,8 @@ ; * Please see toplevel file COPYING of that project for license details. * ; *************************************************************************** - - - - -; *************************************************************************** -; data - - -.dseg - -utilsDataBegin: - utilsSeed: .byte 2 -utilsDataEnd: +#ifndef AQH_AVR_COMMON_UTILS_ASM +#define AQH_AVR_COMMON_UTILS_ASM @@ -37,153 +26,6 @@ utilsDateString: .db "%YEAR%-%MONTH%-%DAY%-%HOUR%:%MINUTE%", 0, 0 -; --------------------------------------------------------------------------- -; Utils_Init -; -; IN: -; OUT: -; - CFLAG: set if okay, clear on error -; USED: R16, R17, R18, R19, X, (R20, R21, R24, R25, X, Z) - -Utils_Init: - rcall utilsSetupSeed ; (R16, R18, R19, R20, R21, R24, R25, X, Z) - - ; preset SRAM data area - ldi xh, HIGH(utilsDataBegin) - ldi xl, LOW(utilsDataBegin) - clr r16 - ldi r17, (utilsDataEnd-utilsDataBegin) - rcall Utils_FillSram ; (r17, x) - - sts utilsSeed, r18 - sts utilsSeed+1, r19 - - sec - ret - - - -; --------------------------------------------------------------------------- -; setup seed -; -; IN: -; OUT: -; REGS: R16, R18, R19, R20, R21, R24, R25, X, Z - -utilsSetupSeed: - rcall Utils_ReadSeed - mov r20, r18 - mov r21, r19 - - ; default initial seed - ldi r18, 0xe1 - ldi r19, 0xac - - ; work stored seed into it - mov r16, r20 - rcall utilsWorkByteIntoSeed - mov r16, r21 - rcall utilsWorkByteIntoSeed - - ; work date string into seed - ldi zl, LOW(utilsDateString*2) - ldi zh, HIGH(utilsDateString*2) - rcall utilsWorkProgStringIntoSeed ; (R16, Z) - - ; work sram content into seed - rcall utilsWorkSramContentIntoSeed ; (R16, R24, R25, X) - - ; store seed in EEPROM - rcall Utils_WriteSeed ; (R16, R17, X) - ret - - - -; --------------------------------------------------------------------------- -; utilsWorkProgStringIntoSeed -; -; IN: -; - Z : pointer to string to work into seed -; - R18: low byte of current seed -; - R19: high byte of current seed -; OUT: -; - R18: low byte of updated seed -; - R19: high byte of updated seed -; USED: R16, Z - -utilsWorkProgStringIntoSeed: - lpm r16, Z+ - tst r16 - breq utilsWorkProgStringIntoSeed_done - rcall utilsWorkByteIntoSeed - rjmp utilsWorkProgStringIntoSeed -utilsWorkProgStringIntoSeed_done: - ret - - - -; --------------------------------------------------------------------------- -; utilsWorkSramContentIntoSeed -; IN: -; - Z : pointer to string to work into seed -; - R18: low byte of current seed -; - R19: high byte of current seed -; OUT: -; - R18: low byte of updated seed -; - R19: high byte of updated seed -; USED: R16, R24, R25, X - -utilsWorkSramContentIntoSeed: - ldi xl, LOW(SRAM_START) - ldi xh, HIGH(SRAM_START) - ldi r24, LOW(RAMEND-SRAM_START) - ldi r25, HIGH(RAMEND-SRAM_START) -utilsWorkSramContentIntoSeed_loop: - ld r16, X+ - rcall utilsWorkByteIntoSeed - sbiw r25:r24, 1 - brne utilsWorkSramContentIntoSeed_loop - ret - - - -; --------------------------------------------------------------------------- -; utilsWorkByteIntoSeed -; -; IN: -; - R16: byte to work into the seed -; - R18: low byte of current seed -; - R19: high byte of current seed -; OUT: -; - R18: low byte of updated seed -; - R19: high byte of updated seed -; USED: - -utilsWorkByteIntoSeed: - eor r18, r16 - clc - sbrc r19, 7 - sec ; only executed if bit 7 is set in r19 - rol r18 - rol r19 - ret - - -; --------------------------------------------------------------------------- -; Utils_Fini -; -; IN: -; OUT: -; - CFLAG: set if okay, clear on error -; USED: R16, R17, R18, X, Y - - -Utils_Fini: - sec - ret - - - ; --------------------------------------------------------------------------- ; @routine Utils_FillSram @global ; @@ -252,310 +94,92 @@ Utils_IncrementCounter16: st x, r19 st -x, r18 ret - - - - -; --------------------------------------------------------------------------- -; Utils_ReadEepromIncr -; -; Read a byte from EEPROM (see example in ATtiny24/44/84 manual p.19). -; -; IN: -; - X: EEPROM Address to read from -; OUT: -; - R16: byte read -; - X: EEPROM Address incremented -; MODIFIED REGISTERS: R16 - -Utils_ReadEepromIncr: -.ifdef EEPE - sbic EECR, EEPE ; wait for previous write to complete (if any) -.else - sbic EECR, EEWE ; wait for previous write to complete (if any) -.endif - rjmp Utils_ReadEepromIncr - out EEARH, xh ; set EEPROM address - out EEARL, xl - sbi EECR, EERE ; start EEPROM read by writing EERE - in r16, EEDR ; read data from data register - adiw xh:xl, 1 - ret +; @end ; --------------------------------------------------------------------------- -; Utils_WriteEepromIncr -; -; Write a byte to EEPROM (see example in ATtiny24/44/84 manual p.18). -; -; IN: -; - R16: byte to write -; - X: EEPROM Address to write to -; OUT: -; - X: EEPROM Address incremented -; MODIFIED REGISTERS: R17 +; @routine Utils_ReadUid -Utils_WriteEepromIncr: -.ifdef EEPE - sbic EECR, EEPE ; wait for previous write to complete (if any) -.else - sbic EECR, EEWE ; wait for previous write to complete (if any) -.endif - rjmp Utils_WriteEepromIncr -.ifdef EEPM1 - ldi r17, (0<