mirror of
https://github.com/a2-4am/passport.git
synced 2024-10-31 16:05:12 +00:00
294 lines
7.4 KiB
Plaintext
294 lines
7.4 KiB
Plaintext
|
;-------------------------------
|
||
|
; 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
|