From 0081c33c0020ce212c24e672de1eccd79fda1dd5 Mon Sep 17 00:00:00 2001 From: Martin Preuss Date: Wed, 4 Mar 2026 23:25:12 +0100 Subject: [PATCH] gui2: added Object_Alloc, OBJ_GetRoot --- avr/modules/lcd2/gui2/base/object.asm | 82 ++++++++++++++++++++++----- 1 file changed, 68 insertions(+), 14 deletions(-) diff --git a/avr/modules/lcd2/gui2/base/object.asm b/avr/modules/lcd2/gui2/base/object.asm index 154cb9b..2d69c0b 100644 --- a/avr/modules/lcd2/gui2/base/object.asm +++ b/avr/modules/lcd2/gui2/base/object.asm @@ -43,11 +43,10 @@ ; signals .equ OBJECT_SIGNAL_NONE = 0 -.equ OBJECT_SIGNAL_CREATE = 1 -.equ OBJECT_SIGNAL_DESTROY = 2 -.equ OBJECT_SIGNAL_TIMER = 3 -.equ OBJECT_SIGNAL_RECVMSG = 4 ; X=msg -.equ OBJECT_SIGNAL_NEXTFREE = 5 +.equ OBJECT_SIGNAL_DESTROY = 1 +.equ OBJECT_SIGNAL_TIMER = 2 +.equ OBJECT_SIGNAL_RECVMSG = 3 ; X=msg +.equ OBJECT_SIGNAL_NEXTFREE = 4 @@ -58,19 +57,54 @@ +; --------------------------------------------------------------------------- +; @routine Object_Alloc @global +; +; @return CFLAG set if object created, cleared otherwise +; @return Y address of created object in SDRAM (if CFLAG set) +; @param r25:r24 size of object to allocate +; @clobbers !r16, !r17 + +Object_Alloc: + push r16 + push r17 + bigcall Heap_Alloc ; X=mem allocated (r16, r17, r18, r19, r24, r25, X) + pop r17 + pop r16 + brcc Object_Alloc_ret + mov yl, xl + mov yh, xh + sec +Object_Alloc_ret: + ret +; @end + + + ; --------------------------------------------------------------------------- ; @routine OBJ_Init @global ; ; @param Y address of object in SDRAM +; @param r16 value for OBJECT_OFFS_OPTS_LO +; @param r17 value for OBJECT_OFFS_OPTS_HI ; @clobbers r16, r17, X OBJ_Init: - mov xl, yl - mov xh, yh - clr r16 - ldi r17, OBJECT_SIZE - bigcall Utils_FillSram ; (r17, X) + push r16 + push r17 + mov xl, yl + mov xh, yh + clr r16 + ldi r17, OBJECT_SIZE + bigcall Utils_FillSram ; (r17, X) + pop r17 + pop r16 + ; set opts + std Y+OBJECT_OFFS_OPTS_LO, r16 + std Y+OBJECT_OFFS_OPTS_HI, r17 + + ; set default signal map ldi r16, LOW(Object_DefaultSignalmap*2) std Y+OBJECT_OFFS_SIGNALMAP_LO, r16 ldi r16, HIGH(Object_DefaultSignalmap*2) @@ -132,13 +166,9 @@ OBJ_Free_ret: OBJ_OnDestroy: rcall OBJ_Unlink ; (r16, r17, r18, r19, r20, r21, X) - -#ifdef MODULES_HEAP mov xl, yl mov xh, yh bigcall Heap_Free ; (r16, r17, r24, r25, X) -#endif - sec ret ; @end @@ -386,6 +416,28 @@ OBJ_Unlink_ret: +; --------------------------------------------------------------------------- +; @routine OBJ_GetRoot @global +; +; @param Y address of object +; @return Y address pointer to root object +; @clobbers r18, r19 + +OBJ_GetRoot: +OBJ_GetRoot_loop: + rcall OBJ_GetParent ; (none) + brcc OBJ_GetRoot_found ; no parent, return current Y + mov yl, r18 + mov yh, r19 + rjmp OBJ_GetRoot_loop +OBJ_GetRoot_found: + sec +OBJ_GetRoot_end: + ret +; @end + + + ; --------------------------------------------------------------------------- ; @routine OBJ_EmitSignal @global ; @@ -687,6 +739,8 @@ objGetPredecessor_ret: +; *************************************************************************** +; data in FLASH Object_DefaultSignalmap: .db 0, OBJECT_SIGNAL_DESTROY, LOW(OBJ_OnDestroy), HIGH(OBJ_OnDestroy)