From 068c907f450d12964026bfc080dfcfda3da21452 Mon Sep 17 00:00:00 2001 From: Terence Boldt Date: Wed, 6 Oct 2021 08:34:18 -0400 Subject: [PATCH] Add support for two drives --- RaspberryPi/apple2driver/driver.go | 69 ++++++++++++++++--- .../apple2driver/handlers/readBlock.go | 15 +++- .../apple2driver/handlers/writeBlock.go | 13 +++- 3 files changed, 84 insertions(+), 13 deletions(-) diff --git a/RaspberryPi/apple2driver/driver.go b/RaspberryPi/apple2driver/driver.go index d73a008..2137888 100644 --- a/RaspberryPi/apple2driver/driver.go +++ b/RaspberryPi/apple2driver/driver.go @@ -1,8 +1,10 @@ package main import ( + "flag" "fmt" "os" + "path/filepath" "github.com/tjboldt/Apple2-IO-RPi/RaspberryPi/apple2driver/a2io" "github.com/tjboldt/Apple2-IO-RPi/RaspberryPi/apple2driver/handlers" @@ -18,26 +20,20 @@ const SaveFileCommand = 7 const MenuCommand = 8 func main() { - a2io.InitGpio() + drive1, drive2 := getDriveFiles() fmt.Printf("Starting Apple II RPi...\n") - fileName := os.Args[1] - - file, err := os.OpenFile(fileName, os.O_RDWR, 0755) - if err != nil { - fmt.Printf("ERROR: %s", err.Error()) - os.Exit(1) - } + a2io.InitGpio() for { command, err := a2io.ReadByte() if err == nil { switch command { case ReadBlockCommand: - handlers.ReadBlockCommand(file) + handlers.ReadBlockCommand(drive1, drive2) case WriteBlockCommand: - handlers.WriteBlockCommand(file) + handlers.WriteBlockCommand(drive1, drive2) case GetTimeCommand: handlers.GetTimeCommand() case ExecCommand: @@ -50,3 +46,56 @@ func main() { } } } + +func getDriveFiles() (*os.File, *os.File) { + var drive1Name string + var drive2Name string + + execName, _ := os.Executable() + path := filepath.Dir(execName) + path = filepath.Join(path, "..") + path, _ = filepath.EvalSymlinks(path) + defaultFileName := filepath.Join(path, "Apple2-IO-RPi.hdv") + + flag.StringVar(&drive1Name, "d1", "", "A ProDOS format drive image for drive 1") + flag.StringVar(&drive2Name, "d2", defaultFileName, "A ProDOS format drive image for drive 2 and will be used for drive 1 if drive 1 empty") + flag.Parse() + + var drive1 *os.File = nil + var drive2 *os.File = nil + var err error + + if len(drive1Name) > 0 { + fmt.Printf("Opening Drive 1 as: %s\n", drive1Name) + drive1, err = os.OpenFile(drive1Name, os.O_RDWR, 0755) + if err != nil { + fmt.Printf("ERROR: %s", err.Error()) + os.Exit(1) + } + } + + if len(drive2Name) > 0 { + if drive1 == nil { + fmt.Printf("Opening Drive 1 as: %s because Drive 1 was empty\n", drive2Name) + drive1, err = os.OpenFile(drive2Name, os.O_RDWR, 0755) + if err != nil { + fmt.Printf("ERROR: %s", err.Error()) + os.Exit(1) + } + } else { + fmt.Printf("Opening Drive 2 as: %s\n", drive2Name) + drive2, err = os.OpenFile(drive2Name, os.O_RDWR, 0755) + if err != nil { + fmt.Printf("ERROR: %s", err.Error()) + os.Exit(1) + } + } + } + + if drive1 == nil { + flag.PrintDefaults() + os.Exit(1) + } + + return drive1, drive2 +} diff --git a/RaspberryPi/apple2driver/handlers/readBlock.go b/RaspberryPi/apple2driver/handlers/readBlock.go index 5a8c71e..bfcb7a6 100644 --- a/RaspberryPi/apple2driver/handlers/readBlock.go +++ b/RaspberryPi/apple2driver/handlers/readBlock.go @@ -7,9 +7,20 @@ import ( "github.com/tjboldt/Apple2-IO-RPi/RaspberryPi/apple2driver/a2io" ) -func ReadBlockCommand(file *os.File) { +func ReadBlockCommand(drive1 *os.File, drive2 *os.File) { blockLow, _ := a2io.ReadByte() blockHigh, _ := a2io.ReadByte() + driveUnit, err := a2io.ReadByte() + + if err != nil { + fmt.Printf("Drive unit not sent, assuming older firmware") + } + + file := drive1 + + if driveUnit >= 8 { + file = drive2 + } buffer := make([]byte, 512) var block int64 @@ -19,7 +30,7 @@ func ReadBlockCommand(file *os.File) { file.ReadAt(buffer, int64(block)*512) - err := a2io.WriteBlock(buffer) + err = a2io.WriteBlock(buffer) if err == nil { fmt.Printf("Read block completed\n") } else { diff --git a/RaspberryPi/apple2driver/handlers/writeBlock.go b/RaspberryPi/apple2driver/handlers/writeBlock.go index 33344d5..0e1b9dc 100644 --- a/RaspberryPi/apple2driver/handlers/writeBlock.go +++ b/RaspberryPi/apple2driver/handlers/writeBlock.go @@ -7,9 +7,20 @@ import ( "github.com/tjboldt/Apple2-IO-RPi/RaspberryPi/apple2driver/a2io" ) -func WriteBlockCommand(file *os.File) { +func WriteBlockCommand(drive1 *os.File, drive2 *os.File) { blockLow, _ := a2io.ReadByte() blockHigh, _ := a2io.ReadByte() + driveUnit, err := a2io.ReadByte() + + if err != nil { + fmt.Printf("Drive unit not sent, assuming older firmware") + } + + file := drive1 + + if driveUnit >= 8 { + file = drive2 + } buffer := make([]byte, 512) var block int64