diff --git a/assembler-8608.lua b/assembler-8608.lua index 4810897..a73b239 100644 --- a/assembler-8608.lua +++ b/assembler-8608.lua @@ -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