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

GAMEBG.S (16050B)


      1 * gamebg
      2 ThreeFive = 1
      3 EditorDisk = 0
      4 org = $4c00
      5  tr on
      6  lst off
      7  lstdo off
      8 *-------------------------------
      9 *
     10 *  PRINCE OF PERSIA
     11 *  Copyright 1989 Jordan Mechner
     12 *
     13 *-------------------------------
     14  org org
     15 
     16  jmp UPDATEMETERS
     17  jmp DRAWKIDMETER
     18  jmp DRAWSWORD
     19  jmp DRAWKID
     20  jmp DRAWSHAD
     21 
     22  jmp SETUPFLAME
     23  jmp CONTINUEMSG
     24  jmp ADDCHAROBJ
     25  jmp SETOBJINDX
     26  jmp PRINTLEVEL
     27 
     28  jmp DRAWOPPMETER
     29  jmp FLIPDISKMSG
     30  jmp TIMELEFTMSG
     31  jmp DRAWGUARD
     32  jmp DRAWGUARD
     33 
     34  jmp SETUPFLASK
     35  jmp SETUPCOMIX
     36  jmp PSETUPFLAME
     37  jmp DRAWPOST
     38  jmp DRAWGLASS
     39 
     40  jmp INITLAY
     41  jmp TWINKLE
     42  jmp FLOW
     43  jmp PMASK
     44  jmp YELLOW
     45 
     46  jmp SETRECHECK0
     47  jmp RECHECKYEL
     48  ds 3
     49  ds 3
     50  ds 3
     51 
     52 *-------------------------------
     53  lst
     54  put eq
     55  lst
     56  put gameeq
     57  lst off
     58 
     59 *-------------------------------
     60 *
     61 * 2nd level copy protection
     62 * signature check routine
     63 *
     64 *-------------------------------
     65  do ThreeFive
     66 YELLOW lda #$80
     67  sta yellowflag
     68  rts
     69 
     70  else
     71  put ryellow1
     72  fin
     73 
     74 *-------------------------------
     75  lst
     76  put movedata
     77  lst off
     78 
     79 *-------------------------------
     80  dum locals
     81 
     82 xsave ds 1
     83 addr ds 2
     84 temp ds 1
     85 
     86  dend
     87 
     88 tempsave ds $10
     89 
     90 *-------------------------------
     91 * Strength meters
     92 
     93 KidStrX db 00,01,02,03,04,05,06,08,09,10,11,12
     94 KidStrOFF db 00,01,02,03,04,05,06,00,01,02,03,04
     95 
     96 OppStrX db 39,38,37,36,35,34,32,31,30,29,28,27
     97 OppStrOFF db 05,04,03,02,01,00,06,05,04,03,02,01
     98 
     99 bullet = $88 ;in bgtable2
    100 blank = $8c
    101 bline hex 89,8a,8b
    102 
    103 *-------------------------------
    104 * Post in Princess's room
    105 
    106 postx = 31
    107 posty = 152
    108 postimg = $c ;chtable6
    109 
    110 *-------------------------------
    111 * Stars outside Princess's window
    112 
    113 starx = 2
    114 stary hex 62,65,6d,72
    115 stari hex 2a,2b,2b,2a ;chtable6
    116 
    117 *-------------------------------
    118 * Hourglass
    119 
    120 glassx = 19
    121 glassy = 151
    122 glassimg hex 15,0d,0e,0f,10,11,12,13,14 ;chtable6
    123 sandht db 0,1,2,3,4,5,6,7
    124 
    125 flowx = glassx+1
    126 flowy = glassy-2
    127 flowimg hex 16,17,18 ;chtable6
    128 
    129 *-------------------------------
    130 * Masks for Princess's face & hair
    131 
    132 pmaskdx hex 00,00
    133 pmaskdy db -4,-33
    134 pmaski hex 2c,22
    135 
    136 *-------------------------------
    137 * Comix
    138 
    139 starimage = $41
    140 startable = 0 ;chtable1
    141 
    142 *-------------------------------
    143 * Torch animation frames
    144 *               0  1  2  3  4  5  6  7  8  9 10 11
    145 *              12 13 14 15 16 17
    146 
    147 torchflame hex 52,53,54,55,56,61,62,63,64,52,54,56
    148  hex 63,61,55,53,64,62
    149 
    150 ptorchflame db 1,2,3,4,5,6,7,8,9,3,5,7,1,4,9,2,8,6
    151 
    152 *-------------------------------
    153 * Bubbling flask frames
    154 *               0  1  2  3  4  5  6  7  8  9 10 11
    155 
    156 bubble hex b2,af,b0,b1,b0,af,b1,b0,af
    157 
    158 *-------------------------------
    159 * Message data: YCO, XCO, OFFSET, IMAGE
    160 
    161 my = 90
    162 lowmy = 153
    163 hiconty = 73
    164 lowconty = 168
    165 
    166 contbox db hiconty,13,0,$7c ;Press button to continue
    167 msgbox db my,15,0,$7b ;Empty message box
    168 levelmsg db my-5,16,3,$7a ;"Level"
    169 flipbox db my-1,13,0,$7e ;Turn disk over
    170 timeleft db my,11,0,$7d ;Minutes left
    171 seconds db my-5,14,0,$7f ;"Seconds"
    172 
    173 *-------------------------------
    174 * Numbers (0-12)
    175 
    176 digit1 hex 00,00,00,00,00,00,00,00,00,00
    177  hex 71,71,71
    178 
    179 digit2 hex 70,71,72,73,74,75,76,77,78,79
    180  hex 70,71,72
    181 
    182 *-------------------------------
    183 * Print "XX Minutes Left"
    184 *-------------------------------
    185 ]rts rts
    186 
    187 TIMELEFTMSG
    188  lda #timeleft
    189  ldx #>timeleft
    190  jsr setupimage
    191 
    192  lda MinLeft
    193  cmp #2
    194  bcs :ok
    195  lda KidAction
    196  cmp #3
    197  beq :ok
    198  cmp #4
    199  beq :ok ;falling
    200  lda KidBlockY
    201  cmp #1
    202  bne :ok
    203  lda #lowmy
    204  sta YCO ;keep msg box out of kid's way
    205 :ok jsr superim1
    206 
    207  lda YCO
    208  sec
    209  sbc #5
    210  sta YCO
    211 
    212  lda XCO
    213  clc
    214  adc #1
    215  sta XCO
    216  lda #0
    217  sta OPACITY
    218 
    219  lda #ora
    220  sta OPACITY
    221 
    222  jsr getminleft
    223 
    224  lda MinLeft ;BCD byte (e.g., $55 = 55 minutes)
    225  cmp #2
    226  bcs :1
    227  lda SecLeft
    228 :1 sta temp
    229  lsr
    230  lsr
    231  lsr
    232  lsr
    233  beq :skip1st
    234  tax
    235  lda digit2,x ;1st digit
    236  sta IMAGE
    237 
    238  jsr addmsg
    239 
    240 :skip1st lda XCO
    241  clc
    242  adc #1
    243  sta XCO
    244 
    245  lda temp
    246  and #$f
    247  tax
    248  lda digit2,x ;2nd digit
    249  sta IMAGE
    250 
    251  jsr addmsg
    252 
    253 * Minutes or seconds?
    254 
    255  lda MinLeft
    256  cmp #2
    257  bcs ]rts
    258 
    259  lda YCO
    260  pha
    261  lda #seconds
    262  ldx #>seconds
    263  jsr setupimage
    264  pla
    265  sta YCO
    266  lda #sta
    267  sta OPACITY
    268  jmp addmsg ;replace "minutes" with "seconds"
    269 
    270 *-------------------------------
    271 * Print "Level XX"
    272 *-------------------------------
    273 ]rts rts
    274 
    275 PRINTLEVEL
    276  lda #msgbox
    277  ldx #>msgbox
    278  jsr superimage
    279 
    280  lda #levelmsg
    281  ldx #>levelmsg
    282  jsr setupimage
    283 
    284  jsr getlevelno
    285  cpx #10
    286  bcc :1
    287  lda #0
    288  sta OFFSET
    289 :1
    290  lda #ora
    291  sta OPACITY
    292  jsr addmsg
    293 
    294  lda XCO
    295  clc
    296  adc #6
    297  sta XCO
    298 
    299  jsr getlevelno ;X = level # (0-12)
    300  lda digit1,x ;1st digit
    301  beq :skip1st
    302  sta IMAGE
    303 
    304  lda #ora
    305  sta OPACITY
    306  jsr addmsg
    307 
    308  lda XCO
    309  clc
    310  adc #1
    311  sta XCO
    312 
    313  jsr getlevelno
    314 :skip1st lda digit2,x ;2nd digit
    315  sta IMAGE
    316 
    317  lda #ora
    318  sta OPACITY
    319  jmp addmsg
    320 
    321 *-------------------------------
    322 getlevelno
    323  ldx level
    324  cpx #13
    325  bcc :ok
    326  ldx #12
    327 :ok
    328 ]rts rts
    329 
    330 *-------------------------------
    331 * Superimpose "Press button to continue" message
    332 *-------------------------------
    333 CONTINUEMSG
    334  lda #contbox
    335  ldx #>contbox
    336  jsr setupimage
    337 
    338  lda KidBlockX
    339  and #1
    340  bne :1
    341  lda #lowconty
    342  sta YCO
    343 :1 jmp superim1
    344 
    345 *-------------------------------
    346 * Superimpose "Turn disk over" message
    347 *-------------------------------
    348 FLIPDISKMSG
    349  lda #flipbox
    350  ldx #>flipbox
    351  jmp superimage
    352 
    353 *-------------------------------
    354 * Superimpose image (using layrsave)
    355 *-------------------------------
    356 superimage
    357  jsr setupimage
    358 superim1
    359  lda #sta.$40
    360  sta OPACITY
    361  jmp addmsg
    362 
    363 *-------------------------------
    364 * Set up image
    365 *
    366 * In: A-X = image data addr
    367 * Out: XCO, YCO, IMAGE
    368 *-------------------------------
    369 setupimage
    370  sta addr
    371  stx addr+1
    372 
    373  ldy #0
    374  lda (addr),y
    375  sta YCO
    376  iny
    377  lda (addr),y
    378  sta XCO
    379  iny
    380  lda (addr),y
    381  sta OFFSET
    382  iny
    383  lda (addr),y
    384  sta IMAGE
    385 ]rts
    386 :rts rts
    387 
    388 *-------------------------------
    389 * Draw Kid
    390 *-------------------------------
    391 DRAWKID
    392  lda backtolife
    393  beq :2
    394  lda PAGE
    395  beq ]rts ;flash when coming back to life
    396 
    397 :2 lda mergetimer
    398  bmi :1
    399  and #1
    400  beq :1
    401  jmp DrawEored ;flash between kid & shadowman
    402 
    403 :1 jmp DrawNormal
    404 
    405 *-------------------------------
    406 * Draw Sword
    407 *-------------------------------
    408 DRAWSWORD
    409  jmp DrawNormal
    410 
    411 *-------------------------------
    412 * Draw Shadowman
    413 *-------------------------------
    414 DRAWSHAD
    415  jmp DrawEored
    416 
    417 *-------------------------------
    418 * Draw Guard
    419 *-------------------------------
    420 DRAWGUARD
    421  do EditorDisk
    422  lda #EditorDisk
    423  cmp #2
    424  beq DrawNormal
    425  fin
    426 
    427  lda GuardColor ;set by "ADDGUARD" in AUTO
    428  beq DrawNormal
    429  bne DrawShifted
    430 
    431 *-------------------------------
    432 DrawNormal
    433  lda #mask
    434  sta OPACITY
    435 
    436  lda #UseLayrsave.$80
    437  jmp addmid
    438 
    439 ]rts rts
    440 
    441 *-------------------------------
    442 DrawShifted
    443  lda #1
    444  jsr chgoffset
    445 
    446  lda #mask
    447  sta OPACITY
    448 
    449  lda #UseLayrsave.$80
    450  jmp addmid
    451 
    452 *-------------------------------
    453 DrawEored
    454  lda #eor
    455  sta OPACITY
    456 
    457  lda #UseLayrsave.$80
    458  jmp addmid
    459 
    460 *-------------------------------
    461 chgoffset
    462  clc
    463  adc OFFSET
    464  cmp #7
    465  bcc :1
    466 
    467  inc XCO
    468  sec
    469  sbc #7
    470 
    471 :1 sta OFFSET
    472  rts
    473 
    474 *-------------------------------
    475 *
    476 * Update strength meters
    477 *
    478 *-------------------------------
    479 UPDATEMETERS
    480  lda redkidmeter
    481  beq :1
    482 
    483  jsr DrawKidMeter
    484 
    485 :1 lda redoppmeter
    486  beq ]rts
    487 
    488  jmp DrawOppMeter
    489 ]rts rts
    490 
    491 *-------------------------------
    492 *
    493 * Draw kid's strength meter at lower left
    494 *
    495 *-------------------------------
    496 DRAWKIDMETER
    497  lda inbuilder
    498  bne ]rts
    499 
    500  lda #191
    501  sta YCO
    502  lda #sta
    503  sta OPACITY
    504 
    505  ldx #0
    506  stx xsave ;# of bullets drawn so far
    507 
    508 :loop lda KidStrength
    509  sec
    510  sbc xsave ;# of bullets left to draw
    511  beq :darkpart
    512  cmp #4
    513  bcs :draw3
    514  cmp #3
    515  bcs :draw2
    516  cmp #2
    517  bcc :drawlast
    518 ;Draw 1 bullet
    519 :draw1 ldy #1
    520  bne :drline
    521  ;Draw 2 bullets
    522 :draw2 ldy #2
    523  bne :drline
    524 ;Draw 3 bullets
    525 :draw3 ldy #3
    526  bne :drline
    527 
    528 :drawlast lda KidStrength
    529  cmp #2
    530  bcs :steady
    531  lda PAGE
    532  beq :skip ;flashes when down to 1
    533 :steady lda #bullet
    534  ldy #1
    535  jsr :draw
    536 :skip jmp :darkpart
    537 
    538 * Draw line of 1-3 bullets
    539 
    540 :drline lda bline-1,y ;image #
    541  jsr :draw
    542  jmp :loop
    543 
    544 :draw sta IMAGE
    545  ldx xsave
    546  tya
    547  clc
    548  adc xsave
    549  sta xsave
    550 
    551 * In: IMAGE; x = unit # (0 = leftmost)
    552 
    553 :drawimg lda KidStrX,x
    554  sta XCO
    555  lda KidStrOFF,x
    556  sta OFFSET
    557  jmp addmsg
    558 
    559 * Draw blanks to limit of MaxKidStr
    560 
    561 :darkpart
    562  lda #and
    563  sta OPACITY
    564  lda #blank
    565  sta IMAGE
    566 :dloop ldx xsave
    567  cpx MaxKidStr
    568  bcs ]rts
    569  jsr :drawimg
    570  inc xsave
    571  bne :dloop
    572 ]rts rts
    573 
    574 *-------------------------------
    575 *
    576 * Draw opp's strength meter at lower right
    577 *
    578 *-------------------------------
    579 DRAWOPPMETER
    580  lda inbuilder
    581  bne ]rts
    582 
    583  lda OppStrength
    584  beq ]rts
    585 
    586  lda ShadID
    587  cmp #24 ;mouse
    588  beq ]rts
    589  cmp #4 ;skel
    590  beq ]rts
    591  cmp #1 ;shadow
    592  bne :1
    593  lda level
    594  cmp #12
    595  bne ]rts ;shad strength shows only on level 12
    596 :1
    597  lda #191
    598  sta YCO
    599  lda #sta.$80 ;mirror
    600  sta OPACITY
    601 
    602  ldx #0
    603  stx xsave ;# of bullets drawn so far
    604 
    605 :loop lda OppStrength
    606  sec
    607  sbc xsave ;# of bullets left to draw
    608  beq :darkpart
    609  cmp #4
    610  bcs :draw3
    611  cmp #3
    612  bcs :draw2
    613  cmp #2
    614  bcc :drawlast
    615 ;Draw 1 bullet
    616 :draw1 ldy #1
    617  bne :drline
    618  ;Draw 2 bullets
    619 :draw2 ldy #2
    620  bne :drline
    621 ;Draw 3 bullets
    622 :draw3 ldy #3
    623  bne :drline
    624 
    625 :drawlast lda OppStrength
    626  cmp #2
    627  bcs :steady
    628  lda PAGE
    629  beq :darkpart ;flashes when down to 1
    630 :steady lda #bullet
    631  ldy #1
    632  jmp :draw
    633 
    634 * Draw line of 1-3 bullets
    635 
    636 :drline lda bline-1,y ;image #
    637  jsr :draw
    638  jmp :loop
    639 
    640 :draw sta IMAGE
    641  ldx xsave
    642  tya
    643  clc
    644  adc xsave
    645  sta xsave
    646 
    647 :drawimg lda OppStrX,x
    648  sta XCO
    649  lda OppStrOFF,x
    650  sta OFFSET
    651  jmp addmsg
    652 
    653 :darkpart
    654  lda #and.$80
    655  sta OPACITY
    656  lda #blank
    657  sta IMAGE
    658  ldx xsave
    659  jmp :drawimg
    660 
    661 *-------------------------------
    662 *
    663 * Set up to draw bubbling flask
    664 *
    665 * In/out: same as SETUPFLAME
    666 *
    667 *-------------------------------
    668 EmptyPot = 0
    669 RefreshPot = %00100000
    670 BoostPot = %01000000
    671 MystPot = %01100000
    672 
    673 boffset = 2
    674 
    675 SETUPFLASK
    676  lda #boffset
    677  sta OFFSET
    678 
    679  txa
    680  and #%11100000
    681  cmp #EmptyPot
    682  beq :0
    683  cmp #BoostPot
    684  beq :tall ;special flask (taller)
    685  bcc :cont
    686 
    687  inc OFFSET ;mystery potion (blue)
    688 
    689 :tall lda YCO
    690  sec
    691  sbc #4
    692  sta YCO
    693 
    694 :cont txa
    695  and #%00011111
    696  tax
    697  cpx #bubbLast+1
    698  bcc :ok
    699  ldx #0
    700 :ok lda bubble,x
    701  sta IMAGE
    702 
    703  inc XCO
    704  inc XCO
    705 
    706  lda YCO
    707  sec
    708  sbc #14
    709  sta YCO
    710 
    711  lda #sta
    712  sta OPACITY
    713 
    714  lda #bgtable2
    715  sta TABLE
    716  lda #>bgtable2
    717  sta TABLE+1
    718 
    719 ]rts rts
    720 
    721 :0 ldx #0
    722  beq :ok
    723 
    724 *-------------------------------
    725 *
    726 * Setup to draw flame
    727 *
    728 * In: XCO = blockxco
    729 *     YCO = Ay
    730 *     X   = spreced
    731 *
    732 * Out: ready to call ADDBACK (or FASTLAY)
    733 *
    734 *-------------------------------
    735 SETUPFLAME
    736  cpx #torchLast+1
    737  bcs ]rts
    738 
    739  lda torchflame,x
    740  sta IMAGE
    741 
    742  inc XCO
    743 
    744  lda YCO
    745  sec
    746  sbc #43
    747  sta YCO
    748 
    749  lda #sta
    750  sta OPACITY
    751 
    752  lda #bgtable1
    753  sta TABLE
    754  lda #>bgtable1
    755  sta TABLE+1
    756 
    757 ]rts rts
    758 
    759 *-------------------------------
    760 *
    761 * Setup to draw flame (Princess's room)
    762 *
    763 * In: XCO, YCO; X = frame #
    764 * Out: Ready to call ADDMID or LAY
    765 *
    766 *-------------------------------
    767 PSETUPFLAME
    768  cpx #torchLast+1
    769  bcs ]rts
    770 
    771  lda ptorchflame,x
    772  sta IMAGE
    773 
    774  lda #sta
    775  sta OPACITY
    776 
    777  jsr initlay
    778 
    779 ]setch6 lda #chtable6
    780  sta TABLE
    781  lda #>chtable6
    782  sta TABLE+1
    783 
    784 ]rts rts
    785 
    786 *-------------------------------
    787 *
    788 * Twinkle one of the stars outside Princess's window
    789 * (Update it directly on both screens)
    790 *
    791 * In: X = star # (0-3)
    792 *
    793 *-------------------------------
    794 TWINKLE
    795  lda #starx
    796  sta XCO
    797  lda stary,x
    798  sta YCO
    799  lda stari,x
    800  sta IMAGE
    801  lda #eor
    802  sta OPACITY
    803  jsr ]setch6
    804  jsr fastlay ;<--DIRECT HIRES CALL
    805  lda PAGE
    806  eor #$20
    807  sta PAGE ;& on other page
    808  jsr fastlay
    809  lda PAGE
    810  eor #$20
    811  sta PAGE
    812  rts
    813 
    814 *-------------------------------
    815 *
    816 * Draw big white post in Princess's room
    817 *
    818 *-------------------------------
    819 DRAWPOST
    820  lda #postx
    821  sta XCO
    822  lda #posty
    823  sta YCO
    824  lda #postimg
    825  sta IMAGE
    826  lda #ora
    827  sta OPACITY
    828  jsr ]setch6
    829  jmp addfore
    830 
    831 *-------------------------------
    832 *
    833 * Draw hourglass in Princess's room
    834 *
    835 * In: X = glass state (0-8, 0 = full)
    836 *
    837 *-------------------------------
    838 DRAWGLASS
    839  lda #glassx
    840  sta XCO
    841  lda #glassy
    842  sta YCO
    843  lda glassimg,x
    844  sta IMAGE
    845  lda #sta
    846  sta OPACITY
    847  jsr ]setch6
    848  jmp addback
    849 
    850 *-------------------------------
    851 *
    852 * Mask princess's face & hair for certain CharPosns
    853 *
    854 * (Called after ADDCHAROBJ)
    855 *
    856 *-------------------------------
    857 PMASK
    858  ldx CharPosn
    859  cpx #19 ;plie
    860  bne :1
    861  ldx #0
    862  bpl :mask
    863 :1 cpx #1 ;pslump-1
    864  beq :m1
    865  cpx #18 ;pslump-2
    866  bne :2
    867 :m1 ldx #1
    868  bpl :mask
    869 :2
    870 
    871 ]rts rts
    872 
    873 :mask
    874  lda FCharY
    875  clc
    876  adc pmaskdy,x
    877  sta YCO
    878 
    879  lda XCO
    880  clc
    881  adc pmaskdx,x
    882  sta XCO
    883 
    884  lda pmaski,x
    885  sta IMAGE
    886 
    887  lda #5 ;chtable6
    888  sta TABLE
    889 
    890  lda #and
    891  sta OPACITY
    892  lda #UseLayrsave.$80
    893  jmp addmid
    894 
    895 *-------------------------------
    896 * If failed copy prot check due to disk not in drive, recheck
    897 * In: a = 0 (Call after setrecheck0)
    898 *-------------------------------
    899 RECHECKYEL
    900  sta tempblockx
    901  sta tempblocky
    902  jsr indexblock ;set y = 0
    903  lda (locals),y ;All of this just to hide "lda recheck0"!
    904  beq ]rts
    905  ldx #5
    906  jsr yellow
    907  lda #$ff
    908  rts
    909 
    910 *-------------------------------
    911 *
    912 * Draw sand flowing through hourglass
    913 *
    914 * In: X = frame # (0-3)
    915 *     Y = hourglass state (0-8)
    916 *
    917 *-------------------------------
    918 FLOW
    919  cpy #8
    920  bcs ]rts ;glass is empty
    921  jsr initlay
    922  lda #glassy
    923  sec
    924  sbc sandht,y
    925  sta BOTCUT
    926  lda flowimg,x
    927  sta IMAGE
    928  lda #flowx
    929  sta XCO
    930  lda #0
    931  sta OFFSET
    932  lda #flowy
    933  sta YCO
    934  lda #sta
    935  sta OPACITY
    936  jsr ]setch6
    937  jmp lay ;<---DIRECT HIRES CALL
    938 
    939 *-------------------------------
    940 * Save/restore FCharVars
    941 
    942 saveFChar
    943  ldx #$f
    944 :loop lda FCharVars,x
    945  sta tempsave,x
    946  dex
    947  bpl :loop
    948  rts
    949 
    950 restoreFChar
    951  ldx #$f
    952 :loop lda tempsave,x
    953  sta FCharVars,x
    954  dex
    955  bpl :loop
    956 ]rts rts
    957 
    958 *-------------------------------
    959 *
    960 * Draw "comix" star
    961 *
    962 * In: Char data
    963 *
    964 *-------------------------------
    965 SETUPCOMIX
    966  jsr saveFChar
    967  jsr :sub
    968  jmp restoreFChar
    969 
    970 :sub lda #$ff
    971  sta FCharIndex
    972 
    973 * Get y-coord
    974 
    975  lda CharPosn
    976  cmp #185 ;dead
    977  beq :low
    978  cmp #177 ;impaled
    979  beq :imp
    980  cmp #106
    981  bcc :80
    982  cmp #111 ;crouching
    983  bcc :low
    984 :80 cmp #178 ;halved
    985  beq ]rts
    986 
    987  lda #-15
    988  ldx CharID
    989  beq :3
    990  lda #-11 ;kid strikes lower than opponent
    991 :3 clc
    992  adc FCharY
    993  sta FCharY
    994  jmp :8
    995 
    996 :low lda #4
    997  clc
    998  adc FCharY
    999  sta FCharY
   1000  jmp :8
   1001 
   1002 * Get x-coord
   1003 
   1004 :imp lda #-5 impaled
   1005  bne :9
   1006 :8 lda #5
   1007 :9 jsr addfcharx
   1008 
   1009 * Get color (kid red, opps blue)
   1010 
   1011  lda CharID
   1012  beq :2 ;kid: 0
   1013  lda #1 ;opponents: 1
   1014 :2
   1015  eor FCharX
   1016  eor FCharFace
   1017  and #1 ;look only at low bits
   1018  bne :1
   1019  inc FCharX
   1020  bne :1
   1021  inc FCharX+1
   1022 :1
   1023  lda #starimage
   1024  sta FCharImage
   1025  lda #startable
   1026  sta FCharTable
   1027 
   1028  lda #0
   1029  sta FCharCU
   1030  sta FCharCL
   1031  lda #40
   1032  sta FCharCR
   1033  lda #192
   1034  sta FCharCD
   1035 
   1036  lda #TypeComix
   1037  jmp addcharobj
   1038 ]rts rts
   1039 
   1040 *-------------------------------
   1041 *
   1042 *  A D D   C H A R   O B J
   1043 *
   1044 *  Add a character to object table
   1045 *
   1046 *  In: FCharVars
   1047 *      A = object type
   1048 *
   1049 *-------------------------------
   1050 ADDCHAROBJ
   1051  ldx objX ;# objects already in list
   1052  inx
   1053  cpx #maxobj
   1054  bcs ]rts ;list full (shouldn't happen)
   1055  stx objX
   1056 
   1057  sta objTYP,x
   1058 
   1059  lda FCharX
   1060  sta XCO
   1061  lda FCharX+1
   1062  sta OFFSET
   1063 
   1064  txa
   1065  pha
   1066  jsr cvtx ;from 280-res to byte/offset
   1067  pla
   1068  tax
   1069 
   1070  lda XCO
   1071  sta objX,x
   1072  lda OFFSET
   1073  sta objOFF,x
   1074 
   1075  lda FCharY
   1076  sta objY,x
   1077 
   1078  lda FCharCU
   1079  sta objCU,x
   1080  lda FCharCL
   1081  sta objCL,x
   1082  lda FCharCR
   1083  sta objCR,x
   1084  lda FCharCD
   1085  sta objCD,x
   1086 
   1087  lda FCharImage
   1088  sta objIMG,x
   1089 
   1090  lda FCharTable
   1091  sta objTAB,x
   1092 
   1093  lda FCharFace
   1094  sta objFACE,x
   1095 
   1096  jmp SETOBJINDX
   1097 
   1098 *-------------------------------
   1099 *
   1100 *  S E T  O B J  I N D X
   1101 *
   1102 *  Set object index
   1103 *
   1104 *-------------------------------
   1105 SETOBJINDX
   1106  lda FCharIndex
   1107  sta objINDX,x
   1108 
   1109  cmp #30
   1110  bcs :os
   1111 
   1112  tax
   1113 
   1114  lda #1
   1115  sta objbuf,x
   1116 :os
   1117  rts
   1118 
   1119 *-------------------------------
   1120 *
   1121 * Text routines
   1122 *
   1123 * NOTE: These routines bypass normal data structures
   1124 * & write directly to hi-res page.
   1125 *
   1126 * Call at end of DRAWALL to make sure text goes on top
   1127 * of everything else.
   1128 *
   1129 *-------------------------------
   1130 *
   1131 * Call once before using other text routines
   1132 *
   1133 *-------------------------------
   1134 pretext
   1135  jsr initlay
   1136 
   1137  lda #bgtable2
   1138  sta TABLE
   1139  lda #>bgtable2
   1140  sta TABLE+1
   1141  rts
   1142 
   1143 *-------------------------------
   1144 * Part of "Yellow" copy-protection
   1145 
   1146 SETRECHECK0
   1147  lda #recheck0
   1148  sta locals
   1149  lda #>recheck0
   1150  sta locals+1 ;fall thru (& return A = 0)
   1151 
   1152 *-------------------------------
   1153 INITLAY
   1154  lda #3 ;auxmem
   1155  sta BANK
   1156 
   1157  lda #40
   1158  sta RIGHTCUT
   1159  lda #192
   1160  sta BOTCUT ;use full screen
   1161  lda #0
   1162  sta LEFTCUT
   1163  sta TOPCUT
   1164  rts
   1165 
   1166 *-------------------------------
   1167 *
   1168 * Print character
   1169 *
   1170 * In: PAGE, XCO/OFFSET, YCO
   1171 *     a = ASCII value of character
   1172 * Out: XCO/OFFSET (modified)
   1173 *
   1174 *-------------------------------
   1175 prchar
   1176  sec
   1177  sbc #"/" ;"0" = 1
   1178  sta IMAGE
   1179 
   1180  lda #ora
   1181  sta OPACITY
   1182 
   1183  jsr lay
   1184 
   1185  inc XCO
   1186  rts
   1187 
   1188 *-------------------------------
   1189  lst
   1190  ds 1
   1191  usr $a9,17,$00,*-org
   1192  lst off