1
1
mirror of https://git.shadowkat.net/izaya/OC-PsychOS2.git synced 2024-11-29 14:11:33 -05:00

Compare commits

..

5 Commits

Author SHA1 Message Date
XeonSquared
583b300720 removed dprint statements from nvt 2020-04-09 15:50:39 +10:00
XeonSquared
f5db94e03c made init not spew irritating syslog messages 2020-04-09 15:50:10 +10:00
XeonSquared
bf66fa15e1 fixed tabs in nvt 2020-04-09 15:49:42 +10:00
XeonSquared
f68605ffea added a better replacement VT100 emulator 2020-04-09 15:44:23 +10:00
XeonSquared
5d2d09fbcf more control code support for the terminal emulator 2020-04-09 13:48:34 +10:00
4 changed files with 154 additions and 3 deletions

View File

@ -25,7 +25,6 @@ os.spawn(function()
local rc = require "rc" local rc = require "rc"
for k,v in pairs(rc.cfg.enabled) do for k,v in pairs(rc.cfg.enabled) do
pids[v] = -1 pids[v] = -1
dprint(v)
end end
while true do while true do
for k,v in pairs(pids) do for k,v in pairs(pids) do

135
module/nvt100.lua Normal file
View File

@ -0,0 +1,135 @@
function vt100emu(gpu) -- takes GPU component proxy *gpu* and returns a function to write to it in a manner like an ANSI terminal
local colours = {0x0,0xFF0000,0x00FF00,0xFFFF00,0x0000FF,0xFF00FF,0x00B6FF,0xFFFFFF}
local mx, my = gpu.maxResolution()
local cx, cy = 1, 1
local pc = " "
local lc = ""
local mode = 0 -- 0 normal, 1 escape, 2 command
local lw = true
local sx, sy = 1,1
local cs = ""
local bg, fg = 0, 0xFFFFFF
-- setup
gpu.setResolution(mx,my)
gpu.fill(1,1,mx,my," ")
local function checkCursor()
if cx > mx and lw then
cx, cy = 1, cy+1
end
if cy > my then
gpu.copy(1,2,mx,my-1,0,-1)
gpu.fill(1,my,mx,1," ")
cy=my
end
if cy < 1 then cy = 1 end
if cx < 1 then cx = 1 end
end
local function termwrite(s)
local wb = ""
local function flushwb()
while wb:len() > 0 do
checkCursor()
local wl = wb:sub(1,mx-cx+1)
wb = wb:sub(wl:len()+1)
gpu.set(cx, cy, wl)
cx = cx + wl:len()
end
end
local rs = ""
s=s:gsub("\8","\27[D")
pc = gpu.get(cx,cy)
gpu.setForeground(fg)
gpu.setBackground(bg)
gpu.set(cx,cy,pc)
for cc in s:gmatch(".") do
if mode == 0 then
if string.byte(cc) > 31 and string.byte(cc) < 128 then -- probably printable
wb = wb .. cc
elseif cc == "\n" then
flushwb()
cx,cy = 1, cy+1
elseif cc == "\t" then
wb=wb..(" "):rep(8*((cx+9)//8))
elseif cc == "\27" then
flushwb()
mode = 1
end
elseif mode == 1 then
if cc == "[" then
mode = 2
else
mode = 0
end
elseif mode == 2 then
if cc:match("[%d;]") then
cs = cs .. cc
else
mode = 0
local tA = {}
for s in cs:gmatch("%d+") do
tA[#tA+1] = tonumber(s)
end
if cc == "H" then
cx, cy = tA[1] or 1, tA[2] or 1
elseif cc == "A" then
cy = cy - (tA[1] or 1)
elseif cc == "B" then
cy = cy + (tA[1] or 1)
elseif cc == "C" then
cx = cx + (tA[1] or 1)
elseif cc == "D" then
cx = cx - (tA[1] or 1)
elseif cc == "s" then
sx, sy = cx, cy
elseif cc == "u" then
cx, cy = sx, sy
elseif cc == "n" and tA[1] == 6 then
rs = string.format("%s\27[%d;%dR",rs,cx,cy)
elseif cc == "K" and tA[1] == 1 then
gpu.fill(1,cy,cx,1," ")
elseif cc == "K" and tA[1] == 2 then
gpu.fill(cx,cy,mx,1," ")
elseif cc == "K" then
gpu.fill(1,cy,mx,1," ")
elseif cc == "J" and tA[1] == 1 then
gpu.fill(1,1,mx,cy," ")
elseif cc == "J" and tA[1] == 2 then
gpu.full(1,1,mx,my," ")
cx, cy = 1, 1
elseif cc == "J" then
gpu.fill(1,cy,mx,my," ")
elseif cc == "m" then
for _,num in ipairs(tA) do
if num == 0 then
fg,bg = 0xFFFFFF,0
elseif num == 7 then
local nfg,nbg = bg, fg
fg, bg = nfg, nbg
elseif num > 29 and num < 38 then
fg = colours[num-29]
elseif num > 39 and num < 48 then
bg = colours[num-39]
end
end
gpu.setForeground(fg)
gpu.setBackground(bg)
end
cs = ""
checkCursor()
end
end
end
flushwb()
pc = gpu.get(cx,cy)
gpu.setForeground(bg)
gpu.setBackground(fg)
gpu.set(cx,cy,pc)
gpu.setForeground(fg)
gpu.setBackground(bg)
return rs
end
return termwrite
end

View File

@ -1,5 +1,5 @@
do do
--#include "module/vt100.lua" --#include "module/nvt100.lua"
function vtemu(gpua,scra) -- creates a process to handle the GPU and screen address combination *gpua*/*scra*. Returns read, write and "close" functions. function vtemu(gpua,scra) -- creates a process to handle the GPU and screen address combination *gpua*/*scra*. Returns read, write and "close" functions.
local gpu = component.proxy(gpua) local gpu = component.proxy(gpua)
gpu.bind(scra) gpu.bind(scra)

View File

@ -14,7 +14,7 @@ function vt100emu(gpu) -- takes GPU component proxy *gpu* and returns a function
gpu.setResolution(mx,my) gpu.setResolution(mx,my)
gpu.fill(1,1,mx,my," ") gpu.fill(1,1,mx,my," ")
function termwrite(s) local function termwrite(s)
local rs = "" local rs = ""
s=s:gsub("\8","\27[D") s=s:gsub("\8","\27[D")
pc = gpu.get(cx,cy) pc = gpu.get(cx,cy)
@ -81,6 +81,23 @@ function vt100emu(gpu) -- takes GPU component proxy *gpu* and returns a function
rs = string.format("%s\27[%d;%d0c",rs,mx,my) rs = string.format("%s\27[%d;%d0c",rs,mx,my)
elseif cc == "n" and lc == "6" then elseif cc == "n" and lc == "6" then
rs = string.format("%s\27[%d;%dR",rs,cx,cy) rs = string.format("%s\27[%d;%dR",rs,cx,cy)
elseif cc == "K" then
if lc == "1" then
gpu.fill(1,cy,cx,1," ")
elseif lc == "2" then
gpu.fill(cx,cy,mx,1," ")
else
gpu.fill(1,cy,mx,1," ")
end
elseif cc == "J" then
if lc == "1" then
gpu.fill(1,1,mx,cy," ")
elseif lc == "2" then
gpu.full(1,1,mx,my," ")
cx,cy = 1, 1
else
gpu.fill(1,cy,mx,my," ")
end
elseif cc == "m" then elseif cc == "m" then
for num in cs:gmatch("%d+") do for num in cs:gmatch("%d+") do
num=tonumber(num) num=tonumber(num)