mirror of
https://github.com/Olde-Skuul/spaceaceiigs.git
synced 2024-10-31 18:04:43 +00:00
2603 lines
39 KiB
Plaintext
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
|