diff --git a/Makefile b/Makefile index 5cb7ab2..7ac1336 100644 --- a/Makefile +++ b/Makefile @@ -32,33 +32,19 @@ asm: cd src && $(ACME) -r ../build/passport.lst -DFORWARD_DECRUNCHING=1 passport.a 2> ../build/relbase.log cd src && $(ACME) -DRELBASE=`cat ../build/relbase.log | grep "RELBASE =" | cut -d"=" -f2 | cut -d"(" -f2 | cut -d")" -f1` -DFORWARD_DECRUNCHING=1 passport.a 2> ../build/vars.log grep "SaveProDOS=" build/vars.log | cut -d":" -f3 | cut -d"(" -f1 > build/vars.a - grep "kForceLower=" build/vars.log | cut -d":" -f3 | cut -d"(" -f1 >> build/vars.a - grep "DiskIIArray=" build/vars.log | cut -d":" -f3 | cut -d"(" -f1 >> build/vars.a - grep "HardDiskArray=" build/vars.log | cut -d":" -f3 | cut -d"(" -f1 >> build/vars.a grep "ThisSlot=" build/vars.log | cut -d":" -f3 | cut -d"(" -f1 >> build/vars.a grep "PrintByID=" build/vars.log | cut -d":" -f3 | cut -d"(" -f1 >> build/vars.a grep "WaitForKey=" build/vars.log | cut -d":" -f3 | cut -d"(" -f1 >> build/vars.a grep "CleanExit=" build/vars.log | cut -d":" -f3 | cut -d"(" -f1 >> build/vars.a grep "GetVolumeName=" build/vars.log | cut -d":" -f3 | cut -d"(" -f1 >> build/vars.a - grep "OnlineReturn=" build/vars.log | cut -d":" -f3 | cut -d"(" -f1 >> build/vars.a grep "GetVolumeInfo=" build/vars.log | cut -d":" -f3 | cut -d"(" -f1 >> build/vars.a - grep "filetype=" build/vars.log | cut -d":" -f3 | cut -d"(" -f1 >> build/vars.a - grep "access=" build/vars.log | cut -d":" -f3 | cut -d"(" -f1 >> build/vars.a - grep "VolumeName=" build/vars.log | cut -d":" -f3 | cut -d"(" -f1 >> build/vars.a - grep "RAMDiskImagePath=" build/vars.log | cut -d":" -f3 | cut -d"(" -f1 >> build/vars.a - grep "auxtype=" build/vars.log | cut -d":" -f3 | cut -d"(" -f1 >> build/vars.a - grep "blocks=" build/vars.log | cut -d":" -f3 | cut -d"(" -f1 >> build/vars.a grep "PREFSVER=" build/vars.log | cut -d":" -f3 | cut -d"(" -f1 >> build/vars.a grep "PREFSFILE=" build/vars.log | cut -d":" -f3 | cut -d"(" -f1 >> build/vars.a - grep "PREFSREADLEN=" build/vars.log | cut -d":" -f3 | cut -d"(" -f1 >> build/vars.a - grep "PREFSBUFFER=" build/vars.log | cut -d":" -f3 | cut -d"(" -f1 >> build/vars.a - grep "ValidatePrefs=" build/vars.log | cut -d":" -f3 | cut -d"(" -f1 >> build/vars.a - grep "SavePrefs=" build/vars.log | cut -d":" -f3 | cut -d"(" -f1 >> build/vars.a - grep "mliparam=" build/vars.log | cut -d":" -f3 | cut -d"(" -f1 >> build/vars.a grep "OpenFile=" build/vars.log | cut -d":" -f3 | cut -d"(" -f1 >> build/vars.a grep "ReadFile=" build/vars.log | cut -d":" -f3 | cut -d"(" -f1 >> build/vars.a grep "CloseFile=" build/vars.log | cut -d":" -f3 | cut -d"(" -f1 >> build/vars.a - grep "CheckCache=" build/vars.log | cut -d":" -f3 | cut -d"(" -f1 >> build/vars.a + grep "SLOT=" build/vars.log | cut -d":" -f3 | cut -d"(" -f1 >> build/vars.a + grep "DRIVE=" build/vars.log | cut -d":" -f3 | cut -d"(" -f1 >> build/vars.a $(EXOMIZER) -b build/passport.tmp -o build/passport.pak cd src && $(ACME) -DFORWARD_DECRUNCHING=0 wrapper.a cp res/work.po "$(BUILDDISK)".po diff --git a/src/apidefs.a b/src/apidefs.a index 6c34cec..c888c32 100644 --- a/src/apidefs.a +++ b/src/apidefs.a @@ -89,6 +89,8 @@ RELBASE = $2000 ; dummy assignment for first build } LOWPOINT = $4000 ; lowest available address for code HIGHPOINT = $B200 ; highest available address+1 for code +PREFSBUFFER = $B600 +PREFSREADLEN = $0003 BASEPAGE = $10 ; high byte of $1000-byte buffer that ; holds sector data for current track ; Special Delivery tracer assumes this diff --git a/src/initscan.a b/src/initscan.a index f43cb22..a25595a 100644 --- a/src/initscan.a +++ b/src/initscan.a @@ -173,93 +173,3 @@ ScanForRAMAndHardDisks dey bne - rts - -;------------------------------- -; 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 + - jmp SavePrefs -+ 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 -;------------------------------- -LoadFile1Shot - clc - pla - sta $00 - adc #$08 - tax - pla - sta $01 - adc #$00 - 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 @exit ; 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) -@exit rts diff --git a/src/passport.a b/src/passport.a index 8167a26..903a7fe 100755 --- a/src/passport.a +++ b/src/passport.a @@ -40,7 +40,9 @@ VERBOSE = $00 ; set to $01 to display API label addresses !to "../build/PASSPORT.TMP",plain !ct "lcase.ct" - !source "apidefs.a" ; no code in here + ; no code in these + !source "apidefs.a" + !source "prefs.save.a" FirstMover jmp MainMenu @@ -258,10 +260,8 @@ Cleanup CleanExit jsr Cleanup jsr SwapProDOS ; ProDOS out -> in - lda gChangedPrefs - bne + - jsr SavePrefs -+ jsr PRODOSMLI ; does not return + +SavePrefs + jsr PRODOSMLI ; does not return !byte $65 !word + + !byte $04 @@ -465,8 +465,8 @@ _byte_skip_hi: !source "id/dinkeydos.a" !source "id/advent.a" !source "id/panglosdos.a" - !source "id/bootfailure.a" !source "id/davidson.a" + !source "id/bootfailure.a" !source "id/holle.a" !source "id/phoenix.a" !source "id/555.a" @@ -526,8 +526,6 @@ _byte_skip_hi: !warn "PREFSBUFFER=",PREFSBUFFER !warn "PREFSREADLEN=",PREFSREADLEN !warn "PREFSVER=",PREFSVER - !warn "SavePrefs=",SavePrefs - !warn "ValidatePrefs=",ValidatePrefs !warn "kForceLower=",kForceLower !warn "PrintByID=",PrintByID !warn "DiskIIArray=",DiskIIArray @@ -535,4 +533,7 @@ _byte_skip_hi: !warn "ThisSlot=",ThisSlot !warn "CheckCache=",CheckCache !warn "IDBootFailure=",IDBootFailure + !warn "PREFSVER=",PREFSVER + !warn "SLOT=",SLOT + !warn "DRIVE=",DRIVE } diff --git a/src/prefs.a b/src/prefs.a index 59a788a..efe28b8 100755 --- a/src/prefs.a +++ b/src/prefs.a @@ -1,13 +1,7 @@ -CURRENTVER = $30 ; ASCII "0" -DEFSLOT = $36 ; ASCII "6" -DEFDRIVE = $32 ; ASCII "2" - PREFSFILE !byte prefs_e-prefs_b prefs_b !text "PASSPORT.CONF" prefs_e -PREFSBUFFER = $B600 -PREFSREADLEN = $0003 PREFSVER !byte $FF SLOT !byte $FF @@ -19,101 +13,3 @@ DRIVE !byte $FF !text "|+---WRITE SLOT (1-7)",$8D !text "+---PREFS VERSION (DO NOT CHANGE)",$8D PREFSWRITELEN = *-PREFSVER - -;------------------------------- -; SavePrefs -; save preferences to file -; -; in: ProDOS must be in memory -;------------------------------- -SavePrefs - jsr ValidatePrefs - lda #PREFSFILE - sta mliparam+2 - jsr DeleteFile ; don't care if this fails - lda #$04 ; text file type - sta mliparam+4 - lda #$00 - sta mliparam+5 ; no aux file type - sta mliparam+6 - jsr CreateFile - bcs + - lda #PREFSBUFFER - sta mliparam+4 - jsr OpenFile - bcs + - ldy #PREFSVER - sty mliparam+3 - ldy #PREFSWRITELEN - sty mliparam+5 - jsr WriteFile - jsr CloseFile -+ rts - -;------------------------------- -; ValidatePrefs -; Sanity-check preferences and reset to -; default values for any variables that -; are out of range. -; If the first value (PREFSVER) is -; not recognized, all other values are -; reset to defaults. -; -; in: none -; out: C set if any prefs were changed -; C clear if all prefs were valid -; A,X clobbered -;------------------------------- -ValidatePrefs - ldx #$00 - lda PREFSVER - cmp #CURRENTVER - beq @checkslot - lda #CURRENTVER - sta PREFSVER - lda #$FF - sta SLOT - sta DRIVE - inx -@checkslot - lda SLOT - sec - sbc #$30 - beq @badslot - cmp #$08 - bcc @checkdrive -@badslot - lda #DEFSLOT - sta SLOT - inx -@checkdrive - lda DRIVE - sec - sbc #$30 - beq @baddrive - cmp #$03 - bcc @checks6d1 -@baddrive - lda #DEFDRIVE - sta DRIVE - inx -@checks6d1 - lda SLOT - cmp #$36 - bne @done - lda DRIVE - cmp #$31 - bne @done - lda #$32 - sta DRIVE - inx -@done cpx #$01 ; set carry if anything changed - rts diff --git a/src/prefs.load.a b/src/prefs.load.a new file mode 100644 index 0000000..7784ada --- /dev/null +++ b/src/prefs.load.a @@ -0,0 +1,79 @@ +CURRENTVER = $30 ; ASCII "0" +DEFSLOT = $36 ; ASCII "6" +DEFDRIVE = $32 ; ASCII "2" + +;------------------------------- +; LoadPrefs +; load preferences from file +; +; in: ProDOS must be in memory +;------------------------------- +!macro LoadPrefs { + lda #PREFSFILE + sta mliparam+2 + lda #PREFSBUFFER + sta mliparam+4 + jsr OpenFile + bcs + + ldy #PREFSVER + sty mliparam+3 + ldy #PREFSREADLEN + sty mliparam+5 + jsr ReadFile + jsr CloseFile ; always close whether read worked or not +; +; Sanity-check preferences and reset to +; default values for any variables that +; are out of range. +; If the first value (PREFSVER) is +; not recognized, all other values are +; reset to defaults. +; ++ + lda PREFSVER + cmp #CURRENTVER + beq + + lda #CURRENTVER + sta PREFSVER + lda #$FF + sta SLOT + sta DRIVE ++ + lda SLOT + sec + sbc #$30 + beq @badslot + cmp #$08 + bcc @checkdrive +@badslot + lda #DEFSLOT + sta SLOT +@checkdrive + lda DRIVE + sec + sbc #$30 + beq @baddrive + cmp #$03 + bcc @checks6d1 +@baddrive + lda #DEFDRIVE + sta DRIVE +@checks6d1 + lda SLOT + cmp #$36 + bne + + lda DRIVE + cmp #$31 + bne + + lda #$32 + sta DRIVE ++ +} diff --git a/src/prefs.save.a b/src/prefs.save.a new file mode 100644 index 0000000..b825d09 --- /dev/null +++ b/src/prefs.save.a @@ -0,0 +1,41 @@ +;------------------------------- +; SavePrefs +; save preferences to file +; +; in: ProDOS must be in memory +;------------------------------- +!macro SavePrefs { + lda gChangedPrefs + bne + + lda #PREFSFILE + sta mliparam+2 + jsr DeleteFile ; don't care if this fails + lda #FULL_ACCESS + sta mliparam+3 + lda #$04 ; text file type + sta mliparam+4 + lda #$00 + sta mliparam+5 ; no aux file type + sta mliparam+6 + jsr CreateFile + bcs + + lda #PREFSBUFFER + sta mliparam+4 + jsr OpenFile + bcs + + ldy #PREFSVER + sty mliparam+3 + ldy #PREFSWRITELEN + sty mliparam+5 + jsr WriteFile + jsr CloseFile ++ +} diff --git a/src/wrapper.a b/src/wrapper.a index 78d0be7..23fcc0e 100644 --- a/src/wrapper.a +++ b/src/wrapper.a @@ -2,7 +2,11 @@ *=$2000 !to "../build/PASSPORT.SYSTEM",plain - !source "../build/vars.a" ; no code in here + ; no code in these + !source "apidefs.a" + !source "strings/enid.a" + !source "prefs.load.a" + !source "../build/vars.a" bit $C082 ; read ROM, no write sta $C00E ; primary character set @@ -46,7 +50,7 @@ OneTimeSetup jmp CleanExit + jsr ScanForRAMAndHardDisks; scan for things that look like RAM disks or hard disks - jsr LoadPrefs ; load preferences (if available) + +LoadPrefs ; load preferences (if available) jsr ThisSlot ; get information about selected drive and set gTargetType for main menu lda $FE sta $F0 @@ -68,8 +72,6 @@ OneTimeSetup bne - jmp ($FE) - !source "apidefs.a" - !source "strings/enid.a" !source "initscan.a" SHOW_PROGRESS_DURING_DECRUNCH = 1 ; activates optional UI code in exodecrunch diff --git a/winmake.bat b/winmake.bat index 23138cf..d349375 100644 --- a/winmake.bat +++ b/winmake.bat @@ -25,33 +25,19 @@ cd ..\src for /f "tokens=2,3 delims=)" %%q in ('find "RELBASE =" ..\build\out.txt') do set _make=%%q 2>..\build\out.txt %ACME% -r ..\build\passport.lst -DRELBASE=$%_make:~-4% -DFORWARD_DECRUNCHING=1 passport.a for /f "tokens=4,* delims=:(" %%q in ('find "SaveProDOS=" ..\build\out.txt') do echo %%q > ..\build\vars.a -for /f "tokens=4,* delims=:(" %%q in ('find "kForceLower=" ..\build\out.txt') do echo %%q >> ..\build\vars.a -for /f "tokens=4,* delims=:(" %%q in ('find "DiskIIArray=" ..\build\out.txt') do echo %%q >> ..\build\vars.a -for /f "tokens=4,* delims=:(" %%q in ('find "HardDiskArray=" ..\build\out.txt') do echo %%q >> ..\build\vars.a for /f "tokens=4,* delims=:(" %%q in ('find "ThisSlot=" ..\build\out.txt') do echo %%q >> ..\build\vars.a for /f "tokens=4,* delims=:(" %%q in ('find "PrintByID=" ..\build\out.txt') do echo %%q >> ..\build\vars.a for /f "tokens=4,* delims=:(" %%q in ('find "WaitForKey=" ..\build\out.txt') do echo %%q >> ..\build\vars.a for /f "tokens=4,* delims=:(" %%q in ('find "CleanExit=" ..\build\out.txt') do echo %%q >> ..\build\vars.a for /f "tokens=4,* delims=:(" %%q in ('find "GetVolumeName=" ..\build\out.txt') do echo %%q >> ..\build\vars.a -for /f "tokens=4,* delims=:(" %%q in ('find "OnlineReturn=" ..\build\out.txt') do echo %%q >> ..\build\vars.a for /f "tokens=4,* delims=:(" %%q in ('find "GetVolumeInfo=" ..\build\out.txt') do echo %%q >> ..\build\vars.a -for /f "tokens=4,* delims=:(" %%q in ('find "filetype=" ..\build\out.txt') do echo %%q >> ..\build\vars.a -for /f "tokens=4,* delims=:(" %%q in ('find "access=" ..\build\out.txt') do echo %%q >> ..\build\vars.a -for /f "tokens=4,* delims=:(" %%q in ('find "VolumeName=" ..\build\out.txt') do echo %%q >> ..\build\vars.a -for /f "tokens=4,* delims=:(" %%q in ('find "RAMDiskImagePath=" ..\build\out.txt') do echo %%q >> ..\build\vars.a -for /f "tokens=4,* delims=:(" %%q in ('find "auxtype=" ..\build\out.txt') do echo %%q >> ..\build\vars.a -for /f "tokens=4,* delims=:(" %%q in ('find "blocks=" ..\build\out.txt') do echo %%q >> ..\build\vars.a for /f "tokens=4,* delims=:(" %%q in ('find "PREFSVER=" ..\build\out.txt') do echo %%q >> ..\build\vars.a for /f "tokens=4,* delims=:(" %%q in ('find "PREFSFILE=" ..\build\out.txt') do echo %%q >> ..\build\vars.a -for /f "tokens=4,* delims=:(" %%q in ('find "PREFSREADLEN=" ..\build\out.txt') do echo %%q >> ..\build\vars.a -for /f "tokens=4,* delims=:(" %%q in ('find "PREFSBUFFER=" ..\build\out.txt') do echo %%q >> ..\build\vars.a -for /f "tokens=4,* delims=:(" %%q in ('find "ValidatePrefs=" ..\build\out.txt') do echo %%q >> ..\build\vars.a -for /f "tokens=4,* delims=:(" %%q in ('find "SavePrefs=" ..\build\out.txt') do echo %%q >> ..\build\vars.a -for /f "tokens=4,* delims=:(" %%q in ('find "mliparam=" ..\build\out.txt') do echo %%q >> ..\build\vars.a for /f "tokens=4,* delims=:(" %%q in ('find "OpenFile=" ..\build\out.txt') do echo %%q >> ..\build\vars.a for /f "tokens=4,* delims=:(" %%q in ('find "ReadFile=" ..\build\out.txt') do echo %%q >> ..\build\vars.a for /f "tokens=4,* delims=:(" %%q in ('find "CloseFile=" ..\build\out.txt') do echo %%q >> ..\build\vars.a -for /f "tokens=4,* delims=:(" %%q in ('find "CheckCache=" ..\build\out.txt') do echo %%q >> ..\build\vars.a +for /f "tokens=4,* delims=:(" %%q in ('find "SLOT=" ..\build\out.txt') do echo %%q >> ..\build\vars.a +for /f "tokens=4,* delims=:(" %%q in ('find "DRIVE=" ..\build\out.txt') do echo %%q >> ..\build\vars.a cd ..\build %EXOMIZER% raw -q -P23 -T4 -b passport.tmp -o passport.pak cd ..\src