forked from Hyperion/HyperionOS
Update src/disks/1h/boot/HBoot.sys
This commit is contained in:
@@ -11,34 +11,35 @@ local w, h = term.getSize()
|
|||||||
local kernel = load(getfile("/boot/Hyprkrnl.sys").readAllText())
|
local kernel = load(getfile("/boot/Hyprkrnl.sys").readAllText())
|
||||||
local recovery = load(getfile("/boot/util/shell").readAllText())
|
local recovery = load(getfile("/boot/util/shell").readAllText())
|
||||||
|
|
||||||
|
-- Predeclare dbg so entries can reference it
|
||||||
local dbg = {}
|
local dbg = {}
|
||||||
local entries = {
|
local entries = {
|
||||||
{"HyperionOS", function() kernel(args) end},
|
{"HyperionOS", function() kernel(args, nil, "/sbin/init") end},
|
||||||
{"HyperionOS (Debug options)", dbg}
|
{"HyperionOS (Debug options)", dbg}
|
||||||
}
|
}
|
||||||
|
|
||||||
dbg = {
|
dbg[1] = {"Back", "BACK"}
|
||||||
{"Back", entries},
|
dbg[2] = {"Boot HyperionOS in debug mode", function() kernel(args, true) end}
|
||||||
{"Boot HyperionOS in debug mode", function() kernel(args, true) end},
|
dbg[3] = {"Boot as shell", function() kernel(args, true, "/bin/bash") end}
|
||||||
{"Boot as shell", function() kernel(args, true, true) end},
|
dbg[4] = {"Boot in recovery", function() recovery(args) end}
|
||||||
{"Boot in recovery", function() recovery(args) end}
|
|
||||||
}
|
|
||||||
|
|
||||||
local function render(tbl, selected)
|
local function render(tbl, selected)
|
||||||
term.clear()
|
term.clear()
|
||||||
term.print("HBoot V1.0.0 //\n")
|
term.print("HBoot V1.0.0 //\n\n")
|
||||||
for i, v in ipairs(tbl) do
|
for i, v in ipairs(tbl) do
|
||||||
if selected == i then
|
if selected == i then
|
||||||
term.print("- " .. v[1] .. "\n")
|
term.print("> " .. v[1] .. "\n")
|
||||||
else
|
else
|
||||||
term.print(" " .. v[1] .. "\n")
|
term.print(" " .. v[1] .. "\n")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Initial render
|
||||||
render(entries, 1)
|
render(entries, 1)
|
||||||
local exit = false
|
|
||||||
|
|
||||||
|
-- Wait for keypress or timeout
|
||||||
|
local exit = false
|
||||||
while not exit do
|
while not exit do
|
||||||
local ret = {computer.getMachineEvent()}
|
local ret = {computer.getMachineEvent()}
|
||||||
if ret[1] == "keyPressed" then
|
if ret[1] == "keyPressed" then
|
||||||
@@ -51,30 +52,45 @@ while not exit do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local cerent = entries
|
-- Menu handling
|
||||||
local cersel = 1
|
|
||||||
|
|
||||||
if not exit then
|
if not exit then
|
||||||
|
local menuStack = {}
|
||||||
|
local currentMenu = entries
|
||||||
|
local selected = 1
|
||||||
|
render(currentMenu, selected)
|
||||||
|
|
||||||
while true do
|
while true do
|
||||||
local ret = {computer.getMachineEvent()}
|
local ret = {computer.getMachineEvent()}
|
||||||
if ret[1] == "keyTyped" then
|
if ret[1] == "keyTyped" then
|
||||||
if ret[3] == "\n" then
|
if ret[3] == "\n" then
|
||||||
if type(cerent[cersel][2]) == "function" then
|
local entry = currentMenu[selected]
|
||||||
cerent[cersel][2]()
|
if entry then
|
||||||
elseif type(cerent[cersel][2]) == "table" then
|
if type(entry[2]) == "function" then
|
||||||
cerent = cerent[cersel][2]
|
entry[2]()
|
||||||
cersel = 1
|
elseif type(entry[2]) == "table" then
|
||||||
end
|
table.insert(menuStack, {currentMenu, selected})
|
||||||
elseif ret[3] == "\x1b[A" then
|
currentMenu = entry[2]
|
||||||
if cersel > 1 then
|
selected = 1
|
||||||
cersel = cersel - 1
|
render(currentMenu, selected)
|
||||||
end
|
elseif entry[2] == "BACK" then
|
||||||
elseif ret[3] == "\x1b[B" then
|
if #menuStack > 0 then
|
||||||
if cersel < #cerent then
|
local prev = table.remove(menuStack)
|
||||||
cersel = cersel + 1
|
currentMenu, selected = prev[1], prev[2]
|
||||||
|
render(currentMenu, selected)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
elseif ret[3] == "\x1b[A" then -- Up arrow
|
||||||
|
if selected > 1 then
|
||||||
|
selected = selected - 1
|
||||||
|
render(currentMenu, selected)
|
||||||
|
end
|
||||||
|
elseif ret[3] == "\x1b[B" then -- Down arrow
|
||||||
|
if selected < #currentMenu then
|
||||||
|
selected = selected + 1
|
||||||
|
render(currentMenu, selected)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
render(cerent, cersel)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
|
|||||||
Reference in New Issue
Block a user