From 2d33e2be0caa938dcf3f12e96045ec414fd330b9 Mon Sep 17 00:00:00 2001 From: Joshua Bell Date: Sat, 14 Oct 2017 19:45:51 -0700 Subject: [PATCH] Identify MENU_CLICK --- a2d.inc | 28 +++++++++++ desktop/s123_aux.s | 119 +++++++++++++++++++++++++-------------------- 2 files changed, 95 insertions(+), 52 deletions(-) diff --git a/a2d.inc b/a2d.inc index 115dae7..e4aa446 100644 --- a/a2d.inc +++ b/a2d.inc @@ -240,6 +240,34 @@ A2D_SET_INPUT := $2D ; Set pending input state (mouse or keyboard) ;; .word xcoord ;; .word ycoord +A2D_SET_MENU := $30 ; Configure (and draw) menu + ;; (input not copied) + ;; .word count Number of top-level menus + ;; + ;; .word menu_id Menu identifier + ;; .addr label Address of pascal (length-prefixed) string + ;; .addr menu_defn Address of menu definition + ;; .word 0,0,0 (overwritten with ???, left edge, right edge) + ;; ... + ;; + ;; Menu definitions are: + ;; .word count Number of items in menu + + ;; Menu items are: + ;; .word 0,0 ??? + ;; .word has_shortcut 1 if has keyboard shortcuts, 0 otherwise + ;; .byte shortcut1 ASCII code of shortcut #1 (e.g. uppercase B); or 0 + ;; .byte shortcut2 ASCII code of shortcut #2 (e.g. uppercase b, or same); or 0 + ;; .addr label Address of pascal (length-prefixed) string + ;; or for a separator: + ;; .word $40, $13, $0 + +A2D_MENU_CLICK := $31 ; Enter modal loop for handling mouse-down on menu bar + ;; (input not copied) + ;; (output 2 bytes) + ;; .byte menu_id Top level menu identifier, or 0 if none + ;; .byte item_num Index (1-based) of item in menu, or 0 if none + A2D_CREATE_WINDOW := $38 ;; (input not copied) ;; .byte id 0 = desktop, 1-...n = DeskTop windows, DAs use 51, 52, 100 diff --git a/desktop/s123_aux.s b/desktop/s123_aux.s index 00d9ad6..6fa8bf6 100644 --- a/desktop/s123_aux.s +++ b/desktop/s123_aux.s @@ -26,6 +26,8 @@ ;; $8A initialized same way as state (see $01 IMPL) + ;; $A8 - Menu count + ;; $D0-$F3 - Drawing state ;; $D0-$DF - Box ;; $D0-D1 - left @@ -325,8 +327,8 @@ a2d_jump_table: .addr SET_INPUT_IMPL ; $2D SET_INPUT .addr L6814 ; $2E .addr L6ECD ; $2F - .addr L6926 ; $30 - .addr L6BDB ; $31 + .addr SET_MENU_IMPL ; $30 SET_MENU + .addr MENU_CLICK_IMPL ; $31 MENU_CLICK .addr L6B60 ; $32 .addr L6B1D ; $33 .addr L6BCB ; $34 @@ -413,8 +415,8 @@ param_lengths: PARAM_DEFN 5, $82, 0 ; $2D SET_INPUT PARAM_DEFN 1, $82, 0 ; $2E PARAM_DEFN 4, $82, 0 ; $2F - PARAM_DEFN 0, $00, 0 ; $30 - PARAM_DEFN 0, $00, 0 ; $31 + PARAM_DEFN 0, $00, 0 ; $30 SET_MENU + PARAM_DEFN 0, $00, 0 ; $31 MENU_CLICK PARAM_DEFN 4, $C7, 0 ; $32 PARAM_DEFN 1, $C7, 0 ; $33 PARAM_DEFN 2, $C7, 0 ; $34 @@ -4699,7 +4701,7 @@ L6751: .byte $66 ;;; $2B IMPL -;;; This is called during init by the DAs, just befire +;;; This is called during init by the DAs, just before ;;; entering the input loop. L6752: .byte 0 @@ -4772,8 +4774,10 @@ L681F: .byte $10 L6820: .byte $09 L6821: .byte $1E L6822: .byte $00 -L6823: .byte $00 -L6824: .byte $00 + +active_menu: + .addr 0 + .proc test_box_params left: .word $ffff @@ -4830,11 +4834,12 @@ L6864: .byte $68 L6865: .byte $5A L6866: .byte $68 -L6867: lda L6823 +get_menu_count: + lda active_menu sta $82 - lda L6824 + lda active_menu+1 sta $83 - ldy #$00 + ldy #0 lda ($82),y sta $A8 rts @@ -4846,9 +4851,9 @@ L687D: dex bmi L6884 adc #$0C bne L687D -L6884: adc L6823 +L6884: adc active_menu sta $AB - lda L6824 + lda active_menu+1 adc #$00 sta $AC ldy #$0B @@ -4910,7 +4915,9 @@ L68F0: sta state_xpos stx state_xpos+1 rts -L68F5: sta state_fill + ;; Set fill mode to A +set_fill_mode: + sta state_fill jmp SET_FILL_MODE_IMPL do_measure_text: @@ -4943,24 +4950,27 @@ L691B: A2D_CALL A2D_GET_INPUT, $82 ;;; ================================================== -;;; $30 IMPL +;;; SET_MENU IMPL L6924: .byte 0 L6925: .byte 0 -L6926: + +SET_MENU_IMPL: lda #$00 sta L633D sta L633E lda params_addr - sta L6823 + sta active_menu lda params_addr+1 - sta L6824 - jsr L6867 + sta active_menu+1 + + jsr get_menu_count ; into $A8 jsr L653C jsr L657E lda L685F ldx L6860 - jsr L6A66 + jsr fill_and_frame_rect + lda #$0C ldx #$00 ldy L6822 @@ -5101,17 +5111,20 @@ L6A5C: ldx $A7 ldx $A9 jmp L68BE -L6A66: sta L6A7B - stx L6A7B+1 - sta L6A86 - stx L6A86+1 - lda #$00 - jsr L68F5 - A2D_CALL A2D_FILL_RECT, 0, L6A7B - lda #$04 - jsr L68F5 - A2D_CALL A2D_DRAW_RECT, 0, L6A86 + ;; Fills rect (params at X,A) then inverts border +.proc fill_and_frame_rect + sta fill_params + stx fill_params+1 + sta draw_params + stx draw_params+1 + lda #0 + jsr set_fill_mode + A2D_CALL A2D_FILL_RECT, 0, fill_params + lda #4 + jsr set_fill_mode + A2D_CALL A2D_DRAW_RECT, 0, draw_params rts +.endproc L6A89: jsr L6A94 bne L6A93 @@ -5122,7 +5135,7 @@ L6A93: rts L6A94: lda #$00 L6A96: sta $C6 - jsr L6867 + jsr get_menu_count ldx #$00 L6A9D: jsr L6878 bit $C6 @@ -5223,7 +5236,7 @@ loop: lda $B7,x dex bpl loop lda #$02 - jsr L68F5 + jsr set_fill_mode A2D_CALL A2D_FILL_RECT, fill_rect_params2 rts .endproc @@ -5236,12 +5249,12 @@ loop: lda $B7,x L6B60: lda $C9 - cmp #$1B + cmp #$1B ; Menu height? bne L6B70 lda $CA bne L6B70 jsr L7D61 - jmp L6BDB + jmp MENU_CLICK_IMPL L6B70: lda #$C0 jsr L6A96 @@ -5321,12 +5334,14 @@ L6BCB: ;;; ================================================== -;;; $31 IMPL +;;; MENU_CLICK IMPL L6BD9: .byte 0 L6BDA: .byte 0 -L6BDB: jsr L7ECD - jsr L6867 + +MENU_CLICK_IMPL: + jsr L7ECD + jsr get_menu_count jsr L653F jsr L657E bit L7D74 @@ -5334,7 +5349,7 @@ L6BDB: jsr L7ECD jsr L7FE1 jmp L6C23 -L6BF2: lda #$00 +L6BF2: lda #0 sta L6BD9 sta L6BDA jsr L691B @@ -5512,7 +5527,7 @@ L6D55: lda ($84),y jsr L657E lda L6861 ldx L6862 - jsr L6A66 + jsr fill_and_frame_rect inc fill_rect_params4::left bne L6D7A inc fill_rect_params4::left+1 @@ -5621,11 +5636,11 @@ L6E36: ldx $A9 sta fill_rect_params3_right+1 A2D_CALL A2D_SET_PATTERN, light_speckle_pattern lda #$01 - jsr L68F5 + jsr set_fill_mode A2D_CALL A2D_FILL_RECT, fill_rect_params3 A2D_CALL A2D_SET_PATTERN, screen_state::pattern lda #$02 - jsr L68F5 + jsr set_fill_mode rts light_speckle_pattern: @@ -5672,7 +5687,7 @@ L6EAA: ldx L6BDA sty fill_rect_params4::bottom jsr HIDE_CURSOR_IMPL lda #$02 - jsr L68F5 + jsr set_fill_mode A2D_CALL A2D_FILL_RECT, fill_rect_params4 jmp SHOW_CURSOR_IMPL @@ -6080,12 +6095,12 @@ L7187: sta $CD jmp L70B2 L718E: jsr L70B7 - jsr L6A66 + jsr fill_and_frame_rect lda $AC and #$01 bne L71AA jsr L7143 - jsr L6A66 + jsr fill_and_frame_rect jsr L73BF lda $AD ldx $AD+1 @@ -6145,7 +6160,7 @@ L7205: lda #$01 L720B: lda #$03 ldx #$01 L720F: stx L71E4 - jsr L68F5 + jsr set_fill_mode lda $AC and #$02 beq L7255 @@ -6311,7 +6326,7 @@ L734A: pla ldx left_scroll_params_addr+1 jsr L791C L7363: lda #$00 - jsr L68F5 + jsr set_fill_mode lda $B0 and #$01 beq L737B @@ -6336,7 +6351,7 @@ L738E: lda $AC bne L73A6 lda #$C7 ldx #$00 - jsr L6A66 + jsr fill_and_frame_rect jmp L73BE ;; Draw resize box @@ -6346,7 +6361,7 @@ L73A8: lda $C7,x dex bpl L73A8 lda #$04 - jsr L68F5 + jsr set_fill_mode lda resize_box_params_addr ldx resize_box_params_addr+1 jsr L791C @@ -6732,7 +6747,7 @@ in_close_box: .byte 0 lda #$80 toggle: sta in_close_box lda #$02 - jsr L68F5 + jsr set_fill_mode jsr HIDE_CURSOR_IMPL A2D_CALL A2D_FILL_RECT, $C7 jsr SHOW_CURSOR_IMPL @@ -6801,7 +6816,7 @@ L76B6: lda $83,x L76D1: jsr L653C jsr L784C lda #$02 - jsr L68F5 + jsr set_fill_mode A2D_CALL A2D_SET_PATTERN, checkerboard_pattern L76E2: jsr L703E jsr L7749 @@ -7012,7 +7027,7 @@ L7872: sta L7010 sta L7871 A2D_CALL A2D_SET_BOX, set_box_params lda #$00 - jsr L68F5 + jsr set_fill_mode A2D_CALL A2D_SET_PATTERN, checkerboard_pattern A2D_CALL A2D_FILL_RECT, set_box_params_box jsr L6553 @@ -7212,7 +7227,7 @@ L79DC: rts L79DD: bit $B0 bvc L79DC L79E1: jsr L7A73 - jmp L6A66 + jmp fill_and_frame_rect light_speckles_pattern: .byte %11011101 @@ -7494,7 +7509,7 @@ L7BE0: jsr L7A73 jsr L653F jsr L6588 lda #$02 - jsr L68F5 + jsr set_fill_mode A2D_CALL A2D_SET_PATTERN, light_speckles_pattern jsr HIDE_CURSOR_IMPL L7BF7: jsr L707F