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