local component_invoke = component.invoke function boot_invoke(address, method, ...) local result = table.pack(pcall(component_invoke, address, method, ...)) if not result[1] then return nil, result[2] else return table.unpack(result, 2, result.n) end end -- backwards compatibility, may remove later local eeprom = component.list("eeprom")() computer.getBootAddress = function() return boot_invoke(eeprom, "getData") end computer.setBootAddress = function(address) return boot_invoke(eeprom, "setData", address) end do local screen = component.list("screen")() local gpu = component.list("gpu")() if gpu and screen then boot_invoke(gpu, "bind", screen) end end local function tryLoadFrom(address) if component.type(address) == "filesystem" then local handle, reason = boot_invoke(address, "open", "/init.lua") if not handle then return nil, reason end local buffer = "" repeat local data, reason = boot_invoke(address, "read", handle, math.huge) if not data and reason then return nil, reason end buffer = buffer .. (data or "") until not data boot_invoke(address, "close", handle) return load(buffer, "=init") elseif component.type(address) == "tape_drive" then boot_invoke(address,"seek",-math.huge) local boottype = boot_invoke(address,"read",1) if boottype == "!" then local rl = tonumber(boot_invoke(address,"read",8)) local buffer = boot_invoke(address,"read",rl) return load(buffer, "=init") end elseif component.type(address) == "modem" then boot_invoke(address,"open",9671) boot_invoke(address,"broadcast",9671,computer.address()) s="" local bt = computer.uptime() while bt+10 > computer.uptime() do computer.beep() local ev={computer.pullSignal(0.5)} if ev[1] == "modem_message" and ev[4] == 9671 then bt=computer.uptime() if ev[6] == "." then break end s=s..ev[6] end end if s ~= "" then return load(s,"=init") end end end local bootdevs = {} for address in component.list("filesystem") do bootdevs[#bootdevs+1] = address end for address in component.list("tape_drive") do bootdevs[#bootdevs+1] = address end for address in component.list("modem") do bootdevs[#bootdevs+1] = address end do local gA,sA = component.list("gpu")(),component.list("screen")() if gA and sA then local gP,cy = component.proxy(gA),1 gP.bind(sA) local sx, sy = gP.getResolution() local function wl(s) gP.set(1,cy,s) cy=cy+1 end local cba = computer.getBootAddress() local S = " " local function rdraw() gP.fill(1,1,sx,sy," ") cy=1 wl("SKS Enhanced BIOS v1") wl("Memory: "..tostring(computer.totalMemory()/1024).."K") wl(" ") for k,v in ipairs(bootdevs) do if v == cba then S = " * " else S = " " end local e,l = pcall(component.invoke,v,"getLabel") if not e then l = "" end wl(S..tostring(k).." "..v.." "..component.type(v).." "..(l or "")) end end rdraw() local timer = 5 local bhc = false while computer.uptime() < timer do t,_,c,C = computer.pullSignal(0.5) if t == "key_down" and c > 48 and c < 58 then cba = bootdevs[c-48] bhc = true rdraw() elseif t == "key_down" and c == 32 then timer = timer + 10 elseif t == "key_down" and c == 13 and C == 28 then timer = 0 end end if bhc then computer.setBootAddress(cba) end end end local init, reason if computer.getBootAddress() then init, reason = tryLoadFrom(computer.getBootAddress()) end if not init then computer.setBootAddress() for k,address in ipairs(bootdevs) do init, reason = tryLoadFrom(address) if init then computer.setBootAddress(address) break end end end if not init then error("no bootable medium found" .. (reason and (": " .. tostring(reason)) or ""), 0) end computer.beep(1000, 0.2) init()