Identify GET_CURSOR

This commit is contained in:
Joshua Bell 2017-10-14 12:51:25 -07:00
parent 492183f7ee
commit 16a3a1da87
2 changed files with 105 additions and 80 deletions

View File

@ -192,7 +192,7 @@ A2D_CONFIGURE_ZP_USE := $1A ; Configure ZP usage by API (speed vs. convenien
;; (input length 1 byte) ;; (input length 1 byte)
;; .byte flag (AWS_CZP_*; high bit set = preserve ZP during calls) ;; .byte flag (AWS_CZP_*; high bit set = preserve ZP during calls)
A2D_SET_CURSOR := $24 ; Change cursor pattern A2D_SET_CURSOR := $24 ; Set cursor definition
;; (input not copied) ;; (input not copied)
;; .res 24 bitmap 2x12 byte bitmap ;; .res 24 bitmap 2x12 byte bitmap
;; .res 24 mask 2x12 byte mask ;; .res 24 mask 2x12 byte mask
@ -205,6 +205,11 @@ A2D_SHOW_CURSOR := $25
A2D_HIDE_CURSOR := $26 A2D_HIDE_CURSOR := $26
;; (no parameters; pass $0000 as address) ;; (no parameters; pass $0000 as address)
A2D_GET_CURSOR := $28 ; Get cursor definition
;; (input length 0 bytes)
;; (output length 2 bytes)
;; .addr definition See A2D_SET_CURSOR
A2D_GET_INPUT := $2A A2D_GET_INPUT := $2A
;; (input length 0 bytes) ;; (input length 0 bytes)
;; (output length 5 bytes) ;; (output length 5 bytes)

View File

@ -317,7 +317,7 @@ a2d_jump_table:
.addr SHOW_CURSOR_IMPL ; $25 SHOW_CURSOR .addr SHOW_CURSOR_IMPL ; $25 SHOW_CURSOR
.addr HIDE_CURSOR_IMPL ; $26 HIDE_CURSOR .addr HIDE_CURSOR_IMPL ; $26 HIDE_CURSOR
.addr L624E ; $27 .addr L624E ; $27
.addr L630A ; $28 .addr GET_CURSOR_IMPL ; $28 GET_CURSOR
.addr L6663 ; $29 .addr L6663 ; $29
.addr GET_INPUT_IMPL ; $2A GET_INPUT .addr GET_INPUT_IMPL ; $2A GET_INPUT
.addr CALL_2B_IMPL ; $2B .addr CALL_2B_IMPL ; $2B
@ -405,7 +405,7 @@ param_lengths:
PARAM_DEFN 0, $00, 0 ; $25 SHOW_CURSOR PARAM_DEFN 0, $00, 0 ; $25 SHOW_CURSOR
PARAM_DEFN 0, $00, 0 ; $26 HIDE_CURSOR PARAM_DEFN 0, $00, 0 ; $26 HIDE_CURSOR
PARAM_DEFN 0, $00, 0 ; $27 PARAM_DEFN 0, $00, 0 ; $27
PARAM_DEFN 0, $00, 0 ; $28 PARAM_DEFN 0, $00, 0 ; $28 GET_CURSOR
PARAM_DEFN 0, $00, 0 ; $29 PARAM_DEFN 0, $00, 0 ; $29
PARAM_DEFN 0, $00, 0 ; $2A GET_INPUT PARAM_DEFN 0, $00, 0 ; $2A GET_INPUT
PARAM_DEFN 0, $00, 0 ; $2B PARAM_DEFN 0, $00, 0 ; $2B
@ -3634,8 +3634,11 @@ active_saved: ; saved copy of $F4...$FF when ZP swapped
zp_saved: ; top half of ZP for when preserve_zp_flag set zp_saved: ; top half of ZP for when preserve_zp_flag set
.res 128, 0 .res 128, 0
L5FF2: .byte $00 ;; cursor shown/hidden flags/counts
L5FF3: .byte $FF cursor_flag: ; high bit clear if cursor drawn, set if not drawn
.byte 0
cursor_count:
.byte $FF ; decremented on hide, incremented on shown; 0 = visible
.proc set_pos_params .proc set_pos_params
xcoord: .word 0 xcoord: .word 0
@ -3653,8 +3656,10 @@ L5FFE: .byte $00
L5FFF: .byte $00 L5FFF: .byte $00
L6000: .byte $00 L6000: .byte $00
L6001: .byte $00 L6001: .byte $00
L6002: .byte $00
L6003: .byte $00 cursor_hotspot_x: .byte $00
cursor_hotspot_y: .byte $00
L6004: .byte $00 L6004: .byte $00
L6005: .byte $00 L6005: .byte $00
L6006: .byte $00 L6006: .byte $00
@ -3677,9 +3682,9 @@ L602F: .byte $00,$00,$00,$00,$00,$00,$02,$00
L6065: .byte $33 L6065: .byte $33
L6066: .byte $60 L6066: .byte $60
L6067: lda #$FF L6067: lda #$FF
sta L5FF3 sta cursor_count
lda #$00 lda #0
sta L5FF2 sta cursor_flag
lda L6065 lda L6065
sta params_addr sta params_addr
lda L6066 lda L6066
@ -3688,47 +3693,55 @@ L6067: lda #$FF
;;; ================================================== ;;; ==================================================
cursor_height := 12
cursor_width := 2
cursor_mask_offset := cursor_width * cursor_height
cursor_hotspot_offset := 2 * cursor_width * cursor_height
SET_CURSOR_IMPL: SET_CURSOR_IMPL:
php php
sei sei
lda params_addr lda params_addr
ldx params_addr+1 ldx params_addr+1
sta L6142 sta active_cursor
stx L6142+1 stx active_cursor+1
clc clc
adc #$18 adc #cursor_mask_offset
bcc L608D bcc :+
inx inx
L608D: sta L6148 : sta active_cursor_mask
stx L6148+1 stx active_cursor_mask+1
ldy #$30 ldy #cursor_hotspot_offset
lda (params_addr),y lda (params_addr),y
sta L6002 sta cursor_hotspot_x
iny iny
lda (params_addr),y lda (params_addr),y
sta L6003 sta cursor_hotspot_y
jsr L61C6 jsr restore_cursor_background
jsr L60B2 jsr draw_cursor
plp plp
L60A7: rts L60A7: rts
L60A8: lda L5FF3 update_cursor:
lda cursor_count ; hidden? if so, skip
bne L60A7 bne L60A7
bit L5FF2 bit cursor_flag
bmi L60A7 bmi L60A7
L60B2: lda #$00
sta L5FF3 draw_cursor:
sta L5FF2 lda #$00
sta cursor_count
sta cursor_flag
lda set_pos_params::ycoord lda set_pos_params::ycoord
clc clc
sbc L6003 sbc cursor_hotspot_y
sta $84 sta $84
clc clc
adc #$0C adc #$0C
sta $85 sta $85
lda set_pos_params::xcoord lda set_pos_params::xcoord
sec sec
sbc L6002 sbc cursor_hotspot_x
tax tax
lda set_pos_params::xcoord+1 lda set_pos_params::xcoord+1
sbc #$00 sbc #$00
@ -3786,10 +3799,10 @@ L612D: lda hires_table_lo,y
ldy $86 ldy $86
ldx #$01 ldx #$01
L6141: L6141:
L6142 := * + 1 active_cursor := * + 1
lda $FFFF,y lda $FFFF,y
sta L6005,x sta L6005,x
L6148 := * + 1 active_cursor_mask := * + 1
lda $FFFF,y lda $FFFF,y
sta L6008,x sta L6008,x
dey dey
@ -3852,10 +3865,12 @@ L61B9: dec $86
L61C5: rts L61C5: rts
L61C6: lda L5FF3 restore_cursor_background:
lda cursor_count ; already hidden?
bne L61C5 bne L61C5
bit L5FF2 bit cursor_flag
bmi L61C5 bmi L61C5
ldx #$03 ldx #$03
L61D2: lda L602F,x L61D2: lda L602F,x
sta $82,x sta $82,x
@ -3912,15 +3927,15 @@ L622E: bbs7 $C0,L61F1
.proc SHOW_CURSOR_IMPL .proc SHOW_CURSOR_IMPL
php php
sei sei
lda L5FF3 lda cursor_count
beq done beq done
inc L5FF3 inc cursor_count
bmi done bmi done
beq :+ beq :+
dec L5FF3 dec cursor_count
: bit L5FF2 : bit cursor_flag
bmi done bmi done
jsr L60B2 jsr draw_cursor
done: plp done: plp
rts rts
.endproc .endproc
@ -3932,9 +3947,9 @@ done: plp
L624E: L624E:
php php
sei sei
jsr L61C6 jsr restore_cursor_background
lda #$80 lda #$80
sta L5FF2 sta cursor_flag
plp plp
rts rts
@ -3943,8 +3958,8 @@ L624E:
HIDE_CURSOR_IMPL: HIDE_CURSOR_IMPL:
php php
sei sei
jsr L61C6 jsr restore_cursor_background
dec L5FF3 dec cursor_count
plp plp
L6263: rts L6263: rts
@ -3967,14 +3982,14 @@ L627E: lda mouse_x_lo,x
dex dex
bpl L627E bpl L627E
bmi L629F bmi L629F
L628B: jsr L61C6 L628B: jsr restore_cursor_background
ldx #2 ldx #2
stx L5FF2 stx cursor_flag
L6293: lda mouse_x_lo,x L6293: lda mouse_x_lo,x
sta set_pos_params,x sta set_pos_params,x
dex dex
bpl L6293 bpl L6293
jsr L60A8 jsr update_cursor
L629F: bit no_mouse_flag L629F: bit no_mouse_flag
bmi L62A7 bmi L62A7
jsr L62BA jsr L62BA
@ -4023,12 +4038,15 @@ L6309: rts
;;; ================================================== ;;; ==================================================
;;; $28 IMPL ;;; GET_CURSOR IMPL
L630A: .proc GET_CURSOR_IMPL
lda L6142 lda active_cursor
ldx L6142+1 ldx active_cursor+1
jmp store_xa_at_params jmp store_xa_at_params
.endproc
;;; ==================================================
;; Call mouse firmware, operation in Y, param in A ;; Call mouse firmware, operation in Y, param in A
call_mouse: call_mouse:
@ -4508,7 +4526,7 @@ L6645: lda #0
L664E: ldy #0 L664E: ldy #0
sta (params_addr),y ; Store 5 bytes at params sta (params_addr),y ; Store 5 bytes at params
iny iny
L6653: lda L5FF3,y L6653: lda cursor_count,y
sta (params_addr),y sta (params_addr),y
iny iny
cpy #$05 cpy #$05
@ -5188,8 +5206,10 @@ L6B29: jsr L653C
jsr L6B35 jsr L6B35
jmp L6553 jmp L6553
L6B35: ldx #$01 ;; Highlight/Unhighlight top level menu item
L6B37: lda $B7,x .proc L6B35
ldx #$01
loop: lda $B7,x
sta fill_rect_params2::left,x sta fill_rect_params2::left,x
lda $B9,x lda $B9,x
sta fill_rect_params2::width,x sta fill_rect_params2::width,x
@ -5200,11 +5220,12 @@ L6B37: lda $B7,x
sta test_box_params2::right,x sta test_box_params2::right,x
sta fill_rect_params4::right,x sta fill_rect_params4::right,x
dex dex
bpl L6B37 bpl loop
lda #$02 lda #$02
jsr L68F5 jsr L68F5
A2D_CALL A2D_FILL_RECT, fill_rect_params2 A2D_CALL A2D_FILL_RECT, fill_rect_params2
rts rts
.endproc
;;; ================================================== ;;; ==================================================
@ -7847,9 +7868,9 @@ L7EFB: cmp #$04
L7F0C: jmp L825F L7F0C: jmp L825F
L7F0F: jsr stash_params_addr L7F0F: jsr stash_params_addr
lda L6142 lda active_cursor
sta L7F2E sta L7F2E
lda L6142+1 lda active_cursor+1
sta L7F2F sta L7F2F
lda L6065 lda L6065
sta params_addr sta params_addr
@ -8809,7 +8830,7 @@ L8616: cmp #$57
jsr L6B17 jsr L6B17
ldx $D5CA ldx $D5CA
txs txs
L8625: A2D_RELAY_CALL $33, $D63F L8625: A2D_RELAY_CALL $33, desktop_win18_state
rts rts
lda #$9C lda #$9C
@ -8817,7 +8838,7 @@ L8625: A2D_RELAY_CALL $33, $D63F
jsr L6B17 jsr L6B17
ldx $D5CA ldx $D5CA
txs txs
A2D_RELAY_CALL $33, $D63F A2D_RELAY_CALL $33, desktop_win18_state
rts rts
lda #$BF lda #$BF
@ -8825,7 +8846,7 @@ L8625: A2D_RELAY_CALL $33, $D63F
jsr L6B17 jsr L6B17
ldx $D5CA ldx $D5CA
txs txs
A2D_RELAY_CALL $33, $D63F A2D_RELAY_CALL $33, desktop_win18_state
rts rts
sta L8737 sta L8737
@ -9381,11 +9402,8 @@ L9018: .byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00 .byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00 .byte $00,$00,$00,$00,$00,$00
;; buffer for drag icon outline shape drag_outline_buffer:
L9096: .byte $00,$00 .res 680, 0
L9098:
.res 678, 0
L933E: .byte $00 L933E: .byte $00
@ -10136,9 +10154,9 @@ L98AC: lda L9016
bcc L98B6 bcc L98B6
jmp L9852 jmp L9852
L98B6: lda #<L9096 L98B6: lda #<drag_outline_buffer
sta $08 sta $08
lda #>L9096 lda #>drag_outline_buffer
sta $08+1 sta $08+1
lda L9015 lda L9015
bne L98C8 bne L98C8
@ -10211,13 +10229,13 @@ L9954: dec L9C74
jmp L98F2 jmp L98F2
L995F: ldx #$07 L995F: ldx #$07
L9961: lda L9098,x L9961: lda drag_outline_buffer+2,x
sta L9C76,x sta L9C76,x
dex dex
bpl L9961 bpl L9961
lda #<L9096 lda #<drag_outline_buffer
sta $08 sta $08
lda #>L9096 lda #>drag_outline_buffer
sta $08+1 sta $08+1
L9972: ldy #$02 L9972: ldy #$02
L9974: lda ($08),y L9974: lda ($08),y
@ -10292,7 +10310,7 @@ L99E1: iny
L99FC: A2D_CALL A2D_SET_PATTERN, checkerboard_pattern2 L99FC: A2D_CALL A2D_SET_PATTERN, checkerboard_pattern2
A2D_CALL A2D_SET_FILL_MODE, const2a A2D_CALL A2D_SET_FILL_MODE, const2a
A2D_CALL A2D_DRAW_POLYGONS, L9096 A2D_CALL A2D_DRAW_POLYGONS, drag_outline_buffer
L9A0E: A2D_CALL $2C, L933E L9A0E: A2D_CALL $2C, L933E
lda L933E lda L933E
cmp #$04 cmp #$04
@ -10323,11 +10341,11 @@ L9A33: lda query_target_params2,x
beq L9A84 beq L9A84
A2D_CALL A2D_SET_PATTERN, checkerboard_pattern2 A2D_CALL A2D_SET_PATTERN, checkerboard_pattern2
A2D_CALL A2D_SET_FILL_MODE, const2a A2D_CALL A2D_SET_FILL_MODE, const2a
A2D_CALL A2D_DRAW_POLYGONS, L9096 A2D_CALL A2D_DRAW_POLYGONS, drag_outline_buffer
DESKTOP_DIRECT_CALL $B, $9830 DESKTOP_DIRECT_CALL $B, $9830
A2D_CALL A2D_SET_PATTERN, checkerboard_pattern2 A2D_CALL A2D_SET_PATTERN, checkerboard_pattern2
A2D_CALL A2D_SET_FILL_MODE, const2a A2D_CALL A2D_SET_FILL_MODE, const2a
A2D_CALL A2D_DRAW_POLYGONS, L9096 A2D_CALL A2D_DRAW_POLYGONS, drag_outline_buffer
lda #$00 lda #$00
sta L9830 sta L9830
L9A84: lda query_target_params2::queryx L9A84: lda query_target_params2::queryx
@ -10415,10 +10433,10 @@ L9B48: bit L9C75
L9B4E: .byte $03 L9B4E: .byte $03
jmp L9A0E jmp L9A0E
L9B52: A2D_CALL A2D_DRAW_POLYGONS, L9096 L9B52: A2D_CALL A2D_DRAW_POLYGONS, drag_outline_buffer
lda #<L9096 lda #<drag_outline_buffer
sta $08 sta $08
lda #>L9096 lda #>drag_outline_buffer
sta $08+1 sta $08+1
L9B60: ldy #$02 L9B60: ldy #$02
L9B62: lda ($08),y L9B62: lda ($08),y
@ -10452,10 +10470,10 @@ L9B62: lda ($08),y
inc $09 inc $09
L9B99: jmp L9B60 L9B99: jmp L9B60
L9B9C: A2D_CALL A2D_DRAW_POLYGONS, L9096 L9B9C: A2D_CALL A2D_DRAW_POLYGONS, drag_outline_buffer
jmp L9A0E jmp L9A0E
L9BA5: A2D_CALL A2D_DRAW_POLYGONS, L9096 L9BA5: A2D_CALL A2D_DRAW_POLYGONS, drag_outline_buffer
lda L9830 lda L9830
beq L9BB9 beq L9BB9
DESKTOP_DIRECT_CALL $B, $9830 DESKTOP_DIRECT_CALL $B, $9830
@ -10504,9 +10522,9 @@ L9C18: jsr LA382
dex dex
txa txa
pha pha
lda #<L9096 lda #<drag_outline_buffer
sta $08 sta $08
lda #>L9096 lda #>drag_outline_buffer
sta $09 sta $09
L9C29: lda L9017,x L9C29: lda L9017,x
asl a asl a
@ -10789,11 +10807,11 @@ L9E3D: cmp L9017,x
L9E6A: sta L9830 L9E6A: sta L9830
A2D_CALL A2D_SET_PATTERN, checkerboard_pattern2 A2D_CALL A2D_SET_PATTERN, checkerboard_pattern2
A2D_CALL A2D_SET_FILL_MODE, const2a A2D_CALL A2D_SET_FILL_MODE, const2a
A2D_CALL A2D_DRAW_POLYGONS, L9096 A2D_CALL A2D_DRAW_POLYGONS, drag_outline_buffer
DESKTOP_DIRECT_CALL $2, $9830 DESKTOP_DIRECT_CALL $2, $9830
A2D_CALL A2D_SET_PATTERN, checkerboard_pattern2 A2D_CALL A2D_SET_PATTERN, checkerboard_pattern2
A2D_CALL A2D_SET_FILL_MODE, const2a A2D_CALL A2D_SET_FILL_MODE, const2a
A2D_CALL A2D_DRAW_POLYGONS, L9096 A2D_CALL A2D_DRAW_POLYGONS, drag_outline_buffer
L9E97: A2D_CALL A2D_QUERY_SCREEN, query_screen_params L9E97: A2D_CALL A2D_QUERY_SCREEN, query_screen_params
A2D_CALL A2D_SET_STATE, query_screen_params A2D_CALL A2D_SET_STATE, query_screen_params
A2D_CALL A2D_SET_PATTERN, checkerboard_pattern2 A2D_CALL A2D_SET_PATTERN, checkerboard_pattern2
@ -13343,7 +13361,7 @@ LD293:
.byte $00,$00,$00,$00,$88,$00,$08,$00 .byte $00,$00,$00,$00,$88,$00,$08,$00
.byte $13,$00,$00,$00,$00,$00,$00 .byte $13,$00,$00,$00,$00,$00,$00
;;; Cursors (bitmap, mask, hotspot) ;;; Cursors (bitmap - 2x12 bytes, mask - 2x12 bytes, hotspot - 2 bytes)
;;; Pointer ;;; Pointer
@ -13592,6 +13610,7 @@ w1: .word $96
h1: .word $32 h1: .word $32
w2: .word $1F4 w2: .word $1F4
h2: .word $8C h2: .word $8C
state:
left: .word $50 left: .word $50
top: .word $28 top: .word $28
addr: .addr A2D_SCREEN_ADDR addr: .addr A2D_SCREEN_ADDR
@ -14357,3 +14376,4 @@ app_mask:
.endproc .endproc
desktop_LD05E := desktop::LD05E desktop_LD05E := desktop::LD05E
desktop_A2D_RELAY := desktop::A2D_RELAY desktop_A2D_RELAY := desktop::A2D_RELAY
desktop_win18_state := desktop::win18::state