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

MBLAST.S (6430B)


      1 * mblast
      2 org = $3000
      3  lst off
      4 *-------------------------------
      5 *
      6 *  M B L A S T
      7 *
      8 *  Blast music table to 18-sector disk
      9 *  in drive 1
     10 *
     11 *  Can be BRUN from Applesoft (ProDos or 3.3)
     12 *
     13 *  First BLOAD music table into main mem at TabStart
     14 *
     15 *-------------------------------
     16  org org
     17 
     18  jmp mblast
     19 
     20 *-------------------------------
     21 TrackNo = 19
     22 TabStart = $2000
     23 TablEnd = $2600
     24 
     25 *-------------------------------
     26 rw18buf = $3800
     27 endrwbuf = $4000
     28 
     29 temp18buf = $4000
     30 rw18 = $d000
     31 
     32 floppyslot = 6
     33 floppydrive = 1
     34 
     35 BbundID = $a9
     36 
     37 slot = $fd
     38 ztrack = $fe
     39 
     40  dum $300
     41 TABLEND ds 1 ;hi byte
     42 TABSTART ds 1 ;hi byte
     43 TRACK ds 1
     44  dend
     45 
     46  dum $f0
     47 obj_lo ds 1
     48 obj_hi ds 1
     49 dst_lo ds 1
     50 dst_hi ds 1
     51 len_lo ds 1
     52 len_hi ds 1
     53 flushflag ds 1
     54  dend
     55 
     56 *-------------------------------
     57 *
     58 *  M B L A S T
     59 *
     60 *-------------------------------
     61 mblast
     62 
     63 * move rw18 to l.c.
     64 
     65  sta $c083 ;read/write RAM
     66 
     67  lda #>rw18
     68  ldx #>rw18buf
     69  ldy #>endrwbuf
     70 
     71  jsr movemem
     72 
     73 * message
     74 
     75  jsr MSG
     76 
     77 * blast music
     78 
     79  lda #TrackNo
     80  sta TRACK
     81 
     82  lda #>TabStart
     83  sta TABSTART
     84 
     85  lda #>TablEnd
     86  sta TABLEND
     87 
     88  jsr blast18
     89 
     90 * Done
     91 
     92  jmp MSG2
     93 
     94 *-------------------------------
     95 *
     96 *  B L A S T  1 8
     97 *
     98 *  In: TABSTART, TABLEND, TRACK
     99 *
    100 *-------------------------------
    101 blast18 lda $c083
    102  lda $c083 ;enable RAM
    103 
    104 * set BbundID
    105 
    106  jsr rw18
    107  db 7,BbundID
    108 
    109 * turn on drive and delay .5 seconds
    110 
    111  ldx #floppyslot*16
    112  stx slot
    113  ldx #floppydrive
    114  stx drive
    115 
    116  jsr rw18
    117  db 0
    118 drive db 2,5
    119 
    120 * seek first track
    121 
    122  lda TRACK
    123  sta track
    124 
    125  jsr rw18
    126  db 2,1
    127 track db 0
    128 
    129 * write out table (1-2 tracks)
    130 
    131  jsr wrtrack
    132 
    133  lda TABSTART
    134  clc
    135  adc #$12
    136  sta TABSTART
    137 
    138  lda TABLEND
    139  cmp TABSTART ;table longer than 18 sectors?
    140  bcc :done ;no
    141 
    142  lda TRACK
    143  clc
    144  adc #1
    145  sta ztrack
    146  jsr wrtrack ;yes--write out second track
    147 
    148 * turn off drive
    149 
    150 :done jsr rw18
    151  db 1
    152 
    153 * out of here!
    154 
    155  sta $c082
    156 
    157  rts
    158 
    159 *-------------------------------
    160 wrtrack ldy #0
    161  lda TABSTART
    162  sty obj_lo
    163  sta obj_hi
    164 
    165  lda #0
    166  sta dst_lo
    167  lda #0 ;offset
    168  clc
    169  adc #>temp18buf
    170  sta dst_hi
    171 
    172  lda #0
    173  sta len_lo ;1-sector chunks
    174  lda TABLEND
    175  sec
    176  sbc TABSTART
    177  clc
    178  adc #1
    179  sta len_hi
    180  cmp #$12
    181  bcc :ok ;fits on 1 track
    182 
    183  lda #$12
    184  sta len_hi ;write 1 track at a time
    185 
    186 :ok jsr rw18
    187  db $83,>temp18buf
    188 
    189 :loop ldy #0
    190  sty flushflag
    191  lda (obj_lo),y
    192  sta (dst_lo),y
    193 
    194  inc obj_lo
    195  bne :1
    196  inc obj_hi
    197 
    198 :1 inc dst_lo
    199  bne :2
    200  inc dst_hi
    201 
    202 :2 lda len_lo
    203  bne :3
    204  dec len_hi
    205 :3 dec len_lo
    206 
    207  lda dst_hi
    208  cmp #>temp18buf+$1200
    209  bne :4
    210  jsr flush?
    211 
    212 :4 lda len_lo
    213  ora len_hi
    214  bne :loop
    215 
    216  jsr flush?
    217 
    218  rts
    219 
    220 *-------------------------------
    221 flush? lda flushflag
    222  bne :nodata
    223 
    224  ldy #<temp18buf
    225  lda #>temp18buf
    226  sty dst_lo
    227  sta dst_hi
    228  jsr rw18
    229  db $c5,>temp18buf
    230 
    231  lda len_lo
    232  ora len_hi
    233  beq :nodata
    234 
    235  jsr rw18
    236  db $83,>temp18buf
    237 
    238  inc flushflag
    239 
    240 :nodata rts
    241 *-------------------------------
    242  dum $00
    243 
    244 dest ds 2
    245 source ds 2
    246 endsourc ds 2
    247 
    248  dend
    249 *-------------------------------
    250 movemem sta dest+1
    251  stx source+1
    252  sty endsourc+1
    253 
    254  ldy #0
    255  sty dest
    256  sty source
    257  sty endsourc
    258 
    259 :loop lda (source),y
    260  sta (dest),y
    261 
    262  iny
    263  bne :loop
    264 
    265  inc source+1
    266  inc dest+1
    267 
    268  lda source+1
    269  cmp endsourc+1
    270  bne :loop
    271 
    272  rts
    273 *-------------------------------
    274  dum $00
    275 
    276 base ds 2
    277 tab ds 1
    278 line ds 1
    279 inverse ds 1
    280 bytenum ds 1
    281 mempage ds 1
    282 oldpage ds 1
    283 strptr ds 2
    284 xsave ds 1
    285 ysave ds 1
    286 nextbytenum ds 1
    287 direcptr ds 1
    288 ztemp ds 1
    289 
    290  dend
    291 
    292 eol = $8d ;string delimiter
    293 
    294 *-------------------------------
    295 * WAITLOOP
    296 *-------------------------------
    297 waitloop
    298  sta $c010
    299 
    300 :loop lda $c000
    301  bpl :loop
    302 
    303  sta $c010
    304 
    305  rts
    306 
    307 *-------------------------------
    308 *  C R
    309 *-------------------------------
    310 cr
    311  lda #0
    312  sta tab
    313 
    314  inc line
    315  ldx line
    316  jmp bascalc
    317 
    318 *-------------------------------
    319 *
    320 *  P R L I N E
    321 *
    322 *  Print a line of normal text
    323 *
    324 *  In: A-X = string ptr
    325 *
    326 *-------------------------------
    327 prline
    328  sta strptr
    329  stx strptr+1
    330 :loop
    331  ldy #0
    332  lda (strptr),y
    333  cmp #eol
    334  beq :rts
    335 
    336  jsr prcharn
    337 
    338  inc strptr
    339  bne :loop
    340  inc strptr+1
    341  bne :loop
    342 
    343 :rts rts
    344 
    345 *-------------------------------
    346 *
    347 *  P R H E X B Y T E
    348 *
    349 *  Print a hex byte (in A)
    350 *
    351 *-------------------------------
    352 prhexbyte
    353  pha
    354  lsr
    355  lsr
    356  lsr
    357  lsr
    358  jsr prhexdig
    359 
    360  pla
    361  and #$0f
    362  jmp prhexdig
    363 
    364 *-------------------------------
    365 *
    366 *  P R H E X D I G
    367 *
    368 *  Print a hex digit (in A)
    369 *  Trashes X
    370 *
    371 *-------------------------------
    372 prhexdig
    373  tax
    374  lda hextoasc,x
    375  jmp prchar
    376 
    377 *-------------------------------
    378 *
    379 *  P R C H A R
    380 *
    381 *  Print an ASCII character (in A)
    382 *
    383 *-------------------------------
    384 prchar
    385  ldy tab
    386  and #%00111111
    387  ora inverse
    388  sta (base),y
    389 
    390  inc tab
    391 
    392  rts
    393 
    394 prcharn ;normal
    395  ldy tab
    396  sta (base),y
    397 
    398  inc tab
    399 
    400  rts
    401 
    402 *-------------------------------
    403 *
    404 *  H O M E
    405 *
    406 *-------------------------------
    407 home
    408  jsr textcls
    409 
    410  lda #0
    411  sta tab
    412 
    413  ldx #0
    414  stx line
    415 
    416  jmp bascalc
    417 
    418 *-------------------------------
    419 *
    420 *  I N V E R S E / N O R M A L
    421 *
    422 *-------------------------------
    423 normal
    424  lda #$80
    425  sta inverse
    426  rts
    427 
    428 inv
    429  lda #0
    430  sta inverse
    431  rts
    432 
    433 toggle
    434  lda inverse
    435  eor #$80
    436  sta inverse
    437  rts
    438 
    439 *-------------------------------
    440 *
    441 *  S E T L I N E
    442 *
    443 *  In: X = line #
    444 *
    445 *-------------------------------
    446 setline
    447  lda #0
    448  sta tab
    449 
    450  stx line
    451 
    452 *-------------------------------
    453 *
    454 *  B A S C A L C
    455 *
    456 *  In: X = line # (0-24)
    457 *
    458 *-------------------------------
    459 bascalc
    460  cpx #24
    461  bcs :rts
    462 
    463  lda textl,x
    464  sta base
    465 
    466  lda texth,x
    467  sta base+1
    468 
    469 :rts rts
    470 
    471 *-------------------------------
    472 *
    473 *  T E X T C L S
    474 *
    475 *  Clear text page 1 to black
    476 *
    477 *-------------------------------
    478 textcls lda #$a0 ;space
    479 
    480 cls40 ldy #$f7
    481 :2 sta $400,y
    482  sta $500,y
    483  sta $600,y
    484  sta $700,y
    485 
    486  dey
    487  cpy #$7f
    488  bne :3
    489 
    490  ldy #$77
    491 :3 cpy #$ff
    492  bne :2
    493 
    494  rts
    495 
    496 *-------------------------------
    497 *
    498 *  M E S S A G E
    499 *
    500 *-------------------------------
    501 MSG
    502  jsr home
    503  jsr normal
    504 
    505  lda #msg
    506  ldx #>msg
    507  jsr prline
    508 
    509  jsr waitloop
    510 
    511  rts
    512 
    513 MSG2
    514  jsr home
    515  jsr normal
    516 
    517  lda #msg2
    518  ldx #>msg2
    519  jsr prline
    520 
    521  jsr waitloop
    522 
    523 *-------------------------------
    524 * 40-column text base addresses
    525 *-------------------------------
    526 
    527 textl hex 00,80,00,80,00,80,00,80
    528  hex 28,a8,28,a8,28,a8,28,a8
    529  hex 50,d0,50,d0,50,d0,50,d0
    530 
    531 texth hex 04,04,05,05,06,06,07,07
    532  hex 04,04,05,05,06,06,07,07
    533  hex 04,04,05,05,06,06,07,07
    534 
    535 *-------------------------------
    536 * Hex to ASCII
    537 *-------------------------------
    538 
    539 hextoasc asc "0123456789ABCDEF"
    540 
    541 *-------------------------------
    542 *
    543 *  S T R I N G   D A T A
    544 *
    545 *-------------------------------
    546 msg asc "Put game disk in drive 1 and hit a key"
    547  db #eol
    548 
    549 msg2 asc "Hit control-reset to reboot"
    550  db #eol
    551 
    552 *-------------------------------
    553  lst
    554 eof ds 1
    555  lst off
    556 *-------------------------------
    557  sav mblast