add scoped defines

This commit is contained in:
Redo 2022-11-01 11:25:09 -06:00
parent 83d668fa5c
commit 0a9aa7a7d7

View File

@ -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