From 0428643cba3d2cf4b7d77da4645e7c139d1d1497 Mon Sep 17 00:00:00 2001 From: Joshua Bell Date: Mon, 4 Sep 2017 12:56:41 -0700 Subject: [PATCH] Move STF files up into DA directory --- desk.acc/README.md | 14 +- desk.acc/{show.text.file => }/a2d.inc | 0 desk.acc/{show.text.file => }/dhr.s | 4 +- desk.acc/{show.text.file => }/go.sh | 10 +- desk.acc/show.text.file/README.md | 11 - desk.acc/show.text.file/stf.list | 1824 ----------------- desk.acc/show.text.file/stf.o | Bin 22899 -> 0 bytes .../{show.text.file => }/show_text_file.bin | Bin .../{show.text.file => }/show_text_file.info | 0 .../stf.s => show_text_file.s} | 4 +- desk.acc/{show.text.file => }/stf | Bin 11 files changed, 21 insertions(+), 1846 deletions(-) rename desk.acc/{show.text.file => }/a2d.inc (100%) rename desk.acc/{show.text.file => }/dhr.s (99%) rename desk.acc/{show.text.file => }/go.sh (84%) delete mode 100644 desk.acc/show.text.file/README.md delete mode 100644 desk.acc/show.text.file/stf.list delete mode 100644 desk.acc/show.text.file/stf.o rename desk.acc/{show.text.file => }/show_text_file.bin (100%) rename desk.acc/{show.text.file => }/show_text_file.info (100%) rename desk.acc/{show.text.file/stf.s => show_text_file.s} (99%) rename desk.acc/{show.text.file => }/stf (100%) diff --git a/desk.acc/README.md b/desk.acc/README.md index 4c7aa82..71a2fc7 100644 --- a/desk.acc/README.md +++ b/desk.acc/README.md @@ -3,11 +3,21 @@ Disassembly of the desk accessories: * Calculator - _not started_ * Date - _not started_ * Puzzle - _not started_ -* [Show Text File](show.text.file) - in progress! +* [Show Text File](show_text_file.s) - in progress! * Sort Directory - _not started_ ## Desk Accessory Details * Loaded at $800 through (at least) $14FF * Copy themselves from Main into Aux memory (same location) -* Can call into ProDOS MLI and A2D entry points ($4000, $8E00) +* Can call into ProDOS MLI and A2D entry points ($4000, etc) + +## Process + +* `go.sh` - bash script used to drive the initial disassembly + (now commented out) and building + +* `*.bin` - original binary (type $F1, start $800) +* `*.info` - da65 "info" file - used to inform disassembly +* `*.s` - source (originally generated using da65, now modified) +* `*` - linked target - byte-for-byte identical with original diff --git a/desk.acc/show.text.file/a2d.inc b/desk.acc/a2d.inc similarity index 100% rename from desk.acc/show.text.file/a2d.inc rename to desk.acc/a2d.inc diff --git a/desk.acc/show.text.file/dhr.s b/desk.acc/dhr.s similarity index 99% rename from desk.acc/show.text.file/dhr.s rename to desk.acc/dhr.s index f4bd7f6..fc4b92a 100644 --- a/desk.acc/show.text.file/dhr.s +++ b/desk.acc/dhr.s @@ -1,8 +1,8 @@ .setcpu "65C02" .org $800 - .include "../../inc/prodos.inc" - .include "../../inc/auxmem.inc" + .include "../inc/prodos.inc" + .include "../inc/auxmem.inc" .include "a2d.inc" ;; Big questions: diff --git a/desk.acc/show.text.file/go.sh b/desk.acc/go.sh similarity index 84% rename from desk.acc/show.text.file/go.sh rename to desk.acc/go.sh index 6d4d8e8..c28ae45 100755 --- a/desk.acc/show.text.file/go.sh +++ b/desk.acc/go.sh @@ -5,12 +5,12 @@ set -e CC65=~/dev/cc65/bin original=show_text_file.bin -disasm=stf.d +disasm=show_text_file.d -src=stf.s -obj=stf.o -list=stf.list -out=stf +src=show_text_file.s +obj=show_text_file.o +list=show_text_file.list +out=show_text_file # Origin of STF #echo ' .org $800' > $disasm diff --git a/desk.acc/show.text.file/README.md b/desk.acc/show.text.file/README.md deleted file mode 100644 index ab0b96a..0000000 --- a/desk.acc/show.text.file/README.md +++ /dev/null @@ -1,11 +0,0 @@ -Disassembly of the Show Text File desk accessory - -* `go.sh` - bash script used to drive the initial disassembly - (now commented out) and building - -* `show_text_file.bin` - original binary (type $F1, start $800) -* `show_text_file.info` - da65 "info" file -* `stf.s` - source (originally generated using da65, now modified) -* `stf.o` - object file (assembled with ca65) -* `stf.list` - listing file (output by ca65) -* `stf` - linked target - byte-for-byte identical with original diff --git a/desk.acc/show.text.file/stf.list b/desk.acc/show.text.file/stf.list deleted file mode 100644 index 4f5f14f..0000000 --- a/desk.acc/show.text.file/stf.list +++ /dev/null @@ -1,1824 +0,0 @@ -ca65 V2.16 - Git f5e9b401 -Main file : stf.s -Current file: stf.s - -000000r 1 .setcpu "65C02" -000000r 1 .org $800 -000800 1 -000800 1 .include "../../inc/prodos.inc" -000800 2 ;;; ------------------------------ -000800 2 ;;; ProDOS MLI -000800 2 ;;; ------------------------------ -000800 2 -000800 2 ;;; Entry point -000800 2 MLI := $BF00 -000800 2 -000800 2 ;;; Housekeeping Calls -000800 2 CREATE := $C0 -000800 2 DESTROY := $C1 -000800 2 RENAME := $C2 -000800 2 SET_FILE_INFO := $C3 -000800 2 GET_FILE_INFO := $C4 -000800 2 ON_LINE := $C5 -000800 2 SET_PREFIX := $C6 -000800 2 GET_PREFIX := $C7 -000800 2 ;;; Filing Calls -000800 2 OPEN := $C8 -000800 2 NEWLINE := $C9 -000800 2 READ := $CA -000800 2 WRITE := $CB -000800 2 CLOSE := $CC -000800 2 FLUSH := $CD -000800 2 SET_MARK := $CE -000800 2 GET_MARK := $CF -000800 2 SET_EOF := $D0 -000800 2 GET_EOF := $D1 -000800 2 SET_BUF := $D2 -000800 2 GET_BUF := $D3 -000800 2 ;;; System Calls -000800 2 GET_TIME := $82 -000800 2 ALLOC_INTERRUPT := $40 -000800 2 DEALLOC_INTERRUPT := $41 -000800 2 ;;; Direct Disk Access Commands -000800 2 READ_BLOCK := $80 -000800 2 WRITE_BLOCK := $71 -000800 2 -000800 2 ;;; Macros -000800 2 .macro MLI_CALL op, addr -000800 2 jsr MLI -000800 2 .byte op -000800 2 .addr addr -000800 2 .endmacro -000800 2 -000800 1 .include "../../inc/auxmem.inc" -000800 2 ;;; ------------------------------ -000800 2 ;;; Aux Memory -000800 2 ;;; ------------------------------ -000800 2 -000800 2 ;;; Softswitches -000800 2 RAMRDOFF := $C002 -000800 2 RAMRDON := $C003 -000800 2 RAMWRTOFF := $C004 -000800 2 RAMWRTON := $C005 -000800 2 ALTZPOFF := $C008 -000800 2 ALTZPON := $C009 -000800 2 -000800 2 PAGE2OFF := $C054 -000800 2 PAGE2ON := $C055 -000800 2 HIRESON := $C056 -000800 2 HIRESOFF := $C057 -000800 2 -000800 2 LCBANK1 := $C08B -000800 2 -000800 2 ;;; Routines -000800 2 AUXMOVE := $C311 ; carry set main>aux, carry clear aux>main -000800 2 XFER := $C314 -000800 2 -000800 2 STARTLO := $3C -000800 2 STARTHI := $3D -000800 2 ENDLO := $3E -000800 2 ENDHI := $3F -000800 2 DESTINATIONLO := $42 -000800 2 DESTINATIONHI := $43 -000800 2 -000800 1 .include "a2d.inc" -000800 2 ;;; ------------------------------ -000800 2 ;;; A2Desktop -000800 2 ;;; ------------------------------ -000800 2 -000800 2 ;;; Entry Points -000800 2 A2D := $4000 -000800 2 -000800 2 UNKNOWN_CALL := $8E00 -000800 2 -000800 2 ;; These must be called from main memory (RAMRDON/RAMWRTON) -000800 2 JUMP_TABLE_03 := $4003 ; ??? -000800 2 JUMP_TABLE_06 := $4006 ; ??? -000800 2 JUMP_TABLE_09 := $4009 ; ??? -000800 2 JUMP_TABLE_0C := $400C ; ??? (made "items/in disk/..." redraw oddly) -000800 2 JUMP_TABLE_0F := $400F ; ??? -000800 2 JUMP_TABLE_12 := $4012 ; ??? -000800 2 JUMP_TABLE_15 := $4015 ; ??? -000800 2 JUMP_TABLE_18 := $4018 ; ??? -000800 2 JUMP_TABLE_CLEAR_SEL := $401E ; Clear DeskTop selection -000800 2 JUMP_TABLE_21 := $4021 ; ??? -000800 2 JUMP_TABLE_24 := $4024 ; ??? -000800 2 JUMP_TABLE_27 := $4027 ; ??? -000800 2 JUMP_TABLE_2A := $402A ; ??? -000800 2 JUMP_TABLE_2D := $402D ; ??? -000800 2 JUMP_TABLE_30 := $4030 ; ??? -000800 2 JUMP_TABLE_33 := $4033 ; Shows "The syntax of the pathname is invalid.", hangs -000800 2 JUMP_TABLE_36 := $4036 ; ditto -000800 2 JUMP_TABLE_CUR_POINTER := $4039 ; Changes mouse cursor to pointer -000800 2 JUMP_TABLE_CUR_WATCH := $403C ; Changes mouse cursor to watch -000800 2 JUMP_TABLE_3F := $403F ; ??? -000800 2 -000800 2 A2D_UNK_03 := $03 ; Unknown - used in calculator after frame is drawn -000800 2 -000800 2 A2D_TEXT_BOX1 := $04 ; Not sure what BOX1 vs. BOX2 is for -000800 2 A2D_TEXT_BOX2 := $06 ; Not sure what BOX1 vs. BOX2 is for -000800 2 ;; .word left pixels from screen edge -000800 2 ;; .word top -000800 2 ;; .word $2000 ??? -000800 2 ;; .word $80 ??? -000800 2 ;; .word hoffset pixels scrolled -000800 2 ;; .word voffset -000800 2 ;; .word width pixels -000800 2 ;; .word height -000800 2 -000800 2 A2D_UNK_07 := $07 ; Unknown - used in calculator -000800 2 -000800 2 A2D_SET_PATTERN := $08 -000800 2 ;; .byte r0...r7 8x8 pixel pattern for A2D_CLEAR_BOX calls -000800 2 -000800 2 A2D_UNK_0C := $0C ; Unknown - used in calculator -000800 2 -000800 2 A2D_SET_TEXT_POS:= $0E -000800 2 ;; .word left -000800 2 ;; .word base -000800 2 -000800 2 A2D_CLEAR_BOX := $11 ; To window background pattern -000800 2 ;; .word hoffset (includes scroll pos) -000800 2 ;; .word voffset -000800 2 ;; .word width pixels -000800 2 ;; .word height -000800 2 -000800 2 A2D_UNK_14 := $14 ; Unknown - draws push button (calculator) -000800 2 -000800 2 A2D_DRAW_TEXT := $19 -000800 2 ;; .addr data -000800 2 ;; .byte length -000800 2 -000800 2 A2D_UNK_1A := $1A ; Unknown - used in calculator before window creation -000800 2 -000800 2 A2D_UNK_24 := $24 ; Unknown - used in calculator -000800 2 -000800 2 A2D_GET_BUTTON := $2A -000800 2 ;; .byte state (0=up, 1=pressed, 2=held???) -000800 2 -000800 2 A2D_UNK_2B := $2B ; Unknown -000800 2 ;; no parameters (pass $0000 as address) -000800 2 -000800 2 A2D_UNK_2D := $2D ; Unknown - used in calculator -000800 2 -000800 2 A2D_CREATE_WINDOW := $38 -000800 2 ;; .byte id -000800 2 ;; 0 = desktop -000800 2 ;; 1, 2, ... = file windows -000800 2 ;; 100 = DA (for example) -000800 2 ;; .byte flags (A2D_CWF_*) -000800 2 ;; bit 0: remove title bar -000800 2 ;; bit 1: add close box -000800 2 ;; bit 2: add resize box -000800 2 ;; .addr title -000800 2 ;; .byte hscroll bits: 7 = enable, 6 = show thumb, 0 = show track -000800 2 ;; .byte vscroll -000800 2 ;; .byte hscroll_max -000800 2 ;; .byte hscroll_pos -000800 2 ;; .byte vscroll_max -000800 2 ;; .byte vscroll_pos -000800 2 ;; .byte ??? -000800 2 ;; .byte ??? -000800 2 ;; .word width_a ??? -000800 2 ;; .word height_a ??? -000800 2 ;; .word width_b (of scroll area?) -000800 2 ;; .word height_b (of scroll area?) -000800 2 ;; - next section is identical to that for TEXT_BOX -000800 2 ;; .word left pixels from screen edge -000800 2 ;; .word top -000800 2 ;; .word $2000 ??? -000800 2 ;; .word $80 ??? -000800 2 ;; .word hoffset pixels scrolled -000800 2 ;; .word voffset -000800 2 ;; .word width pixels -000800 2 ;; .word height -000800 2 -000800 2 -000800 2 -000800 2 A2D_DESTROY_WINDOW := $39 -000800 2 ;; pass the same block as passed to A2D_CREATE_WINDOW -000800 2 -000800 2 A2D_UNK_3C := $3C ; Unknown, used in calculator -000800 2 -000800 2 A2D_GET_MOUSE := $40 -000800 2 ;; .word x -000800 2 ;; .word y -000800 2 ;; .byte element (A2D_ELEM_*) -000800 2 ;; 0 = desktop -000800 2 ;; 1 = menu -000800 2 ;; 2 = client area (including scroll bars/resize box) -000800 2 ;; 3 = title bar -000800 2 ;; 4 = resize box -000800 2 ;; 5 = close box -000800 2 ;; .byte id of window -000800 2 -000800 2 A2D_BTN_CLICK := $43 -000800 2 ;; .byte clicked (0 = cancelled, 1 = clicked) -000800 2 ;; .byte ?? -000800 2 ;; .byte ?? -000800 2 -000800 2 A2D_DRAG_RESIZE := $45 -000800 2 ;; .byte id of window -000800 2 ;; .word xcoord of mouse -000800 2 ;; .word ycoord of mouse -000800 2 ;; .byte ?? (likely: moved? 0 = no change, 1 = moved) -000800 2 -000800 2 A2D_UNK_44 := $44 ; Unknown - used in calculator -000800 2 -000800 2 A2D_UNK_46 := $46 ; Unknown - used in calculator -000800 2 -000800 2 A2D_QUERY_CLIENT:= $48 -000800 2 ;; .word xcoord of query -000800 2 ;; .word ycoord of query -000800 2 ;; .byte part (0 = client, 1 = vscroll, 2 = hscroll) -000800 2 ;; .byte scroll (1 = up/left, 2 = down/right, 3 = above/before, 4 = below/after, 5 = thumb) -000800 2 -000800 2 A2D_RESIZE_WINDOW := $49 -000800 2 ;; .byte ?? (unused, so incomplete) -000800 2 ;; .byte ?? -000800 2 -000800 2 A2D_DRAG_SCROLL:= $4A -000800 2 ;; .byte type (1 = vscroll, 2 = hscroll) -000800 2 ;; .word xcoord of mouse -000800 2 ;; .word ycoord of mouse -000800 2 ;; .byte position (0...255) -000800 2 ;; .byte moved (0 = no change, 1 = moved) -000800 2 -000800 2 A2D_UPDATE_SCROLL:= $4B -000800 2 ;; .byte type (1 = vertical, 2 = horizontal) -000800 2 ;; .byte pos (new position 0...250) -000800 2 -000800 2 -000800 2 ;;; Used in A2D_GET_MOUSE -000800 2 A2D_ELEM_DESKTOP:= 0 -000800 2 A2D_ELEM_MENU := 1 -000800 2 A2D_ELEM_CLIENT := 2 -000800 2 A2D_ELEM_TITLE := 3 -000800 2 A2D_ELEM_RESIZE := 4 -000800 2 A2D_ELEM_CLOSE := 5 -000800 2 -000800 2 ;;; Used in A2D_QUERY_CLIENT, A2D_DRAG_SCROLL, A2D_UPDATE_SCROLL -000800 2 A2D_CLIENT := 0 -000800 2 A2D_VSCROLL := 1 -000800 2 A2D_HSCROLL := 2 -000800 2 -000800 2 ;;; Used in A2D_QUERY_CLIENT -000800 2 A2D_SCROLL_PART_UP := 1 -000800 2 A2D_SCROLL_PART_LEFT := 1 -000800 2 A2D_SCROLL_PART_DOWN := 2 -000800 2 A2D_SCROLL_PART_RIGHT := 2 -000800 2 A2D_SCROLL_PART_ABOVE := 3 -000800 2 A2D_SCROLL_PART_BEFORE := 3 -000800 2 A2D_SCROLL_PART_BELOW := 4 -000800 2 A2D_SCROLL_PART_AFTER := 4 -000800 2 A2D_SCROLL_PART_THUMB := 5 -000800 2 -000800 2 ;;; Used in A2D_CREATE_WINDOW -000800 2 A2D_CWF_NOTITLE := 1 << 0 -000800 2 A2D_CWF_ADDCLOSE := 1 << 1 -000800 2 A2D_CWF_ADDRESIZE:= 1 << 2 -000800 2 -000800 2 A2D_CWS_NOSCROLL := 0 -000800 2 A2D_CWS_SCROLL_ENABLED := 1 << 7 -000800 2 A2D_CWS_SCROLL_THUMB := 1 << 6 -000800 2 A2D_CWS_SCROLL_TRACK := 1 << 0 -000800 2 A2D_CWS_SCROLL_NORMAL := A2D_CWS_SCROLL_ENABLED | A2D_CWS_SCROLL_THUMB | A2D_CWS_SCROLL_TRACK -000800 2 -000800 2 -000800 2 ;;; Macros -000800 2 .macro A2D_CALL op, addr -000800 2 jsr A2D -000800 2 .byte op -000800 2 .addr addr -000800 2 .endmacro -000800 2 -000800 2 .macro A2D_DEFSTRING str ; String definition, for use with A2D_TEXT -000800 2 .local data -000800 2 .addr data -000800 2 .byte .strlen(str) -000800 2 data: .byte str -000800 2 .endmacro -000800 2 -000800 2 -000800 2 ;;; DeskTop Internals -000800 2 -000800 2 ;; These are DeskTop internals, but it appears there is no -000800 2 ;; API for getting the selected file. -000800 2 file_selected := $DF21 ; 0 if no selection, 1 otherwise -000800 2 path_index := $DF20 ; index of selected window (used to get prefix) -000800 2 path_table := $DFB3 ; window address table -000800 2 ;; each entry is 65 bytes long -000800 2 ;; each entry is length-prefixed path string (no trailing /) -000800 2 file_index := $DF22 ; index of selected file (global, not w/in window) -000800 2 file_table := $DD9F ; file address table -000800 2 ;; each entry is 27 bytes long -000800 2 ;; .byte ?? -000800 2 ;; .byte ?? -000800 2 ;; .byte type/icon (bits 4,5,6 clear = directory) -000800 2 ;; .word iconx (pixels) -000800 2 ;; .word icony (pixels) -000800 2 ;; .byte ?? -000800 2 ;; .byte ?? -000800 2 ;; .byte len, name (length-prefixed, spaces before/after; 17 byte buffer) -000800 2 -000800 1 -000800 1 ;; Big questions: -000800 1 ;; * How can we hide/show the cursor on demand? -000800 1 ;; * Can we trigger menu redraw? (if not, need to preserve for fullscreen) -000800 1 -000800 1 4C 04 08 start: jmp copy2aux -000803 1 -000803 1 00 save_stack:.byte 0 -000804 1 -000804 1 ;;; Copy $800 through $13FF (the DA) to aux -000804 1 .proc copy2aux -000804 1 BA tsx -000805 1 8E 03 08 stx save_stack -000808 1 8D 05 C0 sta RAMWRTON -00080B 1 A0 00 ldy #0 -00080D 1 B9 00 08 src: lda start,y ; self-modified -000810 1 99 00 08 dst: sta start,y ; self-modified -000813 1 88 dey -000814 1 D0 F7 bne src -000816 1 8D 04 C0 sta RAMWRTOFF -000819 1 EE 0F 08 inc src+2 -00081C 1 EE 12 08 inc dst+2 -00081F 1 8D 05 C0 sta RAMWRTON -000822 1 AD 12 08 lda dst+2 -000825 1 C9 14 cmp #$14 -000827 1 D0 E4 bne src -000829 1 .endproc -000829 1 -000829 1 call_main_trampoline := $20 ; installed on ZP, turns off auxmem and calls... -000829 1 call_main_addr := call_main_trampoline+7 ; address patched in here -000829 1 -000829 1 ;;; Copy the following "call_main_template" routine to $20 -000829 1 .scope -000829 1 8D 05 C0 sta RAMWRTON -00082C 1 8D 03 C0 sta RAMRDON -00082F 1 A2 10 ldx #(call_main_template_end - call_main_template) -000831 1 BD 3C 08 loop: lda call_main_template,x -000834 1 95 20 sta call_main_trampoline,x -000836 1 CA dex -000837 1 10 F8 bpl loop -000839 1 4C 4C 08 jmp call_init -00083C 1 .endscope -00083C 1 -00083C 1 .proc call_main_template -00083C 1 8D 02 C0 sta RAMRDOFF -00083F 1 8D 04 C0 sta RAMWRTOFF -000842 1 20 00 10 jsr $1000 ; overwritten (in zp version) -000845 1 8D 03 C0 sta RAMRDON -000848 1 8D 05 C0 sta RAMWRTON -00084B 1 60 rts -00084C 1 .endproc -00084C 1 call_main_template_end: ; can't .sizeof(proc) before declaration -00084C 1 ;; https://github.com/cc65/cc65/issues/478 -00084C 1 -00084C 1 .proc call_init -00084C 1 ;; run the DA -00084C 1 20 DE 09 jsr init -00084F 1 -00084F 1 ;; tear down/exit -00084F 1 8D 09 C0 sta ALTZPON -000852 1 AD 8B C0 lda LCBANK1 -000855 1 AD 8B C0 lda LCBANK1 -000858 1 8D 02 C0 sta RAMRDOFF -00085B 1 8D 04 C0 sta RAMWRTOFF -00085E 1 AE 03 08 ldx save_stack -000861 1 9A txs -000862 1 60 rts -000863 1 .endproc -000863 1 -000863 1 ;;; ================================================== -000863 1 ;;; ProDOS MLI calls -000863 1 -000863 1 .proc open_file -000863 1 20 C2 08 jsr copy_params_aux_to_main -000866 1 8D 08 C0 sta ALTZPOFF -000869 1 20 00 BF C8 MLI_CALL OPEN, open_params -00086D 1 EA 08 -00086F 1 8D 09 C0 sta ALTZPON -000872 1 20 D4 08 jsr copy_params_main_to_aux -000875 1 60 rts -000876 1 .endproc -000876 1 -000876 1 .proc read_file -000876 1 20 C2 08 jsr copy_params_aux_to_main -000879 1 8D 08 C0 sta ALTZPOFF -00087C 1 20 00 BF CA MLI_CALL READ, read_params -000880 1 F0 08 -000882 1 8D 09 C0 sta ALTZPON -000885 1 20 D4 08 jsr copy_params_main_to_aux -000888 1 60 rts -000889 1 .endproc -000889 1 -000889 1 .proc get_file_eof -000889 1 20 C2 08 jsr copy_params_aux_to_main -00088C 1 8D 08 C0 sta ALTZPOFF -00088F 1 20 00 BF D1 MLI_CALL GET_EOF, get_eof_params -000893 1 F8 08 -000895 1 8D 09 C0 sta ALTZPON -000898 1 20 D4 08 jsr copy_params_main_to_aux -00089B 1 60 rts -00089C 1 .endproc -00089C 1 -00089C 1 .proc set_file_mark -00089C 1 20 C2 08 jsr copy_params_aux_to_main -00089F 1 8D 08 C0 sta ALTZPOFF -0008A2 1 20 00 BF CE MLI_CALL SET_MARK, set_mark_params -0008A6 1 FD 08 -0008A8 1 8D 09 C0 sta ALTZPON -0008AB 1 20 D4 08 jsr copy_params_main_to_aux -0008AE 1 60 rts -0008AF 1 .endproc -0008AF 1 -0008AF 1 .proc close_file -0008AF 1 20 C2 08 jsr copy_params_aux_to_main -0008B2 1 8D 08 C0 sta ALTZPOFF -0008B5 1 20 00 BF CC MLI_CALL CLOSE, close_params -0008B9 1 02 09 -0008BB 1 8D 09 C0 sta ALTZPON -0008BE 1 20 D4 08 jsr copy_params_main_to_aux -0008C1 1 60 rts -0008C2 1 .endproc -0008C2 1 -0008C2 1 ;;; ================================================== -0008C2 1 -0008C2 1 ;;; Copies param blocks from Aux to Main -0008C2 1 .proc copy_params_aux_to_main -0008C2 1 A0 65 ldy #(params_end - params_start + 1) -0008C4 1 8D 04 C0 sta RAMWRTOFF -0008C7 1 B9 E9 08 loop: lda params_start - 1,y -0008CA 1 99 E9 08 sta params_start - 1,y -0008CD 1 88 dey -0008CE 1 D0 F7 bne loop -0008D0 1 8D 02 C0 sta RAMRDOFF -0008D3 1 60 rts -0008D4 1 .endproc -0008D4 1 -0008D4 1 ;;; Copies param blocks from Main to Aux -0008D4 1 .proc copy_params_main_to_aux -0008D4 1 48 pha -0008D5 1 08 php -0008D6 1 8D 05 C0 sta RAMWRTON -0008D9 1 A0 65 ldy #(params_end - params_start + 1) -0008DB 1 B9 E9 08 loop: lda params_start - 1,y -0008DE 1 99 E9 08 sta params_start - 1,y -0008E1 1 88 dey -0008E2 1 D0 F7 bne loop -0008E4 1 8D 03 C0 sta RAMRDON -0008E7 1 28 plp -0008E8 1 68 pla -0008E9 1 60 rts -0008EA 1 .endproc -0008EA 1 -0008EA 1 ;;; ---------------------------------------- -0008EA 1 -0008EA 1 params_start: -0008EA 1 ;;; This block gets copied between main/aux -0008EA 1 -0008EA 1 ;;; ProDOS MLI param blocks -0008EA 1 -0008EA 1 .proc open_params -0008EA 1 03 .byte 3 ; param_count -0008EB 1 04 09 .addr pathname ; pathname -0008ED 1 00 0C .addr $0C00 ; io_buffer -0008EF 1 00 ref_num:.byte 0 ; ref_num -0008F0 1 .endproc -0008F0 1 -0008F0 1 default_buffer := $1200 -0008F0 1 -0008F0 1 .proc read_params -0008F0 1 04 .byte 4 ; param_count -0008F1 1 00 ref_num:.byte 0 ; ref_num -0008F2 1 00 12 buffer: .addr default_buffer ; data_buffer -0008F4 1 00 01 .word $100 ; request_count -0008F6 1 00 00 .word 0 ; trans_count -0008F8 1 .endproc -0008F8 1 -0008F8 1 .proc get_eof_params -0008F8 1 02 .byte 2 ; param_count -0008F9 1 00 ref_num:.byte 0 ; ref_num -0008FA 1 00 00 00 .byte 0,0,0 ; EOF (lo, mid, hi) -0008FD 1 .endproc -0008FD 1 -0008FD 1 .proc set_mark_params -0008FD 1 02 .byte 2 ; param_count -0008FE 1 00 ref_num:.byte 0 ; ref_num -0008FF 1 00 00 00 .byte 0,0,0 ; position (lo, mid, hi) -000902 1 .endproc -000902 1 -000902 1 .proc close_params -000902 1 01 .byte 1 ; param_count -000903 1 00 ref_num:.byte 0 ; ref_num -000904 1 .endproc -000904 1 -000904 1 .proc pathname ; 1st byte is length, rest is full path -000904 1 00 length: .byte $00 -000905 1 00 00 00 00 data: .byte $00,$00,$00,$00,$00,$00,$00,$00 -000909 1 00 00 00 00 -00090D 1 00 00 00 00 .byte $00,$00,$00,$00,$00,$00,$00,$00 -000911 1 00 00 00 00 -000915 1 00 00 00 00 .byte $00,$00,$00,$00,$00,$00,$00,$00 -000919 1 00 00 00 00 -00091D 1 00 00 00 00 .byte $00,$00,$00,$00,$00,$00,$00,$00 -000921 1 00 00 00 00 -000925 1 00 00 00 00 .byte $00,$00,$00,$00,$00,$00,$00,$00 -000929 1 00 00 00 00 -00092D 1 00 00 00 00 .byte $00,$00,$00,$00,$00,$00,$00,$00 -000931 1 00 00 00 00 -000935 1 00 00 00 00 .byte $00,$00,$00,$00,$00,$00,$00,$00 -000939 1 00 00 00 00 -00093D 1 00 00 00 00 .byte $00,$00,$00,$00,$00,$00,$00,$00 -000941 1 00 00 00 00 -000945 1 .endproc -000945 1 -000945 1 00 L0945: .byte $00 -000946 1 00 L0946: .byte $00 -000947 1 00 L0947: .byte $00 -000948 1 00 L0948: .byte $00 -000949 1 00 L0949: .byte $00 -00094A 1 -00094A 1 params_end := * + 4 ; bug in original? (harmless as this is static) -00094A 1 ;;; ---------------------------------------- -00094A 1 -00094A 1 black_pattern: -00094A 1 00 00 00 00 .byte $00,$00,$00,$00,$00,$00,$00,$00 -00094E 1 00 00 00 00 -000952 1 -000952 1 white_pattern: -000952 1 FF FF FF FF .byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF -000956 1 FF FF FF FF -00095A 1 -00095A 1 window_id := $64 -00095A 1 -00095A 1 00 L095A: .byte $00 -00095B 1 FA L095B: .byte $FA -00095C 1 01 L095C: .byte $01 -00095D 1 -00095D 1 .proc line_pos -00095D 1 00 00 left: .word 0 -00095F 1 00 00 base: .word 0 -000961 1 .endproc -000961 1 -000961 1 00 00 window_width: .word 0 -000963 1 00 00 window_height: .word 0 -000965 1 -000965 1 00 L0965: .byte $00 -000966 1 00 00 L0966: .byte $00,$00 -000968 1 00 L0968: .byte $00 -000969 1 00 L0969: .byte $00 -00096A 1 00 L096A: .byte $00 -00096B 1 00 L096B: .byte $00 -00096C 1 00 L096C: .byte $00 -00096D 1 00 L096D: .byte $00 -00096E 1 -00096E 1 track_scroll_delta: -00096E 1 00 .byte $00 -00096F 1 -00096F 1 fixed_mode_flag: -00096F 1 00 .byte $00 ; 0 = proportional, otherwise = fixed -000970 1 -000970 1 button_state: ; queried to track mouse-up -000970 1 00 .byte $00 -000971 1 -000971 1 .proc mouse_params ; queried by main input loop -000971 1 00 00 xcoord: .word 0 -000973 1 00 00 ycoord: .word 0 -000975 1 00 elem: .byte 0 -000976 1 00 win: .byte 0 -000977 1 .endproc -000977 1 -000977 1 .proc resize_drag_params -000977 1 64 id: .byte window_id -000978 1 00 00 xcoord: .word 0 -00097A 1 00 00 ycoord: .word 0 -00097C 1 00 .byte 0 ; ??? -00097D 1 .endproc -00097D 1 -00097D 1 .proc close_btn_params ; queried after close clicked to see if aborted/finished -00097D 1 00 state: .byte 0 ; 0 = aborted, 1 = clicked -00097E 1 00 00 .byte 0,0 ; ??? -000980 1 .endproc -000980 1 -000980 1 .proc query_client_params ; queried after a client click to identify target -000980 1 00 00 xcoord: .word 0 -000982 1 00 00 ycoord: .word 0 -000984 1 00 part: .byte 0 ; 0 = client, 1 = vscroll, 2 = hscroll -000985 1 00 scroll: .byte 0 ; 1 = up, 2 = down, 3 = above, 4 = below, 5 = thumb -000986 1 .endproc -000986 1 -000986 1 ;; param block used in dead code (resize?) -000986 1 .proc resize_window_params -000986 1 00 L0986: .byte 0 -000987 1 00 L0987: .byte 0 -000988 1 .endproc -000988 1 -000988 1 .proc update_scroll_params ; called to update scroll bar position -000988 1 00 type: .byte 0 ; 1 = vscroll, 2 = hscroll -000989 1 00 pos: .byte 0 ; new position -00098A 1 .endproc -00098A 1 -00098A 1 ;;; Used when dragging vscroll thumb -00098A 1 .proc thumb_drag_params -00098A 1 00 type: .byte 0 ; 1 = vscroll, 2 = hscroll -00098B 1 00 00 xcoord: .word 0 -00098D 1 00 00 ycoord: .word 0 -00098F 1 00 pos: .byte 0 ; position -000990 1 00 moved: .byte 0 ; 0 if not moved, 1 if moved -000991 1 .endproc -000991 1 -000991 1 .proc text_string -000991 1 00 00 addr: .addr 0 ; address -000993 1 00 len: .byte 0 ; length -000994 1 .endproc -000994 1 -000994 1 default_width := 512 -000994 1 default_height := 150 -000994 1 default_left := 10 -000994 1 default_top := 28 -000994 1 -000994 1 .proc window_params -000994 1 64 id: .byte window_id ; window identifier -000995 1 02 flags: .byte A2D_CWF_ADDCLOSE; window flags (2=include close box) -000996 1 00 10 title: .addr $1000 ; overwritten to point at filename -000998 1 -000998 1 00 hscroll:.byte A2D_CWS_NOSCROLL -000999 1 C1 vscroll:.byte A2D_CWS_SCROLL_NORMAL -00099A 1 hscroll_max: -00099A 1 20 .byte 32 -00099B 1 hscroll_pos: -00099B 1 00 .byte 0 -00099C 1 vscroll_max: -00099C 1 FF .byte 255 -00099D 1 vscroll_pos: -00099D 1 00 .byte 0 -00099E 1 -00099E 1 ;; ??? -00099E 1 00 00 C8 00 .byte $00,$00,$C8,$00,$33,$00 -0009A2 1 33 00 -0009A4 1 -0009A4 1 00 02 width: .word default_width -0009A6 1 96 00 height: .word default_height -0009A8 1 .endproc -0009A8 1 ;; window_params continues into text_box -0009A8 1 .proc text_box ; or whole window ?? -0009A8 1 0A 00 left: .word default_left -0009AA 1 1C 00 top: .word default_top -0009AC 1 00 20 .word $2000 ; ??? never changed -0009AE 1 80 00 .word $80 ; ??? never changed -0009B0 1 00 00 hoffset:.word 0 ; Also used for A2D_CLEAR_BOX -0009B2 1 00 00 voffset:.word 0 -0009B4 1 00 02 width: .word default_width -0009B6 1 96 00 height: .word default_height -0009B8 1 .endproc -0009B8 1 -0009B8 1 ;; unused? -0009B8 1 00 00 00 00 .byte $00,$00,$00,$00,$00,$00,$00 -0009BC 1 00 00 00 -0009BF 1 00 FF 00 00 .byte $00,$FF,$00,$00,$00,$00,$00,$01 -0009C3 1 00 00 00 01 -0009C7 1 01 00 7F 00 .byte $01,$00,$7F,$00,$88,$00,$00 -0009CB 1 88 00 00 -0009CE 1 -0009CE 1 ;; gets copied over text_box after mode is drawn -0009CE 1 .proc default_box -0009CE 1 0A 00 left: .word default_left -0009D0 1 1C 00 top: .word default_top -0009D2 1 00 20 .word $2000 -0009D4 1 80 00 .word $80 -0009D6 1 00 00 hoffset:.word 0 -0009D8 1 00 00 voffset:.word 0 -0009DA 1 00 02 width: .word default_width -0009DC 1 96 00 height: .word default_height -0009DE 1 .endproc -0009DE 1 -0009DE 1 .proc init -0009DE 1 8D 09 C0 sta ALTZPON -0009E1 1 AD 8B C0 lda LCBANK1 -0009E4 1 AD 8B C0 lda LCBANK1 -0009E7 1 -0009E7 1 ;; Get filename by checking DeskTop selected window/icon -0009E7 1 -0009E7 1 ;; Check that an icon is selected -0009E7 1 A9 00 lda #0 -0009E9 1 8D 04 09 sta pathname::length -0009EC 1 AD 21 DF lda file_selected -0009EF 1 F0 05 beq abort ; some file properties? -0009F1 1 AD 20 DF lda path_index ; prefix index in table -0009F4 1 D0 01 bne :+ -0009F6 1 60 abort: rts -0009F7 1 -0009F7 1 ;; Copy path (prefix) into pathname buffer. -0009F7 1 : src := $06 -0009F7 1 dst := $08 -0009F7 1 -0009F7 1 0A asl a ; (since address table is 2 bytes wide) -0009F8 1 AA tax -0009F9 1 BD B3 DF lda path_table,x ; pathname ??? -0009FC 1 85 06 sta src -0009FE 1 BD B4 DF lda path_table+1,x -000A01 1 85 07 sta src+1 -000A03 1 A0 00 ldy #0 -000A05 1 B1 06 lda (src),y -000A07 1 AA tax -000A08 1 E6 06 inc src -000A0A 1 D0 02 bne :+ -000A0C 1 E6 07 inc src+1 -000A0E 1 A9 05 : lda #<(pathname::data) -000A10 1 85 08 sta dst -000A12 1 A9 09 lda #>(pathname::data) -000A14 1 85 09 sta dst+1 -000A16 1 20 72 0A jsr copy_pathname ; copy x bytes (src) to (dst) -000A19 1 -000A19 1 ;; Append separator. -000A19 1 A9 2F lda #'/' -000A1B 1 A0 00 ldy #0 -000A1D 1 91 08 sta (dst),y -000A1F 1 EE 04 09 inc pathname::length -000A22 1 E6 08 inc dst -000A24 1 D0 02 bne :+ -000A26 1 E6 09 inc dst+1 -000A28 1 -000A28 1 ;; Get file entry. -000A28 1 AD 22 DF : lda file_index ; file index in table -000A2B 1 0A asl a ; (since table is 2 bytes wide) -000A2C 1 AA tax -000A2D 1 BD 9F DD lda file_table,x -000A30 1 85 06 sta src -000A32 1 BD A0 DD lda file_table+1,x -000A35 1 85 07 sta src+1 -000A37 1 -000A37 1 ;; Exit if a directory. -000A37 1 A0 02 ldy #2 ; 2nd byte of entry -000A39 1 B1 06 lda (src),y -000A3B 1 29 70 and #$70 ; check that one of bits 4,5,6 is set ??? -000A3D 1 ;; some vague patterns, but unclear -000A3D 1 ;; basic = $32,$33, text = $52, sys = $11,$14,??, bin = $23,$24,$33 -000A3D 1 ;; dir = $01 (so not shown) -000A3D 1 D0 01 bne :+ -000A3F 1 60 rts ; abort ??? -000A40 1 -000A40 1 ;; Set window title to point at filename (9th byte of entry) -000A40 1 ;; (title includes the spaces before/after from the icon) -000A40 1 18 : clc -000A41 1 A5 06 lda src ; name is 9 bytes into entry -000A43 1 69 09 adc #9 -000A45 1 8D 96 09 sta window_params::title -000A48 1 A5 07 lda src+1 -000A4A 1 69 00 adc #0 -000A4C 1 8D 97 09 sta window_params::title+1 -000A4F 1 -000A4F 1 ;; Append filename to path. -000A4F 1 A0 09 ldy #9 -000A51 1 B1 06 lda (src),y ; grab length -000A53 1 AA tax ; name has spaces before/after -000A54 1 CA dex ; so subtract 2 to get actual length -000A55 1 CA dex -000A56 1 18 clc -000A57 1 A5 06 lda src -000A59 1 69 0B adc #11 ; 9 = length, 10 = space, 11 = name -000A5B 1 85 06 sta src -000A5D 1 90 02 bcc :+ -000A5F 1 E6 07 inc src+1 -000A61 1 20 72 0A : jsr copy_pathname ; copy x bytes (src) to (dst) -000A64 1 -000A64 1 ;; Clear selection (why???) -000A64 1 A9 1E lda #JUMP_TABLE_CLEAR_SEL -000A6A 1 85 28 sta call_main_addr+1 -000A6C 1 20 20 00 jsr call_main_trampoline -000A6F 1 -000A6F 1 4C 8A 0A jmp open_file_and_init_window -000A72 1 -000A72 1 .proc copy_pathname ; copy x bytes from src to dst -000A72 1 A0 00 ldy #0 ; incrementing path length and dst -000A74 1 B1 06 loop: lda (src),y -000A76 1 91 08 sta (dst),y -000A78 1 C8 iny -000A79 1 EE 04 09 inc pathname::length -000A7C 1 CA dex -000A7D 1 D0 F5 bne loop -000A7F 1 98 tya -000A80 1 18 clc -000A81 1 65 08 adc dst -000A83 1 85 08 sta dst -000A85 1 90 02 bcc end -000A87 1 E6 09 inc dst+1 -000A89 1 60 end: rts -000A8A 1 .endproc -000A8A 1 -000A8A 1 .endproc -000A8A 1 -000A8A 1 .proc open_file_and_init_window -000A8A 1 A9 00 lda #0 -000A8C 1 8D 6F 09 sta fixed_mode_flag -000A8F 1 -000A8F 1 ;; copy bytes (length at $8801) from $8802 to $10FF ??? -000A8F 1 ;; length is $7f in tests -000A8F 1 AE 01 88 ldx $8801 -000A92 1 8D 04 C0 sta RAMWRTOFF -000A95 1 BD 02 88 loop: lda $8802,x -000A98 1 9D FF 10 sta L10FD+2,x -000A9B 1 CA dex -000A9C 1 D0 F7 bne loop -000A9E 1 8D 05 C0 sta RAMWRTON -000AA1 1 -000AA1 1 ;; open file, get length -000AA1 1 20 63 08 jsr open_file -000AA4 1 AD EF 08 lda open_params::ref_num -000AA7 1 8D F1 08 sta read_params::ref_num -000AAA 1 8D FE 08 sta set_mark_params::ref_num -000AAD 1 8D F9 08 sta get_eof_params::ref_num -000AB0 1 8D 03 09 sta close_params::ref_num -000AB3 1 20 89 08 jsr get_file_eof -000AB6 1 -000AB6 1 ;; create window -000AB6 1 20 00 40 38 A2D_CALL A2D_CREATE_WINDOW, window_params -000ABA 1 94 09 -000ABC 1 20 00 40 04 A2D_CALL A2D_TEXT_BOX1, text_box -000AC0 1 A8 09 -000AC2 1 20 88 10 jsr calc_window_size -000AC5 1 20 98 11 jsr calc_and_draw_mode -000AC8 1 20 30 0E jsr draw_content -000ACB 1 20 00 40 2B A2D_CALL $2B, 0 ; ??? -000ACF 1 00 00 -000AD1 1 ;; fall through -000AD1 1 .endproc -000AD1 1 -000AD1 1 ;;; ================================================== -000AD1 1 ;;; Main Input Loop -000AD1 1 -000AD1 1 input_loop: -000AD1 1 20 00 40 2A A2D_CALL A2D_GET_BUTTON, button_state -000AD5 1 70 09 -000AD7 1 AD 70 09 lda button_state -000ADA 1 C9 01 cmp #1 ; was clicked? -000ADC 1 D0 F3 bne input_loop ; nope, keep waiting -000ADE 1 -000ADE 1 20 00 40 40 A2D_CALL A2D_GET_MOUSE, mouse_params -000AE2 1 71 09 -000AE4 1 AD 76 09 lda mouse_params::win ; in our window? -000AE7 1 C9 64 cmp #window_id -000AE9 1 D0 E6 bne input_loop -000AEB 1 -000AEB 1 ;; which part of the window? -000AEB 1 AD 75 09 lda mouse_params::elem -000AEE 1 C9 05 cmp #A2D_ELEM_CLOSE -000AF0 1 F0 2F beq on_close_click -000AF2 1 -000AF2 1 ;; title and resize clicks need mouse location -000AF2 1 AE 71 09 ldx mouse_params::xcoord -000AF5 1 8E 78 09 stx resize_drag_params::xcoord -000AF8 1 8E 80 09 stx query_client_params::xcoord -000AFB 1 AE 72 09 ldx mouse_params::xcoord+1 -000AFE 1 8E 79 09 stx resize_drag_params::xcoord+1 -000B01 1 8E 81 09 stx query_client_params::xcoord+1 -000B04 1 AE 73 09 ldx mouse_params::ycoord -000B07 1 8E 7A 09 stx resize_drag_params::ycoord -000B0A 1 8E 82 09 stx query_client_params::ycoord -000B0D 1 -000B0D 1 C9 03 cmp #A2D_ELEM_TITLE -000B0F 1 F0 0A beq title -000B11 1 C9 04 cmp #A2D_ELEM_RESIZE ; not enabled, so this will never match -000B13 1 F0 BC beq input_loop -000B15 1 20 B4 0B jsr on_client_click -000B18 1 4C D1 0A jmp input_loop -000B1B 1 -000B1B 1 20 3A 11 title: jsr on_title_bar_click -000B1E 1 4C D1 0A jmp input_loop -000B21 1 -000B21 1 ;;; ================================================== -000B21 1 ;;; Close Button -000B21 1 -000B21 1 .proc on_close_click -000B21 1 20 00 40 43 A2D_CALL A2D_BTN_CLICK, close_btn_params ; wait to see if the click completes -000B25 1 7D 09 -000B27 1 AD 7D 09 lda close_btn_params::state ; did click complete? -000B2A 1 F0 A5 beq input_loop ; nope -000B2C 1 20 AF 08 jsr close_file -000B2F 1 20 00 40 39 A2D_CALL A2D_DESTROY_WINDOW, window_params -000B33 1 94 09 -000B35 1 -000B35 1 20 00 8E jsr UNKNOWN_CALL ; ??? -000B38 1 0C .byte $0C -000B39 1 00 00 .addr 0 -000B3B 1 -000B3B 1 60 rts ; exits input loop -000B3C 1 .endproc -000B3C 1 -000B3C 1 ;;; ================================================== -000B3C 1 ;;; Resize Handle -000B3C 1 -000B3C 1 ;;; This is dead code (no resize handle!) and may be buggy -000B3C 1 .proc on_resize_click -000B3C 1 20 00 40 45 A2D_CALL A2D_DRAG_RESIZE, resize_drag_params -000B40 1 77 09 -000B42 1 20 FD 10 jsr L10FD ; call $4015 on main -000B45 1 20 88 10 jsr calc_window_size -000B48 1 -000B48 1 max_width := default_width -000B48 1 A9 02 lda #>max_width -000B4A 1 CD B5 09 cmp text_box::width+1 -000B4D 1 D0 05 bne :+ -000B4F 1 A9 00 lda #max_width -000B5D 1 8D B5 09 sta text_box::width+1 -000B60 1 38 sec -000B61 1 AD B4 09 lda text_box::width -000B64 1 ED 61 09 sbc window_width -000B67 1 8D B0 09 sta text_box::hoffset -000B6A 1 AD B5 09 lda text_box::width+1 -000B6D 1 ED 62 09 sbc window_width+1 -000B70 1 8D B1 09 sta text_box::hoffset+1 -000B73 1 AD 98 09 wider: lda window_params::hscroll -000B76 1 AE 61 09 ldx window_width -000B79 1 E0 00 cpx #max_width -000B82 1 D0 05 bne enable -000B84 1 29 FE and #(A2D_CWS_SCROLL_TRACK ^ $FF) ; disable scroll -000B86 1 4C 8B 0B jmp skip -000B89 1 -000B89 1 09 01 enable: ora #A2D_CWS_SCROLL_TRACK ; enable scroll -000B8B 1 8D 98 09 skip: sta window_params::hscroll -000B8E 1 38 sec -000B8F 1 A9 00 lda #max_width -000B98 1 ED 62 09 sbc window_width+1 -000B9B 1 85 07 sta $07 -000B9D 1 20 DF 10 jsr div_by_16 -000BA0 1 8D 87 09 sta resize_window_params::L0987 -000BA3 1 A9 02 lda #$02 -000BA5 1 8D 86 09 sta resize_window_params::L0986 -000BA8 1 20 00 40 49 A2D_CALL A2D_RESIZE_WINDOW, resize_window_params ; change to clamped size ??? -000BAC 1 86 09 -000BAE 1 20 98 11 jsr calc_and_draw_mode -000BB1 1 4C F9 0D jmp finish_resize -000BB4 1 .endproc -000BB4 1 -000BB4 1 ;;; ================================================== -000BB4 1 ;;; Client Area -000BB4 1 -000BB4 1 ;;; Non-title (client) area clicked -000BB4 1 .proc on_client_click -000BB4 1 ;; On one of the scroll bars? -000BB4 1 20 00 40 48 A2D_CALL A2D_QUERY_CLIENT, query_client_params -000BB8 1 80 09 -000BBA 1 AD 84 09 lda query_client_params::part -000BBD 1 C9 01 cmp #A2D_VSCROLL -000BBF 1 F0 08 beq on_vscroll_click -000BC1 1 C9 02 cmp #A2D_HSCROLL -000BC3 1 D0 03 bne end -000BC5 1 4C 95 0C jmp on_hscroll_click -000BC8 1 60 end: rts -000BC9 1 .endproc -000BC9 1 -000BC9 1 ;;; ================================================== -000BC9 1 ;;; Vertical Scroll Bar -000BC9 1 -000BC9 1 .proc on_vscroll_click -000BC9 1 A9 01 lda #A2D_VSCROLL -000BCB 1 8D 8A 09 sta thumb_drag_params::type -000BCE 1 8D 88 09 sta update_scroll_params::type -000BD1 1 AD 85 09 lda query_client_params::scroll -000BD4 1 C9 05 cmp #A2D_SCROLL_PART_THUMB -000BD6 1 F0 14 beq on_vscroll_thumb_click -000BD8 1 C9 04 cmp #A2D_SCROLL_PART_BELOW -000BDA 1 F0 62 beq on_vscroll_below_click -000BDC 1 C9 03 cmp #A2D_SCROLL_PART_ABOVE -000BDE 1 F0 31 beq on_vscroll_above_click -000BE0 1 C9 01 cmp #A2D_SCROLL_PART_UP -000BE2 1 F0 49 beq on_vscroll_up_click -000BE4 1 C9 02 cmp #A2D_SCROLL_PART_DOWN -000BE6 1 D0 03 bne end -000BE8 1 4C 60 0C jmp on_vscroll_down_click -000BEB 1 60 end: rts -000BEC 1 .endproc -000BEC 1 -000BEC 1 .proc on_vscroll_thumb_click -000BEC 1 20 39 0D jsr do_thumb_drag -000BEF 1 AD 90 09 lda thumb_drag_params::moved -000BF2 1 F0 1C beq end -000BF4 1 AD 8F 09 lda thumb_drag_params::pos -000BF7 1 8D 89 09 sta update_scroll_params::pos -000BFA 1 20 7C 0D jsr update_voffset -000BFD 1 20 ED 0D jsr update_vscroll -000C00 1 20 30 0E jsr draw_content -000C03 1 AD 47 09 lda L0947 -000C06 1 F0 08 beq end -000C08 1 AD 49 09 lda L0949 -000C0B 1 D0 03 bne end -000C0D 1 20 1D 0E jsr L0E1D -000C10 1 60 end: rts -000C11 1 .endproc -000C11 1 -000C11 1 .proc on_vscroll_above_click -000C11 1 AD 9D 09 loop: lda window_params::vscroll_pos -000C14 1 F0 16 beq end -000C16 1 20 84 0C jsr calc_track_scroll_delta -000C19 1 38 sec -000C1A 1 AD 9D 09 lda window_params::vscroll_pos -000C1D 1 ED 6E 09 sbc track_scroll_delta -000C20 1 B0 02 bcs store -000C22 1 A9 00 lda #0 ; underflow -000C24 1 8D 89 09 store: sta update_scroll_params::pos -000C27 1 20 73 0C jsr update_scroll_pos -000C2A 1 90 E5 bcc loop ; repeat while button down -000C2C 1 60 end: rts -000C2D 1 .endproc -000C2D 1 -000C2D 1 .proc on_vscroll_up_click -000C2D 1 AD 9D 09 loop : lda window_params::vscroll_pos -000C30 1 F0 0B beq end -000C32 1 38 sec -000C33 1 E9 01 sbc #1 -000C35 1 8D 89 09 sta update_scroll_params::pos -000C38 1 20 73 0C jsr update_scroll_pos -000C3B 1 90 F0 bcc loop ; repeat while button down -000C3D 1 60 end: rts -000C3E 1 .endproc -000C3E 1 -000C3E 1 vscroll_max := $FA -000C3E 1 -000C3E 1 .proc on_vscroll_below_click -000C3E 1 AD 9D 09 loop: lda window_params::vscroll_pos -000C41 1 C9 FA cmp #vscroll_max ; pos == max ? -000C43 1 F0 1A beq end -000C45 1 20 84 0C jsr calc_track_scroll_delta -000C48 1 18 clc -000C49 1 AD 9D 09 lda window_params::vscroll_pos -000C4C 1 6D 6E 09 adc track_scroll_delta ; pos + delta -000C4F 1 B0 04 bcs overflow -000C51 1 C9 FB cmp #vscroll_max+1 ; > max ? -000C53 1 90 02 bcc store ; nope, it's good -000C55 1 overflow: -000C55 1 A9 FA lda #vscroll_max ; set to max -000C57 1 8D 89 09 store: sta update_scroll_params::pos -000C5A 1 20 73 0C jsr update_scroll_pos -000C5D 1 90 DF bcc loop ; repeat while button down -000C5F 1 60 end: rts -000C60 1 .endproc -000C60 1 -000C60 1 .proc on_vscroll_down_click -000C60 1 AD 9D 09 loop: lda window_params::vscroll_pos -000C63 1 C9 FA cmp #vscroll_max -000C65 1 F0 0B beq end -000C67 1 18 clc -000C68 1 69 01 adc #1 -000C6A 1 8D 89 09 sta update_scroll_params::pos -000C6D 1 20 73 0C jsr update_scroll_pos -000C70 1 90 EE bcc loop ; repeat while button down -000C72 1 60 end: rts -000C73 1 .endproc -000C73 1 -000C73 1 .proc update_scroll_pos ; Returns with carry set if mouse released -000C73 1 20 7C 0D jsr update_voffset -000C76 1 20 ED 0D jsr update_vscroll -000C79 1 20 30 0E jsr draw_content -000C7C 1 20 52 0D jsr was_button_released -000C7F 1 18 clc -000C80 1 D0 01 bne end -000C82 1 38 sec -000C83 1 60 end: rts -000C84 1 .endproc -000C84 1 -000C84 1 .proc calc_track_scroll_delta -000C84 1 AD 63 09 lda window_height ; ceil(??? / 50) -000C87 1 A2 00 ldx #0 -000C89 1 E8 loop: inx -000C8A 1 38 sec -000C8B 1 E9 32 sbc #50 -000C8D 1 C9 32 cmp #50 -000C8F 1 B0 F8 bcs loop -000C91 1 8E 6E 09 stx track_scroll_delta -000C94 1 60 rts -000C95 1 .endproc -000C95 1 -000C95 1 ;;; ================================================== -000C95 1 ;;; Horizontal Scroll Bar -000C95 1 ;;; (Unused in STF DA, so most of this is speculation) -000C95 1 -000C95 1 .proc on_hscroll_click -000C95 1 A9 02 lda #A2D_HSCROLL -000C97 1 8D 8A 09 sta thumb_drag_params::type -000C9A 1 8D 88 09 sta update_scroll_params::type -000C9D 1 AD 85 09 lda query_client_params::scroll -000CA0 1 C9 05 cmp #A2D_SCROLL_PART_THUMB -000CA2 1 F0 11 beq on_hscroll_thumb_click -000CA4 1 C9 04 cmp #A2D_SCROLL_PART_AFTER -000CA6 1 F0 3F beq on_hscroll_after_click -000CA8 1 C9 03 cmp #A2D_SCROLL_PART_BEFORE -000CAA 1 F0 43 beq on_hscroll_before_click -000CAC 1 C9 01 cmp #A2D_SCROLL_PART_LEFT -000CAE 1 F0 4E beq on_hscroll_left_click -000CB0 1 C9 02 cmp #A2D_SCROLL_PART_RIGHT -000CB2 1 F0 42 beq on_hscroll_right_click -000CB4 1 60 rts -000CB5 1 .endproc -000CB5 1 -000CB5 1 .proc on_hscroll_thumb_click -000CB5 1 20 39 0D jsr do_thumb_drag -000CB8 1 AD 90 09 lda thumb_drag_params::moved -000CBB 1 F0 29 beq end -000CBD 1 AD 8F 09 lda thumb_drag_params::pos -000CC0 1 20 EC 10 jsr mul_by_16 -000CC3 1 A5 06 lda $06 -000CC5 1 8D B0 09 sta text_box::hoffset -000CC8 1 A5 07 lda $07 -000CCA 1 8D B1 09 sta text_box::hoffset+1 -000CCD 1 18 clc -000CCE 1 AD B0 09 lda text_box::hoffset -000CD1 1 6D 61 09 adc window_width -000CD4 1 8D B4 09 sta text_box::width -000CD7 1 AD B1 09 lda text_box::hoffset+1 -000CDA 1 6D 62 09 adc window_width+1 -000CDD 1 8D B5 09 sta text_box::width+1 -000CE0 1 20 D1 0D jsr update_hscroll -000CE3 1 20 30 0E jsr draw_content -000CE6 1 60 end: rts -000CE7 1 .endproc -000CE7 1 -000CE7 1 .proc on_hscroll_after_click -000CE7 1 A2 02 ldx #2 -000CE9 1 AD 9A 09 lda window_params::hscroll_max -000CEC 1 4C 02 0D jmp hscroll_common -000CEF 1 .endproc -000CEF 1 -000CEF 1 .proc on_hscroll_before_click -000CEF 1 A2 FE ldx #254 -000CF1 1 A9 00 lda #0 -000CF3 1 4C 02 0D jmp hscroll_common -000CF6 1 .endproc -000CF6 1 -000CF6 1 .proc on_hscroll_right_click -000CF6 1 A2 01 ldx #1 -000CF8 1 AD 9A 09 lda window_params::hscroll_max -000CFB 1 4C 02 0D jmp hscroll_common -000CFE 1 .endproc -000CFE 1 -000CFE 1 .proc on_hscroll_left_click -000CFE 1 A2 FF ldx #255 -000D00 1 A9 00 lda #0 -000D02 1 ;; fall through -000D02 1 .endproc -000D02 1 -000D02 1 .proc hscroll_common -000D02 1 8D 0C 0D sta compare+1 -000D05 1 8E 15 0D stx delta+1 -000D08 1 AD 9B 09 loop: lda window_params::hscroll_pos -000D0B 1 C9 0A compare:cmp #$0A ; self-modified -000D0D 1 D0 01 bne continue -000D0F 1 60 rts -000D10 1 continue: -000D10 1 18 clc -000D11 1 AD 9B 09 lda window_params::hscroll_pos -000D14 1 69 01 delta: adc #1 ; self-modified -000D16 1 30 0D bmi overflow -000D18 1 CD 9A 09 cmp window_params::hscroll_max -000D1B 1 F0 0A beq store -000D1D 1 90 08 bcc store -000D1F 1 AD 9A 09 lda window_params::hscroll_max -000D22 1 4C 27 0D jmp store -000D25 1 overflow: -000D25 1 A9 00 lda #0 -000D27 1 8D 9B 09 store: sta window_params::hscroll_pos -000D2A 1 20 5E 0D jsr L0D5E -000D2D 1 20 D1 0D jsr update_hscroll -000D30 1 20 30 0E jsr draw_content -000D33 1 20 52 0D jsr was_button_released -000D36 1 D0 D0 bne loop -000D38 1 60 rts -000D39 1 .endproc -000D39 1 -000D39 1 ;;; ================================================== -000D39 1 ;;; UI Helpers -000D39 1 -000D39 1 ;; Used at start of thumb drag -000D39 1 .proc do_thumb_drag -000D39 1 AD 71 09 lda mouse_params::xcoord -000D3C 1 8D 8B 09 sta thumb_drag_params::xcoord -000D3F 1 AD 72 09 lda mouse_params::xcoord+1 -000D42 1 8D 8C 09 sta thumb_drag_params::xcoord+1 -000D45 1 AD 73 09 lda mouse_params::ycoord -000D48 1 8D 8D 09 sta thumb_drag_params::ycoord -000D4B 1 20 00 40 4A A2D_CALL A2D_DRAG_SCROLL, thumb_drag_params -000D4F 1 8A 09 -000D51 1 60 rts -000D52 1 .endproc -000D52 1 -000D52 1 ;;; Checks button state; z clear if button was released, set otherwise -000D52 1 .proc was_button_released -000D52 1 20 00 40 2A A2D_CALL A2D_GET_BUTTON, button_state -000D56 1 70 09 -000D58 1 AD 70 09 lda button_state -000D5B 1 C9 02 cmp #2 -000D5D 1 60 rts -000D5E 1 .endproc -000D5E 1 -000D5E 1 ;;; only used from hscroll code? -000D5E 1 .proc L0D5E -000D5E 1 AD 9B 09 lda window_params::hscroll_pos -000D61 1 20 EC 10 jsr mul_by_16 -000D64 1 18 clc -000D65 1 A5 06 lda $06 -000D67 1 8D B0 09 sta text_box::hoffset -000D6A 1 6D 61 09 adc window_width -000D6D 1 8D B4 09 sta text_box::width -000D70 1 A5 07 lda $07 -000D72 1 8D B1 09 sta text_box::hoffset+1 -000D75 1 6D 62 09 adc window_width+1 -000D78 1 8D B5 09 sta text_box::width+1 -000D7B 1 60 rts -000D7C 1 .endproc -000D7C 1 -000D7C 1 .proc update_voffset -000D7C 1 A9 00 lda #0 -000D7E 1 8D B2 09 sta text_box::voffset -000D81 1 8D B3 09 sta text_box::voffset+1 -000D84 1 AE 89 09 ldx update_scroll_params::pos -000D87 1 F0 12 loop: beq L0D9B -000D89 1 18 clc -000D8A 1 AD B2 09 lda text_box::voffset -000D8D 1 69 32 adc #50 -000D8F 1 8D B2 09 sta text_box::voffset -000D92 1 90 03 bcc :+ -000D94 1 EE B3 09 inc text_box::voffset+1 -000D97 1 CA : dex -000D98 1 4C 87 0D jmp loop -000D9B 1 .endproc -000D9B 1 -000D9B 1 .proc L0D9B ; ?? part of vscroll -000D9B 1 ;; increase text_box height to cover full window (offset + height) -000D9B 1 18 clc -000D9C 1 AD B2 09 lda text_box::voffset -000D9F 1 6D 63 09 adc window_height -000DA2 1 8D B6 09 sta text_box::height -000DA5 1 AD B3 09 lda text_box::voffset+1 -000DA8 1 6D 64 09 adc window_height+1 -000DAB 1 8D B7 09 sta text_box::height+1 -000DAE 1 20 A5 10 jsr L10A5 -000DB1 1 A9 00 lda #0 -000DB3 1 8D 6A 09 sta L096A -000DB6 1 8D 6B 09 sta L096B -000DB9 1 AE 89 09 ldx update_scroll_params::pos -000DBC 1 F0 12 loop: beq end -000DBE 1 18 clc -000DBF 1 AD 6A 09 lda L096A -000DC2 1 69 05 adc #5 -000DC4 1 8D 6A 09 sta L096A -000DC7 1 90 03 bcc :+ -000DC9 1 EE 6B 09 inc L096B -000DCC 1 CA : dex -000DCD 1 4C BC 0D jmp loop -000DD0 1 60 end: rts -000DD1 1 .endproc -000DD1 1 -000DD1 1 .proc update_hscroll -000DD1 1 A9 02 lda #2 -000DD3 1 8D 88 09 sta update_scroll_params::type -000DD6 1 AD B0 09 lda text_box::hoffset -000DD9 1 85 06 sta $06 -000DDB 1 AD B1 09 lda text_box::hoffset+1 -000DDE 1 85 07 sta $07 -000DE0 1 20 DF 10 jsr div_by_16 -000DE3 1 8D 89 09 sta update_scroll_params::pos -000DE6 1 20 00 40 4B A2D_CALL A2D_UPDATE_SCROLL, update_scroll_params -000DEA 1 88 09 -000DEC 1 60 rts -000DED 1 .endproc -000DED 1 -000DED 1 .proc update_vscroll ; update_scroll_params::pos set by caller -000DED 1 A9 01 lda #1 -000DEF 1 8D 88 09 sta update_scroll_params::type -000DF2 1 20 00 40 4B A2D_CALL A2D_UPDATE_SCROLL, update_scroll_params -000DF6 1 88 09 -000DF8 1 60 rts -000DF9 1 .endproc -000DF9 1 -000DF9 1 .proc finish_resize ; only called from dead code -000DF9 1 20 00 8E jsr UNKNOWN_CALL -000DFC 1 0C .byte $0C -000DFD 1 00 00 .addr 0 -000DFF 1 20 00 40 04 A2D_CALL A2D_TEXT_BOX1, text_box -000E03 1 A8 09 -000E05 1 AD 98 09 lda window_params::hscroll -000E08 1 6A ror a ; check if low bit (track enabled) is set -000E09 1 90 03 bcc :+ -000E0B 1 20 D1 0D jsr update_hscroll -000E0E 1 AD 9D 09 : lda window_params::vscroll_pos -000E11 1 8D 89 09 sta update_scroll_params::pos -000E14 1 20 ED 0D jsr update_vscroll -000E17 1 20 30 0E jsr draw_content -000E1A 1 4C D1 0A jmp input_loop -000E1D 1 .endproc -000E1D 1 -000E1D 1 ;; called on scroll -000E1D 1 20 00 40 08 L0E1D: A2D_CALL A2D_SET_PATTERN, white_pattern -000E21 1 52 09 -000E23 1 20 00 40 11 A2D_CALL A2D_CLEAR_BOX, text_box::hoffset -000E27 1 B0 09 -000E29 1 20 00 40 08 A2D_CALL A2D_SET_PATTERN, black_pattern -000E2D 1 4A 09 -000E2F 1 60 rts -000E30 1 -000E30 1 ;;; ================================================== -000E30 1 ;;; Content Rendering -000E30 1 -000E30 1 .proc draw_content -000E30 1 A9 00 lda #0 -000E32 1 8D 49 09 sta L0949 -000E35 1 20 29 11 jsr L1129 -000E38 1 20 9C 08 jsr set_file_mark -000E3B 1 A9 00 lda #default_buffer -000E44 1 8D F3 08 sta read_params::buffer+1 -000E47 1 85 07 sta $07 -000E49 1 A9 00 lda #$00 -000E4B 1 8D 45 09 sta L0945 -000E4E 1 8D 46 09 sta L0946 -000E51 1 8D 47 09 sta L0947 -000E54 1 8D 60 09 sta line_pos::base+1 -000E57 1 8D 6C 09 sta L096C -000E5A 1 8D 6D 09 sta L096D -000E5D 1 8D 48 09 sta L0948 -000E60 1 A9 0A lda #$0A ; line spacing = 10 -000E62 1 8D 5F 09 sta line_pos::base -000E65 1 20 DB 0E jsr L0EDB -000E68 1 AD 6D 09 L0E68: lda L096D -000E6B 1 CD 6B 09 cmp L096B -000E6E 1 D0 0E bne L0E7E -000E70 1 AD 6C 09 lda L096C -000E73 1 CD 6A 09 cmp L096A -000E76 1 D0 06 bne L0E7E -000E78 1 20 1D 0E jsr L0E1D -000E7B 1 EE 48 09 inc L0948 -000E7E 1 20 00 40 0E L0E7E: A2D_CALL A2D_SET_TEXT_POS, line_pos -000E82 1 5D 09 -000E84 1 38 sec -000E85 1 A9 FA lda #250 -000E87 1 ED 5D 09 sbc line_pos::left -000E8A 1 8D 5B 09 sta L095B -000E8D 1 A9 01 lda #1 -000E8F 1 ED 5E 09 sbc line_pos::left+1 -000E92 1 8D 5C 09 sta L095C -000E95 1 20 F3 0E jsr L0EF3 -000E98 1 B0 3D bcs L0ED7 -000E9A 1 18 clc -000E9B 1 AD 93 09 lda text_string::len -000E9E 1 65 06 adc $06 -000EA0 1 85 06 sta $06 -000EA2 1 90 02 bcc L0EA6 -000EA4 1 E6 07 inc $07 -000EA6 1 AD 5A 09 L0EA6: lda L095A -000EA9 1 D0 BD bne L0E68 -000EAB 1 18 clc -000EAC 1 AD 5F 09 lda line_pos::base -000EAF 1 69 0A adc #$0A ; line spacing = 10 -000EB1 1 8D 5F 09 sta line_pos::base -000EB4 1 90 03 bcc L0EB9 -000EB6 1 EE 60 09 inc line_pos::base+1 -000EB9 1 20 DB 0E L0EB9: jsr L0EDB -000EBC 1 AD 6C 09 lda L096C -000EBF 1 CD 68 09 cmp L0968 -000EC2 1 D0 08 bne L0ECC -000EC4 1 AD 6D 09 lda L096D -000EC7 1 CD 69 09 cmp L0969 -000ECA 1 F0 0B beq L0ED7 -000ECC 1 EE 6C 09 L0ECC: inc L096C -000ECF 1 D0 03 bne L0ED4 -000ED1 1 EE 6D 09 inc L096D -000ED4 1 4C 68 0E L0ED4: jmp L0E68 -000ED7 1 -000ED7 1 20 09 11 L0ED7: jsr L1109 -000EDA 1 60 rts -000EDB 1 .endproc -000EDB 1 -000EDB 1 .proc L0EDB ; ??? -000EDB 1 A9 FA lda #250 -000EDD 1 8D 5B 09 sta L095B -000EE0 1 A9 01 lda #1 -000EE2 1 8D 5C 09 sta L095C -000EE5 1 A9 03 lda #3 -000EE7 1 8D 5D 09 sta line_pos::left -000EEA 1 A9 00 lda #0 -000EEC 1 8D 5E 09 sta line_pos::left+1 -000EEF 1 8D 5A 09 sta L095A -000EF2 1 60 rts -000EF3 1 .endproc -000EF3 1 -000EF3 1 A9 FF L0EF3: lda #$FF -000EF5 1 8D 9B 0F sta L0F9B -000EF8 1 A9 00 lda #$00 -000EFA 1 8D 9C 0F sta L0F9C -000EFD 1 8D 9D 0F sta L0F9D -000F00 1 8D 5A 09 sta L095A -000F03 1 8D 93 09 sta text_string::len -000F06 1 A5 06 lda $06 -000F08 1 8D 91 09 sta text_string::addr -000F0B 1 A5 07 lda $07 -000F0D 1 8D 92 09 sta text_string::addr+1 -000F10 1 AD 45 09 L0F10: lda L0945 -000F13 1 D0 0D bne L0F22 -000F15 1 AD 47 09 lda L0947 -000F18 1 F0 05 beq L0F1F -000F1A 1 20 F6 0F jsr L0FF6 -000F1D 1 38 sec -000F1E 1 60 rts -000F1F 1 -000F1F 1 20 0C 10 L0F1F: jsr L100C -000F22 1 AC 93 09 L0F22: ldy text_string::len -000F25 1 B1 06 lda ($06),y -000F27 1 29 7F and #$7F ; clear high bit -000F29 1 91 06 sta ($06),y -000F2B 1 EE 45 09 inc L0945 -000F2E 1 C9 0D cmp #$0D ; return character -000F30 1 F0 54 beq L0F86 -000F32 1 C9 20 cmp #' ' ; space character -000F34 1 D0 0B bne L0F41 -000F36 1 8C 9B 0F sty L0F9B -000F39 1 48 pha -000F3A 1 AD 45 09 lda L0945 -000F3D 1 8D 46 09 sta L0946 -000F40 1 68 pla -000F41 1 C9 09 L0F41: cmp #$09 -000F43 1 D0 03 bne L0F48 -000F45 1 4C 9E 0F jmp L0F9E -000F48 1 -000F48 1 A8 L0F48: tay -000F49 1 B9 03 88 lda $8803,y -000F4C 1 18 clc -000F4D 1 6D 9C 0F adc L0F9C -000F50 1 8D 9C 0F sta L0F9C -000F53 1 90 03 bcc L0F58 -000F55 1 EE 9D 0F inc L0F9D -000F58 1 AD 5C 09 L0F58: lda L095C -000F5B 1 CD 9D 0F cmp L0F9D -000F5E 1 D0 06 bne L0F66 -000F60 1 AD 5B 09 lda L095B -000F63 1 CD 9C 0F cmp L0F9C -000F66 1 90 06 L0F66: bcc L0F6E -000F68 1 EE 93 09 inc text_string::len -000F6B 1 4C 10 0F jmp L0F10 -000F6E 1 -000F6E 1 A9 00 L0F6E: lda #0 -000F70 1 8D 5A 09 sta L095A -000F73 1 AD 9B 0F lda L0F9B -000F76 1 C9 FF cmp #$FF -000F78 1 F0 09 beq L0F83 -000F7A 1 8D 93 09 sta text_string::len -000F7D 1 AD 46 09 lda L0946 -000F80 1 8D 45 09 sta L0945 -000F83 1 EE 93 09 L0F83: inc text_string::len -000F86 1 20 F6 0F L0F86: jsr L0FF6 -000F89 1 AC 93 09 ldy text_string::len -000F8C 1 B1 06 lda ($06),y -000F8E 1 C9 09 cmp #$09 ; tab character? -000F90 1 F0 04 beq L0F96 -000F92 1 C9 0D cmp #$0D ; return character -000F94 1 D0 03 bne L0F99 -000F96 1 EE 93 09 L0F96: inc text_string::len -000F99 1 18 L0F99: clc -000F9A 1 60 rts -000F9B 1 -000F9B 1 00 L0F9B: .byte 0 -000F9C 1 00 L0F9C: .byte 0 -000F9D 1 00 L0F9D: .byte 0 -000F9E 1 .proc L0F9E ; ??? -000F9E 1 A9 01 lda #1 -000FA0 1 8D 5A 09 sta L095A -000FA3 1 18 clc -000FA4 1 AD 9C 0F lda L0F9C -000FA7 1 6D 5D 09 adc line_pos::left -000FAA 1 8D 5D 09 sta line_pos::left -000FAD 1 AD 9D 0F lda L0F9D -000FB0 1 6D 5E 09 adc line_pos::left+1 -000FB3 1 8D 5E 09 sta line_pos::left+1 -000FB6 1 A2 00 ldx #0 -000FB8 1 BD E9 0F loop: lda times70+1,x -000FBB 1 CD 5E 09 cmp line_pos::left+1 -000FBE 1 D0 06 bne L0FC6 -000FC0 1 BD E8 0F lda times70,x -000FC3 1 CD 5D 09 cmp line_pos::left -000FC6 1 B0 09 L0FC6: bcs L0FD1 -000FC8 1 E8 inx -000FC9 1 E8 inx -000FCA 1 E0 0E cpx #14 -000FCC 1 F0 12 beq done -000FCE 1 4C B8 0F jmp loop -000FD1 1 BD E8 0F L0FD1: lda times70,x -000FD4 1 8D 5D 09 sta line_pos::left -000FD7 1 BD E9 0F lda times70+1,x -000FDA 1 8D 5E 09 sta line_pos::left+1 -000FDD 1 4C 86 0F jmp L0F86 -000FE0 1 A9 00 done: lda #0 -000FE2 1 8D 5A 09 sta L095A -000FE5 1 4C 86 0F jmp L0F86 -000FE8 1 -000FE8 1 46 00 times70:.word 70 -000FEA 1 8C 00 .word 140 -000FEC 1 D2 00 .word 210 -000FEE 1 18 01 .word 280 -000FF0 1 5E 01 .word 350 -000FF2 1 A4 01 .word 420 -000FF4 1 EA 01 .word 490 -000FF6 1 .endproc -000FF6 1 -000FF6 1 ;;; Draws a line of content -000FF6 1 AD 48 09 L0FF6: lda L0948 -000FF9 1 F0 10 beq L100B -000FFB 1 AD 93 09 lda text_string::len -000FFE 1 F0 0B beq L100B -001000 1 20 00 40 19 A2D_CALL A2D_DRAW_TEXT, text_string -001004 1 91 09 -001006 1 A9 01 lda #1 -001008 1 8D 49 09 sta L0949 -00100B 1 60 L100B: rts -00100C 1 -00100C 1 AD 92 09 L100C: lda text_string::addr+1 -00100F 1 C9 12 cmp #$12 ; #>default_buffer? -001011 1 F0 18 beq L102B -001013 1 -001013 1 ;; copy a page of characters from $1300 to the buffer -001013 1 A0 00 ldy #0 -001015 1 B9 00 13 loop: lda $1300,y -001018 1 99 00 12 sta default_buffer,y -00101B 1 C8 iny -00101C 1 D0 F7 bne loop -00101E 1 -00101E 1 CE 92 09 dec text_string::addr+1 -001021 1 AD 91 09 lda text_string::addr -001024 1 85 06 sta $06 -001026 1 AD 92 09 lda text_string::addr+1 -001029 1 85 07 sta $07 -00102B 1 A9 00 L102B: lda #0 -00102D 1 8D 45 09 sta L0945 -001030 1 20 3E 10 jsr L103E -001033 1 AD F3 08 lda read_params::buffer+1 -001036 1 C9 12 cmp #$12 ; #>default_buffer? -001038 1 D0 03 bne L103D -00103A 1 EE F3 08 inc read_params::buffer+1 -00103D 1 60 L103D: rts -00103E 1 -00103E 1 .proc L103E -00103E 1 AD F2 08 lda read_params::buffer -001041 1 8D 52 10 sta store+1 -001044 1 AD F3 08 lda read_params::buffer+1 -001047 1 8D 53 10 sta store+2 -00104A 1 A9 20 lda #$20 -00104C 1 A2 00 ldx #$00 -00104E 1 8D 04 C0 sta RAMWRTOFF -001051 1 9D 00 12 store: sta default_buffer,x ; self-modified -001054 1 E8 inx -001055 1 D0 FA bne store -001057 1 8D 05 C0 sta RAMWRTON -00105A 1 A9 00 lda #$00 -00105C 1 8D 47 09 sta L0947 -00105F 1 20 76 08 jsr read_file -001062 1 48 pha -001063 1 A9 00 lda #$00 -001065 1 85 3C sta STARTLO -001067 1 85 42 sta DESTINATIONLO -001069 1 A9 FF lda #$FF -00106B 1 85 3E sta ENDLO -00106D 1 AD F3 08 lda read_params::buffer+1 -001070 1 85 43 sta DESTINATIONHI -001072 1 85 3D sta STARTHI -001074 1 85 3F sta ENDHI -001076 1 38 sec ; main>aux -001077 1 20 11 C3 jsr AUXMOVE -00107A 1 68 pla -00107B 1 F0 0A beq end -00107D 1 C9 4C cmp #$4C -00107F 1 F0 01 beq done -001081 1 00 brk ; ???? -001082 1 A9 01 done: lda #$01 -001084 1 8D 47 09 sta L0947 -001087 1 60 end: rts -001088 1 .endproc -001088 1 -001088 1 .proc calc_window_size -001088 1 38 sec -001089 1 AD B4 09 lda text_box::width -00108C 1 ED B0 09 sbc text_box::hoffset -00108F 1 8D 61 09 sta window_width -001092 1 AD B5 09 lda text_box::width+1 -001095 1 ED B1 09 sbc text_box::hoffset+1 -001098 1 8D 62 09 sta window_width+1 -00109B 1 -00109B 1 38 sec -00109C 1 AD B6 09 lda text_box::height -00109F 1 ED B2 09 sbc text_box::voffset -0010A2 1 8D 63 09 sta window_height -0010A5 1 ;; fall through -0010A5 1 .endproc -0010A5 1 -0010A5 1 ;; calculate line offset ? -0010A5 1 .proc L10A5 -0010A5 1 AD B6 09 lda text_box::height -0010A8 1 8D 65 09 sta L0965 -0010AB 1 AD B7 09 lda text_box::height+1 -0010AE 1 8D 66 09 sta L0966 -0010B1 1 -0010B1 1 A9 00 lda #0 -0010B3 1 8D 68 09 sta L0968 -0010B6 1 8D 69 09 sta L0969 -0010B9 1 AD 66 09 loop: lda L0966 -0010BC 1 D0 07 bne :+ -0010BE 1 AD 65 09 lda L0965 -0010C1 1 C9 0A cmp #$0A ; line spacing = 10 -0010C3 1 90 19 bcc end -0010C5 1 38 : sec -0010C6 1 AD 65 09 lda L0965 -0010C9 1 E9 0A sbc #$0A ; line spacing = 10 -0010CB 1 8D 65 09 sta L0965 -0010CE 1 B0 03 bcs :+ -0010D0 1 CE 66 09 dec L0966 -0010D3 1 EE 68 09 : inc L0968 -0010D6 1 D0 E1 bne loop -0010D8 1 EE 69 09 inc L0969 -0010DB 1 4C B9 10 jmp loop -0010DE 1 60 end: rts -0010DF 1 .endproc -0010DF 1 -0010DF 1 .proc div_by_16 ; input in $06/$07, output in a -0010DF 1 A2 04 ldx #4 -0010E1 1 18 loop: clc -0010E2 1 66 07 ror $07 -0010E4 1 66 06 ror $06 -0010E6 1 CA dex -0010E7 1 D0 F8 bne loop -0010E9 1 A5 06 lda $06 -0010EB 1 60 rts -0010EC 1 .endproc -0010EC 1 -0010EC 1 .proc mul_by_16 ; input in a, output in $06/$07 -0010EC 1 85 06 sta $06 -0010EE 1 A9 00 lda #0 -0010F0 1 85 07 sta $07 -0010F2 1 A2 04 ldx #4 -0010F4 1 18 loop: clc -0010F5 1 26 06 rol $06 -0010F7 1 26 07 rol $07 -0010F9 1 CA dex -0010FA 1 D0 F8 bne loop -0010FC 1 60 rts -0010FD 1 .endproc -0010FD 1 -0010FD 1 .proc L10FD -0010FD 1 A9 15 lda #JUMP_TABLE_15 -001103 1 85 28 sta call_main_addr+1 -001105 1 20 20 00 jsr call_main_trampoline -001108 1 60 rts -001109 1 .endproc -001109 1 -001109 1 ;;; if fixed mode, do a main->aux copy of a code block ??? -001109 1 .proc L1109 -001109 1 AD 6F 09 lda fixed_mode_flag ; if not fixed (i.e. proportional) -00110C 1 F0 1A beq end ; then exit -00110E 1 -00110E 1 A9 00 lda #$00 ; start := $1100 -001110 1 85 3C sta STARTLO -001112 1 A9 7E lda #$7E -001114 1 85 3E sta ENDLO ; end := $117E -001116 1 A9 11 lda #$11 -001118 1 85 3D sta STARTHI -00111A 1 85 3F sta ENDHI -00111C 1 -00111C 1 dest := $8803 -00111C 1 A9 88 lda #>dest -00111E 1 85 43 sta DESTINATIONHI -001120 1 A9 03 lda #aux -001125 1 20 11 C3 jsr AUXMOVE -001128 1 60 end: rts -001129 1 .endproc -001129 1 -001129 1 .proc L1129 ; ??? -001129 1 AD 6F 09 lda fixed_mode_flag ; if not fixed (i.e. proportional) -00112C 1 F0 0B beq end ; then exit -00112E 1 AE 01 88 ldx $8801 -001131 1 A9 07 lda #7 ; 7 pixels/character -001133 1 9D 02 88 loop: sta $8802,x -001136 1 CA dex -001137 1 D0 FA bne loop -001139 1 60 end: rts -00113A 1 .endproc -00113A 1 -00113A 1 ;;; ================================================== -00113A 1 ;;; Title Bar (Proportional/Fixed mode button) -00113A 1 -00113A 1 .proc on_title_bar_click -00113A 1 AD 72 09 lda mouse_params::xcoord+1 ; mouse x high byte? -00113D 1 CD 85 11 cmp mode_box_left+1 -001140 1 D0 06 bne :+ -001142 1 AD 71 09 lda mouse_params::xcoord -001145 1 CD 84 11 cmp mode_box_left -001148 1 90 19 : bcc ignore -00114A 1 -00114A 1 ;; Toggle the state and redraw -00114A 1 AD 6F 09 lda fixed_mode_flag -00114D 1 F0 09 beq set_flag -00114F 1 CE 6F 09 dec fixed_mode_flag ; clear flag (mode = proportional) -001152 1 20 09 11 jsr L1109 -001155 1 4C 5B 11 jmp redraw -001158 1 -001158 1 set_flag: -001158 1 EE 6F 09 inc fixed_mode_flag ; set flag (mode = fixed) -00115B 1 20 BD 11 redraw: jsr draw_mode -00115E 1 20 30 0E jsr draw_content -001161 1 38 sec ; Click consumed -001162 1 60 rts -001163 1 -001163 1 18 ignore: clc ; Click ignored -001164 1 60 rts -001165 1 .endproc -001165 1 -001165 1 68 11 0D 46 fixed_str: A2D_DEFSTRING "Fixed " -001169 1 69 78 65 64 -00116D 1 20 20 20 20 -001171 1 20 20 20 20 -001175 1 78 11 0C 50 prop_str: A2D_DEFSTRING "Proportional" -001179 1 72 6F 70 6F -00117D 1 72 74 69 6F -001181 1 6E 61 6C -001184 1 label_width := 50 -001184 1 title_bar_height := 12 -001184 1 .proc mode_box ; bounding box for mode label -001184 1 00 00 left: .word 0 -001186 1 00 00 top: .word 0 -001188 1 00 20 .word $2000 ; ?? -00118A 1 80 00 .word $80 ; ?? -00118C 1 00 00 hoffset:.word 0 -00118E 1 00 00 voffset:.word 0 -001190 1 50 00 width: .word 80 -001192 1 0A 00 height: .word 10 -001194 1 .endproc -001194 1 mode_box_left := mode_box::left ; forward refs to mode_box::left don't work? -001194 1 ;; https://github.com/cc65/cc65/issues/479 -001194 1 -001194 1 .proc mode_pos -001194 1 00 00 left: .word 0 ; horizontal text offset -001196 1 0A 00 base: .word 10 ; vertical text offset (to baseline) -001198 1 .endproc -001198 1 -001198 1 .proc calc_and_draw_mode -001198 1 38 sec -001199 1 AD AA 09 lda text_box::top -00119C 1 E9 0C sbc #title_bar_height -00119E 1 8D 86 11 sta mode_box::top -0011A1 1 18 clc -0011A2 1 AD A8 09 lda text_box::left -0011A5 1 6D 61 09 adc window_width -0011A8 1 48 pha -0011A9 1 AD A9 09 lda text_box::left+1 -0011AC 1 6D 62 09 adc window_width+1 -0011AF 1 AA tax -0011B0 1 38 sec -0011B1 1 68 pla -0011B2 1 E9 32 sbc #label_width -0011BA 1 8D 85 11 sta mode_box::left+1 -0011BD 1 ;; fall through... -0011BD 1 .endproc -0011BD 1 -0011BD 1 .proc draw_mode -0011BD 1 20 00 40 06 A2D_CALL A2D_TEXT_BOX2, mode_box ; guess: setting up draw location ??? -0011C1 1 84 11 -0011C3 1 20 00 40 0E A2D_CALL A2D_SET_TEXT_POS, mode_pos -0011C7 1 94 11 -0011C9 1 AD 6F 09 lda fixed_mode_flag -0011CC 1 F0 09 beq else ; is proportional? -0011CE 1 20 00 40 19 A2D_CALL A2D_DRAW_TEXT, fixed_str -0011D2 1 65 11 -0011D4 1 4C DD 11 jmp endif -0011D7 1 20 00 40 19 else: A2D_CALL A2D_DRAW_TEXT, prop_str -0011DB 1 75 11 -0011DD 1 -0011DD 1 A2 0F endif: ldx #$0F -0011DF 1 BD CE 09 loop: lda default_box,x -0011E2 1 9D A8 09 sta text_box,x -0011E5 1 CA dex -0011E6 1 10 F7 bpl loop -0011E8 1 20 00 40 06 A2D_CALL A2D_TEXT_BOX2, text_box -0011EC 1 A8 09 -0011EE 1 60 rts -0011EF 1 .endproc -0011EF 1 diff --git a/desk.acc/show.text.file/stf.o b/desk.acc/show.text.file/stf.o deleted file mode 100644 index cc57a0afd367872bc1a628c5408e474b97117873..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22899 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

S$wSK*WoB=6*kgJk>}jq^Iy=gKKR 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 diff --git a/desk.acc/show.text.file/show_text_file.bin b/desk.acc/show_text_file.bin similarity index 100% rename from desk.acc/show.text.file/show_text_file.bin rename to desk.acc/show_text_file.bin diff --git a/desk.acc/show.text.file/show_text_file.info b/desk.acc/show_text_file.info similarity index 100% rename from desk.acc/show.text.file/show_text_file.info rename to desk.acc/show_text_file.info diff --git a/desk.acc/show.text.file/stf.s b/desk.acc/show_text_file.s similarity index 99% rename from desk.acc/show.text.file/stf.s rename to desk.acc/show_text_file.s index eb09c5d..3718b7c 100644 --- a/desk.acc/show.text.file/stf.s +++ b/desk.acc/show_text_file.s @@ -1,8 +1,8 @@ .setcpu "65C02" .org $800 - .include "../../inc/prodos.inc" - .include "../../inc/auxmem.inc" + .include "../inc/prodos.inc" + .include "../inc/auxmem.inc" .include "a2d.inc" ;; Big questions: diff --git a/desk.acc/show.text.file/stf b/desk.acc/stf similarity index 100% rename from desk.acc/show.text.file/stf rename to desk.acc/stf