Merge pull request #1 from dwsJason/develop

Develop
This commit is contained in:
Jason Andersen 2020-07-22 16:22:00 -04:00 committed by GitHub
commit e187bc5cec
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 1821 additions and 0 deletions

77
Makefile Normal file
View 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
View File

@ -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? Its
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, its 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 dont 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 frames 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
View 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
View 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
View 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
View 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
View 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
View 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