2017-08-29 08:07:02 -07:00
|
|
|
;;; ------------------------------
|
|
|
|
;;; A2Desktop
|
|
|
|
;;; ------------------------------
|
|
|
|
|
|
|
|
;;; Entry Points
|
|
|
|
A2D := $4000
|
2017-09-01 20:30:55 -07:00
|
|
|
|
2017-08-29 08:07:02 -07:00
|
|
|
UNKNOWN_CALL := $8E00
|
|
|
|
|
2017-09-09 18:28:15 -07:00
|
|
|
|
2017-09-03 20:07:05 -07:00
|
|
|
;; These must be called from main memory (RAMRDON/RAMWRTON)
|
|
|
|
JUMP_TABLE_03 := $4003 ; ???
|
|
|
|
JUMP_TABLE_06 := $4006 ; ???
|
|
|
|
JUMP_TABLE_09 := $4009 ; ???
|
|
|
|
JUMP_TABLE_0C := $400C ; ??? (made "items/in disk/..." redraw oddly)
|
|
|
|
JUMP_TABLE_0F := $400F ; ???
|
|
|
|
JUMP_TABLE_12 := $4012 ; ???
|
|
|
|
JUMP_TABLE_15 := $4015 ; ???
|
|
|
|
JUMP_TABLE_18 := $4018 ; ???
|
|
|
|
JUMP_TABLE_CLEAR_SEL := $401E ; Clear DeskTop selection
|
|
|
|
JUMP_TABLE_21 := $4021 ; ???
|
|
|
|
JUMP_TABLE_24 := $4024 ; ???
|
|
|
|
JUMP_TABLE_27 := $4027 ; ???
|
|
|
|
JUMP_TABLE_2A := $402A ; ???
|
|
|
|
JUMP_TABLE_2D := $402D ; ???
|
|
|
|
JUMP_TABLE_30 := $4030 ; ???
|
|
|
|
JUMP_TABLE_33 := $4033 ; Shows "The syntax of the pathname is invalid.", hangs
|
|
|
|
JUMP_TABLE_36 := $4036 ; ditto
|
|
|
|
JUMP_TABLE_CUR_POINTER := $4039 ; Changes mouse cursor to pointer
|
|
|
|
JUMP_TABLE_CUR_WATCH := $403C ; Changes mouse cursor to watch
|
|
|
|
JUMP_TABLE_3F := $403F ; ???
|
2017-09-01 20:48:16 -07:00
|
|
|
|
2017-09-02 18:51:03 -07:00
|
|
|
A2D_UNK_03 := $03 ; Unknown - used in calculator after frame is drawn
|
2017-09-01 20:48:16 -07:00
|
|
|
|
2017-09-09 18:28:15 -07:00
|
|
|
A2D_SET_BOX1 := $04 ; Not sure what BOX1 vs. BOX2 is for
|
|
|
|
A2D_SET_BOX2 := $06 ; Not sure what BOX1 vs. BOX2 is for
|
2017-09-01 21:02:00 -07:00
|
|
|
;; .word left pixels from screen edge
|
|
|
|
;; .word top
|
2017-09-09 18:28:15 -07:00
|
|
|
;; .word addr A2D_SCREEN_ADDR ($2000)
|
|
|
|
;; .word stride A2D_SCREEN_STRIDE ($80)
|
2017-09-01 21:02:00 -07:00
|
|
|
;; .word hoffset pixels scrolled
|
|
|
|
;; .word voffset
|
|
|
|
;; .word width pixels
|
|
|
|
;; .word height
|
|
|
|
|
2017-09-09 17:43:37 -07:00
|
|
|
A2D_UNK_07 := $07 ; Unknown - used in calculator; set fill mode?
|
2017-09-03 10:44:42 -07:00
|
|
|
|
2017-09-02 20:23:14 -07:00
|
|
|
A2D_SET_PATTERN := $08
|
|
|
|
;; .byte r0...r7 8x8 pixel pattern for A2D_CLEAR_BOX calls
|
2017-09-02 18:51:03 -07:00
|
|
|
|
|
|
|
A2D_UNK_0C := $0C ; Unknown - used in calculator
|
|
|
|
|
2017-09-09 12:18:06 -07:00
|
|
|
A2D_SET_POS := $0E
|
|
|
|
;; .word x
|
|
|
|
;; .word y
|
2017-09-01 08:15:05 -07:00
|
|
|
|
2017-09-06 23:43:40 -07:00
|
|
|
A2D_FILL_RECT := $11 ; With selected pattern
|
|
|
|
;; .word left (includes scroll pos)
|
|
|
|
;; .word top
|
|
|
|
;; .word right pixels
|
|
|
|
;; .word bottom
|
|
|
|
|
|
|
|
A2D_DRAW_RECT := $12 ; With selected pattern
|
|
|
|
;; .word left (includes scroll pos)
|
|
|
|
;; .word top
|
|
|
|
;; .word right pixels
|
|
|
|
;; .word bottom
|
2017-09-02 09:44:33 -07:00
|
|
|
|
2017-09-09 12:18:06 -07:00
|
|
|
A2D_TEST_BOX := $13 ; A false if pos (via SET_POS) outside box, true if inside
|
|
|
|
;; .word left
|
|
|
|
;; .word top
|
|
|
|
;; .word right
|
|
|
|
;; .word bottom
|
|
|
|
|
2017-09-09 17:43:37 -07:00
|
|
|
A2D_DRAW_PATTERN := $14 ; Draw pattern
|
|
|
|
;; .word left
|
|
|
|
;; .word top
|
|
|
|
;; .addr pattern pattern is 7 bits per byte, 0 = black, 1 = white
|
|
|
|
;; .byte stride pattern width in bytes
|
|
|
|
;; .byte 0,0,0,0,0 ???
|
|
|
|
;; .word width pixels
|
|
|
|
;; .word height pixels
|
2017-09-02 09:44:33 -07:00
|
|
|
|
2017-09-08 08:36:36 -07:00
|
|
|
A2D_MEASURE_TEXT := $18
|
|
|
|
;; .addr data
|
|
|
|
;; .byte length ???
|
|
|
|
;; .word width pixels
|
|
|
|
|
2017-09-09 12:18:06 -07:00
|
|
|
A2D_DRAW_TEXT := $19 ; Drawn at last SET_POS as left, baseline
|
2017-08-30 20:30:46 -07:00
|
|
|
;; .addr data
|
|
|
|
;; .byte length
|
|
|
|
|
2017-09-09 11:08:40 -07:00
|
|
|
A2D_UNK_1A := $1A ; Unknown - used in calculator before window creation,
|
|
|
|
; and after destruction
|
2017-09-03 10:44:42 -07:00
|
|
|
|
|
|
|
A2D_UNK_24 := $24 ; Unknown - used in calculator
|
|
|
|
|
2017-09-06 23:43:40 -07:00
|
|
|
A2D_SHOW_CURSOR := $25
|
|
|
|
;; no parameters (pass $0000 as address)
|
|
|
|
|
|
|
|
A2D_HIDE_CURSOR := $26
|
|
|
|
;; no parameters (pass $0000 as address)
|
|
|
|
|
2017-09-09 12:18:06 -07:00
|
|
|
A2D_GET_INPUT := $2A
|
2017-09-08 20:13:09 -07:00
|
|
|
;; .byte state (0=up, 1=press, 2=release, 3=key, 4=held)
|
2017-09-08 20:45:11 -07:00
|
|
|
;; if state is not 3:
|
|
|
|
;; .byte key (ASCII code; high bit clear)
|
|
|
|
;; .byte modifiers (0=none, 1=open-apple, 2=closed-apple, 3=both)
|
|
|
|
;; if state is 3:
|
|
|
|
;; .word xcoord
|
|
|
|
;; .word ycoord
|
2017-08-31 19:05:41 -07:00
|
|
|
|
2017-09-03 10:44:42 -07:00
|
|
|
A2D_UNK_2B := $2B ; Unknown
|
|
|
|
;; no parameters (pass $0000 as address)
|
|
|
|
|
|
|
|
A2D_UNK_2D := $2D ; Unknown - used in calculator
|
|
|
|
|
2017-08-31 19:05:41 -07:00
|
|
|
A2D_CREATE_WINDOW := $38
|
|
|
|
;; .byte id
|
2017-08-31 22:12:02 -07:00
|
|
|
;; 0 = desktop
|
|
|
|
;; 1, 2, ... = file windows
|
|
|
|
;; 100 = DA (for example)
|
2017-09-02 20:49:28 -07:00
|
|
|
;; .byte flags (A2D_CWF_*)
|
2017-09-01 09:16:12 -07:00
|
|
|
;; bit 0: remove title bar
|
|
|
|
;; bit 1: add close box
|
|
|
|
;; bit 2: add resize box
|
2017-09-01 18:32:37 -07:00
|
|
|
;; .addr title
|
2017-09-02 20:49:28 -07:00
|
|
|
;; .byte hscroll bits: 7 = enable, 6 = show thumb, 0 = show track
|
|
|
|
;; .byte vscroll
|
2017-09-02 20:56:08 -07:00
|
|
|
;; .byte hscroll_max
|
|
|
|
;; .byte hscroll_pos
|
|
|
|
;; .byte vscroll_max
|
2017-09-02 18:51:03 -07:00
|
|
|
;; .byte vscroll_pos
|
|
|
|
;; .byte ???
|
|
|
|
;; .byte ???
|
2017-09-03 10:44:42 -07:00
|
|
|
;; .word width_a ???
|
|
|
|
;; .word height_a ???
|
|
|
|
;; .word width_b (of scroll area?)
|
|
|
|
;; .word height_b (of scroll area?)
|
2017-09-09 18:28:15 -07:00
|
|
|
;; - next section is identical to that for A2D_SET_BOX
|
2017-09-03 10:44:42 -07:00
|
|
|
;; .word left pixels from screen edge
|
|
|
|
;; .word top
|
2017-09-09 18:28:15 -07:00
|
|
|
;; .word screen_addr
|
|
|
|
;; .word screen_stride
|
2017-09-03 10:44:42 -07:00
|
|
|
;; .word hoffset pixels scrolled
|
|
|
|
;; .word voffset
|
|
|
|
;; .word width pixels
|
2017-09-02 18:51:03 -07:00
|
|
|
;; .word height
|
2017-08-31 19:05:41 -07:00
|
|
|
|
|
|
|
A2D_DESTROY_WINDOW := $39
|
2017-09-05 23:24:21 -07:00
|
|
|
;; .byte id
|
2017-08-30 20:30:46 -07:00
|
|
|
|
2017-09-09 18:11:01 -07:00
|
|
|
A2D_QUERY_BOX := $3C ; get client "box" of window
|
|
|
|
;; .byte id window
|
2017-09-09 18:28:15 -07:00
|
|
|
;; .addr box box definition to populate, like A2D_SET_BOX1
|
2017-09-03 10:44:42 -07:00
|
|
|
|
2017-09-08 20:45:11 -07:00
|
|
|
A2D_QUERY_TARGET := $40
|
|
|
|
;; .word queryx (relative to screen)
|
|
|
|
;; .word queryy
|
2017-09-02 20:29:06 -07:00
|
|
|
;; .byte element (A2D_ELEM_*)
|
2017-08-31 23:03:46 -07:00
|
|
|
;; 0 = desktop
|
|
|
|
;; 1 = menu
|
|
|
|
;; 2 = client area (including scroll bars/resize box)
|
2017-08-30 20:30:46 -07:00
|
|
|
;; 3 = title bar
|
2017-09-01 09:20:32 -07:00
|
|
|
;; 4 = resize box
|
2017-08-30 20:30:46 -07:00
|
|
|
;; 5 = close box
|
2017-08-31 23:03:46 -07:00
|
|
|
;; .byte id of window
|
2017-08-30 20:30:46 -07:00
|
|
|
|
|
|
|
A2D_BTN_CLICK := $43
|
|
|
|
;; .byte clicked (0 = cancelled, 1 = clicked)
|
|
|
|
;; .byte ??
|
|
|
|
;; .byte ??
|
|
|
|
|
2017-09-01 19:54:04 -07:00
|
|
|
A2D_DRAG_RESIZE := $45
|
2017-09-01 21:24:35 -07:00
|
|
|
;; .byte id of window
|
|
|
|
;; .word xcoord of mouse
|
|
|
|
;; .word ycoord of mouse
|
|
|
|
;; .byte ?? (likely: moved? 0 = no change, 1 = moved)
|
2017-09-01 19:54:04 -07:00
|
|
|
|
2017-09-08 21:10:56 -07:00
|
|
|
A2D_DRAG_WINDOW := $44
|
|
|
|
;; .byte window_id
|
|
|
|
;; .word xcoord screen coordinates
|
|
|
|
;; .word ycoord
|
2017-09-03 10:44:42 -07:00
|
|
|
|
2017-09-08 20:13:09 -07:00
|
|
|
A2D_MAP_COORDS := $46 ; Map screen coords to client coords
|
|
|
|
;; .byte window_id
|
|
|
|
;; .word screenx
|
|
|
|
;; .word screeny
|
|
|
|
;; .word clientx
|
|
|
|
;; .word clienty
|
2017-09-03 10:44:42 -07:00
|
|
|
|
2017-08-30 20:30:46 -07:00
|
|
|
A2D_QUERY_CLIENT:= $48
|
|
|
|
;; .word xcoord of query
|
|
|
|
;; .word ycoord of query
|
2017-08-31 22:39:06 -07:00
|
|
|
;; .byte part (0 = client, 1 = vscroll, 2 = hscroll)
|
2017-08-31 22:12:02 -07:00
|
|
|
;; .byte scroll (1 = up/left, 2 = down/right, 3 = above/before, 4 = below/after, 5 = thumb)
|
|
|
|
|
2017-09-01 19:54:04 -07:00
|
|
|
A2D_RESIZE_WINDOW := $49
|
2017-09-01 21:24:35 -07:00
|
|
|
;; .byte ?? (unused, so incomplete)
|
|
|
|
;; .byte ??
|
2017-09-01 19:54:04 -07:00
|
|
|
|
2017-08-31 22:39:06 -07:00
|
|
|
A2D_DRAG_SCROLL:= $4A
|
|
|
|
;; .byte type (1 = vscroll, 2 = hscroll)
|
2017-08-31 22:12:02 -07:00
|
|
|
;; .word xcoord of mouse
|
|
|
|
;; .word ycoord of mouse
|
|
|
|
;; .byte position (0...255)
|
|
|
|
;; .byte moved (0 = no change, 1 = moved)
|
2017-08-30 20:30:46 -07:00
|
|
|
|
2017-08-31 08:10:51 -07:00
|
|
|
A2D_UPDATE_SCROLL:= $4B
|
|
|
|
;; .byte type (1 = vertical, 2 = horizontal)
|
|
|
|
;; .byte pos (new position 0...250)
|
2017-08-29 08:07:02 -07:00
|
|
|
|
2017-09-09 18:28:15 -07:00
|
|
|
;;; Used in A2D_QUERY_BOX / A2D_SET_BOX
|
|
|
|
A2D_SCREEN_ADDR := $2000 ; Screen address
|
|
|
|
A2D_SCREEN_STRIDE := $80 ; Stride in bytes (???)
|
|
|
|
|
2017-09-08 20:13:09 -07:00
|
|
|
;;; Used in A2D_GET_INPUT
|
|
|
|
A2D_INPUT_NONE := 0 ; No mouse or keypress
|
|
|
|
A2D_INPUT_DOWN := 1 ; Mouse button was depressed
|
|
|
|
A2D_INPUT_UP := 2 ; Mouse button was released
|
|
|
|
A2D_INPUT_KEY := 3 ; Key was pressed
|
|
|
|
A2D_INPUT_HELD := 4 ; Mouse button still down
|
2017-09-01 19:54:04 -07:00
|
|
|
|
2017-08-31 22:39:06 -07:00
|
|
|
;;; Used in A2D_GET_MOUSE
|
2017-08-31 23:03:46 -07:00
|
|
|
A2D_ELEM_DESKTOP:= 0
|
|
|
|
A2D_ELEM_MENU := 1
|
2017-08-31 22:39:06 -07:00
|
|
|
A2D_ELEM_CLIENT := 2
|
|
|
|
A2D_ELEM_TITLE := 3
|
2017-09-01 09:20:32 -07:00
|
|
|
A2D_ELEM_RESIZE := 4
|
2017-08-31 22:39:06 -07:00
|
|
|
A2D_ELEM_CLOSE := 5
|
|
|
|
|
|
|
|
;;; Used in A2D_QUERY_CLIENT, A2D_DRAG_SCROLL, A2D_UPDATE_SCROLL
|
|
|
|
A2D_CLIENT := 0
|
|
|
|
A2D_VSCROLL := 1
|
|
|
|
A2D_HSCROLL := 2
|
|
|
|
|
|
|
|
;;; Used in A2D_QUERY_CLIENT
|
|
|
|
A2D_SCROLL_PART_UP := 1
|
|
|
|
A2D_SCROLL_PART_LEFT := 1
|
|
|
|
A2D_SCROLL_PART_DOWN := 2
|
|
|
|
A2D_SCROLL_PART_RIGHT := 2
|
|
|
|
A2D_SCROLL_PART_ABOVE := 3
|
|
|
|
A2D_SCROLL_PART_BEFORE := 3
|
|
|
|
A2D_SCROLL_PART_BELOW := 4
|
|
|
|
A2D_SCROLL_PART_AFTER := 4
|
|
|
|
A2D_SCROLL_PART_THUMB := 5
|
|
|
|
|
2017-09-02 20:29:06 -07:00
|
|
|
;;; Used in A2D_CREATE_WINDOW
|
2017-09-02 20:49:28 -07:00
|
|
|
A2D_CWF_NOTITLE := 1 << 0
|
|
|
|
A2D_CWF_ADDCLOSE := 1 << 1
|
|
|
|
A2D_CWF_ADDRESIZE:= 1 << 2
|
|
|
|
|
|
|
|
A2D_CWS_NOSCROLL := 0
|
|
|
|
A2D_CWS_SCROLL_ENABLED := 1 << 7
|
|
|
|
A2D_CWS_SCROLL_THUMB := 1 << 6
|
|
|
|
A2D_CWS_SCROLL_TRACK := 1 << 0
|
|
|
|
A2D_CWS_SCROLL_NORMAL := A2D_CWS_SCROLL_ENABLED | A2D_CWS_SCROLL_THUMB | A2D_CWS_SCROLL_TRACK
|
|
|
|
|
2017-08-31 22:39:06 -07:00
|
|
|
|
2017-08-29 08:07:02 -07:00
|
|
|
;;; Macros
|
2017-09-06 21:33:22 -07:00
|
|
|
.macro A2D_CALL op, addr, label
|
2017-08-29 08:07:02 -07:00
|
|
|
jsr A2D
|
|
|
|
.byte op
|
2017-09-06 21:33:22 -07:00
|
|
|
|
|
|
|
.if .paramcount > 2
|
|
|
|
label := *
|
|
|
|
.endif
|
|
|
|
|
2017-09-06 23:43:40 -07:00
|
|
|
.if .paramcount > 1
|
2017-08-29 08:07:02 -07:00
|
|
|
.addr addr
|
2017-09-06 23:43:40 -07:00
|
|
|
.else
|
|
|
|
.addr 0
|
|
|
|
.endif
|
2017-08-29 08:07:02 -07:00
|
|
|
.endmacro
|
|
|
|
|
|
|
|
.macro A2D_DEFSTRING str ; String definition, for use with A2D_TEXT
|
|
|
|
.local data
|
|
|
|
.addr data
|
|
|
|
.byte .strlen(str)
|
|
|
|
data: .byte str
|
|
|
|
.endmacro
|
2017-09-03 21:47:45 -07:00
|
|
|
|
2017-09-05 23:24:21 -07:00
|
|
|
.macro PASCAL_STRING str ; Length-prefixed string
|
|
|
|
.byte .strlen(str)
|
|
|
|
.byte str
|
|
|
|
.endmacro
|
|
|
|
|
2017-09-09 17:43:37 -07:00
|
|
|
;; Used for defining patterns for A2D_DRAW_PATTERN
|
|
|
|
.define px(bits) (((bits&$40)>>6)|((bits&$20)>>4)|((bits&$10)>>2)|(bits&$8)|((bits&$4)<<2)|((bits&$2)<<4)|((bits&$1)<<6))
|
|
|
|
|
2017-09-03 21:47:45 -07:00
|
|
|
|
|
|
|
;;; DeskTop Internals
|
|
|
|
|
|
|
|
;; These are DeskTop internals, but it appears there is no
|
|
|
|
;; API for getting the selected file.
|
|
|
|
file_selected := $DF21 ; 0 if no selection, 1 otherwise
|
|
|
|
path_index := $DF20 ; index of selected window (used to get prefix)
|
|
|
|
path_table := $DFB3 ; window address table
|
|
|
|
;; each entry is 65 bytes long
|
|
|
|
;; each entry is length-prefixed path string (no trailing /)
|
|
|
|
file_index := $DF22 ; index of selected file (global, not w/in window)
|
|
|
|
file_table := $DD9F ; file address table
|
|
|
|
;; each entry is 27 bytes long
|
|
|
|
;; .byte ??
|
|
|
|
;; .byte ??
|
|
|
|
;; .byte type/icon (bits 4,5,6 clear = directory)
|
|
|
|
;; .word iconx (pixels)
|
|
|
|
;; .word icony (pixels)
|
|
|
|
;; .byte ??
|
|
|
|
;; .byte ??
|
|
|
|
;; .byte len, name (length-prefixed, spaces before/after; 17 byte buffer)
|