2018-05-30 23:07:52 +10:00
|
|
|
-- This is released into the public domain.
|
|
|
|
-- No warranty is provided, implied or otherwise.
|
|
|
|
|
|
|
|
-- lucaboot.lua : Fake EEPROM for VM.
|
|
|
|
-- Authors: 20kdc
|
|
|
|
|
2018-05-30 08:50:11 +10:00
|
|
|
-- LUCcABOOT v0
|
2018-05-30 23:07:52 +10:00
|
|
|
-- 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
|
2018-05-30 08:50:11 +10:00
|
|
|
local lr = "(no inits)"
|
2018-05-30 23:07:52 +10:00
|
|
|
local function boot(fsa)
|
|
|
|
local dat = component.proxy(fsa)
|
2018-05-30 08:50:11 +10:00
|
|
|
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)
|
2018-05-30 23:07:52 +10:00
|
|
|
computer.setBootAddress(fsa)
|
|
|
|
fn()
|
|
|
|
error("Returned from init")
|
2018-05-30 08:50:11 +10:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2018-05-30 23:07:52 +10:00
|
|
|
if component.type(computer.getBootAddress()) then
|
|
|
|
boot(computer.getBootAddress())
|
|
|
|
end
|
|
|
|
for a in component.list("filesystem", true) do
|
|
|
|
boot(a)
|
|
|
|
end
|
2018-05-30 08:50:11 +10:00
|
|
|
error("No available operating systems. " .. lr)
|
|
|
|
|