GBLAST.S (4180B)
1 * gblast 2 org = $4400 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 = $4800 ;length $800 49 endrwbuf = $5000 50 51 temp18buf = $4800 ;length $1200 52 endtempbuf = $5a00 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