passport/src/standarddelivery.a
Peter Ferrie f7ede6ef84 pack T00 analyzers
define a global page for shared content
make nib table global
autoclear filters instead of case-by-case
cache IDs in global variables where useful
merge some near-duplicated routines
optimise sector reordering
allow cancel when writing from RAM
pack universal RWTS dynamically to allow easier modification
consolidate output when modifying sequential nibble table entries
make Standard Delivery accept a parameter to specify table
switch unpacker to Exomizer for cross-platform support
make relbase dynamic for easier building
makefile for windows
2017-11-08 21:47:12 -08:00

139 lines
3.3 KiB
Plaintext

; 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
dex
beq .construct32
dex
beq .construct32lo
.construct33p
lda #<SD_DOS33p
ldx #>SD_DOS33p
bne +
.construct32
lda #<SD_DOS32
ldx #>SD_DOS32
bne +
.construct32lo
lda #<SD_DOS32LO
ldx #>SD_DOS32LO
+ 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).
SD_DOS33p
; exit via JMP $10B3
!byte $b3,$10
; track 0
!byte $1E,$1D,$1C,$1B,$00,$00,$00,$00,$00,$00,$13,$12,$11,$10,$1F
; track 1
!byte $20,$2E,$2D,$2C,$2B,$2A,$29,$28,$27,$26,$25,$24,$23,$22,$21,$2F
; track 2
!byte $30,$3E,$3D,$3C,$3B,$3A,$39,$38,$37,$36,$35,$34,$33,$32,$31,$3F
!byte $C0
SD_DOS32
; exit via JMP $B700
!byte $00,$B7
; track 0
!byte $00,$00,$00,$00,$00,$BF,$BE,$BD,$BC,$BB,$BA,$B9,$B8,$B7
!byte $C0
SD_DOS32LO
; exit via JMP $3700
!byte $00,$37
; track 0
!byte $00,$00,$1C,$1B,$00,$3F,$3E,$3D,$3C,$3B,$3A,$39,$38,$37,$00
; track 1
!byte $1D,$00,$00,$29,$28,$27,$26,$25,$24,$23,$22,$21,$20,$1F,$1E,$00
; track 2
!byte $2A,$00,$00,$00,$35,$34,$33,$32,$31,$30,$2F,$2E,$2D,$2C,$2B,$00
!byte $C0