diff --git a/src/universalstyle.a b/src/universalstyle.a index ea45b9b..638fd0d 100644 --- a/src/universalstyle.a +++ b/src/universalstyle.a @@ -1,7 +1,34 @@ +;------------------------------- +; 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 jsr IncProgress +; +; 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 + + lda #read13 + sta jCallRWTS+2 + bne @doneUnivPatching ; always branches +; ; On Dinkey-DOS disks (e.g. Ultima V, Times of Lore), we start with the ; universal RWTS then apply a patch in memory. ; These disks use a hybrid RWTS that alters the sector number in the @@ -12,37 +39,49 @@ UseUniversal ; lda gIsDinkeyDOS bne + - jsr PatchUniversalRWTSForOrigin + ldy #$0F +- lda _originAddressEpilogue, y + sta $B990, y + dey + bpl - + ldy #$0A +- lda _originDataEpilogue, y + sta $B92F, y + dey + bpl - bmi @doneUnivPatching ; always branches ; ; On TSR disks (e.g. Dawn Patrol, Dungeon), we start with the universal ; RWTS then apply a patch in memory. ; -+ lda gIsTSR ++ + lda gIsTSR bne + - jsr PatchUniversalRWTSForTSR -; -; On pure 13-sector disks, we just hijack the read routine to perform a -; verification instead. -; -+ lda gIs13Sector - bne + - lda #read13 - sta jCallRWTS+2 - bne @doneUnivPatching ; always branches + lda #<_tsrCallback + sta $BE8C + lda #>_tsrCallback + sta $BE8D ; ; On other 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. ; -+ jsr PatchUniversalRWTSForAdaptive ++ + ldy #$09 +- lda _adaptiveAddressEpilogue, y + sta $B994, y + lda _adaptiveDataEpilogue, y + sta $B938, y + dey + bpl - ; ; Disable drive recalibration on bad sectors so we give up on bad sectors ; faster and detect unformatted or specially structured tracks faster. ; - jsr PatchUniversalRWTSForNoRecal + 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. @@ -100,49 +139,20 @@ CopyUniversalAnywhere bne .culoop rts -PatchUniversalRWTSForNoRecal - lda #$B0 - sta $BDD2 - lda #$30 - sta $BDD3 - rts - -PatchUniversalRWTSForAdaptive -; out: N flag set - ldy #$09 -- lda @addressepilogue, y - sta $B994, y - lda @dataepilogue, y - sta $B938, y - dey - bpl - - rts -@addressepilogue ; to $B994 +_adaptiveAddressEpilogue ; to $B994 !byte $8D,$91,$B9 !byte $A9,$AE !byte $8D,$93,$B9 !byte $D0,$00 -@dataepilogue ; to $B938 + +_adaptiveDataEpilogue ; to $B938 !byte $8D,$35,$B9 !byte $A9,$0A !byte $8D,$37,$B9 !byte $18 !byte $60 -PatchUniversalRWTSForOrigin -; out: N=1 - ldy #$0F -- lda @addressepilogue, y - sta $B990, y - dey - bpl - - ldy #$0A -- lda @dataepilogue, y - sta $B92F, y - dey - bpl - - rts -@addressepilogue ; to $B990 +_originAddressEpilogue ; to $B990 !byte $C9,$AB !byte $D0,$0A !byte $EA @@ -151,7 +161,8 @@ PatchUniversalRWTSForOrigin !byte $F0,$95 !byte $D0,$00 !byte $18,$60 -@dataepilogue ; to $B92F + +_originDataEpilogue ; to $B92F !byte $18 !byte $60 !byte $38 @@ -161,14 +172,7 @@ PatchUniversalRWTSForOrigin !byte $18 !byte $60 -PatchUniversalRWTSForTSR -; out: Z=0 - lda #<@tsr_callback - sta $BE8C - lda #>@tsr_callback - sta $BE8D - rts -@tsr_callback +_tsrCallback pha ldy gTrack cpy #$05