added vt52.lua, a better terminal emulator
This commit is contained in:
parent
31e5c5a54b
commit
08a94c879b
@ -4,7 +4,7 @@ modules/base/component.lua
|
|||||||
modules/lib/fs.lua
|
modules/lib/fs.lua
|
||||||
modules/lib/buffer.lua
|
modules/lib/buffer.lua
|
||||||
modules/lib/io.lua
|
modules/lib/io.lua
|
||||||
modules/drivers/tty.lua
|
modules/drivers/vt52.lua
|
||||||
modules/lib/print.lua
|
modules/lib/print.lua
|
||||||
modules/drivers/kbd.lua
|
modules/drivers/kbd.lua
|
||||||
modules/drivers/net.lua
|
modules/drivers/net.lua
|
||||||
|
@ -6,6 +6,7 @@ function tty(gA,sA,sI,fg,bg) -- gpuAddress,screenAddress,sessionID,foreground,ba
|
|||||||
gP.setForeground(fg)
|
gP.setForeground(fg)
|
||||||
gP.setBackground(bg)
|
gP.setBackground(bg)
|
||||||
gP.fill(1,1,sx,sy," ")
|
gP.fill(1,1,sx,sy," ")
|
||||||
|
gP.setDepth(gp.maxDepth())
|
||||||
local function cv() -- check cursor position
|
local function cv() -- check cursor position
|
||||||
if cx > sx then cx,cy=1,cy+1 end
|
if cx > sx then cx,cy=1,cy+1 end
|
||||||
if cx < 1 then cx,cy=sx,cy-1 end
|
if cx < 1 then cx,cy=sx,cy-1 end
|
||||||
|
75
modules/drivers/vt52.lua
Normal file
75
modules/drivers/vt52.lua
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
function tty(gA,sA,sI,fg,bg)
|
||||||
|
local gP,cx,cy,bg,fg = component.proxy(gA),1,1,bg or 0x000000, fg or 0xffffff
|
||||||
|
gP.bind(sA)
|
||||||
|
local sx, sy = gP.getResolution()
|
||||||
|
gP.setResolution(sx,sy)
|
||||||
|
gP.setForeground(fg)
|
||||||
|
gP.setBackground(bg)
|
||||||
|
gP.fill(1,1,sx,sy," ")
|
||||||
|
gP.setDepth(gP.maxDepth())
|
||||||
|
local function cv()
|
||||||
|
if cx > sx then cx,cy=1,cy+1 end
|
||||||
|
if cx < 1 then cx,cy=sx,cy-1 end
|
||||||
|
if cy < 1 then cx,cy=1,1 end
|
||||||
|
if cy > sy then gP.copy(1,2,sx,sy-1,0,-1) gP.fill(1,sy,sx,1," ") cx,cy=1,sy end
|
||||||
|
end
|
||||||
|
local function ic(s)
|
||||||
|
local cc,fg,bg=gP.get(cx,cy)
|
||||||
|
if s then fG,bG = bg,fg else fG,bG = fg,bg end
|
||||||
|
gP.setForeground(bG)
|
||||||
|
gP.setBackground(fG)
|
||||||
|
gP.set(cx,cy,cc)
|
||||||
|
gP.setForeground(fG)
|
||||||
|
gP.setBackground(bG)
|
||||||
|
end
|
||||||
|
local function wl(str)
|
||||||
|
local cm = 0
|
||||||
|
for c in str:gmatch(".") do
|
||||||
|
if cm == 1 then
|
||||||
|
cm = 0
|
||||||
|
ic(true)
|
||||||
|
if c == "A" then cy=cy-1
|
||||||
|
elseif c == "B" then cy=cy+1
|
||||||
|
elseif c == "C" then cx=cx+1
|
||||||
|
elseif c == "D" then cx=cx-1
|
||||||
|
elseif c == "H" then cx,cy=1,1
|
||||||
|
elseif c == "Y" then cm=2
|
||||||
|
elseif c == "b" then cm=4
|
||||||
|
elseif c == "c" then cm=5
|
||||||
|
end
|
||||||
|
elseif cm == 2 then
|
||||||
|
cx,cm=string.byte(c)-31,3
|
||||||
|
elseif cm == 3 then
|
||||||
|
cy,cm=string.byte(c)-31,0
|
||||||
|
elseif cm == 4 then
|
||||||
|
fg,cm = string.byte(c),0
|
||||||
|
gP.setForeground(fg,true)
|
||||||
|
elseif cm == 5 then
|
||||||
|
bg,cm = string.byte(c),0
|
||||||
|
gP.setBackground(bg,true)
|
||||||
|
else
|
||||||
|
if c == "\n" then cx,cy=1,cy+1
|
||||||
|
elseif c == "\27" then cm=1
|
||||||
|
elseif c == "\r" then cx=1
|
||||||
|
elseif c == "\f" then cx=1 cy=1 gP.fill(1, 1, sx, sy, " ")
|
||||||
|
elseif c == "\t" then cx=(cx+4-((cx+4)%4))+1
|
||||||
|
elseif c == "\127" then cx=cx-1 gP.set(cx,cy," ")
|
||||||
|
else gP.set(cx,cy,c) cx=cx+1
|
||||||
|
end
|
||||||
|
end cv()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
spawn("tty["..tostring(sI).."]: "..gA:sub(1,8)..","..sA:sub(1,8),function() log(pcall(function()
|
||||||
|
while true do
|
||||||
|
local csi = os.getenv("sI")
|
||||||
|
log(csi)
|
||||||
|
while true do
|
||||||
|
_,si,str=event.pull("display")
|
||||||
|
if si == csi then
|
||||||
|
wl(str)
|
||||||
|
ic()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end)) end)
|
||||||
|
end
|
Loading…
Reference in New Issue
Block a user