OC-KittenOS/repository/data/app-metamachine/lucaboot.lua

142 lines
3.6 KiB
Lua

-- This is released into the public domain.
-- No warranty is provided, implied or otherwise.
-- lucaboot.lua : Fake EEPROM for VM.
-- Authors: 20kdc
-- LUCcABOOT v0
-- awful name I know
local eprox = component.proxy(component.list("eeprom", true)())
computer.getBootAddress = eprox.getData
computer.setBootAddress = eprox.setData
eprox = nil
local logo = {
" ⣀▄⣀ ",
" ⣀▄⠶▀⠉ ⠉█⠶▄⣀ ",
" ⣀▄⠶▀⠉ ◢◤ ⠉▀⠶▄⣀ ",
" ⣀▄⠶▀⠉ ◢◤ ⠉▀⠶▄⣀ ",
" ◢⠿⣭⣀ meta ◯ machine ⣀⣭⠿◣ ",
" █ ⠉▀⠶▄⣀ ◢◤ ⣀▄⠶▀⠉ █ ",
" █ ⠉▀⠶▄⣀ ◢◤ ⣀▄⠶▀⠉ ⣀▄⠶ █ ",
" █⣀ ⠉▀⠿▄▄▄⠶▀⠉ ⠉ ⣀█ ",
" ⠉▀⠶▄⣀ █ ⣀▄⠶▀⠉ ",
" ⠉▀⠶▄⣀ █ ⣀▄⠶▀⠉ ",
" ⠉▀⠶▄⣀ █ ⣀▄⠶▀⠉ ",
" ⠉▀▀▀⠉ ", -- 12
" metamachine virtual computing ",
" Press F3 to enter boot manager. ",
" "
}
local gpuA = component.list("gpu", true)()
local screenA = component.list("screen", true)()
local bootManager = false
if gpuA and screenA then
local gpuP = component.proxy(gpuA)
gpuP.bind(screenA)
gpuP.setResolution(33, 15)
local targetUptime = computer.uptime()
for j = 0, 10 do
targetUptime = targetUptime + 0.1
local ej = j
if j > 5 then
-- 5 * 50 = 250
ej = 5 - (j - 5)
ej = ej * 50
elseif j == 5 then
targetUptime = targetUptime + 4
ej = 255
else
ej = ej * 50
end
gpuP.setForeground(ej + (ej * 0x100) + (ej * 0x10000))
gpuP.setBackground(0)
for i = 1, #logo do
gpuP.set(1, i, logo[i])
end
while true do
local tl = targetUptime - computer.uptime()
if tl <= 0.01 then break end
local v = {computer.pullSignal(tl)}
if v[1] == "key_down" then
if v[4] == 61 then
-- boot manager
bootManager = true
logo[14] = " - Entering boot manager now. - "
break
end
end
end
end
gpuP.setForeground(0xFFFFFF)
gpuP.setBackground(0)
local selY = 1
while bootManager do
gpuP.fill(1, 1, 33, 15, " ")
local y = 1
local mapping = {}
for a in component.list("filesystem", true) do
local pfx = " "
if selY == y then
pfx = ">"
end
if computer.getBootAddress() == a then
pfx = pfx .. "*"
else
pfx = pfx .. " "
end
mapping[y] = a
gpuP.set(1, y, pfx .. a .. ":" .. (component.invoke(a, "getLabel") or ""))
y = y + 1
end
while true do
local v = {computer.pullSignal()}
if v[1] == "key_down" then
if v[4] == 200 then
selY = math.max(1, selY - 1)
break
elseif v[4] == 208 then
selY = math.min(selY + 1, y - 1)
break
elseif v[3] == 13 then
computer.setBootAddress(mapping[selY] or "")
bootManager = nil
break
end
end
end
end
end
local lr = "(no inits)"
local function boot(fsa)
local dat = component.proxy(fsa)
local fh = dat.open("/init.lua", "rb")
if fh then
local ttl = ""
while true do
local chk = dat.read(fh, 2048)
if not chk then break end
ttl = ttl .. chk
end
local fn, r = load(ttl, "=init.lua", "t")
if not fn then
lr = r
dat.close(fh)
else
dat.close(fh)
computer.setBootAddress(fsa)
fn()
error("Returned from init")
end
end
end
if component.type(computer.getBootAddress()) then
boot(computer.getBootAddress())
end
for a in component.list("filesystem", true) do
boot(a)
end
error("No available operating systems. " .. lr)