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

GBLAST2.S (4203B)


      1 * gblast
      2 org = $5600
      3  lst off
      4 *-------------------------------
      5 *
      6 *  General 18-sector blast routine
      7 *
      8 *  Blasts up to 2 tracks of data to 18-sector disk in drive 2
      9 *
     10 *-------------------------------
     11 *
     12 *  To use from BASIC:
     13 *
     14 *  BLOAD data into main mem
     15 *
     16 *  TrackNo   = track # (0-34)
     17 *  DataStart = hi byte of data start address
     18 *  DataEnd   = hi byte of data end address
     19 *  Offset    = sector offset ($00-11)
     20 *  Drive     = drive # (1-2)
     21 *
     22 *  poke gblast+3,TrackNo
     23 *  poke gblast+4,DataStart
     24 *  poke gblast+5,DataEnd
     25 *  poke gblast+6,Offset
     26 *  poke gblast+7,Drive
     27 *  call gblast
     28 *
     29 *  peek(gblast+8) = # sectors written to 1st track
     30 *  peek(gblast+9) = # sectors written to 2nd track
     31 *
     32 *-------------------------------
     33  org org
     34 
     35  jmp gblast
     36 
     37 TrackNo ds 1
     38 DataStart ds 1 ;hi byte
     39 DataEnd ds 1 ;hi byte
     40 Offset ds 1
     41 DriveNo ds 1
     42 Len1 ds 1
     43 Len2 ds 1
     44 
     45 zerosave ds $10
     46 
     47 *-------------------------------
     48 rw18buf = org+$400 ;length $800
     49 endrwbuf = rw18buf+$800
     50 
     51 temp18buf = org+$400 ;length $1200
     52 endtempbuf = temp18buf+$1200
     53 
     54 rw18 = $d000
     55 
     56 floppyslot = 6
     57 
     58 BbundID = $a9
     59 
     60 slot = $fd
     61 ztrack = $fe
     62 
     63 *-------------------------------
     64  dum $f0
     65 
     66 obj_lo ds 1
     67 obj_hi ds 1
     68 dst_lo ds 1
     69 dst_hi ds 1
     70 len_lo ds 1
     71 len_hi ds 1
     72 flushflag ds 1
     73 
     74  dend
     75 
     76 *-------------------------------
     77 *
     78 *  G B L A S T
     79 *
     80 *-------------------------------
     81 gblast
     82 
     83 * save zero page vars
     84 
     85  ldx #$f
     86 :loop lda $f0,x
     87  sta zerosave,x
     88  dex
     89  bpl :loop
     90 
     91 * move rw18 to l.c.
     92 
     93  sta $c083 ;read/write RAM
     94 
     95  lda #>rw18
     96  ldx #>rw18buf
     97  ldy #>endrwbuf
     98 
     99  jsr movemem
    100 
    101 * blast data
    102 
    103  jsr blast18
    104 
    105 * Done--restore zero page vars
    106 
    107  ldx #$f
    108 :loop2 lda zerosave,x
    109  sta $f0,x
    110  dex
    111  bpl :loop2
    112 
    113 ]rts rts
    114 
    115 *-------------------------------
    116 *
    117 *  B L A S T  1 8
    118 *
    119 *  In: TrackNo, DataStart, DataEnd, Offset
    120 *
    121 *-------------------------------
    122 blast18 lda $c083
    123  lda $c083 ;enable RAM
    124 
    125 * set BbundID
    126 
    127  jsr rw18
    128  db 7,BbundID
    129 
    130 * turn on drive and delay .5 seconds
    131 
    132  ldx #floppyslot*16
    133  stx slot
    134 
    135  ldx DriveNo
    136  cpx #1
    137  beq :1
    138  ldx #2 ;default to drive 2
    139 :1 stx drive
    140 
    141  jsr rw18
    142  db 0
    143 drive db 2,5
    144 
    145 * seek first track
    146 
    147  lda TrackNo
    148  sta track
    149 
    150  jsr rw18
    151  db 2,1
    152 track db 0
    153 
    154 * Write out data (1-2 tracks)
    155 
    156  ldy #0
    157  lda DataStart
    158  sty obj_lo
    159  sta obj_hi
    160 
    161  lda Offset
    162  clc
    163  adc #>temp18buf
    164  sty dst_lo
    165  sta dst_hi
    166 
    167  lda #>endtempbuf
    168  sec
    169  sbc dst_hi
    170  sty len_lo
    171  sta len_hi ;# sectors left on this track (1-18)
    172 
    173  lda DataEnd
    174  sec
    175  sbc DataStart
    176  clc
    177  adc #1 ;total # of sectors to write (1-36)
    178  cmp len_hi
    179  bcs :ok ;write to end of track
    180  sta len_hi ;write portion of track
    181 
    182 :ok lda len_hi
    183  sta Len1
    184  jsr wrtrack ;write 1st track
    185 
    186 * Write out 2nd track if necessary
    187 
    188  ldy #0
    189  sty Len2
    190  sty obj_lo
    191  lda DataStart
    192  clc
    193  adc Len1
    194  cmp DataEnd
    195  beq :1
    196  bcs :done ;it fit on 1 track
    197 :1 sta obj_hi
    198 
    199  lda #>temp18buf ;start at beginning of 2nd track
    200  sty dst_lo
    201  sta dst_hi
    202 
    203  lda DataEnd
    204  sec
    205  sbc obj_hi
    206  clc
    207  adc #1 ;# of sectors left to write (1-18)
    208  sty len_lo
    209  sta len_hi
    210  sta Len2
    211 
    212  lda TrackNo
    213  clc
    214  adc #1
    215  sta ztrack
    216  jsr wrtrack ;write out second track
    217 
    218 * turn off drive
    219 
    220 :done jsr rw18
    221  db 1
    222 
    223 * out of here!
    224 
    225  sta $c082
    226 
    227  rts
    228 
    229 *-------------------------------
    230 *
    231 * write 1 track
    232 *
    233 * In: obj, dst, len
    234 *  (trashes these vars)
    235 *
    236 *-------------------------------
    237 * read in current data
    238 
    239 wrtrack
    240  jsr rw18
    241  db $83,>temp18buf
    242 
    243 :loop ldy #0
    244  sty flushflag
    245  lda (obj_lo),y
    246  sta (dst_lo),y
    247 
    248  inc obj_lo
    249  bne :1
    250  inc obj_hi
    251 
    252 :1 inc dst_lo
    253  bne :2
    254  inc dst_hi
    255 
    256 :2 lda len_lo
    257  bne :3
    258  dec len_hi
    259 :3 dec len_lo
    260 
    261  lda dst_hi
    262  cmp #>temp18buf+$1200
    263  bne :4
    264  jmp flush?
    265 
    266 :4 lda len_lo
    267  ora len_hi
    268  bne :loop
    269 
    270  jmp flush?
    271 
    272 *-------------------------------
    273 flush? lda flushflag
    274  bne :nodata
    275 
    276  ldy #<temp18buf
    277  lda #>temp18buf
    278  sty dst_lo
    279  sta dst_hi
    280  jsr rw18
    281  db $c5,>temp18buf
    282 
    283  lda len_lo
    284  ora len_hi
    285  beq :nodata
    286 
    287  jsr rw18
    288  db $83,>temp18buf
    289 
    290  inc flushflag
    291 
    292 :nodata rts
    293 
    294 *-------------------------------
    295 *
    296 *  Move a block of memory
    297 *
    298 *-------------------------------
    299  dum $f0
    300 
    301 dest ds 2
    302 source ds 2
    303 endsourc ds 2
    304 
    305  dend
    306 
    307 movemem sta dest+1
    308  stx source+1
    309  sty endsourc+1
    310 
    311  ldy #0
    312  sty dest
    313  sty source
    314  sty endsourc
    315 
    316 :loop lda (source),y
    317  sta (dest),y
    318 
    319  iny
    320  bne :loop
    321 
    322  inc source+1
    323  inc dest+1
    324 
    325  lda source+1
    326  cmp endsourc+1
    327  bne :loop
    328 
    329  rts
    330 
    331 *-------------------------------
    332  sav gblast