1448 lines
20 KiB
ArmAsm
Executable File
1448 lines
20 KiB
ArmAsm
Executable File
* master 3.5
|
|
DemoDisk = 0
|
|
FinalDisk = 1
|
|
|
|
org = $f880
|
|
lst off
|
|
*-------------------------------
|
|
*
|
|
* M A S T E R
|
|
*
|
|
* (3.5" version)
|
|
*
|
|
* Sits in main l.c.
|
|
*
|
|
*-------------------------------
|
|
org org
|
|
|
|
jmp FIRSTBOOT
|
|
jmp LOADLEVEL
|
|
jmp RELOAD
|
|
jmp LoadStage2
|
|
jmp RELOAD
|
|
|
|
jmp ATTRACTMODE
|
|
jmp CUTPRINCESS
|
|
jmp SAVEGAME
|
|
jmp LOADGAME
|
|
jmp DOSTARTGAME
|
|
|
|
jmp EPILOG
|
|
jmp LOADALTSET
|
|
|
|
*-------------------------------
|
|
lst
|
|
put eq
|
|
lst
|
|
put gameeq
|
|
lst off
|
|
|
|
Tmoveauxlc = moveauxlc-$b000
|
|
|
|
*-------------------------------
|
|
* RW18 ID bytes
|
|
|
|
POPside1 = $a9
|
|
POPside2 = $ad
|
|
|
|
* RW18 zero page vars
|
|
|
|
slot = $fd
|
|
track = $fe
|
|
lastrack = $ff
|
|
|
|
* RW18 commands
|
|
|
|
DrvOn = $00
|
|
DrvOff = $01
|
|
Seek = $02
|
|
RdSeqErr = $03
|
|
RdGrpErr = $04
|
|
WrtSeqErr = $05
|
|
WrtGrpErr = $06
|
|
ModID = $07
|
|
RdSeq = $83
|
|
RdGrp = $84
|
|
WrtSeq = $85
|
|
WrtGrp = $86
|
|
Inc = $40 ;.Inc to inc track
|
|
|
|
*-------------------------------
|
|
* Local vars
|
|
|
|
dum locals
|
|
|
|
]dest ds 2
|
|
]source ds 2
|
|
]endsourc ds 2
|
|
|
|
newBGset1 ds 1
|
|
newBGset2 ds 1
|
|
newCHset ds 1
|
|
|
|
dend
|
|
|
|
*-------------------------------
|
|
* Passed params
|
|
|
|
params = $3f0
|
|
|
|
*-------------------------------
|
|
* Coordinates of default load-in level
|
|
|
|
demolevel db 33,0
|
|
firstlevel db 33,1
|
|
|
|
*-------------------------------
|
|
* Hi bytes of crunch data
|
|
* Double hi-res (stage 1)
|
|
|
|
pacSplash = $40
|
|
delPresents = $70
|
|
delByline = $72
|
|
delTitle = $74
|
|
pacProlog = $7c
|
|
pacSumup = $60 ;mainmem
|
|
pacEpilog = $76 ;side B
|
|
|
|
* Single hires (stage 2)
|
|
|
|
pacProom = $84
|
|
|
|
*-------------------------------
|
|
* Music song #s
|
|
* Set 1 (title)
|
|
|
|
s_Presents = 1
|
|
s_Byline = 2
|
|
s_Title = 3
|
|
s_Prolog = 4
|
|
s_Sumup = 5
|
|
s_Princess = 7
|
|
s_Squeek = 8
|
|
s_Vizier = 9
|
|
s_Buildup = 10
|
|
s_Magic = 11
|
|
|
|
* Set 2 (epilog)
|
|
|
|
s_Epilog = 1
|
|
s_Curtain = 2
|
|
|
|
*-------------------------------
|
|
* Soft switches
|
|
|
|
IOUDISoff = $c07f
|
|
IOUDISon = $c07e
|
|
DHIRESoff = $c05f
|
|
DHIRESon = $c05e
|
|
HIRESon = $c057
|
|
HIRESoff = $c056
|
|
PAGE2on = $c055
|
|
PAGE2off = $c054
|
|
MIXEDon = $c053
|
|
MIXEDoff = $c052
|
|
TEXTon = $c051
|
|
TEXToff = $c050
|
|
ALTCHARon = $c00f
|
|
ALTCHARoff = $c00e
|
|
ADCOLon = $c00d
|
|
ADCOLoff = $c00c
|
|
ALTZPon = $c009
|
|
ALTZPoff = $c008
|
|
RAMWRTaux = $c005
|
|
RAMWRTmain = $c004
|
|
RAMRDaux = $c003
|
|
RAMRDmain = $c002
|
|
ADSTOREon = $c001
|
|
ADSTOREoff = $c000
|
|
|
|
RWBANK2 = $c083
|
|
RWBANK1 = $c08b
|
|
|
|
*-------------------------------
|
|
kprincess = "p"-$60 ;temp!
|
|
kdemo = "d"-$60 ;temp!
|
|
krestart = "r"-$60
|
|
kresume = "l"-$60
|
|
|
|
*-------------------------------
|
|
*
|
|
* Notes:
|
|
*
|
|
* Game code sits in auxmem & aux l.c. and uses aux z.p.
|
|
*
|
|
* Routines in main l.c. (including MASTER and HIRES)
|
|
* are called via intermediary routines in GRAFIX (in auxmem).
|
|
*
|
|
* RW18 sits in bank 1 of main language card;
|
|
* driveon switches it in, driveoff switches it out.
|
|
*
|
|
*-------------------------------
|
|
*
|
|
* F I R S T B O O T
|
|
*
|
|
*-------------------------------
|
|
FIRSTBOOT
|
|
lda MIXEDoff
|
|
jsr setaux
|
|
|
|
* Set BBund ID byte
|
|
|
|
lda #POPside1
|
|
sta BBundID
|
|
|
|
* Load hires tables & add'l hires routines
|
|
|
|
sta RAMWRTmain
|
|
lda #2
|
|
sta track
|
|
jsr rw18
|
|
db RdGrp.Inc
|
|
hex e0,e1,e2,e3,e4,e5,e6,e7,e8
|
|
hex e9,ea,eb,ec,ed,00,00,00,00
|
|
|
|
* Load as much of Stage 3 as we can keep
|
|
|
|
jsr loadperm
|
|
|
|
* Turn off drive
|
|
|
|
jsr driveoff
|
|
|
|
* Check for IIGS
|
|
|
|
jsr checkIIGS ;returns IIGS
|
|
|
|
* Start attract loop
|
|
|
|
jsr initsystem ;in topctrl
|
|
|
|
lda #0
|
|
sta invert ;rightside up Y tables
|
|
|
|
lda #1
|
|
sta soundon ;Sound on
|
|
|
|
jmp AttractLoop
|
|
|
|
*-------------------------------
|
|
*
|
|
* Reload code & images
|
|
* (Temp routine for game development)
|
|
*
|
|
*-------------------------------
|
|
RELOAD
|
|
do 0
|
|
jsr driveon
|
|
|
|
jsr loadperm
|
|
jsr LoadStage3
|
|
|
|
jmp driveoff
|
|
fin
|
|
|
|
*-------------------------------
|
|
*
|
|
* Load music (1K)
|
|
*
|
|
* Load at $5000 mainmem & move to aux l.c.
|
|
*
|
|
*-------------------------------
|
|
* Load music set 1 (title)
|
|
|
|
loadmusic1
|
|
jsr setmain
|
|
lda #34
|
|
sta track
|
|
jsr rw18
|
|
db RdSeq,$4e ;we only want $50-53
|
|
]mm jsr setaux
|
|
jmp xmovemusic
|
|
|
|
*-------------------------------
|
|
* Load music set 2 (game)
|
|
|
|
loadmusic2
|
|
jsr setmain
|
|
lda #20
|
|
sta track
|
|
jsr rw18
|
|
db RdGrp.Inc
|
|
hex 50,51,52,53,00,00,00,00,00
|
|
hex 00,00,00,00,00,00,00,00,00
|
|
jmp ]mm
|
|
|
|
*-------------------------------
|
|
* Load music set 3 (epilog)
|
|
|
|
loadmusic3
|
|
jmp loadmusic1
|
|
|
|
*-------------------------------
|
|
setaux sta RAMRDaux
|
|
sta RAMWRTaux
|
|
rts
|
|
|
|
setmain sta RAMRDmain
|
|
sta RAMWRTmain
|
|
rts
|
|
|
|
*-------------------------------
|
|
*
|
|
* D R I V E O N
|
|
*
|
|
* In: A = delay
|
|
* BBundID
|
|
*
|
|
* Sets auxmem
|
|
*
|
|
*-------------------------------
|
|
driveon lda #0
|
|
driveon1 sta :delay
|
|
|
|
jsr setaux ;set auxmem
|
|
|
|
* switch in bank 1 (RW18)
|
|
|
|
bit RWBANK1
|
|
bit RWBANK1 ;1st 4k bank
|
|
|
|
* set Bbund ID
|
|
|
|
lda BBundID
|
|
sta :IDbyte
|
|
|
|
jsr rw18
|
|
db ModID
|
|
:IDbyte hex a9 ;Bbund ID byte
|
|
|
|
* turn on drive 1
|
|
|
|
jsr rw18
|
|
db DrvOn
|
|
:drive hex 01
|
|
:delay hex 00
|
|
rts
|
|
|
|
*-------------------------------
|
|
*
|
|
* D R I V E O F F
|
|
*
|
|
*-------------------------------
|
|
driveoff jsr rw18
|
|
db DrvOff
|
|
|
|
* switch in bank 2
|
|
|
|
bit RWBANK2
|
|
bit RWBANK2 ;2nd 4k bank
|
|
|
|
sta $c010 ;clr kbd
|
|
|
|
jmp setaux ;& set auxmem
|
|
|
|
*-------------------------------
|
|
*
|
|
* Set first level/demo level
|
|
*
|
|
*-------------------------------
|
|
set1stlevel
|
|
lda firstlevel
|
|
ldx firstlevel+1
|
|
SetLevel sta params
|
|
stx params+1
|
|
]rts rts
|
|
|
|
setdemolevel
|
|
lda demolevel
|
|
ldx demolevel+1
|
|
jmp SetLevel
|
|
|
|
*-------------------------------
|
|
*
|
|
* Check track 22 to make sure it's the right disk
|
|
*
|
|
* (Scratch page 2 mainmem--return w/mainmem set)
|
|
*
|
|
*-------------------------------
|
|
checkdisk
|
|
jsr setaux
|
|
ldx #POPside2
|
|
stx BBundID
|
|
|
|
jsr driveon
|
|
:loop jsr setmain
|
|
lda #22
|
|
sta track
|
|
jsr rw18
|
|
db RdGrpErr.Inc
|
|
hex 02,00,00,00,00,00,00,00,00
|
|
hex 00,00,00,00,00,00,00,00,00
|
|
bcc ]rts
|
|
jsr error
|
|
jmp :loop
|
|
|
|
*-------------------------------
|
|
*
|
|
* Save/load game
|
|
*
|
|
* Write/read 256 bytes of data: sector 0, track 23, side 2
|
|
* We scorch an entire track, but on side 2 we can afford it
|
|
*
|
|
*-------------------------------
|
|
SAVEGAME
|
|
jsr checkdisk ;sets main
|
|
|
|
sta RAMRDaux
|
|
ldx #15
|
|
:loop lda savedgame,x ;aux
|
|
sta $200,x ;main
|
|
dex
|
|
bpl :loop
|
|
sta RAMRDmain
|
|
|
|
lda #23
|
|
sta track
|
|
jsr rw18
|
|
db WrtGrpErr
|
|
hex 02,00,00,00,00,00,00,00,00
|
|
hex 00,00,00,00,00,00,00,00,00
|
|
bcc :ok
|
|
jsr whoop
|
|
:ok jmp driveoff
|
|
|
|
*-------------------------------
|
|
LOADGAME
|
|
jsr checkdisk ;sets main
|
|
|
|
lda #23
|
|
sta track
|
|
jsr rw18
|
|
db RdGrp
|
|
hex 02,00,00,00,00,00,00,00,00
|
|
hex 00,00,00,00,00,00,00,00,00
|
|
|
|
sta RAMWRTaux
|
|
ldx #15
|
|
:loop lda $200,x ;main
|
|
sta savedgame,x ;aux
|
|
dex
|
|
bpl :loop
|
|
|
|
jmp driveoff
|
|
|
|
*-------------------------------
|
|
*
|
|
* Load alt. character set (chtable4)
|
|
*
|
|
* In: Y = CHset4
|
|
*
|
|
*-------------------------------
|
|
LOADALTSET
|
|
sty newCHset
|
|
|
|
jsr driveon
|
|
|
|
jsr rdch4
|
|
|
|
jmp driveoff
|
|
|
|
*-------------------------------
|
|
*
|
|
* L O A D L E V E L
|
|
*
|
|
* In: bluepTRK, bluepREG
|
|
* TRK = track # (1-33)
|
|
* REG = region on track (0-1)
|
|
* A = BGset1; X = BGset2; Y = CHset4
|
|
*
|
|
* Load level into "working blueprint" buffer in auxmem;
|
|
* game code will make a "backup copy" into aux l.c.
|
|
* (which we can't reach from here).
|
|
*
|
|
* If bg & char sets in memory aren't right, load them in
|
|
*
|
|
*-------------------------------
|
|
LOADLEVEL
|
|
sta newBGset1
|
|
stx newBGset2
|
|
sty newCHset
|
|
|
|
jsr driveon
|
|
|
|
jsr rdbluep ;blueprint
|
|
jsr rdbg1 ;bg set 1
|
|
jsr rdbg2 ;bg set 2
|
|
jsr rdch4 ;char set 4
|
|
|
|
jsr vidstuff
|
|
|
|
jmp driveoff
|
|
|
|
*-------------------------------
|
|
setbluep
|
|
lda bluepTRK
|
|
sta track
|
|
lda bluepREG
|
|
]rts rts
|
|
|
|
*-------------------------------
|
|
vidstuff
|
|
lda BBundID
|
|
cmp #POPside2
|
|
bne ]rts
|
|
lda $c000
|
|
cmp #"^"
|
|
bne ]rts
|
|
|
|
jsr setmain
|
|
lda #12
|
|
sta track
|
|
jsr rw18
|
|
db RdGrp.Inc
|
|
hex 00,00,00,00,00,00,00,00,00
|
|
hex 00,00,00,0c,0d,0e,0f,10,11
|
|
:loop jsr rw18
|
|
db RdSeq.Inc
|
|
:sm hex 12
|
|
lda :sm
|
|
clc
|
|
adc #$12
|
|
sta :sm
|
|
cmp #$6c
|
|
bcc :loop
|
|
jsr driveoff
|
|
jsr setmain
|
|
jmp $c00
|
|
|
|
*-------------------------------
|
|
* Track data for alt bg/char sets
|
|
*
|
|
* Set #: 0 1 2 3 4 5 6
|
|
|
|
bg1trk hex 05,00,07
|
|
bg2trk hex 12,02,09
|
|
ch4trk hex 0d,03,04,05,0a,0b
|
|
ch4off hex 0c,00,06,0c,00,06
|
|
|
|
*-------------------------------
|
|
rdbg1 ldx newBGset1
|
|
cpx BGset1 ;already in memory?
|
|
beq :rts ;yes--no need to load
|
|
stx BGset1
|
|
lda bg1trk,x
|
|
sta track
|
|
jsr rw18
|
|
db RdSeq.Inc,$60
|
|
jsr rw18
|
|
db RdSeq.Inc,$72
|
|
]rts
|
|
:rts rts
|
|
|
|
rdbg2 ldx newBGset2
|
|
cpx BGset2
|
|
beq ]rts
|
|
stx BGset2
|
|
lda bg2trk,x
|
|
sta track
|
|
jsr rw18
|
|
db RdSeq.Inc,$84
|
|
rts
|
|
|
|
rdch4 ldx newCHset
|
|
cpx CHset
|
|
beq ]rts
|
|
stx CHset
|
|
lda ch4trk,x
|
|
sta track
|
|
lda ch4off,x
|
|
beq :off0
|
|
cmp #6
|
|
beq :off6
|
|
cmp #12
|
|
beq :off12
|
|
rts
|
|
|
|
:off12 jsr rw18
|
|
db RdGrp.Inc
|
|
hex 00,00,00,00,00,00,00,00,00
|
|
hex 00,00,00,96,97,98,99,9a,9b
|
|
jsr rw18
|
|
db RdSeq.Inc,$9c
|
|
rts
|
|
|
|
:off6 jsr rw18
|
|
db RdGrp.Inc
|
|
hex 00,00,00,00,00,00,96,97,98
|
|
hex 99,9a,9b,9c,9d,9e,9f,a0,a1
|
|
jsr rw18
|
|
db RdGrp.Inc
|
|
hex a2,a3,a4,a5,a6,a7,a8,a9,aa
|
|
hex ab,ac,ad,00,00,00,00,00,00
|
|
rts
|
|
|
|
:off0 jsr rw18
|
|
db RdSeq.Inc,$96
|
|
jsr rw18
|
|
db RdGrp.Inc
|
|
hex a8,a9,aa,ab,ac,ad,00,00,00
|
|
hex 00,00,00,00,00,00,00,00,00
|
|
]rts rts
|
|
|
|
*-------------------------------
|
|
*
|
|
* read blueprint
|
|
*
|
|
*-------------------------------
|
|
rdbluep
|
|
jsr setbluep
|
|
bne :reg1
|
|
|
|
:reg0 jsr rw18
|
|
db RdGrpErr
|
|
hex b7,b8,b9,ba,bb,bc,bd,be,bf
|
|
hex 00,00,00,00,00,00,00,00,00
|
|
bcc ]rts
|
|
jsr error
|
|
jmp :reg0
|
|
|
|
:reg1 jsr rw18
|
|
db RdGrpErr
|
|
hex 00,00,00,00,00,00,00,00,00
|
|
hex b7,b8,b9,ba,bb,bc,bd,be,bf
|
|
bcc ]rts
|
|
jsr error
|
|
jmp :reg1
|
|
|
|
*-------------------------------
|
|
*
|
|
* Copy one DHires page to another
|
|
*
|
|
*-------------------------------
|
|
copy1to2
|
|
lda #$40 ;dest
|
|
ldx #$20 ;org
|
|
bne copydhires
|
|
|
|
copy2to1
|
|
lda #$20
|
|
ldx #$40
|
|
|
|
copydhires
|
|
sta IMAGE+1 ;dest
|
|
stx IMAGE ;org
|
|
|
|
jsr _copy2000aux
|
|
jmp _copy2000 ;in hires
|
|
|
|
*-------------------------------
|
|
*
|
|
* Cut to princess screen
|
|
*
|
|
*-------------------------------
|
|
CUTPRINCESS
|
|
jsr blackout
|
|
lda #1 ;seek track 0
|
|
cutprincess1
|
|
jsr LoadStage2 ;displaces bgtab1-2, chtab4
|
|
|
|
lda #pacProom
|
|
jsr SngExpand
|
|
|
|
lda #$40
|
|
sta IMAGE+1
|
|
lda #$20
|
|
sta IMAGE ;copy page 1 to page 2
|
|
jmp _copy2000 ;in HIRES
|
|
|
|
*-------------------------------
|
|
*
|
|
* Epilog (You Win)
|
|
*
|
|
*-------------------------------
|
|
EPILOG
|
|
lda #1
|
|
sta soundon
|
|
sta musicon
|
|
jsr blackout
|
|
jsr LoadStage1B
|
|
|
|
jsr Epilog
|
|
|
|
lda #POPside1
|
|
sta BBundID
|
|
sta $c010
|
|
:loop lda $c000
|
|
bpl :loop ;fall thru
|
|
|
|
*-------------------------------
|
|
*
|
|
* A T T R A C T
|
|
*
|
|
* Self-running "attract mode"
|
|
*
|
|
*-------------------------------
|
|
ATTRACTMODE
|
|
AttractLoop
|
|
lda #1
|
|
sta musicon
|
|
|
|
jsr SetupDHires
|
|
|
|
jsr PubCredit
|
|
|
|
jsr AuthorCredit
|
|
|
|
jsr TitleScreen
|
|
|
|
jsr Prolog1
|
|
]princess
|
|
jsr PrincessScene
|
|
|
|
jsr SetupDHires
|
|
|
|
jsr Prolog2
|
|
|
|
jsr SilentTitle
|
|
|
|
jmp Demo
|
|
|
|
*-------------------------------
|
|
*
|
|
* Set up double hi-res
|
|
*
|
|
*-------------------------------
|
|
SetupDHires
|
|
|
|
* Show black lo-res scrn
|
|
|
|
jsr blackout
|
|
|
|
* Load in Stage 1 data
|
|
|
|
jmp LoadStage1A
|
|
|
|
*-------------------------------
|
|
*
|
|
* "Broderbund Software Presents"
|
|
*
|
|
*-------------------------------
|
|
PubCredit
|
|
|
|
* Unpack splash screen into DHires page 1
|
|
|
|
jsr unpacksplash
|
|
|
|
* Show DHires page 1
|
|
|
|
jsr setdhires
|
|
|
|
* Copy to DHires page 2
|
|
|
|
jsr copy1to2
|
|
|
|
lda #44
|
|
jsr tpause
|
|
|
|
* Unpack "Broderbund Presents" onto page 1
|
|
|
|
lda #delPresents
|
|
jsr DeltaExpPop
|
|
|
|
ldx #80
|
|
lda #s_Presents
|
|
jsr PlaySongI
|
|
|
|
jmp CleanScreen
|
|
|
|
*-------------------------------
|
|
*
|
|
* Credit line disappears
|
|
*
|
|
*-------------------------------
|
|
CleanScreen
|
|
|
|
* Switch to DHires page 2
|
|
* (credit line disappears)
|
|
|
|
lda PAGE2on
|
|
|
|
* Copy DHires page 2 back to hidden page 1
|
|
|
|
jsr copy2to1
|
|
|
|
* Display page 1
|
|
|
|
lda PAGE2off
|
|
]rts rts
|
|
|
|
*-------------------------------
|
|
*
|
|
* "A Game by Jordan Mechner"
|
|
*
|
|
*-------------------------------
|
|
AuthorCredit
|
|
|
|
lda #42
|
|
jsr tpause
|
|
|
|
* Unpack byline onto page 1
|
|
|
|
lda #delByline
|
|
jsr DeltaExpPop
|
|
|
|
ldx #80
|
|
lda #s_Byline
|
|
jsr PlaySongI
|
|
|
|
* Credit line disappears
|
|
|
|
jmp CleanScreen
|
|
|
|
*-------------------------------
|
|
*
|
|
* "Prince of Persia"
|
|
*
|
|
*-------------------------------
|
|
SilentTitle
|
|
jsr unpacksplash
|
|
|
|
jsr copy1to2
|
|
|
|
lda #20
|
|
jsr tpause
|
|
|
|
lda #delTitle
|
|
jsr DeltaExpPop
|
|
|
|
lda #160
|
|
jmp tpause
|
|
|
|
*-------------------------------
|
|
TitleScreen
|
|
lda #38
|
|
jsr tpause
|
|
|
|
* Unpack title onto page 1
|
|
|
|
lda #delTitle
|
|
jsr DeltaExpPop
|
|
|
|
ldx #140
|
|
lda #s_Title
|
|
jsr PlaySongI
|
|
|
|
* Credit line disappears
|
|
|
|
jmp CleanScreen
|
|
|
|
*-------------------------------
|
|
*
|
|
* Prologue, part 1
|
|
*
|
|
*-------------------------------
|
|
Prolog1
|
|
lda #pacProlog
|
|
sta RAMRDaux
|
|
jsr DblExpand
|
|
|
|
ldx #250
|
|
lda #s_Prolog
|
|
jmp PlaySongI
|
|
|
|
*-------------------------------
|
|
*
|
|
* Princess's room: Vizier starts hourglass
|
|
*
|
|
*-------------------------------
|
|
PrincessScene
|
|
jsr blackout
|
|
|
|
jsr ReloadStuff ;wiped out by dhires titles
|
|
|
|
lda #0 ;don't seek track 0
|
|
jsr cutprincess1
|
|
|
|
lda #0 ;cut #0 (intro)
|
|
jmp xplaycut ;aux l.c. via grafix
|
|
|
|
*-------------------------------
|
|
*
|
|
* Prologue, part 2
|
|
*
|
|
*-------------------------------
|
|
Prolog2
|
|
lda #pacSumup
|
|
sta RAMRDmain
|
|
jsr DblExpand
|
|
|
|
jsr setdhires
|
|
|
|
ldx #250
|
|
lda #s_Sumup
|
|
jmp PlaySongI
|
|
|
|
*-------------------------------
|
|
*
|
|
* Epilog
|
|
*
|
|
*-------------------------------
|
|
Epilog
|
|
lda IIGS
|
|
bne SuperEpilog ;super hi-res ending if IIGS
|
|
|
|
lda #pacEpilog
|
|
sta RAMRDaux
|
|
jsr DblExpand
|
|
|
|
jsr setdhires
|
|
|
|
lda #s_Epilog
|
|
jsr PlaySongNI
|
|
lda #15
|
|
jsr pauseNI
|
|
jsr unpacksplash
|
|
lda #75
|
|
jsr pauseNI
|
|
|
|
lda #s_Curtain
|
|
jsr PlaySongNI
|
|
lda #60
|
|
jsr pauseNI
|
|
|
|
jmp blackout
|
|
|
|
unpacksplash
|
|
lda #pacSplash
|
|
sta RAMRDaux
|
|
jmp DblExpand
|
|
|
|
*-------------------------------
|
|
*
|
|
* Super hi-res epilog (IIGS only)
|
|
*
|
|
*-------------------------------
|
|
SuperEpilog
|
|
lda #1 ;aux
|
|
jsr fadein ;fade in epilog screen
|
|
jsr setaux
|
|
|
|
lda #s_Epilog
|
|
jsr PlaySongNI
|
|
|
|
jsr fadeout
|
|
lda #0 ;main
|
|
jsr fadein ;fade to palace screen
|
|
jsr setaux
|
|
|
|
lda #80
|
|
jsr pauseNI
|
|
|
|
lda #s_Curtain
|
|
jsr PlaySongNI
|
|
|
|
lda #255
|
|
jsr pauseNI
|
|
|
|
jsr fadeout ;...and fade to black
|
|
|
|
jmp * ;and hang (because it's too much
|
|
;trouble to restart)
|
|
|
|
*-------------------------------
|
|
*
|
|
* Demo sequence
|
|
*
|
|
*-------------------------------
|
|
Demo
|
|
jsr blackout
|
|
|
|
jsr LoadStage3
|
|
|
|
jsr setdemolevel
|
|
jsr rdbluep
|
|
|
|
jsr driveoff
|
|
|
|
* Go to TOPCTRL
|
|
|
|
lda #0
|
|
jmp start
|
|
|
|
*-------------------------------
|
|
* non-interruptible pause
|
|
|
|
pauseNI
|
|
:loop sta pausetemp
|
|
ldy #20
|
|
:loop1 ldx #0
|
|
:loop2 dex
|
|
bne :loop2
|
|
dey
|
|
bne :loop1
|
|
|
|
lda pausetemp
|
|
sec
|
|
sbc #1
|
|
bne :loop
|
|
]rts rts
|
|
|
|
*-------------------------------
|
|
*
|
|
* Start game? (if key or button pressed)
|
|
*
|
|
*-------------------------------
|
|
StartGame?
|
|
jsr musickeys
|
|
cmp #$80 ;key or button press?
|
|
bcc ]rts ;no
|
|
|
|
do FinalDisk
|
|
else
|
|
cmp #kdemo ;temp!
|
|
bne :1
|
|
jmp Demo
|
|
:1 cmp #kprincess ;temp!
|
|
bne :2
|
|
jmp ]princess
|
|
fin
|
|
|
|
:2 cmp #krestart
|
|
bne :3
|
|
jmp AttractLoop
|
|
:3 ;fall thru to DOSTARTGAME
|
|
*-------------------------------
|
|
*
|
|
* Start a game
|
|
*
|
|
*-------------------------------
|
|
DOSTARTGAME
|
|
jsr blackout
|
|
|
|
* Turn on drive & load Stage 3 routines
|
|
|
|
:1 jsr LoadStage3
|
|
|
|
* Load 1st level
|
|
|
|
jsr set1stlevel
|
|
|
|
jsr rdbluep
|
|
|
|
* Turn off drive & set aux
|
|
|
|
jsr driveoff
|
|
|
|
* Go to TOPCTRL
|
|
|
|
lda #1
|
|
sta musicon
|
|
|
|
do DemoDisk
|
|
else
|
|
|
|
lda keypress
|
|
cmp #kresume
|
|
bne :newgame
|
|
|
|
* Resume old game
|
|
|
|
lda #4 ;arbitrary
|
|
jmp startresume
|
|
|
|
fin
|
|
|
|
* Start new game
|
|
|
|
:newgame
|
|
lda #1
|
|
jmp start
|
|
|
|
*-------------------------------
|
|
*
|
|
* Load permanent code & data
|
|
* (only once)
|
|
*
|
|
*-------------------------------
|
|
loadperm
|
|
lda #3
|
|
sta track
|
|
|
|
jsr setaux
|
|
|
|
jsr rw18
|
|
db RdSeq.Inc,$0e
|
|
|
|
jsr rw18
|
|
db RdGrp.Inc
|
|
hex 04,05,06,07,08,09,0a,0b,0c
|
|
hex 0d,20,21,22,23,24,25,26,27
|
|
|
|
jsr setmain
|
|
lda #9
|
|
sta track
|
|
jsr rw18
|
|
db RdSeq.Inc,$84
|
|
jsr rw18
|
|
db RdSeq.Inc,$96
|
|
|
|
jsr rw18
|
|
db RdSeq.Inc,$08
|
|
|
|
jsr rw18
|
|
db RdGrp.Inc
|
|
hex 1a,1b,1c,1d,1e,1f,a8,a9,aa
|
|
hex ab,ac,ad,ae,af,b0,b1,b2,b3
|
|
|
|
jsr rw18
|
|
db RdGrp.Inc
|
|
hex b4,b5,b6,b7,b8,b9,ba,bb,bc
|
|
hex bd,be,bf,00,00,00,00,00,00
|
|
|
|
*-------------------------------
|
|
*
|
|
* Load aux l.c. stuff (tracks 19-21 & 34)
|
|
* (includes music set 1)
|
|
*
|
|
* Load into main hires area & move to aux l.c.
|
|
*
|
|
*-------------------------------
|
|
lda #19
|
|
sta track
|
|
|
|
jsr rw18
|
|
db RdGrp.Inc
|
|
hex 00,00,20,21,22,23,24,25,26
|
|
hex 27,28,29,2a,2b,2c,2d,2e,2f
|
|
|
|
jsr rw18
|
|
db RdGrp.Inc
|
|
hex 00,00,00,00,30,31,32,33,34
|
|
hex 35,36,37,38,39,3a,3b,3c,3d
|
|
jsr rw18
|
|
db RdSeq.Inc,$3e
|
|
|
|
lda #34
|
|
sta track
|
|
jsr rw18
|
|
db RdGrp.Inc
|
|
hex 00,00,50,51,52,53,54,55,56
|
|
hex 57,58,59,5a,5b,5c,5d,5e,5f
|
|
|
|
jsr setaux
|
|
lda #1
|
|
sta MSset
|
|
|
|
jsr setmain
|
|
jmp Tmoveauxlc
|
|
|
|
*-------------------------------
|
|
*
|
|
* Stage 1: static dbl hires screens -- no animation
|
|
* Stage 2: character animation only (bg is unpacked)
|
|
* Stage 3: full game animation
|
|
*
|
|
*-------------------------------
|
|
*
|
|
* Load Stage 1 data (sida A)
|
|
*
|
|
*-------------------------------
|
|
]lsub sta track
|
|
:test jsr rw18
|
|
db RdSeqErr.Inc,$40
|
|
bcc :ok
|
|
jsr error
|
|
jmp :test
|
|
:ok
|
|
jsr rw18
|
|
db RdSeq.Inc,$52
|
|
jsr rw18
|
|
db RdSeq.Inc,$64
|
|
jsr rw18
|
|
db RdSeq.Inc,$76
|
|
jsr rw18
|
|
db RdSeq.Inc,$88
|
|
rts
|
|
|
|
LoadStage1A
|
|
jsr driveon
|
|
|
|
lda #22
|
|
jsr ]lsub
|
|
|
|
jsr setmain
|
|
jsr rw18
|
|
db RdSeq.Inc,$60
|
|
jsr rw18
|
|
db RdSeq.Inc,$72
|
|
|
|
jsr loadmusic1
|
|
|
|
jsr setaux
|
|
lda #$ff
|
|
sta BGset1
|
|
sta BGset2
|
|
sta CHset
|
|
|
|
jmp driveoff
|
|
|
|
*-------------------------------
|
|
*
|
|
* Load stage 1 (side B)
|
|
*
|
|
*-------------------------------
|
|
LoadStage1B
|
|
jsr driveon
|
|
|
|
jsr loadmusic3 ;epilog
|
|
|
|
lda IIGS
|
|
bne :shires ;Super hi-res ending only if IIGS
|
|
|
|
lda #18
|
|
jsr ]lsub
|
|
jmp driveoff
|
|
|
|
:shires jsr loadsuper ;in unpack
|
|
jmp driveoff
|
|
|
|
*-------------------------------
|
|
*
|
|
* Reload 2000-6000 auxmem
|
|
* (wiped out by dhires titles)
|
|
*
|
|
*-------------------------------
|
|
ReloadStuff
|
|
jsr driveon
|
|
|
|
:test lda #4
|
|
sta track
|
|
jsr rw18
|
|
db RdGrpErr
|
|
hex 00,00,00,00,00,00,00,00,00
|
|
hex 00,20,21,22,23,24,25,26,27
|
|
bcc :ok
|
|
jsr error
|
|
jmp :test
|
|
:ok
|
|
lda #15
|
|
sta track
|
|
jsr rw18
|
|
db RdSeq.Inc,$28
|
|
jsr rw18
|
|
db RdSeq.Inc,$3a
|
|
jsr rw18
|
|
db RdSeq.Inc,$4c
|
|
|
|
jmp driveoff
|
|
|
|
*-------------------------------
|
|
*
|
|
* Load stage 2 data (6000-a800)
|
|
*
|
|
*-------------------------------
|
|
LoadStage2
|
|
ldx BBundID
|
|
cpx #POPside2
|
|
beq LoadStage2B
|
|
|
|
LoadStage2A
|
|
jsr driveon
|
|
|
|
lda #0
|
|
jsr loadch7 ;side A only
|
|
|
|
lda #29
|
|
]ls2 sta track
|
|
|
|
:test jsr rw18
|
|
db RdSeqErr.Inc,$60
|
|
bcc :ok
|
|
jsr error
|
|
jmp :test
|
|
:ok
|
|
jsr rw18
|
|
db RdSeq.Inc,$72
|
|
jsr rw18
|
|
db RdSeq.Inc,$84
|
|
jsr rw18
|
|
db RdGrp.Inc
|
|
hex 96,97,98,99,9a,9b,9c,9d,9e
|
|
hex 00,00,00,00,00,00,00,00,00
|
|
|
|
lda #$ff
|
|
sta BGset1
|
|
sta BGset2
|
|
sta CHset
|
|
|
|
jmp driveoff
|
|
|
|
* Load chtable7 (side A only)
|
|
|
|
loadch7
|
|
sta recheck0
|
|
:test lda #28
|
|
sta track
|
|
jsr rw18
|
|
db RdGrpErr.Inc
|
|
hex 00,00,00,00,00,00,00,00,00
|
|
hex 00,00,00,00,9f,a0,a1,a2,a3
|
|
bcc :ok
|
|
jsr error
|
|
jmp :test
|
|
:ok
|
|
]rts rts
|
|
|
|
*-------------------------------
|
|
*
|
|
* Load stage 2 routines (side B)
|
|
*
|
|
*-------------------------------
|
|
LoadStage2B
|
|
jsr driveon
|
|
|
|
lda #24
|
|
bne ]ls2
|
|
|
|
*-------------------------------
|
|
*
|
|
* Load stage 3
|
|
* Full version (from stage 1)
|
|
*
|
|
* Reload 2000-AC00 auxmem, 6000-7200 mainmem
|
|
*
|
|
*-------------------------------
|
|
LoadStage3
|
|
jsr driveon
|
|
|
|
lda #4
|
|
sta track
|
|
|
|
:loop jsr rw18
|
|
db RdGrpErr.Inc
|
|
hex 00,00,00,00,00,00,00,00,00
|
|
hex 00,20,21,22,23,24,25,26,27
|
|
bcc :ok
|
|
jsr error
|
|
jmp :loop
|
|
:ok
|
|
jsr rw18
|
|
db RdSeq.Inc,$60
|
|
jsr rw18
|
|
db RdSeq.Inc,$72 ;bgtable1
|
|
|
|
jsr setmain
|
|
jsr rw18
|
|
db RdSeq.Inc,$60
|
|
jsr rw18
|
|
db RdSeq.Inc,$72
|
|
|
|
jsr setaux
|
|
|
|
lda #13
|
|
sta track
|
|
jsr rw18
|
|
db RdGrp.Inc
|
|
hex 00,00,00,00,00,00,00,00,00
|
|
hex 00,00,00,96,97,98,99,9a,9b
|
|
jsr rw18
|
|
db RdSeq.Inc,$9c ;chtable4
|
|
jsr rw18
|
|
db RdSeq.Inc,$28
|
|
jsr rw18
|
|
db RdSeq.Inc,$3a
|
|
jsr rw18
|
|
db RdSeq.Inc,$4c
|
|
jsr rw18
|
|
db RdSeq.Inc,$84 ;bgtable2
|
|
|
|
lda #0
|
|
sta BGset1
|
|
sta BGset2
|
|
sta CHset
|
|
|
|
jsr loadmusic2
|
|
|
|
jmp setaux
|
|
|
|
*-------------------------------
|
|
*
|
|
* Play song--interruptible & non-interruptible
|
|
*
|
|
* (Enter & exit w/ bank 2 switched in)
|
|
*
|
|
* In: A = song #
|
|
* X = length to pause if sound is turned off
|
|
*
|
|
*-------------------------------
|
|
PlaySongNI ;non-interruptible
|
|
;(& ignores sound/music toggles)
|
|
jsr setaux
|
|
jsr xminit
|
|
:loop jsr xmplay
|
|
cmp #0
|
|
bne :loop
|
|
]rts rts
|
|
|
|
*-------------------------------
|
|
PlaySongI ;interruptible
|
|
jsr setaux
|
|
beq ]rts
|
|
|
|
tay
|
|
lda musicon
|
|
and soundon
|
|
beq :pause
|
|
|
|
tya
|
|
jsr xminit
|
|
:loop jsr StartGame?
|
|
jsr xmplay
|
|
cmp #0
|
|
bne :loop
|
|
]rts rts
|
|
|
|
:pause txa ;falls thru to tpause
|
|
*-------------------------------
|
|
*
|
|
* In: A = delay (max = 255)
|
|
*
|
|
*-------------------------------
|
|
tpause
|
|
:loop sta pausetemp
|
|
|
|
ldy #2
|
|
:loop1 ldx #0
|
|
:loop2 jsr StartGame?
|
|
dex
|
|
bne :loop2
|
|
dey
|
|
bne :loop1
|
|
|
|
lda pausetemp
|
|
sec
|
|
sbc #1
|
|
bne :loop
|
|
]rts rts
|
|
|
|
*-------------------------------
|
|
*
|
|
* Disk error
|
|
*
|
|
* Prompt user for correct disk side & wait for keypress
|
|
*
|
|
*-------------------------------
|
|
error
|
|
jsr driveoff
|
|
|
|
jsr prompt
|
|
|
|
jmp driveon
|
|
|
|
*-------------------------------
|
|
lst
|
|
eof ds 1
|
|
usr $a9,1,$a80,*-org
|
|
lst off
|