mirror of
https://github.com/a2-4am/passport.git
synced 2025-03-06 09:29:23 +00:00
add support for MECC M6 bootloader e.g. Word Munchers v1.1
This commit is contained in:
parent
df35e12a00
commit
4789751836
@ -150,6 +150,10 @@ IDBootloader
|
||||
jmp foundmeccm7
|
||||
|
||||
.notmeccm7
|
||||
jsr IDMECCM6
|
||||
bcs .notmeccm6
|
||||
jmp foundmeccm6
|
||||
.notmeccm6
|
||||
.notmecc
|
||||
;
|
||||
; Try to identify the encrypted Datasoft bootloader.
|
||||
|
154
src/id/mecc.a
154
src/id/mecc.a
@ -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
|
||||
}
|
||||
|
@ -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
73
src/patchers/meccm6.a
Normal 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
|
||||
}
|
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user