61 lines
1.3 KiB
Lua
61 lines
1.3 KiB
Lua
|
local fs = component.proxy(computer.tmpAddress())
|
||
|
local init = function() end
|
||
|
do
|
||
|
local tape = component.proxy(component.list("tape_drive")())
|
||
|
local rev,namesize,filesize,name,mode = false, 0, 0, "", 0
|
||
|
|
||
|
local function readint(amt)
|
||
|
local tmp = 0
|
||
|
for i=(rev and amt) or 1, (rev and 1) or amt, (rev and -1) or 1 do
|
||
|
tmp = tmp | (tape.read(1):byte() << ((i-1)*8))
|
||
|
end
|
||
|
return tmp
|
||
|
end
|
||
|
local function fwrite()
|
||
|
local dir = name:match("(.+)/.*%.?.+")
|
||
|
if (dir) then
|
||
|
fs.makeDirectory("/"..dir)
|
||
|
end
|
||
|
local fh = fs.open(name, "w")
|
||
|
fs.write(fh,tape.read(filesize))
|
||
|
fs.close(fh)
|
||
|
end
|
||
|
|
||
|
tape.seek(-math.huge)
|
||
|
|
||
|
while true do
|
||
|
local magic = readint(2)
|
||
|
if magic == 51057 then rev = true end
|
||
|
tape.seek(4)
|
||
|
mode = readint(2)
|
||
|
tape.seek(12)
|
||
|
namesize = readint(2)
|
||
|
filesize = (readint(2) << 16) | readint(2)
|
||
|
name = tape.read(namesize):sub(1, namesize-1)
|
||
|
if name == "TRAILER!!!" then break end
|
||
|
if (namesize % 2 ~= 0) then
|
||
|
tape.seek(1)
|
||
|
end
|
||
|
if (mode & 32768 ~= 0) then
|
||
|
fwrite()
|
||
|
end
|
||
|
if (filesize % 2 ~= 0) then
|
||
|
tape.seek(1)
|
||
|
end
|
||
|
computer.beep()
|
||
|
end
|
||
|
end
|
||
|
do
|
||
|
local f=fs.open("/init.lua","rb")
|
||
|
if not f then error("no init.lua") end
|
||
|
local initstr = ""
|
||
|
local data = ""
|
||
|
repeat
|
||
|
initstr = initstr .. data
|
||
|
data = fs.read(f,2048)
|
||
|
until data == nil
|
||
|
init = load(initstr)
|
||
|
end
|
||
|
computer.getBootAddress = computer.tmpAddress
|
||
|
init()
|