From 870bb344540f2c4662985672e33cc32aafc1df73 Mon Sep 17 00:00:00 2001 From: Redo Date: Wed, 26 Oct 2022 22:01:00 -0600 Subject: [PATCH] add braces --- assembler-8608.lua | 24 +++++++++++++++++------- rom-8608-defs.lua | 8 ++++---- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/assembler-8608.lua b/assembler-8608.lua index 78ecad9..912566d 100644 --- a/assembler-8608.lua +++ b/assembler-8608.lua @@ -41,11 +41,11 @@ local function mnemFromLine(line, instrs, validWords) end local mnem = " "..line:gsub(" ", " ").." " - 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) - mnem = mnem:gsub(" %-?[0-9]+ " , function(n) if not validWords[trim(n)] then return addNum (n) end end) - mnem = mnem:gsub(" [a-zA-Z0-9_]+ " , function(n) if not validWords[trim(n)] then return addLabel(n) end end) + 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) + mnem = mnem:gsub(" %-?[0-9]+ " , function(n) if not validWords[trim(n)] then return addNum (n) end end) + mnem = mnem:gsub(" [a-zA-Z_][a-zA-Z0-9_%.]* ", function(n) if not validWords[trim(n)] then return addLabel(n) end end) mnem = trim(mnem):gsub(" +", " ") return mnem, imms @@ -101,7 +101,7 @@ 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, + align = function(state, alns) local aln = decodeNumber(alns); if state.curAddr % aln ~= 0 then state.curAddr = state.curAddr + (aln - state.curAddr%aln) end end, } local function assembleCode(code, instrs) local validWords = validWordsFromInstrs(instrs) @@ -185,11 +185,19 @@ end local function fixCode(code) code = code:gsub(",", " ") code = code:gsub(":([^\\/])", ":\n%1") + code = code:gsub("[ \t]+:", ":") code = code:gsub("%]", " %] ") code = code:gsub("%[", " %[ ") 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(name, colon) + if name:sub(1, 1)=="." and not directiveFunctions[name:sub(2, #name)] then name = curScope..name end + if colon==":" then curScope = name:match("^[^%.]+") end + return name..colon + end) + return code end local stringEscapes = { ["\\"] = "\\", ["n"] = "\n", ["r"] = "\r", ["t"] = "\t", ["0"] = "\0", ["\""] = "\"", ["\'"] = "\'", } @@ -249,6 +257,7 @@ local function prefixCode(code, fn) -- fix strings, add line numbers out(stringEscapes[c] or error("invalid escape "..c)); state = "string"; end end + assert(#bracestack==0, "unclosed brace") local code2 = table.concat(outt) return code2 end @@ -281,6 +290,7 @@ local function instrsFromArch(arch) local mnem = instr.mnem mnem = mnem:gsub("%*([^ ])", "%* %1") instrs[mnem] = instr.opcode + if mnem:find("%*") then instrs[mnem:gsub("%*", "%[").." ]"] = instr.opcode end end end return instrs @@ -329,7 +339,7 @@ local function disassembleMemory(mem, arch) end local lb = table.concat(lineb, " ") if lastaddr~=addr-tlen then print("...") end - print(string.format("%04X", addr-tlen).." | "..(" "):rep(9-#lb)..lb.." | "..table.concat(line, " ")) + print(string.format("%04X", addr-tlen).." | "..(" "):rep(8-#lb)..lb.." | "..table.concat(line, " ")) lastaddr = addr end end diff --git a/rom-8608-defs.lua b/rom-8608-defs.lua index f597b5c..27f51e7 100644 --- a/rom-8608-defs.lua +++ b/rom-8608-defs.lua @@ -186,10 +186,10 @@ instructions = { { mnem="jpr imm8" , opcode=0x31, ncycles=2, {"loadImmed","memSaveT","instrSub1"}, {"jmpRelT"}, desc="I+=imm8" }, { mnem="jnz imm8" , opcode=0x30, ncycles=2, {"loadImmed","memSaveT","instrSub23Cond","instrNext0NZ" }, {}, {"instrNext"}, {"jmpRelT"}, desc="I+=imm8 if !Zero" }, { mnem="jpz imm8" , opcode=0x32, ncycles=2, {"loadImmed","memSaveT","instrSub23Cond","instrNext0Z" }, {}, {"instrNext"}, {"jmpRelT"}, desc="I+=imm8 if Zero" }, - { mnem="jge imm8" , opcode=0x33, ncycles=2, {"loadImmed","memSaveT","instrSub23Cond","instrNext0NC" }, {}, {"instrNext"}, {"jmpRelT"}, desc="I+=imm8 if Carry" }, - { mnem="jlt imm8" , opcode=0x34, ncycles=2, {"loadImmed","memSaveT","instrSub23Cond","instrNext0C" }, {}, {"instrNext"}, {"jmpRelT"}, desc="I+=imm8 if !Carry" }, - { mnem="jgt imm8" , opcode=0x35, ncycles=2, {"loadImmed","memSaveT","instrSub23Cond","instrNext0C","instrNext0Z"}, {}, {"jmpRelT"}, {"instrNext"}, desc="I+=imm8 if !Zero&!Carry" }, - { mnem="jle imm8" , opcode=0x36, ncycles=2, {"loadImmed","memSaveT","instrSub23Cond","instrNext0C","instrNext0Z"}, {}, {"instrNext"}, {"jmpRelT"}, desc="I+=imm8 if Zero|Carry" }, + { mnem="jlt imm8" , opcode=0x33, ncycles=2, {"loadImmed","memSaveT","instrSub23Cond","instrNext0NC" }, {}, {"instrNext"}, {"jmpRelT"}, desc="I+=imm8 if Carry" }, + { mnem="jge imm8" , opcode=0x34, ncycles=2, {"loadImmed","memSaveT","instrSub23Cond","instrNext0C" }, {}, {"instrNext"}, {"jmpRelT"}, desc="I+=imm8 if !Carry" }, + { mnem="jle imm8" , opcode=0x35, ncycles=2, {"loadImmed","memSaveT","instrSub23Cond","instrNext0C","instrNext0Z"}, {}, {"jmpRelT"}, {"instrNext"}, desc="I+=imm8 if !Zero&!Carry" }, + { mnem="jgt imm8" , opcode=0x36, ncycles=2, {"loadImmed","memSaveT","instrSub23Cond","instrNext0C","instrNext0Z"}, {}, {"instrNext"}, {"jmpRelT"}, desc="I+=imm8 if Zero|Carry" }, { category = "Stack", catlet="S" }, { mnem="pha" , opcode=0x40, {"pushReg","alurA","instrSub1"}, {"instrNext"}, desc="*(S++)=A" },