support Micrograms bad block check [fixes Granny Applebee's Cookie Factory, Uncle Clyde's Consonant Slide, and several others]

This commit is contained in:
4am 2021-04-29 21:55:45 -04:00
parent c475e8597c
commit 691e6f8777
6 changed files with 81 additions and 2 deletions

View File

@ -184,7 +184,8 @@ were common in educational software.
e.g. Fantasy Land, Behind The Wheel
- Micrograms
e.g. Wild West Math
e.g. Wild West Math, Granny
Applebee's Cookie Factory
- Millennium Group
e.g. The Brain Game, Concentration
@ -427,6 +428,9 @@ Development (unreleased)
- NEW: patchers/mastery.a (Mastery
Arithmetic Games)
- NEW: patchers/leisure.a (Clue, RISK)
- NEW: patchers/errord51.a (Granny
Applebee's Cookie Factory, Uncle
Clyde's Consonant Slides)
- IMPROVED: patches/mecc.a to erase
site license information from final
generation of MECC disks (by qkumba)

View File

@ -73,6 +73,11 @@
; set in IDBootFailure() after reading T00
FIRSTFILTER
;gIsLowDOS
!byte FALSE ; 0=true, 1=false
; reset before each operation
; set in IDVolumeName() after identifying ProDOS bootloader
;gPossibleB4BBBasic
!byte FALSE ; 0=true, 1=false
; reset before each operation

View File

@ -138,9 +138,10 @@ gIsTSR = gIsDiversi-$01 ; byte
gPossibleMECCSwapper = gIsTSR-$01 ; byte
gPossibleWoodbury = gPossibleMECCSwapper-$01 ; byte
gPossibleB4BBBasic = gPossibleWoodbury-$01 ; byte
gIsLowDOS = gPossibleB4BBBasic-$01 ; byte
;LASTFILTER ; add new gIs* above this line
;gIsInfocom18 is a special case whose ID is not in the regular inspection path
gIsInfocom18 = gPossibleB4BBBasic-$01 ; byte
gIsInfocom18 = gIsLowDOS-$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

View File

@ -72,6 +72,21 @@ IDVolumeName
bne -
lda #$8D
jsr PrintA
; while we're here, we check for a specific file that is
; always (!) in a specific place in the root directory
; (this will unlock a patcher with an expensive search)
lda #$0B
ldx #$7A
ldy #$06
jsr compare
!byte $4C,$4F,$57,$44,$4F,$53
bcs +
lda #TRUE
sta gIsLowDOS
lda #kSectorOptional
sta T00S0C
+
clc
!byte $24 ; hide next SEC
.error

View File

@ -389,6 +389,7 @@ AnalyzeTrack
!source "patchers/woodbury.a" ; gPossibleWoodbury only
!source "patchers/leisure.a" ; gIsProDOS && T22 only
!source "patchers/b4bbbasic.a" ; gPossibleB4BBBasic only
!source "patchers/errord51.a" ; gIsLowDOS only
_checkPatchCount
lda gPatchCount

53
src/patchers/errord51.a Normal file
View File

@ -0,0 +1,53 @@
;-------------------------------
; #ERRORD51
; sneaky bad block check sets an error callback
; then expects the RWTS call not to return
; (prints ']ERROR D51' on failure)
;
; tested on
; - Granny Applebee's Cookie Factory
; - Hugo Hound's Vowel Sounds (series)
; - Marty's Family Reader (series)
; - Marty's Reading Workout (series)
; - Uncle Clyde's Consonant Slides (series)
;-------------------------------
ERRORD51
lda gIsLowDOS
bne @exit
ldy #$10
jsr SearchTrack
!byte $A9,WILDCARD
!byte $8D,$07,WILDCARD
!byte $A9,WILDCARD
!byte $8D,$08,WILDCARD
!byte $A9,$01
!byte $8D,WILDCARD,WILDCARD
!byte $20
bcs @exit
sta gDisplayBytes
pha
clc
adc #BASEPAGE
sta @highBytePtr+2
txa
pha
jsr inx6
stx @highBytePtr+1
lda #s_badblock
jsr PrintByID
pla
tax
pla
ldy #$01
jsr modify
!byte $4C ; JMP opcode
@highBytePtr
ldy $FDFD ; SMC
sty +
inx
inx
ldy #$01
jsr modify
+ !byte $FD ; SMC (high byte of JMP address)
@exit