more work on gui code.

This commit is contained in:
Martin Preuss
2025-06-02 23:29:50 +02:00
parent 41867ed01a
commit 888792a201
3 changed files with 246 additions and 17 deletions

View File

@@ -12,7 +12,6 @@
; @routine OBJ_Init @global
;
; @param Y pointer to object SRAM
; @param Z pointer to handler function (word address)
; @param r17 options
; @clobbers X
@@ -25,14 +24,54 @@ OBJ_Init:
rcall Utils_FillSram ; (R17, X)
rcall Tree_InitObject ; (R16)
pop r17
std Y+OBJ_OFFS_HANDLERFN_LO, zl
std Y+OBJ_OFFS_HANDLERFN_HI, zh
std Y+OBJ_OFFS_OPTIONS, r17
ldi r16, LOW(OBJ_DefaultHandler)
std Y+OBJ_OFFS_HANDLERFN_LO, r16
ldi r16, HIGH(OBJ_DefaultHandler)
std Y+OBJ_OFFS_HANDLERFN_HI, r16
ret
; @end
; ---------------------------------------------------------------------------
; @routine OBJ_SetHandler @global
;
; @param Y pointer to object SRAM
; @param Z pointer to handler function (word address)
; @clobbers X
OBJ_SetHandler:
std Y+OBJ_OFFS_HANDLERFN_LO, zl
std Y+OBJ_OFFS_HANDLERFN_HI, zh
ret
; @end
; ---------------------------------------------------------------------------
; @routine OBJ_GetHandler @global
;
; @param Y pointer to object SRAM
; @return Z pointer to handler function (word address)
; @clobbers none
OBJ_GetHandler:
ldd zl, Y+OBJ_OFFS_HANDLERFN_LO
ldd zh, Y+OBJ_OFFS_HANDLERFN_HI
ret
; @end
OBJ_DefaultHandler:
ret
; @end
; ---------------------------------------------------------------------------
; @routine OBJ_free @global
;
@@ -43,14 +82,14 @@ OBJ_free:
; free children
push yl
push yh
rcall Tree_GetFirstChildObject
rcall Tree_GetFirstChildObject ; (none)
OBJ_free_loop:
mov r16, xl
or r16, xh
breq OBJ_free_loopEnd
mov yl, xl
mov yh, xh
rcall List_GetNextObject
rcall Tree_GetNextSibling
push xl ; next
push xh ; next
rcall OBJ_free
@@ -61,7 +100,7 @@ OBJ_free_loopEnd:
pop yh
pop yl
rcall Tree_UnlinkObject
rcall Tree_UnlinkObject ; (r16, r17, x)
push yl
push yh
@@ -102,6 +141,55 @@ OBJ_Handler:
; ---------------------------------------------------------------------------
; @routine OBJ_ForwardSignalToChildren
;
; Signal handler for an object. A signal can have up to 3 parameters
; conveyed in registers R18, R19 and X.
;
; @param Y pointer to object SRAM
; @param r16 signal
; @param R18 1st param
; @param R19 2nd param
; @param X 3rd param
; @clobbers any, !r16, !r18, !r19, !Y
OBJ_ForwardSignalToChildren:
push yl
push yh
rcall Tree_GetFirstChildObject ; (none)
OBJ_ForwardSignalToChildren_loop:
clc
mov r17, xl
or r17, xh
breq OBJ_ForwardSignalToChildren_loopEnd
mov yl, xl
mov yh, xh
push r16
push r18
push r19
push xl
push xh
push yl
push yh
rcall OBJ_Handler
pop yh
pop yl
pop xh
pop xl
pop r19
pop r18
pop r16
rcall Tree_GetNextSibling
rjmp OBJ_ForwardSignalToChildren_loop
OBJ_ForwardSignalToChildren_loopEnd:
pop yh
pop yl
ret
; @end
; ---------------------------------------------------------------------------
; @routine OBJ_EmitSignal
;
@@ -119,11 +207,11 @@ OBJ_EmitSignal:
mov yl, r17
OBJ_EmitSignal_loop:
push r16
rcall objCheckEmitSignalForLink
rcall objCheckEmitSignalForLink ; (any, !X, !Y, !R18, !R19)
pop r16
push xl
push xh
rcall List_GetNextObject ; (any, !X, !Y, !R18, !R19)
rcall List_GetNextObject ; (none)
mov yl, xl
mov yh, xh
pop xh