mirror of
https://github.com/dwsJason/gslaplay.git
synced 2025-02-27 00:31:01 +00:00
commit
e187bc5cec
77
Makefile
Normal file
77
Makefile
Normal file
@ -0,0 +1,77 @@
|
||||
#
|
||||
# gslaplay/Makefile
|
||||
#
|
||||
|
||||
# This makefile was created by Jason Andersen
|
||||
#
|
||||
# I build on Windows-10 64-bit, this makefile is designed to run under
|
||||
# a Windows-10 Command Prompt, and makes use of DOS shell commands
|
||||
#
|
||||
# As far a free stuff, I setup a c:\bin directory, in my path
|
||||
# the following packages and executables are in there
|
||||
#
|
||||
# Fine Tools from Brutal Deluxe
|
||||
# http://www.brutaldeluxe.fr/products/crossdevtools/
|
||||
# Cadius.exe
|
||||
# Merlin32.exe
|
||||
# OMFAnalyzer.exe
|
||||
# LZ4.exe
|
||||
#
|
||||
# gnumake-4.2.1-x64.exe (with a symbolic link that aliases this to "make")
|
||||
#
|
||||
# https://apple2.gs/plus/
|
||||
# gsplus32.exe (KEGS based GS Emulator fork by Dagen Brock)
|
||||
# I configure this to boot the player.po image directly
|
||||
# once that's done "make run" will build, update the disk image
|
||||
# and boot into the player.
|
||||
#
|
||||
|
||||
# Make and Build Variables
|
||||
|
||||
TARGETNAME = play
|
||||
|
||||
VPATH = src:obj
|
||||
ASMFILES = $(wildcard asm/*.s)
|
||||
ASM = merlin32
|
||||
|
||||
help:
|
||||
@echo.
|
||||
@echo $(TARGETNAME) Makefile
|
||||
@echo -------------------------------------------------
|
||||
@echo build commands:
|
||||
@echo make gs - Apple IIgs
|
||||
@echo make image - Build Bootable .PO File
|
||||
@echo make run - Build / Run IIgs on emulator
|
||||
@echo make clean - Clean intermediate/target files
|
||||
@echo make depend - Build dependencies
|
||||
@echo -------------------------------------------------
|
||||
@echo.
|
||||
|
||||
$(TARGETNAME).sys16: $(ASMFILES) $(OBJFILES)
|
||||
$(ASM) -v macros asm/link.s
|
||||
move /y asm\$(TARGETNAME).sys16 .
|
||||
|
||||
gs: $(TARGETNAME).sys16
|
||||
|
||||
disk image: gs
|
||||
@echo Updating $(TARGETNAME).po
|
||||
@echo Remove $(TARGETNAME).sys16
|
||||
cadius deletefile $(TARGETNAME).po /$(TARGETNAME)/$(TARGETNAME).sys16
|
||||
@echo Add $(TARGETNAME).sys16
|
||||
cadius addfile $(TARGETNAME).po /$(TARGETNAME) ./$(TARGETNAME).sys16
|
||||
|
||||
run: image
|
||||
gsplus32
|
||||
|
||||
clean:
|
||||
@echo Remove $(TARGETNAME).sys16
|
||||
$(shell if exist $(TARGETNAME).sys16 echo Y | del $(TARGETNAME).sys16)
|
||||
# @echo Remove Intermediate Files
|
||||
# @del /q obj\*
|
||||
|
||||
depend:
|
||||
@echo TODO - make dependencies
|
||||
|
||||
# Create all the directories
|
||||
#$(shell if not exist $(DIRS) mkdir $(DIRS))
|
||||
|
136
README.md
136
README.md
@ -1,2 +1,138 @@
|
||||
# gslaplay
|
||||
Apple IIgs GSLA Player
|
||||
|
||||
Example of a GS LZB Animation Player
|
||||
|
||||
Inspired by Deluxe Animation Run/Skip/Dump, and FLI/FLC with similar properties
|
||||
|
||||
I replace the "Run" with a dictionary/frame buffer copy from the existing
|
||||
buffer to the existing buffer. This is able to runlength not just a single
|
||||
byte, but a repeating pattern of arbitrary length.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
New Apple IIgs Animation file format
|
||||
GS LZ Byte Compressed Animation
|
||||
Why? When there are so many image formats would we need another one? It’s
|
||||
because $C2/Paintworks animation format is just terribly inefficient.
|
||||
|
||||
Care is taken in the encoder, to make sure the 65816 does not have to cross bank
|
||||
boundaries during any copy. This is so we can use the MVN instruction, and so
|
||||
we can reduce the number of bank checks in the code.
|
||||
|
||||
We have an opcode, that says “source data bank has changed”
|
||||
|
||||
Goals include a good balance between file size, and playback performance
|
||||
(since one often makes a trade off with the other).
|
||||
|
||||
The file is defined as a byte stream.
|
||||
|
||||
I will attempt to define the format as
|
||||
|
||||
file-offset: the thing that is at the offset
|
||||
|
||||
Header of the File is 20 bytes as follows
|
||||
|
||||
File Offset Data Commentary
|
||||
------------------------------------------------------------------
|
||||
0 0x47 ; ‘G’ Graphics
|
||||
1 0x53 ; ‘S’
|
||||
2 0x4C ; ‘L’ LZB
|
||||
3 0x41 ; ‘A’ Animation
|
||||
|
||||
; File Length, is the total length of the file
|
||||
4 FileLengthLow ; Low byte, 32-bit file length
|
||||
5 LengthLowHigh ; High byte of low word
|
||||
6 LengthHighLow ; Low byte, of high word
|
||||
7 LengthHighHigh ; High Byte, of high word
|
||||
|
||||
; 16 bit word with version #
|
||||
8 VL ; Version # of the file format, currently only version 0
|
||||
9 VH ; Version High Byte
|
||||
; %RVVV_VVVV_VVVV_VVVV
|
||||
; V is a version #, 0 for now
|
||||
; R is the MSB, R = 0 no ring frame
|
||||
; R = 1, there is a ring frame
|
||||
; A Ring Frame is a frame that will delta from the last
|
||||
; frame of the animation, back to the first, for smoother
|
||||
; looping , If a ring frame exists, it’s also in the
|
||||
; frame count
|
||||
|
||||
// next is a word, width in bytes (only 160 for now)
|
||||
0xA WL ; Display Width in bytes low byte
|
||||
0xB WH ; Display Width in bytes high byte
|
||||
// next is a word, height (likely 200 for now, in tiled mode a multiple of 16)
|
||||
0xC HL ; Display Height in bytes, low byte
|
||||
0xD HH ; Display Height in bytes, high byte
|
||||
// 2 bytes, Frame Size in Bytes, since a “Frame” may contain more than just the
|
||||
// width * height, worth of pixels, for now this is $8000, or 32768
|
||||
0xE FBL ; Frame Buffer Length Low
|
||||
0xF FBH ; Frame Buffer Length High
|
||||
|
||||
// 4 byte, 32-bit, Frame Count (includes total frame count, so if there is a
|
||||
// ring frame, this is included in the total)
|
||||
0x10 FrameCountLow
|
||||
0x11 FrameCountLowHigh
|
||||
0x12 FrameCountHighLow
|
||||
0x13 FrameCountHigh
|
||||
|
||||
|
||||
After this comes AIFF style chunks of data, basically a 4 byte chunk name,
|
||||
followed by a 4 byte length (inclusive of the chunk size). The idea is that
|
||||
you can skip chunks you don’t understand.
|
||||
|
||||
File Offset:
|
||||
0x14 First Chunk (followed by more Chunks, until end of file)
|
||||
|
||||
Chunk Definitions
|
||||
Name: ‘INIT’ - Initial Frame Chunk, this is the data used to first
|
||||
initialize the playback buffer
|
||||
0: 0x49 ; ‘I’
|
||||
1: 0x4E ; ‘N’
|
||||
2: 0x49 ; ‘I’
|
||||
3: 0x54 ; ‘T’
|
||||
// 32 bit long, length, little endian, including the 8 byte header
|
||||
4: length low low
|
||||
5: length low high
|
||||
6: length high low
|
||||
7: length high high
|
||||
|
||||
8: This is a single frame of data, that decodes/decompresses into frame sized
|
||||
bytes (right now 0x8000)
|
||||
This data stream includes, an end of animation opcode, so that the normal
|
||||
animation decompressor, can be called on this data, and it will emit the initial
|
||||
frame onto the screen
|
||||
|
||||
Name: ‘ANIM’ - Frames
|
||||
0: 0x41 ‘A’
|
||||
1: 0x4E ‘N’
|
||||
2: 0x49 ‘I’
|
||||
3: 0x4D ‘M’
|
||||
// 32 bit long, length, little endian, including chunk header
|
||||
4: length low low
|
||||
5: length low high
|
||||
6: length high low
|
||||
7: length high high
|
||||
|
||||
// This is followed by the frames, with the intention of decompressing them at
|
||||
// 60FPS, which is why no play speed is included, if you need a play-rate slower
|
||||
// than this, blank frame’s should be inserted into the animation data
|
||||
|
||||
// Every attempt is made to delta encode the image, meaning we just encode
|
||||
// information about what changed each frame. We attempt to make the size
|
||||
// efficient by supporting dictionary copies (where the dictionary is made up of
|
||||
// existing pixels in the frame buffer).
|
||||
|
||||
Command Word, encoded low-high, what the bits mean:
|
||||
|
||||
// xxx_xxxx_xxxx_xxx is the number of bytes 1-16384 to follow (0 == 1 byte)
|
||||
|
||||
* %0xxx_xxxx_xxxx_xxx1 - Copy Bytes - straight copy bytes
|
||||
* %1xxx_xxxx_xxxx_xxx1 - Skip Bytes - skip bytes / move the cursor
|
||||
* %1xxx_xxxx_xxxx_xxx0 - Dictionary Copy Bytes from frame buffer to frame buffer
|
||||
*
|
||||
* %0000_0000_0000_0000- Source Skip -> Source pointer skips to next bank of data
|
||||
* %0000_0000_0000_0010- End of Frame - end of frame
|
||||
* %0000_0000_0000_0110- End of Animation / End of File / no more frames
|
||||
|
||||
// other remaining codes, are reserved for future expansion
|
||||
|
||||
|
7
_FileInformation.txt
Normal file
7
_FileInformation.txt
Normal file
@ -0,0 +1,7 @@
|
||||
PLAY.SYS16=Type(B3),AuxType(DB07),VersionCreate(24),MinVersion(00),Access(21),FolderInfo1(000000000000000000000000000000000000),FolderInfo2(000000000000000000000000000000000000)
|
||||
XRICK.SYS16=Type(B3),AuxType(DB07),VersionCreate(24),MinVersion(00),Access(21),FolderInfo1(000000000000000000000000000000000000),FolderInfo2(000000000000000000000000000000000000)
|
||||
FUN2GS.SYS16=Type(B3),AuxType(DB07),VersionCreate(24),MinVersion(00),Access(21),FolderInfo1(000000000000000000000000000000000000),FolderInfo2(000000000000000000000000000000000000)
|
||||
FUNK.SYSTEM=Type(FF),AuxType(2000),VersionCreate(24),MinVersion(00),Access(21),FolderInfo1(000000000000000000000000000000000000),FolderInfo2(000000000000000000000000000000000000)
|
||||
BASIC.SYSTEM=Type(FF),AuxType(2000),VersionCreate(24),MinVersion(00),Access(21),FolderInfo1(000000000000000000000000000000000000),FolderInfo2(000000000000000000000000000000000000)
|
||||
XHD=Type(FF),AuxType(2000),VersionCreate(24),MinVersion(00),Access(21),FolderInfo1(000000000000000000000000000000000000),FolderInfo2(000000000000000000000000000000000000)
|
||||
PRODOS=Type(FF),AuxType(0000),VersionCreate(24),MinVersion(00),Access(21),FolderInfo1(000000000000000000000000000000000000),FolderInfo2(000000000000000000000000000000000000)
|
24
asm/link.s
Normal file
24
asm/link.s
Normal file
@ -0,0 +1,24 @@
|
||||
;
|
||||
; GSLA Player Merlin32 linker file
|
||||
;
|
||||
dsk play.sys16
|
||||
typ $b3 ; filetype
|
||||
aux $db07 ; auxtype
|
||||
;xpl ; Add ExpressLoad
|
||||
|
||||
*----------------------------------------------
|
||||
asm shell.s
|
||||
ds 0 ; padding
|
||||
knd #$1100 ; kind
|
||||
ali None ; alignment
|
||||
lna play ; load name
|
||||
sna start ; segment name
|
||||
*----------------------------------------------
|
||||
asm play.s
|
||||
ds 0 ; padding
|
||||
knd #$1100 ; kind
|
||||
ali None ; alignment
|
||||
lna play ; load name
|
||||
sna start ; segment name, doesn't work to try and merge segments here
|
||||
*----------------------------------------------
|
||||
|
174
asm/play.s
Normal file
174
asm/play.s
Normal file
@ -0,0 +1,174 @@
|
||||
*
|
||||
* New Animated File Format
|
||||
*
|
||||
*
|
||||
* xxx_xxxx_xxxx_xxx is the number of bytes 1-16384 to follow (0 == 1 byte)
|
||||
*
|
||||
* %0xxx_xxxx_xxxx_xxx1 - Copy Bytes - straight copy bytes
|
||||
* %1xxx_xxxx_xxxx_xxx1 - Skip Bytes - skip bytes / move the cursor
|
||||
* %1xxx_xxxx_xxxx_xxx0 - Dictionary Copy Bytes from frame buffer to frame buffer
|
||||
*
|
||||
* %0000_0000_0000_0000- Source Skip -> Source pointer skips to next bank of data
|
||||
* %0000_0000_0000_0010- End of Frame - end of frame
|
||||
* %0000_0000_0000_0110- End of Animation / End of File / no more frames
|
||||
*
|
||||
* other remaining codes, are reserved for future expansion
|
||||
*
|
||||
*
|
||||
* 16 bit opcode
|
||||
*
|
||||
* %1 xxx xxxx xxxx xxx 0
|
||||
* %0 xxx xxxx xxxx xxx 0
|
||||
*
|
||||
* X = SRC
|
||||
* Y = DST
|
||||
*
|
||||
* Source Data Stream Copy
|
||||
* Dictionary Copy
|
||||
* xx xxxx xxxx xxxx // up to 16384 length of copy (0 is a copy length of 1 byte, so it's length-1)
|
||||
*
|
||||
* Copy this code to your direct page, please make sure it's aligned to a page
|
||||
* The buffer is hardcoded to be at $012000, to take advantage of fast reads
|
||||
*
|
||||
* pass in a pointer to the start of the compressed stream
|
||||
* ldx #offset in source bank
|
||||
* lda #source bank
|
||||
* we assume all next bank data is sequential from this first bank, but it
|
||||
* wouldn't be hard to work from a list of banks, to make the player more
|
||||
* friendly
|
||||
|
||||
*--- this code sits at location $0 in the DP register
|
||||
*--- DP may be anywhere in bank 0, but make sure it's PAGE aligned
|
||||
*---- for performance reasons
|
||||
|
||||
dsk play.l
|
||||
|
||||
ext EndOfAnimFrame
|
||||
|
||||
;
|
||||
; Defines, for the list of allocated memory banks
|
||||
;
|
||||
banks_count equ $80
|
||||
banks_data equ $82
|
||||
|
||||
|
||||
player ent
|
||||
org $0
|
||||
mx %00
|
||||
phb
|
||||
sep #$20 ; preserve X
|
||||
sta <srcbank+2 ; self modify the code for mvn
|
||||
sta <read_opcode+3 ; data stream reader
|
||||
sta <dictionary_offset+3 ; opcode stream reader
|
||||
rep #$31
|
||||
ldy #$2000 ; it's a new frame, cursor starts at beginning of SHR
|
||||
|
||||
stz <banks_index
|
||||
* stz <frames
|
||||
|
||||
bra read_opcode
|
||||
*frames dw 0
|
||||
|
||||
extended_command
|
||||
beq :source_skip_next_bank
|
||||
lsr
|
||||
lsr
|
||||
bcs :end_of_file
|
||||
|
||||
; end of frame
|
||||
; check elapsed ticks (need at least 1)
|
||||
; For now just inline vsync (preferable to check the number of
|
||||
; if jiffy that have elapsed, because if the animation uses more than
|
||||
; roughly 10% of the screen we don't want to sync here
|
||||
phx
|
||||
|
||||
jsl EndOfAnimFrame
|
||||
|
||||
plx
|
||||
bcs :end_of_file
|
||||
|
||||
ldy #$2000
|
||||
bra read_opcode
|
||||
|
||||
:end_of_file
|
||||
plb ; restore bank
|
||||
rtl
|
||||
|
||||
:source_skip_next_bank
|
||||
*
|
||||
* If data is sequential in memory
|
||||
*
|
||||
*
|
||||
* ; source data, new bank
|
||||
* inc <read_opcode+3 ; 6
|
||||
* inc <dictionary_offset+3 ; 6
|
||||
* inc <srcbank+2 ; 6
|
||||
*
|
||||
|
||||
*
|
||||
* Our Banks of Data are in the order
|
||||
* they were allocated, so this is a little
|
||||
* more complicated
|
||||
*
|
||||
sep #$20 ; preserve Y, by leaving X long
|
||||
ldx <banks_index
|
||||
inx
|
||||
stx <banks_index
|
||||
lda <banks_data,x
|
||||
sta <srcbank+2 ; self modify the code for mvn
|
||||
sta <read_opcode+3 ; data stream reader
|
||||
sta <dictionary_offset+3 ; opcode stream reader
|
||||
rep #$31
|
||||
|
||||
; start of new bank
|
||||
ldx #0
|
||||
|
||||
:not_new_bank
|
||||
|
||||
; currently reserved
|
||||
bra read_opcode
|
||||
|
||||
stream_copy
|
||||
inx
|
||||
inx
|
||||
lsr
|
||||
bcc extended_command
|
||||
srcbank
|
||||
mvn $01,$01
|
||||
read_opcode
|
||||
ldal $000000,x
|
||||
bpl stream_copy
|
||||
inx
|
||||
inx
|
||||
dictionary_copy
|
||||
and #$7FFF
|
||||
lsr
|
||||
bcs cursor_skip
|
||||
|
||||
sta <temp
|
||||
|
||||
stx <dictionary_offset+1
|
||||
dictionary_offset
|
||||
ldal $000000
|
||||
tax
|
||||
|
||||
lda <temp
|
||||
; dictionary copy
|
||||
mvn $01,$01
|
||||
|
||||
ldx dictionary_offset+1
|
||||
inx
|
||||
inx
|
||||
|
||||
bra read_opcode
|
||||
|
||||
cursor_skip
|
||||
sty <skip_amount+1
|
||||
skip_amount
|
||||
adc #$0000
|
||||
tay
|
||||
bra read_opcode
|
||||
|
||||
banks_index dw 0
|
||||
temp dw 0
|
||||
|
19
asm/s.s
Normal file
19
asm/s.s
Normal file
@ -0,0 +1,19 @@
|
||||
lkv $02
|
||||
ver $02
|
||||
nol
|
||||
|
||||
do pass
|
||||
else
|
||||
cmd err.usr
|
||||
fin
|
||||
|
||||
asm shell
|
||||
|
||||
lnk shell.l
|
||||
save dwshell
|
||||
do pass
|
||||
cmd purge.mem
|
||||
cmd =dwshell
|
||||
fin
|
||||
|
||||
* eof
|
941
asm/shell.s
Normal file
941
asm/shell.s
Normal file
@ -0,0 +1,941 @@
|
||||
lst off
|
||||
*
|
||||
* DreamWorld Software Generic Shell
|
||||
*
|
||||
* v .02 10/8/90
|
||||
*
|
||||
* Updated for Merlin 32 07/11/2020
|
||||
*
|
||||
* play.s contains the interesting bits of the code
|
||||
*
|
||||
|
||||
* OA-F "damnmenu" to find menu definitions
|
||||
*
|
||||
|
||||
rel
|
||||
dsk shell.l
|
||||
use drm.macs
|
||||
|
||||
ext player
|
||||
|
||||
|
||||
;
|
||||
; Defines, for the list of allocated memory banks
|
||||
;
|
||||
banks_count equ $80
|
||||
banks_data equ $82
|
||||
|
||||
|
||||
|
||||
vidmode = $8080 ;Video mode for QD II (320) ($8000)
|
||||
;640 mode ($8080)
|
||||
|
||||
* startup tools, begin program
|
||||
|
||||
tool equ $e10000
|
||||
|
||||
|
||||
startup ent
|
||||
mx %00
|
||||
|
||||
; in theory here, our ProgID is already in A
|
||||
; and our DP is already in D
|
||||
;pha
|
||||
;phd
|
||||
|
||||
phk
|
||||
plb ;make the program bank = data bank
|
||||
|
||||
SetRes sep $30 ; 8-bit mode
|
||||
lda #$5C ; jml
|
||||
stal $3F8 ; ctrl-y vector
|
||||
rep $30 ; 16-bit mode
|
||||
lda #Resume
|
||||
stal $3F9 ; $3f9,3fa
|
||||
lda #^Resume ; bank byte
|
||||
stal $3FB ; $3fb,3fc
|
||||
|
||||
_TLStartUp ;Gotta start this baby
|
||||
|
||||
~MMStartUp ;start the Memory manager
|
||||
; CheckToolError
|
||||
|
||||
pla ;retrieve our program ID
|
||||
sta ProgID
|
||||
|
||||
;-------------------------------------------------------------------------------
|
||||
;
|
||||
; Initialize List of memory Banks
|
||||
;
|
||||
stz <banks_count
|
||||
|
||||
;-------------------------------------------------------------------------------
|
||||
PushLong #0 ; Compact Memory
|
||||
PushLong #$8fffff
|
||||
PushWord ProgID
|
||||
PushWord #%11000000_00000000
|
||||
PushLong #0
|
||||
ldx #$0902
|
||||
jsl tool ; NewHandle
|
||||
ldx #$1002
|
||||
jsl tool ; DisposeHandle
|
||||
ldx #$1F02
|
||||
jsl tool ; CompactMem
|
||||
|
||||
;-------------------------------------------------------------------------------
|
||||
;
|
||||
; Startup Way too many Tools
|
||||
;
|
||||
|
||||
PushLong #0 ;result space
|
||||
lda ProgID ;user ID
|
||||
pha
|
||||
pea #$0 ;reference by handle
|
||||
PushLong #startref
|
||||
ldx #$1801 ;startuptools
|
||||
jsl $e10000
|
||||
PullLong stref
|
||||
|
||||
;-------------------------------------------------------------------------------
|
||||
; I'm pretty sure one of the tools is allocating this out from under me
|
||||
;
|
||||
; PushLong #0 ; Ask Shadowing Screen ($8000 bytes from $01/2000)
|
||||
; PushLong #$8000
|
||||
; PushWord ProgID
|
||||
; PushWord #%11000000_00000011
|
||||
; PushLong #$012000
|
||||
; ldx #$0902
|
||||
; jsl tool ; NewHandle
|
||||
; pla
|
||||
; pla
|
||||
; bcc :NoError
|
||||
;
|
||||
; lda #0
|
||||
; pha
|
||||
; pha
|
||||
; pha
|
||||
; pha
|
||||
; PushLong #:shadow_error
|
||||
; Tool $590e ; AlertWindow
|
||||
; pla
|
||||
; brl ShutDown
|
||||
;
|
||||
;;-------------------------------------------------------------------------------
|
||||
;
|
||||
;:shadow_error asc '40\GSLA Player requires the Super Hires shadow'
|
||||
; asc ' memory to function properly.\^#5',00
|
||||
;
|
||||
;*-----------------------------
|
||||
:NoError
|
||||
jmp DoMenu
|
||||
|
||||
:trouble
|
||||
pha
|
||||
PushLong #0
|
||||
ldx #$1503
|
||||
jsl $e10000
|
||||
rtl
|
||||
|
||||
backhandle dw 0,0
|
||||
|
||||
*
|
||||
* Draw the desktop
|
||||
*
|
||||
|
||||
DoMenu
|
||||
; ldx #$0001
|
||||
; lda #$0000
|
||||
; jsr getmem
|
||||
; bcc :ov3
|
||||
; brl ShutDown
|
||||
;:ov3 ;handle in a and x
|
||||
; jsl dereference
|
||||
;
|
||||
; sta p:rbuf ; set up Disk I/O buffer
|
||||
; txa
|
||||
; sta p:rbuf+2
|
||||
;
|
||||
; ; A contains bank address to add
|
||||
; jsr AddBank
|
||||
|
||||
* PushLong #0
|
||||
* PushPtr ExampleM
|
||||
* _NewMenu
|
||||
* PushWord #0
|
||||
* _InsertMenu
|
||||
|
||||
PushLong #0
|
||||
PushPtr EditM
|
||||
_NewMenu
|
||||
PushWord #0
|
||||
_InsertMenu
|
||||
|
||||
PushLong #0
|
||||
PushPtr FileM
|
||||
_NewMenu
|
||||
PushWord #0
|
||||
_InsertMenu
|
||||
|
||||
PushLong #0
|
||||
PushPtr AppleM
|
||||
_NewMenu
|
||||
PushWord #0
|
||||
_InsertMenu
|
||||
|
||||
PushLong #1
|
||||
_FixAppleMenu
|
||||
|
||||
PHA
|
||||
_FixMenuBar
|
||||
PLA
|
||||
|
||||
_DrawMenuBar
|
||||
|
||||
_InitCursor
|
||||
|
||||
JSR DoOpen
|
||||
|
||||
* Command Processor
|
||||
*
|
||||
* Use TaskMaster to handle any and all events.
|
||||
* We only check for events within the menus
|
||||
* currently. The 'wInSpecial' ensures that we
|
||||
* get events 250-255.
|
||||
*
|
||||
|
||||
GetEvent
|
||||
pha
|
||||
PushWord #$FFFF ; all the things
|
||||
PushPtr TaskRecord
|
||||
_TaskMaster
|
||||
pla
|
||||
|
||||
cmp #25 ;wInSpecial
|
||||
beq :DoEvent
|
||||
cmp #17 ;wInMenuBar
|
||||
bne GetEvent
|
||||
|
||||
:DoEvent
|
||||
sec
|
||||
lda TaskData
|
||||
sbc #250 ;Reduce to 0 and
|
||||
asl ; double to find
|
||||
tax ; index into table.
|
||||
|
||||
jsr (Cmds,X)
|
||||
|
||||
PushWord #0
|
||||
PushWord TaskData+2
|
||||
_HiliteMenu
|
||||
|
||||
bra GetEvent
|
||||
|
||||
* damnmenu
|
||||
*
|
||||
* Menu definitions
|
||||
*
|
||||
|
||||
*
|
||||
*NOTE Currently setup for Merlin32
|
||||
*for Merlin 16, adjust the ]mnum, and ]inum definitions down by 1
|
||||
*due to how merlin 16 will scope / evaluate them inside the macro
|
||||
*
|
||||
|
||||
]mnum = 1 ; "1" - 1 = 0
|
||||
AppleM Menu '@';'X'
|
||||
]inum = 256
|
||||
Item 'About GSLA...';Divide;'';Kybd;'?/'
|
||||
|
||||
FileM Menu ' File '
|
||||
; Item 'New';Kybd;'Nn'
|
||||
Item 'Open...';Divide;'';Kybd;'Oo'
|
||||
]OpenItem = ]inum
|
||||
]inum = 255
|
||||
Item 'Close';Divide;'' ; (#255)
|
||||
]inum = ]OpenItem
|
||||
Item 'Quit';Kybd;'Qq'
|
||||
]QuitItem = ]inum
|
||||
|
||||
EditM Menu ' Edit '
|
||||
]inum = 250
|
||||
Item 'Undo';Divide;'';Kybd;'Zz' ; (#250)
|
||||
Item 'Cut';Kybd;'Xx' ; (#251)
|
||||
Item 'Copy';Kybd;'Cc' ; (#252)
|
||||
Item 'Paste';Divide;'';Kybd;'Vv' ; (#253)
|
||||
Item 'Clear' ; (#254)
|
||||
|
||||
*ExampleM Menu ' Example '
|
||||
*]inum = QuitItem
|
||||
* Item 'Bold';Disable;''
|
||||
* Item 'Disable';Disable;''
|
||||
* Item 'Italic';Disable;''
|
||||
* Item 'Underline';Disable;''
|
||||
* Item 'Divide';Disable;''
|
||||
* Item 'Check';Disable;''
|
||||
* Item 'Blank';Disable;''
|
||||
|
||||
asc '.' ;End of menu.
|
||||
|
||||
|
||||
TaskRecord
|
||||
tType ds 2 ;Event code
|
||||
tMessage ds 4 ;Type of Event
|
||||
tWhen ds 4 ;Time since startup
|
||||
tWhere ds 4 ;Mouse Location
|
||||
tMod ds 2 ;Event modifier
|
||||
TaskData ds 4 ;Taskmaster Data
|
||||
TaskMask adrl $00001FFF ;Taskmaster Handle All
|
||||
|
||||
Fileinfo ;place for file info
|
||||
Fopen dw 0 ;good info?
|
||||
Ftype dw 0 ;file type
|
||||
Atype adrl 0 ;aux type
|
||||
Nref dw 0 ;Name reference type
|
||||
Name adrl name ;Where is the name? (pointer)
|
||||
Pref dw 0 ;Path reference type
|
||||
Path adrl path ;Where is the path? (pointer)
|
||||
|
||||
name ds 256 ;space for filename
|
||||
path ds 512 ;space for pathname
|
||||
fullp ds 768
|
||||
|
||||
ProgID dw 0
|
||||
|
||||
|
||||
* ShutDown Routine
|
||||
|
||||
ShutDown ent ;a global label so other modules can die here.:)
|
||||
pea #$0 ;ref is pointer
|
||||
PushLong stref ;Reference to startstop record
|
||||
ldx #$1901
|
||||
jsl $e10000 ;Shut Down Tools
|
||||
|
||||
MMout ~MMShutDown ProgID
|
||||
|
||||
TLout _TLShutDown
|
||||
|
||||
:1 _QUIT QuitParms
|
||||
bra :1 ;keep quitting if GS/OS is busy
|
||||
|
||||
QuitParms adrl $0
|
||||
ds 2
|
||||
|
||||
getmem ent
|
||||
sta :sizelo+1
|
||||
stx :sizehi+1
|
||||
lda #0
|
||||
pha
|
||||
pha ; Space for Results
|
||||
:sizehi pea #$0000
|
||||
:sizelo pea #$ffff ; Size in Bytes of Block 64k
|
||||
lda ProgID
|
||||
pha
|
||||
gm_atr pea #%1100000000011100 ; Attributes
|
||||
lda #0
|
||||
pha
|
||||
pha ; Ptr to where Block is to begin
|
||||
ldx #$0902
|
||||
jsl tool ; NewHandle
|
||||
pla
|
||||
plx
|
||||
rts
|
||||
|
||||
dereference ent
|
||||
pei 0
|
||||
pei 2
|
||||
sta 0
|
||||
stx 2
|
||||
lda [0]
|
||||
pha
|
||||
ldy #2
|
||||
lda [0],y
|
||||
tax
|
||||
ply
|
||||
pla
|
||||
sta 2
|
||||
pla
|
||||
sta 0
|
||||
tya
|
||||
rtl
|
||||
|
||||
|
||||
* Resume routine for Control-Y vector...
|
||||
|
||||
Resume phk
|
||||
plb
|
||||
clc
|
||||
xce ; set native mode
|
||||
rep $30 ; 16-bit mode
|
||||
jmp ShutDown ; Let's get outta here!!
|
||||
|
||||
startref ;tool startup record
|
||||
dw $0000 ;flags
|
||||
dw vidmode ;videoMode
|
||||
ds 6 ;resFileID & dPageHandle are set by the StartUpTools call
|
||||
dw 19 ;# of tools
|
||||
;tool number, version number
|
||||
dw 1,$0300 ;Tool Locator
|
||||
dw 2,$0300 ;Memory Manager
|
||||
dw 3,$0300 ;Miscellaneous Tools
|
||||
dw 4,$0301 ;QuickDraw II
|
||||
dw 5,$0302 ;Desk Manager
|
||||
dw 6,$0300 ;Event Manager
|
||||
dw 11,$0200 ;Integer Math
|
||||
dw 14,$0301 ;Window Manager
|
||||
dw 15,$0301 ;Menu Manager
|
||||
dw 16,$0301 ;Control Manager
|
||||
dw 18,$0301 ;QuickDraw II Aux.
|
||||
dw 19,$0300 ;Print Manager
|
||||
dw 20,$0301 ;LineEdit Tools
|
||||
dw 21,$0301 ;Dialog Manager
|
||||
dw 22,$0300 ;Scrap Manager
|
||||
dw 23,$0301 ;Standard File Tools
|
||||
dw 27,$0301 ;Font Manager
|
||||
dw 28,$0301 ;List Manager
|
||||
dw 34,$0101 ;TextEdit Manager
|
||||
|
||||
stref adrl 0 ;reference to the startstop record
|
||||
|
||||
*
|
||||
* Look up table for event processor
|
||||
*
|
||||
|
||||
Cmds
|
||||
da DoUndo ; These menu items are set as
|
||||
da DoCut ; required by Apple for
|
||||
da DoCopy ; NDA compatibility.
|
||||
da DoPaste
|
||||
da DoClear
|
||||
da DoClose
|
||||
|
||||
da DoAbout ;This starts OUR items. (#256)
|
||||
|
||||
da DoOpenFromMenu
|
||||
da ShutDown
|
||||
|
||||
*
|
||||
* Main code goes here...
|
||||
*
|
||||
|
||||
DoInvalidFile
|
||||
~NoteAlert #InvalidTemplate;#0
|
||||
pla
|
||||
rts
|
||||
|
||||
InvalidTemplate
|
||||
dw 62,128,151,512 ;position
|
||||
dw 1
|
||||
dfb 128,128,128,128
|
||||
adrl :Item1
|
||||
adrl :Item2
|
||||
adrl :Item3
|
||||
adrl 0
|
||||
|
||||
:Item3 da 3
|
||||
dw 33,76,43,291 ;rect
|
||||
da StatTextItem+ItemDisable
|
||||
adrl :Item3Txt
|
||||
da 0
|
||||
da 0
|
||||
adrl 0
|
||||
:Item3Txt
|
||||
str 'This file seems invalid.'
|
||||
|
||||
:Item2 dw 2
|
||||
dw 13,122,22,251 ;rect
|
||||
da StatTextItem+ItemDisable
|
||||
adrl :Item2Txt
|
||||
da 0
|
||||
da 0
|
||||
adrl 0
|
||||
:Item2Txt str 'Cannot play!!'
|
||||
|
||||
:Item1 da 1
|
||||
dw 66,272,78,350 ;rect
|
||||
da ButtonItem
|
||||
adrl :Item1Txt
|
||||
da 0
|
||||
da 1
|
||||
adrl 0
|
||||
:Item1Txt str ' Ok '
|
||||
|
||||
|
||||
|
||||
DoAbout
|
||||
~NoteAlert #AboutTemplate;#0
|
||||
pla
|
||||
rts
|
||||
|
||||
AboutTemplate
|
||||
dw 62,128,151,512 ;position
|
||||
dw 1
|
||||
dfb 128,128,128,128
|
||||
adrl :Item1
|
||||
adrl :Item2
|
||||
adrl :Item3
|
||||
adrl 0
|
||||
|
||||
:Item3 da 3
|
||||
dw 33,76,43,291 ;rect
|
||||
da StatTextItem+ItemDisable
|
||||
adrl :Item3Txt
|
||||
da 0
|
||||
da 0
|
||||
adrl 0
|
||||
:Item3Txt
|
||||
str '(C) 2020 DreamWorld Software'
|
||||
|
||||
:Item2 dw 2
|
||||
dw 13,122,22,251 ;rect
|
||||
da StatTextItem+ItemDisable
|
||||
adrl :Item2Txt
|
||||
da 0
|
||||
da 0
|
||||
adrl 0
|
||||
:Item2Txt str 'GSLA Player v1.0'
|
||||
|
||||
:Item1 da 1
|
||||
dw 66,272,78,350 ;rect
|
||||
da ButtonItem
|
||||
adrl :Item1Txt
|
||||
da 0
|
||||
da 1
|
||||
adrl 0
|
||||
:Item1Txt str ' Ok '
|
||||
|
||||
DoOpenFromMenu
|
||||
DoOpen
|
||||
pea #30 ;x of upper left corner
|
||||
pea #40 ;y of upper left corner
|
||||
pea #0 ;type of reference
|
||||
PushLong #:message ;location of pascal string
|
||||
PushLong #0 ;Filter... none for now
|
||||
PushLong #:filter ;Pointer to type list record
|
||||
PushLong #Fileinfo ;Pointer to reply record
|
||||
|
||||
ldx #$0e17 ;SF Get File 2
|
||||
jsl $e10000
|
||||
bcc :cont
|
||||
brl :trouble
|
||||
:cont
|
||||
lda Fopen ;good?
|
||||
bne :keepitup
|
||||
|
||||
:bye rts
|
||||
|
||||
:keepitup
|
||||
lda path+2 ;length of pathname
|
||||
sta fullp
|
||||
|
||||
ldx #0
|
||||
:lup
|
||||
lda path+4,x ;make this class 1 string a prodos string
|
||||
sta fullp+1,x
|
||||
inx
|
||||
inx
|
||||
cpx path+2
|
||||
bcc :lup
|
||||
|
||||
_Open p:open
|
||||
bcc :read_filesize
|
||||
brl :trouble
|
||||
:read_filesize
|
||||
lda p:open
|
||||
sta p:read
|
||||
sta p:get_eof
|
||||
|
||||
_GET_EOF p:get_eof
|
||||
bcc :eof_seems_good
|
||||
:err_close
|
||||
jsr FreeBanks
|
||||
_Close p:close
|
||||
bra :trouble
|
||||
|
||||
:eof_seems_good
|
||||
|
||||
*
|
||||
* Allocate memory for loading the animation
|
||||
* Will do an allocation per 64k required, since
|
||||
* this type of animation requires, the file be bank aligned
|
||||
* so will load in 64KB chunks
|
||||
*
|
||||
*
|
||||
* I've decided that using Tools to spawn a dialog with a loading meter
|
||||
* is actually more work (mentally), than just stomping on the frame buffer
|
||||
*
|
||||
|
||||
; need to allocate each bank separate, to guarantee
|
||||
; the alignment for the player
|
||||
; perhaps loop through, and store a list of allocated banks
|
||||
; starting at $80 in the DP, so DP,x addressing can get at
|
||||
; them in the player
|
||||
|
||||
; while banks_count < required_banks
|
||||
|
||||
lda p:eof+2
|
||||
inc
|
||||
sta :required_banks
|
||||
|
||||
]loop
|
||||
lda <banks_count
|
||||
cmp :required_banks
|
||||
bcs :we_have_memory
|
||||
|
||||
; Ask for 64K
|
||||
lda #$0000
|
||||
ldx #$0001
|
||||
jsr getmem
|
||||
bcs :mem_failed
|
||||
|
||||
jsl dereference
|
||||
|
||||
txa
|
||||
jsr AddBank
|
||||
|
||||
bra ]loop
|
||||
|
||||
|
||||
:mem_failed
|
||||
jsr FreeBanks
|
||||
|
||||
; Pop up an Alert
|
||||
|
||||
bra :err_close
|
||||
|
||||
:we_have_memory
|
||||
|
||||
; Read in the File
|
||||
|
||||
; Size 64k at a time
|
||||
stz p:rsize
|
||||
lda #$0001
|
||||
sta p:rsize+2
|
||||
|
||||
ldx #0
|
||||
stx p:rbuf+0
|
||||
]read_loop
|
||||
lda <banks_data,x
|
||||
and #$00FF
|
||||
sta p:rbuf+2
|
||||
|
||||
phx
|
||||
_Read p:read
|
||||
plx
|
||||
|
||||
bcs :err_close
|
||||
|
||||
inx
|
||||
cpx :required_banks
|
||||
bcc ]read_loop
|
||||
|
||||
:close_exit
|
||||
_Close p:close
|
||||
bcs :trouble
|
||||
brl PlayAnimation
|
||||
|
||||
:required_banks
|
||||
:temp
|
||||
dw 0
|
||||
|
||||
:trouble
|
||||
pha
|
||||
PushLong #0
|
||||
ldx #$1503
|
||||
jsl $e10000
|
||||
rtl
|
||||
|
||||
:message str 'Open GS Lzb Anim:'
|
||||
|
||||
:filter dw 0 ; (count 0/no filter), set to 1 for only show s16 files
|
||||
|
||||
; dw 1 ; (count 1) Show only s16 files
|
||||
; dw 0,$b3,0,0 ;flags, filetype, auxtype
|
||||
|
||||
p:close
|
||||
p:open dw 1 ;ref number
|
||||
adrl fullp ;pathname
|
||||
adrl 0 ;io buffer, doesn't reallymatter
|
||||
|
||||
p:write
|
||||
p:read dw 0
|
||||
p:rbuf adrl 0
|
||||
p:rsize adrl $10000 ;number requested 64k
|
||||
adrl 0 ;number transfered
|
||||
|
||||
p:get_eof dw 0 ; reference number
|
||||
p:eof adrl 0 ; end of file
|
||||
|
||||
|
||||
*
|
||||
* Hold a backup of the system palette
|
||||
*
|
||||
scbs_and_palette
|
||||
ds 768
|
||||
|
||||
LoopAnimationFlag dw 0 ; Set to 1 while animation is looping
|
||||
LastTickCount adrl 0
|
||||
|
||||
pData = $FC
|
||||
|
||||
PlayAnimation mx %00
|
||||
|
||||
; First verify that the file, looks like what it should be
|
||||
stz <pData
|
||||
lda <banks_data
|
||||
and #$00FF
|
||||
sta <pData+2
|
||||
|
||||
; pData now points to the first 64KB of the file
|
||||
|
||||
; Check 'GSLA'
|
||||
lda [pData]
|
||||
cmp #'GS'
|
||||
bne :BadHeader
|
||||
|
||||
ldy #2
|
||||
lda [pData],y
|
||||
cmp #'LA'
|
||||
bne :BadHeader
|
||||
iny
|
||||
iny
|
||||
|
||||
; Check Size Field for Sanity
|
||||
lda [pData],y
|
||||
cmp p:eof
|
||||
bne :BadSize
|
||||
iny
|
||||
iny
|
||||
|
||||
lda [pData],y
|
||||
cmp p:eof+2
|
||||
bne :BadSize
|
||||
|
||||
; Probably check more things
|
||||
|
||||
brl :good_header
|
||||
|
||||
:BadSize
|
||||
:BadHeader
|
||||
; Notif
|
||||
|
||||
jsr DoInvalidFile
|
||||
|
||||
jsr FreeBanks
|
||||
rts
|
||||
|
||||
:good_header
|
||||
|
||||
; The mouse cursor doesn't play nice with what we're doing
|
||||
_HideCursor
|
||||
|
||||
lda #$2FF
|
||||
ldx #$9D00 ; $E19D00, the SBCS
|
||||
ldy #<scbs_and_palette ; Temp buffer
|
||||
mvn $E1,^scbs_and_palette
|
||||
; this happens to end with the bank happy
|
||||
|
||||
|
||||
; ha, this has to parse the headers
|
||||
; before it can play the animation
|
||||
|
||||
; copy player to the Direct Page
|
||||
|
||||
lda #127 ; player is less than 128 bytes
|
||||
ldx #player
|
||||
phd
|
||||
ply
|
||||
sty :play+1
|
||||
sty :init+1
|
||||
|
||||
mvn ^player,$00
|
||||
|
||||
phk
|
||||
plb
|
||||
|
||||
; Pointer to the INITial Frame Data
|
||||
lda <banks_data
|
||||
and #$00FF
|
||||
sta <pData+2
|
||||
|
||||
ldx #28 ; Header of file + Header of INIT Frame
|
||||
|
||||
; X = Low
|
||||
; A = High
|
||||
|
||||
:init jsl $000000 ; for the first frame
|
||||
|
||||
|
||||
|
||||
; Tell make sure looping is enabled
|
||||
|
||||
lda #1
|
||||
sta LoopAnimationFlag
|
||||
|
||||
; Initialize Tick
|
||||
|
||||
pha
|
||||
pha
|
||||
Tool $1006 ; TickCount
|
||||
pla
|
||||
plx
|
||||
|
||||
sta LastTickCount
|
||||
stx LastTickCount+2
|
||||
|
||||
; load up a pointer to data
|
||||
:loop
|
||||
stz <pData
|
||||
|
||||
ldy #24
|
||||
lda [pData],y
|
||||
clc
|
||||
adc #28 ; 20 byte header + 8 bytes skip into the ANIM Block
|
||||
tax
|
||||
|
||||
lda pData+2
|
||||
|
||||
; play the animation
|
||||
; X = Low
|
||||
; A = High
|
||||
|
||||
:play jsl $000000
|
||||
|
||||
lda LoopAnimationFlag
|
||||
bne :loop
|
||||
|
||||
;
|
||||
; Let the Memory go
|
||||
;
|
||||
jsr FreeBanks
|
||||
|
||||
lda #$2FF
|
||||
ldx #<scbs_and_palette ; Temp buffer
|
||||
ldy #$9D00 ; $E19D00, the SBCS
|
||||
mvn ^scbs_and_palette,$01
|
||||
phk
|
||||
plb
|
||||
|
||||
|
||||
;
|
||||
; Redraw the Screen
|
||||
;
|
||||
Tool $2a0f ; DrawMenuBar
|
||||
|
||||
PushLong #0
|
||||
Tool $390E ; RefreshDesktop
|
||||
|
||||
;
|
||||
; Show the Mouse
|
||||
;
|
||||
_ShowCursor
|
||||
|
||||
rts
|
||||
|
||||
EndOfAnimFrame ent
|
||||
phk
|
||||
plb
|
||||
:check_key
|
||||
pha
|
||||
PushWord #$000A ; only mousedown, or keydown
|
||||
PushPtr :TaskRecord ; NOTE: using our own local record
|
||||
_TaskMaster
|
||||
pla
|
||||
beq :no_action
|
||||
|
||||
lda :tType
|
||||
cmp #1
|
||||
beq :mousedown
|
||||
cmp #3
|
||||
beq :keydown
|
||||
|
||||
:no_action
|
||||
; We still need to make sure 1 tick has elapsed
|
||||
pha
|
||||
pha
|
||||
Tool $1006 ; TickCount
|
||||
pla
|
||||
plx
|
||||
|
||||
cmp LastTickCount
|
||||
beq :check_key
|
||||
|
||||
sta LastTickCount
|
||||
|
||||
clc ; keep playing the animation
|
||||
rtl
|
||||
:mousedown
|
||||
:keydown
|
||||
:stop
|
||||
; Tell the Animation Play to not loop
|
||||
stz LoopAnimationFlag
|
||||
; Signal to the Anim Player, that we're done playing
|
||||
; Animation has been interrupted
|
||||
sec
|
||||
rtl
|
||||
;
|
||||
; We don't want to corrupt the original TaskRecord
|
||||
;
|
||||
:TaskRecord
|
||||
:tType ds 2 ;Event code
|
||||
:tMessage ds 4 ;Type of Event
|
||||
:tWhen ds 4 ;Time since startup
|
||||
:tWhere ds 4 ;Mouse Location
|
||||
:tMod ds 2 ;Event modifier
|
||||
:TaskData ds 4 ;Taskmaster Data
|
||||
:TaskMask adrl $00001FFF ;Taskmaster Handle All
|
||||
|
||||
DoUndo
|
||||
DoCut
|
||||
DoCopy
|
||||
DoPaste
|
||||
DoClear
|
||||
DoClose
|
||||
RTS
|
||||
|
||||
text
|
||||
str "Written By: Jason Andersen and Steven Chiang"
|
||||
|
||||
********************************************************************************
|
||||
*
|
||||
* Append a Bank to the list
|
||||
*
|
||||
AddBank mx %00
|
||||
ldx <banks_count
|
||||
sta <banks_data,x
|
||||
inx
|
||||
stx <banks_count
|
||||
rts
|
||||
|
||||
********************************************************************************
|
||||
*
|
||||
* Free Memory, and Clear Bank List
|
||||
*
|
||||
FreeBanks mx %00
|
||||
|
||||
]loop
|
||||
ldx <banks_count
|
||||
dex
|
||||
bmi :done
|
||||
stx <banks_count
|
||||
|
||||
ldy #0
|
||||
phy ; space for result
|
||||
phy
|
||||
|
||||
lda <banks_data,x
|
||||
and #$00FF
|
||||
phy ; memory address high
|
||||
phy ; memory address low
|
||||
|
||||
ldx #$1A02 ; FindHandle
|
||||
jsl tool
|
||||
|
||||
ldx #$1002 ; DisposeHandle
|
||||
jsl tool
|
||||
|
||||
bra ]loop
|
||||
|
||||
:done
|
||||
rts
|
||||
|
||||
********************************************************************************
|
443
macros/drm.macs.s
Normal file
443
macros/drm.macs.s
Normal file
@ -0,0 +1,443 @@
|
||||
_ADBStartUp MAC
|
||||
Tool $209
|
||||
<<<
|
||||
_ADBShutDown MAC
|
||||
Tool $309
|
||||
<<<
|
||||
~CtlStartUp MAC
|
||||
PxW ]1;]2
|
||||
Tool $210
|
||||
<<<
|
||||
_CtlShutDown MAC
|
||||
Tool $310
|
||||
<<<
|
||||
_DeskStartUp MAC
|
||||
Tool $205
|
||||
<<<
|
||||
_DeskShutDown MAC
|
||||
Tool $305
|
||||
<<<
|
||||
_FixAppleMenu MAC
|
||||
Tool $1E05
|
||||
<<<
|
||||
~DialogStartUp MAC
|
||||
PHW ]1
|
||||
Tool $215
|
||||
<<<
|
||||
_DialogShutDown MAC
|
||||
Tool $315
|
||||
<<<
|
||||
_DialogStatus MAC
|
||||
Tool $615
|
||||
<<<
|
||||
~StopAlert MAC
|
||||
PHA
|
||||
PxL ]1;]2
|
||||
Tool $1815
|
||||
<<<
|
||||
~NoteAlert MAC
|
||||
PHA
|
||||
PxL ]1;]2
|
||||
Tool $1915
|
||||
<<<
|
||||
~EMStartUp MAC
|
||||
PxW ]1;]2;]3;]4
|
||||
PxW ]5;]6;]7
|
||||
Tool $206
|
||||
<<<
|
||||
_EMShutDown MAC
|
||||
Tool $306
|
||||
<<<
|
||||
~FMStartUp MAC
|
||||
PxW ]1;]2
|
||||
Tool $21B
|
||||
<<<
|
||||
_FMShutDown MAC
|
||||
Tool $31B
|
||||
<<<
|
||||
_IMStartUp MAC
|
||||
Tool $20B
|
||||
<<<
|
||||
_IMShutDown MAC
|
||||
Tool $30B
|
||||
<<<
|
||||
~LEStartUp MAC
|
||||
PxW ]1;]2
|
||||
Tool $214
|
||||
<<<
|
||||
_LEShutDown MAC
|
||||
Tool $314
|
||||
<<<
|
||||
_TLStartUp MAC
|
||||
Tool $201
|
||||
<<<
|
||||
_TLShutDown MAC
|
||||
Tool $301
|
||||
<<<
|
||||
~TLVersion MAC
|
||||
PHA
|
||||
Tool $401
|
||||
<<<
|
||||
~LoadTools MAC
|
||||
PHL ]1
|
||||
Tool $E01
|
||||
<<<
|
||||
~TLMountVolume MAC
|
||||
PHA
|
||||
PxW ]1;]2
|
||||
PxL ]3;]4;]5;]6
|
||||
Tool $1101
|
||||
<<<
|
||||
_TLTextMountVol MAC
|
||||
Tool $1201
|
||||
<<<
|
||||
~MMStartUp MAC
|
||||
PHA
|
||||
Tool $202
|
||||
<<<
|
||||
~MMShutDown MAC
|
||||
PHW ]1
|
||||
Tool $302
|
||||
<<<
|
||||
~MMVersion MAC
|
||||
PHA
|
||||
Tool $402
|
||||
<<<
|
||||
~NewHandle MAC
|
||||
P2SL ]1
|
||||
PxW ]2;]3
|
||||
PHL ]4
|
||||
Tool $902
|
||||
<<<
|
||||
~DisposeHandle MAC
|
||||
PHL ]1
|
||||
Tool $1002
|
||||
<<<
|
||||
~GetHandleSize MAC
|
||||
P2SL ]1
|
||||
Tool $1802
|
||||
<<<
|
||||
~MenuStartUp MAC
|
||||
PxW ]1;]2
|
||||
Tool $20F
|
||||
<<<
|
||||
_MenuShutDown MAC
|
||||
Tool $30F
|
||||
<<<
|
||||
_InsertMenu MAC
|
||||
Tool $D0F
|
||||
<<<
|
||||
_FixMenuBar MAC
|
||||
Tool $130F
|
||||
<<<
|
||||
_DrawMenuBar MAC
|
||||
Tool $2A0F
|
||||
<<<
|
||||
_HiliteMenu MAC
|
||||
Tool $2C0F
|
||||
<<<
|
||||
_NewMenu MAC
|
||||
Tool $2D0F
|
||||
<<<
|
||||
_MTStartUp MAC
|
||||
Tool $203
|
||||
<<<
|
||||
_MTShutDown MAC
|
||||
Tool $303
|
||||
<<<
|
||||
~MTVersion MAC
|
||||
PHA
|
||||
Tool $403
|
||||
<<<
|
||||
~QDStartUp MAC
|
||||
PxW ]1;]2;]3;]4
|
||||
Tool $204
|
||||
<<<
|
||||
_QDShutDown MAC
|
||||
Tool $304
|
||||
<<<
|
||||
~QDVersion MAC
|
||||
PHA
|
||||
Tool $404
|
||||
<<<
|
||||
~MoveTo MAC
|
||||
PxW ]1;]2
|
||||
Tool $3A04
|
||||
<<<
|
||||
_ShowCursor MAC
|
||||
Tool $9104
|
||||
<<<
|
||||
~DrawString MAC
|
||||
PHL ]1
|
||||
Tool $A504
|
||||
<<<
|
||||
_InitCursor MAC
|
||||
Tool $CA04
|
||||
<<<
|
||||
_QDAuxStartUp MAC
|
||||
Tool $212
|
||||
<<<
|
||||
_QDAuxShutDown MAC
|
||||
Tool $312
|
||||
<<<
|
||||
_ScrapStartUp MAC
|
||||
Tool $216
|
||||
<<<
|
||||
_ScrapShutDown MAC
|
||||
Tool $316
|
||||
<<<
|
||||
~WindStartUp MAC
|
||||
PHW ]1
|
||||
Tool $20E
|
||||
<<<
|
||||
_WindShutDown MAC
|
||||
Tool $30E
|
||||
<<<
|
||||
_TaskMaster MAC
|
||||
Tool $1D0E
|
||||
<<<
|
||||
~RefreshDesktop MAC
|
||||
PHL ]1
|
||||
Tool $390E
|
||||
<<<
|
||||
_GET_BOOT_VOL MAC
|
||||
DOS16 $28;]1
|
||||
<<<
|
||||
_QUIT MAC
|
||||
DOS16 $29;]1
|
||||
<<<
|
||||
_Close mac
|
||||
DOS16 $14;]1
|
||||
eom
|
||||
|
||||
_Open mac
|
||||
DOS16 $10;]1
|
||||
eom
|
||||
|
||||
_Read mac
|
||||
DOS16 $12;]1
|
||||
eom
|
||||
|
||||
_Write mac
|
||||
DOS16 $13;]1
|
||||
eom
|
||||
|
||||
_SetMark mac
|
||||
DOS16 $16;]1
|
||||
eom
|
||||
|
||||
_GET_EOF MAC
|
||||
DOS16 $19;]1
|
||||
<<<
|
||||
|
||||
DOS16 MAC
|
||||
JSL $E100A8
|
||||
DA ]1
|
||||
ADRL ]2
|
||||
<<<
|
||||
PxW MAC
|
||||
DO ]0/1
|
||||
PHW ]1
|
||||
DO ]0/2
|
||||
PHW ]2
|
||||
DO ]0/3
|
||||
PHW ]3
|
||||
DO ]0/4
|
||||
PHW ]4
|
||||
FIN
|
||||
FIN
|
||||
FIN
|
||||
FIN
|
||||
<<<
|
||||
PxL MAC
|
||||
DO ]0/1
|
||||
PHL ]1
|
||||
DO ]0/2
|
||||
PHL ]2
|
||||
DO ]0/3
|
||||
PHL ]3
|
||||
DO ]0/4
|
||||
PHL ]4
|
||||
FIN
|
||||
FIN
|
||||
FIN
|
||||
FIN
|
||||
<<<
|
||||
P2SL MAC
|
||||
PHA
|
||||
PHA
|
||||
IF #=]1
|
||||
PEA ^]1
|
||||
ELSE
|
||||
PHW ]1+2
|
||||
FIN
|
||||
PHW ]1
|
||||
<<<
|
||||
PHL MAC
|
||||
IF #=]1
|
||||
PEA ^]1
|
||||
ELSE
|
||||
PHW ]1+2
|
||||
FIN
|
||||
PHW ]1
|
||||
<<<
|
||||
PHW MAC
|
||||
IF #=]1
|
||||
PEA ]1
|
||||
ELSE
|
||||
IF MX/2
|
||||
LDA ]1+1
|
||||
PHA
|
||||
FIN
|
||||
LDA ]1
|
||||
PHA
|
||||
FIN
|
||||
<<<
|
||||
PushPtr MAC
|
||||
PEA ^]1
|
||||
PEA ]1
|
||||
<<<
|
||||
PushLong MAC
|
||||
IF #=]1
|
||||
PushWord #^]1
|
||||
ELSE
|
||||
PushWord ]1+2
|
||||
FIN
|
||||
PushWord ]1
|
||||
<<<
|
||||
PushWord MAC
|
||||
IF #=]1
|
||||
PEA ]1
|
||||
ELSE
|
||||
IF MX/2
|
||||
LDA ]1+1
|
||||
PHA
|
||||
FIN
|
||||
LDA ]1
|
||||
PHA
|
||||
FIN
|
||||
<<<
|
||||
PullLong MAC
|
||||
DO ]0
|
||||
PullWord ]1
|
||||
PullWord ]1+2
|
||||
ELSE
|
||||
PullWord
|
||||
PullWord
|
||||
FIN
|
||||
<<<
|
||||
PullWord MAC
|
||||
PLA
|
||||
DO ]0
|
||||
STA ]1
|
||||
FIN
|
||||
IF MX/2
|
||||
PLA
|
||||
DO ]0
|
||||
STA ]1+1
|
||||
FIN
|
||||
FIN
|
||||
<<<
|
||||
Tool MAC
|
||||
LDX #]1
|
||||
JSL $E10000
|
||||
<<<
|
||||
Item MAC
|
||||
ASC '--'
|
||||
ASC ]1
|
||||
ASC '\H'
|
||||
DA ]inum
|
||||
DO ]0/2
|
||||
DO ]2-Check-1/$FFFF
|
||||
DA ]2
|
||||
ELSE
|
||||
DO ]2-Blank-1/$FFFF
|
||||
DA ]2
|
||||
ELSE
|
||||
DB ]2
|
||||
ASC ]3
|
||||
FIN
|
||||
FIN
|
||||
FIN
|
||||
DO ]0/4
|
||||
DO ]4-Check-1/$FFFF
|
||||
DA ]4
|
||||
ELSE
|
||||
DO ]4-Blank-1/$FFFF
|
||||
DA ]4
|
||||
ELSE
|
||||
DB ]4
|
||||
ASC ]5
|
||||
FIN
|
||||
FIN
|
||||
FIN
|
||||
DO ]0/6
|
||||
DO ]6-Check-1/$FFFF
|
||||
DA ]6
|
||||
ELSE
|
||||
DO ]6-Blank-1/$FFFF
|
||||
DA ]6
|
||||
ELSE
|
||||
DB ]6
|
||||
ASC ]7
|
||||
FIN
|
||||
FIN
|
||||
FIN
|
||||
DB $00
|
||||
]inum = ]inum+1
|
||||
<<<
|
||||
Menu MAC
|
||||
ASC '>>'
|
||||
ASC ]1
|
||||
ASC '\H'
|
||||
DA ]mnum
|
||||
DO ]0>1
|
||||
ASC ]2
|
||||
FIN
|
||||
DB 0
|
||||
]mnum = ]mnum+1
|
||||
<<<
|
||||
|
||||
* Menu Contents and Equates
|
||||
|
||||
Bold = 'B' ; bold menu item
|
||||
Disable = 'D' ; disabled menu item
|
||||
Italic = 'I' ; italic menu item
|
||||
Underline = 'U' ; underlined menu item
|
||||
Divide = 'V' ; menu dividing line
|
||||
ColorHi = 'X' ; color hilite menu item
|
||||
Kybd = '*' ; keyboard menu equivalent
|
||||
Check = $1243 ; menu item with checkmark
|
||||
Blank = $2043 ; menu item with blank
|
||||
|
||||
* Dialog Equates
|
||||
|
||||
CheckItem = 11
|
||||
RadioItem = 12
|
||||
ScrollBarItem = 13
|
||||
PicItem = 19
|
||||
UserItem = 20
|
||||
ButtonItem EQU $0A
|
||||
EditLine equ $11
|
||||
StatText EQU $0F
|
||||
StatTextItem = $f
|
||||
ItemDisable EQU $8000
|
||||
|
||||
* macros
|
||||
|
||||
test mac
|
||||
sep #$30
|
||||
ldal $e1c034
|
||||
inc
|
||||
stal $e1c034
|
||||
rep #$30
|
||||
eom
|
||||
|
||||
_HideCursor mac
|
||||
Tool $9004
|
||||
eom
|
||||
|
||||
_ShowCursor mac
|
||||
Tool $9104
|
||||
eom
|
||||
|
Loading…
x
Reference in New Issue
Block a user