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

BUILDER.S (30083B)


      1 * ed/builder
      2 org = $8400
      3  lst off
      4 *-------------------------------
      5  org org
      6 
      7  JMP COLDBUILD
      8  jmp WARMBUILD
      9  JMP RTNBUILD
     10  JMP MLEFT
     11  JMP MRIGHT
     12 
     13  JMP MDOWN
     14  JMP MUP
     15  JMP GETNEIGH
     16  jmp CALCMAT1
     17  jmp CLRLINKS
     18 
     19  jmp RESTARTBLDR
     20 
     21 *-------------------------------
     22  put eq
     23  put buildereq
     24  put movedata
     25 
     26 *-------------------------------
     27 * Constraints
     28 
     29 MAXBLOX = 24 ;max # of blocks per level
     30 
     31 XDIM = 32
     32 YDIM = 32 ;Matrix dimensions
     33 
     34 *-------------------------------
     35 * Screen display constants
     36 
     37 xoffset = 0
     38 
     39 STULX = 9 ;Starting position of screen u.l.
     40 STULY = 12 ;(in matrix)
     41 
     42 STPTRX = 6 ;Starting posn of pointer
     43 STPTRY = 2 ;(on screen)
     44 
     45 STMATX = STULX+STPTRX
     46 STMATY = STULY+STPTRY
     47 
     48 STBLOKX = STMATX
     49 STBLOKY = STMATY+1 ;postion of starter block
     50 
     51 DX = 40
     52 DY = 12
     53 
     54 POPY = 5
     55 POPX = 4*POPY
     56 
     57 ARPX = 30
     58 ARPY = 7
     59 
     60 SCANHT = 16
     61 SCANWID = 15 ;dimensions of screen grid
     62 
     63 LLX = POPX-DX+xoffset
     64 LLY = POPY-DY+195 ;coords of lower-leftmost visible block
     65 
     66 STX = STPTRX*DX-POPX+ARPX+LLX
     67 STY = STPTRY-SCANHT+1*DY+POPY+ARPY+LLY
     68 
     69 scrntop = 20
     70 barby = 7
     71 
     72 topmosty = -SCANHT+2*DY+LLY+POPY
     73 
     74 
     75 * Limits of pointer/block posn on screen
     76 
     77 LEFTEJ = 1
     78 RIGHTEJ = 13
     79 TOPEJ = 1 ;menu bar threshold
     80 BOTTOMEJ = 13
     81 
     82 
     83 * Limits of screen u.l. posn in matrix
     84 
     85 minulx = -1
     86 maxulx = XDIM-RIGHTEJ-1
     87 minuly = -1
     88 maxuly = YDIM-BOTTOMEJ-1
     89 
     90 
     91 * Menu bar data
     92 
     93 playx = 0
     94 loadx = 120
     95 savex = loadx+76
     96 deletex = savex+76
     97 clearx = deletex+92
     98 trashx = 500
     99 
    100 btnimg dfb 14,15,16,17,18,1
    101 btnxl dfb playx,loadx,savex,deletex,clearx,trashx
    102 btnxh dfb >playx,>loadx,>savex,>deletex,>clearx,>trashx
    103 btny dfb 1,1,1,1,1,0
    104 numbtns = btnxh-btnxl-1
    105 
    106 c = 28
    107 barlistl dfb playx+c,loadx+c,savex+c,deletex+c
    108  dfb clearx+c,trashx+10
    109 barlisth dfb >playx+c,>loadx+c,>savex+c,>deletex+c
    110  dfb >clearx+c,>trashx+10
    111 menulen = barlisth-barlistl-1
    112 
    113 btnxlist dfb 0,0,1,1,2,2,3,3,4,4,4,5,5
    114 ptrxlist dfb 1,4,6,8,10,13
    115 
    116 *-------------------------------
    117 arrow = 3
    118 bblock = 1
    119 
    120 *-------------------------------
    121 * Special keys (development)
    122 
    123 SHIFT = $20
    124 CTRL = $60
    125 
    126 kcopy = "c"
    127 kdelblock = "d"
    128 
    129 kcreateGD1 = "$"
    130 kcreateGD2 = "@"
    131 kcreateMD = "!"
    132 kcreateDD = "#"
    133 ksavegame1 = "g"-CTRL
    134 ksavegame2 = "f"-CTRL
    135 kdelgame = "d"-CTRL
    136 
    137 krelink = "l"-CTRL
    138 
    139 *-------------------------------
    140 POPside1 = $a9
    141 POPside2 = $ad
    142 
    143 *-------------------------------
    144 *
    145 *  C O L D   B U I L D
    146 *
    147 *  Coldstart builder
    148 *
    149 *-------------------------------
    150 COLDBUILD
    151  sta $c009
    152 
    153  jsr movestuff
    154 
    155  jsr initbuilder
    156 
    157  jsr STARTCLR ;clear matrix
    158 
    159  jmp STARTBUILDER
    160 
    161 *-------------------------------
    162 * Restart builder
    163 
    164 RESTARTBLDR
    165  sta $c009
    166 
    167  jsr initbuilder
    168 
    169  jsr STARTCLR
    170 
    171  jmp STARTBUILDER
    172 
    173 *-------------------------------
    174 *
    175 *  W A R M B U I L D
    176 *
    177 *  Return to builder from game
    178 *  Like coldstart but leave matrix & blueprint intact
    179 *
    180 *-------------------------------
    181 WARMBUILD
    182  sta $c009
    183 
    184  jsr movestuff
    185 
    186  jsr initbuilder
    187 
    188  jsr reloadblue ;from backup copy in aux l.c.
    189  jsr reloadbinfo
    190 
    191  jsr reconstruct ;matrix from blueprint
    192 
    193  jmp STARTBUILDER
    194 
    195 *-------------------------------
    196 initbuilder
    197 
    198  lda #1
    199  sta virgin ;nonzero
    200  sta menuflg
    201  sta shownums
    202  sta inbuilder
    203 ;sta sound
    204 
    205  jsr dblhgr
    206 
    207  jsr setfastmain ;bgtable in mainmem
    208 
    209  jsr initgetlnbuf
    210 
    211  lda #0
    212  sta level
    213  sta ineditor
    214  sta inmenu
    215 
    216  rts
    217 
    218 *-------------------------------
    219 STARTBUILDER
    220  jsr initinput
    221 
    222  jsr CTRPTR
    223 
    224  jsr SETUP
    225 
    226  jmp CYCLE
    227 
    228 *-------------------------------
    229 *
    230 *  C Y C L E
    231 *
    232 *-------------------------------
    233 CYCLE
    234  jsr input ;get joystick/kbd input
    235 ;(return command in A, 0 = none)
    236  jsr act ;& act on it
    237 
    238  jsr spkeys ;development keys
    239 
    240  lda setupflg ;redraw entire scrn?
    241  beq :1 ;no
    242 
    243  jsr SETUP
    244 
    245  jmp CYCLE
    246 
    247 :1 jsr moveblok
    248 
    249  jsr pageflip
    250 
    251  jmp CYCLE
    252 
    253 *-------------------------------
    254 *
    255 *  S T A R T C L E A R
    256 *
    257 *  Start with clear matrix
    258 *
    259 *-------------------------------
    260 STARTCLR
    261  lda #0 ;set character start posn:
    262 
    263  ldx #64
    264 :loop sta INFO,x
    265  inx
    266  cpx #70
    267  bcc :loop ;zero misc. INFO (kid, key, etc.)
    268 
    269  jsr STARTCL1 ;clear matrix
    270 
    271  jsr CLRLINKS ;zero link tables
    272 
    273  ldx #STBLOKX
    274  ldy #STBLOKY
    275  jsr :putblock
    276 
    277  ldx #STBLOKX+1
    278  ldy #STBLOKY
    279  jsr :putblock
    280 
    281  ldx #STBLOKX
    282  ldy #STBLOKY+1
    283  jsr :putblock
    284 
    285  ldx #STBLOKX+1
    286  ldy #STBLOKY+1
    287 
    288 :putblock
    289  stx MATX
    290  sty MATY
    291  jsr CALCMAT
    292 
    293  lda NUMNEXT
    294  ldy #0
    295  sta (ZTEMP),Y ;One block on screen
    296  sta SCRNUM
    297 
    298  tax
    299  lda MATX ;init blueprint room loc list
    300  sta INFO,x
    301  lda MATY
    302  sta INFO+MAXBLOX,x
    303 
    304  inc NUMNEXT
    305 
    306  jmp clrblock
    307 
    308 STARTCL1
    309  JSR CLEARMAT
    310 
    311  LDA #1
    312  STA NUMNEXT ;# (1-MAXBLOX) of next block to be drawn
    313 
    314  LDA #STULX
    315  STA ULX
    316  LDA #STULY
    317  STA ULY
    318 
    319  rts
    320 
    321 *-------------------------------
    322 *
    323 *  I N I T   I N P U T
    324 *
    325 *-------------------------------
    326 ;initinput
    327  lda $c010
    328 
    329  jsr setcenter
    330 
    331  jsr controller
    332 
    333  lda joyX
    334  beq :jok
    335  lda joyY
    336  beq :jok
    337 
    338  lda #0 ;If either jstk axis is centered,
    339  sta joyon ;assume a joystick is connected--
    340 ;else default to kbd-only mode
    341 :jok lda #0
    342  sta jcount
    343 
    344  rts
    345 
    346 *-------------------------------
    347 *
    348 * C T R P T R
    349 *
    350 * Center pointer
    351 *
    352 *-------------------------------
    353 CTRPTR LDA #arrow
    354  STA CURSOR
    355  STA savecurs
    356 
    357  LDA #STMATX
    358  STA MATX
    359  LDA #STMATY
    360  STA MATY
    361 
    362  LDA #STPTRX
    363  STA PTRX
    364  LDA #STPTRY
    365  STA PTRY
    366 
    367  LDA #STX
    368  STA BLOCKX
    369  LDA #/STX
    370  STA BLOCKX+1
    371 
    372  LDA #STY
    373  STA BLOCKY
    374 
    375  lda #0
    376  sta menuflg
    377 
    378 ]rts rts
    379 
    380 *-------------------------------
    381 *
    382 *  S P E C I A L   K E Y S
    383 *
    384 *-------------------------------
    385 spkeys
    386  lda keypress
    387  bpl ]rts
    388 
    389  cmp #kcopy
    390  beq :copy
    391  cmp #kcopy-SHIFT
    392  bne :notc
    393 
    394 :copy jmp COPY
    395 
    396 :notc cmp #kdelblock
    397  beq :delblock
    398  cmp #kdelblock-SHIFT
    399  bne :notd
    400 :delblock ;not operational yet
    401  rts
    402 
    403 :notd
    404  cmp #kcreateDD
    405  bne :11
    406  jsr setdatadisk
    407 :cd lda #5 ;create blank directory
    408  jmp dodialog
    409 
    410 :11 cmp #kcreateMD
    411  bne :11a
    412  jsr setmasterdisk
    413  jmp :cd
    414 
    415 :11a cmp #kcreateGD1
    416  bne :11b
    417  jsr setgamedisk1
    418  jmp :cd
    419 
    420 :11b cmp #kcreateGD2
    421  bne :2
    422  jsr setgamedisk2
    423  lda #POPside2
    424  sta BBundID
    425  jsr :cd
    426  lda #POPside1
    427  sta BBundID
    428  rts
    429 
    430 :2 cmp #ksavegame1
    431  bne :2a
    432  jmp bsavegame1
    433 
    434 :2a cmp #ksavegame2
    435  bne :3
    436  jmp bsavegame2
    437 
    438 :3 cmp #kdelgame
    439  bne :4
    440  jmp bdelgame
    441 
    442 :4 cmp #krelink
    443  bne :5
    444  jmp relink
    445 
    446 :5
    447 :rts
    448 ]rts rts
    449 
    450 *-------------------------------
    451 *
    452 *  B S A V E  G A M E
    453 *
    454 * save level -- game portion only
    455 *
    456 *-------------------------------
    457 bsavegame1
    458  jsr setgamedisk1
    459  lda #POPside1
    460 ]bsg sta BBundID
    461 
    462  lda #$20
    463  sta PAGE
    464  lda $C054 ;show page 1
    465 
    466  jsr setsetup
    467 
    468  lda #2
    469  jsr dodialog
    470 
    471  cpx #$ff
    472  beq :done
    473  stx level
    474 
    475  jsr makeblue
    476  jsr writedir
    477  jsr dsavelevelg
    478 
    479 :done lda #POPside1 ;for master & data disks
    480  sta BBundID
    481  rts
    482 
    483 bsavegame2
    484  jsr setgamedisk2
    485  lda #POPside2
    486  jmp ]bsg
    487 
    488 *-------------------------------
    489 *
    490 *  Delete a file from game disk side 2
    491 *
    492 *-------------------------------
    493 bdelgame
    494  lda #POPside2
    495  sta BBundID
    496 
    497  lda #3
    498  jsr dodialog
    499 
    500  lda #POPside1
    501  sta BBundID
    502  rts
    503 
    504 *-------------------------------
    505 *
    506 *  A C T   O N   I N P U T
    507 *
    508 *  In: A = command (0 = none)
    509 *
    510 *-------------------------------
    511 act
    512  cmp #0
    513  beq :rts
    514 
    515  cmp #Cleft
    516  BNE :3
    517  JMP MLEFT
    518 
    519 :3 cmp #Cright
    520  BNE :4
    521  JMP MRIGHT
    522 
    523 :4 CMP #Cup
    524  BNE :5
    525  JMP MUP
    526 
    527 :5 CMP #Cdown
    528  BNE :nomove
    529  JMP MDOWN
    530 
    531 :nomove cmp #Cbtn0
    532  bne :6
    533 
    534  lda menuflg
    535  bne menufn
    536 
    537  JMP PULLPUSH
    538 
    539 :6 cmp #Cbtn1
    540  bne :7
    541 
    542  lda menuflg
    543  bne menufn
    544 
    545  jmp ZOOM
    546 
    547 :7
    548 :rts rts
    549 
    550 *-------------------------------
    551 * reconstruct matrix from blueprint
    552 
    553 reconstruct
    554  jsr STARTCL1
    555  jsr CTRPTR
    556  jmp readblue
    557 
    558 *-------------------------------
    559 *
    560 *  M E N U F N
    561 *
    562 * Menu bar functions
    563 *
    564 *-------------------------------
    565 menufn lda menuindx
    566 
    567  cmp #5
    568  bne :1 ;trashcan
    569 
    570 ]TrashButton
    571 
    572  jmp TRASH
    573 
    574 :1 cmp #3 ;delete
    575  bne :6
    576 
    577 ]DeleteButton
    578 
    579  lda #3
    580  jmp dodialog
    581 
    582 :6 cmp #4 ;clear
    583  bne :2
    584 
    585 ]ClearButton
    586 
    587  jsr setsetup
    588 
    589  lda #4
    590  jsr dodialog
    591  cpx #$ff
    592  beq :rts
    593 
    594  JSR STARTCLR
    595  JSR CTRPTR
    596 
    597  JMP SETUP
    598 
    599 :2 cmp #1 ;load
    600  bne :3
    601 
    602 ]LoadButton
    603  jsr setsetup
    604 
    605  lda #1
    606  jsr dodialog
    607 
    608  cpx #$ff
    609  beq :rts
    610  stx level
    611 
    612  jsr dloadlevel
    613 
    614  jsr reconstruct ;matrix from blueprint
    615 
    616  jmp SETUP
    617 
    618 :3 cmp #2 ;save
    619  bne :4
    620 
    621 ]SaveButton
    622 
    623 * Note--save routine uses aux hires 1 for scratch
    624 * so do dialog on page 2
    625 
    626  lda #$20
    627  sta PAGE
    628  lda $C054 ;show page 1
    629 
    630  jsr setsetup
    631 
    632  jsr setmasterdisk ;data disk will do too
    633 
    634  lda #2
    635  jsr dodialog
    636 
    637  cpx #$ff
    638  beq :rts
    639  stx level
    640 
    641  jsr makeblue
    642  jsr writedir
    643  jsr dsavelevel
    644 
    645  jmp SETUP
    646 
    647 :4 cmp #0 ;play
    648  bne :5
    649 
    650 ]PlayButton
    651 
    652  jmp goplay
    653 
    654 :5
    655 :rts rts
    656 
    657 *-------------------------------
    658 *
    659 *  M O V E   B L O C K
    660 *
    661 *-------------------------------
    662 MLEFT lda menuflg
    663  bne menuleft
    664 
    665  lda PTRX
    666  cmp #LEFTEJ
    667  bne :cont
    668 
    669  jsr scrright
    670  jmp setsetup
    671 
    672 :cont DEC PTRX
    673  DEC MATX
    674 
    675  LDA BLOCKX
    676  SEC
    677  SBC #DX
    678  STA BLOCKX
    679  BCS :1
    680  DEC BLOCKX+1
    681 
    682 :1 rts
    683 
    684 
    685 menuleft ldx menuindx
    686  beq menuxset
    687 
    688  dex
    689  stx menuindx
    690 
    691 menuxset lda barlistl,x
    692  sta BLOCKX
    693  lda barlisth,x
    694  sta BLOCKX+1
    695 
    696  rts
    697 
    698 *-------------------------------
    699 MRIGHT lda menuflg
    700  bne mnuright
    701 
    702  lda PTRX
    703  cmp #RIGHTEJ
    704  bcc :cont
    705 
    706  jsr scrleft
    707  jmp setsetup
    708 
    709 :cont INC PTRX
    710  INC MATX
    711 
    712  LDA BLOCKX
    713  CLC
    714  ADC #DX
    715  STA BLOCKX
    716  BCC :1
    717  INC BLOCKX+1
    718 
    719 :1 RTS
    720 
    721 mnuright ldx menuindx
    722  cpx #menulen
    723  bcs :no
    724 
    725  inx
    726  stx menuindx
    727 
    728 :no jmp menuxset
    729 
    730 *-------------------------------
    731 MDOWN
    732  lda ineditor
    733  bne :normal
    734 
    735  lda PTRY
    736  cmp #TOPEJ-1
    737  bne :normal
    738 
    739  jsr exitmenu
    740 
    741  jmp :finish
    742 
    743 :normal lda PTRY
    744  cmp #BOTTOMEJ
    745  bcc :cont
    746 
    747  jsr scrup
    748  jmp setsetup
    749 
    750 :cont LDA BLOCKY
    751  CLC
    752  ADC #DY
    753  STA BLOCKY
    754 
    755 :finish inc PTRY
    756  inc MATY
    757 
    758  RTS
    759 
    760 *-------------------------------
    761 MUP lda ineditor
    762  bne :normal
    763 
    764  lda PTRY
    765  cmp #TOPEJ
    766  bne :normal
    767 
    768  jsr entrmenu
    769 
    770  jmp :finish
    771 
    772 :normal lda PTRY
    773  cmp #TOPEJ+1
    774  bcs :cont
    775 
    776  jsr scrdown
    777  jmp setsetup
    778 
    779 :cont LDA BLOCKY
    780  SEC
    781  SBC #DY
    782  STA BLOCKY
    783 
    784 :finish DEC PTRY
    785  DEC MATY
    786 
    787  RTS
    788 
    789 *-------------------------------
    790 *
    791 *  S C R O L L
    792 *
    793 *-------------------------------
    794 scrright
    795  lda ULX
    796  cmp #minulx
    797  beq no
    798 
    799  dec ULX
    800  dec MATX
    801  rts
    802 
    803 scrleft
    804  lda ULX
    805  cmp #maxulx
    806  beq no
    807 
    808  inc ULX
    809  inc MATX
    810  rts
    811 
    812 scrup
    813  lda ULY
    814  cmp #maxuly
    815  beq no
    816 
    817  inc ULY
    818  inc MATY
    819  rts
    820 
    821 scrdown
    822  lda ULY
    823  cmp #minuly
    824  beq no
    825 
    826  dec ULY
    827  dec MATY
    828 no rts
    829 
    830 *-------------------------------
    831 setsetup ldx #1
    832  stx setupflg
    833  rts
    834 
    835 clrptr jsr dblpeel
    836  jsr pageflip
    837  jmp dblpeel ;remove ptr from both pages
    838 
    839 *-------------------------------
    840 *
    841 * T R A S H
    842 *
    843 *-------------------------------
    844 TRASH lda savecurs
    845  cmp #arrow
    846  bne :cont
    847 :rts rts
    848 
    849 :cont lda NUMNEXT
    850  cmp #3
    851  bcc :rts ;last block can't be deleted
    852 
    853  lda #arrow
    854  sta savecurs
    855  lda saveby
    856  clc
    857  adc #ARPY
    858  sta saveby ;enter as block--leave as arrow
    859 
    860 * Erase block #BLOCKNUM from matrix & INFO list
    861 
    862  lda MATX
    863  pha
    864  lda MATY
    865  pha
    866 
    867  ldx BLOCKNUM
    868  lda INFO,x
    869  sta MATX
    870  lda INFO+MAXBLOX,x
    871  sta MATY
    872  jsr CALCMAT
    873 
    874  ldy #0
    875  lda #0 ;empty-space code
    876  sta (ZTEMP),y ;to matrix
    877 
    878  lda #255 ;nonexistent-block code
    879  sta INFO,x ;x=BLOCKNUM
    880  sta INFO+MAXBLOX,x
    881 
    882 * If the block we just trashed was the latest entry,
    883 * decrement NUMNEXT to replace it; else wait till
    884 * we run out of new block #s, then go back & look for gaps
    885 
    886  lda NUMNEXT
    887  sec
    888  sbc #1
    889  cmp BLOCKNUM
    890  bne :later
    891  sta NUMNEXT
    892 
    893 :later pla
    894  sta MATY
    895  pla
    896  sta MATX
    897 
    898 :done jmp gtone ;"ok--it's done"
    899 
    900 *-------------------------------
    901 *
    902 * E N T E R M E N U
    903 *
    904 *-------------------------------
    905 entrmenu lda #1
    906  sta menuflg
    907 
    908  lda CURSOR
    909  sta savecurs
    910  lda BLOCKY
    911  sta saveby
    912 
    913  lda #arrow
    914  sta CURSOR ;Force cursor to arrow
    915  lda #barby
    916  sta BLOCKY
    917 
    918 * Move ptr to nearest button
    919 
    920  ldy PTRX
    921  ldx btnxlist-1,y
    922  stx menuindx
    923  jmp menuxset
    924 
    925 *-------------------------------
    926 *
    927 * E X I T M E N U
    928 *
    929 *-------------------------------
    930 exitmenu lda #0
    931  sta menuflg
    932 
    933  lda savecurs ;Exiting menu bar
    934  sta CURSOR ;Return cursor to prior state
    935 
    936  lda saveby
    937  sta BLOCKY
    938 
    939  ldx menuindx
    940  lda ptrxlist,x
    941  sta PTRX
    942 
    943  clc
    944  adc ULX
    945  sta MATX
    946 
    947  lda #xoffset
    948  sta BLOCKX
    949  lda #0
    950  sta BLOCKX+1
    951 
    952  ldx PTRX
    953 
    954 :loop dex
    955  beq :gotit
    956 
    957  lda BLOCKX
    958  clc
    959  adc #DX
    960  sta BLOCKX
    961 
    962  lda BLOCKX+1
    963  adc #0
    964  sta BLOCKX+1
    965 
    966  bpl :loop
    967 
    968 :gotit lda CURSOR
    969  cmp #arrow
    970  bne :ok
    971 
    972  lda BLOCKX
    973  clc
    974  adc #ARPX
    975  sta BLOCKX
    976 
    977  lda BLOCKX+1
    978  adc #0
    979  sta BLOCKX+1
    980 
    981 :ok rts
    982 
    983 *-------------------------------
    984 *
    985 * C O P Y
    986 *
    987 *-------------------------------
    988 COPY lda CURSOR
    989  cmp #arrow
    990  beq :ptr
    991 :rts rts
    992 
    993 :ptr jsr CALCMAT1
    994  ldy #0
    995  lda (MATPTR),y
    996  beq :rts ;no block here
    997 
    998  jsr bcalcblue
    999  lda BlueType
   1000  sta ZTEMP
   1001  lda BlueType+1
   1002  sta ZTEMP+1 ;ZTEMP: source block
   1003 
   1004  lda BlueSpec
   1005  sta ZTEMP+2
   1006  lda BlueSpec+1
   1007  sta ZTEMP+3
   1008 
   1009  jsr NEWBLOK ;clrblock sets BlueType,BlueSpec
   1010  bmi :rts ;not OK
   1011 
   1012  jmp copyblok
   1013 
   1014 *-------------------------------
   1015 copyblok ldy #29
   1016 
   1017 :loop lda (ZTEMP),y
   1018  sta (BlueType),y
   1019 
   1020  lda (ZTEMP+2),y
   1021  sta (BlueSpec),y
   1022  dey
   1023  bpl :loop
   1024  rts
   1025 
   1026 *-------------------------------
   1027 *
   1028 * P U L L / P U S H
   1029 *
   1030 *-------------------------------
   1031 PULLPUSH LDA CURSOR
   1032  CMP #arrow
   1033  beq :ptr
   1034  jmp PUSH ;Push block in
   1035 
   1036 :ptr JSR CALCMAT1
   1037 
   1038  LDY #0
   1039  LDA (MATPTR),Y
   1040  BEQ :new ;No block here--make a new one
   1041 
   1042  STA BLOCKNUM
   1043  sta number
   1044  JMP PULL ;Pull out block
   1045 
   1046 :new jsr NEWBLOK
   1047  bpl PUSH
   1048  rts  ;Not OK
   1049 
   1050 *-------------------------------
   1051 *
   1052 * P U S H
   1053 *
   1054 * Push block into place
   1055 *
   1056 *-------------------------------
   1057 PUSH JSR CALCMAT1
   1058 
   1059  LDY #0
   1060  LDA (MATPTR),Y
   1061  BEQ :11
   1062 
   1063  RTS ;There's a block here already
   1064 
   1065 :11 LDA BLOCKNUM
   1066  STA (MATPTR),Y
   1067 
   1068  tax
   1069  lda MATX
   1070  sta INFO,x
   1071  lda MATY
   1072  sta INFO+MAXBLOX,x
   1073 
   1074  LDA BLOCKX
   1075  STA TEMP
   1076  CLC
   1077  ADC #POPX
   1078  STA BLACKX
   1079 
   1080  LDA BLOCKX+1
   1081  STA TEMP+1
   1082  ADC #0
   1083  STA BLACKX+1
   1084 
   1085  LDA BLOCKY
   1086  STA TEMP+2
   1087  SEC
   1088  SBC #POPY
   1089  STA BLACKY
   1090 
   1091  LDA #POPY
   1092  STA TEMP+3
   1093 
   1094 :1 LDA BLOCKX
   1095  CLC
   1096  ADC #4
   1097  STA BLOCKX
   1098  LDA BLOCKX+1
   1099  ADC #0
   1100  STA BLOCKX+1
   1101 
   1102  LDA BLOCKY
   1103  SEC
   1104  SBC #1
   1105  STA BLOCKY
   1106 
   1107  jsr pushsub
   1108 
   1109  DEC TEMP+3
   1110  BNE :1
   1111 
   1112  jsr pushsub
   1113 
   1114 * Change cursor from block to pointer
   1115 
   1116  jsr zeropeels
   1117 
   1118  LDA #arrow
   1119  STA CURSOR
   1120 
   1121  LDA TEMP
   1122  CLC
   1123  ADC #ARPX
   1124  STA BLOCKX
   1125 
   1126  LDA TEMP+1
   1127  ADC #0
   1128  STA BLOCKX+1
   1129 
   1130  LDA TEMP+2
   1131  CLC
   1132  ADC #ARPY
   1133  STA BLOCKY
   1134 
   1135  RTS
   1136 
   1137 *-------------------------------
   1138 pushsub
   1139  JSR moveblok
   1140  JSR RESTORUR
   1141  jmp pageflip
   1142 
   1143 *-------------------------------
   1144 *
   1145 *  R E S T O R U R
   1146 *
   1147 * Restore neighboring blocks to U, R, and UR
   1148 *
   1149 *-------------------------------
   1150 RESTORUR lda menuflg
   1151  beq :cont
   1152  jmp :rts
   1153 
   1154 * Block above (U)?
   1155 
   1156 :cont LDX #0
   1157  LDY #-1
   1158  JSR GETNEIGH
   1159  BEQ :10
   1160  sta number
   1161 
   1162 * AND UMASK / ORA U
   1163 
   1164  LDA #8
   1165  STA IMAGE
   1166  LDA BLACKX
   1167  STA XCO
   1168  LDA BLACKX+1
   1169  STA OFFSET
   1170  LDA BLACKY
   1171  STA YCO
   1172  LDA #0
   1173  STA OPACITY
   1174  JSR dbldraw
   1175 
   1176  LDA #5
   1177  STA IMAGE
   1178  LDA BLACKX
   1179  STA XCO
   1180  LDA BLACKX+1
   1181  STA OFFSET
   1182  LDA BLACKY
   1183  STA YCO
   1184  LDA #1
   1185  STA OPACITY
   1186  JSR dbldraw
   1187 
   1188 * print block#
   1189 
   1190  LDA BLACKX
   1191  STA XCO
   1192  LDA BLACKX+1
   1193  STA OFFSET
   1194  LDA BLACKY
   1195  sec
   1196  sbc #DY
   1197  STA YCO
   1198  jsr prblokno
   1199 
   1200 * Block to right (R)?
   1201 
   1202 :10 LDX #1
   1203  LDY #0
   1204  JSR GETNEIGH
   1205  BEQ :11
   1206  sta number
   1207 
   1208 * AND RMASK / ORA R
   1209 
   1210  LDA #0
   1211  STA OPACITY
   1212  LDA #9
   1213  JSR XPL5
   1214 
   1215  LDA #1
   1216  STA OPACITY
   1217  LDA #6
   1218  JSR XPL5
   1219 
   1220 * print block#
   1221 
   1222  LDA BLACKX
   1223  clc
   1224  adc #DX
   1225  STA XCO
   1226  LDA BLACKX+1
   1227  adc #>DX
   1228  STA OFFSET
   1229  LDA BLACKY
   1230  STA YCO
   1231  jsr prblokno
   1232 
   1233 * Block to upper right (UR)?
   1234 
   1235 :11 LDX #1
   1236  LDY #-1
   1237  JSR GETNEIGH
   1238  BEQ :12
   1239  sta number
   1240 
   1241 * AND URMASK / ORA UR
   1242 
   1243  LDA #0
   1244  STA OPACITY
   1245  LDA #10
   1246  JSR XPL5
   1247 
   1248  LDA #1
   1249  STA OPACITY
   1250  LDA #7
   1251  JSR XPL5
   1252 
   1253 * print block#
   1254 
   1255  LDA BLACKX
   1256  clc
   1257  adc #DX
   1258  STA XCO
   1259  LDA BLACKX+1
   1260  adc #>DX
   1261  STA OFFSET
   1262  LDA BLACKY
   1263  sec
   1264  sbc #DY
   1265  STA YCO
   1266  jsr prblokno
   1267 
   1268 :12 lda BLOCKNUM
   1269  sta number
   1270 :rts rts
   1271 
   1272 *-------------------------------
   1273 *
   1274 * P U L L
   1275 *
   1276 * Pull block out
   1277 *
   1278 *-------------------------------
   1279 PULL LDA #0
   1280  STA (MATPTR),Y
   1281 
   1282  JSR dblpeel
   1283  JSR pageflip
   1284  JSR dblpeel
   1285 
   1286  jsr zeropeels
   1287 
   1288  LDA #bblock
   1289  STA CURSOR
   1290 
   1291  LDA BLOCKX
   1292  SEC
   1293  SBC #ARPX
   1294  STA TEMP
   1295 
   1296  LDA BLOCKX+1
   1297  SBC #0
   1298  STA TEMP+1
   1299 
   1300  LDA BLOCKY
   1301  SEC
   1302  SBC #ARPY
   1303  STA TEMP+2 ;TEMP is where block's going to end up
   1304 
   1305  LDA TEMP
   1306  CLC
   1307  ADC #POPX
   1308  STA BLOCKX
   1309  STA BLACKX
   1310 
   1311  LDA TEMP+1
   1312  ADC #0
   1313  STA BLOCKX+1
   1314  STA BLACKX+1
   1315 
   1316  LDA TEMP+2
   1317  SEC
   1318  SBC #POPY
   1319  STA BLOCKY ;BLOCKX-Y is where block's sitting now
   1320  STA BLACKY
   1321 
   1322  jsr animpull
   1323 
   1324 :no rts
   1325 
   1326 *-------------------------------
   1327 *
   1328 * A N I M P U L L
   1329 *
   1330 *-------------------------------
   1331 animpull JSR ERASEBLOK
   1332 
   1333  jsr moveblok
   1334  jsr RESTORUR
   1335  jsr pageflip
   1336 
   1337  jsr ERASEBLOK
   1338 
   1339  LDA #POPY
   1340  STA TEMP+3 ;Counter
   1341 
   1342 :1 LDA BLOCKX
   1343  SEC
   1344  SBC #4
   1345  STA BLOCKX
   1346 
   1347  LDA BLOCKX+1
   1348  SBC #0
   1349  STA BLOCKX+1
   1350 
   1351  INC BLOCKY
   1352 
   1353  jsr moveblok
   1354  jsr RESTORUR
   1355  jsr pageflip
   1356 
   1357  DEC TEMP+3
   1358  BNE :1
   1359 
   1360  jsr moveblok
   1361  jsr RESTORUR
   1362 
   1363 * Change cursor from pointer to block
   1364 
   1365  LDA TEMP
   1366  STA BLOCKX
   1367  LDA TEMP+1
   1368  STA BLOCKX+1
   1369  LDA TEMP+2
   1370  STA BLOCKY
   1371 
   1372  RTS
   1373 
   1374 *-------------------------------
   1375 *
   1376 * E R A S E B L O K
   1377 *
   1378 *-------------------------------
   1379 ERASEBLOK
   1380  LDA #2
   1381  STA IMAGE
   1382  LDA BLOCKX
   1383  STA XCO
   1384  LDA BLOCKX+1
   1385  STA OFFSET
   1386  LDA BLOCKY
   1387  STA YCO
   1388  LDA #0
   1389  STA OPACITY
   1390  JSR dbldraw ;Erase existing block ("AND" BLOCKMASK)
   1391 
   1392  lda menuflg
   1393  bne :1
   1394 
   1395  JSR RESTORDL
   1396 
   1397  JSR RESTORUR
   1398 
   1399 :1 RTS
   1400 
   1401 *-------------------------------
   1402 *
   1403 * R E S T O R D L
   1404 *
   1405 *-------------------------------
   1406 RESTORDL LDX #-1
   1407  LDY #1
   1408  JSR GETNEIGH
   1409  BEQ :10
   1410 
   1411 * ORA DL
   1412 
   1413 :15 LDA #11
   1414  STA IMAGE
   1415  LDA BLACKX
   1416  STA XCO
   1417  LDA BLACKX+1
   1418  STA OFFSET
   1419  LDA BLACKY
   1420  CLC
   1421  ADC #12
   1422  STA YCO
   1423  LDA #1
   1424  STA OPACITY
   1425  JSR dbldraw
   1426 
   1427 :10 LDX #-1
   1428  LDY #0
   1429  JSR GETNEIGH
   1430  BEQ :11
   1431 
   1432 * AND LMASK / ORA L
   1433 
   1434  LDA #19
   1435  STA IMAGE
   1436  LDA BLACKX
   1437  STA XCO
   1438  LDA BLACKX+1
   1439  STA OFFSET
   1440  LDA BLACKY
   1441  STA YCO
   1442  LDA #0
   1443  STA OPACITY
   1444  JSR dbldraw
   1445 
   1446  LDA #12
   1447  STA IMAGE
   1448  LDA BLACKX
   1449  STA XCO
   1450  LDA BLACKX+1
   1451  STA OFFSET
   1452  LDA BLACKY
   1453  STA YCO
   1454  LDA #1
   1455  STA OPACITY
   1456  JSR dbldraw
   1457 
   1458 :11 LDX #0
   1459  LDY #1
   1460  JSR GETNEIGH
   1461  BEQ :12
   1462 
   1463 * ORA D
   1464 
   1465  LDA #13
   1466  STA IMAGE
   1467  LDA BLACKX
   1468  STA XCO
   1469  LDA BLACKX+1
   1470  STA OFFSET
   1471  LDA BLACKY
   1472  CLC
   1473  ADC #12
   1474  STA YCO
   1475  LDA #1
   1476  STA OPACITY
   1477  JSR dbldraw
   1478 
   1479 :12 RTS
   1480 
   1481 zerobuf rts
   1482  do 0
   1483 zerobuf ldx BUFFLAG
   1484  inx
   1485  lda BUFADL,X
   1486  sta IMAGE
   1487  lda BUFADH,X
   1488  sta IMAGE+1
   1489  lda #0
   1490  tay
   1491  sta (IMAGE),y
   1492  rts
   1493  fin
   1494 
   1495 *-------------------------------
   1496 *
   1497 * G E T N E I G H
   1498 *
   1499 * Given: DX & DY (in X & Y)
   1500 * Return: Contents of neighboring space (in A)
   1501 *
   1502 *-------------------------------
   1503 GETNEIGH LDA MATX
   1504  PHA
   1505  LDA MATY
   1506  PHA
   1507 
   1508  TXA
   1509  CLC
   1510  ADC MATX
   1511  STA MATX
   1512  bmi :no
   1513  cmp #XDIM
   1514  bcs :no
   1515 
   1516  TYA
   1517  CLC
   1518  ADC MATY
   1519  STA MATY
   1520  bmi :no
   1521  cmp #YDIM
   1522  bcs :no
   1523 
   1524  JSR CALCMAT
   1525 
   1526  LDY #0
   1527  LDA (ZTEMP),Y
   1528  tax
   1529 
   1530 :done pla
   1531  sta MATY
   1532  pla
   1533  sta MATX
   1534 
   1535  txa
   1536  rts
   1537 
   1538 :no ldx #0
   1539  beq :done
   1540 
   1541 *-------------------------------
   1542 *
   1543 * C L E A R M A T
   1544 *
   1545 * Clear matrix (32 x 32)
   1546 *
   1547 *-------------------------------
   1548 CLEARMAT LDA #MATBASE
   1549  STA ZTEMP
   1550  LDA #/MATBASE
   1551  STA ZTEMP+1
   1552 
   1553  LDA #0
   1554  LDY #0
   1555 :1 STA (ZTEMP),Y
   1556  INC ZTEMP
   1557  BNE :1
   1558  INC ZTEMP+1
   1559  LDX ZTEMP+1
   1560  CPX #/ENDMAT
   1561  BCC :1
   1562 
   1563  RTS
   1564 
   1565 *-------------------------------
   1566 *
   1567 * D R A W M A T
   1568 *
   1569 * Put a visual depiction of matrix onscreen
   1570 *
   1571 * Matrix dimensions: XDIM x YDIM
   1572 * Grid dimensions: SCANWID x SCANHT
   1573 * Matrix coords of grid's upper-leftmost block: (ULX,ULY)
   1574 * Screen coords of grid's lower-leftmost block: (LLX,LLY)
   1575 *
   1576 *-------------------------------
   1577 DRAWMAT LDA MATX
   1578  PHA
   1579  LDA MATY
   1580  PHA
   1581  LDA BLOCKX
   1582  PHA
   1583  LDA BLOCKX+1
   1584  PHA
   1585  LDA BLOCKY
   1586  PHA
   1587 
   1588  lda #scrntop
   1589  sta TOPCUT ;leave margin for menu bar
   1590 
   1591 * Scan screen L-R, B-T
   1592 
   1593  LDA #SCANHT-1
   1594  CLC
   1595  ADC ULY
   1596  STA MATY
   1597 
   1598  LDA #SCANWID
   1599  CLC
   1600  ADC ULX
   1601  STA RMARGIN
   1602 
   1603  LDA #LLY
   1604  STA BLOCKY
   1605 
   1606 * Do a line
   1607 
   1608 :4 LDA #LLX
   1609  STA BLOCKX
   1610  LDA #/LLX
   1611  STA BLOCKX+1
   1612 
   1613  lda #0
   1614  sta MATX
   1615  jsr CALCMAT
   1616 
   1617  LDA ULX
   1618  STA MATX
   1619 
   1620 :3 JSR LAYBLOK ;Lay down block if it's there
   1621 
   1622  LDA BLOCKX
   1623  CLC
   1624  ADC #DX
   1625  STA BLOCKX
   1626 
   1627  LDA BLOCKX+1
   1628  ADC #/DX
   1629  STA BLOCKX+1
   1630 
   1631  INC MATX
   1632  LDA MATX
   1633  CMP RMARGIN
   1634  BNE :3
   1635 
   1636 * Next line up
   1637 
   1638  LDA BLOCKY
   1639  SEC
   1640  SBC #DY
   1641  STA BLOCKY
   1642 
   1643  DEC MATY
   1644 
   1645  LDA MATY
   1646  BMI :done
   1647  CMP ULY
   1648  BCS :4
   1649  LDA ULY
   1650  BMI :4
   1651 
   1652 :done PLA
   1653  STA BLOCKY
   1654  PLA
   1655  STA BLOCKX+1
   1656  PLA
   1657  STA BLOCKX
   1658  PLA
   1659  STA MATY
   1660  PLA
   1661  STA MATX
   1662 
   1663  lda #0
   1664  sta TOPCUT
   1665 
   1666  lda BLOCKNUM
   1667  sta number
   1668  RTS
   1669 
   1670 *-------------------------------
   1671 *
   1672 *  L A Y  B L O K
   1673 *
   1674 *  Lay down a block (if it's there)
   1675 *
   1676 *-------------------------------
   1677 LAYBLOK ldy MATX
   1678  bmi :no
   1679  cpy #XDIM
   1680  bcs :no
   1681 
   1682  lda MATY
   1683  bmi :no
   1684  cmp #YDIM
   1685  bcs :no
   1686 
   1687  lda (ZTEMP),Y
   1688  beq :no
   1689  sta number
   1690 
   1691  LDA #2
   1692  STA IMAGE
   1693  LDA BLOCKX
   1694  STA XCO
   1695  LDA BLOCKX+1
   1696  STA OFFSET
   1697  LDA BLOCKY
   1698  STA YCO
   1699  LDA #0
   1700  STA OPACITY
   1701  JSR dbldraw
   1702 
   1703  LDA #1
   1704  STA IMAGE
   1705  LDA BLOCKX
   1706  STA XCO
   1707  LDA BLOCKX+1
   1708  STA OFFSET
   1709  LDA BLOCKY
   1710  STA YCO
   1711  LDA #1
   1712  STA OPACITY
   1713  jsr dbldraw
   1714 
   1715  LDA BLOCKX
   1716  STA XCO
   1717  LDA BLOCKX+1
   1718  STA OFFSET
   1719  LDA BLOCKY
   1720  STA YCO
   1721  jmp prblokno
   1722 
   1723 :no RTS
   1724 
   1725 *-------------------------------
   1726 *
   1727 *  X P L 5
   1728 *
   1729 *-------------------------------
   1730 XPL5 STA IMAGE
   1731  LDA BLACKX
   1732  CLC
   1733  ADC #35
   1734  STA XCO
   1735  LDA BLACKX+1
   1736  ADC #0
   1737  STA OFFSET
   1738  LDA BLACKY
   1739  STA YCO
   1740  JMP dbldraw
   1741 
   1742 *-------------------------------
   1743 *
   1744 * N E W B L O K
   1745 *
   1746 *-------------------------------
   1747 NEWBLOK LDA NUMNEXT
   1748  CMP #MAXBLOX+1
   1749  beq :recycle ;out of fresh blocks
   1750 
   1751  sta BLOCKNUM
   1752  sta number
   1753  CLC
   1754  ADC #1
   1755  STA NUMNEXT
   1756 
   1757 :cont lda BLOCKX
   1758  sec
   1759  sbc #ARPX
   1760  sta BLOCKX
   1761 
   1762  lda BLOCKX+1
   1763  sbc #0
   1764  sta BLOCKX+1
   1765 
   1766  lda BLOCKY
   1767  sec
   1768  sbc #ARPY
   1769  sta BLOCKY
   1770 
   1771  lda #bblock
   1772  sta CURSOR
   1773 
   1774  lda BLOCKNUM
   1775  sta SCRNUM
   1776 
   1777  jsr clrblock
   1778 
   1779  lda #0 ;"OK"
   1780  rts
   1781 
   1782 * we're out of fresh blocks -- now go back & look for
   1783 * discarded ones we can reuse
   1784 
   1785 :recycle
   1786  ldx #1 ;block #
   1787 :loop lda INFO,x
   1788  bmi :got_one ;255 = discarded-block code
   1789  inx
   1790  cpx #MAXBLOX+1
   1791  bcc :loop
   1792 ;all blocks in use
   1793 :braap jsr gtone
   1794  lda #-1 ;"NO"
   1795  rts
   1796 
   1797 :got_one stx BLOCKNUM
   1798  stx number
   1799  bne :cont
   1800 
   1801 *-------------------------------
   1802 *
   1803 * Z O O M
   1804 *
   1805 * Zoom in on this block
   1806 *
   1807 *-------------------------------
   1808 ZOOM JSR CALCMAT1
   1809 
   1810  LDY #0
   1811  LDA (MATPTR),Y
   1812  BEQ NOBLOK ;No block here
   1813 
   1814  STA SCRNUM
   1815 
   1816 * Cut to large-scale view of block's contents (single hi-res)
   1817 
   1818  lda $c054
   1819  lda $c056 ;lores p1
   1820  jsr swsingle
   1821  jsr storemenu
   1822 
   1823  lda #1
   1824  sta ineditor
   1825 
   1826  jmp edstart
   1827 
   1828 *-------------------------------
   1829 * R T N B U I L D : return to builder from editor
   1830 * or from reboot
   1831 
   1832 RTNBUILD sta $c009
   1833 
   1834  lda #0
   1835  sta ineditor
   1836  jsr swsingle
   1837  lda $c054
   1838  lda $c056 ;show lores p. 1 (black)
   1839  JSR SETUP
   1840 
   1841 NOBLOK JMP CYCLE
   1842 
   1843 *-------------------------------
   1844 *
   1845 * S E T U P
   1846 *
   1847 * Set up builder screen on both pages (double hi-res)
   1848 *
   1849 *-------------------------------
   1850 SETUP jsr zeropeels
   1851 
   1852  lda #0
   1853  sta setupflg
   1854 
   1855  jsr dodblcls
   1856  jsr DRAWMAT
   1857  jsr MENUBAR
   1858 
   1859  lda $c057
   1860  jsr swdouble ;set dblhires
   1861  jsr pageflip ;draw & show 1 page
   1862 
   1863  jsr copyscrn
   1864  jsr copyauxscrn ;copy to other page
   1865 
   1866  jsr moveblok
   1867 
   1868  jsr pageflip
   1869 
   1870  rts
   1871 
   1872 *-------------------------------
   1873 *
   1874 *  M E N U B A R
   1875 *
   1876 *  Draw menu bar across top of screen
   1877 *
   1878 *-------------------------------
   1879 MENUBAR
   1880  lda #0
   1881  sta TOPCUT
   1882 
   1883  ldx #numbtns
   1884 
   1885  dex ;for now (will be trash)
   1886 
   1887 :loop stx TEMP
   1888 
   1889  lda #ora
   1890  jsr drawicon
   1891 
   1892  ldx TEMP
   1893  dex
   1894  bpl :loop
   1895 
   1896  rts
   1897 
   1898 drawicon
   1899  sta OPACITY
   1900 
   1901  lda btnimg,x
   1902  sta IMAGE
   1903 
   1904  lda btnxl,x
   1905  sta XCO
   1906  lda btnxh,x
   1907  sta OFFSET
   1908 
   1909  lda btny,x
   1910  sta YCO
   1911 
   1912  jmp dbldraw
   1913 
   1914 *-------------------------------
   1915 *
   1916 * C A L C M A T
   1917 *
   1918 * Given: MATX & MATY (0-31)
   1919 * Return: ZTEMP = 32*MATY + MATX
   1920 *
   1921 *-------------------------------
   1922 CALCMAT LDA MATY
   1923  STA ZTEMP
   1924  LDA #0
   1925  STA ZTEMP+1
   1926 
   1927  ASL ZTEMP
   1928  ROL ZTEMP+1
   1929  ASL ZTEMP
   1930  ROL ZTEMP+1
   1931  ASL ZTEMP
   1932  ROL ZTEMP+1
   1933  ASL ZTEMP
   1934  ROL ZTEMP+1
   1935  ASL ZTEMP
   1936  ROL ZTEMP+1
   1937 
   1938  LDA MATX
   1939  CLC
   1940  ADC ZTEMP
   1941  STA ZTEMP
   1942 
   1943  LDA #/MATBASE
   1944  ADC ZTEMP+1
   1945  STA ZTEMP+1
   1946 
   1947  RTS
   1948 
   1949 CALCMAT1 JSR CALCMAT
   1950 
   1951  LDA ZTEMP
   1952  STA MATPTR
   1953  LDA ZTEMP+1
   1954  STA MATPTR+1
   1955 
   1956  RTS
   1957 
   1958 *-------------------------------
   1959 *
   1960 * R E A D B L U E
   1961 *
   1962 * read blueprint
   1963 *
   1964 * Use blueprint room loc list (INFO[0-63])
   1965 * to map blocks into 32x32 matrix
   1966 *
   1967 * In: blank matrix; blueprint just loaded from disk
   1968 *
   1969 *-------------------------------
   1970 readblue lda MATX
   1971  pha
   1972  lda MATY
   1973  pha
   1974 
   1975  lda INFO ;next available block #
   1976  sta NUMNEXT
   1977 
   1978  ldx #1
   1979  ldy #0
   1980 
   1981 :loop jsr getinfo
   1982  bmi :skip ;255 = nonexistent block
   1983  jsr CALCMAT
   1984  txa
   1985  sta (ZTEMP),y
   1986 
   1987 :skip inx
   1988  cpx NUMNEXT
   1989  bcc :loop
   1990 
   1991 :done pla
   1992  sta MATY
   1993  pla
   1994  sta MATX
   1995  rts
   1996 
   1997 getinfo lda INFO,x
   1998  sta MATX
   1999  lda INFO+MAXBLOX,x
   2000  sta MATY
   2001 ]rts rts
   2002 
   2003 *-------------------------------
   2004 *
   2005 *  G O P L A Y
   2006 *
   2007 *  Play level
   2008 *
   2009 *-------------------------------
   2010 goplay
   2011  jsr setmasterdisk
   2012 
   2013  lda #0
   2014  jsr dodialog
   2015 
   2016  cpx #$ff
   2017  beq ]rts
   2018 
   2019  jsr makeblue
   2020 
   2021  jsr savebinfo
   2022  jsr saveblue ;in aux l.c
   2023 
   2024  jsr gr ;show black lores
   2025  jmp gogame
   2026 
   2027 *-------------------------------
   2028 *
   2029 *  D O   D I A L O G
   2030 *
   2031 *  do dialog
   2032 *
   2033 *-------------------------------
   2034 dodialog
   2035  pha
   2036 
   2037  jsr clrptr
   2038 
   2039  pla
   2040  jsr dialog ;(show hidden page, do dialog on it,
   2041 ;hide it again)
   2042 
   2043 * Level # is returned in x-reg; ff if failure
   2044 
   2045  cpx #$ff
   2046  beq :fix
   2047 
   2048  lda setupflg ;will we be redrawing both screens from scratch?
   2049  bne ]rts ;yes
   2050 ;no--better fix them now
   2051 :fix txa
   2052  pha
   2053 
   2054  jsr copyscrn
   2055  jsr copyauxscrn ;copy shown page to hidden page
   2056 
   2057  lda #0
   2058  sta setupflg
   2059 
   2060  pla
   2061  tax
   2062  rts
   2063 
   2064 *-------------------------------
   2065 *
   2066 *  C L R  L I N K S
   2067 *
   2068 * Zero bLINK tables
   2069 * (no links assigned yet)
   2070 *
   2071 *-------------------------------
   2072 CLRLINKS ldx #0
   2073  txa
   2074 :loop sta bLINK1,x ;covers bLINK2
   2075  sta bLINK3,x ;covers bLINK4
   2076  inx
   2077  bne :loop
   2078  rts
   2079 
   2080 *===============================
   2081 *
   2082 *    M  A  K  E    B  L  U  E  P  R  I  N  T
   2083 *
   2084 *-------------------------------
   2085  dum locals
   2086 
   2087 glinkptr ds 1
   2088 cyindex ds 1
   2089 bitmask ds 1
   2090 tempscrn ds 1
   2091 ctypead ds 2
   2092 cGspecad ds 2
   2093 cBspecad ds 2
   2094 tempby ds 1
   2095 ctrlflag ds 1
   2096 ctrlindex ds 1
   2097 ctrlbyte ds 1
   2098 pptimer ds 1
   2099 symbtype ds 1
   2100 
   2101  dend
   2102 
   2103 *-------------------------------
   2104 makeblue
   2105  lda SCRNUM
   2106  pha
   2107 
   2108  jsr buildmap
   2109  jsr assemblinks
   2110 
   2111  pla
   2112  sta SCRNUM
   2113  rts
   2114 
   2115 *-------------------------------
   2116 * Build map from INFO
   2117 
   2118 buildmap
   2119  lda MATX
   2120  pha
   2121  lda MATY
   2122  pha
   2123 
   2124  lda NUMNEXT
   2125  sta INFO
   2126 
   2127  ldx #1 ;start w/ block #1
   2128 
   2129 :loop stx TEMP+1
   2130  jsr getinfo
   2131  bmi :skip ;255 = nonexistent block
   2132 
   2133  txa
   2134  asl
   2135  asl
   2136  sta TEMP
   2137 
   2138  ldx #-1
   2139  ldy #0
   2140  jsr GETNEIGH
   2141  ldy TEMP
   2142  sta MAP-4,y ;left
   2143 
   2144  ldx #1
   2145  ldy #0
   2146  jsr GETNEIGH
   2147  ldy TEMP
   2148  sta MAP-3,y ;right
   2149 
   2150  ldx #0
   2151  ldy #-1
   2152  JSR GETNEIGH
   2153  ldy TEMP
   2154  sta MAP-2,y ;up
   2155 
   2156  ldx #0
   2157  ldy #1
   2158  JSR GETNEIGH
   2159  ldy TEMP
   2160  sta MAP-1,y ;down
   2161 
   2162 :skip ldx TEMP+1
   2163  inx
   2164  cpx NUMNEXT
   2165  bcc :loop
   2166 
   2167 :done pla
   2168  sta MATY
   2169  pla
   2170  sta MATX
   2171  rts
   2172 
   2173 *-------------------------------
   2174 *
   2175 *  A S S E M B L E   L I N K   T A B L E S
   2176 *
   2177 * Use the raw linkage data in BUILDERINFO to
   2178 * build the LINKLOC/LINKMAP tables in BLUEPRINT.
   2179 *
   2180 * BLUESPEC:
   2181 * For controllers: pointer (0-255) to first LINKLOC entry
   2182 *  for this controller
   2183 * For gadgets: gadget's current state
   2184 *
   2185 * LINKLOC:
   2186 *  Bits 0-4: screen posn (0-29)
   2187 *  Bits 5-6: low 2 bits of screen # (1-24)
   2188 *  Bit 7: 1 = this is last entry, 0 = more to come
   2189 *
   2190 * LINKMAP:
   2191 *  Bits 0-4 (first entry only): pressplate timer (0-31)
   2192 *  Bits 5-7: high 3 bits of screen #
   2193 *
   2194 *-------------------------------
   2195 * Assemble link table for this entire level
   2196 
   2197 assemblinks
   2198  lda #0
   2199  sta glinkptr ;to first free byte in LINKLOC
   2200 
   2201  lda NUMNEXT
   2202  sec
   2203  sbc #1
   2204  sta SCRNUM
   2205 
   2206 :loop jsr assemble1
   2207 
   2208  dec SCRNUM
   2209  bne :loop
   2210  rts
   2211 
   2212 *-------------------------------
   2213 * Assemble link table for every controller on this screen
   2214 
   2215 assemble1
   2216  lda SCRNUM
   2217  jsr bcalcblue ;returns BLUETYPE in BlueType
   2218 ;   "    BLUESPEC in BlueSpec
   2219  ;   "    bLINDEX in bLinkIndex
   2220  lda BlueType
   2221  sta ctypead
   2222  lda BlueType+1
   2223  sta ctypead+1 ;bluetype of controller screen
   2224 
   2225  lda bLinkIndex
   2226  sta cBspecad
   2227  lda bLinkIndex+1
   2228  sta cBspecad+1 ;link index of controller screen
   2229 
   2230  lda BlueSpec
   2231  sta cGspecad
   2232  lda BlueSpec+1
   2233  sta cGspecad+1 ;game bluespec of controller screen
   2234 
   2235  ldy #29 ;block #
   2236 :loop sty cyindex
   2237 
   2238  lda (ctypead),y
   2239  and #idmask
   2240  cmp #pressplate
   2241  beq :pp
   2242  cmp #upressplate
   2243  bne :skip ;not a controller
   2244 :pp
   2245  lda (cBspecad),y ;link index
   2246  sta ctrlindex
   2247  bpl :ok
   2248 
   2249  jsr gtone ;braap!
   2250  lda ctrlindex
   2251  jsr showpage
   2252  jmp :skip ;unlinked controller--shouldn't happen
   2253 
   2254 :ok tax ;x = link index
   2255 
   2256  jsr addlist
   2257 
   2258 :skip ldy cyindex
   2259  dey
   2260  bpl :loop
   2261 
   2262  rts
   2263 
   2264 *-------------------------------
   2265 *
   2266 *  A D D   L I S T
   2267 *
   2268 * Make list of gadgets controlled by this controller
   2269 * and add it to LINKLOC/LINKMAP
   2270 * (Do one byte at a time)
   2271 *
   2272 * In: y = cyindex (controller block #)
   2273 *
   2274 *-------------------------------
   2275 addlist
   2276  lda glinkptr
   2277  sta (cGspecad),y ;y = controller block #
   2278 
   2279  lda #0
   2280  sta ctrlflag ;no matches yet
   2281 
   2282  lda #bLINK1
   2283  sta sm1+1
   2284  sta sm2+1
   2285  lda #>bLINK1
   2286  sta sm1+2
   2287  sta sm2+2
   2288 
   2289  lda #0 ;global
   2290  jsr dobyte ;byte 1
   2291 
   2292  lda #bLINK2
   2293  sta sm1+1
   2294  sta sm2+1
   2295  lda #>bLINK2
   2296  sta sm1+2
   2297  sta sm2+2
   2298 
   2299  lda #0 ;global
   2300  jsr dobyte ;byte 2
   2301 
   2302  lda #bLINK3
   2303  sta sm1+1
   2304  sta sm2+1
   2305  lda #>bLINK3
   2306  sta sm1+2
   2307  sta sm2+2
   2308 
   2309  lda #1 ;local
   2310  jsr dobyte ;byte 3
   2311 
   2312  ldx glinkptr ;to next free byte in LINKLOC
   2313 
   2314  lda ctrlflag
   2315  beq :nomatches ;still zero...
   2316 
   2317 * There's been at least one match.
   2318 * Set hibit of last LINKLOC entry.
   2319 
   2320 :continue
   2321  dex
   2322  lda LINKLOC,x
   2323  ora #$80 ;set hibit
   2324  sta LINKLOC,x
   2325  rts
   2326 
   2327 * This "controller" controls nothing.  Signify this by
   2328 * setting LINKLOC to $FF (an otherwise unattainable value)
   2329 * and LINKMAP to initial value of pp timer
   2330 
   2331 :nomatches
   2332  lda #$ff
   2333  sta LINKLOC,x
   2334 
   2335  lda #0 ;initial pptimer value
   2336  sta LINKMAP,x
   2337 
   2338  inc glinkptr
   2339  rts
   2340 
   2341 *-------------------------------
   2342 * In: A = symbol type (0 = global, 1 = local)
   2343 
   2344 dobyte
   2345  sta symbtype
   2346 
   2347  ldx ctrlindex
   2348 sm2 lda bLINK1,x ;self-modifying code
   2349  ;(can be bLINK1,2 or 3)
   2350  sta ctrlbyte ;controller bLINKbyte
   2351 
   2352 * Do one bit at a time
   2353 
   2354  lda #1
   2355 :loop sta bitmask
   2356  and ctrlbyte
   2357  beq :skipbit ;this bit is clear
   2358 
   2359  jsr dobit
   2360 
   2361 :skipbit lda bitmask
   2362  asl ;next bit
   2363  bpl :loop
   2364 ;hi bit is unused
   2365  rts
   2366 
   2367 *-------------------------------
   2368 dobit
   2369  lda symbtype
   2370  bne :local
   2371 
   2372 * Global symbol --
   2373 * Test every object on every screen in this level
   2374 * to see if this bit is set
   2375 
   2376  lda NUMNEXT ;#+1 of screens in this level
   2377  sec
   2378  sbc #1
   2379  sta tempscrn
   2380 
   2381 :nextscrn
   2382  jsr doscrn
   2383 
   2384  dec tempscrn
   2385  bne :nextscrn ;next screen
   2386  rts
   2387 
   2388 * Local symbol -- do this scrn only
   2389 
   2390 :local lda SCRNUM
   2391  sta tempscrn
   2392 
   2393  jmp doscrn
   2394 
   2395 *-------------------------------
   2396 * do a screen
   2397 * In: tempscrn
   2398 
   2399 doscrn
   2400  lda tempscrn
   2401  jsr bcalcblue ;returns BlueType,Bluespec,bLinkIndex
   2402 
   2403  ldy #29 ;block #
   2404 :loop jsr testobj
   2405  dey
   2406  bpl :loop ;next block
   2407 
   2408  rts
   2409 
   2410 *-------------------------------
   2411 * If object is a gadget, test it for this bit;
   2412 * if bit is set, add object to list
   2413 
   2414 * In: BlueType, bLinkIndex
   2415 * In & out: y = block #
   2416 
   2417 testobj
   2418  lda (bLinkIndex),y
   2419  bmi :rts ;ff means object is unlinked
   2420 
   2421  tax ;x = link index (0-127)
   2422 
   2423  lda (BlueType),y
   2424  and #idmask ;objid
   2425 ;is it a controllable gadget?
   2426  cmp #gate
   2427  beq yes
   2428 
   2429  cmp #exit
   2430  beq yes
   2431 
   2432 * NOTE--insert other controllable gadgets here
   2433 * as we implement them
   2434 
   2435 :rts rts
   2436 
   2437 yes
   2438 sm1 lda bLINK1,x ;self-modifying code
   2439  ;(can be BLINK1,2 or 3)
   2440  and bitmask
   2441  beq :rts ;bit is clear
   2442 ;bit is set
   2443 
   2444 * We have a match -- add this gadget to LINKlist
   2445 
   2446  lda #1
   2447  sta ctrlflag ;so we know there's at least one
   2448  ;gadget in list
   2449 
   2450  ldx glinkptr ;to first free byte in LINKLOC
   2451 
   2452  sty tempby ;gadget block # (0-29)
   2453 
   2454  lda tempscrn ;gadget screen # (1-24)
   2455  and #%00000011 ;2 low bits
   2456  asl
   2457  asl
   2458  asl
   2459  asl
   2460  asl ;bits 5-6: 2 low bits of screen#
   2461  ora tempby ;bits 0-4: block#
   2462  sta LINKLOC,x ;bit 7 clear (for now)
   2463 
   2464  lda tempscrn
   2465  and #%00011100 ;3 high bits
   2466  asl
   2467  asl
   2468  asl ;bits 5-7: 3 high bits of screen#
   2469 
   2470  ora #0 ;bits 0-4: init value of timer
   2471 
   2472  sta LINKMAP,x
   2473 
   2474  inc glinkptr ;but not past 255
   2475 
   2476 :rts rts
   2477 
   2478 *-------------------------------
   2479  lst
   2480  ds 1
   2481  usr $a9,24,$0000,*-org
   2482  lst off