2020-03-30 08:43:38 +11:00
|
|
|
-- KOSNEO installer base
|
|
|
|
-- This is released into the public domain.
|
|
|
|
-- No warranty is provided, implied or otherwise.
|
|
|
|
|
|
|
|
-- DECOMPRESSION ENGINE PRECEDES THIS CODE --
|
|
|
|
-- NOTE: upper-case is reserved for this file,
|
|
|
|
-- lower-case is reserved for the decompression engine
|
|
|
|
|
|
|
|
-- A: temporary
|
|
|
|
|
|
|
|
-- B: computer
|
|
|
|
-- C: component
|
|
|
|
|
|
|
|
-- D: additional temporary
|
|
|
|
-- E: read-in state machine
|
|
|
|
|
|
|
|
-- F: current file: filename
|
|
|
|
-- H: remaining bytes to copy/skip
|
|
|
|
-- I: current file: handle (nil if not writing)
|
|
|
|
|
|
|
|
-- J: sectors handled
|
|
|
|
-- K: sector count (injected during build)
|
|
|
|
-- L: compression engine data function (set by CE)
|
|
|
|
-- M: sector handler function (called by CE)
|
|
|
|
|
|
|
|
-- O: current character for read-in state machine
|
|
|
|
-- P: file handle for selfread
|
|
|
|
|
|
|
|
-- Q: octal decoding function
|
|
|
|
|
|
|
|
-- X: screen address
|
|
|
|
-- Y: component: gpu
|
|
|
|
-- Z: component: filesystem
|
|
|
|
B = computer
|
|
|
|
C = component
|
2020-03-31 03:47:27 +11:00
|
|
|
assert(C, "KittenOS NEO installer: Copy as init.lua to the target disk, then remove other disks & reboot.")
|
2020-03-30 08:43:38 +11:00
|
|
|
|
|
|
|
X = C.list("screen", true)()
|
|
|
|
Y = C.list("gpu", true)()
|
|
|
|
|
|
|
|
Z = C.proxy(B.getBootAddress())
|
|
|
|
|
|
|
|
Z.remove("init.neoi.lua")
|
|
|
|
Z.rename("init.lua","init.neoi.lua")
|
|
|
|
P = Z.open("init.neoi.lua","rb")
|
|
|
|
|
|
|
|
F = "Starting..."
|
|
|
|
H = 0
|
|
|
|
|
|
|
|
if X and Y then
|
|
|
|
Y = C.proxy(Y)
|
|
|
|
Y.bind(X)
|
|
|
|
Y.setResolution(50, 5)
|
|
|
|
Y.setBackground(2^24-1)
|
|
|
|
Y.setForeground(0)
|
|
|
|
Y.fill(1, 1, 50, 5, "█")
|
|
|
|
Y.fill(1, 2, 50, 1, " ")
|
|
|
|
Y.set(2, 2, "KittenOS NEO Installer")
|
|
|
|
end
|
|
|
|
|
|
|
|
function Q(A)
|
|
|
|
if A == "" then return 0 end
|
|
|
|
return Q(A:sub(1, -2)) * 8 + (A:byte(#A) - 48)
|
|
|
|
end
|
|
|
|
|
|
|
|
J = 0
|
|
|
|
|
|
|
|
function M(n)
|
|
|
|
if H > 0 then
|
|
|
|
A = math.min(512, H)
|
|
|
|
H = H - A
|
|
|
|
if I then
|
|
|
|
Z.write(I, n:sub(1, A))
|
|
|
|
if H <= 0 then
|
|
|
|
Z.close(I)
|
|
|
|
I = nil
|
|
|
|
end
|
|
|
|
end
|
|
|
|
else
|
|
|
|
F = n:sub(1, 100):gsub("\x00", "")
|
|
|
|
-- this sets up the reading/skipping of data
|
|
|
|
H = Q(n:sub(125, 135))
|
|
|
|
if F:sub(1, 2) == "./" and F ~= "./" then
|
|
|
|
F = F:sub(3)
|
|
|
|
if F:sub(#F) == "/" then
|
|
|
|
Z.makeDirectory(F)
|
|
|
|
else
|
|
|
|
I = Z.open(F, "wb")
|
|
|
|
if H == 0 then
|
|
|
|
Z.close(I)
|
|
|
|
I = nil
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
-- UPDATE DISPLAY --
|
|
|
|
J = J + 1
|
|
|
|
if X and Y then
|
|
|
|
Y.fill(1, 2, 50, 1, " ")
|
|
|
|
Y.set(2, 2, "KittenOS NEO Installer : " .. F)
|
|
|
|
Y.fill(2, 4, 48, 1, "█")
|
|
|
|
Y.fill(2, 4, math.ceil(48 * J / K), 1, " ")
|
|
|
|
end
|
|
|
|
if J % 8 == 0 then
|
|
|
|
B.pullSignal(0.01)
|
|
|
|
end
|
|
|
|
if J == K then
|
|
|
|
Z.close(P)
|
|
|
|
Z.remove("init.neoi.lua")
|
|
|
|
B.shutdown(true)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
while true do
|
|
|
|
A = Z.read(P, 64)
|
|
|
|
D = ""
|
|
|
|
for i = 1, #A do
|
|
|
|
-- Read-in state machine
|
|
|
|
O = A:sub(i, i)
|
|
|
|
if not E then
|
|
|
|
if O == "\x00" then
|
|
|
|
E = 0
|
|
|
|
end
|
|
|
|
elseif E == 0 then
|
|
|
|
if O == "\xFE" then
|
|
|
|
E = 1
|
|
|
|
else
|
|
|
|
D = D .. O
|
|
|
|
end
|
|
|
|
else
|
|
|
|
D = D .. O
|
|
|
|
E = 0
|
|
|
|
end
|
|
|
|
end
|
|
|
|
L(D)
|
|
|
|
end
|
|
|
|
|
|
|
|
-- COMPRESSED DATA FOLLOWS THIS CODE --
|
|
|
|
|