add bootloader compatible with mtpt
This commit is contained in:
parent
e4dc09e44f
commit
2a7078d6d3
@ -1,4 +1,4 @@
|
|||||||
# Simple partition table format
|
# Minitel Partition Table (MTPT)
|
||||||
|
|
||||||
This document specifies a general partition table format suitable for both unmanaged disks, and tapes.
|
This document specifies a general partition table format suitable for both unmanaged disks, and tapes.
|
||||||
|
|
||||||
|
68
partition/driveboot.lua
Normal file
68
partition/driveboot.lua
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
function computer.getBootAddress()
|
||||||
|
return component.invoke(component.list("eeprom")(),"getData")
|
||||||
|
end
|
||||||
|
function computer.setBootAddress(a)
|
||||||
|
return component.invoke(component.list("eeprom")(),"setData",a)
|
||||||
|
end
|
||||||
|
return (function()
|
||||||
|
local rv
|
||||||
|
local function getProxy(addr)
|
||||||
|
if type(addr) == "string" then
|
||||||
|
return component.proxy(addr)
|
||||||
|
end
|
||||||
|
return addr
|
||||||
|
end
|
||||||
|
|
||||||
|
local eformat = "c20c4>I4>I4"
|
||||||
|
function parsePartitions(s)
|
||||||
|
local rt = {}
|
||||||
|
for i = 1, s:len(), 32 do
|
||||||
|
local n, t, start, length = string.unpack(eformat, s, i)
|
||||||
|
n = n:gsub("\0", "")
|
||||||
|
if n ~= "" then
|
||||||
|
rt[#rt+1] = {n,t,start,length}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return rt
|
||||||
|
end
|
||||||
|
|
||||||
|
function getPartitions(drive)
|
||||||
|
return parsePartitions(drive.readSector(drive.getCapacity() / drive.getSectorSize()))
|
||||||
|
end
|
||||||
|
|
||||||
|
local function offsetSector(part,sector)
|
||||||
|
if sector < 1 or sector > part[4] then error("invalid offset, not in a usable sector") end
|
||||||
|
return (part[3] - 1) + sector
|
||||||
|
end
|
||||||
|
local function readSector(drive,part,sector)
|
||||||
|
return drive.readSector(offsetSector(part,sector)):gsub("\0+$","")
|
||||||
|
end
|
||||||
|
local function readPart(drive,part)
|
||||||
|
local rv = ""
|
||||||
|
for i = 1, part[4] do
|
||||||
|
rv=rv .. readSector(drive,part,i)
|
||||||
|
end
|
||||||
|
return rv
|
||||||
|
end
|
||||||
|
|
||||||
|
local candidates={computer.getBootAddress()}
|
||||||
|
for a,_ in component.list("drive") do
|
||||||
|
candidates[#candidates+1] = a
|
||||||
|
end
|
||||||
|
for i,a in ipairs(candidates) do
|
||||||
|
computer.beep(("."):rep(i))
|
||||||
|
local d = getProxy(a)
|
||||||
|
if type(d) == "table" then
|
||||||
|
for k,v in ipairs(getPartitions(d)) do
|
||||||
|
if v[2] == "boot" then
|
||||||
|
local rv = load(readPart(d,v))
|
||||||
|
if rv then
|
||||||
|
computer.beep("-")
|
||||||
|
computer.setBootAddress(a)
|
||||||
|
return rv
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end)()()
|
Loading…
Reference in New Issue
Block a user