293 lines
7.7 KiB
NASM
293 lines
7.7 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_MODULES_TRIGGERACTOR_RECV_ASM
|
|
#define AQH_AVR_MODULES_TRIGGERACTOR_RECV_ASM
|
|
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine TCA_HandleMsg @global
|
|
;
|
|
; @param X pointer to msg received
|
|
; @param Y pointer to data in RAM
|
|
; @param R17 value id
|
|
; @param R19:R18 value
|
|
; @param R22 src addr
|
|
; @clobbers any, !X, !Y, !Z
|
|
|
|
TCA_HandleMsg:
|
|
push xl
|
|
push xh
|
|
mov xl, yl
|
|
mov xh, yh
|
|
adiw xh:xl, TCA_RAM_OFFS_GUARD_SOURCE
|
|
rcall tcaCheckGuardSource ; enable or disable actor, if matching msg
|
|
adiw xh:xl, TCA_SOURCE_SIZE
|
|
rcall tcaCheckTriggerSource ; trigger, if matching msg
|
|
adiw xh:xl, TCA_SOURCE_SIZE
|
|
rcall tcaCheckTriggerSource ; trigger, if matching msg
|
|
pop xh
|
|
pop xl
|
|
TCA_HandleMsg_ret:
|
|
clc
|
|
ret
|
|
; @end
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine tcaCheckTriggerSource
|
|
;
|
|
; @param Z pointer to data in FLASH (byte address for lpm!)
|
|
; @param Y pointer to data in RAM
|
|
; @param X pointer to TCA_SOURCE object
|
|
; @param R17 value id
|
|
; @param R19:R18 value
|
|
; @param R22 src addr
|
|
; @clobbers R16, R24, R25, (any), !Z, !Y
|
|
|
|
tcaCheckTriggerSource:
|
|
rcall tcaCheckSourceAndValue ; (r16)
|
|
brcc tcaCheckTriggerSource_ret
|
|
; we have a value
|
|
|
|
rcall tcaCheckValue ; (r24, r25)
|
|
brcc tcaCheckTriggerSource_ret
|
|
|
|
ldd r16, Y+HTIM_RAM_OFFS_FLAGS
|
|
sbr r16, (1<<TCA_FLAGBITS_NEED_TRIGGER)
|
|
std Y+HTIM_RAM_OFFS_FLAGS, r16
|
|
|
|
tcaCheckTriggerSource_ret:
|
|
ret
|
|
; @end
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine tcaCheckGuardSource
|
|
;
|
|
; @param X pointer to TCA_SOURCE object
|
|
; @param R17 value id
|
|
; @param R19:R18 value
|
|
; @param R22 src addr
|
|
; @clobbers R16, R24, R25, (any), !Z, !Y
|
|
|
|
tcaCheckGuardSource:
|
|
rcall tcaCheckSourceAndValue ; (r16)
|
|
brcc tcaCheckGuardSource_ret
|
|
; we have a value
|
|
rcall tcaCheckValue
|
|
ldd r16, Y+HTIM_RAM_OFFS_FLAGS
|
|
brcc tcaCheckGuardSource_noMatch
|
|
sbr r16, (1<<TCA_FLAGBITS_NEED_ENABLE)
|
|
rjmp tcaCheckGuardSource_done
|
|
tcaCheckGuardSource_noMatch:
|
|
sbr r16, (1<<TCA_FLAGBITS_NEED_DISABLE)
|
|
tcaCheckGuardSource_done:
|
|
std Y+HTIM_RAM_OFFS_FLAGS, r16
|
|
|
|
tcaCheckGuardSource_ret:
|
|
ret
|
|
; @end
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine tcaCheckSourceAndValue
|
|
;
|
|
; @param X pointer to TCA_SOURCE object
|
|
; @param R17 value id
|
|
; @param R22 src addr
|
|
; @clobbers r16
|
|
|
|
tcaCheckSourceAndValue:
|
|
ld r16, X
|
|
cp r16, r22 ; compare src addr
|
|
brne tcaCheckSourceAndValue_clcRet
|
|
adiw xh:xl, TCA_SOURCE_OFFS_VALUEID
|
|
ld r16, X
|
|
sbiw xh:xl, TCA_SOURCE_OFFS_VALUEID
|
|
cp r16, r17 ; compare value id
|
|
brne tcaCheckSourceAndValue_clcRet
|
|
sec
|
|
rjmp tcaCheckSourceAndValue_ret ; matches
|
|
tcaCheckSourceAndValue_clcRet:
|
|
clc
|
|
tcaCheckSourceAndValue_ret:
|
|
ret
|
|
; @end
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine tcaCheckValue
|
|
;
|
|
; @param Z pointer to data in FLASH (byte address for lpm!)
|
|
; @param Y pointer to TCA_SOURCE object
|
|
; @param R19:R18 value
|
|
; @clobbers r24, r25
|
|
|
|
tcaCheckValue:
|
|
adiw xh:xl, TCA_SOURCE_OFFS_LOWLIM_LO
|
|
ld r24, X+
|
|
ld r25, X
|
|
sbiw xh:xl, (TCA_SOURCE_OFFS_LOWLIM_LO+1)
|
|
cp r18, r24
|
|
cpc r19, r25
|
|
brcs tcaCheckValue_clcRet
|
|
adiw xh:xl, TCA_SOURCE_OFFS_HIGHLIM_LO
|
|
ld r24, X+
|
|
ld r25, X
|
|
sbiw xh:xl, (TCA_SOURCE_OFFS_HIGHLIM_LO+1)
|
|
cp r24, r18
|
|
cpc r25, r19
|
|
brcs tcaCheckValue_clcRet
|
|
sec
|
|
rjmp tcaCheckValue_ret
|
|
tcaCheckValue_clcRet:
|
|
clc
|
|
tcaCheckValue_ret:
|
|
ret
|
|
; @end
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine TCA_SetValue_GuardSrc
|
|
|
|
; @param Y pointer to TCA data in RAM
|
|
|
|
TCA_SetValue_GuardSrc: ; value is in R18-R21 (R16, R17, X)
|
|
std Y+(TCA_RAM_OFFS_GUARD_SOURCE+TCA_SOURCE_OFFS_ADDR), r18
|
|
std Y+(TCA_RAM_OFFS_GUARD_SOURCE+TCA_SOURCE_OFFS_VALUEID), r19
|
|
rjmp TCA_SetValueACK
|
|
; @end
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine TCA_SetValue_GuardLimits
|
|
|
|
; @param Y pointer to TCA data in RAM
|
|
|
|
TCA_SetValue_GuardLimits: ; value is in R18-R21 (R16, R17, X)
|
|
std Y+(TCA_RAM_OFFS_GUARD_SOURCE+TCA_SOURCE_OFFS_LOWLIM_LO), r18
|
|
std Y+(TCA_RAM_OFFS_GUARD_SOURCE+TCA_SOURCE_OFFS_LOWLIM_HI), r19
|
|
std Y+(TCA_RAM_OFFS_GUARD_SOURCE+TCA_SOURCE_OFFS_HIGHLIM_LO), r20
|
|
std Y+(TCA_RAM_OFFS_GUARD_SOURCE+TCA_SOURCE_OFFS_HIGHLIM_HI), r21
|
|
rjmp TCA_SetValueACK
|
|
; @end
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine TCA_SetValue_Trigger1Src
|
|
|
|
; @param Y pointer to TCA data in RAM
|
|
|
|
TCA_SetValue_Trigger1Src: ; value is in R18-R21 (R16, R17, X)
|
|
std Y+(TCA_RAM_OFFS_TRIGGER_SOURCE1+TCA_SOURCE_OFFS_ADDR), r18
|
|
std Y+(TCA_RAM_OFFS_TRIGGER_SOURCE1+TCA_SOURCE_OFFS_VALUEID), r19
|
|
rjmp TCA_SetValueACK
|
|
; @end
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine TCA_SetValue_Trigger1Limits
|
|
|
|
; @param Y pointer to TCA data in RAM
|
|
|
|
TCA_SetValue_Trigger1Limits: ; value is in R18-R21 (R16, R17, X)
|
|
std Y+(TCA_RAM_OFFS_TRIGGER_SOURCE1+TCA_SOURCE_OFFS_LOWLIM_LO), r18
|
|
std Y+(TCA_RAM_OFFS_TRIGGER_SOURCE1+TCA_SOURCE_OFFS_LOWLIM_HI), r19
|
|
std Y+(TCA_RAM_OFFS_TRIGGER_SOURCE1+TCA_SOURCE_OFFS_HIGHLIM_LO), r20
|
|
std Y+(TCA_RAM_OFFS_TRIGGER_SOURCE1+TCA_SOURCE_OFFS_HIGHLIM_HI), r21
|
|
rjmp TCA_SetValueACK
|
|
; @end
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine TCA_SetValue_Trigger2Src
|
|
|
|
; @param Y pointer to TCA data in RAM
|
|
|
|
TCA_SetValue_Trigger2Src: ; value is in R18-R21 (R16, R17, X)
|
|
std Y+(TCA_RAM_OFFS_TRIGGER_SOURCE2+TCA_SOURCE_OFFS_ADDR), r18
|
|
std Y+(TCA_RAM_OFFS_TRIGGER_SOURCE2+TCA_SOURCE_OFFS_VALUEID), r19
|
|
rjmp TCA_SetValueACK
|
|
; @end
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine TCA_SetValue_Trigger2Limits
|
|
|
|
; @param Y pointer to TCA data in RAM
|
|
|
|
TCA_SetValue_Trigger2Limits: ; value is in R18-R21 (R16, R17, X)
|
|
std Y+(TCA_RAM_OFFS_TRIGGER_SOURCE2+TCA_SOURCE_OFFS_LOWLIM_LO), r18
|
|
std Y+(TCA_RAM_OFFS_TRIGGER_SOURCE2+TCA_SOURCE_OFFS_LOWLIM_HI), r19
|
|
std Y+(TCA_RAM_OFFS_TRIGGER_SOURCE2+TCA_SOURCE_OFFS_HIGHLIM_LO), r20
|
|
std Y+(TCA_RAM_OFFS_TRIGGER_SOURCE2+TCA_SOURCE_OFFS_HIGHLIM_HI), r21
|
|
rjmp TCA_SetValueACK
|
|
; @end
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine TCA_SetValue_HoldTime
|
|
|
|
; @param Y pointer to TCA data in RAM
|
|
|
|
TCA_SetValue_HoldTime:
|
|
std Y+HTIM_RAM_OFFS_RELOAD_LO, r18
|
|
std Y+HTIM_RAM_OFFS_RELOAD_HI, r19
|
|
rjmp TCA_SetValueACK
|
|
; @end
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine TCA_SetValue_Mode
|
|
|
|
; @param Y pointer to TCA data in RAM
|
|
|
|
TCA_SetValue_Mode:
|
|
std Y+HTIM_RAM_OFFS_MODE, r18
|
|
rjmp TCA_SetValueACK
|
|
; @end
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine TCA_SetValueACK
|
|
|
|
TCA_SetValueACK:
|
|
ldd r16, Y+HTIM_RAM_OFFS_FLAGS
|
|
sbr r16, (1<<TCA_FLAGBIT_UPDATED)
|
|
std Y+HTIM_RAM_OFFS_FLAGS, r16
|
|
|
|
ldi r23, NETMSG_CMD_VALUE_SET_ACK
|
|
sec
|
|
ret
|
|
; @end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#endif
|
|
|