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
|
||||||
end
|
end
|
||||||
local directiveFunctions = {
|
local directiveFunctions = {
|
||||||
fn = function(state, fn) state.fileName = fn end,
|
fn = function(state, fn) state.fileName = fn end,
|
||||||
ln = function(state, ln) state.lineNum = tonumber(ln) end,
|
ln = function(state, ln) state.lineNum = tonumber(ln) end,
|
||||||
org = function(state, addr) state.curAddr = decodeNumber(addr) 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,
|
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 function assembleCode(code, instrs)
|
||||||
local validWords = validWordsFromInstrs(instrs)
|
local validWords = validWordsFromInstrs(instrs)
|
||||||
@ -178,7 +179,31 @@ local function evaluateExpression(expr)
|
|||||||
return eval
|
return eval
|
||||||
end
|
end
|
||||||
local function preprocessCode(code)
|
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 = {}
|
local funcmacros = {}
|
||||||
code = code:gsub(".define ([%.a-zA-Z0-9_]+)%(([^%)]+)%) ([^\n]+)", function(name, args, repl)
|
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("%*", " %* ")
|
||||||
code = code:gsub("\n[ \t\r\n]*", "\n")
|
code = code:gsub("\n[ \t\r\n]*", "\n")
|
||||||
code = code:gsub(" +", " ")
|
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
|
return code
|
||||||
end
|
end
|
||||||
@ -447,7 +462,7 @@ local function printMemory(mem)
|
|||||||
local numreps = 0
|
local numreps = 0
|
||||||
local function closereps(base)
|
local function closereps(base)
|
||||||
if numreps~=0 then
|
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
|
numreps = 0
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -469,7 +484,7 @@ local function printMemory(mem)
|
|||||||
if nonempty then
|
if nonempty then
|
||||||
local l = table.concat(line)
|
local l = table.concat(line)
|
||||||
if l~=lastline or base~=lastbase+16 then
|
if l~=lastline or base~=lastbase+16 then
|
||||||
closereps(base)
|
closereps(base-16)
|
||||||
if base ~= lastbase+16 then print("...") end
|
if base ~= lastbase+16 then print("...") end
|
||||||
print(string.format("%04X", base).." |"..l)
|
print(string.format("%04X", base).." |"..l)
|
||||||
else
|
else
|
||||||
|
Loading…
x
Reference in New Issue
Block a user