gui2: added Object_Alloc, OBJ_GetRoot

This commit is contained in:
Martin Preuss
2026-03-04 23:25:12 +01:00
parent 8c59b92100
commit 0081c33c00

View File

@@ -43,11 +43,10 @@
; signals ; signals
.equ OBJECT_SIGNAL_NONE = 0 .equ OBJECT_SIGNAL_NONE = 0
.equ OBJECT_SIGNAL_CREATE = 1 .equ OBJECT_SIGNAL_DESTROY = 1
.equ OBJECT_SIGNAL_DESTROY = 2 .equ OBJECT_SIGNAL_TIMER = 2
.equ OBJECT_SIGNAL_TIMER = 3 .equ OBJECT_SIGNAL_RECVMSG = 3 ; X=msg
.equ OBJECT_SIGNAL_RECVMSG = 4 ; X=msg .equ OBJECT_SIGNAL_NEXTFREE = 4
.equ OBJECT_SIGNAL_NEXTFREE = 5
@@ -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 ; @routine OBJ_Init @global
; ;
; @param Y address of object in SDRAM ; @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 ; @clobbers r16, r17, X
OBJ_Init: OBJ_Init:
mov xl, yl push r16
mov xh, yh push r17
clr r16 mov xl, yl
ldi r17, OBJECT_SIZE mov xh, yh
bigcall Utils_FillSram ; (r17, X) 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) ldi r16, LOW(Object_DefaultSignalmap*2)
std Y+OBJECT_OFFS_SIGNALMAP_LO, r16 std Y+OBJECT_OFFS_SIGNALMAP_LO, r16
ldi r16, HIGH(Object_DefaultSignalmap*2) ldi r16, HIGH(Object_DefaultSignalmap*2)
@@ -132,13 +166,9 @@ OBJ_Free_ret:
OBJ_OnDestroy: OBJ_OnDestroy:
rcall OBJ_Unlink ; (r16, r17, r18, r19, r20, r21, X) rcall OBJ_Unlink ; (r16, r17, r18, r19, r20, r21, X)
#ifdef MODULES_HEAP
mov xl, yl mov xl, yl
mov xh, yh mov xh, yh
bigcall Heap_Free ; (r16, r17, r24, r25, X) bigcall Heap_Free ; (r16, r17, r24, r25, X)
#endif
sec sec
ret ret
; @end ; @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 ; @routine OBJ_EmitSignal @global
; ;
@@ -687,6 +739,8 @@ objGetPredecessor_ret:
; ***************************************************************************
; data in FLASH
Object_DefaultSignalmap: Object_DefaultSignalmap:
.db 0, OBJECT_SIGNAL_DESTROY, LOW(OBJ_OnDestroy), HIGH(OBJ_OnDestroy) .db 0, OBJECT_SIGNAL_DESTROY, LOW(OBJ_OnDestroy), HIGH(OBJ_OnDestroy)