add scoped defines
This commit is contained in:
parent
83d668fa5c
commit
0a9aa7a7d7
@ -113,10 +113,11 @@ local function assembleInstruction(line, state, instrs, validWords)
|
||||
end
|
||||
end
|
||||
local directiveFunctions = {
|
||||
fn = function(state, fn) state.fileName = fn end,
|
||||
ln = function(state, ln) state.lineNum = tonumber(ln) end,
|
||||
org = function(state, addr) state.curAddr = decodeNumber(addr) end,
|
||||
align = function(state, alns) local aln = decodeNumber(alns); if state.curAddr % aln ~= 0 then state.curAddr = state.curAddr + (aln - state.curAddr%aln) end end,
|
||||
fn = function(state, fn) state.fileName = fn end,
|
||||
ln = function(state, ln) state.lineNum = tonumber(ln) end,
|
||||
org = function(state, addr) state.curAddr = decodeNumber(addr) end,
|
||||
align = function(state, alns) local aln = decodeNumber(alns); if state.curAddr % aln ~= 0 then state.curAddr = state.curAddr + (aln - state.curAddr%aln) end end,
|
||||
define = true,
|
||||
}
|
||||
local function assembleCode(code, instrs)
|
||||
local validWords = validWordsFromInstrs(instrs)
|
||||
@ -178,7 +179,31 @@ local function evaluateExpression(expr)
|
||||
return eval
|
||||
end
|
||||
local function preprocessCode(code)
|
||||
code = "\n"..code.."\n"
|
||||
local curscope = ""
|
||||
local codet = {}
|
||||
local wordt = {}
|
||||
local lastword = ""
|
||||
local function addword(word)
|
||||
lastword = word
|
||||
if word:sub(1, 1)=="." and not directiveFunctions[word:sub(2, #word)] then word = curscope..word end
|
||||
table.insert(codet, word)
|
||||
end
|
||||
for i = 1, #code do
|
||||
local c = code:sub(i, i)
|
||||
if c:find("[%.a-zA-Z0-9_]") then table.insert(wordt, c)
|
||||
else
|
||||
if #wordt>0 then
|
||||
addword(table.concat(wordt))
|
||||
wordt = {}
|
||||
end
|
||||
if c==":" and lastword:sub(1, 1)~="." and not lastword:find("_BRACE_") then
|
||||
curscope = lastword
|
||||
end
|
||||
table.insert(codet, c)
|
||||
end
|
||||
end
|
||||
|
||||
code = "\n"..table.concat(codet).."\n"
|
||||
|
||||
local funcmacros = {}
|
||||
code = code:gsub(".define ([%.a-zA-Z0-9_]+)%(([^%)]+)%) ([^\n]+)", function(name, args, repl)
|
||||
@ -249,16 +274,6 @@ local function fixCode(code)
|
||||
code = code:gsub("%*", " %* ")
|
||||
code = code:gsub("\n[ \t\r\n]*", "\n")
|
||||
code = code:gsub(" +", " ")
|
||||
local curScope = ""
|
||||
code = code:gsub("(%.?)([a-zA-Z_][a-zA-Z0-9_%.]*)(:?)", function(dot, name, colon)
|
||||
if directiveFunctions[name] then return dot..name..colon end
|
||||
if dot=="." then
|
||||
assert(curScope~="", "scoped label before any unscoped label: "..name)
|
||||
name = curScope.."."..name
|
||||
end
|
||||
if colon==":" and not name:find("^_BRACE_") then curScope = name:match("^[^%.]+") end
|
||||
return name..colon
|
||||
end)
|
||||
|
||||
return code
|
||||
end
|
||||
@ -447,7 +462,7 @@ local function printMemory(mem)
|
||||
local numreps = 0
|
||||
local function closereps(base)
|
||||
if numreps~=0 then
|
||||
print("(repeated "..numreps.." more times, up to "..string.format("%04X", base+16)..")")
|
||||
print("(repeated "..numreps.." more times, up to "..string.format("%04X", base+15)..")")
|
||||
numreps = 0
|
||||
end
|
||||
end
|
||||
@ -469,7 +484,7 @@ local function printMemory(mem)
|
||||
if nonempty then
|
||||
local l = table.concat(line)
|
||||
if l~=lastline or base~=lastbase+16 then
|
||||
closereps(base)
|
||||
closereps(base-16)
|
||||
if base ~= lastbase+16 then print("...") end
|
||||
print(string.format("%04X", base).." |"..l)
|
||||
else
|
||||
|
Loading…
x
Reference in New Issue
Block a user