MBLAST.S (6430B)
1 * mblast 2 org = $3000 3 lst off 4 *------------------------------- 5 * 6 * M B L A S T 7 * 8 * Blast music table to 18-sector disk 9 * in drive 1 10 * 11 * Can be BRUN from Applesoft (ProDos or 3.3) 12 * 13 * First BLOAD music table into main mem at TabStart 14 * 15 *------------------------------- 16 org org 17 18 jmp mblast 19 20 *------------------------------- 21 TrackNo = 19 22 TabStart = $2000 23 TablEnd = $2600 24 25 *------------------------------- 26 rw18buf = $3800 27 endrwbuf = $4000 28 29 temp18buf = $4000 30 rw18 = $d000 31 32 floppyslot = 6 33 floppydrive = 1 34 35 BbundID = $a9 36 37 slot = $fd 38 ztrack = $fe 39 40 dum $300 41 TABLEND ds 1 ;hi byte 42 TABSTART ds 1 ;hi byte 43 TRACK ds 1 44 dend 45 46 dum $f0 47 obj_lo ds 1 48 obj_hi ds 1 49 dst_lo ds 1 50 dst_hi ds 1 51 len_lo ds 1 52 len_hi ds 1 53 flushflag ds 1 54 dend 55 56 *------------------------------- 57 * 58 * M B L A S T 59 * 60 *------------------------------- 61 mblast 62 63 * move rw18 to l.c. 64 65 sta $c083 ;read/write RAM 66 67 lda #>rw18 68 ldx #>rw18buf 69 ldy #>endrwbuf 70 71 jsr movemem 72 73 * message 74 75 jsr MSG 76 77 * blast music 78 79 lda #TrackNo 80 sta TRACK 81 82 lda #>TabStart 83 sta TABSTART 84 85 lda #>TablEnd 86 sta TABLEND 87 88 jsr blast18 89 90 * Done 91 92 jmp MSG2 93 94 *------------------------------- 95 * 96 * B L A S T 1 8 97 * 98 * In: TABSTART, TABLEND, TRACK 99 * 100 *------------------------------- 101 blast18 lda $c083 102 lda $c083 ;enable RAM 103 104 * set BbundID 105 106 jsr rw18 107 db 7,BbundID 108 109 * turn on drive and delay .5 seconds 110 111 ldx #floppyslot*16 112 stx slot 113 ldx #floppydrive 114 stx drive 115 116 jsr rw18 117 db 0 118 drive db 2,5 119 120 * seek first track 121 122 lda TRACK 123 sta track 124 125 jsr rw18 126 db 2,1 127 track db 0 128 129 * write out table (1-2 tracks) 130 131 jsr wrtrack 132 133 lda TABSTART 134 clc 135 adc #$12 136 sta TABSTART 137 138 lda TABLEND 139 cmp TABSTART ;table longer than 18 sectors? 140 bcc :done ;no 141 142 lda TRACK 143 clc 144 adc #1 145 sta ztrack 146 jsr wrtrack ;yes--write out second track 147 148 * turn off drive 149 150 :done jsr rw18 151 db 1 152 153 * out of here! 154 155 sta $c082 156 157 rts 158 159 *------------------------------- 160 wrtrack ldy #0 161 lda TABSTART 162 sty obj_lo 163 sta obj_hi 164 165 lda #0 166 sta dst_lo 167 lda #0 ;offset 168 clc 169 adc #>temp18buf 170 sta dst_hi 171 172 lda #0 173 sta len_lo ;1-sector chunks 174 lda TABLEND 175 sec 176 sbc TABSTART 177 clc 178 adc #1 179 sta len_hi 180 cmp #$12 181 bcc :ok ;fits on 1 track 182 183 lda #$12 184 sta len_hi ;write 1 track at a time 185 186 :ok jsr rw18 187 db $83,>temp18buf 188 189 :loop ldy #0 190 sty flushflag 191 lda (obj_lo),y 192 sta (dst_lo),y 193 194 inc obj_lo 195 bne :1 196 inc obj_hi 197 198 :1 inc dst_lo 199 bne :2 200 inc dst_hi 201 202 :2 lda len_lo 203 bne :3 204 dec len_hi 205 :3 dec len_lo 206 207 lda dst_hi 208 cmp #>temp18buf+$1200 209 bne :4 210 jsr flush? 211 212 :4 lda len_lo 213 ora len_hi 214 bne :loop 215 216 jsr flush? 217 218 rts 219 220 *------------------------------- 221 flush? lda flushflag 222 bne :nodata 223 224 ldy #<temp18buf 225 lda #>temp18buf 226 sty dst_lo 227 sta dst_hi 228 jsr rw18 229 db $c5,>temp18buf 230 231 lda len_lo 232 ora len_hi 233 beq :nodata 234 235 jsr rw18 236 db $83,>temp18buf 237 238 inc flushflag 239 240 :nodata rts 241 *------------------------------- 242 dum $00 243 244 dest ds 2 245 source ds 2 246 endsourc ds 2 247 248 dend 249 *------------------------------- 250 movemem sta dest+1 251 stx source+1 252 sty endsourc+1 253 254 ldy #0 255 sty dest 256 sty source 257 sty endsourc 258 259 :loop lda (source),y 260 sta (dest),y 261 262 iny 263 bne :loop 264 265 inc source+1 266 inc dest+1 267 268 lda source+1 269 cmp endsourc+1 270 bne :loop 271 272 rts 273 *------------------------------- 274 dum $00 275 276 base ds 2 277 tab ds 1 278 line ds 1 279 inverse ds 1 280 bytenum ds 1 281 mempage ds 1 282 oldpage ds 1 283 strptr ds 2 284 xsave ds 1 285 ysave ds 1 286 nextbytenum ds 1 287 direcptr ds 1 288 ztemp ds 1 289 290 dend 291 292 eol = $8d ;string delimiter 293 294 *------------------------------- 295 * WAITLOOP 296 *------------------------------- 297 waitloop 298 sta $c010 299 300 :loop lda $c000 301 bpl :loop 302 303 sta $c010 304 305 rts 306 307 *------------------------------- 308 * C R 309 *------------------------------- 310 cr 311 lda #0 312 sta tab 313 314 inc line 315 ldx line 316 jmp bascalc 317 318 *------------------------------- 319 * 320 * P R L I N E 321 * 322 * Print a line of normal text 323 * 324 * In: A-X = string ptr 325 * 326 *------------------------------- 327 prline 328 sta strptr 329 stx strptr+1 330 :loop 331 ldy #0 332 lda (strptr),y 333 cmp #eol 334 beq :rts 335 336 jsr prcharn 337 338 inc strptr 339 bne :loop 340 inc strptr+1 341 bne :loop 342 343 :rts rts 344 345 *------------------------------- 346 * 347 * P R H E X B Y T E 348 * 349 * Print a hex byte (in A) 350 * 351 *------------------------------- 352 prhexbyte 353 pha 354 lsr 355 lsr 356 lsr 357 lsr 358 jsr prhexdig 359 360 pla 361 and #$0f 362 jmp prhexdig 363 364 *------------------------------- 365 * 366 * P R H E X D I G 367 * 368 * Print a hex digit (in A) 369 * Trashes X 370 * 371 *------------------------------- 372 prhexdig 373 tax 374 lda hextoasc,x 375 jmp prchar 376 377 *------------------------------- 378 * 379 * P R C H A R 380 * 381 * Print an ASCII character (in A) 382 * 383 *------------------------------- 384 prchar 385 ldy tab 386 and #%00111111 387 ora inverse 388 sta (base),y 389 390 inc tab 391 392 rts 393 394 prcharn ;normal 395 ldy tab 396 sta (base),y 397 398 inc tab 399 400 rts 401 402 *------------------------------- 403 * 404 * H O M E 405 * 406 *------------------------------- 407 home 408 jsr textcls 409 410 lda #0 411 sta tab 412 413 ldx #0 414 stx line 415 416 jmp bascalc 417 418 *------------------------------- 419 * 420 * I N V E R S E / N O R M A L 421 * 422 *------------------------------- 423 normal 424 lda #$80 425 sta inverse 426 rts 427 428 inv 429 lda #0 430 sta inverse 431 rts 432 433 toggle 434 lda inverse 435 eor #$80 436 sta inverse 437 rts 438 439 *------------------------------- 440 * 441 * S E T L I N E 442 * 443 * In: X = line # 444 * 445 *------------------------------- 446 setline 447 lda #0 448 sta tab 449 450 stx line 451 452 *------------------------------- 453 * 454 * B A S C A L C 455 * 456 * In: X = line # (0-24) 457 * 458 *------------------------------- 459 bascalc 460 cpx #24 461 bcs :rts 462 463 lda textl,x 464 sta base 465 466 lda texth,x 467 sta base+1 468 469 :rts rts 470 471 *------------------------------- 472 * 473 * T E X T C L S 474 * 475 * Clear text page 1 to black 476 * 477 *------------------------------- 478 textcls lda #$a0 ;space 479 480 cls40 ldy #$f7 481 :2 sta $400,y 482 sta $500,y 483 sta $600,y 484 sta $700,y 485 486 dey 487 cpy #$7f 488 bne :3 489 490 ldy #$77 491 :3 cpy #$ff 492 bne :2 493 494 rts 495 496 *------------------------------- 497 * 498 * M E S S A G E 499 * 500 *------------------------------- 501 MSG 502 jsr home 503 jsr normal 504 505 lda #msg 506 ldx #>msg 507 jsr prline 508 509 jsr waitloop 510 511 rts 512 513 MSG2 514 jsr home 515 jsr normal 516 517 lda #msg2 518 ldx #>msg2 519 jsr prline 520 521 jsr waitloop 522 523 *------------------------------- 524 * 40-column text base addresses 525 *------------------------------- 526 527 textl hex 00,80,00,80,00,80,00,80 528 hex 28,a8,28,a8,28,a8,28,a8 529 hex 50,d0,50,d0,50,d0,50,d0 530 531 texth hex 04,04,05,05,06,06,07,07 532 hex 04,04,05,05,06,06,07,07 533 hex 04,04,05,05,06,06,07,07 534 535 *------------------------------- 536 * Hex to ASCII 537 *------------------------------- 538 539 hextoasc asc "0123456789ABCDEF" 540 541 *------------------------------- 542 * 543 * S T R I N G D A T A 544 * 545 *------------------------------- 546 msg asc "Put game disk in drive 1 and hit a key" 547 db #eol 548 549 msg2 asc "Hit control-reset to reboot" 550 db #eol 551 552 *------------------------------- 553 lst 554 eof ds 1 555 lst off 556 *------------------------------- 557 sav mblast