1 2 ; LST OFF 3 ORG $07FD 4 5 ******************************** 6 * * 7 * FASTLOADER * 8 * (C)1982 by THE STACK * 9 * CORRUPT COMPUTING * 10 * * 11 * Source by Deckard * 12 * * 13 ******************************** 14 15 * ===> For Crystal Castles 16 17 *------------------------------- 18 * Zero page 19 *------------------------------- 20 21 * DOS 3.3 File Manager 22 23 BUFADRL EQU $42 ; file buffer (low) 24 BUFADRH EQU $43 : (high) 25 26 * RDADR16 routine 27 28 RETRYCNT EQU $F2 ; nbr of retries 29 COUNT_NIBBLE EQU $F5 ; max nbr of nibbles before D5 AA 96 30 WTEMP EQU $F6 ; temp. field 31 WCHKSUM EQU $F8 ; working checksum 32 33 * Found address field 34 35 READ_CHKSUM EQU $F3 ; checksum 36 READ_SECT EQU $F4 ; sector number 37 READ_TRK EQU $F5 ; track number 38 READ_VOL EQU $F6 ; volume number 39 40 * Read data field 41 42 IDX EQU $F6 ; index 43 44 * MYSEEK/SEEKABS (DOS 3.3 RWTS) 45 46 TRKCNT EQU $F3 47 PRIOR EQU $F4 48 TRKN EQU $F5 49 DRV0TRK EQU $F7 50 ZCURTRK EQU $F7 51 SLOTEMP EQU $F8 52 MONTIMEL EQU $F9 53 MONTIMEH EQU $FA 54 55 * Mini RWTS parms 56 57 PTR_BUFFL EQU $FB ; pointer (low) for addr where to load pgm 58 PTR_BUFFH EQU $FC ; (high) 59 NB_SECT EQU $FD ; number of sectors 60 TRACK EQU $FE ; start track 61 SECTOR EQU $FF ; start sector 62 63 * Fastloader 64 65 TSL_PTR EQU $F0 ; pointer on TSL 66 FAST_IDX EQU $F1 ; index for LOAD_PAIRS 67 NB_PAGE EQU $EF ; how many consecutive page numbers 68 69 * DOS 3.3 70 71 CURTRK EQU $0478 72 73 *------------------------------- 74 * Ram 75 *------------------------------- 76 77 IN EQU $0200 78 H1F20 EQU $1F20 ; run addr of Crystal Castles 79 80 *------------------------------- 81 07FD: 4C 97 0B 82 JMP RELOCATOR 83 84 *------------------------------- 85 H0800 86 ORG $0400 87 0400: A0 AD AD 88 SCREEN ASC " ---> C R Y S T A L C A S T L E S <--- " 0403: AD BE A0 C3 A0 D2 A0 D9 040B: A0 D3 A0 D4 A0 C1 A0 CC 0413: A0 A0 C3 A0 C1 A0 D3 A0 041B: D4 A0 CC A0 C5 A0 D3 A0 0423: BC AD AD AD A0 89 90 *------------------------------- 91 * Load pairs 92 *------------------------------- 93 94 * HEX byte1 byte2 95 * Byte 1 : start memory page 96 * Byte 2 : number of sectors 97 0428: 09 17 98 LOAD_PAIRS HEX 0917 ; $0900-$1FFF 042A: 40 2C 99 HEX 402C ; $4000-$6BFF 042C: 70 0E 100 HEX 700E ; $7000-$7DFF 042E: 80 14 101 HEX 8014 ; $8000-$93FF 0430: 95 03 102 HEX 9503 ; $9500-$97FF 0432: 99 01 103 HEX 9901 ; $9900-$99FF 0434: 9C 01 104 HEX 9C01 ; $9C00-$9CFF 0436: A5 0A 105 HEX A50A ; $A500-$AEFF 106 107 * Free bytes (not used) 108 * Every 2nd byte = 1 (1 sector) 109 0438: 00 01 00 110 HEX 00010001000100010001000100010001 043B: 01 00 01 00 01 00 01 00 0443: 01 00 01 00 01 0448: 00 01 00 111 HEX 00010001000100010001000100010001 044B: 01 00 01 00 01 00 01 00 0453: 01 00 01 00 01 0458: 00 01 00 112 HEX 000100010001000100010001 045B: 01 00 01 00 01 00 01 00 0463: 01 0464: 00 113 DFB 0 ; end of list if full list of load pairs 114 115 *------------------------------- 116 * Load the game in memory: 117 * Use TSL to load sectors but 118 * the memory pages ARE NOT 119 * SEQUENTIAL (no INC PTR_BUFFH). 120 * A memory map is used to provide 121 * the good memory pages order. 122 *------------------------------- 123 124 ; Y=0 0465: B9 28 04 125 H0465 LDA LOAD_PAIRS,Y ; 1st byte = page to start loading 0468: F0 3E 126 BEQ MOVEP_00_07 ; terminate loop (normal end) 127 046A: 85 FC 128 STA PTR_BUFFH 046C: C8 129 INY 046D: B9 28 04 130 LDA LOAD_PAIRS,Y ; 2nd byte = number of pages (sectors) to 0470: 85 EF 131 STA NB_PAGE ; load 0472: 84 F1 132 STY FAST_IDX ; save index 0474: 20 E2 04 133 H0474 JSR LOAD_WITH_TSL 0477: C6 EF 134 DEC NB_PAGE ; another page 0479: D0 F9 135 BNE H0474 ; not finished 136 047B: A4 F1 137 LDY FAST_IDX ; next pair 047D: C8 138 INY 047E: D0 E5 139 BNE H0465 ; go (always) 140 141 *------------------------------- 142 0480: AD AD BE 143 ASC "--> THE WEST COAST PIRATES' EXCHANGE <--" 0483: A0 D4 C8 C5 A0 D7 C5 D3 048B: D4 A0 C3 CF C1 D3 D4 A0 0493: D0 C9 D2 C1 D4 C5 D3 A7 049B: A0 C5 D8 C3 C8 C1 CE C7 04A3: C5 A0 BC AD AD 144 145 *------------------------------- 146 * Move memory pages of the game 147 * to pages 0, 1, 2, ..., 7 148 *------------------------------- 149 150 * "First, anything that goes into pages 151 * 0, 1, 2, 5, 6 or 7 gets moved there". 152 04A8: A8 153 MOVEP_00_07 TAY ; Y=0 04A9: B9 DA 04 154 H04A9 LDA FROM_MEM,Y 04AC: 8D B6 04 155 STA H04B4+2 04AF: 8C B9 04 156 STY H04B7+2 ; #$00 to #$07 157 04B2: A2 00 158 LDX #0 ; copy page 04B4: BD 00 00 159 H04B4 LDA: $0000,X ; Merlin: force non zero page addressing 04B7: 9D 00 00 160 H04B7 STA: $0000,X 04BA: E8 161 INX 04BB: D0 F7 162 BNE H04B4 163 04BD: C8 164 INY 04BE: C0 08 165 CPY #8 ; page 8 04C0: 90 E7 166 BCC H04A9 ; no, not finished 167 168 *------------------------------- 169 * Save page 4 170 *------------------------------- 171 172 * "After those moves are complete, Page 4 gets moved 173 * to the page that was moved to Page 6, which is no 174 * longer needed". 175 * "If nothing nothing was moved to Page 6, Page 4 176 * gets moved there. 177 178 ; X=0 04C2: BD 00 04 179 H04C2 LDA SCREEN,X 04C5: 9D 00 06 180 STA $0600,X ; page 6 was not moved, so write to page 6 04C8: E8 181 INX 04C9: D0 F7 182 BNE H04C2 183 04CB: 4C CE 06 184 JMP $06CE ; <=> JMP H04CE (page 4 moved to page 6) 185 186 *------------------------------- 187 * Save memory page 4 of the game 188 * to Page 4 189 *------------------------------- 190 191 * "Then whatever page goes into Page 4 gets moved 192 * to Page 4". 193 04CE: BD 00 04 194 H04CE LDA $0400,X ; page 4 of the game not used. Keep existing 04D1: 9D 00 04 195 STA $0400,X ; page 4 04D4: E8 196 INX 04D5: D0 F7 197 BNE H04CE 198 04D7: 4C 20 1F 199 JMP H1F20 ; run Crystal Castles 200 201 *------------------------------- 202 * Memory page which must be 203 * moved from $0000 to $07FF 204 *------------------------------- 205 206 * For Crystal Castles: nothing special to move 207 * (source = destination) 208 * No move allowed for pages 3 and 4 209 04DA: 00 01 02 210 FROM_MEM HEX 0001020304050607 04DD: 03 04 05 06 07 211 * HEX ??????0304?????? 212 213 *------------------------------- 214 * Example for another "FASTLOADER" game: HARD HAT MACK 215 * 216 * H04C2 LDA SCREEN,X ; save page 4 to page $25 217 * STA $2500,X ; page 6 previously filled with page $25 218 * INX 219 * BNE H04C2 220 * 221 * JMP $06CE ; <=> JMP H04CE 222 * 223 * H04CE LDA $2300,X ; page 4 of the game was here 224 * STA $0400,X ; move it to page 4 225 * INX 226 * BNE H04CE 227 * 228 * JMP $082D ; run Hard Hat Mack 229 * 230 * FROM_MEM 231 * HEX 2021220304242526 232 * * HEX ??????0304?????? 233 *------------------------------- 234 235 *------------------------------- 236 * Load 1 sector with the help 237 * of the TSL 238 *------------------------------- 239 04E2: A0 00 240 LOAD_WITH_TSL LDY #0 ; full memory page 04E4: 84 FB 241 STY PTR_BUFFL 04E6: C8 242 INY 04E7: 84 FD 243 STY NB_SECT ; load 1 sector 244 04E9: A4 F0 245 LDY TSL_PTR 04EB: B9 00 02 246 LDA IN,Y ; track number 04EE: F0 31 247 BEQ H0521 ; T$00 = finished 248 04F0: 85 FE 249 STA TRACK 04F2: C8 250 INY 04F3: B9 00 02 251 LDA IN,Y ; sector number 04F6: 85 FF 252 STA SECTOR 04F8: C8 253 INY ; pointer ready for next T/S pair 04F9: 84 F0 254 STY TSL_PTR 04FB: 20 22 05 255 JSR MINI_RWTS ; load sector 04FE: A4 F0 256 LDY TSL_PTR ; end of TSL? 0500: D0 1F 257 BNE H0521 ; no 258 259 * Load the next sector of TSL 260 ; Y=0 0502: A5 FC 261 LDA PTR_BUFFH 0504: C8 262 INY ; Y=1 0505: 84 FD 263 STY NB_SECT ; load 1 sector 0507: C8 264 INY ; Y=2 0508: 84 FC 265 STY PTR_BUFFH ; Y=#>$0200 (=IN) 050A: AC 01 02 266 LDY IN+1 ; the current TSL list sector indicates 050D: F0 12 267 BEQ H0521 ; that there is no additional TSL sector: end 268 050F: 84 FE 269 STY TRACK , load it 0511: AC 02 02 270 LDY IN+2 0514: 84 FF 271 STY SECTOR 0516: 48 272 PHA ; save buffer addr of the game 0517: 20 22 05 273 JSR MINI_RWTS 051A: 68 274 PLA ; restore it 051B: 85 FC 275 STA PTR_BUFFH 051D: A9 0C 276 LDA #$0C ; pointer on the first T/S pair 051F: 85 F0 277 STA TSL_PTR 0521: 60 278 H0521 RTS 279 280 281 ******************************** 282 * * 283 * Mini RWTS * 284 * by The Stack * 285 * (c)1982 Corrupt Computing * 286 * * 287 ******************************** 288 289 * Notes (Deckard): 290 * 291 * Contains parts of the original DOS 3.3 RWTS 292 * (c)1980 by Apple Computer Inc 293 * 294 * In fact MINI RWTS should be called MINI RTS 295 * because it is a read only routine (no "W"). 296 297 298 * In : TRACK/SECTOR/NB_SECT/PTR_BUFF (low & high) 299 0522: A2 60 300 MINI_RWTS LDX #$60 ; slot 6 *16 301 0524: BD 8E C0 302 SAMESLOT LDA $C08E,X 0527: BD 8E C0 303 LDA $C08E,X 052A: A0 08 304 LDY #$08 052C: BD 8C C0 305 H052C LDA $C08C,X 052F: 48 306 PHA 0530: 68 307 PLA 0531: 48 308 PHA 0532: 68 309 PLA 0533: DD 8C C0 310 CMP $C08C,X 0536: D0 03 311 BNE H053B 312 0538: 88 313 DEY 0539: D0 F1 314 BNE H052C 315 053B: 08 316 H053B PHP 053C: BD 89 C0 317 LDA $C089,X 318 ; set parameters (device characteristics table) 319 ; motor on time count (DCT) 053F: A9 D8 320 LDA #$D8 ; normal values (see your dos manual, RWTS 0541: 85 FA 321 STA MONTIMEH ; section, IOB table) 0543: A9 EF 322 LDA #$EF ; 0545: 85 F9 323 STA MONTIMEL 0547: 28 324 PLP 0548: 08 325 PHP 0549: D0 08 326 BNE NOWAIT 327 054B: A0 08 328 LDY #8 329 054D: 20 00 07 330 STEPWAIT JSR MSWAIT ; wait 100 usec for old drive's timing 0550: 88 331 DEY ; capacitor to discharge 0551: D0 FA 332 BNE STEPWAIT 333 0553: A5 FE 334 NOWAIT LDA TRACK 0555: 20 8D 06 335 JSR MYSEEK 0558: 28 336 PLP 0559: D0 11 337 BNE TRYTRK 338 055B: A4 FA 339 LDY MONTIMEH 055D: 10 0D 340 BPL TRYTRK 341 055F: A0 12 342 MOTOROFF LDY #$12 ; wait for motor to come up to speed 0561: 88 343 H0561 DEY 0562: D0 FD 344 BNE H0561 345 0564: E6 F9 346 INC MONTIMEL 0566: D0 F7 347 BNE MOTOROFF 348 0568: E6 FA 349 INC MONTIMEH 056A: D0 F3 350 BNE MOTOROFF 351 ; disk is now up to speed 352 353 *------------------------------- 354 * Read address field 355 * Same routine as DOS 3.3 RWTS 356 *------------------------------- 357 056C: A0 30 358 TRYTRK LDY #48 ; set up a maximum of 48 retries 056E: 84 F2 359 STY RETRYCNT 360 0570: A0 FC 361 RDADR16 LDY #$FC ; a too big gap is not allowed 0572: 84 F5 362 STY COUNT_NIBBLE ; if D5 AA 96 not found before a raisonnable 0574: C8 363 H0574 INY ; gap -> recalibration 0575: D0 04 364 BNE H057B 365 0577: E6 F5 366 INC COUNT_NIBBLE 0579: F0 4F 367 BEQ RDERR 368 369 * Search for prologue 370 057B: BD 8C C0 371 H057B LDA $C08C,X 057E: 10 FB 372 BPL H057B 373 0580: C9 D5 374 H0580 CMP #$D5 ; prologue D5 0582: D0 F0 375 BNE H0574 376 0584: EA 377 NOP 378 0585: BD 8C C0 379 H0585 LDA $C08C,X 0588: 10 FB 380 BPL H0585 381 058A: C9 AA 382 CMP #$AA ; prologue AA 058C: D0 F2 383 BNE H0580 384 058E: A0 03 385 LDY #3 ; index ready for addr field informations 0590: BD 8C C0 386 H0590 LDA $C08C,X 0593: 10 FB 387 BPL H0590 388 0595: C9 96 389 CMP #$96 ; prologue 96 0597: D0 E7 390 BNE H0580 391 392 * Search for sector informations 393 0599: A9 00 394 LDA #0 ; read volume/track/sector/checksum (4+4) 059B: 85 F8 395 H059B STA WCHKSUM ; init working checksum 396 059D: BD 8C C0 397 H059D LDA $C08C,X ; 1st nibble ('odd') 05A0: 10 FB 398 BPL H059D 399 05A2: 2A 400 ROL 05A3: 85 F3 401 STA READ_CHKSUM 05A5: BD 8C C0 402 H05A5 LDA $C08C,X ; 2nd nibble ('even') 05A8: 10 FB 403 BPL H05A5 404 05AA: 25 F3 405 AND READ_CHKSUM ; merge the two 05AC: 99 F3 00 406 STA $00F3,Y ; store it 05AF: 45 F8 407 EOR WCHKSUM ; update working checksum 05B1: 88 408 DEY 05B2: 10 E7 409 BPL H059B 410 05B4: A8 411 TAY ; last read=checksum 05B5: D0 13 412 BNE RDERR ; bad checksum -> retry 413 414 * Search for epilogue 415 05B7: BD 8C C0 416 H05B7 LDA $C08C,X 05BA: 10 FB 417 BPL H05B7 418 05BC: C9 DE 419 CMP #$DE ; epilogue DE 05BE: D0 0A 420 BNE RDERR 421 05C0: EA 422 NOP 423 05C1: BD 8C C0 424 H05C1 LDA $C08C,X 05C4: 10 FB 425 BPL H05C1 426 05C6: C9 AA 427 CMP #$AA ; epilogue AA 05C8: F0 17 428 BEQ RDRIGHT 429 430 *------------------------------- 431 05CA: C6 F2 432 RDERR DEC RETRYCNT ; -1 retry 05CC: 10 A2 433 BPL RDADR16 ; not the last one 434 435 *------------------------------- 436 437 * Unable to find a correct address field 438 * Recalibrate disk head 439 05CE: A5 F7 440 RECAL LDA ZCURTRK ; save track we want 05D0: 48 441 PHA 05D1: A9 60 442 LDA #$60 ; not a real track but ok to force recalibration 05D3: 85 F7 443 STA ZCURTRK 05D5: A9 00 444 LDA #0 ; track $00 please! 05D7: 20 8D 06 445 JSR MYSEEK 05DA: 68 446 PLA ; and now go to the desired track 05DB: 20 8D 06 447 H05DB JSR MYSEEK 05DE: 18 448 CLC ; always 05DF: 90 8B 449 BCC TRYTRK ; read address field under the R/W head 450 451 *------------------------------- 452 453 * We have just read an address field 454 * Now check for desired track and sector 455 05E1: A4 F5 456 RDRIGHT LDY READ_TRK ; track found 05E3: C4 F7 457 CPY ZCURTRK ; wanted track? 05E5: F0 07 458 BEQ H05EE ; yes, found 459 05E7: A5 F7 460 LDA ZCURTRK ; recalibrate on this 05E9: 84 F7 461 STY ZCURTRK ; current track = track found 05EB: 18 462 CLC 05EC: 90 ED 463 BCC H05DB ; always: exec recalibration 464 05EE: A4 FF 465 H05EE LDY SECTOR 05F0: B9 F0 06 466 LDA SKEWING,Y ; convert to "soft" sector (interleave) 05F3: C5 F4 467 CMP READ_SECT ; sector found? 05F5: D0 D3 468 BNE RDERR ; no 469 470 *------------------------------- 471 * Read data field 472 *------------------------------- 473 05F7: A0 20 474 READ16 LDY #$20 ; a too big gap 2 is not allowed 05F9: 88 475 RSYNC DEY ; sync byte-1 05FA: F0 CE 476 BEQ RDERR ; too big: retry 477 478 * Read prologue 479 05FC: BD 8C C0 480 H05FC LDA $C08C,X 05FF: 10 FB 481 BPL H05FC 482 0601: 49 D5 483 H0601 EOR #$D5 ; prologue D5 0603: D0 F4 484 BNE RSYNC 485 0605: EA 486 NOP 487 0606: BD 8C C0 488 H0606 LDA $C08C,X 0609: 10 FB 489 BPL H0606 490 060B: C9 AA 491 CMP #$AA ; prologue AA 060D: D0 F2 492 BNE H0601 493 060F: A0 56 494 LDY #$56 ; index part 1 0611: BD 8C C0 495 H0611 LDA $C08C,X 0614: 10 FB 496 BPL H0611 497 0616: C9 AD 498 CMP #$AD ; prologue AD 0618: D0 E7 499 BNE H0601 500 501 * Read 342 nibbles (342=$156 => $56+$100) 502 * = the data from the sector 503 061A: A9 00 504 LDA #0 ; init checksum 505 506 * Part 1 : $56 nibbles 507 061C: 88 508 RDATA1 DEY ; read stuff into NBUF2 061D: 84 F6 509 STY IDX 510 061F: BC 8C C0 511 H061F LDY $C08C,X 0622: 10 FB 512 BPL H061F 513 ; Y[$96,$FF] 0624: 59 97 06 514 EOR RD_TRANS_TBL-$96,Y 0627: A4 F6 515 LDY IDX ; Y[$00,$55] 0629: 99 97 07 516 STA NBUF2,Y 062C: D0 EE 517 BNE RDATA1 518 519 * Part 2 : $100 nibbles 520 062E: 84 F6 521 H062E STY IDX ; read stuff into NBUF1 (= final page) 522 0630: BC 8C C0 523 H0630 LDY $C08C,X 0633: 10 FB 524 BPL H0630 525 ; Y[$96,$FF] 0635: 59 97 06 526 EOR RD_TRANS_TBL-$96,Y 0638: A4 F6 527 LDY IDX 063A: 91 FB 528 STA (PTR_BUFFL),Y 063C: C8 529 INY 063D: D0 EF 530 BNE H062E 531 532 * Checksum 533 063F: BC 8C C0 534 H063F LDY $C08C,X ; read it 0642: 10 FB 535 BPL H063F 536 ; Y[$96,$FF] 0644: D9 97 06 537 CMP RD_TRANS_TBL-$96,Y ; and compare (must be = 0) 0647: D0 81 538 RDERR2 BNE RDERR ; bad sector -> retry 539 540 * Read epilogue 541 0649: BD 8C C0 542 H0649 LDA $C08C,X 064C: 10 FB 543 BPL H0649 544 064E: C9 DE 545 CMP #$DE ; epilogue DE 0650: D0 F5 546 BNE RDERR2 ; no -> bad sector: retry 547 0652: EA 548 NOP 549 0653: BD 8C C0 550 H0653 LDA $C08C,X 0656: 10 FB 551 BPL H0653 552 0658: C9 AA 553 CMP #$AA ; epilogue AA 065A: D0 EB 554 BNE RDERR2 ; no -> bad sector : retry 555 065C: 86 F8 556 STX SLOTEMP 557 558 * Post nibblize routine 559 065E: A0 00 560 LDY #0 0660: A2 56 561 H0660 LDX #$56 0662: CA 562 H0662 DEX 0663: 30 FB 563 BMI H0660 564 0665: B1 FB 565 LDA (PTR_BUFFL),Y 0667: 5E 97 07 566 LSR NBUF2,X 066A: 2A 567 ROL 066B: 5E 97 07 568 LSR NBUF2,X 066E: 2A 569 ROL 066F: 91 FB 570 STA (PTR_BUFFL),Y ; store in user buffer 0671: C8 571 INY 0672: D0 EE 572 BNE H0662 573 574 *------------------------------- 575 576 * Prepare mini RWTS' parms if more than 1 sector to load 577 0674: A6 F8 578 LDX SLOTEMP 0676: BD 88 C0 579 LDA $C088,X 0679: E6 FC 580 INC PTR_BUFFH ; next page of memory 067B: A4 FF 581 LDY SECTOR ; previous sector 067D: 88 582 DEY 067E: 10 04 583 BPL H0684 ; was not sector $00 584 0680: A0 0F 585 LDY #$0F ; next sector = $0F of the previous track 0682: C6 FE 586 DEC TRACK 587 0684: 84 FF 588 H0684 STY SECTOR 0686: C6 FD 589 DEC NB_SECT ; nbr sector-1. Was last sector? 0688: F0 0B 590 BEQ H0695 ; yes, end. 591 068A: 4C 3B 05 592 JMP H053B ; read the next one 593 594 *------------------------------- 595 * Seek track routine 596 * (uses SEEKABS) 597 *------------------------------- 598 599 * In : Acc = desired track 600 * X = slot * 16 601 068D: 0A 602 MYSEEK ASL 068E: 06 F7 603 ASL ZCURTRK ; half track 0690: 20 96 06 604 JSR SEEKABS 0693: 46 F7 605 LSR ZCURTRK ; full track 0695: 60 606 H0695 RTS 607 608 *------------------------------- 609 * SEEKABS routine, moves the 610 * disk head over the desired 611 * track (same as DOS 3.3 RWTS) 612 *------------------------------- 613 614 * In : Acc = desired half track 615 * X = slot * 16 616 0696: 86 F8 617 SEEKABS STX SLOTEMP 0698: 85 F5 618 STA TRKN 069A: C5 F7 619 CMP DRV0TRK ; current half track? 069C: F0 4F 620 BEQ H06ED ; yes: end 621 069E: A9 00 622 LDA #0 06A0: 85 F3 623 STA TRKCNT 06A2: A5 F7 624 MOVEHEAD LDA DRV0TRK 06A4: 85 F4 625 STA PRIOR 06A6: 38 626 SEC 06A7: E5 F5 627 SBC TRKN 06A9: F0 31 628 BEQ ISTHERE 629 06AB: B0 06 630 BCS H06B3 631 06AD: 49 FF 632 EOR #$FF 06AF: E6 F7 633 INC DRV0TRK 06B1: 90 04 634 BCC H06B7 635 06B3: 69 FE 636 H06B3 ADC #$FE 06B5: C6 F7 637 DEC DRV0TRK 06B7: C5 F3 638 H06B7 CMP TRKCNT 06B9: 90 02 639 BCC H06BD 640 06BB: A5 F3 641 LDA TRKCNT 06BD: C9 0C 642 H06BD CMP #$0C 06BF: B0 01 643 BCS H06C2 644 06C1: A8 645 TAY 06C2: 38 646 H06C2 SEC 06C3: 20 E0 06 647 JSR CHKPOS 06C6: B9 15 07 648 LDA ONTBL,Y 06C9: 20 00 07 649 JSR MSWAIT 06CC: A5 F4 650 LDA PRIOR 06CE: 18 651 CLC 06CF: 20 E2 06 652 JSR CHKPOS2 06D2: B9 21 07 653 LDA OFFTBL,Y 06D5: 20 00 07 654 JSR MSWAIT 06D8: E6 F3 655 INC TRKCNT 06DA: D0 C6 656 BNE MOVEHEAD 657 658 *------------------------------- 659 06DC: 20 00 07 660 ISTHERE JSR MSWAIT ; wait arm 06DF: 18 661 CLC 662 06E0: A5 F7 663 CHKPOS LDA DRV0TRK 06E2: 29 03 664 CHKPOS2 AND #%00000011 06E4: 2A 665 ROL 06E5: 05 F8 666 ORA SLOTEMP 06E7: AA 667 TAX 06E8: BD 80 C0 668 LDA $C080,X 06EB: A6 F8 669 LDX SLOTEMP 06ED: 60 670 H06ED RTS 671 06EE: 00 672 DFB 0 06EF: 00 673 DFB 0 674 06F0: 00 0D 0B 675 SKEWING HEX 000D0B09070503010E0C0A080604020F 06F3: 09 07 05 03 01 0E 0C 0A 06FB: 08 06 04 02 0F 676 677 *------------------------------- 678 * Head move delay subroutine 679 * Delay acc*100+ usec 680 * (Same as DOS 3.3 RWTS) 681 *------------------------------- 682 0700: 86 F6 683 MSWAIT STX WTEMP ; added 684 0702: A2 11 685 H0702 LDX #$11 0704: CA 686 H0704 DEX 0705: D0 FD 687 BNE H0704 688 0707: E6 F9 689 INC MONTIMEL 0709: D0 02 690 BNE H070D 691 070B: E6 FA 692 INC MONTIMEH 693 070D: 38 694 H070D SEC 070E: E9 01 695 SBC #1 0710: D0 F0 696 BNE H0702 697 0712: A6 F6 698 LDX WTEMP ; added 0714: 60 699 RTS 700 701 *------------------------------- 702 * Phaseon/phaseoff tables 703 *------------------------------- 704 0715: 01 30 28 705 ONTBL HEX 01302824201E1D1C1C1C1C1C 0718: 24 20 1E 1D 1C 1C 1C 1C 0720: 1C 706 0721: 70 2C 26 707 OFFTBL HEX 702C2622 0724: 22 0725: 1F 1E 1D 708 HEX 1F1E1D1C1C1C1C1C 0728: 1C 1C 1C 1C 1C 709 710 *------------------------------- 711 * Read translate table 712 *------------------------------- 713 072D: 00 01 98 714 RD_TRANS_TBL HEX 0001989902039C04 0730: 99 02 03 9C 04 0735: 05 06 A0 715 HEX 0506A0A1A2A3A4A50708A8A9AA090A0B 0738: A1 A2 A3 A4 A5 07 08 A8 0740: A9 AA 09 0A 0B 0745: 0C 0D B0 716 HEX 0C0DB0B10E0F10111213B81415161718 0748: B1 0E 0F 10 11 12 13 B8 0750: 14 15 16 17 18 0755: 19 1A C0 717 HEX 191AC0C1C2C3C4C5C6C7C8C9CA1BCC1C 0758: C1 C2 C3 C4 C5 C6 C7 C8 0760: C9 CA 1B CC 1C 0765: 1D 1E D0 718 HEX 1D1ED0D1D21FD4D52021D82223242526 0768: D1 D2 1F D4 D5 20 21 D8 0770: 22 23 24 25 26 0775: 27 28 E0 719 HEX 2728E0E1E2E3E4292A2BE82C2D2E2F30 0778: E1 E2 E3 E4 29 2A 2B E8 0780: 2C 2D 2E 2F 30 0785: 31 32 F0 720 HEX 3132F0F1333435363738F8393A3B3C3D 0788: F1 33 34 35 36 37 38 F8 0790: 39 3A 3B 3C 3D 0795: 3E 3F 721 HEX 3E3F 722 723 NBUF2 ; $56 bytes 724 725 *------------------------------- 726 * Relocate FASTLOADER 727 *------------------------------- 728 729 ORG 730 0B97: AD 78 04 731 RELOCATOR LDA CURTRK ; save current track 0B9A: 85 F7 732 STA ZCURTRK 733 0B9C: A0 00 734 LDY #0 ; move code to to txt screen buffer 0B9E: B9 00 08 735 H0B9E LDA H0800,Y 0BA1: 99 00 04 736 H0BA1 STA SCREEN,Y 0BA4: C8 737 INY 0BA5: D0 F7 738 BNE H0B9E 739 ; Y=0 0BA7: EE A0 0B 740 INC H0B9E+2 ; high+1 read 0BAA: EE A3 0B 741 INC H0BA1+2 ; high+1 write 742 0BAD: AD A3 0B 743 LDA H0BA1+2 0BB0: C9 08 744 CMP #>$0800 ; end of txt screen buffer? 0BB2: 90 EA 745 BCC H0B9E ; no: continue 746 0BB4: A9 14 747 LDA #$14 ; should be #$0C but skip the 4 track/sector 0BB6: 85 F0 748 STA TSL_PTR ; references corresponding to the fastloader pgm 0BB8: C6 43 749 DEC BUFADRH 750 0BBA: A0 00 751 LDY #0 ; copy the TSL (1st sector) to a safe place 0BBC: B1 42 752 H0BBC LDA (BUFADRL),Y 0BBE: 99 00 02 753 STA IN,Y ; = keyboard buffer! 0BC1: C8 754 INY 0BC2: D0 F8 755 BNE H0BBC 756 ; Y=0 0BC4: 4C 65 04 757 JMP H0465 ; run fastloader 758 759 *------------------------------- 760 0BC7: 00 00 00 761 DS 38,0 0BCA: 00 00 00 00 00 00 00 00 0BD2: 00 00 00 00 00 00 00 00 0BDA: 00 00 00 00 00 00 00 00 0BE2: 00 00 00 00 00 00 00 00 0BEA: 00 00 00 762 763 *------------------------------- 764 0BED: A0 C6 C1 765 ASC " FASTLOADER" 0BF0: D3 D4 CC CF C1 C4 C5 D2 766 767 SAV FASTLOADER_CRYSTAL_CASTLES Object saved as FASTLOADER_CRYSTAL_CASTLES,A$07FD,L$03FB --End assembly, 1019 bytes, Errors: 0 Symbol table - alphabetical order: BUFADRH =$43 BUFADRL =$42 CHKPOS =$06E0 CHKPOS2 =$06E2 COUNT_NIBBLE =$F5 CURTRK =$0478 DRV0TRK =$F7 FAST_IDX =$F1 FROM_MEM =$04DA H0465 =$0465 H0474 =$0474 H04A9 =$04A9 H04B4 =$04B4 H04B7 =$04B7 H04C2 =$04C2 H04CE =$04CE H0521 =$0521 H052C =$052C H053B =$053B H0561 =$0561 H0574 =$0574 H057B =$057B H0580 =$0580 H0585 =$0585 H0590 =$0590 H059B =$059B H059D =$059D H05A5 =$05A5 H05B7 =$05B7 H05C1 =$05C1 H05DB =$05DB H05EE =$05EE H05FC =$05FC H0601 =$0601 H0606 =$0606 H0611 =$0611 H061F =$061F H062E =$062E H0630 =$0630 H063F =$063F H0649 =$0649 H0653 =$0653 H0660 =$0660 H0662 =$0662 H0684 =$0684 H0695 =$0695 H06B3 =$06B3 H06B7 =$06B7 H06BD =$06BD H06C2 =$06C2 H06ED =$06ED H0702 =$0702 H0704 =$0704 H070D =$070D H0800 =$0800 H0B9E =$0B9E H0BA1 =$0BA1 H0BBC =$0BBC H1F20 =$1F20 IDX =$F6 IN =$0200 ISTHERE =$06DC LOAD_PAIRS =$0428 LOAD_WITH_TSL=$04E2 MINI_RWTS =$0522 MONTIMEH =$FA MONTIMEL =$F9 MOTOROFF =$055F MOVEHEAD =$06A2 MOVEP_00_07 =$04A8 MSWAIT =$0700 MYSEEK =$068D NBUF2 =$0797 NB_PAGE =$EF NB_SECT =$FD NOWAIT =$0553 OFFTBL =$0721 ONTBL =$0715 PRIOR =$F4 PTR_BUFFH =$FC PTR_BUFFL =$FB RDADR16 =$0570 RDATA1 =$061C RDERR =$05CA RDERR2 =$0647 RDRIGHT =$05E1 RD_TRANS_TBL =$072D ? READ16 =$05F7 READ_CHKSUM =$F3 READ_SECT =$F4 READ_TRK =$F5 ? READ_VOL =$F6 ? RECAL =$05CE RELOCATOR =$0B97 RETRYCNT =$F2 RSYNC =$05F9 ? SAMESLOT =$0524 SCREEN =$0400 SECTOR =$FF SEEKABS =$0696 SKEWING =$06F0 SLOTEMP =$F8 STEPWAIT =$054D TRACK =$FE TRKCNT =$F3 TRKN =$F5 TRYTRK =$056C TSL_PTR =$F0 WCHKSUM =$F8 WTEMP =$F6 ZCURTRK =$F7 Symbol table - numerical order: BUFADRL =$42 BUFADRH =$43 NB_PAGE =$EF TSL_PTR =$F0 FAST_IDX =$F1 RETRYCNT =$F2 READ_CHKSUM =$F3 TRKCNT =$F3 READ_SECT =$F4 PRIOR =$F4 COUNT_NIBBLE =$F5 READ_TRK =$F5 TRKN =$F5 WTEMP =$F6 ? READ_VOL =$F6 IDX =$F6 DRV0TRK =$F7 ZCURTRK =$F7 WCHKSUM =$F8 SLOTEMP =$F8 MONTIMEL =$F9 MONTIMEH =$FA PTR_BUFFL =$FB PTR_BUFFH =$FC NB_SECT =$FD TRACK =$FE SECTOR =$FF IN =$0200 SCREEN =$0400 LOAD_PAIRS =$0428 H0465 =$0465 H0474 =$0474 CURTRK =$0478 MOVEP_00_07 =$04A8 H04A9 =$04A9 H04B4 =$04B4 H04B7 =$04B7 H04C2 =$04C2 H04CE =$04CE FROM_MEM =$04DA LOAD_WITH_TSL=$04E2 H0521 =$0521 MINI_RWTS =$0522 ? SAMESLOT =$0524 H052C =$052C H053B =$053B STEPWAIT =$054D NOWAIT =$0553 MOTOROFF =$055F H0561 =$0561 TRYTRK =$056C RDADR16 =$0570 H0574 =$0574 H057B =$057B H0580 =$0580 H0585 =$0585 H0590 =$0590 H059B =$059B H059D =$059D H05A5 =$05A5 H05B7 =$05B7 H05C1 =$05C1 RDERR =$05CA ? RECAL =$05CE H05DB =$05DB RDRIGHT =$05E1 H05EE =$05EE ? READ16 =$05F7 RSYNC =$05F9 H05FC =$05FC H0601 =$0601 H0606 =$0606 H0611 =$0611 RDATA1 =$061C H061F =$061F H062E =$062E H0630 =$0630 H063F =$063F RDERR2 =$0647 H0649 =$0649 H0653 =$0653 H0660 =$0660 H0662 =$0662 H0684 =$0684 MYSEEK =$068D H0695 =$0695 SEEKABS =$0696 MOVEHEAD =$06A2 H06B3 =$06B3 H06B7 =$06B7 H06BD =$06BD H06C2 =$06C2 ISTHERE =$06DC CHKPOS =$06E0 CHKPOS2 =$06E2 H06ED =$06ED SKEWING =$06F0 MSWAIT =$0700 H0702 =$0702 H0704 =$0704 H070D =$070D ONTBL =$0715 OFFTBL =$0721 RD_TRANS_TBL =$072D NBUF2 =$0797 H0800 =$0800 RELOCATOR =$0B97 H0B9E =$0B9E H0BA1 =$0BA1 H0BBC =$0BBC H1F20 =$1F20