blob: a8de2204e2de41b3d9c59dbf1ed7b0c2ac4d8f49 [file] [log] [blame] [raw]
local version = "OpenLoader 0.2EE"
local eeprom = [[
_G._OSVERSION = "]] .. version .. [["
local component = component or require('component')
local computer = computer or require('computer')
local unicode = unicode or require('unicode')
local eeprom = component.list("eeprom")()
computer.getBootAddress = function()
return component.invoke(eeprom, "getData")
end
computer.setBootAddress = function(address)
return component.invoke(eeprom, "setData", address)
end
local gpu = component.list("gpu")()
local w, h
local screen = component.list('screen')()
for address in component.list('screen') do
if #component.invoke(address, 'getKeyboards') > 0 then
screen = address
end
end
local cls = function()end
if gpu and screen then
component.invoke(gpu, "bind", screen)
w, h = component.invoke(gpu, "getResolution")
component.invoke(gpu, "setResolution", w, h)
component.invoke(gpu, "setBackground", 0x000000)
component.invoke(gpu, "setForeground", 0xFFFFFF)
component.invoke(gpu, "fill", 1, 1, w, h, " ")
cls = function()component.invoke(gpu,"fill", 1, 1, w, h, " ")end
end
local y = 1
local function status(msg)
if gpu and screen then
component.invoke(gpu, "set", 1, y, msg)
if y == h then
component.invoke(gpu, "copy", 1, 2, w, h - 1, 0, -1)
component.invoke(gpu, "fill", 1, h, w, 1, " ")
else
y = y + 1
end
end
end
local function loadfile(fs, file)
--status("> " .. file)
local handle, reason = component.invoke(fs,"open",file)
if not handle then
error(reason)
end
local buffer = ""
repeat
local data, reason = component.invoke(fs,"read",handle,math.huge)
if not data and reason then
error(reason)
end
buffer = buffer .. (data or "")
until not data
component.invoke(fs,"close",handle)
return load(buffer, "=" .. file)
end
local function dofile(fs, file)
local program, reason = loadfile(fs, file)
if program then
local result = table.pack(pcall(program))
if result[1] then
return table.unpack(result, 2, result.n)
else
error(result[2])
end
else
error(reason)
end
end
local function boot(kernel)
status("BOOTING")
_G.computer.getBootAddress = function()return kernel.address end
cls()
dofile(kernel.address, kernel.fpx .. kernel.file)
end
status(_OSVERSION)
status("Select what to boot:")
local osList = {}
for fs in component.list("filesystem") do
if component.invoke(fs, "isDirectory", "boot/kernel/")then
for _,file in ipairs(component.invoke(fs, "list", "boot/kernel/")) do
osList[#osList+1] = {fpx = "boot/kernel/", file = file, address = fs}
status(tostring(#osList).."."..file.." from "..(fs:sub(1,3)))
end
end
if component.invoke(fs, "exists", "init.lua") then
local osName = "init.lua"
if component.invoke(fs, "exists", ".osprop") then
pcall(function()
local prop = dofile(fs, ".osprop")
osName = (prop and prop.name) or "init.lua"
end)
end
osList[#osList+1] = {fpx = "", file = "init.lua", address = fs}
status(tostring(#osList).."."..osName.." from "..(fs:sub(1,3)))
end
end
status("Select os: ")
if #osList == 1 then
boot(osList[1])
end
if #osList == 0 then
error("No OS found")
while true do computer.pullSignal() end
end
while true do
local sig = {computer.pullSignal()}
if sig[1] == "key_down" then
if sig[4] >= 2 and sig[4] <= 11 then
if osList[sig[4]-1] then
boot(osList[sig[4]-1])
else
status("Not found!")
end
end
end
end
error("System crashed")
while true do computer.pullSignal() end
]]
local component = require "component"
local computer = require "computer"
local shell = require "shell"
local term = require "term"
local args, options = shell.parse(...)
if options.h or options.help then
print("opl-flash [-hqr] [--label=EEPROMLabel]")
print(" --label= Set specified label for the EEPROM")
print(" -q --quiet Do not output anything, and don't ask if sure")
print(" -r --reboot Reboot after installing")
print(" -h --help Display this help")
return
end
local say = not (options.q or options.quiet) and print or function()end
say ("Do you really want to flash openloader to EEPROM("..tostring(#eeprom).." bytes)[Y/n]")
if options.q or options.quiet or io.read():lower() == "y" then
say("Flashing... Do not reboot now!")
component.eeprom.set(eeprom)
component.eeprom.setLabel((type(options.label) == "string" and options.label) or version)
if options.r or options.reboot then
computer.shutdown(true)
else
say("Done. you can reboot now")
end
end