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

MISC.S (13377B)


      1 * misc
      2 org = $f900
      3 DemoDisk = 0
      4  tr on
      5  lst off
      6 *-------------------------------
      7  org org
      8 
      9  jmp VANISHCHAR
     10  jmp MOVEMUSIC
     11  clc
     12  bcc MOVEAUXLC ;relocatable
     13  jmp FIRSTGUARD
     14  jmp MARKMETERS
     15 
     16  jmp POTIONEFFECT
     17  jmp MOUSERESCUE
     18  jmp STABCHAR
     19  jmp UNHOLY
     20  jmp REFLECTION
     21 
     22  jmp MARKKIDMETER
     23  jmp MARKOPPMETER
     24  jmp BONESRISE
     25  jmp DECSTR
     26  jmp DOSAVEGAME
     27 
     28  jmp LOADLEVELX
     29  jmp CHECKALERT
     30  jmp DISPVERSION
     31 
     32 *-------------------------------
     33  lst
     34  put eq
     35  lst
     36  put gameeq
     37  lst
     38  put seqdata
     39  lst
     40  put movedata
     41  lst
     42  put soundnames
     43  lst off
     44 
     45  dum $f0
     46 ]Xcount ds 1
     47 ]Xend ds 1
     48  dend
     49 
     50 *-------------------------------
     51 ALTZPon = $c009
     52 ALTZPoff = $c008
     53 RAMWRTaux = $c005
     54 RAMWRTmain = $c004
     55 RAMRDaux = $c003
     56 RAMRDmain = $c002
     57 ADSTOREon = $c001
     58 ADSTOREoff = $c000
     59 RWBANK2 = $c083
     60 RWBANK1 = $c08b
     61 
     62 POPside1 = $a9
     63 POPside2 = $ad
     64 
     65 FirstSideB = 3
     66 
     67 *-------------------------------
     68 *
     69 * Vanish character
     70 *
     71 *-------------------------------
     72 VANISHCHAR
     73  lda #86
     74  sta CharFace
     75  lda #0
     76  sta CharAction
     77  sta CharLife
     78  sec
     79  sbc OppStrength
     80  sta ChgOppStr
     81 ]rts rts
     82 
     83 *-------------------------------
     84 *
     85 *  Move a block of memory
     86 *
     87 *  In: A < X.Y
     88 *
     89 *  20 < 40.60 means 2000 < 4000.5fffm
     90 *  WARNING: If x >= y, routine will wipe out 64k
     91 *
     92 *-------------------------------
     93  dum locals
     94 ]dest ds 2
     95 ]source ds 2
     96 ]endsourc ds 2
     97  dend
     98 
     99 MOVEMEM sta ]dest+1
    100  stx ]source+1
    101  sty ]endsourc+1
    102 
    103  ldy #0
    104  sty ]dest
    105  sty ]source
    106  sty ]endsourc
    107 
    108 :loop lda (]source),y
    109  sta (]dest),y
    110  iny
    111  bne :loop
    112 
    113  inc ]source+1
    114  inc ]dest+1
    115  lda ]source+1
    116  cmp ]endsourc+1
    117  bne :loop
    118  rts
    119 
    120 *-------------------------------
    121 *
    122 * Move 1K of music data from $5000 mainmem to aux l.c.
    123 *
    124 *-------------------------------
    125 MOVEMUSIC
    126  bit RWBANK1
    127  bit RWBANK1
    128  sta RAMRDmain
    129 
    130  lda #$d0
    131  ldx #$50
    132  ldy #$54
    133  jsr MOVEMEM
    134 
    135  sta RAMRDaux
    136 ]rts rts
    137 
    138 *-------------------------------
    139 *
    140 *  Move $2000.5FFF mainmem to auxiliary language card
    141 *  Also sets interrupt vector ($FFFE.FFFF) in both l.c.'s
    142 *
    143 *  NOTE: This code is loaded into mainmem by MASTER
    144 *  and called while still in mainmem.  Once in aux l.c.
    145 *  this routine is useless!
    146 *
    147 *  Returns control to main l.c. bank 1
    148 *
    149 *-------------------------------
    150 Tmovemem = MOVEMEM-$b000
    151 
    152 MOVEAUXLC
    153  sta ALTZPon
    154  bit RWBANK2
    155  bit RWBANK2
    156 
    157  lda #$d0
    158  ldx #$20
    159  ldy #$50
    160  jsr Tmovemem
    161 
    162  bit RWBANK1
    163  bit RWBANK1
    164 
    165  lda #$d0
    166  ldx #$50
    167  ldy #$60
    168  jsr Tmovemem
    169 
    170 * & set VBL interrupts
    171 
    172  lda #vbli ;routine in GRAFIX
    173  sta $FFFE
    174  lda #>vbli
    175  sta $FFFF
    176 
    177  sta ALTZPoff
    178 
    179  lda #vbli
    180  sta $FFFE
    181  lda #>vbli
    182  sta $FFFF ;set in main l.c. too
    183 
    184  rts
    185 
    186 *-------------------------------
    187 *
    188 * Player can't run or jump past en-garde guard
    189 *
    190 *-------------------------------
    191 FIRSTGUARD
    192  lda EnemyAlert
    193  cmp #2
    194  bcc ]rts
    195  lda CharSword
    196  bne ]rts
    197  lda OpSword
    198  beq ]rts
    199  lda OpAction
    200  cmp #2
    201  bcs ]rts
    202 
    203  lda CharFace
    204  cmp OpFace
    205  beq ]rts
    206 
    207  jsr getopdist
    208  cmp #-15
    209  bcc ]rts
    210 
    211 * Bump off guard
    212 
    213  ldx CharBlockY
    214  lda FloorY+1,x
    215  sta CharY
    216  lda #bump
    217  jsr jumpseq
    218  jmp animchar
    219 
    220 *-------------------------------
    221 *
    222 * Mark strength meters
    223 *
    224 *-------------------------------
    225 Mark3 jsr Mark1 ;mark 3 blocks
    226  iny
    227 Mark2 jsr Mark1 ;mark 2 blocks
    228  iny
    229 Mark1 lda #4
    230  sta height
    231  clc
    232  lda #2
    233  jsr markwipe
    234  jmp markred
    235 
    236 MARKMETERS
    237  jsr MARKKIDMETER
    238  jmp MARKOPPMETER
    239 
    240 MARKKIDMETER
    241  ldy #20
    242  bne Mark3
    243 
    244 MARKOPPMETER
    245  ldy #28
    246  bne Mark2
    247 ]rts rts
    248 
    249 *-------------------------------
    250 *
    251 * Potion takes effect
    252 *
    253 *-------------------------------
    254 wtlesstimer = 200
    255 vibetimer = 3
    256 
    257 POTIONEFFECT
    258  lda CharID
    259  bne ]rts
    260 
    261  ldx lastpotion
    262  beq ]rts
    263  bpl :notswd
    264 
    265 * Sword (-1)
    266 
    267  lda #1
    268  sta gotsword
    269  lda #s_Sword
    270  ldx #25
    271  jsr cuesong
    272  lda #$ff
    273  sta lightcolor
    274  lda #3
    275  sta lightning ;3 white flashes
    276  rts
    277 
    278 * Recharge meter (1)
    279 
    280 :notswd cpx #1
    281  bne :2
    282 
    283  lda KidStrength
    284  cmp MaxKidStr
    285  beq ]rts ;already at full strength
    286 
    287  lda #$99
    288  sta lightcolor
    289  lda #2
    290  sta lightning ;2 orange flashes
    291  lda #s_ShortPot
    292  ldx #25
    293  jsr cuesong
    294  lda #1
    295  sta ChgKidStr
    296  rts
    297 
    298 * Boost meter (2)
    299 
    300 :2 cpx #2
    301  bne :3
    302  lda #$99
    303  sta lightcolor
    304  lda #5
    305  sta lightning ;5 orange flashes
    306  lda #s_Potion
    307  ldx #25
    308  jsr cuesong
    309  jmp boostmeter
    310 
    311 * Weightless (3)
    312 
    313 :3 cpx #3
    314  bne :4
    315  lda #s_ShortPot
    316  ldx #25
    317  jsr cuesong
    318  lda #wtlesstimer
    319  sta weightless
    320  lda #vibetimer
    321  sta vibes
    322  rts
    323 
    324 * Upside down (4)
    325 
    326 :4 cpx #4
    327  bne :5
    328  lda invert
    329  eor #$ff
    330  sta invert
    331  lda #2
    332  sta redrawflg
    333  jmp inverty
    334 
    335 * Yecch (5)
    336 
    337 :5 cpx #5
    338  bne :6
    339  lda #Splat ;yecch
    340  jsr addsound
    341  lda #-1
    342  sta ChgKidStr
    343  rts
    344 :6
    345 ]rts rts
    346 
    347 *-------------------------------
    348 *
    349 * Mouse rescues you
    350 *
    351 *-------------------------------
    352 MOUSERESCUE
    353  jsr LoadKid
    354 
    355  lda #24 ;mouse
    356  sta CharID
    357  lda #200
    358  sta CharX
    359  ldx #0
    360  stx CharBlockY
    361  lda FloorY+1,x
    362  sta CharY
    363  lda #-1
    364  sta CharFace
    365  sta CharLife
    366  lda #1
    367  sta OppStrength
    368 
    369  lda #Mscurry
    370  jsr jumpseq
    371  jsr animchar
    372 
    373  jmp SaveShad
    374 
    375 *-------------------------------
    376 *
    377 * Stab character
    378 *
    379 *-------------------------------
    380 STABCHAR
    381  lda CharLife
    382  bpl ]rts ;already dead
    383  lda CharSword
    384  cmp #2
    385  bne :DL ;defenseless
    386  lda CharID
    387  cmp #4
    388  beq :wounded ;skel has no life points
    389 
    390  lda #1
    391  jsr decstr
    392  bne :wounded
    393 
    394  ldx CharID
    395  beq :killed
    396 
    397  ldx CharID
    398  cpx #4 ;skeleton
    399  bne :killed
    400  lda #0
    401  sta ChgOppStr ;skel is invincible
    402 ]rts rts
    403 
    404 :killed jsr getbehind
    405  cmp #space
    406  bne :onground
    407  jsr getdist ;to EOB
    408  cmp #4
    409  bcc :onground
    410 ;if char is killed at edge, knock him off
    411  sec
    412  sbc #14
    413  jsr addcharx
    414  sta CharX
    415  inc CharBlockY
    416  lda #fightfall
    417  jsr jumpseq
    418  jmp :3
    419 
    420 :onground lda #stabkill
    421  bne :2
    422 
    423 :wounded lda #stabbed
    424 :2 jsr jumpseq
    425 
    426 :1 ldx CharBlockY
    427  lda FloorY+1,x
    428  sta CharY
    429  lda #0
    430  sta CharYVel
    431 
    432 :3 lda #Splat
    433  jsr addsound
    434 
    435  jmp animchar
    436 
    437 * stabbed when defenseless
    438 
    439 :DL lda #100
    440  jsr decstr
    441 
    442  lda #stabkill ;dropdead?
    443  jmp :killed
    444 
    445 *-------------------------------
    446 *
    447 * If shadow dies, you die (& vice versa)
    448 *
    449 *-------------------------------
    450 UNHOLY
    451  lda level
    452  cmp #12
    453  bne ]rts
    454 
    455  lda OpID
    456  ora CharID
    457  cmp #1 ;kid & shadow?
    458  bne ]rts
    459 
    460  lda CharLife
    461  bpl ]rts
    462  lda OpLife
    463  bmi ]rts
    464 ;live char, dead opponent
    465  lda #$ff
    466  sta lightcolor
    467  lda #5
    468  sta lightning
    469  lda #Splat
    470  jsr addsound
    471  lda #100
    472  jmp decstr
    473 ]rts rts
    474 
    475 *-------------------------------
    476 *
    477 *  R E F L E C T I O N
    478 *
    479 *-------------------------------
    480  do DemoDisk
    481 REFLECTION
    482 BONESRISE
    483  brk
    484  else
    485 
    486 REFLECTION
    487  jsr LoadKid
    488  jsr GetFrameInfo
    489 
    490  lda createshad ;flag set?
    491  cmp #$ff
    492  beq CreateShad ;yes--reflection comes to life
    493 
    494  jsr getunderft
    495  cmp #mirror ;is kid standing before mirror?
    496   bne ]rts ;no
    497 
    498  jsr getreflect ;get char data for reflection
    499 
    500  lda dmirr ;if kid is on wrong side of mirror,
    501  bmi ]rts ;don't draw reflection
    502 
    503 *  Draw kid's reflection (as a pseudo-character)
    504 
    505  jsr setupchar
    506 
    507 *  Crop edges
    508 
    509  ldx CharBlockY
    510  inx
    511  lda BlockTop,x
    512  cmp FCharY
    513  bcs ]rts
    514  sta FCharCU
    515 
    516  lda CharBlockX ;of mirror
    517  asl
    518  asl ;x 4
    519  clc
    520  adc #1
    521  sta FCharCL
    522 
    523  jmp addreflobj ;normal reflection
    524 
    525 *-------------------------------
    526 * Get char data for kid's reflection
    527 
    528 getreflect
    529  lda CharBlockX
    530  jsr getblockej
    531  clc
    532  adc #angle+3 ;fudge factor
    533  sta mirrx ;mirror x-coord (0-139)
    534 
    535  jsr getdist
    536 
    537  ldx CharFace
    538  bmi :left
    539 
    540  eor #$ff ;facing right--
    541  clc
    542  adc #14 ;get dist to back of block
    543 
    544 :left sec
    545  sbc #2 ;another fudge factor
    546  sta dmirr ;distance from mirror
    547 
    548  lda mirrx
    549  asl
    550  sec
    551  sbc CharX
    552  sta CharX ;reflection x-coord
    553 
    554  lda CharFace
    555  eor #$ff
    556  sta CharFace
    557 
    558 ]rts rts
    559 
    560 *-------------------------------
    561 * Bring reflection to life as shadowman
    562 
    563 CreateShad
    564  jsr getreflect ;get char data for reflection
    565 
    566  lda #0
    567  sta createshad
    568 
    569  lda #1 ;shadman
    570  sta CharID
    571 
    572  lda #MirrorCrack
    573  jsr addsound
    574 
    575  jsr SaveShad
    576 
    577  lda MaxKidStr
    578  sta MaxOppStr
    579  sta OppStrength
    580  lda #1
    581  sta KidStrength
    582  jmp markmeters
    583 
    584 *-------------------------------
    585 *
    586 * Bones rise
    587 *
    588 *-------------------------------
    589 skelscrn = 1
    590 skelx = 5
    591 skely = 1
    592 skeltrig = 2
    593 skelprog = 2
    594 
    595 BONESRISE
    596  lda level
    597  cmp #3
    598  bne ]rts
    599 
    600  lda ShadFace
    601  cmp #86
    602  bne ]rts
    603  lda VisScrn
    604  cmp #skelscrn
    605  bne ]rts
    606  lda exitopen
    607  beq ]rts
    608  lda KidBlockX
    609  cmp #skeltrig
    610  beq :trig
    611  cmp #skeltrig+1
    612  bne ]rts
    613 
    614 * Remove dead skeleton
    615 
    616 :trig lda VisScrn
    617  ldx #skelx
    618  ldy #skely
    619  jsr rdblock
    620  pha
    621  lda #floor
    622  sta (BlueType),y
    623  lda #24
    624  sta height
    625  lda #2
    626  jsr markred
    627  jsr markwipe
    628  iny
    629  jsr markred
    630  jsr markwipe
    631  pla
    632  cmp #bones
    633  bne ]rts
    634 
    635 * Create live skeleton
    636 
    637  lda VisScrn
    638  sta CharScrn
    639 
    640  ldx #skely
    641  stx CharBlockY
    642  lda FloorY+1,x
    643  sta CharY
    644 
    645  lda #skelx
    646  sta CharBlockX
    647  jsr getblockej
    648  clc
    649  adc #angle+7
    650  sta CharX
    651 
    652  lda #-1 ;left
    653  sta CharFace
    654 
    655  lda #arise
    656  jsr jumpseq
    657  jsr animchar
    658 
    659  lda #skelprog
    660  sta guardprog
    661 
    662  lda #-1
    663  sta CharLife
    664  lda #3
    665  sta OppStrength
    666 
    667  lda #0
    668  sta alertguard
    669  sta refract
    670  sta CharXVel
    671  sta CharYVel
    672 
    673  lda #2
    674  sta CharSword
    675 
    676  lda #4 ;skeleton
    677  sta CharID
    678 
    679  jmp SaveShad ;save ShadVars
    680 
    681  fin
    682 
    683 *-------------------------------
    684 *
    685 * Decrease strength by A (non-0)
    686 *
    687 * Out: non-0 if char lives, 0 if he dies
    688 *      ChgStrength
    689 *
    690 *-------------------------------
    691 DECSTR
    692  ldx CharID
    693  bne :enemy
    694 
    695  cmp KidStrength
    696  bcs killkid
    697 
    698  eor #$ff
    699  clc
    700  adc #1 ;negate
    701  sta ChgKidStr
    702  rts
    703 
    704 :enemy
    705  cmp OppStrength
    706  bcs killopp
    707 
    708  eor #$ff
    709  clc
    710  adc #1
    711  sta ChgOppStr
    712  rts
    713 
    714 *-------------------------------
    715 * Kill character (or opponent)
    716 * Return A = 0
    717 *-------------------------------
    718 killkid
    719  lda #0
    720  sec
    721  sbc KidStrength
    722  sta ChgKidStr
    723 
    724  lda #0
    725 ]rts rts
    726 
    727 *-------------------------------
    728 killopp
    729  lda #0
    730  sec
    731  sbc OppStrength
    732  sta ChgOppStr
    733 
    734  lda #0
    735 ]rts rts
    736 
    737 
    738 *-------------------------------
    739 * Save current game to disk
    740 *
    741 * In: SavLevel = level ($ff to erase saved game)
    742 *-------------------------------
    743 DOSAVEGAME
    744  lda level
    745  cmp #FirstSideB
    746  bcs :doit ;must have reached side B
    747  lda #Splat
    748  jmp addsound
    749 :doit
    750 
    751 * Put data into save-game data area
    752 
    753  lda origstrength
    754  sta SavStrength
    755 
    756  lda FrameCount
    757  sta SavTimer
    758  lda FrameCount+1
    759  sta SavTimer+1
    760 
    761  lda NextTimeMsg
    762  sta SavNextMsg
    763 
    764 * Write to disk
    765 
    766  jmp savegame
    767 
    768 *-------------------------------
    769 * alt bg & char set list
    770 * Level #:      0  1  2  3  4  5  6  7  8  9 10 11 12 13 14
    771 
    772 bgset1 db 00,00,00,00,01,01,01,02,02,02,01,01,02,02,01
    773 bgset2 db 00,00,00,00,01,01,01,02,02,02,01,01,02,02,01
    774 chset db 00,00,00,01,02,02,03,02,02,02,02,02,04,05,05
    775 
    776 * blueprint track & region lists (indexed by level #)
    777 * NOTE--make sure these match lists in DIALOGER
    778 
    779 bluepTRKlst
    780  db 33,33,32         ;3 levels on side A
    781  db 33,33,32,32,31,31   ;12 levels on side B
    782  db 30,30,29,29,28,28
    783 
    784 bluepREGlst
    785  db 0,1,1
    786  db 0,1,0,1,0,1
    787  db 0,1,0,1,0,1
    788 
    789 *-------------------------------
    790 *
    791 * Load level from disk
    792 * In: X = level # (0-14)
    793 *
    794 *-------------------------------
    795 LOADLEVELX
    796  lda bluepTRKlst,x
    797  sta bluepTRK
    798  lda bluepREGlst,x
    799  sta bluepREG
    800 
    801  lda bgset1,x ;A
    802  pha
    803  lda bgset2,x ;X
    804  ldy chset,x ;Y
    805  tax
    806  pla
    807 
    808  jmp loadlevel ;in MASTER
    809 ]rts rts
    810 
    811 *-------------------------------
    812 *
    813 * In: Kid & Shad data
    814 * Out: EnemyAlert
    815 *   2: kid & shad are on same stretch of floor
    816 *   1: slicer, gaps in floor, or other obstacles, but
    817 *      line of sight is clear
    818 *   0: can't see each other
    819 *
    820 *-------------------------------
    821 gfightthres = 28*4
    822 
    823 ]safe lda #0
    824  sta EnemyAlert
    825 ]rts rts
    826 
    827 CHECKALERT
    828  lda ShadID
    829  cmp #24 ;mouse?
    830  beq ]rts
    831  cmp #1 ;shadowman?
    832  bne :notshad
    833  lda level
    834  cmp #12
    835  bne ]safe ;fight shadow only on level 12
    836 
    837 :notshad
    838  lda KidPosn
    839  beq ]safe
    840  cmp #219
    841  bcc :noclimb
    842  cmp #229
    843  bcc ]safe ;on staircase
    844 :noclimb
    845  lda ShadFace
    846  cmp #86
    847  beq ]safe
    848 
    849  lda KidLife
    850  and ShadLife
    851  bpl ]safe ;one is dead
    852 
    853  lda KidScrn
    854  cmp ShadScrn
    855  bne ]safe
    856 
    857  lda KidBlockY
    858  cmp ShadBlockY
    859  bne ]safe
    860 
    861  lda #2 ;clear path
    862  sta EnemyAlert
    863 
    864 * Get range of blocks to scan (]Xcount --> ]Xend)
    865 
    866  lda KidBlockX
    867  jsr getblockej
    868  clc
    869  adc #7 ;middle of block
    870  sta ]Xcount
    871 
    872  lda ShadBlockX
    873  jsr getblockej
    874  clc
    875  adc #7
    876  sta ]Xend
    877 
    878  do 0
    879  lda ]Xcount
    880  jsr getblockxp
    881  ldx #1
    882  jsr showpage
    883  lda ]Xend
    884  jsr getblockxp
    885  ldx #2
    886  jsr showpage
    887  fin
    888 
    889  lda ]Xend
    890  cmp ]Xcount
    891  bcs :cont
    892  tax
    893  lda ]Xcount
    894  sta ]Xend
    895  stx ]Xcount
    896 :cont
    897 
    898 * If leftmost block is a slicer, skip it
    899 
    900  lda ]Xcount
    901  jsr :rdblock
    902  cmp #slicer
    903  bne :1
    904  lda #14
    905  clc
    906  adc ]Xcount
    907  sta ]Xcount
    908 
    909 * If rightmost block is a gate, skip it
    910 
    911 :1 lda ]Xend
    912  jsr :rdblock
    913  cmp #gate
    914  bne :20
    915  lda ]Xend
    916  sec
    917  sbc #14
    918  sta ]Xend
    919 
    920 :20 lda ]Xend
    921  cmp ]Xcount
    922  bcc :rts
    923 
    924 * Scan from ]Xcount to ]Xend (left to right)
    925 
    926  lda ]Xcount
    927 :loop cmp ]Xend
    928  beq :9
    929  bcs :rts
    930 
    931 :9 jsr :rdblock
    932 
    933  cmp #block
    934  beq :safe
    935  cmp #panelwif
    936  beq :safe
    937  cmp #panelwof
    938  beq :safe ;solid barrier blocks view
    939 
    940  cmp #loose
    941  beq :view
    942  cmp #gate
    943  bne :2
    944  lda (BlueSpec),y
    945  cmp #gfightthres
    946  bcs :clear
    947  bcc :view
    948 
    949 :2 cmp #slicer
    950  beq :view
    951 
    952  jsr cmpspace
    953  bne :clear ;closed gate, slicer, gap in floor, etc.
    954 ;are obstacles but don't block view
    955 :view lda #1
    956  sta EnemyAlert
    957 
    958 :clear lda ]Xcount
    959  clc
    960  adc #14
    961  sta ]Xcount
    962  bne :loop
    963 :rts
    964 ]rts rts
    965 
    966 :safe lda #0
    967  sta EnemyAlert
    968 ]rts rts
    969 
    970 *-------------------------------
    971 * In: A = X-coord
    972 * Out: rdblock results
    973 *-------------------------------
    974 :rdblock jsr getblockxp
    975  tax
    976  ldy KidBlockY
    977  lda KidScrn
    978  jmp rdblock
    979 
    980 *-------------------------------
    981 *
    982 *  Display version # on text page 1 (& wait for keypress)
    983 *
    984 *-------------------------------
    985 DISPVERSION
    986  lda #" "
    987  jsr lrcls
    988 
    989  sta RAMWRTmain
    990 
    991  ldx #0
    992 :loop lda textline,x
    993  cmp #"@"
    994  beq :done
    995  sta $400,x ;top line of screen
    996  inx
    997  bpl :loop
    998 :done
    999  lda RAMWRTaux
   1000  sta $c054 ;PAGE2 off
   1001  sta $c051 ;TEXT on
   1002 
   1003 * Wait for keypress
   1004 
   1005 :wloop lda $c000
   1006  bpl :wloop
   1007  sta $c010
   1008 
   1009  lda $c057 ;HIRES on
   1010  lda $c050 ;TEXT off
   1011  lda PAGE
   1012  bne :1
   1013  lda $c055 ;PAGE2 on
   1014 :1
   1015  lda #" "
   1016  jmp lrcls
   1017 
   1018 *-------------------------------
   1019  lst
   1020  ds 1
   1021  usr $a9,21,$b00,*-org
   1022  lst off