; /!\ execution falls through here from Trace ;------------------------------- ; UseUniversal ; Caller has decided to use the built-in RWTS to read ; this disk (possibly already patched with disk-specific ; parameters). Now we check for protections that require ; additional patches or callbacks before we start. ; ; in: $0800..$08FF contains boot0 ; $B600..$BFFF contains boot1 ; out: all registers clobbered ; exits via ReadWithRWTS ;------------------------------- UseUniversal ; ; Copy built-in RWTS into place ($B800..$BFFF) ; jsr StartWithUniv ; ; On pure 13-sector disks, we just hijack the read routine to perform a ; verification instead. ; lda gIs13Sector bne @not13Sector lda #0 sta $47E ; restore track number replaced by DOS lda #seekread13 sta jCallRWTS+2 bne @doneUnivPatching ; always branches @not13Sector ; ; On disks that use the universal RWTS for the entire disk, we use ; an adaptive RWTS that accepts any epilogue on the first sector but then ; enforces all other sectors to have the same epilogue. ; ldy #$09 - lda _adaptiveAddressEpilogue, y sta $B994, y lda _adaptiveDataEpilogue, y sta $B938, y dey bpl - ; ; On Dinkey-DOS disks (e.g. Ultima V, Times of Lore), we don't use the ; adaptive RWTS we just copied into place. Instead, we use the same space ; to create a hybrid RWTS that alters the sector number in the ; address field based on the address epilogue. Once we normalize the ; sector numbers, no further patches are required, since the RWTS can also ; read unprotected disks. A separate patcher finds the actual code that ; alters the sector number to print it to the log. ; lda gIsDinkeyDOS bne @notDinkeyDOS ldy #$0F - lda _originAddressEpilogue, y sta $B990, y lda _originDataEpilogue, y sta $B92F, y dey bpl - @notDinkeyDOS ; ; On TSR disks (e.g. Dawn Patrol, Dungeon), we start with the universal ; RWTS then apply a patch in memory. ; lda gIsTSR bne @notTSR lda #<_tsrCallback sta $BE8C lda #>_tsrCallback sta $BE8D @notTSR ; ; Disable drive recalibration on bad sectors so we give up on bad sectors ; faster and detect unformatted or specially structured tracks faster. ; lda #$B0 sta $BDD2 lda #$30 sta $BDD3 ; ; Some disks have different epilogues on track 0, so we stop using the ; adaptive RWTS so we don't falsely accuse those disks of being damaged. ; (This is implemented by recopying the entire built-in RWTS into place ; which wipes out all the above patches, but track 0 of Dinkey-DOS and ; TSR disks is readable, so it's OK that they fall through to here.) ; lda #kSectorResetAdaptiveRWTS sta T00S0F ; ; Some disks have an intentionally invalid checksum on T00,S00 (read by ; the drive firmware, which doesn't verify it). ; lda #kSectorIgnoreAddressChecksum sta T00S00 @doneUnivPatching jmp ReadWithRWTS SwitchToUniv lda gSector sta gDisplayBytes lda #s_switch !byte $2C ; hide next LDA ; /!\ execution falls through here StartWithUniv lda #s_builtin sta + jsr PrintByID + !byte $FD ; SMC lda #TRUE sta gTriedUniv lda #FALSE sta gIsProtDOS ; /!\ execution falls through here CopyUniversal lda #$B8 pha jsr MoveT00PakLow ; move T00 modules out of the way if necessary pla ; /!\ execution falls through here CopyUniversalAnywhere sta universalrwts clc adc #$02 sta .cu+2 lda #>universalrwts sta _byte_hi lda #