diff --git a/desk.acc/a2d.inc b/desk.acc/a2d.inc index 6db9472..79d2985 100644 --- a/desk.acc/a2d.inc +++ b/desk.acc/a2d.inc @@ -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 diff --git a/desk.acc/calculator.s b/desk.acc/calculator.s index c59acc4..ee7d461 100644 --- a/desk.acc/calculator.s +++ b/desk.acc/calculator.s @@ -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 diff --git a/desk.acc/show_image_file.s b/desk.acc/show_image_file.s index ce85322..9bfe747 100644 --- a/desk.acc/show_image_file.s +++ b/desk.acc/show_image_file.s @@ -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 diff --git a/desk.acc/show_text_file.s b/desk.acc/show_text_file.s index 59ede96..d89b640 100644 --- a/desk.acc/show_text_file.s +++ b/desk.acc/show_text_file.s @@ -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