avr: switch to iterative code for Widget_TreeMatchFlagsAndSendSignalToActive

This commit is contained in:
Martin Preuss
2026-02-09 00:35:42 +01:00
parent 599b27c7d2
commit 409205dcd7

View File

@@ -1099,6 +1099,8 @@ Widget_TreeMatchOptsAndSendSignalToActive_done:
; @param xh param2
; @clobbers any, !R16, !R17, !X, !Z
#if 0
; non-iterative routine
Widget_TreeMatchFlagsAndSendSignalToActive:
push zl
push zh
@@ -1141,6 +1143,53 @@ Widget_TreeMatchFlagsAndSendSignalToActive_done:
ret
; @end
#else
; iterative routine
Widget_TreeMatchFlagsAndSendSignalToActive:
rcall OBJ_IsObject
brcc Widget_TreeMatchFlagsAndSendSignalToActive_ret
rcall widgetTreeMatchFlagsAndSendSignalToActive
Widget_TreeMatchFlagsAndSendSignalToActive_ret:
ret
; @end
widgetTreeMatchFlagsAndSendSignalToActive:
push zl
push zh
; check flags
rcall Widget_GetSdramPtr ; (none)
ldd r18, Y+WIDGET_SD_OFFS_FLAGS
sbrs r18, WIDGET_FLAGS_ACTIVE_BIT
rjmp widgetTreeMatchFlagsAndSendSignalToActive_done ; skip inactive branches
eor r18, r21 ; XOR with value (1 if different)
and r18, r20 ; AND with mask
brne widgetTreeMatchFlagsAndSendSignalToActive_l1
push r20
push r21
rcall OBJ_HandleSignalSaveInRegs
pop r21
pop r20
widgetTreeMatchFlagsAndSendSignalToActive_l1:
bigcall OBJ_GetFirstChild
widgetTreeMatchFlagsAndSendSignalToActive_loop:
brcc widgetTreeMatchFlagsAndSendSignalToActive_done
mov zl, r18
mov zh, r19
rcall widgetTreeMatchFlagsAndSendSignalToActive
bigcall OBJ_GetNext
rjmp widgetTreeMatchFlagsAndSendSignalToActive_loop
widgetTreeMatchFlagsAndSendSignalToActive_done:
pop zh
pop zl
ret
; @end
#endif
; ---------------------------------------------------------------------------