Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --[[
- Improved Bootloader BIOS for OpenComputers Lua
- (C) The Puzzlemaker 2019
- --]]
- local init
- do
- local cinvoke = component.invoke
- local function binvoke(address, method, ...)
- local result = table.pack(pcall(cinvoke, address, method, ...))
- if not result[1] then
- return nil, result[2]
- else
- return table.unpack(result, 2, result.n)
- end
- end
- local eeprom = component.list("eeprom")()
- computer.getBootAddress = function()
- return binvoke(eeprom, "getData")
- end
- computer.setBootAddress = function(address)
- return binvoke(eeprom, "setData", address)
- end
- do
- local screen = component.list("screen")()
- gpu = component.list("gpu")()
- if gpu and screen then
- binvoke(gpu, "bind", screen)
- else
- error("GPU required", 0)
- end
- end
- local function tablelength(T)
- local count = 0
- for _ in pairs(T) do count = count + 1 end
- return count
- end
- local function tryLoadFrom(address)
- local handle, reason = binvoke(address, "open", "/init.lua")
- if not handle then
- return nil, reason
- end
- local buffer = ""
- repeat
- local data, reason = binvoke(address, "read", handle, math.huge)
- if not data and reason then
- return nil, reason
- end
- buffer = buffer .. (data or "")
- until not data
- binvoke(address, "close", handle)
- return load(buffer, "=init")
- end
- local reason
- local validAddresses = {}
- if computer.getBootAddress() ~= "" then
- table.insert(validAddresses, computer.getBootAddress())
- end
- for address in component.list("filesystem") do
- if address ~= computer.getBootAddress() then
- table.insert(validAddresses, address)
- end
- end
- local function tryGetLabel(address)
- if binvoke(address, "getLabel") ~= nil and binvoke(address, "getLabel") ~= "" then
- return binvoke(address, "getLabel")
- else
- return "NO LABEL"
- end
- end
- local function printAddrs()
- for k,address in ipairs(validAddresses) do
- binvoke(component.list("gpu")(), "set", 1, k, k .. ": [" .. tryGetLabel(address) .. "] " .. address)
- end
- end
- printAddrs()
- while true do
- local evt, addr, char, code, pN = computer.pullSignal()
- if evt == "key_up" then
- local num = tonumber(unicode.char(char))
- if num ~= nil then
- if num >= 1 and num <= tablelength(validAddresses) then
- binvoke(component.list("gpu")(), "set", 1, num, num.. ": [TRYING] [" .. tryGetLabel(validAddresses[num]) .. "] " .. validAddresses[num])
- init, reason = tryLoadFrom(validAddresses[num])
- if init then
- binvoke(component.list("gpu")(), "set", 1, num, num.. ": [BOOTING] [" .. tryGetLabel(validAddresses[num]) .. "] " .. validAddresses[num])
- computer.setBootAddress(validAddresses[num])
- break
- else
- computer.beep(500, 0.2)
- binvoke(component.list("gpu")(), "set", 1, num, num.. ": [INVALID] [" .. tryGetLabel(validAddresses[num]) .. "] " .. validAddresses[num])
- end
- end
- end
- end
- end
- end
- computer.beep(1000, 0.2)
- init()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement