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

BSUBS.S (18616B)


      1 * bsubs
      2 org = $7200
      3  lst off
      4 *-------------------------------
      5 *
      6 *  B U I L D E R   S U B S
      7 *
      8 *-------------------------------
      9  org org
     10 
     11  JMP DBLHGR
     12  JMP DBLDRAW
     13  JMP MOVEBLOK
     14  JMP SWSINGLE
     15  JMP SWDOUBLE
     16 
     17  jmp SPECIALK
     18  jmp BCALCBLUE
     19  jmp TOPEDGE
     20  jmp BOTEDGE
     21  jmp LEFTEDGE
     22 
     23  jmp RTEDGE
     24  jmp PRBLOKNO
     25  jmp PRSCRNUM
     26  jmp MENUSPECIAL
     27  jmp DRAWBETHSYM
     28 
     29  jmp INVBETHSYM
     30  jmp DRAWALLSYMB
     31  jmp STOREMENU
     32  jmp DoDblCls
     33  jmp DoDblLay
     34 
     35  jmp DoDblFast
     36  jmp DoDblSave
     37  jmp DoDblWipe
     38  jmp DoDblPrint
     39  jmp DoDblImseek
     40 
     41  jmp PAGEFLIP
     42  jmp INPUT
     43  jmp DBLPEEL
     44  jmp RETRIEVEMENU
     45  jmp MOVESTUFF
     46 
     47  jmp DoDblOra
     48  jmp COPYAUXSCRN
     49  jmp DRAWMENUSYM
     50  jmp UNINDEX
     51  jmp SUPERGUARDS
     52 
     53  jmp INITINPUT
     54  jmp DRAWFLASKNO
     55  jmp PRGDPROG
     56 
     57 *-------------------------------
     58  put eq
     59   put buildereq
     60  put movedata
     61 
     62 *-------------------------------
     63 * Local vars
     64 
     65  dum locals
     66 
     67 rowno ds 1
     68 yindex ds 1
     69 colno ds 1
     70 bitmask ds 1
     71 temp ds 1
     72 
     73  dend
     74 
     75 *-------------------------------
     76 *  Key equates
     77 
     78 SHIFT = $20
     79 CTRL = $60
     80 
     81 kleft = "h"-CTRL
     82 kright = "u"-CTRL
     83 kup = "k"-CTRL
     84 kdown = "j"-CTRL
     85 
     86 kbtn0 = " "
     87 kbtn1 = RETURN
     88 
     89 *-------------------------------
     90 arrow = 3
     91 blockn = 1
     92 
     93 bluediff = BLUETYPE-bLINDEX
     94 
     95 *-------------------------------
     96 * EDTABLE shapes
     97 
     98 ibox1 = 1
     99 iwipe = 4
    100 uparr = 5
    101 dnarr = 6
    102 lftarr = 7
    103 rtarr = 8
    104 digits = 9
    105 
    106 kid = $13
    107 eye = $14
    108 guard = $2d
    109 
    110 bethmask1 = $15
    111 bethmask2 = $16
    112 
    113 bethsyms hex 17,18,19,1a,1b,1c,1d,00
    114  hex 1e,1f,20,21,22,23,24,00
    115  hex 25,26,27,28,29,2a,2b,00
    116 
    117 *-------------------------------
    118 * initial states
    119 
    120 initials db 0
    121  db 48*4 ;1: gate up
    122  db 0 ;2: gate down
    123 
    124 *------------------------------
    125 *
    126 *  D B L H G R
    127 *
    128 *  Clear both double hi-res pages and display page 2
    129 *  Also clear lo-res page 1
    130 *
    131 *-------------------------------
    132 DBLHGR
    133  STA $C00C ;80COL off
    134  STA $C000 ;80STORE off
    135  STA $C07E ;IOUDIS on
    136 
    137  lda #0
    138  JSR lrcls ;Clear lo-res page 1 to black
    139 
    140  LDA $C054 ;Page 1
    141  LDA $C052 ;MIXED off
    142  LDA $C056 ;HIRES off
    143  LDA $C050 ;TEXT off
    144 
    145  LDA #0
    146  STA PAGE
    147 
    148  jsr DoDblCls
    149 
    150  LDA $C057 ;HIRES on
    151  STA $C00D ;80COL on
    152  STA $C05E ;DHIRES on
    153 
    154  LDA #$20
    155  STA PAGE
    156 
    157  jsr DoDblCls ;Clear hires p.2
    158 
    159  jsr zeropeels ;zero peel buffers
    160 
    161  lda #0
    162  sta TOPCUT
    163 
    164  rts
    165 
    166 *-------------------------------
    167 *
    168 *  M O V E B L O C K
    169 *
    170 *  Move block (or pointer) from where it was 2 frames
    171 *  ago to where BLOCKX and BLOCKY say it is now
    172 *
    173 *-------------------------------
    174 MOVEBLOK
    175  jsr DBLPEEL ;peel off old block or pointer
    176 ;(using peel buffer we set up 2 frames ago)
    177 
    178  jsr DZEROPEEL ;zero just-used peel buffer
    179 
    180  jsr DRAWPTR ;draw new block or pointer
    181 
    182 ]rts rts
    183 
    184 *-------------------------------
    185 *
    186 *  D Z E R O P E E L
    187 *
    188 *  Zero peel buffer for whichever page we're on
    189 *
    190 *-------------------------------
    191 DZEROPEEL
    192  lda PAGE
    193  beq :page1
    194 
    195  lda #0
    196  sta peelX+maxpeel
    197 
    198  lda #dpeelbuf2
    199  sta PEELBUF
    200  lda #>dpeelbuf2
    201  sta PEELBUF+1
    202  rts
    203 
    204 :page1 sta peelX
    205 
    206  lda #dpeelbuf1
    207  sta PEELBUF
    208  lda #>dpeelbuf1
    209  sta PEELBUF+1
    210  rts
    211 
    212 *-------------------------------
    213 *
    214 *  D B L   D R A W   P T R
    215 *
    216 *  Draw block or pointer in current posn (BLOCKX,BLOCKY)
    217 *
    218 *-------------------------------
    219 DRAWPTR
    220 
    221 * "AND" blockmask
    222 
    223  LDA BLOCKX
    224  STA XCO
    225  LDA BLOCKX+1
    226  STA OFFSET
    227 
    228  LDA BLOCKY
    229  STA YCO
    230 
    231  LDA CURSOR ;1=block, 3=arrow
    232  CLC
    233  ADC #1 ;MASK
    234  STA IMAGE
    235 
    236  LDA #0
    237  STA OPACITY ;"AND"
    238 
    239  jsr dblsetup ;set up for dbllay
    240 
    241 * Save underlayer in peel buffer
    242 
    243  jsr DoDblSave
    244 
    245  jsr addpeel ;in grafix
    246 
    247 * Lay down image
    248 
    249  jsr DoDblLay
    250 
    251 * "OR" block
    252 
    253  LDA BLOCKX
    254  STA XCO
    255  LDA BLOCKX+1
    256  STA OFFSET
    257 
    258  LDA BLOCKY
    259  STA YCO
    260 
    261  LDA CURSOR
    262  STA IMAGE
    263 
    264  LDA #1
    265  STA OPACITY ;"OR"
    266 
    267  jsr DBLDRAW
    268 
    269  lda CURSOR
    270  cmp #1 ;block?
    271  bne ]rts
    272 
    273  LDA BLOCKX
    274  STA XCO
    275  LDA BLOCKX+1
    276  STA OFFSET
    277  LDA BLOCKY
    278  STA YCO
    279 
    280  jmp prblokno ;print block #
    281 
    282 *-------------------------------
    283 *
    284 *  D B L   P E E L
    285 *
    286 *  "Peel off" images laid down on this page
    287 *
    288 *-------------------------------
    289 DBLPEEL
    290  ldx PAGE
    291  beq :1
    292  ldx #maxpeel
    293 :1 stx :sm+1
    294 
    295  lda peelX,x ;# images in peel list
    296  beq :rts
    297 
    298 :loop pha
    299 
    300  clc
    301 :sm adc #0 ;0 or maxpeel
    302  tax
    303 
    304  lda peelIMGL,x
    305  sta IMAGE
    306 
    307  lda peelIMGH,x
    308  sta IMAGE+1
    309 
    310  lda peelX,x
    311  sta XCO
    312 
    313  lda peelY,x
    314  sta YCO
    315 
    316  lda #sta
    317  sta OPACITY
    318 
    319  jsr DoDblFast
    320 
    321  pla
    322  sec
    323  sbc #1
    324  bne :loop
    325 
    326 :rts
    327 ]rts rts
    328 
    329 *-------------------------------
    330 *
    331 *  P R S C R N U M
    332 *
    333 *  print screen # in u.l. corner
    334 *  (single hi-res)
    335 *
    336 *-------------------------------
    337 PRSCRNUM
    338  lda shownums
    339  beq ]rts
    340 
    341  lda #10
    342  sta YCO
    343  lda #0
    344  sta XCO
    345  sta OFFSET
    346 
    347  ldx number ;1-MAXBLOX
    348  lda digit1,x
    349  jsr sprint
    350 
    351  ldx number
    352  lda digit2,x
    353  jmp sprint
    354 
    355 *-------------------------------
    356 * print guard prog # in lower left
    357 
    358 PRGDPROG
    359  lda #190
    360  sta YCO
    361  lda #0
    362  sta XCO
    363  sta OFFSET
    364  ldx number
    365  lda digit2,x
    366  jmp sprint
    367 
    368 *-------------------------------
    369 *
    370 *  S I N G L E   H R   P R I N T
    371 *
    372 *  Single hires print
    373 *  In: A = character (0-9 or space)
    374 *
    375 *-------------------------------
    376 sprint
    377  cmp #" "
    378  beq :rts
    379  sec
    380  sbc #"0"
    381  sta addr
    382  clc
    383  adc #digits
    384  sta IMAGE
    385 
    386  lda #0
    387  sta OPACITY
    388  jsr genmaskor
    389 
    390  ldx addr
    391  lda OFFSET ;advance cursor
    392  clc
    393  adc chrbits,x
    394  sta OFFSET
    395 :rts
    396 ]rts rts
    397 
    398 *-------------------------------
    399 *
    400 *  P R I N T   B L O C K N O
    401 *
    402 *  print block # on face
    403 *  (double hi-res)
    404 *
    405 *-------------------------------
    406 PRBLOKNO
    407  lda shownums
    408  beq ]rts
    409 
    410  lda XCO
    411  clc
    412  adc #5
    413  sta charx
    414 
    415  lda OFFSET
    416  adc #0
    417  sta charx+1
    418 
    419  lda YCO
    420  clc
    421  adc #7
    422  sta chary
    423 
    424  jsr cvtx
    425 
    426  ldx number ;1-MAXBLOX
    427  lda digit1,x
    428  jsr print
    429  ldx number
    430  lda digit2,x
    431  jmp print
    432 
    433 *-------------------------------
    434 digit2
    435  asc "0123456789012345678901234"
    436 digit1
    437  asc "          111111111122222"
    438 chrbits
    439  db 6,4,6,6,6,6,6,6,6,6
    440 
    441 *-------------------------------
    442 *
    443 * D B L   S E T U P
    444 *
    445 * In: IMAGE (image #)
    446 * XCO/OFFSET (2-byte X-coord, 0-559)
    447 * YCO (0-191)
    448 * OPACITY (0-2)
    449 * ("IXYO)
    450 *
    451 *-------------------------------
    452 DBLDRAW jsr dblsetup
    453  jmp DoDblLay
    454 
    455 *-------------------------------
    456 dblsetup
    457  lda #dblimage
    458  sta TABLE
    459  lda #>dblimage
    460  sta TABLE+1
    461 
    462  jsr DoDblImseek ;setup starting addr of img table
    463  jmp cvtx ;convert xco to byte & offset
    464 
    465 *-------------------------------
    466 *
    467 * S W   S I N G L E
    468 *
    469 * Switch from double to single hi-res
    470 *
    471 *-------------------------------
    472 SWSINGLE
    473  STA $C00C ;80COL off
    474  STA $C05F ;DHIRES off
    475  rts
    476 
    477 *-------------------------------
    478 *
    479 * S W  D O U B L E
    480 *
    481 * Switch from single to double hi-res
    482 *
    483 *-------------------------------
    484 SWDOUBLE
    485  STA $C00D ;80COL on
    486  STA $C05E ;DHIRES on
    487 ]rts rts
    488 
    489 *-------------------------------
    490 *
    491 * S P E C I A L   K E Y S
    492 *
    493 * In: ASCII code in A-reg, hibit set
    494 *
    495 *-------------------------------
    496 
    497 ctrl = $60
    498 shift = $20
    499 
    500 ksoundsw = "s"
    501 knum = "n"
    502 
    503 * development section
    504 
    505 krestart = "r"-ctrl
    506 kreboot = "z"-ctrl
    507 
    508 *-------------------------------
    509 SPECIALK
    510  lda keypress
    511  jsr debugkeys
    512 
    513  lda keypress
    514 
    515  cmp #krestart
    516  bne :0
    517  jmp restartbldr
    518 
    519 :0 cmp #kreboot
    520  bne :1
    521 
    522   jsr saveblue ;to aux
    523   jmp reboot
    524 
    525 :1
    526 *-------------------------------
    527 :cont
    528  cmp #ksoundsw-ctrl
    529  beq soundsw
    530 
    531  cmp #knum-ctrl
    532  beq numsw
    533 
    534 :2
    535 ]rts rts
    536 
    537 *-------------------------------
    538 soundsw ;lda sound
    539 ;eor #$ff
    540 ;sta sound
    541  jmp gtone
    542 
    543 numsw lda shownums
    544  eor #1
    545  sta shownums
    546  lda #1
    547  sta setupflg
    548 ]rts rts
    549 
    550 *-------------------------------
    551 * INIT INPUT
    552 
    553 INITINPUT
    554 
    555  lda $c010
    556 
    557  jsr setcenter
    558 
    559  jsr controller
    560 
    561  lda joyX
    562  beq :jok
    563  lda joyY
    564  beq :jok
    565 
    566  lda #0 ;If either jstk axis is centered,
    567  sta joyon ;assume a joystick is connected--
    568 ;else default to kbd-only mode
    569 :jok lda #0
    570  sta jcount
    571 
    572  rts
    573 
    574 *-------------------------------
    575 *
    576 *  M E N U   S P E C I A L
    577 *
    578 *  Superimpose special stuff on b.g.
    579 *
    580 *  If this is menu screen, draw special symbols;
    581 *  if not, draw flask #s;
    582 *  if links are shown, draw beth rectangles
    583 *
    584 *-------------------------------
    585 MENUSPECIAL
    586 ; lda inmenu
    587 ; ora linkmode
    588 ; beq ]rts ;neither special case
    589  lda SCRNUM
    590  jsr bcalcblue
    591 
    592  ldy #2 ;start at bottom
    593 
    594 :row sty rowno
    595 
    596  lda BlockBot+1,y
    597  sta loy
    598 
    599  lda Mult10,y
    600  sta yindex
    601 
    602  lda #0
    603  sta colno
    604 
    605 :loop asl
    606  asl
    607  sta XCO
    608 
    609  ldy yindex
    610  lda (bLinkIndex),y
    611  sta objspec
    612 
    613  lda (BlueType),y
    614  and #idmask
    615  sta objid
    616 
    617  jsr DRAWFLASKNO
    618 
    619  jsr DRAWALLSYMB
    620 
    621  lda inmenu
    622  beq :skip
    623 
    624  lda objspec
    625  beq :skip
    626  bmi :skip
    627  tax ;valid codes: 1-127
    628 
    629  lda loy
    630  sta YCO
    631 
    632  lda #0
    633  sta OPACITY ;don't mirror
    634 
    635  jsr DRAWMENUSYM
    636 :skip
    637  inc yindex
    638  inc colno
    639 
    640  lda colno
    641  cmp #10
    642  bcc :loop
    643 
    644 :nextln ldy rowno
    645  beq :done
    646  dey
    647  jmp :row
    648 
    649 :done rts
    650 
    651 *-------------------------------
    652 *
    653 * S U P E R   G U A R D S
    654 *
    655 * Superimpose guard figures on screen
    656 * for each square with secmask marked
    657 *
    658 *-------------------------------
    659 SUPERGUARDS
    660  lda SCRNUM
    661  jsr bcalcblue
    662 
    663  ldy #2 ;start at bottom
    664 
    665 :row sty rowno
    666 
    667  lda BlockBot+1,y
    668  sta loy
    669 
    670  lda Mult10,y
    671  sta yindex
    672 
    673  lda #0
    674  sta colno
    675 
    676 :loop asl
    677  asl
    678  sta XCO
    679 
    680  ldy yindex
    681  lda (BlueType),y
    682  and #secmask
    683  beq :skip
    684 
    685  lda loy
    686  sta YCO
    687 
    688  lda #0
    689  sta OPACITY ;don't mirror
    690 
    691  ldx #3 ;guard
    692  jsr DRAWMENUSYM
    693 :skip
    694  inc yindex
    695  inc colno
    696 
    697  lda colno
    698  cmp #10
    699  bcc :loop
    700 
    701 :nextln ldy rowno
    702  beq :done
    703  dey
    704  jmp :row
    705 
    706 :done rts
    707 
    708 *-------------------------------
    709 *
    710 *  B C A L C B L U E
    711 *
    712 *  In: A = screen # (1-24); NOT 0
    713 *
    714 *  Out: BlueType, BlueSpec, bLinkIndex
    715 *
    716 *-------------------------------
    717 BCALCBLUE
    718  jsr calcblue ;returns BlueType, BlueSpec
    719 
    720 * Now get bLinkIndex
    721 
    722  lda inmenu
    723  bne :calcmenu
    724 
    725  lda BlueType
    726  sec
    727  sbc #bluediff
    728  sta bLinkIndex
    729 
    730  lda BlueType+1
    731  sbc #>bluediff
    732  sta bLinkIndex+1
    733 
    734  rts
    735 
    736 :calcmenu
    737  lda #menubspec
    738  sta bLinkIndex
    739 
    740  lda #>menubspec
    741  sta bLinkIndex+1
    742 
    743 ]rts rts
    744 
    745 ]bug jmp gtone
    746 
    747 *-------------------------------
    748 * Draw flask # (if object is a flask)
    749 
    750 flaskbits hex 00,01,02,04,08,10,20,40
    751 
    752 DRAWFLASKNO
    753  lda objid
    754  cmp #flask
    755  bne ]rts
    756 
    757  lda linkmode
    758  bne ]rts
    759  lda inmenu
    760  bne ]rts
    761 
    762  lda (BlueSpec),y
    763  tax
    764  cpx #8
    765  bcs ]rts
    766 
    767 * Note--for convenience we'll use the beth routine
    768 
    769  lda #0
    770  sta linkbits
    771  sta linkbits+1
    772 
    773  lda flaskbits,x
    774  sta linkbits+2
    775 
    776  jmp drawallsymb1
    777 
    778 *-------------------------------
    779 *
    780 *  D R A W   A L L   S Y M B
    781 *
    782 *  Draw all symbols in a beth rectangle
    783 *
    784 *  In: XCO, YCO, objspec
    785 *
    786 *-------------------------------
    787 DRAWALLSYMB
    788  lda linkmode
    789  beq ]rts
    790  lda inmenu
    791  bne ]rts
    792 
    793  ldx objspec ;link index
    794  bmi ]rts ;ff=unlinkable object
    795 ;index range is 0-127
    796  lda bLINK4,x
    797  bpl ]bug ;hibit should be set
    798 
    799  lda bLINK1,x
    800  sta linkbits
    801  lda bLINK2,x
    802  sta linkbits+1
    803  lda bLINK3,x
    804  sta linkbits+2
    805 
    806 * Three columns, L-R; take each one B-T
    807 
    808 drawallsymb1
    809  lda #0
    810  sta bethx ;0-2
    811 ;XCO already set
    812 :nextcol asl
    813  sta OFFSET ;0,2,4
    814 
    815  lda loy
    816  sta YCO
    817 
    818  lda #0
    819  sta bethy ;0-7
    820 
    821  lda #1
    822 :loop sta bitmask
    823  ldx bethx
    824  and linkbits,x
    825  beq  :nextsym
    826 
    827  jsr drawbethsym1
    828 
    829 :nextsym lda YCO
    830  sec
    831  sbc #8
    832  sta YCO
    833 
    834  inc bethy
    835  lda bitmask
    836  asl
    837  bne :loop ;cycle through all 8 bits
    838 
    839  inc XCO
    840 
    841  inc bethx
    842  lda bethx
    843  cmp #3
    844  bcc :nextcol
    845 
    846 :done lda #0
    847  sta OFFSET
    848 
    849 :rts rts
    850 
    851 *-------------------------------
    852 *
    853 *  D R A W   B E T H   S Y M
    854 *
    855 * Draw a symbol
    856 *
    857 * In: XCO/OFFSET, YCO, bethposn
    858 *
    859 * DRAWBETHSYM1: no layrsave
    860 *
    861 *-------------------------------
    862 drawbethsym1
    863  jsr setupbmask
    864  jsr lay
    865 
    866  jmp drawbrest
    867 
    868 DRAWBETHSYM
    869  jsr setupbmask
    870  jsr layrsave
    871  jsr addpeel
    872  jsr lay
    873 
    874  jmp drawbrest
    875 
    876 *-------------------------------
    877 setupbmask
    878  jsr seted
    879 
    880 * 1) AND mask1
    881 
    882  lda #bethmask1
    883  sta IMAGE
    884 
    885  lda #and
    886  sta OPACITY
    887 
    888 ]rts rts
    889 
    890 *-------------------------------
    891 drawbrest
    892 
    893 * 2) OR symbol
    894 
    895  jsr getbsym
    896  beq ]rts
    897  sta IMAGE
    898 
    899  lda #ora
    900  sta OPACITY
    901 
    902  jmp lay
    903 
    904 *-------------------------------
    905 *
    906 *  G E T   B E T H   S Y M
    907 *
    908 * in: bethx, bethy
    909 * out: A =symbol #
    910 *
    911 *-------------------------------
    912 getbsym lda bethx
    913  asl
    914  asl
    915  asl ;x8
    916  clc
    917  adc bethy
    918  tax
    919 
    920  lda bethsyms,x
    921  rts
    922 
    923 *-------------------------------
    924 *
    925 *  I N V E R T   B E T H   S Y M
    926 *
    927 *-------------------------------
    928 INVBETHSYM
    929  jsr DRAWBETHSYM
    930 
    931 * (3) EOR mask2
    932 
    933  lda #bethmask2
    934  sta IMAGE
    935 
    936  lda #eor
    937  sta OPACITY
    938 
    939  jmp lay
    940 
    941 *-------------------------------
    942 *
    943 *  E D G E   A R R O W S
    944 *
    945 *-------------------------------
    946 *  IXYO: image,xco,offset,yco,[opacity]
    947 
    948 te db #uparr,19,3,7
    949 be db #dnarr,19,3,191
    950 le db #lftarr,0,0,98
    951 re db #rtarr,39,0,98
    952 
    953 TOPEDGE lda #te
    954  ldx #>te
    955  bne drawej
    956 
    957 BOTEDGE lda #be
    958  ldx #>be
    959  bne drawej
    960 
    961 LEFTEDGE lda #le
    962  ldx #>le
    963  bne drawej
    964 
    965 RTEDGE lda #re
    966  ldx #>re
    967 
    968 *-------------------------------
    969 *
    970 *  D R A W   E J
    971 *
    972 *-------------------------------
    973 drawej sta addr
    974  stx addr+1
    975 
    976  ldy #0
    977  lda (addr),y
    978  sta IMAGE
    979 
    980  iny
    981  lda (addr),y
    982  sta XCO
    983 
    984  iny
    985  lda (addr),y
    986  sta OFFSET
    987 
    988  iny
    989  lda (addr),y
    990  sta YCO
    991 
    992 * general mask-or  sequence
    993 
    994 genmaskor
    995  jsr seted
    996 
    997  lda OPACITY
    998  and #$80 ;preserve hi bit
    999  pha
   1000 
   1001  ora #mask
   1002  sta OPACITY
   1003  jsr lay
   1004 
   1005  pla
   1006  ora #ora
   1007  sta OPACITY
   1008  jmp lay
   1009 
   1010 *-------------------------------
   1011 seted
   1012  lda #0
   1013  sta TOPCUT
   1014  sta LEFTCUT
   1015  lda #40
   1016  sta RIGHTCUT
   1017  lda #192
   1018  sta BOTCUT
   1019 
   1020  lda #edtable
   1021  sta TABLE
   1022  lda #>edtable
   1023  sta TABLE+1
   1024 
   1025  lda #2
   1026  sta BANK
   1027  rts
   1028 *-------------------------------
   1029 *
   1030 *  D R A W   M E N U  S Y M
   1031 *
   1032 * draw menu symbol
   1033 *
   1034 * In: OPACITY (hi bit)
   1035 *     XCO, YCO; x = symbol #
   1036 * 1 = kid
   1037 * 2 = eye
   1038 * 3 = guard
   1039 *
   1040 *-------------------------------
   1041 msymi db 0,kid,eye,guard
   1042 msymx db 0,2,0,0
   1043 msymos db 0,4,0,2
   1044 msymy db 0,-10,-20,-10
   1045 
   1046 msymxm db 0,5,0,7
   1047 msymosm db 0,0,0,4
   1048 
   1049 DRAWMENUSYM
   1050  lda msymi,x
   1051  sta IMAGE
   1052 
   1053  lda msymy,x
   1054  clc
   1055  adc YCO
   1056  sta YCO
   1057 
   1058  lda OPACITY
   1059  bmi :mirror
   1060 
   1061  lda msymos,x
   1062  sta OFFSET
   1063 
   1064  lda msymx,x
   1065 :1 clc
   1066  adc XCO
   1067  sta XCO
   1068 
   1069  jmp genmaskor
   1070 
   1071 :mirror
   1072  lda msymosm,x
   1073  sta OFFSET
   1074 
   1075  lda msymxm,x
   1076  jmp :1
   1077 
   1078 *-------------------------------
   1079 *
   1080 *  S T O R E   M E N U
   1081 *
   1082 *  Draw menu screen #0 on page 2
   1083 *  & store it in "menuscrn" buffer
   1084 *  for fast retrieval later
   1085 *
   1086 *-------------------------------
   1087 STOREMENU
   1088  lda PAGE
   1089  pha
   1090  lda SCRNUM
   1091  pha
   1092 
   1093  jsr noneighs
   1094 
   1095  lda #$20
   1096  sta PAGE
   1097 
   1098  lda #0
   1099  sta SCRNUM
   1100 
   1101  lda #1
   1102  sta inmenu
   1103 
   1104  jsr zeropeels
   1105  jsr zerolsts
   1106  jsr sure
   1107  jsr drawall
   1108 
   1109  jsr menuspecial
   1110 
   1111  lda #0
   1112  sta inmenu ;!
   1113 ;and store it
   1114  lda #>menuscrn
   1115  sta IMAGE+1
   1116  lda #$40
   1117  sta IMAGE
   1118  jsr copy2000ma ;main to aux
   1119 
   1120  pla
   1121  sta SCRNUM
   1122  pla
   1123  sta PAGE
   1124  rts
   1125 
   1126 *-------------------------------
   1127 *
   1128 *  R E T R I E V E   M E N U
   1129 *
   1130 *  Copy onto both hires scrns
   1131 *
   1132 *-------------------------------
   1133 RETRIEVEMENU
   1134  lda #$20 ;page1
   1135  jsr :copy
   1136 
   1137  lda #$40 ;page2
   1138 :copy sta IMAGE+1
   1139 
   1140  lda #>menuscrn
   1141  sta IMAGE
   1142 
   1143  jmp copy2000am ;aux to main
   1144 
   1145 *-------------------------------
   1146 *
   1147 *  D O   D B L   R O U T I N E S
   1148 *
   1149 *  Dblhires routines sit in aux l.c.
   1150 *
   1151 *-------------------------------
   1152 DoDblCls
   1153  jmp dblcls
   1154 
   1155 DoDblLay
   1156  jmp dbllay
   1157 
   1158 DoDblFast
   1159  jmp dblfast
   1160 
   1161 DoDblSave
   1162  jmp dblsave
   1163 
   1164 DoDblWipe
   1165  jmp dblwipe
   1166 
   1167 DoDblPrint
   1168  jmp dblprint
   1169 
   1170 DoDblImseek
   1171  jmp dblimseek
   1172 
   1173 DoDblOra
   1174  jmp dblora
   1175 
   1176 *-------------------------------
   1177 *
   1178 *  P A G E F L I P
   1179 *
   1180 *-------------------------------
   1181 PAGEFLIP
   1182  lda PAGE
   1183  bne :1
   1184 
   1185  lda #$20
   1186  sta PAGE
   1187  lda $C054 ;show page 1
   1188  rts
   1189 
   1190 :1 lda #0
   1191  sta PAGE
   1192  lda $C055 ;show page 2
   1193  rts
   1194 
   1195 *-------------------------------
   1196 *
   1197 *  M O V E S T U F F
   1198 *
   1199 *  Called from BUILDER
   1200 *  Enter & exit w/ALTZP on
   1201 *
   1202 *-------------------------------
   1203 MOVESTUFF
   1204 
   1205 * We need to copy HRTABLES from main l.c. to
   1206 * aux l.c.--first copy it into loading area
   1207 
   1208  sta $c008 ;ALTZP off
   1209 
   1210  lda #$20
   1211  ldx #$e0
   1212  ldy #$ee
   1213  jsr movemem
   1214 
   1215  sta $c009 ;ALTZP on
   1216 
   1217 * Now move stuff from loading area to aux l.c.
   1218 * (MASTER couldn't do this from main l.c.)
   1219 
   1220  lda #$d0
   1221  ldx #$40
   1222  ldy #$50
   1223  jsr movemem ;aux bank 2
   1224 
   1225  lda #$e0
   1226  ldx #$20
   1227  ldy #$40
   1228  jmp movemem ;the rest
   1229 
   1230 *-------------------------------
   1231 *
   1232 *  I N P U T
   1233 *
   1234 *  Monitor keyboard and joystick for user commands
   1235 *  and return command # in A (0 = nothing)
   1236 *  Also return keypress, keydown
   1237 *
   1238 *-------------------------------
   1239 INPUT
   1240  lda $C000
   1241  sta keypress
   1242 
   1243  lda $C010
   1244  sta keydown
   1245 
   1246  lda keypress
   1247  bpl :nocmd ;no key down
   1248 
   1249  jsr specialk first check for special keys
   1250 
   1251 * Keyboard control
   1252 
   1253  lda keypress
   1254 
   1255  cmp #kleft
   1256  BNE :3
   1257  lda #Cleft
   1258  rts
   1259 
   1260 :3 CMP #kright
   1261  BNE :4
   1262  lda #Cright
   1263  rts
   1264 
   1265 :4 CMP #kup
   1266  BNE :5
   1267  lda #Cup
   1268  rts
   1269 
   1270 :5 CMP #kdown
   1271  BNE :nomove
   1272  lda #Cdown
   1273  rts
   1274 
   1275 :nomove cmp #kbtn0
   1276  bne :6
   1277  lda #Cbtn0
   1278  rts
   1279 
   1280 :6 cmp #kbtn1
   1281  bne :7
   1282  lda #Cbtn1
   1283  rts
   1284 
   1285 :7
   1286 :nocmd
   1287  lda joyon ;joystick mode?
   1288  bne joystick ;yes
   1289 
   1290  lda #0 ;no cmd
   1291 ]rts rts
   1292 
   1293 *-------------------------------
   1294 *
   1295 *  J O Y S T I C K
   1296 *
   1297 * Joystick input
   1298 *
   1299 *-------------------------------
   1300 joystick
   1301  jsr controller
   1302  jsr buttons
   1303  jsr getselect
   1304 
   1305  lda JSTKX
   1306  bpl :1
   1307 
   1308  lda #1
   1309  cmp jlast ;Same direction as last move?
   1310  bne :jleft ;No--set timer & go ahead
   1311 
   1312  lda jcount ;Yes--is time up yet?
   1313  beq :jleft1 ;Yes--go ahead
   1314  dec jcount ;No--keep waiting
   1315  lda #0
   1316  rts
   1317 
   1318 :jleft jsr jmove ;set timer
   1319  lda #Cleft
   1320  rts
   1321 
   1322 :jleft1 jsr jrepeat ;set repeat timer
   1323  lda #Cleft
   1324  rts
   1325 
   1326 :1 beq :2
   1327 
   1328  lda #2 ;"right"
   1329  cmp jlast
   1330  bne :jright
   1331 
   1332  lda jcount
   1333  beq :jright1
   1334  dec jcount
   1335  lda #0
   1336  rts
   1337 
   1338 :jright jsr jmove
   1339  lda #Cright
   1340  rts
   1341 
   1342 :jright1 jsr jrepeat
   1343  lda #Cright
   1344  rts
   1345 
   1346 :2 lda JSTKY
   1347  bpl :3
   1348 
   1349  lda #3
   1350  cmp jlast
   1351  bne :jup
   1352 
   1353  lda jcount
   1354  beq :jup1
   1355  dec jcount
   1356  lda #0
   1357  rts
   1358 
   1359 :jup jsr jmove
   1360  lda #Cup
   1361  rts
   1362 
   1363 :jup1 jsr jrepeat
   1364  lda #Cup
   1365  rts
   1366 
   1367 :3 beq :nomove
   1368 
   1369  lda #4
   1370  cmp jlast
   1371  bne :jdown
   1372 
   1373  lda jcount
   1374  beq :jdown1
   1375  dec jcount
   1376  lda #0
   1377  rts
   1378 
   1379 :jdown jsr jmove
   1380  lda #Cdown
   1381  rts
   1382 
   1383 :jdown1 jsr jrepeat
   1384  lda #Cdown
   1385  rts
   1386 
   1387 :nomove lda #0
   1388  sta jlast
   1389 
   1390  lda BUTT0
   1391  bpl :nobtn0
   1392 
   1393  lda #Cbtn0
   1394  rts
   1395 
   1396 :nobtn0 lda BUTT1
   1397  bpl :nobtn1
   1398 
   1399  lda #Cbtn1
   1400  rts
   1401 :nobtn1
   1402 
   1403 :nocmd lda #0
   1404  rts
   1405 
   1406 *-------------------------------
   1407 *
   1408 * J M O V E
   1409 *
   1410 *-------------------------------
   1411 jmove sta jlast
   1412 
   1413  lda setupflg
   1414  bne :done ;no delay (scroll's slow enough)
   1415 
   1416  lda CURSOR
   1417  cmp #blockn
   1418  beq :block ;slight delay
   1419 
   1420 :pointer lda #10
   1421  bne :gotit
   1422 
   1423 :block lda #5
   1424 
   1425 :gotit sta jcount
   1426 
   1427 :done rts
   1428 
   1429 
   1430 jrepeat lda setupflg
   1431  bne :done ;no delay
   1432 
   1433  lda CURSOR
   1434  cmp #blockn
   1435  beq :done
   1436 
   1437  lda #3
   1438  sta jcount
   1439 
   1440 :done rts
   1441 
   1442 *-------------------------------
   1443 * no neighbors (for menu)
   1444 
   1445 noneighs
   1446  lda #0
   1447  sta scrnLeft
   1448  sta scrnRight
   1449  sta scrnAbove
   1450  sta scrnBelow
   1451  sta scrnAboveL
   1452  sta scrnBelowL
   1453  sta scrnAboveR
   1454  sta scrnBelowR
   1455  rts
   1456 
   1457 *-------------------------------
   1458 *
   1459 * C O P Y   A U X   S C R N
   1460 *
   1461 * Copy one aux hires page to the other
   1462 *
   1463 * In: PAGE = dest scrn (00/20)
   1464 *
   1465 *  (Use in conjunction with "copyscrn" in grafix
   1466 *  to copy dblhires screen)
   1467 *
   1468 *-------------------------------
   1469 COPYAUXSCRN
   1470  lda PAGE
   1471  clc
   1472  adc #$20
   1473  sta IMAGE+1 ;dest addr
   1474 
   1475  eor #$60
   1476  sta IMAGE ;org addr
   1477 
   1478  jmp copyaux2000
   1479 
   1480 
   1481 *-------------------------------
   1482 *
   1483 *  C O P Y   A U X   2 0 0 0
   1484 *
   1485 *  Copy $2000 bytes within auxmem
   1486 *
   1487 *  In: IMAGE+1 = dest scrn, IMAGE = org scrn
   1488 *      (use hi byte of actual memory address)
   1489 *
   1490 *-------------------------------
   1491 copyaux2000
   1492  lda IMAGE+1
   1493  sta :dst+2
   1494  lda IMAGE
   1495  sta :org+2
   1496 
   1497  ldx #$20
   1498 
   1499  ldy #0
   1500 :loop
   1501 :org lda $2000,y
   1502 :dst sta $4000,y
   1503 
   1504  iny
   1505  bne :loop
   1506 
   1507  inc :org+2
   1508  inc :dst+2
   1509 
   1510  dex
   1511  bne :loop
   1512 
   1513 ]rts rts
   1514 
   1515 *-------------------------------
   1516 *
   1517 *  U N I N D E X
   1518 *
   1519 *  In: A = block index (0-29)
   1520 *  Out: A = tempblockx, X = tempblocky
   1521 *
   1522 *-------------------------------
   1523 UNINDEX
   1524  ldx #0
   1525 :loop cmp #10
   1526  bcc ]rts
   1527  sec
   1528  sbc #10
   1529  inx
   1530  bne :loop
   1531 ;A = blockx, X = blocky
   1532 ]rts rts
   1533 
   1534 *-------------------------------
   1535  lst
   1536  ds 1
   1537  usr $a9,23,$000,*-org
   1538  lst off