196 lines
4.2 KiB
NASM
196 lines
4.2 KiB
NASM
; ***************************************************************************
|
|
; 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_COMMON_UTILS_ASM
|
|
#define AQH_AVR_COMMON_UTILS_ASM
|
|
|
|
|
|
|
|
; ***************************************************************************
|
|
; code
|
|
|
|
|
|
.cseg
|
|
|
|
UTILS_BEGIN:
|
|
|
|
|
|
utilsDateString: .db "%YEAR%-%MONTH%-%DAY%-%HOUR%:%MINUTE%", 0, 0
|
|
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine Utils_FillSram @global
|
|
;
|
|
; @return X points directly behind filled memory
|
|
; @param X pointer to SRAM to fill
|
|
; @param r16 value to fill the SRAM with
|
|
; @param r17 size of area to fill
|
|
; @clobbers r17, X
|
|
|
|
Utils_FillSram:
|
|
tst r17
|
|
breq Utils_FillSram_end
|
|
|
|
Utils_FillSram_loop:
|
|
st x+, r16
|
|
dec r17
|
|
brne Utils_FillSram_loop
|
|
Utils_FillSram_end:
|
|
ret
|
|
; @end
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; Increment a 32 bit counter at the address given by X.
|
|
; IN:
|
|
; - X: Address of the 4 byte counter (1. byte is LSB)
|
|
; OUT:
|
|
; - nothing
|
|
; MODIFIED REGISTERS: r18, r19, r20, r21, 22
|
|
|
|
Utils_IncrementCounter32:
|
|
ld r18, x+
|
|
ld r19, x+
|
|
ld r20, x+
|
|
ld r21, x
|
|
ldi r22, 1
|
|
add r18, r22
|
|
clr r22 ; doesn't affect carry flag
|
|
adc r19, r22
|
|
adc r20, r22
|
|
adc r21, r22
|
|
st x, r21
|
|
st -x, r20
|
|
st -x, r19
|
|
st -x, r18
|
|
ret
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; Increment a 16 bit counter at the address given by X.
|
|
; IN:
|
|
; - X: Address of the 2 byte counter (1. byte is LSB)
|
|
; OUT:
|
|
; - nothing
|
|
; MODIFIED REGISTERS: r18, r19, 22
|
|
|
|
Utils_IncrementCounter16:
|
|
ld r18, x+
|
|
ld r19, x
|
|
ldi r22, 1
|
|
add r18, r22
|
|
clr r22 ; doesn't affect carry flag
|
|
adc r19, r22
|
|
st x, r19
|
|
st -x, r18
|
|
ret
|
|
; @end
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine Utils_ReadUid
|
|
|
|
; Read UID from EEPROM.
|
|
;
|
|
; @return r21:r20:r19:r18 UID
|
|
; @clobbers R16, X
|
|
|
|
Utils_ReadUid:
|
|
ldi xl, LOW(EEPROM_OFFS_UUID)
|
|
ldi xh, HIGH(EEPROM_OFFS_UUID)
|
|
rcall Eeprom_ReadByte ; r16=byte read (none)
|
|
brcc Utils_ReadUid_ret
|
|
mov r18, r16
|
|
adiw xh:xl, 1
|
|
|
|
rcall Eeprom_ReadByte ; r16=byte read (none)
|
|
brcc Utils_ReadUid_ret
|
|
mov r19, r16
|
|
adiw xh:xl, 1
|
|
|
|
rcall Eeprom_ReadByte ; r16=byte read (none)
|
|
brcc Utils_ReadUid_ret
|
|
mov r20, r16
|
|
adiw xh:xl, 1
|
|
|
|
rcall Eeprom_ReadByte ; r16=byte read (none)
|
|
brcc Utils_ReadUid_ret
|
|
mov r21, r16
|
|
|
|
Utils_ReadUid_ret:
|
|
ret
|
|
; @end
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine Utils_SetupUid @global
|
|
;
|
|
; Reads UID from EEPROM. If not set generate a new one and store it in EEPROM.
|
|
;
|
|
; @return CFLAG set if new generated, cleared if there already was one.
|
|
; @clobbers R16, R18, R19, R20, R21, X (R17)
|
|
|
|
Utils_SetupUid:
|
|
rcall Utils_ReadUid ; (R16, X)
|
|
cp r18, r19 ; all the same?
|
|
brne Utils_SetupUid_uidOkay ; different, jmp
|
|
cp r18, r20
|
|
brne Utils_SetupUid_uidOkay ; different, jmp
|
|
cp r18, r21
|
|
brne Utils_SetupUid_uidOkay ; different, jmp
|
|
|
|
ldi xl, LOW(EEPROM_OFFS_UUID) ; all the same, generate new uid
|
|
ldi xh, HIGH(EEPROM_OFFS_UUID)
|
|
rcall RAND_PseudoRandom ; byte 0 (R16, R17, R18, R19)
|
|
inc r16
|
|
rcall Eeprom_WriteByteIfChanged ; (r17)
|
|
brcc Utils_SetupUid_ret
|
|
adiw xh:xl, 1
|
|
|
|
rcall RAND_PseudoRandom ; byte 1
|
|
rcall Eeprom_WriteByteIfChanged ; (r17)
|
|
brcc Utils_SetupUid_ret
|
|
adiw xh:xl, 1
|
|
|
|
rcall RAND_PseudoRandom ; byte 2
|
|
rcall Eeprom_WriteByteIfChanged ; (r17)
|
|
brcc Utils_SetupUid_ret
|
|
adiw xh:xl, 1
|
|
|
|
rcall RAND_PseudoRandom ; byte 3
|
|
rcall Eeprom_WriteByteIfChanged ; (r17)
|
|
brcc Utils_SetupUid_ret
|
|
|
|
rcall RAND_UpdateSeedInEeprom ; (R16, R17, R18, R19, X)
|
|
|
|
Utils_SetupUid_uidOkay:
|
|
sec
|
|
Utils_SetupUid_ret:
|
|
ret
|
|
; @end
|
|
|
|
|
|
|
|
|
|
|
|
UTILS_END:
|
|
.equ MODULE_SIZE_UTILS = UTILS_END-UTILS_BEGIN
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|