mirror of
https://github.com/a2-4am/passport.git
synced 2024-11-19 03:06:34 +00:00
[WIP] DOS 3.2 support
This commit is contained in:
parent
642db7e409
commit
2dcd475e08
@ -138,6 +138,16 @@ IDBootloader
|
|||||||
bcs +
|
bcs +
|
||||||
jmp foundea
|
jmp foundea
|
||||||
;
|
;
|
||||||
|
; Try to identify hybrid 16-/13-sector bootloader on
|
||||||
|
; DOS 3.2 disks.
|
||||||
|
; Exit via custom trace function if found.
|
||||||
|
;
|
||||||
|
+ jsr IDDOS32
|
||||||
|
bcs +
|
||||||
|
lda #s_dos32b0
|
||||||
|
jsr PrintByID
|
||||||
|
jmp TraceDOS32
|
||||||
|
;
|
||||||
; Try to detect whether there is code in the boot sector
|
; Try to detect whether there is code in the boot sector
|
||||||
; that loads 4-and-4-encoded data. This is an early escape
|
; that loads 4-and-4-encoded data. This is an early escape
|
||||||
; hatch for disks that are guaranteed to fail later anyway.
|
; hatch for disks that are guaranteed to fail later anyway.
|
||||||
|
238
src/id/trace.a
Executable file → Normal file
238
src/id/trace.a
Executable file → Normal file
@ -1,200 +1,38 @@
|
|||||||
;-------------------------------
|
;-------------------------------
|
||||||
; TraceDOS33
|
; Trace
|
||||||
; set up 1st-level boot trace on
|
; common code for all boot tracers
|
||||||
; a DOS 3.3-shaped bootloader
|
; in: A = lo byte of callback
|
||||||
;-------------------------------
|
; X = hi byte of callback
|
||||||
!zone {
|
; never returns (exits via callback or UseUniversal)
|
||||||
TraceDOS33
|
;-------------------------------
|
||||||
;
|
!zone {
|
||||||
; Before we trace through the drive firmware (which --
|
Trace
|
||||||
; at least on some machines -- will loop forever looking
|
pha
|
||||||
; for each sector), we do a pre-check to ensure that all
|
txa
|
||||||
; the sectors we're about to trace are actually readable.
|
pha
|
||||||
;
|
lda #$C6
|
||||||
lda #$00
|
ldx #$B6
|
||||||
sta gTrack
|
ldy #$01
|
||||||
lda #$09
|
jsr CopyMemory
|
||||||
sta gSector
|
pla
|
||||||
lda #$00
|
tax
|
||||||
sta $b991
|
pla
|
||||||
precheck
|
ldy $B6F8
|
||||||
ldy #<gRWTSParams
|
cpy #$4C
|
||||||
lda #>gRWTSParams
|
bne +
|
||||||
jsr $BD00
|
sty $B6F8 ; JMP for Disk II controller
|
||||||
bcc +
|
sta $B6F9 ; lo byte of callback
|
||||||
jmp FatalError
|
stx $B6FA ; hi byte of callback
|
||||||
+
|
jmp $B600
|
||||||
dec gSector
|
+ ldy $B6FB
|
||||||
bne precheck
|
cpy #$4C
|
||||||
;
|
bne +
|
||||||
; pre-check passed, do the trace
|
sty $B6FB ; JMP for IIgs smart controller
|
||||||
;
|
sta $B6FC ; lo byte of callback
|
||||||
lda #<TraceDOS33b
|
stx $B6FD ; hi byte of callback
|
||||||
ldx #>TraceDOS33b
|
jmp $B600
|
||||||
jmp Trace
|
|
||||||
|
+ lda #s_canttrace ; unknown disk controller
|
||||||
;-------------------------------
|
jsr PrintByID
|
||||||
; TraceDOS33b
|
jmp UseUniversal
|
||||||
; set up 2nd boot trace at $084A
|
}
|
||||||
;-------------------------------
|
|
||||||
TraceDOS33b
|
|
||||||
lda #$4C
|
|
||||||
sta $084A
|
|
||||||
lda #<TraceDOS33c
|
|
||||||
sta $084B
|
|
||||||
lda #>TraceDOS33c
|
|
||||||
sta $084C
|
|
||||||
lda #$EA
|
|
||||||
ldy #9
|
|
||||||
.noppatch
|
|
||||||
sta $83E,Y ; disable calls to
|
|
||||||
dey ; TEXt/PR0/IN0
|
|
||||||
bne .noppatch ; including "Grafboot"
|
|
||||||
jmp $0801
|
|
||||||
|
|
||||||
TraceDOS33c
|
|
||||||
lda $08FE ; 2nd-level trace callback is here
|
|
||||||
sta .x6+1
|
|
||||||
clc
|
|
||||||
adc #$02
|
|
||||||
_Inspect1a
|
|
||||||
sta .x1+1
|
|
||||||
sta .x2+1
|
|
||||||
sta .x7+1
|
|
||||||
sta b4bbmodify+2
|
|
||||||
sta b4bbmodify2+2
|
|
||||||
clc
|
|
||||||
adc #$06
|
|
||||||
sta b4bbcompare+1
|
|
||||||
tax
|
|
||||||
dex
|
|
||||||
stx .x5+1
|
|
||||||
dex
|
|
||||||
stx .x3+1
|
|
||||||
stx .x4+1
|
|
||||||
stx callrwts+2
|
|
||||||
jsr ProtectedDOS ; check for a specific (encrypted)
|
|
||||||
; bootloader called "Protected DOS"
|
|
||||||
bcs .notprotdos
|
|
||||||
jmp ADStyle
|
|
||||||
.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
|
|
||||||
jmp UseUniversal
|
|
||||||
.x1 lda #$FF ; check for "SEC;RTS" at $B942
|
|
||||||
ldx #$42
|
|
||||||
ldy #$02
|
|
||||||
jsr CompareMemory
|
|
||||||
!byte $38,$60
|
|
||||||
bcc .x2
|
|
||||||
jmp UseUniversal
|
|
||||||
.x2 lda #$FF ; check for "LDA $C08C,X" at $B94F
|
|
||||||
ldx #$4F
|
|
||||||
ldy #$03
|
|
||||||
jsr CompareMemory
|
|
||||||
!byte $BD,$8C,$C0
|
|
||||||
bcc .x3
|
|
||||||
jmp UseUniversal
|
|
||||||
.x3 lda #$FF ; check for "JSR $xx00" at $BDB9
|
|
||||||
ldx #$B9
|
|
||||||
ldy #$02
|
|
||||||
jsr CompareMemory
|
|
||||||
!byte $20,00
|
|
||||||
bcc .x5
|
|
||||||
;
|
|
||||||
; 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
|
|
||||||
ldx #$C5
|
|
||||||
ldy #$02
|
|
||||||
jsr CompareMemory
|
|
||||||
!byte $20,00
|
|
||||||
bcc .x5
|
|
||||||
jmp UseUniversal ; give up tracing; this RWTS is unsupported
|
|
||||||
;
|
|
||||||
; Check for RWTS variant that uses non-standard address for slot
|
|
||||||
; LDX $1FE8 e.g. Pinball Construction Set (1983)
|
|
||||||
; we don't like that one
|
|
||||||
;
|
|
||||||
.x5 lda #$FF ; check for "LDX $1FE8" at $BE43
|
|
||||||
ldx #$43
|
|
||||||
ldy #$03
|
|
||||||
jsr CompareMemory
|
|
||||||
!byte $AE,$E8,$1F
|
|
||||||
bcs .x6
|
|
||||||
jmp UseUniversal ; give up tracing; this RWTS is unsupported
|
|
||||||
;
|
|
||||||
; Check for Milliken protection routine in late-stage boot
|
|
||||||
; (affects readable/ignoreable sector map, so must ID now)
|
|
||||||
;
|
|
||||||
.x6 lda #$FF ; check for "JMP $9B03" at $B747
|
|
||||||
ldx #$47
|
|
||||||
ldy #$03
|
|
||||||
jsr CompareMemory
|
|
||||||
!byte $4C,$03,$9B
|
|
||||||
bcs .x7
|
|
||||||
jsr IDMilliken
|
|
||||||
bcs .x7
|
|
||||||
lda #s_milliken
|
|
||||||
jsr PrintByID
|
|
||||||
lda #$80
|
|
||||||
sta T02S05
|
|
||||||
;
|
|
||||||
; Check for Adventure International RWTS (sets flag for patcher)
|
|
||||||
;
|
|
||||||
.x7 lda #$FF ; check for code at $B936
|
|
||||||
ldx #$36
|
|
||||||
ldy #$0A
|
|
||||||
jsr CompareMemory
|
|
||||||
!byte $EA,$EA,$EA; NOP/NOP/NOP
|
|
||||||
!byte $BD,$8C,$C0; LDA $C08C,X
|
|
||||||
!byte $10,$FB ; BPL -$FB
|
|
||||||
!byte $C9,$00 ; CMP #$00
|
|
||||||
bcs +
|
|
||||||
lda #TRUE
|
|
||||||
sta gAdventureInternational
|
|
||||||
+ jmp ADStyle ; use this RWTS to read the disk
|
|
||||||
|
|
||||||
;-------------------------------
|
|
||||||
; Trace
|
|
||||||
; common code for all boot tracers
|
|
||||||
; in: A = lo byte of callback
|
|
||||||
; X = hi byte of callback
|
|
||||||
; never returns
|
|
||||||
;-------------------------------
|
|
||||||
Trace
|
|
||||||
pha
|
|
||||||
txa
|
|
||||||
pha
|
|
||||||
lda #$C6
|
|
||||||
ldx #$B6
|
|
||||||
ldy #$01
|
|
||||||
jsr CopyMemory
|
|
||||||
pla
|
|
||||||
tax
|
|
||||||
pla
|
|
||||||
ldy $B6F8
|
|
||||||
cpy #$4C
|
|
||||||
bne .maybe_gs
|
|
||||||
sty $B6F8 ; JMP
|
|
||||||
sta $B6F9 ; lo byte of callback
|
|
||||||
stx $B6FA ; hi byte of callback
|
|
||||||
jmp $B600
|
|
||||||
.maybe_gs
|
|
||||||
ldy $B6FB
|
|
||||||
cpy #$4C
|
|
||||||
bne .unknowndrive
|
|
||||||
sty $B6FB ; JMP
|
|
||||||
sta $B6FC ; lo byte of callback
|
|
||||||
stx $B6FD ; hi byte of callback
|
|
||||||
jmp $B600
|
|
||||||
.unknowndrive
|
|
||||||
lda #s_canttrace
|
|
||||||
jsr PrintByID
|
|
||||||
jmp UseUniversal
|
|
||||||
}
|
|
||||||
|
167
src/id/trace32.a
Normal file
167
src/id/trace32.a
Normal file
@ -0,0 +1,167 @@
|
|||||||
|
; DOS 3.2 boot tracer
|
||||||
|
; for DOS 3.2 disks with a 3.2/3.3 hybrid bootloader
|
||||||
|
; that boots automatically on 16-sector drives
|
||||||
|
; e.g. many early disks from Edu-Ware, Hartley
|
||||||
|
|
||||||
|
;-------------------------------
|
||||||
|
; IDDOS32
|
||||||
|
; returns C clear if 3.2/3.3 bootloader detected in T00,S00
|
||||||
|
;-------------------------------
|
||||||
|
!zone {
|
||||||
|
IDDOS32
|
||||||
|
lda #$00
|
||||||
|
ldx #$00
|
||||||
|
ldy #$0F
|
||||||
|
jsr compare
|
||||||
|
!byte $01
|
||||||
|
!byte $A0,$0F ; LDY #$0F
|
||||||
|
!byte $B9,$00,$08; LDA $0800,Y
|
||||||
|
!byte $99,$00,$02; STA $0200,Y
|
||||||
|
!byte $C8 ; INY
|
||||||
|
!byte $D0,$F7 ; BNE -
|
||||||
|
!byte $4C,$0F,$02; JMP $020F
|
||||||
|
bcs .exit
|
||||||
|
ldx #$33
|
||||||
|
ldy #$08
|
||||||
|
jsr compare
|
||||||
|
!byte $A6,$2B ; LDX $2B
|
||||||
|
!byte $20,$5D,$02; JSR $025D
|
||||||
|
!byte $4C,$D1,$02; JMP $02D1
|
||||||
|
bcs .exit
|
||||||
|
ldx #$F4
|
||||||
|
ldy #$08
|
||||||
|
jsr compare
|
||||||
|
!byte $CC,$00,$03; CPY $0300
|
||||||
|
!byte $D0,$03 ; BNE +
|
||||||
|
!byte $4C,$3B,$02; JMP $023B
|
||||||
|
bcs .exit
|
||||||
|
ldx #$45
|
||||||
|
ldy #$03
|
||||||
|
jsr compare
|
||||||
|
!byte $4C,$01,$03; JMP $0301
|
||||||
|
.exit rts
|
||||||
|
}
|
||||||
|
|
||||||
|
;-------------------------------
|
||||||
|
; TraceDOS32
|
||||||
|
; set up boot trace to capture 13-sector RWTS
|
||||||
|
;-------------------------------
|
||||||
|
!zone {
|
||||||
|
TraceDOS32
|
||||||
|
lda #<TraceDOS32b
|
||||||
|
ldx #>TraceDOS32b
|
||||||
|
jmp Trace
|
||||||
|
|
||||||
|
TraceDOS32b
|
||||||
|
lda #<TraceDOS32c
|
||||||
|
sta $0846
|
||||||
|
lda #>TraceDOS32c
|
||||||
|
sta $0847
|
||||||
|
jmp $0801
|
||||||
|
|
||||||
|
TraceDOS32c
|
||||||
|
lda #$03
|
||||||
|
ldx #$0D
|
||||||
|
ldy #$39
|
||||||
|
jsr CompareMemory
|
||||||
|
!byte $A6,$2B
|
||||||
|
!byte $A9,$09
|
||||||
|
!byte $85,$27
|
||||||
|
!byte $AD,$CC,$03
|
||||||
|
!byte $85,$41
|
||||||
|
!byte $84,$40
|
||||||
|
!byte $8A
|
||||||
|
!byte $4A
|
||||||
|
!byte $4A
|
||||||
|
!byte $4A
|
||||||
|
!byte $4A
|
||||||
|
!byte $A9,$02
|
||||||
|
!byte $85,$3F
|
||||||
|
!byte $A9,$5D
|
||||||
|
!byte $85,$3E
|
||||||
|
!byte $20,$43,$03
|
||||||
|
!byte $20,$46,$03
|
||||||
|
!byte $A5,$3D
|
||||||
|
!byte $4D,$FF,$03
|
||||||
|
!byte $F0,$06
|
||||||
|
!byte $E6,$41
|
||||||
|
!byte $E6,$3D
|
||||||
|
!byte $D0,$ED
|
||||||
|
!byte $85,$3E
|
||||||
|
!byte $AD,$CC,$03
|
||||||
|
!byte $85,$3F
|
||||||
|
!byte $E6,$3F
|
||||||
|
!byte $6C,$3E,$00
|
||||||
|
bcs .fail
|
||||||
|
lda $03CC
|
||||||
|
cmp #$B6
|
||||||
|
beq +
|
||||||
|
cmp #$36
|
||||||
|
bne .fail
|
||||||
|
+
|
||||||
|
; set up RWTS entry point
|
||||||
|
|
||||||
|
clc
|
||||||
|
adc #$07
|
||||||
|
sta callrwts+2
|
||||||
|
lda #$00
|
||||||
|
sta callrwts+1
|
||||||
|
|
||||||
|
; set up final trace
|
||||||
|
|
||||||
|
lda #$4C
|
||||||
|
sta $033A
|
||||||
|
lda #<TraceDOS32d
|
||||||
|
sta $033B
|
||||||
|
lda #>TraceDOS32d
|
||||||
|
sta $033C
|
||||||
|
ldy $0300
|
||||||
|
jmp $0301
|
||||||
|
|
||||||
|
TraceDOS32d
|
||||||
|
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
|
||||||
|
bcs .fail
|
||||||
|
|
||||||
|
; skip sectors $0D, $0E, and $0F on all tracks
|
||||||
|
; since this is a 13-sector disk
|
||||||
|
|
||||||
|
lda #<sectormap
|
||||||
|
sta .C+1
|
||||||
|
lda #>sectormap
|
||||||
|
sta .C+2
|
||||||
|
lda #$00
|
||||||
|
ldx #$22
|
||||||
|
.A ldy #$0F
|
||||||
|
.B cpy #$03
|
||||||
|
bcs .D
|
||||||
|
.C sta $FFFF
|
||||||
|
.D inc .C+1
|
||||||
|
bne +
|
||||||
|
inc .C+2
|
||||||
|
+ dey
|
||||||
|
bpl .B
|
||||||
|
dex
|
||||||
|
bpl .A
|
||||||
|
|
||||||
|
; skip T00,S01-S0A
|
||||||
|
; since we're going to construct our own bootloader later
|
||||||
|
|
||||||
|
ldy #$0A
|
||||||
|
- sta T00,y
|
||||||
|
dey
|
||||||
|
bne -
|
||||||
|
|
||||||
|
; read the rest of the disk with the original RWTS
|
||||||
|
|
||||||
|
jmp ADStyle
|
||||||
|
|
||||||
|
; something did not match, not comfortable tracing,
|
||||||
|
; but we know enough to know that the universal RWTS won't work,
|
||||||
|
; so we're done
|
||||||
|
|
||||||
|
.fail jmp FatalError
|
||||||
|
}
|
165
src/id/trace33.a
Executable file
165
src/id/trace33.a
Executable file
@ -0,0 +1,165 @@
|
|||||||
|
;-------------------------------
|
||||||
|
; TraceDOS33
|
||||||
|
; set up 1st-level boot trace on
|
||||||
|
; a DOS 3.3-shaped bootloader
|
||||||
|
;-------------------------------
|
||||||
|
!zone {
|
||||||
|
TraceDOS33
|
||||||
|
;
|
||||||
|
; Before we trace through the drive firmware (which --
|
||||||
|
; at least on some machines -- will loop forever looking
|
||||||
|
; for each sector), we do a pre-check to ensure that all
|
||||||
|
; the sectors we're about to trace are actually readable.
|
||||||
|
;
|
||||||
|
lda #$00
|
||||||
|
sta gTrack
|
||||||
|
lda #$09
|
||||||
|
sta gSector
|
||||||
|
lda #$00
|
||||||
|
sta $b991
|
||||||
|
precheck
|
||||||
|
ldy #<gRWTSParams
|
||||||
|
lda #>gRWTSParams
|
||||||
|
jsr $BD00
|
||||||
|
bcc +
|
||||||
|
jmp FatalError
|
||||||
|
+
|
||||||
|
dec gSector
|
||||||
|
bne precheck
|
||||||
|
;
|
||||||
|
; pre-check passed, do the trace
|
||||||
|
;
|
||||||
|
lda #<TraceDOS33b
|
||||||
|
ldx #>TraceDOS33b
|
||||||
|
jmp Trace
|
||||||
|
|
||||||
|
;-------------------------------
|
||||||
|
; TraceDOS33b
|
||||||
|
; set up 2nd boot trace at $084A
|
||||||
|
;-------------------------------
|
||||||
|
TraceDOS33b
|
||||||
|
lda #$4C
|
||||||
|
sta $084A
|
||||||
|
lda #<TraceDOS33c
|
||||||
|
sta $084B
|
||||||
|
lda #>TraceDOS33c
|
||||||
|
sta $084C
|
||||||
|
lda #$EA
|
||||||
|
ldy #9
|
||||||
|
.noppatch
|
||||||
|
sta $83E,Y ; disable calls to
|
||||||
|
dey ; TEXt/PR0/IN0
|
||||||
|
bne .noppatch ; including "Grafboot"
|
||||||
|
jmp $0801
|
||||||
|
|
||||||
|
TraceDOS33c
|
||||||
|
lda $08FE ; 2nd-level trace callback is here
|
||||||
|
sta .x6+1
|
||||||
|
clc
|
||||||
|
adc #$02
|
||||||
|
_Inspect1a
|
||||||
|
sta .x1+1
|
||||||
|
sta .x2+1
|
||||||
|
sta .x7+1
|
||||||
|
sta b4bbmodify+2
|
||||||
|
sta b4bbmodify2+2
|
||||||
|
clc
|
||||||
|
adc #$06
|
||||||
|
sta b4bbcompare+1
|
||||||
|
tax
|
||||||
|
dex
|
||||||
|
stx .x5+1
|
||||||
|
dex
|
||||||
|
stx .x3+1
|
||||||
|
stx .x4+1
|
||||||
|
stx callrwts+2
|
||||||
|
jsr ProtectedDOS ; check for a specific (encrypted)
|
||||||
|
; bootloader called "Protected DOS"
|
||||||
|
bcs .notprotdos
|
||||||
|
jmp ADStyle
|
||||||
|
.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
|
||||||
|
jmp UseUniversal
|
||||||
|
.x1 lda #$FF ; check for "SEC;RTS" at $B942
|
||||||
|
ldx #$42
|
||||||
|
ldy #$02
|
||||||
|
jsr CompareMemory
|
||||||
|
!byte $38,$60
|
||||||
|
bcc .x2
|
||||||
|
jmp UseUniversal
|
||||||
|
.x2 lda #$FF ; check for "LDA $C08C,X" at $B94F
|
||||||
|
ldx #$4F
|
||||||
|
ldy #$03
|
||||||
|
jsr CompareMemory
|
||||||
|
!byte $BD,$8C,$C0
|
||||||
|
bcc .x3
|
||||||
|
jmp UseUniversal
|
||||||
|
.x3 lda #$FF ; check for "JSR $xx00" at $BDB9
|
||||||
|
ldx #$B9
|
||||||
|
ldy #$02
|
||||||
|
jsr CompareMemory
|
||||||
|
!byte $20,00
|
||||||
|
bcc .x5
|
||||||
|
;
|
||||||
|
; 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
|
||||||
|
ldx #$C5
|
||||||
|
ldy #$02
|
||||||
|
jsr CompareMemory
|
||||||
|
!byte $20,00
|
||||||
|
bcc .x5
|
||||||
|
jmp UseUniversal ; give up tracing; this RWTS is unsupported
|
||||||
|
;
|
||||||
|
; Check for RWTS variant that uses non-standard address for slot
|
||||||
|
; LDX $1FE8 e.g. Pinball Construction Set (1983)
|
||||||
|
; we don't like that one
|
||||||
|
;
|
||||||
|
.x5 lda #$FF ; check for "LDX $1FE8" at $BE43
|
||||||
|
ldx #$43
|
||||||
|
ldy #$03
|
||||||
|
jsr CompareMemory
|
||||||
|
!byte $AE,$E8,$1F
|
||||||
|
bcs .x6
|
||||||
|
jmp UseUniversal ; give up tracing; this RWTS is unsupported
|
||||||
|
;
|
||||||
|
; Check for Milliken protection routine in late-stage boot
|
||||||
|
; (affects readable/ignoreable sector map, so must ID now)
|
||||||
|
;
|
||||||
|
.x6 lda #$FF ; check for "JMP $9B03" at $B747
|
||||||
|
ldx #$47
|
||||||
|
ldy #$03
|
||||||
|
jsr CompareMemory
|
||||||
|
!byte $4C,$03,$9B
|
||||||
|
bcs .x7
|
||||||
|
jsr IDMilliken
|
||||||
|
bcs .x7
|
||||||
|
lda #s_milliken
|
||||||
|
jsr PrintByID
|
||||||
|
lda #$80
|
||||||
|
sta T02S05
|
||||||
|
;
|
||||||
|
; Check for Adventure International RWTS (sets flag for patcher)
|
||||||
|
;
|
||||||
|
.x7 lda #$FF ; check for code at $B936
|
||||||
|
ldx #$36
|
||||||
|
ldy #$0A
|
||||||
|
jsr CompareMemory
|
||||||
|
!byte $EA,$EA,$EA; NOP/NOP/NOP
|
||||||
|
!byte $BD,$8C,$C0; LDA $C08C,X
|
||||||
|
!byte $10,$FB ; BPL -$FB
|
||||||
|
!byte $C9,$00 ; CMP #$00
|
||||||
|
bcs +
|
||||||
|
lda #TRUE
|
||||||
|
sta gAdventureInternational
|
||||||
|
;
|
||||||
|
; good to go
|
||||||
|
;
|
||||||
|
+ jmp ADStyle ; use this RWTS to read the disk
|
||||||
|
}
|
@ -1,7 +1,7 @@
|
|||||||
; "Special Delivery" boot tracer
|
; "Special Delivery" boot tracer
|
||||||
; for DOS 3.3P disks
|
; for DOS 3.3P disks
|
||||||
; e.g. Ernie's Quiz, Elite
|
; e.g. Ernie's Quiz, Elite
|
||||||
;
|
|
||||||
;-------------------------------
|
;-------------------------------
|
||||||
; IDSpecDel
|
; IDSpecDel
|
||||||
; returns C clear if "Special Delivery" bootloader
|
; returns C clear if "Special Delivery" bootloader
|
||||||
@ -135,10 +135,6 @@ SDsuccess
|
|||||||
; but we should clear the rest of T00 so we're not
|
; but we should clear the rest of T00 so we're not
|
||||||
; writing garbage to disk on unused sectors
|
; writing garbage to disk on unused sectors
|
||||||
|
|
||||||
lda #$10
|
|
||||||
ldx #$00
|
|
||||||
ldy #$01
|
|
||||||
jsr ClearMemory
|
|
||||||
lda #$15
|
lda #$15
|
||||||
ldx #$00
|
ldx #$00
|
||||||
ldy #$06
|
ldy #$06
|
||||||
@ -146,12 +142,9 @@ SDsuccess
|
|||||||
|
|
||||||
; copy Standard Delivery bootloader into place for T00,S00
|
; copy Standard Delivery bootloader into place for T00,S00
|
||||||
|
|
||||||
ldy #$7E ; _SDboot0-SDboot0, but set here
|
lda #<SD_DOS33p
|
||||||
; manually to work around Merlin bug
|
ldx #>SD_DOS33p
|
||||||
sdcopy lda SDboot0,y
|
jsr ConstructStandardDelivery
|
||||||
sta $1000,y
|
|
||||||
dey
|
|
||||||
bpl sdcopy
|
|
||||||
|
|
||||||
; now manually write out track 0 with Standard Delivery
|
; now manually write out track 0 with Standard Delivery
|
||||||
; bootloader
|
; bootloader
|
||||||
@ -219,26 +212,3 @@ skipsectors
|
|||||||
lda #$03
|
lda #$03
|
||||||
sta gLastTrack
|
sta gLastTrack
|
||||||
jmp ADStyle
|
jmp ADStyle
|
||||||
|
|
||||||
; Standard Delivery bootloader with DOS 3.3P support
|
|
||||||
; https://github.com/peterferrie/standard-delivery/
|
|
||||||
; rev. a5b839d7d0fa21b0ff3a7776d9f6c9750b09ae10 of 2016-11-29
|
|
||||||
;
|
|
||||||
SDboot0
|
|
||||||
!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 $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 $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 $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
|
|
||||||
!byte $36,$35,$34,$33,$32,$31,$3F,$C0
|
|
||||||
_SDboot0
|
|
@ -95,7 +95,7 @@ flag = $FF ; byte
|
|||||||
}
|
}
|
||||||
|
|
||||||
; Application constants (not zero addresses)
|
; Application constants (not zero addresses)
|
||||||
RELBASE = $5A00 ; address to move Passport code
|
RELBASE = $5900 ; address to move Passport code
|
||||||
; so that it's out of the way
|
; so that it's out of the way
|
||||||
LOWPOINT = $4300 ; lowest available address for code
|
LOWPOINT = $4300 ; lowest available address for code
|
||||||
BASEPAGE = $10 ; Special Delivery tracer assumes
|
BASEPAGE = $10 ; Special Delivery tracer assumes
|
||||||
@ -140,16 +140,18 @@ FirstMover
|
|||||||
|
|
||||||
!source "analyze.a"
|
!source "analyze.a"
|
||||||
!source "id/inspect0.a"
|
!source "id/inspect0.a"
|
||||||
!source "id/dos33.a"
|
|
||||||
!source "id/trace.a"
|
!source "id/trace.a"
|
||||||
|
!source "id/trace33.a"
|
||||||
|
!source "id/trace32.a"
|
||||||
|
!source "id/trace8b3.a"
|
||||||
|
!source "id/trace33p.a"
|
||||||
|
!source "id/dos33.a"
|
||||||
!source "id/prodos.a"
|
!source "id/prodos.a"
|
||||||
!source "id/pascal.a"
|
!source "id/pascal.a"
|
||||||
!source "id/jsr8b3.a"
|
!source "id/jsr8b3.a"
|
||||||
!source "id/trace8b3.a"
|
|
||||||
!source "id/mecc.a"
|
!source "id/mecc.a"
|
||||||
!source "id/datasoft.a"
|
!source "id/datasoft.a"
|
||||||
!source "id/protecteddos.a"
|
!source "id/protecteddos.a"
|
||||||
!source "id/specdelivery.a"
|
|
||||||
!source "id/encode44.a"
|
!source "id/encode44.a"
|
||||||
!source "id/encode53.a"
|
!source "id/encode53.a"
|
||||||
!source "id/ea.a"
|
!source "id/ea.a"
|
||||||
@ -172,6 +174,7 @@ FirstMover
|
|||||||
!source "keys.a"
|
!source "keys.a"
|
||||||
!source "cffa.a"
|
!source "cffa.a"
|
||||||
!source "rwts.a"
|
!source "rwts.a"
|
||||||
|
!source "standarddelivery.a"
|
||||||
|
|
||||||
OneTimeSetup
|
OneTimeSetup
|
||||||
lda $C0E8
|
lda $C0E8
|
||||||
@ -696,6 +699,7 @@ _applyToT00
|
|||||||
!source "patchers/laureate.a"
|
!source "patchers/laureate.a"
|
||||||
!source "patchers/pascalrwts.a"
|
!source "patchers/pascalrwts.a"
|
||||||
!source "patchers/micrograms.a"
|
!source "patchers/micrograms.a"
|
||||||
|
!source "patchers/dos32.a"
|
||||||
_applyToAll
|
_applyToAll
|
||||||
!source "patchers/universale7.a"
|
!source "patchers/universale7.a"
|
||||||
!source "patchers/a6bc95.a" ; gIsPascal only
|
!source "patchers/a6bc95.a" ; gIsPascal only
|
||||||
|
37
src/patchers/dos32.a
Normal file
37
src/patchers/dos32.a
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
;-------------------------------
|
||||||
|
; #DOS32
|
||||||
|
; construct new bootloader and RWTS
|
||||||
|
; for converted DOS 3.2 disks
|
||||||
|
;-------------------------------
|
||||||
|
!zone {
|
||||||
|
jsr IDDOS32
|
||||||
|
bcs .exit
|
||||||
|
bcc +
|
||||||
|
|
||||||
|
.sectors
|
||||||
|
!byte $00,$00,$02,$02,$02,$02,$02,$02,$02,$02
|
||||||
|
.offsets
|
||||||
|
!byte $02,$5C,$0A,$0E,$10,$20,$25,$CA,$CE,$D2
|
||||||
|
.values
|
||||||
|
!byte $C7,$B7,$BC,$BC,$00,$BC,$BC,$00,$BC,$BC
|
||||||
|
|
||||||
|
+ lda #$09
|
||||||
|
sta .loop+1
|
||||||
|
ldx #$B8
|
||||||
|
ldy #$10
|
||||||
|
jsr modify
|
||||||
|
!byte $00,$0D,$0B,$09,$07,$05,$03,$01
|
||||||
|
!byte $0E,$0C,$0A,$08,$06,$04,$02,$0F
|
||||||
|
|
||||||
|
.loop ldy #$d1
|
||||||
|
lda .values,y
|
||||||
|
sta .value
|
||||||
|
lda .sectors,y
|
||||||
|
ldx .offsets,y
|
||||||
|
ldy #$01
|
||||||
|
jsr modify
|
||||||
|
.value !byte $d1
|
||||||
|
dec .loop+1
|
||||||
|
bpl .loop
|
||||||
|
.exit
|
||||||
|
}
|
115
src/standarddelivery.a
Normal file
115
src/standarddelivery.a
Normal file
@ -0,0 +1,115 @@
|
|||||||
|
; Standard Delivery bootloader
|
||||||
|
; https://github.com/peterferrie/standard-delivery/
|
||||||
|
; rev. a5b839d7d0fa21b0ff3a7776d9f6c9750b09ae10 of 2016-11-29
|
||||||
|
|
||||||
|
;-------------------------------
|
||||||
|
; ConstructStandardDelivery
|
||||||
|
; in: A = low byte of Standard Delivery parameter table (see below)
|
||||||
|
; X = high byte of Standard Delivery parameter table
|
||||||
|
; out: $1000..$10FF replaced with Standard Delivery bootloader
|
||||||
|
; all registers clobbered
|
||||||
|
; A,X clobbered
|
||||||
|
; Y preserved
|
||||||
|
;-------------------------------
|
||||||
|
!zone {
|
||||||
|
ConstructStandardDelivery
|
||||||
|
sta .A+1
|
||||||
|
stx .A+2
|
||||||
|
ldx #$00
|
||||||
|
txa
|
||||||
|
- sta $1000,x
|
||||||
|
inx
|
||||||
|
bne -
|
||||||
|
ldx #$4C
|
||||||
|
- lda .code,x
|
||||||
|
sta $1000,x
|
||||||
|
dex
|
||||||
|
bpl -
|
||||||
|
- inx
|
||||||
|
.A lda $FFFF,x
|
||||||
|
sta $104D,x
|
||||||
|
cmp #$C0
|
||||||
|
bne -
|
||||||
|
rts
|
||||||
|
|
||||||
|
.code
|
||||||
|
!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 $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 $30,$4c,$a8,$fc,$4c
|
||||||
|
}
|
||||||
|
|
||||||
|
;
|
||||||
|
; Format for Standard Delivery parameter table
|
||||||
|
;
|
||||||
|
; - word: entry point of next boot phase (Standard Delivery bootloader will JMP to this address)
|
||||||
|
; - byte array: high byte of target address of each sector, in the following order
|
||||||
|
; T00,S0E
|
||||||
|
; T00,S0D
|
||||||
|
; T00,S0C
|
||||||
|
; T00,S0B
|
||||||
|
; T00,S0A
|
||||||
|
; T00,S09
|
||||||
|
; T00,S08
|
||||||
|
; T00,S07
|
||||||
|
; T00,S06
|
||||||
|
; T00,S05
|
||||||
|
; T00,S04
|
||||||
|
; T00,S03
|
||||||
|
; T00,S02
|
||||||
|
; T00,S01
|
||||||
|
; T00,S0F
|
||||||
|
; T01,S00
|
||||||
|
; T01,S0E
|
||||||
|
; T01,S0D
|
||||||
|
; T01,S0C
|
||||||
|
; T01,S0B
|
||||||
|
; T01,S0A
|
||||||
|
; T01,S09
|
||||||
|
; T01,S08
|
||||||
|
; T01,S07
|
||||||
|
; T01,S06
|
||||||
|
; T01,S05
|
||||||
|
; T01,S04
|
||||||
|
; T01,S03
|
||||||
|
; T01,S02
|
||||||
|
; T01,S01
|
||||||
|
; T01,S0F
|
||||||
|
; &c. (all other tracks are the same order as track 1)
|
||||||
|
; - byte: $C0 (end of data)
|
||||||
|
;
|
||||||
|
; Unused sectors are marked as $00.
|
||||||
|
;
|
||||||
|
; Address array does NOT include T00,S00. This sector holds the Standard Delivery
|
||||||
|
; code and can not be reloaded at another address (unlike DOS 3.3).
|
||||||
|
|
||||||
|
; Currently, all parameter tables are the same length (loading T00,S01-T02,S0F),
|
||||||
|
; but this is not required. Standard Delivery can load an arbitrary number of
|
||||||
|
; sectors and will move to the next track automatically.
|
||||||
|
;
|
||||||
|
|
||||||
|
SD_DOS33p
|
||||||
|
!byte $b3,$10 ; exit via JMP $10B3
|
||||||
|
!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
|
||||||
|
!byte $36,$35,$34,$33,$32,$31,$3F
|
||||||
|
!byte $C0
|
||||||
|
|
||||||
|
SD_DOS32
|
||||||
|
!byte $00,$B7 ; exit via JMP $B700 (TODO: could be $3700)
|
||||||
|
!byte $00,$00,$9E,$9D,$00,$BF,$BE,$BD
|
||||||
|
!byte $BC,$BB,$BA,$B9,$B8,$B7,$00,$9F
|
||||||
|
!byte $00,$00,$AB,$AA,$A9,$A8,$A7,$A6
|
||||||
|
!byte $A5,$A4,$A3,$A2,$A1,$A0,$00,$AC
|
||||||
|
!byte $00,$00,$00,$00,$00,$B5,$B4,$B3
|
||||||
|
!byte $B2,$B1,$B0,$AF,$AE,$AD,$00
|
||||||
|
!byte $C0
|
@ -104,7 +104,8 @@ s_cmpbne0 = $55
|
|||||||
s_writeram = $56
|
s_writeram = $56
|
||||||
s_d5timing = $57
|
s_d5timing = $57
|
||||||
s_advint = $58
|
s_advint = $58
|
||||||
STRINGCOUNT = $59
|
s_dos32b0 = $59
|
||||||
|
STRINGCOUNT = $5A
|
||||||
|
|
||||||
!zone {
|
!zone {
|
||||||
StringTable
|
StringTable
|
||||||
@ -143,7 +144,7 @@ StringTable
|
|||||||
!word .reset
|
!word .reset
|
||||||
!word .modify
|
!word .modify
|
||||||
!word .modifyto
|
!word .modifyto
|
||||||
!word .dosboot0
|
!word .dos33boot0
|
||||||
!word .prodosboot0
|
!word .prodosboot0
|
||||||
!word .pascalboot0
|
!word .pascalboot0
|
||||||
!word .mecc
|
!word .mecc
|
||||||
@ -197,6 +198,7 @@ StringTable
|
|||||||
!word .writeram
|
!word .writeram
|
||||||
!word .d5timing
|
!word .d5timing
|
||||||
!word .advint
|
!word .advint
|
||||||
|
!word .dos32boot0
|
||||||
;
|
;
|
||||||
; 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
|
||||||
@ -222,7 +224,7 @@ StringTable
|
|||||||
; can be set directly before calling PrintByID.
|
; can be set directly before calling PrintByID.
|
||||||
;
|
;
|
||||||
.header
|
.header
|
||||||
!text "Passport by 4am 2017-08-13",$00
|
!text "Passport by 4am 2017-08-15",$00
|
||||||
.mainmenu
|
.mainmenu
|
||||||
!text "________________________________________",$8D,$8D,$8D,$8D,$8D,$8D,$8D
|
!text "________________________________________",$8D,$8D,$8D,$8D,$8D,$8D,$8D
|
||||||
!text " "
|
!text " "
|
||||||
@ -355,8 +357,10 @@ StringTable
|
|||||||
!text "T%t,S%0,$%1: ",$00
|
!text "T%t,S%0,$%1: ",$00
|
||||||
.modifyto
|
.modifyto
|
||||||
!text " -> ",$00
|
!text " -> ",$00
|
||||||
.dosboot0
|
.dos33boot0
|
||||||
!text "T00,S00 Found DOS 3.3 bootloader",$8D,$00
|
!text "T00,S00 Found DOS 3.3 bootloader",$8D,$00
|
||||||
|
.dos32boot0
|
||||||
|
!text "T00,S00 Found DOS 3.2 bootloader",$8D,$00
|
||||||
.prodosboot0
|
.prodosboot0
|
||||||
!text "T00,S00 Found ProDOS bootloader",$8D,$00
|
!text "T00,S00 Found ProDOS bootloader",$8D,$00
|
||||||
.pascalboot0
|
.pascalboot0
|
||||||
|
Loading…
Reference in New Issue
Block a user