auto-crack Choplifter (read-only)

also make one-time procs discardable and double stringtable capacity
This commit is contained in:
Peter Ferrie 2019-04-15 17:15:36 -07:00
parent 74a6d52420
commit 3601c5be62
8 changed files with 682 additions and 387 deletions

205
src/initscan.a Normal file
View File

@ -0,0 +1,205 @@
;-------------------------------
; ScanForDiskII
; scan all slots for things that
; look like Disk II cards
;
; out: all registers clobbered
; all flags clobbered
; DiskIIArray filled with 00 or FF
;-------------------------------
!zone {
ScanForDiskII
lda #$00
sta cmp1
ldx #$07
.fingerprint
txa
ora #$C0
sta cmp1+1
ldy #$01
lda (cmp1),y
cmp #$20
bne .next
ldy #$03
lda (cmp1),y
bne .next
ldy #$05
lda (cmp1),y
cmp #$03
bne .next
ldy #$FF
lda (cmp1),y
bne .next
tya
sta DiskIIArray-1,x
.next
dex
bne .fingerprint
rts
}
!zone {
ScanForRAMDisk
lda #$00
sta iunit
- lda iunit
clc
adc #$10
sta iunit
beq .done
cmp #$80
beq -
pha
and #$70
lsr
lsr
lsr
lsr
tay
pla
ldx DiskIIArray-1,y
bne -
jsr GetVolumeName
bcs -
lda OnlineReturn
beq -
jsr GetVolumeInfo
;watch for RAM disk type
lda filetype
and #$0F
cmp #$0F
bne -
;check for RAM[x] by name
ldy OnlineReturn
cpy #4
beq +
cpy #5
bne -
dey
+
-- lda SlashRAM-1,y
cmp VolumeName-1,y
bne -
dey
bne --
;check free space
;need at least $118 blocks
sec
lda auxtype
sbc blocks
tax
lda auxtype+1
sbc blocks+1
cmp #1
bcc -
bne +
cpx #$18
bcc -
+ lda #TRUE
sta gUsingRAMDisk
.done
rts
SlashRAM !byte $2F, $52, $41, $4D
}
;-------------------------------
; LoadPrefs
; load preferences from file
;
; in: ProDOS must be in memory
;-------------------------------
LoadPrefs
lda #$FF
sta PREFSVER
jsr LoadFile1Shot
!word PREFSFILE
!word PREFSVER
!word PREFSREADLEN
!word PREFSBUFFER
jsr ValidatePrefs
bcc .goodprefs
jmp SavePrefs
.goodprefs
rts
;-------------------------------
; LoadFile1Shot
; load a file into memory all at once,
; using ProDOS MLI calls
;
; in: stack contains 8 bytes of parameters:
; +1 address of pathname
; +3 address of data buffer (to receive file contents)
; +5 [word] maximum length of data to read
; +7 address of ProDOS file buffer
; out: if C set, load failed and A contains error code
; from open or read
; if C clear, load succeeded and ($02) contains
; data loaded from file
; all other flags clobbered
; all registers clobbered
; stack set to next instruction after parameters
;-------------------------------
!zone {
LoadFile1Shot
clc
pla
adc #$08
sta $00
tax
pla
adc #$00
sta $01
pha
txa
pha
ldy #$01
lda ($00),y ; lo byte of pathname
sta mliparam+1
iny
lda ($00),y ; hi byte of pathname
sta mliparam+2
ldy #$07
lda ($00),y ; lo byte of ProDOS file buffer
sta mliparam+3
iny
lda ($00),y ; hi byte of ProDOS file buffer
sta mliparam+4
jsr OpenFile
bcs .loadfile1s ; C set on error
pha ; push file reference number
ldy #$03
lda ($00),y ; lo address of data buffer
sta mliparam+2
iny
lda ($00),y ; hi address of data buffer
sta mliparam+3
iny
lda ($00),y ; lo data length
sta mliparam+4
iny
lda ($00),y ; hi data length
sta mliparam+5
pla ; pull file reference number
jsr ReadFile
php ; save flags from readfile
pha
jsr CloseFile ; always close whether read worked or not
pla
plp ; restore flags from readfile
; (so caller gets codes from read attempt,
; not close)
.loadfile1s
rts
}

100
src/mli.a
View File

@ -139,21 +139,16 @@ WriteTrackMLI
;-------------------------------
!zone {
SaveFile1Shot
pla
sta $00
pla
sta $01
tax
lda #$0B
clc
adc $00
bcc .noinc
inx
.noinc
tay
txa
pla
adc #$0B
sta $00
tax
pla
adc #$00
sta $01
pha
tya
txa
pha
ldy #$01
@ -211,85 +206,6 @@ SaveFile1Shot
rts
}
;-------------------------------
; LoadFile1Shot
; load a file into memory all at once,
; using ProDOS MLI calls
;
; in: stack contains 8 bytes of parameters:
; +1 address of pathname
; +3 address of data buffer (to receive file contents)
; +5 [word] maximum length of data to read
; +7 address of ProDOS file buffer
; out: if C set, load failed and A contains error code
; from open or read
; if C clear, load succeeded and ($02) contains
; data loaded from file
; all other flags clobbered
; all registers clobbered
; stack set to next instruction after parameters
;-------------------------------
!zone {
LoadFile1Shot
pla
sta $00
pla
sta $01
tax
lda #$08
clc
adc $00
bcc .noinc
inx
.noinc
tay
txa
pha
tya
pha
ldy #$01
lda ($00),y ; lo byte of pathname
sta mliparam+1
iny
lda ($00),y ; hi byte of pathname
sta mliparam+2
ldy #$07
lda ($00),y ; lo byte of ProDOS file buffer
sta mliparam+3
iny
lda ($00),y ; hi byte of ProDOS file buffer
sta mliparam+4
jsr OpenFile
bcs .loadfile1s ; C set on error
pha ; push file reference number
ldy #$03
lda ($00),y ; lo address of data buffer
sta mliparam+2
iny
lda ($00),y ; hi address of data buffer
sta mliparam+3
iny
lda ($00),y ; lo data length
sta mliparam+4
iny
lda ($00),y ; hi data length
sta mliparam+5
pla ; pull file reference number
jsr ReadFile
php ; save flags from readfile
pha
jsr CloseFile ; always close whether read worked or not
pla
plp ; restore flags from readfile
; (so caller gets codes from read attempt,
; not close)
.loadfile1s
rts
}
;-------------------------------
; open file via ProDOS MLI
;

View File

@ -96,7 +96,26 @@ FM lda LastMover - 256,x
lda FM+5
cmp #(>RELBASE)-((>(RELBASE+255))->RELBASE)-1
bne FM
jmp OneTimeSetup
OneTimeSetup
lda $C0E8
jsr SaveProDOS
ldx MACHINEID
cpx #$EA
bne .slotscan
lda #$DF
sta kForceLower
.slotscan
jsr ScanForDiskII
lda DiskIIArray+5
bne .founds6
jmp FatalNoSlot6
.founds6
jsr ScanForRAMDisk
jsr LoadPrefs ; load preferences (if available)
jmp ResetVector
!source "initscan.a"
FirstMover
!pseudopc RELBASE {
@ -165,24 +184,6 @@ FirstMover
!source "rwts.a"
!source "standarddelivery.a"
OneTimeSetup
lda $C0E8
jsr SaveProDOS
ldx MACHINEID
cpx #$EA
bne .slotscan
lda #$DF
sta kForceLower
.slotscan
jsr ScanForDiskII
lda DiskIIArray+5
bne .founds6
jmp FatalNoSlot6
.founds6
jsr ScanForRAMDisk
jsr LoadPrefs ; load preferences (if available)
bcc ResetVector
jsr SavePrefs ; save preferences (if possible)
ResetVector
lda #<ResetVector
sta $03F2
@ -871,6 +872,6 @@ LastMover
}
} else {
!if (HIGHPOINT - (LastMover - FirstMover)) < LOWPOINT {
!serious "code is too large to fit in available space!"
!serious "code end (", HIGHPOINT - (LastMover - FirstMover), ") is below minimum (", LOWPOINT, ")!"
}
}

View File

@ -19,7 +19,10 @@ Choplifter
.read
lda KEY
bmi .cancel
bpl .continue
jmp .cancel
.continue
asl gTrack
jsr ReadChoplifter
lsr gTrack
@ -32,9 +35,69 @@ Choplifter
lda gTrack
cmp #$23
bne .read
; start with RDOS as a minimal SD base
; and copy SD code for free
ldx #ID_RDOS13
jsr ConstructStandardDelivery
ldx #$B0
stx $104E ; exit address
stx $1050 ; next-stage addressing
inx
stx $104F ; next-stage addressing
inx
stx $105D ; next-stage addressing
lda #$10
sta modsrc+1
lda #$5E
sta modsrc
ldx #$27
lda #$67
jsr .inittable
lda #$1F
sta modsrc+1
lda #$00
sta modsrc
ldx #$87
lda #$C7
jsr .inittable
dec modsrc+1
ldx #$0F
lda #$27
jsr .inittable
ldx #$47
lda #$87
jsr .inittable2
dec $1E00
lda #$C0
sta $10DD
sta $1EAF
sta $1F7F
ldy #0
- lda .stage2,y
sta $1D00,y
iny
bne -
lda #s_bootwrite
jsr PrintByID
lda #$00
sta gTrack
jsr WriteTrackNA
inc gPatchCount
jsr .cleanup
jmp Pass
.cancel
jsr .cleanup
jmp Cancel
.cleanup
lda $C0E8
lda #$01
@ -42,15 +105,6 @@ Choplifter
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
@ -82,6 +136,7 @@ ReadChoplifter
.checkkey1
lda KEY
.linkcancel1
bmi .cancel
jsr .readnib
- cmp #$DD
@ -92,6 +147,9 @@ ReadChoplifter
jsr .readnib
cmp #$D5
bne -- ; this is the same bug
nop ; timing bits
nop ; timing bits
nop ; timing bits
ldx #$03
- jsr .read4x4
jsr .read4x4
@ -123,11 +181,12 @@ ReadChoplifter
.retry0
dex
beq .jmpfatal
beq .fatal
.checkkey0
lda KEY
bmi .jmpcancel
.linkcancel2
bmi .linkcancel1
jsr .readnib
- cmp cmp2+1
bne .checkkey0
@ -138,6 +197,9 @@ ReadChoplifter
cmp cmp1+1
bne -- ; this is a bug
; it allows PR0 PR1 [any] PR1 PR2 instead of requiring PR0 PR1 PR2
nop ; timing bits
nop ; timing bits
nop ; timing bits
ldy #0
-- jsr .read4x4
sta (modsrc), y
@ -160,11 +222,10 @@ ReadChoplifter
sta cmp1+0 ; epilog
rts
.jmpfatal
jmp .fatal
.jmpcancel
jmp .cancel
.fatal
jsr .cleanup
; if we get to here, we've
jmp FatalError ; decided the read error is fatal
.checktrack20
beq .readtrack20
@ -184,7 +245,8 @@ ReadChoplifter
.checkkey2
lda KEY
bmi .jmpcancel
.linkcancel3
bmi .linkcancel2
jsr .readnib
.prolog1
- cmp #$D1 ; SMC
@ -198,15 +260,17 @@ ReadChoplifter
cmp #$D1 ; SMC
bne -- ; this is the same bug
nop ; timing bits
nop ; timing bits
nop ; timing bits
ldx #$00
- jsr .read4x4
sta (BASEPAGE+1)<<8,x
sta (BASEPAGE+8)<<8,x
inx
jsr .read4x4
sta (BASEPAGE+1)<<8,x
sta (BASEPAGE+8)<<8,x
inx
jsr .read4x4
sta (BASEPAGE+1)<<8,x
sta (BASEPAGE+8)<<8,x
inx
cmp #$EA
bne -
@ -222,7 +286,7 @@ ReadChoplifter
dex
beq ++
+ lda KEY
bmi .jmpcancel
bmi .linkcancel3
jsr .readnib
- cmp #$D5
bne .checkkey3
@ -232,6 +296,9 @@ ReadChoplifter
jsr .readnib
cmp #$DD
bne -- ; this is the same bug
nop ; timing bits
nop ; timing bits
nop ; timing bits
ldx #$00
- jsr .read4x4
sta BASEPAGE<<8,x
@ -254,4 +321,118 @@ ReadChoplifter
- lda $C0EC
bpl -
rts
.inittable
ldy #$08
.inittable2
sta tmp
.buildtable
txa
sta (modsrc),y
dex
iny
tya
and #$0F
cmp #$0F
bne .buildtable
tya
sbc #$0F
tay
txa
sta (modsrc),y
tya
adc #$17 ; carry set by sbc
tay
txa
adc #$0F
tax
cmp tmp
bne .buildtable
rts
.stage2 !pseudopc $B000 { ; high address that won't be hit on the first round of SD
lda $c057
lda $c052
lda $c050
ldy #0
- lda .stager,y
sta $500,y
lda (*+$ff) and $ff00,y
sta $200,y
lda (*+$1ff) and $ff00,y
sta $400,y
iny
bne -
jsr .dostep4
ldy #2 ; pagehi, first table
sty $807
ldy #$60 ; rts
sty $84c
jsr .callSD ; including original $8xx to $7xx
asl $807 ; 4xx, second table
jmp $500
.stager !pseudopc $500 {
jsr .callSD
jsr .step
lda #$60
sta $801
lda #4
sta $27
jsr $823 ; read patch table
ldy #0 ; avoid CFFA bug
- lda $400,y
sta .patcher+1
lda $401,y
sta .patcher+2
lda $402,y
iny
iny
iny
.patcher
sta $d1d1
cmp #$ea
bne -
jsr .dostep2 ; reach track $22
sta $3d
dec $27
jsr $823 ; read high scores
lsr $27
lda #7
sta $26
jsr $823 ; read half of write routine to $207
asl $27
lda #0
sta $26
jsr $823 ; read half of write routine to $600
ldy #0 ; avoid CFFA bug
- lda ($26),y
sta $800,y
lda $600,y
sta $300,y
iny
bne -
jmp ($20)
.callSD
sta $806 ; pagelo
ldy #$ff
jsr $805
beq .step
.dostep4
jsr .dostep2
.dostep2
jsr .step
.step
jsr $82F
lsr $40
rts
}
}
}

View File

@ -20,22 +20,6 @@ DRIVE !byte $FF
!text "+---PREFS VERSION (DO NOT CHANGE)",$8D
PREFSWRITELEN = *-PREFSVER
;-------------------------------
; LoadPrefs
; load preferences from file
;
; in: ProDOS must be in memory
;-------------------------------
LoadPrefs
lda #$FF
sta PREFSVER
jsr LoadFile1Shot
!word PREFSFILE
!word PREFSVER
!word PREFSREADLEN
!word PREFSBUFFER
jmp ValidatePrefs
;-------------------------------
; SavePrefs
; save preferences to file

View File

@ -14,15 +14,14 @@ kForceLower !byte $FF ; AND mask for lowercase letters
;-------------------------------
!zone {
PrintByID
stx .x
stx .x+1
ldy #0 ; substitution mode flag
cmp #STRINGCOUNT
bcs .error
asl
tax
lda StringTable,x
lda StringTableLow,x
sta .print+1
lda StringTable+1,x
lda StringTableHigh,x
sta .print+2
.print
lda $FFFF ; modified at runtime
@ -83,9 +82,8 @@ PrintByID
.done
clc
.error
ldx .x
.x ldx #$d1
rts
.x !byte 00
;-------------------------------
; PrintByte

View File

@ -1,46 +1,6 @@
DiskIIArray
!byte 00,00,00,00,00,00,00
;-------------------------------
; ScanForDiskII
; scan all slots for things that
; look like Disk II cards
;
; out: all registers clobbered
; all flags clobbered
; DiskIIArray filled with 00 or FF
;-------------------------------
!zone {
ScanForDiskII
lda #$00
sta cmp1
ldx #$07
.fingerprint
txa
ora #$C0
sta cmp1+1
ldy #$01
lda (cmp1),y
cmp #$20
bne .next
ldy #$03
lda (cmp1),y
bne .next
ldy #$05
lda (cmp1),y
cmp #$03
bne .next
ldy #$FF
lda (cmp1),y
bne .next
tya
sta DiskIIArray-1,x
.next
dex
bne .fingerprint
rts
}
;-------------------------------
; NextSlot
;-------------------------------
@ -76,74 +36,3 @@ NextSlot
.reallydone
rts
}
!zone {
ScanForRAMDisk
lda #$00
sta iunit
- lda iunit
clc
adc #$10
sta iunit
beq .done
cmp #$80
beq -
pha
and #$70
lsr
lsr
lsr
lsr
tay
pla
ldx DiskIIArray-1,y
bne -
jsr GetVolumeName
bcs -
lda OnlineReturn
beq -
jsr GetVolumeInfo
;watch for RAM disk type
lda filetype
and #$0F
cmp #$0F
bne -
;check for RAM[x] by name
ldy OnlineReturn
cpy #4
beq +
cpy #5
bne -
dey
+
-- lda SlashRAM-1,y
cmp VolumeName-1,y
bne -
dey
bne --
;check free space
;need at least $118 blocks
sec
lda auxtype
sbc blocks
tax
lda auxtype+1
sbc blocks+1
cmp #1
bcc -
bne +
cpx #$18
bcc -
+ lda #TRUE
sta gUsingRAMDisk
.done
rts
SlashRAM !byte $2F, $52, $41, $4D
}

View File

@ -15,125 +15,246 @@ k_redo_with_ignore = $92; <Ctrl-R>
!source "strings/enid.a"
!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 .modify
!word .modifyto
!word .dos33boot0
!word .prodosboot0
!word .pascalboot0
!word .mecc
!word .sierra
!word .a6bc95
!word .jmpbcf0
!word .rol1e
!word .runhello
!word .e7
!word .jmpb4bb
!word .jmpb400
!word .jmpbeca
!word .bb03
!word .thunder
!word .jmpae8e
!word .diskvol
!word .d5d5f7
!word .construct
!word .datasoftb0
!word .datasoft
!word .lsr6a
!word .bcs08
!word .jmpb660
!word .protdos
!word .decryptrwts
!word .protserial
!word .fbff
!word .encoded44
!word .encoded53
!word .specdel
!word .bytrack
!word .a5count
!word .restart
!word .corrupter
!word .eaboot0
!word .eatrk6
!word .eeef
!word .poke
!word .bootcounter
!word .milliken
!word .jsr8b3
!word .daviddos
!word .quickdos
!word .diversidos
!word .prontodos
!word .jmpb412
!word .laureate
!word .bbf9
!word .micrograms
!word .cmpbne0
!word .writeram
!word .d5timing
!word .advint
!word .dos32boot0
!word .bootwrite
!word .rwtswrite
!word .rdos
!word .sra
!word .muse
!word .origin
!word .volumename
!word .dinkeydos
!word .trillium
!word .tamper
!word .microfun
!word .advent
!word .gathering
!word .davidson
!word .rdos13
!word .ssi
!word .aacount
!word .infocom18
!word .toverify
!word .sector13
!word .dakin5
!word .springboard
!word .hallabs
!word .holle
!word .hoffman
!word .diskvol0
!word .e7everywhere
!word .choplifter
StringTableLow
!byte <.header
!byte <.mainmenu
!byte <.progbar
!byte <.reading
!byte <.diskrwts
!byte <.bb00
!byte <.sunburst
!byte <.optimum
!byte <.builtin
!byte <.switch
!byte <.writing
!byte <.unformat
!byte <.f7
!byte <.sync
!byte <.optbad
!byte <.passver
!byte <.passdemuf
!byte <.passcrack
!byte <.passcrack0
!byte <.fail
!byte <.fatal0000
!byte <.fatal220f
!byte <.done
!byte <.noslot6
!byte <.writeerr
!byte <.writeioerr
!byte <.writenodev
!byte <.writeprot
!byte <.othermli
!byte <.canttrace
!byte <.canceled
!byte <.bademu
!byte <.reset
!byte <.modify
!byte <.modifyto
!byte <.dos33boot0
!byte <.prodosboot0
!byte <.pascalboot0
!byte <.mecc
!byte <.sierra
!byte <.a6bc95
!byte <.jmpbcf0
!byte <.rol1e
!byte <.runhello
!byte <.e7
!byte <.jmpb4bb
!byte <.jmpb400
!byte <.jmpbeca
!byte <.bb03
!byte <.thunder
!byte <.jmpae8e
!byte <.diskvol
!byte <.d5d5f7
!byte <.construct
!byte <.datasoftb0
!byte <.datasoft
!byte <.lsr6a
!byte <.bcs08
!byte <.jmpb660
!byte <.protdos
!byte <.decryptrwts
!byte <.protserial
!byte <.fbff
!byte <.encoded44
!byte <.encoded53
!byte <.specdel
!byte <.bytrack
!byte <.a5count
!byte <.restart
!byte <.corrupter
!byte <.eaboot0
!byte <.eatrk6
!byte <.eeef
!byte <.poke
!byte <.bootcounter
!byte <.milliken
!byte <.jsr8b3
!byte <.daviddos
!byte <.quickdos
!byte <.diversidos
!byte <.prontodos
!byte <.jmpb412
!byte <.laureate
!byte <.bbf9
!byte <.micrograms
!byte <.cmpbne0
!byte <.writeram
!byte <.d5timing
!byte <.advint
!byte <.dos32boot0
!byte <.bootwrite
!byte <.rwtswrite
!byte <.rdos
!byte <.sra
!byte <.muse
!byte <.origin
!byte <.volumename
!byte <.dinkeydos
!byte <.trillium
!byte <.tamper
!byte <.microfun
!byte <.advent
!byte <.gathering
!byte <.davidson
!byte <.rdos13
!byte <.ssi
!byte <.aacount
!byte <.infocom18
!byte <.toverify
!byte <.sector13
!byte <.dakin5
!byte <.springboard
!byte <.hallabs
!byte <.holle
!byte <.hoffman
!byte <.diskvol0
!byte <.e7everywhere
!byte <.choplifter
StringTableHigh
!byte >.header
!byte >.mainmenu
!byte >.progbar
!byte >.reading
!byte >.diskrwts
!byte >.bb00
!byte >.sunburst
!byte >.optimum
!byte >.builtin
!byte >.switch
!byte >.writing
!byte >.unformat
!byte >.f7
!byte >.sync
!byte >.optbad
!byte >.passver
!byte >.passdemuf
!byte >.passcrack
!byte >.passcrack0
!byte >.fail
!byte >.fatal0000
!byte >.fatal220f
!byte >.done
!byte >.noslot6
!byte >.writeerr
!byte >.writeioerr
!byte >.writenodev
!byte >.writeprot
!byte >.othermli
!byte >.canttrace
!byte >.canceled
!byte >.bademu
!byte >.reset
!byte >.modify
!byte >.modifyto
!byte >.dos33boot0
!byte >.prodosboot0
!byte >.pascalboot0
!byte >.mecc
!byte >.sierra
!byte >.a6bc95
!byte >.jmpbcf0
!byte >.rol1e
!byte >.runhello
!byte >.e7
!byte >.jmpb4bb
!byte >.jmpb400
!byte >.jmpbeca
!byte >.bb03
!byte >.thunder
!byte >.jmpae8e
!byte >.diskvol
!byte >.d5d5f7
!byte >.construct
!byte >.datasoftb0
!byte >.datasoft
!byte >.lsr6a
!byte >.bcs08
!byte >.jmpb660
!byte >.protdos
!byte >.decryptrwts
!byte >.protserial
!byte >.fbff
!byte >.encoded44
!byte >.encoded53
!byte >.specdel
!byte >.bytrack
!byte >.a5count
!byte >.restart
!byte >.corrupter
!byte >.eaboot0
!byte >.eatrk6
!byte >.eeef
!byte >.poke
!byte >.bootcounter
!byte >.milliken
!byte >.jsr8b3
!byte >.daviddos
!byte >.quickdos
!byte >.diversidos
!byte >.prontodos
!byte >.jmpb412
!byte >.laureate
!byte >.bbf9
!byte >.micrograms
!byte >.cmpbne0
!byte >.writeram
!byte >.d5timing
!byte >.advint
!byte >.dos32boot0
!byte >.bootwrite
!byte >.rwtswrite
!byte >.rdos
!byte >.sra
!byte >.muse
!byte >.origin
!byte >.volumename
!byte >.dinkeydos
!byte >.trillium
!byte >.tamper
!byte >.microfun
!byte >.advent
!byte >.gathering
!byte >.davidson
!byte >.rdos13
!byte >.ssi
!byte >.aacount
!byte >.infocom18
!byte >.toverify
!byte >.sector13
!byte >.dakin5
!byte >.springboard
!byte >.hallabs
!byte >.holle
!byte >.hoffman
!byte >.diskvol0
!byte >.e7everywhere
!byte >.choplifter
;
; Text can contain substitution strings, which
; are replaced by current values at runtime. Each
@ -159,7 +280,7 @@ StringTable
; can be set directly before calling PrintByID.
;
.header
!text "Passport by 4am 2019-04-13",$00
!text "Passport by 4am 2019-04-15",$00
.mainmenu
!text "________________________________________",$8D,$8D,$8D,$8D,$8D,$8D,$8D
!text " "