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