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

MASTER.S (20002B)


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