mirror of
https://github.com/a2-4am/passport.git
synced 2024-12-26 01:29:39 +00:00
verify 13-sector disks, too
This commit is contained in:
parent
8b58e3b94f
commit
617a2020b6
@ -48,16 +48,21 @@
|
||||
; instead of falling back to built-in RWTS
|
||||
; compile-time flag, no way to change at runtime
|
||||
|
||||
;gMECCFastloadType
|
||||
!byte 00 ; int
|
||||
;gIs13Sector
|
||||
!byte FALSE ; 0=true, 1=false
|
||||
; reset before each operation
|
||||
; set in IDBootloader() after reading T00,S00
|
||||
; set in IDBootFailure() after reading T00
|
||||
|
||||
;gIsInfocom18
|
||||
!byte FALSE ; 0=true, 1=false
|
||||
; reset before each operation
|
||||
; set in IDBootFailure() after reading T00
|
||||
|
||||
;gMECCFastloadType
|
||||
!byte 00 ; int
|
||||
; reset before each operation
|
||||
; set in IDBootloader() after reading T00,S00
|
||||
|
||||
FIRSTFILTER
|
||||
;gIsRDOS
|
||||
!byte FALSE ; 0=true, 1=false
|
||||
|
@ -101,8 +101,10 @@ gIsRDOS13 = gIsDavidson-$01 ; byte
|
||||
;LASTFILTER ; add new gIs* above this line
|
||||
;gIsInfocom18 is a special case whose ID is not in the regular inspection path
|
||||
gIsInfocom18 = gIsRDOS13-$01 ; byte
|
||||
;gIs13Sector is a special case whose ID is not in the regular inspection path
|
||||
gIs13Sector = gIsInfocom18-$01 ; byte
|
||||
;gMECCFastloadType is a special case integer whose default value cannot be #FALSE
|
||||
gMECCFastloadType = gIsInfocom18-$01 ; byte
|
||||
gMECCFastloadType = gIs13Sector-$01 ; byte
|
||||
|
||||
gOnAClearDayYouCanReadForever = gMECCFastloadType-$01 ; byte
|
||||
gUsingRAMDisk = gOnAClearDayYouCanReadForever-$01 ; byte
|
||||
@ -171,6 +173,7 @@ ConstructStandardDelivery = jConstructStandardDelivery
|
||||
!warn "gIsDavidson=",gIsDavidson
|
||||
!warn "gIsRDOS13=",gIsRDOS13
|
||||
!warn "gIsInfocom18=",gIsInfocom18
|
||||
!warn "gIs13Sector=",gIs13Sector
|
||||
!warn "gOnAClearDayYouCanReadForever=",gOnAClearDayYouCanReadForever
|
||||
!warn "gUsingRAMDisk=",gUsingRAMDisk
|
||||
!warn "gRAMDiskRef=",gRAMDiskRef
|
||||
|
@ -20,11 +20,18 @@ IDBootloader
|
||||
stx gLastTrack
|
||||
|
||||
lda gIsInfocom18
|
||||
bne .sanity
|
||||
bne .check13
|
||||
lda #s_infocom18
|
||||
jsr PrintByID
|
||||
jmp UseUniversal
|
||||
|
||||
.check13
|
||||
lda gIs13Sector
|
||||
bne .sanity
|
||||
lda #s_13sector
|
||||
jsr PrintByID
|
||||
jmp UseUniversal
|
||||
|
||||
.sanity
|
||||
;
|
||||
; Quick sanity check -- only recognized values for $0800
|
||||
@ -302,7 +309,8 @@ PrereadT00Partial
|
||||
; main entry point to identify the bootloader
|
||||
; when the initial read failed
|
||||
; identifies Infocom 18-sector side B disks
|
||||
; doubles as verification routine after ID
|
||||
; and pure 13-sector disks
|
||||
; doubles as Infocom verification routine after ID
|
||||
; written by qkumba
|
||||
;
|
||||
; in: nothing
|
||||
@ -310,40 +318,44 @@ PrereadT00Partial
|
||||
;-------------------------------
|
||||
!zone {
|
||||
IDBootFailure
|
||||
lda #FALSE
|
||||
sta gIsInfocom18
|
||||
bit gMode ; only in verify-mode
|
||||
bmi .branchno
|
||||
|
||||
VerifyInfocom18
|
||||
lda $C0E9
|
||||
lda #$1A ; the length of a track
|
||||
sta tmp ; keep X register free
|
||||
.retry13
|
||||
ldx #$1A ; the length of a track
|
||||
ldy #0
|
||||
|
||||
- iny
|
||||
--- iny
|
||||
bne +
|
||||
dec tmp
|
||||
beq .branchno
|
||||
+ lda $C0EC
|
||||
dex
|
||||
bne +
|
||||
|
||||
.no sec
|
||||
lda $C0E8
|
||||
rts
|
||||
|
||||
.badsect
|
||||
lda gIsInfocom18
|
||||
beq .no ; if in Infocom mode already then we have a true failure
|
||||
bne .retry13 ; otherwise, try to identify 13-sector instead
|
||||
; the issue being that both have a D5 AA AD sequence
|
||||
|
||||
+
|
||||
- lda $C0EC
|
||||
bpl -
|
||||
-- cmp #$D5
|
||||
bne -
|
||||
bne ---
|
||||
- lda $C0EC
|
||||
bpl -
|
||||
cmp #$AA
|
||||
bne --
|
||||
- lda $C0EC
|
||||
bpl -
|
||||
cmp #$B5 ; 13-sector only
|
||||
beq .build13
|
||||
cmp #$AD
|
||||
beq .tryinfocom
|
||||
ldx gIsInfocom18
|
||||
beq -- ; resume if already in Infocom mode
|
||||
;;other things here in future
|
||||
.branchno
|
||||
jmp .no
|
||||
bne --
|
||||
|
||||
.tryinfocom
|
||||
- lda $C0EC
|
||||
bpl -
|
||||
nop
|
||||
@ -373,15 +385,113 @@ VerifyInfocom18
|
||||
- ldx $C0EC
|
||||
bpl -
|
||||
eor $BA00,x ; from universal RWTS
|
||||
bne .no
|
||||
bne .badsect
|
||||
dec tmp
|
||||
bne --
|
||||
sta gIsInfocom18
|
||||
clc ; all clear
|
||||
!byte $24
|
||||
.no
|
||||
sec
|
||||
|
||||
.checkmode
|
||||
bit gMode ; verify-mode already?
|
||||
bpl + ; yes, continue
|
||||
|
||||
lda #%00000000 ;
|
||||
sta gMode ; no, switch to verify-mode
|
||||
lda #s_toverify
|
||||
jsr PrintByID ; and say so
|
||||
|
||||
+ clc ; all clear
|
||||
lda $C0E8
|
||||
rts
|
||||
|
||||
;build 5-and-3 decoding table
|
||||
;for 13-sector support
|
||||
|
||||
.build13
|
||||
ldx #$00
|
||||
ldy #$AB
|
||||
- tya
|
||||
sta tmp
|
||||
lsr
|
||||
ora tmp
|
||||
cmp #$FF
|
||||
bne +
|
||||
cpy #$D5
|
||||
beq +
|
||||
txa
|
||||
sta $800,y
|
||||
inx
|
||||
+ iny
|
||||
bne -
|
||||
sty gIs13Sector
|
||||
beq .checkmode ; always taken
|
||||
|
||||
read13
|
||||
lda $C0E9
|
||||
lda #$1C ; retry count
|
||||
sta tmp
|
||||
|
||||
.readaddr
|
||||
dec tmp
|
||||
bmi .badread
|
||||
clc
|
||||
ldx #$02 ; 512 nibbles
|
||||
ldy #0
|
||||
|
||||
.readdata
|
||||
php
|
||||
--- iny
|
||||
bne +
|
||||
dex
|
||||
beq .badread
|
||||
+
|
||||
- lda $C0EC
|
||||
bpl -
|
||||
-- cmp #$D5
|
||||
bne ---
|
||||
- lda $C0EC
|
||||
bpl -
|
||||
cmp #$AA
|
||||
bne --
|
||||
- lda $C0EC
|
||||
bpl -
|
||||
cmp #$B5
|
||||
bne +
|
||||
ldy #$03
|
||||
-- lda $C0EC
|
||||
bpl --
|
||||
rol
|
||||
sta $3C
|
||||
- lda $C0EC
|
||||
bpl -
|
||||
and $3C
|
||||
dey
|
||||
bne --
|
||||
plp
|
||||
cmp gSector
|
||||
bne .readaddr
|
||||
bcs .readdata
|
||||
+ plp
|
||||
bcc .readaddr
|
||||
eor #$AD
|
||||
bne read13
|
||||
-- ldy #$9A
|
||||
- ldx $C0EC
|
||||
bpl -
|
||||
eor $800,x
|
||||
dey
|
||||
bne -
|
||||
- ldx $C0EC
|
||||
bpl -
|
||||
eor $800,x
|
||||
iny
|
||||
bne -
|
||||
- ldx $C0EC
|
||||
bpl -
|
||||
eor $800,x
|
||||
cmp #$01 ; set carry if non-zero
|
||||
!byte $24
|
||||
.badread
|
||||
sec
|
||||
lda $C0E8
|
||||
rts
|
||||
}
|
||||
|
@ -254,6 +254,8 @@ Reaction
|
||||
sta gTriedUniv
|
||||
sta gSaidWriting
|
||||
sta gIsProtDOS
|
||||
sta gIsInfocom18
|
||||
sta gIs13Sector
|
||||
lda #$00
|
||||
sta gTrack
|
||||
sta gSector
|
||||
@ -341,6 +343,17 @@ UseUniversal
|
||||
jsr PatchUniversalRWTSForOrigin
|
||||
bmi ReadWithRWTS ; always branches
|
||||
;
|
||||
; On pure 13-sector disks, we just hijack the read routine to perform a
|
||||
; verification instead.
|
||||
;
|
||||
+ lda gIs13Sector
|
||||
bne +
|
||||
lda #<read13
|
||||
sta jCallRWTS+1
|
||||
lda #>read13
|
||||
sta jCallRWTS+2
|
||||
bne ReadWithRWTS ; always branches
|
||||
;
|
||||
; 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.
|
||||
@ -370,7 +383,10 @@ ReadWithRWTS
|
||||
lda #$22
|
||||
jsr ChangeTrackNW
|
||||
lda #$0F
|
||||
jsr ChangeSector
|
||||
ldx gIs13Sector
|
||||
bne +
|
||||
lda #$0C
|
||||
+ jsr ChangeSector
|
||||
lda #<T22S0F
|
||||
sta checksector+1
|
||||
lda #>T22S0F
|
||||
@ -415,8 +431,11 @@ checksector
|
||||
; If we just got to this track, check for whole-track protections.
|
||||
;
|
||||
ldx #$0F ;16-sector
|
||||
lda gIs13Sector
|
||||
beq .expect13
|
||||
lda gIsDOS32
|
||||
bne +
|
||||
.expect13
|
||||
ldx #$0C ;13-sector
|
||||
+ cpx gSector
|
||||
bne .checkoptional
|
||||
@ -493,7 +512,10 @@ nextsector
|
||||
jmp .read
|
||||
.prevtrack
|
||||
lda #$0F
|
||||
jsr ChangeSector
|
||||
ldx gIs13Sector
|
||||
bne +
|
||||
lda #$0C
|
||||
+ jsr ChangeSector
|
||||
lda gTrack
|
||||
sec
|
||||
sbc #$01
|
||||
|
@ -124,6 +124,8 @@ StringTable
|
||||
!word .ssi
|
||||
!word .aacount
|
||||
!word .infocom18
|
||||
!word .toverify
|
||||
!word .sector13
|
||||
;
|
||||
; Text can contain substitution strings, which
|
||||
; are replaced by current values at runtime. Each
|
||||
@ -149,7 +151,7 @@ StringTable
|
||||
; can be set directly before calling PrintByID.
|
||||
;
|
||||
.header
|
||||
!text "Passport by 4am 2018-12-28",$00
|
||||
!text "Passport by 4am 2018-12-29",$00
|
||||
.mainmenu
|
||||
!text "________________________________________",$8D,$8D,$8D,$8D,$8D,$8D,$8D
|
||||
!text " "
|
||||
@ -459,4 +461,8 @@ StringTable
|
||||
!text "T%t,S%0 Found AA nibble count",$8D,$00
|
||||
.infocom18
|
||||
!text "T00,S00 Found Infocom 18-sector format",$8D,$00
|
||||
.toverify
|
||||
!text "Switching to verify-only mode",$8D,$00
|
||||
.sector13
|
||||
!text "T00,S00 Found 13-sector format",$8D,$00
|
||||
}
|
||||
|
@ -110,4 +110,6 @@ s_rdos13 = $68
|
||||
s_ssi = $69
|
||||
s_aacount = $6A
|
||||
s_infocom18 = $6B
|
||||
STRINGCOUNT = $6C
|
||||
s_toverify = $6C
|
||||
s_13sector = $6D
|
||||
STRINGCOUNT = $6E
|
||||
|
Loading…
Reference in New Issue
Block a user