diff --git a/APIs.md b/APIs.md index 27aa425..43736c4 100644 --- a/APIs.md +++ b/APIs.md @@ -178,13 +178,13 @@ Removes an icon by number. Parameters: { byte window_id } -Highlights (selects) all icons in a window. +Highlights (selects) all icons in specified window (0 = desktop). -### `DT_UNHIGHLIGHT_ALL` ($06) +### `DT_REMOVE_ALL` ($06) -Parameters: _N/A_ +Parameters: { byte window_id } -Unhighlights (deselects) all icons. +Removes all icons from specified window (0 = desktop). ### `DT_CLOSE_WINDOW` ($07) @@ -234,13 +234,11 @@ Parameters: { byte icon, rect bounds } Tests to see if the given icon (by number) overlaps the passed rect. -### `DT_REDRAW_ICON_IDX` ($0E) +### `DT_ERASE_ICON` ($0E) -Parameters: { byte icon_index } - -Redraws the icon at the given index in the icon list. Note that this -is not the same as the icon number. +Parameters: { byte icon } +Erases the specified icon by number. No error checking is done. diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 2b2256b..03207bf 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -56,17 +56,21 @@ functionality (see below). ### Automatic Preview -Text and Graphics files with the correct file types can be previewed -without leaving DeskTop; select the file icon then select File > Open, -or double-click the file icon. Text files must be type TXT ($04). -Graphics files must be type FOT ($08), or BIN ($06) with an aux type -of $2000 or $4000 and 17 or 33 blocks (hi-res/double hi-res) or $5800 -and 3 blocks (Minipix a.k.a. Print Shop). +Text, Graphics and Font files with the correct file types can be +previewed without leaving DeskTop; select the file icon then select +File > Open, or double-click the file icon. + +* Text files must be type TXT ($04). +* Graphics files must be type FOT ($08), or BIN ($06) with an aux type + of $2000 or $4000 and 17 or 33 blocks (hi-res/double hi-res) or $5800 + and 3 blocks (Minipix a.k.a. Print Shop). +* Font files must be MGTK fonts with type FNT ($07). To preview files of other types, you can copy the preview handlers -named `SHOW.TEXT.FILE` and `SHOW.IMAGE.FILE` from the `PREVIEW` folder -to the `DESK.ACC` folder, and restart DeskTop. To use them, select the -file, then select the appropriate command from the Apple menu. +named `SHOW.TEXT.FILE`, `SHOW.IMAGE.FILE`, etc. from the `PREVIEW` +folder to the `DESK.ACC` folder, and restart DeskTop. To use them, +select the file, then select the appropriate command from the Apple +menu. ### Notable Fixes diff --git a/desktop.inc b/desktop.inc index c84dc11..a9660e9 100644 --- a/desktop.inc +++ b/desktop.inc @@ -95,7 +95,7 @@ DT_HIGHLIGHT_ICON = $02 ; { .byte icon } DT_REDRAW_ICON = $03 ; { .byte icon } DT_REMOVE_ICON = $04 ; { .byte icon } DT_HIGHLIGHT_ALL = $05 ; { .byte window_id } -DT_UNHIGHLIGHT_ALL = $06 +DT_REMOVE_ALL = $06 ; { .byte window_id } DT_CLOSE_WINDOW = $07 ; { .byte window_id } DT_GET_HIGHLIGHTED = $08 ; { .res 20 } DT_FIND_ICON = $09 ; { .word mousex, .word mousey, .byte result } @@ -107,7 +107,7 @@ DT_DRAG_HIGHLIGHTED = $0A ; { .byte param } DT_UNHIGHLIGHT_ICON = $0B ; { .addr iconentry } DT_REDRAW_ICONS = $0C ; Repaints desktop icons * DT_ICON_IN_RECT = $0D ; { .byte icon, rect bounds } -DT_REDRAW_ICON_IDX = $0E ; { .byte icon_index } +DT_ERASE_ICON = $0E ; { .byte icon } ;;; `icon` is the icon number, i.e. first field in icon entry ;;; `icon_index` is the index in the icon table diff --git a/desktop/desktop_aux.s b/desktop/desktop_aux.s index 76e82c6..5079552 100644 --- a/desktop/desktop_aux.s +++ b/desktop/desktop_aux.s @@ -402,7 +402,7 @@ desktop_jump_table: .addr REDRAW_ICON_IMPL .addr REMOVE_ICON_IMPL .addr HIGHLIGHT_ALL_IMPL - .addr UNHIGHLIGHT_ALL_IMPL + .addr REMOVE_ALL_IMPL .addr CLOSE_WINDOW_IMPL .addr GET_HIGHLIGHTED_IMPL .addr FIND_ICON_IMPL @@ -410,7 +410,7 @@ desktop_jump_table: .addr UNHIGHLIGHT_ICON_IMPL .addr REDRAW_ICONS_IMPL .addr ICON_IN_RECT_IMPL - .addr REDRAW_ICON_IDX_IMPL + .addr ERASE_ICON_IMPL .macro DESKTOP_DIRECT_CALL op, addr, label jsr DESKTOP_DIRECT @@ -521,6 +521,8 @@ sub: ldx num_icons ; ??? ;;; ============================================================ ;;; HIGHLIGHT_ICON IMPL +;;; param is pointer to icon id + .proc HIGHLIGHT_ICON_IMPL PARAM_BLOCK params, $06 ptr_icon: .addr 0 @@ -541,7 +543,7 @@ bail1: return #1 ; Not found : asl a tax - copy16 icon_ptrs,x, ptr + copy16 icon_ptrs,x, ptr ; ptr now points at IconEntry ldy #IconEntry::state lda (ptr),y bne :+ ; Already set ??? Routine semantics are incorrect ??? @@ -582,13 +584,23 @@ L949D: ldx highlight_count ldx #1 ; new position jsr change_icon_index - jsr paint_icon_highlighted + ;; Redraw + ldy #IconEntry::id + lda (ptr),y ; icon num + sta icon + DESKTOP_DIRECT_CALL DT_REDRAW_ICON, icon return #0 ; Highlighted + + ;; DT_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 @@ -672,7 +684,7 @@ found: asl a ;; Unhighlight : jsr calc_icon_poly - jsr draw_icon + jsr erase_icon ;; Move it to the end of the icon list ldy #IconEntry::id @@ -723,9 +735,9 @@ done: return #0 ; Unhighlighted .endproc ;;; ============================================================ -;;; REDRAW_ICON_IDX IMPL +;;; ERASE_ICON IMPL -.proc REDRAW_ICON_IDX_IMPL +.proc ERASE_ICON_IMPL PARAM_BLOCK params, $06 ptr_icon_idx: .addr 0 END_PARAM_BLOCK @@ -736,7 +748,7 @@ ptr_icon_idx: .addr 0 asl a tax copy16 icon_ptrs,x, ptr - jmp draw_icon + jmp erase_icon .endproc ;;; ============================================================ @@ -821,35 +833,47 @@ loop2: lda buffer,x .endproc ;;; ============================================================ -;;; UNHIGHLIGHT_ALL IMPL +;;; REMOVE_ALL IMPL -.proc UNHIGHLIGHT_ALL_IMPL - jmp L9697 +;;; param is window id (0 = desktop) -L9695: .byte 0 -L9696: .byte 0 +.proc REMOVE_ALL_IMPL + jmp start -L9697: lda num_icons - sta L9696 -L969D: ldx L9696 + PARAM_BLOCK params, $06 +ptr_window_id: .addr 0 + END_PARAM_BLOCK + + icon_ptr := $08 + + ;; DT_REMOVE_ICON params +icon: .byte 0 + +count: .byte 0 + +start: lda num_icons + sta count + +loop: ldx count cpx #0 - beq L96CF - dec L9696 + beq done + dec count dex lda icon_table,x - sta L9695 + sta icon asl a tax - copy16 icon_ptrs,x, $08 + copy16 icon_ptrs,x, icon_ptr ldy #IconEntry::win_type - lda ($08),y + lda (icon_ptr),y and #icon_entry_winid_mask ldy #0 - cmp ($06),y - bne L969D - DESKTOP_DIRECT_CALL DT_REMOVE_ICON, L9695 - jmp L969D -L96CF: return #0 + cmp (params::ptr_window_id),y + bne loop + DESKTOP_DIRECT_CALL DT_REMOVE_ICON, icon + jmp loop + +done: return #0 .endproc ;;; ============================================================ @@ -1392,7 +1416,7 @@ L9BF3: dex tax copy16 icon_ptrs,x, $06 jsr calc_icon_poly - jsr draw_icon + jsr erase_icon pla tax jmp L9BF3 @@ -1612,18 +1636,12 @@ L9EB4: asl a ;;; ============================================================ ;;; UNHIGHLIGHT_ICON IMPL -;;; param is pointer to icon entry +;;; param is pointer to IconEntry .proc UNHIGHLIGHT_ICON_IMPL PARAM_BLOCK params, $06 ptr_iconent: .addr 0 END_PARAM_BLOCK - ptr := $06 ; Overwrites param - - jmp start - - ;; DT_REDRAW_ICON params -icon: .byte 0 start: lda has_highlight bne :+ @@ -1642,15 +1660,18 @@ start: lda has_highlight dec highlight_count lda highlight_count bne :+ - lda #0 + lda #0 ; Clear flag if no more highlighted sta has_highlight ;; Redraw -: ldy #0 +: ldy #IconEntry::id lda (params::ptr_iconent),y sta icon DESKTOP_DIRECT_CALL DT_REDRAW_ICON, icon return #0 + + ;; DT_REDRAW_ICON params +icon: .byte 0 .endproc ;;; ============================================================ @@ -1704,7 +1725,9 @@ 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 @@ -1808,8 +1831,10 @@ highlighted: copy #$80, icon_flags ; is highlighted 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) - ;; Redraw desktop background + ;; Volume (i.e. icon on desktop) MGTK_CALL MGTK::InitPort, grafport jsr set_port_for_vol_icon : jsr calc_window_intersections @@ -2055,6 +2080,10 @@ LA2AA: jsr pop_pointers rts LA2AE: jsr push_pointers + + MGTK_CALL MGTK::InitPort, icon_grafport + MGTK_CALL MGTK::SetPort, icon_grafport + ldx num_icons dex LA2B5: bmi LA2AA @@ -2221,8 +2250,9 @@ stash: .word 0 .endproc ;;; ============================================================ +;;; Erase an icon; redraws overlapping icons as needed -draw_icon: +erase_icon: MGTK_CALL MGTK::InitPort, icon_grafport MGTK_CALL MGTK::SetPort, icon_grafport jmp LA3B9 @@ -2259,13 +2289,13 @@ window_id: .byte 0 ;; File (i.e. icon in window) copy #$80, LA3B7 MGTK_CALL MGTK::SetPattern, white_pattern - MGTK_CALL MGTK::FrontWindow, frontwindow_params + 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 LA4CC - jsr shift_port_down - jsr erase_icon + jsr shift_port_down ; Further offset by window's items/used/free bar + jsr erase_window_icon jmp LA446 ;; Volume (i.e. icon on desktop) @@ -2291,7 +2321,7 @@ volume: ;; fall through .endproc -.proc erase_icon +.proc erase_window_icon copy16 poly::v0::ycoord, LA3B1 copy16 poly::v6::xcoord, LA3AF COPY_BLOCK poly::v4, LA3B3 @@ -2312,6 +2342,7 @@ LA446: jsr push_pointers bne LA466 bit LA3B7 ; no, almost done bpl :+ + ;; TODO: Is this restoration necessary? MGTK_CALL MGTK::InitPort, icon_grafport MGTK_CALL MGTK::SetPort, icon_grafport : jsr pop_pointers @@ -2895,7 +2926,7 @@ vert: cmp16 win_t, cr_t ;;; ============================================================ .proc shift_port_down - ;; For window's used/free space bar + ;; For window's items/used/free space bar offset = 15 add16 icon_grafport::viewloc::ycoord, #offset, icon_grafport::viewloc::ycoord diff --git a/desktop/desktop_main.s b/desktop/desktop_main.s index 512c85f..f244060 100644 --- a/desktop/desktop_main.s +++ b/desktop/desktop_main.s @@ -920,6 +920,10 @@ begin: bne :+ addr_jump invoke_desk_acc, str_preview_txt +: cmp #FT_FONT + bne :+ + addr_jump invoke_desk_acc, str_preview_fnt + : cmp #DA_FILE_TYPE bne :+ addr_jump invoke_desk_acc, path @@ -927,7 +931,7 @@ begin: : lda #ERR_FILE_NOT_OPENABLE jsr show_alert_and_fail -launch: DESKTOP_RELAY_CALL DT_UNHIGHLIGHT_ALL +launch: DESKTOP_RELAY_CALL DT_REMOVE_ALL, 0 ; volume icons MGTK_RELAY_CALL MGTK::CloseAll MGTK_RELAY_CALL MGTK::SetMenu, blank_menu ldx buf_win_path @@ -10812,7 +10816,7 @@ L969E: lda #$40 ldx L9706 lda selected_icon_list,x sta icon_param2 - yax_call JT_DESKTOP_RELAY, DT_REDRAW_ICON_IDX, icon_param2 + yax_call JT_DESKTOP_RELAY, DT_ERASE_ICON, icon_param2 copy16 L9707, $08 ldx L9706 lda selected_icon_list,x @@ -15390,6 +15394,9 @@ reset_grafport3a: str_preview_fot: PASCAL_STRING "Preview/show.image.file" +str_preview_fnt: + PASCAL_STRING "Preview/show.font.file" + str_preview_txt: PASCAL_STRING "Preview/show.text.file" diff --git a/desktop/ovl1.s b/desktop/ovl1.s index dffb084..16ecbe9 100644 --- a/desktop/ovl1.s +++ b/desktop/ovl1.s @@ -43,7 +43,7 @@ str_desktop2: start: lda #$80 sta ptr - DESKTOP_RELAY_CALL DT_UNHIGHLIGHT_ALL + DESKTOP_RELAY_CALL DT_REMOVE_ALL, 0 ; volume icons MGTK_RELAY_CALL MGTK::CloseAll MGTK_RELAY_CALL MGTK::SetZP1, ptr diff --git a/inc/prodos.inc b/inc/prodos.inc index 1e549bc..e6ed186 100644 --- a/inc/prodos.inc +++ b/inc/prodos.inc @@ -94,6 +94,7 @@ FT_TYPELESS = $00 FT_BAD = $01 FT_TEXT = $04 ; ASCII Text File * FT_BINARY = $06 ; Generic Binary File * +FT_FONT = $07 ; Font File FT_GRAPHICS = $08 ; Graphics File FT_DIRECTORY = $0F ; Directory * FT_ADB = $19 ; AppleWorks Database * diff --git a/preview/README.md b/preview/README.md index a07e9eb..1c8498e 100644 --- a/preview/README.md +++ b/preview/README.md @@ -10,6 +10,8 @@ File > Open is run or the files are double-clicked. * [show.image.file](show.image.file.s) * Handles image files (FOT $08) * 8k Hires or 16k Double Hires images are supported +* [show.font.file](show.font.file.s) + * Handles MGTK font files (FNT $07) The files can optionally be copied into the `DESK.ACC` directory to allow direct invocation from the Apple menu. This can be useful to @@ -20,3 +22,6 @@ See [API.md](../desk.acc/API.md) for programming details. See the DA [README.md](../desk.acc/README.md) for build and installation details. + +NOTE: ProDOS file type FNT $07 is reserved for Apple /// SOS font +files, but given their scarcity the type is re-used here. diff --git a/preview/TARGETS b/preview/TARGETS index 862bc70..d3827b4 100644 --- a/preview/TARGETS +++ b/preview/TARGETS @@ -1,2 +1,3 @@ show.text.file show.image.file +show.font.file diff --git a/preview/show.font.file.s b/preview/show.font.file.s new file mode 100644 index 0000000..846e452 --- /dev/null +++ b/preview/show.font.file.s @@ -0,0 +1,450 @@ + .feature string_escapes + .setcpu "6502" + + .include "apple2.inc" + .include "../macros.inc" + .include "../inc/apple2.inc" + .include "../inc/prodos.inc" + .include "../mgtk.inc" + .include "../desktop.inc" + +;;; ============================================================ + + .org $800 + + jmp entry + +;;; ============================================================ + +pathbuf: .res 65, 0 + +font_buffer := $D00 +io_buf := WINDOW_ICON_TABLES +read_length = WINDOW_ICON_TABLES-font_buffer + + DEFINE_OPEN_PARAMS open_params, pathbuf, io_buf + DEFINE_READ_PARAMS read_params, font_buffer, read_length + DEFINE_CLOSE_PARAMS close_params + +;;; ============================================================ +;;; Get filename by checking DeskTop selected window/icon + +entry: + +.proc get_filename + ;; Check that an icon is selected + lda #0 + sta pathbuf + lda selected_file_count + beq abort ; some file properties? + lda path_index ; prefix index in table + bne :+ +abort: rts + + ;; Copy path (prefix) into pathbuf. +: src := $06 + dst := $08 + + asl a ; (since address table is 2 bytes wide) + tax + copy16 path_table,x, src + ldy #0 + lda (src),y + tax + inc src + bne :+ + inc src+1 +: copy16 #pathbuf+1, dst + jsr copy_pathbuf ; copy x bytes (src) to (dst) + + ;; Append separator. + lda #'/' + ldy #0 + sta (dst),y + inc pathbuf + inc dst + bne :+ + inc dst+1 + + ;; Get file entry. +: lda selected_file_list ; file index in table + asl a ; (since table is 2 bytes wide) + tax + copy16 file_table,x, src + + ;; Exit if a directory. + ldy #2 ; 2nd byte of entry + lda (src),y + and #icon_entry_type_mask + bne :+ + rts ; 000 = directory + + ;; Set window title to point at filename (9th byte of entry) + ;; (title includes the spaces before/after from the icon) +: clc + lda src + adc #IconEntry::len + sta winfo_title + lda src+1 + adc #0 + sta winfo_title+1 + + ;; Append filename to path. + ldy #IconEntry::len + lda (src),y ; grab length + tax ; name has spaces before/after + dex ; so subtract 2 to get actual length + dex + clc + lda src + adc #11 ; 9 = length, 10 = space, 11 = name + sta src + bcc :+ + inc src+1 +: jsr copy_pathbuf ; copy x bytes (src) to (dst) + + jmp load_file_and_run_da + +.proc copy_pathbuf ; copy x bytes from src to dst + ldy #0 ; incrementing path length and dst +loop: lda (src),y + sta (dst),y + iny + inc pathbuf + dex + bne loop + tya + clc + adc dst + sta dst + bcc end + inc dst+1 +end: rts +.endproc + +.endproc + +;;; ============================================================ +;;; Load the file + +.proc load_file_and_run_da + ;; TODO: Ensure there's enough room, fail if not + + ;; NOTE: This only leaves $1000-$1AFF (2816 bytes) + ;; which is not enough for all the wide fonts. + + ;; -------------------------------------------------- + ;; Load the file + + sta ALTZPOFF + MLI_CALL OPEN, open_params ; TODO: Check for error + lda open_params::ref_num + sta read_params::ref_num + sta close_params::ref_num + MLI_CALL READ, read_params ; TODO: Check for error + MLI_CALL CLOSE, close_params + sta ALTZPON + + + ;; -------------------------------------------------- + ;; Copy the DA code and loaded data to AUX + + lda ROMIN2 + copy16 #DA_LOAD_ADDRESS, STARTLO + copy16 #WINDOW_ICON_TABLES-1, ENDLO + copy16 #DA_LOAD_ADDRESS, DESTINATIONLO + sec ; main>aux + jsr AUXMOVE + lda LCBANK1 + lda LCBANK1 + + ;; -------------------------------------------------- + ;; Run the DA from Aux, back to Main when done + + sta RAMRDON + sta RAMWRTON + jsr init + sta RAMRDOFF + sta RAMWRTOFF + rts +.endproc + +;;; ============================================================ + +da_window_id = 60 +da_width = 380 +da_height = 140 +da_left = (screen_width - da_width)/2 +da_top = (screen_height - da_height)/2 + +.proc winfo +window_id: .byte da_window_id +options: .byte MGTK::Option::go_away_box +title: .addr 0 ; overwritten to point at filename +hscroll: .byte MGTK::Scroll::option_none +vscroll: .byte MGTK::Scroll::option_none +hthumbmax: .byte 32 +hthumbpos: .byte 0 +vthumbmax: .byte 32 +vthumbpos: .byte 0 +status: .byte 0 +reserved: .byte 0 +mincontwidth: .word da_width +mincontlength: .word da_height +maxcontwidth: .word da_width +maxcontlength: .word da_height +port: +viewloc: DEFINE_POINT da_left, da_top +mapbits: .addr MGTK::screen_mapbits +mapwidth: .word MGTK::screen_mapwidth +maprect: DEFINE_RECT 0, 0, da_width, da_height +pattern: .res 8, $FF +colormasks: .byte MGTK::colormask_and, MGTK::colormask_or +penloc: DEFINE_POINT 0, 0 +penwidth: .byte 2 +penheight: .byte 1 +penmode: .byte 0 +textback: .byte $7F +textfont: .addr font_buffer +nextwinfo: .addr 0 +.endproc + winfo_title := winfo::title + +;;; ============================================================ + +.proc event_params +kind: .byte 0 +;;; EventKind::key_down +key := * +modifiers := * + 1 +;;; EventKind::update +window_id := * +;;; otherwise +xcoord := * +ycoord := * + 2 + .res 4 +.endproc + +.proc findwindow_params +mousex: .word 0 +mousey: .word 0 +which_area: .byte 0 +window_id: .byte 0 +.endproc + +.proc trackgoaway_params +clicked: .byte 0 +.endproc + +.proc dragwindow_params +window_id: .byte 0 +dragx: .word 0 +dragy: .word 0 +moved: .byte 0 +.endproc + +.proc winport_params +window_id: .byte da_window_id +port: .addr grafport +.endproc + +.proc grafport +viewloc: DEFINE_POINT 0, 0 +mapbits: .word 0 +mapwidth: .word 0 +cliprect: DEFINE_RECT 0, 0, 0, 0 +pattern: .res 8, 0 +colormasks: .byte 0, 0 +penloc: DEFINE_POINT 0, 0 +penwidth: .byte 0 +penheight: .byte 0 +penmode: .byte 0 +textback: .byte 0 +textfont: .addr 0 +.endproc + +.proc drawtext_params_char + .addr char_label + .byte 1 +.endproc +char_label: .byte 0 + +;;; ============================================================ + + +;;; ============================================================ + +.proc init + MGTK_CALL MGTK::OpenWindow, winfo + jsr draw_window + MGTK_CALL MGTK::FlushEvents + ;; fall through +.endproc + +.proc input_loop + MGTK_CALL MGTK::GetEvent, event_params + bne exit + lda event_params::kind + cmp #MGTK::EventKind::button_down ; was clicked? + bne :+ + jmp handle_down + + +: cmp #MGTK::EventKind::key_down ; any key? + bne :+ + jmp handle_key + + +: jmp input_loop +.endproc + +.proc exit + MGTK_CALL MGTK::CloseWindow, winfo + DESKTOP_CALL DT_REDRAW_ICONS + rts ; exits input loop +.endproc + +;;; ============================================================ + +.proc handle_key + lda event_params::key + cmp #CHAR_ESCAPE + bne :+ + jmp exit +: jmp input_loop +.endproc + +;;; ============================================================ + +.proc handle_down + copy16 event_params::xcoord, findwindow_params::mousex + copy16 event_params::ycoord, findwindow_params::mousey + MGTK_CALL MGTK::FindWindow, findwindow_params + bpl :+ + jmp exit +: lda findwindow_params::window_id + cmp winfo::window_id + bpl :+ + jmp input_loop +: lda findwindow_params::which_area + cmp #MGTK::Area::close_box + beq handle_close + cmp #MGTK::Area::dragbar + beq handle_drag + jmp input_loop +.endproc + +;;; ============================================================ + +.proc handle_close + MGTK_CALL MGTK::TrackGoAway, trackgoaway_params + lda trackgoaway_params::clicked + bne :+ + jmp input_loop +: jmp exit +.endproc + +;;; ============================================================ + +.proc handle_drag + copy winfo::window_id, dragwindow_params::window_id + copy16 event_params::xcoord, dragwindow_params::dragx + copy16 event_params::ycoord, dragwindow_params::dragy + MGTK_CALL MGTK::DragWindow, dragwindow_params + lda dragwindow_params::moved + bpl :+ + + ;; Draw DeskTop's windows (from Main) + sta RAMRDOFF + sta RAMWRTOFF + jsr JUMP_TABLE_REDRAW_ALL + sta RAMRDON + sta RAMWRTON + + ;; Draw DA's window + jsr draw_window + + ;; Draw DeskTop icons + DESKTOP_CALL DT_REDRAW_ICONS + +: jmp input_loop + +.endproc + +;;; ============================================================ + +line1: PASCAL_STRING "\x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x09 \x0A \x0B \x0C \x0D \x0E \x0F" +line2: PASCAL_STRING "\x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1A \x1B \x1C \x1D \x1E \x1F" +line3: PASCAL_STRING " ! \x22 # $ % & ' ( ) * + , - . /" +line4: PASCAL_STRING "0 1 2 3 4 5 6 7 8 9 : ; < = > ?" +line5: PASCAL_STRING "@ A B C D E F G H I J K L M N O" +line6: PASCAL_STRING "P Q R S T U V W X Y Z [ \x5C ] ^ _" +line7: PASCAL_STRING "` a b c d e f g h i j k l m n o" +line8: PASCAL_STRING "p q r s t u v w x y z { | } ~ \x7F" + + line_count = 8 +line_addrs: + .addr line1, line2, line3, line4, line5, line6, line7, line8 + +pos: DEFINE_POINT 0,0, pos + + initial_y = 5 + line_height = 15 + + +.proc draw_window + ptr := $06 + +PARAM_BLOCK params, $06 +data: .addr 0 +len: .byte 0 +width: .word 0 +END_PARAM_BLOCK + + MGTK_CALL MGTK::GetWinPort, winport_params + cmp #MGTK::Error::window_obscured + bne :+ + rts + +: MGTK_CALL MGTK::SetPort, grafport + MGTK_CALL MGTK::HideCursor + + copy16 #initial_y, pos::ycoord + + + copy #0, index +loop: lda index + asl + tax + copy16 line_addrs,x, ptr + + ldy #0 + lda (ptr),y ; length + sta params::len + add16 ptr, #1, params::data ; offset past length + + ;; Position the string + MGTK_CALL MGTK::TextWidth, params + sub16 #da_width, params::width, pos::xcoord ; center it + lsr16 pos::xcoord + add16 pos::ycoord, #line_height, pos::ycoord ; next row + + MGTK_CALL MGTK::MoveTo, pos + MGTK_CALL MGTK::DrawText, params + + inc index + lda index + cmp #line_count + bne loop + + MGTK_CALL MGTK::ShowCursor + rts + +index: .byte 0 + +.endproc + + +;;; ============================================================ + +.assert * < font_buffer, error, "DA too big"