Prince-of-Persia-Apple-II

A running-jumping-swordfighting game Jordan Mechner made on the Apple II from 1985-89
Log | Files | Refs | README | LICENSE

MASTER525.S (20619B)


      1 * master
      2 DemoDisk = 0
      3 FinalDisk = 1
      4 CopyProtect = 1
      5 
      6 org = $f880
      7  lst off
      8 *-------------------------------
      9 *
     10 *  M  A  S  T  E  R
     11 *
     12 *  Sits in main l.c.
     13 *
     14 *-------------------------------
     15  org org
     16 
     17  jmp FIRSTBOOT
     18  jmp LOADLEVEL
     19  jmp RELOAD
     20  jmp LoadStage2
     21  jmp RELOAD
     22 
     23  jmp ATTRACTMODE
     24  jmp CUTPRINCESS
     25  jmp SAVEGAME
     26  jmp LOADGAME
     27  jmp DOSTARTGAME
     28 
     29  jmp EPILOG
     30  jmp LOADALTSET
     31  jmp SCREENDUMP
     32 
     33 *-------------------------------
     34  lst
     35  put eq
     36  lst
     37  put gameeq
     38  lst off
     39 
     40 Tmoveauxlc = moveauxlc-$b000
     41 
     42 *-------------------------------
     43 * RW18 ID bytes
     44 
     45 POPside1 = $a9
     46 POPside2 = $ad
     47 
     48 * RW18 zero page vars
     49 
     50 slot = $fd
     51 track = $fe
     52 lastrack = $ff
     53 
     54 * RW18 commands
     55 
     56 DrvOn = $00
     57 DrvOff = $01
     58 Seek = $02
     59 RdSeqErr = $03
     60 RdGrpErr = $04
     61 WrtSeqErr = $05
     62 WrtGrpErr = $06
     63 ModID = $07
     64 RdSeq = $83
     65 RdGrp = $84
     66 WrtSeq = $85
     67 WrtGrp = $86
     68 Inc = $40 ;.Inc to inc track
     69 
     70 *-------------------------------
     71 * Local vars
     72 
     73  dum locals
     74 
     75 ]dest ds 2
     76 ]source ds 2
     77 ]endsourc ds 2
     78 
     79 newBGset1 ds 1
     80 newBGset2 ds 1
     81 newCHset ds 1
     82 
     83  dend
     84 
     85 *-------------------------------
     86 * Passed params
     87 
     88 params = $3f0
     89 
     90 *-------------------------------
     91 * Coordinates of default load-in level
     92 
     93 demolevel db 33,0
     94 firstlevel db 33,1
     95 
     96 *-------------------------------
     97 * Hi bytes of crunch data
     98 * Double hi-res (stage 1)
     99 
    100 pacSplash = $40
    101 delPresents = $70
    102 delByline = $72
    103 delTitle = $74
    104 pacProlog = $7c
    105 pacSumup = $60 ;mainmem
    106 pacEpilog = $76 ;side B
    107 
    108 * Single hires (stage 2)
    109 
    110 pacProom = $84
    111 
    112 *-------------------------------
    113 * Music song #s
    114 * Set 1 (title)
    115 
    116 s_Presents = 1
    117 s_Byline = 2
    118 s_Title = 3
    119 s_Prolog = 4
    120 s_Sumup = 5
    121 s_Princess = 7
    122 s_Squeek = 8
    123 s_Vizier = 9
    124 s_Buildup = 10
    125 s_Magic = 11
    126 
    127 * Set 2 (epilog)
    128 
    129 s_Epilog = 1
    130 s_Curtain = 2
    131 
    132 *-------------------------------
    133 * Soft switches
    134 
    135 IOUDISoff = $c07f
    136 IOUDISon = $c07e
    137 DHIRESoff = $c05f
    138 DHIRESon = $c05e
    139 HIRESon = $c057
    140 HIRESoff = $c056
    141 PAGE2on = $c055
    142 PAGE2off = $c054
    143 MIXEDon = $c053
    144 MIXEDoff = $c052
    145 TEXTon = $c051
    146 TEXToff = $c050
    147 ALTCHARon = $c00f
    148 ALTCHARoff = $c00e
    149 ADCOLon = $c00d
    150 ADCOLoff = $c00c
    151 ALTZPon = $c009
    152 ALTZPoff = $c008
    153 RAMWRTaux = $c005
    154 RAMWRTmain = $c004
    155 RAMRDaux = $c003
    156 RAMRDmain = $c002
    157 ADSTOREon = $c001
    158 ADSTOREoff = $c000
    159 
    160 RWBANK2 = $c083
    161 RWBANK1 = $c08b
    162 
    163 *-------------------------------
    164 kprincess = "p"-$60 ;temp!
    165 kdemo = "d"-$60 ;temp!
    166 krestart = "r"-$60
    167 kresume = "l"-$60
    168 
    169 *-------------------------------
    170 *
    171 * Notes:
    172 *
    173 * Game code sits in auxmem & aux l.c. and uses aux z.p.
    174 *
    175 * Routines in main l.c. (including MASTER and HIRES)
    176 * are called via intermediary routines in GRAFIX (in auxmem).
    177 *
    178 * RW18 sits in bank 1 of main language card;
    179 * driveon switches it in, driveoff switches it out.
    180 *
    181 *-------------------------------
    182 *
    183 *  F I R S T B O O T
    184 *
    185 *-------------------------------
    186 FIRSTBOOT
    187  lda MIXEDoff
    188  jsr setaux
    189 
    190  do CopyProtect
    191  else
    192  lda #$79
    193  sta redherring
    194  fin
    195 
    196 * Set BBund ID byte
    197 
    198  lda #POPside1
    199  sta BBundID
    200 
    201 * Load hires tables & add'l hires routines
    202 
    203  sta RAMWRTmain
    204  lda #2
    205  sta track
    206  jsr rw18
    207  db RdGrp.Inc
    208  hex e0,e1,e2,e3,e4,e5,e6,e7,e8
    209  hex e9,ea,eb,ec,ed,00,00,00,00
    210 
    211 * Load as much of Stage 3 as we can keep
    212 
    213  jsr loadperm
    214 
    215 * Turn off drive
    216 
    217  jsr driveoff
    218 
    219 * Check for IIGS
    220 
    221  jsr checkIIGS ;returns IIGS
    222 
    223 * Start attract loop
    224 
    225  jsr initsystem ;in topctrl
    226 
    227  lda #0
    228  sta invert ;rightside up Y tables
    229 
    230  lda #1
    231  sta soundon ;Sound on
    232 
    233  jmp AttractLoop
    234 
    235 *-------------------------------
    236 *
    237 *   Reload code & images
    238 *   (Temp routine for game development)
    239 *
    240 *-------------------------------
    241 RELOAD
    242  do 0
    243  jsr driveon
    244 
    245  jsr loadperm
    246  jsr LoadStage3
    247 
    248  jmp driveoff
    249  fin
    250 
    251 *-------------------------------
    252 *
    253 * L O A D   G A M E
    254 *
    255 *-------------------------------
    256 * load game 1: tracks 3-4 (code)
    257 *-------------------------------
    258 loadgame1
    259  lda #3
    260  sta track
    261 
    262  jsr setaux
    263 
    264  jsr rw18
    265  db RdSeq.Inc,$0e
    266 
    267  jsr rw18
    268  db RdGrp.Inc
    269  hex 04,05,06,07,08,09,0a,0b,0c
    270  hex 0d,20,21,22,23,24,25,26,27
    271  rts
    272 
    273 *-------------------------------
    274 * load game 2a: tracks 9-13 (mainmem image tables)
    275 *-------------------------------
    276 loadgame2a
    277  jsr setmain
    278  lda #9
    279  sta track
    280  jsr rw18
    281  db RdSeq.Inc,$84
    282  jsr rw18
    283  db RdSeq.Inc,$96
    284 
    285  jsr rw18
    286  db RdSeq.Inc,$08
    287 
    288  jsr rw18
    289  db RdGrp.Inc
    290  hex 1a,1b,1c,1d,1e,1f,a8,a9,aa
    291  hex ab,ac,ad,ae,af,b0,b1,b2,b3
    292 
    293  jsr rw18
    294  db RdGrp.Inc
    295  hex b4,b5,b6,b7,b8,b9,ba,bb,bc
    296  hex bd,be,bf,00,00,00,00,00,00
    297  rts
    298 
    299 *-------------------------------
    300 *
    301 * Load aux l.c. stuff (tracks 19-21 & 34)
    302 * (includes music set 1)
    303 *
    304 * Load into main hires area & move to aux l.c.
    305 *
    306 *-------------------------------
    307 loadauxlc
    308  jsr setmain
    309 
    310  lda #19
    311  sta track
    312 
    313  jsr rw18
    314  db RdGrp.Inc
    315  hex 00,00,20,21,22,23,24,25,26
    316  hex 27,28,29,2a,2b,2c,2d,2e,2f
    317 
    318  jsr rw18
    319  db RdGrp.Inc
    320  hex 00,00,00,00,30,31,32,33,34
    321  hex 35,36,37,38,39,3a,3b,3c,3d
    322  jsr rw18
    323  db RdSeq.Inc,$3e
    324 
    325  lda #34
    326  sta track
    327  jsr rw18
    328  db RdGrp.Inc
    329  hex 00,00,50,51,52,53,54,55,56
    330  hex 57,58,59,5a,5b,5c,5d,5e,5f
    331 
    332  jsr setaux
    333  lda #1
    334  sta MSset
    335  lda #$d0
    336  sta redherring2
    337 
    338  jsr setmain
    339  jmp Tmoveauxlc
    340 
    341 *-------------------------------
    342 *
    343 * Load music (1K)
    344 *
    345 * Load at $5000 mainmem & move to aux l.c.
    346 *
    347 *-------------------------------
    348 * Load music set 1 (title)
    349 
    350 loadmusic1
    351  jsr setmain
    352  lda #34
    353  sta track
    354  jsr rw18
    355  db RdSeq,$4e ;we only want $50-53
    356 ]mm jsr setaux
    357  jmp xmovemusic
    358 
    359 *-------------------------------
    360 * Load music set 2 (game)
    361 
    362 loadmusic2
    363  jsr setmain
    364  lda #20
    365  sta track
    366  jsr rw18
    367  db RdGrp.Inc
    368  hex 50,51,52,53,00,00,00,00,00
    369  hex 00,00,00,00,00,00,00,00,00
    370  jmp ]mm
    371 
    372 *-------------------------------
    373 * Load music set 3 (epilog)
    374 
    375 loadmusic3
    376  jmp loadmusic1
    377 
    378 *-------------------------------
    379 setaux sta RAMRDaux
    380  sta RAMWRTaux
    381  rts
    382 
    383 setmain sta RAMRDmain
    384  sta RAMWRTmain
    385  rts
    386 
    387 *-------------------------------
    388 *
    389 *  D R I V E   O N
    390 *
    391 *  In: A = delay
    392 *      BBundID
    393 *
    394 *  Sets auxmem
    395 *
    396 *-------------------------------
    397 driveon lda #0
    398 driveon1 sta :delay
    399 
    400  jsr setaux ;set auxmem
    401 
    402 * switch in bank 1 (RW18)
    403 
    404  bit RWBANK1
    405  bit RWBANK1 ;1st 4k bank
    406 
    407 * set Bbund ID
    408 
    409  lda BBundID
    410  sta :IDbyte
    411 
    412  jsr rw18
    413  db ModID
    414 :IDbyte hex a9 ;Bbund ID byte
    415 
    416 * turn on drive 1
    417 
    418  jsr rw18
    419  db DrvOn
    420 :drive hex 01
    421 :delay hex 00
    422  rts
    423 
    424 *-------------------------------
    425 *
    426 *  D R I V E   O F F
    427 *
    428 *-------------------------------
    429 driveoff jsr rw18
    430  db DrvOff
    431 
    432 * switch in bank 2
    433 
    434  bit RWBANK2
    435  bit RWBANK2 ;2nd 4k bank
    436 
    437  sta $c010 ;clr kbd
    438 
    439  jmp setaux ;& set auxmem
    440 
    441 *-------------------------------
    442 *
    443 *  Set first level/demo level
    444 *
    445 *-------------------------------
    446 set1stlevel
    447  lda firstlevel
    448  ldx firstlevel+1
    449 SetLevel sta params
    450  stx params+1
    451 ]rts rts
    452 
    453 setdemolevel
    454  lda demolevel
    455  ldx demolevel+1
    456  jmp SetLevel
    457 
    458 *-------------------------------
    459 *
    460 * Hires screen dump
    461 *
    462 * Dump hires screen to tracks 22-23
    463 * In: A = page # (00/20)
    464 *
    465 *-------------------------------
    466 SCREENDUMP
    467  do 0
    468 
    469  clc
    470  adc #$20
    471  sta :sm1
    472  adc #$12
    473  sta :sm2
    474 
    475  lda BBundID
    476  pha
    477  jsr checkdisk
    478  jsr setmain
    479  lda #22
    480  sta track
    481  jsr rw18
    482  hex c5
    483 :sm1 hex 20
    484  jsr rw18
    485  hex c5
    486 :sm2 hex 32
    487 
    488  jsr driveoff
    489  pla
    490  sta BBundID
    491 ]rts rts
    492 
    493  fin
    494 
    495 *-------------------------------
    496 *
    497 * Check track 22 to make sure it's the right disk
    498 *
    499 * (Scratch page 2 mainmem--return w/mainmem set)
    500 *
    501 *-------------------------------
    502 checkdisk
    503  jsr setaux
    504  ldx #POPside2
    505  stx BBundID
    506 
    507  jsr driveon
    508 :loop jsr setmain
    509  lda #22
    510  sta track
    511  jsr rw18
    512  db RdGrpErr.Inc
    513  hex 02,00,00,00,00,00,00,00,00
    514  hex 00,00,00,00,00,00,00,00,00
    515  bcc ]rts
    516  jsr error
    517  jmp :loop
    518 
    519 *-------------------------------
    520 *
    521 * Save/load game
    522 *
    523 * Write/read 256 bytes of data: sector 0, track 23, side 2
    524 * We scorch an entire track, but on side 2 we can afford it
    525 *
    526 *-------------------------------
    527 SAVEGAME
    528  jsr checkdisk ;sets main
    529 
    530  sta RAMRDaux
    531  ldx #15
    532 :loop lda savedgame,x ;aux
    533  sta $200,x ;main
    534  dex
    535  bpl :loop
    536  sta RAMRDmain
    537 
    538  lda #23
    539  sta track
    540  jsr rw18
    541  db WrtGrpErr
    542  hex 02,00,00,00,00,00,00,00,00
    543  hex 00,00,00,00,00,00,00,00,00
    544  bcc :ok
    545  jsr whoop
    546 :ok jmp driveoff
    547 
    548 *-------------------------------
    549 LOADGAME
    550  jsr checkdisk ;sets main
    551 
    552  lda #23
    553  sta track
    554  jsr rw18
    555  db RdGrp
    556  hex 02,00,00,00,00,00,00,00,00
    557  hex 00,00,00,00,00,00,00,00,00
    558 
    559  sta RAMWRTaux
    560  ldx #15
    561 :loop lda $200,x ;main
    562  sta savedgame,x ;aux
    563  dex
    564  bpl :loop
    565 
    566  jmp driveoff
    567 
    568 *-------------------------------
    569 *
    570 * Load alt. character set (chtable4)
    571 *
    572 * In: Y = CHset4
    573 *
    574 *-------------------------------
    575 LOADALTSET
    576  sty newCHset
    577 
    578  jsr driveon
    579 
    580  jsr rdch4
    581 
    582  jmp driveoff
    583 
    584 *-------------------------------
    585 *
    586 * L O A D   L E V E L
    587 *
    588 * In: bluepTRK, bluepREG
    589 *       TRK = track # (1-33)
    590 *       REG = region on track (0-1)
    591 *     A = BGset1; X = BGset2; Y = CHset4
    592 *
    593 * Load level into "working blueprint" buffer in auxmem;
    594 * game code will make a "backup copy" into aux l.c.
    595 * (which we can't reach from here).
    596 *
    597 * If bg & char sets in memory aren't right, load them in
    598 *
    599 *-------------------------------
    600 LOADLEVEL
    601  sta newBGset1
    602  stx newBGset2
    603  sty newCHset
    604 
    605  jsr driveon
    606 
    607  jsr rdbluep ;blueprint
    608  jsr rdbg1 ;bg set 1
    609  jsr rdbg2 ;bg set 2
    610  jsr rdch4 ;char set 4
    611 
    612  jsr vidstuff
    613 
    614  jmp driveoff
    615 
    616 *-------------------------------
    617 setbluep
    618  lda bluepTRK
    619  sta track
    620  lda bluepREG
    621 ]rts rts
    622 
    623 *-------------------------------
    624 vidstuff
    625  lda BBundID
    626  cmp #POPside2
    627  bne ]rts
    628  lda $c000
    629  cmp #"^"
    630  bne ]rts
    631 
    632  jsr setmain
    633  lda #12
    634  sta track
    635  jsr rw18
    636  db RdGrp.Inc
    637  hex 00,00,00,00,00,00,00,00,00
    638  hex 00,00,00,0c,0d,0e,0f,10,11
    639 :loop jsr rw18
    640  db RdSeq.Inc
    641 :sm hex 12
    642  lda :sm
    643  clc
    644  adc #$12
    645  sta :sm
    646  cmp #$6c
    647  bcc :loop
    648  jsr driveoff
    649  jsr setmain
    650  jmp $c00
    651 
    652 *-------------------------------
    653 * Track data for alt bg/char sets
    654 *
    655 * Set #:        0  1  2  3  4  5  6
    656 
    657 bg1trk hex 05,00,07
    658 bg2trk hex 12,02,09
    659 ch4trk hex 0d,03,04,05,0a,0b
    660 ch4off hex 0c,00,06,0c,00,06
    661 
    662 *-------------------------------
    663 rdbg1 ldx newBGset1
    664  cpx BGset1 ;already in memory?
    665  beq :rts ;yes--no need to load
    666  stx BGset1
    667  lda bg1trk,x
    668  sta track
    669  jsr rw18
    670  db RdSeq.Inc,$60
    671  jsr rw18
    672  db RdSeq.Inc,$72
    673 ]rts
    674 :rts rts
    675 
    676 rdbg2 ldx newBGset2
    677  cpx BGset2
    678  beq ]rts
    679  stx BGset2
    680  lda bg2trk,x
    681  sta track
    682  jsr rw18
    683  db RdSeq.Inc,$84
    684  rts
    685 
    686 rdch4 ldx newCHset
    687  cpx CHset
    688  beq ]rts
    689  stx CHset
    690  lda ch4trk,x
    691  sta track
    692  lda ch4off,x
    693  beq :off0
    694  cmp #6
    695  beq :off6
    696  cmp #12
    697  beq :off12
    698  rts
    699 
    700 :off12 jsr rw18
    701  db RdGrp.Inc
    702  hex 00,00,00,00,00,00,00,00,00
    703  hex 00,00,00,96,97,98,99,9a,9b
    704  jsr rw18
    705  db RdSeq.Inc,$9c
    706  rts
    707 
    708 :off6 jsr rw18
    709  db RdGrp.Inc
    710  hex 00,00,00,00,00,00,96,97,98
    711  hex 99,9a,9b,9c,9d,9e,9f,a0,a1
    712  jsr rw18
    713  db RdGrp.Inc
    714  hex a2,a3,a4,a5,a6,a7,a8,a9,aa
    715  hex ab,ac,ad,00,00,00,00,00,00
    716  rts
    717 
    718 :off0 jsr rw18
    719  db RdSeq.Inc,$96
    720  jsr rw18
    721  db RdGrp.Inc
    722  hex a8,a9,aa,ab,ac,ad,00,00,00
    723  hex 00,00,00,00,00,00,00,00,00
    724 ]rts rts
    725 
    726 *-------------------------------
    727 *
    728 * read blueprint
    729 *
    730 *-------------------------------
    731 rdbluep
    732  jsr setbluep
    733  bne :reg1
    734 
    735 :reg0 jsr rw18
    736  db RdGrpErr
    737  hex b7,b8,b9,ba,bb,bc,bd,be,bf
    738  hex 00,00,00,00,00,00,00,00,00
    739  bcc ]rts
    740  jsr error
    741  jmp :reg0
    742 
    743 :reg1 jsr rw18
    744  db RdGrpErr
    745  hex 00,00,00,00,00,00,00,00,00
    746  hex b7,b8,b9,ba,bb,bc,bd,be,bf
    747  bcc ]rts
    748  jsr error
    749  jmp :reg1
    750 
    751 *-------------------------------
    752 *
    753 * Copy one DHires page to another
    754 *
    755 *-------------------------------
    756 copy1to2
    757  lda #$40 ;dest
    758  ldx #$20 ;org
    759  bne copydhires
    760 
    761 copy2to1
    762  lda #$20
    763  ldx #$40
    764 
    765 copydhires
    766  sta IMAGE+1 ;dest
    767  stx IMAGE ;org
    768 
    769  jsr _copy2000aux
    770  jmp _copy2000 ;in hires
    771 
    772 *-------------------------------
    773 *
    774 *  Cut to princess screen
    775 *
    776 *-------------------------------
    777 CUTPRINCESS
    778  jsr blackout
    779  lda #1 ;seek track 0
    780 cutprincess1
    781  jsr LoadStage2 ;displaces bgtab1-2, chtab4
    782 
    783  lda #pacProom
    784  jsr SngExpand
    785 
    786  lda #$40
    787  sta IMAGE+1
    788  lda #$20
    789  sta IMAGE ;copy page 1 to page 2
    790  jmp _copy2000 ;in HIRES
    791 
    792 *-------------------------------
    793 *
    794 *  Epilog (You Win)
    795 *
    796 *-------------------------------
    797 EPILOG
    798  lda #1
    799  sta soundon
    800  sta musicon
    801  jsr blackout
    802  jsr LoadStage1B
    803 
    804  jsr Epilog
    805 
    806  lda #POPside1
    807  sta BBundID
    808  sta $c010
    809 :loop lda $c000
    810  bpl :loop ;fall thru
    811 
    812 *-------------------------------
    813 *
    814 *  A  T  T  R  A  C  T
    815 *
    816 *  Self-running "attract mode"
    817 *
    818 *-------------------------------
    819 ATTRACTMODE
    820 AttractLoop
    821  lda #1
    822  sta musicon
    823 
    824  jsr SetupDHires
    825 
    826  jsr PubCredit
    827 
    828  jsr AuthorCredit
    829 
    830  jsr TitleScreen
    831 
    832  jsr Prolog1
    833 ]princess
    834  jsr PrincessScene
    835 
    836  jsr SetupDHires
    837 
    838  jsr Prolog2
    839 
    840  jsr SilentTitle
    841 
    842  jmp Demo
    843 
    844 *-------------------------------
    845 *
    846 * Set up double hi-res
    847 *
    848 *-------------------------------
    849 SetupDHires
    850 
    851 * Show black lo-res scrn
    852 
    853  jsr blackout
    854 
    855 * Load in Stage 1 data
    856 
    857  jmp LoadStage1A
    858 
    859 *-------------------------------
    860 *
    861 * "Broderbund Software Presents"
    862 *
    863 *-------------------------------
    864 PubCredit
    865 
    866 * Unpack splash screen into DHires page 1
    867 
    868  jsr unpacksplash
    869 
    870 * Show DHires page 1
    871 
    872  jsr setdhires
    873 
    874 * Copy to DHires page 2
    875 
    876  jsr copy1to2
    877 
    878  lda #44
    879  jsr tpause
    880 
    881 * Unpack "Broderbund Presents" onto page 1
    882 
    883  lda #delPresents
    884  jsr DeltaExpPop
    885 
    886  ldx #80
    887  lda #s_Presents
    888  jsr PlaySongI
    889 
    890  jmp CleanScreen
    891 
    892 *-------------------------------
    893 *
    894 * Credit line disappears
    895 *
    896 *-------------------------------
    897 CleanScreen
    898 
    899 * Switch to DHires page 2
    900 * (credit line disappears)
    901 
    902  lda PAGE2on
    903 
    904 * Copy DHires page 2 back to hidden page 1
    905 
    906  jsr copy2to1
    907 
    908 * Display page 1
    909 
    910  lda PAGE2off
    911 ]rts rts
    912 
    913 *-------------------------------
    914 *
    915 * "A Game by Jordan Mechner"
    916 *
    917 *-------------------------------
    918 AuthorCredit
    919 
    920  lda #42
    921  jsr tpause
    922 
    923 * Unpack byline onto page 1
    924 
    925  lda #delByline
    926  jsr DeltaExpPop
    927 
    928  ldx #80
    929  lda #s_Byline
    930  jsr PlaySongI
    931 
    932 * Credit line disappears
    933 
    934  jmp CleanScreen
    935 
    936 *-------------------------------
    937 *
    938 * "Prince of Persia"
    939 *
    940 *-------------------------------
    941 SilentTitle
    942  jsr unpacksplash
    943 
    944  jsr copy1to2
    945 
    946  lda #20
    947  jsr tpause
    948 
    949  lda #delTitle
    950  jsr DeltaExpPop
    951 
    952  lda #160
    953  jmp tpause
    954 
    955 *-------------------------------
    956 TitleScreen
    957  lda #38
    958  jsr tpause
    959 
    960 * Unpack title onto page 1
    961 
    962  lda #delTitle
    963  jsr DeltaExpPop
    964 
    965  ldx #140
    966  lda #s_Title
    967  jsr PlaySongI
    968 
    969 * Credit line disappears
    970 
    971  jmp CleanScreen
    972 
    973 *-------------------------------
    974 *
    975 *  Prologue, part 1
    976 *
    977 *-------------------------------
    978 Prolog1
    979  lda #pacProlog
    980  sta RAMRDaux
    981  jsr DblExpand
    982 
    983  ldx #250
    984  lda #s_Prolog
    985  jmp PlaySongI
    986 
    987 *-------------------------------
    988 *
    989 *  Princess's room: Vizier starts hourglass
    990 *
    991 *-------------------------------
    992 PrincessScene
    993  jsr blackout
    994 
    995  jsr ReloadStuff ;wiped out by dhires titles
    996 
    997  lda #0 ;don't seek track 0
    998  jsr cutprincess1
    999 
   1000  lda #0 ;cut #0 (intro)
   1001  jmp xplaycut ;aux l.c. via grafix
   1002 
   1003 *-------------------------------
   1004 *
   1005 *  Prologue, part 2
   1006 *
   1007 *-------------------------------
   1008 Prolog2
   1009  lda #pacSumup
   1010  sta RAMRDmain
   1011  jsr DblExpand
   1012 
   1013  jsr setdhires
   1014 
   1015  ldx #250
   1016  lda #s_Sumup
   1017  jmp PlaySongI
   1018 
   1019 *-------------------------------
   1020 *
   1021 * Epilog
   1022 *
   1023 *-------------------------------
   1024 Epilog
   1025  lda #pacEpilog
   1026  sta RAMRDaux
   1027  jsr DblExpand
   1028 
   1029  jsr setdhires
   1030 
   1031  lda #s_Epilog
   1032  jsr PlaySongNI
   1033  lda #15
   1034  jsr pauseNI
   1035  jsr unpacksplash
   1036  lda #75
   1037  jsr pauseNI
   1038 
   1039  lda #s_Curtain
   1040  jsr PlaySongNI
   1041  lda #60
   1042  jsr pauseNI
   1043 
   1044  jmp blackout
   1045 
   1046 unpacksplash
   1047  lda #pacSplash
   1048  sta RAMRDaux
   1049  jmp DblExpand
   1050 
   1051 *-------------------------------
   1052 *
   1053 *  Demo sequence
   1054 *
   1055 *-------------------------------
   1056 Demo
   1057  jsr blackout
   1058 
   1059  jsr LoadStage3
   1060 
   1061  jsr setdemolevel
   1062  jsr rdbluep
   1063 
   1064  jsr driveoff
   1065 
   1066 * Go to TOPCTRL
   1067 
   1068  lda #0
   1069  jmp start
   1070 
   1071 *-------------------------------
   1072 * non-interruptible pause
   1073 
   1074 pauseNI
   1075 :loop sta pausetemp
   1076  ldy #20
   1077 :loop1 ldx #0
   1078 :loop2 dex
   1079  bne :loop2
   1080  dey
   1081  bne :loop1
   1082 
   1083  lda pausetemp
   1084  sec
   1085  sbc #1
   1086  bne :loop
   1087 ]rts rts
   1088 
   1089 *-------------------------------
   1090 *
   1091 *  Start game? (if key or button pressed)
   1092 *
   1093 *-------------------------------
   1094 StartGame?
   1095  jsr musickeys
   1096  cmp #$80 ;key or button press?
   1097  bcc ]rts ;no
   1098 
   1099  do FinalDisk
   1100  else
   1101  cmp #kdemo ;temp!
   1102  bne :1
   1103  jmp Demo
   1104 :1 cmp #kprincess ;temp!
   1105  bne :2
   1106  jmp ]princess
   1107  fin
   1108 
   1109 :2 cmp #krestart
   1110  bne :3
   1111  jmp AttractLoop
   1112 :3 ;fall thru to DOSTARTGAME
   1113 *-------------------------------
   1114 *
   1115 *  Start a game
   1116 *
   1117 *-------------------------------
   1118 DOSTARTGAME
   1119  jsr blackout
   1120 
   1121 * Turn on drive & load Stage 3 routines
   1122 
   1123 :1 jsr LoadStage3
   1124 
   1125 * Load 1st level
   1126 
   1127  jsr set1stlevel
   1128 
   1129  jsr rdbluep
   1130 
   1131 * Turn off drive & set aux
   1132 
   1133  jsr driveoff
   1134 
   1135 * Go to TOPCTRL
   1136 
   1137  lda #1
   1138  sta musicon
   1139 
   1140  do DemoDisk
   1141  else
   1142 
   1143  lda keypress
   1144  cmp #kresume
   1145  bne :newgame
   1146 
   1147 * Resume old game
   1148 
   1149  lda #4 ;arbitrary
   1150  jmp startresume
   1151 
   1152  fin
   1153 
   1154 * Start new game
   1155 
   1156 :newgame
   1157  lda #1
   1158  jmp start
   1159 
   1160 *-------------------------------
   1161 *
   1162 * Load permanent code & data
   1163 * (only once)
   1164 *
   1165 *-------------------------------
   1166 loadperm
   1167  jsr loadgame1 ;tracks 3-4
   1168  jsr loadgame2a ;tracks 9-13 (main image tables)
   1169  jmp loadauxlc
   1170 
   1171 *-------------------------------
   1172 *
   1173 *  Stage 1: static dbl hires screens -- no animation
   1174 *  Stage 2: character animation only (bg is unpacked)
   1175 *  Stage 3: full game animation
   1176 *
   1177 *-------------------------------
   1178 *
   1179 * Load Stage 1 data (sida A)
   1180 *
   1181 *-------------------------------
   1182 ]lsub sta track
   1183 :test jsr rw18
   1184  db RdSeqErr.Inc,$40
   1185  bcc :ok
   1186  jsr error
   1187  jmp :test
   1188 :ok
   1189  jsr rw18
   1190  db RdSeq.Inc,$52
   1191  jsr rw18
   1192  db RdSeq.Inc,$64
   1193  jsr rw18
   1194  db RdSeq.Inc,$76
   1195  jsr rw18
   1196  db RdSeq.Inc,$88
   1197  rts
   1198 
   1199 LoadStage1A
   1200  jsr driveon
   1201 
   1202  lda #22
   1203  jsr ]lsub
   1204 
   1205  jsr setmain
   1206  jsr rw18
   1207  db RdSeq.Inc,$60
   1208  jsr rw18
   1209  db RdSeq.Inc,$72
   1210 
   1211  jsr loadmusic1
   1212 
   1213  jsr setaux
   1214  lda #$ff
   1215  sta BGset1
   1216  sta BGset2
   1217  sta CHset
   1218 
   1219  jmp driveoff
   1220 
   1221 *-------------------------------
   1222 *
   1223 *  Load stage 1 (side B)
   1224 *
   1225 *-------------------------------
   1226 LoadStage1B
   1227  jsr driveon
   1228 
   1229  lda #18
   1230  jsr ]lsub
   1231 
   1232  jsr loadmusic3 ;epilog
   1233 
   1234  jmp driveoff
   1235 
   1236 *-------------------------------
   1237 *
   1238 * Reload 2000-6000 auxmem
   1239 * (wiped out by dhires titles)
   1240 *
   1241 *-------------------------------
   1242 ReloadStuff
   1243  jsr driveon
   1244 
   1245 :test lda #4
   1246  sta track
   1247  jsr rw18
   1248  db RdGrpErr
   1249  hex 00,00,00,00,00,00,00,00,00
   1250  hex 00,20,21,22,23,24,25,26,27
   1251  bcc :ok
   1252  jsr error
   1253  jmp :test
   1254 :ok
   1255  lda #15
   1256  sta track
   1257  jsr rw18
   1258  db RdSeq.Inc,$28
   1259  jsr rw18
   1260  db RdSeq.Inc,$3a
   1261  jsr rw18
   1262  db RdSeq.Inc,$4c
   1263 
   1264  jmp driveoff
   1265 
   1266 *-------------------------------
   1267 *
   1268 *  Load stage 2 data (6000-a800)
   1269 *
   1270 *-------------------------------
   1271 LoadStage2
   1272  ldx BBundID
   1273  cpx #POPside2
   1274  beq LoadStage2B
   1275 
   1276 LoadStage2A
   1277  pha
   1278  jsr driveon
   1279  pla
   1280  beq :1 ;don't seek track 0
   1281 
   1282  jsr rw18 ;Copy protection has already been checked
   1283  db Seek,0,0 ;Drive is already on & at track 0
   1284 ;This is just a ruse
   1285  jsr text ;So's this
   1286 
   1287  lda #0
   1288 :1 jsr loadch7 ;side A only
   1289 
   1290  lda #29
   1291 ]ls2 sta track
   1292 
   1293 :test jsr rw18
   1294  db RdSeqErr.Inc,$60
   1295  bcc :ok
   1296  jsr error
   1297  jmp :test
   1298 :ok
   1299  jsr rw18
   1300  db RdSeq.Inc,$72
   1301  jsr rw18
   1302  db RdSeq.Inc,$84
   1303  jsr rw18
   1304  db RdGrp.Inc
   1305  hex 96,97,98,99,9a,9b,9c,9d,9e
   1306  hex 00,00,00,00,00,00,00,00,00
   1307 
   1308  lda #$ff
   1309  sta BGset1
   1310  sta BGset2
   1311  sta CHset
   1312 
   1313  jmp driveoff
   1314 
   1315 * Load chtable7 (side A only)
   1316 
   1317 loadch7
   1318  sta recheck0
   1319 :test lda #28
   1320  sta track
   1321  jsr rw18
   1322  db RdGrpErr.Inc
   1323  hex 00,00,00,00,00,00,00,00,00
   1324  hex 00,00,00,00,9f,a0,a1,a2,a3
   1325  bcc :ok
   1326  jsr error
   1327  inc recheck0
   1328  jmp :test
   1329 :ok
   1330 ]rts rts
   1331 
   1332 *-------------------------------
   1333 *
   1334 *  Load stage 2 routines (side B)
   1335 *
   1336 *-------------------------------
   1337 LoadStage2B
   1338  jsr driveon
   1339 
   1340  lda #24
   1341  bne ]ls2
   1342 
   1343 *-------------------------------
   1344 *
   1345 *  Load stage 3
   1346 *  Full version (from stage 1)
   1347 *
   1348 *  Reload 2000-AC00 auxmem, 6000-7200 mainmem
   1349 *
   1350 *-------------------------------
   1351 LoadStage3
   1352  jsr driveon
   1353 :purple
   1354  jsr rw18
   1355  db Seek,0,0
   1356 
   1357  do CopyProtect
   1358  jsr purple ;in unpack ($ea00)
   1359 ;sets purpleflag ($da) to #$01
   1360  ;uses $6300 aux as scratch
   1361  fin
   1362 
   1363  jsr rw18
   1364  db Seek,0,4
   1365 
   1366  jsr rw18
   1367  db RdGrpErr.Inc
   1368  hex 00,00,00,00,00,00,00,00,00
   1369  hex 00,20,21,22,23,24,25,26,27
   1370  bcc :ok
   1371  jsr error
   1372  jmp :purple
   1373 :ok
   1374  jsr rw18
   1375  db RdSeq.Inc,$60
   1376  jsr rw18
   1377  db RdSeq.Inc,$72 ;bgtable1
   1378 
   1379  jsr setmain
   1380  jsr rw18
   1381  db RdSeq.Inc,$60
   1382  jsr rw18
   1383  db RdSeq.Inc,$72
   1384 
   1385  jsr setaux
   1386 
   1387  lda #13
   1388  sta track
   1389  jsr rw18
   1390  db RdGrp.Inc
   1391  hex 00,00,00,00,00,00,00,00,00
   1392  hex 00,00,00,96,97,98,99,9a,9b
   1393  jsr rw18
   1394  db RdSeq.Inc,$9c ;chtable4
   1395  jsr rw18
   1396  db RdSeq.Inc,$28
   1397  jsr rw18
   1398  db RdSeq.Inc,$3a
   1399  jsr rw18
   1400  db RdSeq.Inc,$4c
   1401  jsr rw18
   1402  db RdSeq.Inc,$84 ;bgtable2
   1403 
   1404  lda #0
   1405  sta BGset1
   1406  sta BGset2
   1407  sta CHset
   1408 
   1409  jsr loadmusic2
   1410 
   1411  jmp setaux
   1412 
   1413 *-------------------------------
   1414 *
   1415 * Play song--interruptible & non-interruptible
   1416 *
   1417 * (Enter & exit w/ bank 2 switched in)
   1418 *
   1419 * In: A = song #
   1420 *     X = length to pause if sound is turned off
   1421 *
   1422 *-------------------------------
   1423 PlaySongNI ;non-interruptible
   1424 ;(& ignores sound/music toggles)
   1425  jsr setaux
   1426  jsr xminit
   1427 :loop jsr xmplay
   1428  cmp #0
   1429  bne :loop
   1430 ]rts rts
   1431 
   1432 *-------------------------------
   1433 PlaySongI ;interruptible
   1434  jsr setaux
   1435  beq ]rts
   1436 
   1437  tay
   1438  lda musicon
   1439  and soundon
   1440  beq :pause
   1441 
   1442  tya
   1443  jsr xminit
   1444 :loop jsr StartGame?
   1445  jsr xmplay
   1446  cmp #0
   1447  bne :loop
   1448 ]rts rts
   1449 
   1450 :pause txa ;falls thru to tpause
   1451 *-------------------------------
   1452 *
   1453 *  In: A = delay (max = 255)
   1454 *
   1455 *-------------------------------
   1456 tpause
   1457 :loop sta pausetemp
   1458 
   1459  ldy #2
   1460 :loop1 ldx #0
   1461 :loop2 jsr StartGame?
   1462  dex
   1463  bne :loop2
   1464  dey
   1465  bne :loop1
   1466 
   1467  lda pausetemp
   1468  sec
   1469  sbc #1
   1470  bne :loop
   1471 ]rts rts
   1472 
   1473 *-------------------------------
   1474 *
   1475 * Disk error
   1476 *
   1477 * Prompt user for correct disk side & wait for keypress
   1478 *
   1479 *-------------------------------
   1480 error
   1481  jsr driveoff
   1482 
   1483  jsr prompt
   1484 
   1485  jmp driveon
   1486 
   1487 *-------------------------------
   1488  lst
   1489 eof ds 1
   1490  usr $a9,1,$a80,*-org
   1491  lst off