a2d/desk.acc/show_text_file.s

1452 lines
37 KiB
ArmAsm
Raw Normal View History

2017-08-29 03:58:09 +00:00
.setcpu "65C02"
.org $800
2017-09-06 05:19:45 +00:00
.include "apple2.inc"
2017-09-04 19:56:41 +00:00
.include "../inc/prodos.inc"
.include "../inc/auxmem.inc"
.include "a2d.inc"
2017-08-29 03:58:09 +00:00
start: jmp copy2aux
2017-09-01 05:53:07 +00:00
save_stack:.byte 0
;;; Copy $800 through $13FF (the DA) to aux
2017-08-30 02:07:44 +00:00
.proc copy2aux
2017-08-29 03:58:09 +00:00
tsx
2017-09-01 05:53:07 +00:00
stx save_stack
2017-08-29 03:58:09 +00:00
sta RAMWRTON
2017-09-01 05:53:07 +00:00
ldy #0
src: lda start,y ; self-modified
dst: sta start,y ; self-modified
2017-08-29 03:58:09 +00:00
dey
2017-09-01 05:53:07 +00:00
bne src
2017-08-29 03:58:09 +00:00
sta RAMWRTOFF
2017-09-01 05:53:07 +00:00
inc src+2
inc dst+2
2017-08-29 03:58:09 +00:00
sta RAMWRTON
2017-09-01 05:53:07 +00:00
lda dst+2
2017-08-29 03:58:09 +00:00
cmp #$14
2017-09-01 05:53:07 +00:00
bne src
2017-08-30 02:07:44 +00:00
.endproc
2017-09-02 02:35:50 +00:00
call_main_trampoline := $20 ; installed on ZP, turns off auxmem and calls...
call_main_addr := call_main_trampoline+7 ; address patched in here
2017-09-02 02:06:14 +00:00
;;; Copy the following "call_main_template" routine to $20
2017-09-01 05:53:07 +00:00
.scope
2017-08-29 03:58:09 +00:00
sta RAMWRTON
sta RAMRDON
2017-09-02 02:06:14 +00:00
ldx #(call_main_template_end - call_main_template)
loop: lda call_main_template,x
sta call_main_trampoline,x
2017-08-29 03:58:09 +00:00
dex
2017-09-01 05:53:07 +00:00
bpl loop
jmp call_init
.endscope
2017-08-29 03:58:09 +00:00
2017-09-02 02:06:14 +00:00
.proc call_main_template
2017-08-30 02:07:44 +00:00
sta RAMRDOFF
2017-08-29 03:58:09 +00:00
sta RAMWRTOFF
2017-09-02 02:06:14 +00:00
jsr $1000 ; overwritten (in zp version)
2017-08-29 03:58:09 +00:00
sta RAMRDON
sta RAMWRTON
rts
2017-08-30 02:07:44 +00:00
.endproc
2017-09-02 02:35:50 +00:00
call_main_template_end: ; can't .sizeof(proc) before declaration
;; https://github.com/cc65/cc65/issues/478
2017-08-29 03:58:09 +00:00
2017-09-01 05:53:07 +00:00
.proc call_init
;; run the DA
jsr init
;; tear down/exit
2017-08-29 03:58:09 +00:00
sta ALTZPON
lda LCBANK1
lda LCBANK1
sta RAMRDOFF
sta RAMWRTOFF
2017-09-01 05:53:07 +00:00
ldx save_stack
2017-08-29 03:58:09 +00:00
txs
2017-09-01 05:53:07 +00:00
rts
.endproc
;;; ==================================================
;;; ProDOS MLI calls
2017-08-29 03:58:09 +00:00
.proc open_file
2017-08-30 01:47:15 +00:00
jsr copy_params_aux_to_main
2017-08-29 03:58:09 +00:00
sta ALTZPOFF
2017-08-29 15:40:35 +00:00
MLI_CALL OPEN, open_params
2017-08-29 03:58:09 +00:00
sta ALTZPON
2017-08-29 16:08:46 +00:00
jsr copy_params_main_to_aux
2017-08-29 03:58:09 +00:00
rts
2017-08-30 01:47:15 +00:00
.endproc
2017-08-29 03:58:09 +00:00
.proc read_file
2017-08-30 01:47:15 +00:00
jsr copy_params_aux_to_main
2017-08-29 03:58:09 +00:00
sta ALTZPOFF
2017-08-29 15:40:35 +00:00
MLI_CALL READ, read_params
2017-08-29 03:58:09 +00:00
sta ALTZPON
2017-08-29 16:08:46 +00:00
jsr copy_params_main_to_aux
2017-08-29 03:58:09 +00:00
rts
2017-08-30 01:47:15 +00:00
.endproc
2017-08-29 03:58:09 +00:00
.proc get_file_eof
2017-08-30 01:47:15 +00:00
jsr copy_params_aux_to_main
2017-08-29 03:58:09 +00:00
sta ALTZPOFF
2017-08-29 15:45:32 +00:00
MLI_CALL GET_EOF, get_eof_params
2017-08-29 03:58:09 +00:00
sta ALTZPON
2017-08-29 16:08:46 +00:00
jsr copy_params_main_to_aux
2017-08-29 03:58:09 +00:00
rts
2017-08-30 01:47:15 +00:00
.endproc
2017-08-29 03:58:09 +00:00
2017-08-30 01:47:15 +00:00
.proc set_file_mark
jsr copy_params_aux_to_main
2017-08-29 03:58:09 +00:00
sta ALTZPOFF
2017-08-29 15:47:42 +00:00
MLI_CALL SET_MARK, set_mark_params
2017-08-29 03:58:09 +00:00
sta ALTZPON
2017-08-29 16:08:46 +00:00
jsr copy_params_main_to_aux
2017-08-29 03:58:09 +00:00
rts
2017-08-30 01:47:15 +00:00
.endproc
2017-08-29 03:58:09 +00:00
2017-08-30 01:47:15 +00:00
.proc close_file
jsr copy_params_aux_to_main
2017-08-29 03:58:09 +00:00
sta ALTZPOFF
2017-08-29 15:45:32 +00:00
MLI_CALL CLOSE, close_params
2017-08-29 03:58:09 +00:00
sta ALTZPON
2017-08-29 16:08:46 +00:00
jsr copy_params_main_to_aux
2017-08-29 03:58:09 +00:00
rts
2017-08-30 01:47:15 +00:00
.endproc
2017-08-29 03:58:09 +00:00
2017-09-01 05:53:07 +00:00
;;; ==================================================
2017-08-29 16:08:46 +00:00
;;; Copies param blocks from Aux to Main
.proc copy_params_aux_to_main
2017-08-29 16:08:46 +00:00
ldy #(params_end - params_start + 1)
2017-08-29 03:58:09 +00:00
sta RAMWRTOFF
2017-08-29 16:08:46 +00:00
loop: lda params_start - 1,y
sta params_start - 1,y
2017-08-29 03:58:09 +00:00
dey
2017-08-29 16:08:46 +00:00
bne loop
2017-08-29 03:58:09 +00:00
sta RAMRDOFF
rts
2017-08-29 16:08:46 +00:00
.endproc
2017-08-29 03:58:09 +00:00
2017-08-29 16:08:46 +00:00
;;; Copies param blocks from Main to Aux
.proc copy_params_main_to_aux
2017-08-29 16:08:46 +00:00
pha
2017-08-29 03:58:09 +00:00
php
sta RAMWRTON
2017-08-29 16:08:46 +00:00
ldy #(params_end - params_start + 1)
loop: lda params_start - 1,y
sta params_start - 1,y
2017-08-29 03:58:09 +00:00
dey
2017-08-29 16:08:46 +00:00
bne loop
2017-08-29 03:58:09 +00:00
sta RAMRDON
plp
pla
2017-08-29 16:08:46 +00:00
rts
.endproc
2017-08-29 03:58:09 +00:00
2017-08-29 16:08:46 +00:00
;;; ----------------------------------------
params_start:
;;; This block gets copied between main/aux
2017-08-29 15:40:35 +00:00
2017-09-01 05:53:07 +00:00
;;; ProDOS MLI param blocks
.proc open_params
2017-08-29 15:45:32 +00:00
.byte 3 ; param_count
2017-09-01 01:38:49 +00:00
.addr pathname ; pathname
2017-08-29 15:40:35 +00:00
.addr $0C00 ; io_buffer
ref_num:.byte 0 ; ref_num
.endproc
2017-08-29 15:40:35 +00:00
2017-09-01 05:39:06 +00:00
default_buffer := $1200
.proc read_params
2017-08-29 15:45:32 +00:00
.byte 4 ; param_count
ref_num:.byte 0 ; ref_num
2017-09-01 05:39:06 +00:00
buffer: .addr default_buffer ; data_buffer
2017-08-29 15:40:35 +00:00
.word $100 ; request_count
.word 0 ; trans_count
.endproc
2017-08-29 15:40:35 +00:00
.proc get_eof_params
2017-08-29 15:45:32 +00:00
.byte 2 ; param_count
ref_num:.byte 0 ; ref_num
2017-08-29 15:47:42 +00:00
.byte 0,0,0 ; EOF (lo, mid, hi)
.endproc
2017-08-29 15:40:35 +00:00
.proc set_mark_params
2017-08-29 15:47:42 +00:00
.byte 2 ; param_count
ref_num:.byte 0 ; ref_num
2017-08-29 15:47:42 +00:00
.byte 0,0,0 ; position (lo, mid, hi)
.endproc
2017-08-29 15:45:32 +00:00
.proc close_params
2017-08-29 15:45:32 +00:00
.byte 1 ; param_count
ref_num:.byte 0 ; ref_num
.endproc
2017-08-29 16:08:46 +00:00
2017-09-02 01:32:37 +00:00
.proc pathname ; 1st byte is length, rest is full path
length: .byte $00
data: .byte $00,$00,$00,$00,$00,$00,$00,$00
2017-09-01 01:38:49 +00:00
.byte $00,$00,$00,$00,$00,$00,$00,$00
2017-08-29 03:58:09 +00:00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00
2017-09-02 01:32:37 +00:00
.endproc
2017-09-01 01:38:49 +00:00
2017-08-29 03:58:09 +00:00
L0945: .byte $00
L0946: .byte $00
L0947: .byte $00
L0948: .byte $00
L0949: .byte $00
2017-09-02 03:10:21 +00:00
2017-09-03 03:23:14 +00:00
params_end := * + 4 ; bug in original? (harmless as this is static)
2017-08-29 16:08:46 +00:00
;;; ----------------------------------------
2017-09-03 03:23:14 +00:00
black_pattern:
.byte $00,$00,$00,$00,$00,$00,$00,$00
2017-09-02 04:24:35 +00:00
2017-09-03 03:23:14 +00:00
white_pattern:
2017-09-03 07:31:23 +00:00
.byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
2017-09-03 03:23:14 +00:00
window_id := $64
2017-09-01 15:15:05 +00:00
2017-08-29 03:58:09 +00:00
L095A: .byte $00
L095B: .byte $FA
L095C: .byte $01
2017-09-01 15:15:05 +00:00
.proc line_pos
left: .word 0
base: .word 0
.endproc
2017-09-01 15:48:46 +00:00
window_width: .word 0
window_height: .word 0
2017-08-29 03:58:09 +00:00
L0965: .byte $00
L0966: .byte $00,$00
L0968: .byte $00
L0969: .byte $00
L096A: .byte $00
L096B: .byte $00
L096C: .byte $00
L096D: .byte $00
2017-08-31 04:13:25 +00:00
track_scroll_delta:
.byte $00
fixed_mode_flag:
2017-09-02 03:30:55 +00:00
.byte $00 ; 0 = proportional, otherwise = fixed
2017-09-09 03:45:11 +00:00
.proc input_params
state: .byte 0
coords: ; spills into target query
2017-08-31 03:30:46 +00:00
xcoord: .word 0
ycoord: .word 0
2017-09-09 03:45:11 +00:00
.endproc
.proc target_params
2017-08-31 04:04:16 +00:00
elem: .byte 0
win: .byte 0
.endproc
2017-09-02 02:54:04 +00:00
.proc resize_drag_params
id: .byte window_id
xcoord: .word 0
ycoord: .word 0
2017-08-31 03:30:46 +00:00
.byte 0 ; ???
2017-09-02 02:54:04 +00:00
.endproc
2017-08-31 03:30:46 +00:00
2017-09-03 07:31:23 +00:00
.proc close_btn_params ; queried after close clicked to see if aborted/finished
2017-08-31 04:04:16 +00:00
state: .byte 0 ; 0 = aborted, 1 = clicked
2017-09-02 17:15:15 +00:00
.byte 0,0 ; ???
2017-08-31 03:30:46 +00:00
.endproc
2017-08-31 15:10:51 +00:00
.proc query_client_params ; queried after a client click to identify target
2017-08-31 03:30:46 +00:00
xcoord: .word 0
ycoord: .word 0
2017-09-02 17:15:15 +00:00
part: .byte 0 ; 0 = client, 1 = vscroll, 2 = hscroll
2017-08-31 03:30:46 +00:00
scroll: .byte 0 ; 1 = up, 2 = down, 3 = above, 4 = below, 5 = thumb
.endproc
2017-09-01 16:30:29 +00:00
;; param block used in dead code (resize?)
2017-09-02 02:54:04 +00:00
.proc resize_window_params
2017-09-02 03:30:55 +00:00
L0986: .byte 0
L0987: .byte 0
2017-09-02 02:54:04 +00:00
.endproc
2017-08-31 15:10:51 +00:00
.proc update_scroll_params ; called to update scroll bar position
2017-09-03 05:52:38 +00:00
type: .byte 0 ; 1 = vscroll, 2 = hscroll
pos: .byte 0 ; new position
2017-08-31 15:10:51 +00:00
.endproc
2017-08-31 05:13:41 +00:00
;;; Used when dragging vscroll thumb
2017-08-31 05:22:04 +00:00
.proc thumb_drag_params
2017-09-03 05:52:38 +00:00
type: .byte 0 ; 1 = vscroll, 2 = hscroll
2017-08-31 05:13:41 +00:00
xcoord: .word 0
ycoord: .word 0
2017-09-03 05:52:38 +00:00
pos: .byte 0 ; position
2017-09-01 05:12:02 +00:00
moved: .byte 0 ; 0 if not moved, 1 if moved
2017-08-31 05:13:41 +00:00
.endproc
2017-08-30 01:52:56 +00:00
2017-09-01 05:12:02 +00:00
.proc text_string
addr: .addr 0 ; address
len: .byte 0 ; length
.endproc
2017-08-30 01:52:56 +00:00
2017-09-03 01:51:03 +00:00
default_width := 512
default_height := 150
2017-09-04 04:47:45 +00:00
default_left := 10
default_top := 28
2017-09-03 01:51:03 +00:00
2017-09-01 02:05:41 +00:00
.proc window_params
id: .byte window_id ; window identifier
2017-09-03 03:49:28 +00:00
flags: .byte A2D_CWF_ADDCLOSE; window flags (2=include close box)
2017-09-02 05:08:43 +00:00
title: .addr $1000 ; overwritten to point at filename
2017-09-03 03:56:08 +00:00
2017-09-03 03:49:28 +00:00
hscroll:.byte A2D_CWS_NOSCROLL
vscroll:.byte A2D_CWS_SCROLL_NORMAL
hsmax: .byte 32
hspos: .byte 0
vsmax: .byte 255
vspos: .byte 0
2017-08-31 03:41:54 +00:00
2017-09-03 03:56:08 +00:00
;; ???
2017-09-03 01:51:03 +00:00
.byte $00,$00,$C8,$00,$33,$00
width: .word default_width
height: .word default_height
.proc box ; or whole window ??
2017-09-04 04:47:45 +00:00
left: .word default_left
top: .word default_top
addr: .word A2D_SCREEN_ADDR
stride: .word A2D_SCREEN_STRIDE
2017-09-07 06:43:40 +00:00
hoffset:.word 0 ; Also used for A2D_FILL_RECT
2017-09-02 04:02:00 +00:00
voffset:.word 0
2017-09-03 01:51:03 +00:00
width: .word default_width
height: .word default_height
2017-09-01 15:32:29 +00:00
.endproc
pattern:.byte $00,$00,$00,$00,$00,$00,$00
.byte $00,$FF,$00,$00,$00,$00,$00
hthick: .byte 1
vthick: .byte 1
.byte $00,$7F,$00,$88,$00,$00
.endproc
2017-09-01 15:15:05 +00:00
;; gets copied over window_params::box after mode is drawn
2017-09-01 15:32:29 +00:00
.proc default_box
2017-09-04 04:47:45 +00:00
left: .word default_left
top: .word default_top
addr: .word A2D_SCREEN_ADDR
stride: .word A2D_SCREEN_STRIDE
2017-09-02 04:02:00 +00:00
hoffset:.word 0
voffset:.word 0
2017-09-03 01:51:03 +00:00
width: .word default_width
height: .word default_height
2017-09-01 15:32:29 +00:00
.endproc
2017-08-29 16:08:46 +00:00
2017-09-01 05:53:07 +00:00
.proc init
2017-09-02 03:30:55 +00:00
sta ALTZPON
2017-08-29 03:58:09 +00:00
lda LCBANK1
lda LCBANK1
2017-09-02 01:43:53 +00:00
2017-09-04 04:47:45 +00:00
;; Get filename by checking DeskTop selected window/icon
2017-09-02 01:43:53 +00:00
2017-09-04 04:47:45 +00:00
;; Check that an icon is selected
2017-09-02 01:32:37 +00:00
lda #0
sta pathname::length
2017-09-02 05:08:43 +00:00
lda file_selected
2017-09-02 01:32:37 +00:00
beq abort ; some file properties?
2017-09-02 01:43:53 +00:00
lda path_index ; prefix index in table
2017-09-02 02:39:29 +00:00
bne :+
2017-09-02 01:32:37 +00:00
abort: rts
2017-09-02 01:58:36 +00:00
;; Copy path (prefix) into pathname buffer.
2017-09-02 02:39:29 +00:00
: src := $06
2017-09-02 01:32:37 +00:00
dst := $08
2017-09-02 01:43:53 +00:00
asl a ; (since address table is 2 bytes wide)
2017-08-29 03:58:09 +00:00
tax
2017-09-02 01:43:53 +00:00
lda path_table,x ; pathname ???
2017-09-02 01:32:37 +00:00
sta src
2017-09-02 01:43:53 +00:00
lda path_table+1,x
2017-09-02 01:32:37 +00:00
sta src+1
ldy #0
lda (src),y
2017-08-29 03:58:09 +00:00
tax
2017-09-02 01:32:37 +00:00
inc src
bne :+
inc src+1
: lda #<(pathname::data)
sta dst
lda #>(pathname::data)
sta dst+1
2017-09-02 01:34:29 +00:00
jsr copy_pathname ; copy x bytes (src) to (dst)
2017-09-02 01:32:37 +00:00
2017-09-02 01:58:36 +00:00
;; Append separator.
lda #'/'
2017-09-02 01:32:37 +00:00
ldy #0
sta (dst),y
inc pathname::length
inc dst
bne :+
inc dst+1
2017-09-02 01:43:53 +00:00
2017-09-02 05:08:43 +00:00
;; Get file entry.
2017-09-02 01:58:36 +00:00
: lda file_index ; file index in table
2017-09-02 01:43:53 +00:00
asl a ; (since table is 2 bytes wide)
2017-08-29 03:58:09 +00:00
tax
2017-09-02 01:58:36 +00:00
lda file_table,x
2017-09-02 01:32:37 +00:00
sta src
2017-09-02 01:58:36 +00:00
lda file_table+1,x
2017-09-02 01:32:37 +00:00
sta src+1
2017-09-02 01:58:36 +00:00
2017-09-02 05:08:43 +00:00
;; Exit if a directory.
ldy #2 ; 2nd byte of entry
2017-09-02 01:32:37 +00:00
lda (src),y
2017-09-02 01:58:36 +00:00
and #$70 ; check that one of bits 4,5,6 is set ???
2017-09-02 05:08:43 +00:00
;; some vague patterns, but unclear
;; basic = $32,$33, text = $52, sys = $11,$14,??, bin = $23,$24,$33
;; dir = $01 (so not shown)
2017-09-02 01:32:37 +00:00
bne :+
rts ; abort ???
2017-09-02 01:58:36 +00:00
2017-09-02 05:08:43 +00:00
;; Set window title to point at filename (9th byte of entry)
;; (title includes the spaces before/after from the icon)
2017-09-02 01:32:37 +00:00
: clc
2017-09-02 05:08:43 +00:00
lda src ; name is 9 bytes into entry
2017-09-02 01:58:36 +00:00
adc #9
2017-09-02 01:32:37 +00:00
sta window_params::title
lda src+1
2017-09-02 01:58:36 +00:00
adc #0
2017-09-02 01:32:37 +00:00
sta window_params::title+1
2017-09-02 01:58:36 +00:00
2017-09-02 05:08:43 +00:00
;; Append filename to path.
2017-09-02 01:58:36 +00:00
ldy #9
2017-09-02 05:08:43 +00:00
lda (src),y ; grab length
tax ; name has spaces before/after
dex ; so subtract 2 to get actual length
2017-08-29 03:58:09 +00:00
dex
clc
2017-09-02 01:32:37 +00:00
lda src
2017-09-02 05:08:43 +00:00
adc #11 ; 9 = length, 10 = space, 11 = name
2017-09-02 01:32:37 +00:00
sta src
2017-09-02 01:58:36 +00:00
bcc :+
2017-09-02 01:32:37 +00:00
inc src+1
2017-09-02 01:58:36 +00:00
: jsr copy_pathname ; copy x bytes (src) to (dst)
2017-09-04 03:07:05 +00:00
;; Clear selection (why???)
lda #<JUMP_TABLE_CLEAR_SEL
2017-09-02 02:06:14 +00:00
sta call_main_addr
2017-09-04 03:07:05 +00:00
lda #>JUMP_TABLE_CLEAR_SEL
2017-09-02 02:06:14 +00:00
sta call_main_addr+1
jsr call_main_trampoline
2017-09-02 01:58:36 +00:00
2017-09-01 05:12:02 +00:00
jmp open_file_and_init_window
2017-08-29 03:58:09 +00:00
2017-09-02 01:32:37 +00:00
.proc copy_pathname ; copy x bytes from src to dst
ldy #0 ; incrementing path length and dst
loop: lda (src),y
sta (dst),y
2017-08-29 03:58:09 +00:00
iny
2017-09-02 01:32:37 +00:00
inc pathname::length
2017-08-29 03:58:09 +00:00
dex
2017-09-01 05:12:02 +00:00
bne loop
2017-08-29 03:58:09 +00:00
tya
clc
2017-09-02 01:32:37 +00:00
adc dst
sta dst
2017-09-01 05:12:02 +00:00
bcc end
2017-09-02 01:32:37 +00:00
inc dst+1
2017-09-01 05:12:02 +00:00
end: rts
.endproc
2017-08-29 03:58:09 +00:00
2017-09-02 01:32:37 +00:00
.endproc
2017-09-01 05:12:02 +00:00
.proc open_file_and_init_window
lda #0
sta fixed_mode_flag
2017-09-01 05:12:02 +00:00
;; copy bytes (length at $8801) from $8802 to $10FF ???
2017-09-02 03:48:16 +00:00
;; length is $7f in tests
2017-08-29 03:58:09 +00:00
ldx $8801
sta RAMWRTOFF
2017-09-01 05:12:02 +00:00
loop: lda $8802,x
sta call_jt15+2,x
2017-08-29 03:58:09 +00:00
dex
2017-09-01 05:12:02 +00:00
bne loop
2017-08-29 03:58:09 +00:00
sta RAMWRTON
2017-09-01 05:12:02 +00:00
;; open file, get length
2017-08-30 01:47:15 +00:00
jsr open_file
lda open_params::ref_num
sta read_params::ref_num
sta set_mark_params::ref_num
sta get_eof_params::ref_num
sta close_params::ref_num
2017-08-30 01:47:15 +00:00
jsr get_file_eof
2017-09-01 05:12:02 +00:00
;; create window
2017-09-01 02:05:41 +00:00
A2D_CALL A2D_CREATE_WINDOW, window_params
A2D_CALL A2D_SET_BOX1, window_params::box
2017-09-02 16:44:33 +00:00
jsr calc_window_size
jsr calc_and_draw_mode
2017-09-01 01:38:49 +00:00
jsr draw_content
A2D_CALL $2B ; ???
2017-09-02 03:10:21 +00:00
;; fall through
2017-09-01 05:12:02 +00:00
.endproc
2017-09-02 04:24:35 +00:00
;;; ==================================================
;;; Main Input Loop
input_loop:
2017-09-09 03:13:09 +00:00
A2D_CALL A2D_GET_INPUT, input_params
lda input_params
2017-09-01 02:05:41 +00:00
cmp #1 ; was clicked?
bne input_loop ; nope, keep waiting
2017-09-09 03:45:11 +00:00
A2D_CALL A2D_QUERY_TARGET, input_params::coords
lda target_params::win ; in our window?
2017-09-01 05:39:06 +00:00
cmp #window_id
bne input_loop
2017-09-01 05:39:06 +00:00
;; which part of the window?
2017-09-09 03:45:11 +00:00
lda target_params::elem
2017-09-01 05:39:06 +00:00
cmp #A2D_ELEM_CLOSE
2017-09-02 04:24:35 +00:00
beq on_close_click
2017-09-01 05:39:06 +00:00
2017-09-02 04:24:35 +00:00
;; title and resize clicks need mouse location
2017-09-09 03:45:11 +00:00
ldx input_params::xcoord
2017-09-02 02:54:04 +00:00
stx resize_drag_params::xcoord
2017-08-31 03:30:46 +00:00
stx query_client_params::xcoord
2017-09-09 03:45:11 +00:00
ldx input_params::xcoord+1
2017-09-02 02:54:04 +00:00
stx resize_drag_params::xcoord+1
2017-08-31 03:30:46 +00:00
stx query_client_params::xcoord+1
2017-09-09 03:45:11 +00:00
ldx input_params::ycoord
2017-09-02 02:54:04 +00:00
stx resize_drag_params::ycoord
2017-08-31 03:30:46 +00:00
stx query_client_params::ycoord
2017-09-01 05:39:06 +00:00
cmp #A2D_ELEM_TITLE
beq title
2017-09-02 04:24:35 +00:00
cmp #A2D_ELEM_RESIZE ; not enabled, so this will never match
beq input_loop
2017-08-31 03:30:46 +00:00
jsr on_client_click
jmp input_loop
2017-08-29 03:58:09 +00:00
2017-09-01 05:39:06 +00:00
title: jsr on_title_bar_click
jmp input_loop
2017-08-29 03:58:09 +00:00
2017-09-02 04:24:35 +00:00
;;; ==================================================
;;; Close Button
.proc on_close_click
A2D_CALL A2D_CLOSE_CLICK, close_btn_params ; wait to see if the click completes
2017-09-03 07:31:23 +00:00
lda close_btn_params::state ; did click complete?
2017-08-30 06:47:18 +00:00
beq input_loop ; nope
2017-08-30 01:47:15 +00:00
jsr close_file
2017-09-01 02:05:41 +00:00
A2D_CALL A2D_DESTROY_WINDOW, window_params
2017-09-02 03:30:55 +00:00
2017-09-02 16:44:33 +00:00
jsr UNKNOWN_CALL ; ???
2017-08-29 03:58:09 +00:00
.byte $0C
2017-08-31 03:46:50 +00:00
.addr 0
2017-09-02 03:30:55 +00:00
2017-08-30 06:47:18 +00:00
rts ; exits input loop
.endproc
2017-08-29 03:58:09 +00:00
2017-09-02 04:24:35 +00:00
;;; ==================================================
;;; Resize Handle
2017-09-02 02:54:04 +00:00
;;; This is dead code (no resize handle!) and may be buggy
.proc on_resize_click
A2D_CALL A2D_DRAG_RESIZE, resize_drag_params
jsr call_jt15 ; call $4015 on main
2017-09-02 16:44:33 +00:00
jsr calc_window_size
2017-09-01 16:30:29 +00:00
2017-09-03 01:51:03 +00:00
max_width := default_width
2017-09-01 16:30:29 +00:00
lda #>max_width
cmp window_params::box::width+1
2017-09-02 02:39:29 +00:00
bne :+
2017-09-01 16:30:29 +00:00
lda #<max_width
cmp window_params::box::width
2017-09-02 02:39:29 +00:00
: bcs wider
2017-09-01 16:30:29 +00:00
lda #<max_width
sta window_params::box::width
2017-09-01 16:30:29 +00:00
lda #>max_width
sta window_params::box::width+1
2017-08-29 03:58:09 +00:00
sec
lda window_params::box::width
2017-09-01 15:48:46 +00:00
sbc window_width
sta window_params::box::hoffset
lda window_params::box::width+1
2017-09-01 15:48:46 +00:00
sbc window_width+1
sta window_params::box::hoffset+1
2017-09-03 03:49:28 +00:00
wider: lda window_params::hscroll
2017-09-01 15:48:46 +00:00
ldx window_width
2017-09-01 16:30:29 +00:00
cpx #<max_width
2017-09-04 03:07:05 +00:00
bne enable
2017-09-01 15:48:46 +00:00
ldx window_width+1
2017-09-01 16:30:29 +00:00
cpx #>max_width
2017-09-04 03:07:05 +00:00
bne enable
and #(A2D_CWS_SCROLL_TRACK ^ $FF) ; disable scroll
jmp skip
2017-08-29 03:58:09 +00:00
2017-09-04 03:07:05 +00:00
enable: ora #A2D_CWS_SCROLL_TRACK ; enable scroll
skip: sta window_params::hscroll
2017-08-29 03:58:09 +00:00
sec
2017-09-01 16:30:29 +00:00
lda #<max_width
2017-09-01 15:48:46 +00:00
sbc window_width
2017-08-29 03:58:09 +00:00
sta $06
2017-09-01 16:30:29 +00:00
lda #>max_width
2017-09-01 15:48:46 +00:00
sbc window_width+1
2017-08-29 03:58:09 +00:00
sta $07
2017-09-03 05:52:38 +00:00
jsr div_by_16
2017-09-02 02:54:04 +00:00
sta resize_window_params::L0987
2017-08-29 03:58:09 +00:00
lda #$02
2017-09-02 02:54:04 +00:00
sta resize_window_params::L0986
A2D_CALL A2D_RESIZE_WINDOW, resize_window_params ; change to clamped size ???
jsr calc_and_draw_mode
2017-09-02 03:30:55 +00:00
jmp finish_resize
2017-08-31 03:30:46 +00:00
.endproc
2017-08-29 03:58:09 +00:00
2017-09-02 04:24:35 +00:00
;;; ==================================================
;;; Client Area
2017-08-31 04:04:16 +00:00
;;; Non-title (client) area clicked
2017-08-31 03:30:46 +00:00
.proc on_client_click
2017-09-02 04:24:35 +00:00
;; On one of the scroll bars?
2017-08-31 03:30:46 +00:00
A2D_CALL A2D_QUERY_CLIENT, query_client_params
lda query_client_params::part
2017-09-01 05:39:06 +00:00
cmp #A2D_VSCROLL
2017-08-31 03:41:54 +00:00
beq on_vscroll_click
2017-09-01 05:39:06 +00:00
cmp #A2D_HSCROLL
bne end
2017-09-01 05:12:02 +00:00
jmp on_hscroll_click
2017-08-31 03:41:54 +00:00
end: rts
2017-08-31 03:30:46 +00:00
.endproc
2017-08-29 03:58:09 +00:00
2017-09-02 04:24:35 +00:00
;;; ==================================================
;;; Vertical Scroll Bar
2017-08-31 03:41:54 +00:00
.proc on_vscroll_click
2017-09-02 03:30:55 +00:00
lda #A2D_VSCROLL
2017-08-31 05:22:04 +00:00
sta thumb_drag_params::type
2017-08-31 15:10:51 +00:00
sta update_scroll_params::type
2017-08-31 03:30:46 +00:00
lda query_client_params::scroll
2017-09-01 05:39:06 +00:00
cmp #A2D_SCROLL_PART_THUMB
2017-08-31 03:41:54 +00:00
beq on_vscroll_thumb_click
2017-09-01 05:39:06 +00:00
cmp #A2D_SCROLL_PART_BELOW
2017-08-31 03:41:54 +00:00
beq on_vscroll_below_click
2017-09-01 05:39:06 +00:00
cmp #A2D_SCROLL_PART_ABOVE
2017-08-31 03:41:54 +00:00
beq on_vscroll_above_click
2017-09-01 05:39:06 +00:00
cmp #A2D_SCROLL_PART_UP
2017-08-31 03:41:54 +00:00
beq on_vscroll_up_click
2017-09-01 05:39:06 +00:00
cmp #A2D_SCROLL_PART_DOWN
2017-08-31 03:30:46 +00:00
bne end
2017-08-31 03:41:54 +00:00
jmp on_vscroll_down_click
end: rts
2017-08-31 03:30:46 +00:00
.endproc
2017-08-29 03:58:09 +00:00
2017-08-31 03:41:54 +00:00
.proc on_vscroll_thumb_click
2017-09-01 05:39:06 +00:00
jsr do_thumb_drag
2017-09-01 05:12:02 +00:00
lda thumb_drag_params::moved
2017-08-31 03:41:54 +00:00
beq end
2017-09-01 05:12:02 +00:00
lda thumb_drag_params::pos
2017-08-31 15:10:51 +00:00
sta update_scroll_params::pos
2017-09-02 16:44:33 +00:00
jsr update_voffset
2017-08-31 15:17:06 +00:00
jsr update_vscroll
2017-09-01 01:38:49 +00:00
jsr draw_content
2017-08-29 03:58:09 +00:00
lda L0947
2017-08-31 03:41:54 +00:00
beq end
2017-08-29 03:58:09 +00:00
lda L0949
2017-08-31 03:41:54 +00:00
bne end
2017-08-29 03:58:09 +00:00
jsr L0E1D
2017-08-31 03:41:54 +00:00
end: rts
.endproc
2017-08-29 03:58:09 +00:00
2017-08-31 03:41:54 +00:00
.proc on_vscroll_above_click
loop: lda window_params::vspos
2017-08-31 03:41:54 +00:00
beq end
2017-08-31 04:13:25 +00:00
jsr calc_track_scroll_delta
2017-08-29 03:58:09 +00:00
sec
lda window_params::vspos
2017-08-31 04:13:25 +00:00
sbc track_scroll_delta
2017-08-31 15:17:06 +00:00
bcs store
2017-09-02 02:54:04 +00:00
lda #0 ; underflow
2017-08-31 15:17:06 +00:00
store: sta update_scroll_params::pos
2017-08-31 04:04:16 +00:00
jsr update_scroll_pos
bcc loop ; repeat while button down
2017-08-31 03:41:54 +00:00
end: rts
.endproc
2017-08-29 03:58:09 +00:00
2017-08-31 03:41:54 +00:00
.proc on_vscroll_up_click
loop : lda window_params::vspos
2017-08-31 03:41:54 +00:00
beq end
2017-08-29 03:58:09 +00:00
sec
2017-08-31 04:04:16 +00:00
sbc #1
2017-08-31 15:10:51 +00:00
sta update_scroll_params::pos
2017-08-31 04:04:16 +00:00
jsr update_scroll_pos
bcc loop ; repeat while button down
2017-08-31 03:41:54 +00:00
end: rts
.endproc
2017-08-29 03:58:09 +00:00
2017-08-31 04:04:16 +00:00
vscroll_max := $FA
2017-08-31 03:41:54 +00:00
.proc on_vscroll_below_click
loop: lda window_params::vspos
2017-08-31 04:04:16 +00:00
cmp #vscroll_max ; pos == max ?
2017-08-31 03:41:54 +00:00
beq end
2017-08-31 04:13:25 +00:00
jsr calc_track_scroll_delta
2017-08-29 03:58:09 +00:00
clc
lda window_params::vspos
2017-08-31 04:13:25 +00:00
adc track_scroll_delta ; pos + delta
2017-08-31 04:04:16 +00:00
bcs overflow
cmp #vscroll_max+1 ; > max ?
bcc store ; nope, it's good
overflow:
lda #vscroll_max ; set to max
2017-08-31 15:10:51 +00:00
store: sta update_scroll_params::pos
2017-08-31 04:04:16 +00:00
jsr update_scroll_pos
bcc loop ; repeat while button down
2017-08-31 03:41:54 +00:00
end: rts
.endproc
2017-08-29 03:58:09 +00:00
2017-08-31 03:41:54 +00:00
.proc on_vscroll_down_click
loop: lda window_params::vspos
2017-08-31 04:04:16 +00:00
cmp #vscroll_max
2017-08-31 03:41:54 +00:00
beq end
2017-08-29 03:58:09 +00:00
clc
2017-08-31 04:04:16 +00:00
adc #1
2017-08-31 15:10:51 +00:00
sta update_scroll_params::pos
2017-08-31 04:04:16 +00:00
jsr update_scroll_pos
bcc loop ; repeat while button down
2017-08-31 03:41:54 +00:00
end: rts
.endproc
2017-08-29 03:58:09 +00:00
2017-08-31 04:13:25 +00:00
.proc update_scroll_pos ; Returns with carry set if mouse released
2017-09-02 16:44:33 +00:00
jsr update_voffset
2017-08-31 15:17:06 +00:00
jsr update_vscroll
2017-09-01 01:38:49 +00:00
jsr draw_content
2017-08-31 04:04:16 +00:00
jsr was_button_released
2017-08-29 03:58:09 +00:00
clc
2017-08-31 04:04:16 +00:00
bne end
2017-08-29 03:58:09 +00:00
sec
2017-08-31 04:04:16 +00:00
end: rts
.endproc
2017-08-29 03:58:09 +00:00
2017-08-31 04:13:25 +00:00
.proc calc_track_scroll_delta
2017-09-02 16:44:33 +00:00
lda window_height ; ceil(??? / 50)
2017-08-31 04:13:25 +00:00
ldx #0
loop: inx
2017-08-29 03:58:09 +00:00
sec
2017-08-31 04:13:25 +00:00
sbc #50
cmp #50
bcs loop
stx track_scroll_delta
2017-08-29 03:58:09 +00:00
rts
2017-08-31 04:13:25 +00:00
.endproc
2017-08-29 03:58:09 +00:00
2017-09-02 04:24:35 +00:00
;;; ==================================================
;;; Horizontal Scroll Bar
;;; (Unused in STF DA, so most of this is speculation)
2017-09-01 05:12:02 +00:00
.proc on_hscroll_click
2017-09-01 05:39:06 +00:00
lda #A2D_HSCROLL
2017-08-31 05:22:04 +00:00
sta thumb_drag_params::type
2017-08-31 15:10:51 +00:00
sta update_scroll_params::type
2017-08-31 03:30:46 +00:00
lda query_client_params::scroll
2017-09-01 05:39:06 +00:00
cmp #A2D_SCROLL_PART_THUMB
2017-09-01 05:12:02 +00:00
beq on_hscroll_thumb_click
2017-09-01 05:39:06 +00:00
cmp #A2D_SCROLL_PART_AFTER
2017-09-01 05:12:02 +00:00
beq on_hscroll_after_click
2017-09-01 05:39:06 +00:00
cmp #A2D_SCROLL_PART_BEFORE
2017-09-01 05:12:02 +00:00
beq on_hscroll_before_click
2017-09-01 05:39:06 +00:00
cmp #A2D_SCROLL_PART_LEFT
2017-09-01 05:12:02 +00:00
beq on_hscroll_left_click
2017-09-01 05:39:06 +00:00
cmp #A2D_SCROLL_PART_RIGHT
2017-09-01 05:12:02 +00:00
beq on_hscroll_right_click
2017-08-29 03:58:09 +00:00
rts
2017-09-01 05:12:02 +00:00
.endproc
2017-08-29 03:58:09 +00:00
2017-09-01 05:12:02 +00:00
.proc on_hscroll_thumb_click
2017-09-01 05:39:06 +00:00
jsr do_thumb_drag
2017-09-01 05:12:02 +00:00
lda thumb_drag_params::moved
beq end
lda thumb_drag_params::pos
2017-09-03 05:52:38 +00:00
jsr mul_by_16
2017-08-29 03:58:09 +00:00
lda $06
sta window_params::box::hoffset
2017-08-29 03:58:09 +00:00
lda $07
sta window_params::box::hoffset+1
2017-08-29 03:58:09 +00:00
clc
lda window_params::box::hoffset
2017-09-01 15:48:46 +00:00
adc window_width
sta window_params::box::width
lda window_params::box::hoffset+1
2017-09-01 15:48:46 +00:00
adc window_width+1
sta window_params::box::width+1
2017-09-02 03:30:55 +00:00
jsr update_hscroll
2017-09-01 01:38:49 +00:00
jsr draw_content
2017-09-01 05:12:02 +00:00
end: rts
.endproc
2017-08-29 03:58:09 +00:00
2017-09-01 05:12:02 +00:00
.proc on_hscroll_after_click
ldx #2
lda window_params::hsmax
2017-09-01 05:12:02 +00:00
jmp hscroll_common
.endproc
2017-08-29 03:58:09 +00:00
2017-09-01 05:12:02 +00:00
.proc on_hscroll_before_click
ldx #254
lda #0
jmp hscroll_common
.endproc
2017-08-29 03:58:09 +00:00
2017-09-01 05:12:02 +00:00
.proc on_hscroll_right_click
ldx #1
lda window_params::hsmax
2017-09-01 05:12:02 +00:00
jmp hscroll_common
.endproc
2017-08-29 03:58:09 +00:00
2017-09-01 05:12:02 +00:00
.proc on_hscroll_left_click
ldx #255
lda #0
;; fall through
.endproc
.proc hscroll_common
sta compare+1
stx delta+1
loop: lda window_params::hspos
2017-09-01 05:12:02 +00:00
compare:cmp #$0A ; self-modified
bne continue
2017-08-29 03:58:09 +00:00
rts
2017-09-01 05:12:02 +00:00
continue:
clc
lda window_params::hspos
2017-09-01 05:12:02 +00:00
delta: adc #1 ; self-modified
bmi overflow
cmp window_params::hsmax
2017-09-01 05:12:02 +00:00
beq store
bcc store
lda window_params::hsmax
2017-09-01 05:12:02 +00:00
jmp store
overflow:
lda #0
store: sta window_params::hspos
2017-08-29 03:58:09 +00:00
jsr L0D5E
2017-09-02 03:30:55 +00:00
jsr update_hscroll
2017-09-01 01:38:49 +00:00
jsr draw_content
2017-08-31 04:04:16 +00:00
jsr was_button_released
2017-09-01 05:12:02 +00:00
bne loop
2017-08-29 03:58:09 +00:00
rts
2017-09-01 05:12:02 +00:00
.endproc
2017-08-29 03:58:09 +00:00
2017-09-02 04:24:35 +00:00
;;; ==================================================
;;; UI Helpers
2017-08-31 05:13:41 +00:00
;; Used at start of thumb drag
2017-09-01 05:39:06 +00:00
.proc do_thumb_drag
2017-09-09 03:45:11 +00:00
lda input_params::xcoord
2017-08-31 05:22:04 +00:00
sta thumb_drag_params::xcoord
2017-09-09 03:45:11 +00:00
lda input_params::xcoord+1
2017-08-31 05:22:04 +00:00
sta thumb_drag_params::xcoord+1
2017-09-09 03:45:11 +00:00
lda input_params::ycoord
2017-08-31 05:22:04 +00:00
sta thumb_drag_params::ycoord
2017-09-01 05:39:06 +00:00
A2D_CALL A2D_DRAG_SCROLL, thumb_drag_params
2017-08-29 03:58:09 +00:00
rts
2017-08-31 05:22:04 +00:00
.endproc
2017-08-29 03:58:09 +00:00
2017-09-01 02:05:41 +00:00
;;; Checks button state; z clear if button was released, set otherwise
2017-08-31 04:04:16 +00:00
.proc was_button_released
2017-09-09 03:13:09 +00:00
A2D_CALL A2D_GET_INPUT, input_params
lda input_params
2017-08-31 04:04:16 +00:00
cmp #2
2017-08-29 03:58:09 +00:00
rts
2017-08-31 04:04:16 +00:00
.endproc
2017-08-29 03:58:09 +00:00
2017-09-01 05:12:02 +00:00
;;; only used from hscroll code?
.proc L0D5E
lda window_params::hspos
2017-09-03 05:52:38 +00:00
jsr mul_by_16
2017-08-29 03:58:09 +00:00
clc
lda $06
sta window_params::box::hoffset
2017-09-01 15:48:46 +00:00
adc window_width
sta window_params::box::width
2017-08-29 03:58:09 +00:00
lda $07
sta window_params::box::hoffset+1
2017-09-01 15:48:46 +00:00
adc window_width+1
sta window_params::box::width+1
2017-08-29 03:58:09 +00:00
rts
2017-09-01 05:12:02 +00:00
.endproc
2017-08-29 03:58:09 +00:00
2017-09-02 16:44:33 +00:00
.proc update_voffset
2017-09-01 05:39:06 +00:00
lda #0
sta window_params::box::voffset
sta window_params::box::voffset+1
2017-08-31 15:10:51 +00:00
ldx update_scroll_params::pos
2017-09-01 05:39:06 +00:00
loop: beq L0D9B
2017-08-29 03:58:09 +00:00
clc
lda window_params::box::voffset
2017-08-31 15:17:06 +00:00
adc #50
sta window_params::box::voffset
2017-09-02 02:39:29 +00:00
bcc :+
inc window_params::box::voffset+1
2017-09-02 02:39:29 +00:00
: dex
2017-09-01 05:39:06 +00:00
jmp loop
.endproc
2017-08-29 03:58:09 +00:00
2017-09-01 05:39:06 +00:00
.proc L0D9B ; ?? part of vscroll
;; increase window_params::box height to cover full window (offset + height)
2017-09-01 05:39:06 +00:00
clc
lda window_params::box::voffset
2017-09-01 15:48:46 +00:00
adc window_height
sta window_params::box::height
lda window_params::box::voffset+1
2017-09-01 15:48:46 +00:00
adc window_height+1
sta window_params::box::height+1
2017-08-29 03:58:09 +00:00
jsr L10A5
2017-08-31 15:17:06 +00:00
lda #0
2017-08-29 03:58:09 +00:00
sta L096A
sta L096B
2017-08-31 15:10:51 +00:00
ldx update_scroll_params::pos
2017-09-01 05:39:06 +00:00
loop: beq end
2017-08-29 03:58:09 +00:00
clc
lda L096A
2017-08-31 15:17:06 +00:00
adc #5
2017-08-29 03:58:09 +00:00
sta L096A
2017-09-02 02:39:29 +00:00
bcc :+
2017-08-29 03:58:09 +00:00
inc L096B
2017-09-02 02:39:29 +00:00
: dex
2017-09-01 05:39:06 +00:00
jmp loop
end: rts
.endproc
2017-08-29 03:58:09 +00:00
2017-09-02 03:30:55 +00:00
.proc update_hscroll
lda #2
2017-08-31 15:10:51 +00:00
sta update_scroll_params::type
lda window_params::box::hoffset
2017-08-29 03:58:09 +00:00
sta $06
lda window_params::box::hoffset+1
2017-08-29 03:58:09 +00:00
sta $07
2017-09-03 05:52:38 +00:00
jsr div_by_16
2017-08-31 15:10:51 +00:00
sta update_scroll_params::pos
A2D_CALL A2D_UPDATE_SCROLL, update_scroll_params
2017-08-29 03:58:09 +00:00
rts
2017-09-02 03:30:55 +00:00
.endproc
2017-08-29 03:58:09 +00:00
2017-08-31 15:17:06 +00:00
.proc update_vscroll ; update_scroll_params::pos set by caller
lda #1
2017-08-31 15:10:51 +00:00
sta update_scroll_params::type
A2D_CALL A2D_UPDATE_SCROLL, update_scroll_params
2017-08-29 03:58:09 +00:00
rts
2017-08-31 15:17:06 +00:00
.endproc
2017-08-29 03:58:09 +00:00
2017-09-02 03:30:55 +00:00
.proc finish_resize ; only called from dead code
2017-09-01 05:39:06 +00:00
jsr UNKNOWN_CALL
2017-08-30 02:07:44 +00:00
.byte $0C
2017-08-31 03:46:50 +00:00
.addr 0
A2D_CALL A2D_SET_BOX1, window_params::box
2017-09-03 03:49:28 +00:00
lda window_params::hscroll
ror a ; check if low bit (track enabled) is set
2017-09-02 02:39:29 +00:00
bcc :+
2017-09-02 03:30:55 +00:00
jsr update_hscroll
: lda window_params::vspos
2017-08-31 15:10:51 +00:00
sta update_scroll_params::pos
2017-08-31 15:17:06 +00:00
jsr update_vscroll
2017-09-01 01:38:49 +00:00
jsr draw_content
jmp input_loop
2017-09-01 05:39:06 +00:00
.endproc
2017-08-29 03:58:09 +00:00
2017-09-02 16:44:33 +00:00
;; called on scroll
2017-09-03 03:23:14 +00:00
L0E1D: A2D_CALL A2D_SET_PATTERN, white_pattern
A2D_CALL A2D_FILL_RECT, window_params::box::hoffset
2017-09-03 03:23:14 +00:00
A2D_CALL A2D_SET_PATTERN, black_pattern
2017-08-29 03:58:09 +00:00
rts
2017-09-02 04:24:35 +00:00
;;; ==================================================
;;; Content Rendering
2017-09-01 01:38:49 +00:00
.proc draw_content
2017-09-01 05:39:06 +00:00
lda #0
2017-08-29 03:58:09 +00:00
sta L0949
jsr L1129
2017-08-30 01:47:15 +00:00
jsr set_file_mark
2017-09-01 05:39:06 +00:00
lda #<default_buffer
2017-09-01 01:38:49 +00:00
sta read_params::buffer
2017-08-29 03:58:09 +00:00
sta $06
2017-09-01 05:39:06 +00:00
lda #>default_buffer
2017-09-01 01:38:49 +00:00
sta read_params::buffer+1
2017-08-29 03:58:09 +00:00
sta $07
lda #$00
sta L0945
sta L0946
sta L0947
2017-09-01 15:15:05 +00:00
sta line_pos::base+1
2017-08-29 03:58:09 +00:00
sta L096C
sta L096D
sta L0948
2017-09-02 04:02:00 +00:00
lda #$0A ; line spacing = 10
2017-09-01 15:15:05 +00:00
sta line_pos::base
2017-08-29 03:58:09 +00:00
jsr L0EDB
L0E68: lda L096D
cmp L096B
bne L0E7E
lda L096C
cmp L096A
bne L0E7E
jsr L0E1D
inc L0948
2017-09-09 19:18:06 +00:00
L0E7E: A2D_CALL A2D_SET_POS, line_pos
2017-08-29 03:58:09 +00:00
sec
2017-09-02 03:10:21 +00:00
lda #250
2017-09-01 15:15:05 +00:00
sbc line_pos::left
2017-08-29 03:58:09 +00:00
sta L095B
2017-09-02 03:10:21 +00:00
lda #1
2017-09-01 15:15:05 +00:00
sbc line_pos::left+1
2017-08-29 03:58:09 +00:00
sta L095C
jsr L0EF3
bcs L0ED7
clc
2017-09-01 05:12:02 +00:00
lda text_string::len
2017-08-29 03:58:09 +00:00
adc $06
sta $06
bcc L0EA6
inc $07
L0EA6: lda L095A
bne L0E68
clc
2017-09-01 15:15:05 +00:00
lda line_pos::base
2017-09-02 04:02:00 +00:00
adc #$0A ; line spacing = 10
2017-09-01 15:15:05 +00:00
sta line_pos::base
2017-08-29 03:58:09 +00:00
bcc L0EB9
2017-09-01 15:15:05 +00:00
inc line_pos::base+1
2017-08-29 03:58:09 +00:00
L0EB9: jsr L0EDB
lda L096C
cmp L0968
bne L0ECC
lda L096D
cmp L0969
beq L0ED7
L0ECC: inc L096C
bne L0ED4
inc L096D
L0ED4: jmp L0E68
L0ED7: jsr L1109
rts
2017-09-01 01:38:49 +00:00
.endproc
2017-08-29 03:58:09 +00:00
2017-09-01 01:38:49 +00:00
.proc L0EDB ; ???
2017-09-02 03:10:21 +00:00
lda #250
2017-08-29 03:58:09 +00:00
sta L095B
2017-09-02 03:10:21 +00:00
lda #1
2017-08-29 03:58:09 +00:00
sta L095C
2017-09-02 03:10:21 +00:00
lda #3
2017-09-01 15:15:05 +00:00
sta line_pos::left
2017-09-02 03:10:21 +00:00
lda #0
2017-09-01 15:15:05 +00:00
sta line_pos::left+1
2017-08-29 03:58:09 +00:00
sta L095A
rts
2017-09-01 01:38:49 +00:00
.endproc
2017-08-29 03:58:09 +00:00
L0EF3: lda #$FF
sta L0F9B
lda #$00
sta L0F9C
sta L0F9D
sta L095A
2017-09-01 05:12:02 +00:00
sta text_string::len
2017-08-29 03:58:09 +00:00
lda $06
2017-09-01 05:12:02 +00:00
sta text_string::addr
2017-08-29 03:58:09 +00:00
lda $07
2017-09-01 05:12:02 +00:00
sta text_string::addr+1
2017-08-29 03:58:09 +00:00
L0F10: lda L0945
bne L0F22
lda L0947
beq L0F1F
jsr L0FF6
sec
rts
L0F1F: jsr L100C
2017-09-01 05:12:02 +00:00
L0F22: ldy text_string::len
2017-08-29 03:58:09 +00:00
lda ($06),y
2017-08-30 02:07:44 +00:00
and #$7F ; clear high bit
2017-08-29 03:58:09 +00:00
sta ($06),y
inc L0945
2017-08-30 02:07:44 +00:00
cmp #$0D ; return character
2017-08-29 03:58:09 +00:00
beq L0F86
2017-09-02 03:10:21 +00:00
cmp #' ' ; space character
2017-08-29 03:58:09 +00:00
bne L0F41
sty L0F9B
pha
lda L0945
sta L0946
pla
L0F41: cmp #$09
bne L0F48
jmp L0F9E
L0F48: tay
lda $8803,y
clc
adc L0F9C
sta L0F9C
bcc L0F58
inc L0F9D
L0F58: lda L095C
cmp L0F9D
bne L0F66
lda L095B
cmp L0F9C
L0F66: bcc L0F6E
2017-09-01 05:12:02 +00:00
inc text_string::len
2017-08-29 03:58:09 +00:00
jmp L0F10
2017-09-02 03:10:21 +00:00
L0F6E: lda #0
2017-08-29 03:58:09 +00:00
sta L095A
lda L0F9B
cmp #$FF
beq L0F83
2017-09-01 05:12:02 +00:00
sta text_string::len
2017-08-29 03:58:09 +00:00
lda L0946
sta L0945
2017-09-01 05:12:02 +00:00
L0F83: inc text_string::len
2017-08-29 03:58:09 +00:00
L0F86: jsr L0FF6
2017-09-01 05:12:02 +00:00
ldy text_string::len
2017-08-29 03:58:09 +00:00
lda ($06),y
2017-09-02 03:10:21 +00:00
cmp #$09 ; tab character?
2017-08-29 03:58:09 +00:00
beq L0F96
2017-09-02 03:10:21 +00:00
cmp #$0D ; return character
2017-08-29 03:58:09 +00:00
bne L0F99
2017-09-01 05:12:02 +00:00
L0F96: inc text_string::len
2017-08-29 03:58:09 +00:00
L0F99: clc
rts
2017-08-29 16:08:46 +00:00
L0F9B: .byte 0
L0F9C: .byte 0
L0F9D: .byte 0
2017-09-01 02:05:41 +00:00
.proc L0F9E ; ???
lda #1
2017-08-29 03:58:09 +00:00
sta L095A
clc
lda L0F9C
2017-09-01 15:15:05 +00:00
adc line_pos::left
sta line_pos::left
2017-08-29 03:58:09 +00:00
lda L0F9D
2017-09-01 15:15:05 +00:00
adc line_pos::left+1
sta line_pos::left+1
2017-09-01 02:05:41 +00:00
ldx #0
loop: lda times70+1,x
2017-09-01 15:15:05 +00:00
cmp line_pos::left+1
2017-08-29 03:58:09 +00:00
bne L0FC6
2017-09-01 02:05:41 +00:00
lda times70,x
2017-09-01 15:15:05 +00:00
cmp line_pos::left
2017-08-29 03:58:09 +00:00
L0FC6: bcs L0FD1
inx
inx
2017-09-01 02:05:41 +00:00
cpx #14
beq done
jmp loop
L0FD1: lda times70,x
2017-09-01 15:15:05 +00:00
sta line_pos::left
2017-09-01 02:05:41 +00:00
lda times70+1,x
2017-09-01 15:15:05 +00:00
sta line_pos::left+1
2017-08-29 03:58:09 +00:00
jmp L0F86
2017-09-01 02:05:41 +00:00
done: lda #0
2017-08-29 03:58:09 +00:00
sta L095A
jmp L0F86
2017-09-01 02:05:41 +00:00
times70:.word 70
.word 140
.word 210
.word 280
.word 350
.word 420
.word 490
.endproc
2017-09-01 05:12:02 +00:00
;;; Draws a line of content
2017-08-29 03:58:09 +00:00
L0FF6: lda L0948
beq L100B
2017-09-01 05:12:02 +00:00
lda text_string::len
2017-08-29 03:58:09 +00:00
beq L100B
2017-09-02 02:06:14 +00:00
A2D_CALL A2D_DRAW_TEXT, text_string
2017-09-01 05:53:07 +00:00
lda #1
2017-08-29 03:58:09 +00:00
sta L0949
L100B: rts
2017-09-01 05:12:02 +00:00
L100C: lda text_string::addr+1
2017-09-01 05:39:06 +00:00
cmp #$12 ; #>default_buffer?
2017-08-29 03:58:09 +00:00
beq L102B
2017-09-02 03:10:21 +00:00
;; copy a page of characters from $1300 to the buffer
ldy #0
loop: lda $1300,y
2017-09-01 05:39:06 +00:00
sta default_buffer,y
2017-08-29 03:58:09 +00:00
iny
2017-09-02 03:10:21 +00:00
bne loop
2017-09-01 05:12:02 +00:00
dec text_string::addr+1
lda text_string::addr
2017-08-29 03:58:09 +00:00
sta $06
2017-09-01 05:12:02 +00:00
lda text_string::addr+1
2017-08-29 03:58:09 +00:00
sta $07
2017-09-02 03:10:21 +00:00
L102B: lda #0
2017-08-29 03:58:09 +00:00
sta L0945
jsr L103E
2017-09-01 01:38:49 +00:00
lda read_params::buffer+1
2017-09-01 05:39:06 +00:00
cmp #$12 ; #>default_buffer?
2017-08-29 03:58:09 +00:00
bne L103D
2017-09-01 01:38:49 +00:00
inc read_params::buffer+1
2017-08-29 03:58:09 +00:00
L103D: rts
2017-09-02 03:10:21 +00:00
.proc L103E
2017-09-01 01:38:49 +00:00
lda read_params::buffer
2017-08-30 02:07:44 +00:00
sta store+1
2017-09-01 01:38:49 +00:00
lda read_params::buffer+1
2017-08-30 02:07:44 +00:00
sta store+2
2017-08-29 03:58:09 +00:00
lda #$20
ldx #$00
sta RAMWRTOFF
2017-09-01 05:39:06 +00:00
store: sta default_buffer,x ; self-modified
2017-08-29 03:58:09 +00:00
inx
2017-08-30 02:07:44 +00:00
bne store
2017-08-29 03:58:09 +00:00
sta RAMWRTON
lda #$00
sta L0947
2017-08-30 01:47:15 +00:00
jsr read_file
2017-08-29 03:58:09 +00:00
pha
lda #$00
2017-09-01 01:20:36 +00:00
sta STARTLO
sta DESTINATIONLO
2017-08-29 03:58:09 +00:00
lda #$FF
2017-09-01 01:20:36 +00:00
sta ENDLO
2017-09-01 01:38:49 +00:00
lda read_params::buffer+1
2017-09-01 01:20:36 +00:00
sta DESTINATIONHI
sta STARTHI
sta ENDHI
sec ; main>aux
2017-08-29 03:58:09 +00:00
jsr AUXMOVE
pla
2017-08-30 02:07:44 +00:00
beq end
2017-08-29 03:58:09 +00:00
cmp #$4C
2017-08-30 02:07:44 +00:00
beq done
brk ; ????
done: lda #$01
2017-08-29 03:58:09 +00:00
sta L0947
2017-08-30 02:07:44 +00:00
end: rts
2017-09-02 03:10:21 +00:00
.endproc
2017-08-29 03:58:09 +00:00
2017-09-02 16:44:33 +00:00
.proc calc_window_size
sec
lda window_params::box::width
sbc window_params::box::hoffset
2017-09-01 15:48:46 +00:00
sta window_width
lda window_params::box::width+1
sbc window_params::box::hoffset+1
2017-09-01 15:48:46 +00:00
sta window_width+1
2017-09-02 04:24:35 +00:00
2017-08-29 03:58:09 +00:00
sec
lda window_params::box::height
sbc window_params::box::voffset
2017-09-01 15:48:46 +00:00
sta window_height
2017-09-02 16:44:33 +00:00
;; fall through
.endproc
;; calculate line offset ?
.proc L10A5
lda window_params::box::height
2017-08-29 03:58:09 +00:00
sta L0965
lda window_params::box::height+1
2017-08-29 03:58:09 +00:00
sta L0966
2017-09-02 04:24:35 +00:00
2017-09-02 16:44:33 +00:00
lda #0
2017-08-29 03:58:09 +00:00
sta L0968
sta L0969
2017-09-02 16:44:33 +00:00
loop: lda L0966
bne :+
2017-08-29 03:58:09 +00:00
lda L0965
2017-09-02 04:24:35 +00:00
cmp #$0A ; line spacing = 10
2017-09-02 16:44:33 +00:00
bcc end
: sec
2017-08-29 03:58:09 +00:00
lda L0965
2017-09-02 04:24:35 +00:00
sbc #$0A ; line spacing = 10
2017-08-29 03:58:09 +00:00
sta L0965
2017-09-02 16:44:33 +00:00
bcs :+
2017-08-29 03:58:09 +00:00
dec L0966
2017-09-02 16:44:33 +00:00
: inc L0968
bne loop
2017-08-29 03:58:09 +00:00
inc L0969
2017-09-02 16:44:33 +00:00
jmp loop
end: rts
.endproc
2017-08-29 03:58:09 +00:00
2017-09-03 05:52:38 +00:00
.proc div_by_16 ; input in $06/$07, output in a
ldx #4
2017-09-02 03:10:21 +00:00
loop: clc
2017-08-29 03:58:09 +00:00
ror $07
ror $06
dex
2017-09-02 03:10:21 +00:00
bne loop
2017-08-29 03:58:09 +00:00
lda $06
rts
2017-09-02 03:10:21 +00:00
.endproc
2017-08-29 03:58:09 +00:00
2017-09-03 05:52:38 +00:00
.proc mul_by_16 ; input in a, output in $06/$07
2017-09-02 03:10:21 +00:00
sta $06
2017-09-03 05:52:38 +00:00
lda #0
2017-08-29 03:58:09 +00:00
sta $07
2017-09-03 05:52:38 +00:00
ldx #4
2017-09-02 03:10:21 +00:00
loop: clc
2017-08-29 03:58:09 +00:00
rol $06
rol $07
dex
2017-09-02 03:10:21 +00:00
bne loop
2017-08-29 03:58:09 +00:00
rts
2017-09-02 03:10:21 +00:00
.endproc
2017-08-29 03:58:09 +00:00
.proc call_jt15
2017-09-04 03:07:05 +00:00
lda #<JUMP_TABLE_15
2017-09-02 02:06:14 +00:00
sta call_main_addr ; self-modified
2017-09-04 03:07:05 +00:00
lda #>JUMP_TABLE_15
2017-09-02 02:06:14 +00:00
sta call_main_addr+1
jsr call_main_trampoline
2017-08-29 03:58:09 +00:00
rts
2017-09-02 02:06:14 +00:00
.endproc
2017-08-29 03:58:09 +00:00
2017-09-01 02:05:41 +00:00
;;; if fixed mode, do a main->aux copy of a code block ???
2017-09-01 01:38:49 +00:00
.proc L1109
lda fixed_mode_flag ; if not fixed (i.e. proportional)
2017-09-01 02:05:41 +00:00
beq end ; then exit
2017-09-01 01:38:49 +00:00
lda #$00 ; start := $1100
2017-09-01 01:20:36 +00:00
sta STARTLO
2017-08-29 03:58:09 +00:00
lda #$7E
2017-09-01 01:38:49 +00:00
sta ENDLO ; end := $117E
2017-08-29 03:58:09 +00:00
lda #$11
2017-09-01 01:20:36 +00:00
sta STARTHI
sta ENDHI
2017-09-01 01:38:49 +00:00
dest := $8803
lda #>dest
2017-09-01 01:20:36 +00:00
sta DESTINATIONHI
2017-09-01 01:38:49 +00:00
lda #<dest
2017-09-01 01:20:36 +00:00
sta DESTINATIONLO
sec ; main>aux
2017-08-29 03:58:09 +00:00
jsr AUXMOVE
2017-09-01 02:05:41 +00:00
end: rts
2017-09-01 01:38:49 +00:00
.endproc
2017-08-29 03:58:09 +00:00
2017-09-01 01:38:49 +00:00
.proc L1129 ; ???
2017-09-01 02:05:41 +00:00
lda fixed_mode_flag ; if not fixed (i.e. proportional)
beq end ; then exit
2017-08-29 03:58:09 +00:00
ldx $8801
2017-09-02 02:35:50 +00:00
lda #7 ; 7 pixels/character
2017-09-01 01:38:49 +00:00
loop: sta $8802,x
2017-08-29 03:58:09 +00:00
dex
2017-09-01 01:38:49 +00:00
bne loop
2017-09-01 02:05:41 +00:00
end: rts
2017-09-01 01:38:49 +00:00
.endproc
2017-08-29 03:58:09 +00:00
2017-09-02 04:24:35 +00:00
;;; ==================================================
;;; Title Bar (Proportional/Fixed mode button)
.proc on_title_bar_click
2017-09-09 03:45:11 +00:00
lda input_params::xcoord+1 ; mouse x high byte?
2017-09-01 15:15:05 +00:00
cmp mode_box_left+1
bne :+
2017-09-09 03:45:11 +00:00
lda input_params::xcoord
2017-09-01 15:15:05 +00:00
cmp mode_box_left
: bcc ignore
2017-09-02 04:24:35 +00:00
;; Toggle the state and redraw
lda fixed_mode_flag
beq set_flag
dec fixed_mode_flag ; clear flag (mode = proportional)
2017-08-29 03:58:09 +00:00
jsr L1109
jmp redraw
2017-08-29 03:58:09 +00:00
set_flag:
inc fixed_mode_flag ; set flag (mode = fixed)
redraw: jsr draw_mode
2017-09-01 01:38:49 +00:00
jsr draw_content
sec ; Click consumed
2017-08-29 03:58:09 +00:00
rts
ignore: clc ; Click ignored
2017-08-29 03:58:09 +00:00
rts
.endproc
2017-08-29 03:58:09 +00:00
fixed_str: A2D_DEFSTRING "Fixed "
prop_str: A2D_DEFSTRING "Proportional"
2017-09-01 15:48:46 +00:00
label_width := 50
title_bar_height := 12
2017-09-01 15:15:05 +00:00
.proc mode_box ; bounding box for mode label
left: .word 0
top: .word 0
addr: .word A2D_SCREEN_ADDR
stride: .word A2D_SCREEN_STRIDE
2017-09-02 04:02:00 +00:00
hoffset:.word 0
voffset:.word 0
2017-09-01 15:15:05 +00:00
width: .word 80
height: .word 10
.endproc
mode_box_left := mode_box::left ; forward refs to mode_box::left don't work?
2017-09-02 02:35:50 +00:00
;; https://github.com/cc65/cc65/issues/479
2017-09-01 15:15:05 +00:00
.proc mode_pos
left: .word 0 ; horizontal text offset
base: .word 10 ; vertical text offset (to baseline)
.endproc
.proc calc_and_draw_mode
sec
lda window_params::box::top
2017-09-01 15:48:46 +00:00
sbc #title_bar_height
sta mode_box::top
2017-08-29 03:58:09 +00:00
clc
lda window_params::box::left
2017-09-01 15:48:46 +00:00
adc window_width
2017-08-29 03:58:09 +00:00
pha
lda window_params::box::left+1
2017-09-01 15:48:46 +00:00
adc window_width+1
2017-08-29 03:58:09 +00:00
tax
sec
pla
2017-09-01 15:48:46 +00:00
sbc #<label_width
2017-09-01 15:15:05 +00:00
sta mode_box::left
2017-08-29 03:58:09 +00:00
txa
2017-09-01 15:48:46 +00:00
sbc #>label_width
2017-09-01 15:15:05 +00:00
sta mode_box::left+1
2017-09-01 02:05:41 +00:00
;; fall through...
.endproc
2017-09-01 02:05:41 +00:00
.proc draw_mode
A2D_CALL A2D_SET_BOX2, mode_box ; guess: setting up draw location ???
2017-09-09 19:18:06 +00:00
A2D_CALL A2D_SET_POS, mode_pos
lda fixed_mode_flag
beq else ; is proportional?
2017-08-31 03:30:46 +00:00
A2D_CALL A2D_DRAW_TEXT, fixed_str
jmp endif
2017-08-31 03:30:46 +00:00
else: A2D_CALL A2D_DRAW_TEXT, prop_str
2017-09-01 15:15:05 +00:00
2017-08-31 15:10:51 +00:00
endif: ldx #$0F
2017-09-01 15:32:29 +00:00
loop: lda default_box,x
sta window_params::box,x
2017-08-29 03:58:09 +00:00
dex
bpl loop
A2D_CALL A2D_SET_BOX2, window_params::box
2017-08-29 03:58:09 +00:00
rts
.endproc