From 2a778b976fdfe4c59914883f18be2cd5c2ebc0cf Mon Sep 17 00:00:00 2001 From: sam Date: Fri, 6 Mar 2020 07:47:12 -0500 Subject: [PATCH] I forgot what I did again. --- lib/util_vcomponent/init.lua | 209 +++++++++++++++++++++++++++++ mods/loader_fuchas/init.lua | 24 ++-- mods/vdev_biosdev/init.lua | 2 +- src/loader.lua | 23 ---- src/lzss.lua | 41 +----- src/zy-neo/builtins/util_romfs.lua | 52 +++++++ src/zy-neo/zinit.lua | 4 + test.lua | Bin 3350 -> 0 bytes utils/romfs.lua | 0 9 files changed, 279 insertions(+), 76 deletions(-) create mode 100644 lib/util_vcomponent/init.lua create mode 100644 src/zy-neo/builtins/util_romfs.lua delete mode 100644 test.lua create mode 100644 utils/romfs.lua diff --git a/lib/util_vcomponent/init.lua b/lib/util_vcomponent/init.lua new file mode 100644 index 0000000..d47a435 --- /dev/null +++ b/lib/util_vcomponent/init.lua @@ -0,0 +1,209 @@ +local component = component +local computer = computer + +local _component = {} + +local proxylist = {} +local proxyobjs = {} +local typelist = {} +local doclist = {} + +local oproxy = component.proxy +function _component.proxy(address) + checkArg(1,address,"string") + if proxyobjs[address] ~= nil then + return proxyobjs[address] + end + return oproxy(address) +end + +local olist = component.list +function _component.list(filter, exact) + checkArg(1,filter,"string","nil") + local result = {} + local data = {} + for k,v in olist(filter, exact) do + data[#data + 1] = k + data[#data + 1] = v + result[k] = v + end + for k,v in pairs(typelist) do + if filter == nil or (exact and v == filter) or (not exact and v:find(filter, nil, true)) then + data[#data + 1] = k + data[#data + 1] = v + result[k] = v + end + end + local place = 1 + return setmetatable(result, + {__call=function() + local addr,type = data[place], data[place + 1] + place = place + 2 + return addr, type + end} + ) +end + +local otype = component.type +function _component.type(address) + checkArg(1,address,"string") + if typelist[address] ~= nil then + return typelist[address] + end + return otype(address) +end + +local odoc = component.doc +function _component.doc(address, method) + checkArg(1,address,"string") + checkArg(2,method,"string") + if proxylist[address] ~= nil then + if proxylist[address][method] == nil then + error("no such method",2) + end + if doclist[address] ~= nil then + return doclist[address][method] + end + return nil + end + return odoc(address, method) +end + +local oslot = component.slot +function _component.slot(address) + checkArg(1,address,"string") + if proxylist[address] ~= nil then + return -1 -- vcomponents do not exist in a slot + end + return oslot(address) +end + +local omethods = component.methods +function _component.methods(address) + checkArg(1,address,"string") + if proxylist[address] ~= nil then + local methods = {} + for k,v in pairs(proxylist[address]) do + if type(v) == "function" then + methods[k] = true -- All vcomponent methods are direct + end + end + return methods + end + return omethods(address) +end + +local oinvoke = component.invoke +function _component.invoke(address, method, ...) + checkArg(1,address,"string") + checkArg(2,method,"string") + if proxylist[address] ~= nil then + if proxylist[address][method] == nil then + error("no such method",2) + end + return proxylist[address][method](...) + end + return oinvoke(address, method, ...) +end + +local ofields = component.fields +function _component.fields(address) + checkArg(1,address,"string") + if proxylist[address] ~= nil then + return {} -- What even is this? + end + return ofields(address) +end + +local componentCallback = +{ + __call = function(self, ...) return proxylist[self.address][self.name](...) end, + __tostring = function(self) return (doclist[self.address] ~= nil and doclist[self.address][self.name] ~= nil) and doclist[self.address][self.name] or "function" end +} + +local vcomponent = {} + +function vcomponent.register(address, ctype, proxy, doc) + checkArg(1,address,"string") + checkArg(2,ctype,"string") + checkArg(3,proxy,"table") + if proxylist[address] ~= nil then + return nil, "component already at address" + elseif component.type(address) ~= nil then + return nil, "cannot register over real component" + end + proxy.address = address + proxy.type = ctype + local proxyobj = {} + for k,v in pairs(proxy) do + if type(v) == "function" then + proxyobj[k] = setmetatable({name=k,address=address},componentCallback) + else + proxyobj[k] = v + end + end + proxylist[address] = proxy + proxyobjs[address] = proxyobj + typelist[address] = ctype + doclist[address] = doc + computer.pushSignal("component_added",address,ctype) + return true +end + +function vcomponent.unregister(address) + checkArg(1,address,"string") + if proxylist[address] == nil then + if component.type(address) ~= nil then + return nil, "cannot unregister real component" + else + return nil, "no component at address" + end + end + local thetype = typelist[address] + proxylist[address] = nil + proxyobjs[address] = nil + typelist[address] = nil + doclist[address] = nil + computer.pushSignal("component_removed",address,thetype) + return true +end + +function vcomponent.list() + local list = {} + for k,v in pairs(proxylist) do + list[#list + 1] = {k,typelist[k],v} + end + return list +end + +function vcomponent.resolve(address, componentType) + checkArg(1, address, "string") + checkArg(2, componentType, "string", "nil") + for k,v in pairs(typelist) do + if componentType == nil or v == componentType then + if k:sub(1, #address) == address then + return k + end + end + end + return nil, "no such component" +end + +local r = math.random +function vcomponent.uuid() + return string.format("%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x", + r(0,255),r(0,255),r(0,255),r(0,255), + r(0,255),r(0,255), + r(64,79),r(0,255), + r(128,191),r(0,255), + r(0,255),r(0,255),r(0,255),r(0,255),r(0,255),r(0,255)) +end + +function vcomponent.install(env) + env.component = {} + for k, v in pairs(_component) do + env.component[k] = v + end +end + +return vcomponent \ No newline at end of file diff --git a/mods/loader_fuchas/init.lua b/mods/loader_fuchas/init.lua index 1f814a9..92a676d 100644 --- a/mods/loader_fuchas/init.lua +++ b/mods/loader_fuchas/init.lua @@ -6,6 +6,18 @@ local thd = krequire("thd") local oefi = zy.loadmod("util_oefiv2") local fuchas = {} +function fuchas:karg(key, value) + self.args[key] = value +end + +function fuchas:boot() + thd.add("fuchas", function() + self.env.loadfile("Fuchas/Kernel/boot.lua")() --This is how we do. + computer.pushSignal("fuchas_dead") + end) + while true do if computer.pullSignal() == "fuchas_dead" then break end end +end + return function(addr, args) --oefi.getExtensions().ZyNeo_ExecOEFIApp(addr, ".efi/fuchas.efi2", ...) --We don't do that here. @@ -17,15 +29,3 @@ return function(addr, args) fuch.env.loadfile = fuch.env.oefi.loadfile return setmetatable(fuch, {__index=fuchas}) end - -function fuchas:karg(key, value) - self.args[key] = value -end - -function fuchas:boot() - thd.add("fuchas", function() - self.env.loadfile("Fuchas/Kernel/boot.lua")() --This is how we do. - computer.pushSignal("fuchas_dead") - end) - while true do if computer.pullSignal() == "fuchas_dead" then break end end -end \ No newline at end of file diff --git a/mods/vdev_biosdev/init.lua b/mods/vdev_biosdev/init.lua index 0d6ce87..94a43f5 100644 --- a/mods/vdev_biosdev/init.lua +++ b/mods/vdev_biosdev/init.lua @@ -1,5 +1,5 @@ local zy = krequire("zorya") -local vdev = zy.loadmod("util_vcomponent") +local vdev = krequire("util_vcomponent") vdev.register("ZORYA_BIOS", "zybios", { { get_threads_info = function() diff --git a/src/loader.lua b/src/loader.lua index e22c18b..e578f7f 100644 --- a/src/loader.lua +++ b/src/loader.lua @@ -1,25 +1,2 @@ --#include "src/lzss.lua" -local c = component -local gpu = c.proxy(c.list("gpu")()) -local screen = c.list("screen")() -gpu.bind(screen) -local w, h = gpu.getResolution() -gpu.setResolution(w, h) -gpu.setBackground(0) -gpu.setForeground(0xFFFFFF) -gpu.fill(1, 1, w, h, " ") -cls = function()gpu.fill(1,1,w,h," ")end -local y = 1 -function status(msg) - if gpu and screen then - gpu.set(1, y, msg) - if y == h then - gpu.copy(1, 2, w, h-1, 0, -1) - gpu.fill(1, h, w, 1, " ") - else - y = y + 1 - end - end -end -status("Decompressing image...") return load(lzss_decompress($[[luacomp src/zy-neo/zinit.lua -mluamin 2>/dev/null | sed "s/\]\]/]\ ]/g" | lua5.3 utils/makezbios.lua ]]), "=bios.lua")(lzss_decompress) \ No newline at end of file diff --git a/src/lzss.lua b/src/lzss.lua index 8916278..9006799 100644 --- a/src/lzss.lua +++ b/src/lzss.lua @@ -1,40 +1 @@ -local s, t = string, table -local ss = s.sub - --------------------------------------------------------------------------------- -local POS_BITS = 12 -local LEN_BITS = 16 - POS_BITS -local POS_SIZE = 1 << POS_BITS -local LEN_SIZE = 1 << LEN_BITS -local LEN_MIN = 3 - -local function lzss_decompress(input) - local offset, output = 1, {} - local window = '' - - while offset <= #input do - local flags = s.byte(input, offset) - offset = offset + 1 - - for i = 1, 8 do - local str = nil - if (flags & 1) ~= 0 and offset <= #input then - str = ss(input, offset, offset) - offset = offset + 1 - elseif offset + 1 <= #input then - local tmp = s.unpack('>I2', input, offset) - offset = offset + 2 - local pos = (tmp >> LEN_BITS) + 1 - local len = (tmp & (LEN_SIZE - 1)) + LEN_MIN - str = ss(window, pos, pos + len - 1) - end - flags = flags >> 1 - if str then - output[#output + 1] = str - window = ss(window .. str, -POS_SIZE) - end - end - end - - return t.concat(output) -end \ No newline at end of file +local function lzss_decompress(a)local b,c,d,e,f,g,h,i=1,'',''while b<=#a do e=c.byte(a,b)b=b+1;for j=0,7 do h=c.sub;i=h(a,b,b)if e>>j&1<1 and b<#a then g=c.unpack('>I2',a,b)f=1+g>>4;i=h(d,f,f+g&15+2)b=b+1 end;b=b+1;c=c..i;d=h(d..i,-4^6)end end;return c end \ No newline at end of file diff --git a/src/zy-neo/builtins/util_romfs.lua b/src/zy-neo/builtins/util_romfs.lua new file mode 100644 index 0000000..cb223b4 --- /dev/null +++ b/src/zy-neo/builtins/util_romfs.lua @@ -0,0 +1,52 @@ +local romfs = {} +local arc = {} + +local function readint(r, n) + return string.unpack("qPcO-e+R6DVH?n!B;KAQwkwxcOhD3T9eJ z!3cbkIW&p3aU(Lfz!;L`DA{N#ilw=^sMQGiP!?+;BgxRD0Se(ir%$aSj=%~t7Z{g> zN#-O2Y0jU#&8=PP4qKQh3pq%#_;BQuPF$v0y};(&$>C*jrsPAtK+b2M2_osmk+n&| zCnfwy&6&!{OS)F1<*3LZGU4MnA0?wHd@Mcbo%IQDFU#nUm^o4F|_WKu@7hEcV8%#;q}Ogvk$8j;PeZ%fRmnxV5{2$h#y*8ns`6Ac~P( z4>GDt%g9lwwHlz+l=u`EX_P~L(&z^D=)x$9snn0LkcqKtN+ihyB^%f#d<7B}eO z@d&Q;^x|fmG!l7zq_LNAMcj~d>XQtEN-b*kOG`Erf)ZufW+uo{_t}-#qB1YB^gUWI z&@u>9aw0^8qCq;No%u&*ns$iE9Ca1BDO{Je=2)prijw?f)|zu)>gu9EUc2hAQQ@-8 zglSZJG+O$eIXlZFZZyN7=sjT8b$5au2|XOedYM4}0n6UbZTWADE|W+ak9O+BL?;kk z7I$_tT)8mcNuwfOX~8mbNKP(%QKjzEsBA0micy2T3*^3m9Ujf|uR2dWn=f=(K0~uqRp+d9m~@ zi{d5-(pZc@ihdwsR)=;d1|ZHqJHXd#UbDG@EMAY&Ix$v!I1h~p*?RO2X|%672Vy0K zO9+eEjP>et5!+YT8y~CGaokZV#=(3)ol8M&qXJYb)GDsuxSO>F*WzoRqOO<0Q?@EV#A=>ZBKo(g|;|u^h?Daufe#aw+ zR!sP%MK$bCj3}X}JvF|xDpz&Gu@a?<@KiUnfvQ_O(rR{yS*zjuq2yiU z*_>l6PxUKX1oUTxi+77gBp7sZ(48(eaeIR zT_#B2(Wi9cJg9(j=O>=W^+!C*+`4TjR_pFwc9z}NTJG+aEk8HNi${2l=Hw+6cjFa{ zJxk(00|AP?EiFG@XB%VrAS$Z*vG@WytviPHwJR(m$tY>$eLNkGl15h+M(q5QH0pM5 zQ41>d!p?fQ7RasyX^h7>nh)IEatfKy?QYPh8i=lo(ruvszR@<;NcibSZ#3xH`Kd~6 zj~^)R|3=Eo^77pSM>B*E`aJ`(cF0bOa$kVq`a1az8nxr|`@ajq>3>mWuWKZ{H;^MD z+GLQMK$B7&gr7dJr?o4gpESZtmEIuF%ld*eW(1n>g3L4rxb7fU3L+RHd?AGrQJLqW z;p<-d`O)GRMgn+XQ=SFGEjF$YvNh(|d#KG4@NP$&@eM66{!XQC#e>gv?fko3!vR`Lyp^q)j}09>@ydnGy9T{zYk(q+`(9m_RIqo& zM2F6Ha2(%68htD;(TBD#s-Al3FMbs9@dBi_4R6QVL3?)A1I_WLL657=4c=?loZ1R{ z+BBz}Jm_if^;Vd+<`2D}nH7AnwFvRS^F)sA5ok0HEZGk5wNofU7`b=*8tQ3Roa7$A zGCX*4_+&wC?(krwWb35Mw6*?{(`9nnpfVyQCx<~qXVr<0BB#@8E^=w?V~r`2fJ1<@x=o)0&&9eTlFZ#=+nU%`e=Yt9qF~ zxaXA-@1j$4?v_|IPSIzgNvKI(MeV`doLPGN4Bhk&lH3UT+<( zqGZZIU#4t;vK}y4@B@W5Eb&=U>&VLn>gqa!+>$f+>sKiou0V+kG+Z~F3a>k)B8}Lh zYO3%?&U-B%mKG6o_kc=TcKs&FMZez!MRBw8#<11#_v`lOj{?fJ%T28hy|K4XuN`W; z_GA%OF_9q2f_2U<&EV^{Y(SxRey|>xVsG8?#WQm1^9fyFtcIs*JXVn3dFG0gzv&89fNU}^dvNjU_A@W9N54a-6Vt!#51gGEpSpT} zNFKebyPKJ>V>m{hOiU)G`RP#EBtKPu=3H%o$NBx1hBv=ZJ-9W^kDVBMv)w#)dfSn) zMAq2p=?i1$@99Y6m~z*1ZN6$!`Rc?p|E+)W#C_$Ob^ob*8^GUg_yR$Ky&3&v0t8+t z0F)U&JNS%Z-}mW*kHgR3`z7vCDjFMG%B!jzsws=FX@dv;ude@QFJ1if6V!&{vUu!{ z%CooFGju<6sm#`9IGrp~zDnA=@MZ?J@S=7__vZ`eq3@HN5yKH9@G`ta Nuu;m0{rDpZ`xjbrr1}5= diff --git a/utils/romfs.lua b/utils/romfs.lua new file mode 100644 index 0000000..e69de29