Files
aqhomecontrol/avr/common/walktable.asm
2026-08-07 00:42:45 +02:00

83 lines
1.8 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_WALKTABLE_ASM
#define AQH_AVR_COMMON_WALKTABLE_ASM
; ***************************************************************************
; code
.cseg
; ---------------------------------------------------------------------------
; @routine WalkTable
;
; Walks a given table and calls every routine whose table entry
; holds a value equal to the given one.
;
; The loop uses r16-r19 and Z.
;
; @param Z byte pointer to table (for LPM!)
; @param r16 value
; @clobbers (any)
WalkTable:
mov r22, r16
WalkTable_loop:
lpm r16, Z+
adiw zh:zl, 1
lpm r18, Z+
lpm r19, Z+
mov r17, r18 ; routine==0?
or r17, r19
breq WalkTable_loopEnd ; yes, end of table
tst r16 ; timer==0?
breq WalkTable_loopCall ; yes, match any value
cp r22, r16
brne WalkTable_loopNext ; skip
WalkTable_loopCall:
push r22
push zl
push zh
push yl
push yh
rcall walkTableCallR19R18
pop yh
pop yl
pop zh
pop zl
pop r22
WalkTable_loopNext:
rjmp WalkTable_loop
WalkTable_loopEnd:
ret
; @end
; ---------------------------------------------------------------------------
; @routine walkTableCallR19R18
; Call route at address r19:r18
walkTableCallR19R18:
push r18
push r19
ret
; @end
#endif