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) gP.cs = 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) if gP.cs ~= sA then gP.bind(sA) gP.cs = sA end 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+8-((cx+8)%8))+1 elseif c == "\127" then cx=cx-1 gP.set(cx,cy,(" "):rep(2)) 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() os.setenv("sI",sI) 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