a2d/desk.acc/control.panel.s

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
;;; ============================================================