From 8a7cc67b32a9a845d5c10ecb9ed6ffb261184ae8 Mon Sep 17 00:00:00 2001 From: Terence Boldt Date: Thu, 10 Dec 2020 04:58:53 +0000 Subject: [PATCH] Add Raspberry Pi driver code --- RaspberryPi/Driver.go | 196 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 196 insertions(+) create mode 100644 RaspberryPi/Driver.go diff --git a/RaspberryPi/Driver.go b/RaspberryPi/Driver.go new file mode 100644 index 0000000..4401c30 --- /dev/null +++ b/RaspberryPi/Driver.go @@ -0,0 +1,196 @@ +package main + +import ( + //"time" + "periph.io/x/periph/conn/gpio" + "periph.io/x/periph/conn/gpio/gpioreg" + "periph.io/x/periph/host" + "fmt" + "os" +) + +var out_write gpio.PinIO +var out_read gpio.PinIO +var out_commandWrite gpio.PinIO +var out_commandRead gpio.PinIO +var out_bit3 gpio.PinIO +var out_bit2 gpio.PinIO +var out_bit1 gpio.PinIO +var out_bit0 gpio.PinIO +var in_write gpio.PinIO +var in_read gpio.PinIO +var in_commandWrite gpio.PinIO +var in_commandRead gpio.PinIO +var in_bit3 gpio.PinIO +var in_bit2 gpio.PinIO +var in_bit1 gpio.PinIO +var in_bit0 gpio.PinIO + +func readNibble() byte { + // let the Apple II know we are ready to read + fmt.Printf("let the Apple II know we are ready to read\n") + out_read.Out(gpio.Low) + + // wait for the Apple II to write + fmt.Printf("wait for the Apple II to write\n") + for in_write.Read() == gpio.High { + in_write.WaitForEdge(-1) + } + + // get a nibble of data + fmt.Printf("get a nibble of data\n") + var nibble byte + nibble = 0 + bit3 := in_bit3.Read() + bit2 := in_bit2.Read() + bit1 := in_bit1.Read() + bit0 := in_bit0.Read() + + if bit3 == gpio.High { + nibble += 8 + } + if bit2 == gpio.High { + nibble += 4 + } + if bit1 == gpio.High { + nibble += 2 + } + if bit0 == gpio.High { + nibble += 1 + } + + // let the Apple II know we are done reading + fmt.Printf("let the Apple II know we are done reading\n") + out_read.Out(gpio.High) + + // wait for the Apple II to finish writing + fmt.Printf("wait for the Apple II to finish writing\n") + for in_write.Read() == gpio.Low { + in_write.WaitForEdge(-1) + } + + return nibble +} + +func readByte() byte { + data := byte(0) + data = readNibble() << byte(4) + data += readNibble() + return data +} + +func writeNibble(data byte) { + // wait for the Apple II to be ready to read + fmt.Printf("wait for the Apple II to be ready to read\n") + for in_read.Read() == gpio.High { + in_read.WaitForEdge(-1) + } + + bit3 := gpio.Low + bit2 := gpio.Low + bit1 := gpio.Low + bit0 := gpio.Low + if ((data & 8) >> 3) == 1 { + bit3 = gpio.High + } + out_bit3.Out(bit3) + + if ((data & 4) >> 2) == 1 { + bit2 = gpio.High + } + out_bit2.Out(bit2) + + if ((data & 2) >> 1) == 1 { + bit1 = gpio.High + } + out_bit1.Out(bit1) + + if (data & 1) == 1 { + bit0 = gpio.High + } + out_bit0.Out(bit0) + + // let Apple II know we're writing + fmt.Printf("let Apple II know we're writing\n") + out_write.Out(gpio.Low) + + + // wait for the Apple II to finsih reading + fmt.Printf("wait for the Apple II to finsih reading\n") + for in_read.Read() == gpio.Low { + in_write.WaitForEdge(-1) + } + + // let the Apple II know we are done writing + fmt.Printf("let the Apple II know we are done writing\n") + out_read.Out(gpio.High) +} + +func writeByte(data byte) { + writeNibble(data >> 4) + writeNibble(data & 15) +} + +func readBlock(buffer []byte) { + for i := 0; i < 512; i++ { + writeByte(buffer[i]) + } +} + +func writeBlock() { +} + +func main() { + host.Init() + + out_write = gpioreg.ByName("GPIO5") + out_read = gpioreg.ByName("GPIO11") + out_commandWrite = gpioreg.ByName("GPIO9") + out_commandRead = gpioreg.ByName("GPIO10") + out_bit3 = gpioreg.ByName("GPIO22") + out_bit2 = gpioreg.ByName("GPIO27") + out_bit1 = gpioreg.ByName("GPIO17") + out_bit0 = gpioreg.ByName("GPIO4") + in_write = gpioreg.ByName("GPIO12") + in_read = gpioreg.ByName("GPIO16") + in_commandWrite = gpioreg.ByName("GPIO20") + in_commandRead = gpioreg.ByName("GPIO21") + in_bit3 = gpioreg.ByName("GPIO26") + in_bit2 = gpioreg.ByName("GPIO19") + in_bit1 = gpioreg.ByName("GPIO13") + in_bit0 = gpioreg.ByName("GPIO6") + + fmt.Printf("Starting Apple II RPi...\n") + fileName := "Total Replay v4.0-beta.1.hdv" + file, err := os.OpenFile(fileName, os.O_RDWR, 0755) + if err != nil { + //log.Fatal(err) + } + //if err := f.Close(); err != nil { + //log.Fatal(err) + //} + + for in_write.Read() == gpio.Low { + in_write.WaitForEdge(-1) + } + + for { + command := readByte(); + if (command == 1) { + blockLow := readByte(); + blockHigh := readByte(); + + + var block int64 + block = int64(blockHigh) * 256 + int64(blockLow) + + fmt.Printf("Read block %d\n", block) + + buffer := make([]byte, 512) + + file.ReadAt(buffer, int64(block) * 512) + readBlock(buffer) + } + } +} +