add support for MECC M6 bootloader e.g. Word Munchers v1.1

This commit is contained in:
4am 2017-02-20 16:32:35 -05:00
parent df35e12a00
commit 4789751836
7 changed files with 218 additions and 152 deletions

View File

@ -150,6 +150,10 @@ IDBootloader
jmp foundmeccm7
.notmeccm7
jsr IDMECCM6
bcs .notmeccm6
jmp foundmeccm6
.notmeccm6
.notmecc
;
; Try to identify the encrypted Datasoft bootloader.

View File

@ -42,49 +42,46 @@ IDMECCM8
adc #BASEPAGE
sta gAddress+1
jsr ReadSector
bcc +
.no
rts
+
bcs .exit
; This entry point is also called by the meccm8 patcher
; in lieu of keeping a global variable around.
IDMECCM8RWTS
lda #$0B
ldx #$02
ldy #$06
jsr compare ; IF T00,S0B,$02 ==
!byte $BD,$8C,$C0,$10,$FB,$C9
bcs .no
lda #$0B
bcs .exit
ldx #$09
ldy #$09
jsr compare ; AND T00,S0B,$09 ==
!byte $D0,$EF,$EA,$BD,$8C,$C0,$10,$FB
!byte $C9
bcs .no
lda #$0B
bcs .exit
ldx #$13
ldy #$0A
jsr compare ; AND T00,S0B,$13 ==
!byte $D0,$E5,$A0,$03,$BD,$8C,$C0,$10
!byte $FB,$C9
bcs .no
lda #$0B
bcs .exit
ldx #$89
ldy #$06
jsr compare ; AND T00,S0B,$89 ==
!byte $BD,$8C,$C0,$10,$FB,$C9
bcs .no
lda #$0B
bcs .exit
ldx #$90
ldy #$09
jsr compare ; AND T00,S0B,$90 ==
!byte $D0,$F4,$EA,$BD,$8C,$C0,$10,$FB
!byte $C9
bcs .no
lda #$0B
bcs .exit
ldx #$9A
ldy #$09
jsr compare ; AND T00,S0B,$9A ==
!byte $D0,$F2,$EA,$BD,$8C,$C0,$10,$FB
!byte $C9
.exit
rts
foundmeccm8
@ -147,45 +144,41 @@ IDMECCM7
adc #BASEPAGE
sta gAddress+1
jsr ReadSector
bcc +
.no
rts
+
bcs .exit
; This entry point is also called by the meccm7 patcher
; in lieu of keeping a global variable around.
IDMECCM7RWTS
lda #$07
ldx #$7D
ldy #$06
jsr compare ; IF T00,S07,$7D ==
!byte $BD,$8C,$C0,$10,$FB,$C9
bcs .no
lda #$07
bcs .exit
ldx #$84
ldy #$09
jsr compare ; AND T00,S07,$84 ==
!byte $D0,$F0,$EA,$BD,$8C,$C0,$10,$FB,$C9
bcs .no
lda #$07
bcs .exit
ldx #$8E
ldy #$0A
jsr compare ; and T00,S07,$8E ==
!byte $D0,$F2,$A0,$03,$BD,$8C,$C0,$10,$FB,$C9
bcs .no
lda #$07
bcs .exit
ldx #$0F
ldy #$06
jsr compare ; and T00,S07,$0F ==
!byte $BD,$8C,$C0,$10,$FB,$49
bcs .no
lda #$07
bcs .exit
ldx #$18
ldy #$07
jsr compare ; and T00,S07,$18 ==
!byte $EA,$BD,$8C,$C0,$10,$FB,$C9
bcs .no
lda #$07
bcs .exit
ldx #$20
ldy #$0A
jsr compare ; and T00,S07,$20 ==
!byte $D0,$F2,$A0,$56,$BD,$8C,$C0,$10,$FB,$C9
.exit
rts
foundmeccm7
@ -228,3 +221,108 @@ foundmeccm7
sta $B8FC
jmp ADStyle
}
;-------------------------------
; IDMECCM6
; identify MECC "M6" bootloader
;
; in: track buffer contains T00,S00
; out: C clear if MECC "M6" bootloader was found
; C set if not found
; all other flags clobbered
; all registers clobbered
;-------------------------------
!zone {
IDMECCM6
lda #$00
sta gTrack
sta gAddress
lda #$0B
sta gSector
clc
adc #BASEPAGE
sta gAddress+1
jsr ReadSector
bcs .exit
dec gSector
dec gAddress+1
jsr ReadSector
bcs .exit
; This entry point is also called by the meccm6 patcher
; in lieu of keeping a global variable around.
IDMECCM6RWTS
lda #$0A
ldx #$E2
ldy #$06
jsr compare ; IF T00,S0A,$E2 ==
!byte $BD,$8C,$C0,$10,$FB,$C9
bcs .exit
ldx #$E9
ldy #$09
jsr compare ; AND T00,S0A,$E9 ==
!byte $D0,$EF,$EA,$BD,$8C,$C0,$10,$FB,$C9
bcs .exit
ldx #$F3
ldy #$0A
jsr compare ; and T00,S0A,$F3 ==
!byte $D0,$F2,$A0,$03,$BD,$8C,$C0,$10,$FB,$C9
bcs .exit
lda #$0B
ldx #$69
ldy #$06
jsr compare ; and T00,S0B,$69 ==
!byte $BD,$8C,$C0,$10,$FB,$C9
bcs .exit
ldx #$70
ldy #$09
jsr compare ; and T00,S0B,$70 ==
!byte $D0,$F4,$EA,$BD,$8C,$C0,$10,$FB,$C9
bcs .exit
ldx #$7A
ldy #$09
jsr compare ; and T00,S0B,$7A ==
!byte $D0,$F2,$EA,$BD,$8C,$C0,$10,$FB,$C9
.exit
rts
foundmeccm6
;
; We found an "M6" MECC bootloader. Now we create
; an RWTS that can read the rest of the disk.
; Starting with our built-in RWTS, we modify address
; and data prologues based on the parameters of the
; original disk.
;
lda #s_meccm6
jsr PrintByID
jsr CopyUniversal
lda #$00
sta modsrc
lda #$0A
clc
adc #BASEPAGE
sta modsrc+1
ldy #$E8
lda (modsrc),y
lsr
sta $B956
ldy #$F2
lda (modsrc),y
sta $B966
ldy #$FD
lda (modsrc),y
sta $B96F
inc modsrc+1
ldy #$6F
lda (modsrc),y
sta $B8E7
ldy #$79
lda (modsrc),y
sta $B8F1
ldy #$83
lda (modsrc),y
sta $B8FC
jmp ADStyle
}

View File

@ -672,6 +672,7 @@ _applyToT00
!source "patchers/rwts.a"
!source "patchers/meccm8.a"
!source "patchers/meccm7.a"
!source "patchers/meccm6.a"
!source "patchers/rol1e.a"
!source "patchers/jmpb4bb.a"
!source "patchers/jmpb4bbhi.a"

73
src/patchers/meccm6.a Normal file
View File

@ -0,0 +1,73 @@
;-------------------------------
; #MECCM6
; MECC fastloader with custom
; address and data prologues
; e.g. early versions of Word Munchers
;-------------------------------
!zone {
_meccm6
jsr IDMECC
bcs .exit
jsr IDMECCM6RWTS
bcs .exit
lda #$0A
ldx #$E8
ldy #$01
jsr compare ; if T00,S0A,$E8 !=
!byte $D5
bcc .addr2
ldy #$01
jsr modify ; then set T00,S0A,$E8 =
!byte $D5
.addr2
lda #$0A
ldx #$F2
ldy #$01
jsr compare ; if T00,S0A,$F2 !=
!byte $AA
bcc .addr3
ldy #$01
jsr modify ; then set T00,S0A,$F2 =
!byte $AA
.addr3
lda #$0A
ldx #$FD
ldy #$01
jsr compare ; if T00,S0A,$FD !=
!byte $96
bcc .data1
ldy #$01
jsr modify ; then set T00,S0A,$FD =
!byte $96
.data1
lda #$0B
ldx #$6F
ldy #$01
jsr compare ; if T00,S0B,$6F !=
!byte $D5
bcc .data2
ldy #$01
jsr modify ; then set T00,S0B,$6F =
!byte $D5
.data2
lda #$0B
ldx #$79
ldy #$01
jsr compare ; if T00,S0B,$79 !=
!byte $AA
bcc .data3
ldy #$01
jsr modify ; then set T00,S0B,$79 =
!byte $AA
.data3
lda #$0B
ldx #$83
ldy #$01
jsr compare ; if T00,S0B,$83 !=
!byte $AD
bcc .exit
ldy #$01
jsr modify ; then set T00,S0B,$83 =
!byte $AD
.exit
}

View File

@ -6,61 +6,16 @@
;-------------------------------
!zone {
_meccm7
lda #$00
ldx #$00
ldy #$17
jsr compare ; if T00,S00,$00 ==
!byte $01,$4C,$1A,$08,$17,$0F,$00,$00
!byte $0D,$0B,$09,$07,$05,$03,$01,$0E
!byte $0C,$0A,$08,$06,$04,$02,$0F
jsr IDMECC
bcs .exit
lda #$07
ldx #$7D
ldy #$06
jsr compare ; and T00,S07,$7D ==
!byte $BD,$8C,$C0,$10,$FB,$C9
jsr IDMECCM7RWTS
bcs .exit
lda #$07
ldx #$84
ldy #$09
jsr compare ; and T00,S07,$84 ==
!byte $D0,$F0,$EA,$BD,$8C,$C0,$10,$FB,$C9
bcs .exit
lda #$07
ldx #$8E
ldy #$0A
jsr compare ; and T00,S07,$8E ==
!byte $D0,$F2,$A0,03,$BD,$8C,$C0,$10,$FB,$C9
bcs .exit
lda #$07
ldx #$0F
ldy #$06
jsr compare ; and T00,S07,$0F ==
!byte $BD,$8C,$C0,$10,$FB,$49
bcs .exit
lda #$07
ldx #$18
ldy #$07
jsr compare ; and T00,S07,$18 ==
!byte $EA,$BD,$8C,$C0,$10,$FB,$C9
bcs .exit
lda #$07
ldx #$20
ldy #$0A
jsr compare ; and T00,S07,$20 ==
!byte $D0,$F2,$A0,$56,$BD,$8C,$C0,$10,$FB,$C9
bcc .allclear
.exit
jmp .exit2
.allclear
lda #$07
ldx #$83
ldy #$01
jsr compare ; if T00,S07,$83 !=
!byte $D5
bcc .addr2
lda #$07
ldx #$83
ldy #$01
jsr modify ; then set T00,S07,$83 =
!byte $D5
@ -71,8 +26,6 @@ _meccm7
jsr compare ; if T00,S07,$8D !=
!byte $AA
bcc .addr3
lda #$07
ldx #$8D
ldy #$01
jsr modify ; then set T00,S07,$8D =
!byte $AA
@ -83,8 +36,6 @@ _meccm7
jsr compare ; if T00,S07,$98 !=
!byte $96
bcc .data1
lda #$07
ldx #$98
ldy #$01
jsr modify ; then set T00,S07,$98 =
!byte $96
@ -95,8 +46,6 @@ _meccm7
jsr compare ; if T00,S07,$15 !=
!byte $D5
bcc .data2
lda #$07
ldx #$15
ldy #$01
jsr modify ; then set T00,S07,$15 =
!byte $D5
@ -107,8 +56,6 @@ _meccm7
jsr compare ; if T00,S07,$1F !=
!byte $AA
bcc .data3
lda #$07
ldx #$1F
ldy #$01
jsr modify ; then set T00,S07,$1F =
!byte $AA
@ -118,11 +65,9 @@ _meccm7
ldy #$01
jsr compare ; if T00,S07,$2A !=
!byte $AD
bcc .exit2
lda #$07
ldx #$2A
bcc .exit
ldy #$01
jsr modify ; then set T00,S07,$2A =
!byte $AD
.exit2
.exit
}

View File

@ -6,65 +6,16 @@
;-------------------------------
!zone {
_meccm8
lda #$00
ldx #$00
ldy #$17
jsr compare ; if T00,S00,$00 ==
!byte $01,$4C,$1A,$08,$17,$0F,$00,$00
!byte $0D,$0B,$09,$07,$05,$03,$01,$0E
!byte $0C,$0A,$08,$06,$04,$02,$0F
jsr IDMECC
bcs .exit
lda #$0B
ldx #$02
ldy #$06
jsr compare ; and T00,S0B,$02 ==
!byte $BD,$8C,$C0,$10,$FB,$C9
jsr IDMECCM8RWTS
bcs .exit
lda #$0B
ldx #$09
ldy #$09
jsr compare ; and T00,S0B,$09 ==
!byte $D0,$EF,$EA,$BD,$8C,$C0,$10,$FB
!byte $C9
bcs .exit
lda #$0B
ldx #$13
ldy #$0A
jsr compare ; and T00,S0B,$13 ==
!byte $D0,$E5,$A0,$03,$BD,$8C,$C0,$10
!byte $FB,$C9
bcs .exit
lda #$0B
ldx #$89
ldy #$06
jsr compare ; and T00,S0B,$89 ==
!byte $BD,$8C,$C0,$10,$FB,$C9
bcs .exit
lda #$0B
ldx #$90
ldy #$09
jsr compare ; and T00,S0B,$90 ==
!byte $D0,$F4,$EA,$BD,$8C,$C0,$10,$FB
!byte $C9
bcs .exit
lda #$0B
ldx #$9A
ldy #$09
jsr compare ; and T00,S0B,$9A ==
!byte $D0,$F2,$EA,$BD,$8C,$C0,$10,$FB
!byte $C9
bcc .allclear
.exit
jmp .exit2
.allclear
lda #$0B
ldx #$08
ldy #$01
jsr compare ; if T00,S0B,$08 !=
!byte $D5
bcc .addr2
lda #$0B
ldx #$08
ldy #$01
jsr modify ; then set T00,S0B,$0B =
!byte $D5
@ -75,8 +26,6 @@ _meccm8
jsr compare ; if T00,S0B,$12 !=
!byte $AA
bcc .addr3
lda #$0B
ldx #$12
ldy #$01
jsr modify ; then set T00,S0B,$12 =
!byte $AA
@ -87,8 +36,6 @@ _meccm8
jsr compare ; if T00,S0B,$1D !=
!byte $96
bcc .data1
lda #$0B
ldx #$1D
ldy #$01
jsr modify ; then set T00,S0B,$1D =
!byte $96
@ -99,8 +46,6 @@ _meccm8
jsr compare ; if T00,S0B,$8F !=
!byte $D5
bcc .data2
lda #$0B
ldx #$8F
ldy #$01
jsr modify ; then set T00,S0B,$8F =
!byte $D5
@ -111,8 +56,6 @@ _meccm8
jsr compare ; if T00,S0B,$99 !=
!byte $AA
bcc .data3
lda #$0B
ldx #$99
ldy #$01
jsr modify ; then set T00,S0B,$99 =
!byte $AA
@ -122,11 +65,9 @@ _meccm8
ldy #$01
jsr compare ; if T00,S0B,$A3 !=
!byte $AD
bcc .exit2
lda #$0B
ldx #$A3
bcc .exit
ldy #$01
jsr modify ; then set T00,S0B,$A3 =
!byte $AD
.exit2
.exit
}

View File

@ -90,7 +90,8 @@ s_eatrk6 = $47
s_eeef = $48
s_poke = $49
s_construct= $4A
STRINGCOUNT = $4B
s_meccm6 = $4B
STRINGCOUNT = $4C
!zone {
StringTable
@ -169,6 +170,7 @@ StringTable
!word .eeef
!word .poke
!word .construct
!word .meccm6
;
; 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-02-19",00
!text "Passport by 4am 2017-02-20",00
.mainmenu
!text "________________________________________",$8D,$8D,$8D,$8D,$8D,$8D,$8D
!text " "
@ -431,4 +433,6 @@ StringTable
!text "check into memory and CALLs it.",$8D,$00
.construct
!text "T01,S0F Reconstructing missing data",$8D,$00
.meccm6
!text "T00 Found MECC M6 bootloader",$8D,00
}