RW1835.POP.S (7529B)
1 lst off 2 tr on 3 org $D000 4 xc off 5 6 *------------------------------------------------- 7 * 8 * 07/02/87 9 * 10 * Unidisk 3.5 interface for 11 * 18 sector read/write routine 12 * 13 * 09/05/89 Version for //e 14 * 15 * Copyright 1985, 1987 16 * by Roland Gustafsson 17 * 18 *------------------------------------------------- 19 20 sigblock = 16+315 21 22 * 23 * Permanent vars 24 * 25 26 slot = $FD 27 track = $FE 28 ;lastrack = $FF ;NOT USED 29 30 * Zero page usage: 31 32 temp = $40 33 command = $41 34 35 *------------------------------------------------- 36 jmp RW18 37 *------------------------------------------------- 38 GS? ds 1 ;bpl if not, bmi if GS 39 40 OFFSET = 16 ;default offset 41 42 *------------------------------------------------- 43 * 44 * READ/WRITE 18 sectors! 45 * 46 47 READ lda #1 48 hex 2C 49 WRITE lda #2 50 sta SPcommand 51 52 * Calculate starting block 53 * (OFFSET+track*9) 54 55 lda track ;0-34 56 asl 57 asl 58 asl 59 tax ;x=lo 60 61 lda #0 62 rol 63 tay ;y=hi 64 65 txa 66 adc track 67 tax 68 69 tya 70 adc #0 71 tay 72 73 txa 74 adc #OFFSET 75 BOFFLO = *-1 76 sta BLOCKLO 77 78 tya 79 adc #>OFFSET 80 BOFFHI = *-1 81 sta BLOCKHI 82 83 * Loop for 18 sectors, 2 at a time. 84 85 ldy #0 86 :0 tya 87 pha 88 89 * Do 2 sectors 90 91 lda BUFTABLE,Y 92 sta ]rbuf0 93 sta ]wbuf0 94 ldx BUFTABLE+1,Y 95 stx ]rbuf1 96 stx ]wbuf1 97 dex 98 cpx ]rbuf0 99 jsr RWSECTS 100 101 pla 102 tay 103 104 bcs :rts 105 106 * Next 2 sectors 107 108 inc BLOCKLO 109 bne :1 110 inc BLOCKHI 111 112 :1 iny 113 iny 114 cpy #18 115 bne :0 116 117 clc 118 :rts rts 119 120 *----------- 121 * 122 * Read or write 2 sectors 123 * 124 * If the two sectors are sequential 125 * then just go to the Device Driver. 126 * 127 128 RWSECTS bne :noncont 129 130 * We are dealing with contiguous sectors... 131 * if aux mem is set in any way, then we must 132 * load them using the non-contiguous routine.. 133 134 bit ]RAMread? 135 bmi :noncont 136 bit ]RAMwrite? 137 bpl JMPSP 138 139 * Non-contiguous... 140 141 :noncont ldy SPcommand 142 dey 143 bne WSECTS 144 145 * Read two non-contiguous sectors 146 147 RSECTS lda ]rbuf0 148 ora ]rbuf1 149 clc 150 beq :rts 151 152 jsr JMPSPBUF 153 bcs :rts 154 155 * Now move them to where they belong 156 157 ldx #$2C ; bit ABS 158 ldy #$99 ; sta ABS,Y 159 160 * If this sector is to be ignored, 161 * then change sta $FF00,Y to bit. 162 163 sty ]rmod0 164 lda ]rbuf0 165 bne *+5 166 stx ]rmod0 167 168 sty ]rmod1 169 lda ]rbuf1 170 bne *+5 171 stx ]rmod1 172 173 ldy #0 174 :0 lda BLOCKBUF,Y 175 ]rmod0 sta $FF00,Y 176 ]rbuf0 = *-1 177 lda BLOCKBUF+256,Y 178 ]rmod1 sta $FF00,Y 179 ]rbuf1 = *-1 180 iny 181 bne :0 182 183 :rts rts 184 185 *----------- 186 * 187 * Write two non-contiguous sectors 188 * 189 190 WSECTS ldy #0 191 :0 lda $FF00,Y 192 ]wbuf0 = *-1 193 sta BLOCKBUF,Y 194 lda $FF00,Y 195 ]wbuf1 = *-1 196 sta BLOCKBUF+256,Y 197 iny 198 bne :0 199 200 JMPSPBUF lda #>BLOCKBUF 201 202 *------------------------------------------------- 203 * 204 * Jump to Smart Port driver 205 * 206 * Enter: A - address of buffer 207 * 208 209 JMPSP sta SPbufhi 210 211 * If ERROR? hi bit is set, then just return sec 212 213 asl ERROR? 214 bcs ]rtserr 215 216 * Force main memory 217 218 sta $C002 219 sta $C004 220 221 * Trick here, first time through, calculates 222 * the entry point into the SmartPort, from 223 * then on, direct access is available. 224 225 ]SPjsr jsr calcSPjsr 226 SPcommand db $11 227 da SPcmdlist 228 229 restAux sta $C002 230 lda #$11 231 ]RAMread? = *-1 232 bpl *+5 233 sta $C003 234 235 sta $C004 236 lda #$11 237 ]RAMwrite? = *-1 238 bpl *+5 239 sta $C005 240 241 ]rtserr rts 242 243 calcSPjsr lda slot 244 lsr 245 lsr 246 lsr 247 lsr 248 ora #$C0 249 sta ]SPjsr+2 250 sta :calcSPmod+2 251 252 :calcSPmod lda $C5FF 253 clc 254 adc #3 255 sta ]SPjsr+1 256 jmp (]SPjsr+1) 257 258 SPcmdlist db 3 259 unit_num db 1 ;unit one 260 db 0 ;SPbuflo=$00 261 SPbufhi db $11 262 BLOCKLO db $11 ;"low" 263 BLOCKHI db $11 ;"med" 264 db 0 ;"high" always zero! 265 266 *------------------------------------------------- RW18 267 * 268 * Entry point into RW18 269 * 270 271 RW18 pla 272 sta GOTBYTE+1 273 pla 274 sta GOTBYTE+2 275 276 bit $CFFF 277 278 * Remember aux memory settings 279 280 lda $C013 281 sta ]RAMread? 282 lda $C014 283 sta ]RAMwrite? 284 285 * Save aux text page if running on a GS 286 287 bit GS? 288 bpl *+5 289 jsr saveTaux 290 291 * Save zpage 292 293 ldx #0 294 :zsave lda 0,x 295 sta ZPAGEBUF,x 296 inx 297 bne :zsave 298 299 * Get the command 300 301 jsr GETBYTE 302 sta command 303 and #$0F 304 asl 305 tax 306 307 lda cmdadr,X 308 sta :1+1 309 lda cmdadr+1,X 310 sta :1+2 311 312 :1 jsr $FFFF 313 314 * Restore aux text page if running on a GS 315 316 bit GS? 317 bpl *+5 318 jsr restTaux 319 320 * Restore aux memory settings 321 322 jsr restAux 323 324 * Restore zpage 325 326 ldy track 327 ldx #0 328 :zrest lda ZPAGEBUF,x 329 sta 0,x 330 inx 331 bne :zrest 332 sty track 333 334 lda GOTBYTE+2 335 pha 336 lda GOTBYTE+1 337 pha 338 339 rts rts 340 341 cmdadr da CMdriveon 342 da rts ; CMDRIVOFF 343 da CMseek 344 da CMreadseq 345 da CMreadgroup 346 da CMwriteseq 347 da CMwritegroup 348 da CMid 349 da CMoffset 350 351 *------------------------------------------------- CMseek 352 * 353 * SEEK 354 * <check disk for lastrack?>, 355 * <track> 356 * 357 358 CMseek jsr GETBYTE 359 jsr GETBYTE 360 sta track 361 rts 362 363 *------------------------------------------------- CMreadseq 364 *------------------------------------------------- CMreadgroup 365 * 366 * Read sequence 367 * <buf adr> 368 * 369 * Read group 370 * <18 buf adr's> 371 * 372 373 CMreadseq ldx #1 374 hex 2C 375 CMreadgroup ldx #18 376 jsr CMADINFO 377 378 CMREAD2 jsr READ 379 380 *------------------------------------------------- 381 * 382 * READ/WRITE exit. 383 * 384 INCTRAK? bit command 385 bcs WHOOP? 386 387 * If bit 6 set, then inc track 388 389 bvc ]rts 390 inc track 391 ]rts rts 392 393 * If bit 7 set then whoop speaker 394 * WARNING:use only with READ 395 396 WHOOP? bpl ]rts 397 ldy #0 398 :1 tya 399 bit $C030 400 :2 sec 401 sbc #1 402 bne :2 403 dey 404 bne :1 405 beq CMREAD2 406 407 *------------------------------------------------- CMdriveon 408 * 409 * "DriveOn" is when we check for the POP disk 410 * 411 412 ERROR? db 0 413 414 CMdriveon ldy #sigblock 415 lda #>sigblock 416 sty BLOCKLO 417 sta BLOCKHI 418 419 lda #1 ;read 420 sta SPcommand 421 422 jsr JMPSPBUF ;read in sig block 423 bcs :9 424 425 ldy #-1 426 :chksig iny 427 lda :sig,y 428 beq :9 429 eor BLOCKBUF,y 430 beq :chksig 431 sec 432 433 :9 lda #0 434 ror 435 sta ERROR? 436 rts 437 438 :sig asc 'Prince of Persia 3.5!',00 439 440 *------------------------------------------------- CMwriteseq 441 *------------------------------------------------- CMwritegroup 442 * 443 * Same as READ 444 * 445 446 CMwriteseq ldx #1 447 hex 2C 448 CMwritegroup ldx #18 449 jsr CMADINFO 450 jsr WRITE 451 jmp INCTRAK? 452 453 *------------------------------------------------- CMid 454 * 455 * Change offset based on ID 456 * 457 458 CMid jsr GETBYTE 459 sta :IDmod+1 460 461 ldy #-3 462 :0 iny 463 iny 464 iny 465 lda :IDlist,y 466 beq :rts 467 468 :IDmod cmp #$11 469 bne :0 470 471 lda :IDlist+1,y 472 sta BOFFLO 473 lda :IDlist+2,y 474 sta BOFFHI 475 476 :rts rts 477 478 :IDlist db $A9 479 dw 16 ;side one 480 481 db $AD 482 dw 16+315+1 ;side two 483 484 db $79 485 dw 16+315+1+315 ;side three!!! 486 487 db 0 ;end of list 488 489 *------------------------------------------------- 490 * 491 * Set new block offset 492 * 493 494 CMoffset jsr GETBYTE 495 sta BOFFLO 496 jsr GETBYTE 497 sta BOFFHI 498 rts 499 500 *------------------------------------------------- 501 * 502 * Get buffer info. 503 * 504 505 CMADINFO stx temp 506 ldx #0 507 :0 jsr GETBYTE 508 jsr auxTfix 509 sta BUFTABLE,X 510 inx 511 cpx temp 512 bcc :0 513 tay 514 515 * If sequence, then fill table 516 517 :1 iny 518 cpx #18 519 beq :2 520 tya 521 jsr auxTfix 522 sta BUFTABLE,X 523 inx 524 bne :1 525 526 :2 rts 527 528 *------------------------------------------------- 529 * 530 * Only if running on a GS: 531 * 532 * If loading into text page, then change to 533 * load into internal buffer instead. 534 * 535 536 auxTfix bit GS? 537 bpl :0 538 539 cmp #4 540 bcc :0 541 cmp #8 542 bcs :0 543 adc #>auxTPAGEsave-$400 544 545 :0 rts 546 547 *------------------------------------------------- 548 * 549 * Only if running on a GS: 550 * 551 * Save the aux memory text page to internal buffer 552 * 553 554 xc 555 xc 556 557 saveTaux clc 558 xce 559 rep $30 560 ldx #$0400 561 ldy #auxTPAGEsave 562 lda #$400-1 563 phb 564 mvn $10400,0 565 plb 566 sec 567 xce 568 rts 569 570 *------------------------------------------------- 571 * 572 * Only if running on a GS: 573 * 574 * Restore aux text page from internal buffer 575 576 restTaux clc 577 xce 578 rep $30 579 ldx #auxTPAGEsave 580 ldy #$0400 581 lda #$400-1 582 phb 583 mvn 0,$10400 584 plb 585 sec 586 xce 587 rts 588 589 xc off 590 591 *------------------------------------------------- 592 593 GETBYTE inc GOTBYTE+1 594 bne GOTBYTE 595 inc GOTBYTE+2 596 GOTBYTE lda $FFFF 597 rts 598 599 *------------------------------------------------- 600 601 sav rw1835.pop 602 603 *------------------------------------------------- 604 605 lst on 606 607 ZPAGEBUF ds $100 608 BUFTABLE ds 18 609 ds \ 610 BLOCKBUF ds 512 611 612 auxTPAGEsave ds 1024 613 614 da * 615 616 lst off 617 618 *------------------------------------------------- EOF