From f92cbde89b0bacc5d8efeb091d7003fed815319c Mon Sep 17 00:00:00 2001 From: XeonSquared Date: Mon, 22 Jul 2019 09:45:40 +1000 Subject: [PATCH] added a new simpler tape loader and an archiving program for it --- tapeloader/mkarchive.lua | 24 ++++++++++++++++ tapeloader/tapeloader.lua | 58 +++++++++++++++++++++++++++++++++++++++ tapeloader/unarchive.lua | 29 ++++++++++++++++++++ 3 files changed, 111 insertions(+) create mode 100644 tapeloader/mkarchive.lua create mode 100644 tapeloader/tapeloader.lua create mode 100644 tapeloader/unarchive.lua diff --git a/tapeloader/mkarchive.lua b/tapeloader/mkarchive.lua new file mode 100644 index 0000000..cf5c301 --- /dev/null +++ b/tapeloader/mkarchive.lua @@ -0,0 +1,24 @@ +local tArgs = {...} + +local function cint(n,l) + local t={} + for i = 0, 7 do + t[i+1] = (n >> (i * 8)) & 0xFF + end + return string.reverse(string.char(table.unpack(t)):sub(1,l)) +end + +local function genHeader(fname,len) + return string.format("%s%s%s",cint(fname:len(),2),fname,cint(len,2)) +end + +for k,v in ipairs(tArgs) do + local f = io.open(v,"rb") + if f then + local content = f:read("*a") + f:close() + io.write(genHeader(v,content:len())) + io.write(content) + end +end +io.write(string.char(0):rep(2)) diff --git a/tapeloader/tapeloader.lua b/tapeloader/tapeloader.lua new file mode 100644 index 0000000..07a32fd --- /dev/null +++ b/tapeloader/tapeloader.lua @@ -0,0 +1,58 @@ +local fs = component.proxy(computer.tmpAddress()) +local init = function() end +if fs.exists("/init.lua") then +do +local tape = component.proxy(component.list("tape_drive")()) + +local function toint(s) + s=s or "" + local n = 0 + local i = 1 + while true do + local p = s:sub(i,i) + if p == "" then break end + local b = string.byte(p) + n = n << 8 + n = n | b + i=i+1 + end + return n +end + +local function fwrite(name,len) + local dir = name:match("(.+)/.*%.?.+") + if (dir) then + fs.makeDirectory("/"..dir) + end + local fh = fs.open(name, "w") + fs.write(fh,tape.read(len)) + fs.close(fh) +end + +tape.seek(-math.huge) + +while true do + local nlen = toint(tape.read(2)) + if nlen == 0 then + break + end + local name = tape.read(nlen) + local fsize = toint(tape.read(2)) + fwrite(name,fsize) + computer.beep() +end +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() diff --git a/tapeloader/unarchive.lua b/tapeloader/unarchive.lua new file mode 100644 index 0000000..47a4d64 --- /dev/null +++ b/tapeloader/unarchive.lua @@ -0,0 +1,29 @@ +local tArgs = {...} + +local function toint(s) + s=s or "" + local n = 0 + local i = 1 + while true do + local p = s:sub(i,i) + if p == "" then break end + local b = string.byte(p) + n = n << 8 + n = n | b + i=i+1 + end + return n +end + +local fi = io.open(tArgs[1]) +while true do + local nlen = toint(fi:read(2)) + if nlen == 0 then + break + end + local name = fi:read(nlen) + local fsize = toint(fi:read(2)) + local fcontent = fi:read(fsize) + print(name,fsize) +end +fi:close()