Log In  


copy and paste this code (with "puny font"-mode - ctrl+p)

cls()

storage_readfn={peek,peek2,nil,peek4,[0]=bitread}
storage_writefn={poke,poke2,nil,poke4,[0]=bitwrite}

storage_adr=0x8000

storage_metabytefield={
 __index=function(t,key)
  return t.read(t.adr+t.byte*key)
 end,
 __newindex=function(t,key,value)
  t.write(t.adr+t.byte*key,value)
 end,
 __len=function(t)
  return t.len
 end
}

storage_metadata={

 __index=function (t,key)
  local m=rawget(t,"_storage")
  if tonum(key) then
   local adr,byte,size=unpack(m._num)
   if (key>0 and key<=size) return storage_readfn[byte](adr+byte*key)
  elseif m[key] then
   local adr,byte=unpack(m[key])
   return storage_readfn[byte](adr)   
  end
 end,

 __newindex=function (t,key,value)
  local m=rawget(t,"_storage")
  if m._num and tonum(key) then
   local adr,byte,size=unpack(m._num)
   if (key>0 and key<=size) storage_writefn[byte](adr+byte*key,value)
  elseif m[key] then
   local adr,byte=unpack(m[key])
   storage_writefn[byte](adr,value) 
  else 
   rawset(t,key,value)
  end
 end,

 __len=function(t)
  local m=rawget(t,"_storage")
  return m._num and m._num[3] or 0
 end,

 __pairs=function(t)
  local stage,v=1
  return function(t,k)
   --numbers
   if stage==1 then
    k+=1
    if t._storage._num and k<=#t then
     v=t[k]
    else
     stage,k=2
    end
   end   
   --storage
   if stage==2 then
    repeat    
     k,v=next(t._storage,k)
    until k!="_num"
   if (k) v=t[k] else stage=3
   end
   --normal table
   if stage==3 then
    repeat
     k,v=next(t,k)
    until k!="_storage"
   end
   return k,v
  end,t,0
 end

}

function storage_reserve(list,table)
 local oldtable={}
 table=table or {}

 table._storage=table._storage or {}
 setmetatable(table,storage_metadata)

 local byte=1
 for txt in all(split(list,"\n")) do
  if (sub(txt,#txt)=="]") txt=sub(txt,1,#txt-1)
  local c=ord(txt)
  if txt=="" or c==45 then
   --commend
  elseif c==91 then
   --[
   local size=tonum(sub(txt,2))
   table._storage._num={storage_adr-byte,byte,size}
   storage_adr+=byte*size
  elseif c==42 then 
   --*
   byte=tonum(sub(txt,2)) 
  elseif c==62 then
   -->
   txt=sub(txt,2)
   add(oldtable,table)
   local ntable=setmetatable({_storage={}},storage_metadata)
   rawset(table,tonum(txt) or txt,ntable)
   table=ntable
  elseif c==60 then
   --<
   table=deli(oldtable)   
  else
   table._storage[txt]={storage_adr,byte}
   storage_adr+=byte
  end   
 end
 return table
end

storage_reserve( [[
>x
*1
hallo
>welt
[3]
<
-- txt
*2
score
xyz
>player
x
y
<
<
*1
>data
>1
[3]
<
>2
[3]
<
>3
[3]
<
<
]],_ENV)

x.hallo=10
x.score=512
x.xyz=0x7fff
x.neu="abc"
x.welt[1]=15
x.welt[2]=27
x.welt[3]=33
x.welt[4]=99
x.player.x=1003
x.player.y=1004
for k,v in pairs(x) do
 ?"entry:"..k.." = "..tostr(v)
 if type(v)=="table" then
  for k2,v2 in pairs(v) do
   ?"entry:"..k.."."..k2.." = "..tostr(v2)
  end
 end
end
for v in all(x) do
 ?v
end

for x=1,3 do
  for y=1,3 do
  data[x][y]=y*10+x
  end
end
?data[1]
stop()

run the code
it should output some code, now type:

?data[1]

pico-8 will close without error message.




[Please log in to post a comment]