Fix boot of dynamic drive

This commit is contained in:
Terence Boldt 2022-12-31 12:26:45 -05:00
parent f0e67ea5ff
commit a13866a458
2 changed files with 35 additions and 24 deletions

View File

@ -57,7 +57,12 @@ func main() {
case resetCommand: case resetCommand:
handlers.ResetCommand() handlers.ResetCommand()
case readBlockCommand: case readBlockCommand:
handlers.ReadBlockCommand(drive1, drive2) var block int
block, err = handlers.ReadBlockCommand(drive1, drive2)
if err == nil && block == 0 {
resetCwd()
drive1, _ = generateDriveFromCwd()
}
case writeBlockCommand: case writeBlockCommand:
handlers.WriteBlockCommand(drive1, drive2) handlers.WriteBlockCommand(drive1, drive2)
case getTimeCommand: case getTimeCommand:
@ -67,7 +72,7 @@ func main() {
newCwd, _ := os.Getwd() newCwd, _ := os.Getwd()
if newCwd != cwd { if newCwd != cwd {
cwd = newCwd cwd = newCwd
drive1, err = generateDrive1FromCwd() drive1, _ = generateDriveFromCwd()
} }
case loadFileCommand: case loadFileCommand:
handlers.LoadFileCommand() handlers.LoadFileCommand()
@ -105,16 +110,7 @@ func getDriveFiles() (prodos.ReaderWriterAt, prodos.ReaderWriterAt) {
drive1, err = os.OpenFile(drive1Name, os.O_RDWR, 0755) drive1, err = os.OpenFile(drive1Name, os.O_RDWR, 0755)
logAndExitOnErr(err) logAndExitOnErr(err)
} else { } else {
var exec string drive1, err = generateDriveFromCwd()
exec, err = os.Executable()
if err != nil {
fmt.Printf("ERROR: %s", err.Error())
os.Exit(1)
}
cwd := filepath.Dir(exec)
err = os.Chdir(filepath.Join(cwd, "../driveimage"))
logAndExitOnErr(err)
drive1, err = generateDrive1FromCwd()
logAndExitOnErr(err) logAndExitOnErr(err)
} }
@ -134,14 +130,25 @@ func logAndExitOnErr(err error) {
} }
} }
func generateDrive1FromCwd() (prodos.ReaderWriterAt, error) { func resetCwd() {
exec, err := os.Executable()
if err != nil {
fmt.Printf("ERROR: %s", err.Error())
os.Exit(1)
}
cwd := filepath.Dir(exec)
err = os.Chdir(filepath.Join(cwd, "../driveimage"))
logAndExitOnErr(err)
}
func generateDriveFromCwd() (prodos.ReaderWriterAt, error) {
cwd, err := os.Getwd() cwd, err := os.Getwd()
if err != nil { if err != nil {
return nil, err return nil, err
} }
drive1 := prodos.NewMemoryFile(0x2000000) drive := prodos.NewMemoryFile(0x2000000)
fmt.Printf("Generating Drive 1 in memory from: %s\n", cwd) fmt.Printf("Generating Drive in memory from: %s\n", cwd)
prodos.CreateVolume(drive1, "APPLE2.IO.RPI", 65535) prodos.CreateVolume(drive, "APPLE2.IO.RPI", 65535)
err = prodos.AddFilesFromHostDirectory(drive1, cwd) err = prodos.AddFilesFromHostDirectory(drive, cwd)
return drive1, err return drive, err
} }

View File

@ -13,7 +13,7 @@ import (
) )
// ReadBlockCommand handles requests to read ProDOS blocks // ReadBlockCommand handles requests to read ProDOS blocks
func ReadBlockCommand(drive1 prodos.ReaderWriterAt, drive2 prodos.ReaderWriterAt) { func ReadBlockCommand(drive1 prodos.ReaderWriterAt, drive2 prodos.ReaderWriterAt) (int, error) {
blockLow, _ := comm.ReadByte() blockLow, _ := comm.ReadByte()
blockHigh, _ := comm.ReadByte() blockHigh, _ := comm.ReadByte()
var driveUnit byte var driveUnit byte
@ -23,7 +23,7 @@ func ReadBlockCommand(drive1 prodos.ReaderWriterAt, drive2 prodos.ReaderWriterAt
if err != nil { if err != nil {
fmt.Printf("Failed to read block") fmt.Printf("Failed to read block")
return return 0, err
} }
file := drive1 file := drive1
@ -43,7 +43,7 @@ func ReadBlockCommand(drive1 prodos.ReaderWriterAt, drive2 prodos.ReaderWriterAt
buffer, err := prodos.ReadBlock(file, block) buffer, err := prodos.ReadBlock(file, block)
if err != nil { if err != nil {
fmt.Printf("failed %s\n", err) fmt.Printf("failed %s\n", err)
return return 0, err
} }
err = comm.WriteBlock(buffer) err = comm.WriteBlock(buffer)
@ -52,10 +52,12 @@ func ReadBlockCommand(drive1 prodos.ReaderWriterAt, drive2 prodos.ReaderWriterAt
} else { } else {
fmt.Printf("failed %s\n", err) fmt.Printf("failed %s\n", err)
} }
return block, nil
} }
// WriteBlockCommand handles requests to write ProDOS blocks // WriteBlockCommand handles requests to write ProDOS blocks
func WriteBlockCommand(drive1 prodos.ReaderWriterAt, drive2 prodos.ReaderWriterAt) { func WriteBlockCommand(drive1 prodos.ReaderWriterAt, drive2 prodos.ReaderWriterAt) error {
blockLow, _ := comm.ReadByte() blockLow, _ := comm.ReadByte()
blockHigh, _ := comm.ReadByte() blockHigh, _ := comm.ReadByte()
@ -65,7 +67,7 @@ func WriteBlockCommand(drive1 prodos.ReaderWriterAt, drive2 prodos.ReaderWriterA
driveUnit, err = comm.ReadByte() driveUnit, err = comm.ReadByte()
if err != nil { if err != nil {
fmt.Printf("Failed to write block") fmt.Printf("Failed to write block")
return return err
} }
file := drive1 file := drive1
@ -87,7 +89,7 @@ func WriteBlockCommand(drive1 prodos.ReaderWriterAt, drive2 prodos.ReaderWriterA
err = comm.ReadBlock(buffer) err = comm.ReadBlock(buffer)
if err != nil { if err != nil {
fmt.Printf("failed %s\n", err) fmt.Printf("failed %s\n", err)
return return err
} }
fmt.Printf("...") fmt.Printf("...")
@ -97,4 +99,6 @@ func WriteBlockCommand(drive1 prodos.ReaderWriterAt, drive2 prodos.ReaderWriterA
} else { } else {
fmt.Printf("failed\n") fmt.Printf("failed\n")
} }
return nil
} }