a2d/preview/show.font.file.s

451 lines
12 KiB
ArmAsm

.feature string_escapes
.setcpu "6502"
.include "apple2.inc"
.include "../inc/macros.inc"
.include "../inc/apple2.inc"
.include "../inc/prodos.inc"
.include "../mgtk/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
ITK_CALL IconTK::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
ITK_CALL IconTK::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"