From 08a94c879b8d439f9551e5d8b7b6e0099ddeef73 Mon Sep 17 00:00:00 2001 From: XeonSquared Date: Thu, 3 Aug 2017 11:44:20 +1000 Subject: [PATCH] added vt52.lua, a better terminal emulator --- build.cfg | 2 +- modules/drivers/tty.lua | 1 + modules/drivers/vt52.lua | 75 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 modules/drivers/vt52.lua diff --git a/build.cfg b/build.cfg index d074f7f..641665d 100755 --- a/build.cfg +++ b/build.cfg @@ -4,7 +4,7 @@ modules/base/component.lua modules/lib/fs.lua modules/lib/buffer.lua modules/lib/io.lua -modules/drivers/tty.lua +modules/drivers/vt52.lua modules/lib/print.lua modules/drivers/kbd.lua modules/drivers/net.lua diff --git a/modules/drivers/tty.lua b/modules/drivers/tty.lua index 7ec8645..b974161 100644 --- a/modules/drivers/tty.lua +++ b/modules/drivers/tty.lua @@ -6,6 +6,7 @@ function tty(gA,sA,sI,fg,bg) -- gpuAddress,screenAddress,sessionID,foreground,ba gP.setForeground(fg) gP.setBackground(bg) gP.fill(1,1,sx,sy," ") + gP.setDepth(gp.maxDepth()) local function cv() -- check cursor position if cx > sx then cx,cy=1,cy+1 end if cx < 1 then cx,cy=sx,cy-1 end diff --git a/modules/drivers/vt52.lua b/modules/drivers/vt52.lua new file mode 100644 index 0000000..48bc3ce --- /dev/null +++ b/modules/drivers/vt52.lua @@ -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