a2d/mgtk.inc

816 lines
24 KiB
PHP
Raw Normal View History

2018-03-04 21:36:00 -08:00
;;; ============================================================
2018-02-21 08:06:38 -08:00
;;; MouseGraphics ToolKit (w/ Graphics Primitives)
2018-03-04 21:36:00 -08:00
;;; ============================================================
2018-01-28 21:18:00 -08:00
.scope MGTK
2018-01-28 21:18:00 -08:00
MLI := $4000
;; MLI-style call (jsr MLI ; .byte call ; .addr params)
;; Call from AUX (RAMRDON/RAMWRTON)
2018-03-04 21:36:00 -08:00
;;; ============================================================
2018-01-28 21:18:00 -08:00
;;; Graphics Primitives
2018-03-04 21:36:00 -08:00
;;; ============================================================
2018-02-18 12:49:59 -08:00
;;; Point record:
;;;
;;; .word xcoord
;;; .word ycoord
;;; Rect record:
;;;
;;; .word x1
;;; .word y1
;;; .word x2
2018-02-28 21:11:59 -08:00
;;; .word y2
2018-02-18 12:49:59 -08:00
;;; MapInfo record:
;;;
;;; Point viewloc
;;; .addr mapbits screen_mapbits
;;; .byte mapwidth screen_mapwidth
;;; .byte reserved
2018-02-18 17:08:11 -08:00
;;; Rect maprect a.k.a. cliprect
2018-02-18 12:49:59 -08:00
;;; GrafPort record:
;;;
2018-02-18 17:08:11 -08:00
;;; MapInfo portmap
2018-02-18 12:49:59 -08:00
;;; .res 8 penpattern
;;; .byte colormask_and
;;; .byte colormask_or
;;; Point penloc
;;; .byte penwidth horizontal pen thickness
;;; .byte penheight vertical pen thickness
;;; .byte penmode
;;; .byte textback text background
;;; .addr textfont
2018-02-18 17:08:11 -08:00
;;; PolyList record:
2018-02-18 12:49:59 -08:00
;;; .byte count number of vertices in this polygon
;;; .byte last high bit set if there are more polygons
;;; Point vertex1
;;; Point vertex2
;;; ...
2018-02-18 17:08:11 -08:00
;;; Font record:
;;;
;;; .byte fonttype 0=regular, $80=double-width
;;; .byte lastchar char code of last character (usually $7F)
;;; .byte height pixels (1-16)
;;; .res N charwidth pixels, for each char
;;; .res N row0 bits
;;; .res N row0right bits (double-width only)
;;; ...
2018-02-19 21:32:47 -08:00
NoOp := $00 ; No-op
2018-02-28 19:02:39 -08:00
;;; (no parameters)
2018-01-29 00:57:55 -08:00
2018-01-28 21:18:00 -08:00
;;; --------------------------------------------------
;;; Initialization Commands
2017-09-10 19:40:52 -07:00
2018-01-29 00:57:55 -08:00
InitGraf := $01
2018-02-28 19:02:39 -08:00
;;; (no parameters)
2018-01-21 15:37:55 -08:00
2018-02-18 12:49:59 -08:00
SetSwitches := $02 ; Configure display switches
2018-02-18 15:28:33 -08:00
;;; .byte flags bit 0=hires, 1=page2, 2=mixed, 3=text
2018-01-28 21:18:00 -08:00
;;; --------------------------------------------------
;;; GrafPort Commands
2018-02-18 12:49:59 -08:00
InitPort := $03 ; Initialize GrafPort to standard values
2018-02-18 15:28:33 -08:00
;;; (input is address of GrafPort record)
2018-02-18 12:49:59 -08:00
SetPort := $04 ; Set current port as specified
2018-02-18 15:28:33 -08:00
;;; (input is address of GrafPort record)
2018-02-18 12:49:59 -08:00
GetPort := $05 ; Get pointer to current port
2018-02-18 15:28:33 -08:00
;;; .addr port (out)
2018-02-18 12:49:59 -08:00
SetPortBits := $06 ; Set just the mapinfo (viewloc, mapbits)
2018-02-18 15:28:33 -08:00
;;; (input is address of MapInfo record)
2018-01-29 08:25:56 -08:00
SetPenMode := $07 ; Set the current pen mode
2018-02-18 15:28:33 -08:00
;;; .byte mode pen*/notpen*
2018-01-29 08:25:56 -08:00
SetPattern := $08 ; Set the current pattern
2018-02-18 15:28:33 -08:00
;;; .res 8 pattern 8x8 pixel pattern for PaintRect calls
2017-10-07 13:59:25 -07:00
2018-01-29 08:25:56 -08:00
SetColorMasks := $09 ; Set the current color masks
2018-02-18 15:28:33 -08:00
;;; .byte and_mask
;;; .byte or_mask
2017-09-02 18:51:03 -07:00
2018-01-29 08:25:56 -08:00
SetPenSize := $0A ; Set the current pen size
2018-02-18 15:28:33 -08:00
;;; .byte penwidth horizontal pen thickness
;;; .byte penheight vertical pen thickness
2017-09-10 20:40:32 -07:00
2018-01-29 08:25:56 -08:00
SetFont := $0B ; Set the current font
2018-02-18 15:28:33 -08:00
;;; .addr textfont font definition
2018-01-29 08:25:56 -08:00
SetTextBG := $0C ; Set the current text background
2018-02-18 15:28:33 -08:00
;;; .byte backcolor 0=black, $7F=white
2017-09-02 18:51:03 -07:00
2018-01-28 21:18:00 -08:00
;;; --------------------------------------------------
;;; Drawing Commands
2018-02-18 12:49:59 -08:00
Move := $0D ; Set current pen location (relative)
2018-02-18 15:28:33 -08:00
;;; .word xdelta
;;; .word ydelta
2017-10-08 08:42:27 -07:00
2018-02-18 12:49:59 -08:00
MoveTo := $0E ; Set current pen location (absolute)
2018-02-18 15:28:33 -08:00
;;; Point pos
2017-09-01 08:15:05 -07:00
2018-02-18 12:49:59 -08:00
Line := $0F ; Draw line from current pen location (relative)
2018-02-18 15:28:33 -08:00
;;; .word xdelta
;;; .word ydelta
2017-09-10 20:40:32 -07:00
2018-02-18 12:49:59 -08:00
LineTo := $10 ; Draw line from current pen location (absolute)
2018-02-18 15:28:33 -08:00
;;; Point pos
2017-10-07 15:07:12 -07:00
2018-01-29 00:57:55 -08:00
PaintRect := $11 ; Fill rectangle with selected simple pattern/thickness
2018-02-18 15:28:33 -08:00
;;; Rect rect
2017-09-06 23:43:40 -07:00
2018-01-29 00:57:55 -08:00
FrameRect := $12 ; Draw rectangle with selected simple pattern/thickness
2018-02-18 15:28:33 -08:00
;;; Rect rect
2018-02-18 12:49:59 -08:00
InRect := $13 ; Is current position in bounds? A=$80 true, 0 false
2018-02-18 15:28:33 -08:00
;;; Rect rect
2017-09-09 12:18:06 -07:00
2018-01-29 00:57:55 -08:00
PaintBits := $14 ; Draw pattern
2018-02-18 15:28:33 -08:00
;;; (input is address of MapInfo record)
2017-09-02 09:44:33 -07:00
2018-01-29 00:57:55 -08:00
PaintPoly := $15
2018-02-18 17:08:11 -08:00
;;; (input is address of PolyList record)
2018-02-18 12:49:59 -08:00
FramePoly := $16 ; Draw multiple closed polygons
2018-02-18 17:08:11 -08:00
;;; (input is address of PolyList record)
2018-02-18 12:49:59 -08:00
InPoly := $17 ; Is current position in bounds? A=$80 true, 0 false
2018-02-18 17:08:11 -08:00
;;; (input is address of PolyList record)
2017-09-15 19:30:49 -07:00
2018-01-28 21:18:00 -08:00
;;; --------------------------------------------------
;;; Text Commands
2018-02-18 15:28:33 -08:00
TextWidth := $18 ; Measure the width of a string in pixels
;;; .addr data
;;; .byte length
;;; .word width (out) result in pixels
2018-02-28 19:02:39 -08:00
DrawText := $19 ; Drawn at penpos as left, baseline
2018-02-18 15:28:33 -08:00
;;; .addr data
;;; .byte length
2017-08-30 20:30:46 -07:00
2018-01-28 21:18:00 -08:00
;;; --------------------------------------------------
;;; Utility Commands
2018-02-19 21:32:47 -08:00
SetZP1 := $1A ; Configure lower half of ZP usage by API (speed vs. convenience)
SetZP2 := $1B ; Configure upper half ZP usage by API (speed vs. convenience)
2018-02-18 15:28:33 -08:00
;;; .byte preserve 0=stash/no auto restore; 1=restore now and onward
2017-12-30 21:22:06 -08:00
2018-02-18 12:49:59 -08:00
Version := $1C ; Get toolkit version
2018-02-18 15:28:33 -08:00
;;; .byte (out) major
;;; .byte (out) minor
;;; .byte (out) patch
;;; .byte (out) status
;;; .word (out) number
2018-01-28 21:18:00 -08:00
2018-03-04 21:36:00 -08:00
;;; ============================================================
2018-02-21 08:06:38 -08:00
;;; MouseGraphics ToolKit Calls
2018-03-04 21:36:00 -08:00
;;; ============================================================
2018-01-28 21:18:00 -08:00
;;; --------------------------------------------------
;;; Initialization Calls
2018-02-18 15:28:33 -08:00
StartDeskTop := $1D ; Inits state, registers interrupt handler, draws desktop
;;; .byte machine ROM FBB3 ($06 = IIe or later)
;;; .byte subid ROM FBC0 ($EA = IIe, $E0 = IIe enh/IIgs, $00 = IIc/IIc+)
;;; .byte op_sys 0=ProDOS, 1=Pascal
;;; .byte slot_num Mouse slot, 0 = search (will be filled in)
2018-02-18 15:28:33 -08:00
;;; .byte use_interrupts 0=passive, 1=interrupt
;;; .addr sysfontptr
;;; .addr savearea buffer for saving screen data (e.g. behind menus)
;;; .word savesize bytes
2017-10-14 22:09:00 -07:00
2018-02-18 15:28:33 -08:00
StopDeskTop := $1E ; Deallocates interrupt, hides cursor
;;; (no parameters)
2017-10-14 22:09:00 -07:00
2018-02-18 11:33:21 -08:00
SetUserHook := $1F
2018-02-18 15:28:33 -08:00
;;; .byte hook_id 0=before, 1=after event checking
;;; .addr routine_ptr 0=remove hook_id
2018-01-29 00:57:55 -08:00
2018-02-18 15:28:33 -08:00
AttachDriver := $20 ; Install pointer driver; A=0 on success, $95 if mouse disabled
;;; .addr hook Mouse hook routine to install
;;; .addr mouse_state (out) Address of mouse state (.word x, y; .byte status)
2018-02-18 11:33:21 -08:00
ScaleMouse := $21 ; Set mouse/screen scaling
2018-02-18 15:28:33 -08:00
;;; .byte x_exponent x-scale factor for mouse, 0...3
;;; .byte y_exponent y-scale factor for mouse, 0...3
2018-01-29 00:57:55 -08:00
2018-02-18 11:33:21 -08:00
KeyboardMouse := $22 ; Next operation will be performed by keyboard
2018-02-18 15:28:33 -08:00
;;; (no parameters)
2018-01-29 00:57:55 -08:00
2018-02-18 11:33:21 -08:00
GetIntHandler := $23 ; Get address of interrupt handler
2018-02-18 15:28:33 -08:00
;;; .addr handler (out) Address of interrupt handler (after cld)
2017-10-15 20:20:54 -07:00
2018-01-28 21:18:00 -08:00
;;; --------------------------------------------------
;;; Cursor Manager Calls
2018-02-18 11:33:21 -08:00
;;; Cursor record:
;;;
2018-02-18 15:28:33 -08:00
;;; .res 24 bitmap 2x12 byte bitmap (XOR'd after mask)
;;; .res 24 mask 2x12 byte mask (OR'd with screen)
;;; .byte hotx hotspot coords (pixels)
;;; .byte hoty
2018-02-18 15:28:33 -08:00
SetCursor := $24 ; Set cursor definition
;;; (input is address of Cursor record)
2017-09-06 23:43:40 -07:00
2018-02-18 15:28:33 -08:00
ShowCursor := $25 ; Return cursor to visibility
;;; (no parameters)
2017-10-14 12:56:59 -07:00
2018-02-18 15:28:33 -08:00
HideCursor := $26 ; Cursor hidden until ShowCursor call
;;; (no parameters)
2017-09-06 23:43:40 -07:00
2018-02-18 15:28:33 -08:00
ObscureCursor := $27 ; Cursor hidden until moved
;;; (no parameters)
2018-02-18 11:33:21 -08:00
2018-02-18 15:28:33 -08:00
GetCursorAddr := $28 ; Get cursor definition
;;; .addr definition (out) Address of cursor record
2018-01-28 21:18:00 -08:00
;;; --------------------------------------------------
;;; Event Manager Calls
2017-10-14 12:51:25 -07:00
2018-02-18 11:33:21 -08:00
;;; Event record:
;;;
2018-02-18 17:08:11 -08:00
;;; .byte kind event_kind_*
2018-02-18 11:33:21 -08:00
;;; if kind is event_kind_key_down:
;;; .byte key (ASCII code; high bit clear)
;;; .byte modifiers (0=none, 1=open-apple, 2=solid-apple, 3=both)
;;; if kind is event_kind_update:
;;; .byte window_id
2018-02-18 15:28:33 -08:00
;;; otherwise:
2018-02-18 11:33:21 -08:00
;;; .word xcoord
;;; .word ycoord
CheckEvents := $29 ; Process mouse/kbd if GetEvent will be delayed.
2018-02-18 15:28:33 -08:00
;;; (no parameters)
2018-01-29 00:57:55 -08:00
GetEvent := $2A
2018-02-18 15:28:33 -08:00
;;; (parameter is address of Event record)
2017-08-31 19:05:41 -07:00
2018-01-29 00:57:55 -08:00
FlushEvents := $2B
2018-02-18 15:28:33 -08:00
;;; (no parameters)
2018-01-29 08:25:56 -08:00
PeekEvent := $2C
2018-02-18 15:28:33 -08:00
;;; (parameter is address of Event record)
2017-09-15 19:30:49 -07:00
2018-02-18 11:33:21 -08:00
PostEvent := $2D ; Post event to queue
2018-02-18 15:28:33 -08:00
;;; (parameter is address of Event record)
2018-02-18 11:33:21 -08:00
2018-02-18 15:28:33 -08:00
SetKeyEvent := $2E ; If set, keypresses are ignored by Tool Kit
;;; .byte handle_keys high bit set = ignore keyboard, otherwise check
2017-10-15 20:28:50 -07:00
2018-01-28 21:18:00 -08:00
;;; --------------------------------------------------
;;; Menu Manager Calls
2018-02-18 11:33:21 -08:00
;;; Menu Bar record:
;;;
2018-02-18 15:28:33 -08:00
;;; .word count Number of menu bar items
2018-02-18 11:33:21 -08:00
;;; (array of...)
2018-02-18 15:28:33 -08:00
;;; .byte menu_id Menu identifier
;;; .byte disabled Flag
;;; .addr title Address of length-prefixed string
;;; .addr menu Address of Menu record
;;; .res 6 reserved Reserved
2018-02-18 11:33:21 -08:00
;;; ...
;;;
;;; Menu record:
;;;
2018-04-02 10:00:43 -05:00
;;; .byte count Number of items in menu
2018-02-18 15:28:33 -08:00
;;; .res 5 reserved Reserved
2018-04-02 10:00:43 -05:00
;;; (array of...)
2018-02-18 15:28:33 -08:00
;;; .byte options bit 0=OA, 1=SA, 2=mark, 5=check, 6=filler, 7=disabled
;;; .byte mark_char Custom mark character if mark option set
;;; .byte char1 ASCII code of shortcut #1 (e.g. uppercase B); or 0
;;; .byte char2 ASCII code of shortcut #2 (e.g. lowercase b, or same); or 0
;;; .addr name Address of length-prefixed string
2018-02-18 11:33:21 -08:00
;;; ...
2018-01-29 00:57:55 -08:00
InitMenu := $2F
2018-02-18 15:28:33 -08:00
;;; .byte solid_char char code to use for solid apple glyph
;;; .byte open_char char code to use for open apple glyph
;;; .byte check_char char code to use for checkmark glyph
;;; .byte control_char char code to use for control key glyph
2018-01-29 00:57:55 -08:00
2018-02-18 15:28:33 -08:00
SetMenu := $30 ; Configure (and draw) menu
;;; (input is address of Menu Bar record)
2017-10-14 19:45:51 -07:00
2018-02-18 15:28:33 -08:00
MenuSelect := $31 ; Enter modal loop for handling mouse-down on menu bar
;;; .byte menu_id (out) Top level menu identifier, or 0 if none
;;; .byte menu_item (out) Index (1-based) of item in menu, or 0 if none
2018-02-18 11:33:21 -08:00
MenuKey := $32 ; Find menu item corresponding to keypress
2018-02-18 15:28:33 -08:00
;;; .byte menu_id (out)
;;; .byte menu_item (out)
;;; .byte which_key
;;; .byte key_mods bit 0=OA, bit 1=SA
2018-02-18 11:33:21 -08:00
HiliteMenu := $33 ; Toggle highlight state of menu
2018-02-18 15:28:33 -08:00
;;; .byte menu_id
2017-10-14 19:45:51 -07:00
2018-01-29 00:57:55 -08:00
DisableMenu := $34
2018-02-18 15:28:33 -08:00
;;; .byte menu_id
;;; .byte disable 0=enable, 1=disable
2018-02-18 11:33:21 -08:00
2018-01-29 00:57:55 -08:00
DisableItem := $35
2018-02-18 15:28:33 -08:00
;;; .byte menu_id
;;; .byte menu_item
;;; .byte disable 0=enable, 1=disable
2018-02-18 11:33:21 -08:00
2018-01-29 00:57:55 -08:00
CheckItem := $36
2018-02-18 15:28:33 -08:00
;;; .byte menu_id
;;; .byte menu_item
;;; .byte check 0=unchecked, 1=checked
2018-02-18 11:33:21 -08:00
2018-01-29 00:57:55 -08:00
SetMark := $37
2018-02-18 15:28:33 -08:00
;;; .byte menu_id
;;; .byte menu_item
;;; .byte set_char 0=use checkmark, 1=use mark_char
;;; .byte mark_char char code to use for mark
2018-01-29 00:57:55 -08:00
2018-01-28 21:18:00 -08:00
;;; --------------------------------------------------
;;; Window Manager Calls
2018-02-18 11:33:21 -08:00
;;; WInfo record:
;;;
2018-02-18 15:28:33 -08:00
;;; .byte id
;;; .byte options option_*
;;; .addr title
;;; .byte hscroll scroll_option_*
;;; .byte vscroll scroll_option_*
;;; .byte hthumbmax
;;; .byte hthumbpos
;;; .byte vthumbmax
;;; .byte vthumbpos
;;; .byte status
;;; .byte reserved
;;; .word mincontwidth minimum content size (horizontal)
;;; .word mincontlength minimum content size (vertical)
;;; .word maxcontwidth maximum content size (horizontal)
2018-02-18 15:28:33 -08:00
;;; .word maxcontlength maximum content size (vertical)
;;; GrafPort windowport GrafPort record
;;; .addr nextwinfo address of next lower window in stack
2018-02-18 11:33:21 -08:00
2018-01-29 00:57:55 -08:00
OpenWindow := $38
2018-02-18 15:28:33 -08:00
;;; (input is address of WInfo record)
2017-08-31 19:05:41 -07:00
2018-01-29 00:57:55 -08:00
CloseWindow := $39
2018-02-18 15:28:33 -08:00
;;; .byte window_id
2017-08-30 20:30:46 -07:00
2018-01-29 00:57:55 -08:00
CloseAll := $3A
2018-02-18 15:28:33 -08:00
;;; (no parameters)
2018-01-29 00:57:55 -08:00
2018-02-18 11:33:21 -08:00
GetWinPtr := $3B ; Get pointer to window params by id; A=0 on success
2018-02-18 15:28:33 -08:00
;;; .byte window_id
;;; .addr window_ptr (out) winfo address
2017-09-15 19:30:49 -07:00
2018-04-06 08:05:35 -07:00
GetWinPort := $3C ; Get drawing state of window (possibly clipped)
2018-02-18 15:28:33 -08:00
;;; .byte window_id
2018-04-06 08:05:35 -07:00
;;; .addr port address of grafport to populate
2017-10-14 21:15:35 -07:00
2018-02-18 12:18:42 -08:00
SetWinPort := $3D ; Update port of window
2018-02-18 15:28:33 -08:00
;;; .byte window_id
;;; .addr port GrafPort to copy from
2017-10-14 21:15:35 -07:00
2018-02-18 12:18:42 -08:00
BeginUpdate := $3E ; Respond to update event for window
2018-02-18 15:28:33 -08:00
;;; .byte window_id
2018-01-29 00:57:55 -08:00
EndUpdate := $3F
2018-02-28 19:02:39 -08:00
;;; (no parameters)
2018-01-29 00:57:55 -08:00
FindWindow := $40
2018-02-18 15:28:33 -08:00
;;; .word mousex screen coordinates
;;; .word mousey
;;; .byte which_area (out) area_*
;;; .byte window_id (out) of window
2017-08-30 20:30:46 -07:00
2018-02-18 15:28:33 -08:00
FrontWindow := $41 ; Get id of top window
;;; .byte window_id (out) window, or 0 if none
2017-09-15 19:30:49 -07:00
2018-02-18 15:28:33 -08:00
SelectWindow := $42 ; Make window topmost
;;; .byte window_id
2017-10-11 21:33:23 -07:00
2018-01-29 00:57:55 -08:00
TrackGoAway := $43
2018-02-18 15:28:33 -08:00
;;; .byte clicked (out) 0 = cancelled, 1 = close
2017-08-30 20:30:46 -07:00
2018-01-29 00:57:55 -08:00
DragWindow := $44
2018-02-18 15:28:33 -08:00
;;; .byte window_id
;;; .word dragx mouse coords
;;; .word dragy
;;; .byte moved high bit set if moved, clear if not
2017-09-10 19:40:52 -07:00
2018-01-29 00:57:55 -08:00
GrowWindow := $45
2018-02-18 15:28:33 -08:00
;;; .byte window_id
;;; .word mousex
;;; .word mousey
;;; .byte itgrew (out) 0 = no change, 1 = moved
2017-09-01 19:54:04 -07:00
2018-02-28 19:02:39 -08:00
ScreenToWindow := $46 ; Map screen coords to content coords
2018-02-18 15:28:33 -08:00
;;; .byte window_id
;;; .word screenx
;;; .word screeny
;;; .word windowx (out)
;;; .word windowy (out)
2018-02-28 19:02:39 -08:00
WindowToScreen := $47 ; Map content coords to screen coords
2018-02-18 15:28:33 -08:00
;;; .byte window_id
;;; .word windowx
;;; .word windowy
;;; .word screenx (out)
;;; .word screeny (out)
2018-01-29 00:57:55 -08:00
2018-01-28 21:18:00 -08:00
;;; --------------------------------------------------
;;; Control Manager Calls
2018-01-29 00:57:55 -08:00
FindControl := $48
2018-02-18 15:28:33 -08:00
;;; .word mousex
;;; .word mousey
;;; .byte which_ctl ctl_*
;;; .byte which_part part_*
2017-08-31 22:12:02 -07:00
2018-02-18 12:49:59 -08:00
SetCtlMax := $49
2018-02-18 15:28:33 -08:00
;;; .byte which_ctl ctl_*_scroll_bar
;;; .byte ctlmax maximum value
2017-09-01 19:54:04 -07:00
2018-01-29 00:57:55 -08:00
TrackThumb := $4A
2018-02-18 15:28:33 -08:00
;;; .byte which_ctl ctl_*_scroll_bar
;;; .word mousex
;;; .word mousey
;;; .byte thumbpos (out) 0...255
;;; .byte thumbmoved (out) 0 = no change, 1 = moved
2017-08-30 20:30:46 -07:00
2018-01-29 00:57:55 -08:00
UpdateThumb := $4B
2018-02-18 15:28:33 -08:00
;;; .byte which_ctl ctl_*_scroll_bar
;;; .byte thumbpos new position 0...250
2017-09-10 19:40:52 -07:00
2018-02-18 12:18:42 -08:00
ActivateCtl := $4C ; Activate/deactivate scroll bar
2018-02-18 15:28:33 -08:00
;;; .byte which_ctl ctl_*_scroll_bar
;;; .byte activate 0=deactivate, 1=activate
2018-02-18 12:18:42 -08:00
;;; $4D ???
2018-02-18 15:28:33 -08:00
;;; (input length: 16 bytes)
2018-01-29 00:57:55 -08:00
2018-02-18 12:18:42 -08:00
;;; $4E ???
2018-02-18 15:28:33 -08:00
;;; (input length: 2 bytes)
2018-03-04 21:36:00 -08:00
;;; ============================================================
2018-01-28 21:18:00 -08:00
;;; Graphics Primitives Constants
2018-01-29 00:57:55 -08:00
;;; Used in GetWinPort / SetPortBits
2018-02-18 15:28:33 -08:00
screen_mapbits := $2000 ; Screen address
screen_mapwidth := $80 ; Stride in bytes
2018-01-28 21:18:00 -08:00
;;; Used in SetPenMode
2018-02-18 12:49:59 -08:00
pencopy := 0
penOR := 1
penXOR := 2
penBIC := 3
notpencopy := 4
notpenOR := 5
notpenXOR := 6
notpenBIC := 7
2018-01-28 21:18:00 -08:00
;;; Used in SetZP1
zp_overwrite := 0
zp_preserve := 1<<7
2017-09-21 08:09:11 -07:00
2018-02-18 17:08:11 -08:00
;;; Used in GrafPorts
2018-01-28 21:18:00 -08:00
colormask_and := $FF
colormask_or := $00
2018-02-06 21:59:25 -08:00
textbg_black := $00
2018-01-28 21:18:00 -08:00
textbg_white := $7F
2018-03-04 21:36:00 -08:00
;;; ============================================================
2018-02-21 08:06:38 -08:00
;;; MouseGraphics ToolKit Constants
2018-01-28 21:18:00 -08:00
;;; Used in GetEvent
2018-02-02 20:10:19 -08:00
event_kind_no_event := 0 ; No mouse or keypress
event_kind_button_down := 1 ; Mouse button was depressed
event_kind_button_up := 2 ; Mouse button was released
event_kind_key_down := 3 ; Key was pressed
event_kind_drag := 4 ; Mouse button still down
event_kind_apple_key := 5 ; Mouse button was depressed, modifier key down
2018-02-16 12:14:39 -08:00
event_kind_update := 6 ; Window update needed
2018-01-28 21:18:00 -08:00
2018-02-03 23:22:56 -08:00
event_modifier_open_apple := 1 << 0
event_modifier_solid_apple := 1 << 1
2018-01-28 21:18:00 -08:00
;;; Used in FindWindow
area_desktop := 0
area_menubar := 1
area_content := 2 ; Includes scroll bars
area_dragbar := 3
area_grow_box := 4
area_close_box := 5
;;; Used in FindControl, TrackThumb, UpdateThumb
ctl_not_a_control := 0
ctl_vertical_scroll_bar := 1
ctl_horizontal_scroll_bar := 2
2018-02-02 20:41:42 -08:00
ctl_dead_zone := 3
2018-01-28 21:18:00 -08:00
;;; Used in FindControl
part_up_arrow := 1
part_left_arrow := 1
part_down_arrow := 2
part_right_arrow := 2
part_page_up := 3
part_page_left := 3
part_page_down := 4
part_page_right := 4
part_thumb := 5
;;; Used in OpenWindow
option_dialog_box := 1 << 0
option_go_away_box := 1 << 1
option_grow_box := 1 << 2
scroll_option_none := 0
scroll_option_present := 1 << 7
scroll_option_thumb := 1 << 6
scroll_option_active := 1 << 0
scroll_option_normal := scroll_option_present | scroll_option_thumb | scroll_option_active
2018-01-29 23:34:12 -08:00
;;; Used in menu structs
2018-01-29 23:58:53 -08:00
menuopt_open_apple := 1 << 0
menuopt_solid_apple := 1 << 1
menuopt_item_has_mark := 1 << 2
menuopt_item_is_checked := 1 << 5
menuopt_item_is_filler := 1 << 6
menuopt_disable_flag := 1 << 7
2018-01-29 23:34:12 -08:00
2018-02-06 21:59:25 -08:00
disablemenu_enable := 0
disablemenu_disable := 1
disableitem_enable := 0
disableitem_disable := 1
2018-02-13 18:53:02 -08:00
checkitem_uncheck := 0
checkitem_check := 1
2018-02-13 19:15:45 -08:00
;;; Used in ActivateCtl
activatectl_deactivate := 0
activatectl_activate := 1
2018-02-04 19:13:21 -08:00
;;; Response from InRect/InPoly
2018-02-03 20:06:16 -08:00
inrect_inside := $80
inrect_outside := $00
2018-02-04 19:13:21 -08:00
inpoly_inside := $80
inpoly_outside := $00
2018-02-03 20:06:16 -08:00
2018-03-04 21:36:00 -08:00
;;; ============================================================
2018-02-12 21:14:23 -08:00
;;; Offsets
2018-05-25 18:39:43 -07:00
.struct Point
xcoord .word
ycoord .word
.endstruct
.struct Rect
x1 .word
y1 .word
x2 .word
y2 .word
.endstruct
.struct Pattern
bits .res 8
.endstruct
.struct MapInfo
viewloc .tag Point
2018-05-25 18:49:36 -07:00
mapbits .word
mapwidth .byte
2018-05-25 18:39:43 -07:00
reserved .byte
2018-05-25 18:49:36 -07:00
maprect .tag Rect
2018-05-25 18:39:43 -07:00
.endstruct
.struct GrafPort
viewloc .tag Point
mapbits .addr
mapwidth .byte
reserved .byte
maprect .tag Rect
pattern .tag Pattern
colormasks .byte 2
penloc .tag Point
penwidth .byte
penheight .byte
penmode .byte
textback .byte
textfont .addr
.endstruct
2018-02-12 21:36:41 -08:00
2018-05-25 18:49:36 -07:00
.struct Winfo
window_id .byte
options .byte
title .addr
hscroll .byte
vscroll .byte
hthumbmax .byte
hthumbpos .byte
vthumbmax .byte
vthumbpos .byte
status .byte
reserved .byte
mincontwidth .word
mincontheight .word
maxcontwidth .word
maxcontheight .word
port .tag GrafPort
nextwinfo .addr
.endstruct
2018-02-12 21:14:23 -08:00
2018-04-02 10:00:43 -05:00
menu_size := 12
menu_item_size := 6
short_event_size := 4 ; events that don't have mouse coordinates
event_size := 5 ; any kind of event
cursor_height := 12
cursor_width := 2
cursor_offset_mask := cursor_width * cursor_height
cursor_offset_hotspot := 2 * cursor_width * cursor_height
cursor_size := cursor_offset_hotspot + 2
font_offset_fonttype := 0
font_offset_lastchar := 1
font_offset_height := 2
font_offset_charwidth := 3
;;; Errors
error_empty_object := $81
error_bad_object := $82
error_font_too_big := $83
error_invalid_op_sys := $90
error_no_mouse := $92
error_invalid_irq_setting := $93
error_invalid_hook := $94
error_desktop_already_initialized := $95
error_irq_in_use := $97
error_invalid_event := $98
2018-04-02 10:00:43 -05:00
error_event_queue_full := $99
error_menu_not_found := $9A
error_menu_item_not_found := $9B
error_insufficient_savebehind_area := $9C
error_window_already_exists := $9D
error_window_id_required := $9E
error_window_not_found := $9F
error_no_active_window := $A0
error_window_not_draggable := $A1
error_window_not_resizable := $A2
error_window_obscured := $A3
error_control_not_found := $A4
2018-01-28 21:18:00 -08:00
.endscope ; MGTK
2017-08-31 22:39:06 -07:00
2018-03-04 21:36:00 -08:00
;;; ============================================================
;;; Macros
2018-01-28 21:18:00 -08:00
;;; Call an MGTK entry point:
;;; MGTK_CALL n - params is $0000
;;; MGTK_CALL n, params_addr
;;; MGTK_CALL m, params_addr, label - params_addr is labeled for modifying
2018-01-28 21:18:00 -08:00
.macro MGTK_CALL op, addr, label
jsr MGTK::MLI
.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
.addr addr
2017-09-06 23:43:40 -07:00
.else
.addr 0
.endif
.endmacro
;;; ------------------------------------
;;; Rect definition. Option fifth param gives scope.
;;; DEFINE_RECT 0,0,20,30
;;; DEFINE_RECT 0,0,20,30,rect ; rect::x1, rect::y1, rect::x2, rect::y2
.macro DEFINE_RECT left, top, right, bottom, opt_scope
2018-01-30 19:04:33 -08:00
.if .paramcount > 4
.scope opt_scope
2018-01-30 19:04:33 -08:00
x1: .word left
y1: .word top
x2: .word right
y2: .word bottom
.endscope
2018-01-30 19:04:33 -08:00
.else
2018-01-29 23:34:12 -08:00
.word left
.word top
.word right
.word bottom
2018-01-30 19:04:33 -08:00
.endif
2018-01-29 23:34:12 -08:00
.endmacro
;;; Point definition. Option third param gives scope.
;;; DEFINE_POINT 10,20
;;; DEFINE_POINT 10,20,pt ; pt::xcoord, pt::ycoord
.macro DEFINE_POINT left, top, opt_scope
2018-01-30 21:22:13 -08:00
.if .paramcount > 2
.scope opt_scope
2018-01-30 21:22:13 -08:00
xcoord: .word left
ycoord: .word top
.endscope
2018-01-30 21:22:13 -08:00
.else
2018-01-29 23:34:12 -08:00
.word left
.word top
2018-01-30 21:22:13 -08:00
.endif
2018-01-29 23:34:12 -08:00
.endmacro
;;; String definition w/ inline data, for use with DrawText
;;; DEFINE_STRING "abc"
;;; DEFINE_STRING {"Ring a bell",$07,"!!!"} ; control characters
;;; Optional second param gives label to internal Pascal string
.macro DEFINE_STRING str, opt_label
.local data
.local end
.addr data ; textptr
.if .paramcount > 1
opt_label:
.endif
.byte end - data ; textlen
2017-09-28 12:24:41 -07:00
data: .byte str
2017-09-12 21:27:27 -07:00
end:
.endmacro
2017-09-03 21:47:45 -07:00
2018-01-29 23:34:12 -08:00
;;; Menus (common cases; other options are possible)
.macro DEFINE_MENU_BAR count
.byte count ; num menus
.byte 0 ; reserved
.endmacro
.macro DEFINE_MENU_BAR_ITEM id, label, menu
.byte id ; menu id
.byte 0 ; disable flag
.addr label ; title pointer
.addr menu ; pointer to menu
.res 6, 0 ; 6 reserved bytes
.endmacro
.macro DEFINE_MENU count
.byte count ; num items
.res 5, 0 ; 5 reserved bytes
.endmacro
.macro DEFINE_MENU_ITEM saddr, shortcut1, shortcut2
.if .paramcount > 1
2018-01-29 23:58:53 -08:00
.byte MGTK::menuopt_open_apple ; option byte
.byte 0 ; mark_char
.byte shortcut1 ; char1
.byte shortcut2 ; char2
.addr saddr ; item_str_pointer
2018-01-29 23:34:12 -08:00
.else
.byte 0 ; option byte
2018-01-29 23:58:53 -08:00
.byte 0 ; mark_char
.byte 0 ; char1
.byte 0 ; char2
.addr saddr ; item_str_pointer
2018-01-29 23:34:12 -08:00
.endif
.endmacro
.macro DEFINE_MENU_SEPARATOR
2018-01-29 23:58:53 -08:00
.byte MGTK::menuopt_item_is_filler ; option byte
.byte 0 ; mark_char
.byte 19 ; char1 - Ctrl+S for separator ???
.byte 0 ; char2
.addr 0 ; item_str_pointer
2018-01-29 23:34:12 -08:00
.endmacro
;;; ------------------------------------
2017-09-29 16:57:02 -04:00
2018-01-28 21:18:00 -08:00
;;; Define pattern for PaintBits - low 7 bits are reversed
;;; e.g. .byte px(%1000000)
2017-09-27 19:41:40 -07:00
;;; px() has high bit clear, PX() has high bit set
.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-27 19:41:40 -07:00
.define PX(bits) (((bits&$40)>>6)|((bits&$20)>>4)|((bits&$10)>>2)|(bits&$8)|((bits&$4)<<2)|((bits&$2)<<4)|((bits&$1)<<6)|$80)