* Desktop pattern * Double-click speed * Joystick calibration * Insertion point blink speed Settings live in LCBANK1 at $FF80 and are persisted directly to DESKTOP2 when the DA closes. DeskTop itself is modified to pull values from there. IP blink routines are improved to not slow down when the mouse pointer is over the window. Fixes #2, #31, #72
1632 lines
47 KiB
ArmAsm
1632 lines
47 KiB
ArmAsm
.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
|
|
|
|
;;; ============================================================
|