forked from Apple-2-HW/Apple2-IO-RPi
Add Raspberry Pi driver code
This commit is contained in:
parent
f14d09c142
commit
8a7cc67b32
196
RaspberryPi/Driver.go
Normal file
196
RaspberryPi/Driver.go
Normal file
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user