diff --git a/faxm.lua b/faxm.lua index a9c6f34..3b286f1 100644 --- a/faxm.lua +++ b/faxm.lua @@ -1,7 +1,10 @@ local date = require"date" local opcode = require"faxmopcode" local FX = { + --require"faxm/fraCinize", require"faxm/string", + require"faxm/ximplifier", + require"faxm/fraxevice", require"faxm/freeform" } @@ -65,18 +68,17 @@ function parseCode(source, code, data) local objects = {} for line in source:gmatch("([^;]+)") do for k, v in pairs(FX) do if v.any_line then line = v.any_line(line) end end - if line == "[mainfile]" then - elseif line:sub(1, 1) == '[' then + if line:sub(1, 1) == '[' then for k, v in pairs(date.decode(raw(line:sub(2, #line - 1):gsub("+", ":")))) do if type(k) == "number" then if v:sub(1, 1) == 'x' then xtype = v:sub(2, #v) elseif v == "CODE" then section = code; elseif v == "DATA" then section = data; - elseif k == "nominsize" then + elseif k == "noalign" then if section == code then cminsize = -1 else dminsize = -1 end end - elseif k == "minsize" then + elseif k == "align" then if section == code then cminsize = v else dminsize = v end end end @@ -179,10 +181,8 @@ end local file = io.open(source) if file then - if file:read():gsub("%s", "") == "[mainfile]" then - file:seek("set", 0) - parseCode(file:read"*a", code, data) - end + file:seek("set", 0) + parseCode(file:read"*a", code, data) file:close() end local loader_segment = { diff --git a/faxm/fraCinize.lua b/faxm/fraCinize.lua new file mode 100644 index 0000000..341051e --- /dev/null +++ b/faxm/fraCinize.lua @@ -0,0 +1,5 @@ +return { + source = function(source) + return source + end +} \ No newline at end of file diff --git a/faxm/fraxevice.lua b/faxm/fraxevice.lua new file mode 100644 index 0000000..a293d85 --- /dev/null +++ b/faxm/fraxevice.lua @@ -0,0 +1,14 @@ +return { + source = function(source) + source = source:gsub("(%s*)console%.print%s+(%S+%s+%S+);", "%1console.write %2;%1console.out;") + source = source:gsub("(%a+)%.write", "write ____%1") + source = source:gsub("(%a+)%.out", "out ____%1") + source = source:gsub("(%a+)%.wait", "wait ____%1") + source = source:gsub("(%a+)%.read", "read ____%1") + source = source:gsub("____clock", "|0") + source = source:gsub("____timer", "|0") + source = source:gsub("____console", "|1") + source = source:gsub("____rom", "|2") + return source + end +} \ No newline at end of file diff --git a/faxm/freeform.lua b/faxm/freeform.lua index cb6d860..284353f 100644 --- a/faxm/freeform.lua +++ b/faxm/freeform.lua @@ -1,9 +1,9 @@ return { source = function(source) - return source:gsub("\n", ""):gsub("]", "];"):gsub(":", ":;") + return source:gsub("\n", "") end, any_line = function(line) - return line:trim():gsub("%s+", " ") + return line:trim():gsub("%s+", " "):gsub("%s+=%s+", "=") end, line = function(line) return line:gsub(",", " "):gsub("%s+", " "):split" " diff --git a/faxm/string.lua b/faxm/string.lua index 32f90e6..12777d9 100644 --- a/faxm/string.lua +++ b/faxm/string.lua @@ -1,5 +1,6 @@ return { source = function(source) + local tl = {} while source:match[[|"[^"]+"]] do local s = source:match[[|"[^"]+"]] local ss = s @@ -16,11 +17,20 @@ return { r[#r + 1] = "|x" .. table.concat(rt, "") end end + if #(r[#r]:gsub("000", "")) == #(r[#r]) then + r[#r + 1] = "|x0000000000000000" + end local function regexEscape(str) return str:gsub("[%(%)%.%%%+%-%*%?%[%^%$%]]", "%%%1") end - source = source:gsub(regexEscape(ss), table.concat(r, ", ")) + local tt = table.concat(r, ", ") + tl[tt] = #r + source = source:gsub(regexEscape(ss), tt) end + source = source:gsub("(string%s+(%w+)%s?:(%s+)([|xa-f0-9, ]+)[^;])", function(found) + found = "object" .. found:sub(7) + return found .. " ? length=|" .. tostring(tl[found:gsub("object%s+%w+%s?:(%s+)", "")] * 8) + end) return source end } \ No newline at end of file diff --git a/faxm/ximplifier.lua b/faxm/ximplifier.lua new file mode 100644 index 0000000..03b6ea3 --- /dev/null +++ b/faxm/ximplifier.lua @@ -0,0 +1,9 @@ +return { + source = function(source) + source = source:gsub("%(([^)]+)%)", " %1") + source = source:gsub("([|%^#][%w.]+%s+)([a-z]+)", "%1;%2"):gsub(":", ":;") + source = source:gsub("object", ";object"):gsub("section", ";section"):gsub("%[", ";["):gsub("%]", "];") + source = source:gsub("(\n%s+);", ";%1"):gsub(";(%s+);", ";%1"):gsub("^;", "") + return source .. ";" + end +} \ No newline at end of file diff --git a/main.faxm b/main.faxm index 620a1e9..80574b8 100644 --- a/main.faxm +++ b/main.faxm @@ -1,15 +1,8 @@ -[mainfile] -[x64u+DATA+minsize-8] -object helloworld: - |"hello world", |0 ? - length=|12; -object hellohell: - |"hell-oh!", |0 ? - length=|9; -[x64+CODE+nominsize] +[x64u+DATA+align-8] +string helloworld: |"hello world"; +string hellohell: |"hell-oh!"; +[x64+CODE+noalign] section start: - write |1 ^helloworld, #helloworld.length; - out |1; - write |1 ^hellohell, #hellohell.length; - out |1; - poff; \ No newline at end of file + console.print(^helloworld, #helloworld.length) + console.print(^hellohell, #hellohell.length) + poff \ No newline at end of file diff --git a/opcodelist b/opcodelist index 2fea4f0..e3fd778 100644 --- a/opcodelist +++ b/opcodelist @@ -1,16 +1,34 @@ nop goto -ive -iveselei -selei +iv +ivse +se saveip -setspp setsp savesp -setdpp setdp savedp -poweroff +poff +pushu64 +push64 +pushd +pushu32 +push32 +pushf +pushu16 +push16 +pushu8 +push8 +popu64 +pop64 +popd +popu32 +pop32 +popf +popu16 +pop16 +popu8 +pop8 ilsumu64 ilsubu64 ilmulu64 diff --git a/out.fx b/out.fx index 74eff32..83a5fe5 100644 --- a/out.fx +++ b/out.fx @@ -1 +1 @@ -8, 1, 6, 1, 1, 16, 8, 1004, 8031924123371070824, 6581362, 0, 2407296241712784744, 0, 0, 0, 0, 399, 3, 1, 0, 30, 400, 1, 1, 399, 3, 1, 3, 31, 400, 1, 1, 10, 0, 0, 0, 0, 0, 12, 9 \ No newline at end of file +8, 1, 6, 1, 1, 16, 8, 1004, 8031924123371070824, 6581362, 2407296241712784744, 0, 0, 0, 0, 0, 399, 3, 1, 0, 30, 400, 1, 1, 399, 3, 1, 2, 31, 400, 1, 1, 10, 0, 0, 0, 0, 0, 16, 16 \ No newline at end of file