diff --git a/sebios.lua b/sebios.lua index 31badfb..78b298a 100644 --- a/sebios.lua +++ b/sebios.lua @@ -1,54 +1,71 @@ 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 + 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") + return boot_invoke(eeprom, "getData") end computer.setBootAddress = function(address) - return boot_invoke(eeprom, "setData", 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 + 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 + 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 = {} @@ -58,67 +75,72 @@ 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 - wl(S..tostring(k).." "..v.." "..component.type(v).." "..(component.invoke(v,"getLabel") or "")) - end + 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() - 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) + 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()) + 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 + 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) + error("no bootable medium found" .. (reason and (": " .. tostring(reason)) or ""), 0) end computer.beep(1000, 0.2) init()