add bootloader compatible with mtpt

This commit is contained in:
Izaya 2023-08-03 10:21:32 +10:00
parent e4dc09e44f
commit 2a7078d6d3
2 changed files with 69 additions and 1 deletions

View File

@ -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.

68
partition/driveboot.lua Normal file
View 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)()()