Zorya-NEO/mods/util_oefiv2/init.lua

171 lines
4.2 KiB
Lua

local comp = component
local computer = computer
local thd = krequire("thd")
local zy = krequire("zorya")
local utils = krequire("utils")
local oefi = {}
local ext = {}
local unpack = unpack or table.unpack
---#include "bios.lua"
local function load_oefi_env(file, envx)
utils.debug_log(file, envx.fs)
local cpio = krequire("util_cpio")
local urf = krequire("util_urf")
local vdev = zy.loadmod("util_vcomponent")
local arc = urf.read(envx.fs, file)
if not arc then
arc = cpio.read(envx.fs, file)
end
local oefi_env = {}
local env = utils.make_env()
env.krequire = nil
env._BIOS = nil
env._ZVER = nil
env._ZVSTR = nil
env._ZPAT = nil
env.oefi = setmetatable(oefi_env, {__index=oefi})
local p = gen_proto()
vdev.install(env)
vdev.register("zbios", "eeprom", p.methods)
local fs = component.proxy(envx.fs)
function oefi_env.loadfile(path)
local h = fs.open(path)
local fd = utils.readfile(envx.fs, h)
fs.close(h)
return load(fd, "="..path, "t", env)
end
function oefi_env.loadInternalFile(path)
return arc:fetch(path)
end
function oefi_env.returnToOEFI()
computer.pushSignal("oefi_killall")
computer.pullSignal("k") --It actually kills the application
end
function env.computer.pullSignal(...)
local s = {computer.pullSignal(...)}
if (s[1] == "oefi_killall") then
computer.pullSignal("k")
end
return unpack(s)
end
function oefi_env.getBootAddress()
return envx.fs
end
--vdev.overwrite(env)
--vdev.register_type("eeprom_oefiemu", gen_proto(baddr(envx.fs.address)))
--vdev.add_device("biosemu", "eeprom_oefiemu")
local dat = env.oefi.loadInternalFile("app.exe")
local func = load(dat, "="..file..":/app.exe", "t", env)
local cfgdat = env.oefi.loadInternalFile("app.cfg")
local cfg = {}
for line in cfgdat:gmatch("(.-)[\r\n]+") do
utils.debug_log("CONFIG", line)
local k, v = line:match("(.+)=(.+)")
utils.debug_log("PARSED", k, v)
cfg[k] = v
end
return func, cfg
end
local function load_oefi(drive, path)
local ext = path:sub(#path-4, #path)
return load_oefi_env(path, {fs = drive, uuid=uuid})
end
function oefi.getAPIVersion()
return 2.1
end
function oefi.getImplementationName()
return _BIOS
end
function oefi.getImplementationVersion()
return _ZVER
end
function oefi.execOEFIApp(drive, path)
local uuid = string.char(math.random(0,255),math.random(0,255),math.random(0,255),math.random(0,255))
local func, manifest = load_oefi(drive, path, uuid)
local args = {}
local name = "oefi$"..manifest.name:gsub(" ", "_")
thd.add(name, function()
func(unpack(args))
os.pushSignal("oefi_end", uuid)
end) --ez
while true do
local s, i = computer.pullSignal()
if (s == "oefi_end" and i == uuid) or s == "oefi_killall" then
break
end
end
end
function oefi.getExtensions()
return ext
end
function oefi.getApplications()
return {}
end
function ext.ZyNeo_GetOEFIEnv(drive, arc)
local oefi_env = {}
local env = utils.make_env()
env.krequire = nil
env._BIOS = nil
env._ZVER = nil
env._ZVSTR = nil
env._ZPAT = nil
env.oefi = setmetatable(oefi_env, {__index=oefi})
local fs = component.proxy(drive)
function oefi_env.loadfile(path)
local h = fs.open(path)
local fd = utils.readfile(drive, h)
fs.close(h)
return load(fd, "="..path, "t", env)
end
function oefi_env.loadInternalFile(path)
if (arc) then
return arc:fetch(path)
end
end
function oefi_env.returnToOEFI()
computer.pushSignal("oefi_killall")
computer.pullSignal("k") --It actually kills the application
end
function env.computer.pullSignal(...)
local s = {computer.pullSignal(...)}
if (s[1] == "oefi_killall") then
computer.pullSignal("k")
end
return unpack(s)
end
function oefi_env.getBootAddress()
return drive
end
return env
end
function ext.ZyNeo_ExecOEFIApp(drive, path, ...)
local uuid = string.char(math.random(0,255),math.random(0,255),math.random(0,255),math.random(0,255))
local func, manifest = load_oefi(drive, path, uuid)
local args = {...}
local name = "oefi$"..manifest.name:gsub(" ", "_")
thd.add(name, function()
func(unpack(args))
os.pushSignal("oefi_end", uuid)
end) --ez
while true do
local s, i = computer.pullSignal()
if (s == "oefi_end" and i == uuid) or s == "oefi_killall" then
break
end
end
end
return oefi