Advertisement
Guest User

bios.lua

a guest
Jun 29th, 2019
203
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.04 KB | None | 0 0
  1. --[[
  2. Improved Bootloader BIOS for OpenComputers Lua
  3. (C) The Puzzlemaker 2019
  4. --]]
  5. local init
  6. do
  7.   local cinvoke = component.invoke
  8.   local function binvoke(address, method, ...)
  9.     local result = table.pack(pcall(cinvoke, address, method, ...))
  10.     if not result[1] then
  11.       return nil, result[2]
  12.     else
  13.       return table.unpack(result, 2, result.n)
  14.     end
  15.   end
  16.  
  17.   local eeprom = component.list("eeprom")()
  18.   computer.getBootAddress = function()
  19.     return binvoke(eeprom, "getData")
  20.   end
  21.   computer.setBootAddress = function(address)
  22.     return binvoke(eeprom, "setData", address)
  23.   end
  24.  
  25.   do
  26.     local screen = component.list("screen")()
  27.     gpu = component.list("gpu")()
  28.     if gpu and screen then
  29.       binvoke(gpu, "bind", screen)
  30.     else
  31.       error("GPU required", 0)
  32.     end
  33.   end
  34.  
  35.   local function tablelength(T)
  36.     local count = 0
  37.     for _ in pairs(T) do count = count + 1 end
  38.     return count
  39.   end
  40.  
  41.   local function tryLoadFrom(address)
  42.     local handle, reason = binvoke(address, "open", "/init.lua")
  43.     if not handle then
  44.       return nil, reason
  45.     end
  46.     local buffer = ""
  47.     repeat
  48.       local data, reason = binvoke(address, "read", handle, math.huge)
  49.       if not data and reason then
  50.         return nil, reason
  51.       end
  52.       buffer = buffer .. (data or "")
  53.     until not data
  54.     binvoke(address, "close", handle)
  55.     return load(buffer, "=init")
  56.   end
  57.   local reason
  58.   local validAddresses = {}
  59.   if computer.getBootAddress() ~= "" then
  60.     table.insert(validAddresses, computer.getBootAddress())
  61.   end
  62.   for address in component.list("filesystem") do
  63.     if address ~= computer.getBootAddress() then
  64.       table.insert(validAddresses, address)
  65.     end
  66.   end
  67.  
  68.   local function tryGetLabel(address)
  69.     if binvoke(address, "getLabel") ~= nil and binvoke(address, "getLabel") ~= "" then
  70.       return binvoke(address, "getLabel")
  71.     else
  72.       return "NO LABEL"
  73.     end
  74.   end
  75.  
  76.   local function printAddrs()
  77.     for k,address in ipairs(validAddresses) do
  78.       binvoke(component.list("gpu")(), "set", 1, k, k .. ": [" .. tryGetLabel(address) .. "] " .. address)
  79.     end
  80.   end
  81.   printAddrs()
  82.   while true do
  83.     local evt, addr, char, code, pN = computer.pullSignal()
  84.     if evt == "key_up" then
  85.       local num = tonumber(unicode.char(char))
  86.       if num ~= nil then
  87.         if num >= 1 and num <= tablelength(validAddresses) then
  88.           binvoke(component.list("gpu")(), "set", 1, num, num.. ": [TRYING] [" .. tryGetLabel(validAddresses[num]) .. "] " .. validAddresses[num])
  89.           init, reason = tryLoadFrom(validAddresses[num])
  90.           if init then
  91.             binvoke(component.list("gpu")(), "set", 1, num, num.. ": [BOOTING] [" .. tryGetLabel(validAddresses[num]) .. "] " .. validAddresses[num])
  92.             computer.setBootAddress(validAddresses[num])
  93.             break
  94.           else
  95.             computer.beep(500, 0.2)
  96.             binvoke(component.list("gpu")(), "set", 1, num, num.. ": [INVALID] [" .. tryGetLabel(validAddresses[num]) .. "] " .. validAddresses[num])
  97.           end
  98.         end
  99.       end
  100.     end
  101.   end
  102. end
  103. computer.beep(1000, 0.2)
  104. init()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement