mirror of
https://github.com/Adorable-Catgirl/Zorya-NEO.git
synced 2024-11-27 04:38:06 +11:00
Compare commits
4 Commits
d09c52f6c2
...
39ff04c2b6
Author | SHA1 | Date | |
---|---|---|---|
|
39ff04c2b6 | ||
|
93158455e4 | ||
|
06d43e99ad | ||
|
530796bf5f |
5
.buildactions/00_setup.lua
Normal file
5
.buildactions/00_setup.lua
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
os.execute("mkdir -p pkg")
|
||||||
|
os.execute("rm -rf pkg/*")
|
||||||
|
|
||||||
|
os.execute("mkdir -p release")
|
||||||
|
os.execute("rm -rf release/*")
|
215
.buildactions/01_velx.lua
Normal file
215
.buildactions/01_velx.lua
Normal file
@ -0,0 +1,215 @@
|
|||||||
|
-- VELX builder
|
||||||
|
|
||||||
|
--[[----------------------------------------------------------------------------
|
||||||
|
LZSS - encoder / decoder
|
||||||
|
This is free and unencumbered software released into the public domain.
|
||||||
|
Anyone is free to copy, modify, publish, use, compile, sell, or
|
||||||
|
distribute this software, either in source code form or as a compiled
|
||||||
|
binary, for any purpose, commercial or non-commercial, and by any
|
||||||
|
means.
|
||||||
|
In jurisdictions that recognize copyright laws, the author or authors
|
||||||
|
of this software dedicate any and all copyright interest in the
|
||||||
|
software to the public domain. We make this dedication for the benefit
|
||||||
|
of the public at large and to the detriment of our heirs and
|
||||||
|
successors. We intend this dedication to be an overt act of
|
||||||
|
relinquishment in perpetuity of all present and future rights to this
|
||||||
|
software under copyright law.
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||||
|
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||||
|
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
|
OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
For more information, please refer to <http://unlicense.org/>
|
||||||
|
--]]----------------------------------------------------------------------------
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
local M = {}
|
||||||
|
local string, table = string, table
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
local POS_BITS = 12
|
||||||
|
local LEN_BITS = 16 - POS_BITS
|
||||||
|
local POS_SIZE = 1 << POS_BITS
|
||||||
|
local LEN_SIZE = 1 << LEN_BITS
|
||||||
|
local LEN_MIN = 3
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
function M.compress(input)
|
||||||
|
local offset, output = 1, {}
|
||||||
|
local window = ''
|
||||||
|
|
||||||
|
local function search()
|
||||||
|
for i = LEN_SIZE + LEN_MIN - 1, LEN_MIN, -1 do
|
||||||
|
local str = string.sub(input, offset, offset + i - 1)
|
||||||
|
local pos = string.find(window, str, 1, true)
|
||||||
|
if pos then
|
||||||
|
return pos, str
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
while offset <= #input do
|
||||||
|
local flags, buffer = 0, {}
|
||||||
|
|
||||||
|
for i = 0, 7 do
|
||||||
|
if offset <= #input then
|
||||||
|
local pos, str = search()
|
||||||
|
if pos and #str >= LEN_MIN then
|
||||||
|
local tmp = ((pos - 1) << LEN_BITS) | (#str - LEN_MIN)
|
||||||
|
buffer[#buffer + 1] = string.pack('>I2', tmp)
|
||||||
|
else
|
||||||
|
flags = flags | (1 << i)
|
||||||
|
str = string.sub(input, offset, offset)
|
||||||
|
buffer[#buffer + 1] = str
|
||||||
|
end
|
||||||
|
window = string.sub(window .. str, -POS_SIZE)
|
||||||
|
offset = offset + #str
|
||||||
|
else
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if #buffer > 0 then
|
||||||
|
output[#output + 1] = string.char(flags)
|
||||||
|
output[#output + 1] = table.concat(buffer)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return table.concat(output)
|
||||||
|
end
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
function M.decompress(input)
|
||||||
|
local offset, output = 1, {}
|
||||||
|
local window = ''
|
||||||
|
|
||||||
|
while offset <= #input do
|
||||||
|
local flags = string.byte(input, offset)
|
||||||
|
offset = offset + 1
|
||||||
|
|
||||||
|
for i = 1, 8 do
|
||||||
|
local str = nil
|
||||||
|
if (flags & 1) ~= 0 then
|
||||||
|
if offset <= #input then
|
||||||
|
str = string.sub(input, offset, offset)
|
||||||
|
offset = offset + 1
|
||||||
|
end
|
||||||
|
else
|
||||||
|
if offset + 1 <= #input then
|
||||||
|
local tmp = string.unpack('>I2', input, offset)
|
||||||
|
offset = offset + 2
|
||||||
|
local pos = (tmp >> LEN_BITS) + 1
|
||||||
|
local len = (tmp & (LEN_SIZE - 1)) + LEN_MIN
|
||||||
|
str = string.sub(window, pos, pos + len - 1)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
flags = flags >> 1
|
||||||
|
if str then
|
||||||
|
output[#output + 1] = str
|
||||||
|
window = string.sub(window .. str, -POS_SIZE)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return table.concat(output)
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
local function struct(tbl)
|
||||||
|
local pat = tbl.endian or "="
|
||||||
|
local args = {}
|
||||||
|
for i=1, #tbl do
|
||||||
|
local a, b = pairs(tbl[i])
|
||||||
|
local k, v = a(b)
|
||||||
|
args[i] = k
|
||||||
|
pat = pat .. v
|
||||||
|
end
|
||||||
|
return setmetatable({}, {__call=function(_, arg)
|
||||||
|
--checkArg(1, arg, "string", "table")
|
||||||
|
if (type(arg) == "string") then
|
||||||
|
local sval = {string.unpack(pat, arg)}
|
||||||
|
local rtn = {}
|
||||||
|
for i=1, #args do
|
||||||
|
rtn[args[i]] = sval[i]
|
||||||
|
end
|
||||||
|
return rtn, sval[#sval]
|
||||||
|
elseif (type(arg) == "table") then
|
||||||
|
local sval = {}
|
||||||
|
for i=1, #args do
|
||||||
|
sval[i] = arg[args[i]]
|
||||||
|
end
|
||||||
|
return string.pack(pat, unpack(sval))
|
||||||
|
end
|
||||||
|
end, __len=function()
|
||||||
|
return string.packsize(pat)
|
||||||
|
end})
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
local velx_spec = struct {
|
||||||
|
endian = "<",
|
||||||
|
{magic="c5"},
|
||||||
|
{fver="B"},
|
||||||
|
{compression="B"},
|
||||||
|
{lver="B"},
|
||||||
|
{os="B"},
|
||||||
|
{arctype="c4"},
|
||||||
|
{psize="I3"},
|
||||||
|
{lsize="I3"},
|
||||||
|
{ssize="I3"},
|
||||||
|
{rsize="I4"}
|
||||||
|
}
|
||||||
|
|
||||||
|
local function velx_multistep(path, arcpath, args, steps)
|
||||||
|
local shell_args = ""
|
||||||
|
for k, v in pairs(args) do
|
||||||
|
if (k == "PWD") then
|
||||||
|
shell_args = "cd "..v.."; " .. shell_args
|
||||||
|
else
|
||||||
|
shell_args = shell_args .. k .. "=\"".. v .."\" "
|
||||||
|
end
|
||||||
|
end
|
||||||
|
steps.precomp()
|
||||||
|
local h = io.popen(shell_args.."luacomp "..path, "r")
|
||||||
|
local prog = h:read("*a")
|
||||||
|
h:close()
|
||||||
|
prog = steps.postcomp(prog)
|
||||||
|
steps.prearc()
|
||||||
|
local arc = ""
|
||||||
|
if arcpath then
|
||||||
|
h = io.popen("cd "..arcpath.."; find $".."(ls) -depth | tsar -o", "r")
|
||||||
|
arc = h:read("*a")
|
||||||
|
h:close()
|
||||||
|
steps.postarc()
|
||||||
|
end
|
||||||
|
if (not args.noz) then
|
||||||
|
steps.prez()
|
||||||
|
prog = M.compress(prog)
|
||||||
|
steps.postz()
|
||||||
|
end
|
||||||
|
local header = velx_spec({
|
||||||
|
magic = "\27VelX",
|
||||||
|
compression = (args.noz and 0) or 1,
|
||||||
|
lver = 0x53,
|
||||||
|
fver = 1,
|
||||||
|
os = 0xDA, --da, comrade
|
||||||
|
psize = #prog,
|
||||||
|
lsize=0,
|
||||||
|
ssize=0,
|
||||||
|
rsize=#arc,
|
||||||
|
arctype=(arcpath and "tsar") or ""
|
||||||
|
})
|
||||||
|
return header .. prog .. arc
|
||||||
|
end
|
||||||
|
|
||||||
|
local function velx(path, arcpath, args)
|
||||||
|
return velx_multistep(path, arcpath, args, {
|
||||||
|
precomp = function()end,
|
||||||
|
postcomp = function(prog) return prog end,
|
||||||
|
prearc = function()end,
|
||||||
|
postarc = function()end,
|
||||||
|
prez = function()end,
|
||||||
|
postz = function()end,
|
||||||
|
})
|
||||||
|
end
|
48
.buildactions/10_bios.lua
Normal file
48
.buildactions/10_bios.lua
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
local function make_platform(plat)
|
||||||
|
os.execute("mkdir -p pkg/bios")
|
||||||
|
print("Making "..plat..".bios")
|
||||||
|
os.execute("luacomp src/loader.lua -O pkg/bios/"..plat..".bios")
|
||||||
|
--os.execute("ZY_PLATFORM="..plat.." luacomp src/loader.lua -O pkg/bios/"..plat..".bios")
|
||||||
|
print("ZY_PLATFORM="..plat.."luacomp src/loader.lua -O pkg/bios/"..plat..".bios")
|
||||||
|
print("[[ $".."(stat --printf=%s pkg/bios/"..plat..".bios) > 4096 ]]")
|
||||||
|
if (os.execute("[[ $".."(stat --printf=%s pkg/bios/"..plat..".bios) > 4096 ]]")) then
|
||||||
|
io.stderr:write("WARNING: "..plat.." bios is over 4KiB!\n")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function mkplat(plat)
|
||||||
|
local h = io.popen("luacomp src/loader.lua")
|
||||||
|
local loader = h:read("*a")
|
||||||
|
h:close()
|
||||||
|
local h = io.popen("ZY_PLATFORM="..plat.." luacomp src/zy-neo/zinit.lua -mluamin | lua5.3 utils/makezbios.lua")
|
||||||
|
local dat = h:read("*a")
|
||||||
|
h:close()
|
||||||
|
os.execute("mkdir -p pkg/bios")
|
||||||
|
local h = io.open("pkg/bios/"..plat..".bios", "wb")
|
||||||
|
h:write(string.format(loader, dat))
|
||||||
|
h:close()
|
||||||
|
if (os.execute("[[ $".."(stat --printf=%s pkg/bios/"..plat..".bios) > 4096 ]]")) then
|
||||||
|
io.stderr:write("WARNING: "..plat.." bios is over 4KiB!\n")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function actions.managed_bios()
|
||||||
|
mkplat("managed")
|
||||||
|
end
|
||||||
|
|
||||||
|
function actions.initramfs_bios()
|
||||||
|
mkplat("initramfs")
|
||||||
|
end
|
||||||
|
|
||||||
|
function actions.prom_bios()
|
||||||
|
mkplat("prom")
|
||||||
|
end
|
||||||
|
|
||||||
|
function actions.osdi_bios()
|
||||||
|
mkplat("osdi")
|
||||||
|
end
|
||||||
|
|
||||||
|
actions[#actions+1] = "managed_bios"
|
||||||
|
actions[#actions+1] = "initramfs_bios"
|
||||||
|
actions[#actions+1] = "prom_bios"
|
||||||
|
actions[#actions+1] = "osdi_bios"
|
31
.buildactions/11_modules.lua
Normal file
31
.buildactions/11_modules.lua
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
function make_module(mod)
|
||||||
|
os.execute("mkdir -p pkg/mods")
|
||||||
|
print("MOD", mod)
|
||||||
|
local arc = false
|
||||||
|
if (os.execute("[[ -d mods/"..mod.."/arc ]]")) then
|
||||||
|
arc = "mods/"..mod.."/arc"
|
||||||
|
end
|
||||||
|
local h = io.open("pkg/mods/"..mod..".velx", "w")
|
||||||
|
h:write(velx("init.lua", arc, {
|
||||||
|
PWD = os.getenv("PWD").."/mods/"..mod
|
||||||
|
}))
|
||||||
|
h:close()
|
||||||
|
end
|
||||||
|
|
||||||
|
local mods = {}
|
||||||
|
|
||||||
|
local h = io.popen("ls mods", "r")
|
||||||
|
for line in h:lines() do
|
||||||
|
actions["mod_"..line] = function()
|
||||||
|
make_module(line)
|
||||||
|
end
|
||||||
|
mods[#mods+1] = "mod_"..line
|
||||||
|
end
|
||||||
|
|
||||||
|
function actions.allmods()
|
||||||
|
for i=1, #mods do
|
||||||
|
actions[mods[i]]()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
actions[#actions+1] = "allmods"
|
27
.buildactions/12_libraries.lua
Normal file
27
.buildactions/12_libraries.lua
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
function make_library(mod)
|
||||||
|
os.execute("mkdir -p pkg/lib")
|
||||||
|
print("LIB", mod)
|
||||||
|
local h = io.open("pkg/lib/"..mod..".velx", "w")
|
||||||
|
h:write(velx("init.lua", false, {
|
||||||
|
PWD = os.getenv("PWD").."/lib/"..mod
|
||||||
|
}))
|
||||||
|
h:close()
|
||||||
|
end
|
||||||
|
|
||||||
|
local libs = {}
|
||||||
|
|
||||||
|
local h = io.popen("ls lib", "r")
|
||||||
|
for line in h:lines() do
|
||||||
|
actions["lib_"..line] = function()
|
||||||
|
make_library(line)
|
||||||
|
end
|
||||||
|
libs[#libs+1] = "lib_"..line
|
||||||
|
end
|
||||||
|
|
||||||
|
function actions.alllibs()
|
||||||
|
for i=1, #libs do
|
||||||
|
actions[libs[i]]()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
actions[#actions+1] = "alllibs"
|
5
.buildactions/20_pkg.lua
Normal file
5
.buildactions/20_pkg.lua
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
function actions.makepkg()
|
||||||
|
os.execute("cd pkg; find bios lib mods -depth | lua ../utils/make_tsar.lua > ../release/zorya-neo-update.tsar")
|
||||||
|
end
|
||||||
|
|
||||||
|
actions[#actions+1] = "makepkg"
|
4
.buildactions/30_selfextract.lua
Normal file
4
.buildactions/30_selfextract.lua
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
function makeselfextract(indir, outfile)
|
||||||
|
local cwd = os.getenv("PWD")
|
||||||
|
os.execute("cd "..indir.."; find * -depth | lua "..cwd.."/utils/make_tsar.lua | lua "..cwd.."/utils/mkselfextract.lua > "..cwd.."/"..outfile)
|
||||||
|
end
|
7
.buildactions/31_installer.lua
Normal file
7
.buildactions/31_installer.lua
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
function actions.installer()
|
||||||
|
os.execute("cp utils/ser.lua pkg/init.lua")
|
||||||
|
os.execute("cp -r installer_dat pkg")
|
||||||
|
makeselfextract("pkg", "release/zorya-neo-installer.lua")
|
||||||
|
end
|
||||||
|
|
||||||
|
actions[#actions+1] = "installer"
|
5
.buildactions/32_utils.lua
Normal file
5
.buildactions/32_utils.lua
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
function actions.utils()
|
||||||
|
makeselfextract("util", "release/zorya-neo-utils-installer.lua")
|
||||||
|
end
|
||||||
|
|
||||||
|
actions[#actions+1] = "utils"
|
5
.buildactions/ff_clean.lua
Normal file
5
.buildactions/ff_clean.lua
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
function actions.clean()
|
||||||
|
print("Cleaning up...")
|
||||||
|
--os.execute("rm -rf .docs")
|
||||||
|
--os.execute("rm -rf .ktmp")
|
||||||
|
end
|
36
build.lua
Normal file
36
build.lua
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
local actions = {}
|
||||||
|
|
||||||
|
@[[local h = io.popen("ls .buildactions", "r")
|
||||||
|
for line in h:lines() do]]
|
||||||
|
--#include @[{".buildactions/"..line}]
|
||||||
|
@[[end]]
|
||||||
|
|
||||||
|
--[[function actions.debug()
|
||||||
|
actions.kernel(true)
|
||||||
|
actions.crescent()
|
||||||
|
actions.velxboot()
|
||||||
|
actions.clean()
|
||||||
|
end]]
|
||||||
|
|
||||||
|
function actions.all()
|
||||||
|
for i=1, #actions do
|
||||||
|
actions[actions[i]]()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function actions.list()
|
||||||
|
for k, v in pairs(actions) do
|
||||||
|
if type(k) == "string" then
|
||||||
|
io.stdout:write(k, " ")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
print("")
|
||||||
|
end
|
||||||
|
|
||||||
|
if not arg[1] then
|
||||||
|
arg[1] = "all"
|
||||||
|
end
|
||||||
|
|
||||||
|
actions[arg[1]]()
|
||||||
|
|
||||||
|
print("Build complete.")
|
2
build.sh
Executable file
2
build.sh
Executable file
@ -0,0 +1,2 @@
|
|||||||
|
#!/usr/bin/env sh
|
||||||
|
luacomp build.lua 2>/dev/null | lua - $@
|
@ -1,7 +1,8 @@
|
|||||||
{
|
{
|
||||||
{type="managed", path="bios/managed.bios"},
|
{type="managed", path="bios/managed.bios"},
|
||||||
{type="initramfs", path="bios/initramfs.bios"},
|
{type="initramfs", path="bios/initramfs.bios"},
|
||||||
--{type="osdi", path="bios/osdi.bios"},
|
{type="osdi", path="bios/osdi.bios"},
|
||||||
|
{type="prom", path="bios/prom.bios"}
|
||||||
--{type="romfs", path="bios/romfs.bios"},
|
--{type="romfs", path="bios/romfs.bios"},
|
||||||
--{type="proxfs", path="bios/proxfs.bios"}
|
--{type="proxfs", path="bios/proxfs.bios"}
|
||||||
}
|
}
|
@ -1,28 +0,0 @@
|
|||||||
{
|
|
||||||
["bios_managed_name"] = "Standard Zorya BIOS",
|
|
||||||
["bios_managed_desc"] = "Zorya BIOS boots off of a managed drive.",
|
|
||||||
["bios_osdi_name"] = "OSDI Zorya BIOS",
|
|
||||||
["bios_osdi_desc"] = "Zorya BIOS boots off of an OSDI BOOTCODE partition.",
|
|
||||||
["bios_romfs_name"] = "ROMFS Zorya BIOS",
|
|
||||||
["bios_romfs_desc"] = "Zorya BIOS boots off of a ROMFS formatted EEPROM card.",
|
|
||||||
["bios_proxfs_name"] = "ProximaFS Zorya BIOS",
|
|
||||||
["bios_proxfs_desc"] = "placeholder",
|
|
||||||
["mod_util_zlan_name"] = "Zorya LAN",
|
|
||||||
["mod_util_zlan_desc"] = "Provides the ability to use the Zorya LAN Boot (zlan) protocol.",
|
|
||||||
["mod_loader_openos_name"] = "OpenOS",
|
|
||||||
["mod_loader_openos_desc"] = "Provides a utility to allow for BIOS threads to work while using OpenOS.",
|
|
||||||
["mod_loader_tsuki_name"] = "Tsuki",
|
|
||||||
["mod_loader_tsuki_desc"] = "Allows for easier loading of the Tsuki kernel.",
|
|
||||||
["mod_util_cpio_name"] = "cpio",
|
|
||||||
["mod_util_cpio_desc"] = "Allows the reading of CPIO archives",
|
|
||||||
["mod_util_frequest_name"] = "frequest",
|
|
||||||
["mod_util_frequest_desc"] = "Allows fetching of files over frequest.",
|
|
||||||
["mod_net_minitel_name"] = "Minitel",
|
|
||||||
["mod_net_minitel_desc"] = "Allows use of Minitel in Zorya.",
|
|
||||||
["cat_bios"] = "BIOS",
|
|
||||||
["cat_util"] = "Utilities",
|
|
||||||
["cat_loader"] = "Loaders",
|
|
||||||
["cat_rtmod"] = "Runtime modifiers",
|
|
||||||
["cat_net"] = "Networking",
|
|
||||||
["cat_vdev"] = "Virtual Devices"
|
|
||||||
}
|
|
@ -1,27 +1,25 @@
|
|||||||
{
|
{
|
||||||
{name="zlan", cat="util", path="lib/util_zlan.zy2l"},
|
{name="zlan", cat="util", path="lib/util_zlan.velx"},
|
||||||
{name="cpio", cat="util", path="lib/util_cpio.zy2l"},
|
{name="cpio", cat="util", path="lib/util_cpio.velx"},
|
||||||
{name="urf", cat="util", path="lib/util_urf.zy2l"},
|
{name="urf", cat="util", path="lib/util_urf.velx"},
|
||||||
{name="vcomponent", cat="util", path="lib/util_vcomponent.zy2l"},
|
{name="vcomponent", cat="util", path="lib/util_vcomponent.velx"},
|
||||||
{name="oefiv2", cat="util", path="mods/util_oefiv2.zy2m"},
|
{name="oefiv2", cat="util", path="mods/util_oefiv2.velx"},
|
||||||
{name="oefiv1", cat="util", path="mods/util_oefiv1.zy2m"},
|
{name="oefiv1", cat="util", path="mods/util_oefiv1.velx"},
|
||||||
{name="openos", cat="loader", path="mods/loader_openos.zy2m"},
|
{name="openos", cat="loader", path="mods/loader_openos.velx"},
|
||||||
{name="fuchas", cat="loader", path="mods/loader_fuchas.zy2m"},
|
{name="fuchas", cat="loader", path="mods/loader_fuchas.velx"},
|
||||||
{name="vbios", cat="vdev", path="mods/vdev_vbios.zy2m"},
|
{name="vbios", cat="vdev", path="mods/vdev_vbios.velx"},
|
||||||
{name="biosdev", cat="vdev", path="mods/vdev_biosdev.zy2m"},
|
{name="biosdev", cat="vdev", path="mods/vdev_biosdev.velx"},
|
||||||
{name="searchpaths", cat="util", path="mods/util_searchpaths.zy2m"},
|
{name="searchpaths", cat="util", path="mods/util_searchpaths.velx"},
|
||||||
{name="vfs", cat="core", path="mods/vfs.zy2m"},
|
{name="vfs", cat="core", path="mods/vfs.velx"},
|
||||||
--{name="tsuki", cat="loader", path="mods/loader_tsuki.zy2m"},
|
--{name="tsuki", cat="loader", path="mods/loader_tsuki.zy2m"},
|
||||||
--{name="romfs", cat="util", path="mods/util_romfs.zy2m"},
|
--{name="romfs", cat="util", path="mods/util_romfs.zy2m"},
|
||||||
{name="cpio", cat="util", path="lib/util_cpio.zy2l"},
|
{name="cpio", cat="util", path="lib/util_cpio.velx"},
|
||||||
--{name="frequest", cat="util", path="mods/util_frequest.zy2m"},
|
--{name="frequest", cat="util", path="mods/util_frequest.zy2m"},
|
||||||
--{name="loadfile", cat="loader", path="mods/loader_loadfile.zy2m"},
|
--{name="loadfile", cat="loader", path="mods/loader_loadfile.zy2m"},
|
||||||
{name="minitel", cat="net", path="lib/net_minitel.zy2l"},
|
{name="minitel", cat="net", path="lib/net_minitel.velx"},
|
||||||
--{name="vdev", cat="util", path="mods/util_vdev.zy2m"},
|
--{name="vdev", cat="util", path="mods/util_vdev.zy2m"},
|
||||||
{name="classic", cat="menu", path="mods/menu_classic.zy2m"},
|
{name="classic", cat="menu", path="mods/menu_classic.velx"},
|
||||||
{name="luaconsole", cat="util", path="mods/util_luaconsole.zy2m"},
|
{name="luaconsole", cat="util", path="mods/util_luaconsole.velx"},
|
||||||
{name="blkdev", cat="util", path="mods/util_blkdev.zy2m"},
|
|
||||||
{name="fat", cat="fs", path="mods/fs_fat.zy2m"},
|
|
||||||
--{name="vdevrt", cat="rtmod", path="mods/rtmod_vdevrt.zy2m"},
|
--{name="vdevrt", cat="rtmod", path="mods/rtmod_vdevrt.zy2m"},
|
||||||
--{name="tsukinet", cat="net", path="mods/net_tsukinet"},
|
--{name="tsukinet", cat="net", path="mods/net_tsukinet"},
|
||||||
--{name="biosemu", cat="loader", path="mods/loader_biosemu.zy2m", warning="warn_mod_biosemu"},
|
--{name="biosemu", cat="loader", path="mods/loader_biosemu.zy2m", warning="warn_mod_biosemu"},
|
||||||
|
@ -49,9 +49,10 @@ local function checkCache(packetID)
|
|||||||
end
|
end
|
||||||
|
|
||||||
--local realComputerPullSignal = computer.pullSignal
|
--local realComputerPullSignal = computer.pullSignal
|
||||||
|
local ps = computer.pullSignal
|
||||||
thd.add("minitel_handler", function()
|
thd.add("minitel_handler", function()
|
||||||
while true do
|
while true do
|
||||||
local eventTab = {computer.pullSignal(0)}
|
local eventTab = {ps(0)}
|
||||||
for k,v in pairs(net.hook) do
|
for k,v in pairs(net.hook) do
|
||||||
pcall(v,table.unpack(eventTab))
|
pcall(v,table.unpack(eventTab))
|
||||||
end
|
end
|
||||||
|
@ -1,8 +1,20 @@
|
|||||||
local zy = krequire("zorya")
|
local zy = krequire("zorya")
|
||||||
--zy.loadmod("vdev_biosdev")
|
--zy.loadmod("vdev_biosdev")
|
||||||
local utils = krequire("utils")
|
local utils = krequire("utils")
|
||||||
|
local thd = krequire("thd")
|
||||||
--local vdev = krequire("zorya").loadmod("util_vdev")
|
--local vdev = krequire("zorya").loadmod("util_vdev")
|
||||||
local vdev = krequire("util_vcomponent")
|
local vdev = krequire("util_vcomponent")
|
||||||
|
local function proxytable(t)
|
||||||
|
return setmetatable({}, {__index=function(self, i)
|
||||||
|
if (type(t[i]) == "table") then
|
||||||
|
self[i] = proxytable(t[i])
|
||||||
|
return rawget(self, i)
|
||||||
|
else
|
||||||
|
return t[i]
|
||||||
|
end
|
||||||
|
end})
|
||||||
|
end
|
||||||
|
local openos_count = 0
|
||||||
return function(addr)
|
return function(addr)
|
||||||
local fs = component.proxy(addr)
|
local fs = component.proxy(addr)
|
||||||
--vdev.overwrite(_G)
|
--vdev.overwrite(_G)
|
||||||
@ -16,10 +28,21 @@ return function(addr)
|
|||||||
env.krequire = nil]]
|
env.krequire = nil]]
|
||||||
--vdev.install(env)
|
--vdev.install(env)
|
||||||
--log(env, env.computer, env.computer.getBootAddress, env.computer.getBootAddress())
|
--log(env, env.computer, env.computer.getBootAddress, env.computer.getBootAddress())
|
||||||
function computer.getBootAddress()
|
-- local env = proxytable(_G)
|
||||||
|
thd.add("openos$"..openos_count, function()
|
||||||
|
local env = utils.make_env()
|
||||||
|
function env.computer.getBootAddress()
|
||||||
return addr
|
return addr
|
||||||
end
|
end
|
||||||
function computer.setBootAddress()end
|
function env.computer.setBootAddress()end
|
||||||
local old_dl = utils.debug_log
|
local old_dl = utils.debug_log
|
||||||
load(utils.readfile(fs.address, fs.open("init.lua")), "=init.lua", "t", env)()
|
load(utils.readfile(fs.address, fs.open("init.lua")), "=init.lua", "t", env)()
|
||||||
|
computer.pushSignal("openos_dead")
|
||||||
|
end)
|
||||||
|
while true do
|
||||||
|
if computer.pullSignal() == "openos_dead" then
|
||||||
|
utils.debug_log("Got signal.")
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
5
mods/util_luaconsole/arc/bin/boot.lua
Normal file
5
mods/util_luaconsole/arc/bin/boot.lua
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
local arg = ...
|
||||||
|
if (arg == "") then
|
||||||
|
arg = "init.lua"
|
||||||
|
end
|
||||||
|
load_exec(arg)()
|
105
mods/util_luaconsole/arc/bin/download-recovery-env.lua
Normal file
105
mods/util_luaconsole/arc/bin/download-recovery-env.lua
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
local inet = component.list("internet")()
|
||||||
|
if not inet then
|
||||||
|
tty.setcolor(0x4)
|
||||||
|
print("internet card not found.")
|
||||||
|
return 1
|
||||||
|
end
|
||||||
|
|
||||||
|
inet = component.proxy(inet)
|
||||||
|
|
||||||
|
print("connecting...")
|
||||||
|
local hand, res = inet.request("https://git.shadowkat.net/sam/OC-PsychOS2/raw/branch/master/psychos.tsar")
|
||||||
|
if not hand then
|
||||||
|
tty.setcolor(0x4)
|
||||||
|
print(res)
|
||||||
|
return 1
|
||||||
|
end
|
||||||
|
local fs = component.proxy(computer.tmpAddress())
|
||||||
|
_DRIVE = computer.tmpAddress()
|
||||||
|
|
||||||
|
local magic = 0x5f7d
|
||||||
|
local magic_rev = 0x7d5f
|
||||||
|
local header_fmt = "I2I2I2I2I2I6I6"
|
||||||
|
local en = string.unpack("=I2", string.char(0x7d, 0x5f)) == magic -- true = LE, false = BE
|
||||||
|
local function get_end(e)
|
||||||
|
return (e and "<") or ">"
|
||||||
|
end
|
||||||
|
local function read_header(dat)
|
||||||
|
local e = get_end(en)
|
||||||
|
local m = string.unpack(e.."I2", dat)
|
||||||
|
if m ~= magic and m ~= magic_rev then return nil, string.format("bad magic (%.4x)", m) end
|
||||||
|
if m ~= magic then
|
||||||
|
e = get_end(not en)
|
||||||
|
end
|
||||||
|
local ent = {}
|
||||||
|
ent.magic, ent.namesize, ent.mode, ent.uid, ent.gid, ent.filesize, ent.mtime = string.unpack(e..header_fmt, dat)
|
||||||
|
return ent
|
||||||
|
end
|
||||||
|
|
||||||
|
local spin = {"|", "/", "-", "\\"}
|
||||||
|
|
||||||
|
local spinv = 0
|
||||||
|
|
||||||
|
local function getspin()
|
||||||
|
local c = spin[spinv + 1]
|
||||||
|
spinv = (spinv + 1) & 3
|
||||||
|
return c
|
||||||
|
end
|
||||||
|
|
||||||
|
tty.write("downloading psychos.tsar... "..getspin())
|
||||||
|
local x, y = tty.getcursor()
|
||||||
|
tty.setcursor(x-1, y)
|
||||||
|
local buf = ""
|
||||||
|
local lc = ""
|
||||||
|
|
||||||
|
while true do
|
||||||
|
tty.setcursor(x-1, y)
|
||||||
|
tty.write(getspin())
|
||||||
|
lc, res = hand.read()
|
||||||
|
if not lc and res then
|
||||||
|
tty.setcolor(0x4)
|
||||||
|
print(res)
|
||||||
|
return 1
|
||||||
|
end
|
||||||
|
buf = buf .. (lc or "")
|
||||||
|
if not lc then
|
||||||
|
break
|
||||||
|
elseif (lc == "") then
|
||||||
|
computer.pullSignal(0)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
hand.close()
|
||||||
|
|
||||||
|
print("")
|
||||||
|
print(#buf)
|
||||||
|
print("unpacking... "..getspin())
|
||||||
|
x, y = tty.getcursor()
|
||||||
|
tty.setcursor(x-1, y)
|
||||||
|
local pos = 1
|
||||||
|
local function read(a)
|
||||||
|
local dat = buf:sub(pos, pos+a-1)
|
||||||
|
pos = pos + a
|
||||||
|
return dat
|
||||||
|
end
|
||||||
|
local function seek(a)
|
||||||
|
pos = pos + a
|
||||||
|
return pos
|
||||||
|
end
|
||||||
|
while true do
|
||||||
|
tty.setcursor(x-1, y)
|
||||||
|
tty.write(getspin())
|
||||||
|
local header = read_header(read(string.packsize(header_fmt)))
|
||||||
|
local fn = read(header.namesize)
|
||||||
|
seek(header.namesize & 1)
|
||||||
|
if (fn == "TRAILER!!!") then break end
|
||||||
|
if (header.mode & 32768 > 0) then
|
||||||
|
local path = fn:match("^(.+)/.+%..+$")
|
||||||
|
if path then fs.makeDirectory(path) end
|
||||||
|
local h = fs.open(fn, "w")
|
||||||
|
fs.write(h, read(header.filesize))
|
||||||
|
fs.close(h)
|
||||||
|
seek(header.filesize & 1)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
tty.setcolor(0x6)
|
||||||
|
print("run $boot to start the recovery enviroment")
|
11
mods/util_luaconsole/arc/bin/help.lua
Normal file
11
mods/util_luaconsole/arc/bin/help.lua
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
print("$boot [file] - Loads a Lua or a BIOS or Zorya VELX file. Defaults to init.lua.")
|
||||||
|
print("$download-recovery-env - Downloads a tsar with PsychOS on it and boots into it.")
|
||||||
|
print("$help - Prints this")
|
||||||
|
print("$kill [thread name] - Kills a thread")
|
||||||
|
print("$ls - Lists files if a root is set, lists filesystems otherwise.")
|
||||||
|
print("$lsfs - Lists filesystems.")
|
||||||
|
print("$lsthd - Lists threads.")
|
||||||
|
print("$reboot - Reboots the computer.")
|
||||||
|
print("$root [uuid part] - Sets the root (_DRIVE variable). Will autocomplete.")
|
||||||
|
print("$shutdown - Shuts down the computer.")
|
||||||
|
print("$start [file] - Starts a Lua file or Zorya VELX in the background.")
|
9
mods/util_luaconsole/arc/bin/kill.lua
Normal file
9
mods/util_luaconsole/arc/bin/kill.lua
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
local thd = krequire("thd")
|
||||||
|
local threads = thd.get_threads()
|
||||||
|
local n = ...
|
||||||
|
for i=1, #threads do
|
||||||
|
if (threads[i][1] == n) then
|
||||||
|
thd.kill(i)
|
||||||
|
print("killed "..n)
|
||||||
|
end
|
||||||
|
end
|
11
mods/util_luaconsole/arc/bin/ls.lua
Normal file
11
mods/util_luaconsole/arc/bin/ls.lua
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
local arg = ...
|
||||||
|
if not _DRIVE then
|
||||||
|
for d in component.list("filesystem") do
|
||||||
|
print(d)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
local t = component.invoke(_DRIVE, "list", arg)
|
||||||
|
for i=1, #t do
|
||||||
|
print(t[i])
|
||||||
|
end
|
||||||
|
end
|
3
mods/util_luaconsole/arc/bin/lsfs.lua
Normal file
3
mods/util_luaconsole/arc/bin/lsfs.lua
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
for d in component.list("filesystem") do
|
||||||
|
print(d)
|
||||||
|
end
|
4
mods/util_luaconsole/arc/bin/lsthd.lua
Normal file
4
mods/util_luaconsole/arc/bin/lsthd.lua
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
local threads = krequire("thd").get_threads()
|
||||||
|
for i=1, #threads do
|
||||||
|
print(threads[i][1])
|
||||||
|
end
|
1
mods/util_luaconsole/arc/bin/reboot.lua
Normal file
1
mods/util_luaconsole/arc/bin/reboot.lua
Normal file
@ -0,0 +1 @@
|
|||||||
|
computer.shutdown(true)
|
6
mods/util_luaconsole/arc/bin/root.lua
Normal file
6
mods/util_luaconsole/arc/bin/root.lua
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
local fs = ...
|
||||||
|
for f in component.list("filesystem") do
|
||||||
|
if (f:sub(1, #fs) == fs) then
|
||||||
|
_DRIVE = f
|
||||||
|
end
|
||||||
|
end
|
1
mods/util_luaconsole/arc/bin/shutdown.lua
Normal file
1
mods/util_luaconsole/arc/bin/shutdown.lua
Normal file
@ -0,0 +1 @@
|
|||||||
|
computer.shutdown()
|
7
mods/util_luaconsole/arc/bin/start.lua
Normal file
7
mods/util_luaconsole/arc/bin/start.lua
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
local thd = krequire("thd")
|
||||||
|
local utils = krequire("utils")
|
||||||
|
local arg = ...
|
||||||
|
local name = arg:match("/(.+%..+)^") or arg
|
||||||
|
thd.add(name, function()
|
||||||
|
load_exec(arg)()
|
||||||
|
end)
|
0
mods/util_luaconsole/arc/info.txt
Normal file
0
mods/util_luaconsole/arc/info.txt
Normal file
@ -1,4 +1,14 @@
|
|||||||
|
local utils = krequire("utils")
|
||||||
--#include "tty.lua"
|
--#include "tty.lua"
|
||||||
|
--#include "velx.lua"
|
||||||
|
--#include "load.lua"
|
||||||
|
|
||||||
|
function _runcmd(cmd)
|
||||||
|
local rcmd = cmd:sub(1, (cmd:find(" ") or (#cmd+1))-1)
|
||||||
|
local script = _ARCHIVE:fetch("bin/"..rcmd..".lua")
|
||||||
|
load(script, "=bin/"..rcmd..".lua", "t", _G)(cmd:sub(#rcmd+1):gsub("^%s+", ""))
|
||||||
|
end
|
||||||
|
|
||||||
return function(autorun)
|
return function(autorun)
|
||||||
local keys = {
|
local keys = {
|
||||||
lcontrol = 0x1D,
|
lcontrol = 0x1D,
|
||||||
@ -37,7 +47,10 @@ return function(autorun)
|
|||||||
print = nil
|
print = nil
|
||||||
end
|
end
|
||||||
if (autorun) then
|
if (autorun) then
|
||||||
load(autorun)()
|
local c = load(autorun)
|
||||||
|
if c then
|
||||||
|
pcall(c)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
tty.print("")
|
tty.print("")
|
||||||
tty.setcolor(2)
|
tty.setcolor(2)
|
||||||
@ -70,6 +83,8 @@ return function(autorun)
|
|||||||
elseif (sig[4] == keys.enter) then
|
elseif (sig[4] == keys.enter) then
|
||||||
if (buffer:sub(1,1) == "=") then
|
if (buffer:sub(1,1) == "=") then
|
||||||
buffer = "return "..buffer:sub(2)
|
buffer = "return "..buffer:sub(2)
|
||||||
|
elseif (buffer:sub(1,1) == "$") then
|
||||||
|
buffer = "return _runcmd(\""..buffer:sub(2).."\")"
|
||||||
end
|
end
|
||||||
local s, e = load(buffer)
|
local s, e = load(buffer)
|
||||||
local x, y = tty.getcursor()
|
local x, y = tty.getcursor()
|
||||||
@ -92,7 +107,7 @@ return function(autorun)
|
|||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
tty.setcolor(2)
|
tty.setcolor(2)
|
||||||
tty.write("boot> ")
|
tty.write(((_DRIVE and _DRIVE:sub(1, 4)) or "boot").."> ")
|
||||||
tty.setcolor(0xF0)
|
tty.setcolor(0xF0)
|
||||||
tty.write(" ")
|
tty.write(" ")
|
||||||
tty.setcolor(0xF)
|
tty.setcolor(0xF)
|
||||||
|
40
mods/util_luaconsole/load.lua
Normal file
40
mods/util_luaconsole/load.lua
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
function load_exec(path)
|
||||||
|
if not _DRIVE then
|
||||||
|
tty.setcolor(0x4)
|
||||||
|
print("need to set root")
|
||||||
|
end
|
||||||
|
local env = utils.make_env()
|
||||||
|
function env.computer.getBootAddress()
|
||||||
|
return _DRIVE
|
||||||
|
end
|
||||||
|
function env.computer.setBootAddress()end
|
||||||
|
local ext = path:match("%.(.+)$")
|
||||||
|
if (ext == "lua") then
|
||||||
|
return load(krequire("utils").readfile(_DRIVE, component.invoke(_DRIVE, "open", path)), "="..path, "t", env)
|
||||||
|
elseif (ext == "velx") then
|
||||||
|
local fs = component.proxy(_DRIVE)
|
||||||
|
local h = fs.open(path)
|
||||||
|
local v, e = load_velx(function(a)
|
||||||
|
local c = ""
|
||||||
|
local d
|
||||||
|
while a > 0 do
|
||||||
|
d = fs.read(h, a)
|
||||||
|
a = a - #d
|
||||||
|
c = c .. d
|
||||||
|
end
|
||||||
|
return c
|
||||||
|
end, function(a)
|
||||||
|
return fs.seek(h, "cur", a)
|
||||||
|
end, function()
|
||||||
|
fs.close(h)
|
||||||
|
end, path)
|
||||||
|
if not v then
|
||||||
|
tty.setcolor(0x4)
|
||||||
|
print(e)
|
||||||
|
end
|
||||||
|
return v
|
||||||
|
else
|
||||||
|
tty.setcolor(0x4)
|
||||||
|
print("invalid executable format "..ext)
|
||||||
|
end
|
||||||
|
end
|
@ -2,6 +2,9 @@
|
|||||||
tty = {}
|
tty = {}
|
||||||
do
|
do
|
||||||
local gpu = component.proxy(component.list("gpu")())
|
local gpu = component.proxy(component.list("gpu")())
|
||||||
|
if not gpu.getScreen() then
|
||||||
|
gpu.bind(component.list("screen")())
|
||||||
|
end
|
||||||
local gfg = -1
|
local gfg = -1
|
||||||
local gbg = -1
|
local gbg = -1
|
||||||
|
|
||||||
@ -18,9 +21,9 @@ do
|
|||||||
if (depth == 4) then --pregen color
|
if (depth == 4) then --pregen color
|
||||||
for i=0, 15 do
|
for i=0, 15 do
|
||||||
local hi = i >> 3
|
local hi = i >> 3
|
||||||
local b = (i >> 2) & 1
|
local r = (i >> 2) & 1
|
||||||
local g = (i >> 1) & 1
|
local g = (i >> 1) & 1
|
||||||
local r = i & 1
|
local b = i & 1
|
||||||
local fr = (r * 0x7F) | (hi << 7)
|
local fr = (r * 0x7F) | (hi << 7)
|
||||||
local fg = (g * 0x7F) | (hi << 7)
|
local fg = (g * 0x7F) | (hi << 7)
|
||||||
local fb = (b * 0x7F) | (hi << 7)
|
local fb = (b * 0x7F) | (hi << 7)
|
||||||
@ -29,6 +32,7 @@ do
|
|||||||
end
|
end
|
||||||
|
|
||||||
function colors(i)
|
function colors(i)
|
||||||
|
if (i < 0) then i = 0 elseif (i > 15) then i = 15 end
|
||||||
if (depth == 1) then
|
if (depth == 1) then
|
||||||
return ((i > 0) and 0xFFFFFF) or 0
|
return ((i > 0) and 0xFFFFFF) or 0
|
||||||
elseif (depth == 4) then
|
elseif (depth == 4) then
|
||||||
|
30
mods/util_luaconsole/velx.lua
Normal file
30
mods/util_luaconsole/velx.lua
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
function load_velx(read, seek, close, name)
|
||||||
|
-- Load a VELX format library.
|
||||||
|
local magic, fver, compression, lver, osid, arctype, psize, lsize, ssize, rsize = string.unpack(velx_header, read(string.packsize(velx_header)))
|
||||||
|
if (magic ~= "\27VelX") then
|
||||||
|
return nil, "bad magic ("..magic..")"
|
||||||
|
end
|
||||||
|
if (osid & 0x7F ~= 0x5A or osid & 0x7F ~= 0x7F) then
|
||||||
|
return nil, string.format("wrong os (%x)", osid & 0x7F)
|
||||||
|
end
|
||||||
|
if (compression > 1) then
|
||||||
|
return nil, "bad compression"
|
||||||
|
end
|
||||||
|
if ((arctype ~= "\0\0\0\0" and (arctype ~= "tsar" and osid & 0x7F == 0x5A))) then
|
||||||
|
return nil, "bad arctype ("..arctype..")"
|
||||||
|
end
|
||||||
|
if (fver ~= 1) then
|
||||||
|
return nil, "wrong version"
|
||||||
|
end
|
||||||
|
local prog = read(psize)
|
||||||
|
if (compression == 1) then
|
||||||
|
prog = lzss_decompress(prog)
|
||||||
|
end
|
||||||
|
seek(lsize+ssize)
|
||||||
|
local env = {}
|
||||||
|
if (arctype == "tsar") then
|
||||||
|
env._ARCHIVE = tsar.read(read, seek, close)
|
||||||
|
end
|
||||||
|
setmetatable(env, {__index=_G, __newindex=function(_, i, v) _G[i] = v end})
|
||||||
|
return load(prog, "="..(name or "(loaded velx)"), "t", env)
|
||||||
|
end
|
@ -8,8 +8,7 @@ local oefi = {}
|
|||||||
|
|
||||||
local function load_oefi(drive, path, uuid)
|
local function load_oefi(drive, path, uuid)
|
||||||
local oefi_env = {}
|
local oefi_env = {}
|
||||||
local env = {}
|
local env = utils.make_env()
|
||||||
utils.deepcopy(_G, env)
|
|
||||||
env.krequire = nil
|
env.krequire = nil
|
||||||
env._BIOS = nil
|
env._BIOS = nil
|
||||||
env._ZVER = nil
|
env._ZVER = nil
|
||||||
|
@ -21,8 +21,7 @@ local function load_oefi_env(file, envx)
|
|||||||
arc = cpio.read(envx.fs, file)
|
arc = cpio.read(envx.fs, file)
|
||||||
end
|
end
|
||||||
local oefi_env = {}
|
local oefi_env = {}
|
||||||
local env = {}
|
local env = utils.make_env()
|
||||||
utils.deepcopy(_G, env)
|
|
||||||
env.krequire = nil
|
env.krequire = nil
|
||||||
env._BIOS = nil
|
env._BIOS = nil
|
||||||
env._ZVER = nil
|
env._ZVER = nil
|
||||||
@ -116,8 +115,7 @@ end
|
|||||||
|
|
||||||
function ext.ZyNeo_GetOEFIEnv(drive, arc)
|
function ext.ZyNeo_GetOEFIEnv(drive, arc)
|
||||||
local oefi_env = {}
|
local oefi_env = {}
|
||||||
local env = {}
|
local env = utils.make_env()
|
||||||
utils.deepcopy(_G, env)
|
|
||||||
env.krequire = nil
|
env.krequire = nil
|
||||||
env._BIOS = nil
|
env._BIOS = nil
|
||||||
env._ZVER = nil
|
env._ZVER = nil
|
||||||
|
@ -3,10 +3,8 @@
|
|||||||
local computer = computer
|
local computer = computer
|
||||||
xpcall(function()
|
xpcall(function()
|
||||||
utils.debug_log("Copying env...")
|
utils.debug_log("Copying env...")
|
||||||
local env = utils.deepcopy(_G)
|
local env = utils.make_env()
|
||||||
utils.debug_log("Coppied env.")
|
utils.debug_log("Coppied env.")
|
||||||
env._G = env
|
|
||||||
env._ENV = env
|
|
||||||
env.krequire = nil
|
env.krequire = nil
|
||||||
env._BIOS = nil
|
env._BIOS = nil
|
||||||
env._ZVSTR = nil
|
env._ZVSTR = nil
|
||||||
|
@ -1,2 +1,2 @@
|
|||||||
--#include "src/lzss.lua"
|
--#include "src/lzss.lua"
|
||||||
return assert(load(lzss_decompress($[[luacomp src/zy-neo/zinit.lua -mluamin 2>/dev/null | lua5.3 utils/makezbios.lua ]]), "=bios.lua"))(lzss_decompress)
|
return assert(load(lzss_decompress(%s), "=bios.lua"))(lzss_decompress)
|
@ -1,5 +1,5 @@
|
|||||||
_ZLOADER = "initramfs"
|
_ZLOADER = "initramfs"
|
||||||
local readfile=function(f,h)
|
--[[local readfile=function(f,h)
|
||||||
local b=""
|
local b=""
|
||||||
local d,r=f.read(h,math.huge)
|
local d,r=f.read(h,math.huge)
|
||||||
if not d and r then error(r)end
|
if not d and r then error(r)end
|
||||||
@ -11,19 +11,19 @@ local readfile=function(f,h)
|
|||||||
end
|
end
|
||||||
f.close(h)
|
f.close(h)
|
||||||
return b
|
return b
|
||||||
end
|
end]]
|
||||||
|
|
||||||
local bfs = {}
|
local bfs = {}
|
||||||
|
|
||||||
local cfg = component.proxy(component.list("eeprom")()).getData()
|
local cfg = cproxy(clist("eeprom")()).getData()
|
||||||
|
|
||||||
local baddr = cfg:sub(1, 36)
|
local baddr = cfg:sub(1, 36)
|
||||||
local bootfs = component.proxy(baddr)
|
local bootfs = cproxy(baddr)
|
||||||
|
|
||||||
assert(bootfs.exists(".zy2/image.tsar"), "No boot image!")
|
assert(bootfs.exists(".zy2/image.tsar"), "No boot image!")
|
||||||
|
|
||||||
local romfs_file = assert(bootfs.open(".zy2/image.tsar", "rb"))
|
local romfs_file = assert(bootfs.open(".zy2/image.tsar", "rb"))
|
||||||
local rfs = readfile(bootfs, romfs_file)
|
local rfs = utils.readfile(bootfs, romfs_file)
|
||||||
|
|
||||||
--[[local romfs_dev = tsar.read(function(a)
|
--[[local romfs_dev = tsar.read(function(a)
|
||||||
local c = ""
|
local c = ""
|
||||||
@ -59,9 +59,13 @@ function bfs.exists(path)
|
|||||||
return romfs_dev:exists(path)
|
return romfs_dev:exists(path)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function bfs.getstream(path)
|
||||||
|
return romfs_dev:stream(path)
|
||||||
|
end
|
||||||
|
|
||||||
function bfs.getcfg()
|
function bfs.getcfg()
|
||||||
local h = assert(bootfs.open(".zy2/cfg.lua", "r"))
|
local h = assert(bootfs.open(".zy2/cfg.lua", "r"))
|
||||||
return readfile(bootfs, h)
|
return utils.readfile(bootfs, h)
|
||||||
end
|
end
|
||||||
|
|
||||||
bfs.addr = baddr
|
bfs.addr = baddr
|
@ -1,5 +1,5 @@
|
|||||||
_ZLOADER = "managed"
|
_ZLOADER = "managed"
|
||||||
local readfile=function(f,h)
|
--[[local readfile=function(f,h)
|
||||||
local b=""
|
local b=""
|
||||||
local d,r=f.read(h,math.huge)
|
local d,r=f.read(h,math.huge)
|
||||||
if not d and r then error(r)end
|
if not d and r then error(r)end
|
||||||
@ -11,14 +11,14 @@ local readfile=function(f,h)
|
|||||||
end
|
end
|
||||||
f.close(h)
|
f.close(h)
|
||||||
return b
|
return b
|
||||||
end
|
end]]
|
||||||
|
|
||||||
local bfs = {}
|
local bfs = {}
|
||||||
|
|
||||||
local cfg = component.proxy(component.list("eeprom")()).getData()
|
local cfg = cproxy(clist("eeprom")()).getData()
|
||||||
|
|
||||||
local baddr = cfg:sub(1, 36)
|
local baddr = cfg:sub(1, 36)
|
||||||
local bootfs = component.proxy(baddr)
|
local bootfs = cproxy(baddr)
|
||||||
|
|
||||||
assert(bootfs.exists(".zy2/image.tsar"), "No boot image!")
|
assert(bootfs.exists(".zy2/image.tsar"), "No boot image!")
|
||||||
|
|
||||||
@ -47,9 +47,13 @@ function bfs.exists(path)
|
|||||||
return romfs_dev:exists(path)
|
return romfs_dev:exists(path)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function bfs.getstream(path)
|
||||||
|
return romfs_dev:stream(path)
|
||||||
|
end
|
||||||
|
|
||||||
function bfs.getcfg()
|
function bfs.getcfg()
|
||||||
local h = assert(bootfs.open(".zy2/cfg.lua", "r"))
|
local h = assert(bootfs.open(".zy2/cfg.lua", "r"))
|
||||||
return readfile(bootfs, h)
|
return utils.readfile(bootfs, h)
|
||||||
end
|
end
|
||||||
|
|
||||||
bfs.addr = baddr
|
bfs.addr = baddr
|
@ -1,38 +1,47 @@
|
|||||||
local osdi = {}
|
local bfs = {}
|
||||||
|
|
||||||
local function int(str)
|
local cfg = cproxy(clist("eeprom")()).getData()
|
||||||
local t=0
|
|
||||||
for i=1, #str do
|
|
||||||
t = t | (str:byte(i) << ((i-1)*8))
|
|
||||||
end
|
|
||||||
return t
|
|
||||||
end
|
|
||||||
|
|
||||||
local function get_part_info(meta, part)
|
local baddr, part = cfg:sub(1, 36)
|
||||||
local info = meta:sub((part*32)+1, ((part+1)*32))
|
local bootfs = cproxy(baddr)
|
||||||
local start = int(info:sub(1, 4))
|
|
||||||
local size = int(info:sub(5, 8))
|
|
||||||
local ptype = info:sub(9, 16)
|
|
||||||
local flags = int(info:sub(17, 19))
|
|
||||||
local label = info:sub(20):gsub("\0", "")
|
|
||||||
return {start = start,
|
|
||||||
size = size,
|
|
||||||
ptype = ptype,
|
|
||||||
flags = flags,
|
|
||||||
label = label
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
local function pad(str, len)
|
--find active partition
|
||||||
return str .. string.rep(" ", len-#str)
|
local bs, p, t, ss = bootfs.readSector(1), "I4I4c8I3c13", {}
|
||||||
end
|
for i=1, 15 do
|
||||||
|
t = {p:unpack(bs:sub((i*32)+1, (i+1)*32))}
|
||||||
function osdi.get_table(volume)
|
if (t[4] & 0x200 and t[4] & 0x40) then
|
||||||
local t = {}
|
ss = t[1]
|
||||||
local meta = component.invoke(volume, "readSector", 1)
|
|
||||||
for i=2, 16 do
|
|
||||||
t[i-1] = get_part_info(meta, i)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
return osdi
|
local h = 1
|
||||||
|
local romfs_dev = tsar.read(function(a)
|
||||||
|
local sz, c, st, p, d = math.ceil(a/512), "", (h//512), (h & 511)+1
|
||||||
|
for i=1, sz do
|
||||||
|
c = c .. bootfs.readSector(ss+i+st)
|
||||||
|
end
|
||||||
|
d = c:sub(p, p+a-1)
|
||||||
|
h = h+a
|
||||||
|
return d
|
||||||
|
end, function(a)
|
||||||
|
h = h + a
|
||||||
|
return h
|
||||||
|
end, function()
|
||||||
|
|
||||||
|
end)
|
||||||
|
|
||||||
|
function bfs.getfile(path)
|
||||||
|
return romfs_dev:fetch(path)
|
||||||
|
end
|
||||||
|
|
||||||
|
function bfs.exists(path)
|
||||||
|
return romfs_dev:exists(path)
|
||||||
|
end
|
||||||
|
|
||||||
|
function bfs.getstream(path)
|
||||||
|
return romfs_dev:stream(path)
|
||||||
|
end
|
||||||
|
|
||||||
|
function bfs.getcfg()
|
||||||
|
return romfs_dev:fetch(".zy2/cfg.lua")
|
||||||
|
end
|
38
src/zy-neo/builtins/init_prom/init.lua
Normal file
38
src/zy-neo/builtins/init_prom/init.lua
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
local bfs = {}
|
||||||
|
|
||||||
|
local cfg = cproxy(clist("eeprom")()).getData()
|
||||||
|
|
||||||
|
local baddr = cfg:sub(1, 36)
|
||||||
|
local bootfs = cproxy(baddr)
|
||||||
|
|
||||||
|
local h = 1
|
||||||
|
local romfs_dev = tsar.read(function(a)
|
||||||
|
local sz, c, st, p, d = math.ceil(a/512), "", (h//512)+1, (h & 511)+1
|
||||||
|
for i=1, sz do
|
||||||
|
c = c .. bootfs.blockRead(i+st)
|
||||||
|
end
|
||||||
|
d = c:sub(p, p+a-1)
|
||||||
|
h = h+a
|
||||||
|
return d
|
||||||
|
end, function(a)
|
||||||
|
h = h + a
|
||||||
|
return h
|
||||||
|
end, function()
|
||||||
|
|
||||||
|
end)
|
||||||
|
|
||||||
|
function bfs.getfile(path)
|
||||||
|
return romfs_dev:fetch(path)
|
||||||
|
end
|
||||||
|
|
||||||
|
function bfs.exists(path)
|
||||||
|
return romfs_dev:exists(path)
|
||||||
|
end
|
||||||
|
|
||||||
|
function bfs.getstream(path)
|
||||||
|
return romfs_dev:stream(path)
|
||||||
|
end
|
||||||
|
|
||||||
|
function bfs.getcfg()
|
||||||
|
return romfs_dev:fetch(".zy2/cfg.lua")
|
||||||
|
end
|
@ -1,12 +0,0 @@
|
|||||||
--#error "Not implemented."
|
|
||||||
local rfs = {}
|
|
||||||
|
|
||||||
local bfs = {}
|
|
||||||
|
|
||||||
function bfs.getfile(path)
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
function bfs.exists(path)
|
|
||||||
|
|
||||||
end
|
|
@ -1,14 +1,14 @@
|
|||||||
local magic = 0x5f7d
|
local magic = 0x5f7d
|
||||||
local magic_rev = 0x7d5f
|
local magic_rev = 0x7d5f
|
||||||
local header_fmt = "I2I2I2I2I2I6I6"
|
local header_fmt = "I2I2I2I2I2I6I6"
|
||||||
local en = string.unpack("=I2", string.char(0x7d, 0x5f)) == magic -- true = LE, false = BE
|
local en = true
|
||||||
local function get_end(e)
|
local function get_end(e)
|
||||||
return (e and "<") or ">"
|
return (e and "<") or ">"
|
||||||
end
|
end
|
||||||
local function read_header(dat)
|
local function read_header(dat)
|
||||||
local e = get_end(en)
|
local e = get_end(en)
|
||||||
local m = string.unpack(e.."I2", dat)
|
local m = string.unpack(e.."I2", dat)
|
||||||
if m ~= magic and m ~= magic_rev then return nil, "bad magic" end
|
if m ~= magic and m ~= magic_rev then return nil, string.format("bad magic (%.4x)", m) end
|
||||||
if m ~= magic then
|
if m ~= magic then
|
||||||
e = get_end(not en)
|
e = get_end(not en)
|
||||||
end
|
end
|
||||||
@ -49,20 +49,51 @@ function arc:list(path)
|
|||||||
return ent
|
return ent
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function arc:stream(path)
|
||||||
|
for i=1, #self.tbl do
|
||||||
|
if (self.tbl[i].name == path and self.tbl[i].mode & 32768 > 0) then
|
||||||
|
local pos = 1
|
||||||
|
local function read(amt)
|
||||||
|
self.seek(self.tbl[i].pos-self.seek(0)+pos-1)
|
||||||
|
pos = pos + amt
|
||||||
|
return self.read(amt)
|
||||||
|
end
|
||||||
|
local function seek(amt)
|
||||||
|
pos = pos + amt
|
||||||
|
return pos
|
||||||
|
end
|
||||||
|
local function close()end
|
||||||
|
return read, seek, close
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return nil, "file not found"
|
||||||
|
end
|
||||||
|
|
||||||
function arc:close()
|
function arc:close()
|
||||||
self.close()
|
self.close()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function arc:meta(path)
|
||||||
|
for i=1, #self.tbl do
|
||||||
|
if (self.tbl[i].name == path and self.tbl[i].mode & 32768 > 0) then
|
||||||
|
return self.tbl[i]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return nil, "file not found"
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
read = function(read, seek, close)
|
read = function(read, seek, close)
|
||||||
local tbl = {}
|
local tbl = {}
|
||||||
local lname = ""
|
local lname = ""
|
||||||
while lname ~= "TRAILER!!!" do
|
while lname ~= "TRAILER!!!" do
|
||||||
local dat = read(22)
|
local dat = read(22)
|
||||||
local et = read_header(dat)
|
local et = assert(read_header(dat))
|
||||||
et.name = read(et.namesize)
|
et.name = read(et.namesize)
|
||||||
et.pos = seek(et.namesize & 1)
|
et.pos = seek(et.namesize & 1)
|
||||||
seek(et.filesize + (et.filesize & 1))
|
local t = (et.filesize & 1)
|
||||||
|
seek(et.filesize + t)
|
||||||
lname = et.name
|
lname = et.name
|
||||||
if lname ~= "TRAILER!!!" then
|
if lname ~= "TRAILER!!!" then
|
||||||
tbl[#tbl+1] = et
|
tbl[#tbl+1] = et
|
||||||
|
@ -1,35 +1,36 @@
|
|||||||
local utils = {}
|
local utils = {}
|
||||||
|
|
||||||
function utils.debug_log(...)
|
function utils.debug_log(...)
|
||||||
local sb = component.list("sandbox")() or component.list("ocemu")()
|
local sb = clist("sandbox")() or clist("ocemu")()
|
||||||
if (sb) then component.invoke(sb, "log", ...) end
|
if (sb) then cinvoke(sb, "log", ...) end
|
||||||
end
|
end
|
||||||
|
|
||||||
function utils.baddr(address)
|
--[[function utils.baddr(address)
|
||||||
local address = address:gsub("-", "", true)
|
local address = address:gsub("-", "", true)
|
||||||
local b = ""
|
local b = ""
|
||||||
for i=1, #address, 2 do
|
for i=1, #address, 2 do
|
||||||
b = b .. string.char(tonumber(address:sub(i, i+1), 16))
|
b = b .. string.char(tonumber(address:sub(i, i+1), 16))
|
||||||
end
|
end
|
||||||
return b
|
return b
|
||||||
end
|
end]]
|
||||||
|
|
||||||
function utils.readfile(f,h)
|
function utils.readfile(f,h)
|
||||||
local b=""
|
local b=""
|
||||||
local d,r=component.invoke(f,"read",h,math.huge)
|
local d,r=cinvoke(f,"read",h,math.huge)
|
||||||
if not d and r then error(r)end
|
if not d and r then error(r)end
|
||||||
b=d
|
b=d
|
||||||
while d do
|
while d do
|
||||||
local d,r=component.invoke(f,"read",h,math.huge)
|
local d,r=cinvoke(f,"read",h,math.huge)
|
||||||
b=b..(d or "")
|
b=b..(d or "")
|
||||||
if(not d)then break end
|
if(not d)then break end
|
||||||
end
|
end
|
||||||
component.invoke(f,"close",h)
|
cinvoke(f,"close",h)
|
||||||
return b
|
return b
|
||||||
end
|
end
|
||||||
|
|
||||||
utils.load_lua = load_lua
|
utils.load_lua = load_lua
|
||||||
|
|
||||||
|
utils.lzss_decompress = lzss_decompress
|
||||||
|
|
||||||
-- Hell yeah, deepcopy time.
|
-- Hell yeah, deepcopy time.
|
||||||
function utils.deepcopy(src, dest)
|
function utils.deepcopy(src, dest)
|
||||||
dest = dest or {}
|
dest = dest or {}
|
||||||
@ -58,4 +59,61 @@ function utils.deepcopy(src, dest)
|
|||||||
return dest
|
return dest
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local velx_header = "<c5BBBBc4I3I3I3I4"
|
||||||
|
function utils.load_velx(read, seek, close, name)
|
||||||
|
-- Load a VELX format library.
|
||||||
|
local magic, fver, compression, lver, osid, arctype, psize, lsize, ssize, rsize = string.unpack(velx_header, read(string.packsize(velx_header)))
|
||||||
|
if (magic ~= "\27VelX") then
|
||||||
|
return nil, "bad magic ("..magic..")"
|
||||||
|
end
|
||||||
|
if (osid & 0x7F ~= 0x5A) then
|
||||||
|
return nil, string.format("wrong os (%x ~= 0x5A)", osid & 0x7F)
|
||||||
|
end
|
||||||
|
if (compression > 1) then
|
||||||
|
return nil, "bad compression"
|
||||||
|
end
|
||||||
|
if ((arctype ~= "\0\0\0\0" and arctype ~= "tsar")) then
|
||||||
|
return nil, "bad arctype ("..arctype..")"
|
||||||
|
end
|
||||||
|
if (fver ~= 1) then
|
||||||
|
return nil, "wrong version"
|
||||||
|
end
|
||||||
|
local prog = read(psize)
|
||||||
|
if (compression == 1) then
|
||||||
|
prog = lzss_decompress(prog)
|
||||||
|
end
|
||||||
|
seek(lsize+ssize)
|
||||||
|
local env = {}
|
||||||
|
if (arctype == "tsar") then
|
||||||
|
env._ARCHIVE = tsar.read(read, seek, close)
|
||||||
|
end
|
||||||
|
setmetatable(env, {__index=_G, __newindex=function(_, i, v) _G[i] = v end})
|
||||||
|
return load(prog, "="..(name or "(loaded velx)"), "t", env)
|
||||||
|
end
|
||||||
|
|
||||||
|
local _RENV = _G
|
||||||
|
|
||||||
|
function utils.make_env()
|
||||||
|
local env = utils.deepcopy(_RENV)
|
||||||
|
env._G = env
|
||||||
|
env.load = function(scr, name, mode, e)
|
||||||
|
return load(scr, name, mode, e or env)
|
||||||
|
end
|
||||||
|
return env
|
||||||
|
end
|
||||||
|
|
||||||
|
function utils.console_panic(er)
|
||||||
|
local con = krequire("zorya").loadmod("util_luaconsole")
|
||||||
|
if (con) then
|
||||||
|
local gpu = cproxy(clist("gpu")())
|
||||||
|
if not gpu.getScreen() or gpu.getScreen() == "" then
|
||||||
|
gpu.bind(clist("screen")())
|
||||||
|
end
|
||||||
|
con(string.format("tty.setcolor(0x4) print([[%s]])", er))
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
_RENV = utils.make_env()
|
||||||
|
|
||||||
builtins.utils = function() return utils end
|
builtins.utils = function() return utils end
|
@ -1,24 +1,18 @@
|
|||||||
local lzss_decompress = ...
|
local lzss_decompress = ...
|
||||||
--Zorya NEO itself.
|
--Zorya NEO itself.
|
||||||
_BIOS = "Zorya NEO"
|
_BIOS = "Zorya NEO"
|
||||||
_ZVSTR = "2.0-rc4"
|
_ZVSTR = "2.0-rc5"
|
||||||
_ZVER = 2.0
|
_ZVER = 2.0
|
||||||
_ZPAT = 0
|
_ZPAT = 0
|
||||||
_ZGIT = "$[[git rev-parse --short HEAD]]"
|
_ZGIT = "$[[git rev-parse --short HEAD]]"
|
||||||
--#include "ksrc/kinit.lua"
|
--#include "ksrc/kinit.lua"
|
||||||
local thd = krequire("thd")
|
local thd = krequire("thd")
|
||||||
local util = krequire("util")
|
|
||||||
local sys = krequire("sys")
|
local sys = krequire("sys")
|
||||||
local component = component
|
local component = component
|
||||||
local computer = computer
|
local computer = computer
|
||||||
local booted = false
|
local cinvoke = component.invoke
|
||||||
local zcfg = {}
|
local clist = component.list
|
||||||
function log(...)
|
local cproxy = component.proxy
|
||||||
local c = component.list("ocemu")() or component.list("sandbox")()
|
|
||||||
if c then
|
|
||||||
component.proxy(c).log(...)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
local th_i = 0
|
local th_i = 0
|
||||||
local function th_a(func)
|
local function th_a(func)
|
||||||
thd.add("zyneo$"..th_i, func)
|
thd.add("zyneo$"..th_i, func)
|
||||||
@ -26,19 +20,19 @@ local function th_a(func)
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function load_lua(src, ...)
|
local function load_lua(src, ...)
|
||||||
log(#src)
|
|
||||||
if (src:sub(1, 4) == "\27ZLS") then
|
if (src:sub(1, 4) == "\27ZLS") then
|
||||||
src = lzss_decompress(src:sub(5))
|
src = lzss_decompress(src:sub(5))
|
||||||
end
|
end
|
||||||
return load(src, ...)
|
return load(src, ...)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local tsar = load([[
|
||||||
|
$[[cat src/zy-neo/builtins/util_tsar.lua | luamin -c]]
|
||||||
|
]])()
|
||||||
|
|
||||||
local builtins = {}
|
local builtins = {}
|
||||||
--#include "src/zy-neo/utils.lua"
|
--#include "src/zy-neo/utils.lua"
|
||||||
|
local log = utils.debug_log
|
||||||
local tsar = load([[
|
|
||||||
--#include "src/zy-neo/builtins/util_tsar.lua"
|
|
||||||
]])()
|
|
||||||
|
|
||||||
sys.add_lib("zorya", (function()
|
sys.add_lib("zorya", (function()
|
||||||
|
|
||||||
@ -56,8 +50,6 @@ sys.add_lib("zorya", (function()
|
|||||||
|
|
||||||
local loaded_mods = {}
|
local loaded_mods = {}
|
||||||
|
|
||||||
loaded_mods.util_tsar = tsar
|
|
||||||
|
|
||||||
function zy.loadmod(mod)
|
function zy.loadmod(mod)
|
||||||
if (loaded_mods[mod]) then return loaded_mods[mod] end
|
if (loaded_mods[mod]) then return loaded_mods[mod] end
|
||||||
for i=1, #mod_search do
|
for i=1, #mod_search do
|
||||||
@ -67,10 +59,6 @@ sys.add_lib("zorya", (function()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function zy.loader_run(func, env)
|
|
||||||
func(env)
|
|
||||||
end
|
|
||||||
|
|
||||||
function zy.add_mod_search(func)
|
function zy.add_mod_search(func)
|
||||||
mod_search[#mod_search+1] = func
|
mod_search[#mod_search+1] = func
|
||||||
log(#mod_search)
|
log(#mod_search)
|
||||||
@ -94,11 +82,11 @@ th_a(function()
|
|||||||
xpcall(function()
|
xpcall(function()
|
||||||
local zy = krequire("zorya")
|
local zy = krequire("zorya")
|
||||||
zy.add_mod_search(function(mod)
|
zy.add_mod_search(function(mod)
|
||||||
if (bfs.exists(".zy2/mods/"..mod..".zy2m")) then
|
if (bfs.exists(".zy2/mods/"..mod..".velx")) then
|
||||||
utils.debug_log(mod, ".zy2m")
|
--utils.debug_log(mod, ".zy2m")
|
||||||
return load_lua(bfs.getfile(".zy2/mods/"..mod..".zy2m"), "=.zy2/mods/"..mod..".zy2m")()
|
--return load_lua(bfs.getfile(".zy2/mods/"..mod..".zy2m"), "=.zy2/mods/"..mod..".zy2m")()
|
||||||
elseif (bfs.exists(".zy2/mods/"..mod.."/init.zy2m")) then
|
local r,s,c = bfs.getstream(".zy2/mods/"..mod..".velx")
|
||||||
return assert(load_lua(bfs.getfile(".zy2/mods/"..mod.."/init.zy2m"), "=.zy2/mods/"..mod.."/init.zy2m"))()
|
return assert(utils.load_velx(r,s,c,".zy2/mods/"..mod..".velx"))()
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
sys.add_search(function(mod)
|
sys.add_search(function(mod)
|
||||||
@ -107,28 +95,31 @@ th_a(function()
|
|||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
sys.add_search(function(mod)
|
sys.add_search(function(mod)
|
||||||
if (bfs.exists(".zy2/lib/"..mod..".zy2l")) then
|
if (bfs.exists(".zy2/lib/"..mod..".velx")) then
|
||||||
return load_lua(bfs.getfile(".zy2/lib/"..mod..".zy2l"), "=.zy2/lib/"..mod..".zy2l")
|
local r,s,c = bfs.getstream(".zy2/lib/"..mod..".velx")
|
||||||
elseif (bfs.exists(".zy2/lib/"..mod.."/init..zy2l")) then
|
return utils.load_velx(r,s,c,".zy2/lib/"..mod..".velx")
|
||||||
return load_lua(bfs.getfile(".zy2/lib/"..mod.."/init.zy2l"), "=.zy2/lib/"..mod.."/init.zy2l")
|
--return load_lua(bfs.getfile(".zy2/lib/"..mod..".velx"), "=.zy2/lib/"..mod..".zy2l")
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
local zycfg = bfs.getcfg()
|
local zycfg = bfs.getcfg()
|
||||||
-- Config loaded, now we can do our shit.
|
-- Config loaded, now we can do our shit.
|
||||||
local env = {
|
local env = utils.make_env()
|
||||||
zorya = zy,
|
env.zorya = zy
|
||||||
loadmod = zy.loadmod,
|
env.loadmod = zy.loadmod
|
||||||
loadfile = bfs.getfile,
|
env.loadfile = bfs.getfile
|
||||||
_BOOTADDR = bfs.addr
|
env._BOOTADDR = bfs.addr
|
||||||
}
|
|
||||||
for k, v in pairs(_G) do
|
local c, e = load(zycfg, "=zycfg", "t", env)
|
||||||
env[k] = v
|
if c then
|
||||||
|
return c()
|
||||||
|
else
|
||||||
|
utils.console_panic(e)
|
||||||
end
|
end
|
||||||
env._G = env
|
|
||||||
env._ENV = env
|
|
||||||
return assert(load(zycfg, "=zycfg", "t", env))()
|
|
||||||
end, function(e)
|
end, function(e)
|
||||||
er = e..": "..debug.traceback()
|
er = e..": "..debug.traceback()
|
||||||
|
if(not utils.console_panic(er)) then
|
||||||
|
er = er .. "\n(Lua console failed to start)"
|
||||||
|
end
|
||||||
end)
|
end)
|
||||||
if er then error(er) end
|
if er then error(er) end
|
||||||
end)
|
end)
|
||||||
|
247
utils/installer/blt.lua
Normal file
247
utils/installer/blt.lua
Normal file
@ -0,0 +1,247 @@
|
|||||||
|
-- BLT, made for Lua 5.3
|
||||||
|
|
||||||
|
local blt = {}
|
||||||
|
|
||||||
|
local types
|
||||||
|
|
||||||
|
local function serialize(val)
|
||||||
|
local t = type(val)
|
||||||
|
if (t == "number") then
|
||||||
|
t = math.type(val)
|
||||||
|
end
|
||||||
|
local b, str = types["s"..t](val)
|
||||||
|
b = (b << 3) | types[t]
|
||||||
|
return string.char(b) .. str
|
||||||
|
end
|
||||||
|
|
||||||
|
local function deserialize(str, t)
|
||||||
|
local tb = str:byte(1)
|
||||||
|
local type_ = tb & 7
|
||||||
|
local b = tb >> 3
|
||||||
|
local v, l = types[type_](b, str:sub(2))
|
||||||
|
return v, l+1
|
||||||
|
end
|
||||||
|
|
||||||
|
local function fromdouble(f)
|
||||||
|
return 0, string.pack("<d", f)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function todouble(b, str)
|
||||||
|
return string.unpack("<d", str:sub(1, 8)), 8
|
||||||
|
end
|
||||||
|
|
||||||
|
local function _fromlongint(i)
|
||||||
|
--print("longint")
|
||||||
|
return 8, string.pack("<l", i)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function fromint(i)
|
||||||
|
--Time to rabidly optimize this.
|
||||||
|
local len = 0
|
||||||
|
local cmp2 = 0
|
||||||
|
if (i > 0xFFFFFFFFFFFFFF) then return _fromlongint(i) end
|
||||||
|
for j=0, 7 do
|
||||||
|
len = len + 1
|
||||||
|
cmp2 = cmp2 | (0xFF << j)
|
||||||
|
--print("fromint", i+((cmp2//2)), cmp2)
|
||||||
|
--if (i+((cmp2//2)) <= cmp2) then
|
||||||
|
if (math.abs(i) <= cmp2//2) then
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if (i < 0) then
|
||||||
|
i = i + (cmp2//2)
|
||||||
|
end
|
||||||
|
--i = i + (cmp2//2)
|
||||||
|
local tmp = ""
|
||||||
|
for j=0, len-1 do
|
||||||
|
tmp = tmp .. string.char((i & (0xFF << (j*8))) >> (j*8))
|
||||||
|
end
|
||||||
|
--local tmp = string.pack("<i["..len.."]", i)
|
||||||
|
return len, tmp
|
||||||
|
end
|
||||||
|
|
||||||
|
local function _tolongint(str)
|
||||||
|
--print("longint2")
|
||||||
|
return string.unpack("<l", str:sub(1, 8)), 8
|
||||||
|
end
|
||||||
|
|
||||||
|
local function toint(b, str)
|
||||||
|
if (b == 8) then return _tolongint(str) end
|
||||||
|
--return string.unpack("<i["..b.."]", str:sub(1, b)), b
|
||||||
|
local tmp = 0
|
||||||
|
for i=0, b-1 do
|
||||||
|
tmp = tmp | (str:byte(i+1) << (i*8))
|
||||||
|
end
|
||||||
|
local sign = (tmp & (0x80 << ((b-1)*8)))
|
||||||
|
sign = sign << (63 - (b*8))
|
||||||
|
local int = tmp & ((0x80 << ((b-1)*8)) ~ 0xFFFFFFFFFFFFFF)
|
||||||
|
return int | sign, b
|
||||||
|
end
|
||||||
|
|
||||||
|
local function frombool(b)
|
||||||
|
return b and 1 or 0, ""
|
||||||
|
end
|
||||||
|
|
||||||
|
local function tobool(b, str)
|
||||||
|
return b ~= 0, 0
|
||||||
|
end
|
||||||
|
|
||||||
|
local function fromstr(s)
|
||||||
|
local len, val = fromint(#s)
|
||||||
|
return len, val .. s
|
||||||
|
end
|
||||||
|
|
||||||
|
local function tostr(b, str)
|
||||||
|
local strl, l = toint(b, str)
|
||||||
|
local rtn = str:sub(1+l, l+strl)
|
||||||
|
return rtn, strl+l
|
||||||
|
end
|
||||||
|
|
||||||
|
local function fromarray(a)
|
||||||
|
local b, tmp = fromint(#a)
|
||||||
|
for i=1, #a do
|
||||||
|
tmp = tmp .. serialize(a[i])
|
||||||
|
end
|
||||||
|
--print("alen_s", #tmp)
|
||||||
|
return b, tmp
|
||||||
|
end
|
||||||
|
|
||||||
|
local function toarray(b, str, arr)
|
||||||
|
local arrl, l = toint(b, str)
|
||||||
|
--print("clen", l)
|
||||||
|
--print("arr len", arrl)
|
||||||
|
local arr = {}
|
||||||
|
local i = 0
|
||||||
|
for i=1, arrl do
|
||||||
|
--print("adec", i)
|
||||||
|
local v, z = deserialize(str:sub(1+l))
|
||||||
|
--print("arr", i, v)
|
||||||
|
l = l+z
|
||||||
|
--print("clen", l, z)
|
||||||
|
arr[i] = v
|
||||||
|
end
|
||||||
|
--print("alen", l)
|
||||||
|
return arr, l
|
||||||
|
end
|
||||||
|
|
||||||
|
local function fromtbl(t)
|
||||||
|
local tmp = ""
|
||||||
|
--See if the numerical keys are a list, and, if so, write a list
|
||||||
|
local nindex = 0
|
||||||
|
local nmax = 0
|
||||||
|
for k, v in pairs(t) do
|
||||||
|
if (type(k) == "number") then
|
||||||
|
if (math.type(k) == "integer") then
|
||||||
|
nindex = nindex + 1
|
||||||
|
if (nmax < k) then
|
||||||
|
nmax = k
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
local ks = serialize(k)
|
||||||
|
local vs = serialize(v)
|
||||||
|
tmp = tmp .. ks .. vs
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if (nmax > 0) then
|
||||||
|
if (nindex == nmax) then
|
||||||
|
local ib, dat = fromarray(t)
|
||||||
|
tmp = tmp .. string.char(0) .. string.char(types.table_array | (ib << 3)) .. dat
|
||||||
|
else
|
||||||
|
for k, v in pairs(t) do
|
||||||
|
if (type(k) == "number" and math.type(k) == "integer") then
|
||||||
|
local ks = serialize(k)
|
||||||
|
local vs = serialize(v)
|
||||||
|
tmp = tmp .. ks .. vs
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return 0, tmp .. string.char(0,0) --nil,nil terminated
|
||||||
|
end
|
||||||
|
|
||||||
|
local function totbl(b, str)
|
||||||
|
local t = {}
|
||||||
|
local k = ""
|
||||||
|
local v = ""
|
||||||
|
local pos = 1
|
||||||
|
--print("topen")
|
||||||
|
while true do
|
||||||
|
--print("k", str:byte(pos), str:byte(pos) & 7)
|
||||||
|
local k, l = deserialize(str:sub(pos))
|
||||||
|
pos = pos + l
|
||||||
|
--print("v", str:byte(pos), str:byte(pos) & 7)
|
||||||
|
if (str:byte(pos) & 7 == 6) then
|
||||||
|
--print("ailen", str:byte(pos) & (7 ~ 0xFF))
|
||||||
|
local r, l = deserialize(str:sub(pos))
|
||||||
|
pos = pos + l
|
||||||
|
for i=1, #r do
|
||||||
|
t[i] = r[i]
|
||||||
|
end
|
||||||
|
else
|
||||||
|
local v, l = deserialize(str:sub(pos))
|
||||||
|
pos = pos + l
|
||||||
|
if (not v and not k) then
|
||||||
|
--print("tclose")
|
||||||
|
break
|
||||||
|
end
|
||||||
|
--print("decode", k, v)
|
||||||
|
t[k] = v
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return t, pos-1 --how
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Type LUT
|
||||||
|
types = {
|
||||||
|
["nil"] = 0,
|
||||||
|
float = 1,
|
||||||
|
number = 1,
|
||||||
|
integer = 2,
|
||||||
|
string = 3,
|
||||||
|
boolean = 4,
|
||||||
|
table = 5,
|
||||||
|
table_array = 6, --Meta-value
|
||||||
|
[0] = function(b, str) return nil, 0 end,
|
||||||
|
[1] = todouble,
|
||||||
|
[2] = toint,
|
||||||
|
[3] = tostr,
|
||||||
|
[4] = tobool,
|
||||||
|
[5] = totbl,
|
||||||
|
[6] = toarray,
|
||||||
|
snil = function()return 0, ""end,
|
||||||
|
sfloat = fromdouble,
|
||||||
|
sinteger = fromint,
|
||||||
|
sstring = fromstr,
|
||||||
|
sboolean = frombool,
|
||||||
|
stable = fromtbl,
|
||||||
|
stable_array = fromarray
|
||||||
|
}
|
||||||
|
|
||||||
|
function blt.serialize(...)
|
||||||
|
local args = {...}
|
||||||
|
local tmp = string.char(#args)
|
||||||
|
for i=1, #args do
|
||||||
|
local str = serialize(args[i])
|
||||||
|
tmp = tmp .. str
|
||||||
|
end
|
||||||
|
return tmp
|
||||||
|
end
|
||||||
|
|
||||||
|
local unpack = unpack or table.unpack
|
||||||
|
|
||||||
|
function blt.deserialize(str)
|
||||||
|
local args = {}
|
||||||
|
local pos = 2
|
||||||
|
local amt = str:byte(1)
|
||||||
|
local l
|
||||||
|
for i=1, amt do
|
||||||
|
local v, l = deserialize(str:sub(pos))
|
||||||
|
args[i] = v
|
||||||
|
pos = pos + l
|
||||||
|
end
|
||||||
|
return unpack(args)
|
||||||
|
end
|
||||||
|
|
||||||
|
return blt
|
37
utils/installer/bootstrap.lua
Normal file
37
utils/installer/bootstrap.lua
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
local args = {...}
|
||||||
|
local tbl = args[1]
|
||||||
|
local dat = args[2]
|
||||||
|
table.remove(args, 1)
|
||||||
|
table.remove(args, 1)
|
||||||
|
|
||||||
|
local function getfile(path)
|
||||||
|
for i=1, #tbl do
|
||||||
|
if (tbl[i].name == path) then
|
||||||
|
return dat:sub(tbl[i].pos, tbl[i].pos+tbl[i].filesize-1)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if debug.debug then
|
||||||
|
for i=1, #tbl do
|
||||||
|
print(tbl[i].name, tbl[i].filesize)
|
||||||
|
end
|
||||||
|
print("Zorya NEO Installer")
|
||||||
|
print("This was made for OpenComputers, and, as such, is not compatible with your system.")
|
||||||
|
os.exit(0)
|
||||||
|
end
|
||||||
|
|
||||||
|
function lzss_decompress(a)local b,c,d,e,j,i,h,g=1,'',''while b<=#a do
|
||||||
|
e=c.byte(a,b)b=b+1
|
||||||
|
for k=0,7 do h=c.sub
|
||||||
|
g=h(a,b,b)if e>>k&1<1 and b<#a then
|
||||||
|
i=c.unpack('>I2',a,b)j=1+(i>>4)g=h(d,j,j+(i&15)+2)b=b+1
|
||||||
|
end
|
||||||
|
b=b+1
|
||||||
|
c=c..g
|
||||||
|
d=h(d..g,-4^6)end
|
||||||
|
end
|
||||||
|
return c end
|
||||||
|
|
||||||
|
local component = component or require("component")
|
||||||
|
local computer = computer or require("computer")
|
30
utils/installer/graphics.lua
Normal file
30
utils/installer/graphics.lua
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
local characters = {
|
||||||
|
"╔", "╗", "═", "║", "╚", "╝"
|
||||||
|
}
|
||||||
|
|
||||||
|
local proxy, list = component.proxy, component.list
|
||||||
|
local gpu = proxy(list("gpu")())
|
||||||
|
if (not gpu.getScreen()) then
|
||||||
|
gpu.bind(list("screen")())
|
||||||
|
end
|
||||||
|
local usepal
|
||||||
|
if (gpu.getDepth() > 1) then
|
||||||
|
usepal = true
|
||||||
|
gpu.setPaletteColor(0, 0x000000)
|
||||||
|
gpu.setPaletteColor(1, 0xFFFFFF)
|
||||||
|
gpu.setPaletteColor(2, 0x4444FF)
|
||||||
|
gpu.setPaletteColor(3, 0xFF7F44)
|
||||||
|
gpu.setPaletteColor(4, 0x00007F)
|
||||||
|
gpu.setPaletteColor(5, 0x7F00FF)
|
||||||
|
gpu.setPaletteColor(6, 0x595959)
|
||||||
|
end
|
||||||
|
local function gc(c)
|
||||||
|
if usepal then
|
||||||
|
return c, true
|
||||||
|
end
|
||||||
|
return (c == 1) and 1 or 0
|
||||||
|
end
|
||||||
|
|
||||||
|
function gfx.drawtitle()
|
||||||
|
|
||||||
|
end
|
7
utils/installer/init.lua
Normal file
7
utils/installer/init.lua
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
--#include "utils/installer/bootstrap.lua"
|
||||||
|
--#include "utils/installer/blt.lua"
|
||||||
|
--#include "utils/installer/strings.lua"
|
||||||
|
--#include "utils/installer/graphics.lua"
|
||||||
|
--#include "utils/installer/menu.lua"
|
||||||
|
|
||||||
|
local menus = {}
|
128
utils/installer/menu.lua
Normal file
128
utils/installer/menu.lua
Normal file
@ -0,0 +1,128 @@
|
|||||||
|
local menu = {}
|
||||||
|
|
||||||
|
local _menu = {}
|
||||||
|
|
||||||
|
function menu.create(title)
|
||||||
|
return setmetatable({}, {__index=_menu})
|
||||||
|
end
|
||||||
|
|
||||||
|
function _menu:destroy()
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
function _menu:add(obj)
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
function _menu:calcsize()
|
||||||
|
local w, h = 0,0
|
||||||
|
for i=1, #self do
|
||||||
|
local ew, eh = self[i]:size()
|
||||||
|
if (ew > w) then
|
||||||
|
w = ew
|
||||||
|
end
|
||||||
|
h = h + eh
|
||||||
|
end
|
||||||
|
self.w = w
|
||||||
|
self.h = h
|
||||||
|
return w, h
|
||||||
|
end
|
||||||
|
|
||||||
|
function _menu:draw()
|
||||||
|
local w, h = self.w+2, self.h+2
|
||||||
|
for i=1, #self do
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function _menu:drawblit()
|
||||||
|
local w, h = self.w+2, self.h+2
|
||||||
|
for i=1, #self do
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local _text = {}
|
||||||
|
|
||||||
|
function _text:size()
|
||||||
|
return self.w, self.h
|
||||||
|
end
|
||||||
|
|
||||||
|
function _text:draw(gpu, x, y, width)
|
||||||
|
for i=1, #self.txt do
|
||||||
|
local rx = x+math.floor((width/2)-(#self.txt/2))
|
||||||
|
gpu.set(rx, y+i-1, self.txt[i])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local _select = {entry = true}
|
||||||
|
|
||||||
|
function _select:select(func)
|
||||||
|
self.select = func
|
||||||
|
end
|
||||||
|
|
||||||
|
function _select:size()
|
||||||
|
return self.w, self.h
|
||||||
|
end
|
||||||
|
|
||||||
|
function _select:keyupdate(key)
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
local _buttons = {entry = true}
|
||||||
|
|
||||||
|
function _buttons:select(func)
|
||||||
|
self.select = func
|
||||||
|
end
|
||||||
|
|
||||||
|
function _buttons:size()
|
||||||
|
return self.w, self.h
|
||||||
|
end
|
||||||
|
|
||||||
|
function _buttons:keyupdate(key)
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
local _checkboxes = {entry = true}
|
||||||
|
|
||||||
|
function _checkboxes:size()
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
function _checkboxes:keyupdate(key)
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
local _textbox = {entry = true}
|
||||||
|
|
||||||
|
function _textbox:keyupdate(key)
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
function _textbox:size()
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
function _textbox:select(func)
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
function _textbox:get()
|
||||||
|
return self.buffer
|
||||||
|
end
|
||||||
|
|
||||||
|
function menu.textbox(w)
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
function menu.select(options)
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
function menu.buttons(buttons)
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
function menu.checkbox(options)
|
||||||
|
|
||||||
|
end
|
16
utils/installer/menus/bios.lua
Normal file
16
utils/installer/menus/bios.lua
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
function menu.bios()
|
||||||
|
local biossel = menu.create()
|
||||||
|
biossel:add(menu.text(lang.getstring("menu_bios_select")))
|
||||||
|
local bios = menu.select {
|
||||||
|
{text = lang.getstring("bios_type_managed"), value = "managed"},
|
||||||
|
{text = lang.getstring("bios_type_initramfs"), value = "initramfs"},
|
||||||
|
{text = lang.getstring("bios_type_prom"), value = "prom"},
|
||||||
|
{text = lang.getstring("bios_type_osdi"), value = "osdi"},
|
||||||
|
}
|
||||||
|
bios:select(function(v)
|
||||||
|
biossel:destroy()
|
||||||
|
menu["bios_"..v]()
|
||||||
|
end)
|
||||||
|
biossel:add(bios)
|
||||||
|
biossel:draw()
|
||||||
|
end
|
0
utils/installer/menus/format.lua
Normal file
0
utils/installer/menus/format.lua
Normal file
0
utils/installer/menus/initramfs.lua
Normal file
0
utils/installer/menus/initramfs.lua
Normal file
14
utils/installer/menus/langselect.lua
Normal file
14
utils/installer/menus/langselect.lua
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
function menu.langsetup()
|
||||||
|
local langselect = menu.create()
|
||||||
|
menu:add(menu.text("Language"))
|
||||||
|
local langs = menu.select {
|
||||||
|
{text = "English (US)", value = "en_US"}
|
||||||
|
}
|
||||||
|
langs:select(function(v)
|
||||||
|
langselect:destroy()
|
||||||
|
lang.load(v)
|
||||||
|
menu.bios()
|
||||||
|
end)
|
||||||
|
menu:add(langs)
|
||||||
|
menu:draw()
|
||||||
|
end
|
0
utils/installer/menus/managed.lua
Normal file
0
utils/installer/menus/managed.lua
Normal file
20
utils/installer/menus/osdi.lua
Normal file
20
utils/installer/menus/osdi.lua
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
function menu.bios_osdi()
|
||||||
|
-- Find OSDI formatted disks.
|
||||||
|
local osdi = menu.create()
|
||||||
|
local drives = {}
|
||||||
|
local dselv = {}
|
||||||
|
for d in list("drive") do
|
||||||
|
local drive = proxy(d)
|
||||||
|
local t = drive.readSector(1)
|
||||||
|
local fmt = (t:sub(1, 4) == "OSDI")
|
||||||
|
drives[#drives+1] = {dev=drive, addr=d, format=fmt}
|
||||||
|
dselv[#dselv+1] = {text=string.format("%s (%s)", d:sub(1,6), lang.getstring((fmt and "osdi_formatted") or "osdi_unformatted")), value=drives[#drives]}
|
||||||
|
end
|
||||||
|
local disksel = menu.select(dselv)
|
||||||
|
disksel:select(function(v)
|
||||||
|
if not v.format then
|
||||||
|
|
||||||
|
end)
|
||||||
|
osdi:add(disksel)
|
||||||
|
osdi:destroy()
|
||||||
|
end
|
0
utils/installer/menus/prom.lua
Normal file
0
utils/installer/menus/prom.lua
Normal file
11
utils/installer/strings.lua
Normal file
11
utils/installer/strings.lua
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
local lang = {}
|
||||||
|
do
|
||||||
|
local _LANGINFO = {}
|
||||||
|
function lang.load(locale)
|
||||||
|
_LANGINFO = blt.deserialize(lzss_decompress(getfile("lang/"..locale..".blt.z")))
|
||||||
|
end
|
||||||
|
|
||||||
|
function lang.getstring(str)
|
||||||
|
return _LANGINFO[str]
|
||||||
|
end
|
||||||
|
end
|
49
utils/installer/tsarbuild.lua
Normal file
49
utils/installer/tsarbuild.lua
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
local tsar = {}
|
||||||
|
|
||||||
|
do
|
||||||
|
local file = ""
|
||||||
|
local modes = {
|
||||||
|
["fifo"] = 1,
|
||||||
|
["char device"] = 2,
|
||||||
|
["directory"] = 4,
|
||||||
|
["block device"] = 6,
|
||||||
|
["file"] = 8,
|
||||||
|
["link"] = 0xA,
|
||||||
|
["socket"] = 0xC
|
||||||
|
}
|
||||||
|
local function tsar.getperm(ftype, perm)
|
||||||
|
local md = 0
|
||||||
|
for i=1, 9 do
|
||||||
|
if (perm:sub(i,i) ~= "-") then
|
||||||
|
md = md | (1 << (i-1))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return md | (modes[ftype] << 12)
|
||||||
|
end
|
||||||
|
|
||||||
|
function tsar.new_node(ni)
|
||||||
|
local ent = {
|
||||||
|
name = ni.name,
|
||||||
|
namesize = #ni.name,
|
||||||
|
magic = 0x5f7d,
|
||||||
|
mode = ni.mode or tsar.getperm("directory", "r-xr-xr-x"),
|
||||||
|
uid = ni.uid or 0,
|
||||||
|
gid = ni.gid or 0,
|
||||||
|
filesize = (ni.data and #ni.data) or 0,
|
||||||
|
mtime = os.time()
|
||||||
|
}
|
||||||
|
file = file .. string.pack("=I2I2I2I2I2I6I6", ent.magic, ent.namesize, ent.mode, ent.uid, ent.gid, ent.filesize, ent.mtime)
|
||||||
|
file = file .. ni.path
|
||||||
|
if ent.namesize & 1 > 0 then
|
||||||
|
file = file .. "\0"
|
||||||
|
end
|
||||||
|
file = file .. (ni.data or "")
|
||||||
|
if ent.namesize & 1 > 0 then
|
||||||
|
file = file .. "\0"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function tsar.get()
|
||||||
|
return file
|
||||||
|
end
|
||||||
|
end
|
29
utils/installer/velxbootstrap.lua
Normal file
29
utils/installer/velxbootstrap.lua
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
local args = {...}
|
||||||
|
|
||||||
|
local function getfile(path)
|
||||||
|
return _ARCHIVE:fetch(path)
|
||||||
|
end
|
||||||
|
|
||||||
|
if debug.debug then
|
||||||
|
for i=1, #tbl do
|
||||||
|
print(tbl[i].name, tbl[i].filesize)
|
||||||
|
end
|
||||||
|
print("Zorya NEO Installer")
|
||||||
|
print("This was made for OpenComputers, and, as such, is not compatible with your system.")
|
||||||
|
os.exit(0)
|
||||||
|
end
|
||||||
|
|
||||||
|
function lzss_decompress(a)local b,c,d,e,j,i,h,g=1,'',''while b<=#a do
|
||||||
|
e=c.byte(a,b)b=b+1
|
||||||
|
for k=0,7 do h=c.sub
|
||||||
|
g=h(a,b,b)if e>>k&1<1 and b<#a then
|
||||||
|
i=c.unpack('>I2',a,b)j=1+(i>>4)g=h(d,j,j+(i&15)+2)b=b+1
|
||||||
|
end
|
||||||
|
b=b+1
|
||||||
|
c=c..g
|
||||||
|
d=h(d..g,-4^6)end
|
||||||
|
end
|
||||||
|
return c end
|
||||||
|
|
||||||
|
local component = component or require("component")
|
||||||
|
local computer = computer or require("computer")
|
Loading…
Reference in New Issue
Block a user