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

MOVE35.S (3720B)


      1  lst off
      2 
      3  org $E00
      4 
      5 errcode = 0
      6 get8bit = $E74C
      7 
      8 buffer = $1000 ;7 tracks long
      9 bufferend = buffer+$7E00
     10 
     11 rw18 = $D000 ;both versions!
     12 
     13 slot = $FD
     14 track = $FE
     15 lastrack = $FF
     16 
     17 *-------------------------------------------------
     18 *
     19 * CALL RT - moves rw18 routines to their homes in aux mem
     20 *
     21 * CALL RT+3,<5.25" slot>,<BbundID>,<start track>,<end track>
     22 *          ,<3.5" slot>,<block offset>
     23 *
     24 
     25  jmp move
     26 
     27 * Get DEST information:
     28 
     29 start jsr get8bit
     30  stx slot525
     31  jsr get8bit
     32  stx BbundID
     33  jsr get8bit
     34  stx track
     35  jsr get8bit
     36  inx
     37  stx ENDtrack
     38 
     39 * SOURCE information
     40 
     41  jsr get8bit
     42  stx slot35
     43  jsr $DEBE ;get16bit
     44  jsr $DD67
     45  jsr $E752
     46  sty Boffset
     47  sta Boffset+1
     48 
     49 * From now on we are using aux zpage and $D000
     50 
     51  lda track
     52  sta $C009
     53  sta track
     54 
     55  jsr recal525
     56 
     57 loop lda track
     58 
     59  pha
     60  jsr read35
     61  bcs :plarts
     62  pla
     63 
     64  sta track
     65  jsr write525
     66  bcs :rts
     67 
     68  lda track
     69  eor ENDtrack
     70  bne loop
     71 
     72  pha
     73 
     74 :plarts pla
     75 :rts lda #0
     76  rol
     77  sta $C008 ;back to main mem
     78  sta errcode
     79  bit $C081
     80  rts
     81 
     82 ENDtrack db $11
     83 
     84 *------------------------------------------------- write525
     85 *
     86 * Write up to 7 tracks from 5.25" floppy.
     87 *
     88 
     89 write525 jsr prep525
     90 
     91 * Drive on, delay 1 second
     92 
     93  jsr rw18
     94  db 0,1,10
     95 
     96 * Write until buffer is empty or END track reached
     97 
     98  lda #>buffer
     99 
    100 :loop sta :writebuf
    101 
    102  jsr rw18
    103  db $45 ;auto-inc, writesequ
    104 :writebuf db $11
    105  bcs :error
    106 
    107  lda :writebuf
    108  jsr buffend?
    109  bcc :loop
    110  clc
    111 
    112 :error php
    113  jsr rw18
    114  db 1 ;drive off
    115  plp
    116  rts
    117 
    118 *------------------------------------------------- buffend?
    119 *
    120 * Have we reached the end of buffer, or ENDtrack?
    121 * Enter: a - last buffer address
    122 *
    123 * Exit: cs - no more buffer, or ENDtrack reached
    124 *       cc - keep going, a=new buffer address
    125 *
    126 
    127 buffend? clc
    128  adc #$12
    129  cmp #>bufferend
    130  bcs :rts
    131 
    132  ldy track
    133  cpy ENDtrack
    134 
    135 :rts rts
    136 
    137 *------------------------------------------------- prep525
    138 *
    139 * Prepare to use 5.25" RW18 routine
    140 *
    141 
    142 * Normal RW18 routine is in second bank of $D000
    143 
    144 prep525 bit $C08B
    145  bit $C08B
    146 
    147 * Set slot of 5.25" drive
    148 
    149  lda #$11
    150 slot525 = *-1
    151  asl
    152  asl
    153  asl
    154  asl
    155  sta slot
    156  tax
    157 
    158 * Turn off all phases
    159 
    160  lda $C080,x
    161  lda $C082,x
    162  lda $C084,x
    163  lda $C086,x
    164 
    165 * Set Broderbund ID byte
    166 
    167  jsr rw18
    168  db 7
    169 BbundID db $11
    170 
    171  rts
    172 
    173 *------------------------------------------------- recal525
    174 *
    175 * Recalibrate 5.25" floppy drive
    176 *
    177 
    178 recal525 jsr prep525
    179 
    180  lda #$A0
    181  sta lastrack
    182 
    183 * Drive on
    184 
    185  jsr rw18
    186  db 0,1,3 ;.3 second delay
    187 
    188 * Seek to track zero
    189 
    190  lda track
    191  pha
    192 
    193  jsr rw18
    194  db 2,0,0
    195 
    196  pla
    197  sta track
    198  sta :track
    199 
    200 * Now seek first track
    201 
    202  jsr rw18
    203  db 2,0
    204 :track db $11
    205 
    206  jsr rw18
    207  db 1 ;drive off
    208 
    209  rts
    210 
    211 *------------------------------------------------- read35
    212 *
    213 * Read up to 7 tracks to 3.5" disk.
    214 *
    215 
    216 read35 jsr prep35
    217 
    218 * Write until no more buffer, or ENDtrack is reached
    219 
    220  lda #>buffer
    221 
    222 :loop sta :readbuf
    223 
    224  jsr rw18
    225  db $43 ;auto-inc, writesequ
    226 :readbuf db $11
    227  bcs :error
    228 
    229  lda :readbuf
    230  jsr buffend?
    231  bcc :loop
    232  clc
    233 
    234 :error rts
    235 
    236 *------------------------------------------------- prep35
    237 *
    238 * Prepare to use 3.5" RW18 routine
    239 *
    240 
    241 * 3.5" RW18 routine is in first bank of $D000
    242 
    243 prep35 bit $C083
    244  bit $C083
    245 
    246 * Set slot of 3.5" drive
    247 
    248  lda #$11
    249 slot35 = *-1
    250  asl
    251  asl
    252  asl
    253  asl
    254  sta slot
    255  tax
    256 
    257 * Set offset into 3.5" disk
    258 
    259  jsr rw18
    260  db 8
    261 Boffset da $1111
    262 
    263  rts
    264 
    265 *------------------------------------------------- move
    266 *
    267 * Move the RW18 routines to their respective homes.
    268 *
    269 * $1000 - 3.5" rw18 routine
    270 * $2000 - 5.25" rw18 routine
    271 *
    272 
    273 move ldx #$83
    274  lda #$10
    275  jsr :0
    276  ldx #$8B
    277  lda #$20
    278 
    279 :0 sta :source+2
    280  lda #$D0
    281  sta :dest+2
    282 
    283  lda $C000,x
    284  lda $C000,x
    285 
    286  sta $C009 ;aux $D000
    287 
    288  ldx #$10
    289  ldy #0
    290 :source lda $1000,y
    291 :dest sta $D000,y
    292  iny
    293  bne :source
    294 
    295  inc :source+2
    296  inc :dest+2
    297 
    298  dex
    299  bne :source
    300 
    301  sta $C008
    302  bit $C081
    303 
    304  rts
    305 
    306 *------------------------------------------------- EOF