fox32rom: Rewrite event system
This commit is contained in:
parent
0c889859de
commit
3871ae4810
263
event.asm
263
event.asm
|
@ -1,18 +1,12 @@
|
|||
; event system routines
|
||||
|
||||
const EVENT_QUEUE_TOP: 0x01FFFFFE
|
||||
const EVENT_QUEUE_BOTTOM: 0x01FFFBFE ; top - 0x400 (32 events * (4 bytes * (1 type + 7 parameters)))
|
||||
const EVENT_QUEUE_INDEX: 0x01FFFFFF ; byte
|
||||
const EVENT_QUEUE_SIZE: 32 ; 32 events
|
||||
const EVENT_SIZE_BYTES: 32 ; 32 bytes per event
|
||||
const EVENT_SIZE_WORDS: 8 ; 8 words per event
|
||||
|
||||
; event types
|
||||
const MOUSE_CLICK_EVENT_TYPE: 0x00000000
|
||||
const MENU_BAR_CLICK_EVENT_TYPE: 0x00000001
|
||||
const MENU_UPDATE_EVENT_TYPE: 0x00000002
|
||||
const MENU_CLICK_EVENT_TYPE: 0x00000003
|
||||
const EMPTY_EVENT_TYPE: 0xFFFFFFFF
|
||||
const EVENT_TYPE_MOUSE_CLICK: 0x00000000
|
||||
const EVENT_TYPE_MOUSE_RELEASE: 0x00000001
|
||||
const EVENT_TYPE_MENU_BAR_CLICK: 0x00000002
|
||||
const EVENT_TYPE_MENU_UPDATE: 0x00000003
|
||||
const EVENT_TYPE_MENU_CLICK: 0x00000004
|
||||
const EVENT_TYPE_EMPTY: 0xFFFFFFFF
|
||||
|
||||
; block until an event is available
|
||||
; inputs:
|
||||
|
@ -20,18 +14,7 @@ const EMPTY_EVENT_TYPE: 0xFFFFFFFF
|
|||
; outputs:
|
||||
; r0: event type
|
||||
; r1-r7: event parameters
|
||||
wait_for_event:
|
||||
ise
|
||||
halt
|
||||
|
||||
; if the event queue index doesn't equal zero, then at least one event is available
|
||||
cmp.8 [EVENT_QUEUE_INDEX], 0
|
||||
ifz jmp wait_for_event
|
||||
|
||||
; an event is available in the event queue, remove it from the queue and return it
|
||||
call get_next_event
|
||||
|
||||
ret
|
||||
wait_for_event: jmp event_wait
|
||||
|
||||
; add an event to the event queue
|
||||
; inputs:
|
||||
|
@ -39,25 +22,128 @@ wait_for_event:
|
|||
; r1-r7: event parameters
|
||||
; outputs:
|
||||
; none
|
||||
new_event:
|
||||
; ensure there is enough space left for another event
|
||||
cmp.8 [EVENT_QUEUE_INDEX], EVENT_QUEUE_SIZE
|
||||
ifz ret
|
||||
new_event: jmp event_new
|
||||
|
||||
; get the next event and remove it from the event queue
|
||||
; inputs:
|
||||
; none
|
||||
; outputs:
|
||||
; r0: event type
|
||||
; r1-r7: event parameters
|
||||
get_next_event: jmp event_next
|
||||
|
||||
; implementation
|
||||
|
||||
const EVENT_SIZE: 32
|
||||
const EVENT_TEMP: 0x01FFFBDA
|
||||
const EVENT_QUEUE_POINTER: 0x01FFFBFA
|
||||
const EVENT_QUEUE_BOTTOM: 0x01FFFBFE
|
||||
|
||||
event_wait:
|
||||
call event__init
|
||||
|
||||
event_wait_0:
|
||||
ise
|
||||
halt
|
||||
|
||||
cmp [EVENT_QUEUE_POINTER], EVENT_QUEUE_BOTTOM
|
||||
ifz jmp event_wait_0
|
||||
jmp event_next_0
|
||||
|
||||
event_next:
|
||||
call event__init
|
||||
|
||||
cmp [EVENT_QUEUE_POINTER], EVENT_QUEUE_BOTTOM
|
||||
ifz jmp event__empty
|
||||
|
||||
event_next_0:
|
||||
icl
|
||||
push r8
|
||||
push r9
|
||||
|
||||
; point to the current event queue index
|
||||
mov r8, EVENT_QUEUE_BOTTOM
|
||||
movz.8 r9, [EVENT_QUEUE_INDEX]
|
||||
mul r9, EVENT_SIZE_BYTES
|
||||
add r8, r9
|
||||
call event__load
|
||||
mov r8, EVENT_TEMP
|
||||
call event__store
|
||||
|
||||
; copy the event type
|
||||
mov r9, EVENT_QUEUE_BOTTOM
|
||||
|
||||
event_next_1:
|
||||
add r9, EVENT_SIZE
|
||||
|
||||
cmp [EVENT_QUEUE_POINTER], r9
|
||||
ifz jmp event_next_2
|
||||
|
||||
mov r8, r9
|
||||
call event__load
|
||||
|
||||
mov r8, r9
|
||||
sub r8, EVENT_SIZE
|
||||
call event__store
|
||||
|
||||
jmp event_next_1
|
||||
|
||||
event_next_2:
|
||||
mov r8, EVENT_TEMP
|
||||
call event__load
|
||||
|
||||
sub [EVENT_QUEUE_POINTER], EVENT_SIZE
|
||||
|
||||
pop r9
|
||||
pop r8
|
||||
ise
|
||||
ret
|
||||
|
||||
event_new:
|
||||
call event__init
|
||||
|
||||
push r8
|
||||
|
||||
mov r8, [EVENT_QUEUE_POINTER]
|
||||
call event__store
|
||||
mov [EVENT_QUEUE_POINTER], r8
|
||||
|
||||
pop r8
|
||||
ret
|
||||
|
||||
event__init:
|
||||
cmp [EVENT_QUEUE_POINTER], 0
|
||||
ifz mov [EVENT_QUEUE_POINTER], EVENT_QUEUE_BOTTOM
|
||||
ret
|
||||
|
||||
event__empty:
|
||||
mov r0, EVENT_TYPE_EMPTY
|
||||
mov r1, 0
|
||||
mov r2, 0
|
||||
mov r3, 0
|
||||
mov r4, 0
|
||||
mov r5, 0
|
||||
mov r6, 0
|
||||
mov r7, 0
|
||||
ret
|
||||
|
||||
event__load:
|
||||
mov r0, [r8]
|
||||
add r8, 4
|
||||
mov r1, [r8]
|
||||
add r8, 4
|
||||
mov r2, [r8]
|
||||
add r8, 4
|
||||
mov r3, [r8]
|
||||
add r8, 4
|
||||
mov r4, [r8]
|
||||
add r8, 4
|
||||
mov r5, [r8]
|
||||
add r8, 4
|
||||
mov r6, [r8]
|
||||
add r8, 4
|
||||
mov r7, [r8]
|
||||
add r8, 4
|
||||
ret
|
||||
|
||||
event__store:
|
||||
mov [r8], r0
|
||||
add r8, 4
|
||||
|
||||
; copy the event parameters
|
||||
mov [r8], r1
|
||||
add r8, 4
|
||||
mov [r8], r2
|
||||
|
@ -72,111 +158,4 @@ new_event:
|
|||
add r8, 4
|
||||
mov [r8], r7
|
||||
add r8, 4
|
||||
|
||||
; increment the index
|
||||
inc.8 [EVENT_QUEUE_INDEX]
|
||||
|
||||
pop r9
|
||||
pop r8
|
||||
ret
|
||||
|
||||
; get the next event and remove it from the event queue
|
||||
; inputs:
|
||||
; none
|
||||
; outputs:
|
||||
; r0: event type
|
||||
; r1-r7: event parameters
|
||||
get_next_event:
|
||||
; if the event queue index equals zero, then the queue is empty
|
||||
cmp.8 [EVENT_QUEUE_INDEX], 0
|
||||
ifz jmp get_next_event_empty
|
||||
|
||||
icl
|
||||
push r8
|
||||
|
||||
; point to the bottom of the event queue
|
||||
mov r8, EVENT_QUEUE_BOTTOM
|
||||
|
||||
; copy the event type
|
||||
mov r0, [r8]
|
||||
add r8, 4
|
||||
|
||||
; copy the event parameters
|
||||
mov r1, [r8]
|
||||
add r8, 4
|
||||
mov r2, [r8]
|
||||
add r8, 4
|
||||
mov r3, [r8]
|
||||
add r8, 4
|
||||
mov r4, [r8]
|
||||
add r8, 4
|
||||
mov r5, [r8]
|
||||
add r8, 4
|
||||
mov r6, [r8]
|
||||
add r8, 4
|
||||
mov r7, [r8]
|
||||
|
||||
; shift all events down by one
|
||||
call shift_events
|
||||
|
||||
; decrement the index
|
||||
dec.8 [EVENT_QUEUE_INDEX]
|
||||
|
||||
pop r8
|
||||
ise
|
||||
ret
|
||||
get_next_event_empty:
|
||||
mov r0, EMPTY_EVENT_TYPE
|
||||
mov r1, 0
|
||||
mov r2, 0
|
||||
mov r3, 0
|
||||
mov r4, 0
|
||||
mov r5, 0
|
||||
mov r6, 0
|
||||
mov r7, 0
|
||||
|
||||
ret
|
||||
|
||||
; shift all events down by one, overwriting the zero'th event
|
||||
; inputs:
|
||||
; none
|
||||
; outputs:
|
||||
; none
|
||||
shift_events:
|
||||
push r0
|
||||
push r1
|
||||
push r2
|
||||
push r3
|
||||
push r4
|
||||
|
||||
; for (int i = 0; i < (event_queue_index - 1); i++) {
|
||||
; event_queue[i] = event_queue[i + 1];
|
||||
; }
|
||||
|
||||
movz.8 r31, [EVENT_QUEUE_INDEX]
|
||||
mov r3, 0 ; i
|
||||
|
||||
; source pointer: event_queue[i + 1]
|
||||
mov r0, EVENT_QUEUE_BOTTOM
|
||||
mov r4, r3
|
||||
inc r4
|
||||
mul r4, EVENT_SIZE_WORDS
|
||||
add r0, r4
|
||||
|
||||
; destination pointer: event_queue[i]
|
||||
mov r1, EVENT_QUEUE_BOTTOM
|
||||
mov r4, r3
|
||||
mul r4, EVENT_SIZE_WORDS
|
||||
add r1, r4
|
||||
|
||||
; size: event_size_words
|
||||
mov r2, EVENT_SIZE_WORDS
|
||||
|
||||
call copy_memory_words
|
||||
|
||||
pop r4
|
||||
pop r3
|
||||
pop r2
|
||||
pop r1
|
||||
pop r0
|
||||
ret
|
10
fox32rom.def
10
fox32rom.def
|
@ -59,8 +59,8 @@ compare_memory_bytes: jmp [0xF0046008]
|
|||
compare_memory_words: jmp [0xF004600C]
|
||||
|
||||
; event types
|
||||
const MOUSE_CLICK_EVENT_TYPE: 0x00000000
|
||||
const MENU_BAR_CLICK_EVENT_TYPE: 0x00000001
|
||||
const MENU_UPDATE_EVENT_TYPE: 0x00000002
|
||||
const MENU_CLICK_EVENT_TYPE: 0x00000003
|
||||
const EMPTY_EVENT_TYPE: 0xFFFFFFFF
|
||||
const EVENT_TYPE_MOUSE_CLICK: 0x00000000
|
||||
const EVENT_TYPE_MENU_BAR_CLICK: 0x00000001
|
||||
const EVENT_TYPE_MENU_UPDATE: 0x00000002
|
||||
const EVENT_TYPE_MENU_CLICK: 0x00000003
|
||||
const EVENT_TYPE_EMPTY: 0xFFFFFFFF
|
||||
|
|
8
main.asm
8
main.asm
|
@ -74,20 +74,20 @@ event_loop:
|
|||
call get_next_event
|
||||
|
||||
; was the mouse clicked?
|
||||
cmp r0, MOUSE_CLICK_EVENT_TYPE
|
||||
cmp r0, EVENT_TYPE_MOUSE_CLICK
|
||||
;ifz call mouse_click_event
|
||||
|
||||
; did the user click the menu bar?
|
||||
cmp r0, MENU_BAR_CLICK_EVENT_TYPE
|
||||
cmp r0, EVENT_TYPE_MENU_BAR_CLICK
|
||||
ifz mov r0, menu_items_root
|
||||
ifz call menu_bar_click_event
|
||||
|
||||
; is the user in a menu?
|
||||
cmp r0, MENU_UPDATE_EVENT_TYPE
|
||||
cmp r0, EVENT_TYPE_MENU_UPDATE
|
||||
ifz call menu_update_event
|
||||
|
||||
; did the user click a menu item?
|
||||
cmp r0, MENU_CLICK_EVENT_TYPE
|
||||
cmp r0, EVENT_TYPE_MENU_CLICK
|
||||
ifz call menu_click_event
|
||||
|
||||
; check if a disk is inserted as disk 0
|
||||
|
|
10
menu.asm
10
menu.asm
|
@ -173,7 +173,7 @@ close_menu:
|
|||
|
||||
; update the currently open menu
|
||||
; detects mouse movements over the menu and handles clicks
|
||||
; this should only be called if a menu_update_event_type event is received
|
||||
; this should only be called if a event_type_menu_update event is received
|
||||
; inputs:
|
||||
; *** these inputs should already be in the required registers from the event parameters ***
|
||||
; r1: pointer to menu bar root struct
|
||||
|
@ -242,13 +242,13 @@ menu_update_event_clicked:
|
|||
mov r5, 0
|
||||
mov r6, 0
|
||||
mov r7, 0
|
||||
mov r0, MENU_CLICK_EVENT_TYPE
|
||||
mov r0, EVENT_TYPE_MENU_CLICK
|
||||
call new_event
|
||||
mov r0, r1
|
||||
call close_menu
|
||||
jmp menu_update_event_end_no_add
|
||||
menu_update_event_end_add:
|
||||
; readd the menu_update_event_type event to the event queue
|
||||
; readd the event_type_menu_update event to the event queue
|
||||
mov r1, r8 ; event parameter 0: pointer to menu bar root struct
|
||||
mov r2, r9 ; event parameter 1: selected root menu item
|
||||
mov r3, r10 ; event parameter 2: hovering menu item (or 0xFFFFFFFF for none)
|
||||
|
@ -256,7 +256,7 @@ menu_update_event_end_add:
|
|||
mov r5, 0
|
||||
mov r6, 0
|
||||
mov r7, 0
|
||||
mov r0, MENU_UPDATE_EVENT_TYPE
|
||||
mov r0, EVENT_TYPE_MENU_UPDATE
|
||||
call new_event
|
||||
menu_update_event_end_no_add:
|
||||
pop r9
|
||||
|
@ -269,4 +269,4 @@ menu_update_event_end_no_add:
|
|||
pop r2
|
||||
pop r1
|
||||
pop r0
|
||||
ret
|
||||
ret
|
||||
|
|
|
@ -218,7 +218,7 @@ menu_bar_click_event_found_item:
|
|||
call draw_menu_bar_root_items
|
||||
call draw_menu_items
|
||||
|
||||
; add a menu_update_event_type event to the event queue
|
||||
; add a event_type_menu_update event to the event queue
|
||||
mov r1, r0 ; event parameter 0: pointer to menu bar root struct
|
||||
mov r2, r30 ; event parameter 1: selected root menu item
|
||||
mov r3, 0xFFFFFFFF ; event parameter 2: hovering menu item (or 0xFFFFFFFF for none)
|
||||
|
@ -226,7 +226,7 @@ menu_bar_click_event_found_item:
|
|||
mov r5, 0
|
||||
mov r6, 0
|
||||
mov r7, 0
|
||||
mov r0, MENU_UPDATE_EVENT_TYPE
|
||||
mov r0, EVENT_TYPE_MENU_UPDATE
|
||||
call new_event
|
||||
menu_bar_click_event_end:
|
||||
pop r31
|
||||
|
@ -270,4 +270,4 @@ menu_bar_click_event_end:
|
|||
; data.8 6 data.str "Test 5" data.8 0x00 ; text length, text, null-terminator
|
||||
; data.8 6 data.str "Test 6" data.8 0x00 ; text length, text, null-terminator
|
||||
; data.8 6 data.str "Test 7" data.8 0x00 ; text length, text, null-terminator
|
||||
; data.8 6 data.str "Test 8" data.8 0x00 ; text length, text, null-terminator
|
||||
; data.8 6 data.str "Test 8" data.8 0x00 ; text length, text, null-terminator
|
||||
|
|
|
@ -25,7 +25,7 @@ get_mouse_button:
|
|||
|
||||
ret
|
||||
|
||||
; updates the cursor position and adds a mouse_click_event_type event to the event queue if the mouse button was clicked
|
||||
; updates the cursor position and adds a event_type_mouse_click event to the event queue if the mouse button was clicked
|
||||
; this should only be called by system_vsync_handler
|
||||
mouse_update:
|
||||
push r0
|
||||
|
@ -84,7 +84,7 @@ mouse_update_no_menu:
|
|||
mov r5, 0
|
||||
mov r6, 0
|
||||
mov r7, 0
|
||||
mov r0, MOUSE_CLICK_EVENT_TYPE ; set event type to mouse type
|
||||
mov r0, EVENT_TYPE_MOUSE_CLICK ; set event type to mouse type
|
||||
call new_event
|
||||
jmp mouse_update_end
|
||||
mouse_update_menu_was_clicked:
|
||||
|
@ -95,7 +95,7 @@ mouse_update_menu_was_clicked:
|
|||
mov r5, 0
|
||||
mov r6, 0
|
||||
mov r7, 0
|
||||
mov r0, MENU_BAR_CLICK_EVENT_TYPE ; set event type to menu bar click type
|
||||
mov r0, EVENT_TYPE_MENU_BAR_CLICK ; set event type to menu bar click type
|
||||
call new_event
|
||||
mouse_update_end:
|
||||
pop r7
|
||||
|
@ -106,4 +106,4 @@ mouse_update_end:
|
|||
pop r2
|
||||
pop r1
|
||||
pop r0
|
||||
ret
|
||||
ret
|
||||
|
|
Loading…
Reference in New Issue
Block a user