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

MOVE53.S (3676B)


      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 source 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 * Destination 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 read525
     61  bcs :plarts
     62  pla
     63 
     64  sta track
     65  jsr write35
     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 *------------------------------------------------- read525
     85 *
     86 * Read up to 7 tracks from 5.25" floppy.
     87 *
     88 
     89 read525 jsr prep525
     90 
     91 * Drive on, delay .5 seconds
     92 
     93  jsr rw18
     94  db 0,1,5
     95 
     96 * Read until buffer is full
     97 
     98  lda #>buffer
     99 
    100 :loop sta :readbuf
    101 
    102  jsr rw18
    103  db $43 ;auto-inc, readsequ
    104 :readbuf db $11
    105  bcs :error
    106 
    107  lda :readbuf
    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  rts
    207 
    208 *------------------------------------------------- write35
    209 *
    210 * Write up to 7 tracks to 3.5" disk.
    211 *
    212 
    213 write35 jsr prep35
    214 
    215 * Write until no more buffer, or ENDtrack is reached
    216 
    217  lda #>buffer
    218 
    219 :loop sta :writebuf
    220 
    221  jsr rw18
    222  db $45 ;auto-inc, writesequ
    223 :writebuf db $11
    224  bcs :error
    225 
    226  lda :writebuf
    227  jsr buffend?
    228  bcc :loop
    229  clc
    230 
    231 :error rts
    232 
    233 *------------------------------------------------- prep35
    234 *
    235 * Prepare to use 3.5" RW18 routine
    236 *
    237 
    238 * 3.5" RW18 routine is in first bank of $D000
    239 
    240 prep35 bit $C083
    241  bit $C083
    242 
    243 * Set slot of 3.5" drive
    244 
    245  lda #$11
    246 slot35 = *-1
    247  asl
    248  asl
    249  asl
    250  asl
    251  sta slot
    252  tax
    253 
    254 * Set offset into 3.5" disk
    255 
    256  jsr rw18
    257  db 8
    258 Boffset da $1111
    259 
    260  rts
    261 
    262 *------------------------------------------------- move
    263 *
    264 * Move the RW18 routines to their respective homes.
    265 *
    266 * $1000 - 3.5" rw18 routine
    267 * $2000 - 5.25" rw18 routine
    268 *
    269 
    270 move ldx #$83
    271  lda #$10
    272  jsr :0
    273  ldx #$8B
    274  lda #$20
    275 
    276 :0 sta :source+2
    277  lda #$D0
    278  sta :dest+2
    279 
    280  lda $C000,x
    281  lda $C000,x
    282 
    283  sta $C009 ;aux $D000
    284 
    285  ldx #$10
    286  ldy #0
    287 :source lda $1000,y
    288 :dest sta $D000,y
    289  iny
    290  bne :source
    291 
    292  inc :source+2
    293  inc :dest+2
    294 
    295  dex
    296  bne :source
    297 
    298  sta $C008
    299  bit $C081
    300 
    301  rts
    302 
    303 *------------------------------------------------- EOF