.setcpu "6502" .include "apple2.inc" .include "opcodes.inc" .include "../inc/apple2.inc" .include "../inc/prodos.inc" .include "../mgtk/mgtk.inc" .include "../desktop.inc" .include "../inc/macros.inc" ;;; ============================================================ .org $800 entry: ;;; Copy the DA to AUX for easy bank switching .scope lda ROMIN2 copy16 #$0800, STARTLO copy16 #da_end, ENDLO copy16 #$0800, DESTINATIONLO sec ; main>aux jsr AUXMOVE lda LCBANK1 lda LCBANK1 .endscope .scope ;; run the DA sta RAMRDON ; Run from Aux sta RAMWRTON jsr init ;; tear down/exit sta RAMRDOFF ; Back to Main sta RAMWRTOFF jsr save_settings rts .endscope ;;; ============================================================ da_window_id := 61 da_width := 416 da_height := 122 da_left := (screen_width - da_width)/2 da_top := (screen_height - 10 - da_height)/2 + 10 str_title: PASCAL_STRING "Control Panel" .proc winfo window_id: .byte da_window_id options: .byte MGTK::Option::go_away_box title: .addr str_title hscroll: .byte MGTK::Scroll::option_none vscroll: .byte MGTK::Scroll::option_none hthumbmax: .byte 32 hthumbpos: .byte 0 vthumbmax: .byte 32 vthumbpos: .byte 0 status: .byte 0 reserved: .byte 0 mincontwidth: .word da_width mincontlength: .word da_height maxcontwidth: .word da_width maxcontlength: .word da_height port: viewloc: DEFINE_POINT da_left, da_top mapbits: .addr MGTK::screen_mapbits mapwidth: .word MGTK::screen_mapwidth maprect: DEFINE_RECT 0, 0, da_width, da_height, maprect pattern: .res 8, $FF colormasks: .byte MGTK::colormask_and, MGTK::colormask_or penloc: DEFINE_POINT 0, 0 penwidth: .byte 1 penheight: .byte 1 penmode: .byte 0 textback: .byte $7F textfont: .addr DEFAULT_FONT nextwinfo: .addr 0 .endproc .proc frame_pensize penwidth: .byte 4 penheight: .byte 2 .endproc frame_p1: DEFINE_POINT 0, 58 frame_p2: DEFINE_POINT da_width, 58 frame_p3: DEFINE_POINT 190, 0 frame_p4: DEFINE_POINT 190, da_height frame_rect: DEFINE_RECT AS_WORD(-1), AS_WORD(-1), da_width - 4 + 2, da_height - 2 + 2 .proc winfo_fullscreen window_id: .byte da_window_id+1 options: .byte MGTK::Option::dialog_box title: .addr str_title hscroll: .byte MGTK::Scroll::option_none vscroll: .byte MGTK::Scroll::option_none hthumbmax: .byte 32 hthumbpos: .byte 0 vthumbmax: .byte 32 vthumbpos: .byte 0 status: .byte 0 reserved: .byte 0 mincontwidth: .word screen_width mincontlength: .word screen_height maxcontwidth: .word screen_width maxcontlength: .word screen_height port: viewloc: DEFINE_POINT 0, 0 mapbits: .addr MGTK::screen_mapbits mapwidth: .word MGTK::screen_mapwidth maprect: DEFINE_RECT 0, 0, screen_width, screen_height pattern: .res 8, 0 colormasks: .byte MGTK::colormask_and, MGTK::colormask_or penloc: DEFINE_POINT 0, 0 penwidth: .byte 1 penheight: .byte 1 penmode: .byte 0 textback: .byte $7F textfont: .addr DEFAULT_FONT nextwinfo: .addr 0 .endproc ;;; ============================================================ .proc event_params kind: .byte 0 ;;; event_kind_key_down key := * modifiers := * + 1 ;;; event_kind_update window_id := * ;;; otherwise xcoord := * ycoord := * + 2 .res 4 .endproc .proc findwindow_params mousex: .word 0 mousey: .word 0 which_area: .byte 0 window_id: .byte 0 .endproc .proc trackgoaway_params clicked: .byte 0 .endproc .proc dragwindow_params window_id: .byte 0 dragx: .word 0 dragy: .word 0 moved: .byte 0 .endproc .proc winport_params window_id: .byte da_window_id port: .addr grafport .endproc .proc screentowindow_params window_id: .byte da_window_id screen: DEFINE_POINT 0, 0, screen window: DEFINE_POINT 0, 0, window .endproc mx := screentowindow_params::window::xcoord my := screentowindow_params::window::ycoord .proc grafport viewloc: DEFINE_POINT 0, 0 mapbits: .word 0 mapwidth: .word 0 cliprect: DEFINE_RECT 0, 0, 0, 0 pattern: .res 8, 0 colormasks: .byte 0, 0 penloc: DEFINE_POINT 0, 0 penwidth: .byte 0 penheight: .byte 0 penmode: .byte 0 textback: .byte 0 textfont: .addr 0 .endproc ;;; ============================================================ ;;; Common Resources radio_button_w = 15 radio_button_h = 7 .proc checked_params viewloc: DEFINE_POINT 0, 0, viewloc mapbits: .addr checked_bitmap mapwidth: .byte 3 reserved: .byte 0 cliprect: DEFINE_RECT 0, 0, radio_button_w, radio_button_h .endproc checked_bitmap: .byte px(%0000111),px(%1111100),px(%0000000) .byte px(%0011100),px(%0000111),px(%0000000) .byte px(%1110001),px(%1110001),px(%1100000) .byte px(%1100111),px(%1111100),px(%1100000) .byte px(%1100111),px(%1111100),px(%1100000) .byte px(%1110001),px(%1110001),px(%1100000) .byte px(%0011100),px(%0000111),px(%0000000) .byte px(%0000111),px(%1111100),px(%0000000) .proc unchecked_params viewloc: DEFINE_POINT 0, 0, viewloc mapbits: .addr unchecked_bitmap mapwidth: .byte 3 reserved: .byte 0 cliprect: DEFINE_RECT 0, 0, radio_button_w, radio_button_h .endproc unchecked_bitmap: .byte px(%0000111),px(%1111100),px(%0000000) .byte px(%0011100),px(%0000111),px(%0000000) .byte px(%1110000),px(%0000001),px(%1100000) .byte px(%1100000),px(%0000000),px(%1100000) .byte px(%1100000),px(%0000000),px(%1100000) .byte px(%1110000),px(%0000001),px(%1100000) .byte px(%0011100),px(%0000111),px(%0000000) .byte px(%0000111),px(%1111100),px(%0000000) ;;; ============================================================ ;;; Desktop Pattern Editor Resources pedit_x := 12 pedit_y := 6 fatbit_w := 8 fatbit_ws := 3 ; shift fatbit_h := 4 fatbit_hs := 2 ; shift fatbits_rect: DEFINE_RECT pedit_x, pedit_y, pedit_x + 8 * fatbit_w + 1, pedit_y + 8 * fatbit_h + 1, fatbits_rect str_desktop_pattern: DEFINE_STRING "Desktop Pattern" pattern_label_pos: DEFINE_POINT pedit_x + 35, pedit_y + 47 preview_l := pedit_x + 79 preview_t := pedit_y preview_r := preview_l + 81 preview_b := preview_t + 33 preview_s := preview_t + 6 preview_rect: DEFINE_RECT preview_l+1, preview_s + 1, preview_r - 1, preview_b - 1 preview_line: DEFINE_RECT preview_l, preview_s, preview_r, preview_s preview_frame: DEFINE_RECT preview_l, preview_t, preview_r, preview_b arr_w := 6 arr_h := 5 arr_inset := 5 rarr_l := preview_r - arr_inset - arr_w rarr_t := preview_t+1 rarr_r := rarr_l + arr_w - 1 rarr_b := rarr_t + arr_h - 1 larr_l := preview_l + arr_inset + 1 larr_t := preview_t + 1 larr_r := larr_l + arr_w - 1 larr_b := larr_t + arr_h - 1 .proc larr_params viewloc: DEFINE_POINT larr_l, larr_t mapbits: .addr larr_bitmap mapwidth: .byte 1 reserved: .byte 0 cliprect: DEFINE_RECT 0, 0, arr_w-1, arr_h-1 .endproc .proc rarr_params viewloc: DEFINE_POINT rarr_l, rarr_t mapbits: .addr rarr_bitmap mapwidth: .byte 1 reserved: .byte 0 cliprect: DEFINE_RECT 0, 0, arr_w-1, arr_h-1 .endproc larr_rect: DEFINE_RECT larr_l-2, larr_t, larr_r+2, larr_b rarr_rect: DEFINE_RECT rarr_l-2, rarr_t, rarr_r+2, rarr_b larr_bitmap: .byte px(%0000110) .byte px(%0011110) .byte px(%1111110) .byte px(%0011110) .byte px(%0000110) rarr_bitmap: .byte px(%1100000) .byte px(%1111000) .byte px(%1111110) .byte px(%1111000) .byte px(%1100000) ;;; ============================================================ ;;; Double-Click Speed Resources dblclick_x := 208 dblclick_y := 6 ;; Selected index (1-3, or 0 for 'no match') dblclick_selection: .byte 1 ;; Computed counter values dblclick_speed_table_size = 3 dblclick_speed_table: .word DeskTop::Settings::kDefaultDblClickSpeed * 1 .word DeskTop::Settings::kDefaultDblClickSpeed * 4 .word DeskTop::Settings::kDefaultDblClickSpeed * 32 str_dblclick_speed: DEFINE_STRING "Double-Click Speed" dblclick_label_pos: DEFINE_POINT dblclick_x + 45, dblclick_y + 47 .proc dblclick_params viewloc: DEFINE_POINT dblclick_x, dblclick_y mapbits: .addr dblclick_bitmap mapwidth: .byte 8 reserved: .byte 0 cliprect: DEFINE_RECT 0, 0, 53, 33 .endproc dblclick_arrow_pos1: DEFINE_POINT dblclick_x + 65, dblclick_y + 7 dblclick_arrow_pos2: DEFINE_POINT dblclick_x + 65, dblclick_y + 22 dblclick_arrow_pos3: DEFINE_POINT dblclick_x + 110, dblclick_y + 10 dblclick_arrow_pos4: DEFINE_POINT dblclick_x + 110, dblclick_y + 22 dblclick_arrow_pos5: DEFINE_POINT dblclick_x + 155, dblclick_y + 13 dblclick_arrow_pos6: DEFINE_POINT dblclick_x + 155, dblclick_y + 23 dblclick_button_rect1: DEFINE_RECT dblclick_x + 175, dblclick_y + 25, dblclick_x + 175 + radio_button_w, dblclick_y + 25 + radio_button_h dblclick_button_rect2: DEFINE_RECT dblclick_x + 130, dblclick_y + 25, dblclick_x + 130 + radio_button_w, dblclick_y + 25 + radio_button_h dblclick_button_rect3: DEFINE_RECT dblclick_x + 85, dblclick_y + 25, dblclick_x + 85 + radio_button_w, dblclick_y + 25 + radio_button_h dblclick_bitmap: .byte px(%0000000),px(%0000000),px(%0000000),px(%0000011),px(%0000000),px(%0000000),px(%0000000),px(%0000000) .byte px(%0000000),px(%0000000),px(%0000000),px(%0000011),px(%0000000),px(%0000000),px(%0000000),px(%0000000) .byte px(%0000000),px(%0000000),px(%0000000),px(%0000011),px(%0000000),px(%0000000),px(%0000000),px(%0000000) .byte px(%0000000),px(%0000000),px(%0000000),px(%0000011),px(%0000000),px(%0000000),px(%0000000),px(%0000000) .byte px(%0000000),px(%0000000),px(%0000000),px(%0000011),px(%0000000),px(%0000000),px(%0000000),px(%0000000) .byte px(%0000000),px(%0000000),px(%0000000),px(%0000011),px(%0000000),px(%0000000),px(%0000000),px(%0000000) .byte px(%0000000),px(%0000000),px(%0000000),px(%0000011),px(%0000000),px(%0000000),px(%0000000),px(%0000000) .byte px(%0000000),px(%0000000),px(%0000000),px(%0000011),px(%0000000),px(%0000000),px(%0000000),px(%0000000) .byte px(%0000000),px(%0000000),px(%0000000),px(%0000011),px(%0000000),px(%0000000),px(%0000000),px(%0000000) .byte px(%0000000),px(%0000000),px(%0000000),px(%0000000),px(%0000000),px(%0000000),px(%0000000),px(%0000000) .byte px(%0000000),px(%0000000),px(%0000000),px(%0001111),px(%1100000),px(%0000000),px(%0000000),px(%0000000) .byte px(%0000000),px(%0000000),px(%0000000),px(%0000000),px(%0000000),px(%0000000),px(%0000000),px(%0000000) .byte px(%0000000),px(%0000000),px(%0000000),px(%0111111),px(%1111000),px(%0000000),px(%0000000),px(%0000000) .byte px(%0000000),px(%0000000),px(%0000000),px(%0000000),px(%0000000),px(%0000000),px(%0000000),px(%0000000) .byte px(%0000000),px(%0000000),px(%0000111),px(%1111111),px(%1111111),px(%1000000),px(%0000000),px(%0000000) .byte px(%0000111),px(%1111111),px(%1111100),px(%0000000),px(%0000000),px(%1111111),px(%1111111),px(%1000000) .byte px(%0011100),px(%0000000),px(%0000000),px(%0000000),px(%0000000),px(%0000000),px(%0000000),px(%1110000) .byte px(%1110000),px(%0000000),px(%0000000),px(%0000000),px(%0000000),px(%0000000),px(%0000000),px(%0011100) .byte px(%1100000),px(%0111111),px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111000),px(%0001100) .byte px(%1100000),px(%0110000),px(%0000000),px(%0000000),px(%0000000),px(%0000000),px(%0011000),px(%0001100) .byte px(%1100000),px(%0110000),px(%0000000),px(%0011111),px(%1110000),px(%0000000),px(%0011000),px(%0001100) .byte px(%1100000),px(%0110000),px(%0000001),px(%1110000),px(%0011110),px(%0000000),px(%0011000),px(%0001100) .byte px(%1100000),px(%0110000),px(%0000111),px(%0110000),px(%0011011),px(%1000000),px(%0011000),px(%0001100) .byte px(%1100000),px(%0110101),px(%0101110),px(%0110000),px(%0011001),px(%1101010),px(%1011000),px(%0001100) .byte px(%1100000),px(%0110000),px(%0000110),px(%0110000),px(%0011001),px(%1000000),px(%0011000),px(%0001100) .byte px(%1100000),px(%0110000),px(%0000110),px(%0110000),px(%0011001),px(%1000000),px(%0011000),px(%0001100) .byte px(%1100000),px(%0110000),px(%0000110),px(%0011111),px(%1110001),px(%1000000),px(%0011000),px(%0001100) .byte px(%1100000),px(%0110000),px(%0000110),px(%0000000),px(%0000001),px(%1000000),px(%0011000),px(%0001100) .byte px(%1100000),px(%0111111),px(%1111110),px(%0000000),px(%0000001),px(%1111111),px(%1111000),px(%0001100) .byte px(%1100000),px(%0000000),px(%0000110),px(%0000000),px(%0000001),px(%1000000),px(%0000000),px(%0001100) .byte px(%1100000),px(%0000000),px(%0000110),px(%0000000),px(%0000001),px(%1000000),px(%0000000),px(%0001100) .byte px(%1100000),px(%0000000),px(%0000110),px(%0000000),px(%0000001),px(%1000000),px(%0000000),px(%0001100) .byte px(%1100000),px(%0000000),px(%0000110),px(%0000000),px(%0000001),px(%1000000),px(%0000000),px(%0001100) .byte px(%1100000),px(%0000000),px(%0000110),px(%0000000),px(%0000001),px(%1000000),px(%0000000),px(%0001100) .proc darrow_params viewloc: DEFINE_POINT 0, 0 mapbits: .addr darr_bitmap mapwidth: .byte 3 reserved: .byte 0 cliprect: DEFINE_RECT 0, 0, 16, 7 .endproc darr_bitmap: .byte px(%0000011),px(%1111100),px(%0000000) .byte px(%0000011),px(%1111100),px(%0000000) .byte px(%0000011),px(%1111100),px(%0000000) .byte px(%1111111),px(%1111111),px(%1110000) .byte px(%0011111),px(%1111111),px(%1000000) .byte px(%0000111),px(%1111110),px(%0000000) .byte px(%0000001),px(%1111000),px(%0000000) .byte px(%0000000),px(%0100000),px(%0000000) ;;; ============================================================ ;;; Joystick Calibration Resources joycal_x := 12 joycal_y := 68 str_calibrate_joystick: DEFINE_STRING "Calibrate Joystick" joystick_label_pos: DEFINE_POINT joycal_x + 30, joycal_y + 48 joy_disp_x := joycal_x + 80 joy_disp_y := joycal_y + 20 - 6 joy_disp_frame_rect: DEFINE_RECT joy_disp_x - 32 , joy_disp_y - 16 , joy_disp_x + 32 + 7 + 1 , joy_disp_y + 16 + 4 + 1 joy_disp_rect: DEFINE_RECT joy_disp_x - 32 + 1, joy_disp_y - 16 + 1, joy_disp_x + 32 + 7 + 1 - 1, joy_disp_y + 16 + 4 + 1 - 1 joy_btn0: DEFINE_POINT joy_disp_x + 58 + 4, joy_disp_y - 8, joy_btn0 joy_btn1: DEFINE_POINT joy_disp_x + 58 + 4, joy_disp_y + 5, joy_btn1 joy_btn0_lpos: DEFINE_POINT joy_disp_x + 48 + 4, joy_disp_y - 8 + 8 joy_btn1_lpos: DEFINE_POINT joy_disp_x + 48 + 4, joy_disp_y + 5 + 8 joy_btn0_label: DEFINE_STRING "0" joy_btn1_label: DEFINE_STRING "1" .proc joy_marker viewloc: DEFINE_POINT 0, 0, viewloc mapbits: .addr joy_marker_bitmap mapwidth: .byte 2 reserved: .byte 0 cliprect: DEFINE_RECT 0, 0, 7, 4 .endproc joy_marker_bitmap: .byte px(%0011110),px(%0000000) .byte px(%0111111),px(%0000000) .byte px(%1111111),px(%1000000) .byte px(%0111111),px(%0000000) .byte px(%0011110),px(%0000000) .proc joystick_params viewloc: DEFINE_POINT joycal_x+1, joycal_y + 6 mapbits: .addr joystick_bitmap mapwidth: .byte 6 reserved: .byte 0 cliprect: DEFINE_RECT 0, 0, 35, 18 .endproc joystick_bitmap: .byte px(%0000000),px(%0000000),px(%0000000),px(%0000001),px(%1100000),px(%0000000) .byte px(%0001100),px(%1111111),px(%1111111),px(%0000111),px(%1110000),px(%0000000) .byte px(%0000000),px(%0000000),px(%0000000),px(%0001111),px(%1100000),px(%0000000) .byte px(%0000011),px(%0011111),px(%1111100),px(%0011111),px(%1000000),px(%0000000) .byte px(%0000000),px(%0000000),px(%0000000),px(%0111111),px(%0000000),px(%0000000) .byte px(%0000001),px(%1001111),px(%1110000),px(%1111110),px(%0000000),px(%0000000) .byte px(%0000000),px(%0000000),px(%0000001),px(%1111100),px(%0000000),px(%0000000) .byte px(%0000000),px(%1100111),px(%1000001),px(%1110000),px(%0000000),px(%0000000) .byte px(%0000000),px(%0000000),px(%0000001),px(%1000000),px(%0000000),px(%0000000) .byte px(%0000000),px(%0000000),px(%0000011),px(%0000000),px(%0000000),px(%0000000) .byte px(%0000000),px(%0000000),px(%0000110),px(%0000000),px(%0000000),px(%0000000) .byte px(%0001111),px(%1111111),px(%1111111),px(%1111111),px(%1111100),px(%0000000) .byte px(%0011000),px(%0000000),px(%0000000),px(%0000000),px(%0000110),px(%0000000) .byte px(%0011000),px(%0000000),px(%0000000),px(%0000000),px(%0000110),px(%0000000) .byte px(%0111111),px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%0000000) .byte px(%1100000),px(%0000000),px(%0000000),px(%0000000),px(%0000001),px(%1000000) .byte px(%1100000),px(%0000000),px(%0000000),px(%0000000),px(%0000001),px(%1000000) .byte px(%1100000),px(%0000000),px(%0000000),px(%0000000),px(%0000001),px(%1000000) .byte px(%0111111),px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%0000000) ;;; ============================================================ ;;; IP Blink Speed Resources ipblink_x := 214 ipblink_y := 75 ;; Selected index (1-3, or 0 for 'no match') ipblink_selection: .byte 0 str_ipblink_label1: DEFINE_STRING "Rate of Insertion" str_ipblink_label2: DEFINE_STRING "Point Blinking" str_ipblink_slow: DEFINE_STRING "Slow" str_ipblink_fast: DEFINE_STRING "Fast" ipblink_label1_pos: DEFINE_POINT ipblink_x, ipblink_y + 11 ipblink_label2_pos: DEFINE_POINT ipblink_x, ipblink_y + 10 + 11 ipblink_slow_pos: DEFINE_POINT ipblink_x + 110 - 4 + 2, ipblink_y + 16 + 5 + 12 + 1 ipblink_fast_pos: DEFINE_POINT ipblink_x + 140 + 4 + 4, ipblink_y + 16 + 5 + 12 + 1 ipblink_btn1_rect: DEFINE_RECT ipblink_x + 110 + 2, ipblink_y + 16, ipblink_x + 110 + 2 + radio_button_w, ipblink_y + 16 + radio_button_h ipblink_btn2_rect: DEFINE_RECT ipblink_x + 130 + 2, ipblink_y + 16, ipblink_x + 130 + 2 + radio_button_w, ipblink_y + 16 + radio_button_h ipblink_btn3_rect: DEFINE_RECT ipblink_x + 150 + 2, ipblink_y + 16, ipblink_x + 150 + 2 + radio_button_w, ipblink_y + 16 + radio_button_h .proc ipblink_bitmap_params viewloc: DEFINE_POINT ipblink_x + 120 - 1, ipblink_y mapbits: .addr ipblink_bitmap mapwidth: .byte 6 reserved: .byte 0 cliprect: DEFINE_RECT 0, 0, 37, 12 .endproc ipblink_bitmap: .byte px(%0000110),px(%0000000),px(%0000001),px(%1000000),px(%0000000),px(%0110000) .byte px(%0000000),px(%0000000),px(%0000001),px(%1000000),px(%0000000),px(%0000000) .byte px(%0000000),px(%0110000),px(%0000001),px(%1000000),px(%0000110),px(%0000000) .byte px(%0000000),px(%0000000),px(%0000001),px(%1000000),px(%0000000),px(%0000000) .byte px(%0000000),px(%0000011),px(%0000001),px(%1000000),px(%1100000),px(%0000000) .byte px(%0000000),px(%0000000),px(%0000001),px(%1000000),px(%0000000),px(%0000000) .byte px(%1100110),px(%0110011),px(%0000001),px(%1000000),px(%1100000),px(%0000000) .byte px(%0000000),px(%0000000),px(%0000001),px(%1000000),px(%0000000),px(%0000000) .byte px(%0000000),px(%0000011),px(%0000001),px(%1000000),px(%1100000),px(%0000000) .byte px(%0000000),px(%0000000),px(%0000001),px(%1000000),px(%0000000),px(%0000000) .byte px(%0000000),px(%0110000),px(%0000001),px(%1000000),px(%0000110),px(%0000000) .byte px(%0000000),px(%0000000),px(%0000001),px(%1000000),px(%0000000),px(%0000000) .byte px(%0000110),px(%0000000),px(%0000001),px(%1000000),px(%0000000),px(%0110000) .proc ipblink_bitmap_ip_params viewloc: DEFINE_POINT ipblink_x + 120 - 1 + 20, ipblink_y mapbits: .addr ipblink_ip_bitmap mapwidth: .byte 1 reserved: .byte 0 cliprect: DEFINE_RECT 0, 0, 1, 12 .endproc ipblink_ip_bitmap: .byte px(%1100000) .byte px(%1100000) .byte px(%1100000) .byte px(%1100000) .byte px(%1100000) .byte px(%1100000) .byte px(%1100000) .byte px(%1100000) .byte px(%1100000) .byte px(%1100000) .byte px(%1100000) .byte px(%1100000) .byte px(%1100000) ;;; ============================================================ .proc init jsr init_pattern jsr init_ipblink jsr init_dblclick MGTK_CALL MGTK::OpenWindow, winfo jsr draw_window MGTK_CALL MGTK::FlushEvents ;; fall through .endproc .proc input_loop MGTK_CALL MGTK::GetEvent, event_params bne exit lda event_params::kind cmp #MGTK::EventKind::button_down beq handle_down cmp #MGTK::EventKind::key_down beq handle_key jsr do_joystick jsr do_ipblink jmp input_loop .endproc .proc exit MGTK_CALL MGTK::CloseWindow, winfo ITK_CALL IconTK::REDRAW_ICONS rts .endproc ;;; ============================================================ .proc handle_key lda event_params::key cmp #CHAR_ESCAPE beq exit bne input_loop .endproc ;;; ============================================================ .proc handle_down copy16 event_params::xcoord, findwindow_params::mousex copy16 event_params::ycoord, findwindow_params::mousey MGTK_CALL MGTK::FindWindow, findwindow_params bne exit lda findwindow_params::window_id cmp winfo::window_id bne input_loop lda findwindow_params::which_area cmp #MGTK::Area::close_box beq handle_close cmp #MGTK::Area::dragbar beq handle_drag cmp #MGTK::Area::content beq handle_click jmp input_loop .endproc ;;; ============================================================ .proc handle_close MGTK_CALL MGTK::TrackGoAway, trackgoaway_params lda trackgoaway_params::clicked bne exit jmp input_loop .endproc ;;; ============================================================ .proc handle_drag copy winfo::window_id, dragwindow_params::window_id copy16 event_params::xcoord, dragwindow_params::dragx copy16 event_params::ycoord, dragwindow_params::dragy MGTK_CALL MGTK::DragWindow, dragwindow_params common: bit dragwindow_params::moved bpl :+ ;; Draw DeskTop's windows sta RAMRDOFF sta RAMWRTOFF jsr JUMP_TABLE_REDRAW_ALL sta RAMRDON sta RAMWRTON ;; Draw DA's window jsr draw_window ;; Draw DeskTop icons ITK_CALL IconTK::REDRAW_ICONS : jmp input_loop .endproc ;;; ============================================================ .proc handle_click copy16 event_params::xcoord, screentowindow_params::screen::xcoord copy16 event_params::ycoord, screentowindow_params::screen::ycoord MGTK_CALL MGTK::ScreenToWindow, screentowindow_params MGTK_CALL MGTK::MoveTo, screentowindow_params::window MGTK_CALL MGTK::InRect, fatbits_rect cmp #MGTK::inrect_inside IF_EQ jmp handle_bits_click END_IF MGTK_CALL MGTK::InRect, larr_rect cmp #MGTK::inrect_inside IF_EQ jmp handle_larr_click END_IF MGTK_CALL MGTK::InRect, rarr_rect cmp #MGTK::inrect_inside IF_EQ jmp handle_rarr_click END_IF MGTK_CALL MGTK::InRect, preview_rect cmp #MGTK::inrect_inside IF_EQ jmp handle_pattern_click END_IF MGTK_CALL MGTK::InRect, dblclick_button_rect1 cmp #MGTK::inrect_inside IF_EQ lda #1 jmp handle_dblclick_click END_IF MGTK_CALL MGTK::InRect, dblclick_button_rect2 cmp #MGTK::inrect_inside IF_EQ lda #2 jmp handle_dblclick_click END_IF MGTK_CALL MGTK::InRect, dblclick_button_rect3 cmp #MGTK::inrect_inside IF_EQ lda #3 jmp handle_dblclick_click END_IF MGTK_CALL MGTK::InRect, ipblink_btn1_rect cmp #MGTK::inrect_inside IF_EQ lda #1 jmp handle_ipblink_click END_IF MGTK_CALL MGTK::InRect, ipblink_btn2_rect cmp #MGTK::inrect_inside IF_EQ lda #2 jmp handle_ipblink_click END_IF MGTK_CALL MGTK::InRect, ipblink_btn3_rect cmp #MGTK::inrect_inside IF_EQ lda #3 jmp handle_ipblink_click END_IF jmp input_loop .endproc ;;; ============================================================ .proc handle_rarr_click inc pattern_index lda pattern_index cmp #pattern_count IF_GE copy #0, pattern_index END_IF jmp update_pattern .endproc .proc handle_larr_click dec pattern_index lda pattern_index IF_NEG copy #pattern_count-1, pattern_index END_IF jmp update_pattern .endproc .proc update_pattern ptr := $06 lda pattern_index asl tay copy16 patterns,y, ptr ldy #7 : lda (ptr),y sta pattern,y dey bpl :- jsr update_bits jmp input_loop .endproc ;;; ============================================================ .proc handle_bits_click sub16 mx, fatbits_rect::x1, mx sub16 my, fatbits_rect::y1, my dec16 mx dec16 my ldy #fatbit_ws : lsr16 mx dey bne :- cmp16 mx, #8 bcs done ldy #fatbit_hs : lsr16 my dey bne :- cmp16 my, #8 bcs done ldx mx ldy my lda pattern,y eor mask,x sta pattern,y jsr update_bits done: jmp input_loop mask: .byte 1<<0, 1<<1, 1<<2, 1<<3, 1<<4, 1<<5, 1<<6, 1<<7 .endproc .proc update_bits MGTK_CALL MGTK::GetWinPort, winport_params MGTK_CALL MGTK::SetPort, grafport MGTK_CALL MGTK::HideCursor jsr draw_bits MGTK_CALL MGTK::ShowCursor rts .endproc ;;; ============================================================ .proc init_dblclick ;; Find matching index in word table, or 0 ldx #dblclick_speed_table_size * 2 loop: lda DeskTop::Settings::dblclick_speed cmp dblclick_speed_table-2,x bne next lda DeskTop::Settings::dblclick_speed+1 cmp dblclick_speed_table-2+1,x bne next ;; Found a match txa lsr ; /= 2 sta dblclick_selection rts next: dex dex bpl loop copy #0, dblclick_selection ; not found rts .endproc .proc handle_dblclick_click sta dblclick_selection ; 1, 2 or 3 asl ; *= 2 tax dex dex ; 0, 2 or 4 copy16 dblclick_speed_table,x, DeskTop::Settings::dblclick_speed MGTK_CALL MGTK::GetWinPort, winport_params MGTK_CALL MGTK::SetPort, grafport MGTK_CALL MGTK::HideCursor jsr draw_dblclick_buttons MGTK_CALL MGTK::ShowCursor jmp input_loop .endproc ;;; ============================================================ .proc init_pattern ptr = $06 MGTK_CALL MGTK::GetDeskPat, ptr ldy #.sizeof(MGTK::Pattern)-1 : lda (ptr),y sta pattern,y dey bpl :- rts .endproc .proc handle_pattern_click MGTK_CALL MGTK::SetDeskPat, pattern COPY_STRUCT MGTK::Pattern, pattern, DeskTop::Settings::pattern MGTK_CALL MGTK::OpenWindow, winfo_fullscreen MGTK_CALL MGTK::CloseWindow, winfo_fullscreen ;; Draw DeskTop's windows sta RAMRDOFF sta RAMWRTOFF jsr JUMP_TABLE_REDRAW_ALL sta RAMRDON sta RAMWRTON ;; Draw DA's window jsr draw_window ;; Draw DeskTop icons ITK_CALL IconTK::REDRAW_ICONS jmp input_loop .endproc ;;; ============================================================ penXOR: .byte MGTK::penXOR pencopy: .byte MGTK::pencopy penBIC: .byte MGTK::penBIC notpencopy: .byte MGTK::notpencopy ;;; ============================================================ .proc draw_window ;; Defer if content area is not visible MGTK_CALL MGTK::GetWinPort, winport_params cmp #MGTK::Error::window_obscured IF_EQ rts END_IF MGTK_CALL MGTK::SetPort, grafport MGTK_CALL MGTK::HideCursor ;; ============================== ;; Desktop Pattern MGTK_CALL MGTK::MoveTo, pattern_label_pos MGTK_CALL MGTK::DrawText, str_desktop_pattern MGTK_CALL MGTK::SetPenMode, penBIC MGTK_CALL MGTK::FrameRect, fatbits_rect MGTK_CALL MGTK::PaintBits, larr_params MGTK_CALL MGTK::PaintBits, rarr_params MGTK_CALL MGTK::SetPenMode, penXOR MGTK_CALL MGTK::FrameRect, preview_frame MGTK_CALL MGTK::SetPenMode, penBIC MGTK_CALL MGTK::FrameRect, preview_line jsr draw_bits MGTK_CALL MGTK::SetPenMode, notpencopy ;; ============================== ;; Double-Click Speed MGTK_CALL MGTK::MoveTo, dblclick_label_pos MGTK_CALL MGTK::DrawText, str_dblclick_speed .macro copy32 arg1, arg2 .scope ldy #3 loop: copy arg1,y, arg2,y dey bpl loop .endscope .endmacro ;; TODO: Loop here copy32 dblclick_arrow_pos1, darrow_params::viewloc MGTK_CALL MGTK::PaintBits, darrow_params copy32 dblclick_arrow_pos2, darrow_params::viewloc MGTK_CALL MGTK::PaintBits, darrow_params copy32 dblclick_arrow_pos3, darrow_params::viewloc MGTK_CALL MGTK::PaintBits, darrow_params copy32 dblclick_arrow_pos4, darrow_params::viewloc MGTK_CALL MGTK::PaintBits, darrow_params copy32 dblclick_arrow_pos5, darrow_params::viewloc MGTK_CALL MGTK::PaintBits, darrow_params copy32 dblclick_arrow_pos6, darrow_params::viewloc MGTK_CALL MGTK::PaintBits, darrow_params jsr draw_dblclick_buttons MGTK_CALL MGTK::PaintBits, dblclick_params MGTK_CALL MGTK::SetPenSize, winfo::penwidth ;; ============================== ;; Joystick Calibration MGTK_CALL MGTK::MoveTo, joystick_label_pos MGTK_CALL MGTK::DrawText, str_calibrate_joystick MGTK_CALL MGTK::PaintBits, joystick_params MGTK_CALL MGTK::FrameRect, joy_disp_frame_rect MGTK_CALL MGTK::MoveTo, joy_btn0_lpos MGTK_CALL MGTK::DrawText, joy_btn0_label MGTK_CALL MGTK::MoveTo, joy_btn1_lpos MGTK_CALL MGTK::DrawText, joy_btn1_label copy #0, last_joy_valid_flag ;; ============================== ;; IP Blinking MGTK_CALL MGTK::MoveTo, ipblink_label1_pos MGTK_CALL MGTK::DrawText, str_ipblink_label1 MGTK_CALL MGTK::MoveTo, ipblink_label2_pos MGTK_CALL MGTK::DrawText, str_ipblink_label2 MGTK_CALL MGTK::PaintBits, ipblink_bitmap_params MGTK_CALL MGTK::MoveTo, ipblink_slow_pos MGTK_CALL MGTK::DrawText, str_ipblink_slow MGTK_CALL MGTK::MoveTo, ipblink_fast_pos MGTK_CALL MGTK::DrawText, str_ipblink_fast jsr draw_ipblink_buttons ;; ============================== ;; Frame MGTK_CALL MGTK::SetPenSize, frame_pensize MGTK_CALL MGTK::MoveTo, frame_p1 MGTK_CALL MGTK::LineTo, frame_p2 MGTK_CALL MGTK::MoveTo, frame_p3 MGTK_CALL MGTK::LineTo, frame_p4 MGTK_CALL MGTK::FrameRect, frame_rect MGTK_CALL MGTK::SetPenSize, winfo::penwidth done: MGTK_CALL MGTK::ShowCursor rts .endproc .proc draw_dblclick_buttons MGTK_CALL MGTK::SetPenMode, notpencopy ldax #dblclick_button_rect1 ldy dblclick_selection cpy #1 jsr draw_radio_button ldax #dblclick_button_rect2 ldy dblclick_selection cpy #2 jsr draw_radio_button ldax #dblclick_button_rect3 ldy dblclick_selection cpy #3 jsr draw_radio_button .endproc .proc draw_ipblink_buttons MGTK_CALL MGTK::SetPenMode, notpencopy ldax #ipblink_btn1_rect ldy ipblink_selection cpy #1 jsr draw_radio_button ldax #ipblink_btn2_rect ldy ipblink_selection cpy #2 jsr draw_radio_button ldax #ipblink_btn3_rect ldy ipblink_selection cpy #3 jsr draw_radio_button rts .endproc ;;; A,X = pos ptr, Z = checked .proc draw_radio_button ptr := $06 stax ptr beq checked unchecked: ldy #3 : lda (ptr),y sta unchecked_params::viewloc,y dey bpl :- MGTK_CALL MGTK::PaintBits, unchecked_params rts checked: ldy #3 : lda (ptr),y sta checked_params::viewloc,y dey bpl :- MGTK_CALL MGTK::PaintBits, checked_params rts .endproc bitpos: DEFINE_POINT 0, 0, bitpos .proc draw_bits MGTK_CALL MGTK::SetPenMode, pencopy MGTK_CALL MGTK::SetPattern, pattern MGTK_CALL MGTK::PaintRect, preview_rect MGTK_CALL MGTK::SetPattern, winfo::pattern MGTK_CALL MGTK::SetPenSize, size copy #0, ypos add16 fatbits_rect::y1, #1, bitpos::ycoord yloop: copy #0, xpos add16 fatbits_rect::x1, #1, bitpos::xcoord ldy ypos copy pattern,y, row xloop: ror row bcc zero lda #MGTK::pencopy bpl store zero: lda #MGTK::notpencopy store: sta mode MGTK_CALL MGTK::SetPenMode, mode MGTK_CALL MGTK::MoveTo, bitpos MGTK_CALL MGTK::LineTo, bitpos ;; next x inc xpos lda xpos cmp #8 IF_NE add16 bitpos::xcoord, #fatbit_w, bitpos::xcoord jmp xloop END_IF ;; next y inc ypos lda ypos cmp #8 IF_NE add16 bitpos::ycoord, #fatbit_h, bitpos::ycoord jmp yloop END_IF rts xpos: .byte 0 ypos: .byte 0 row: .byte 0 mode: .byte 0 size: .byte fatbit_w, fatbit_h .endproc ;;; ============================================================ pattern: .byte %01010101 .byte %10101010 .byte %01010101 .byte %10101010 .byte %01010101 .byte %10101010 .byte %01010101 .byte %10101010 pattern_index: .byte 0 pattern_count := 15+14 patterns: .addr pattern_checkerboard, pattern_dark, pattern_vdark, pattern_black .addr pattern_olives, pattern_scales, pattern_stripes .addr pattern_light, pattern_vlight, pattern_xlight, pattern_white .addr pattern_cane, pattern_brick, pattern_curvy, pattern_abrick .addr pattern_c1, pattern_c2, pattern_c3, pattern_c4 .addr pattern_c5, pattern_c6, pattern_c7, pattern_c8 .addr pattern_c9, pattern_cA, pattern_cB, pattern_cC .addr pattern_cD, pattern_cE pattern_checkerboard: .byte %01010101 .byte %10101010 .byte %01010101 .byte %10101010 .byte %01010101 .byte %10101010 .byte %01010101 .byte %10101010 pattern_dark: .byte %01000100 .byte %00010001 .byte %01000100 .byte %00010001 .byte %01000100 .byte %00010001 .byte %01000100 .byte %00010001 pattern_vdark: .byte %10001000 .byte %00000000 .byte %00100010 .byte %00000000 .byte %10001000 .byte %00000000 .byte %00100010 .byte %00000000 pattern_black: .byte %00000000 .byte %00000000 .byte %00000000 .byte %00000000 .byte %00000000 .byte %00000000 .byte %00000000 .byte %00000000 pattern_olives: .byte %00010001 .byte %01101110 .byte %00001110 .byte %00001110 .byte %00010001 .byte %11100110 .byte %11100000 .byte %11100000 pattern_scales: .byte %11111110 .byte %11111110 .byte %01111101 .byte %10000011 .byte %11101111 .byte %11101111 .byte %11010111 .byte %00111000 pattern_stripes: .byte %01110111 .byte %10111011 .byte %11011101 .byte %11101110 .byte %01110111 .byte %10111011 .byte %11011101 .byte %11101110 pattern_light: .byte %11101110 .byte %10111011 .byte %11101110 .byte %10111011 .byte %11101110 .byte %10111011 .byte %11101110 .byte %10111011 pattern_vlight: .byte %11101110 .byte %11111111 .byte %10111011 .byte %11111111 .byte %11101110 .byte %11111111 .byte %10111011 .byte %11111111 pattern_xlight: .byte %11111110 .byte %11111111 .byte %11101111 .byte %11111111 .byte %11111110 .byte %11111111 .byte %11101111 .byte %11111111 pattern_white: .byte %11111111 .byte %11111111 .byte %11111111 .byte %11111111 .byte %11111111 .byte %11111111 .byte %11111111 .byte %11111111 pattern_cane: .byte %11100000 .byte %11010001 .byte %10111011 .byte %00011101 .byte %00001110 .byte %00010111 .byte %10111011 .byte %01110001 pattern_brick: .byte %00000000 .byte %11111110 .byte %11111110 .byte %11111110 .byte %00000000 .byte %11101111 .byte %11101111 .byte %11101111 pattern_curvy: .byte %00111111 .byte %11011110 .byte %11101101 .byte %11110011 .byte %11001111 .byte %10111111 .byte %01111111 .byte %01111111 pattern_abrick: .byte %11101111 .byte %11000111 .byte %10111011 .byte %01111100 .byte %11111110 .byte %01111111 .byte %10111111 .byte %11011111 ;; Solid colors (note that nibbles are flipped) pattern_c1: .res 8, $88 ; 1 = red pattern_c2: .res 8, $44 ; 2 = brown pattern_c3: .res 8, $CC ; 3 = orange pattern_c4: .res 8, $22 ; 4 = green pattern_c5: .res 8, $AA ; 5 = gray1 pattern_c6: .res 8, $66 ; 6 = light green pattern_c7: .res 8, $EE ; 7 = yellow pattern_c8: .res 8, $11 ; 8 = blue pattern_c9: .res 8, $99 ; 9 = magenta pattern_cA: .res 8, $55 ; A = gray2 pattern_cB: .res 8, $DD ; B = pink pattern_cC: .res 8, $33 ; C = light blue pattern_cD: .res 8, $BB ; D = lavender pattern_cE: .res 8, $77 ; E = aqua ;;; ============================================================ ;; TODO: Read and visualize all 4 paddles. num_paddles = 2 .struct InputState pdl0 .byte pdl1 .byte pdl2 .byte pdl3 .byte butn0 .byte butn1 .byte butn2 .byte .endstruct .proc do_joystick jsr read_paddles ;; TODO: Visualize all 4 paddles. ldx #num_paddles-1 : lda pdl0,x lsr ; clamp range to 0...63 lsr sta curr+InputState::pdl0,x dex bpl :- lsr curr+InputState::pdl1 ; clamp Y to 0...31 (due to pixel aspect ratio) lda BUTN0 and #$80 ; only care about msb sta curr+InputState::butn0 lda BUTN1 and #$80 ; only care about msb sta curr+InputState::butn1 lda BUTN2 and #$80 ; only care about msb sta curr+InputState::butn2 ;; Changed? (or first time through) lda last_joy_valid_flag beq changed ldx #.sizeof(InputState)-1 : lda curr,x cmp last,x bne changed dex bpl :- rts changed: COPY_STRUCT InputState, curr, last copy #$80, last_joy_valid_flag joy_x := joy_marker::viewloc::xcoord copy curr+InputState::pdl0, joy_x copy #0, joy_x+1 sub16 joy_x, #31, joy_x add16 joy_x, #joy_disp_x, joy_x joy_y := joy_marker::viewloc::ycoord copy curr+InputState::pdl1, joy_y copy #0, joy_y+1 sub16 joy_y, #15, joy_y add16 joy_y, #joy_disp_y, joy_y ;; Defer if content area is not visible MGTK_CALL MGTK::GetWinPort, winport_params cmp #MGTK::Error::window_obscured IF_EQ rts END_IF MGTK_CALL MGTK::GetWinPort, winport_params MGTK_CALL MGTK::SetPort, grafport MGTK_CALL MGTK::HideCursor MGTK_CALL MGTK::SetPenMode, pencopy MGTK_CALL MGTK::PaintRect, joy_disp_rect MGTK_CALL MGTK::SetPenMode, notpencopy MGTK_CALL MGTK::PaintBits, joy_marker ldax #joy_btn0 ldy curr+InputState::butn0 cpy #$80 jsr draw_radio_button ldax #joy_btn1 ldy curr+InputState::butn1 cpy #$80 jsr draw_radio_button MGTK_CALL MGTK::ShowCursor done: rts curr: .tag InputState last: .tag InputState pencopy: .byte MGTK::pencopy notpencopy: .byte MGTK::notpencopy .endproc last_joy_valid_flag: .byte 0 ;;; ============================================================ pdl0: .byte 0 pdl1: .byte 0 pdl2: .byte 0 pdl3: .byte 0 .proc read_paddles ldx #num_paddles - 1 : jsr pread tya sta pdl0,x dex bpl :- rts .proc pread ;; Let any previous timer reset (but don't wait forever) ldy #0 : dey beq :+ lda PADDL0,x bmi :- ;; Read paddle : lda PTRIG ldy #0 nop nop : lda PADDL0,X bpl done iny bne :- done: rts .endproc .endproc ;;; ============================================================ ;;; IP Blink ipblink_speed_table_size = 3 ipblink_speed_table: .byte 0 .byte DeskTop::Settings::kDefaultIPBlinkSpeed * 2 .byte DeskTop::Settings::kDefaultIPBlinkSpeed * 1 .byte DeskTop::Settings::kDefaultIPBlinkSpeed * 1/2 ipblink_counter: .byte 120 .proc init_ipblink lda DeskTop::Settings::ip_blink_speed ldx #ipblink_speed_table_size : cmp ipblink_speed_table-1,x beq done dex bne :- done: stx ipblink_selection rts .endproc .proc handle_ipblink_click sta ipblink_selection tax lda ipblink_speed_table-1,x sta DeskTop::Settings::ip_blink_speed sta ipblink_counter MGTK_CALL MGTK::GetWinPort, winport_params MGTK_CALL MGTK::SetPort, grafport MGTK_CALL MGTK::HideCursor jsr draw_ipblink_buttons MGTK_CALL MGTK::ShowCursor jmp input_loop .endproc .proc do_ipblink dec ipblink_counter lda ipblink_counter bne done copy DeskTop::Settings::ip_blink_speed, ipblink_counter ;; Defer if content area is not visible MGTK_CALL MGTK::GetWinPort, winport_params cmp #MGTK::Error::window_obscured beq done MGTK_CALL MGTK::SetPenMode, penXOR MGTK_CALL MGTK::PaintBits, ipblink_bitmap_ip_params done: rts .endproc ;;; ============================================================ ;;; Save Settings - written back to DESKTOP2 filename: PASCAL_STRING "DESKTOP2" write_buffer: .res DeskTop::Settings::length DEFINE_OPEN_PARAMS open_params, filename, DA_IO_BUFFER DEFINE_SET_MARK_PARAMS set_mark_params, DESKTOP2_SETTINGS_OFFSET DEFINE_WRITE_PARAMS write_params, write_buffer, DeskTop::Settings::length DEFINE_CLOSE_PARAMS close_params .proc save_settings ;; Run from Main, but with LCBANK1 in ;; Copy from LCBANK to somewhere ProDOS can read. COPY_BYTES DeskTop::Settings::length, DeskTop::Settings::address, write_buffer sta ALTZPOFF ; Main ZP, ROM in, like ProDOS MLI wants. lda ROMIN2 ;; Write to the file MLI_CALL OPEN, open_params bcs done lda open_params::ref_num sta set_mark_params::ref_num sta write_params::ref_num sta close_params::ref_num MLI_CALL SET_MARK, set_mark_params bcs close MLI_CALL WRITE, write_params close: MLI_CALL CLOSE, close_params done: sta ALTZPON ; Aux ZP, LCBANK1 in, like DeskTop wants. lda LCBANK1 lda LCBANK1 rts .endproc ;;; ============================================================ da_end = * .assert * < WINDOW_ICON_TABLES, error, "DA too big" ;; I/O Buffer starts at MAIN $1C00 ;; ... but icon tables start at AUX $1B00 ;;; ============================================================