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

SUBS.S (22871B)


      1 * subs
      2 DemoDisk = 0
      3 EditorDisk = 0
      4 CheckTimer = 0
      5 org = $e000
      6  tr on
      7  lst off
      8 *-------------------------------
      9 *
     10 *   S  U  B  S
     11 *
     12 *-------------------------------
     13  org org
     14 
     15  jmp ADDTORCHES
     16  jmp DOFLASHON
     17  jmp PAGEFLIP
     18  jmp DEMO
     19  jmp SHOWTIME
     20 
     21  jmp DOFLASHOFF
     22  jmp LRCLSE
     23  jmp potioneffect
     24  jmp checkalert
     25  jmp reflection
     26 
     27  jmp ADDSLICERS
     28  jmp PAUSE
     29  jmp bonesrise
     30  jmp DEADENEMY
     31  jmp PLAYCUT
     32 
     33  jmp ADDLOWERSOUND
     34  jmp REMOVEOBJ
     35  jmp ADDFALL
     36  jmp SETINITIALS
     37  jmp STARTKID
     38 
     39  jmp STARTKID1
     40  jmp GRAVITY
     41  jmp INITIALGUARDS
     42  jmp MIRAPPEAR
     43  jmp CRUMBLE
     44 
     45 *-------------------------------
     46  lst
     47  put eq
     48  lst
     49  put gameeq
     50  lst
     51  put seqdata
     52  lst
     53  put movedata
     54  lst
     55  put soundnames
     56  lst off
     57 
     58 *-------------------------------
     59  dum $f0
     60 ]Xcount ds 1
     61 ]Xend ds 1
     62 tempstate ds 1
     63  dend
     64 
     65 
     66 POPside1 = $a9
     67 POPside2 = $ad
     68 
     69 * Message #s
     70 
     71 LevelMsg = 1
     72 ContMsg = 2
     73 TimeMsg = 3
     74 
     75 timemsgtimer = 20
     76 
     77 mirscrn = 4
     78 mirx = 4
     79 miry = 0 ;also in topctrl, auto
     80 
     81 *-------------------------------
     82  do CheckTimer
     83 min = 180
     84  else
     85 min = 1090 ;# frames per "minute"
     86  fin ;actual frame rate approx. 11 fps)
     87 
     88 sec = min/60
     89 t = 60 ;game time limit
     90 
     91 *-------------------------------
     92 ALTZPon = $c009
     93 ALTZPoff = $c008
     94 RAMWRTaux = $c005
     95 RAMWRTmain = $c004
     96 RAMRDaux = $c003
     97 RAMRDmain = $c002
     98 
     99 *-------------------------------
    100 SceneCount ds 2
    101 
    102 *-------------------------------
    103 * Level 13 only:  When you enter, trigger loose floors on
    104 * screen above
    105 *-------------------------------
    106 ]rts rts
    107 
    108 CRUMBLE
    109  lda level
    110  cmp #13
    111  bne ]rts
    112  lda VisScrn
    113  cmp #23
    114  beq :1
    115  cmp #16
    116  bne ]rts
    117 ;Trigger blocks 2-7 on bottom row of scrn above
    118 :1 lda scrnAbove
    119  sta tempscrn
    120  lda #2
    121  sta tempblocky
    122  ldx #7
    123 :loop stx tempblockx
    124  jsr :trigloose
    125  ldx tempblockx
    126  dex
    127  cpx #2
    128  bcs :loop
    129 ]rts rts
    130 
    131 :trigloose
    132  jsr rdblock1
    133  cmp #loose
    134  bne ]rts
    135  jsr rnd
    136  and #$0f
    137  eor #$ff
    138  clc
    139  adc #1
    140  jmp breakloose1
    141 
    142 *-------------------------------
    143 * Add all flasks & torches on VisScrn to trans list
    144 * & swords
    145 *-------------------------------
    146 ADDTORCHES
    147  lda VisScrn
    148  jsr calcblue
    149 
    150  ldy #29
    151 :loop lda (BlueType),y
    152  and #idmask
    153  cmp #torch
    154  bne :c1
    155  tya
    156  pha
    157  lda VisScrn
    158  jsr trigtorch
    159  pla
    160  tay
    161  bpl :cont
    162 
    163 :c1 cmp #flask
    164  bne :c2
    165  tya
    166  pha
    167  lda VisScrn
    168  jsr trigflask
    169  pla
    170  tay
    171  bpl :cont
    172 
    173 :c2 cmp #sword
    174  bne :cont
    175  tya
    176  pha
    177  lda VisScrn
    178  jsr trigsword
    179  pla
    180  tay
    181 :cont dey
    182  bpl :loop
    183 
    184 ]rts rts
    185 
    186 *-------------------------------
    187 *
    188 * In: A = length of pause (1-256)
    189 *
    190 *-------------------------------
    191 PAUSE
    192 :outer pha
    193  ldx #0
    194 :loop dex
    195  bne :loop
    196  pla
    197  sec
    198  sbc #1
    199  bne :outer
    200 ]rts rts
    201 
    202 *-------------------------------
    203 *
    204 *  F L A S H
    205 *
    206 *  Has a traumatic incident occured this frame?
    207 *  If so, do lightning flash
    208 *
    209 *-------------------------------
    210 DOFLASHON
    211  jsr lrclse
    212 
    213  jsr vblank
    214 
    215  lda $c054
    216  lda $c056 ;show lores
    217  rts
    218 
    219 *-------------------------------
    220 DOFLASHOFF
    221  jsr vblank
    222 
    223  lda PAGE
    224  bne :1
    225 
    226  lda $c055
    227 :1 lda $c057 ;show hires
    228 
    229  rts
    230 
    231 *-------------------------------
    232 *
    233 * Clear lo-res screen only if we need to
    234 *
    235 * In: A = byte value
    236 *
    237 *------------------------------
    238 LRCLSE
    239  cmp scrncolor ;last scrncolor
    240  beq ]rts
    241 
    242  jmp lrcls
    243 
    244 *-------------------------------
    245 * Add all slicers on CharBlockY to trans list
    246 *-------------------------------
    247 slicetimer = 15 ;from mover
    248 slicersync = 3 ;# frames out of sync
    249 
    250 ADDSLICERS
    251  lda #slicetimer
    252  sta tempstate
    253 
    254  lda CharScrn
    255  jsr calcblue
    256 
    257  ldy CharBlockY
    258  cpy #3
    259  bcs ]rts
    260 
    261  lda Mult10,y
    262  tay
    263  clc
    264  adc #10
    265  sta :sm+1
    266 :loop
    267  lda (BlueType),y
    268  and #idmask
    269  cmp #slicer
    270  bne :cont
    271 
    272  lda (BlueSpec),y
    273  tax
    274  and #$7f
    275  beq :ok
    276  cmp #slicerRet
    277  bcc :cont ;in mid-slice--leave it alone
    278 :ok txa
    279  and #$80 ;get hibit
    280  ora tempstate
    281  jsr trigslicer ;trigger slicer
    282  jsr getnextstate
    283 
    284 :cont iny
    285 :sm cpy #0
    286  bcc :loop
    287 
    288 ]rts rts
    289 
    290 getnextstate
    291  lda tempstate
    292  sec
    293  sbc #slicersync
    294  cmp #slicerRet
    295  bcs :ok
    296  clc
    297  adc #slicetimer+1-slicerRet
    298 :ok sta tempstate
    299 ]rts rts
    300 
    301 *-------------------------------
    302 *
    303 *  Special animation lists for princess's room
    304 *
    305 *-------------------------------
    306 ptorchx db 13,25,-1
    307 ptorchoff db 0,6
    308 ptorchy db 113,113
    309 ptorchstate db 1,6
    310 ptorchcount ds 1
    311 psandcount ds 1
    312 pstarcount ds 4
    313 
    314 *-------------------------------
    315 *
    316 *  Burn torches (Princess's room)
    317 *
    318 *-------------------------------
    319 pburn
    320  ldx ptorchcount ;last torch burned
    321  inx
    322  lda ptorchx,x
    323  bpl :ok
    324  ldx #0
    325 :ok stx ptorchcount
    326  lda ptorchx,x
    327  sta XCO
    328  lda ptorchoff,x
    329  sta OFFSET
    330  lda ptorchy,x
    331  sta YCO
    332  lda ptorchstate,x
    333  jsr getflameframe
    334  sta ptorchstate,x
    335  tax
    336  jsr psetupflame
    337  jmp lay  ;<---DIRECT HIRES CALL
    338 
    339 *-------------------------------
    340 *
    341 * Flow sand
    342 *
    343 *-------------------------------
    344 pflow
    345  ldx psandcount
    346  bmi ]rts ;no hourglass yet
    347  inx
    348  cpx #3
    349  bcc :ok
    350  ldx #0
    351 :ok stx psandcount
    352  ldy GlassState
    353  jmp flow ;<---Contains direct hires call
    354 
    355 *-------------------------------
    356 *
    357 * Twinkle stars
    358 *
    359 *-------------------------------
    360 pstars
    361  ldx #3
    362 :loop lda pstarcount,x
    363  beq :ok
    364  dec pstarcount,x
    365  bne :ok
    366  txa
    367  pha
    368  jsr twinkle ;turn it off
    369  pla
    370  tax
    371 :ok dex
    372  bpl :loop
    373 
    374 * New twinkle?
    375 
    376  jsr rnd
    377  cmp #10
    378  bcs ]rts
    379  jsr rnd
    380  and #3
    381  clc
    382  adc #5 ;A = rnd length of twinkle (5-8)
    383  pha
    384  jsr rnd
    385  jsr rnd
    386  and #3
    387  tax ;X = rnd star # (0-3)
    388  pla
    389  sta pstarcount,x
    390  jmp twinkle ;<---Contains direct hires call
    391 
    392 *-------------------------------
    393 *
    394 *  P A G E F L I P
    395 *
    396 *-------------------------------
    397 PAGEFLIP
    398  jsr normspeed ;IIGS
    399  lda PAGE
    400  bne :1
    401 
    402  lda #$20
    403  sta PAGE
    404  lda $C054 ;show page 1
    405 
    406 :3 lda $C057 ;hires on
    407  lda $C050 ;text off
    408  lda vibes
    409  beq :rts
    410  lda $c05e
    411 ]rts rts
    412 :rts lda $c05f
    413  rts
    414 
    415 :1 lda #0
    416  sta PAGE
    417  lda $C055 ;show page 2
    418  jmp :3
    419 
    420 *-------------------------------
    421 *
    422 *  Play pre-recorded "princess" scenes
    423 *
    424 *  In: A = scene #
    425 *
    426 *-------------------------------
    427 AddrL db #PlayCut0,#PlayCut1,#PlayCut2,#PlayCut3
    428  db #PlayCut4,#PlayCut5,#PlayCut6,#PlayCut7
    429  db #PlayCut8
    430 AddrH db #>PlayCut0,#>PlayCut1,#>PlayCut2,#>PlayCut3
    431  db #>PlayCut4,#>PlayCut5,#>PlayCut6,#>PlayCut7
    432  db #>PlayCut8
    433 
    434 PLAYCUT
    435  pha
    436  jsr initit
    437  pla
    438  tax
    439 
    440  do 0 ;temp
    441  jmp PlayCut4
    442  fin
    443 
    444  lda AddrL,x
    445  sta :sm+1
    446  lda AddrH,x
    447  sta :sm+2
    448 :sm jsr $FFFF ;self-mod
    449 
    450  lda #1
    451  sta SPEED
    452 ]rts rts
    453 
    454 *-------------------------------
    455  do DemoDisk
    456 PlayCut8
    457 PlayCut4
    458 PlayCut7
    459  brk
    460  else
    461 *-------------------------------
    462 * Cut #8: Princess sends out mouse
    463 *-------------------------------
    464 PlayCut8
    465  jsr getglass
    466  jsr addglass
    467 
    468  jsr startP8
    469  jsr SaveShad
    470  jsr startM8
    471  jsr SaveKid
    472 
    473  lda #20
    474  jsr play
    475 
    476  lda #Mleave
    477  jsr mjumpseq
    478  lda #20
    479  jsr play
    480 
    481  lda #Prise
    482  jsr pjumpseq
    483 
    484  lda #20
    485  jsr play
    486 
    487  lda #0
    488  sta KidPosn ;mouse disappears
    489  ldx #50
    490  lda #s_Heartbeat
    491  jmp PlaySongX
    492 
    493 *-------------------------------
    494 * Cut #4: Mouse returns to princess
    495 *-------------------------------
    496 PlayCut4
    497  jsr getglass
    498  jsr addglass
    499 
    500  jsr startP4
    501  jsr SaveShad
    502  jsr startM4
    503  jsr SaveKid
    504  lda #5
    505  jsr play
    506 
    507  lda #Pcrouch
    508  jsr pjumpseq
    509  lda #9
    510  jsr play
    511 
    512  lda #Mraise
    513  jsr mjumpseq
    514 
    515  lda #58
    516  jmp play
    517 
    518 *-------------------------------
    519 * Happy ending
    520 *-------------------------------
    521 PlayCut7
    522  lda #8
    523  sta SPEED
    524 
    525  lda #1
    526  sta soundon
    527  sta musicon ;they must listen!!
    528 
    529  jsr startP7
    530  jsr SaveShad
    531  lda #8
    532  jsr play
    533 
    534  jsr startK7
    535  jsr SaveKid
    536  lda #8
    537  jsr play
    538 
    539  lda #Pembrace
    540  jsr pjumpseq
    541  lda #5
    542  jsr play
    543 
    544  lda #runstop
    545  jsr vjumpseq
    546  lda #2
    547  jsr play
    548 
    549  lda #0
    550  sta KidPosn ;kid disappears on frame 8 of embrace
    551 
    552  lda #9
    553  jsr play
    554 
    555  lda  #s_Embrace
    556  jsr  PlaySong
    557 
    558  jsr startM7
    559  jsr SaveKid ;mouse runs in
    560 
    561  lda #12
    562  jsr play
    563 
    564  lda #Mclimb
    565  jsr mjumpseq
    566 
    567  lda #30
    568  jmp play
    569 
    570  fin
    571 
    572 *-------------------------------
    573 * Tragic ending
    574 *-------------------------------
    575 PlayCut6
    576  lda #22
    577  sta SPEED
    578  ldx #8 ;empty hourglass
    579  jsr addglass
    580  lda #2
    581  jsr play
    582  lda #s_Tragic
    583  jsr PlaySong
    584  lda #100
    585  jmp play
    586 
    587 *-------------------------------
    588 * Princess cut #5
    589 *-------------------------------
    590 PlayCut5
    591  jsr getglass
    592  cpx #7
    593  bcs Ominous ;sand is almost out--go for it
    594  jmp PlayCut1
    595 
    596 Ominous
    597  jsr getglass
    598  jsr addglass
    599 
    600  jsr startP5
    601  jsr SaveShad
    602 
    603  lda #2
    604  jsr play
    605 
    606  ldx #50
    607  lda #s_Heartbeat
    608  jsr PlaySongX
    609 
    610  lda #Palert
    611  jsr pjumpseq ;princess hears something...
    612  lda #12
    613  jsr play
    614 
    615  ldx #20
    616  lda #s_Danger
    617  jmp PlaySongX
    618 
    619 *-------------------------------
    620 * Princess cut #2 (lying down)
    621 *-------------------------------
    622 PlayCut2
    623  jsr getglass
    624  jsr addglass
    625 
    626  jsr startP2
    627  jsr SaveShad
    628 
    629  lda #2
    630  jsr play
    631 
    632  ldx #50
    633  lda #s_Heartbeat
    634  jsr PlaySongX
    635 ]rts rts
    636 
    637 *-------------------------------
    638 * Princess cut #1 (standing)
    639 *-------------------------------
    640 PlayCut1
    641 PlayCut3
    642  jsr getglass
    643  jsr addglass
    644 
    645  jsr startP1
    646  jsr SaveShad
    647 
    648  lda #2
    649  jsr play
    650 
    651  ldx #50
    652  lda #s_Timer
    653  jmp PlaySongX
    654 
    655 *-------------------------------
    656 * Opening titles scene
    657 *-------------------------------
    658 PlayCut0
    659  jsr startV0
    660  jsr SaveKid
    661  jsr startP0 ;put chars in starting posn
    662  jsr SaveShad
    663 
    664  lda #2
    665  jsr play ;animate 2 frames
    666 
    667  lda #s_Princess
    668  ldx #8
    669  jsr PlaySongI
    670 
    671  lda #5
    672  jsr play
    673 
    674  lda #Palert
    675  jsr pjumpseq ;princess hears something...
    676  lda #9
    677  jsr play
    678  lda #s_Squeek
    679  ldx #0
    680  jsr PlaySongI ;door squeaks...
    681 
    682  lda #7
    683  sta SPEED
    684 
    685  lda #5
    686  jsr play
    687  lda #Vapproach
    688  jsr vjumpseq
    689  lda #6
    690  jsr play
    691  lda #Vstop
    692  jsr vjumpseq
    693  lda #4
    694  jsr play ;vizier enters
    695  lda #s_Vizier
    696  ldx #12
    697  jsr PlaySongI
    698  lda #4
    699  jsr play
    700 
    701  lda #Vapproach
    702  jsr vjumpseq
    703  lda #30
    704  jsr play
    705  lda #Vstop
    706  jsr vjumpseq
    707  lda #4
    708  jsr play ;stops in front of princess
    709  lda #s_Buildup
    710  ldx #25
    711  jsr PlaySongI
    712 
    713  lda #Vraise ;raises arms
    714  jsr vjumpseq
    715  lda #1
    716  jsr play
    717  lda #Pback
    718  jsr pjumpseq
    719  lda #13
    720  jsr play
    721  ldx #0
    722  jsr addglass1 ;hourglass appears
    723  lda #5
    724  sta lightning
    725  lda #$ff
    726  sta lightcolor
    727 
    728  lda #12
    729  sta SPEED
    730  lda #5
    731  jsr play
    732  lda #0
    733  sta psandcount ;sand starts flowing
    734  lda #s_Magic
    735  ldx #8
    736  jsr PlaySongI
    737 
    738  lda #7
    739  sta SPEED
    740  lda #Vexit
    741  jsr vjumpseq
    742  lda #17
    743  jsr play
    744  ldx #1
    745  jsr addglass1 ;glass starts to fill
    746  lda #12
    747  jsr play
    748  lda #Pslump
    749  jsr pjumpseq
    750  lda #28
    751  jsr play
    752 
    753  lda #12
    754  sta SPEED
    755  lda #s_StTimer
    756  ldx #20
    757  jmp PlaySongI
    758 
    759 *-------------------------------
    760 * Add hourglass to scene
    761 * In: X = state
    762 *-------------------------------
    763 addglass
    764  lda #0
    765  sta psandcount ;start sand flowing
    766 addglass1
    767  stx GlassState
    768  lda #2
    769  sta redrawglass
    770 ]rts rts
    771 
    772 *-------------------------------
    773 * In: A = song #
    774 *     X = # cycles to play if sound is off
    775 *-------------------------------
    776 PlaySongX
    777  tay
    778  lda soundon
    779  and musicon
    780  bne :1
    781  txa
    782  jmp play
    783 :1 tya ;falls thru to PlaySong
    784 
    785 *-------------------------------
    786 *
    787 * Play Song (Princess's room)
    788 *
    789 * Button press ends song
    790 *
    791 * In: A = song #
    792 *
    793 *-------------------------------
    794 PlaySong
    795  jsr minit
    796  jsr swpage
    797 :loop lda #1
    798  jsr strobe
    799  lda $c061
    800  ora $c062
    801  ora keypress
    802  bmi :interrupt
    803  jsr pburn
    804  jsr pstars
    805  jsr pflow
    806  jsr mplay
    807  cmp #0
    808  bne :loop
    809 :interrupt
    810  jmp swpage
    811 
    812 *-------------------------------
    813 *
    814 * Play Song (Princess's room--Interruptible)
    815 *
    816 * Key or button press starts a new game
    817 *
    818 * In: A = song #
    819 *     X = # cycles to play if sound is off
    820 *
    821 *-------------------------------
    822 PlaySongI
    823  tay
    824  lda soundon
    825  and musicon
    826  bne :1
    827  txa
    828  beq ]rts
    829  jmp play
    830 :1 tya
    831 
    832  jsr minit
    833  jsr swpage
    834 :loop jsr musickeys
    835  cmp #$80
    836  bcs :interrupt
    837  jsr pburn
    838  jsr pstars
    839  jsr pflow
    840  jsr mplay
    841  cmp #0
    842  bne :loop
    843  jmp swpage
    844 :interrupt
    845  jmp dostartgame
    846 
    847 *-------------------------------
    848 *  Switch hires pages for duration of song
    849 
    850 swpage
    851  lda PAGE
    852  eor #$20
    853  sta PAGE
    854 ]rts rts
    855 
    856 *-------------------------------
    857 flashon
    858  lda lightning
    859  beq ]rts
    860  lda lightcolor
    861  jmp doflashon
    862 
    863 flashoff
    864  lda lightning
    865  beq ]rts
    866  dec lightning
    867  jmp doflashoff
    868 
    869 *-------------------------------
    870 *
    871 *  Playback loop (simplified version of main loop in TOPCTRL)
    872 *
    873 *  In: A = sequence length (# of frames)
    874 *
    875 *-------------------------------
    876 play
    877  sta SceneCount
    878 playloop
    879  jsr rnd
    880 
    881  lda SPEED
    882  jsr pause
    883 
    884  jsr strobe ;strobe kbd & jstk
    885 
    886  lda level
    887  bne :notdemo
    888  jsr demokeys
    889  bpl :cont
    890  lda #1
    891  jmp dostartgame ;interrupted--start a new game
    892 
    893 :notdemo lda $c061
    894  ora $c062
    895  ora keypress
    896  bmi ]rts ;key or button to end scene
    897 
    898 :cont jsr NextFrame ;Determine what next frame should look like
    899 
    900  jsr flashon
    901 
    902  jsr FrameAdv ;Update hidden page to reflect new reality
    903 ;& show it
    904  jsr flashoff
    905 
    906  lda soundon
    907  beq :1
    908  jsr playback ;play back sound fx
    909  jsr zerosound
    910 :1
    911 ; jsr songcues
    912 
    913  dec SceneCount
    914  bne playloop
    915  rts
    916 
    917 *-------------------------------
    918 NextFrame
    919  jsr DoKid ;kid/vizier/mouse
    920 
    921  jsr DoShad ;always princess
    922 
    923 ]rts rts
    924 
    925 *-------------------------------
    926 FrameAdv
    927  jsr DoFast
    928 
    929  jsr vblank
    930 
    931  jmp PageFlip
    932 
    933 *-------------------------------
    934 DoKid
    935  jsr LoadKid
    936  lda CharPosn
    937  beq ]rts
    938 
    939  jsr ctrlkidchar
    940 
    941  jsr animchar ;Get next frame from sequence table
    942 
    943  jsr SaveKid ;Save all changes to char data
    944 
    945 ]rts rts
    946 
    947 *-------------------------------
    948 DoShad
    949  jsr LoadShadwOp
    950  lda CharPosn
    951  beq ]rts
    952 
    953  jsr ctrlshadchar
    954 
    955  jsr animchar
    956 
    957  jmp SaveShad
    958 
    959 *-------------------------------
    960 ctrlkidchar
    961  rts
    962 
    963 ctrlshadchar
    964  rts
    965 
    966 *-------------------------------
    967 DoFast
    968 
    969 * Set up image lists
    970 
    971  jsr zerolsts
    972 
    973  lda redrawglass
    974  beq :3
    975  dec redrawglass
    976  ldx GlassState
    977  jsr drawglass ;hourglass
    978 :3
    979  jsr LoadKid ;can be kid or vizier
    980  lda CharPosn
    981  beq :1
    982  jsr setupchar
    983  lda #30
    984  sta FCharIndex
    985  jsr addkidobj
    986 :1
    987  jsr LoadShad ;always princess
    988  lda CharPosn
    989  beq :2
    990  jsr setupchar
    991  lda #30
    992  sta FCharIndex
    993  jsr addkidobj
    994  jsr pmask ;kludge to mask face & hair
    995 :2
    996  jsr fast ;get char/objs into mid table
    997 
    998  jsr drawpost ;big white post
    999 
   1000 * Draw to screen
   1001 
   1002  jsr pburn
   1003  jsr pburn ;first put down 2 torch flames
   1004  jsr pstars ;& twinkle stars
   1005 
   1006  jsr drawall ;...then draw the rest
   1007 
   1008  jmp pflow ;& flow sand
   1009 
   1010 ]rts rts
   1011 
   1012 *-------------------------------
   1013 *
   1014 * Jumpseq for princess & vizier
   1015 *
   1016 * In: A = sequence #
   1017 *
   1018 *-------------------------------
   1019 pjumpseq
   1020  pha
   1021  jsr LoadShad
   1022  pla
   1023  jsr jumpseq
   1024  jmp SaveShad
   1025 
   1026 kjumpseq
   1027 mjumpseq
   1028 vjumpseq
   1029  pha
   1030  jsr LoadKid
   1031  pla
   1032  jsr jumpseq
   1033  jmp SaveKid
   1034 
   1035 *-------------------------------
   1036 *
   1037 * Put characters in starting position for scene
   1038 *
   1039 *-------------------------------
   1040 floorY = 151
   1041 
   1042 * mouse runs to princess
   1043 
   1044 startM8
   1045  jsr startM4
   1046  lda #144
   1047  sta CharX
   1048  lda #Mstop
   1049  jsr jumpseq
   1050  jmp animchar
   1051 
   1052 startM4
   1053  lda #24
   1054  sta CharID
   1055  lda #199
   1056  sta CharX
   1057  lda #floorY+1
   1058  sta CharY
   1059  lda #-1
   1060  sta CharFace
   1061 
   1062  lda #Mscurry
   1063  jsr jumpseq
   1064  jmp animchar
   1065 
   1066 * princess w/mouse
   1067 
   1068 startP8
   1069  jsr startP0
   1070  lda #130
   1071  sta CharX
   1072  lda #floorY+3
   1073  sta CharY
   1074  lda #Pstroke
   1075  jsr jumpseq
   1076  jmp animchar
   1077 
   1078 startP4
   1079  jsr startP1
   1080  lda #142
   1081  sta CharX
   1082  lda #floorY+3
   1083  sta CharY
   1084  lda #Pstand
   1085  jsr jumpseq
   1086  jmp animchar
   1087 
   1088 startP5
   1089  jsr startP0
   1090  lda #160
   1091  sta CharX
   1092  rts
   1093 
   1094 startP2
   1095  jsr startP0
   1096  lda #89
   1097  sta CharX
   1098  lda #floorY
   1099  sta CharY
   1100 
   1101  lda #Plie
   1102  jsr jumpseq
   1103  jmp animchar
   1104 
   1105 startP1
   1106  jsr startP0
   1107  lda #0
   1108  sta CharFace
   1109  rts
   1110 
   1111 startP7
   1112  jsr startP0
   1113  lda #136
   1114  sta CharX
   1115  lda #floorY-2
   1116  sta CharY
   1117  lda #Pwaiting
   1118  ldx #1
   1119  cpx purpleflag
   1120  beq :ok
   1121  lda #120 ;crash (copy protect)
   1122 :ok jsr jumpseq
   1123  jmp animchar
   1124 
   1125 startM7
   1126  jsr startM4
   1127  lda #floorY-2
   1128  sta CharY
   1129  rts
   1130 
   1131 startP0
   1132  lda #5
   1133  sta CharID
   1134 
   1135  lda #120
   1136  sta CharX
   1137  lda #floorY
   1138  sta CharY
   1139 
   1140  lda #-1
   1141  sta CharFace
   1142 
   1143  lda #Pstand
   1144  jsr jumpseq
   1145  jmp animchar
   1146 
   1147 startV0
   1148  lda #6
   1149  sta CharID
   1150 
   1151  lda #197
   1152  sta CharX
   1153  lda #floorY
   1154  sta CharY
   1155 
   1156  lda #-1
   1157  sta CharFace
   1158 
   1159  lda #Vstand
   1160  jsr jumpseq
   1161  jmp animchar
   1162 
   1163 startK7
   1164  lda #0
   1165  sta CharID
   1166 
   1167  lda #198
   1168  sta CharX
   1169  lda #floorY-2
   1170  sta CharY
   1171 
   1172  lda #-1
   1173  sta CharFace
   1174 
   1175  lda #startrun
   1176  jsr jumpseq
   1177  jmp animchar
   1178 
   1179 *-------------------------------
   1180 * Demo commands
   1181 *-------------------------------
   1182 EndProg = -2
   1183 EndDemo = -1
   1184 Ctr = 0
   1185 Fwd = 1
   1186 Back = 2
   1187 Up = 3
   1188 Down = 4
   1189 Upfwd = 5
   1190 Press = 6
   1191 Release = 7
   1192 
   1193 *-------------------------------
   1194 DemoProg1 ;up to fight w/1st guard
   1195  db 0,Ctr
   1196  db 1,Fwd
   1197  db 13,Ctr
   1198  db 30,Fwd ;start running...
   1199  db 37,Upfwd ;jump 1st pit
   1200  db 47,Ctr
   1201  db 48,Fwd ;& keep running
   1202 d1 = 65
   1203  db d1,Ctr ;stop
   1204  db d1+8,Back ;look back...
   1205  db d1+10,Ctr
   1206  db d1+34,Back
   1207  db d1+35,Ctr
   1208 d2 = 115
   1209  db d2,Upfwd ;jump 2nd pit
   1210  db d2+13,Press ;& grab ledge
   1211  db d2+21,Up
   1212  db d2+42,Release
   1213  db d2+43,Ctr
   1214  db d2+44,Fwd
   1215  db d2+58,Down
   1216  db d2+62,Ctr
   1217  db d2+63,Fwd
   1218  db d2+73,Ctr
   1219 d3 = 193
   1220  db d3,Fwd
   1221  db d3+12,Ctr
   1222  db d3+40,EndDemo
   1223 
   1224 *-------------------------------
   1225 *
   1226 *  D  E  M  O
   1227 *
   1228 *  Controls kid's movements during self-running demo
   1229 *
   1230 *  (Called from PLAYERCTRL)
   1231 *
   1232 *-------------------------------
   1233 DEMO
   1234  lda #DemoProg1
   1235  ldx #>DemoProg1
   1236  jmp AutoPlayback
   1237 
   1238 *-------------------------------
   1239 *
   1240 * Init princess cut
   1241 *
   1242 *-------------------------------
   1243 initit
   1244  lda #" "
   1245  sta scrncolor ;?
   1246  lda #0
   1247  sta vibes
   1248  sta redrawglass
   1249  sta KidPosn
   1250  sta ShadPosn
   1251  sta ptorchcount
   1252  ldx #3
   1253 :loop sta pstarcount,x
   1254  dex
   1255  bpl :loop
   1256 
   1257  lda #-1 ;no hourglass yet
   1258  sta psandcount
   1259 
   1260  lda #12
   1261  sta SPEED
   1262 
   1263  jsr zeropeels
   1264  jsr zerored
   1265  jsr zerosound
   1266 ]rts rts
   1267 
   1268 *-------------------------------
   1269 *
   1270 * Get hourglass state (based on time left)
   1271 *
   1272 * In: FrameCount
   1273 * Out: X = glass state
   1274 *
   1275 *-------------------------------
   1276 getglass
   1277  jsr getminleft
   1278  ldx #7
   1279  lda MinLeft
   1280  cmp #6
   1281  bcc :got
   1282  dex
   1283  cmp #$11
   1284  bcc :got
   1285  dex
   1286  cmp #$21
   1287  bcc :got
   1288  dex
   1289  cmp #$41
   1290  bcc :got
   1291  dex
   1292 :got
   1293 ]rts rts
   1294 
   1295 *-------------------------------
   1296 *
   1297 * Show time if requested
   1298 * (& constant time display during final minute)
   1299 *
   1300 * In: timerequest (0 = no, 1-2 = auto, 3 = from kbd,)
   1301 *     4 = Vizier dead)
   1302 *
   1303 *-------------------------------
   1304 SHOWTIME
   1305  lda timerequest
   1306  beq ]rts
   1307  lda KidLife
   1308  bpl ]rts
   1309 
   1310  jsr getminleft
   1311 
   1312  lda MinLeft
   1313  cmp #2
   1314  bcs :normal
   1315  lda SecLeft
   1316  beq :timeup
   1317 
   1318 * Countdown during final minute
   1319 
   1320  lda level
   1321  cmp #14
   1322  bcs :normal
   1323  bcc :showsec ;stop countdown when clock stops
   1324 
   1325 :timeup
   1326  lda timerequest
   1327  cmp #3
   1328  bcc ]rts ;Once t=0, show time only on kbd request
   1329 
   1330 :normal
   1331  lda msgtimer
   1332  bne ]rts ;wait till other msgs are gone
   1333 
   1334  lda #TimeMsg
   1335  sta message
   1336  lda #timemsgtimer
   1337  ldx timerequest
   1338  cpx #4
   1339  bcc :norm
   1340 :delay lda #timemsgtimer+5 ;delay 5 cycles
   1341 :norm sta msgtimer
   1342 
   1343  lda #0
   1344  sta timerequest
   1345 ]rts rts
   1346 
   1347 :showsec
   1348  lda SecLeft
   1349  cmp #2
   1350  bcc :nomsg
   1351 
   1352  lda message
   1353  cmp #TimeMsg
   1354  beq :2
   1355  lda msgtimer
   1356  bne ]rts
   1357  lda #TimeMsg
   1358  sta message
   1359 :2 lda #1
   1360  sta timerequest
   1361  lda #1
   1362  sta msgtimer
   1363  rts
   1364 :nomsg lda #0
   1365  sta timerequest
   1366  sta msgtimer
   1367  rts
   1368 
   1369 *-------------------------------
   1370 * Add lowering-gate sound (only when gate is visible)
   1371 * In: A = state
   1372 *-------------------------------
   1373 ADDLOWERSOUND
   1374  lsr
   1375  bcc ]rts ;alt frames
   1376 
   1377  lda level
   1378  cmp #3
   1379  bne :n
   1380  lda trscrn
   1381  cmp #2 ;Exception: Level 3, screen 2
   1382  beq :y
   1383 :n lda trscrn
   1384  cmp scrnLeft
   1385  bne :1
   1386  ldy trloc
   1387  cpy #9
   1388  beq :y
   1389  cpy #19
   1390  beq :y
   1391  cpy #29
   1392  beq :y ;visible to left
   1393 ]rts rts
   1394 
   1395 :1 cmp VisScrn
   1396  bne ]rts
   1397  ldy trloc
   1398  cpy #9
   1399  beq ]rts
   1400  cpy #19
   1401  beq ]rts
   1402  cpy #29
   1403  beq ]rts
   1404 
   1405 :y lda #LoweringGate
   1406  jmp addsound
   1407 
   1408 *-------------------------------
   1409 *
   1410 * Remove object
   1411 *
   1412 * In: A = lastpotion
   1413 *
   1414 *-------------------------------
   1415 REMOVEOBJ
   1416  sta lastpotion
   1417 
   1418  ldx #1
   1419  stx clrbtn
   1420 
   1421  lda #floor
   1422  sta (BlueType),y ;remove object
   1423  lda #0
   1424  sta (BlueSpec),y
   1425 
   1426  lda #35 ;TEMP
   1427  sta height
   1428 
   1429  lda #2
   1430  clc
   1431  jsr markwipe
   1432  jmp markred
   1433 
   1434 *-------------------------------
   1435 *
   1436 *  S E T  I N I T I A L S
   1437 *
   1438 *  Set initial states of gadgets
   1439 *
   1440 *-------------------------------
   1441 SETINITIALS
   1442  lda INFO ;number of screens +1
   1443  sec
   1444  sbc #1
   1445  sta SCRNUM
   1446 
   1447 :loop jsr DoScrn ;for every screen
   1448 
   1449  dec SCRNUM
   1450  bne :loop
   1451  rts
   1452 
   1453 *-------------------------------
   1454 DoScrn
   1455  lda SCRNUM
   1456  jsr calcblue
   1457 
   1458  ldy #29
   1459 
   1460 :loop jsr getinitobj
   1461  bcc :skip
   1462  sta (BlueSpec),y
   1463 
   1464 :skip dey
   1465  bpl :loop
   1466 
   1467  rts
   1468 
   1469 *-------------------------------
   1470 *
   1471 *  S T A R T   K I D
   1472 *
   1473 *  Put kid in his starting position for this level
   1474 *
   1475 *-------------------------------
   1476 STARTKID
   1477  lda level
   1478  cmp #3
   1479  bne :nomile
   1480 
   1481 * Level 3 milestone?
   1482 
   1483 :special3
   1484  lda milestone ;set to 1 when he gets past 1st gate
   1485  beq :nomile
   1486  lda #-1
   1487  sta KidStartFace
   1488  lda #2
   1489  sta KidStartScrn
   1490  lda #6
   1491  sta KidStartBlock ;put him just inside 1st gate...
   1492 
   1493  lda #7
   1494  ldx #4
   1495  ldy #0
   1496  jsr rdblock
   1497  lda #space
   1498  sta (BlueType),y ;remove loose floor...
   1499 ;& continue
   1500 :nomile
   1501  lda KidStartScrn ;in INFO
   1502  sta CharScrn
   1503 
   1504  lda KidStartBlock
   1505  jsr unindex ;return A = blockx, X = blocky
   1506 
   1507  sta CharBlockX
   1508  stx CharBlockY
   1509 
   1510  lda CharBlockX
   1511  jsr getblockej
   1512  clc
   1513  adc #angle+7
   1514  sta CharX ;put kid on starting block
   1515 
   1516  lda KidStartFace
   1517  eor #$ff
   1518  sta CharFace
   1519 
   1520  lda origstrength
   1521  ldx level
   1522  bne :notdemo
   1523  lda #4
   1524 :notdemo sta MaxKidStr
   1525  sta KidStrength
   1526 
   1527  do EditorDisk
   1528  jmp :normal
   1529  fin
   1530 
   1531  lda level
   1532  cmp #1
   1533  beq :special1
   1534  cmp #13
   1535  beq :special13
   1536  bne :normal
   1537 
   1538 * Special start for Level 1
   1539 
   1540 :special1
   1541  lda #5 ;scrn
   1542  ldx #2 ;blockx
   1543  ldy #0 ;blocky
   1544  jsr rdblock
   1545  jsr pushpp ;slam gate shut
   1546 
   1547  lda #stepfall
   1548  jsr jumpseq
   1549  jmp STARTKID1
   1550 
   1551 * & for level 13
   1552 
   1553 :special13
   1554  lda #running
   1555  jsr jumpseq
   1556  jmp STARTKID1
   1557 
   1558 * Normal start
   1559 
   1560 :normal lda #turn
   1561  jsr jumpseq ;start in standing posn
   1562 
   1563 STARTKID1
   1564  ldx CharBlockY
   1565  lda FloorY+1,x
   1566  sta CharY
   1567 
   1568  lda #-1
   1569  sta CharLife ;ff = alive
   1570 
   1571  lda #0 ;kid
   1572  sta CharID
   1573 
   1574  lda #0
   1575  sta CharXVel
   1576  sta CharYVel
   1577  sta waitingtojump
   1578  sta weightless
   1579  sta invert
   1580  sta jarabove
   1581  sta droppedout
   1582  sta CharSword
   1583  sta offguard
   1584 
   1585 :done jsr animchar ;get next frame
   1586 
   1587 * WTLESS level only--kid falls into screen
   1588 
   1589  lda level
   1590  cmp #7 ;WTLESS level
   1591  bne :notsp
   1592 
   1593  lda yellowflag ;should be -
   1594  bmi :yelok
   1595  lda #$40
   1596  sta timebomb ;2nd level copy protection
   1597 :yelok
   1598  lda CharScrn
   1599  cmp #17
   1600  bne :notsp
   1601  lda #3 ;down
   1602  jsr cut
   1603 :notsp
   1604  jmp SaveKid ;save KidVars
   1605 
   1606 ]rts rts
   1607 
   1608 *-------------------------------
   1609 *
   1610 *  G R A V I T Y
   1611 *
   1612 *-------------------------------
   1613 TermVelocity = 33
   1614 AccelGravity = 3
   1615 WtlessTermVel = 4
   1616 WtlessGravity = 1
   1617 
   1618 GRAVITY
   1619  lda CharAction
   1620  cmp #4
   1621  bne ]rts
   1622 
   1623  lda weightless
   1624  bne :wtless
   1625 
   1626  lda CharYVel
   1627  clc
   1628  adc #AccelGravity
   1629 
   1630  cmp #TermVelocity
   1631  bcc :ok
   1632  lda #TermVelocity
   1633 
   1634 :ok sta CharYVel
   1635 ]rts rts
   1636 
   1637 :wtless lda CharYVel
   1638  clc
   1639  adc #WtlessGravity
   1640 
   1641  cmp #WtlessTermVel
   1642  bcc :ok
   1643  lda #WtlessTermVel
   1644  bcs :ok
   1645 
   1646 *-------------------------------
   1647 *
   1648 *  Add falling velocity
   1649 *
   1650 *-------------------------------
   1651 ADDFALL
   1652  lda CharYVel
   1653  clc
   1654  adc CharY
   1655  sta CharY
   1656 
   1657 * X-vel
   1658 
   1659  lda CharAction
   1660  cmp #4 ;freefall?
   1661  bne ]rts
   1662 
   1663  lda CharXVel
   1664  jsr addcharx
   1665  sta CharX
   1666 
   1667  jmp rereadblocks
   1668 
   1669 *-------------------------------
   1670 *
   1671 * Set initial guard posns for entire level (call once)
   1672 *
   1673 *-------------------------------
   1674 INITIALGUARDS
   1675  ldy #24 ;screen #
   1676 :loop
   1677  lda GdStartBlock-1,y
   1678  cmp #30
   1679  bcs :nogd
   1680  jsr unindex ;A = blockx
   1681  jsr getblockej
   1682  clc
   1683  adc #angle+7
   1684  sta GdStartX-1,y
   1685  lda #0
   1686  sta GdStartSeqH-1,y
   1687 
   1688 :nogd dey
   1689  bne :loop
   1690 ]rts rts
   1691 
   1692 *-------------------------------
   1693 *
   1694 * Newly dead enemy--play music (or whatever)
   1695 *
   1696 * In: Char vars
   1697 *
   1698 *-------------------------------
   1699 DEADENEMY
   1700  lda level
   1701  beq :demo
   1702  cmp #13
   1703  beq :wingame
   1704 
   1705  lda CharID
   1706  cmp #1
   1707  beq ]rts ;shadow
   1708  lda #s_Vict
   1709  ldx #25
   1710  jsr cuesong
   1711 ]rts rts
   1712 
   1713 :demo lda #1
   1714  sta milestone ;start demo, part 2
   1715  lda #0
   1716  sta PreRecPtr
   1717  sta PlayCount
   1718  rts
   1719 
   1720 :wingame lda #s_Upstairs
   1721  ldx #25
   1722  jsr cuesong
   1723 
   1724  lda #$ff ;white
   1725  sta lightcolor
   1726  lda #10
   1727  sta lightning
   1728 
   1729  lda #1
   1730  sta exitopen
   1731  lda #4
   1732  sta timerequest
   1733 
   1734  lda #24
   1735  ldx #0
   1736  ldy #0
   1737  jsr rdblock
   1738  jmp pushpp ;open exit
   1739 
   1740 *-------------------------------
   1741 *  Mirror appears (called by MOVER when exit opened)
   1742 *-------------------------------
   1743 MIRAPPEAR
   1744  do DemoDisk
   1745  rts
   1746  else
   1747 
   1748  lda level
   1749  cmp #4
   1750  bne ]rts
   1751 
   1752  lda #mirscrn
   1753  ldx #mirx
   1754  ldy #miry
   1755  jsr rdblock
   1756  lda #mirror
   1757  sta (BlueType),y
   1758  rts
   1759 
   1760  fin
   1761 
   1762 *-------------------------------
   1763  lst
   1764  ds 1
   1765  usr $a9,20,$400,*-org
   1766  lst off