59 lines
971 B
Go
59 lines
971 B
Go
// Copyright 2021-2024 Sebastian Lederer. See the file LICENSE.md for details
|
|
package main
|
|
import (
|
|
// "fmt"
|
|
"os"
|
|
"errors"
|
|
)
|
|
|
|
type UART struct {
|
|
available bool
|
|
buf [] byte
|
|
consoleChan chan byte
|
|
cpu *CPU
|
|
}
|
|
|
|
func (u *UART) read(byteaddr word) (word, error) {
|
|
var result word = 0
|
|
|
|
if len(u.buf) > 0 {
|
|
result = word(u.buf[0])
|
|
result |= 512
|
|
} else {
|
|
select {
|
|
case inbyte, ok := <-u.consoleChan:
|
|
if ! ok {
|
|
return 0, errors.New("console channel error")
|
|
} else {
|
|
u.buf = make([]byte, 1)
|
|
u.buf[0] = inbyte
|
|
// fmt.Println("Read input:", inbyte)
|
|
idle(false)
|
|
}
|
|
default:
|
|
idle(true)
|
|
}
|
|
}
|
|
|
|
return result, nil
|
|
}
|
|
|
|
func (u *UART) write(value word, byteaddr word) (error) {
|
|
var err error = nil
|
|
|
|
idle(false)
|
|
|
|
if value & 512 != 0 {
|
|
u.buf = u.buf[1:]
|
|
// fmt.Println("rx_clear: len ", len(u.buf))
|
|
}
|
|
|
|
if value & 1024 != 0 {
|
|
buf := make([] byte, 1)
|
|
buf[0] = byte(value & 255)
|
|
_ , err = os.Stdout.Write(buf)
|
|
}
|
|
|
|
return err
|
|
}
|
|
|