Identify several window-related calls

This commit is contained in:
Joshua Bell 2017-10-14 21:15:35 -07:00
parent 2d33e2be0c
commit 7f5924f870
2 changed files with 138 additions and 98 deletions

15
a2d.inc
View File

@ -321,6 +321,13 @@ A2D_QUERY_STATE := $3C ; get drawing state of window
;; .byte id window ;; .byte id window
;; .addr state state definition to populate, like A2D_SET_STATE ;; .addr state state definition to populate, like A2D_SET_STATE
A2D_UPDATE_STATE := $3D ; Update drawing state by passed window id
;; ** Implementation appears buggy - or maybe just really cryptic ??? **
;; (input length 2 bytes)
;; .byte id window
;; .byte ???
A2D_REDRAW_WINDOW := $3E ; Draws window border, background, title bar, scroll bars A2D_REDRAW_WINDOW := $3E ; Draws window border, background, title bar, scroll bars
;; (input length 1 byte) ;; (input length 1 byte)
;; .byte id ;; .byte id
@ -332,12 +339,14 @@ A2D_QUERY_TARGET := $40
;; .byte element (out) A2D_ELEM_* ;; .byte element (out) A2D_ELEM_*
;; .byte id (out) of window ;; .byte id (out) of window
;; $41 used in DeskTop but not DAs - icon in window drop A2D_QUERY_TOP := $41 ; Get id of top window
;; (input length 0 bytes) ;; (input length 0 bytes)
;; (output length 1 byte)
;; .byte id (out) window, or 0 if none
;; $42 ??? A2D_RAISE_WINDOW := $42 ; Make window topmost
;; (input length 1 byte) ;; (input length 1 byte)
;; .byte id ;; .byte id window
A2D_CLOSE_CLICK := $43 A2D_CLOSE_CLICK := $43
;; (input length 0 bytes) ;; (input length 0 bytes)

View File

@ -28,6 +28,9 @@
;; $A8 - Menu count ;; $A8 - Menu count
;; $A9-$AA - Address of current window
;; $AB-... - Copy of current window params (first 12 bytes)
;; $D0-$F3 - Drawing state ;; $D0-$F3 - Drawing state
;; $D0-$DF - Box ;; $D0-$DF - Box
;; $D0-D1 - left ;; $D0-D1 - left
@ -78,8 +81,11 @@
state_tmask := $F1 state_tmask := $F1
state_font := $F2 state_font := $F2
sizeof_state := 36 sizeof_window_params := $3A
sizeof_state := 36
state_offset_in_window_params := $14
next_offset_in_window_params := $38
active := $F4 active := $F4
active_state := $F4 ; address of live state block active_state := $F4 ; address of live state block
@ -340,12 +346,12 @@ a2d_jump_table:
.addr L7836 ; $3A .addr L7836 ; $3A
.addr QUERY_WINDOW_IMPL ; $3B QUERY_WINDOW .addr QUERY_WINDOW_IMPL ; $3B QUERY_WINDOW
.addr QUERY_STATE_IMPL ; $3C QUERY_STATE .addr QUERY_STATE_IMPL ; $3C QUERY_STATE
.addr L761F ; $3D .addr UPDATE_STATE_IMPL ; $3D UPDATE_STATE
.addr REDRAW_WINDOW_IMPL ; $3E REDRAW_WINDOW .addr REDRAW_WINDOW_IMPL ; $3E REDRAW_WINDOW
.addr L758C ; $3F .addr L758C ; $3F
.addr QUERY_TARGET_IMPL ; $40 QUERY_TARGET .addr QUERY_TARGET_IMPL ; $40 QUERY_TARGET
.addr L7639 ; $41 .addr QUERY_TOP_IMPL ; $41 QUERY_TOP
.addr L74AC ; $42 .addr RAISE_WINDOW_IMPL ; $42 RAISE_WINDOW
.addr CLOSE_CLICK_IMPL ; $43 CLOSE_CLICK .addr CLOSE_CLICK_IMPL ; $43 CLOSE_CLICK
.addr DRAG_WINDOW_IMPL ; $44 DRAG_WINDOW .addr DRAG_WINDOW_IMPL ; $44 DRAG_WINDOW
.addr DRAG_RESIZE_IMPL ; $45 DRAG_RESIZE .addr DRAG_RESIZE_IMPL ; $45 DRAG_RESIZE
@ -428,12 +434,12 @@ param_lengths:
PARAM_DEFN 0, $00, 0 ; $3A PARAM_DEFN 0, $00, 0 ; $3A
PARAM_DEFN 1, $82, 0 ; $3B QUERY_WINDOW PARAM_DEFN 1, $82, 0 ; $3B QUERY_WINDOW
PARAM_DEFN 3, $82, 0 ; $3C QUERY_STATE PARAM_DEFN 3, $82, 0 ; $3C QUERY_STATE
PARAM_DEFN 2, $82, 0 ; $3D PARAM_DEFN 2, $82, 0 ; $3D UPDATE_STATE
PARAM_DEFN 1, $82, 0 ; $3E REDRAW_WINDOW PARAM_DEFN 1, $82, 0 ; $3E REDRAW_WINDOW
PARAM_DEFN 1, $82, 0 ; $3F PARAM_DEFN 1, $82, 0 ; $3F
PARAM_DEFN 4, state_pos, 0 ; $40 QUERY_TARGET PARAM_DEFN 4, state_pos, 0 ; $40 QUERY_TARGET
PARAM_DEFN 0, $00, 0 ; $41 PARAM_DEFN 0, $00, 0 ; $41
PARAM_DEFN 1, $82, 0 ; $42 PARAM_DEFN 1, $82, 0 ; $42 RAISE_WINDOW
PARAM_DEFN 0, $00, 0 ; $43 CLOSE_CLICK PARAM_DEFN 0, $00, 0 ; $43 CLOSE_CLICK
PARAM_DEFN 5, $82, 0 ; $44 DRAG_WINDOW PARAM_DEFN 5, $82, 0 ; $44 DRAG_WINDOW
PARAM_DEFN 5, $82, 0 ; $45 DRAG_RESIZE PARAM_DEFN 5, $82, 0 ; $45 DRAG_RESIZE
@ -5886,22 +5892,28 @@ L7010: .byte $00
L7011: .addr $6FD3 L7011: .addr $6FD3
L7013: lda L7011 ;; Start window enumeration at top ???
.proc top_window
lda L7011
sta $A7 sta $A7
lda L7011+1 lda L7011+1
sta $A7+1 sta $A7+1
lda L700B lda L700B
ldx L700B+1 ldx L700B+1
bne L7038 bne next_window_L7038
L7025: rts end: rts
.endproc
L7026: lda $A9 ;; Look up next window in chain. $A9/$AA will point at
;; window params block (also returned in X,A).
.proc next_window
lda $A9
sta $A7 sta $A7
lda $A9+1 lda $A9+1
sta $A7+1 sta $A7+1
ldy #$39 ldy #next_offset_in_window_params+1
lda ($A9),y lda ($A9),y
beq L7025 beq top_window::end ; if high byte is 0, end of chain
tax tax
dey dey
lda ($A9),y lda ($A9),y
@ -5911,8 +5923,8 @@ L703E: lda L700E
ldx L700E+1 ldx L700E+1
L7044: sta $A9 L7044: sta $A9
stx $A9+1 stx $A9+1
ldy #$0B ldy #$0B ; copy first 12 bytes of window defintion to
L704A: lda ($A9),y L704A: lda ($A9),y ; to $AB
sta $AB,y sta $AB,y
dey dey
bpl L704A bpl L704A
@ -5925,23 +5937,28 @@ L7054: lda ($A9),y
L705E: lda $A9 L705E: lda $A9
ldx $A9+1 ldx $A9+1
rts rts
.endproc
next_window_L7038 := next_window::L7038
.proc L7063 ;; Look up window state by id (in $82); $A9/$AA will point at
jsr L7013 ;; window params (also X,A).
.proc window_by_id
jsr top_window
beq end beq end
loop: lda $AB loop: lda $AB
cmp $82 cmp $82
beq L705E beq next_window::L705E
jsr L7026 jsr next_window
bne loop bne loop
end: rts end: rts
.endproc .endproc
;; Look up window state by id (in $82) ;; Look up window state by id (in $82); $A9/$AA will point at
;; window params (also X,A).
;; This will exit the A2D call directly (restoring stack, etc) ;; This will exit the A2D call directly (restoring stack, etc)
;; if the window is not found. ;; if the window is not found.
.proc window_by_id .proc window_by_id_or_exit
jsr L7063 jsr window_by_id
beq nope beq nope
rts rts
nope: lda #$9F nope: lda #$9F
@ -6105,7 +6122,7 @@ L718E: jsr L70B7
lda $AD lda $AD
ldx $AD+1 ldx $AD+1
jsr draw_text jsr draw_text
L71AA: jsr L703E L71AA: jsr next_window::L703E
bit $B0 bit $B0
bpl L71B7 bpl L71B7
jsr L7104 jsr L7104
@ -6121,7 +6138,7 @@ L71C1: lda $AC
jsr L707F jsr L707F
jsr L7104 jsr L7104
jsr L707F jsr L707F
L71D3: jsr L703E L71D3: jsr next_window::L703E
lda $AB lda $AB
cmp L700D cmp L700D
bne L71E3 bne L71E3
@ -6251,7 +6268,7 @@ L72A0: jsr FILL_RECT_IMPL ; Draw title bar stripes between close box and t
sta $97 sta $97
jsr FILL_RECT_IMPL ; Draw title bar stripes to right of title jsr FILL_RECT_IMPL ; Draw title bar stripes to right of title
A2D_CALL A2D_SET_PATTERN, screen_state::pattern A2D_CALL A2D_SET_PATTERN, screen_state::pattern
L72C9: jsr L703E L72C9: jsr next_window::L703E
bit $B0 bit $B0
bpl L7319 bpl L7319
jsr L7104 jsr L7104
@ -6334,7 +6351,7 @@ L7363: lda #$00
sta $8C sta $8C
lda L71E4 lda L71E4
jsr L79A0 jsr L79A0
jsr L703E jsr next_window::L703E
L737B: lda $AF L737B: lda $AF
and #$01 and #$01
beq L738E beq L738E
@ -6342,7 +6359,7 @@ L737B: lda $AF
sta $8C sta $8C
lda L71E4 lda L71E4
jsr L79A0 jsr L79A0
jsr L703E jsr next_window::L703E
L738E: lda $AC L738E: lda $AC
and #$04 and #$04
beq L73BE beq L73BE
@ -6425,12 +6442,12 @@ L7408: pha
L7416: lda #$00 L7416: lda #$00
sta L747A sta L747A
jsr L7013 jsr top_window
beq L7430 beq L7430
L7420: jsr L70B7 L7420: jsr L70B7
jsr L7086 jsr L7086
bne L7434 bne L7434
jsr L7026 jsr next_window
stx L747A stx L747A
bne L7420 bne L7420
L7430: lda #$00 L7430: lda #$00
@ -6482,7 +6499,7 @@ CREATE_WINDOW_IMPL:
jmp a2d_exit_with_a jmp a2d_exit_with_a
L748E: sta $82 L748E: sta $82
jsr L7063 jsr window_by_id
beq L749A beq L749A
lda #$9D lda #$9D
jmp a2d_exit_with_a jmp a2d_exit_with_a
@ -6499,13 +6516,12 @@ L749A: lda params_addr
;;; ================================================== ;;; ==================================================
;;; $42 IMPL ;;; RAISE_WINDOW IMPL
;;; 1 byte of params, copied to $82 ;;; 1 byte of params, copied to $82
;; Seems to be called when window becomes top-most RAISE_WINDOW_IMPL:
L74AC: jsr window_by_id_or_exit
jsr window_by_id
cmp L700B cmp L700B
bne L74BA bne L74BA
cpx L700C cpx L700C
@ -6513,7 +6529,7 @@ L74AC:
rts rts
L74BA: jsr L74F4 L74BA: jsr L74F4
L74BD: ldy #$38 L74BD: ldy #next_offset_in_window_params ; Called from elsewhere
lda L700B lda L700B
sta ($A9),y sta ($A9),y
iny iny
@ -6525,20 +6541,20 @@ L74BD: ldy #$38
pha pha
jsr L653C jsr L653C
jsr L6588 jsr L6588
jsr L7013 jsr top_window
beq L74DE beq L74DE
jsr L7205 jsr L7205
L74DE: pla L74DE: pla
sta L700C sta L700C
pla pla
sta L700B sta L700B
jsr L7013 jsr top_window
lda $AB lda $AB
sta L700D sta L700D
jsr L718E jsr L718E
jmp L6553 jmp L6553
L74F4: ldy #$38 L74F4: ldy #next_offset_in_window_params ; Called from elsewhere
lda ($A9),y lda ($A9),y
sta ($A7),y sta ($A7),y
iny iny
@ -6552,12 +6568,14 @@ L74F4: ldy #$38
;;; 1 byte of params, copied to $C7 ;;; 1 byte of params, copied to $C7
QUERY_WINDOW_IMPL: .proc QUERY_WINDOW_IMPL
jsr window_by_id ptr := $A9
lda $A9 jsr window_by_id_or_exit
ldx $A9+1 lda ptr
ldy #$01 ldx ptr+1
ldy #1
jmp store_xa_at_params_y jmp store_xa_at_params_y
.endproc
;;; ================================================== ;;; ==================================================
@ -6565,15 +6583,10 @@ QUERY_WINDOW_IMPL:
;;; 1 byte of params, copied to $82 ;;; 1 byte of params, copied to $82
L750C: .byte $00 L750C: .res 38,0
L750D: .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,$00,$00
.byte $00,$00,$00,$00,$00
REDRAW_WINDOW_IMPL: .proc REDRAW_WINDOW_IMPL
jsr window_by_id jsr window_by_id_or_exit
lda $AB lda $AB
cmp L7010 cmp L7010
bne L753F bne L753F
@ -6588,11 +6601,11 @@ L7550: jsr L718E
lda L7871 lda L7871
bne L7561 bne L7561
A2D_CALL A2D_SET_BOX, set_box_params A2D_CALL A2D_SET_BOX, set_box_params
L7561: jsr L703E L7561: jsr next_window::L703E
lda active_state lda active_state
sta L750C sta L750C
lda active_state+1 lda active_state+1
sta L750D sta L750C+1
jsr L75C6 jsr L75C6
php php
lda L758A lda L758A
@ -6602,6 +6615,7 @@ L7561: jsr L703E
plp plp
bcc L7582 bcc L7582
rts rts
.endproc
L7582: jsr L758C L7582: jsr L758C
L7585: lda #$A3 L7585: lda #$A3
@ -6618,7 +6632,7 @@ L758B: .byte $75
L758C: jsr SHOW_CURSOR_IMPL L758C: jsr SHOW_CURSOR_IMPL
lda L750C lda L750C
ldx L750D ldx L750C+1
sta active_state sta active_state
stx active_state+1 stx active_state+1
jmp L6567 jmp L6567
@ -6629,7 +6643,7 @@ L758C: jsr SHOW_CURSOR_IMPL
QUERY_STATE_IMPL: QUERY_STATE_IMPL:
jsr apply_state_to_active_state jsr apply_state_to_active_state
jsr window_by_id jsr window_by_id_or_exit
lda $83 lda $83
sta params_addr sta params_addr
lda $84 lda $84
@ -6700,46 +6714,58 @@ L75EA: lda $92,x
;;; ================================================== ;;; ==================================================
;;; $3D IMPL ;;; UPDATE_STATE IMPL
;;; 2 bytes of params, copied to $82 ;;; 2 bytes of params, copied to $82
L761F: ;; This updates current state from params ???
jsr window_by_id ;; The math is weird; $82 is the window id so
lda $A9 ;; how does ($82),y do anything useful - is
;; this buggy ???
;; It seems like it's trying to update a fraction
;; of the drawing state (from |pattern| to |font|)
.proc UPDATE_STATE_IMPL
ptr := $A9
jsr window_by_id_or_exit
lda ptr
clc clc
adc #$14 adc #state_offset_in_window_params
sta $A9 sta ptr
bcc L762D bcc :+
inc $AA inc ptr+1
L762D: ldy #sizeof_state-1 : ldy #sizeof_state-1
L762F: lda ($82),y loop: lda ($82),y
sta ($A9),y sta ($A9),y
dey dey
cpy #$10 cpy #$10
bcs L762F bcs loop
rts rts
.endproc
;;; ================================================== ;;; ==================================================
;;; $41 IMPL ;;; QUERY_TOP IMPL
L7639: .proc QUERY_TOP_IMPL
jsr L7013 jsr top_window
beq L7642 beq nope
lda $AB lda $AB
bne L7644 bne :+
L7642: lda #$00 nope: lda #0
L7644: ldy #$00 : ldy #0
sta (params_addr),y sta (params_addr),y
rts rts
.endproc
;;; ================================================== ;;; ==================================================
in_close_box: .byte 0 in_close_box: .byte 0
.proc CLOSE_CLICK_IMPL .proc CLOSE_CLICK_IMPL
jsr L7013 jsr top_window
beq end beq end
jsr L7157 jsr L7157
jsr L653F jsr L653F
@ -6809,7 +6835,7 @@ L76B6: lda $83,x
sta L76A3,x sta L76A3,x
dex dex
bpl L76B6 bpl L76B6
jsr window_by_id jsr window_by_id_or_exit
bit L7D74 bit L7D74
bpl L76D1 bpl L76D1
jsr L817C jsr L817C
@ -6818,7 +6844,7 @@ L76D1: jsr L653C
lda #$02 lda #$02
jsr set_fill_mode jsr set_fill_mode
A2D_CALL A2D_SET_PATTERN, checkerboard_pattern A2D_CALL A2D_SET_PATTERN, checkerboard_pattern
L76E2: jsr L703E L76E2: jsr next_window::L703E
jsr L7749 jsr L7749
jsr L70B7 jsr L70B7
jsr L707F jsr L707F
@ -6972,8 +6998,8 @@ L7814: rts
;;; 1 byte of params, copied to $82 ;;; 1 byte of params, copied to $82
DESTROY_WINDOW_IMPL: .proc DESTROY_WINDOW_IMPL
jsr window_by_id jsr window_by_id_or_exit
jsr L653C jsr L653C
jsr L784C jsr L784C
jsr L74F4 jsr L74F4
@ -6981,17 +7007,18 @@ DESTROY_WINDOW_IMPL:
lda ($A9),y lda ($A9),y
and #$7F and #$7F
sta ($A9),y sta ($A9),y
jsr L7013 jsr top_window
lda $AB lda $AB
sta L700D sta L700D
lda #$00 lda #$00
jmp L7872 jmp L7872
.endproc
;;; ================================================== ;;; ==================================================
;;; $3A IMPL ;;; $3A IMPL
L7836: jsr L7013 L7836: jsr top_window
beq L7849 beq L7849
ldy #$0A ldy #$0A
lda ($A9),y lda ($A9),y
@ -7031,12 +7058,12 @@ L7872: sta L7010
A2D_CALL A2D_SET_PATTERN, checkerboard_pattern A2D_CALL A2D_SET_PATTERN, checkerboard_pattern
A2D_CALL A2D_FILL_RECT, set_box_params_box A2D_CALL A2D_FILL_RECT, set_box_params_box
jsr L6553 jsr L6553
jsr L7013 jsr top_window
beq L78CA beq L78CA
php php
sei sei
jsr CALL_2B_IMPL jsr CALL_2B_IMPL
L789E: jsr L7026 L789E: jsr next_window
bne L789E bne L789E
L78A3: jsr L67E4 L78A3: jsr L67E4
bcs L78C9 bcs L78C9
@ -7049,10 +7076,10 @@ L78A3: jsr L67E4
cmp L700D cmp L700D
beq L78C9 beq L78C9
sta $82 sta $82
jsr L7063 jsr window_by_id
lda $A7 lda $A7
ldx $A8 ldx $A8
jsr L7044 jsr next_window::L7044
jmp L78A3 jmp L78A3
L78C9: plp L78C9: plp
@ -7080,10 +7107,13 @@ height: .word 0
;;; $47 IMPL ;;; $47 IMPL
L78E1: ;; $83/$84 += $B7/$B8
jsr window_by_id ;; $85/$86 += $B9/$BA
ldx #$02
L78E6: lda $83,x .proc L78E1
jsr window_by_id_or_exit
ldx #2
loop: lda $83,x
clc clc
adc $B7,x adc $B7,x
sta $83,x sta $83,x
@ -7092,15 +7122,16 @@ L78E6: lda $83,x
sta $84,x sta $84,x
dex dex
dex dex
bpl L78E6 bpl loop
bmi L790F bmi L790F
.endproc
;;; ================================================== ;;; ==================================================
;;; 5 bytes of params, copied to $82 ;;; 5 bytes of params, copied to $82
MAP_COORDS_IMPL: MAP_COORDS_IMPL:
jsr window_by_id jsr window_by_id_or_exit
ldx #$02 ldx #$02
L78FE: lda $83,x L78FE: lda $83,x
sec sec
@ -7183,7 +7214,7 @@ L7971: cmp #$02
L797B: rts L797B: rts
L797C: jsr L653C L797C: jsr L653C
jsr L7013 jsr top_window
bit $8C bit $8C
bpl L798C bpl L798C
lda $B0 lda $B0
@ -7355,7 +7386,7 @@ L7AA4: pha
QUERY_CLIENT_IMPL: QUERY_CLIENT_IMPL:
jsr L653F jsr L653F
jsr L7013 jsr top_window
bne L7ACE bne L7ACE
lda #$A0 lda #$A0
jmp a2d_exit_with_a jmp a2d_exit_with_a
@ -7459,7 +7490,7 @@ L7B81: cmp #$02
L7B8B: lda #$A4 L7B8B: lda #$A4
jmp a2d_exit_with_a jmp a2d_exit_with_a
L7B90: jsr L7013 L7B90: jsr top_window
bne L7B9A bne L7B9A
lda #$A0 lda #$A0
jmp a2d_exit_with_a jmp a2d_exit_with_a
@ -7500,7 +7531,7 @@ L7BCB: lda $83,x
sta L769F,x sta L769F,x
dex dex
bpl L7BCB bpl L7BCB
jsr L7013 jsr top_window
bne L7BE0 bne L7BE0
lda #$A0 lda #$A0
jmp a2d_exit_with_a jmp a2d_exit_with_a
@ -7521,7 +7552,7 @@ L7BFD: jsr L691B
beq L7BFD beq L7BFD
jsr HIDE_CURSOR_IMPL jsr HIDE_CURSOR_IMPL
jsr L707F jsr L707F
jsr L7013 jsr top_window
jsr L7A73 jsr L7A73
ldx #$00 ldx #$00
lda #$14 lda #$14
@ -7681,7 +7712,7 @@ L7D30: cmp #$02
L7D3A: lda #$A4 L7D3A: lda #$A4
jmp a2d_exit_with_a jmp a2d_exit_with_a
L7D3F: jsr L7013 L7D3F: jsr top_window
bne L7D49 bne L7D49
lda #$A0 lda #$A0
jmp a2d_exit_with_a jmp a2d_exit_with_a