Calc: disentangle input params

This commit is contained in:
Joshua Bell 2017-09-08 20:13:09 -07:00
parent dbc26c14c9
commit 96d7ccf9d8
4 changed files with 69 additions and 48 deletions

View File

@ -86,8 +86,10 @@ A2D_SHOW_CURSOR := $25
A2D_HIDE_CURSOR := $26
;; no parameters (pass $0000 as address)
A2D_GET_BUTTON := $2A
;; .byte state (0=up, 1=pressed, 2=held???)
A2D_GET_INPUT := $2A
;; .byte state (0=up, 1=press, 2=release, 3=key, 4=held)
;; .byte key (ASCII code; high bit clear)
;; .byte modifiers (0=none, 1=open-apple, 2=closed-apple, 3=both)
A2D_UNK_2B := $2B ; Unknown
;; no parameters (pass $0000 as address)
@ -134,7 +136,7 @@ A2D_DESTROY_WINDOW := $39
A2D_UNK_3C := $3C ; Unknown, used in calculator
A2D_GET_MOUSE := $40
;; .word x
;; .word x (relative to screen)
;; .word y
;; .byte element (A2D_ELEM_*)
;; 0 = desktop
@ -158,7 +160,12 @@ A2D_DRAG_RESIZE := $45
A2D_UNK_44 := $44 ; Unknown - used in calculator
A2D_UNK_46 := $46 ; Unknown - used in calculator
A2D_MAP_COORDS := $46 ; Map screen coords to client coords
;; .byte window_id
;; .word screenx
;; .word screeny
;; .word clientx
;; .word clienty
A2D_QUERY_CLIENT:= $48
;; .word xcoord of query
@ -181,6 +188,12 @@ A2D_UPDATE_SCROLL:= $4B
;; .byte type (1 = vertical, 2 = horizontal)
;; .byte pos (new position 0...250)
;;; Used in A2D_GET_INPUT
A2D_INPUT_NONE := 0 ; No mouse or keypress
A2D_INPUT_DOWN := 1 ; Mouse button was depressed
A2D_INPUT_UP := 2 ; Mouse button was released
A2D_INPUT_KEY := 3 ; Key was pressed
A2D_INPUT_HELD := 4 ; Mouse button still down
;;; Used in A2D_GET_MOUSE
A2D_ELEM_DESKTOP:= 0

View File

@ -153,16 +153,24 @@ L08C4: rts
;;; ==================================================
;;; Call Params (and other data)
.proc button_state_params
state: .byte 0
.endproc
;; falls through?
;; The following 3 params blocks overlap for data re-use
.proc map_coords_params
id := *
screen := * + 1
screenx := * + 1 ; aligns with get_mouse_params::xcoord
screeny := * + 3 ; aligns with get_mouse_params::ycoord
client := * + 5
clientx := * + 5
clienty := * + 7
.endproc
.proc input_state_params
state: .byte 0
key := *
modifiers := * + 1
.endproc
keychar: ; this params block is getting reused "creatively"
keydown := * + 1
tpp := * + 4
clickx := * + 4
clicky := * + 6
.proc get_mouse_params
xcoord: .word 0
ycoord: .word 0
@ -632,9 +640,9 @@ L0D18: sta ALTZPON
A2D_CALL A2D_TEXT_BOX1, L0C6E
A2D_CALL $2B, 0
lda #$01
sta button_state_params::state
A2D_CALL $2D, button_state_params
A2D_CALL A2D_GET_BUTTON, button_state_params
sta input_state_params::state
A2D_CALL $2D, input_state_params
A2D_CALL A2D_GET_INPUT, input_state_params
lda ROMIN2
jsr reset_buffer2
lda #window_id
@ -697,16 +705,16 @@ loop: lda adjust_txtptr_copied-1,x
;;; Input Loop
input_loop:
A2D_CALL $2A, button_state_params
lda button_state_params::state
cmp #$01
A2D_CALL A2D_GET_INPUT, input_state_params
lda input_state_params::state
cmp #A2D_INPUT_DOWN
bne :+
jsr on_click
jmp input_loop
: cmp #$03
: cmp #A2D_INPUT_KEY
bne input_loop
jsr L0E6F ; key
jsr on_key_press
jmp input_loop
;;; ==================================================
@ -770,10 +778,10 @@ loop: lda routine,x
: cmp #A2D_ELEM_TITLE ; Title bar?
bne ignore_click
lda #window_id
sta button_state_params::state
sta map_coords_params::id
lda LCBANK1
lda LCBANK1
A2D_CALL $44, button_state_params
A2D_CALL $44, map_coords_params ; window drag?
lda ROMIN2
jsr call_4015_main
rts
@ -781,10 +789,10 @@ loop: lda routine,x
;;; ==================================================
;;; On Key Press
.proc L0E6F
lda keydown
.proc on_key_press
lda input_state_params::modifiers
bne bail
lda keychar ; check key
lda input_state_params::key
cmp #$1B ; Escape?
bne trydel
lda L0BC5
@ -810,13 +818,13 @@ L0E94: rts ; used by prev/next proc
.proc map_click_to_button
lda #window_id
sta button_state_params::state
A2D_CALL $46, button_state_params
lda clickx+1 ; ensure high bits of coords are 0
ora clicky+1
sta map_coords_params::id
A2D_CALL A2D_MAP_COORDS, map_coords_params
lda map_coords_params::clientx+1 ; ensure high bits of coords are 0
ora map_coords_params::clienty+1
bne L0E94
lda clicky ; click y
ldx clickx ; click x
lda map_coords_params::clienty
ldx map_coords_params::clientx
.proc find_button_row
cmp #row1_top+border_lt - 1 ; row 1 ? (- 1 is bug in original?)
@ -858,7 +866,7 @@ L0E94: rts ; used by prev/next proc
: cmp #row5_top-border_lt ; special case for tall + button
bcs :+
lda clickx
lda map_coords_params::clientx
cmp #col4_left-border_lt
bcc miss
cmp #col4_right+border_br-1 ; is -1 bug in original?
@ -874,7 +882,7 @@ L0E94: rts ; used by prev/next proc
lda row5_lookup,x
rts
: lda clickx ; special case for wide 0 button
: lda map_coords_params::clientx ; special case for wide 0 button
cmp #col1_left-border_lt
bcc miss
cmp #col2_right+border_br
@ -1309,14 +1317,14 @@ end: jsr display_buffer1
ror $FC
clear: A2D_CALL A2D_FILL_RECT, 0, invert_addr ; Inverts box
check_button:
A2D_CALL A2D_GET_BUTTON, button_state_params
lda button_state_params::state
cmp #$04 ; Button down?
A2D_CALL A2D_GET_INPUT, input_state_params
lda input_state_params::state
cmp #A2D_INPUT_HELD ; Button down?
bne done ; Nope, done immediately
lda #window_id
sta button_state_params::state
A2D_CALL $46, button_state_params
A2D_CALL A2D_SET_TEXT_POS, tpp
sta map_coords_params::id
A2D_CALL A2D_MAP_COORDS, map_coords_params
A2D_CALL A2D_SET_TEXT_POS, map_coords_params::client
A2D_CALL $13, 0, c13_addr
bne :+
lda $FC

View File

@ -203,7 +203,7 @@ base: .word 0
.endproc
.proc button_params ; queried to track mouse-up
.proc input_params ; queried to track mouse-up
state: .byte $00
.endproc
@ -380,8 +380,8 @@ end: rts
;;; Main Input Loop
.proc input_loop
A2D_CALL A2D_GET_BUTTON, button_params
lda button_params::state
A2D_CALL A2D_GET_INPUT, input_params
lda input_params::state
cmp #1 ; was clicked?
bne input_loop ; nope, keep waiting

View File

@ -245,7 +245,7 @@ track_scroll_delta:
fixed_mode_flag:
.byte $00 ; 0 = proportional, otherwise = fixed
button_state: ; queried to track mouse-up
input_params: ; queried to track mouse-up
.byte $00
.proc mouse_params ; queried by main input loop
@ -510,8 +510,8 @@ loop: lda $8802,x
;;; Main Input Loop
input_loop:
A2D_CALL A2D_GET_BUTTON, button_state
lda button_state
A2D_CALL A2D_GET_INPUT, input_params
lda input_params
cmp #1 ; was clicked?
bne input_loop ; nope, keep waiting
@ -869,8 +869,8 @@ store: sta window_params::hscroll_pos
;;; Checks button state; z clear if button was released, set otherwise
.proc was_button_released
A2D_CALL A2D_GET_BUTTON, button_state
lda button_state
A2D_CALL A2D_GET_INPUT, input_params
lda input_params
cmp #2
rts
.endproc