spaceaceiigs/source/spaceace.a65

2603 lines
39 KiB
Plaintext

LST OFF
TR ON
XC
XC
MX %00
REL
*
* Predefined labels:
*
TLStartUp = $201
TLShutDown = $301
TLMountVolume = $1101
StartUpTools = $1801
ShutDownTools = $1901
MMStartUp = $202
MMShutDown = $302
NewHandle = $902
DisposeHandle = $1002
DisposeAll = $1102
SetHeartBeat = $1203
DelHeartBeat = $1303
GetNewID = $2003
DeleteID = $2103
SetColorTable = $0E04
SetAllSCBs = $1404
GetPort = $1C04
HideCursor = $9004
GetNextEvent = $A06
Tool_Entry = $E10000
GSOSSTACK = $E100B0
MyToolTable = 1
MemHandles = 128 ;Maximum number of handles
; EXT DigitPtr,MissionIsOver,Press0Start
*
* Main entry
*
PHK ;Set my bank
PLB
TSC ;Save my stack pointer
STA MyStack
TDC ;Save my direct page
STA MyDirect
JSR InitTools ;Init the game tools
BCS QuitMe
JSR CheckHardDrive ;Check if I am running off of a Hard drive
JSR Game ;Play the game
QuitNow LDA MyStack
TSC
QuitMe JSR KillTools
PEA #0 ;No parms
TSC ;Get pointer to data
INC
PEA #0 ;Bank of stack
PHA ;Pointer
PEA #$2029 ;GSOS Quit
JSL GSOSSTACK ;Exit!
BRK $F0 ;Error!
*
* Actual game
*
Game PEA #1 ;Picture #1
JSR LoadScripts
JSR PlayTitlePage ;Show and play the title page
PEA #2 ;Picture #2
JSR LoadScripts
PEA #3 ;Picture #3
JSR LoadScripts
PEA #4 ;Picture #4
JSR LoadScripts
PEA #5 ;Picture #5
JSR LoadScripts
BRA DemoLoop2
DemoLoop JSR PlayTitlePage
DemoLoop2 JSR FadeOut
JSR GetJoyStick
AND #$0010
BNE FadeStart2
JSR ShowCredits
JSR GetJoyStick
AND #$0010
BNE FadeStart
JSR FadeOut
JSR WaitForFade
LDA #-1 ;Do not show the current score
STA ScoreDisable
PEA #6
JSR PlayAScene
STZ ScoreDisable ;Allow score display
CMP #-1
BEQ StartGame
JSR WaitForFade
BRA DemoLoop
*
* Start a new game
*
StartGame STZ ScoreDisable ;Allow score display
FadeStart JSR FadeOut ;Fade out the screen
FadeStart2 JSR WaitForFade ;Wait until the fade is complete
STZ Score ;No score
LDA #3 ;3 Lives
STA Lives
LDA #6 ;Start at scene #6
STA CurrentScene ;Save
*
* Main game loop
*
]A LDA CurrentScene ;Get scene number
DEC
ASL ;Long word pointer
ASL
TAX
LDA ScriptPtrs,X ;Is there a game script here?
BEQ :WinGame ;I won?
LDA CurrentScene
PHA
JSR PlayAScene ;Play an animation scene
CMP #-1
BEQ YouDied3
INC CurrentScene
BRA ]A
:WinGame LDA #-1 ;I won!!
STA WinFlag
PEA #5 ;Victory screen
JSR RunAllScenes
JSR FadeIn ;Fade in colors
JSR WaitForFade ;Wait until done
]A JSR GetJoyStick ;Wait until the fire button is pressed
AND #$0010
BEQ ]A
JSR FadeOut ;Fade it out
JSR WaitForFade ;Wait until done
JSR ShowScoreScreen ;Show final score
JSR WaitForFire ;Wait for fire button
]B JSR FadeOut
JSR WaitForFade
PEA #5 ;Force loading in disk #1
JSR LoadScripts
BRL DemoLoop
YouDied3 JSR ShowScoreScreen
]A JSR GetJoyStick ;Wait for fire button
AND #$10
BEQ ]A
BRA ]B
*
* Play a scene script
*
PlayAScene
:RTSVal = 1
:CurrentScene = 3
:EndDirect = 5
TSC
PHD
TCD
JSR ShowScoreScreen
PEI :CurrentScene
JSR LoadScripts
]A JSR WaitForFire
JSR FadeOut
JSR WaitForFade
PEI :CurrentScene
JSR RunAllScenes
PHA ;Save error
JSR ShutOffSoundNow
STZ SoundPresent
PLX ;Get error code
LDA ScoreDisable ;Is the score screen allowed?
BNE :Exit ;Nope?
CPX #-1 ;Error?
BNE :Exit
DEC Lives ;1 less life
BEQ :Exit
JSR ShowScoreScreen
BRA ]A
:Exit PHX ;Save answer
PEI :CurrentScene
JSR UnloadScripts
PLX
PLD ;Restore direct page
PLA ;Fix return address
STA 2-1,S
TXA
RTS
*
* Run all animation scenes in the script
*
RunAllScenes
:RTSVal = 1
:SceneNum = 3
:EndDirect = 5
TSC
PHD
TCD
STZ JoyStickVal ;Init joystick
LDA :SceneNum
DEC ;-1 for 0-??
ASL
ASL
TAX
LDA ScriptPtrs+2,X ;Get animation script pointer
TAX
]A PHX
LDA: $0002,X ;Get pointer to game moves
PHA
LDA: $0000,X ;Get number of script to play
PHA
JSR RunAScene
PLX ;Restore index
CMP #-1
BEQ :HesDeadJim
INX ;Next script pointer
INX
INX
INX
LDA: $0000,X ;Any more?
BEQ :HesDeadJim ;He lives!
PHX
JSR ShutOffSoundNow ;No more sound!
JSR FadeOut ;Fade it out
JSR WaitForFade ;Wait
PLX ;Next script
BRA ]A
:HesDeadJim PHA
JSR FadeOut ;Fade it out
PLX
PLD
PLA
STA 2-1,S
TXA
RTS
*
* Run a single scene
*
RunAScene
:Pointer = 1
:RTSVal = 5
:FileNum = 7
:MovesPointer = 9
:EndDirect = 11
TSC
SEC
SBC #4
TCS
PHD
TCD
STZ PlayedDeath
:PlayAgain PEI :FileNum ;Save scene number
JSR FindFileInCache ;Find it in the cache
ASL
ASL
TAX
LDA CacheHandle,X ;Save pointer
STA :Pointer
LDA CacheHandle+2,X
STA :Pointer+2
LDY #2
LDA [:Pointer]
STA UnpackPtr
LDA [:Pointer],Y
STA UnpackPtr+2
LDA :FileNum ;Restore it
ORA #$400 ;Make into a sound file
PHA
JSR FindFileInCache ;Present?
LDY #-1
STY SoundPresent
CMP #-1
BEQ :NoSound
STZ SoundPresent ;Sound is present
ASL
ASL
TAX
LDA CacheHandle,X ;Get pointer
STA :Pointer
LDA CacheHandle+2,X
STA :Pointer+2
LDY #8
LDA [:Pointer],Y ;Size of memory
STA RawSoundSize
LDY #2
LDA [:Pointer]
TAX
CLC
ADC #4
STA RawPackSoundPtr
LDA [:Pointer],Y
STX :Pointer
STA :Pointer+2
ADC #0
STA RawPackSoundPtr+2
LDA [:Pointer] ;Get pitch
STA SoundPitch
LDY #2
LDA [:Pointer],Y ;Get length of file in pages
STA SoundTime
:NoSound STZ DocRamPtr ;Init DOC pointer
STZ FrameCounter
PEA #0 ;Force screen to 320 mode
LDX #SetAllSCBs
JSL Tool_Entry
JSR ResetSound ;Reset sound hardware
JSR UnpackSomeSound ;Unpack sound data
JSR WaitForFade ;Wait for screen fade
JSR ProcessFrame ;Draw initial screen
*
* Move loop
*
]B JSR VideoSoundLoad ;Update sound data
INC FrameCounter ;+1 to frame #
LDX ScoreDisable ;Score screen allowed?
BEQ :CheckAMove ;Yep, game in progress
JSR GetJoyStick ;Joystick pressed?
BEQ :NextFrame
LDX #-1 ;Exit
BRL :Exit
:CheckAMove LDX :MovesPointer ;Pointer to moves
]A LDA: $0000,X ;Get time offset
AND #$FF ;No move moves?
BEQ :NextFrame ;Skip
BIT #$80 ;Wait for time
BEQ :TimeYet
PHX
JSR GetJoyStick
PLX
AND: $0001,X ;Get joystick value
BNE :BadMove
BRA :Skip1
:TimeYet CMP FrameCounter
BEQ :CheckMove
:Skip1 INX ;Next index
INX
INX
INX
BRA ]A
:CheckMove PHX
JSR GetJoyStick
PLX
EOR: $0001,X ;Move to check
AND #$FF ;Match?
BEQ :GoodMove ;Ok!
BIT WimpMode ;I feel so wimpy!
BMI :GoodMove ;
:BadMove STZ JoyStickVal
PHX
JSR ShutOffSoundNow
PLX
LDA: $0002,X ;Get scene to jump to
XBA
STA :FileNum ;Save file number
LDX #NullMoves
STX :MovesPointer
DEC PlayedDeath ;I am playing the death scene
BRL :PlayAgain
:GoodMove STZ JoyStickVal ;Reset joystick
REP #$31
* CLC
LDA Score ;100 points per move
ADC #100
STA Score
:NextFrame JSR ProcessFrame ;Play a frame
CMP #-1
BEQ :EndNow
LDA SideNeeded
BEQ :JB
DEC SideNeeded
BEQ :EndNow
:JB BRL ]B
:EndNow JSR VideoSoundLoad
LDX #0
LDA PlayedDeath
BEQ :Exit
DEX
:Exit PLD
LDA :RTSVal,S
STA :EndDirect-2,S
CLC
TSC
ADC #4+4
TCS
TXA
RTS
*
* Show the title page
*
PlayTitlePage PEA #1
JSR RunAllScenes
JSR FadeIn
JSR WaitForFade
JSR StartSoundNow
LDA #170
STA CountDown
]A JSR GetJoyStick
AND #$10
BNE :Exit
JSR LoadSomeDOCRam
LDA CountDown
BNE ]A
:Exit JSR ShutOffSoundNow
STZ SoundPresent
RTS
*
* Who did what?
*
ShowCredits PEA #3
JSR RunAllScenes
JSR FadeIn
JSR WaitForFade
LDA #200
STA CountDown
]A JSR GetJoyStick
AND #$10
BNE :Exit
LDA CountDown
BNE ]A
:Exit RTS
*
* Show score
*
ShowScoreScreen LDA ScoreDisable
BNE :Exit
PEA #2
JSR RunAllScenes
JSR CalcHighLow
PEA #$8408 ;Screen address
PEA #4*2 ;5 digits long
LDA Score ;Show score
PHA
JSR PrDec
PEA #$8480 ;Screen address
PEA #0 ;Only 1 digit
LDA Lives ;Print the number of lives
PHA
JSR PrDec
LDA WinFlag ;Did you win?
BNE :OverNow
LDA Lives ;No more lives?
BNE :Cont4
:OverNow PEA #$93C8 ;Place on screen
PEA #MissionIsOver
JSR DrawAShape
:Cont4 JSR FadeIn ;Fade in the screen
JSR WaitForFade ;Wait until done
LDA #100
STA CountDown
:Exit RTS
*
* Wait until the fire button is pressed
*
WaitForFire JSR GetJoyStick ;Get joystick value
AND #$0010
BNE :Fire
LDA CountDown ;Wait for IRQ time
BNE WaitForFire
:Fire RTS
*
* Unpack a picture file crossing banks
*
UnpackPicSlow
:RTSVal = 1
:DestPtr = 3
:UnpackPtr = 7
:EndDirect = 11
TSC
PHB
PHD
TCD
SEP #$20
PEI :DestPtr+1
PLB
PLB
LDX :DestPtr
LDY #0
]A LDA [:UnpackPtr],Y
BEQ :Exit
BMI :RunLength
INY
STA :DestPtr+2
]B LDA [:UnpackPtr],Y
STA: $0000,X
INY
INX
DEC :DestPtr+2
BNE ]B
BRA ]A
:RunLength AND #$7F
STA :DestPtr+2
INY
LDA [:UnpackPtr],Y
INY
]B STA: $0000,X
INX
DEC :DestPtr+2
BNE ]B
BRA ]A
:Exit REP #$30
PLD
PLB
PLA
STA 8-1,S
CLC
TSC
ADC #8-2
TCS
RTS
*
* Unpack an animation frame with bank crossing
*
UnpackAnimSlow
:RTSVal = 1
:DestPtr = 3
:UnpackPtr = 7
:EndDirect = 11
TSC
PHB
PHD
TCD
SEP #$20
PEI :DestPtr+1
PLB
PLB
LDX :DestPtr
LDY #0
]A LDA [:UnpackPtr],Y
BNE :NotPack
INY
LDA [:UnpackPtr],Y
STA :DestPtr+2
INY
LDA [:UnpackPtr],Y
INY
]B STA: $0000,X
INX
DEC :DestPtr+2
BNE ]B
BRA :Next
:NotPack BMI :NotTab
REP #$21
AND #$FF
STA :DestPtr+2
TXA
ADC :DestPtr+2
TAX
SEP #$20
INY
BRA :Next
:NotTab AND #$7F
STA :DestPtr+2
INY
]B LDA [:UnpackPtr],Y
STA: $0000,X
INY
INX
DEC :DestPtr+2
BNE ]B
:Next CPX #$9D00
BLT ]A
REP #$30
PLD
PLB
PLA
STA 8-1,S
CLC
TSC
ADC #8-2
TCS
RTS
*
* Play a single animation frame
*
ProcessFrame
:Palette = 1
:Pointer = 33
:RTSVal = 37
:EndDirect = 39
TSC
SEC
SBC #36
TCS
PHD
TCD
JSR GetJoyStick ;Process the joystick
LDA QuitFlag
BEQ :cc
BRL QuitNow
:cc LDA PauseFlag ;Is the game paused?
BEQ :NoPause
SEP #$20
LDAL $E100CA ;Ensoniq
STAL $E1C03C
LDA #$A0 ;My Voice
STAL $E1C03E
LDA #$01 ;Halt it!
STAL $E1C03D
REP #$20
]A JSR GetJoyStick ;Process the joystick
LDA PauseFlag ;Wait for pause to finish
BNE ]A
SEP #$20
LDA #$A0
STAL $E1C03E ;sound address ptr (lo)
LDA MySoundHalt
STAL $E1C03D ;sound data register
REP #$20
*
* Now, process the current frame
*
:NoPause LDA UnpackPtr
STA :Pointer
LDA UnpackPtr+2
STA :Pointer+2
LDA [:Pointer] ;Get length of record
CMP #$FF00
BLT :Fine1
LDX #-1
BRL :Exit
:Fine1 CLC
ADC :Pointer
STA UnpackPtr ;Save new low word
BCC :NoCross
INC UnpackPtr+2 ;Next bank
:NoCross CLC ;+2 to index past length word
LDA #2
ADC :Pointer
STA :Pointer
BCC :CU
INC :Pointer
*
* Play an animation frame
*
:CU LDA [:Pointer] ;Check if a palette needs to be loaded
BIT #$80
BEQ :NoNewPalette ;No new palette needed!
PHA ;Save opcode
LDY #32-1
]A LDA [:Pointer],Y ;Save my new palette
STA NewPalette-1,Y
DEY
DEY
BPL ]A
LDA 1,S ;Get header
BIT #$40 ;New picture?
BEQ :NoBlank
LDA FadeFactor ;Fade in progress?
BEQ :NoBlank
LDX #32-2
]A STZ :Palette,X ;Blank out the palette!
DEX
DEX
BPL ]A
LDA #0
PHA
PHA
TDC
INC
PHA
LDX #SetColorTable ;Set color palette
JSL Tool_Entry
:NoBlank LDA #-1 ;Set flag
STA BlankPalFlag
CLC
LDA :Pointer
ADC #32 ;Index past palette
STA :Pointer
BCC :YC
INC :Pointer+2
:YC PLA ;Restore opcode
*
* Now draw initial screen
*
:NoNewPalette INC :Pointer
BNE :CS
INC :Pointer+2
:CS PEI :Pointer+2 ;Save pointer to data
PEI :Pointer
LDX VideoBank
PHX
PEA #$2000
BIT #$0040 ;Picture or animation?
BEQ :Anim
JSR UnpackPicSlow ;Unpack picture
BRA :DrawZero
:Anim JSR UnpackAnimSlow
:Cont6 LDA BlankPalFlag ;Blank picture?
BEQ :DrawZero
LDA SideNeeded ;Disk side required?
BNE :DrawZero
LDA FadeFactor ;Fade active?
BEQ :DoFade
STZ BlankPalFlag ;Palette is new
STA ColorFlag ;Save color
BRA :BeginSound
:DoFade JSR FadeIn ;Fade in new picture
JSR WaitForFade ;Wait until done
:BeginSound JSR StartSoundNow ;Begin sound
:DrawZero LDA ScoreDisable ;Is the score disabled?
BEQ :Exit2
JSR CalcHighLow ;Get colors
PEA #$2030
PEA #Press0Start ;Press "0" to start
JSR DrawAShape
:Exit2 LDX #0
:Exit PLD ;Exit ok!
CLC
TSC
ADC #36
TCS
TXA
RTS
*
* Heartbeat IRQ
*
MyIRQ DS 4 ;Handle to next heartbeat
HeartTime DA 1 ;Time to next heartbeat
DA $A55A ;Signature
HeartBeatCode
:Palette = 1 ;Temp color palette
:EventRec = 33 ;Event record
:PFlag = 49
:RTLVal = 50 ;Return address
:EndDirect = 53
PHP
REP #$30
TSC
SEC
SBC #48 ;Get my local storage
TCS
PHB ;Save bank
PHD
PHK
PLB
TCD
LDA #1 ;Reset timer
STA HeartTime
CLC
LDA SoundTimeDelta
ADC SoundTime
AND #$7FFF
STA SoundTimeDelta
LDA DiskTime
BEQ :DiskMe
DEC DiskTime
:DiskMe
LDA CountDown
BEQ :DoneCount
DEC CountDown
:DoneCount LDA StartTimer ;Do I start the video timer?
BEQ :Ecch1 ;Nope
STZ StartTimer ;Clear
STA VideoCount ;Start it!
:Ecch1 LDA VideoCount ;Counted down?
BEQ :CheckKey
DEC VideoCount ;Count
*
* Check the keyboard
*
:CheckKey STZ KeyTime ;Allow an event to be processed
*
* Do I set a new palette
*
LDA ColorFlag
BEQ :NoColorChange
STZ ColorFlag
PEA #0
PEA #^NewPalette
PEA #NewPalette
LDX #SetColorTable ;Set color palette
JSL Tool_Entry
*
* Do I fade the screen?
*
:NoColorChange LDA FadeFlag
BEQ :ExitIRQ
CLC
LDA FadeFactor
ADC FadeFlag
STA FadeFactor
BEQ :Zilch
CMP #16
BNE :UseFade
:Zilch STZ FadeFlag ;End fade
:UseFade SEP #$30
LDY #0
LDA #0
]A PHA
LSR
LSR
LSR
LSR
STA FadeTable,Y
PLA
CLC
ADC FadeFactor
INY
CPY #16
BNE ]A
LDX #32-2
]A LDA NewPalette,X
LSR
LSR
LSR
LSR
TAY
LDA FadeTable,Y
ASL
ASL
ASL
ASL
STA :Palette,X
LDA NewPalette,X
AND #$0F
TAY
LDA :Palette,X
ORA FadeTable,Y
STA :Palette,X
LDY NewPalette+1,X
LDA FadeTable,Y
STA :Palette+1,X
DEX
DEX
BPL ]A
REP #$30
LDA #0
PHA
PHA
TDC
INC
PHA
LDX #SetColorTable
JSL Tool_Entry
:ExitIRQ PLD
PLB
CLC
TSC
ADC #48 ;Remove palette
TCS
PLP
CLC
RTL ;Exit
*
* Fade the screen in
*
FadeIn LDA FadeFactor
BNE :InProgress
STZ BlankPalFlag ;Palette is no longer blank
LDA #1
STA FadeFlag
:InProgress RTS
*
* Fade the screen away
*
FadeOut LDA FadeFactor
BEQ :InProgress
STZ BlankPalFlag ;Palette is no longer blank
LDA #-1
STA FadeFlag
:InProgress RTS
*
* Wait for a screen fade to complete
*
WaitForFade
]A LDA FadeFlag ;Fade in progress?
BNE ]A
RTS
*
* Unpack a small amount of sound data
*
UnpackSomeSound
:Pointer = 1
:Length = 5
:RTSVal = 7
:EndDirect = 9
TSC
SEC
SBC #6
TCS
PHD
TCD
LDA SoundPresent ;Sound loaded?
BNE :Exit ;Nope, exit
LDA SoundSize ;Any sound data left?
BEQ :Exit
CMP #$800
BLT :UseThis
LDA #$800
:UseThis STA :Length
SEC
LDA SoundSize
SBC :Length
STA SoundSize
SEP #$20
LDAL $E100CA
ORA #$60
STAL $E1C03C
REP #$20
LDA DocRamPtr
STAL $E1C03E
CLC
ADC :Length
ADC :Length
STA DocRamPtr
CLC
LDA PackSoundPtr
STA :Pointer
ADC :Length
STA PackSoundPtr
LDA PackSoundPtr+2
STA :Pointer+2
ADC #0
STA PackSoundPtr+2
LDY #0
LDX :Length
]B SEP #$20
]A LDA [:Pointer],Y
AND #$F0
BNE :NoZero1
INC ;Fix for Apple IIgs
:NoZero1 STAL $E1C03D ;sound data register
LDA [:Pointer],Y
ASL
ASL
ASL
ASL
BNE :NoZero2
INC
:NoZero2 STAL $E1C03D ;sound data register
INY
DEX
BNE ]A
REP #$20
:Exit PLD ;Reset direct page
CLC
TSC
ADC #6
TCS
RTS ;Exit
*
* Load some DOC ram from time to time
*
VideoSoundLoad
SEP #$20
LDAL $E100CA
ORA #$60
STAL $E1C03C ;Set video pointer
REP #$20
LDA DocRamPtr
STAL $E1C03E ;sound address ptr (hi
]A LDA VideoCount ;Is the video playing?
BEQ :VideoOver
JSR LoadSomeDOCRam ;Play some sound
BRA ]A ;Loop
:VideoOver LDA #8 ;Wait 8 ticks
STA StartTimer
]A LDA StartTimer ;Time up?
BEQ :Exit
JSR LoadSomeDOCRam
BRA ]A
:Exit RTS
*
* Load some DOC ram
*
LoadSomeDOCRam
:Pointer = 1
:Length = 5
:RTSVal = 7
:EndDirect = 9
TSC
SEC
SBC #6
TCS
PHD
TCD
LDA SoundPresent ;Sound available?
BNE :JExit
LDA SoundSize ;Any data left?
BEQ :JExit
LDA SoundTimeDelta ;Time up?
AND #$FF00
SEC
SBC DocRamPtr ;Get differance
BGE :Pos
EOR #$8000 ;Negate
:Pos CMP #$1000 ;Ram needed?
BGE :Add
:JExit BRA :Exit
:Add LDA SoundSize ;Any data left?
CMP #$100
BLT :UseThis
LDA #$100
:UseThis STA :Length
SEC
LDA SoundSize
SBC :Length
STA SoundSize
SEP #$20
LDAL $E100CA
ORA #$60
STAL $E1C03C ;sound control register
REP #$20
LDA DocRamPtr
STAL $E1C03E ;sound address ptr (lo)
CLC
ADC :Length
ADC :Length
AND #$7FFF ;Keep in bounds
STA DocRamPtr
CLC
LDA PackSoundPtr ;Get pointer to data
ADC :Length
STA :Pointer
STA PackSoundPtr
LDA PackSoundPtr+2
ADC #0
STA :Pointer+2
STA PackSoundPtr+2
SEP #$20 ;8 bit mode
LDX :Length ;1 page of data
LDY #0
]A LDA [:Pointer],Y ;Get sound byte
AND #$F0 ;Mask
BNE :NoZero1
INC ;No zeros!
:NoZero1 STAL $E1C03D ;Save in DOC ram
LDA [:Pointer],Y
ASL ;Shift upper nibble
ASL
ASL
ASL
BNE :NoZero2
INC ;No zeros!
:NoZero2 STAL $E1C03D ;Save in DOC ram
INY
DEX
BNE ]A
REP #$20 ;16 bit
:Exit PLD ;Reset direct page
CLC
TSC
ADC #6
TCS
RTS ;Exit
*
* Reset sound hardware
*
ResetSound LDA SoundPresent
BNE :Exit
SEP #$20
LDAL $E100CA ;Access DOC
STAL $E1C03C
LDA #$C0 ;Waveform size
STAL $E1C03E
LDA #$3F
STAL $E1C03D
LDA #$00 ;Pitch
STAL $E1C03E
LDA SoundPitch
STAL $E1C03D
LDA #$20 ;High byte
STAL $E1C03E
LDA SoundPitch+1
STAL $E1C03D
LDA #$40 ;Volume
STAL $E1C03E
LDA #$FF
STAL $E1C03D
LDA #$80 ;Pointer
STAL $E1C03E
LDA DocRamPtr+1
STAL $E1C03D
REP #$20
LDA RawSoundSize ;Reset sound pointers
STA SoundSize
LDA RawPackSoundPtr
STA PackSoundPtr
LDA RawPackSoundPtr+2
STA PackSoundPtr+2
:Exit RTS
*
* Clear the halt bit to a loaded sound
*
StartSoundNow LDA SoundFlag ;Get the halt bit flag for sound enable
STA MySoundHalt
LDA SoundPresent ;Sound loaded?
BNE :Nope
STZ SoundTimeDelta ;Reset time delta
SEP #$20
LDAL $E100CA
STAL $E1C03C
LDA #$A0 ;Halt register
STAL $E1C03E
LDA MySoundHalt ;Set/Clear halt bit
STAL $E1C03D
REP #$20 ;16 bit
:Nope RTS ;Exit
*
* Turn off the sound hardware
*
ShutOffSoundNow LDA SoundPresent
BNE :Exit
LDA MySoundHalt
BNE :Exit
LDA #$01 ;Enable sound
STA MySoundHalt
SEP #$20
LDAL $E100CA
STAL $E1C03C ;Access DOC registers
LDA #$40
STAL $E1C03E ;Base address
LDA #0
STAL $E1C03D
LDA #$A0 ;Halt bit
STAL $E1C03E
LDA #$02 ;Reset it
STAL $E1C03D
LDA #$00 ;Sound speed
STAL $E1C03E
LDA #$FF ;Maximum
STAL $E1C03D
LDA #$20
STAL $E1C03E
LDA #$FF
STAL $E1C03D
LDA #$A0 ;Halt bit
STAL $E1C03E ;
]A LDAL $E1C03D ;Get halt bit
LSR
BCC ]A
REP #$20
LDY #8192 ;Wait a little extra anyways
]A DEY
BNE ]A
:Exit RTS ;Exit
*
* Flush the cache
*
UnloadScripts
:Handle = 1
:RTSVal = 5 ;Return address
:ScriptNum = 7 ;Script number
:EndDirect = 9
TSC
SEC
SBC #4
TCS
PHD
TCD
LDA :ScriptNum ;Get script number
CMP #6 ;Permanent?
BLT :Exit
DEC ;-1 for 0-99
ASL ;Long word pointer
ASL
TAY
LDX ScriptPtrs,Y ;Get pointer to file list
BRA :Loop ;Jump into loop
]A PHX
PHA ;File number
JSR FindFileInCache ;Is the file in the cache?
CMP #-1
BEQ :NotHere ;Nope!
ASL
ASL
TAX
LDA CacheHandle,X ;Get handle
STA :Handle
LDA CacheHandle+2,X
STA :Handle+2
LDY #4
LDA [:Handle],Y ;Unlock the handle
AND #$7FFF
STA [:Handle],Y
:NotHere PLX ;Restore index
INX ;Next entry
INX
:Loop LDA: $0000,X ;End of list?
BNE ]A ;Load it in
:Exit PLD ;Restore direct page
LDA :RTSVal,S
STA :EndDirect-2,S
CLC
TSC
ADC #2+4
TCS
RTS ;Exit
*
* Load a file sequence from a script
*
LoadScripts
:RTSVal = 1 ;Return address
:ScriptNum = 3 ;Script number
:EndDirect = 5
TSC
PHD
TCD
LDA :ScriptNum ;Get script number
DEC ;-1 for 0-99
ASL ;Long word pointer
ASL
TAY
LDX ScriptPtrs,Y ;Get pointer to file list
BRA :Loop ;Jump into loop
]A PHX
STA :ScriptNum ;Save file # in temp
PHA ;Is this file in memory?
JSR LockMemory ;Is the memory present and locked?
CMP #-1
BNE :Fine ;It's here!
PEI :ScriptNum ;End of list?
JSR LoadNewFile ;Load in a new file
:Fine PLX ;Restore index
INX ;Next entry
INX
:Loop LDA: $0000,X ;End of list?
BNE ]A ;Load it in
PLD ;Restore direct page
PLA ;Fix return address
STA 2-1,S
RTS ;Exit
*
* Check if the file is in memory already?
*
LockMemory
:Handle = 1 ;Temp handle
:RTSVal = 5 ;Return address
:FileNum = 7 ;File number
:EndDirect = 9
TSC
SEC
SBC #4 ;Allocate local storage
TCS
PHD
TCD
PEI :FileNum ;Save file number
JSR FindFileInCache ;Is the file in the cache?
CMP #-1
BEQ :NotHere ;Nope!
STA :FileNum ;Save handle number
ASL
ASL
TAX
LDA CacheHandle,X ;Get handle
STA :Handle
LDA CacheHandle+2,X
STA :Handle+2
LDY #4
LDA [:Handle],Y ;First lock down the handle
ORA #$8000
STA [:Handle],Y
LDX #0 ;Assume ok
LDY #2
LDA [:Handle] ;Valid handle?
ORA [:Handle],Y
BNE :Exit
PEI :FileNum ;Kill this cache handle
JSR KillCacheEntry ;Bye bye
:NotHere LDX #-1 ;Exit
:Exit PLD ;Restore direct page
LDA :RTSVal,S ;Fix return address
STA :EndDirect-2,S
CLC
TSC
ADC #4+2
TCS
TXA
RTS ;Exit
*
* Find a file number in cache
*
FindFileInCache
:RTSVal = 1 ;Return address
:FileNum = 3 ;Script number
:EndDirect = 5
TSC
PHD
TCD
LDY #MemHandles-1*2
LDA :FileNum
]A CMP CacheFileNum,Y ;Match?
BEQ :GotIt ;File list is not loaded
DEY
DEY
BPL ]A
LDX #-1 ;Assume bogus dude!
BRA :Exit
:GotIt TYA
LSR
TAX
:Exit PLD ;Restore direct page
PLA ;Fix return address
STA 2-1,S
TXA ;Return the error code
RTS ;Exit
*
* Kill a cache entry completely
*
KillCacheEntry
:RTSVal = 1 ;Return address
:HandleNum = 3 ;Script number
:EndDirect = 5
LDA :HandleNum,S ;Get the handle number
ASL
TAX ;Word index
STZ CacheFileNum,X ;Kill entry number
ASL
TAX
LDA CacheHandle+2,X ;Get handle
PHA
LDA CacheHandle,X
PHA
LDX #DisposeHandle ;Remove handle
JSL Tool_Entry
PLA ;Fix return address
STA 2-1,S
RTS ;Exit
*
* Load in a new file into the cache
*
LoadNewFile
:RTSVal = 1
:FileNum = 3
:EndDirect = 5
TSC
PHD ;Create my stack frame
TCD
*
* Which disk is the file on?
*
BIT HardDisk ;Is this on a hard drive?
BMI :HD1 ;Don't log disks then!
LDA :FileNum ;Get the file number
SEP #$30 ;8 bit
LDY #'1'-1 ;Start at side #1
]A INY
CMP DiskSides-$31,Y ;On this side?
BGE ]A
REP #$20
LDX #7-1*2
]A CMP WeirdSides,X
BEQ :PlusOne
DEX
DEX
BPL ]A
BRA :UseX
:PlusOne INY
:UseX STY VideoName+7 ;Get disk side
STY AudioName+7
STY DeathName+7
STY DeathAudioName+7
*
* Master loop
*
:HD1 SEP #$30
LDA :FileNum ;File number to load
LDY #-1
SEC
]A INY ;Inc tens
SBC #10 ;Sub a ten
BCS ]A ;More?
ADC #10 ;Undo subtraction
ORA #'0' ;Fix ones
XBA ;Swap
TYA ;Get tens
ORA #'0' ;Fix tens
REP #$30 ;Back to 16 bit
STA VideoName+14 ;Save file number
STA AudioName+14
STA DeathName+14
STA DeathAudioName+14
LDA :FileNum+1 ;Get file type (PreShifted by 4)
AND #$FF ;Force byte
TAY
LDA FNamePointers+2,Y
PHA
LDA FNamePointers,Y ;Get true filename
PHA
JSR LoadAFile ;Pass the filename to the file
PHY ;Save the pointer
PHX
PEA #0 ;Blank entry
JSR FindFileInCache ;Find the entry
ASL
TAX
LDA :FileNum ;File number
STA CacheFileNum,X ;Save it
TXA
ASL
TAX
PLA ;Save start address
STA CacheHandle,X
PLA ;Save start address
STA CacheHandle+2,X
:Exit PLD ;Restore master index
PLA
STA 2-1,S
RTS ;Exit
*
* Load a file into memory
* Return the handle
*
LoadAFile
:OpenParms = 1 ;Number of parms
:OpenID = 3 ;1
:OpenFileName = 5 ;2
:OpenReqAccess = 9 ;3
:OpenResourceNum = 11 ;4
:OpenAccess = 13 ;5
:OpenFileType = 15 ;6
:OpenAuxType = 17 ;7
:OpenStorage = 21 ;8
:OpenCreateTime = 23 ;9
:OpenModTime = 31 ;10
:OpenOptions = 39 ;11
:OpenEOF = 43 ;12
:CloseParms = 47 ;Close the file
:CloseID = 49 ;1
:ReadParms = 51 ;Read from the file
:ReadID = 53 ;1
:ReadAdr = 55 ;2
:ReadLen = 59 ;3
:ReadBytes = 63 ;4
:Handle = 67 ;Temp handle
:RTSVal = 71 ;Return address
:FileName = 73 ;Filename pointer
:EndDirect = 77
TSC
SEC
SBC #:RTSVal-1 ;Allocate my local storage
TCS
PHD
TCD
*
* Create the open file record
*
LDA #12 ;12 parms
STA :OpenParms
LDA :FileName ;Get the filename
STA :OpenFileName
LDA :FileName+2
STA :OpenFileName+2
LDA #1 ;I want read only access
STA :OpenReqAccess
STZ :OpenResourceNum ;Only the data fork
PEA #0 ;Bank #0
TDC
INC
PHA
PEA #$2010 ;Open the file
STZ :OpenOptions
STZ :OpenOptions+2
JSL GSOSSTACK
BCC :OpenOk
*
* Ask for a specific disk
*
JSR FadeOut ;Oh oh
JSR WaitForFade
LDA #1
BIT HardDisk
BMI :HD3
LDA VideoName+7 ;Get the disk #
AND #$FF
SEC
SBC #'0' ;Convert to hex
:HD3 STA SideNeeded
PEA #4 ;Show side needed
JSR RunAllScenes
JSR FadeIn ;Fade it in
JSR WaitForFade
*
* Wait until the file is online
*
:LongDelay LDA #2*60
STA DiskTime
]A JSR GetJoyStick ;Process the joystick
LDA QuitFlag ;Did I quit?
BEQ :cc
BRL QuitNow
:cc LDA DiskTime
BNE ]A
PEA #0 ;Bank #0
TDC
INC
PHA
PEA #$2010 ;Open the file
STZ :OpenOptions
STZ :OpenOptions+2
JSL GSOSSTACK
BCS :LongDelay
*
* Wait for screen
*
JSR FadeOut ;Fade out the screen
JSR WaitForFade
LDA WinFlag ;Is it over?
BNE :OpenOk
LDA Lives ;Game over?
BEQ :OpenOk
JSR ShowScoreScreen ;Show the current score as I load
*
* The file is open
*
:OpenOk LDA :OpenID ;Get the ID
STA :ReadID
STA :CloseID
PHA ;Space for handle
PHA
PEI :OpenEOF+2
PEI :OpenEOF
LDA NewID
PHA
PEA #$8200 ;Allow it to be purged!
PHA
PHA
LDX #NewHandle
JSL Tool_Entry
PLX
PLY
BCS :Fatal
STX :Handle ;Dereferance it
STY :Handle+2
LDA [:Handle]
STA :ReadAdr
LDY #2
LDA [:Handle],Y
STA :ReadAdr+2
LDA #4
STA :ReadParms
LDA :OpenEOF
STA :ReadLen ;Read in $60000 long
LDA :OpenEOF+2
STA :ReadLen+2
PEA #0
TDC
CLC
ADC #:ReadParms
PHA
PEA #$2012 ;Read in the file
JSL GSOSSTACK
BCC :ReadOk
:Fatal BRL QuitNow ;Quit!
:ReadOk LDA #1
STA :CloseParms
PEA #0
TDC
CLC
ADC #:CloseParms
PHA
PEA #$2014
JSL GSOSSTACK ;CLOSE
LDX :Handle ;Return the handle
LDY :Handle+2
PLD
LDA :RTSVal,S
STA :EndDirect-2,S
CLC
TSC
ADC #:RTSVal-1+4
TCS
RTS ;Exit
*
* Print a number in decimal
* X = Precision
*
PrDec
:RTSVal = 1
:Value = 3 ;Value to convert
:Length = 5 ;Precision
:Screenad = 7 ;Screen address to draw at
:EndDirect = 9
TSC
PHD
TCD
]B LDY #-2
LDA :Value
LDX :Length
SEC
]A INY
INY
SBC Tens,X ;Sub from 10's table
BCS ]A
ADC Tens,X ;Fix it
STA :Value
PEI :Screenad
LDA DigitPtr,Y ;Which number?
PHA
JSR DrawAShape ;Draw it
STA :Screenad ;Save new screen address
DEC :Length ;Count down
DEC :Length
BPL ]B ;Try again
PLD
PLA
STA 6-1,S
CLC
TSC
ADC #6-2
TCS
RTS ;Exit
*
* Draw a shape
*
DrawAShape
:Width = 1
:Height = 3
:RTSVal = 5
:ShapePtr = 7
:Screenad = 9
:EndDirect = 11
TSC
SEC
SBC #4
TCS
PHD
TCD
LDY :ShapePtr
LDA: $0000,Y ;Get width of shape
AND #$FF
STA :Width
LDA: $0001,Y ;Get height of shape
AND #$FF
STA :Height ;Save
INY
INY ;Index to true shape data
PEI :Width ;Save width
PHA ;Save height
LDA ForeColor ;Get the foreground color
PHA
PHY ;Save the pointer to the shape
LDA VideoBank ;Video bank
PHA
PEI :Screenad ;Pointer to screen memory
JSR Draw4Bit ;Draw the first shape
PEI :Width ;Width
PEI :Height ;Height
LDY BackColor ;Get the foreground color
PHY
PHA ;Pointer to the shape (Continued)
LDA VideoBank
PHA
PEI :Screenad
JSR Draw4Bit ;Draw the second shape
LDA :Width ;2 pixels per byte
ASL
ASL
CLC
ADC :Screenad ;Add to the base address
TAX ;Move to the next char
PLD
LDA :RTSVal,S ;Get return address
STA :EndDirect-2,S
CLC
TSC
ADC #4+4 ;Adjust
TCS
TXA ;Return current shape pointer
RTS ;Exit
*
* Draw a 2 bit per pixel imag
*
Draw4Bit
:Temp1 = 1 ;Bit temp
:Width2 = 3 ;Temp widht
:RTSVal = 5 ;Return address
:Screenad = 7 ;Pointer to video memory
:ShapePtr = 11 ;Pointer to shape
:Color = 13 ;Color to draw with
:Height = 15 ;Height of shape
:Width = 17 ;Width of shape
:EndDirect = 19
TSC
SEC
SBC #4 ;Allocate local storage
TCS
PHD ;Save direct page
TCD
SEP #$20 ;8 bit
LDA :Color ;Make lower into upper for speed drawing
ASL
ASL
ASL
ASL
STA :Color+1
*
* Main loop
*
]C SEP #$20 ;8 bit
LDY #0 ;Clear screen index register
LDA :Width ;Get width of shape
STA :Width2
]B LDA (:ShapePtr) ;Get a shape byte
INC :ShapePtr
BNE :CU
INC :ShapePtr+1
:CU STA :Temp1 ;Save temp
*
* Convert the 1 bit per pixel image
*
LDX #4 ;4 pixels per byte
]A ASL :Temp1
BCC :ClearUpper ;Use as is?
LDA [:Screenad],Y
AND #$0F ;Keep upper pixel
ORA :Color+1 ;Get color to draw with
STA [:Screenad],Y
:ClearUpper ASL :Temp1 ;Get another bit
BCC :ClearLower ;Keep lower pixel?
LDA [:Screenad],Y
AND #$F0
ORA :Color
STA [:Screenad],Y ;Save to screen
:ClearLower INY ;Next screen index
DEX ;All 8 bits done?
BNE ]A
DEC :Width2 ;All bytes done?
BNE ]B ;Loop
REP #$21 ;16 bit and clear carry
LDA :Screenad ;Get current scan line
* CLC
ADC #160 ;Next down
STA :Screenad
DEC :Height ;All done?
BNE ]C
LDX :ShapePtr ;Get current shape index
PLD
LDA :RTSVal,S ;Get return address
STA :EndDirect-2,S
CLC
TSC
ADC #4+12 ;Adjust
TCS
TXA ;Return current shape pointer
RTS ;Exit
*
* Choose the brightest and the darkest colors
* and same the color numbers in ForeColor and BackColor
*
CalcHighLow
:Temp = 1
:MinInten = 3
:MaxInten = 5
:RTSVal = 7
TSC
SEC
SBC #6 ;Allocate my local storace
TCS
PHD
TCD
LDA #-1 ;Assume maximum intensity
STA :MinInten
STZ :MaxInten ;Assume minimum intensity
LDY #32-2 ;All palette colors
]A LDA NewPalette,Y
AND #$0F
STA :Temp
LDA NewPalette,Y
LSR
LSR
LSR
LSR
AND #$0F
CLC
ADC :Temp
STA :Temp
LDA NewPalette+1,Y
AND #$FF
CLC
ADC :Temp
CMP :MinInten
BGE :More
STA :MinInten
STY ForeColor
:More CMP :MaxInten
BLT :Less
STA :MaxInten
STY BackColor
:Less DEY
DEY
BPL ]A
LSR ForeColor
LSR BackColor
PLD
TSC
CLC
ADC #6
TCS
RTS
*
* Init all the system tools and memory requirements
*
InitTools
:Palette = 1 ;Temp palette
:Handle = 33 ;Temp handle
:RTSVal = 37 ;Return address
:EndDirect = 39
TSC
SEC
SBC #36 ;Create my stack frame
TCS
PHD
TCD
PHA ;Space for ID
LDX #MMStartUp ;Start up the Memory Manager
JSL Tool_Entry
PLX
STX MyID ;Save my ID
BCS :Err2
LDX #TLStartUp ;Start up the Tool Locator
JSL Tool_Entry
BCS :Err2
PHA ;Space for handle
PHA
LDA MyID ;Save my application ID
PHA
PEA #2 ;Resource referance
PEA #^MyToolTable ;Index to tool list
PEA #MyToolTable
LDX #StartUpTools ;Start up all my tools
JSL Tool_Entry
PLX ;Get referance pointer
PLY
BCC :ToolOk
:Err2 BRL :Error
:ToolOk STX ToolRef ;Save referance record
STY ToolRef+2
PHA
PEA #$1000 ;Application ID
LDX #GetNewID ;Get data memory ID
JSL Tool_Entry
PLX
BCS :Error
STX NewID ;Save it
PEA #^MyIRQ ;Install my heartbeat irq
PEA #MyIRQ
LDX #SetHeartBeat
JSL Tool_Entry
SEP #$20
LDAL $E1C034 ;Set the border color to black
STA OldBorderColor
AND #$F0
STAL $E1C034
LDA #-1
STA OldBorderColor+1
REP #$20
PEA #0 ;Force screen to 320 mode
LDX #SetAllSCBs
JSL Tool_Entry
LDX #32-2
]A STZ :Palette,X ;Init a blank palette
DEX
DEX
BPL ]A
LDA #0
PHA ;Palette #0
PHA ;Bank #0
TDC
INC
PHA
LDX #SetColorTable ;Set color palette
JSL Tool_Entry
LDX #HideCursor
JSL Tool_Entry
PHA ;Get the current port
PHA
LDX #GetPort
JSL Tool_Entry
PLA
STA :Handle
PLA
STA :Handle+2
LDY #4
LDA [:Handle],Y
STA VideoBank
LDA #0
:Error TAX ;Save error code
PLD ;Restore direct page
CLC
TSC
ADC #36 ;Remove local
TCS
TXA
CMP #1
RTS
*
* Quit the program RIGHT NOW!
*
KillTools PEA #^MyIRQ
PEA #MyIRQ
LDX #DelHeartBeat
JSL Tool_Entry
:NoDisp LDA OldBorderColor
BPL :NotBack
SEP #$20
STAL $E1C034 ;clock control register
REP #$20
:NotBack
LDX ToolRef ;Any tools loaded?
LDY ToolRef+2
BNE :Tools
TXA
BEQ :NoTools
:Tools PEA #1 ;Referance is by handle
PHY ;Pointer to Tool list
PHX
LDX #ShutDownTools ;Turn off all tools
JSL Tool_Entry
:NoTools LDA NewID ;Get my memory ID
BEQ :BadID
PHA ;Remove
PHA ;Kill memory
LDX #DisposeAll ;Kill all allocated memory
JSL Tool_Entry
LDX #DeleteID ;Remove this ID
JSL Tool_Entry
:BadID LDX #TLShutDown ;Kill Tool Locator
JSL Tool_Entry
LDA MyID
PHA
LDX #MMShutDown ;Kill Memory manager
JSL Tool_Entry
RTS
*
* Check if the disk is online
*
CheckHardDrive
PEA #^:FileInfo
PEA #:FileInfo
PEA #$2006 ;Get File Info
JSL GSOSSTACK
BCC :Floppy
*
* Adjust pointer table to get rid of prefixs
*
LDX #4-1*4
]A CLC
LDA FNamePointers,X
ADC #5
STA FNamePointers,X
TAY
LDA #9
STA: $0000,Y
LDA #'9:'
STA: $0002,Y
DEX
DEX
DEX
DEX
BPL ]A
LDA #14 ;Corrent the final length
STA DeathAudioName+5
LDA #-1 ;This is a hard disk game
STA HardDisk
:Floppy RTS
:FileInfo DA 2 ;Parm count
ADRL VideoName ;Pathname
DS 2 ;Access
*
* Read the joystick/keyboard
*
GetJoyStick
:EventRec = 1
:RTSVal = 17
:EndDirect = 19
TSC
SEC
SBC #16 ;Stack frame
TCS
PHD
TCD
LDA KeyTime ;Time to read the keyboard?
BEQ :Read
BRL :NotYet ;Exit now
:Read DEC KeyTime ;Set flag
PHA
PEA #$FFFF ;Allow desk accs
PEA #0
TDC
INC ;My event record
PHA
LDX #GetNextEvent
JSL Tool_Entry
PLA ;Get event #
BCS :NoKey2 ;Error?
BEQ :NoKey2 ;No event?
LDA :EventRec ;Event type
CMP #3 ;Keyboard
BEQ :KeyOk
CMP #5 ;Auto key?
BNE :NoKey2
:KeyOk LDA :EventRec+2 ;Get key
CMP #'a'
BLT :Use
CMP #'z'+1
BGE :Use
AND #$DF ;Convert to upper case
:Use CMP #'Q' ;Quit?
BNE :NotQuit
LDA #-1 ;Set the quit flag
STA QuitFlag
BRA :NoKey2
:NotQuit CMP #'P' ;Pause
BNE :NotPause
LDA PauseFlag
EOR #-1
STA PauseFlag
:NoKey2 BRL :NoKey
:NotPause CMP #'S' ;Sound
BEQ :Sound
CMP #$13 ;Ctrl-S
BEQ :Sound
CMP #'A' ;Audio
BNE :NotSound
:Sound LDA SoundFlag ;Toggle sound bit
EOR #1
STA SoundFlag
BRA :NoKey
:NotSound CMP #'W'
BNE :NotWimp
LDA WimpMode
EOR #-1
STA WimpMode
BRA :NoKey
:NotWimp LDX #$10 ;Assume fire
CMP #$0D ;Enter
BEQ :JoyKey
CMP #'0'
BEQ :JoyKey
LDX #$08
CMP #'2' ;2 or 5
BEQ :JoyKey
CMP #'5'
BEQ :JoyKey
CMP #$0A
BEQ :JoyKey
LDX #$02
CMP #'4'
BEQ :JoyKey
CMP #$08
BEQ :JoyKey
LDX #$01
CMP #'6'
BEQ :JoyKey
CMP #$15
BEQ :JoyKey
LDX #$04
CMP #'8'
BEQ :JoyKey
CMP #$0B
BNE :NoKey
:JoyKey TXA
LDX JoyStickVal
BEQ :TooSoon
LDA #$FFFF
:TooSoon TSB JoyStickVal
:NoKey
:NotYet LDX JoyStickVal
PLD
CLC
TSC
ADC #16
TCS
TXA
RTS
*
* My global variables
*
Tens DA 1,10,100,1000,10000 ;Tens for PrDec
VideoBank DA $E1 ;Bank of video memory
WimpMode DS 2 ;I am wimping out!
MyID DS 2 ;My memory ID
NewID DS 2 ;My data ID
MyDirect DS 2 ;My direct page address
MyStack DS 2 ;My stack pointer
ToolRef DS 4 ;My tool handle
ForeColor DS 2 ;Foreground color
BackColor DS 2 ;Background color
SoundFlag DS 2 ;Set if sound is disabled
PauseFlag DS 2 ;Set if game is paused
QuitFlag DS 2 ;Set if game is quit
FadeFactor DS 2 ;Current fade index
FadeFlag DS 2 ;Fade direction (If any)
FadeTable DS 16 ;Fade multiply table
KeyTime DS 2 ;Zero if time to read the keyboard
ColorFlag DS 2 ;Set if a new palette is created
OldBorderColor DS 2 ;Previous border color
NewPalette DS 32 ;New game palette
JoyStickVal DS 2 ;Joy stick value
StartTimer DS 2 ;Set to start the videocount
VideoCount DS 2 ;Number of video frames of time delat
CountDown DS 2 ;Count down IRQ timer
SoundTimeDelta DS 2 ;Current running sound time
SoundTime DS 2 ;Sound time speed
MySoundHalt DA 1 ;Sound halt flag
Score DS 2 ;Current score
DiskTime DS 2 ;Time between disk events
HardDisk DS 2 ;Set if on a hard disk
UnpackPtr DS 4 ;Pointer to video data
PackSoundPtr DS 4 ;Pointer to current sound data
SoundSize DS 2 ;Remaining sound data
DocRamPtr DS 2 ;Pointer to DOC RAM
RawPackSoundPtr DS 4 ;True pointer to sound data
RawSoundSize DS 2 ;Size of sound data
FrameCounter DS 2 ;Current frame #
BlankPalFlag DS 2 ;Screen blanked?
SoundPitch DS 2 ;Sound pitch
PlayedDeath DS 2 ;Am I playing a death scene?
SoundPresent DS 2 ;Is a sound loaded?
CurrentScene DS 2 ;Which scene is active?
Lives DS 2 ;Number of lives left
WinFlag DS 2 ;Set if you have won!
ScoreDisable DS 2 ;Set if score screen is shut down
SideNeeded DS 2 ;Disk side needed (For floppies)
*
* GSOS parmeters
*
FNamePointers ADRL VideoName
ADRL AudioName
ADRL DeathName
ADRL DeathAudioName
VideoName STRL ':DISK1:VIDEO01'
AudioName STRL ':DISK1:AUDIO01'
DeathName STRL ':DISK1:DEATH01'
DeathAudioName STRL ':DISK1:DEATH01AUDIO'
*
* File index cache
*
CacheFileNum DS 2*MemHandles
CacheHandle DS 4*MemHandles
DiskSides DB 10,14,19,25,29,35,39,44,99
WeirdSides DA 9,$0412,$0C12,34,$822,$C22,$426
Files01 DA 01,$0401,0
Files02 DA 02,0
Files03 DA 03,0
Files04 DA 04,0
Files05 DA 05,0
AList01 DA 01,NullMoves
DA 0
AList02 DA 02,NullMoves
DA 0
AList03 DA 03,NullMoves
DA 0
AList04 DA 04,NullMoves
DA 0
AList05 DA 05,NullMoves
DA 0
Files06 DA 06,$0406,07,$0407,$0807,$0C07,0
AList06 DA 06,NullMoves
DA 07,L16CD
DA 0
L16CD HEX 18010807220208072B080807
NullMoves HEX 00
Files07 DA 08,$0408,$0807,$0C07,0
AList07 DA 08,L16EA
DA 0
L16EA HEX 0F0808071E04080700
Files08 DA $0409,$0809,$0C09,09,0
AList08 DA 09,L1703
DA 0
L1703 HEX 0D0108091B020809350208094F02080900
Files09 DA 10,$040A,$080A,$0C0A,11,$040B,0
AList09 DA 10,L172C
DA 11,NullMoves
DA 0
L172C HEX 1104080A00
Files10 DA 12,$040C,$080C,$0C0C,0
AList10 DA 12,L1741
DA 0
L1741 HEX 0D10080C00
Files11 DA $080D,$0C0D,13,$040D,0
AList11 DA 13,L1756
DA 0
L1756 HEX 0E01080D1404080D00
Files12 DA $080D,$0C0D,14,$040E,0
AList12 DA 14,L176F
DA 0
L176F HEX 1201080D1601080D00
Files13 DA 15,$040F,$080F,$0C0F,16,$0410,0
AList13 DA 15,L1790
DA 16,L1799
DA 0
L1790 HEX 0A08080F1001080F00
L1799 HEX 0908080F0E02080F00
Files14 DA 17,$0411,$080F,$0C0F,0
AList14 DA 17,L17B2
DA 0
L17B2 HEX 1110080F00
Files15 DA 18,$0812,$0412,$0C12,0
AList15 DA 18,L17C7
DA 0
L17C7 HEX 2004081200
Files16 DA 19,$0413,$0813,$0C13,20,$0414,21,$0415,0
AList16 DA 19,L17EC
DA 20,L17F1
DA 21,L17F6
DA 0
L17EC HEX 1304081300
L17F1 HEX 0D01081300
L17F6 HEX 1104081300
Files17 DA 22,$0416,$0816,$0C16,23,$0417,0
AList17 DA 22,L1813
DA 23,L1818
DA 0
L1813 HEX 0F01081600
L1818 HEX 1002081600
Files18 DA 24,$0418,$0816,$0C16,25,$0419,26,$041A,0
AList18 DA 24,L183D
DA 25,L1842
DA 26,L1847
DA 0
L183D HEX 0D02081600
L1842 HEX 1401081600
L1847 HEX 0B04081600
Files19 DA $081B,$0C1B,$081C,$0C1C,27,$041B,0
AList19 DA 27,L1860
DA 0
L1860 HEX FF04081BFF08081B0C10081C1701081C00
Files20 DA $081B,$0C1B,$081C,$0C1C,28,$041C,0
AList20 DA 28,L1885
DA 0
L1885 HEX FF04081BFF08081B0810081C00
Files21 DA $081B,$0C1B,$081C,$0C1C,29,$041D,0
AList21 DA 29,L18A6
DA 0
L18A6 HEX FF04081BFF08081B0C10081C00
Files22 DA $081B,$0C1B,$081C,$0C1C,30,$041E,0
AList22 DA 30,L18C7
DA 0
L18C7 HEX FF01081B0B10081C00
Files23 DA $081B,$0C1B,$081C,$0C1C,31,$041F,0
AList23 DA 31,L18E4
DA 0
L18E4 HEX 0904081C1308081C00
Files24 DA $081B,$0C1B,$081C,$0C1C,32,$0420,0
AList24 DA 32,L1901
DA 0
L1901 HEX 0510081C0E08081C00
Files25 DA $081B,$0C1B,$081C,$0C1C,33,$0421,0
AList25 DA 33,L191E
DA 0
L191E HEX 0901081C0E08081B00
Files26 DA $0422,$0C22,34,$0822,35,$0423,0
AList26 DA 34,NullMoves
DA 35,L193F
DA 0
L193F HEX 0502082200
Files27 DA $0824,$0C24,36,$0424,37,$0425,0
AList27 DA 36,NullMoves
DA 37,L195C
DA 0
L195C HEX 0B01082400
Files28 DA $0824,$0C24,38,$0426,0
AList28 DA 38,L1971
DA 0
L1971 HEX 0D10082200
Files29 DA $0827,$0C27,39,$0427,40,$0428,41,$0429,0
AList29 DA 39,NullMoves
DA 40,L199A
DA 39,NullMoves
DA 41,L199F
DA 0
L199A HEX 0801082700
L199F HEX 1102082700
Files30 DA $0827,$0C27,39,$0427,42,$042A,43,$042B,0
AList30 DA 39,NullMoves
DA 42,L19C8
DA 39,NullMoves
DA 43,L19CD
DA 0
L19C8 HEX 0C01082700
L19CD HEX 0B0208271201082700
Files31 DA 44,$042C,45,$042D,46,$042E,47,$042F,0
AList31 DA 44,NullMoves
DA 45,NullMoves
DA 46,NullMoves
DA 47,NullMoves
DA 0
Files32 DA 48,$0430,49,$0431,0
AList32 DA 48,NullMoves
DA 49,NullMoves
DA 0000
ScriptPtrs DA Files01,AList01 ;1
DA Files02,AList02 ;2
DA Files03,AList03 ;3
DA Files04,AList04 ;4
DA Files05,AList05 ;5
DA Files06,AList06 ;6
DA Files07,AList07 ;7
DA Files08,AList08 ;8
DA Files09,AList09 ;9
DA Files10,AList10 ;10
DA Files11,AList11 ;11
DA Files12,AList12 ;12
DA Files13,AList13 ;13
DA Files14,AList14 ;14
DA Files15,AList15 ;15
DA Files16,AList16 ;16
DA Files17,AList17 ;17
DA Files18,AList18 ;18
DA Files19,AList19 ;19
DA Files20,AList20 ;20
DA Files21,AList21 ;21
DA Files22,AList22 ;22
DA Files23,AList23 ;23
DA Files24,AList24 ;24
DA Files25,AList25 ;25
DA Files26,AList26 ;26
DA Files27,AList27 ;27
DA Files28,AList28 ;28
DA Files29,AList29 ;29
DA Files30,AList30 ;30
DA Files31,AList31 ;31
DA Files32,AList32 ;32
DA 0 ;No more scripts
PUT shapes.a65