From 804d31e1f5735efbcb0467a67befd2c52a006f69 Mon Sep 17 00:00:00 2001 From: 4am Date: Tue, 4 Apr 2017 21:20:05 -0400 Subject: [PATCH] add support for Milliken protection --- src/id/milliken.a | 47 +++++++++++++++++++++++ src/id/trace.a | 19 +++++++++- src/passport.a | 4 +- src/patchers/milliken.a | 23 +++++++++++ src/sectormap.a | 84 +++++++++++++++++++++-------------------- src/strings/en.a | 9 ++++- 6 files changed, 141 insertions(+), 45 deletions(-) create mode 100644 src/id/milliken.a create mode 100644 src/patchers/milliken.a diff --git a/src/id/milliken.a b/src/id/milliken.a new file mode 100644 index 0000000..530d08d --- /dev/null +++ b/src/id/milliken.a @@ -0,0 +1,47 @@ +;------------------------------- +; IDMilliken +; identify Milliken protection routine +; in late-stage boot +; +; in: $B600..$BFFF contains RWTS that can read this disk +; $B747..$B749 contains "JMP $9B03" +; out: C clear if Milliken protection routine found +; C set otherwise +; all registers clobbered +; all other flags clobbered +;------------------------------- +!zone { +IDMilliken +; protection routine starts on T00,S0A (by this point we've +; already identified a marker on T00,S01 that strongly +; suggests the presence of this routine, so it's worth +; doing an extra disk read here to be sure) + lda #$00 + sta gTrack + lda #$0A + sta gSector + clc + adc #BASEPAGE + sta gAddress+1 + jsr ReadSector + bcs .exit + +IDMilliken1 +; variant 1 (seen in Gulp and Frenzy, Tangram Puzzler) + lda #$0A + ldx #$03 + ldy #$0E + jsr compare + !byte $A9,$AE,$8D,$00,$04,$4C,$99,$AD + !byte $AE,$F8,$05,$BD,$89,$C0 + bcc .exit + +; variant 2 (seen in The Writing Workshop) + ldy #$0B + jsr compare + !byte $A9,$AE,$8D,$00,$04,$AE,$F8,$05 + !byte $BD,$89,$C0 + +.exit + rts +} diff --git a/src/id/trace.a b/src/id/trace.a index a70b64f..e51829d 100755 --- a/src/id/trace.a +++ b/src/id/trace.a @@ -54,6 +54,7 @@ TraceDOS33b TraceDOS33c lda $08FE ; 2nd-level trace callback is here + sta .x6+1 clc adc #$02 _Inspect1a @@ -124,8 +125,24 @@ _Inspect1a ldy #$03 jsr CompareMemory !byte $AE,$E8,$1F - bcs + + bcs .x6 jmp UseUniversal ; give up tracing; this RWTS is unsupported +; +; Check for Milliken protection routine in late-stage boot +; (affects readable/ignoreable sector map, so must ID now) +; +.x6 lda #$FF ; check for "JMP $9B03" at $B747 + ldx #$47 + ldy #$03 + jsr CompareMemory + !byte $4C,$03,$9B + bcs + + jsr IDMilliken + bcs + + lda #s_milliken + jsr PrintByID + lda #$80 + sta T02S05 + jmp ADStyle ; use this RWTS to read the disk ; TODO this doesn't belong here diff --git a/src/passport.a b/src/passport.a index 5af4d1b..720c120 100755 --- a/src/passport.a +++ b/src/passport.a @@ -94,7 +94,7 @@ flag = $FF ; byte } ; Application constants (not zero addresses) -RELBASE = $6600 ; address to move Passport code +RELBASE = $6500 ; address to move Passport code ; so that it's out of the way LOWPOINT = $4300 ; lowest available address for code BASEPAGE = $10 ; Special Delivery tracer assumes @@ -149,6 +149,7 @@ FirstMover !source "id/encode44.a" !source "id/encode53.a" !source "id/ea.a" + !source "id/milliken.a" !source "print.a" !source "compare.a" !source "modify.a" @@ -690,6 +691,7 @@ _applyToT00 !source "patchers/nibtable.a" !source "patchers/diskvol.a" !source "patchers/c9ff.a" + !source "patchers/milliken.a" _applyToAll !source "patchers/universale7.a" !source "patchers/runhello.a" diff --git a/src/patchers/milliken.a b/src/patchers/milliken.a new file mode 100644 index 0000000..192f59c --- /dev/null +++ b/src/patchers/milliken.a @@ -0,0 +1,23 @@ +;------------------------------- +; #MILLIKEN +; Milliken protection routine on T00,S0A +; does a fake drive speed check then +; a nibble check +; e.g. Gulp and Frenzy, Tangram Puzzler, +; The Writing Workshop, Math Sequences +;------------------------------- +!zone { +_milliken + jsr IDMilliken1 + bcs .exit + lda #$01 + ldx #$48 + ldy #$02 + jsr compare ; and T00,S01,$48 == + !byte $03,$9B + bcs .exit + ldy #$02 + jsr modify ; then set T00,S01,$48 = + !byte $84,$9D +.exit +} diff --git a/src/sectormap.a b/src/sectormap.a index d7c8ebe..495906f 100755 --- a/src/sectormap.a +++ b/src/sectormap.a @@ -37,44 +37,46 @@ InitSectorMap ; (this is the default value for all sectors) ;------------------------------- sectormap -T00 !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF -T00S09 !byte $FF -T00S0A !byte $FF - !byte $FF,$FF,$FF,$FF,$FF -T01 !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF -T01S0F !byte $FF -T02 !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF -T03 !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF -T04 !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF -T05 !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF -T06 !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF -T07 !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF -T08 !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF -T09 !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF -T0A !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF -T0B !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF -T0C !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF -T0D !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF -T0E !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF -T0F !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF -T10 !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF -T11 !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF -T11S0F !byte $FF -T12 !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF -T13 !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF -T14 !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF -T15 !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF -T16 !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF -T17 !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF -T18 !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF -T19 !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF -T1A !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF -T1B !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF -T1C !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF -T1D !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF -T1E !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF -T1F !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF -T20 !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF -T21 !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF -T22 !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF -T22S0F !byte $FF +T00 !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF +T00S09 !byte $FF +T00S0A !byte $FF + !byte $FF,$FF,$FF,$FF,$FF +T01 !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF +T01S0F !byte $FF +T02 !byte $FF,$FF,$FF,$FF,$FF +T02S05 !byte $FF + !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF +T03 !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF +T04 !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF +T05 !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF +T06 !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF +T07 !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF +T08 !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF +T09 !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF +T0A !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF +T0B !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF +T0C !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF +T0D !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF +T0E !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF +T0F !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF +T10 !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF +T11 !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF +T11S0F !byte $FF +T12 !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF +T13 !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF +T14 !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF +T15 !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF +T16 !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF +T17 !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF +T18 !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF +T19 !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF +T1A !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF +T1B !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF +T1C !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF +T1D !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF +T1E !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF +T1F !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF +T20 !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF +T21 !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF +T22 !byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF +T22S0F !byte $FF diff --git a/src/strings/en.a b/src/strings/en.a index e74452c..cafcbe7 100755 --- a/src/strings/en.a +++ b/src/strings/en.a @@ -90,7 +90,8 @@ s_eatrk6 = $47 s_eeef = $48 s_poke = $49 s_bootcounter = $4A -STRINGCOUNT = $4B +s_milliken = $4B +STRINGCOUNT = $4C !zone { StringTable @@ -169,6 +170,7 @@ StringTable !word .eeef !word .poke !word .bootcounter + !word .milliken ; ; Text can contain substitution strings, which ; are replaced by current values at runtime. Each @@ -194,7 +196,7 @@ StringTable ; can be set directly before calling PrintByID. ; .header - !text "Passport by 4am 2017-04-03",00 + !text "Passport by 4am 2017-04-04",00 .mainmenu !text "________________________________________",$8D,$8D,$8D,$8D,$8D,$8D,$8D !text " " @@ -432,4 +434,7 @@ StringTable .bootcounter !text "T%t,S%0 Original disk destroys itself",$8D !text "after a limited number of boots.",$8D,$00 +.milliken + !text "T00,S0A Found Milliken protection check",$8D + !text "T02,S05 might be unreadable",$8D,00 }