passport/src/analyze.a

294 lines
7.4 KiB
Plaintext
Executable File

;-------------------------------
; IsF7
; check for a specific nibble sequence
; ("F7 F6 EF EE AB") that is used by a
; whole-track protection scheme
;
; in slot 6, drive 1 is on track to test
; out C clear if sequence was found
; C set if sequence was not found
;-------------------------------
IsF7
lda $C0E9
lda #$00
jsr WAIT
lda #$20
sta nibcount
ldy #$00
- lda $C0EC
bpl -
cmp #$F7
beq +
restart iny
bne -
dec nibcount
bne -
beq F7fail
-
+ lda $C0EC
bpl -
cmp #$F6
bne restart
- lda $C0EC
bpl -
cmp #$EF
bne restart
- lda $C0EC
bpl -
cmp #$EE
bne restart
- lda $C0EC
bpl -
cmp #$AB
bne restart
clc
!byte $24 ; hides SEC
F7fail sec
lda $C0E8
rts
;-------------------------------
; IsSyncBytes
; check if track is mostly $FF bytes
;
; in slot 6, drive 1 is on track to test
; out C clear if track is mostly just $FF bytes
; C set otherwise
;-------------------------------
IsSyncBytes
lda #$FD
sta nibtableff
jsr IsUnformatted
lda #$3F
sta nibtableff
rts
;-------------------------------
; IsUnformatted
; check if track is unformatted
;
; in slot 6, drive 1 is on track to test
; out C clear if track is unformatted
; C set if track is formatted
;-------------------------------
IsUnformatted
lda $C0E9
lda #$00
sta unform
sta unform+1
jsr WAIT
lda #$20
sta nibcount
ldy #$00
nibloop ldx $C0EC
bpl nibloop
lda nibtable,x
bpl +
inc unform
bne +
inc unform+1
+ iny
bne nibloop
dec nibcount
bne nibloop
lda $C0E8
lda #$18
cmp unform+1
rts
;-------------------------------
; xHeredityDog
; check for a protection check at $BB00
; which implies an unreadable T00,S0A
;
; in: $0800..$08FF contains boot0
; $B600..$BFFF contains boot1
; out: C clear if protection code was found
; C set if protection code was not found
;-------------------------------
xHeredityDog
lda $08FE
clc
adc #$04
pha
ldx #$16
ldy #$0B
jsr CompareMemory
!byte $F0,05,$A2,$B2,$4C,$F0,$BB,$BD,$8C,$C0,$A9
pla
bcc analyze_maybe
jmp no1
; don't check byte at $BB21 because it can vary
analyze_maybe
ldx #$22
ldy #$3E
jsr CompareMemory
!byte $8D,00,02,$BD,$8C,$C0,$10,$FB,$C9,$EB,$D0,$F7,$BD,$8C
!byte $C0,$10,$FB,$C9,$D5,$D0,$EE,$BD,$8C,$C0,$10,$FB,$C9,$AA,$D0,$E5
!byte $A9,$4C,$A0,00,$99,00,$95,$88,$D0,$FA,$CE,$46,$BB,$AD,$46,$BB
!byte $C9,07,$D0,$EC,$A9,$18,$8D,$42,$B9,$A9,$0A,$8D,$ED,$B7,$D0,05
bcs no1
yes1
lda #$80
sta T00S0A
no1
rts
;-------------------------------
; xSunburst
; check for a Sunburst RWTS
; which implies an unreadable T11,S0F
;
; in: $0800..$08FF contains boot0
; $B600..$BFFF contains boot1
; out: C clear if Sunburst RWTS was found
; C set otherwise
;-------------------------------
xSunburst
lda $08FE
clc
adc #$03
ldx #$69
ldy #$2C
jsr CompareMemory
!byte $48,$A5,$2A,$4A,$A8,$B9,$29,$BA
!byte $8D,$6A,$B9,$8D,$84,$BC,$B9,$34
!byte $BA,$8D,$FC,$B8,$8D,$5D,$B8,$C0
!byte $11,$D0,03,$A9,02,$AC,$A9,$0E
!byte $8D,$C0,$BF,$68,$69,00,$48,$AD
!byte $78,04,$90,$2B
bcs no2
yes2
lda #$80
sta T11S0F
no2
rts
;-------------------------------
; xOptimumRes
; check if disk has Optimum Resource bootloader
; which implies an unreadable T01,S0F
;
; in: $0800..$08FF contains boot0
; $B600..$BFFF contains boot1
; out: C clear if OptimumRes bootloader was found
; C set otherwise
;-------------------------------
xOptimumRes
lda #$08
ldx #$5D
ldy #$0C
jsr CompareMemory
!byte $68,$85,$F0,$68,$85,$F1,$A0,01
!byte $B1,$F0,$85,$54
bcc yes3
lda #$08
ldx #$5D
ldy #$0C
jsr CompareMemory
!byte $68,$85,$A0,$68,$85,$A1,$A0,01
!byte $B1,$A0,$85,$54
bcs no3
yes3
lda #$80
sta T01S0F
no3
rts
;-------------------------------
; xB4BB
; check if disk changes RWTS in
; late boot after a nibble check
;
; in: $0800..$08FF contains boot0
; $B600..$BFFF contains boot1
; out: C clear if RWTS was modified in this routine
; C set otherwise
;-------------------------------
xB4BB
lda gTrack
pha
lda gSector
pha
b4bbcompare
lda #$FF ; modified at runtime (in Inspect1)
ldx #$00
ldy #$20
jsr CompareMemory
!byte $D8,$A9,$DF,$48,$A9,$FF,$48,$A9
!byte 08,$85,$3D,$85,$43,$A9,$BF,$85
!byte $3F,$A9,00,$85,$3C,$85,$42,$E6
!byte $42,$A9,$FE,$85,$3E,$A0,00,$AD
bcs _b4bbexit
lda #$00
sta gTrack
sta gAddress
lda #$0C
sta gSector
lda #$0C
clc
adc #BASEPAGE
sta gAddress+1
jsr ReadSector
bcs _b4bbexit
lda #$0C
ldx #$84
ldy #$03
jsr compare
!byte $4C,$BB,$B4
bcs _b4bbexit
lda #$02
sta gTrack
sta gSector
jsr ReadSector
bcs _b4bbexit
lda #$0C
clc
adc #BASEPAGE
sta x0+2
x0 lda $FFC2 ; modified at runtime (above)
b4bbmodify
sta $FF55 ; modified at runtime (in Inspect1)
lda #$DE
b4bbmodify2
sta $FF91 ; modified at runtime (in Inspect1)
_b4bbexit
pla
sta gSector
pla
sta gTrack
rts
;-------------------------------
; xB660
; Check if RWTS calls an extra routine at $B660
; after matching the first two data prologue
; nibbles. This routine can hang in an infinite
; loop if it's used to read an unprotected sector,
; so we need to force-switch to the built-in RWTS
; after reading all the protected sectors.
; (T00,S00-S09 are unprotected because they are
; read by the drive firmware.)
;
; in: $0800..$08FF contains boot0
; out: C clear if $B660 routine was found
; C set otherwise
;-------------------------------
xB660
lda #$08
ldx #$60
ldy #$1A
jsr CompareMemory
!byte $BD,$8C,$C0,$10,$FB,$C9,$AD,$D0
!byte $F4,$A9,$F8,$3D,$8C,$C0,$D0,02
!byte $EA,$EA,$EA,$EA,$BD,$8C,$C0,$2A
!byte $30,02
bcs no4
yes4
lda #$FE
sta T00S09
no4
rts