initial commit
This commit is contained in:
commit
60db522e87
107 changed files with 36924 additions and 0 deletions
59
tridoraemu/uart.go
Normal file
59
tridoraemu/uart.go
Normal file
|
|
@ -0,0 +1,59 @@
|
|||
// 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
|
||||
}
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue