a2d/desktop/desktop_aux.s

4252 lines
122 KiB
ArmAsm

;;; ============================================================
;;; DeskTop - Aux Memory Segment
;;;
;;; Compiled as part of desktop.s
;;; ============================================================
;;; ============================================================
;;; Segment loaded into AUX $8580-$BFFF (follows MGTK)
;;; ============================================================
.proc desktop_aux
.org $8580
;;; ============================================================
graphics_icon:
.byte px(%1111111),px(%1111111),px(%1111111),px(%1111111)
.byte px(%1000000),px(%0000000),px(%0000000),px(%0000001)
.byte px(%1000110),px(%0000000),px(%0000000),px(%0000001)
.byte px(%1001111),px(%0000000),px(%0000011),px(%0000001)
.byte px(%1000110),px(%0000000),px(%0000111),px(%1000001)
.byte px(%1000000),px(%0001100),px(%0001111),px(%1100001)
.byte px(%1000000),px(%0111111),px(%0011111),px(%1110001)
.byte px(%1000011),px(%1111111),px(%1111111),px(%1111001)
.byte px(%1001111),px(%1111111),px(%1111111),px(%1111001)
.byte px(%1001111),px(%1111111),px(%1111111),px(%1111001)
.byte px(%1001111),px(%1111111),px(%1111111),px(%1111001)
.byte px(%1000000),px(%0000000),px(%0000000),px(%0000001)
.byte px(%1111111),px(%1111111),px(%1111111),px(%1111111)
graphics_mask:
.byte px(%1111111),px(%1111111),px(%1111111),px(%1111111)
.byte px(%1111111),px(%1111111),px(%1111111),px(%1111111)
.byte px(%1111111),px(%1111111),px(%1111111),px(%1111111)
.byte px(%1111111),px(%1111111),px(%1111111),px(%1111111)
.byte px(%1111111),px(%1111111),px(%1111111),px(%1111111)
.byte px(%1111111),px(%1111111),px(%1111111),px(%1111111)
.byte px(%1111111),px(%1111111),px(%1111111),px(%1111111)
.byte px(%1111111),px(%1111111),px(%1111111),px(%1111111)
.byte px(%1111111),px(%1111111),px(%1111111),px(%1111111)
.byte px(%1111111),px(%1111111),px(%1111111),px(%1111111)
.byte px(%1111111),px(%1111111),px(%1111111),px(%1111111)
.byte px(%1111111),px(%1111111),px(%1111111),px(%1111111)
.byte px(%1111111),px(%1111111),px(%1111111),px(%1111111)
cmd_file_icon:
.byte px(%0000000),px(%0000000),px(%0000000),px(%0000000)
.byte px(%0011111),px(%1111100),px(%0000000),px(%0000000)
.byte px(%0000000),px(%0111100),px(%0011001),px(%1001100)
.byte px(%0000000),px(%0111100),px(%0000110),px(%0110000)
.byte px(%0000000),px(%0111100),px(%0011001),px(%1001100)
.byte px(%0000000),px(%0111100),px(%0000110),px(%0110000)
.byte px(%0000000),px(%0111100),px(%0011001),px(%1001100)
.byte px(%0011111),px(%1111100),px(%0000000),px(%0000000)
.byte px(%0000000),px(%0000000),px(%0000000),px(%0000000)
;; shares top part of graphics_mask
awp_icon: ; AppleWorks Word Processing
.byte px(%0111111),px(%1111111),px(%1111111),px(%0000000)
.byte px(%0100000),px(%0000000),px(%0000100),px(%1100000)
.byte px(%0100011),px(%0001000),px(%1000100),px(%0011000)
.byte px(%0100100),px(%1001010),px(%1000100),px(%0000110)
.byte px(%0100111),px(%1001010),px(%1000111),px(%1111110)
.byte px(%0100100),px(%1000101),px(%0000000),px(%0000010)
.byte px(%0100000),px(%0000000),px(%0000000),px(%0000010)
.byte px(%0100000),px(%0111100),px(%1110011),px(%1110010)
.byte px(%0100000),px(%0000000),px(%0000000),px(%0000010)
.byte px(%0100011),px(%1100111),px(%1100111),px(%1100010)
.byte px(%0100000),px(%0000000),px(%0000000),px(%0000010)
.byte px(%0100011),px(%1111001),px(%1111001),px(%1100010)
.byte px(%0100000),px(%0000000),px(%0000000),px(%0000010)
.byte px(%0100011),px(%1001110),px(%0111100),px(%1100010)
.byte px(%0100000),px(%0000000),px(%0000000),px(%0000010)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
asp_icon: ; AppleWorks Spreadsheet
.byte px(%0111111),px(%1111111),px(%1111111),px(%0000000)
.byte px(%0100000),px(%0000000),px(%0000100),px(%1100000)
.byte px(%0100011),px(%0001000),px(%1000100),px(%0011000)
.byte px(%0100100),px(%1001010),px(%1000100),px(%0000110)
.byte px(%0100111),px(%1001010),px(%1000111),px(%1111110)
.byte px(%0100100),px(%1000101),px(%0000000),px(%0000010)
.byte px(%0100000),px(%0000000),px(%0000000),px(%0000010)
.byte px(%0100011),px(%1111111),px(%1111111),px(%1100010)
.byte px(%0100011),px(%0010010),px(%0100100),px(%1100010)
.byte px(%0100011),px(%1111111),px(%1111111),px(%1100010)
.byte px(%0100011),px(%0010010),px(%0100100),px(%1100010)
.byte px(%0100011),px(%1111111),px(%1111111),px(%1100010)
.byte px(%0100011),px(%0010010),px(%0100100),px(%1100010)
.byte px(%0100011),px(%1111111),px(%1111111),px(%1100010)
.byte px(%0100000),px(%0000000),px(%0000000),px(%0000010)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
;; shares generic_mask
adb_icon: ; AppleWorks Database
.byte px(%0111111),px(%1111111),px(%1111111),px(%0000000)
.byte px(%0100000),px(%0000000),px(%0000100),px(%1100000)
.byte px(%0100011),px(%0001000),px(%1000100),px(%0011000)
.byte px(%0100100),px(%1001010),px(%1000100),px(%0000110)
.byte px(%0100111),px(%1001010),px(%1000111),px(%1111110)
.byte px(%0100100),px(%1000101),px(%0000000),px(%0000010)
.byte px(%0100000),px(%0000000),px(%0000000),px(%0000010)
.byte px(%0100111),px(%1110011),px(%1110011),px(%1110010)
.byte px(%0100000),px(%0000000),px(%0000000),px(%0000010)
.byte px(%0100111),px(%1111111),px(%1111111),px(%1110010)
.byte px(%0100000),px(%0000000),px(%0000000),px(%0000010)
.byte px(%0100111),px(%1110011),px(%1110011),px(%1110010)
.byte px(%0100000),px(%0000000),px(%0000000),px(%0000010)
.byte px(%0100111),px(%1110011),px(%1110011),px(%1110010)
.byte px(%0100000),px(%0000000),px(%0000000),px(%0000010)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
;; shares generic_mask
iigs_file_icon:
.byte px(%0111111),px(%1111111),px(%1111111),px(%0000000)
.byte px(%0100000),px(%0000000),px(%0000100),px(%1100000)
.byte px(%0100000),px(%0000000),px(%0000100),px(%0011000)
.byte px(%0100000),px(%0000000),px(%0000100),px(%0000110)
.byte px(%0101111),px(%1011111),px(%0000111),px(%1111110)
.byte px(%0100010),px(%0000100),px(%0000000),px(%0000010)
.byte px(%0100010),px(%0000100),px(%0000000),px(%0000010)
.byte px(%0100010),px(%0000100),px(%0000000),px(%0000010)
.byte px(%0100010),px(%0000100),px(%0011100),px(%0110010)
.byte px(%0100010),px(%0000100),px(%0100000),px(%1000010)
.byte px(%0100010),px(%0000100),px(%0100110),px(%0110010)
.byte px(%0100010),px(%0000100),px(%0100010),px(%0001010)
.byte px(%0101111),px(%1011111),px(%0011100),px(%0110010)
.byte px(%0100000),px(%0000000),px(%0000000),px(%0000010)
.byte px(%0100000),px(%0000000),px(%0000000),px(%0000010)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
;; shares generic_mask
rel_file_icon:
.byte px(%0000000),px(%0000001),px(%1000000),px(%0000000)
.byte px(%0000000),px(%0000110),px(%0110000),px(%0000000)
.byte px(%0000000),px(%0011000),px(%0001100),px(%0000000)
.byte px(%0000000),px(%1100000),px(%0000011),px(%0000000)
.byte px(%0000011),px(%0000000),px(%0000000),px(%1100000)
.byte px(%0001100),px(%1111001),px(%1110100),px(%0011000)
.byte px(%0110000),px(%1000101),px(%0000100),px(%0000110)
.byte px(%1000000),px(%1111101),px(%1100100),px(%0000001)
.byte px(%0110000),px(%1001001),px(%0000100),px(%0000110)
.byte px(%0001100),px(%1000101),px(%1110111),px(%1011000)
.byte px(%0000011),px(%0000000),px(%0000000),px(%1100000)
.byte px(%0000000),px(%1100000),px(%0000011),px(%0000000)
.byte px(%0000000),px(%0011000),px(%0001100),px(%0000000)
.byte px(%0000000),px(%0000110),px(%0110000),px(%0000000)
.byte px(%0000000),px(%0000001),px(%1000000),px(%0000000)
;; shares binary_mask
a2d_file_icon:
.byte px(%0111111),px(%1111111),px(%1111111),px(%0000000)
.byte px(%0100000),px(%0000000),px(%0000100),px(%1100000)
.byte px(%0100000),px(%0000000),px(%0000100),px(%0011000)
.byte px(%0100000),px(%0000000),px(%0000100),px(%0000110)
.byte px(%0100000),px(%0000000),px(%0000111),px(%1111110)
.byte px(%0100000),px(%0000000),px(%1100000),px(%0000010)
.byte px(%0100000),px(%0000001),px(%1000000),px(%0000010)
.byte px(%0100000),px(%0011100),px(%0111000),px(%0000010)
.byte px(%0100000),px(%1111111),px(%1111110),px(%0000010)
.byte px(%0100001),px(%1111111),px(%1110000),px(%0000010)
.byte px(%0100001),px(%1111111),px(%1110000),px(%0000010)
.byte px(%0100001),px(%1111111),px(%1111110),px(%0000010)
.byte px(%0100000),px(%1111111),px(%1111100),px(%0000010)
.byte px(%0100000),px(%0111100),px(%1111000),px(%0000010)
.byte px(%0100000),px(%0000000),px(%0000000),px(%0000010)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111110)
;; shares generic_mask
;;; Basic
basic_icon:
.byte px(%0000000),px(%0000001),px(%1000000),px(%0000000)
.byte px(%0000000),px(%0000110),px(%0110000),px(%0000000)
.byte px(%0000000),px(%0011000),px(%0001100),px(%0000000)
.byte px(%0000000),px(%1100000),px(%0000011),px(%0000000)
.byte px(%0000000),px(%0000000),px(%0000000),px(%0000000)
.byte px(%0111110),px(%0111000),px(%1111010),px(%0111100)
.byte px(%0100010),px(%1000100),px(%1000010),px(%1000110)
.byte px(%0111100),px(%1111100),px(%1111010),px(%1000000)
.byte px(%0100010),px(%1000100),px(%0001010),px(%1000110)
.byte px(%0111110),px(%1000100),px(%1111010),px(%0111100)
.byte px(%0000000),px(%0000000),px(%0000000),px(%0000000)
.byte px(%0000000),px(%1100000),px(%0000011),px(%0000000)
.byte px(%0000000),px(%0011000),px(%0001100),px(%0000000)
.byte px(%0000000),px(%0000110),px(%0110000),px(%0000000)
.byte px(%0000000),px(%0000001),px(%1000000),px(%0000000)
basic_mask:
.byte px(%0000000),px(%0000000),px(%0000000),px(%0000000)
.byte px(%0000000),px(%0000001),px(%1000000),px(%0000000)
.byte px(%0000000),px(%0000111),px(%1110000),px(%0000000)
.byte px(%0000000),px(%0011111),px(%1111100),px(%0000000)
.byte px(%1111111),px(%1111111),px(%1111111),px(%1111111)
.byte px(%1111111),px(%1111111),px(%1111111),px(%1111111)
.byte px(%1111111),px(%1111111),px(%1111111),px(%1111111)
.byte px(%1111111),px(%1111111),px(%1111111),px(%1111111)
.byte px(%1111111),px(%1111111),px(%1111111),px(%1111111)
.byte px(%1111111),px(%1111111),px(%1111111),px(%1111111)
.byte px(%1111111),px(%1111111),px(%1111111),px(%1111111)
.byte px(%0000000),px(%0011111),px(%1111100),px(%0000000)
.byte px(%0000000),px(%0000111),px(%1110000),px(%0000000)
.byte px(%0000000),px(%0000001),px(%1000000),px(%0000000)
.byte px(%0000000),px(%0000000),px(%0000000),px(%0000000)
PAD_TO $8800
;;; ============================================================
.assert * = DEFAULT_FONT, error, "Entry point mismatch"
.incbin "../fonts/A2D.FONT"
font_height := DEFAULT_FONT+2
;;; ============================================================
.assert * = $8D03, error, "Segment length mismatch"
PAD_TO $8E00
;;; ============================================================
;;; Entry point for "Icon TookKit"
;;; ============================================================
.assert * = IconTK::MLI, error, "IconTK entry point must be at $8E00"
.proc icon_toolkit
jmp ITK_DIRECT
;;; ============================================================
.proc poly
num_vertices: .byte 8
lastpoly: .byte 0 ; 0 = last poly
vertices:
v0: DEFINE_POINT 0, 0, v0
v1: DEFINE_POINT 0, 0, v1
v2: DEFINE_POINT 0, 0, v2
v3: DEFINE_POINT 0, 0, v3
v4: DEFINE_POINT 0, 0, v4
v5: DEFINE_POINT 0, 0, v5
v6: DEFINE_POINT 0, 0, v6
v7: DEFINE_POINT 0, 0, v7
.endproc
.proc icon_paintbits_params
viewloc: DEFINE_POINT 0, 0, viewloc
mapbits: .addr 0
mapwidth: .byte 0
reserved: .byte 0
maprect: DEFINE_RECT 0,0,0,0,maprect
.endproc
.proc mask_paintbits_params
viewloc: DEFINE_POINT 0, 0, viewloc
mapbits: .addr 0
mapwidth: .byte 0
reserved: .byte 0
maprect: DEFINE_RECT 0,0,0,0,maprect
.endproc
rect_opendir: DEFINE_RECT 0,0,0,0, rect_opendir
.proc textwidth_params
textptr: .addr text_buffer
textlen: .byte 0
result: .word 0
.endproc
settextbg_params := textwidth_params::result + 1 ; re-used
.proc drawtext_params
textptr: .addr text_buffer
textlen: .byte 0
.endproc
text_buffer:
.res 19, 0
white_pattern:
.byte %11111111
.byte %11111111
.byte %11111111
.byte %11111111
.byte %11111111
.byte %11111111
.byte %11111111
.byte %11111111
checkerboard_pattern:
.byte %01010101
.byte %10101010
.byte %01010101
.byte %10101010
.byte %01010101
.byte %10101010
.byte %01010101
.byte %10101010
dark_pattern:
.byte %00010001
.byte %01000100
.byte %00010001
.byte %01000100
.byte %00010001
.byte %01000100
.byte %00010001
.byte %01000100
;;; ============================================================
;;; Icon (i.e. file, volume) details
num_icons: .byte 0
icon_table: .res 127, 0 ; index into icon_ptrs
icon_ptrs: .res 256, 0 ; addresses of icon details
has_highlight: ; 1 = has highlight, 0 = no highlight
.byte 0
highlight_count: ; number of highlighted icons
.byte 0
highlight_list: ; selected icons
.res 127, 0
;;; Polygon holding the composite outlines of all icons being dragged.
;;; Re-use the "save area" ($800-$1AFF) since menus won't show during
;;; this operation.
drag_outline_buffer := SAVE_AREA_BUFFER
max_draggable_items = SAVE_AREA_SIZE / (.sizeof(MGTK::Point) * 8 + 2)
;;; ============================================================
.proc peekevent_params
kind: .byte 0 ; spills into next block
.endproc
.proc findwindow_params2
mousex: .word 0
mousey: .word 0
which_area: .byte 0
window_id: .byte 0
.endproc
.proc grafport
viewloc: DEFINE_POINT 0, 0, viewloc
mapbits: .addr MGTK::screen_mapbits
mapwidth: .word MGTK::screen_mapwidth
cliprect: DEFINE_RECT 0, 0, screen_width-1, screen_height-1
penpattern: .res 8, $FF
colormasks: .byte MGTK::colormask_and, MGTK::colormask_or
penloc: DEFINE_POINT 0, 0
penwidth: .byte 1
penheight: .byte 1
penmode: .byte $96 ; ???
textbg: .byte MGTK::textbg_black
fontptr: .addr DEFAULT_FONT
.endproc
;;; Grafport used to draw icon outlines during drag
.proc drag_outline_grafport
viewloc: DEFINE_POINT 0, 0, viewloc
mapbits: .addr 0
mapwidth: .word 0
cliprect: DEFINE_RECT 0, 0, 0, 0
penpattern: .res 8, 0
colormasks: .byte 0, 0
penloc: DEFINE_POINT 0, 0
penwidth: .byte 0
penheight: .byte 0
penmode: .byte 0
textbg: .byte MGTK::textbg_black
fontptr: .addr 0
.endproc
.proc getwinport_params
window_id: .byte 0
a_grafport: .addr icon_grafport
.endproc
.proc icon_grafport
viewloc: DEFINE_POINT 0, 0, viewloc
mapbits: .addr 0
mapwidth: .word 0
cliprect: DEFINE_RECT 0, 0, 0, 0, cliprect
penpattern: .res 8, 0
colormasks: .byte 0, 0
penloc: DEFINE_POINT 0, 0
penwidth: .byte 0
penheight: .byte 0
penmode: .byte 0
textbg: .byte MGTK::textbg_black
fontptr: .addr 0
.endproc
;;; ============================================================
;;; IconTK command jump table
desktop_jump_table:
.addr 0
.addr ADD_ICON_IMPL
.addr HIGHLIGHT_ICON_IMPL
.addr REDRAW_ICON_IMPL
.addr REMOVE_ICON_IMPL
.addr HIGHLIGHT_ALL_IMPL
.addr REMOVE_ALL_IMPL
.addr CLOSE_WINDOW_IMPL
.addr GET_HIGHLIGHTED_IMPL
.addr FIND_ICON_IMPL
.addr DRAG_HIGHLIGHTED
.addr UNHIGHLIGHT_ICON_IMPL
.addr REDRAW_ICONS_IMPL
.addr ICON_IN_RECT_IMPL
.addr ERASE_ICON_IMPL
.macro ITK_DIRECT_CALL op, addr, label
jsr ITK_DIRECT
.byte op
.addr addr
.endmacro
;;; IconTK entry point (after jump)
.proc ITK_DIRECT
;; Stash return value from stack, adjust by 3
;; (command byte, params addr)
pla
sta call_params
clc
adc #<3
tax
pla
sta call_params+1
adc #>3
pha
txa
pha
;; Save $06..$09 on the stack
ldx #0
: lda $06,x
pha
inx
cpx #4
bne :-
;; Point ($06) at call command
add16 call_params, #1, $06
ldy #0
lda ($06),y
asl a
tax
copy16 desktop_jump_table,x, dispatch + 1
iny
lda ($06),y
tax
iny
lda ($06),y
sta $07
stx $06
dispatch:
jsr dummy0000
tay
ldx #3
: pla
sta $06,x
dex
cpx #$FF
bne :-
tya
rts
call_params: .addr 0
.endproc
.proc moveto_params2
xcoord: .word 0
ycoord: .word 0
.endproc
;;; ============================================================
;;; ADD_ICON IMPL
.proc ADD_ICON_IMPL
PARAM_BLOCK params, $06
ptr_icon: .addr 0
END_PARAM_BLOCK
ldy #0
lda (params::ptr_icon),y
ldx num_icons
beq proceed
dex
: cmp icon_table,x
beq fail
dex
bpl :-
bmi proceed
fail: return #1
proceed:
jsr sub
jsr paint_icon_unhighlighted
lda #1
tay
sta (params::ptr_icon),y
return #0
sub: ldx num_icons ; ???
sta icon_table,x
inc num_icons
asl a
tax
copy16 params::ptr_icon, icon_ptrs,x
rts
.endproc
;;; ============================================================
;;; HIGHLIGHT_ICON IMPL
;;; param is pointer to icon id
.proc HIGHLIGHT_ICON_IMPL
PARAM_BLOCK params, $06
ptr_icon: .addr 0
END_PARAM_BLOCK
ptr := $06 ; Overwrites param
ldx num_icons
beq bail1
dex
ldy #0
lda (params::ptr_icon),y
: cmp icon_table,x
beq :+
dex
bpl :-
bail1: return #1 ; Not found
: asl a
tax
copy16 icon_ptrs,x, ptr ; ptr now points at IconEntry
ldy #IconEntry::state
lda (ptr),y
bne :+ ; Already set ??? Routine semantics are incorrect ???
return #2
: lda has_highlight
beq L9498
;; Already in highlight list?
dey
lda (ptr),y
ldx highlight_count
dex
: cmp highlight_list,x
beq bail3
dex
bpl :-
jmp L949D
bail3: return #3 ; Already in list
L9498: lda #1
sta has_highlight
;; Append to highlight list
L949D: ldx highlight_count
ldy #0
lda (ptr),y
sta highlight_list,x
inc highlight_count
lda (ptr),y ; icon num
ldx #1 ; new position
jsr change_highlight_index
ldy #IconEntry::id
lda (ptr),y ; icon num
ldx #1 ; new position
jsr change_icon_index
;; Redraw
ldy #IconEntry::id
lda (ptr),y ; icon num
sta icon
ITK_DIRECT_CALL IconTK::REDRAW_ICON, icon
return #0 ; Highlighted
;; IconTK::REDRAW_ICON params
icon: .byte 0
.endproc
;;; ============================================================
;;; REDRAW_ICON IMPL
;;; * Assumes correct grafport already selected/maprect specified
;;; * Does not erase background
.proc REDRAW_ICON_IMPL
PARAM_BLOCK params, $06
ptr_icon: .addr 0
END_PARAM_BLOCK
ptr := $06 ; Overwrites param
;; Find icon by number
ldx num_icons
beq bail1
dex
ldy #0
lda (params::ptr_icon),y
: cmp icon_table,x
beq found
dex
bpl :-
bail1: return #1 ; Not found
;; Pointer to icon details
found: asl a
tax
copy16 icon_ptrs,x, ptr
lda has_highlight ; Anything highlighted?
bne :+
jmp done
: ldx highlight_count
dex
ldy #0
lda (ptr),y
;; Find in highlight list
: cmp highlight_list,x
beq found2
dex
bpl :-
jmp done
found2: jsr paint_icon_highlighted
return #0
done: jsr paint_icon_unhighlighted
return #0
.endproc
;;; ============================================================
;;; REMOVE_ICON IMPL
;;; param is pointer to icon number
.proc REMOVE_ICON_IMPL
PARAM_BLOCK params, $06
ptr_icon: .addr 0
END_PARAM_BLOCK
ptr := $06 ; Overwrites param
;; Find icon by number
ldy #0
ldx num_icons
beq bail1
dex
lda (params::ptr_icon),y
: cmp icon_table,x
beq found
dex
bpl :-
bail1: return #1 ; Not found
;; Pointer to icon details
found: asl a
tax
copy16 icon_ptrs,x, ptr
ldy #IconEntry::state
lda (ptr),y
bne :+
return #2 ; Not highlighted
;; Unhighlight
: jsr calc_icon_poly
jsr erase_icon
;; Move it to the end of the icon list
ldy #IconEntry::id
lda (ptr),y ; icon num
ldx num_icons ; new position
jsr change_icon_index
;; Remove it from the list
dec num_icons
lda #0
ldx num_icons
sta icon_table,x
;; Clear its flag
ldy #IconEntry::state
lda #0
sta (ptr),y
lda has_highlight
beq done
;; Find it in the highlight list
ldx highlight_count
dex
ldy #0
lda (ptr),y
: cmp highlight_list,x
beq found2
dex
bpl :-
jmp done ; not found
;; Move it to the end of the highlight list
found2: ldx highlight_count ; new position
jsr change_highlight_index
;; Remove it from the highlight list and update flag
dec highlight_count
lda highlight_count
bne :+
lda #0
sta has_highlight
: lda #0
ldx highlight_count
sta highlight_list,x
done: return #0 ; Unhighlighted
.endproc
;;; ============================================================
;;; ERASE_ICON IMPL
.proc ERASE_ICON_IMPL
PARAM_BLOCK params, $06
ptr_icon_idx: .addr 0
END_PARAM_BLOCK
ptr := $06 ; Overwrites param
ldy #0
lda (params::ptr_icon_idx),y
asl a
tax
copy16 icon_ptrs,x, ptr
jmp erase_icon
.endproc
;;; ============================================================
;;; HIGHLIGHT_ALL IMPL
;;; Highlight all icons in the specified window.
;;; (Unused?)
.proc HIGHLIGHT_ALL_IMPL
jmp start
PARAM_BLOCK params, $06
ptr_window_id: .addr 0
END_PARAM_BLOCK
ptr := $08
;; IconTK::HIGHLIGHT_ICON params
icon: .byte 0
buffer: .res 127, 0
start: lda HIGHLIGHT_ICON_IMPL ; ???
beq start2
lda highlight_list
sta icon
ITK_DIRECT_CALL IconTK::UNHIGHLIGHT_ICON, icon
jmp start
start2:
;; Zero out buffer
ldx #max_icon_count-1
lda #0
: sta buffer,x
dex
bpl :-
ldx #0
stx icon
;; Walk through icons, find ones in the same window
;; as the entry at ($06).
loop: lda icon_table,x
asl a
tay
copy16 icon_ptrs,y, ptr
ldy #IconEntry::win_type
lda (ptr),y
and #icon_entry_winid_mask
ldy #0
cmp (params::ptr_window_id),y
bne :+
;; Append icon number to buffer.
ldy #IconEntry::id
lda (ptr),y
ldy icon
sta buffer,y
inc icon
: inx
cpx num_icons
bne loop
ldx #0
txa
pha
;; Highlight all the icons.
loop2: lda buffer,x
bne :+
pla
rts
: sta icon
ITK_DIRECT_CALL IconTK::HIGHLIGHT_ICON, icon
pla
tax
inx
txa
pha
jmp loop2
.endproc
;;; ============================================================
;;; REMOVE_ALL IMPL
;;; param is window id (0 = desktop)
.proc REMOVE_ALL_IMPL
jmp start
PARAM_BLOCK params, $06
ptr_window_id: .addr 0
END_PARAM_BLOCK
icon_ptr := $08
;; IconTK::REMOVE_ICON params
icon: .byte 0
count: .byte 0
start: lda num_icons
sta count
loop: ldx count
cpx #0
beq done
dec count
dex
lda icon_table,x
sta icon
asl a
tax
copy16 icon_ptrs,x, icon_ptr
ldy #IconEntry::win_type
lda (icon_ptr),y
and #icon_entry_winid_mask
ldy #0
cmp (params::ptr_window_id),y
bne loop
ITK_DIRECT_CALL IconTK::REMOVE_ICON, icon
jmp loop
done: return #0
.endproc
;;; ============================================================
;;; CLOSE_WINDOW IMPL
;;; param is window id
.proc CLOSE_WINDOW_IMPL
PARAM_BLOCK params, $06
window_id: .addr 0
END_PARAM_BLOCK
ptr := $08
jmp start
icon: .byte 0
count: .byte 0
start: lda num_icons
sta count
loop: ldx count
bne L96E5
return #0
L96E5: dec count
dex
lda icon_table,x
sta icon
asl a
tax
copy16 icon_ptrs,x, ptr
ldy #IconEntry::win_type
lda (ptr),y
and #icon_entry_winid_mask ; check window
ldy #0
cmp (params::window_id),y ; match?
bne loop ; nope
;; Move to end of icon list
ldy #IconEntry::id
lda (ptr),y ; icon num
ldx num_icons ; icon index
jsr change_icon_index
dec num_icons
lda #0
ldx num_icons
sta icon_table,x
ldy #IconEntry::state
lda #0
sta (ptr),y
lda has_highlight
beq L9758
ldx #0
ldy #0
L972B: lda (ptr),y
cmp highlight_list,x
beq L973B
inx
cpx highlight_count
bne L972B
jmp L9758
L973B: lda (ptr),y ; icon num
ldx highlight_count ; new position
jsr change_highlight_index
dec highlight_count
lda highlight_count
bne L9750
lda #0
sta has_highlight
L9750: lda #0
ldx highlight_count
sta highlight_list,x
L9758: jmp loop
.endproc
;;; ============================================================
;;; GET_HIGHLIGHTED IMPL
;;; Copies highlighted icon numbers to ($06)
.proc GET_HIGHLIGHTED_IMPL
ldx #0
ldy #0
: lda highlight_list,x
sta ($06),y
cpx highlight_count
beq done
iny
inx
jmp :-
done: return #0
.endproc
;;; ============================================================
;;; FIND_ICON IMPL
.proc FIND_ICON_IMPL
jmp start
coords := $6
;; Copy coords at $6 to param block
start: ldy #3
: lda (coords),y
sta moveto_params2,y
dey
bpl :-
;; Overwrite y with x ???
copy16 $06, $08
;; ???
ldy #5
lda ($06),y
sta L97F5
MGTK_CALL MGTK::MoveTo, moveto_params2
ldx #0
L97AA: cpx num_icons
bne L97B9
ldy #4
lda #0
sta ($08),y
sta L97F6
rts
L97B9: txa
pha
lda icon_table,x
asl a
tax
copy16 icon_ptrs,x, $06
ldy #IconEntry::win_type
lda ($06),y
and #icon_entry_winid_mask
cmp L97F5
bne L97E0
jsr calc_icon_poly
MGTK_CALL MGTK::InPoly, poly
bne inside
L97E0: pla
tax
inx
jmp L97AA
inside: pla
tax
lda icon_table,x
ldy #4
sta ($08),y
sta L97F6
rts
L97F5: .byte 0
L97F6: .byte 0
.endproc
;;; ============================================================
;;; IconTK DRAG_HIGHLIGHTED IMPL
.proc DRAG_HIGHLIGHTED
ldy #IconEntry::id
lda ($06),y
sta icon_id
tya
sta ($06),y
ldy #4
: lda ($06),y
sta L9C8D,y
sta L9C92-1,y ; ???
dey
cpy #0
bne :-
jsr push_pointers
lda icon_id
jsr L9EB4
stax $06
ldy #IconEntry::win_type
lda ($06),y
and #icon_entry_winid_mask
sta win_id
jmp L983D ; skip over data
win_id: .byte $00 ; written but not read
icon_id:
.byte $00
deltax: .word 0
deltay: .word 0
;; IconTK::HIGHLIGHT_ICON params
highlight_icon_id: .byte $00
L9831: .byte $00
L9832: .byte $00
L9833: .byte $00
L9834: .byte $00
L9835: .byte $00,$00,$00,$00,$00,$00,$00,$00
L983D: lda #0
sta highlight_icon_id
sta L9833
peek_loop:
MGTK_CALL MGTK::PeekEvent, peekevent_params
lda peekevent_params::kind
cmp #MGTK::EventKind::drag
beq L9857
ignore_drag:
lda #2 ; return value
jmp just_select
;; Compute mouse delta
L9857: sub16 findwindow_params2::mousex, L9C8E, deltax
sub16 findwindow_params2::mousey, L9C90, deltay
drag_delta := 5
;; compare x delta
lda deltax+1
bpl x_lo
lda deltax
cmp #AS_BYTE(-drag_delta)
bcc is_drag
jmp check_deltay
x_lo: lda deltax
cmp #drag_delta
bcs is_drag
;; compare y delta
check_deltay:
lda deltay+1
bpl y_lo
lda deltay
cmp #AS_BYTE(-drag_delta)
bcc is_drag
jmp peek_loop
y_lo: lda deltay
cmp #drag_delta
bcs is_drag
jmp peek_loop
;; Meets the threshold - it is a drag, not just a click.
is_drag:
lda highlight_count
cmp #max_draggable_items + 1
bcc :+
jmp ignore_drag ; too many
;; Was there a selection?
: copy16 #drag_outline_buffer, $08
lda has_highlight
bne :+
lda #3 ; return value
jmp just_select
: lda highlight_list
jsr L9EB4
stax $06
ldy #IconEntry::win_type
lda ($06),y
and #icon_entry_winid_mask
sta L9832
;; Prepare grafports
MGTK_CALL MGTK::InitPort, icon_grafport
MGTK_CALL MGTK::InitPort, drag_outline_grafport
MGTK_CALL MGTK::SetPort, drag_outline_grafport
MGTK_CALL MGTK::SetPattern, checkerboard_pattern
MGTK_CALL MGTK::SetPenMode, penXOR
;; TODO: This is needed, but why?
COPY_STRUCT MGTK::Rect, drag_outline_grafport::cliprect, L9835
ldx highlight_count
stx L9C74
L98F2: lda highlight_count,x
jsr L9EB4
stax $06
ldy #0
lda ($06),y
cmp #1
bne L9909
ldx #$80
stx L9833
L9909: sta L9834
ITK_DIRECT_CALL IconTK::ICON_IN_RECT, L9834
beq L9954
jsr calc_icon_poly
lda L9C74
cmp highlight_count
beq L9936
jsr push_pointers
lda $08
sec
sbc #icon_poly_size
sta $08
bcs L992D
dec $08+1
L992D: ldy #IconEntry::state
lda #$80 ; Highlighted
sta ($08),y
jsr pop_pointers
L9936: ldx #icon_poly_size-1
ldy #icon_poly_size-1
L993A: lda poly,x
sta ($08),y
dey
dex
bpl L993A
lda #8
ldy #0
sta ($08),y
lda $08
clc
adc #icon_poly_size
sta $08
bcc L9954
inc $08+1
L9954: dec L9C74
beq L995F
ldx L9C74
jmp L98F2
L995F: COPY_BYTES 8, drag_outline_buffer+2, L9C76
copy16 #drag_outline_buffer, $08
L9972: ldy #2
L9974: lda ($08),y
cmp L9C76
iny
lda ($08),y
sbc L9C76+1
bcs L9990
lda ($08),y
sta L9C76+1
dey
lda ($08),y
sta L9C76
iny
jmp L99AA
L9990: dey
lda ($08),y
cmp L9C7A
iny
lda ($08),y
sbc L9C7A+1
bcc L99AA
lda ($08),y
sta L9C7A+1
dey
lda ($08),y
sta L9C7A
iny
L99AA: iny
lda ($08),y
cmp L9C78
iny
lda ($08),y
sbc L9C78+1
bcs L99C7
lda ($08),y
sta L9C78+1
dey
lda ($08),y
sta L9C78
iny
jmp L99E1
L99C7: dey
lda ($08),y
cmp L9C7C
iny
lda ($08),y
sbc L9C7C+1
bcc L99E1
lda ($08),y
sta L9C7C+1
dey
lda ($08),y
sta L9C7C
iny
L99E1: iny
cpy #icon_poly_size
bne L9974
ldy #IconEntry::state
lda ($08),y
beq L99FC
add16 $08, #icon_poly_size, $08
jmp L9972
L99FC: jsr xdraw_outline
L9A0E: MGTK_CALL MGTK::PeekEvent, peekevent_params
lda peekevent_params::kind
cmp #MGTK::EventKind::drag
beq L9A1E
jmp L9BA5
L9A1E: ldx #3
L9A20: lda findwindow_params2,x
cmp L9C92,x
bne L9A31
dex
bpl L9A20
jsr L9E14
jmp L9A0E
L9A31: COPY_BYTES 4, findwindow_params2, L9C92
lda highlight_icon_id
beq L9A84
lda L9831
sta findwindow_params2::window_id
ITK_DIRECT_CALL IconTK::FIND_ICON, findwindow_params2
lda findwindow_params2::which_area
cmp highlight_icon_id
beq L9A84
jsr xdraw_outline
MGTK_CALL MGTK::SetPort, icon_grafport
ITK_DIRECT_CALL IconTK::UNHIGHLIGHT_ICON, highlight_icon_id
jsr xdraw_outline
lda #0
sta highlight_icon_id
L9A84: sub16 findwindow_params2::mousex, L9C8E, L9C96
sub16 findwindow_params2::mousey, L9C90, L9C98
jsr L9C9E
ldx #0
L9AAF: add16 L9C7A,x, L9C96,x, L9C7A,x
add16 L9C76,x, L9C96,x, L9C76,x
inx
inx
cpx #4
bne L9AAF
lda #0
sta L9C75
lda L9C76+1
bmi L9AF7
cmp16 L9C7A, #screen_width
bcs L9AFE
jsr L9DFA
jmp L9B0E
L9AF7: jsr L9CAA
bmi L9B0E
bpl L9B03
L9AFE: jsr L9CD1
bmi L9B0E
L9B03: jsr L9DB8
lda L9C75
ora #$80
sta L9C75
L9B0E: lda L9C78+1
bmi L9B31
cmp16 L9C78, #13
bcc L9B31
cmp16 L9C7C, #screen_height
bcs L9B38
jsr L9E07
jmp L9B48
L9B31: jsr L9D31
bmi L9B48
bpl L9B3D
L9B38: jsr L9D58
bmi L9B48
L9B3D: jsr L9DD9
lda L9C75
ora #$40
sta L9C75
L9B48: bit L9C75
bpl L9B52
bvc L9B52
jmp L9A0E
L9B52: jsr xdraw_outline
copy16 #drag_outline_buffer, $08
L9B60: ldy #2
L9B62: add16in ($08),y, L9C96, ($08),y
iny
add16in ($08),y, L9C98, ($08),y
iny
cpy #icon_poly_size
bne L9B62
ldy #IconEntry::state
lda ($08),y
beq L9B9C
lda $08
clc
adc #icon_poly_size
sta $08
bcc L9B99
inc $08+1
L9B99: jmp L9B60
L9B9C: jsr xdraw_outline
jmp L9A0E
L9BA5: jsr xdraw_outline
lda highlight_icon_id
beq :+
MGTK_CALL MGTK::SetPort, icon_grafport
ITK_DIRECT_CALL IconTK::UNHIGHLIGHT_ICON, highlight_icon_id
jmp L9C63
: MGTK_CALL MGTK::FindWindow, findwindow_params2
lda findwindow_params2::window_id
cmp L9832
beq L9BE1
bit L9833
bmi L9BDC
lda findwindow_params2::window_id
bne L9BD4
L9BD1: jmp ignore_drag
L9BD4: ora #$80
sta highlight_icon_id
jmp L9C63
L9BDC: lda L9832
beq L9BD1
L9BE1: jsr push_pointers
ldx highlight_count
L9BF3: dex
bmi L9C18
txa
pha
lda highlight_list,x
asl a
tax
copy16 icon_ptrs,x, $06
jsr calc_icon_poly
jsr erase_icon
pla
tax
jmp L9BF3
L9C18: jsr pop_pointers
ldx highlight_count
dex
txa
pha
copy16 #drag_outline_buffer, $08
L9C29: lda highlight_list,x
asl a
tax
copy16 icon_ptrs,x, $06
ldy #IconEntry::win_type
lda ($08),y
iny
sta ($06),y
lda ($08),y
iny
sta ($06),y
lda ($08),y
iny
sta ($06),y
lda ($08),y
iny
sta ($06),y
pla
tax
dex
bmi L9C63
txa
pha
lda $08
clc
adc #icon_poly_size
sta $08
bcc L9C60
inc $08+1
L9C60: jmp L9C29
L9C63: lda #0
just_select: ; ???
tay
jsr pop_pointers
tya
tax
ldy #0
lda highlight_icon_id
sta ($06),y
txa
rts
L9C74: .byte $00
L9C75: .byte $00
L9C76: .word 0
L9C78: .word 0
L9C7A: .word 0
L9C7C: .word 0
L9C7E: .word 0
L9C80: .word 13
const_screen_width: .word screen_width
const_screen_height: .word screen_height
L9C86: .word 0
L9C88: .word 0
L9C8A: .word 0
L9C8C: .byte $00
L9C8D: .byte 0
L9C8E: .word 0
L9C90: .word 0
L9C92: .res 4
L9C96: .word 0
L9C98: .word 0
.byte $00,$00,$00,$00
L9C9E: COPY_STRUCT MGTK::Rect, L9C76, L9C86
rts
L9CAA: lda L9C76
cmp L9C7E
bne L9CBD
lda L9C76+1
cmp L9C7E+1
bne L9CBD
return #0
L9CBD: sub16 #0, L9C86, L9C96
jmp L9CF5
L9CD1: lda L9C7A
cmp const_screen_width
bne L9CE4
lda L9C7A+1
cmp const_screen_width+1
bne L9CE4
return #0
L9CE4: sub16 #screen_width, L9C8A, L9C96
L9CF5: add16 L9C86, L9C96, L9C76
add16 L9C8A, L9C96, L9C7A
add16 L9C8E, L9C96, L9C8E
return #$FF
L9D31: lda L9C78
cmp L9C80
bne L9D44
lda L9C78+1
cmp L9C80+1
bne L9D44
return #0
L9D44: sub16 #13, L9C88, L9C98
jmp L9D7C
L9D58: lda L9C7C
cmp const_screen_height
bne L9D6B
lda L9C7C+1
cmp const_screen_height+1
bne L9D6B
return #0
L9D6B: sub16 #screen_height-1, L9C8C, L9C98
L9D7C: add16 L9C88, L9C98, L9C78
add16 L9C8C, L9C98, L9C7C
add16 L9C90, L9C98, L9C90
return #$FF
L9DB8: copy16 L9C86, L9C76
copy16 L9C8A, L9C7A
lda #0
sta L9C96
sta L9C96+1
rts
L9DD9: copy16 L9C88, L9C78
copy16 L9C8C, L9C7C
lda #0
sta L9C98
sta L9C98+1
rts
L9DFA: lda findwindow_params2::mousex+1
sta L9C8E+1
lda findwindow_params2::mousex
sta L9C8E
rts
L9E07: lda findwindow_params2::mousey+1
sta L9C90+1
lda findwindow_params2::mousey
sta L9C90
rts
L9E14: bit L9833
bpl L9E1A
rts
L9E1A: jsr push_pointers
MGTK_CALL MGTK::FindWindow, findwindow_params2
lda findwindow_params2::which_area
bne L9E2B
sta findwindow_params2::window_id
L9E2B: ITK_DIRECT_CALL IconTK::FIND_ICON, findwindow_params2
lda findwindow_params2::which_area ; Icon ID
bne L9E39
jmp L9E97
L9E39: ldx highlight_count
dex
L9E3D: cmp highlight_list,x
beq L9E97
dex
bpl L9E3D
sta L9EB3
cmp #1 ; Trash?
beq :+
asl a
tax
copy16 icon_ptrs,x, $06
ldy #IconEntry::win_type
lda ($06),y
and #icon_entry_winid_mask
sta L9831
lda ($06),y
and #icon_entry_type_mask
bne L9E97
lda L9EB3
: sta highlight_icon_id
jsr xdraw_outline
MGTK_CALL MGTK::SetPort, icon_grafport
ITK_DIRECT_CALL IconTK::HIGHLIGHT_ICON, highlight_icon_id
jsr xdraw_outline
L9E97: jsr pop_pointers
rts
L9EB3: .byte 0
L9EB4: asl a
tay
lda icon_ptrs+1,y
tax
lda icon_ptrs,y
rts
.proc xdraw_outline
MGTK_CALL MGTK::SetPort, drag_outline_grafport
MGTK_CALL MGTK::FramePoly, drag_outline_buffer
rts
.endproc
.endproc
;;; ============================================================
;;; UNHIGHLIGHT_ICON IMPL
;;; param is pointer to IconEntry
.proc UNHIGHLIGHT_ICON_IMPL
PARAM_BLOCK params, $06
ptr_iconent: .addr 0
END_PARAM_BLOCK
start: lda has_highlight
bne :+
return #1 ; No selection
;; Move it to the end of the highlight list
: ldx highlight_count ; new position
ldy #IconEntry::id
lda (params::ptr_iconent),y ; icon num
jsr change_highlight_index
;; Remove it from the highlight list and update flag
ldx highlight_count
lda #0
sta highlight_count,x
dec highlight_count
lda highlight_count
bne :+
lda #0 ; Clear flag if no more highlighted
sta has_highlight
;; Redraw
: ldy #IconEntry::id
lda (params::ptr_iconent),y
sta icon
ITK_DIRECT_CALL IconTK::REDRAW_ICON, icon
return #0
;; IconTK::REDRAW_ICON params
icon: .byte 0
.endproc
;;; ============================================================
;;; ICON_IN_RECT IMPL
.proc ICON_IN_RECT_IMPL
jmp start
icon: .byte 0
rect: DEFINE_RECT 0,0,0,0,rect
start: ldy #0
lda ($06),y
sta icon
ldy #8
: lda ($06),y
sta rect-1,y
dey
bne :-
lda icon
asl a
tax
copy16 icon_ptrs,x, $06
jsr calc_icon_poly
cmp16 poly::v0::ycoord, rect::y2
bpl done
cmp16 poly::v5::ycoord, rect::y1
bmi done
cmp16 poly::v5::xcoord, rect::x2
bpl done
cmp16 poly::v4::xcoord, rect::x1
bmi done
cmp16 poly::v7::ycoord, rect::y2
bmi L9F8F
cmp16 poly::v7::xcoord, rect::x2
bpl done
cmp16 poly::v2::xcoord, rect::x1
bpl L9F8F
done: return #0
L9F8F: return #1
.endproc
;;; ============================================================
;;; Paint icon
;;; * Assumes grafport selected and maprect configured
;;; * Does not erase background
icon_flags: ; bit 7 = highlighted, bit 6 = volume icon
.byte 0
open_flag: ; non-zero if open volume/dir
.byte 0
more_drawing_needed_flag:
.byte 0
L9F94: .byte 0
.byte 0
.byte 0
.byte 0
.proc paint_icon
unhighlighted:
lda #0
sta icon_flags
beq common
highlighted: copy #$80, icon_flags ; is highlighted
.proc common
;; Test if icon is open volume/folder
ldy #IconEntry::win_type
lda ($06),y
and #icon_entry_open_mask
sta open_flag
ldy #IconEntry::win_type
lda ($06),y
and #icon_entry_winid_mask
bne :+
;; Mark as "volume icon" on desktop (needs background)
lda icon_flags
ora #$40
sta icon_flags
;; copy icon entry coords and bits
: ldy #IconEntry::iconx
: lda ($06),y
sta icon_paintbits_params::viewloc-IconEntry::iconx,y
sta mask_paintbits_params::viewloc-IconEntry::iconx,y
iny
cpy #IconEntry::iconx + 6 ; x/y/bits
bne :-
jsr push_pointers
;; copy icon definition bits
copy16 icon_paintbits_params::mapbits, $08
ldy #.sizeof(MGTK::MapInfo) - .sizeof(MGTK::Point) - 1
: lda ($08),y
sta icon_paintbits_params::mapbits,y
sta mask_paintbits_params::mapbits,y
dey
bpl :-
;; Icon definition is followed by pointer to mask address.
ldy #.sizeof(MGTK::MapInfo) - .sizeof(MGTK::Point)
copy16in ($08),y, mask_paintbits_params::mapbits
jsr pop_pointers
ldy #9
: lda ($06),y
sta rect_opendir::y2,y
iny
cpy #$1D
bne :-
: lda drawtext_params::textlen
sta textwidth_params::textlen
MGTK_CALL MGTK::TextWidth, textwidth_params
lda textwidth_params::result
cmp icon_paintbits_params::maprect::x2
bcs :+
inc drawtext_params::textlen
ldx drawtext_params::textlen
lda #' '
sta text_buffer-1,x
jmp :-
: lsr a
sta moveto_params2::xcoord+1
lda icon_paintbits_params::maprect::x2
lsr a
sta moveto_params2::xcoord
lda moveto_params2::xcoord+1
sec
sbc moveto_params2::xcoord
sta moveto_params2::xcoord
sub16_8 icon_paintbits_params::viewloc::xcoord, moveto_params2::xcoord, moveto_params2::xcoord
add16_8 icon_paintbits_params::viewloc::ycoord, icon_paintbits_params::maprect::y2, moveto_params2::ycoord
add16 moveto_params2::ycoord, #1, moveto_params2::ycoord
add16_8 moveto_params2::ycoord, font_height, moveto_params2::ycoord
COPY_STRUCT MGTK::Point, moveto_params2, L9F94
bit icon_flags ; volume icon (on desktop) ?
bvc do_paint ; nope
;; TODO: This depends on a previous proc having adjusted
;; the grafport (for window maprect and window's items/used/free bar)
;; Volume (i.e. icon on desktop)
MGTK_CALL MGTK::InitPort, grafport
jsr set_port_for_vol_icon
: jsr calc_window_intersections
jsr do_paint
lda more_drawing_needed_flag
bne :-
MGTK_CALL MGTK::SetPortBits, grafport ; default maprect
rts
.endproc
.proc do_paint
MGTK_CALL MGTK::HideCursor
;; --------------------------------------------------
;; Icon
;; Shade (XORs background)
lda open_flag
beq :+
jsr calc_rect_opendir
jsr shade
;; Mask (cleared to white or black)
: MGTK_CALL MGTK::SetPenMode, penOR
bit icon_flags
bpl :+
MGTK_CALL MGTK::SetPenMode, penBIC
: MGTK_CALL MGTK::PaintBits, mask_paintbits_params
;; Shade again (restores background)
lda open_flag
beq :+
jsr shade
;; Icon (drawn in black or white)
: MGTK_CALL MGTK::SetPenMode, penBIC
bit icon_flags
bpl :+
MGTK_CALL MGTK::SetPenMode, penOR
: MGTK_CALL MGTK::PaintBits, icon_paintbits_params
;; --------------------------------------------------
;; Label
COPY_STRUCT MGTK::Point, L9F94, moveto_params2
MGTK_CALL MGTK::MoveTo, moveto_params2
bit icon_flags ; highlighted?
bmi :+
lda #MGTK::textbg_white
bne setbg
: lda #MGTK::textbg_black
setbg: sta settextbg_params
MGTK_CALL MGTK::SetTextBG, settextbg_params
MGTK_CALL MGTK::DrawText, drawtext_params
MGTK_CALL MGTK::ShowCursor
rts
.proc shade
MGTK_CALL MGTK::SetPattern, dark_pattern
MGTK_CALL MGTK::SetPenMode, penXOR
MGTK_CALL MGTK::PaintRect, rect_opendir
done: rts
.endproc
.endproc
;;; ============================================================
.proc calc_rect_opendir
ldx #0
loop: add16 icon_paintbits_params::viewloc::xcoord,x, icon_paintbits_params::maprect::x1,x, rect_opendir::x1,x
add16 icon_paintbits_params::viewloc::xcoord,x, icon_paintbits_params::maprect::x2,x, rect_opendir::x2,x
inx
inx
cpx #4
bne loop
rts
.endproc
.endproc ; paint_icon
paint_icon_unhighlighted := paint_icon::unhighlighted
paint_icon_highlighted := paint_icon::highlighted
;;; ============================================================
;;; v0 v1
;;; +----------+
;;; | |
;;; | |
;;; | |
;;; v7 | | v2
;;; v6 +-----+ +-----+ v3
;;; | |
;;; v5 +----------------------+ v4
;;;
;;; (Label is always at least as wide as the icon)
icon_poly_size = (8 * .sizeof(MGTK::Point)) + 2
.proc calc_icon_poly
entry_ptr := $6
bitmap_ptr := $8
jsr push_pointers
;; v0 - copy from icon entry
ldy #IconEntry::iconx+3
ldx #3
: lda (entry_ptr),y
sta poly::v0,x
dey
dex
bpl :-
;; Top edge (v0, v1)
copy16 poly::v0::ycoord, poly::v1::ycoord
;; Left edge of icon (v0, v7)
copy16 poly::v0::xcoord, poly::v7::xcoord
ldy #IconEntry::iconbits
copy16in (entry_ptr),y, bitmap_ptr
;; Right edge of icon (v1, v2)
ldy #8 ; bitmap x2
lda (bitmap_ptr),y
clc
adc poly::v0::xcoord
sta poly::v1::xcoord
sta poly::v2::xcoord
iny
lda (bitmap_ptr),y
adc poly::v0::xcoord+1
sta poly::v1::xcoord+1
sta poly::v2::xcoord+1
;; Bottom edge of icon (v2, v7)
ldy #10 ; bitmap y2
add16in (bitmap_ptr),y, poly::v0::ycoord, poly::v2::ycoord
lda poly::v2::ycoord ; 2px down
clc
adc #2
sta poly::v2::ycoord
sta poly::v3::ycoord
sta poly::v6::ycoord
sta poly::v7::ycoord
lda poly::v2::ycoord+1
adc #0
sta poly::v2::ycoord+1
sta poly::v3::ycoord+1
sta poly::v6::ycoord+1
sta poly::v7::ycoord+1
;; Bottom edge of label (v4, v5)
lda font_height
clc
adc poly::v2::ycoord
sta poly::v4::ycoord
sta poly::v5::ycoord
lda poly::v2::ycoord+1
adc #0
sta poly::v4::ycoord+1
sta poly::v5::ycoord+1
;; Compute text width
ldy #.sizeof(IconEntry)+1
ldx #19 ; len byte + 15 chars + 2 spaces
: lda (entry_ptr),y
sta text_buffer-1,x
dey
dex
bpl :-
;; Pad with spaces until it's at least as wide as the icon
: lda drawtext_params::textlen
sta textwidth_params::textlen
MGTK_CALL MGTK::TextWidth, textwidth_params
ldy #8 ; bitmap x2 offset
lda textwidth_params::result
cmp (bitmap_ptr),y
bcs got_width
inc drawtext_params::textlen
ldx drawtext_params::textlen
lda #' '
sta text_buffer-1,x
jmp :-
got_width:
lsr a ; width / 2
sta text_width
lda ($08),y ; still has bitmap x2 offset
lsr a ; / 2
sta icon_width
;; Left edge of label (v5, v6)
lda text_width
sec
sbc icon_width
sta icon_width
lda poly::v0::xcoord
sec
sbc icon_width
sta poly::v6::xcoord
sta poly::v5::xcoord
lda poly::v0::xcoord+1
sbc #0
sta poly::v6::xcoord+1
sta poly::v5::xcoord+1
;; Right edge of label (v3, v4)
inc textwidth_params::result
inc textwidth_params::result
lda poly::v5::xcoord
clc
adc textwidth_params::result
sta poly::v3::xcoord
sta poly::v4::xcoord
lda poly::v5::xcoord+1
adc #0
sta poly::v3::xcoord+1
sta poly::v4::xcoord+1
jsr pop_pointers
rts
icon_width: .byte 0
text_width: .byte 0
.endproc
;;; ============================================================
;;; REDRAW_ICONS IMPL
.proc REDRAW_ICONS_IMPL
ptr := $06
jmp start
;; IconTK::REDRAW_ICON params
icon: .byte 0
done: jsr pop_pointers
rts
start: jsr push_pointers
MGTK_CALL MGTK::InitPort, icon_grafport
MGTK_CALL MGTK::SetPort, icon_grafport
ldx num_icons
dex
loop: bmi done
txa
pha
lda icon_table,x
asl a
tax
copy16 icon_ptrs,x, ptr
ldy #IconEntry::win_type
lda (ptr),y
and #icon_entry_winid_mask ; desktop icon
bne next ; no, skip it
ldy #IconEntry::id
lda (ptr),y
sta icon
ITK_DIRECT_CALL IconTK::REDRAW_ICON, icon
next: pla
tax
dex
jmp loop
.endproc
;;; ============================================================
;;; A = icon number to move
;;; X = position in highlight list
.proc change_icon_index
stx new_pos
sta icon_num
;; Find position of icon in icon table
ldx #0
: lda icon_table,x
cmp icon_num
beq :+
inx
cpx num_icons
bne :-
rts
;; Shift items down
: lda icon_table+1,x
sta icon_table,x
inx
cpx num_icons
bne :-
;; Shift items up
ldx num_icons
: cpx new_pos
beq place
lda icon_table-2,x
sta icon_table-1,x
dex
jmp :-
;; Place at new position
place: ldx new_pos
lda icon_num
sta icon_table-1,x
rts
new_pos: .byte 0
icon_num: .byte 0
.endproc
;;; ============================================================
;;; A = icon number to move
;;; X = position in highlight list
.proc change_highlight_index
stx new_pos
sta icon_num
;; Find position of icon in highlight list
ldx #0
: lda highlight_list,x
cmp icon_num
beq :+
inx
cpx highlight_count
bne :-
rts
;; Shift items down
: lda highlight_list+1,x
sta highlight_list,x
inx
cpx highlight_count
bne :-
;; Shift items up
ldx highlight_count
: cpx new_pos
beq place
lda highlight_list-2,x
sta highlight_list-1,x
dex
jmp :-
;; Place at new position
place: ldx new_pos
lda icon_num
sta highlight_list-1,x
rts
new_pos: .byte 0
icon_num: .byte 0
.endproc
;;; ============================================================
.proc push_pointers
;; save return addr
pla
sta stash
pla
sta stash+1
;; push $06...$09 to stack
ldx #0
: lda $06,x
pha
inx
cpx #4
bne :-
;; restore return addr
lda stash+1
pha
lda stash
pha
rts
stash: .word 0
.endproc
;;; ============================================================
.proc pop_pointers
;; save return addr
pla
sta stash
pla
sta stash+1
;; pull $06...$09 to stack
ldx #3
: pla
sta $06,x
dex
bpl :-
;; restore return addr
lda stash+1
pha
lda stash
pha
rts
stash: .word 0
.endproc
;;; ============================================================
;;; Erase an icon; redraws overlapping icons as needed
erase_icon:
MGTK_CALL MGTK::InitPort, icon_grafport
MGTK_CALL MGTK::SetPort, icon_grafport
jmp LA3B9
LA3AC: .byte 0
LA3AD: .byte 0
;; IconTK::REDRAW_ICON params
LA3AE: .byte 0
LA3AF: .word 0
LA3B1: .word 0
LA3B3: .byte 0
.byte 0
.byte 0
.byte 0
LA3B7: .byte 0
.proc frontwindow_params
window_id: .byte 0
.endproc
.proc LA3B9
ldy #0
lda ($06),y
sta LA3AC
iny
iny
lda ($06),y
and #$0F ; type - is volume?
sta LA3AD
beq volume
;; File (i.e. icon in window)
copy #$80, LA3B7
MGTK_CALL MGTK::SetPattern, white_pattern
MGTK_CALL MGTK::FrontWindow, frontwindow_params ; Use window's port
lda frontwindow_params::window_id
sta getwinport_params::window_id
MGTK_CALL MGTK::GetWinPort, getwinport_params
jsr offset_icon_poly
jsr shift_port_down ; Further offset by window's items/used/free bar
jsr erase_window_icon
jmp redraw_icons_after_erase
;; Volume (i.e. icon on desktop)
volume:
MGTK_CALL MGTK::InitPort, grafport
jsr set_port_for_vol_icon
: jsr calc_window_intersections
jsr erase_desktop_icon
lda more_drawing_needed_flag
bne :-
MGTK_CALL MGTK::SetPortBits, grafport ; default maprect
jmp redraw_icons_after_erase
.endproc
;;; ============================================================
.proc erase_desktop_icon
lda #0
sta LA3B7
MGTK_CALL MGTK::GetDeskPat, addr
MGTK_CALL MGTK::SetPattern, 0, addr
;; fall through
.endproc
.proc erase_window_icon
copy16 poly::v0::ycoord, LA3B1
copy16 poly::v6::xcoord, LA3AF
COPY_BLOCK poly::v4, LA3B3
MGTK_CALL MGTK::PaintPoly, poly
rts
.endproc
;;; ============================================================
;;; After erasing an icon, redraw any overlapping icons
.proc redraw_icons_after_erase
ptr := $8
jsr push_pointers
ldx num_icons
dex ; any icons to draw?
loop: cpx #$FF ; =-1
bne LA466
bit LA3B7
bpl :+
;; TODO: Is this restoration necessary?
MGTK_CALL MGTK::InitPort, icon_grafport
MGTK_CALL MGTK::SetPort, icon_grafport
: jsr pop_pointers
rts
LA466: txa
pha
lda icon_table,x
cmp LA3AC
beq next
asl a
tax
copy16 icon_ptrs,x, ptr
ldy #IconEntry::win_type
lda (ptr),y
and #$07 ; window_id
cmp LA3AD
bne next
;; Is icon highlighted?
lda has_highlight
beq LA49D
ldy #IconEntry::id ; icon num
lda (ptr),y
ldx #0
: cmp highlight_list,x
beq next ; skip it ???
inx
cpx highlight_count
bne :-
LA49D: ldy #IconEntry::id ; icon num
lda (ptr),y
sta LA3AE
bit LA3B7 ; windowed?
bpl LA4AC ; nope, desktop
jsr offset_icon_do ; yes, adjust rect
LA4AC: ITK_DIRECT_CALL IconTK::ICON_IN_RECT, LA3AE
beq :+
ITK_DIRECT_CALL IconTK::REDRAW_ICON, LA3AE
: bit LA3B7
bpl next
lda LA3AE
jsr offset_icon_undo
next: pla
tax
dex
jmp loop
.endproc
;;; ============================================================
;;; Offset coordinates for windowed icons
.proc offset_icon
offset_flags: .byte 0 ; bit 7 = offset poly, bit 6 = undo offset, otherwise do offset
vl_offset: DEFINE_POINT 0,0,vl_offset
mr_offset: DEFINE_POINT 0,0,mr_offset
entry_poly: copy #$80, offset_flags
bmi LA4E2 ; always
entry_do: pha
lda #$40
sta offset_flags
jmp LA4E2
entry_undo: pha
lda #0
sta offset_flags
LA4E2: ldy #MGTK::GrafPort::viewloc
: lda icon_grafport,y
sta vl_offset,y
iny
cpy #MGTK::GrafPort::viewloc + .sizeof(MGTK::Point)
bne :-
ldy #MGTK::GrafPort::maprect
: lda icon_grafport,y
sta mr_offset - MGTK::GrafPort::maprect,y
iny
cpy #MGTK::GrafPort::maprect + .sizeof(MGTK::Point)
bne :-
bit offset_flags
bmi offset_poly
bvc do_offset
jmp undo_offset
.proc offset_poly
ldx #0
loop1: sub16 poly::vertices+0,x, vl_offset::xcoord, poly::vertices+0,x
sub16 poly::vertices+2,x, vl_offset::ycoord, poly::vertices+2,x
inx
inx
inx
inx
cpx #32
bne loop1
ldx #0
loop2: add16 poly::vertices+0,x, mr_offset::xcoord, poly::vertices+0,x
add16 poly::vertices+2,x, mr_offset::ycoord, poly::vertices+2,x
inx
inx
inx
inx
cpx #32
bne loop2
rts
.endproc
.proc do_offset
ptr := $06
pla
tay
jsr push_pointers
tya
asl a
tax
copy16 icon_ptrs,x, ptr
ldy #IconEntry::iconx
add16in (ptr),y, vl_offset::xcoord, (ptr),y ; iconx += viewloc::xcoord
iny
add16in (ptr),y, vl_offset::ycoord, (ptr),y ; icony += viewloc::xcoord
ldy #IconEntry::iconx
sub16in (ptr),y, mr_offset::xcoord, (ptr),y ; icony -= maprect::left
iny
sub16in (ptr),y, mr_offset::ycoord, (ptr),y ; icony -= maprect::top
jsr pop_pointers
rts
.endproc
.proc undo_offset
ptr := $06
pla
tay
jsr push_pointers
tya
asl a
tax
copy16 icon_ptrs,x, ptr
ldy #IconEntry::iconx
sub16in (ptr),y, vl_offset::xcoord, (ptr),y ; iconx -= viewloc::xcoord
iny
sub16in (ptr),y, vl_offset::ycoord, (ptr),y ; icony -= viewloc::xcoord
ldy #IconEntry::iconx
add16in (ptr),y, mr_offset::xcoord, (ptr),y ; iconx += maprect::left
iny
add16in (ptr),y, mr_offset::ycoord, (ptr),y ; icony += maprect::top
jsr pop_pointers
rts
.endproc
.endproc
offset_icon_poly := offset_icon::entry_poly
offset_icon_do := offset_icon::entry_do
offset_icon_undo := offset_icon::entry_undo
;;; ============================================================
;;; This handles drawing volume icons "behind" windows. It is
;;; done by comparing the bounding rect of the icon (including
;;; label) with windows, and returning a reduced clipping rect.
;;; Since the overlap may be concave, multiple calls may be
;;; necessary; a flag is set if another call is required.
;;;
;;; The algorithm is as follows:
;;;
;;; * Take the bounding box for the icon+label (bounds_*), and
;;; use it as an initial clipping rect.
;;; * Test each corner of the rect.
;;; * If the corner is inside a window, compute the window bounds.
;;; (Complicated by title bars, scroll bars, and borders.)
;;; * Consider each case where a window and rect overlap. There
;;; are 9 cases (8 interesting, one degenerate).
;;; * Reduce the clipping rect to the leftmost exposed portion.
;;; * Recheck the corners, since another window may be overlapped.
;;; * Once a minimal rect is achieved, set a flag indicating if
;;; another call is needed, and return.
;;; * Caller draws the icon into the clipping rect. If flag was
;;; set, the caller calls in again.
;;; * On re-entry, return to the initial bounding box but with
;;; an updated left edge.
;;;
;;; ============================================================
;;; Initial bounds, saved for re-entry.
bounds_l: .word 0 ; written but never read???
bounds_t: .word 0
bounds_r: .word 0
bounds_b: .word 0
.proc portbits
viewloc: DEFINE_POINT 0, 0, viewloc
mapbits: .addr MGTK::screen_mapbits
mapwidth: .word MGTK::screen_mapwidth
cliprect: DEFINE_RECT 0, 0, 0, 0, cliprect
.endproc
.proc set_port_for_vol_icon
jsr calc_icon_poly
;; Set up bounds_t
lda poly::v0::ycoord
sta bounds_t
sta portbits::cliprect::y1
sta portbits::viewloc::ycoord
lda poly::v0::ycoord+1
sta bounds_t+1
sta portbits::cliprect::y1+1
sta portbits::viewloc::ycoord+1
;; Set up bounds_l
lda poly::v5::xcoord
sta bounds_l
sta portbits::cliprect::x1
sta portbits::viewloc::xcoord
lda poly::v5::xcoord+1
sta bounds_l+1
sta portbits::cliprect::x1+1
sta portbits::viewloc::xcoord+1
;; Set up bounds_r/b
ldx #3
: lda poly::v4,x
sta bounds_r,x ; right and bottom
sta portbits::cliprect::x2,x
dex
bpl :-
;; if (bounds_r > screen_width - 1) bounds_r = screen_width - 2
cmp16 bounds_r, #screen_width - 1
bmi done
lda #<(screen_width - 2)
sta bounds_r
sta portbits::cliprect::x2
lda #>(screen_width - 2)
sta bounds_r+1
sta portbits::cliprect::x2+1
done: MGTK_CALL MGTK::SetPortBits, portbits
rts
.endproc
;;; ============================================================
.proc calc_window_intersections
ptr := $06
jmp start
;;; findwindow_params::window_id is used as first part of
;;; GetWinPtr params structure including window_ptr.
.proc findwindow_params
mousex: .word 0
mousey: .word 0
which_area: .byte 0
window_id: .byte 0
.endproc
window_ptr: .word 0 ; do not move this; see above
pt_num: .byte 0
scrollbar_flags:
.byte 0 ; bit 7 = hscroll present; bit 6 = vscroll present
dialogbox_flag:
.byte 0 ; bit 7 = dialog box
;;; Points at corners of icon's bounding rect
;;; pt1 +----+ pt2
;;; | |
;;; pt4 +----+ pt3
pt1: DEFINE_POINT 0,0,pt1
pt2: DEFINE_POINT 0,0,pt2
pt3: DEFINE_POINT 0,0,pt3
pt4: DEFINE_POINT 0,0,pt4
bounds: DEFINE_RECT 0,0,0,0, bounds
stash_r: .word 0
;; Viewport/Cliprect to adjust
vx := portbits::viewloc::xcoord
vy := portbits::viewloc::ycoord
cr_l := portbits::cliprect::x1
cr_t := portbits::cliprect::y1
cr_r := portbits::cliprect::x2
cr_b := portbits::cliprect::y2
start: lda more_drawing_needed_flag
beq reclip
;; --------------------------------------------------
;; Re-entry - pick up where we left off
;; cr_l = cr_r + 1
;; vx = cr_r + 1
lda cr_r
clc
adc #1
sta cr_l
sta vx
lda cr_r+1
adc #0
sta cr_l+1
sta vx+1
;; cr_t = bounds_t
;; cr_r = bounds_r
;; cr_b = bounds_b
COPY_BYTES 6, bounds_t, cr_t
;; vy = cr_t
copy16 cr_t, vy
;; Corners of bounding rect (clockwise from upper-left)
;; pt1::xcoord = pt4::xcoord = cr_l
;; pt1::ycoord = pt2::ycoord = cr_t
;; pt2::xcoord = pt3::xcoord = cr_r
;; pt3::ycoord = pt4::ycoord = cr_b
reclip: lda cr_l
sta pt1::xcoord
sta pt4::xcoord
lda cr_l+1
sta pt1::xcoord+1
sta pt4::xcoord+1
lda cr_t
sta pt1::ycoord
sta pt2::ycoord
lda cr_t+1
sta pt1::ycoord+1
sta pt2::ycoord+1
lda cr_r
sta pt2::xcoord
sta pt3::xcoord
lda cr_r+1
sta pt2::xcoord+1
sta pt3::xcoord+1
lda cr_b
sta pt3::ycoord
sta pt4::ycoord
lda cr_b+1
sta pt3::ycoord+1
sta pt4::ycoord+1
lda #0
sta pt_num
next_pt:
;; Done all 4 points?
lda pt_num
cmp #4
bne do_pt
lda #0
sta pt_num
;; --------------------------------------------------
;; Finish up
set_bits:
MGTK_CALL MGTK::SetPortBits, portbits
;; if (cr_r < bounds_r) more drawing is needed
cmp16 cr_r, bounds_r
bmi :+
copy #0, more_drawing_needed_flag
rts
: copy #1, more_drawing_needed_flag
rts
;; ==================================================
;; Find window at Nth point, and compute bounds
do_pt: lda pt_num
asl a ; *4 (.sizeof(Point))
asl a
tax
;; Look up window at Nth point
ldy #0
: lda pt1::xcoord,x
sta findwindow_params,y
iny
inx
cpy #4
bne :-
inc pt_num
MGTK_CALL MGTK::FindWindow, findwindow_params
lda findwindow_params::which_area
beq next_pt
;; --------------------------------------------------
;; Compute window edges (including non-content area)
;; Uses Winfo's port's viewloc as window location, Winfo's port's
;; cliprect as size. GetWinPort result is invalid if obscured.
;; Window edges
win_l := bounds::x1
win_t := bounds::y1
win_r := bounds::x2
win_b := bounds::y2
jsr push_pointers
MGTK_CALL MGTK::GetWinPtr, findwindow_params::window_id
copy16 window_ptr, ptr
;; Left/Top
ldx #.sizeof(MGTK::Point)-1
ldy #MGTK::Winfo::port + MGTK::GrafPort::viewloc + .sizeof(MGTK::Point)-1
: lda (ptr),y
sta win_l,x
dey
dex
bpl :-
;; Width/Height
ldx #.sizeof(MGTK::Point)-1
ldy #MGTK::Winfo::port + MGTK::GrafPort::maprect + MGTK::Rect::x2 + .sizeof(MGTK::Point)-1
: lda (ptr),y
sta win_r,x
dey
dex
bpl :-
;; Make absolute
add16 win_r, win_l, win_r
add16 win_b, win_t, win_b
;; Check window properties
ldy #MGTK::Winfo::options
lda (ptr),y ; options
and #MGTK::Option::dialog_box
bne :+ ; yes
sta dialogbox_flag
beq @continue
: copy #$80, dialogbox_flag
@continue:
ldy #MGTK::Winfo::hscroll
lda (ptr),y ; hscroll
and #MGTK::Scroll::option_present
sta scrollbar_flags
iny
lda (ptr),y ; vscroll
and #MGTK::Scroll::option_present
lsr a
ora scrollbar_flags
sta scrollbar_flags
;; TODO: I *think* win_l/t/r/b are supposed to be 1px beyond
;; window's bounds, but aren't consistently so. ???
;; 1px implicit left borders, and move 1px beyond bounds ???
sub16 win_l, #2, win_l
;; 1px implicit bottom border
add16 win_b, #1, win_b
;; TODO: 1px implicit right border?
kTitleBarHeight = 14 ; Should be 12? (But no visual bugs)
kScrollBarWidth = 20
kScrollBarHeight = 10
;; NOTE: algorithm does not account for 1px implicit border applied to dialogs and windows
;; --------------------------------------------------
;; Adjust window rect to account for title bar
;; Is dialog? (i.e. no title bar)
bit dialogbox_flag
bmi :+
sub16 win_t, #kTitleBarHeight, win_t
:
;; --------------------------------------------------
;; Adjust window rect to account for scroll bars
;; Horizontal scrollbar?
bit scrollbar_flags
bpl :+
add16 win_r, #kScrollBarWidth, win_r
:
;; Vertical scrollbar?
bit scrollbar_flags
bvc :+
add16 win_b, #kScrollBarHeight, win_b
:
;; --------------------------------------------------
jsr pop_pointers
;; ==================================================
;; At this point, win_r/t/l/b are the window edges,
;; cr_r/t/l/b are the rect we know has at least one
;; corner overlapping the window.
;;
;; Cases (#=icon, %=result, :=window)
;;
;; . 1 :::: 4 :::: 7 ::::
;; . :::: :::: ::::
;; . :::## :##: %#:::
;; . %# %% %#
;; .
;; . 2 :::: 5 :::: 8 ::::
;; . :::#% :##: %#:::
;; . :::#% :##: %#:::
;; . :::: :::: ::::
;; .
;; . %# %% %#
;; . 3 :::## 6 :##: 9 %#:::
;; . :::: :::: ::::
;; . :::: :::: ::::
copy16 cr_r, stash_r ; in case this turns out to be case 2
;; Cases 1/2/3 (and continue below)
;; if (cr_r > win_r)
;; . cr_r = win_r + 1
cmp16 cr_r, win_r
bmi :+
add16 win_r, #1, cr_r
jmp vert
;; Cases 7/8/9 (and done)
;; if (win_l > cr_l)
;; . cr_r = win_l
: cmp16 win_l, cr_l
bmi vert
copy16 win_l, cr_r
jmp reclip
;; Cases 3/6 (and done)
;; if (win_t > cr_t)
;; . cr_b = win_t
vert: cmp16 win_t, cr_t
bmi :+
copy16 win_t, cr_b
copy #1, more_drawing_needed_flag
jmp reclip
;; Cases 1/4 (and done)
;; if (win_b < cr_b)
;; . cr_t = win_b + 2
;; . vy = win_b + 2
: cmp16 win_b, cr_b
bpl :+
lda win_b
clc
adc #1
sta cr_t
sta vy
lda win_b+1
adc #0
sta cr_t+1
sta vy+1
copy #1, more_drawing_needed_flag
jmp reclip
;; Case 2
;; if (win_r < stash_r)
;; . cr_l = win_r + 2
;; . vx = win_r + 2
;; . cr_r = stash_r + 2 (workaround for https://github.com/inexorabletash/a2d/issues/153)
: cmp16 win_r, stash_r
bpl :+
lda win_r
clc
adc #2
sta cr_l
sta vx
lda win_r+1
adc #0
sta cr_l+1
sta vx+1
add16 stash_r, #2, cr_r
jmp reclip
;; Case 5 - done!
: copy16 bounds_r, cr_r
add16 bounds_r, #1, cr_l
jmp set_bits
.endproc
;;; ============================================================
.proc shift_port_down
;; For window's items/used/free space bar
offset = 15
add16 icon_grafport::viewloc::ycoord, #offset, icon_grafport::viewloc::ycoord
add16 icon_grafport::cliprect::y1, #offset, icon_grafport::cliprect::y1
MGTK_CALL MGTK::SetPort, icon_grafport
rts
.endproc
.endproc ; icon_toolkit
;;; ============================================================
floppy140_pixels:
.byte px(%1111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%1100000),px(%0000011),px(%1000000),px(%0000110)
.byte px(%1100000),px(%0000011),px(%1000000),px(%0000110)
.byte px(%1100000),px(%0000011),px(%1000000),px(%0000110)
.byte px(%1100000),px(%0000011),px(%1000000),px(%0000110)
.byte px(%1100000),px(%0000000),px(%0000000),px(%0000110)
.byte px(%1100000),px(%0000011),px(%1000000),px(%0000110)
.byte px(%1100000),px(%0000111),px(%1100000),px(%0000110)
.byte px(%1100000),px(%0000011),px(%1000000),px(%0000110)
.byte px(%1100000),px(%0000000),px(%0000000),px(%0000110)
.byte px(%1100000),px(%0000000),px(%0000000),px(%0000110)
.byte px(%0011000),px(%0000000),px(%0000000),px(%0000110)
.byte px(%1100000),px(%0000000),px(%0000000),px(%0000110)
.byte px(%1100000),px(%0000000),px(%0000000),px(%0000110)
.byte px(%1111111),px(%1111111),px(%1111111),px(%1111110)
floppy140_mask:
.byte px(%1111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%1111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%1111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%1111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%1111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%1111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%1111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%1111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%1111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%1111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%1111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0011111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%1111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%1111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%1111111),px(%1111111),px(%1111111),px(%1111110)
ramdisk_pixels:
.byte px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111100)
.byte px(%1100000),px(%0000000),px(%0000000),px(%0000000),px(%0000000),px(%0001100)
.byte px(%1100000),px(%0000000),px(%0000000),px(%0000000),px(%0000000),px(%0001100)
.byte px(%1100000),px(%0000000),px(%0000000),px(%0000000),px(%0000000),px(%0001100)
.byte px(%1100000),px(%0001111),px(%1000111),px(%1100110),px(%0000110),px(%0001100)
.byte px(%1100000),px(%0001100),px(%1100110),px(%0110111),px(%1011110),px(%0001100)
.byte px(%1100000),px(%0001111),px(%1000111),px(%1110110),px(%1110110),px(%0001100)
.byte px(%1100000),px(%0001100),px(%1100110),px(%0110110),px(%0000110),px(%0001100)
.byte px(%1100000),px(%0000000),px(%0000000),px(%0000000),px(%0000000),px(%0001100)
.byte px(%1111111),px(%1111111),px(%1111111),px(%1110011),px(%0011001),px(%1001100)
.byte px(%0000000),px(%0000000),px(%0000000),px(%0110011),px(%0011001),px(%1001100)
.byte px(%0000000),px(%0000000),px(%0000000),px(%0111111),px(%1111111),px(%1111100)
ramdisk_mask:
.byte px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111100)
.byte px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111100)
.byte px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111100)
.byte px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111100)
.byte px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111100)
.byte px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111100)
.byte px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111100)
.byte px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111100)
.byte px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111100)
.byte px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111100)
.byte px(%0000000),px(%0000000),px(%0000000),px(%0111111),px(%1111111),px(%1111100)
.byte px(%0000000),px(%0000000),px(%0000000),px(%0111111),px(%1111111),px(%1111100)
floppy800_pixels:
.byte px(%1111111),px(%1111111),px(%1111110)
.byte px(%1100011),px(%0000000),px(%1100111)
.byte px(%1100011),px(%0000000),px(%1100111)
.byte px(%1100011),px(%1111111),px(%1100011)
.byte px(%1100000),px(%0000000),px(%0000011)
.byte px(%1100000),px(%0000000),px(%0000011)
.byte px(%1100111),px(%1111111),px(%1110011)
.byte px(%1100110),px(%0000000),px(%0110011)
.byte px(%1100110),px(%0000000),px(%0110011)
.byte px(%1100110),px(%0000000),px(%0110011)
.byte px(%1100110),px(%0000000),px(%0110011)
.byte px(%1111111),px(%1111111),px(%1111111)
floppy800_mask:
.byte px(%1111111),px(%1111111),px(%1111110)
.byte px(%1111111),px(%1111111),px(%1111111)
.byte px(%1111111),px(%1111111),px(%1111111)
.byte px(%1111111),px(%1111111),px(%1111111)
.byte px(%1111111),px(%1111111),px(%1111111)
.byte px(%1111111),px(%1111111),px(%1111111)
.byte px(%1111111),px(%1111111),px(%1111111)
.byte px(%1111111),px(%1111111),px(%1111111)
.byte px(%1111111),px(%1111111),px(%1111111)
.byte px(%1111111),px(%1111111),px(%1111111)
.byte px(%1111111),px(%1111111),px(%1111111)
.byte px(%1111111),px(%1111111),px(%1111111)
profile_pixels:
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1110000)
.byte px(%1100000),px(%0000000),px(%0000000),px(%0000000),px(%0000000),px(%0000000),px(%0000000),px(%0011000)
.byte px(%1100000),px(%0000000),px(%0000000),px(%0000000),px(%0000000),px(%0000000),px(%0000000),px(%0011000)
.byte px(%1100000),px(%0000000),px(%0000000),px(%0000000),px(%0000000),px(%0000000),px(%0000000),px(%0011000)
.byte px(%1100011),px(%1000000),px(%0000000),px(%0000000),px(%0000000),px(%0000000),px(%0000000),px(%0011000)
.byte px(%1100000),px(%0000000),px(%0000000),px(%0000000),px(%0000000),px(%0000000),px(%0000000),px(%0011000)
.byte px(%1100000),px(%0000000),px(%0000000),px(%0000000),px(%0000000),px(%0000000),px(%0000000),px(%0011000)
.byte px(%1100000),px(%0000000),px(%0000000),px(%0000000),px(%0000000),px(%0000000),px(%0000000),px(%0011000)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1110000)
.byte px(%0000111),px(%0000000),px(%0000000),px(%0000000),px(%0000000),px(%0000000),px(%0000111),px(%0000000)
profile_mask:
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1110000)
.byte px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111000)
.byte px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111000)
.byte px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111000)
.byte px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111000)
.byte px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111000)
.byte px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111000)
.byte px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111000)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1110000)
.byte px(%0000111),px(%0000000),px(%0000000),px(%0000000),px(%0000000),px(%0000000),px(%0000111),px(%0000000)
fileshare_pixels:
.byte px(%0000000),px(%0000000),px(%0011001),px(%1111111),px(%1000000)
.byte px(%0000000),px(%0000000),px(%1100110),px(%0000000),px(%1110000)
.byte px(%0011111),px(%1110011),px(%0000001),px(%1000000),px(%1111100)
.byte px(%0011000),px(%0011111),px(%1100000),px(%0110000),px(%0001100)
.byte px(%0011000),px(%0000000),px(%0011000),px(%0001100),px(%0001100)
.byte px(%0011000),px(%0000000),px(%0011000),px(%0110000),px(%0001100)
.byte px(%0011000),px(%0000000),px(%0011001),px(%1000000),px(%0001100)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0110000),px(%0000000),px(%0000000),px(%0000000),px(%0000110)
.byte px(%0011111),px(%1111111),px(%1111111),px(%1111111),px(%1111100)
.byte px(%0000000),px(%0000000),px(%0000110),px(%0110000),px(%0000000)
.byte px(%0000000),px(%0000000),px(%0001110),px(%0111000),px(%0000000)
.byte px(%1100111),px(%1111111),px(%1111000),px(%0001111),px(%1110011)
.byte px(%0000000),px(%0000000),px(%0000001),px(%1000000),px(%0000000)
.byte px(%1100111),px(%1111111),px(%1111110),px(%0111111),px(%1110011)
fileshare_mask:
.byte px(%0000000),px(%0000000),px(%0011001),px(%1111111),px(%1000000)
.byte px(%0000000),px(%0000000),px(%1111111),px(%1111111),px(%1110000)
.byte px(%0011111),px(%1110011),px(%1111111),px(%1111111),px(%1111100)
.byte px(%0011111),px(%1111111),px(%1111111),px(%1111111),px(%1111100)
.byte px(%0011111),px(%1111111),px(%1111111),px(%1111111),px(%1111100)
.byte px(%0011111),px(%1111111),px(%1111111),px(%1111111),px(%1111100)
.byte px(%0011111),px(%1111111),px(%1111111),px(%1111111),px(%1111100)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0111111),px(%1111111),px(%1111111),px(%1111111),px(%1111110)
.byte px(%0011111),px(%1111111),px(%1111111),px(%1111111),px(%1111100)
.byte px(%0000000),px(%0000000),px(%0000111),px(%1110000),px(%0000000)
.byte px(%0000000),px(%0000000),px(%0001111),px(%1111000),px(%0000000)
.byte px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111111)
.byte px(%1111111),px(%1111111),px(%1111111),px(%1111111),px(%1111111)
.byte px(%1111111),px(%1111111),px(%1111110),px(%0111111),px(%1111111)
trash_pixels:
.byte px(%0000001),px(%1111111),px(%1000000)
.byte px(%0000011),px(%1000001),px(%1100000)
.byte px(%1111111),px(%1111111),px(%1111111)
.byte px(%1100000),px(%0000000),px(%0000011)
.byte px(%1111111),px(%1111111),px(%1111111)
.byte px(%1100000),px(%0000000),px(%0000011)
.byte px(%1100100),px(%0010000),px(%1000011)
.byte px(%1100010),px(%0001000),px(%0100011)
.byte px(%1100010),px(%0001000),px(%0100011)
.byte px(%1100010),px(%0001000),px(%0100011)
.byte px(%1100010),px(%0001000),px(%0100011)
.byte px(%1100010),px(%0001000),px(%0100011)
.byte px(%1100010),px(%0001000),px(%0100011)
.byte px(%1100010),px(%0001000),px(%0100011)
.byte px(%1100010),px(%0001000),px(%0100011)
.byte px(%1100100),px(%0010000),px(%1000011)
.byte px(%1100000),px(%0000000),px(%0000011)
.byte px(%1111111),px(%1111111),px(%1111111)
trash_mask:
.byte px(%0000001),px(%1111111),px(%1000000)
.byte px(%0000011),px(%1111111),px(%1100000)
.byte px(%1111111),px(%1111111),px(%1111111)
.byte px(%1111111),px(%1111111),px(%1111111)
.byte px(%1111111),px(%1111111),px(%1111111)
.byte px(%1111111),px(%1111111),px(%1111111)
.byte px(%1111111),px(%1111111),px(%1111111)
.byte px(%1111111),px(%1111111),px(%1111111)
.byte px(%1111111),px(%1111111),px(%1111111)
.byte px(%1111111),px(%1111111),px(%1111111)
.byte px(%1111111),px(%1111111),px(%1111111)
.byte px(%1111111),px(%1111111),px(%1111111)
.byte px(%1111111),px(%1111111),px(%1111111)
.byte px(%1111111),px(%1111111),px(%1111111)
.byte px(%1111111),px(%1111111),px(%1111111)
.byte px(%1111111),px(%1111111),px(%1111111)
.byte px(%1111111),px(%1111111),px(%1111111)
.byte px(%1111111),px(%1111111),px(%1111111)
;;; ============================================================
label_apple:
PASCAL_STRING GLYPH_SAPPLE
label_file:
PASCAL_STRING "File"
label_view:
PASCAL_STRING "View"
label_special:
PASCAL_STRING "Special"
label_startup:
PASCAL_STRING "Startup"
label_selector:
PASCAL_STRING "Selector"
label_new_folder:
PASCAL_STRING "New Folder ..."
label_open:
PASCAL_STRING "Open"
label_close:
PASCAL_STRING "Close Window"
label_close_all:
PASCAL_STRING "Close All"
label_select_all:
PASCAL_STRING "Select All"
label_copy_file:
PASCAL_STRING "Copy a File ..."
label_delete_file:
PASCAL_STRING "Delete a File ..."
label_eject:
PASCAL_STRING "Eject Disk"
label_quit:
PASCAL_STRING "Quit"
label_by_icon:
PASCAL_STRING "as Icons"
label_by_name:
PASCAL_STRING "by Name"
label_by_date:
PASCAL_STRING "by Date"
label_by_size:
PASCAL_STRING "by Size"
label_by_type:
PASCAL_STRING "by Type"
label_check_all_drives:
PASCAL_STRING "Check All Drives"
label_check_drive:
PASCAL_STRING "Check Drive"
label_format_disk:
PASCAL_STRING "Format a Disk ..."
label_erase_disk:
PASCAL_STRING "Erase a Disk ..."
label_disk_copy:
PASCAL_STRING "Disk Copy ..."
label_lock:
PASCAL_STRING "Lock"
label_unlock:
PASCAL_STRING "Unlock"
label_get_info:
PASCAL_STRING "Get Info"
label_get_size:
PASCAL_STRING "Get Size"
label_rename_icon:
PASCAL_STRING "Rename ..."
desktop_menu:
DEFINE_MENU_BAR 6
DEFINE_MENU_BAR_ITEM menu_id_apple, label_apple, apple_menu
DEFINE_MENU_BAR_ITEM menu_id_file, label_file, file_menu
DEFINE_MENU_BAR_ITEM menu_id_view, label_view, view_menu
DEFINE_MENU_BAR_ITEM menu_id_special, label_special, special_menu
DEFINE_MENU_BAR_ITEM menu_id_startup, label_startup, startup_menu
DEFINE_MENU_BAR_ITEM menu_id_selector, label_selector, selector_menu
file_menu:
DEFINE_MENU 13
DEFINE_MENU_ITEM label_new_folder, 'F', 'f'
DEFINE_MENU_ITEM label_open, 'O', 'o'
DEFINE_MENU_ITEM label_close, 'W', 'w'
DEFINE_MENU_ITEM label_close_all
DEFINE_MENU_ITEM label_select_all, 'A', 'a'
DEFINE_MENU_SEPARATOR
DEFINE_MENU_ITEM label_get_info, 'I', 'i'
DEFINE_MENU_ITEM label_rename_icon
DEFINE_MENU_SEPARATOR
DEFINE_MENU_ITEM label_copy_file, 'Y', 'y'
DEFINE_MENU_ITEM label_delete_file, 'D', 'd'
DEFINE_MENU_SEPARATOR
DEFINE_MENU_ITEM label_quit, 'Q', 'q'
menu_item_id_new_folder = 1
menu_item_id_open = 2
menu_item_id_close = 3
menu_item_id_close_all = 4
menu_item_id_select_all = 5
;; --------------------
menu_item_id_get_info = 7
menu_item_id_rename_icon = 8
;; --------------------
menu_item_id_copy_file = 10
menu_item_id_delete_file = 11
;; --------------------
menu_item_id_quit = 13
view_menu:
DEFINE_MENU 5
DEFINE_MENU_ITEM label_by_icon, 'J', 'j'
DEFINE_MENU_ITEM label_by_name, 'N', 'n'
DEFINE_MENU_ITEM label_by_date, 'T', 't'
DEFINE_MENU_ITEM label_by_size, 'K', 'k'
DEFINE_MENU_ITEM label_by_type, 'L', 'l'
menu_item_id_view_by_icon = 1
menu_item_id_view_by_name = 2
menu_item_id_view_by_date = 3
menu_item_id_view_by_size = 4
menu_item_id_view_by_type = 5
special_menu:
DEFINE_MENU 11
DEFINE_MENU_ITEM label_check_all_drives
DEFINE_MENU_ITEM label_check_drive
DEFINE_MENU_ITEM label_eject, 'E', 'e'
DEFINE_MENU_SEPARATOR
DEFINE_MENU_ITEM label_format_disk, 'S', 's'
DEFINE_MENU_ITEM label_erase_disk, 'Z', 'z'
DEFINE_MENU_ITEM label_disk_copy
DEFINE_MENU_SEPARATOR
DEFINE_MENU_ITEM label_lock
DEFINE_MENU_ITEM label_unlock
DEFINE_MENU_ITEM label_get_size
menu_item_id_check_all = 1
menu_item_id_check_drive = 2
menu_item_id_eject = 3
;; --------------------
menu_item_id_format_disk = 5
menu_item_id_erase_disk = 6
menu_item_id_disk_copy = 7
;; --------------------
menu_item_id_lock = 9
menu_item_id_unlock = 10
menu_item_id_get_size = 11
PAD_TO $AE00
;;; ============================================================
;; Rects
alert_dialog_width = 400
alert_dialog_height = 107
confirm_dialog_outer_rect: DEFINE_RECT 4,2,alert_dialog_width-4,alert_dialog_height-2
confirm_dialog_inner_rect: DEFINE_RECT 5,3,alert_dialog_width-5,alert_dialog_height-3
cancel_button_rect: DEFINE_RECT 40,alert_dialog_height-19,140,alert_dialog_height-8
LAE18: DEFINE_RECT 193,30,293,41
ok_button_rect: DEFINE_RECT 260,alert_dialog_height-19,360,alert_dialog_height-8
yes_button_rect: DEFINE_RECT 200,alert_dialog_height-19,240,alert_dialog_height-8
no_button_rect: DEFINE_RECT 260,alert_dialog_height-19,300,alert_dialog_height-8
all_button_rect: DEFINE_RECT 320,alert_dialog_height-19,360,alert_dialog_height-8
str_ok_label:
PASCAL_STRING {"OK ",GLYPH_RETURN}
ok_label_pos: DEFINE_POINT 265,alert_dialog_height-9
cancel_label_pos: DEFINE_POINT 45,alert_dialog_height-9
yes_label_pos: DEFINE_POINT 205,alert_dialog_height-9
no_label_pos: DEFINE_POINT 265,alert_dialog_height-9
all_label_pos: DEFINE_POINT 325,alert_dialog_height-9
.byte $1C,$00,$70,$00
.byte $1C,$00,$87,$00
textbg_black: .byte $00
textbg_white: .byte $7F
dialog_label_height = 9
dialog_label_base_y = 30
.define dialog_label_row_y(num) (((num)*(dialog_label_height))+(dialog_label_base_y))
clear_dialog_labels_rect: DEFINE_RECT 39,25,360,alert_dialog_height-20
prompt_rect: DEFINE_RECT 40,(dialog_label_row_y {5})+1,360,(dialog_label_row_y {6})
current_target_file_pos: DEFINE_POINT 75,dialog_label_row_y {2}
current_dest_file_pos: DEFINE_POINT 75,dialog_label_row_y {3}
current_target_file_rect: DEFINE_RECT 75,(dialog_label_row_y {1})+1,394,(dialog_label_row_y {2})
current_dest_file_rect: DEFINE_RECT 75,(dialog_label_row_y {2})+1,394,(dialog_label_row_y {3})
str_cancel_label:
PASCAL_STRING "Cancel Esc"
str_yes_label:
PASCAL_STRING " Yes"
str_no_label:
PASCAL_STRING " No"
str_all_label:
PASCAL_STRING " All"
LAEB6: PASCAL_STRING "Source filename:"
LAEC7: PASCAL_STRING "Destination filename:"
;; "About" dialog resources
about_dialog_width = 400
about_dialog_height = 120
about_dialog_outer_rect: DEFINE_RECT 4, 2, about_dialog_width-4, about_dialog_height-2
about_dialog_inner_rect: DEFINE_RECT 5, 3, about_dialog_width-5, about_dialog_height-3
str_about1: PASCAL_STRING "Apple II DeskTop"
str_about2: PASCAL_STRING "Copyright Apple Computer Inc., 1986"
str_about3: PASCAL_STRING "Copyright Version Soft, 1985 - 1986"
str_about4: PASCAL_STRING "All Rights Reserved"
str_about5: PASCAL_STRING "Authors: Stephane Cavril, Bernard Gallet, Henri Lamiraux"
str_about6: PASCAL_STRING "Richard Danais and Luc Barthelet"
str_about7: PASCAL_STRING "With thanks to: A. Gerard, J. Gerber, P. Pahl, J. Bernard"
str_about8: PASCAL_STRING RELEASE_DATE
str_about9: PASCAL_STRING .sprintf("Version %d.%d%s",::VERSION_MAJOR,::VERSION_MINOR,VERSION_SUFFIX)
;; "Copy File" dialog strings
str_copy_title:
PASCAL_STRING "Copy ..."
str_copy_copying:
PASCAL_STRING "Now Copying "
str_copy_from:
PASCAL_STRING "from:"
str_copy_to:
PASCAL_STRING "to :"
str_copy_remaining:
PASCAL_STRING "Files remaining to copy: "
;; "Move File" dialog strings
str_move_title:
PASCAL_STRING "Move ..."
str_move_moving:
PASCAL_STRING "Now Moving "
str_move_remaining:
PASCAL_STRING "Files remaining to move: "
str_exists_prompt:
PASCAL_STRING "That file already exists. Do you want to write over it ?"
str_large_prompt:
PASCAL_STRING "This file is too large to copy, click OK to continue."
copy_file_count_pos:
DEFINE_POINT 110, dialog_label_row_y {1}
copy_file_count_pos2:
DEFINE_POINT 170, dialog_label_row_y {4}
;; "Delete" dialog strings
str_delete_title:
PASCAL_STRING "Delete ..."
str_delete_ok:
PASCAL_STRING "Click OK to delete:"
str_ok_empty:
PASCAL_STRING "Clicking OK will immediately empty the trash of:"
str_file_colon:
PASCAL_STRING "File:"
str_delete_remaining:
PASCAL_STRING "Files remaining to be deleted:"
str_delete_locked_file:
PASCAL_STRING "This file is locked, do you want to delete it anyway ?"
delete_file_count_pos:
DEFINE_POINT 145, dialog_label_row_y {4}
delete_remaining_count_pos:
DEFINE_POINT 204, dialog_label_row_y {4}
delete_file_count_pos2:
DEFINE_POINT 300, dialog_label_row_y {4}
;; "New Folder" dialog strings
str_new_folder_title:
PASCAL_STRING "New Folder ..."
str_in_colon:
PASCAL_STRING "in:"
str_enter_folder_name:
PASCAL_STRING "Enter the folder name:"
;; "Rename Icon" dialog strings
str_rename_title:
PASCAL_STRING "Rename an Icon ..."
str_rename_old:
PASCAL_STRING "Rename: "
str_rename_new:
PASCAL_STRING "New name:"
;; "Get Info" dialog strings
str_info_title:
PASCAL_STRING "Get Info ..."
str_info_name:
PASCAL_STRING "Name"
str_info_locked:
PASCAL_STRING "Locked"
str_info_size:
PASCAL_STRING "Size"
str_info_create:
PASCAL_STRING "Creation date"
str_info_mod:
PASCAL_STRING "Last modification"
str_info_type:
PASCAL_STRING "Type"
str_info_protected:
PASCAL_STRING "Write protected"
str_info_blocks:
PASCAL_STRING "Blocks free/size"
str_colon:
PASCAL_STRING ": "
unlock_remaining_count_pos2: DEFINE_POINT 160,dialog_label_row_y {4}
lock_remaining_count_pos2: DEFINE_POINT 145,dialog_label_row_y {4}
files_pos: DEFINE_POINT 200,dialog_label_row_y {4}
files_pos2: DEFINE_POINT 185,dialog_label_row_y {4}
unlock_remaining_count_pos: DEFINE_POINT 205,dialog_label_row_y {4}
lock_remaining_count_pos: DEFINE_POINT 195,dialog_label_row_y {4}
str_format_disk: PASCAL_STRING "Format a Disk ..."
str_select_format: PASCAL_STRING "Select the location where the disk is to be formatted"
str_new_volume: PASCAL_STRING "Enter the name of the new volume:"
str_confirm_format: PASCAL_STRING "Do you want to format "
str_formatting: PASCAL_STRING "Formatting the disk...."
str_formatting_error: PASCAL_STRING "Formatting error. Check drive, then click OK to try again."
str_erase_disk: PASCAL_STRING "Erase a Disk ..."
str_select_erase: PASCAL_STRING "Select the location where the disk is to be erased"
str_confirm_erase: PASCAL_STRING "Do you want to erase "
str_erasing: PASCAL_STRING "Erasing the disk...."
str_erasing_error: PASCAL_STRING "Erasing error. Check drive, then click OK to try again."
;; "Unlock File" dialog strings
str_unlock_title:
PASCAL_STRING "Unlock ..."
str_unlock_ok:
PASCAL_STRING "Click OK to unlock "
str_unlock_remaining:
PASCAL_STRING "Files remaining to be unlocked: "
;; "Lock File" dialog strings
str_lock_title:
PASCAL_STRING "Lock ..."
str_lock_ok:
PASCAL_STRING "Click OK to lock "
str_lock_remaining:
PASCAL_STRING "Files remaining to be locked: "
;; "Get Size" dialog strings
str_size_title:
PASCAL_STRING "Get Size ..."
str_size_number:
PASCAL_STRING "Number of files"
str_size_blocks:
PASCAL_STRING "Blocks used on disk"
.word 110,35,110,43
str_download:
PASCAL_STRING "Copy to RAMCard ..."
str_ramcard_full:
PASCAL_STRING "The RAMCard is full. The copy was not completed."
str_1_space:
PASCAL_STRING " "
str_warning:
PASCAL_STRING "Warning !"
str_insert_system_disk:
PASCAL_STRING "Please insert the system disk."
str_selector_list_full:
PASCAL_STRING "The Selector list is full. You must delete an entry"
str_before_new_entries:
PASCAL_STRING "before you can add new entries."
str_window_must_be_closed:
PASCAL_STRING "A window must be closed before opening this new catalog."
str_too_many_windows:
PASCAL_STRING "There are too many windows open on the desktop !"
str_save_selector_list:
PASCAL_STRING "Do you want to save the new Selector list"
str_on_system_disk:
PASCAL_STRING "on the system disk ?"
;;; ============================================================
show_alert_indirection:
jmp show_alert_dialog
alert_bitmap:
.byte px(%0000000),px(%0000000),px(%0000000),px(%0000000),px(%0000000),px(%0000000),px(%0000000)
.byte px(%0111111),px(%1111100),px(%0000000),px(%0000000),px(%0000000),px(%0000000),px(%0000000)
.byte px(%0111111),px(%1111100),px(%0000000),px(%0000000),px(%0000000),px(%0000000),px(%0000000)
.byte px(%0111111),px(%1111100),px(%0000000),px(%0000000),px(%0000000),px(%0000000),px(%0000000)
.byte px(%0111111),px(%1111100),px(%0000000),px(%1111111),px(%1111111),px(%0000000),px(%0000000)
.byte px(%0111100),px(%1111100),px(%0000001),px(%1110000),px(%0000111),px(%0000000),px(%0000000)
.byte px(%0111100),px(%1111100),px(%0000011),px(%1100000),px(%0000011),px(%0000000),px(%0000000)
.byte px(%0111111),px(%1111100),px(%0000111),px(%1100111),px(%1111001),px(%0000000),px(%0000000)
.byte px(%0111111),px(%1111100),px(%0001111),px(%1100111),px(%1111001),px(%0000000),px(%0000000)
.byte px(%0111111),px(%1111100),px(%0011111),px(%1111111),px(%1111001),px(%0000000),px(%0000000)
.byte px(%0111111),px(%1111100),px(%0011111),px(%1111111),px(%1110011),px(%0000000),px(%0000000)
.byte px(%0111111),px(%1111100),px(%0011111),px(%1111111),px(%1100111),px(%0000000),px(%0000000)
.byte px(%0111111),px(%1111100),px(%0011111),px(%1111111),px(%1001111),px(%0000000),px(%0000000)
.byte px(%0111111),px(%1111100),px(%0011111),px(%1111111),px(%0011111),px(%0000000),px(%0000000)
.byte px(%0111111),px(%1111100),px(%0011111),px(%1111110),px(%0111111),px(%0000000),px(%0000000)
.byte px(%0111111),px(%1111100),px(%0011111),px(%1111100),px(%1111111),px(%0000000),px(%0000000)
.byte px(%0111111),px(%1111100),px(%0011111),px(%1111100),px(%1111111),px(%0000000),px(%0000000)
.byte px(%0111110),px(%0000000),px(%0111111),px(%1111111),px(%1111111),px(%0000000),px(%0000000)
.byte px(%0111111),px(%1100000),px(%1111111),px(%1111100),px(%1111111),px(%0000000),px(%0000000)
.byte px(%0111111),px(%1100001),px(%1111111),px(%1111111),px(%1111111),px(%0000000),px(%0000000)
.byte px(%0111000),px(%0000011),px(%1111111),px(%1111111),px(%1111110),px(%0000000),px(%0000000)
.byte px(%0111111),px(%1100000),px(%0000000),px(%0000000),px(%0000000),px(%0000000),px(%0000000)
.byte px(%0111111),px(%1100000),px(%0000000),px(%0000000),px(%0000000),px(%0000000),px(%0000000)
.byte px(%0000000),px(%0000000),px(%0000000),px(%0000000),px(%0000000),px(%0000000),px(%0000000)
.proc alert_bitmap_params
DEFINE_POINT 20, 8 ; viewloc
.addr alert_bitmap ; mapbits
.byte 7 ; mapwidth
.byte 0 ; reserved
DEFINE_RECT 0, 0, 36, 23 ; maprect
.endproc
alert_rect:
DEFINE_RECT 65, 87, 485, 142
alert_inner_frame_rect1:
DEFINE_RECT 4, 2, 416, 53
alert_inner_frame_rect2:
DEFINE_RECT 5, 3, 415, 52
.proc portmap
viewloc: DEFINE_POINT 65, 87, viewloc
mapbits: .addr MGTK::screen_mapbits
mapwidth: .byte MGTK::screen_mapwidth
reserved: .byte 0
maprect: DEFINE_RECT 0, 0, 420, 55, maprect
.endproc
;;; ============================================================
;;; Show Alert Dialog
;;; Call show_alert_dialog with prompt number A, options in X
.proc show_alert_dialog_impl
ok_label:
PASCAL_STRING {"OK ",GLYPH_RETURN}
try_again_rect:
DEFINE_RECT 20,37,120,48
try_again_pos:
DEFINE_POINT 25,47
cancel_rect:
DEFINE_RECT 300,37,400,48
cancel_pos:
DEFINE_POINT 305,47
pos_prompt: DEFINE_POINT 75,29, pos_prompt
alert_action: .byte $00
prompt_addr: .addr 0
try_again_label:
PASCAL_STRING "Try Again A"
cancel_label:
PASCAL_STRING "Cancel Esc"
err_00: PASCAL_STRING "System Error"
err_27: PASCAL_STRING "I/O error"
err_28: PASCAL_STRING "No device connected"
err_2B: PASCAL_STRING "The disk is write protected."
err_40: PASCAL_STRING "The syntax of the pathname is invalid."
err_44: PASCAL_STRING "Part of the pathname doesn't exist."
err_45: PASCAL_STRING "The volume cannot be found."
err_46: PASCAL_STRING "The file cannot be found."
err_47: PASCAL_STRING "That name already exists. Please use another name."
err_48: PASCAL_STRING "The disk is full."
err_49: PASCAL_STRING "The volume directory cannot hold more than 51 files."
err_4E: PASCAL_STRING "The file is locked."
err_52: PASCAL_STRING "This is not a ProDOS disk."
err_57: PASCAL_STRING "There is another volume with that name on the desktop."
;; Below are internal (not ProDOS MLI) error codes.
err_F9: PASCAL_STRING "There are 2 volumes with the same name."
err_FA: PASCAL_STRING "This file cannot be opened."
err_FB: PASCAL_STRING "That name is too long."
err_FC: PASCAL_STRING "Please insert source disk"
err_FD: PASCAL_STRING "Please insert destination disk"
err_FE: PASCAL_STRING "BASIC.SYSTEM not found"
;; number of alert messages
alert_count:
.byte 20
;; message number-to-index table
;; (look up by scan to determine index)
alert_table:
;; ProDOS MLI error codes:
.byte $00,$27,$28,$2B,$40,$44,$45,$46
.byte $47,$48,$49,$4E,$52,$57
;; Internal error codes:
.byte $F9,$FA,$FB,$FC,$FD,$FE
;; alert index to string address
prompt_table:
.addr err_00,err_27,err_28,err_2B,err_40,err_44,err_45,err_46
.addr err_47,err_48,err_49,err_4E,err_52,err_57,err_F9,err_FA
.addr err_FB,err_FC,err_FD,err_FE
;; alert index to action (0 = Cancel, $80 = Try Again)
alert_action_table:
.byte $00,$00,$00,$80,$00,$80,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$80,$80,$00
;; Actual entry point
start: pha ; error code
txa
pha ; options???
MGTK_CALL MGTK::HideCursor
MGTK_CALL MGTK::SetCursor, pointer_cursor
MGTK_CALL MGTK::ShowCursor
;; play bell
sta ALTZPOFF
sta ROMIN2
jsr BELL1
sta ALTZPON
lda LCBANK1
lda LCBANK1
ldx #.sizeof(MGTK::Point)-1
lda #$00
LBA0B: sta grafport3_viewloc_xcoord,x
sta grafport3_cliprect_x1,x
dex
bpl LBA0B
copy16 #550, grafport3_cliprect_x2
copy16 #185, grafport3_cliprect_y2
MGTK_CALL MGTK::SetPort, grafport3
addr_call_indirect LBF8B, portmap::viewloc::xcoord
sty LBFCA
sta LBFCD
lda portmap::viewloc::xcoord
clc
adc portmap::maprect::x2
pha
lda portmap::viewloc::xcoord+1
adc portmap::maprect::x2+1
tax
pla ; options???
jsr LBF8B
sty LBFCC
sta LBFCE
lda portmap::viewloc::ycoord
sta LBFC9
clc
adc portmap::maprect::y2
sta LBFCB
MGTK_CALL MGTK::HideCursor
jsr save_dialog_background
MGTK_CALL MGTK::ShowCursor
MGTK_CALL MGTK::SetPenMode, pencopy
MGTK_CALL MGTK::PaintRect, alert_rect ; alert background
MGTK_CALL MGTK::SetPenMode, penXOR ; ensures corners are inverted
MGTK_CALL MGTK::FrameRect, alert_rect ; alert outline
MGTK_CALL MGTK::SetPortBits, portmap::viewloc::xcoord
MGTK_CALL MGTK::FrameRect, alert_inner_frame_rect1 ; inner 2x border
MGTK_CALL MGTK::FrameRect, alert_inner_frame_rect2
MGTK_CALL MGTK::SetPenMode, pencopy
MGTK_CALL MGTK::HideCursor
MGTK_CALL MGTK::PaintBits, alert_bitmap_params
MGTK_CALL MGTK::ShowCursor
pla
tax
pla
ldy alert_count
dey
LBAE5: cmp alert_table,y
beq LBAEF
dey
bpl LBAE5
ldy #0
LBAEF: tya
asl a
tay
copy16 prompt_table,y, prompt_addr
cpx #0
beq LBB0B
txa
and #$FE
sta alert_action
jmp LBB14
LBB0B: tya
lsr a
tay
lda alert_action_table,y
sta alert_action
LBB14: MGTK_CALL MGTK::SetPenMode, penXOR
bit alert_action
bpl LBB5C
MGTK_CALL MGTK::FrameRect, cancel_rect
MGTK_CALL MGTK::MoveTo, cancel_pos
addr_call draw_pascal_string, cancel_label
bit alert_action
bvs LBB5C
MGTK_CALL MGTK::FrameRect, try_again_rect
MGTK_CALL MGTK::MoveTo, try_again_pos
addr_call draw_pascal_string, try_again_label
jmp LBB75
LBB5C: MGTK_CALL MGTK::FrameRect, try_again_rect
MGTK_CALL MGTK::MoveTo, try_again_pos
addr_call draw_pascal_string, ok_label
LBB75: MGTK_CALL MGTK::MoveTo, pos_prompt
addr_call_indirect draw_pascal_string, prompt_addr
LBB87: MGTK_CALL MGTK::GetEvent, event_params
lda event_kind
cmp #MGTK::EventKind::button_down
bne LBB9A
jmp LBC0C
LBB9A: cmp #MGTK::EventKind::key_down
bne LBB87
lda event_key
and #CHAR_MASK
bit alert_action
bpl LBBEE
cmp #CHAR_ESCAPE
bne LBBC3
MGTK_CALL MGTK::SetPenMode, penXOR
MGTK_CALL MGTK::PaintRect, cancel_rect
lda #1
jmp LBC55
LBBC3: bit alert_action
bvs LBBEE
cmp #'a'
bne LBBE3
LBBCC: MGTK_CALL MGTK::SetPenMode, penXOR
MGTK_CALL MGTK::PaintRect, try_again_rect
lda #0
jmp LBC55
LBBE3: cmp #'A'
beq LBBCC
cmp #CHAR_RETURN
beq LBBCC
jmp LBB87
LBBEE: cmp #CHAR_RETURN
bne LBC09
MGTK_CALL MGTK::SetPenMode, penXOR
MGTK_CALL MGTK::PaintRect, try_again_rect
lda #2
jmp LBC55
LBC09: jmp LBB87
LBC0C: jsr LBDE1
MGTK_CALL MGTK::MoveTo, event_coords
bit alert_action
bpl LBC42
MGTK_CALL MGTK::InRect, cancel_rect
cmp #MGTK::inrect_inside
bne :+
jmp LBCE9
: bit alert_action
bvs LBC42
MGTK_CALL MGTK::InRect, try_again_rect
cmp #MGTK::inrect_inside
bne LBC52
jmp LBC6D
LBC42: MGTK_CALL MGTK::InRect, try_again_rect
cmp #MGTK::inrect_inside
bne LBC52
jmp LBD65
LBC52: jmp LBB87
LBC55: pha
MGTK_CALL MGTK::HideCursor
jsr restore_dialog_background
MGTK_CALL MGTK::ShowCursor
pla
rts
LBC6D: MGTK_CALL MGTK::SetPenMode, penXOR
MGTK_CALL MGTK::PaintRect, try_again_rect
lda #0
sta LBCE8
LBC84: MGTK_CALL MGTK::GetEvent, event_params
lda event_kind
cmp #MGTK::EventKind::button_up
beq LBCDB
jsr LBDE1
MGTK_CALL MGTK::MoveTo, event_coords
MGTK_CALL MGTK::InRect, try_again_rect
cmp #MGTK::inrect_inside
beq LBCB5
lda LBCE8
beq LBCBD
jmp LBC84
LBCB5: lda LBCE8
bne LBCBD
jmp LBC84
LBCBD: MGTK_CALL MGTK::SetPenMode, penXOR
MGTK_CALL MGTK::PaintRect, try_again_rect
lda LBCE8
clc
adc #$80
sta LBCE8
jmp LBC84
LBCDB: lda LBCE8
beq LBCE3
jmp LBB87
LBCE3: lda #0
jmp LBC55
LBCE8: .byte 0
LBCE9: MGTK_CALL MGTK::SetPenMode, penXOR
MGTK_CALL MGTK::PaintRect, cancel_rect
lda #0
sta LBD64
LBD00: MGTK_CALL MGTK::GetEvent, event_params
lda event_kind
cmp #MGTK::EventKind::button_up
beq LBD57
jsr LBDE1
MGTK_CALL MGTK::MoveTo, event_coords
MGTK_CALL MGTK::InRect, cancel_rect
cmp #MGTK::inrect_inside
beq LBD31
lda LBD64
beq LBD39
jmp LBD00
LBD31: lda LBD64
bne LBD39
jmp LBD00
LBD39: MGTK_CALL MGTK::SetPenMode, penXOR
MGTK_CALL MGTK::PaintRect, cancel_rect
lda LBD64
clc
adc #$80
sta LBD64
jmp LBD00
LBD57: lda LBD64
beq LBD5F
jmp LBB87
LBD5F: lda #1
jmp LBC55
LBD64: .byte 0
LBD65: lda #0
sta LBDE0
MGTK_CALL MGTK::SetPenMode, penXOR
MGTK_CALL MGTK::PaintRect, try_again_rect
LBD7C: MGTK_CALL MGTK::GetEvent, event_params
lda event_kind
cmp #MGTK::EventKind::button_up
beq LBDD3
jsr LBDE1
MGTK_CALL MGTK::MoveTo, event_coords
MGTK_CALL MGTK::InRect, try_again_rect
cmp #MGTK::inrect_inside
beq LBDAD
lda LBDE0
beq LBDB5
jmp LBD7C
LBDAD: lda LBDE0
bne LBDB5
jmp LBD7C
LBDB5: MGTK_CALL MGTK::SetPenMode, penXOR
MGTK_CALL MGTK::PaintRect, try_again_rect
lda LBDE0
clc
adc #$80
sta LBDE0
jmp LBD7C
LBDD3: lda LBDE0
beq LBDDB
jmp LBB87
LBDDB: lda #2
jmp LBC55
LBDE0: .byte 0
LBDE1: sub16 event_xcoord, portmap::viewloc::xcoord, event_xcoord
sub16 event_ycoord, portmap::viewloc::ycoord, event_ycoord
rts
.endproc
show_alert_dialog := show_alert_dialog_impl::start
;;; ============================================================
;;; Save/Restore Dialog Background
;;;
;;; This reuses the "save area" ($800-$1AFF) used by MGTK for
;;; quickly restoring menu backgrounds.
.proc dialog_background
ptr := $06
.proc save
copy16 #SAVE_AREA_BUFFER, addr
lda LBFC9
jsr LBF10
lda LBFCB
sec
sbc LBFC9
tax
inx
LBE21: lda LBFCA
sta LBE5C
LBE27: lda LBE5C
lsr a
tay
sta PAGE2OFF ; main $2000-$3FFF
bcs LBE34
sta PAGE2ON ; aux $2000-$3FFF
LBE34: lda (ptr),y
addr := *+1
sta dummy1234
inc16 addr
lda LBE5C
cmp LBFCC
bcs LBE4E
inc LBE5C
bne LBE27
LBE4E: jsr LBF52
dex
bne LBE21
ldax addr
rts
.byte 0
LBE5C: .byte 0
.endproc
.proc restore
copy16 #SAVE_AREA_BUFFER, addr
ldx LBFCD
ldy LBFCE
lda #$FF
cpx #0
beq LBE78
LBE73: clc
rol a
dex
bne LBE73
LBE78: sta LBF0C
eor #$FF
sta LBF0D
lda #$01
cpy #$00
beq LBE8B
LBE86: sec
rol a
dey
bne LBE86
LBE8B: sta LBF0E
eor #$FF
sta LBF0F
lda LBFC9
jsr LBF10
lda LBFCB
sec
sbc LBFC9
tax
inx
lda LBFCA
sta LBF0B
LBEA8: lda LBFCA
sta LBF0B
LBEAE: lda LBF0B
lsr a
tay
sta PAGE2OFF ; main $2000-$3FFF
bcs :+
sta PAGE2ON ; aux $2000-$3FFF
addr := *+1
: lda SAVE_AREA_BUFFER ; self-modified
pha
lda LBF0B
cmp LBFCA
beq LBEDD
cmp LBFCC
bne LBEEB
lda (ptr),y
and LBF0F
sta (ptr),y
pla
and LBF0E
ora (ptr),y
pha
jmp LBEEB
LBEDD: lda (ptr),y
and LBF0D
sta (ptr),y
pla
and LBF0C
ora (ptr),y
pha
LBEEB: pla
sta (ptr),y
inc16 addr
lda LBF0B
cmp LBFCC
bcs LBF03
inc LBF0B
bne LBEAE
LBF03: jsr LBF52
dex
bne LBEA8
rts
.byte $00
LBF0B: .byte $00
LBF0C: .byte $00
LBF0D: .byte $00
LBF0E: .byte $00
LBF0F: .byte $00
.endproc
;;; Address calculations for dialog background display buffer.
.proc LBF10
sta LBFCF
and #$07
sta LBFB0
lda LBFCF
and #$38
sta LBFAF
lda LBFCF
and #$C0
sta LBFAE
jsr LBF2C
rts
.endproc
.proc LBF2C
lda LBFAE
lsr a
lsr a
ora LBFAE
pha
lda LBFAF
lsr a
lsr a
lsr a
lsr a
sta LBF51
pla
ror a
sta ptr
lda LBFB0
asl a
asl a
ora LBF51
ora #$20
sta ptr+1
clc
rts
LBF51: .byte 0
.endproc
.proc LBF52
lda LBFB0
cmp #7
beq LBF5F
inc LBFB0
jmp LBF2C
LBF5F: lda #0
sta LBFB0
lda LBFAF
cmp #56
beq LBF74
clc
adc #8
sta LBFAF
jmp LBF2C
LBF74: lda #0
sta LBFAF
lda LBFAE
clc
adc #64
sta LBFAE
cmp #192
beq LBF89
jmp LBF2C
LBF89: sec
rts
.endproc
.endproc ; dialog_background
save_dialog_background := dialog_background::save
restore_dialog_background := dialog_background::restore
;;; ============================================================
.proc LBF8B
ldy #0
cpx #2
bne :+
ldy #73
clc
adc #1
: cpx #1
bne :+
ldy #36
clc
adc #4
bcc :+
iny
sbc #7
: cmp #7
bcc :+
sbc #7
iny
bne :-
: rts
.endproc
LBFAE: .byte $00
LBFAF: .byte $00
LBFB0: .byte $00,$FF,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00
LBFC9: .byte $00
LBFCA: .byte $00
LBFCB: .byte $00
LBFCC: .byte $00
LBFCD: .byte $00
LBFCE: .byte $00
LBFCF: .byte $00
;; Draw pascal string; address in (X,A)
.proc draw_pascal_string
ptr := $06
stax ptr
ldy #0
lda (ptr),y ; Check length
beq end
sta ptr+2
inc ptr
bne call
inc ptr+1
call: MGTK_CALL MGTK::DrawText, ptr
end: rts
.endproc
PAD_TO $C000
.endproc ; desktop_aux