36 lines
872 B
Lua
36 lines
872 B
Lua
-- UART device
|
|
-- For now, this just prints to the server console.
|
|
function LCPU.Devices.UART(base)
|
|
local uart = LCPUNative.CreateDevice(base, 0xc)
|
|
uart.buffer = ""
|
|
|
|
function uart:Peek(address)
|
|
if address == self.Base then return 0 end
|
|
if address == self.Base + 5 then return 0x60 end -- Active, but no keyboard input
|
|
return 0xffffffff
|
|
end
|
|
|
|
function uart:Poke(address, value)
|
|
if address == self.Base then
|
|
local c = bit.band(value, 0x000000ff)
|
|
if c == 0 then return end
|
|
|
|
-- On newline or reaching length limit
|
|
-- print the buffer and then reset it
|
|
if c == 0xa or #self.buffer >= 256 then
|
|
print(string.format("UART: %s", self.buffer))
|
|
self:Reset()
|
|
else
|
|
-- Not a newline so we can keep going with it
|
|
self.buffer = self.buffer .. string.char(c)
|
|
end
|
|
end
|
|
end
|
|
|
|
function uart:Reset()
|
|
self.buffer = ""
|
|
end
|
|
|
|
return uart
|
|
end
|