Crescent
This commit is contained in:
parent
ca4706257f
commit
501561ba4a
@ -144,6 +144,7 @@ local function struct(tbl)
|
|||||||
end})
|
end})
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
local velx_spec = struct {
|
local velx_spec = struct {
|
||||||
endian = "<",
|
endian = "<",
|
||||||
{magic="c5"},
|
{magic="c5"},
|
||||||
@ -151,6 +152,7 @@ local velx_spec = struct {
|
|||||||
{compression="B"},
|
{compression="B"},
|
||||||
{lver="B"},
|
{lver="B"},
|
||||||
{os="B"},
|
{os="B"},
|
||||||
|
{arctype="c4"},
|
||||||
{psize="I3"},
|
{psize="I3"},
|
||||||
{lsize="I3"},
|
{lsize="I3"},
|
||||||
{ssize="I3"},
|
{ssize="I3"},
|
||||||
@ -160,9 +162,9 @@ local velx_spec = struct {
|
|||||||
-- This builds Tsuki into a VELX executable.
|
-- This builds Tsuki into a VELX executable.
|
||||||
print("Compiling kernel...")
|
print("Compiling kernel...")
|
||||||
local h = io.popen("luacomp ksrc/init.lua", "r")
|
local h = io.popen("luacomp ksrc/init.lua", "r")
|
||||||
os.execute("luacomp ksrc/init.lua -O debug.lua")
|
|
||||||
local krnl = h:read("*a")
|
local krnl = h:read("*a")
|
||||||
h:close()
|
h:close()
|
||||||
|
os.execute("luacomp ksrc/init.lua -O debug.lua 2>/dev/null")
|
||||||
print("Generating docs and stripping comments...")
|
print("Generating docs and stripping comments...")
|
||||||
os.execute("mkdir .docs")
|
os.execute("mkdir .docs")
|
||||||
h = io.popen("lua utils/gendocs.lua .docs 2>.ktmp", "w")
|
h = io.popen("lua utils/gendocs.lua .docs 2>.ktmp", "w")
|
||||||
@ -187,7 +189,8 @@ local header = velx_spec({
|
|||||||
psize = #data,
|
psize = #data,
|
||||||
lsize=0,
|
lsize=0,
|
||||||
ssize=0,
|
ssize=0,
|
||||||
rsize=#arc
|
rsize=#arc,
|
||||||
|
arctype="tsar"
|
||||||
})
|
})
|
||||||
h:write(header)
|
h:write(header)
|
||||||
h:write(data)
|
h:write(data)
|
||||||
|
0
docs/foxfs.md
Normal file
0
docs/foxfs.md
Normal file
48
extras/crescent/init.lua
Normal file
48
extras/crescent/init.lua
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
local version = "1.0"
|
||||||
|
|
||||||
|
local gpu = component.list("gpu")()
|
||||||
|
local w, h
|
||||||
|
local screen = component.list('screen')()
|
||||||
|
for address in component.list('screen') do
|
||||||
|
if #component.invoke(address, 'getKeyboards') > 0 then
|
||||||
|
screen = address
|
||||||
|
end
|
||||||
|
end
|
||||||
|
local cls = function()end
|
||||||
|
if gpu and screen then
|
||||||
|
component.invoke(gpu, "bind", screen)
|
||||||
|
w, h = component.invoke(gpu, "getResolution")
|
||||||
|
component.invoke(gpu, "setResolution", w, h)
|
||||||
|
component.invoke(gpu, "setBackground", 0x000000)
|
||||||
|
component.invoke(gpu, "setForeground", 0xFFFFFF)
|
||||||
|
component.invoke(gpu, "fill", 1, 1, w, h, " ")
|
||||||
|
cls = function()component.invoke(gpu,"fill", 1, 1, w, h, " ")end
|
||||||
|
end
|
||||||
|
local y = 1
|
||||||
|
local function status(msg)
|
||||||
|
if gpu and screen then
|
||||||
|
component.invoke(gpu, "set", 1, y, msg)
|
||||||
|
if y == h then
|
||||||
|
component.invoke(gpu, "copy", 1, 2, w, h - 1, 0, -1)
|
||||||
|
component.invoke(gpu, "fill", 1, h, w, 1, " ")
|
||||||
|
else
|
||||||
|
y = y + 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local loadspin = 1
|
||||||
|
local spins = {
|
||||||
|
"-", "\\", "|", "/"
|
||||||
|
}
|
||||||
|
|
||||||
|
local function lsc()
|
||||||
|
loadspin = (loadspin % 4) + 1
|
||||||
|
return spins[loadspin]
|
||||||
|
end
|
||||||
|
|
||||||
|
--#include "crescent/velx.lua"
|
||||||
|
--#include "crescent/tsar.lua"
|
||||||
|
--#include "crescent/loader.lua"
|
||||||
|
|
||||||
|
status("crescent loader v"..version)
|
6
extras/crescent/loader.lua
Normal file
6
extras/crescent/loader.lua
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
function boot_kernel(...)
|
||||||
|
local knl, env = load_velx(computer.getBootAddress(), "kernel.velx")
|
||||||
|
local iramfs = load_tsar(computer.getBootAddress(), "initramfs.tsar")
|
||||||
|
env._ARCHIVE = iramfs
|
||||||
|
knl(...)
|
||||||
|
end
|
0
extras/crescent/tsar.lua
Normal file
0
extras/crescent/tsar.lua
Normal file
39
extras/crescent/velx.lua
Normal file
39
extras/crescent/velx.lua
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
local 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 function load_velx(addr, path)
|
||||||
|
status("loading kernel... "..lsc())
|
||||||
|
local fs = component.proxy(addr)
|
||||||
|
local h = fs.open(path)
|
||||||
|
local magic, fver, comp, lver, osid, psize = string.unpack("<c5BBBBxxxxI3xxxxxxxxxx", fs.read(h, 13))
|
||||||
|
if (magic ~= "\27VelX" or fver ~= 1 or osid ~= 127) then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local rdat = psize
|
||||||
|
local dat = ""
|
||||||
|
local buf = ""
|
||||||
|
repeat
|
||||||
|
buf = fs.read(h, rdat)
|
||||||
|
if (buf) then
|
||||||
|
dat = dat .. buf
|
||||||
|
end
|
||||||
|
rdat = psize - #dat
|
||||||
|
y = y - 1
|
||||||
|
status("loading kernel... "..lsc())
|
||||||
|
until rdat == 0 or not buf or buf == ""
|
||||||
|
y = y - 1
|
||||||
|
status("loading kernel... ")
|
||||||
|
if (comp == 1) then
|
||||||
|
status("decompressing kernel...")
|
||||||
|
buf = lzss_decompress(buf)
|
||||||
|
end
|
||||||
|
end
|
@ -1,5 +1,35 @@
|
|||||||
|
local 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 function boot_velx(addr, path)
|
local function boot_velx(addr, path)
|
||||||
|
local fs = component.proxy(addr)
|
||||||
|
local h = fs.open(path)
|
||||||
|
local magic, fver, comp, lver, osid, psize = string.unpack("<c5BBBBxxxxI3xxxxxxxxxx", fs.read(h, 13))
|
||||||
|
if (magic ~= "\27VelX" or fver ~= 1 or osid ~= 127) then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local rdat = psize
|
||||||
|
local dat = ""
|
||||||
|
local buf = ""
|
||||||
|
repeat
|
||||||
|
buf = fs.read(h, rdat)
|
||||||
|
if (buf) then
|
||||||
|
dat = dat .. buf
|
||||||
|
end
|
||||||
|
rdat = psize - #dat
|
||||||
|
until rdat == 0 or not buf or buf == ""
|
||||||
|
if (comp == 1) then
|
||||||
|
buf = lzss_decompress(buf)
|
||||||
|
end
|
||||||
|
assert(load(buf, "="..path))()
|
||||||
end
|
end
|
||||||
|
|
||||||
local eeprom = component.proxy(component.list("eeprom")())
|
local eeprom = component.proxy(component.list("eeprom")())
|
||||||
|
@ -0,0 +1,5 @@
|
|||||||
|
local buffer = {}
|
||||||
|
|
||||||
|
local function create_buffer()
|
||||||
|
|
||||||
|
end
|
@ -10,6 +10,4 @@ end)
|
|||||||
-- Executable loading process:
|
-- Executable loading process:
|
||||||
-- - Link
|
-- - Link
|
||||||
-- - Load
|
-- - Load
|
||||||
-- - Execute
|
-- - Execute
|
||||||
|
|
||||||
if ()
|
|
@ -5,6 +5,7 @@ local velx_spec = struct {
|
|||||||
{compression="B"},
|
{compression="B"},
|
||||||
{lver="B"},
|
{lver="B"},
|
||||||
{os="B"},
|
{os="B"},
|
||||||
|
{arctype="c4"},
|
||||||
{psize="I3"},
|
{psize="I3"},
|
||||||
{lsize="I3"},
|
{lsize="I3"},
|
||||||
{ssize="I3"},
|
{ssize="I3"},
|
||||||
|
0
ksrc/fs/foxfs/find_file.lua
Normal file
0
ksrc/fs/foxfs/find_file.lua
Normal file
@ -6,6 +6,8 @@
|
|||||||
--#include "ksrc/fs/foxfs/init.lua"
|
--#include "ksrc/fs/foxfs/init.lua"
|
||||||
--#include "ksrc/tty.lua"
|
--#include "ksrc/tty.lua"
|
||||||
--#include "ksrc/biosfixes.lua"
|
--#include "ksrc/biosfixes.lua"
|
||||||
|
--#include "ksrc/buffer.lua"
|
||||||
|
--#include "ksrc/kio.lua"
|
||||||
|
|
||||||
-- Mount the rootfs
|
-- Mount the rootfs
|
||||||
vfs.mount()
|
vfs.mount()
|
8
ksrc/kio.lua
Normal file
8
ksrc/kio.lua
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
---@module kio "Kernel I/O"
|
||||||
|
local kio = {}
|
||||||
|
|
||||||
|
---@func create_buffer
|
||||||
|
---@arg blocking boolean "True if read calls to a buffer that doesn't contain enough data block."
|
||||||
|
---@arg pid integer "This is set to the PID of the process which handles the buffers."
|
||||||
|
---@return table "The buffer for use anywhere."
|
||||||
|
kio.create_buffer = create_buffer
|
BIN
tkrnl.velx
BIN
tkrnl.velx
Binary file not shown.
@ -112,6 +112,7 @@ for line in io.stdin:lines() do
|
|||||||
if (cdoc) then
|
if (cdoc) then
|
||||||
if (cfunc) then
|
if (cfunc) then
|
||||||
cdoc.methods[#cdoc.methods+1] = cfunc
|
cdoc.methods[#cdoc.methods+1] = cfunc
|
||||||
|
cfunc = nil
|
||||||
end
|
end
|
||||||
docs[#docs+1] = cdoc
|
docs[#docs+1] = cdoc
|
||||||
end
|
end
|
||||||
@ -126,6 +127,7 @@ for line in io.stdin:lines() do
|
|||||||
if (cdoc) then
|
if (cdoc) then
|
||||||
if (cfunc) then
|
if (cfunc) then
|
||||||
cdoc.methods[#cdoc.methods+1] = cfunc
|
cdoc.methods[#cdoc.methods+1] = cfunc
|
||||||
|
cfunc = nil
|
||||||
end
|
end
|
||||||
docs[#docs+1] = cdoc
|
docs[#docs+1] = cdoc
|
||||||
end
|
end
|
||||||
|
@ -151,6 +151,7 @@ local velx_spec = struct {
|
|||||||
{compression="B"},
|
{compression="B"},
|
||||||
{lver="B"},
|
{lver="B"},
|
||||||
{os="B"},
|
{os="B"},
|
||||||
|
{arctype="c4"},
|
||||||
{psize="I3"},
|
{psize="I3"},
|
||||||
{lsize="I3"},
|
{lsize="I3"},
|
||||||
{ssize="I3"},
|
{ssize="I3"},
|
||||||
@ -167,6 +168,13 @@ local os = {
|
|||||||
[0x7F] = "BIOS",
|
[0x7F] = "BIOS",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
local commands = {
|
||||||
|
["cpio"] = "cpio -t",
|
||||||
|
["tar"] = "tar -t",
|
||||||
|
["tsar"] = "tsar -t",
|
||||||
|
["zip"] = "jar -t"
|
||||||
|
}
|
||||||
|
|
||||||
local f = io.open(arg[1], "rb")
|
local f = io.open(arg[1], "rb")
|
||||||
local header = velx_spec(f:read(#velx_spec))
|
local header = velx_spec(f:read(#velx_spec))
|
||||||
local program = f:read(header.psize)
|
local program = f:read(header.psize)
|
||||||
@ -179,13 +187,15 @@ io.stdout:write(string.format([[File Version: %d
|
|||||||
Compression: %s
|
Compression: %s
|
||||||
Type: %s
|
Type: %s
|
||||||
OS: %s
|
OS: %s
|
||||||
Lua Version: %s]],
|
Lua Version: %s
|
||||||
|
Archive type: %s]],
|
||||||
header.fver,
|
header.fver,
|
||||||
compression[header.compression] or "Unknown",
|
compression[header.compression] or "Unknown",
|
||||||
(((header.os & 0x80) > 0) and "Library") or "Executable",
|
(((header.os & 0x80) > 0) and "Library") or "Executable",
|
||||||
os[header.os & 0x7F] or "Unknown",
|
os[header.os & 0x7F] or "Unknown",
|
||||||
lver),"\n")
|
lver,
|
||||||
local h = io.popen("tsar -t", "w")
|
header.arctype:gsub("\0", "")),"\n")
|
||||||
|
local h = io.popen(commands[header.arctype:gsub("\0", "")], "w")
|
||||||
h:write(archive)
|
h:write(archive)
|
||||||
h:close()
|
h:close()
|
||||||
if (header.compression == 1) then
|
if (header.compression == 1) then
|
||||||
|
Loading…
Reference in New Issue
Block a user