local labels FTW, support FBFF protection

This commit is contained in:
Peter Ferrie 2017-01-23 16:57:43 -08:00
parent 7b11268a30
commit b7924c651e
63 changed files with 1544 additions and 1360 deletions

View File

@ -8,6 +8,7 @@
; out C clear if sequence was found
; C set if sequence was not found
;-------------------------------
!zone {
IsF7
lda $C0E9
lda #$00
@ -19,34 +20,34 @@ IsF7
bpl -
cmp #$F7
beq +
restart iny
.restart iny
bne -
dec nibcount
bne -
beq F7fail
-
+ lda $C0EC
+
- lda $C0EC
bpl -
cmp #$F6
bne restart
bne .restart
- lda $C0EC
bpl -
cmp #$EF
bne restart
bne .restart
- lda $C0EC
bpl -
cmp #$EE
bne restart
bne .restart
- lda $C0EC
bpl -
cmp #$AB
bne restart
bne .restart
clc
!byte $24 ; hides SEC
F7fail sec
lda $C0E8
rts
}
;-------------------------------
; IsSyncBytes
; check if track is mostly $FF bytes
@ -106,6 +107,7 @@ nibloop ldx $C0EC
; out: C clear if protection code was found
; C set if protection code was not found
;-------------------------------
!zone {
xHeredityDog
lda $08FE
clc
@ -114,27 +116,28 @@ xHeredityDog
ldx #$16
ldy #$0B
jsr CompareMemory
!byte $F0,05,$A2,$B2,$4C,$F0,$BB,$BD,$8C,$C0,$A9
!byte $F0,$05,$A2,$B2,$4C,$F0,$BB,$BD,$8C,$C0,$A9
pla
bcc analyze_maybe
jmp no1
bcc .maybe
jmp .no
; don't check byte at $BB21 because it can vary
analyze_maybe
.maybe
ldx #$22
ldy #$3E
jsr CompareMemory
!byte $8D,00,02,$BD,$8C,$C0,$10,$FB,$C9,$EB,$D0,$F7,$BD,$8C
!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
!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 .no
.yes
lda #$80
sta T00S0A
no1
.no
rts
}
;-------------------------------
; xSunburst
@ -146,6 +149,7 @@ no1
; out: C clear if Sunburst RWTS was found
; C set otherwise
;-------------------------------
!zone {
xSunburst
lda $08FE
clc
@ -156,15 +160,16 @@ xSunburst
!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
!byte $11,$D0,$03,$A9,$02,$AC,$A9,$0E
!byte $8D,$C0,$BF,$68,$69,$00,$48,$AD
!byte $78,$04,$90,$2B
bcs .no
.yes
lda #$80
sta T11S0F
no2
.no
rts
}
;-------------------------------
; xOptimumRes
@ -176,26 +181,28 @@ no2
; out: C clear if OptimumRes bootloader was found
; C set otherwise
;-------------------------------
!zone {
xOptimumRes
lda #$08
ldx #$5D
ldy #$0C
jsr CompareMemory
!byte $68,$85,$F0,$68,$85,$F1,$A0,01
!byte $68,$85,$F0,$68,$85,$F1,$A0,$01
!byte $B1,$F0,$85,$54
bcc yes3
bcc .yes
lda #$08
ldx #$5D
ldy #$0C
jsr CompareMemory
!byte $68,$85,$A0,$68,$85,$A1,$A0,01
!byte $68,$85,$A0,$68,$85,$A1,$A0,$01
!byte $B1,$A0,$85,$54
bcs no3
yes3
bcs .no
.yes
lda #$80
sta T01S0F
no3
.no
rts
}
;-------------------------------
; xB4BB
@ -207,6 +214,7 @@ no3
; out: C clear if RWTS was modified in this routine
; C set otherwise
;-------------------------------
!zone {
xB4BB
lda gTrack
pha
@ -218,9 +226,9 @@ b4bbcompare
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
!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
@ -260,6 +268,7 @@ _b4bbexit
pla
sta gTrack
rts
}
;-------------------------------
; xB660
@ -276,18 +285,20 @@ _b4bbexit
; out: C clear if $B660 routine was found
; C set otherwise
;-------------------------------
!zone {
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 $F4,$A9,$F8,$3D,$8C,$C0,$D0,$02
!byte $EA,$EA,$EA,$EA,$BD,$8C,$C0,$2A
!byte $30,02
bcs no4
yes4
!byte $30,$02
bcs .no
.yes
lda #$FE
sta T00S09
no4
.no
rts
}

View File

@ -2,6 +2,7 @@
; initialize some variables that are used by many
; other patchers on track $00
;
!zone {
ApplyGlobals
lda #$00
ldx #$00
@ -12,72 +13,72 @@ ApplyGlobals
; we're going to patch the sector and trace it to capture
; the RWTS.
!byte 01,$A5,$27,$C9,09,$D0,$18,$A5
!byte $2B,$4A,$4A,$4A,$4A,09,$C0,$85
!byte $01,$A5,$27,$C9,$09,$D0,$18,$A5
!byte $2B,$4A,$4A,$4A,$4A,$09,$C0,$85
!byte $3F,$A9,$5C,$85,$3E,$18,$AD,$FE
!byte 08,$6D,$FF,08,$8D,$FE,08,$AE
!byte $FF,08,$30,$15,$BD,$4D,08,$85
!byte $3D,$CE,$FF,08,$AD,$FE,08,$85
!byte $27,$CE,$FE,08,$A6,$2B,$6C,$3E
!byte 00,$EE,$FE,08,$EE,$FE,08,$20
!byte $08,$6D,$FF,$08,$8D,$FE,$08,$AE
!byte $FF,$08,$30,$15,$BD,$4D,$08,$85
!byte $3D,$CE,$FF,$08,$AD,$FE,$08,$85
!byte $27,$CE,$FE,$08,$A6,$2B,$6C,$3E
!byte $00,$EE,$FE,$08,$EE,$FE,$08,$20
!byte $89,$FE,$20,$93,$FE,$20,$2F,$FB
!byte $A6,$2B
ldx #TRUE
bcc boot0
bcc .boot0
ldx #FALSE
boot0
.boot0
stx gIsBoot0
lda #$01
ldx #$00
ldy #$38
jsr compare ; if T00,S01,$00 ==
!byte $8E,$E9,$B7,$8E,$F7,$B7,$A9,01
!byte $8E,$E9,$B7,$8E,$F7,$B7,$A9,$01
!byte $8D,$F8,$B7,$8D,$EA,$B7,$AD,$E0
!byte $B7,$8D,$E1,$B7,$A9,02,$8D,$EC
!byte $B7,$A9,04,$8D,$ED,$B7,$AC,$E7
!byte $B7,$88,$8C,$F1,$B7,$A9,01,$8D
!byte $B7,$8D,$E1,$B7,$A9,$02,$8D,$EC
!byte $B7,$A9,$04,$8D,$ED,$B7,$AC,$E7
!byte $B7,$88,$8C,$F1,$B7,$A9,$01,$8D
!byte $F4,$B7,$8A,$4A,$4A,$4A,$4A,$AA
!byte $A9,00,$9D,$F8,04,$9D,$78,04
!byte $A9,$00,$9D,$F8,$04,$9D,$78,$04
ldx #TRUE
bcc boot1
bcc .boot1
ldx #FALSE
:boot1
.boot1
stx gIsBoot1
lda #$01
ldx #$00
ldy #$38
jsr compare ; if T00,S01,$00 ==
!byte $8E,$E9,$37,$8E,$F7,$37,$A9,01
!byte $8E,$E9,$37,$8E,$F7,$37,$A9,$01
!byte $8D,$F8,$37,$8D,$EA,$37,$AD,$E0
!byte $37,$8D,$E1,$37,$A9,02,$8D,$EC
!byte $37,$A9,04,$8D,$ED,$37,$AC,$E7
!byte $37,$88,$8C,$F1,$37,$A9,01,$8D
!byte $37,$8D,$E1,$37,$A9,$02,$8D,$EC
!byte $37,$A9,$04,$8D,$ED,$37,$AC,$E7
!byte $37,$88,$8C,$F1,$37,$A9,$01,$8D
!byte $F4,$37,$8A,$4A,$4A,$4A,$4A,$AA
!byte $A9,00,$9D,$F8,04,$9D,$78,04
!byte $A9,$00,$9D,$F8,$04,$9D,$78,$04
ldx #TRUE
bcc master
bcc .master
ldx #FALSE
master
.master
stx gIsMaster
lda #$07
ldx #$00
ldy #$40
jsr compare ; if T00,S07,$00 ==
!byte $84,$48,$85,$49,$A0,02,$8C,$F8
!byte 06,$A0,04,$8C,$F8,04,$A0,01
!byte $84,$48,$85,$49,$A0,$02,$8C,$F8
!byte $06,$A0,$04,$8C,$F8,$04,$A0,$01
!byte $B1,$48,$AA,$A0,$0F,$D1,$48,$F0
!byte $1B,$8A,$48,$B1,$48,$AA,$68,$48
!byte $91,$48,$BD,$8E,$C0,$A0,08,$BD
!byte $91,$48,$BD,$8E,$C0,$A0,$08,$BD
!byte $8C,$C0,$DD,$8C,$C0,$D0,$F6,$88
!byte $D0,$F8,$68,$AA,$BD,$8E,$C0,$BD
!byte $8C,$C0,$A0,08,$BD,$8C,$C0,$48
!byte $8C,$C0,$A0,$08,$BD,$8C,$C0,$48
ldx #TRUE
bcc rwts
bcc .rwts
ldx #FALSE
rwts
.rwts
stx gIsRWTS
lda #$00
@ -94,9 +95,9 @@ rwts
!byte 01,$38,$B0,$03,$4C
ldx #TRUE
bcc prodos
bcc .prodos
ldx #FALSE
prodos
.prodos
stx gIsProDOS
lda #$00
@ -108,9 +109,9 @@ prodos
; The wildcard in 7th position catches alternate jump
; addresses (e.g. Wizardry I, Sundog Frozen Legacy)
!byte 01,$E0,$60,$F0,03,$4C,$97,$08
!byte $01,$E0,$60,$F0,$03,$4C,$97,$08
ldx #TRUE
bcc pascal
bcc .pascal
lda #$00
ldx #$00
ldy #$08
@ -118,11 +119,12 @@ prodos
; Pascal 1.3 signature [thanks Marco V.]
!byte 01,$E0,$07,$B0,04,$E0,$40,$B0
!byte $01,$E0,$07,$B0,$04,$E0,$40,$B0
ldx #TRUE
bcc pascal
bcc .pascal
ldx #FALSE
pascal
.pascal
stx gIsPascal
rts
}

View File

@ -161,6 +161,7 @@ all_done_set
; $cmp2 zero page clobbered
; stack set to first instruction after string
;-------------------------------
!zone {
compare
clc
adc #BASEPAGE
@ -182,17 +183,17 @@ CompareMemory
pha
lda tmp
pha
xcmp
.cmp
lda (cmp2),y
dey
bmi success
bmi .success
cmp (cmp1),y
beq xcmp
beq .cmp
cmp #WILDCARD
beq xcmp
beq .cmp
sec
!byte $24 ; hide CLC
success clc
.success clc
php
lda cmp1+1
sec
@ -200,3 +201,4 @@ success clc
ldx cmp1
plp
rts
}

View File

@ -13,20 +13,20 @@ IDDatasoft
ldx #$00
ldy #$7E
jsr compare
!byte 01,$4C,$7E,08,04,$8A,$0C,$B8
!byte 00,$56,$10,$7A,00,00,$1A,$16
!byte $12,$0E,$0A,06,$53,$18,$9A,02
!byte $10,$1B,02,$10,$4D,$56,$15,$0B
!byte $01,$4C,$7E,$08,$04,$8A,$0C,$B8
!byte $00,$56,$10,$7A,$00,$00,$1A,$16
!byte $12,$0E,$0A,$06,$53,$18,$9A,$02
!byte $10,$1B,$02,$10,$4D,$56,$15,$0B
!byte $BF,$14,$14,$54,$54,$54,$92,$81
!byte $1B,$10,$10,$41,06,$73,$0A,$10
!byte $33,$4E,00,$73,$12,$10,$33,$7C
!byte 00,$11,$20,$E3,$49,$50,$73,$1A
!byte $10,$41,00,$23,$80,$5B,$0A,$10
!byte $1B,$10,$10,$41,$06,$73,$0A,$10
!byte $33,$4E,$00,$73,$12,$10,$33,$7C
!byte $00,$11,$20,$E3,$49,$50,$73,$1A
!byte $10,$41,$00,$23,$80,$5B,$0A,$10
!byte $0B,$4E,$9D,$0A,$10,$9D,$0C,$10
!byte $60,$1E,$53,$10,$90,$53,$BC,$90
!byte $53,00,$90,$D8,$52,00,$D8,$7C
!byte 00,$53,$80,$0B,06,$41,00,09
!byte 04,$45,$0C,$63,04,$90,$94,$D0
!byte $D4,$23,04,$91,$A1,$EB,$CD,06
!byte $53,$00,$90,$D8,$52,$00,$D8,$7C
!byte $00,$53,$80,$0B,$06,$41,$00,$09
!byte $04,$45,$0C,$63,$04,$90,$94,$D0
!byte $D4,$23,$04,$91,$A1,$EB,$CD,$06
!byte $95,$A1,$E1,$98,$97,$86
rts

View File

@ -10,82 +10,84 @@
; all registers clobbered
; all other flags clobbered
;-------------------------------
!zone {
IDDOS33
lda $08FE ; $08FE must be either $36 or $B6
cmp #$36 ; (prevents matching on some
beq match0 ; Infocom disks that would
beq .match0 ; Infocom disks that would
cmp #$B6 ; otherwise match but then load
beq match0 ; boot1 over program space and crash)
jmp notd33boot0
beq .match0 ; boot1 over program space and crash)
jmp .notd33boot0
match0
.match0
lda #$00 ; match first $1C bytes of T00S00
ldx #$00 ; against standard DOS 3.3 boot0
ldy #$1C
jsr compare
!byte 01,$A5,$27,$C9,09,$D0,$18,$A5
!byte $2B,$4A,$4A,$4A,$4A,09,$C0,$85
!byte $01,$A5,$27,$C9,$09,$D0,$18,$A5
!byte $2B,$4A,$4A,$4A,$4A,$09,$C0,$85
!byte $3F,$A9,$5C,$85,$3E,$18,$AD,$FE
!byte 08,$6D,$FF,08
bcc maybe_d33_1
jmp notd33boot0
!byte $08,$6D,$FF,$08
bcc .maybe_d33_1
jmp .notd33boot0
maybe_d33_1
.maybe_d33_1
lda #$00 ; match more bytes of T00S00
ldx #$1F ; against standard DOS 3.3 boot0
ldy #$2B
jsr compare
!byte $AE
!byte $FF,08,$30,$15,$BD,$4D,08,$85
!byte $3D,$CE,$FF,08,$AD,$FE,08,$85
!byte $27,$CE,$FE,08,$A6,$2B,$6C,$3E
!byte 00,$EE,$FE,08,$EE,$FE,08,$20
!byte $FF,$08,$30,$15,$BD,$4D,$08,$85
!byte $3D,$CE,$FF,$08,$AD,$FE,$08,$85
!byte $27,$CE,$FE,$08,$A6,$2B,$6C,$3E
!byte $00,$EE,$FE,$08,$EE,$FE,$08,$20
!byte $89,$FE,$20,$93,$FE,$20,$2F,$FB
!byte $A6,$2B
bcc maybe_d33_2
jmp notd33boot0
bcc .maybe_d33_2
jmp .notd33boot0
maybe_d33_2
.maybe_d33_2
lda #$00 ; check sector order map
ldx #$4D
ldy #$10
jsr compare
!byte 00,$0D,$0B,09,07,05,03,01
!byte $0E,$0C,$0A,08,06,04,02,$0F
bcc maybe_d33_3
jmp notd33boot0
!byte $00,$0D,$0B,$09,$07,$05,$03,$01
!byte $0E,$0C,$0A,$08,$06,$04,$02,$0F
bcc .maybe_d33_3
jmp .notd33boot0
maybe_d33_3
.maybe_d33_3
lda #$00 ; match 3 final bytes of T00S00
ldx #$1C ; against standard DOS 3.3 boot0
ldy #$03
jsr compare
!byte $8D,$FE,08
bcs maybe_d33_4
jmp founddos33
!byte $8D,$FE,$08
bcs .maybe_d33_4
jmp .founddos33
maybe_d33_4
.maybe_d33_4
lda #$00 ; minor variation (e.g. Terrapin
ldx #$1C ; Logo 3.0) jumps to $08F0 and
ldy #$03 ; back, but still safe to trace
jsr compare
!byte $4C,$F0,08
bcc maybe_d33_5
jmp notd33boot0
!byte $4C,$F0,$08
bcc .maybe_d33_5
jmp .notd33boot0
maybe_d33_5
.maybe_d33_5
lda #$00
ldx #$F0
ldy #$09
jsr compare
!byte $8D,$FE,08,$EE,$F3,03,$4C,$1F
!byte 08
bcs notd33boot0
!byte $8D,$FE,$08,$EE,$F3,$03,$4C,$1F
!byte $08
bcs .notd33boot0
founddos33
.founddos33
clc
!byte $24 ; hide next SEC
notd33boot0
.notd33boot0
sec
rts
}

View File

@ -10,10 +10,12 @@
; all registers clobbered
; all other flags clobbered
;-------------------------------
!zone {
IDEncoded44
ldy #$07
jsr SearchTrack
!byte $BD,$8C,$C0,$10,$FB,$38,$2A
bcs encoded44_exit
encoded44_exit
bcs .exit
.exit
rts
}

View File

@ -10,11 +10,13 @@
; all registers clobbered
; all other flags clobbered
;-------------------------------
!zone {
IDEncoded53
ldy #$10
jsr SearchTrack
!byte $BD,$8C,$C0,$10,$FB,$C9,$B5,$F0
!byte 09,$28,$90,$DF,$49,$AD,$F0,$1F
bcs encoded53_exit
encoded53_exit
!byte $09,$28,$90,$DF,$49,$AD,$F0,$1F
bcs .exit
.exit
rts
}

View File

@ -3,6 +3,7 @@
; main entry point to identify the bootloader
; based on T00,S00 (currently in memory at $0800)
;-------------------------------
!zone {
CheckT00S00
lda #FALSE
sta gIsBoot0
@ -43,86 +44,86 @@ CheckT00S00
; we can maybe trace to capture the RWTS in memory.
;
jsr IDDOS33
bcs notdos33
bcs .notdos33
lda #s_dosb0
jsr PrintByID
jmp TraceDOS33
notdos33
.notdos33
;
; Try to identify a variant bootloader that calls to $08B3
; early to munge the nibble tables used by the drive firmware.
;
jsr ID8b3
bcs not8b3
bcs .not8b3
jmp found8b3
not8b3
.not8b3
;
; Try to identify all the different MECC fastloader variants.
;
jsr IDMECC
bcs notmecc
bcs .notmecc
jsr IDMECCM8
bcs notmeccm8
bcs .notmeccm8
jmp foundmeccm8
notmeccm8
.notmeccm8
jsr IDMECCM7
bcs notmeccm7
bcs .notmeccm7
jmp foundmeccm7
notmeccm7
notmecc
.notmeccm7
.notmecc
;
; Try to identify the encrypted Datasoft bootloader.
;
jsr IDDatasoft
bcs notdatasoft
bcs .notdatasoft
lda #s_datasoftb0
jsr PrintByID
lda #TRUE
sta gIsDatasoft
jmp useuniv
jmp .useuniv
:notdatasoft
.notdatasoft
;
; Try to identify ProDOS bootloader.
;
lda gIsProDOS
bne notprodos
bne .notprodos
lda #s_prodosb0
jsr PrintByID
jmp useuniv
jmp .useuniv
notprodos
.notprodos
;
; Try to identify Apple Pascal bootloader (all variants).
;
lda gIsPascal
bne notpascal
bne .notpascal
lda #s_pascalb0
jsr PrintByID
notpascal
.notpascal
jsr IDSpecDel
bcs notspecdel
bcs .notspecdel
lda #s_specdel
jsr PrintByID
jmp TraceSpecDel
notspecdel
.notspecdel
;
; Try to detect whether there is code in the boot sector
; that loads 4-and-4-encoded data. This is an early escape
; hatch for disks that are guaranteed to fail later anyway.
;
jsr IDEncoded44
bcs notencoded44
bcs .notencoded44
lda #s_encoded44
jsr PrintByID
jmp TheEnd
notencoded44
.notencoded44
;
; Try to detect whether there is code in the boot sector
; that loads 5-and-3-encoded data (like DOS 3.2 disks with
@ -132,15 +133,16 @@ notencoded44
; guaranteed to fail later anyway.
;
jsr IDEncoded53
bcs notencoded53
bcs .notencoded53
lda #s_encoded53
jsr PrintByID
jmp TheEnd
notencoded53
useuniv
.notencoded53
.useuniv
;
; We didn't recognize the boot sector, so use the universal
; (built-in) RWTS and hope for the best
;
jmp UseUniversal
}

View File

@ -10,38 +10,39 @@
; all other flags clobbered
; all registers clobbered
;-------------------------------
!zone {
ID8b3
lda #$00
ldx #$00
ldy #$5A
jsr compare
!byte 01,$20,$B3,08,$D0,$19,$EA,$A5
!byte $2B,$4A,$4A,$4A,$4A,09,$C0,$85
!byte $01,$20,$B3,$08,$D0,$19,$EA,$A5
!byte $2B,$4A,$4A,$4A,$4A,$09,$C0,$85
!byte $3F,$A9,$5C,$85,$3E,$18,$AD,$FE
!byte 08,$6D,$FF,08,$8D,$FE,08,$AE
!byte $FF,08,$F0,$15,$8A,$EA,$EA,$85
!byte $3D,$CE,$FF,08,$AD,$FE,08,$85
!byte $27,$CE,$FE,08,$A6,$2B,$6C,$3E
!byte 00,$EE,$FE,08,$EE,$FE,08,$20
!byte $08,$6D,$FF,$08,$8D,$FE,$08,$AE
!byte $FF,$08,$F0,$15,$8A,$EA,$EA,$85
!byte $3D,$CE,$FF,$08,$AD,$FE,$08,$85
!byte $27,$CE,$FE,$08,$A6,$2B,$6C,$3E
!byte $00,$EE,$FE,$08,$EE,$FE,$08,$20
!byte $89,$FE,$20,$93,$FE,$20,$2F,$FB
!byte $A2,$FF,$BD,00,08,$9D,00,$B6
!byte $CA,$E0,$FF,$D0,$F5,$20,$CC,08
!byte $A2,$FF,$BD,$00,$08,$9D,$00,$B6
!byte $CA,$E0,$FF,$D0,$F5,$20,$CC,$08
!byte $A6,$2B
bcc jsr8b3_maybe
bcc .maybe
rts
jsr8b3_maybe
.maybe
lda #$00
ldx #$B3
ldy #$36
jsr compare
!byte $A9,$3F,$8D,$6C,03
!byte $A9,$1C,$8D,$CC,03,$A9,00,$8D
!byte $D5,03,$A9,$37,$8D,$A3,03,$A5
!byte $27,$C9,09,$60,$A9,00,$85,00
!byte $A9,$B5,$85,01,$A0,$FF,$C8,$B9
!byte 00,$F0,$91,00,$C0,$FF,$D0,$F6
!byte $C6,01,$A9,08,$C5,01,$D0,$EC
!byte $A9,$3F,$8D,$6C,$03
!byte $A9,$1C,$8D,$CC,$03,$A9,$00,$8D
!byte $D5,$03,$A9,$37,$8D,$A3,$03,$A5
!byte $27,$C9,$09,$60,$A9,$00,$85,$00
!byte $A9,$B5,$85,$01,$A0,$FF,$C8,$B9
!byte $00,$F0,$91,$00,$C0,$FF,$D0,$F6
!byte $C6,$01,$A9,$08,$C5,$01,$D0,$EC
!byte $60
rts
@ -75,3 +76,4 @@ B8b3 sta T02,y
pla
plp
jmp $0801
}

View File

@ -16,9 +16,9 @@ IDMECC
ldx #$00
ldy #$17
jsr compare
!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
!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
rts
;-------------------------------
@ -31,6 +31,7 @@ IDMECC
; all other flags clobbered
; all registers clobbered
;-------------------------------
!zone {
IDMECCM8
lda #$00
sta gTrack
@ -42,7 +43,7 @@ IDMECCM8
sta gAddress+1
jsr ReadSector
bcc +
mecc_no1
.no
rts
+
lda #$0B
@ -50,34 +51,34 @@ mecc_no1
ldy #$06
jsr compare ; IF T00,S0B,$02 ==
!byte $BD,$8C,$C0,$10,$FB,$C9
bcs mecc_no1
bcs .no
lda #$0B
ldx #$09
ldy #$09
jsr compare ; AND T00,S0B,$09 ==
!byte $D0,$EF,$EA,$BD,$8C,$C0,$10,$FB
!byte $C9
bcs mecc_no1
bcs .no
lda #$0B
ldx #$13
ldy #$0A
jsr compare ; AND T00,S0B,$13 ==
!byte $D0,$E5,$A0,03,$BD,$8C,$C0,$10
!byte $D0,$E5,$A0,$03,$BD,$8C,$C0,$10
!byte $FB,$C9
bcs mecc_no1
bcs .no
lda #$0B
ldx #$89
ldy #$06
jsr compare ; AND T00,S0B,$89 ==
!byte $BD,$8C,$C0,$10,$FB,$C9
bcs mecc_no1
bcs .no
lda #$0B
ldx #$90
ldy #$09
jsr compare ; AND T00,S0B,$90 ==
!byte $D0,$F4,$EA,$BD,$8C,$C0,$10,$FB
!byte $C9
bcs mecc_no1
bcs .no
lda #$0B
ldx #$9A
ldy #$09
@ -125,6 +126,7 @@ foundmeccm8
pla
plp
jmp ADStyle
}
;-------------------------------
; IDMECCM7
@ -136,6 +138,7 @@ foundmeccm8
; all other flags clobbered
; all registers clobbered
;-------------------------------
!zone {
IDMECCM7
lda #$00
sta gTrack
@ -147,7 +150,7 @@ IDMECCM7
sta gAddress+1
jsr ReadSector
bcc +
mecc_no2
.no
rts
+
lda #$07
@ -155,31 +158,31 @@ mecc_no2
ldy #$06
jsr compare ; IF T00,S07,$7D ==
!byte $BD,$8C,$C0,$10,$FB,$C9
bcs mecc_no2
bcs .no
lda #$07
ldx #$84
ldy #$09
jsr compare ; AND T00,S07,$84 ==
!byte $D0,$F0,$EA,$BD,$8C,$C0,$10,$FB,$C9
bcs mecc_no2
bcs .no
lda #$07
ldx #$8E
ldy #$0A
jsr compare ; and T00,S07,$8E ==
!byte $D0,$F2,$A0,03,$BD,$8C,$C0,$10,$FB,$C9
bcs mecc_no2
!byte $D0,$F2,$A0,$03,$BD,$8C,$C0,$10,$FB,$C9
bcs .no
lda #$07
ldx #$0F
ldy #$06
jsr compare ; and T00,S07,$0F ==
!byte $BD,$8C,$C0,$10,$FB,$49
bcs mecc_no2
bcs .no
lda #$07
ldx #$18
ldy #$07
jsr compare ; and T00,S07,$18 ==
!byte $EA,$BD,$8C,$C0,$10,$FB,$C9
bcs mecc_no2
bcs .no
lda #$07
ldx #$20
ldy #$0A
@ -228,3 +231,4 @@ foundmeccm7
pla
plp
jmp ADStyle
}

View File

@ -6,19 +6,20 @@
; C set if "Protected DOS" was not found
; gProtectedDOS is set to TRUE or FALSE
;-------------------------------
!zone {
ProtectedDOS
lda #$B7
ldx #$00
ldy #$1A
jsr CompareMemory
!byte $A0,$1A,$B9,00,$B7,$49,$97,$99
!byte 00,$B7,$C8,$D0,$F5,$EE,04,$B7
!byte $EE,09,$B7,$AD,09,$B7,$C9,$C0
!byte $A0,$1A,$B9,$00,$B7,$49,$97,$99
!byte $00,$B7,$C8,$D0,$F5,$EE,$04,$B7
!byte $EE,$09,$B7,$AD,$09,$B7,$C9,$C0
!byte $D0,$E8
bcs protecteddos_exit
bcs .exit
lda $B706 ; decryption key
sta key+1
sta .key+1
sta gDisplayBytes
lda #s_protdos
jsr PrintByID
@ -27,19 +28,19 @@ ProtectedDOS
; decrypt RWTS in memory
;
lda #$B7
sta decrypt+2
sta store+2
sta .decrypt+2
sta .store+2
ldy #$1A
decrypt lda $B700,y
key eor #$FF ; set at runtime
store sta $B700,y
.decrypt lda $B700,y
.key eor #$FF ; set at runtime
.store sta $B700,y
iny
bne decrypt
inc decrypt+2
inc store+2
lda store+2
bne .decrypt
inc .decrypt+2
inc .store+2
lda .store+2
cmp #$C0
bne decrypt
bne .decrypt
;
; this RWTS swaps the A/Y hi/lo parameter table address
@ -50,5 +51,6 @@ store sta $B700,y
lda #TRUE
sta gIsProtDOS
clc
protecteddos_exit
.exit
rts
}

View File

@ -12,15 +12,15 @@ IDSpecDel
ldx #$00
ldy #$58
jsr compare
!byte 02,$90,$4A,$C6,$27,$BD,$31,09
!byte $02,$90,$4A,$C6,$27,$BD,$31,$09
!byte $49,$B0,$48,$C6,$3D,$98,$C8,$48
!byte $CE,00,08,$A9,$20,$C6,$27,$48
!byte $CE,$00,$08,$A9,$20,$C6,$27,$48
!byte $51,$26,$91,$26,$AA,$A5,$27,$85
!byte $32,$CE,00,08,$A8,$B5,$33,$84
!byte $32,$CE,$00,$08,$A8,$B5,$33,$84
!byte $29,$84,$21,$8A,$A2,$17,$86,$31
!byte $D5,$33,$A6,$2B,$5D,$31,09,$85
!byte $29,$5D,$32,09,$C6,$3D,$85,$28
!byte $5D,$33,09,$85,$48,$A0,$2B,$84
!byte $D5,$33,$A6,$2B,$5D,$31,$09,$85
!byte $29,$5D,$32,$09,$C6,$3D,$85,$28
!byte $5D,$33,$09,$85,$48,$A0,$2B,$84
!byte $20,$C6,$40,$30,$3E,$24,$40,$30
!byte $33,$24,$24,$24,$24,$40,$40,$40
rts
@ -225,18 +225,18 @@ skipsectors
; rev. a5b839d7d0fa21b0ff3a7776d9f6c9750b09ae10 of 2016-11-29
;
SDboot0
!byte 01,$a8,$ee,06,08,$ad,$4e,08
!byte $01,$a8,$ee,$06,$08,$ad,$4e,$08
!byte $c9,$c0,$f0,$40,$85,$27,$c8,$c0
!byte $10,$90,09,$f0,05,$20,$2f,08
!byte $a8,$2c,$a0,01,$84,$3d,$c8,$a5
!byte $10,$90,$09,$f0,$05,$20,$2f,$08
!byte $a8,$2c,$a0,$01,$84,$3d,$c8,$a5
!byte $27,$f0,$df,$8a,$4a,$4a,$4a,$4a
!byte 09,$c0,$48,$a9,$5b,$48,$60,$e6
!byte $41,06,$40,$20,$37,08,$18,$20
!byte $3c,08,$e6,$40,$a5,$40,$29,03
!byte $2a,05,$2b,$a8,$b9,$80,$c0,$a9
!byte $09,$c0,$48,$a9,$5b,$48,$60,$e6
!byte $41,$06,$40,$20,$37,$08,$18,$20
!byte $3c,$08,$e6,$40,$a5,$40,$29,$03
!byte $2a,$05,$2b,$a8,$b9,$80,$c0,$a9
!byte $30,$4c,$a8,$fc,$4c,$b3,$10
!byte $1E,$1D,$1C,$1B,00,00,00,00
!byte 00,00,$13,$12,$11,$10,$1F,$20
!byte $1E,$1D,$1C,$1B,$00,$00,$00,$00
!byte $00,$00,$13,$12,$11,$10,$1F,$20
!byte $2E,$2D,$2C,$2B,$2A,$29,$28,$27
!byte $26,$25,$24,$23,$22,$21,$2F,$30
!byte $3E,$3D,$3C,$3B,$3A,$39,$38,$37

View File

@ -3,6 +3,7 @@
; set up 1st-level boot trace on
; a DOS 3.3-shaped bootloader
;-------------------------------
!zone {
TraceDOS33
;
; Before we trace through the drive firmware (which --
@ -52,8 +53,8 @@ TraceDOS33c
clc
adc #$02
_Inspect1a
sta x1+1
sta x2+1
sta .x1+1
sta .x2+1
sta b4bbmodify+2
sta b4bbmodify2+2
clc
@ -61,36 +62,36 @@ _Inspect1a
sta b4bbcompare+1
sec
sbc #$02
sta x3+1
sta x4+1
sta .x3+1
sta .x4+1
sta callrwts+2
jsr ProtectedDOS ; check for a specific (encrypted)
; bootloader called "Protected DOS"
bcs notprotdos
bcs .notprotdos
jmp ADStyle
notprotdos
.notprotdos
lda callrwts+2
ldx #$00 ; check for "STY $48;STA $49"
ldy #$04 ; at RWTS entry point
jsr CompareMemory ; (e.g. $BD00 or $3D00)
!byte $84,$48,$85,$49
bcc x1
bcc .x1
jmp UseUniversal
x1 lda #$FF ; check for "SEC;RTS" at $B942
.x1 lda #$FF ; check for "SEC;RTS" at $B942
ldx #$42
ldy #$02
jsr CompareMemory
!byte $38,$60
bcc x2
bcc .x2
jmp UseUniversal
x2 lda #$FF ; check for "LDA $C08C,X" at $B94F
.x2 lda #$FF ; check for "LDA $C08C,X" at $B94F
ldx #$4F
ldy #$03
jsr CompareMemory
!byte $BD,$8C,$C0
bcc x3
bcc .x3
jmp UseUniversal
x3 lda #$FF ; check for "JSR $xx00" at $BDB9
.x3 lda #$FF ; check for "JSR $xx00" at $BDB9
ldx #$B9
ldy #$02
jsr CompareMemory
@ -100,7 +101,7 @@ x3 lda #$FF ; check for "JSR $xx00" at $BDB9
; Check for RWTS variant that has extra code before
; JSR $B800 e.g. Verb Viper (DLM), Advanced Analogies (Hartley)
;
x4 lda #$FF ; check for "JSR $xx00" at $BDC5
.x4 lda #$FF ; check for "JSR $xx00" at $BDC5
ldx #$C5
ldy #$02
jsr CompareMemory
@ -137,20 +138,21 @@ Trace
pla
ldy $B6F8
cpy #$4C
bne maybe_gs
bne .maybe_gs
sty $B6F8 ; JMP
sta $B6F9 ; lo byte of callback
stx $B6FA ; hi byte of callback
jmp $B600
maybe_gs
.maybe_gs
ldy $B6FB
cpy #$4C
bne unknowndrive
bne .unknowndrive
sty $B6FB ; JMP
sta $B6FC ; lo byte of callback
stx $B6FD ; hi byte of callback
jmp $B600
unknowndrive
.unknowndrive
lda #s_canttrace
jsr PrintByID
jmp UseUniversal
}

View File

@ -1,20 +1,22 @@
KEY = $C000
STROBE = $C010
!zone {
WaitForKey
bit STROBE
k lda KEY
bpl k
.k lda KEY
bpl .k
bit STROBE
cmp #"*"
bne noast
bne .noast
jsr TEXT
lda #s_reset
jsr PrintByID
jmp $FF59
noast
.noast
cmp #$E1
bcc +
and #$DF ; force uppercase
+
rts
}

View File

@ -5,19 +5,21 @@
; Y = number of pages to copy
; out: all flags and registers clobbered
;-------------------------------
!zone {
CopyMemory
sta source1+2
stx dest1+2
sta .source+2
stx .dest+2
ldx #$00
source1 lda $FF00,x
dest1 sta $FF00,x
.source lda $FF00,x
.dest sta $FF00,x
inx
bne source1
inc source1+2
inc dest1+2
bne .source
inc .source+2
inc .dest+2
dey
bne source1
bne .source
rts
}
;-------------------------------
; ClearMemory
@ -26,17 +28,19 @@ dest1 sta $FF00,x
; Y = number of pages
; out: all flags and registers clobbered
;-------------------------------
!zone {
ClearMemory
sta dest2+2
sta .dest+2
txa
ldx #$00
dest2 sta $FF00,x
.dest sta $FF00,x
inx
bne dest2
inc dest2+2
bne .dest
inc .dest+2
dey
bne dest2
bne .dest
rts
}
;-------------------------------
; ClearTSBuffer
@ -58,27 +62,29 @@ ClearTSBuffer
; Y = number of pages to copy
; out: all flags and registers clobbered
;-------------------------------
!zone {
SwapMemory
sta source11+2
sta source22+2
stx dest11+2
stx dest22+2
sta .source1+2
sta .source2+2
stx .dest1+2
stx .dest2+2
ldx #$00
source11 lda $FF00,x
.source1 lda $FF00,x
pha
dest11 lda $FF00,x
source22 sta $FF00,x
.dest1 lda $FF00,x
.source2 sta $FF00,x
pla
dest22 sta $FF00,x
.dest2 sta $FF00,x
inx
bne source11
inc source11+2
inc source22+2
inc dest11+2
inc dest22+2
bne .source1
inc .source1+2
inc .source2+2
inc .dest1+2
inc .dest2+2
dey
bne source11
bne .source1
rts
}
;-------------------------------
; SaveProDOS
@ -87,6 +93,7 @@ dest22 sta $FF00,x
; in: none
; out: all flags and registers clobbered
;-------------------------------
!zone {
SaveProDOS
lda #$00
ldx #$40
@ -100,8 +107,9 @@ SaveProDOS
ldx #$42
ldy #$01
jsr CopyMemory
memory_exit
.exit
rts
}
;-------------------------------
; SwapProDOS

View File

@ -38,6 +38,7 @@ ERR_EOF = $4C
; all other flags clobbered
; all registers clobbered
;-------------------------------
!zone {
WriteTrackMLI
jsr SwapProDOS
jsr ReorderBuffer
@ -68,7 +69,7 @@ WriteTrackMLI
lda #$00
sta mliparam+2 ; lo byte of data buffer
lda #$08
sta blockcount
sta .blockcount
lda gTrack
asl
asl
@ -79,20 +80,20 @@ WriteTrackMLI
sta mliparam+5 ; hi byte of block number
lda #BASEPAGE ; hi byte of data buffer
sta mliparam+3
writeloop
.writeloop
lda mlicmd
ldy #$03 ; parameter count
jsr mli
bcs mli_writeerr
bcs .writeerr
inc mliparam+3 ; 2 pages per block
inc mliparam+3
inc mliparam+4
dec blockcount
bne writeloop
dec .blockcount
bne .writeloop
clc
bcc writedone
mli_writeerr
writedone
bcc .writedone
.writeerr
.writedone
php
pha
jsr ReorderBuffer
@ -101,8 +102,8 @@ writedone
plp
rts
blockcount !byte $FF
.blockcount !byte $FF
}
;-------------------------------
; ReorderBuffer - convert data
; buffer between ProDOS and
@ -114,6 +115,7 @@ blockcount !byte $FF
; all registers clobbered
; @cmp1, @cmp2 clobbered
;-------------------------------
!zone {
ReorderBuffer
lda #$00
sta cmp1
@ -128,19 +130,20 @@ ReorderBuffer
adc #BASEPAGE
sta cmp2+1
ldx #$07
L lda (cmp1),y
.L lda (cmp1),y
pha
lda (cmp2),y
sta (cmp1),y
pla
sta (cmp2),y
iny
bne L
bne .L
inc cmp1+1
dec cmp2+1
dex
bne L
bne .L
rts
}
;-------------------------------
; SaveFile1Shot
@ -161,6 +164,7 @@ L lda (cmp1),y
; all registers clobbered
; stack set to next instruction after parameters
;-------------------------------
!zone {
SaveFile1Shot
pla
sta $00
@ -170,9 +174,9 @@ SaveFile1Shot
lda #$0B
clc
adc $00
bcc mli_noinc1
bcc .noinc
inx
mli_noinc1
.noinc
tay
txa
pha
@ -196,7 +200,7 @@ mli_noinc1
lda ($00),y ; hi byte of aux file type
sta mliparam+6
jsr CreateFile
bcs savefile1s
bcs .savefile1s
ldy #$0A
lda ($00),y ; lo byte of ProDOS file buffer
@ -205,7 +209,7 @@ mli_noinc1
lda ($00),y ; hi byte of ProDOS file buffer
sta mliparam+4
jsr OpenFile
bcs savefile1s
bcs .savefile1s
pha ; push file reference number
ldy #$06
@ -230,8 +234,9 @@ mli_noinc1
; (so caller gets codes from write attempt,
; not close)
savefile1s
.savefile1s
rts
}
;-------------------------------
; LoadFile1Shot
@ -251,6 +256,7 @@ savefile1s
; all registers clobbered
; stack set to next instruction after parameters
;-------------------------------
!zone {
LoadFile1Shot
pla
sta $00
@ -260,9 +266,9 @@ LoadFile1Shot
lda #$08
clc
adc $00
bcc mli_noinc2
bcc .noinc
inx
mli_noinc2
.noinc
tay
txa
pha
@ -283,7 +289,7 @@ mli_noinc2
sta mliparam+4
jsr OpenFile
bcs loadfile1s ; C set on error
bcs .loadfile1s ; C set on error
pha ; push file reference number
ldy #$03
@ -307,8 +313,9 @@ mli_noinc2
plp ; restore flags from readfile
; (so caller gets codes from read attempt,
; not close)
loadfile1s
.loadfile1s
rts
}
;-------------------------------
; open file via ProDOS MLI
@ -321,16 +328,18 @@ loadfile1s
; if C clear, open succeeded and A contains
; file reference number
;-------------------------------
!zone {
OpenFile
lda #CMD_OPEN ; MLI command
ldy #PC_OPEN ; number of parameters for 'open' command
jsr mli
bcs openfile
bcs .openfile
lda refnum ; caller should save file reference number
; as this memory location may be
; overwritten by later MLI calls
openfile
.openfile
rts
}
;-------------------------------
; set line-by-line mode via ProDOS MLI
@ -343,6 +352,7 @@ openfile
lbl_mask = $7F
lbl_cr = $0D
!zone {
SetLineByLine
sta mliparam+1 ; store file reference number
lda #lbl_mask ; accept high bit set or clear
@ -352,10 +362,11 @@ SetLineByLine
lda #CMD_NEWLINE ; MLI 'newline' command to set read mode
ldy #PC_NEWLINE ; number of parameters for 'newline' command
jsr mli
bcs setlinebylin
bcs .setlinebylin
lda mliparam+1 ; if no error, return file reference number
setlinebylin
.setlinebylin
rts
}
;-------------------------------
; read an open file via ProDOS MLI
@ -367,15 +378,17 @@ setlinebylin
; if C clear, read succeeded and A contains the same
; file reference number that was passed in
;-------------------------------
!zone {
ReadFile
sta mliparam+1 ; store file reference number
lda #CMD_READ ; MLI read command
ldy #PC_READ ; number of parameters for 'read' command
jsr mli
bcs readfile
bcs .readfile
lda mliparam+1 ; if no error, return file reference number
readfile
.readfile
rts
}
;-------------------------------
; change file position in an open file via ProDOS MLI
@ -387,14 +400,16 @@ readfile
; if C clear, set_mark call succeeded and A contains
; the same file reference number that was passed in
;-------------------------------
!zone {
SetMark
sta mliparam+1 ; store file reference number
lda #CMD_SETMARK ; MLI set_mark command
ldy #PC_SETMARK ; number of params for 'set_mark' cmd
jsr mli
bcs mli_exit
bcs .exit
lda mliparam+1 ; if no error, return file refnum
mli_exit rts
.exit rts
}
;-------------------------------
; write to an open file via ProDOS MLI
@ -406,15 +421,17 @@ mli_exit rts
; if C clear, write succeeded and A contains the same
; file reference number that was passed in
;-------------------------------
!zone {
WriteFile
sta mliparam+1 ; store file reference number
lda #CMD_WRITE ; MLI write command
ldy #PC_WRITE ; number of parameters for 'write' command
jsr mli
bcs writefile
bcs .writefile
lda mliparam+1 ; if no error, return file reference number
writefile
.writefile
rts
}
;-------------------------------
; close an open file

View File

@ -13,6 +13,7 @@
; all registers clobbered
; all flags clobbered
;-------------------------------
!zone {
modify
sta gDisplayBytes
clc
@ -28,9 +29,9 @@ modify
tya
clc
adc modsrc
bcc noinc
bcc .noinc
inx
noinc
.noinc
sta tmp
txa
pha
@ -38,36 +39,37 @@ noinc
pha
sty modtmp
bit gMode
bpl exitnomod ; verify mode -> no modify
bvc exitnomod ; demuffin mode -> no modify
bpl .exitnomod ; verify mode -> no modify
bvc .exitnomod ; demuffin mode -> no modify
lda #s_modify
jsr PrintByID
ldy #0
dest
.dest
lda (moddest),y
jsr PrintByte
iny
cpy modtmp
bne dest
bne .dest
lda #s_modifyto
jsr PrintByID
ldy #0
src
.src
iny
lda (modsrc),y
jsr PrintByte
cpy modtmp
bne src
bne .src
lda #$8D
jsr PrintA
mod
.mod
lda (modsrc),y
dey
bmi modify_exit
bmi .exit
sta (moddest),y
clv
bvc mod ; unconditional branch
modify_exit
bvc .mod ; unconditional branch
.exit
inc gPatchCount
exitnomod
.exitnomod
rts
}

View File

@ -113,7 +113,7 @@ FM lda $2000,x
jmp OneTimeSetup
!pseudopc *+$4800 {
!zone
; use localized strings based on current language
!if LANG=ENGLISH {
@ -159,15 +159,15 @@ OneTimeSetup
jsr SaveProDOS
ldx MACHINEID
cpx #$EA
bne slotscan
bne .slotscan
lda #$DF
sta kForceLower
slotscan
.slotscan
jsr ScanForDiskII
lda DiskIIArray+5
bne founds6
bne .founds6
jmp FatalNoSlot6
founds6
.founds6
jsr LoadPrefs ; load preferences (if available)
bcc ResetVector
jsr SavePrefs ; save preferences (if possible)
@ -195,13 +195,13 @@ MainMenu
jsr PrintByID
lda #s_mainmenu
jsr PrintByID
:getkey
.getkey
jsr WaitForKey
cmp #$9B
beq jmptoexit
beq .jmptoexit
cmp #k_quit
bne +
jmptoexit
.jmptoexit
jmp CleanExit
+
cmp #k_slot
@ -222,7 +222,7 @@ jmptoexit
bne Action ; unconditional branch
+
cmp #k_crack
bne getkey
bne .getkey
lda #%11000000
; note: execution falls through here
@ -264,9 +264,9 @@ Action
ldy #<gRWTSParams ; call universal RWTS to see
lda #>gRWTSParams ; if T00,S00 is readable
jsr $BD00 ; (only care about the return code)
bcs fatalt00s00
jmp checkt00s00
:fatalt00s00
bcs .fatalt00s00
jmp .checkt00s00
.fatalt00s00
lda #$F0
sta $B959
lda #$05
@ -274,7 +274,7 @@ Action
ldy #<gRWTSParams
lda #>gRWTSParams
jsr $BD00
bcs reallyfatal
bcs .reallyfatal
;
; Bad emulator detected (disk controller presents nibbles
; immediately instead of based on cycle count). Patch the
@ -284,14 +284,14 @@ Action
sta _B959
lda #$05
sta _B95A
bne checkt00s00 ; unconditional branch
reallyfatal
bne .checkt00s00 ; unconditional branch
.reallyfatal
lda #s_fail
jsr PrintByID
lda #s_fatal0000
jsr PrintByID
jmp TheEnd
checkt00s00
.checkt00s00
jmp CheckT00S00 ; /src/id/inspect0
@ -315,20 +315,20 @@ ADStyle
; before we start.
;
jsr xHeredityDog
bcs noDog
bcs .noDog
lda #s_bb00
jsr PrintByID
noDog
.noDog
jsr xSunburst
bcs noSun
bcs .noSun
lda #s_sunburst
jsr PrintByID
noSun
.noSun
jsr xOptimumRes
bcs noOptimum
bcs .noOptimum
lda #s_optimum
jsr PrintByID
noOptimum
.noOptimum
jsr xB660
jsr xB4BB
jmp ReadWithRWTS
@ -348,7 +348,7 @@ ReadWithRWTS
sta checksector+1
lda #>T22S0F
sta checksector+2
read
.read
lda KEY
bpl checksector
jmp Cancel
@ -372,7 +372,7 @@ checksector
; on markers in the bootloader.
;
cmp #$80
beq optional
beq .optional
;
; If we're in the middle of a track, try switching to the
; universal RWTS and see if that helps. (Many disks contain
@ -382,7 +382,7 @@ checksector
;
lda gSector
cmp #$0F
bne tryuniversal
bne .tryuniversal
;
; We just got to this track, so check for a variety
; of whole-track conditions
@ -390,52 +390,52 @@ checksector
; 1) unformatted track
;
jsr IsUnformatted
bcs checkf7
bcs .checkf7
lda #s_unformat
jsr PrintByID
jmp skiptrack
jmp .skiptrack
;
; 2) $F7 protection track (F7F6EFEAAB nibble sequence)
;
checkf7
.checkf7
jsr IsF7
bcs checksync
bcs .checksync
lda #s_f7
jsr PrintByID
jmp skiptrack
jmp .skiptrack
;
; 3) nibble count track (mostly $FF sync bytes)
;
:checksync
.checksync
jsr IsSyncBytes
bcs tryuniversal
bcs .tryuniversal
lda #s_sync
jsr PrintByID
; note: execution falls through here
skiptrack
.skiptrack
lda #$00 ; skip rest of track
jsr ChangeSector
lda checksector+1
sec
sbc #$0F
sta checksector+1
bcs notrackdec
bcs .notrackdec
dec checksector+2
notrackdec
.notrackdec
jmp nextsector
:tryuniversal
.tryuniversal
lda gTriedUniv ; have we tried the universal RWTS?
beq fatal ; yes, so read error is fatal
beq .fatal ; yes, so read error is fatal
jsr SwitchToUniv ; no, switch it in now
jmp read ; and re-read this sector
jmp .read ; and re-read this sector
fatal pla ; if we get to here, we've
.fatal pla ; if we get to here, we've
jmp FatalError ; decided the read error is fatal
optional
.optional
lda #s_optbad ; say we're skipping this
jsr PrintByID ; optional sector
@ -446,17 +446,17 @@ nextsector
dec checksector+1
lda checksector+1
cmp #$FF
bne nodec
bne .nodec
dec checksector+2
nodec
.nodec
lda gSector
sec
sbc #$01
jsr ChangeSector
lda gSector
bmi prevtrack
jmp read
prevtrack
bmi .prevtrack
jmp .read
.prevtrack
lda #$0F
jsr ChangeSector
lda gTrack
@ -465,27 +465,27 @@ prevtrack
jsr ChangeTrack
jsr IncProgress
lda gTrack
bmi pass
bmi .pass
cmp gLastTrack
bcc pass
jmp read
pass
bcc .pass
jmp .read
.pass
bit gMode
bmi passwrite
bmi .passwrite
lda #s_pass
bne passprint ; always branches
passwrite
bvs ppasscrack
bne .passprint ; always branches
.passwrite
bvs .passcrack
lda #s_passdemuf
bne passprint ; always branches
ppasscrack
bne .passprint ; always branches
.passcrack
lda gPatchCount
beq ppasscrack0
beq .passcrack0
lda #s_passcrack
!byte $2C ; hide next LDA
ppasscrack0
.passcrack0
lda #s_passcrack0
passprint
.passprint
jsr PrintByID
jmp TheEnd
@ -523,14 +523,14 @@ FatalError
jsr PrintByID
lda gTrack
cmp #$22
beq failont22
beq .failont22
jmp TheEnd
failont22
.failont22
lda gSector
cmp #$0F
beq failont22s0f
beq .failont22s0f
jmp TheEnd
failont22s0f
.failont22s0f
lda #s_fatal220f
jsr PrintByID
@ -548,14 +548,14 @@ TheEnd
CleanExit
jsr SwapProDOS
lda gChangedPrefs
bne doquit
bne .doquit
jsr SavePrefs
doquit
.doquit
jsr MLI
!byte $65
!word quitparm
quitparm
!byte 04,00,00,00,00,00,00
!word .quitparm
.quitparm
!byte $04,$00,$00,$00,$00,$00,$00
FatalNoSlot6
lda #s_noslot6
@ -589,32 +589,32 @@ WriteTrack
WriteTrackNA ; entry point used by Special Delivery tracer
; to write track with "N"o "A"nalysis
bit gMode
bpl pdone ; verify mode -> no write
bpl .done ; verify mode -> no write
lda gSaidWriting
beq write
beq .write
lda #s_writing ; only print "writing to" message once
jsr PrintByID
lda #TRUE
sta gSaidWriting
write
.write
jsr WriteTrackMLI
bcc pdone
bcc .done
sta gDisplayBytes ; for use in error messages, if any
cmp #MLI_IOERR
beq ioerr
beq .ioerr
cmp #MLI_NODEV
beq nodev
beq .nodev
cmp #MLI_WRITEPROT
beq pwriteprot
beq .writeprot
lda #s_othermli
!byte $2C ; hide next LDA
ioerr
.ioerr
lda #s_writeioerr
!byte $2C ; hide next LDA
nodev
.nodev
lda #s_writenodev
!byte $2C ; hide next LDA
pwriteprot
.writeprot
lda #s_writeprot
pha
lda #s_writeerr
@ -622,7 +622,7 @@ pwriteprot
pla
jsr PrintByID
jmp TheEnd
pdone
.done
rts
;-------------------------------
@ -698,6 +698,7 @@ _applyToT00
!source "patchers/nibtable.a"
!source "patchers/diskvol.a"
!source "patchers/c9ff.a"
!source "patchers/fbff.a"
_applyToAll
!source "patchers/universale7.a"
!source "patchers/runhello.a"
@ -710,10 +711,10 @@ _applyToAll
!source "patchers/protecteddos.a"
lda gPatchCount
beq nopatches
beq .nopatches
clc
!byte $24 ; hide next SEC
nopatches
.nopatches
sec ; set carry if nothing happened
rts

View File

@ -4,15 +4,16 @@
; address prologue
; e.g. Game Frame One, Game Frame Two
;-------------------------------
!zone {
_a5count
lda gIsPascal ; only ever seen this protection
bne a5count_exit ; on Pascal disks
bne .exit ; on Pascal disks
ldy #$0A
jsr SearchTrack
!byte $07,$E6,$02,$D0,$03,$4C,$A5,$00
!byte $C9,$A5
bcs a5count_exit
bcs .exit
sta gDisplayBytes
pha
lda #s_a5count
@ -25,4 +26,5 @@ _a5count
ldy #$02
jsr modify
!byte $D0,$7B
a5count_exit
.exit
}

View File

@ -3,30 +3,31 @@
; nibble count after "A6 BC 95" prologue
; e.g. The Secrets of Science Island
;-------------------------------
!zone {
_a6bc95
lda gIsPascal ; only ever seen this protection
bne a6bc95_exit ; on Pascal disks
bne .exit ; on Pascal disks
ldy #$09
jsr SearchTrack
!byte $BD,$8C,$C0,$10,$FB,$C9,$A6,$D0
!byte $ED
bcs a6bc95_exit
bcs .exit
ldy #$09
jsr SearchTrack
!byte $BD,$8C,$C0,$10,$FB,$C9,$BC,$D0
!byte $E4
bcs a6bc95_exit
bcs .exit
ldy #$09
jsr SearchTrack
!byte $BD,$8C,$C0,$10,$FB,$C9,$95,$D0
!byte $DB
bcs a6bc95_exit
bcs .exit
ldy #$0E
jsr SearchTrack
!byte $AE,$F8,$01,$A9,$0A,$8D,$FE,$01
!byte $BD,$8E,$C0,$BD,$89,$C0
bcs a6bc95_exit
bcs .exit
sta gDisplayBytes
pha
lda #s_a6bc95
@ -35,4 +36,5 @@ _a6bc95
ldy #$01
jsr modify
!byte $60
a6bc95_exit
.exit
}

View File

@ -8,9 +8,10 @@
; so we patch it for compatibility
; e.g. Dino Dig, Make A Face
;-------------------------------
!zone {
_bademu
lda gIsRWTS ; if DOS 3.3 RWTS
bne bademu_exit
bne .exit
lda #$03
ldx #$4F
ldy #$11
@ -18,10 +19,11 @@ _bademu
!byte $BD,$8C,$C0,$10,$FB,$C9,$D5,$D0
!byte $F0,$EA,$BD,$8C,$C0,$C9,$D5,$F0
!byte $12
bcs bademu_exit
bcs .exit
lda #$03
ldx #$58
ldy #$02
jsr modify ; and set T00,S03,$58 =
!byte $F0,06
bademu_exit
.exit
}

View File

@ -8,9 +8,10 @@
; so we patch it for compatibility
; e.g. Dinosaur Days
;-------------------------------
!zone {
_bademu2
lda gIsRWTS ; if DOS 3.3 RWTS
bne bademu2_exit
bne .exit
lda #$03
ldx #$4F
ldy #$11
@ -18,10 +19,11 @@ _bademu2
!byte $BD,$8C,$C0,$10,$FB,$4A,$C9,$6A
!byte $D0,$EF,$BD,$8C,$C0,$C9,$D5,$F0
!byte $12
bcs bademu2_exit
bcs .exit
lda #$03
ldx #$59
ldy #$02
jsr modify ; and set T00,S03,$59 =
!byte $F0,05
bademu2_exit
!byte $F0,$05
.exit
}

View File

@ -6,17 +6,18 @@
; e.g. Arena, Early Bird by
; Border Software
;-------------------------------
!zone {
_border
lda gIsBoot0 ; if DOS 3.3 boot0 loader
bne border_exit
bne .exit
lda gIsBoot1 ; and DOS 3.3 boot1 loader
bne border_exit
bne .exit
lda #$08
ldx #$5A
ldy #$0A
jsr compare ; and T00,S08,$5A ==
!byte $C9,$23,$B0,$EB,$0A,$20,$6C,$BF,$EA,$EA
bcs border_exit
bcs .exit
sta gDisplayBytes
pha
lda #s_bytrack
@ -25,4 +26,5 @@ _border
ldy #$0A
jsr modify ; then set T00,S08,$5A =
!byte $48,$A0,$01,$B1,$3C,$6A,$68,$90,$08,$0A
border_exit
.exit
}

View File

@ -12,6 +12,7 @@
; track because there is no fixed
; position for it to start.
;-------------------------------
!zone {
_c9ff
ldy #$1A
jsr SearchTrack
@ -19,7 +20,7 @@ _c9ff
!byte $C9,$FF,$D0,$0C,$EA,$BD,$8C,$C0
!byte $10,$FB,$C9,$FF,$D0,$02,$18,$60
!byte $38,$60
bcs c9ff_exit
bcs .exit
sta gDisplayBytes
pha
txa
@ -40,4 +41,5 @@ _c9ff
ldy #$01
jsr modify
!byte $AA
c9ff_exit
.exit
}

View File

@ -5,14 +5,15 @@
; e.g. NoteCard Maker, many Mindplay titles
; (Ace Detective, Robomath, Fraction-oids)
;-------------------------------
!zone {
_d5d5f7
ldy #$20
jsr SearchTrack
!byte $BD,$8C,$C0,$10,$FB,$48,$68,$C9
!byte $D5,$D0,$F5,$A0,00,$8C,$97,$97
!byte $D5,$D0,$F5,$A0,$00,$8C,$97,$97
!byte $BD,$8C,$C0,$10,$FB,$C9,$D5,$F0
!byte $0F,$C9,$F7,$D0,01,$C8,$18,$6D
bcs d5d5f7_exit
!byte $0F,$C9,$F7,$D0,$01,$C8,$18,$6D
bcs .exit
sta gDisplayBytes
pha
lda #s_d5d5f7
@ -21,4 +22,5 @@ _d5d5f7
ldy #$01
jsr modify
!byte $60
d5d5f7_exit
.exit
}

View File

@ -3,14 +3,15 @@
; nibble count in encrypted bootloader
; e.g. Video Title Shop, Tomahawk //e
;-------------------------------
!zone {
_datasoft
lda gIsDatasoft ; only ever seen this protection
bne datasoft_exit ; on Datasoft disks (ID'd earlier)
bne .exit ; on Datasoft disks (ID'd earlier)
ldy #$06
jsr SearchTrack
!byte $5D,$D4,$80,$49,00,$19
bcs datasoft_exit
bcs .exit
sta gDisplayBytes
pha
lda #s_datasoft
@ -19,4 +20,5 @@ _datasoft
ldy #$01
jsr modify
!byte $C0
datasoft_exit
.exit
}

View File

@ -9,41 +9,43 @@
; Chick, Mrs. Wigglesworth's Secret
; Mystery of the Witch's Shoes
;-------------------------------
!zone {
_davidbb03
lda #$00
ldx #$00
ldy #$38
jsr compare ; and T00,S00,$00 ==
!byte 01,$A5,$27,$C9,09,$D0,$17,$A5
!byte $2B,$4A,$4A,$4A,$4A,$AA,09,$C0
!byte $85,$3F,$A9,00,$9D,$78,04,$9D
!byte $F8,04,$A9,$5C,$85,$3E,$AE,$FF
!byte 08,$30,$15,$BD,$ED,08,$85,$3D
!byte $CE,$FF,08,$AD,$FE,08,$85,$27
!byte $CE,$FE,08,$A6,$2B,$6C,$3E,00
bcs davidbb03_exit
!byte $01,$A5,$27,$C9,$09,$D0,$17,$A5
!byte $2B,$4A,$4A,$4A,$4A,$AA,$09,$C0
!byte $85,$3F,$A9,$00,$9D,$78,$04,$9D
!byte $F8,$04,$A9,$5C,$85,$3E,$AE,$FF
!byte $08,$30,$15,$BD,$ED,$08,$85,$3D
!byte $CE,$FF,$08,$AD,$FE,$08,$85,$27
!byte $CE,$FE,$08,$A6,$2B,$6C,$3E,$00
bcs .exit
lda #$00
ldx #$8B
ldy #$03
jsr compare ; and T00,S00,$8B ==
!byte $20,03,$BB
bcs davidbb03_exit
bcs .exit
lda #$07
ldx #$03
ldy #$25
jsr compare ; and T00,S07,$03 ==
!byte $4E,06,$BB,$71,$6E
!byte $4E,$06,$BB,$71,$6E
!byte $0A,$BB,$40,$27,$6E,$0F,$BB,$DD
!byte $1B,$BB,$6E,$15,$BB,$DC,$1E,$BB
!byte $6E,$25,$BB,$72,00,$BB,$B3,00
!byte $B8,$99,00,$BB,$C8,$A0,$F4,$B0
bcs davidbb03_exit
!byte $6E,$25,$BB,$72,$00,$BB,$B3,$00
!byte $B8,$99,$00,$BB,$C8,$A0,$F4,$B0
bcs .exit
lda #s_jsrbb03
jsr PrintByID
lda #$07
ldx #$03
ldy #$0B
jsr modify ; then set T00,S07,$03 =
!byte $A9,$B5,$48,$A9,$18,$48,$A0,04
!byte $A9,$B5,$48,$A9,$18,$48,$A0,$04
!byte $4C,$A9,$B7
davidbb03_exit
.exit
}

View File

@ -3,44 +3,46 @@
; non-standard disk volume prevents
; DOS from loading
;-------------------------------
!zone {
_diskvol
lda gIsRWTS ; if DOS 3.3 RWTS
bne diskvol_exit
bne .exit
lda #$01
ldx #$EE
ldy #$01
jsr compare ; and T00,S01,$EE ==
!byte $FB
bcs diskvol_exit
bcs .exit
lda #$01
ldx #$FB
ldy #$04
jsr compare ; and T00,S01,$FB ==
!byte 00,01,$EF,$D8
bcs diskvol_exit
!byte $00,$01,$EF,$D8
bcs .exit
lda #$08
ldx #$10
ldy #$05
jsr compare ; and T00,S08,$10 ==
!byte $A0,03,$B1,$48,$48
bcs diskvol_exit
!byte $A0,$03,$B1,$48,$48
bcs .exit
lda #$01
ldx #$EB
ldy #$01
jsr compare ; and T00,S01,$EB !=
!byte $FE
bcc diskvol_exit
bcc .exit
lda #$01
ldx #$EB
ldy #$01
jsr compare ; and T00,S01,$EB !=
!byte 00
bcc diskvol_exit
!byte $00
bcc .exit
lda #s_diskvol
jsr PrintByID
lda #$08
ldx #$12
ldy #$02
jsr modify ; then set T00,S08,$12 =
!byte $A9,00
diskvol_exit
!byte $A9,$00
.exit
}

View File

@ -1 +1,34 @@
狎限限限限限限限限限限限限限限限龟 ␆藐<E29086><E89790> 蜧臇瀁 貗濻樍鏻瀁 蜼樍<E89CBC> 鐓敳龟 斀瀇<E69680><> 亠 勹 勹 勹 勹 鍣瞁懤龟 鵴嚬槴蜲 玃鐓 <20> 鶇樍氄殫 謯鐀殣<E99080><E6AEA3> 檴 鏻臄鍡 睾鏵 濎 瞂鐎槫<E9908E>狎限限限限限限限限限限限限限限限渘糋緧<E7B38B><EFBFBD> 迚仇<E8BF9A>𥻗麔 <20>槦蠆髫蠌蜱<E8A08C><E89CB1><EFBFBD>藏蜆簸掠亠簸亠襤<E4BAA0><E8A5A4><EFBFBD>鼴⑹偽鰻鰻藏蜆簸<E89C86><E7B0B8><EFBFBD>簸偶笠簞兜藏蜆簸<E89C86><E7B0B8><EFBFBD>掠亠簸勹襤譫⑹鷓<E291B9><E9B793><EFBFBD>藏蜆簸掠亠葩僩羅<E583A9><E7BE85><EFBFBD>偭襤藕薩蜆簸掠亠<E68EA0><E4BAA0><EFBFBD>雩笠眶<E7ACA0><EFBFBD> 舚氂濊<E6B082><EFBFBD>褔澞謽朅雙醲<E99B99>𦆭酃舚嶉<E8889A>𦆭鐖舚曮<E8889A>𥔱魟迚鵸糋緧<E7B38B><EFBFBD>唗濎蘌钃<E8988C>𥔱魟迚什<E8BF9A>𦆭酃舚蜧羻糮<E7BEBB>箝瀦隮𥔱噌迚化<E8BF9A><E58C96> 臩僸縃槼 敳 觶隮澼<E99AAE>罱臄舚氂濊<E6B082><EFBFBD>箇摫紇<E691AB><EFBFBD><E89CB5>鳲舚曮<E8889A>𦆭酃舚曮<E8889A>罱蝆舚<E89D86>𣳇鍏舚嶉<E8889A><EFBFBD><EFBFBD>綺摐籓紇<E7B193><EFBFBD>綰檷攠<E6AAB7>筵𥔱魟迚化<E8BF9A><E58C96> 臩僸縃槼 敳 觶隮澼<E99AAE>綿𥔱噌迚化<E8BF9A><E58C96> 臩僸縃槼 敳 觶隮澼<E99AAE>𥔱嘵迚什<E8BF9A>𥻗麔𡥄檷氄<E6AAB7>綰檷攠<E6AAB7><E694A0><EFBFBD>勹朌 臩僸縃槼 敳 觶隮澼<E99AAE>牐樍舚蜧羻糮<E7BEBB>𥻗艛舚蜧羻<E89CA7>箇摫<E7AE87><E691AB><EFBFBD>停偎捧冕偉㭲攠檁<E694A0>臈臢螩亅僕斑蜊<E69691>箏鼞<E7AE8F>
;-------------------------------
; #FBFF
; Activision's Timing Bit Detection:
; FB+FF FF+FF FF+FD FF+FF+FF+FF+FF+FF+FF+FF+FF+ and
; DE AA EB+FF+FF+FF+FF+FF+FF D5 AA
; Magic key is #FF, usually EOR'ed with #$AA but not always
; As found on Aliens, Maniac Mansion + 22 other titles
;
; Module by Brian Troha
;-------------------------------
!zone {
_fbff
ldy #$45
jsr SearchTrack
!byte $BD,$89,$C0,$A9,$56,$85,$FD,$A9
!byte $08,$C6,$FC,$D0,$04,$C6,$FD,$F0
!byte $34,$BC,$8C,$C0,$10,$FB,$C0,$FB
!byte $D0,$ED,$F0,$00,$EA,$EA,$BC,$8C
!byte $C0,$C0,$08,$2A,$B0,$0B,$BC,$8C
!byte $C0,$10,$FB,$C0,$FF,$D0,$D8,$F0
!byte $EB,$BC,$8C,$C0,$10,$FB,$84,$FC
!byte $C9,$0A,$D0,$CB,$BD,$8C,$C0,$10
!byte $FB,$38,$2A,$25,$FC
bcs .exit
sta gDisplayBytes
pha
lda #s_fbff
jsr PrintByID
pla
ldy #$05
jsr modify
!byte $A9,$FF,$18,$90,$40
.exit
}

View File

@ -4,17 +4,18 @@
; for a nibble check
; e.g. Alien Addition
;-------------------------------
!zone {
_jmpae8e
lda gIsBoot0 ; if DOS 3.3 boot0 loader
bne jmpae8e_exit
bne .exit
lda gIsBoot1 ; and DOS 3.3 boot1 loader
bne jmpae8e_exit
bne .exit
lda #$0D
ldx #$4D
ldy #$03
jsr compare ; and T00,S0D,$4D ==
!byte $4C,$8E,$AE
bcs jmpae8e_exit
bcs .exit
lda #s_jmpae8e
jsr PrintByID
lda #$0D
@ -22,4 +23,5 @@ _jmpae8e
ldy #$02
jsr modify ; then set T00,S0D,$4E =
!byte $80,$A1
jmpae8e_exit
.exit
}

View File

@ -4,18 +4,19 @@
; $B400 instead of $9D84
; e.g. Decimal Discovery
;-------------------------------
!zone {
_jmpb400
lda gIsBoot0 ; if DOS 3.3 boot0 loader
bne jmpb400_exit
bne .exit
lda gIsBoot1 ; and DOS 3.3 boot1 loader
bne jmpb400_exit
bne .exit
lda #$01
sta gDisplayBytes
ldx #$47
ldy #$03
jsr compare ; and T00,S01,$47 ==
!byte $4C,00,$B4
bcs jmpb400_exit
!byte $4C,$00,$B4
bcs .exit
lda #s_jmpb400
jsr PrintByID
lda #$01
@ -23,4 +24,5 @@ _jmpb400
ldy #$02
jsr modify ; then set T00,S01,$48 =
!byte $84,$9D
jmpb400_exit
.exit
}

View File

@ -4,16 +4,17 @@
; nibble check
; e.g. Troll's Tale
;-------------------------------
_jmpb4bb
!zone {
jmpb4bb
lda gIsMaster ; if DOS 3.3 lomem bootloader
bne jmpb4bb_exit
bne .exit
lda #$0C
sta gDisplayBytes
ldx #$84
ldy #$03
jsr compare ; and T00,S0C,$84 ==
!byte $4C,$BB,$B4
bcs jmpb4bb_exit
bcs .exit
lda #s_jmpb4bb
lda #$0C
ldx #$84
@ -30,10 +31,11 @@ _jmpb4bb
ldy #$03
jsr compare ; if T00,S0D,$BA ==
!byte $4C,$0B,$37
bcs jmpb4bb_exit
bcs .exit
lda #$0D
ldx #$BA
ldy #$03
jsr modify ; then set T00,S0D,$BA =
!byte $6C,$38,00
jmpb4bb_exit
.exit
}

View File

@ -4,16 +4,17 @@
; nibble check
; e.g. Snooper Troops 2
;-------------------------------
!zone {
_jmpb4bbhi
lda gIsBoot1 ; if DOS 3.3 bootloader
bne jmpb4bbhi_exit
bne .exit
lda #$0C
sta gDisplayBytes
ldx #$84
ldy #$03
jsr compare ; and T00,S0C,$84 ==
!byte $4C,$BB,$B4
bcs jmpb4bbhi_exit
bcs .exit
lda #s_jmpb4bb
jsr PrintByID
lda #$0C
@ -21,4 +22,5 @@ _jmpb4bbhi
ldy #$03
jsr modify ; then set T00,S0C,$84 =
!byte $AD,$E9,$B7
jmpb4bbhi_exit
.exit
}

View File

@ -4,9 +4,10 @@
; checking third data prologue
; e.g. Analogies Tutorial, Verb Viper
;-------------------------------
!zone {
_jmpb660
lda gIsRWTS ; if DOS 3.3-shaped RWTS
bne jmpb660_exit
bne .exit
lda #$02
ldx #$DC
ldy #$1D
@ -15,7 +16,7 @@ _jmpb660
!byte $10,$FB,$49,$97,$D0,$F4,$EA,$BD
!byte $8C,$C0,$10,$FB,$C9,$97,$D0,$F2
!byte $A0,$56,$4C,$60,$B6
bcs jmpb660_exit
bcs .exit
lda #s_jmpb660
jsr PrintByID
lda #$02
@ -23,4 +24,5 @@ _jmpb660
ldy #$03
jsr modify ; then set T00,S02,$F6 =
!byte $BD,$8C,$C0
jmpb660_exit
.exit
}

View File

@ -5,20 +5,22 @@
; third data prologue
; e.g. Analogies Tutorial, Verb Viper
;-------------------------------
!zone {
_jmpb720
lda gIsRWTS ; if DOS 3.3-shaped RWTS
bne jmpb720_exit
bne .exit
lda #$0B
ldx #$08
ldy #$18
jsr compare ; and T00,S0B,$08 ==
!byte $4C,$20,$B7,$4C,$0E,$A9,$A2,02
!byte $BD,$0B,$B7,$9D,$5E,$B8,$BD,08
!byte $4C,$20,$B7,$4C,$0E,$A9,$A2,$02
!byte $BD,$0B,$B7,$9D,$5E,$B8,$BD,$08
!byte $B7,$9D,$F6,$B8,$CA,$10,$F1,$60
bcs jmpb720_exit
bcs .exit
lda #$0B
ldx #$08
ldy #$06
jsr modify ; then set T00,S0B,$08 =
!byte $BD,$8C,$C0,$20,$B8,$B8
jmpb720_exit
.exit
}

View File

@ -4,18 +4,20 @@
; ($BBFE) instead of ($08FD)
; e.g. Mind Over Matter
;-------------------------------
!zone {
_jmpbbfe
lda gIsBoot0 ; if DOS 3.3 boot0 loader
bne jmpbbfe_exit
bne .exit
lda #$00
ldx #$4A
ldy #$03
jsr compare ; and T00,S00,$4A ==
!byte $6C,$FE,$BB
bcs jmpbbfe_exit
bcs .exit
lda #$00
ldx #$4B
ldy #$02
jsr modify ; then set T00,S00,$4B =
!byte $FD,08
jmpbbfe_exit
.exit
}

View File

@ -6,15 +6,16 @@
; NOTE: must be run before RWTS
; patchers due to overlapping bytes
;-------------------------------
!zone {
_jmpbcf0
lda gIsRWTS ; if DOS 3.3 RWTS
bne jmpbcf0_exit
bne .exit
lda #$03
ldx #$94
ldy #$08
jsr compare ; and T00,S03,$94 ==
!byte $DD,$8C,$C0,$D0,$A9,$4C,$F0,$BC
bcs jmpbcf0_exit
bcs .exit
lda #s_jmpbcf0
jsr PrintByID
lda #$03
@ -22,4 +23,5 @@ _jmpbcf0
ldy #$08
jsr modify ; then set T00,S03,$94 =
!byte $EA,$BD,$8C,$C0,$10,$FB,$C9,$AA
jmpbcf0_exit
.exit
}

View File

@ -6,33 +6,34 @@
; NOTE: must be run before RWTS
; patchers due to overlapping bytes
;-------------------------------
!zone {
_jmpbeb1
lda gIsRWTS ; if DOS 3.3 RWTS
bne jmpbeb1_exit
bne .exit
lda #$02
ldx #$48
ldy #$10
jsr compare ; and T00,S03,$48 ==
!byte $A0,03,$48,$68,$20,$B9,$B8,$88
!byte $A0,$03,$48,$68,$20,$B9,$B8,$88
!byte $D0,$F8,$4C,$B1,$BE,$EA,$EA,$A9
bcs jmpbeb1_exit
bcs .exit
lda #$02
ldx #$59
ldy #$04
jsr compare ; and T00,S02,$59 ==
!byte $20,$B8,$B8,$A9
bcs jmpbeb1_exit
bcs .exit
lda #$02
ldx #$5E
ldy #$03
jsr compare ; and T00,S04,$5E ==
!byte $20,$BB,$B8
bcs jmpbeb1_exit
bcs .exit
lda #$02
ldx #$49
ldy #$01
jsr modify ; then set T00,S02,$49 =
!byte 04
!byte $04
lda #$02
ldx #$52
ldy #$05
@ -43,4 +44,5 @@ _jmpbeb1
ldy #$01
jsr modify ; and set T00,S02,$5F =
!byte $B8
jmpbeb1_exit
.exit
}

View File

@ -6,16 +6,17 @@
; NOTE: must be run before RWTS
; patchers due to overlapping bytes
;-------------------------------
!zone {
_jmpbeca
lda gIsRWTS ; if DOS 3.3 RWTS
bne jmpbeca_exit
bne .exit
lda #$02
ldx #$F4
ldy #$0D
jsr compare ; and T00,S02,$F4 ==
!byte $EA,$BD,$8C,$C0,$10,$FB,$C9,$AD
!byte $D0,$E8,$4C,$CA,$BE
bcs jmpbeca_exit
bcs .exit
lda #s_jmpbeca
jsr PrintByID
lda #$02
@ -24,4 +25,5 @@ _jmpbeca
jsr modify ; and set T00,S02,$F4 =
!byte $A0,$56,$BD,$8C,$C0,$10,$FB,$C9
!byte $AD,$D0,$E7,$A9,$00
jmpbeca_exit
.exit
}

View File

@ -7,16 +7,17 @@
; NOTE: must be run before RWTS
; patchers due to overlapping bytes
;-------------------------------
!zone {
_jmpbeca2
lda gIsRWTS ; if DOS 3.3 RWTS
bne jmpbeca2_exit
bne .exit
lda #$02
ldx #$F4
ldy #$0D
jsr compare ; and T00,S02,$F4 ==
!byte $4C,$CA,$BE,$EA,$BD,$8C,$C0,$10
!byte $FB,$49,$AD,$D0,$DD
bcs jmpbeca2_exit
bcs .exit
lda #s_jmpbeca
jsr PrintByID
lda #$02
@ -24,5 +25,6 @@ _jmpbeca2
ldy #$0D
jsr modify ; and set T00,S02,$F4 =
!byte $A0,$56,$BD,$8C,$C0,$10,$FB,$C9
!byte $AD,$D0,$E7,$A9,00
jmpbeca2_exit
!byte $AD,$D0,$E7,$A9,$00
.exit
}

View File

@ -6,27 +6,28 @@
; e.g. Classifying Animals with
; Backbones, EduCalc
;-------------------------------
!zone {
_jsrbb03
lda gIsBoot0 ; if DOS 3.3 boot0 loader
bne jsrbb03_exit
bne .exit
lda gIsBoot1 ; and DOS 3.3 boot1 loader
bne jsrbb03_exit
bne .exit
lda #$01
ldx #$38
ldy #$03
jsr compare ; and T00,S01,$38 ==
!byte $20,03,$BB
bcs jsrbb03_exit
!byte $20,$03,$BB
bcs .exit
lda #$05
ldx #$03
ldy #$25
jsr compare ; and T00,S05,$03 ==
!byte $4E,06,$BB,$71,$6E
!byte $4E,$06,$BB,$71,$6E
!byte $0A,$BB,$40,$27,$6E,$0F,$BB,$DD
!byte $1B,$BB,$6E,$15,$BB,$DC,$1E,$BB
!byte $6E,$25,$BB,$72,00,$BB,$B3,00
!byte $B8,$99,00,$BB,$C8,$A0,$F4,$B0
bcs jsrbb03_exit
!byte $6E,$25,$BB,$72,$00,$BB,$B3,$00
!byte $B8,$99,$00,$BB,$C8,$A0,$F4,$B0
bcs .exit
lda #s_jsrbb03
jsr PrintByID
lda #$05
@ -34,4 +35,5 @@ _jsrbb03
ldy #$09
jsr modify ; then set T00,S05,$03 =
!byte $A9,$B5,$48,$A9,$18,$48,$4C,$93,$B7
jsrbb03_exit
.exit
}

View File

@ -4,123 +4,125 @@
; address and data prologues
; e.g. Phonics Prime Time series
;-------------------------------
!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
bcs meccm7_exit
!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
bcs .exit
lda #$07
ldx #$7D
ldy #$06
jsr compare ; and T00,S07,$7D ==
!byte $BD,$8C,$C0,$10,$FB,$C9
bcs meccm7_exit
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 meccm7_exit
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 meccm7_exit
bcs .exit
lda #$07
ldx #$0F
ldy #$06
jsr compare ; and T00,S07,$0F ==
!byte $BD,$8C,$C0,$10,$FB,$49
bcs meccm7_exit
bcs .exit
lda #$07
ldx #$18
ldy #$07
jsr compare ; and T00,S07,$18 ==
!byte $EA,$BD,$8C,$C0,$10,$FB,$C9
bcs meccm7_exit
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 meccm7_allclear
meccm7_exit
jmp meccm7_exit2
meccm7_allclear
bcc .allclear
.exit
jmp .exit2
.allclear
lda #$07
ldx #$83
ldy #$01
jsr compare ; if T00,S07,$83 !=
!byte $D5
bcc meccm7_addr2
bcc .addr2
lda #$07
ldx #$83
ldy #$01
jsr modify ; then set T00,S07,$83 =
!byte $D5
meccm7_addr2
.addr2
lda #$07
ldx #$8D
ldy #$01
jsr compare ; if T00,S07,$8D !=
!byte $AA
bcc meccm7_addr3
bcc .addr3
lda #$07
ldx #$8D
ldy #$01
jsr modify ; then set T00,S07,$8D =
!byte $AA
meccm7_addr3
.addr3
lda #$07
ldx #$98
ldy #$01
jsr compare ; if T00,S07,$98 !=
!byte $96
bcc meccm7_data1
bcc .data1
lda #$07
ldx #$98
ldy #$01
jsr modify ; then set T00,S07,$98 =
!byte $96
meccm7_data1
.data1
lda #$07
ldx #$15
ldy #$01
jsr compare ; if T00,S07,$15 !=
!byte $D5
bcc meccm7_data2
bcc .data2
lda #$07
ldx #$15
ldy #$01
jsr modify ; then set T00,S07,$15 =
!byte $D5
meccm7_data2
.data2
lda #$07
ldx #$1F
ldy #$01
jsr compare ; if T00,S07,$1F !=
!byte $AA
bcc meccm7_data3
bcc .data3
lda #$07
ldx #$1F
ldy #$01
jsr modify ; then set T00,S07,$1F =
!byte $AA
meccm7_data3
.data3
lda #$07
ldx #$2A
ldy #$01
jsr compare ; if T00,S07,$2A !=
!byte $AD
bcc meccm7_exit2
bcc .exit2
lda #$07
ldx #$2A
ldy #$01
jsr modify ; then set T00,S07,$2A =
!byte $AD
meccm7_exit2
.exit2
}

View File

@ -4,127 +4,129 @@
; address and data prologues
; e.g. Word Munchers
;-------------------------------
!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
bcs meccm8_exit
!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
bcs .exit
lda #$0B
ldx #$02
ldy #$06
jsr compare ; and T00,S0B,$02 ==
!byte $BD,$8C,$C0,$10,$FB,$C9
bcs meccm8_exit
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 meccm8_exit
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 meccm8_exit
bcs .exit
lda #$0B
ldx #$89
ldy #$06
jsr compare ; and T00,S0B,$89 ==
!byte $BD,$8C,$C0,$10,$FB,$C9
bcs meccm8_exit
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 meccm8_exit
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 meccm8_allclear
meccm8_exit
jmp meccm8_exit2
meccm8_allclear
bcc .allclear
.exit
jmp .exit2
.allclear
lda #$0B
ldx #$08
ldy #$01
jsr compare ; if T00,S0B,$08 !=
!byte $D5
bcc meccm8_addr2
bcc .addr2
lda #$0B
ldx #$08
ldy #$01
jsr modify ; then set T00,S0B,$0B =
!byte $D5
meccm8_addr2
.addr2
lda #$0B
ldx #$12
ldy #$01
jsr compare ; if T00,S0B,$12 !=
!byte $AA
bcc meccm8_addr3
bcc .addr3
lda #$0B
ldx #$12
ldy #$01
jsr modify ; then set T00,S0B,$12 =
!byte $AA
meccm8_addr3
.addr3
lda #$0B
ldx #$1D
ldy #$01
jsr compare ; if T00,S0B,$1D !=
!byte $96
bcc meccm8_data1
bcc .data1
lda #$0B
ldx #$1D
ldy #$01
jsr modify ; then set T00,S0B,$1D =
!byte $96
meccm8_data1
.data1
lda #$0B
ldx #$8F
ldy #$01
jsr compare ; if T00,S0B,$8F !=
!byte $D5
bcc meccm8_data2
bcc .data2
lda #$0B
ldx #$8F
ldy #$01
jsr modify ; then set T00,S0B,$8F =
!byte $D5
meccm8_data2
.data2
lda #$0B
ldx #$99
ldy #$01
jsr compare ; if T00,S0B,$99 !=
!byte $AA
bcc meccm8_data3
bcc .data3
lda #$0B
ldx #$99
ldy #$01
jsr modify ; then set T00,S0B,$99 =
!byte $AA
meccm8_data3
.data3
lda #$0B
ldx #$A3
ldy #$01
jsr compare ; if T00,S0B,$A3 !=
!byte $AD
bcc meccm8_exit2
bcc .exit2
lda #$0B
ldx #$A3
ldy #$01
jsr modify ; then set T00,S0B,$A3 =
!byte $AD
meccm8_exit2
.exit2
}

View File

@ -4,14 +4,15 @@
; nibble-to-byte translation
; e.g. Travels with Za-Zoom
;-------------------------------
!zone {
_nibtable
jmp checkread
jmp .checkread
readdata
!byte 00,01
!byte $98,$99,02,03,$9C,04,05,06
!byte $A0,$A1,$A2,$A3,$A4,$A5,07,08
!byte $A8,$A9,$AA,09,$0A,$0B,$0C,$0D
.readdata
!byte $00,$01
!byte $98,$99,$02,$03,$9C,$04,$05,$06
!byte $A0,$A1,$A2,$A3,$A4,$A5,$07,$08
!byte $A8,$A9,$AA,$09,$0A,$0B,$0C,$0D
!byte $B0,$B1,$0E,$0F,$10,$11,$12,$13
!byte $B8,$14,$15,$16,$17,$18,$19,$1A
!byte $C0,$C1,$C2,$C3,$C4,$C5,$C6,$C7
@ -23,7 +24,7 @@ readdata
!byte $F0,$F1,$33,$34,$35,$36,$37,$38
!byte $F8,$39,$3A,$3B,$3C,$3D,$3E,$3F
writedata
.writedata
!byte $96,$97,$9A,$9B,$9D,$9E,$9F,$A6
!byte $A7,$AB,$AC,$AD,$AE,$AF,$B2,$B3
!byte $B4,$B5,$B6,$B7,$B9,$BA,$BB,$BC
@ -33,104 +34,105 @@ writedata
!byte $ED,$EE,$EF,$F2,$F3,$F4,$F5,$F6
!byte $F7,$F9,$FA,$FB,$FC,$FD,$FE,$FF
checkread
.checkread
lda gIsRWTS ; if DOS 3.3 RWTS
bne nibtable_exit
bne .exit
lda #$02
ldx #$6D
ldy #$03
jsr compare ; and T00,S02,$6D ==
!byte $BD,$29,$BA
bcs checkwrite
bcs .checkwrite
lda #$02
ldx #$82
ldy #$03
jsr compare ; and T00,S02,$82 ==
!byte $BD,$29,$BA
bcs checkwrite
bcs .checkwrite
lda #$02
ldx #$95
ldy #$03
jsr compare ; and T00,S02,$95 ==
!byte $BD,$29,$BA
bcs checkwrite
jsr fixwrite
checkwrite
bcs .checkwrite
jsr .fixwrite
.checkwrite
lda #$03
ldx #$09
ldy #$03
jsr compare ; if T00,S03,$09 ==
!byte $59,00,$BA
bcs nibtable_exit
!byte $59,$00,$BA
bcs .exit
lda #$03
ldx #$1A
ldy #$03
jsr compare ; and T00,S03,$1A ==
!byte $59,00,$BA
bcs nibtable_exit
!byte $59,$00,$BA
bcs .exit
lda #$03
ldx #$2A
ldy #$03
jsr compare ; and T00,S03,$2A ==
!byte $D9,00,$BA
bcs nibtable_exit
jsr fixread
nibtable_exit
jmp nibtable_exit2
!byte $D9,$00,$BA
bcs .exit
jsr .fixread
.exit
jmp .exit2
fixread
.fixread
lda #$00
sta nibsrcindex
lda #$96
sta nibdestindex
nibtable_read
.read
ldx nibsrcindex
lda readdata,x
sta nibcmpr
sta nibmodr
lda .readdata,x
sta .nibcmpr
sta .nibmodr
lda #$04
ldx nibdestindex
ldy #$01
jsr compare
nibcmpr !byte $FF
bcc nomodr
.nibcmpr !byte $FF
bcc .nomodr
lda #$04
ldx nibdestindex
ldy #$01
jsr modify
nibmodr !byte $FF
nomodr
.nibmodr !byte $FF
.nomodr
inc nibsrcindex
inc nibdestindex
bne nibtable_read
bne .read
rts
fixwrite
.fixwrite
lda #$00
sta nibsrcindex
lda #$29
sta nibdestindex
nibtable_write
.write
ldx nibsrcindex
lda writedata,x
sta nibcmpw
sta nibmodw
lda .writedata,x
sta .nibcmpw
sta .nibmodw
lda #$04
ldx nibdestindex
ldy #$01
jsr compare
nibcmpw !byte $FF
bcc nomodw
.nibcmpw !byte $FF
bcc .nomodw
lda #$04
ldx nibdestindex
ldy #$01
jsr modify
nibmodw !byte $FF
nomodw
.nibmodw !byte $FF
.nomodw
inc nibsrcindex
inc nibdestindex
lda nibsrcindex
cmp #$40
bne nibtable_write
bne .write
rts
nibtable_exit2
.exit2
}

View File

@ -4,14 +4,15 @@
; ProDOS-based MECC disks
; [thanks LoGo]
;-------------------------------
!zone {
_prodosmecc
lda gIsProDOS
beq +
jmp prodosmecc_exit
jmp .exit
+
ldy #$0E
jsr SearchTrack
!byte $50,$54,$58,$5C,$60,$64,$68,00
!byte $50,$54,$58,$5C,$60,$64,$68,$00
!byte $20,$10,$30,$97,$AA,$EB
bcs +
sta gDisplayBytes
@ -36,9 +37,9 @@ _prodosmecc
+
ldy #$15
jsr SearchTrack
!byte $AD,$C4,$D1,$CD,$C8,$D4,08,$2C
!byte $81,$C0,$28,$D0,06,$C9,$DE,$F0
!byte 02,$18,$24,$38,$60
!byte $AD,$C4,$D1,$CD,$C8,$D4,$08,$2C
!byte $81,$C0,$28,$D0,$06,$C9,$DE,$F0
!byte $02,$18,$24,$38,$60
bcs +
sta gDisplayBytes
inx
@ -73,9 +74,9 @@ _prodosmecc
; variation seen in e.g. A-232 Spelling Press
!byte $AD,$C4,$D1,$CD,$C8,$D4,08,$2C
!byte $81,$C0,$28,$D0,09,$8D,$97,$97
!byte $C9,$DE,$F0,02,$18,$24,$38,$60
!byte $AD,$C4,$D1,$CD,$C8,$D4,$08,$2C
!byte $81,$C0,$28,$D0,$09,$8D,$97,$97
!byte $C9,$DE,$F0,$02,$18,$24,$38,$60
bcs +
sta gDisplayBytes
inx
@ -110,7 +111,7 @@ _prodosmecc
+
ldy #$0C
jsr SearchTrack
!byte $30,$A2,$20,00,$BF,$80,$97,$97,$B0,$98,$38,$60
!byte $30,$A2,$20,$00,$BF,$80,$97,$97,$B0,$98,$38,$60
bcs +
inx
inx
@ -133,14 +134,15 @@ _prodosmecc
ldy #$0B
jsr SearchTrack
!byte $30,$91,$38,$60,00,$20,00,03,00,03,00
bcs prodosmecc_exit
bcs .exit
inx
inx
ldy #$01
jsr compare
!byte $38
bcs prodosmecc_exit
bcs .exit
ldy #$01
jsr modify
!byte $18
prodosmecc_exit
.exit
}

View File

@ -3,15 +3,16 @@
; patch ProDOS RWTS
; e.g. ProDOS-based MECC disks
;-------------------------------
!zone {
_prodosrwts
lda gIsProDOS
bne prodosrwts_exit
bne .exit
ldy #$14
jsr SearchTrack
!byte $29,$FC,$5D,$97,$97,$D0,$0C,$A6
!byte $97,$BD,$8C,$C0,$10,$FB,$C9,$97
!byte $18,$F0,01,$38
bcs prodosrwts_exit
!byte $18,$F0,$01,$38
bcs .exit
sta gDisplayBytes
inx
inx
@ -31,8 +32,9 @@ _prodosrwts
ldy #$01
jsr compare
!byte $DE
bcc prodosrwts_exit
bcc .exit
ldy #$01
jsr modify
!byte $DE
prodosrwts_exit
.exit
}

View File

@ -8,10 +8,11 @@
; (Home Alone / Outdoor Safety / Famous People),
; Math Blaster, Moebius
;-------------------------------
!zone {
_protdos
lda gIsProtDOS
beq +
jmp protdos_exit
jmp .exit
+
;
; Find secondary/tertiary RWTS swappers on any track
@ -21,30 +22,30 @@ _protdos
jsr SearchTrack
!byte $A9,$B5,$85,$4E,$8D,$5D,$BD,$A9
!byte $D5,$8D,$2C,$BF
bcs specific
sta swapper2+1
bcs .specific
sta .swapper2+1
inx
stx swapper1+1
stx .swapper1+1
ldy #$01
jsr modify ; offset $01: $B5 -> $AD
jsr modify ; offset $01. $B5 -> $AD
!byte $AD
swapper1
.swapper1
lda #$FF ; modified at runtime
clc
adc #$07
tax
swapper2
.swapper2
lda #$FF ; modified at runtime
ldy #$01
jsr modify ; offset $08: $D5 -> 9B
jsr modify ; offset $08. $D5 -> 9B
!byte $9B
specific
.specific
lda gTrack
cmp #$02
bcc strip
jmp protdos_exit
strip
bcc .strip
jmp .exit
.strip
;
; strip 6-digit numeric serial number
; (appears on both track 0 and 1, but
@ -64,27 +65,27 @@ strip
inx
lda #$02
++
stx serial+2
stx serialb+2
stx .serial+2
stx .serialb+2
sta gDisplayBytes+3
lda #$C5
sta serial+1
sta serialb+1
sta .serial+1
sta .serialb+1
ldy #$00
serialloop
jsr serial
.serialloop
jsr .serial
tax
jsr serial
jsr XA2byte
jsr .serial
jsr .XA2byte
sta gDisplayBytes,y
iny
cpy #$03
bne serialloop
bne .serialloop
lda #s_protserial
jsr PrintByID
lda gTrack
beq track0
beq .track0
;
; disable RWTS swapper (technically make the
@ -97,7 +98,7 @@ serialloop
jsr compare ; if T01,S02,$AF ==
!byte $A2,$B5,$86,$4E,$8E,$5D,$BD,$A2
!byte $D5,$8E,$2C,$BF
bcs exitt1
bcs .exitt1
lda #$02
ldx #$B0
ldy #$01
@ -109,10 +110,10 @@ serialloop
jsr modify ; and set T01,S02,$B7 =
!byte $9B
exitt1
jmp protdos_exit
.exitt1
jmp .exit
:track0
.track0
;
; decrypt RWTS in track buffer
;
@ -120,22 +121,22 @@ exitt1
jsr PrintByID
ldx #BASEPAGE
inx
stx a+2
stx b+2
stx c+2
a lda $FF06 ; modified at runtime
sta pdkey+1
stx .a+2
stx .b+2
stx .c+2
.a lda $FF06 ; modified at runtime
sta .key+1
ldx #$09
ldy #$1A
b lda $FF00,Y ; modified at runtime
pdkey eor #$FF ; modified at runtime
c sta $FF00,Y ; modified at runtime
.b lda $FF00,Y ; modified at runtime
.key eor #$FF ; modified at runtime
.c sta $FF00,Y ; modified at runtime
iny
bne b
inc b+2
inc c+2
bne .b
inc .b+2
inc .c+2
dex
bne b
bne .b
;
; disable decryption loop
@ -153,12 +154,12 @@ c sta $FF00,Y ; modified at runtime
ldx #$93
ldy #$03
jsr compare ; if T00,S01,$93 ==
!byte $4C,00,$B8
bcs skipcheck
!byte $4C,$00,$B8
bcs .skipcheck
ldy #$03
jsr modify ; then set T00,S01,$93 =
!byte $AC,$E5,$B7
skipcheck
.skipcheck
;
; fake "found disk volume" in RWTS parameter table
@ -170,10 +171,10 @@ skipcheck
ldy #$02
jsr compare ; if T00,S05,$15 ==
!byte $A5,$2F
bcs protdos_exit
bcs .exit
ldy #$02
jsr modify ; then set T00,S05,$15 =
!byte $A9,00
!byte $A9,$00
;
; re-enable write mode if it was disabled
@ -182,34 +183,34 @@ skipcheck
ldx #$48
ldy #$19
jsr compare ; if T00,S07,$48 ==
!byte $A0,04,$48,$68,$A0,$B9,$BD,$88
!byte $A0,$04,$48,$68,$A0,$B9,$BD,$88
!byte $D0,$F8,$A9,$97,$20,$B8,$BD,$A9
!byte $97,$20,$B8,$BD,$A9,$97,$20,$B8
!byte $BD
bcs writeIsOK
bcs .writeIsOK
ldx #$4C
ldy #$01
jsr modify ; then set T00,S07,$4C =
!byte $20
writeIsOK
jmp protdos_exit
.writeIsOK
jmp .exit
; subroutines for getting (and erasing) the embedded
; 6-digit serial number and converting them to bytes
; for printing
serial
.serial
lda $FFFF ; modified at runtime
pha
lda #$B0
serialb
.serialb
sta $FFFF ; modified at runtime
pla
inc serial+1
inc serialb+1
inc .serial+1
inc .serialb+1
inc gPatchCount
rts
XA2byte
.XA2byte
and #$0F
sta tmp
txa
@ -220,4 +221,5 @@ XA2byte
ora tmp
rts
protdos_exit
.exit
}

View File

@ -3,28 +3,29 @@
; RWTS stores timing bits in $1E
; e.g. Spellicopter
;-------------------------------
!zone {
_rol1e
lda #$03
ldx #$00
ldy #$2F
jsr compare ; if T00,S03,$00 ==
!byte $86,$1B,$BA,$BD,02,01,$85,03
!byte $18,$69,04,$85,05,$A0,00,$84
!byte 02,$A0,$40,$84,04,$A0,$39,$A9
!byte $93,$91,02,$C8,$A5,03,$91,02
!byte $A0,$7F,$B1,04,$99,00,08,$88
!byte $10,$F8,$A6,$1B,$4C,00,08
bcs rol1e_exit
!byte $86,$1B,$BA,$BD,$02,$01,$85,$03
!byte $18,$69,$04,$85,$05,$A0,$00,$84
!byte $02,$A0,$40,$84,$04,$A0,$39,$A9
!byte $93,$91,$02,$C8,$A5,$03,$91,$02
!byte $A0,$7F,$B1,$04,$99,$00,$08,$88
!byte $10,$F8,$A6,$1B,$4C,$00,$08
bcs .exit
lda #$03
ldx #$40
ldy #$28
jsr compare ; and T00,S03,$40 ==
!byte $A9,00,$A0,$EC,$91,02,$C8,$91
!byte 02,$A9,09,$A0,$F1,$91,02,$A9
!byte 08,$A0,$E1,$91,02,$A9,$4C,$85
!byte 01,$A9,$93,$85,02,$20,01,00
!byte $A0,00,$84,02,$A5,$1E,$85,08
bcs rol1e_exit
!byte $A9,$00,$A0,$EC,$91,$02,$C8,$91
!byte $02,$A9,$09,$A0,$F1,$91,$02,$A9
!byte $08,$A0,$E1,$91,$02,$A9,$4C,$85
!byte $01,$A9,$93,$85,$02,$20,$01,$00
!byte $A0,$00,$84,$02,$A5,$1E,$85,$08
bcs .exit
lda #s_rol1e
jsr PrintByID
lda #$03
@ -32,4 +33,5 @@ _rol1e
ldy #$02
jsr modify ; then set T00,S03,$64 =
!byte $A9,$F7
rol1e_exit
.exit
}

View File

@ -5,48 +5,50 @@
; startup program after succeeding
; e.g. Microzine 15, Alpine Tram Ride
;-------------------------------
!zone {
_runhello
lda gIsProDOS ; this exact protection is only
beq runhello_exit ; on DOS 3.3 disks (other patchers
beq .exit ; on DOS 3.3 disks (other patchers
lda gIsPascal ; will catch other variations)
beq runhello_exit
beq .exit
lda #$0F
sta rhsector+1
rhsector lda #$FF ; modified at runtime
sta .sector+1
.sector lda #$FF ; modified at runtime
ldx #$04
ldy #$05
jsr compare
!byte $20,$E3,03,$85,$FB
!byte $20,$E3,$03,$85,$FB
bcc +
jmp rhnextsector
jmp .nextsector
+
lda rhsector+1
lda .sector+1
ldx #$19
ldy #$06
jsr compare
!byte $CA,$10,$F8,$8A,$48,$20
bcc +
jmp rhnextsector
jmp .nextsector
+
lda rhsector+1
lda .sector+1
ldx #$21
ldy #$06
jsr compare
!byte $A0,01,$B1,$FA,$AA,$20
!byte $A0,$01,$B1,$FA,$AA,$20
bcc +
jmp rhnextsector
jmp .nextsector
+
lda rhsector+1
lda .sector+1
sta gDisplayBytes
lda #s_runhello
jsr PrintByID
lda rhsector+1
lda .sector+1
ldx #$26
ldy #$01
jsr modify
!byte $2C
rhnextsector
dec rhsector+1
bmi runhello_exit
jmp rhsector
runhello_exit
.nextsector
dec .sector+1
bmi .exit
jmp .sector
.exit
}

View File

@ -2,598 +2,599 @@
; RWTS fixup #AP1R
; address prologue byte 1 (read)
;-------------------------------
!zone {
rwtspatcher
lda gIsRWTS ; if DOS 3.3 RWTS
bne ap1r
bne .ap1r
lda #$03
ldx #$4F
ldy #$06
jsr compare ; and T00,S03,$4F ==
!byte $BD,$8C,$C0,$10,$FB,$C9
bcs ap1r
bcs .ap1r
ldx #$56
ldy #$03
jsr compare ; and T00,S03,$56 ==
!byte $D0,$F0,$EA
bcs ap1r
bcs .ap1r
ldx #$55
ldy #$01
jsr compare ; and T00,S03,$55 !=
!byte $D5
bcc ap1r
bcc .ap1r
ldy #$01
jsr modify ; then set T00,S03,$55 =
!byte $D5
ap1r
.ap1r
;-------------------------------
; RWTS fixup #AP2R
; address prologue byte 2 (read)
;-------------------------------
lda gIsRWTS ; if DOS 3.3 RWTS
bne ap2r
bne .ap2r
lda #$03
ldx #$59
ldy #$06
jsr compare ; and T00,S03,$59 ==
!byte $BD,$8C,$C0,$10,$FB,$C9
bcs ap2r
bcs .ap2r
ldx #$60
ldy #$04
jsr compare ; and T00,S03,$60 ==
!byte $D0,$F2,$A0,$03
bcs ap2r
bcs .ap2r
ldx #$5F
ldy #$01
jsr compare ; and T00,S03,$5F !=
!byte $AA
bcc ap2r
bcc .ap2r
ldy #$01
jsr modify ; then set T00,S03,$5F =
!byte $AA
ap2r
.ap2r
;-------------------------------
; RWTS fixup #AP3R
; address prologue byte 3 (read)
;-------------------------------
lda gIsRWTS ; if DOS 3.3 RWTS
bne ap3r
bne .ap3r
lda #$03
ldx #$64
ldy #$06
jsr compare ; and T00,S03,$64 ==
!byte $BD,$8C,$C0,$10,$FB,$C9
bcs ap3r
bcs .ap3r
ldx #$6B
ldy #$02
jsr compare ; and T00,S03,$6B ==
!byte $D0,$E7
bcs ap3r
bcs .ap3r
ldx #$6A
ldy #$01
jsr compare ; and T00,S03,$6A !=
!byte $96
bcc ap3r
bcc .ap3r
ldy #$01
jsr modify ; then set T00,S03,$6A =
!byte $96
ap3r
.ap3r
;-------------------------------
; RWTS fixup #AE1R
; address epilogue byte 1 (read)
;-------------------------------
lda gIsRWTS ; if DOS 3.3 RWTS
bne ae1r
bne .ae1r
lda #$03
ldx #$8B
ldy #$06
jsr compare ; and T00,S03,$8B ==
!byte $BD,$8C,$C0,$10,$FB,$C9
bcs ae1r
bcs .ae1r
ldx #$92
ldy #$03
jsr compare ; and T00,S03,$92 ==
!byte $D0,$AE,$EA
bcs ae1r
bcs .ae1r
ldx #$91
ldy #$01
jsr compare ; and T00,S03,$91 !=
!byte $DE
bcc ae1r
bcc .ae1r
ldy #$01
jsr modify ; then set T00,S03,$91 =
!byte $DE
ae1r
.ae1r
;-------------------------------
; RWTS fixup #AE2R
; address epilogue byte 2 (read)
;-------------------------------
lda gIsRWTS ; if DOS 3.3 RWTS
bne ae2r
bne .ae2r
lda #$03
ldx #$95
ldy #$06
jsr compare ; and T00,S03,$95 ==
!byte $BD,$8C,$C0,$10,$FB,$C9
bcs ae2r
bcs .ae2r
ldx #$9C
ldy #$03
jsr compare ; and T00,S03,$9C ==
!byte $D0,$A4,$18
bcs ae2r
bcs .ae2r
ldx #$9B
ldy #$01
jsr compare ; and T00,S03,$9B !=
!byte $AA
bcc ae2r
bcc .ae2r
ldy #$01
jsr modify ; then set T00,S03,$9B =
!byte $AA
ae2r
.ae2r
;-------------------------------
; RWTS fixus #DP1R
; data prologue byte 1 (read)
;-------------------------------
lda gIsRWTS ; if DOS 3.3 RWTS
bne dp1r
bne .dp1r
lda #$02
ldx #$E1
ldy #$06
jsr compare ; and T00,S02,$E1 ==
!byte $BD,$8C,$C0,$10,$FB,$49
bcs dp1r
bcs .dp1r
ldx #$E8
ldy #$03
jsr compare ; and T00,S02,$E8 ==
!byte $D0,$F4,$EA
bcs dp1r
bcs .dp1r
ldx #$E7
ldy #$01
jsr compare ; and T00,S02,$E7 !=
!byte $D5
bcc dp1r
bcc .dp1r
ldy #$01
jsr modify ; then set T00,S02,$E7 =
!byte $D5
dp1r
.dp1r
;-------------------------------
; RWTS fixup #DP2R
; data prologue byte 2 (read)
;-------------------------------
lda gIsRWTS ; if DOS 3.3 RWTS
bne dp2r
bne .dp2r
lda #$02
ldx #$EB
ldy #$06
jsr compare ; and T00,S02,$EB ==
!byte $BD,$8C,$C0,$10,$FB,$C9
bcs dp2r
bcs .dp2r
ldx #$F2
ldy #$04
jsr compare ; and T00,S02,$F2 ==
!byte $D0,$F2,$A0,$56
bcs dp2r
bcs .dp2r
ldx #$F1
ldy #$01
jsr compare ; and T00,S02,$F1 !=
!byte $AA
bcc dp2r
bcc .dp2r
ldy #$01
jsr modify ; then set T00,S02,$F1 =
!byte $AA
dp2r
.dp2r
;-------------------------------
; RWTS fixup #DP3R
; data prologue byte 3 (read)
;-------------------------------
lda gIsRWTS ; if DOS 3.3 RWTS
bne dp3r
bne .dp3r
lda #$02
ldx #$F6
ldy #$06
jsr compare ; and T00,S02,$F6 ==
!byte $BD,$8C,$C0,$10,$FB,$C9
bcs dp3r
bcs .dp3r
ldx #$FD
ldy #$02
jsr compare ; and T00,S02,$FD ==
!byte $D0,$E7
bcs dp3r
bcs .dp3r
ldx #$FC
ldy #$01
jsr compare ; and T00,S02,$FC !=
!byte $AD
bcc dp3r
bcc .dp3r
ldy #$01
jsr modify ; then set T00,S02,$FC =
!byte $AD
dp3r
.dp3r
;-------------------------------
; RWTS fixup #DE1R
; data epilogue byte 1 (read)
;-------------------------------
lda gIsRWTS ; if DOS 3.3 RWTS
bne de1r
bne .de1r
lda #$03
ldx #$2F
ldy #$06
jsr compare ; and T00,S03,$2F ==
!byte $BD,$8C,$C0,$10,$FB,$C9
bcs de1r
bcs .de1r
ldx #$36
ldy #$03
jsr compare ; and T00,S03,$36 ==
!byte $D0,$0A,$EA
bcs de1r
bcs .de1r
ldx #$35
ldy #$01
jsr compare ; and T00,S03,$35 !=
!byte $DE
bcc de1r
bcc .de1r
ldy #$01
jsr modify ; then set T00,S03,$35 =
!byte $DE
de1r
.de1r
;-------------------------------
; RWTS fixup #DE2R
; data epilogue byte 2 (read)
;-------------------------------
lda gIsRWTS ; if DOS 3.3 RWTS
bne de2r
bne .de2r
lda #$03
ldx #$39
ldy #$06
jsr compare ; and T00,S03,$39 ==
!byte $BD,$8C,$C0,$10,$FB,$C9
bcs de2r
bcs .de2r
ldx #$40
ldy #$03
jsr compare ; and T00,S03,$40 ==
!byte $F0,$5C,$38
bcs de2r
bcs .de2r
ldx #$3F
ldy #$01
jsr compare ; and T00,S03,$3F !=
!byte $AA
bcc de2r
bcc .de2r
ldy #$01
jsr modify ; then set T00,S03,$3F =
!byte $AA
de2r
.de2r
;-------------------------------
; RWTS fixup #AP1W
; address prologue byte 1 (write)
;-------------------------------
lda gIsRWTS ; if DOS 3.3 RWTS
bne ap1w
bne .ap1w
lda #$06
ldx #$79
ldy #$01
jsr compare ; and T00,S06,$79 ==
!byte $A9
bcs ap1w
bcs .ap1w
ldx #$7B
ldy #$02
jsr compare ; and T00,S06,$7B ==
!byte $20,$D5
bcs ap1w
bcs .ap1w
ldx #$7A
ldy #$01
jsr compare ; and T00,S06,$7A !=
!byte $D5
bcc ap1w
bcc .ap1w
ldy #$01
jsr modify ; then set T00,S06,$7A =
!byte $D5
ap1w
.ap1w
;-------------------------------
; RWTS fixup #AP2W
; address prologue byte 2 (write)
;-------------------------------
lda gIsRWTS ; if DOS 3.3 RWTS
bne ap2w
bne .ap2w
lda #$06
ldx #$7E
ldy #$01
jsr compare ; and T00,S06,$7E ==
!byte $A9
bcs ap2w
bcs .ap2w
ldx #$80
ldy #$02
jsr compare ; and T00,S06,$80 ==
!byte $20,$D5
bcs ap2w
bcs .ap2w
ldx #$7F
ldy #$01
jsr compare ; and T00,S06,$7F !=
!byte $AA
bcc ap2w
bcc .ap2w
ldy #$01
jsr modify ; then set T00,S06,$7F =
!byte $AA
ap2w
.ap2w
;-------------------------------
; RWTS fixup #AP3W
; address prologue byte 3 (write)
;-------------------------------
lda gIsRWTS ; if DOS 3.3 RWTS
bne ap3w
bne .ap3w
lda #$06
ldx #$83
ldy #$01
jsr compare ; and T00,S06,$83 ==
!byte $A9
bcs ap3w
bcs .ap3w
ldx #$85
ldy #$02
jsr compare ; and T00,S06,$85 ==
!byte $20,$D5
bcs ap3w
bcs .ap3w
ldx #$84
ldy #$01
jsr compare ; and T00,S06,$84 !=
!byte $96
bcc ap3w
bcc .ap3w
ldy #$01
jsr modify ; then set T00,S06,$84 =
!byte $96
ap3w
.ap3w
;-------------------------------
; RWTS fixup #AE1W
; address epilogue byte 1 (write)
;-------------------------------
lda gIsRWTS ; if DOS 3.3 RWTS
bne ae1w
bne .ae1w
lda #$06
ldx #$AD
ldy #$01
jsr compare ; and T00,S06,$AD ==
!byte $A9
bcs ae1w
bcs .ae1w
ldx #$AF
ldy #$02
jsr compare ; and T00,S06,$AF ==
!byte $20,$D5
bcs ae1w
bcs .ae1w
ldx #$AE
ldy #$01
jsr compare ; and T00,S06,$AE !=
!byte $DE
bcc ae1w
bcc .ae1w
ldy #$01
jsr modify ; then set T00,S06,$AE =
!byte $DE
ae1w
.ae1w
;-------------------------------
; RWTS fixup #AE2W
; address epilogue byte 2 (write)
;-------------------------------
lda gIsRWTS ; if DOS 3.3 RWTS
bne ae2w
bne .ae2w
lda #$06
ldx #$B2
ldy #$01
jsr compare ; and T00,S06,$B2 ==
!byte $A9
bcs ae2w
bcs .ae2w
ldx #$B4
ldy #$02
jsr compare ; and T00,S06,$B4 ==
!byte $20,$D5
bcs ae2w
bcs .ae2w
ldx #$B3
ldy #$01
jsr compare ; and T00,S06,$B3 !=
!byte $AA
bcc ae2w
bcc .ae2w
ldy #$01
jsr modify ; then set T00,S06,$B3 =
!byte $AA
ae2w
.ae2w
;-------------------------------
; RWTS fixup #AE3W
; address epilogue byte 3 (write)
;-------------------------------
lda gIsRWTS ; if DOS 3.3 RWTS
bne ae3w
bne .ae3w
lda #$06
ldx #$B7
ldy #$01
jsr compare ; and T00,S06,$B7 ==
!byte $A9
bcs ae3w
bcs .ae3w
ldx #$B9
ldy #$02
jsr compare ; and T00,S06,$B9 ==
!byte $20,$D5
bcs ae3w
bcs .ae3w
ldx #$B8
ldy #$01
jsr compare ; and T00,S06,$B8 !=
!byte $EB
bcc ae3w
bcc .ae3w
ldy #$01
jsr modify ; then set T00,S06,$B8 =
!byte $EB
ae3w
.ae3w
;-------------------------------
; RWTS fixup #DP1W
; data prologue byte 1 (write)
;-------------------------------
lda gIsRWTS ; if DOS 3.3 RWTS
bne dp1w
bne .dp1w
lda #$02
ldx #$52
ldy #$01
jsr compare ; and T00,S02,$52 ==
!byte $A9
bcs dp1w
bcs .dp1w
ldx #$54
ldy #$02
jsr compare ; and T00,S02,$54 ==
!byte $20,$B8
bcs dp1w
bcs .dp1w
ldx #$53
ldy #$01
jsr compare ; and T00,S02,$53 !=
!byte $D5
bcc dp1w
bcc .dp1w
ldy #$01
jsr modify ; then set T00,S02,$53 =
!byte $D5
dp1w
.dp1w
;-------------------------------
; RWTS fixup #DP2W
; data prologue byte 2 (write)
;-------------------------------
lda gIsRWTS ; if DOS 3.3 RWTS
bne dp2w
bne .dp2w
lda #$02
ldx #$57
ldy #$01
jsr compare ; and T00,S02,$57 ==
!byte $A9
bcs dp2w
bcs .dp2w
ldx #$59
ldy #$02
jsr compare ; and T00,S02,$59 ==
!byte $20,$B8
bcs dp2w
bcs .dp2w
ldx #$58
ldy #$01
jsr compare ; and T00,S02,$58 ==
!byte $AA
bcc dp2w
bcc .dp2w
ldy #$01
jsr modify ; then set T00,S02,$58 =
!byte $AA
dp2w
.dp2w
;-------------------------------
; RWTS fixup #DP3W
; data prologue byte 3 (write)
;-------------------------------
lda gIsRWTS ; if DOS 3.3 RWTS
bne dp3w
bne .dp3w
lda #$02
ldx #$5C
ldy #$01
jsr compare ; and T00,S02,$5C ==
!byte $A9
bcs dp3w
bcs .dp3w
ldx #$5E
ldy #$02
jsr compare ; and T00,S02,$5E ==
!byte $20,$B8
bcs dp3w
bcs .dp3w
ldx #$5D
ldy #$01
jsr compare ; and T00,S02,$5D !=
!byte $AD
bcc dp3w
bcc .dp3w
ldy #$01
jsr modify ; then set T00,S02,$5D =
!byte $AD
dp3w
.dp3w
;-------------------------------
; RWTS fixup #DE1W
; data epilogue byte 1 (write)
;-------------------------------
lda gIsRWTS ; if DOS 3.3 RWTS
bne de1w
bne .de1w
lda #$02
ldx #$9D
ldy #$01
jsr compare ; and T00,S02,$9D ==
!byte $A9
bcs de1w
bcs .de1w
ldx #$9F
ldy #$02
jsr compare ; and T00,S02,$9F ==
!byte $20,$B8
bcs de1w
bcs .de1w
ldx #$9E
ldy #$01
jsr compare ; and T00,S02,$9E !=
!byte $DE
bcc de1w
bcc .de1w
ldy #$01
jsr modify ; then set T00,S02,$9E =
!byte $DE
de1w
.de1w
;-------------------------------
; RWTS fixup #DE2W
; data epilogue byte 2 (write)
;-------------------------------
lda gIsRWTS ; if DOS 3.3 RWTS
bne de2w
bne .de2w
lda #$02
ldx #$A2
ldy #$01
jsr compare ; and T00,S02,$A2 ==
!byte $A9
bcs de2w
bcs .de2w
ldx #$A4
ldy #$02
jsr compare ; and T00,S02,$A4 ==
!byte $20,$B8
bcs de2w
bcs .de2w
ldx #$A3
ldy #$01
jsr compare ; and T00,S02,$A3 !=
!byte $AA
bcc de2w
bcc .de2w
ldy #$01
jsr modify ; then set T00,S02,$A3 =
!byte $AA
de2w
.de2w
;-------------------------------
; RWTS fixup #DE3W
; data epilogue byte 3 (write)
;-------------------------------
lda gIsRWTS ; if DOS 3.3 RWTS
bne de3w
bne .de3w
lda #$02
ldx #$A7
ldy #$01
jsr compare ; and T00,S02,$A7 ==
!byte $A9
bcs de3w
bcs .de3w
ldx #$A9
ldy #$02
jsr compare ; and T00,S02,$A9 ==
!byte $20,$B8
bcs de3w
bcs .de3w
ldx #$A8
ldy #$01
jsr compare ; and T00,S02,$A8 !=
!byte $EB
bcc de3w
bcc .de3w
ldy #$01
jsr modify ; then set T00,S02,$A8 =
!byte $EB
de3w
.de3w
;-------------------------------
; RWTS fixup #DE4W
@ -601,27 +602,27 @@ de3w
; needed by some Sunburst disks
;-------------------------------
lda gIsRWTS ; if DOS 3.3 RWTS
bne de4w
bne .de4w
lda #$02
ldx #$AC
ldy #$01
jsr compare ; and T00,S02,$AC ==
!byte $A9
bcs de4w
bcs .de4w
ldx #$AE
ldy #$02
jsr compare ; and T00,S02,$AE ==
!byte $20,$B8
bcs de4w
bcs .de4w
ldx #$AD
ldy #$01
jsr compare ; and T00,S02,$AD !=
!byte $FF
bcc de4w
bcc .de4w
ldy #$01
jsr modify ; then set T00,S02,$AD =
!byte $FF
de4w
.de4w
;-------------------------------
; RWTS "LSR $6A" identification
@ -631,17 +632,17 @@ de4w
; log it)
;-------------------------------
lda gIsRWTS ; if DOS 3.3 RWTS
bne rwts_lsr6a
bne .lsr6a
lda #$03
ldx #$4F
ldy #$0A
jsr compare ; and T00,S03,$4F ==
!byte $BD,$8C,$C0,$10,$FB,$4A,$97,$6A,$D0,$EF
bcs rwts_lsr6a
bcs .lsr6a
lda #s_lsr6a
jsr PrintByID
inc gPatchCount
rwts_lsr6a
.lsr6a
;-------------------------------
; RWTS "CMP #$08 / BCS" identification
@ -651,14 +652,15 @@ rwts_lsr6a
; log it)
;-------------------------------
lda gIsRWTS ; if DOS 3.3 RWTS
bne rwts_bcs08
bne .bcs08
lda #$03
ldx #$8B
ldy #$15
jsr compare ; and T00,S03,$8B ==
!byte $BD,$8C,$C0,$10,$FB,$C9,$DE,$F0,$0A,$48,$68,$BD,$8C,$C0,$C9,08,$B0,$A5,$EA,$18,$60
bcs rwts_bcs08
!byte $BD,$8C,$C0,$10,$FB,$C9,$DE,$F0,$0A,$48,$68,$BD,$8C,$C0,$C9,$08,$B0,$A5,$EA,$18,$60
bcs .bcs08
lda #s_bcs08
jsr PrintByID
inc gPatchCount
rwts_bcs08
.bcs08
}

View File

@ -6,25 +6,26 @@
; fly
; e.g. Puzzle Master
;-------------------------------
!zone {
_rwtsswap
lda gIsBoot0 ; if DOS 3.3 boot0 loader
bne rwtsswap_exit
bne .exit
lda gIsBoot1 ; and DOS 3.3 boot1 loader
bne rwtsswap_exit
bne .exit
lda #$04
ldx #$69
ldy #$0B
jsr compare ; and T00,S04,$69 ==
!byte $A0,07,$B9,$DF,$BC,$99,$94,$B9
!byte $A0,$07,$B9,$DF,$BC,$99,$94,$B9
!byte $88,$10,$F7
bcs rwtsswap_exit
bcs .exit
lda #$04
ldx #$7F
ldy #$0B
jsr compare ; and T00,S04,$7F ==
!byte $A0,07,$B9,$E7,$BC,$99,$94,$B9
!byte $A0,$07,$B9,$E7,$BC,$99,$94,$B9
!byte $88,$10,$F7
bcs rwtsswap_exit
bcs .exit
lda #$04
ldx #$69
ldy #$01
@ -35,4 +36,5 @@ _rwtsswap
ldy #$01
jsr modify ; and set T00,S04,$7F =
!byte $60
rwtsswap_exit
.exit
}

View File

@ -6,9 +6,10 @@
; fly
; e.g. Mask Parade
;-------------------------------
!zone {
_rwtsswap2
lda gIsBoot0 ; if DOS 3.3 boot0 loader
bne rwtsswap2_exit
bne .exit
lda #$04
ldx #$69
ldy #$13
@ -16,7 +17,7 @@ _rwtsswap2
!byte $A9,$AB,$8D,$4B,$B8,$A9,$FF,$20
!byte $DF,$BC,$20,$EC,$BC,$A9,$AA,$8D
!byte $29,$BA,$60
bcs rwtsswap2_exit
bcs .exit
lda #$04
ldx #$7D
ldy #$15
@ -24,7 +25,7 @@ _rwtsswap2
!byte $A9,$FF,$8D,$4B,$B8,$A9,$DE,$20
!byte $DF,$BC,$A9,$AA,$20,$EC,$BC,$A9
!byte $96,$8D,$29,$BA,$60
bcs rwtsswap2_exit
bcs .exit
lda #$04
ldx #$69
ldy #$01
@ -35,4 +36,5 @@ _rwtsswap2
ldy #$01
jsr modify ; and set T00,S04,$7D =
!byte $60
rwtsswap2_exit
.exit
}

View File

@ -3,15 +3,17 @@
; post-boot RWTS swapper in MECC
; disks
;-------------------------------
!zone {
_rwtsswapmecc
ldy #$11
jsr SearchTrack
!byte $0A,$18,$69,$FF,$A8,$8D,$8B,$C0
!byte $8D,$8B,$C0,$B9,$97,$97,$8D,$AC
!byte $D5
bcs rwtsswapmecc_exit
bcs .exit
sta gDisplayBytes
ldy #$03
jsr modify
!byte $A9,00,$24
rwtsswapmecc_exit
!byte $A9,$00,$24
.exit
}

View File

@ -6,22 +6,23 @@
; NOTE: must be run before RWTS
; patchers due to overlapping bytes
;-------------------------------
!zone {
_sunburst
sec
lda gIsRWTS ; if DOS 3.3 RWTS
bne sunburst_exit
bne .exit
lda #$03
ldx #$40
ldy #$01
jsr compare ; and T00,S03,$40 ==
!byte $D0
bcs sunburst_exit
bcs .exit
lda #$03
ldx #$9C
ldy #$01
jsr compare ; and T00,S03,$9C ==
!byte $F0
bcs sunburst_exit
bcs .exit
lda #$04
ldx #$69
ldy #$2C
@ -32,22 +33,22 @@ _sunburst
!byte $11,$D0,03,$A9,02,$AC,$A9,$0E
!byte $8D,$C0,$BF,$68,$69,00,$48,$AD
!byte $78,04,$90,$2B
bcs sunburst_exit
bcs .exit
lda #$06
ldx #$69
ldy #$06
jsr compare ; and T00,S06,$69 ==
!byte $4C,$B8,$B6,$EA,$EA,$EA
bcs sunburst_exit
bcs .exit
lda #$08
ldx #$8C
ldy #$02
jsr compare ; and T00,S08,$8C ==
!byte $69,$BA
bcc sunburst_yes
sunburst_exit
bcs sunburst_exit2
sunburst_yes
bcc .yes
.exit
bcs .exit2
.yes
lda #$03
ldx #$40
ldy #$01
@ -68,4 +69,5 @@ sunburst_yes
ldy #$02
jsr modify ; and set T00,S08,$8C =
!byte $A0,$B9
sunburst_exit2
.exit2
}

View File

@ -7,36 +7,37 @@
; e.g. Thunder Mountain versions of
; Dig Dug, Pac-Man, Galaxian
;-------------------------------
!zone {
_thunder
lda gIsBoot0 ; if DOS 3.3 boot0 loader
bne thunder_no
bne .no
lda gIsBoot1 ; and DOS 3.3 boot1 loader
bne thunder_no
bne .no
lda #$03
ldx #$3E
ldy #$04
jsr compare ; and T00,S03,$3E ==
!byte $4C,$B3,$B6,$EA
bcc +
thunder_no
jmp thunder_exit
.no
jmp .exit
+
lda #$01
ldx #$47
ldy #$4C
jsr compare ; and T00,S01,$47 ==
!byte $4C
!byte $C1,$B3,$60,$48,$A9,02,$8D,$EC
!byte $B7,$A9,00,$8D,$EB,$B7,$8D,$F2
!byte $B7,$A9,05,$8D,$ED,$B7,$A9,$36
!byte $C1,$B3,$60,$48,$A9,$02,$8D,$EC
!byte $B7,$A9,$00,$8D,$EB,$B7,$8D,$F2
!byte $B7,$A9,$05,$8D,$ED,$B7,$A9,$36
!byte $8D,$F0,$B7,$A9,$B4,$8D,$F1,$B7
!byte $A9,01,$8D,$E1,$B7,$8D,$F4,$B7
!byte $20,$93,$B7,$90,09,$4C,$62,$FA
!byte $A9,$01,$8D,$E1,$B7,$8D,$F4,$B7
!byte $20,$93,$B7,$90,$09,$4C,$62,$FA
!byte $EA,$EA,$EA,$EA,$EA,$EA,$20,$36
!byte $B4,$68,$F0,03,$6C,$72,$AA,$6C
!byte $58,$9D,00,$A9,00,$F0,$BC,$A9
!byte 01,$D0,$B8
bcs thunder_exit
!byte $B4,$68,$F0,$03,$6C,$72,$AA,$6C
!byte $58,$9D,$00,$A9,$00,$F0,$BC,$A9
!byte $01,$D0,$B8
bcs .exit
lda #s_thunder
jsr PrintByID
lda #$01
@ -54,4 +55,5 @@ thunder_no
ldy #$04
jsr modify ; and set T00,S03,$3E =
!byte $C9,$AA,$F0,$5C
thunder_exit
.exit
}

View File

@ -6,62 +6,64 @@
; (invented by qkumba, see PoC||GTFO 0x11
; and 4am crack no. 655 Rocky's Boots 4.0)
;-------------------------------
_universale7
!zone {
universale7
lda #$0F
sta sector+1
sector lda #$FF ; modified at runtime
sta .sector+1
.sector lda #$FF ; modified at runtime
ldx #$A0
ldy #$60
jsr compare
!byte $AC,00,$AC,00,$AC,00,$AC,00
!byte $AC,00,$AC,00,$AC,00,$AC,00
!byte $AC,00,$AC,00,$AC,00,$AC,00
!byte $AC,00,$AC,00,$AC,00,$AC,00
!byte $AC,00,$AC,00,$AC,00,$AC,00
!byte $AC,00,$AC,00,$AC,00,$AC,00
!byte $AC,00,$AC,00,$AC,00,$AC,00
!byte $AC,00,$AC,00,$AC,00,$AC,00
!byte $AC,00,$AC,00,$AC,00,$AC,00
!byte $AC,00,$AC,00,$AC,00,$AC,00
!byte $AC,00,$AC,00,$AC,00,$AC,00
!byte $AC,00,$AC,00,$AC,00,$AC,00
!byte $AC,$00,$AC,$00,$AC,$00,$AC,$00
!byte $AC,$00,$AC,$00,$AC,$00,$AC,$00
!byte $AC,$00,$AC,$00,$AC,$00,$AC,$00
!byte $AC,$00,$AC,$00,$AC,$00,$AC,$00
!byte $AC,$00,$AC,$00,$AC,$00,$AC,$00
!byte $AC,$00,$AC,$00,$AC,$00,$AC,$00
!byte $AC,$00,$AC,$00,$AC,$00,$AC,$00
!byte $AC,$00,$AC,$00,$AC,$00,$AC,$00
!byte $AC,$00,$AC,$00,$AC,$00,$AC,$00
!byte $AC,$00,$AC,$00,$AC,$00,$AC,$00
!byte $AC,$00,$AC,$00,$AC,$00,$AC,$00
!byte $AC,$00,$AC,$00,$AC,$00,$AC,$00
bcc +
jmp e7nextsector
jmp .nextsector
+
lda sector+1
lda .sector+1
ldx #$00
ldy #$80
jsr compare
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
bcc +
jmp e7nextsector
jmp .nextsector
+
lda sector+1
lda .sector+1
sta gDisplayBytes
lda #s_e7
jsr PrintByID
lda sector+1
lda .sector+1
ldx #$A3
ldy #$0C
jsr modify
!byte $64,$B4,$44,$80,$2C,$DC,$18,$B4,$44,$80,$44,$B4
e7nextsector
dec sector+1
bmi universale7_exit
jmp sector
universale7_exit
.nextsector
dec .sector+1
bmi .exit
jmp .sector
.exit
}

View File

@ -46,8 +46,8 @@ SavePrefs
jsr ValidatePrefs
jsr SaveFile1Shot
!word PREFSFILE
!byte 04 ; text file
!byte 00,00 ; no aux file type
!byte $04 ; text file
!byte $00,$00 ; no aux file type
!word PREFSVER
!word PREFSWRITELEN
!word PREFSBUFFER
@ -67,49 +67,51 @@ SavePrefs
; C clear if all prefs were valid
; A,X clobbered
;-------------------------------
!zone {
ValidatePrefs
ldx #$00
lda PREFSVER
cmp #CURRENTVER
beq checkslot
beq .checkslot
lda #CURRENTVER
sta PREFSVER
lda #$FF
sta SLOT
sta DRIVE
inx
checkslot
.checkslot
lda SLOT
sec
sbc #$30
beq badslot
beq .badslot
cmp #$08
bcc checkdrive
badslot
bcc .checkdrive
.badslot
lda #DEFSLOT
sta SLOT
inx
checkdrive
.checkdrive
lda DRIVE
sec
sbc #$30
beq baddrive
beq .baddrive
cmp #$03
bcc checks6d1
baddrive
bcc .checks6d1
.baddrive
lda #DEFDRIVE
sta DRIVE
inx
checks6d1
.checks6d1
lda SLOT
cmp #$36
bne prefs_done
bne .done
lda DRIVE
cmp #$31
bne prefs_done
bne .done
lda #$32
sta DRIVE
inx
prefs_done
.done
cpx #$01 ; set carry if anything changed
rts
}

View File

@ -8,91 +8,92 @@ gDisplayBytes !fill 10 ; array of ten bytes for use as
; Print a string from the string table;
; handles string substitutions and
; auto-uppercases on older machines
; in A = string ID
; out C clear if string was printed
; in: A = string ID
; out: C clear if string was printed
; C set if string ID was invalid
; all other flags clobbered
; X register preserved, others clobbered
;-------------------------------
!zone {
PrintByID
stx x
stx .x
ldy #0 ; substitution mode flag
cmp #STRINGCOUNT
bcs error
bcs .error
asl
tax
lda StringTable,x
sta print+1
sta .print+1
lda StringTable+1,x
sta print+2
print
sta .print+2
.print
lda $FFFF ; modified at runtime
beq print_done
beq .done
cpy #0 ; are we in substitution mode?
beq nosub ; no -> branch
beq .nosub ; no -> branch
ldy #0
cmp #"t" ; "%t" = current track
bne sub1
bne .sub1
lda gTrack
bpl printbyte ; unconditional branch
sub1
bpl .printbyte ; unconditional branch
.sub1
cmp #"s" ; "%s" = current sector
bne sub2
bne .sub2
lda gSector
bpl printbyte ; unconditional branch
sub2
bpl .printbyte ; unconditional branch
.sub2
cmp #"S" ; write slot
bne sub3
bne .sub3
lda SLOT
bne printsd ; unconditional branch
sub3
bne .printsd ; unconditional branch
.sub3
cmp #"D" ; write drive
bne sub4
bne .sub4
lda DRIVE
printsd
.printsd
ora #$80
jsr PrintA
bvc next ; unconditional branch
sub4
bvc .next ; unconditional branch
.sub4
cmp #"0" ; "%0" through "%9"
bcc nosub
bcc .nosub
cmp #":"
bcs nosub
bcs .nosub
sec
sbc #"0"
tax
lda gDisplayBytes,x
printbyte
.printbyte
jsr PrintByte
bvc next ; unconditional branch
nosub
bvc .next ; unconditional branch
.nosub
cmp #"%"
bne stillnosub
bne .stillnosub
iny ; switch to substitution mode
bne next ; (next character will be interpreted)
stillnosub
bne .next ; (next character will be interpreted)
.stillnosub
cmp #$E1
bcc noforce
bcc .noforce
and kForceLower
noforce
.noforce
jsr COUT
next
inc print+1
bne print
inc print+2
bne print
print_done
.next
inc .print+1
bne .print
inc .print+2
bne .print
.done
clc
error
ldx x
.error
ldx .x
rts
x !byte 00
.x !byte 00
;-------------------------------
; PrintByte
; print a hexadecimal byte
; in A contains byte to print
; out all registers preserved
; in: A contains byte to print
; out: all registers preserved
; all flags clobbered
; @tmpa clobbered
; @tmpx clobbered
@ -112,8 +113,8 @@ PrintByte
;-------------------------------
; PrintA
; print a single character through COUT
; in A contains character to print
; out all registers preserved
; in: A contains character to print
; out: all registers preserved
; all flags clobbered
; @tmpa clobbered
; @tmpx clobbered
@ -136,40 +137,41 @@ PrintA
ClearScreen
jsr TEXT
lda $C061
bpl home
bpl .home
lda $C062
bpl home
begin
bpl .home
.begin
ldx #$04
stx counter
stx loop+2
stx change+2
stx .loop+2
stx .change+2
ldy #$00
sty flag
loop
.loop
lda $FF00,y ; modified at runtime
cmp #$A0
beq nochange
bcs down
beq .nochange
bcs .down
clc
adc #$01
bne change
down
bne .change
.down
sec
sbc #$01
change
.change
sta $FF00,y ; modified at runtime
sta flag
nochange
.nochange
iny
bne loop
inc loop+2
inc change+2
bne .loop
inc .loop+2
inc .change+2
dec counter
bne loop
bne .loop
lda #$01
jsr WAIT
lda flag
bne begin
home
bne .begin
.home
jmp HOME
}

View File

@ -37,39 +37,41 @@ endread
; nibble is stored in zp$4E and varies based on track
; and sector.
;
!zone {
_protread
lda gTrack ; T02,S05+ use "protected" mode
cmp #$03 ; (altered data prologue and
bcs protected ; nibble translate table)
bcs .protected ; nibble translate table)
cmp #$02 ; T00,S00 - T02,S04 use
bcc standard ; "standard" mode
bcc .standard ; "standard" mode
lda gSector
cmp #$05
bcs protected
standard
bcs .protected
.standard
lda #$9B
sta $BF2C
bne go ; unconditional branch
protected
bne .go ; unconditional branch
.protected
lda #$B5
sta $4E
lda #$D5
sta $BF2C ; execution falls through here
go
.go
lda #<gRWTSParams
ldy #>gRWTSParams
jsr $BA00 ; note non-standard entry point
bcc endprotread
lda gOnAClearDayYouCanReadForever
beq go
beq .go
endprotread
rts
}
gRWTSParams ; used to read each sector
!byte 01,$60,01,00
gTrack !byte 00
gSector !byte 00
!byte $01,$60,$01,$00
gTrack !byte $00
gSector !byte $00
!word dct
gAddress !word $1F00
!byte 00,00,01,00,$FE,$60,01,00,00
dct !byte 00,01,$EF,$D8,00
!byte $00,$00,$01,$00,$FE,$60,$01,$00,$00
dct !byte $00,$01,$EF,$D8,$00

View File

@ -1,20 +1,22 @@
!zone {
InitSectorMap
lda #<sectormap
sta B+1
sta .B+1
lda #>sectormap
sta B+2
sta .B+2
lda #$FF
ldx #$22
A ldy #$0F
B sta $FFFF
inc B+1
.A ldy #$0F
.B sta $FFFF
inc .B+1
bne +
inc B+2
inc .B+2
+ dey
bpl B
bpl .B
dex
bpl A
bpl .A
rts
}
;-------------------------------
; This is a map of how much we care about each sector
@ -31,7 +33,7 @@ B sta $FFFF
; 80 = sector is optional -- read, but ignore any errors
; FE = sector is required, and switch to the built-in RWTS
; after reading it (if we haven't already)
; $FF = sector is required -- read, and any error is fatal
; FF = sector is required -- read, and any error is fatal
; (this is the default value for all sectors)
;-------------------------------
sectormap

View File

@ -10,65 +10,69 @@ DiskIIArray
; all flags clobbered
; DiskIIArray filled with 00 or FF
;-------------------------------
!zone {
ScanForDiskII
lda #$00
sta cmp1
ldx #$07
fingerprint
.fingerprint
txa
ora #$C0
sta cmp1+1
ldy #$01
lda (cmp1),y
cmp #$20
bne slots_next
bne .next
ldy #$03
lda (cmp1),y
bne slots_next
bne .next
ldy #$05
lda (cmp1),y
cmp #$03
bne slots_next
bne .next
ldy #$FF
lda (cmp1),y
bne slots_next
bne .next
tya
sta DiskIIArray-1,x
slots_next
.next
dex
bne fingerprint
bne .fingerprint
rts
}
;-------------------------------
; NextSlot
;-------------------------------
!zone {
NextSlot
lda DRIVE
cmp #$31
bne incslot
bne .incslot
lda #$32
sta DRIVE
bne slots_done ; unconditional branch
incslot
bne .done ; unconditional branch
.incslot
lda #$31
sta DRIVE
inc SLOT
lda SLOT
cmp #$38
bne nowrap
bne .nowrap
lda #$31
sta SLOT
nowrap
.nowrap
sec
sbc #$30
tax
lda DiskIIArray-1,x
beq incslot
slots_done
beq .incslot
.done
lda SLOT
cmp #$36
bne reallydone
bne .reallydone
lda #$32
sta DRIVE
reallydone
.reallydone
rts
}

View File

@ -1,6 +1,6 @@
;
; Main menu keys
; (should match the text in mainmenu below)
; (should match the text in .mainmenu below)
; (these are NOT case-sensitive)
;
!ct "lcase.ct"
@ -85,75 +85,76 @@ s_bytrack = $42
s_a5count = $43
STRINGCOUNT = $44
!zone {
StringTable
!word header
!word mainmenu
!word progbar
!word reading
!word diskrwts
!word bb00
!word sunburst
!word optimum
!word builtin
!word switch
!word writing
!word unformat
!word f7
!word sync
!word optbad
!word passver
!word passdemuf
!word passcrack
!word passcrack0
!word fail
!word fatal0000
!word fatal220f
!word done
!word noslot6
!word writeerr
!word writeioerr
!word writenodev
!word writeprot
!word othermli
!word canttrace
!word canceled
!word bademu
!word reset
!word smodify
!word modifyto
!word dosboot0
!word prodosboot0
!word pascalboot0
!word meccboot0
!word sierra
!word a6bc95
!word jmpbcf0
!word rol1e
!word runhello
!word e7
!word jmpb4bb
!word jmpb400
!word jmpbeca
!word jsrbb03
!word thunder
!word jmpae8e
!word diskvol
!word d5d5f7
!word meccm7
!word datasoftb0
!word datasoft
!word lsr6a
!word bcs08
!word jmpb660
!word protdos
!word protdosw
!word protserial
!word fbff
!word encoded44
!word encoded53
!word specdel
!word bytrack
!word a5count
!word .header
!word .mainmenu
!word .progbar
!word .reading
!word .diskrwts
!word .bb00
!word .sunburst
!word .optimum
!word .builtin
!word .switch
!word .writing
!word .unformat
!word .f7
!word .sync
!word .optbad
!word .passver
!word .passdemuf
!word .passcrack
!word .passcrack0
!word .fail
!word .fatal0000
!word .fatal220f
!word .done
!word .noslot6
!word .writeerr
!word .writeioerr
!word .writenodev
!word .writeprot
!word .othermli
!word .canttrace
!word .canceled
!word .bademu
!word .reset
!word .modify
!word .modifyto
!word .dosboot0
!word .prodosboot0
!word .pascalboot0
!word .meccboot0
!word .sierra
!word .a6bc95
!word .jmpbcf0
!word .rol1e
!word .runhello
!word .e7
!word .jmpb4bb
!word .jmpb400
!word .jmpbeca
!word .jsrbb03
!word .thunder
!word .jmpae8e
!word .diskvol
!word .d5d5f7
!word .meccm7
!word .datasoftb0
!word .datasoft
!word .lsr6a
!word .bcs08
!word .jmpb660
!word .protdos
!word .protdosw
!word .protserial
!word .fbff
!word .encoded44
!word .encoded53
!word .specdel
!word .bytrack
!word .a5count
;
; Text can contain substitution strings, which
; are replaced by current values at runtime. Each
@ -167,7 +168,7 @@ StringTable
;
; Substitution strings are case-sensitive.
;
; Supported substitution strings
; Supported substitution strings:
; %S destination (write) slot
; %D destination (write) drive
; %t current track (during read and patch)
@ -178,9 +179,9 @@ StringTable
; These are stored in the gDisplayBytes array and
; can be set directly before calling PrintByID.
;
header
!text "Passport by 4am 2017-01-17",00
mainmenu
.header
!text "Passport by 4am 2017-01-23",00
.mainmenu
!text "________________________________________",$8D,$8D,$8D,$8D,$8D,$8D,$8D
!text " "
!scrxor $40, "V"
@ -197,47 +198,47 @@ mainmenu
!text "source: S6,D1 target: "
!scrxor $40, "S"
!text "%S,D%D",00
progbar
.progbar
!byte $8D
!text " ______________________________________",$8D
!text " "
!scrxor $00, " "
!text "____________________________________"
!scrxor $00, " ",$8D,$8D,$8D,00
reading
.reading
!text "Reading from S6,D1",$8D,00
diskrwts
.diskrwts
!text "Using disk's own RWTS",$8D,00
bb00
.bb00
!text "T00,S05 Found $BB00 protection check",$8D
!text "T00,S0A might be unreadable",$8D,00
sunburst
.sunburst
!text "T00,S04 Found Sunburst disk",$8D
!text "T11,S0F might be unreadable",$8D,00
optimum
.optimum
!text "T00,S00 Found Optimum Resource disk",$8D
!text "T01,S0F might be unreadable",$8D,00
builtin
.builtin
!text "Using built-in RWTS",$8D,00
switch
.switch
!text "Switching to built-in RWTS",$8D,00
writing
.writing
!text "Writing to S%S,D%D",$8D,00
unformat
.unformat
!text "T%t is unformatted",$8D,00
f7
.f7
!text "T%t Found $F7F6EFEEAB protection",$8D,00
sync
.sync
!text "T%t Found nibble count protection",$8D,00
optbad
.optbad
!text "T%t,S%s is unreadable (ignoring)",$8D,00
passver
.passver
!text "Verification complete. The disk is good.",00
passdemuf
.passdemuf
!text "Demuffin complete.",$8D,00
passcrack
.passcrack
!text "Crack complete.",$8D,00
passcrack0
.passcrack0
!byte $8D
!text "The disk was copied successfully, but",$8D
!text "Passport did not apply any patches.",$8D,$8D
@ -246,38 +247,38 @@ passcrack0
!text "- The target disk works without patches."
!text "- The disk uses an unknown protection,",$8D
!text " and Passport can not help any further.",00
fail
.fail
!byte $8D
!text "T%t,S%s Fatal read error",$8D,00
fatal0000
.fatal0000
!byte $8D
!text "Possible reasons:",$8D
!text "- There is no disk in S6,D1.",$8D
!text "- It is not an Apple ][ disk.",$8D
!text "- The disk is DOS 3.2-only.",$8D
!text "- The disk is unformatted.",$8D,00
fatal220f
.fatal220f
!byte $8D
!text "Passport does not work on this disk.",$8D,$8D
!text "Possible reasons:",$8D
!text "- This is not a 16-sector disk.",$8D
!text "- The disk modifies its RWTS in ways",$8D
!text " that Passport is not able to detect.",$8D,00
done
.done
!byte $8D
!text "Press any key to continue "
!scrxor $40, " ",00
noslot6
.noslot6
!text "Passport requires a Disk II drive in S6.",$8D
!text "Press any key to quit "
!scrxor $40, " ",00
writeerr
.writeerr
!byte $8D
!text "T%t Fatal write error",$8D,$8D,00
;
; MLI error $27
;
writeioerr
.writeioerr
!text "Possible reasons:",$8D
!text "- There is no disk in S%S,D%D.",$8D
!text "- The disk has bad sectors.",$8D
@ -285,118 +286,119 @@ writeioerr
;
; MLI error $28
;
writenodev
.writenodev
!text "S%S,D%D does not exist.",$8D,00
;
; MLI error $2B
;
writeprot
.writeprot
!text "The disk in S%S,D%D is write-protected.",$8D,00
;
; other MLI error
;
othermli
.othermli
!text "MLI error $%0.",$8D
!text "Please contact the developer.",$8D,00
canttrace
.canttrace
!text "Unrecognized drive, tracing is disabled",$8D,00
canceled
.canceled
!text "Canceled at your request.",$8D,00
bademu
.bademu
!byte 00
reset
.reset
!byte $8D
!text "Press <Ctrl-Reset> to continue.",$8D,00
smodify
.modify
!text "T%t,S%0,$%1: ",00
modifyto
.modifyto
!text " -> ",00
dosboot0
.dosboot0
!text "T00,S00 Found DOS 3.3 bootloader",$8D,00
prodosboot0
.prodosboot0
!text "T00,S00 Found ProDOS bootloader",$8D,00
pascalboot0
.pascalboot0
!text "T00,S00 Found Pascal bootloader",$8D,00
meccboot0
.meccboot0
!text "T00 Found MECC M8 bootloader",$8D,00
sierra
.sierra
!text "T%t,S%0 Found Sierra protection check",$8D,00
a6bc95
.a6bc95
!text "T%t,S%0 Found A6BC95 protection check",$8D,00
jmpbcf0
.jmpbcf0
!text "T00,S03 RWTS requires a timing bit after"
!text "the first data epilogue by jumping to",$8D
!text "$BCF0.",$8D,00
rol1e
.rol1e
!text "T00,S03 RWTS accumulates timing bits in",$8D
!text "$1E and checks its value later.",$8D,00
runhello
.runhello
!text "T%t,S%0 Startup program executes a",$8D
!text "protection check before running the real"
!text "startup program.",$8D,00
e7
.e7
!text "T%t,S%0 Found E7 bitstream",$8D,00
jmpb4bb
.jmpb4bb
!text "T00,S0C Disk calls a protection check at"
!text "$B4BB before initializing DOS.",$8D,00
jmpb400
.jmpb400
!text "T00,S01 Disk calls a protection check at"
!text "$B400 before initializing DOS.",$8D,00
jmpbeca
.jmpbeca
!text "T00,S02 RWTS requires extra nibbles and",$8D
!text "timing bits after the data prologue by",$8D
!text "jumping to $BECA.",$8D,00
jsrbb03
.jsrbb03
!text "T00,S05 Found a self-decrypting",$8D
!text "protection check at $BB03.",$8D,00
thunder
.thunder
!text "T00,S03 RWTS counts timing bits and",$8D
!text "checks them later.",$8D,00
jmpae8e
.jmpae8e
!text "T00,S0D Disk calls a protection check at"
!text "$AE8E after initializing DOS.",$8D,00
diskvol
.diskvol
!text "T00,S08 RWTS requires a non-standard",$8D
!text "disk volume number.",$8D,00
d5d5f7
.d5d5f7
!text "T%t,S%0 Found D5D5F7 protection check",$8D,00
meccm7
.meccm7
!text "T00 Found MECC M7 bootloader",$8D,00
datasoftb0
.datasoftb0
!text "T00,S00 Found Datasoft bootloader",$8D,00
datasoft
.datasoft
!text "T%t,S%0 Found Datasoft protection check",$8D,00
lsr6a
.lsr6a
!text "T00,S03 RWTS accepts $D4 or $D5 for the",$8D
!text "first address prologue nibble.",$8D,00
bcs08
.bcs08
!text "T00,S03 RWTS accepts $DE or a timing bit"
!text "for the first address epilogue nibble.",$8D,00
jmpb660
.jmpb660
!text "T00,S02 RWTS requires timing bits after",$8D
!text "the data prologue by jumping to $B660.",$8D,00
protdos
.protdos
!text "T00,S01 Found encrypted RWTS, key=$%0",$8D,00
protdosw
.protdosw
!text "T00 Decrypting RWTS before writing",$8D,00
protserial
.protserial
!text "T%t,S%3 Erasing serial number %0%1%2",$8D,00
fbff
.fbff
!text "T%t,S%0 Found FBFF protection check",$8D,00
encoded44
.encoded44
!byte $8D
!text "T00,S00 Fatal error",$8D,$8D
!text "Passport does not work on this disk,",$8D
!text "because it uses a 4-and-4 encoding.",$8D,00
encoded53
.encoded53
!byte $8D
!text "T00,S00 Fatal error",$8D,$8D
!text "Passport does not work on this disk,",$8D
!text "because it uses a 5-and-3 encoding.",$8D,00
specdel
.specdel
!text "T00,S00 Found DOS 3.3P bootloader",$8D,00
bytrack
.bytrack
!text "T%t,S%0 RWTS changes based on track",$8D,$00
a5count
.a5count
!text "T%t,S%0 Found A5 nibble count",$8D,$00
}

View File

@ -28,75 +28,75 @@
!fill 256-(* & 255), 0
}
universalrwts
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,$a0,00,$a2,$56,$ca,$30
!byte $fb,$b9,00,$bb,$5e,00,$bc,$2a
!byte $5e,00,$bc,$2a,$91,$3e,$c8,$c4
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$a0,$00,$a2,$56,$ca,$30
!byte $fb,$b9,$00,$bb,$5e,$00,$bc,$2a
!byte $5e,$00,$bc,$2a,$91,$3e,$c8,$c4
!byte $26,$d0,$eb,$60,$a0,$20,$88,$f0
!byte $61,$bd,$8c,$c0,$10,$fb,$49,$d5
!byte $d0,$f4,$ea,$bd,$8c,$c0,$10,$fb
!byte $c9,$aa,$d0,$f2,$a0,$56,$bd,$8c
!byte $c0,$10,$fb,$c9,$ad,$d0,$e7,$a9
!byte 00,$88,$84,$26,$bc,$8c,$c0,$10
!byte $fb,$59,00,$ba,$a4,$26,$99,00
!byte $00,$88,$84,$26,$bc,$8c,$c0,$10
!byte $fb,$59,$00,$ba,$a4,$26,$99,$00
!byte $bc,$d0,$ee,$84,$26,$bc,$8c,$c0
!byte $10,$fb,$59,00,$ba,$a4,$26,$99
!byte 00,$bb,$c8,$d0,$ee,$bc,$8c,$c0
!byte $10,$fb,$d9,00,$ba,$d0,$13,$18
!byte $60,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,$38,$60,$a0,$fc,$84,$26
!byte $c8,$d0,04,$e6,$26,$f0,$f3,$bd
!byte $10,$fb,$59,$00,$ba,$a4,$26,$99
!byte $00,$bb,$c8,$d0,$ee,$bc,$8c,$c0
!byte $10,$fb,$d9,$00,$ba,$d0,$13,$18
!byte $60,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$38,$60,$a0,$fc,$84,$26
!byte $c8,$d0,$04,$e6,$26,$f0,$f3,$bd
!byte $8c,$c0,$10,$fb,$4a,$c9,$6a,$d0
!byte $ef
_B959 !byte $bd
_B95A !byte $8c,$c0,$c9,$d5,$f0,$36
!byte $bd,$8c,$c0,$10,$fb,$c9,$aa,$d0
!byte $df,$bd,$8c,$c0,$10,$fb,$c9,$96
!byte $d0,$d6,$a0,03,$a9,00,$85,$27
!byte $d0,$d6,$a0,$03,$a9,$00,$85,$27
!byte $bd,$8c,$c0,$10,$fb,$2a,$85,$26
!byte $bd,$8c,$c0,$10,$fb,$25,$26,$99
!byte $2c,00,$45,$27,$88,$10,$e7,$a8
!byte $d0,00,$18,$60,$38,$60,$8D,$9B
!byte $B9,$F0,$D7,00,00,00,$18,$60
!byte $2c,$00,$45,$27,$88,$10,$e7,$a8
!byte $d0,$00,$18,$60,$38,$60,$8D,$9B
!byte $B9,$F0,$D7,$00,$00,$00,$18,$60
!byte $86,$2b,$85,$2a,$cd,$78,$04,$f0
!byte $53,$a9,00,$85,$26,$ad,$78,04
!byte $53,$a9,$00,$85,$26,$ad,$78,$04
!byte $85,$27,$38,$e5,$2a,$f0,$33,$b0
!byte 07,$49,$ff,$ee,$78,04,$90,05
!byte $69,$fe,$ce,$78,04,$c5,$26,$90
!byte 02,$a5,$26,$c9,$0c,$b0,01,$a8
!byte $07,$49,$ff,$ee,$78,$04,$90,$05
!byte $69,$fe,$ce,$78,$04,$c5,$26,$90
!byte $02,$a5,$26,$c9,$0c,$b0,$01,$a8
!byte $38,$20,$ee,$b9,$b9,$11,$ba,$20
!byte 00,$ba,$a5,$27,$18,$20,$f1,$b9
!byte $b9,$1d,$ba,$20,00,$ba,$e6,$26
!byte $d0,$c3,$20,00,$ba,$18,$ad,$78
!byte 04,$29,03,$2a,05,$2b,$aa,$bd
!byte $00,$ba,$a5,$27,$18,$20,$f1,$b9
!byte $b9,$1d,$ba,$20,$00,$ba,$e6,$26
!byte $d0,$c3,$20,$00,$ba,$18,$ad,$78
!byte $04,$29,$03,$2a,$05,$2b,$aa,$bd
!byte $80,$c0,$a6,$2b,$60,$aa,$a0,$a0
nibtable !byte $a2,$11,$ca,$d0,$fd,$e6,$46,$d0
!byte 02,$e6,$47,$38,$e9,01,$d0,$f0
!byte $60,01,$30,$28,$24,$20,$1e,$1d
!byte $02,$e6,$47,$38,$e9,$01,$d0,$f0
!byte $60,$01,$30,$28,$24,$20,$1e,$1d
!byte $1c,$1c,$1c,$1c,$1c,$70,$2c,$26
!byte $22,$1f,$1e,$1d,$1c,$1c,$1c,$1c
!byte $1c,$96,$97,$9a,$9b,$9d,$9e,$9f
@ -107,17 +107,17 @@ nibtable !byte $a2,$11,$ca,$d0,$fd,$e6,$46,$d0
!byte $de,$df,$e5,$e6,$e7,$e9,$ea,$eb
!byte $ec,$ed,$ee,$ef,$f2,$f3,$f4,$f5
!byte $f6,$f7,$f9,$fa,$fb,$fc,$fd,$fe
!byte $ff,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte $ff,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
; these $FF bytes (at $BA80..$BA94) are used by the
; routine that checks whether a track is formatted
!byte $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff
!byte $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff
!byte $ff,$ff,$ff,$ff,$ff,$ff,00,01
!byte $98,$99,02,03,$9c,04,05,06
!byte $a0,$a1,$a2,$a3,$a4,$a5,07,08
!byte $a8,$a9,$aa,09,$0a,$0b,$0c,$0d
!byte $ff,$ff,$ff,$ff,$ff,$ff,$00,$01
!byte $98,$99,$02,$03,$9c,$04,$05,$06
!byte $a0,$a1,$a2,$a3,$a4,$a5,$07,$08
!byte $a8,$a9,$aa,$09,$0a,$0b,$0c,$0d
!byte $b0,$b1,$0e,$0f,$10,$11,$12,$13
!byte $b8,$14,$15,$16,$17,$18,$19,$1a
!byte $c0,$c1,$c2,$c3,$c4,$c5,$c6,$c7
@ -130,163 +130,163 @@ nibtable !byte $a2,$11,$ca,$d0,$fd,$e6,$46,$d0
!byte $f8,$39,$3a,$3b,$3c,$3d,$3e
nibtableff
!byte $3f
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte $84,$48,$85,$49,$a0,02,$8c,$f8
!byte 06,$a0,04,$8c,$f8,04,$a0,01
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $84,$48,$85,$49,$a0,$02,$8c,$f8
!byte $06,$a0,$04,$8c,$f8,$04,$a0,$01
!byte $b1,$48,$aa,$a0,$0f,$d1,$48,$f0
!byte $1b,$8a,$48,$b1,$48,$aa,$68,$48
!byte $91,$48,$bd,$8e,$c0,$a0,08,$bd
!byte $91,$48,$bd,$8e,$c0,$a0,$08,$bd
!byte $8c,$c0,$dd,$8c,$c0,$d0,$f6,$88
!byte $d0,$f8,$68,$aa,$bd,$8e,$c0,$bd
!byte $8c,$c0,$a0,08,$bd,$8c,$c0,$48
!byte $68,$48,$68,$8e,$f8,05,$dd,$8c
!byte $c0,$d0,03,$88,$d0,$ee,08,$bd
!byte $89,$c0,$a0,06,$b1,$48,$99,$36
!byte 00,$c8,$c0,$0a,$d0,$f6,$a0,03
!byte $b1,$3c,$85,$47,$a0,02,$b1,$48
!byte $a0,$10,$d1,$48,$f0,06,$91,$48
!byte $28,$a0,00,08,$6a,$90,05,$bd
!byte $8a,$c0,$b0,03,$bd,$8b,$c0,$66
!byte $35,$28,$08,$d0,$0b,$a0,07,$20
!byte 00,$ba,$88,$d0,$fa,$ae,$f8,05
!byte $a0,04,$b1,$48,$20,$5a,$be,$28
!byte $8c,$c0,$a0,$08,$bd,$8c,$c0,$48
!byte $68,$48,$68,$8e,$f8,$05,$dd,$8c
!byte $c0,$d0,$03,$88,$d0,$ee,$08,$bd
!byte $89,$c0,$a0,$06,$b1,$48,$99,$36
!byte $00,$c8,$c0,$0a,$d0,$f6,$a0,$03
!byte $b1,$3c,$85,$47,$a0,$02,$b1,$48
!byte $a0,$10,$d1,$48,$f0,$06,$91,$48
!byte $28,$a0,$00,$08,$6a,$90,$05,$bd
!byte $8a,$c0,$b0,$03,$bd,$8b,$c0,$66
!byte $35,$28,$08,$d0,$0b,$a0,$07,$20
!byte $00,$ba,$88,$d0,$fa,$ae,$f8,$05
!byte $a0,$04,$b1,$48,$20,$5a,$be,$28
!byte $d0,$11,$a4,$47,$10,$0d,$a0,$12
!byte $88,$d0,$fd,$e6,$46,$d0,$f7,$e6
!byte $47,$d0,$f3,$a0,$0c,$b1,$48,$f0
!byte $5a,$c9,04,$f0,$58,$6a,08,$b0
!byte 03,$20,00,$b8,$a0,$30,$8c,$78
!byte 05,$ae,$f8,05,$20,$44,$b9,$90
!byte $24,$ce,$78,05,$10,$f3,$ad,$78
!byte 04,$48,$a9,$60,$20,$95,$be,$ce
!byte $f8,06,$f0,$28,$a9,$04,$8d,$f8
!byte 04,$a9,00,$20,$5a,$be,$68,$20
!byte $5a,$c9,$04,$f0,$58,$6a,$08,$b0
!byte $03,$20,$00,$b8,$a0,$30,$8c,$78
!byte $05,$ae,$f8,$05,$20,$44,$b9,$90
!byte $24,$ce,$78,$05,$10,$f3,$ad,$78
!byte $04,$48,$a9,$60,$20,$95,$be,$ce
!byte $f8,$06,$f0,$28,$a9,$04,$8d,$f8
!byte $04,$a9,$00,$20,$5a,$be,$68,$20
!byte $5a,$be,$4c,$bc,$bd,$a4,$2e,$cc
!byte $78,04,$f0,$1c,$ad,$78,04,$48
!byte $98,$20,$95,$be,$68,$ce,$f8,04
!byte $78,$04,$f0,$1c,$ad,$78,$04,$48
!byte $98,$20,$95,$be,$68,$ce,$f8,$04
!byte $d0,$e5,$f0,$ca,$68,$a9,$40,$28
!byte $4c,$48,$be,$f0,$39,$4c,$af,$be
!byte $a0,03,$b1,$48,$48,$a5,$2f,$a0
!byte $0e,$91,$48,$68,$f0,08,$c5,$2f
!byte $f0,04,$a9,$20,$d0,$e1,$a0,05
!byte $a0,$03,$b1,$48,$48,$a5,$2f,$a0
!byte $0e,$91,$48,$68,$f0,$08,$c5,$2f
!byte $f0,$04,$a9,$20,$d0,$e1,$a0,$05
!byte $b1,$48,$a8,$b9,$b8,$bf,$c5,$2d
!byte $d0,$97,$28,$90,$1c,$20,$dc,$b8
!byte 08,$b0,$8e,$28,$a2,00,$86,$26
!byte $20,$c2,$b8,$ae,$f8,05,$18,$24
!byte $08,$b0,$8e,$28,$a2,$00,$86,$26
!byte $20,$c2,$b8,$ae,$f8,$05,$18,$24
!byte $38,$a0,$0d,$91,$48,$bd,$88,$c0
!byte $60,$20,$2a,$b8,$90,$f0,$a9,$10
!byte $b0,$ee,$48,$a0,01,$b1,$3c,$6a
!byte $68,$90,08,$0a,$20,$6b,$be,$4e
!byte $78,04,$60,$85,$2a,$20,$8e,$be
!byte $b9,$78,04,$24,$35,$30,03,$b9
!byte $f8,04,$8d,$78,$04,$a5,$2a,$24
!byte $35,$30,05,$99,$f8,04,$10,03
!byte $99,$78,04,$4c,$a0,$b9,$8a,$4a
!byte $4a,$4a,$4a,$a8,$60,$48,$a0,02
!byte $b0,$ee,$48,$a0,$01,$b1,$3c,$6a
!byte $68,$90,$08,$0a,$20,$6b,$be,$4e
!byte $78,$04,$60,$85,$2a,$20,$8e,$be
!byte $b9,$78,$04,$24,$35,$30,$03,$b9
!byte $f8,$04,$8d,$78,$04,$a5,$2a,$24
!byte $35,$30,$05,$99,$f8,$04,$10,$03
!byte $99,$78,$04,$4c,$a0,$b9,$8a,$4a
!byte $4a,$4a,$4a,$a8,$60,$48,$a0,$02
!byte $b1,$48,$6a,$66,$35,$20,$8e,$be
!byte $68,$0a,$24,$35,$30,05,$99,$f8
!byte 04,$10,03,$99,$78,04,$60,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,$0d,$0b,09,07,05,03,01
!byte $0e,$0c,$0a,08,06,04,02,$0f
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte 00,00,00,00,00,00,00,00
!byte $68,$0a,$24,$35,$30,$05,$99,$f8
!byte $04,$10,$03,$99,$78,$04,$60,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$0d,$0b,$09,$07,$05,$03,$01
!byte $0e,$0c,$0a,$08,$06,$04,$02,$0f
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00
!byte $00,$00,$00,$00,$00,$00,$00,$00