Tridora-CPU/tridoraemu/uart.go
2024-09-11 23:52:25 +02:00

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
}