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 { !zone {
SaveFile1Shot SaveFile1Shot
pla
sta $00
pla
sta $01
tax
lda #$0B
clc clc
adc $00 pla
bcc .noinc adc #$0B
inx sta $00
.noinc tax
tay pla
txa adc #$00
sta $01
pha pha
tya txa
pha pha
ldy #$01 ldy #$01
@@ -211,85 +206,6 @@ SaveFile1Shot
rts 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 ; open file via ProDOS MLI
; ;

View File

@@ -96,7 +96,26 @@ FM lda LastMover - 256,x
lda FM+5 lda FM+5
cmp #(>RELBASE)-((>(RELBASE+255))->RELBASE)-1 cmp #(>RELBASE)-((>(RELBASE+255))->RELBASE)-1
bne FM 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 FirstMover
!pseudopc RELBASE { !pseudopc RELBASE {
@@ -165,24 +184,6 @@ FirstMover
!source "rwts.a" !source "rwts.a"
!source "standarddelivery.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 ResetVector
lda #<ResetVector lda #<ResetVector
sta $03F2 sta $03F2
@@ -871,6 +872,6 @@ LastMover
} }
} else { } else {
!if (HIGHPOINT - (LastMover - FirstMover)) < LOWPOINT { !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 .read
lda KEY lda KEY
bmi .cancel bpl .continue
jmp .cancel
.continue
asl gTrack asl gTrack
jsr ReadChoplifter jsr ReadChoplifter
lsr gTrack lsr gTrack
@@ -32,9 +35,69 @@ Choplifter
lda gTrack lda gTrack
cmp #$23 cmp #$23
bne .read 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 jsr .cleanup
jmp Pass jmp Pass
.cancel
jsr .cleanup
jmp Cancel
.cleanup .cleanup
lda $C0E8 lda $C0E8
lda #$01 lda #$01
@@ -42,15 +105,6 @@ Choplifter
sta dct+1 sta dct+1
rts 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 ReadChoplifter
lda #BASEPAGE lda #BASEPAGE
sta modsrc+1 sta modsrc+1
@@ -82,6 +136,7 @@ ReadChoplifter
.checkkey1 .checkkey1
lda KEY lda KEY
.linkcancel1
bmi .cancel bmi .cancel
jsr .readnib jsr .readnib
- cmp #$DD - cmp #$DD
@@ -92,6 +147,9 @@ ReadChoplifter
jsr .readnib jsr .readnib
cmp #$D5 cmp #$D5
bne -- ; this is the same bug bne -- ; this is the same bug
nop ; timing bits
nop ; timing bits
nop ; timing bits
ldx #$03 ldx #$03
- jsr .read4x4 - jsr .read4x4
jsr .read4x4 jsr .read4x4
@@ -123,11 +181,12 @@ ReadChoplifter
.retry0 .retry0
dex dex
beq .jmpfatal beq .fatal
.checkkey0 .checkkey0
lda KEY lda KEY
bmi .jmpcancel .linkcancel2
bmi .linkcancel1
jsr .readnib jsr .readnib
- cmp cmp2+1 - cmp cmp2+1
bne .checkkey0 bne .checkkey0
@@ -138,6 +197,9 @@ ReadChoplifter
cmp cmp1+1 cmp cmp1+1
bne -- ; this is a bug bne -- ; this is a bug
; it allows PR0 PR1 [any] PR1 PR2 instead of requiring PR0 PR1 PR2 ; it allows PR0 PR1 [any] PR1 PR2 instead of requiring PR0 PR1 PR2
nop ; timing bits
nop ; timing bits
nop ; timing bits
ldy #0 ldy #0
-- jsr .read4x4 -- jsr .read4x4
sta (modsrc), y sta (modsrc), y
@@ -160,11 +222,10 @@ ReadChoplifter
sta cmp1+0 ; epilog sta cmp1+0 ; epilog
rts rts
.jmpfatal .fatal
jmp .fatal jsr .cleanup
; if we get to here, we've
.jmpcancel jmp FatalError ; decided the read error is fatal
jmp .cancel
.checktrack20 .checktrack20
beq .readtrack20 beq .readtrack20
@@ -184,7 +245,8 @@ ReadChoplifter
.checkkey2 .checkkey2
lda KEY lda KEY
bmi .jmpcancel .linkcancel3
bmi .linkcancel2
jsr .readnib jsr .readnib
.prolog1 .prolog1
- cmp #$D1 ; SMC - cmp #$D1 ; SMC
@@ -198,15 +260,17 @@ ReadChoplifter
cmp #$D1 ; SMC cmp #$D1 ; SMC
bne -- ; this is the same bug bne -- ; this is the same bug
nop ; timing bits nop ; timing bits
nop ; timing bits
nop ; timing bits
ldx #$00 ldx #$00
- jsr .read4x4 - jsr .read4x4
sta (BASEPAGE+1)<<8,x sta (BASEPAGE+8)<<8,x
inx inx
jsr .read4x4 jsr .read4x4
sta (BASEPAGE+1)<<8,x sta (BASEPAGE+8)<<8,x
inx inx
jsr .read4x4 jsr .read4x4
sta (BASEPAGE+1)<<8,x sta (BASEPAGE+8)<<8,x
inx inx
cmp #$EA cmp #$EA
bne - bne -
@@ -222,7 +286,7 @@ ReadChoplifter
dex dex
beq ++ beq ++
+ lda KEY + lda KEY
bmi .jmpcancel bmi .linkcancel3
jsr .readnib jsr .readnib
- cmp #$D5 - cmp #$D5
bne .checkkey3 bne .checkkey3
@@ -232,6 +296,9 @@ ReadChoplifter
jsr .readnib jsr .readnib
cmp #$DD cmp #$DD
bne -- ; this is the same bug bne -- ; this is the same bug
nop ; timing bits
nop ; timing bits
nop ; timing bits
ldx #$00 ldx #$00
- jsr .read4x4 - jsr .read4x4
sta BASEPAGE<<8,x sta BASEPAGE<<8,x
@@ -254,4 +321,118 @@ ReadChoplifter
- lda $C0EC - lda $C0EC
bpl - bpl -
rts 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 !text "+---PREFS VERSION (DO NOT CHANGE)",$8D
PREFSWRITELEN = *-PREFSVER 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 ; SavePrefs
; save preferences to file ; save preferences to file

View File

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

View File

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