add *s-x syntax to stack-relative addressing

This commit is contained in:
Redo 2022-10-31 14:58:25 -06:00
parent fdf4c91944
commit c906937f05

View File

@ -1,6 +1,10 @@
local arch8608 = require("rom-8608-defs")
local aliases = {
-- todo
}
local function trim(s) return s:gsub("^ +", ""):gsub(" +$", "").."" end
local function validWordsFromInstrs(instrs)
local words = {}
@ -18,7 +22,7 @@ local function decodeNumber(n)
elseif n:sub(1, 2)=="0x" then return sign*(tonumber(n:sub(3, #n ), 16) or error("invalid number "..n)), math.ceil((#n-2)/2)
elseif n:sub(#n, #n)=="h" then return sign*(tonumber(n:sub(1, #n-1), 16) or error("invalid number "..n)), math.ceil((#n-1)/2)
else
local v = tonumber(n) or error("invalid number "..n)
local v = sign*(tonumber(n) or error("invalid number "..n))
if v>=-128 and v<=255 then return v, 1
elseif v>=-32768 and v<=65535 then return v, 2
else error("out-of-range number "..v) end
@ -28,6 +32,7 @@ local function mnemFromLine(line, instrs, validWords)
local firstWord = line:match("^[^ ]+")
local imms = {}
local function addNum(n)
n = trim(n)
local val, len = decodeNumber(n)
table.insert(imms, { val = val, len = len } )
return " imm"..(len*8).." "
@ -42,7 +47,8 @@ local function mnemFromLine(line, instrs, validWords)
end
local mnem = " "..line:gsub(" ", " ").." "
mnem = mnem:gsub("([%*%+%-])", " %1 ")
mnem = mnem:gsub("%- *", " %+%-")
mnem = mnem:gsub("([%*%+])", " %1 ")
mnem = mnem:gsub(" %-?%$[0-9a-fA-F]+ " , function(n) return addNum (n) end)
mnem = mnem:gsub(" %-?0x[0-9a-fA-F]+ " , function(n) return addNum (n) end)
mnem = mnem:gsub(" %-?[0-9a-fA-F]+h " , function(n) if not validWords[trim(n)] then return addNum (n) end end)
@ -309,7 +315,6 @@ local function fixFilename(fn)
return fn
end
local function includeFile(fn)
fn = fn:gsub("\\", "/")
local code = readFile(fn)
code = prefixCode(code, fn)
local fnf = fixFilename(fn)
@ -487,4 +492,4 @@ ts.eval [[
function AssembleFile(%fn, %romsize, %offset, %len) { luacall("AssembleFile", %fn, %romsize, %offset, %len); }
]]
if arg then AssembleFile(arg[1] or "../8608programs/redos.asm", "16 16 8", "0", "256") end
if arg then AssembleFile(arg[1] or "../8608programs/test.asm", "16 16 8", "0", "256") end