support Choplifter copying

This commit is contained in:
Peter Ferrie 2019-04-13 10:33:15 -07:00
parent 2ea34407e6
commit 74a6d52420
7 changed files with 306 additions and 18 deletions

View File

@ -218,7 +218,7 @@ IDBootloader
sta gIsProDOS sta gIsProDOS
jsr IDVolumeName jsr IDVolumeName
bcc + bcc +
jmp .useuniv jmp UseUniversal
+ +
; ;
; Dinkey-DOS (ProDOS file structure with DOS 3.3-ish RWTS in language card) ; Dinkey-DOS (ProDOS file structure with DOS 3.3-ish RWTS in language card)
@ -227,7 +227,7 @@ IDBootloader
; ;
jsr IDDinkeyDOS jsr IDDinkeyDOS
bcc + bcc +
jmp .useuniv jmp UseUniversal
+ lda #s_dinkeydos + lda #s_dinkeydos
jsr PrintByID jsr PrintByID
lda #TRUE lda #TRUE

View File

@ -74,6 +74,11 @@ IDDOS32LO
ldy #$03 ldy #$03
jsr compare jsr compare
!byte $4C,$01,$03; JMP $0301 !byte $4C,$01,$03; JMP $0301
bcc .exit
ldx #$37
ldy #$03
jsr compare
!byte $4C,$01,$03; JMP $0301
.exit rts .exit rts
} }
@ -99,10 +104,15 @@ TraceDOS32LO
jmp $0801 jmp $0801
.TraceDOS32LOb .TraceDOS32LOb
lda #<.TraceDOS32c ldy #$00
sta $0842 lda $0837
cmp #$4C
beq +
ldy #$0A
+ lda #<.TraceDOS32c
sta $0838,y
lda #>.TraceDOS32c lda #>.TraceDOS32c
sta $0843 sta $0839,y
jmp $0801 jmp $0801
.TraceDOS32c .TraceDOS32c
@ -138,7 +148,7 @@ TraceDOS32LO
!byte $85,$3F !byte $85,$3F
!byte $E6,$3F !byte $E6,$3F
!byte $6C,$3E,$00 !byte $6C,$3E,$00
bcs .fail bcs .tryChoplifter
lda $03CC lda $03CC
cmp #$B6 cmp #$B6
beq + beq +
@ -174,6 +184,24 @@ TraceDOS32LO
ldy $0300 ldy $0300
jmp $0301 jmp $0301
.tryChoplifter
lda #$03
ldx #$01
ldy #$10
jsr CompareMemory
!byte $A2,$2E ;LDX #$2E
!byte $9A ;TXS
!byte $84,$48 ;STY $48
!byte $A2,$00 ;LDX #$00
!byte $BC,$00,$03 ;LDY $0300,X
!byte $88 ;DEY
!byte $A9,$EA ;LDA #$EA
!byte $20,$26,$03 ;JSR $0326
bcs .fail
lda #s_choplifter
jsr PrintByID
jmp Choplifter
; something did not match, not comfortable tracing, ; something did not match, not comfortable tracing,
; but we know enough to know that the universal RWTS won't work, ; but we know enough to know that the universal RWTS won't work,
; so we're done ; so we're done

View File

@ -411,17 +411,15 @@ ReadWithRWTS
checksector checksector
lda $FFFF ; status of current sector in sector map (modified above) lda $FFFF ; status of current sector in sector map (modified above)
pha
cmp #kSectorCustomFirst ; call a custom routine before deciding what to do with this sector? cmp #kSectorCustomFirst ; call a custom routine before deciding what to do with this sector?
bcc + bcc +
cmp #kSectorCustomLast cmp #kSectorCustomLast
bcs + bcs +
pla
jsr PreReadSector jsr PreReadSector
pha ; replace status (on stack) with new status returned from PreReadSector + pha ; replace status (on stack) with new status returned from PreReadSector
+ cmp #kSectorIgnore ; skip this sector? cmp #kSectorIgnore ; skip this sector?
beq nextsector beq nextsector
+ cmp #kSectorSwitchToBuiltinRWTS ; switch to built-in RWTS before reading this sector? cmp #kSectorSwitchToBuiltinRWTS ; switch to built-in RWTS before reading this sector?
bne + bne +
lda gTriedUniv lda gTriedUniv
beq + beq +
@ -499,12 +497,11 @@ checksector
nextsector nextsector
pla pla
dec checksector+1
lda checksector+1 lda checksector+1
cmp #$FF
bne .nodec bne .nodec
dec checksector+2 dec checksector+2
.nodec .nodec
dec checksector+1
lda gSector lda gSector
sec sec
sbc #$01 sbc #$01
@ -524,11 +521,11 @@ nextsector
jsr ChangeTrack jsr ChangeTrack
jsr IncProgress jsr IncProgress
lda gTrack lda gTrack
bmi .pass bmi Pass
cmp gLastTrack cmp gLastTrack
bcc .pass bcc Pass
jmp .read jmp .read
.pass Pass
bit gMode bit gMode
bmi .passwrite bmi .passwrite
lda #s_pass lda #s_pass
@ -847,6 +844,7 @@ _applyToAll
!source "patchers/holle.a" ; gIsHolle only !source "patchers/holle.a" ; gIsHolle only
!source "patchers/zoomgrafix.a" ; gIsPhoenix only !source "patchers/zoomgrafix.a" ; gIsPhoenix only
!source "patchers/e7everywhere.a" ; gIsBoot0 || gIsProDOS only !source "patchers/e7everywhere.a" ; gIsBoot0 || gIsProDOS only
!source "patchers/choplifter.a" ; gIsChoplifter only
lda gPatchCount lda gPatchCount
beq .nopatches beq .nopatches

257
src/patchers/choplifter.a Normal file
View File

@ -0,0 +1,257 @@
;-------------------------------
; #Choplifter
; insane protection by Roland Gustafsson
; licensed by Broderbund, Gebelli, and others
;
; module by qkumba
;-------------------------------
!zone {
.exit rts ; reachable only via inspect
Choplifter
bit gMode ; nothing to do here in verify-only mode
bpl .exit
lda #$00
sta gCommand
sta dct+1
jsr ChangeTrackNW
jsr IncProgress
.read
lda KEY
bmi .cancel
asl gTrack
jsr ReadChoplifter
lsr gTrack
jsr WriteTrackNA
lda gTrack
clc
adc #$01
jsr ChangeTrackNW
jsr IncProgress
lda gTrack
cmp #$23
bne .read
jsr .cleanup
jmp Pass
.cleanup
lda $C0E8
lda #$01
sta gCommand
sta dct+1
rts
.fatal
jsr .cleanup
; if we get to here, we've
jmp FatalError ; decided the read error is fatal
.cancel
jsr .cleanup
jmp Cancel
ReadChoplifter
lda #BASEPAGE
sta modsrc+1
lda #$00
sta modsrc
- jsr ReadSector ; really just seek
lda $C0E9 ; turn the drive back on
; no need for spin-up because we are fast enough
ldx #$04
lda gTrack
beq .settrack00
cmp #$12
bcc .settrack01
cmp #$16
bcc .ignore
beq .readtrack0B
cmp #$3E
bcs .checktrack1E
jsr .readtrack
inc gTrack
lda gTrack
lsr
bcs -
dec gTrack
.ignore
rts
.readtrack0B
.checkkey1
lda KEY
bmi .cancel
jsr .readnib
- cmp #$DD
bne .checkkey1
jsr .readnib
-- cmp #$F5
bne -
jsr .readnib
cmp #$D5
bne -- ; this is the same bug
ldx #$03
- jsr .read4x4
jsr .read4x4
jsr .read4x4
sta cmp1+0,x
dex
bpl -
rts
.checktrack1E
cmp #$40
bcs .checktrack20
rts
.settrack00
lda #$D5
sta cmp1+1
sta cmp2+1
lda #$DD
sta cmp1+0
sta cmp2+0
!byte $2C
.settrack01
ldx #$08
.readtrack
stx tmpx
ldx #3
.retry0
dex
beq .jmpfatal
.checkkey0
lda KEY
bmi .jmpcancel
jsr .readnib
- cmp cmp2+1
bne .checkkey0
jsr .readnib
-- cmp cmp2+0
bne -
jsr .readnib
cmp cmp1+1
bne -- ; this is a bug
; it allows PR0 PR1 [any] PR1 PR2 instead of requiring PR0 PR1 PR2
ldy #0
-- jsr .read4x4
sta (modsrc), y
iny
bne --
- lda $C0EC
bpl -
cmp cmp1+0
bne .retry0
inc modsrc+1
dec tmpx
bne --
jsr .readnib
sta cmp1+1 ; prologue 3
jsr .readnib
sta cmp2+0 ; prologue 2
jsr .readnib
sta cmp2+1 ; prologue 1
jsr .readnib
sta cmp1+0 ; epilog
rts
.jmpfatal
jmp .fatal
.jmpcancel
jmp .cancel
.checktrack20
beq .readtrack20
cmp #$44
beq .readtrack22
rts
.readtrack20
ldx #1
jsr .readtrack
lda (BASEPAGE<<8)+$C5
sta .prolog1+1
lda (BASEPAGE<<8)+$CC
sta .prolog2+1
lda (BASEPAGE<<8)+$D3
sta .prolog3+1
.checkkey2
lda KEY
bmi .jmpcancel
jsr .readnib
.prolog1
- cmp #$D1 ; SMC
bne .checkkey2
jsr .readnib
.prolog2
-- cmp #$D1 ; SMC
bne -
jsr .readnib
.prolog3
cmp #$D1 ; SMC
bne -- ; this is the same bug
nop ; timing bits
ldx #$00
- jsr .read4x4
sta (BASEPAGE+1)<<8,x
inx
jsr .read4x4
sta (BASEPAGE+1)<<8,x
inx
jsr .read4x4
sta (BASEPAGE+1)<<8,x
inx
cmp #$EA
bne -
rts
.readtrack22
ldx #$40
ldy #0
.checkkey3
dey
bne +
dex
beq ++
+ lda KEY
bmi .jmpcancel
jsr .readnib
- cmp #$D5
bne .checkkey3
jsr .readnib
-- cmp #$FF
bne -
jsr .readnib
cmp #$DD
bne -- ; this is the same bug
ldx #$00
- jsr .read4x4
sta BASEPAGE<<8,x
inx
bne -
++ rts
.read4x4
- lda $C0EC
bpl -
sec
rol
sta tmp
- lda $C0EC
bpl -
and tmp
rts
.readnib
- lda $C0EC
bpl -
rts
}

View File

@ -199,5 +199,6 @@ _track !byte $00
_sector !byte $00 _sector !byte $00
!word dct !word dct
gAddress !word $1F00 gAddress !word $1F00
!byte $00,$00,$01,$00,$FE,$60,$01,$00,$00 !byte $00,$00
gCommand !byte $01,$00,$FE,$60,$01,$00,$00
dct !byte $00,$01,$EF,$D8,$00 dct !byte $00,$01,$EF,$D8,$00

View File

@ -133,6 +133,7 @@ StringTable
!word .hoffman !word .hoffman
!word .diskvol0 !word .diskvol0
!word .e7everywhere !word .e7everywhere
!word .choplifter
; ;
; Text can contain substitution strings, which ; Text can contain substitution strings, which
; are replaced by current values at runtime. Each ; are replaced by current values at runtime. Each
@ -486,4 +487,6 @@ StringTable
!text "T%t,S%0 Disk requires volume number 000",$8D,$00 !text "T%t,S%0 Disk requires volume number 000",$8D,$00
.e7everywhere .e7everywhere
!text "T%t,S%0 Found E7 Everywhere protection",$8D,$00 !text "T%t,S%0 Found E7 Everywhere protection",$8D,$00
.choplifter
!text "T00,S01 Found Choplifter protection",$8D,$00
} }

View File

@ -119,4 +119,5 @@ s_holle = $71
s_hoffman = $72 s_hoffman = $72
s_diskvol0 = $73 s_diskvol0 = $73
s_e7everywhere=$74 s_e7everywhere=$74
STRINGCOUNT = $75 s_choplifter = $75
STRINGCOUNT = $76