diff --git a/assembler-8608.lua b/assembler-8608.lua index 6c602f9..20bdbab 100644 --- a/assembler-8608.lua +++ b/assembler-8608.lua @@ -2,7 +2,9 @@ local arch8608 = require("rom-8608-defs") local aliases = { - -- todo + ["jpz imm8"] = {"jeq imm8"}, + ["jnz imm8"] = {"jne imm8"}, + ["jmp q" ] = {"ret" }, } local function trim(s) return s:gsub("^ +", ""):gsub(" +$", "").."" end @@ -357,13 +359,18 @@ local function instrsFromArch(arch) ["word [ imm8 ]" ] = function(imms) return arraySize(imms)*2, false end, ["word [ imm16 ]"] = function(imms) return arraySize(imms)*2, false end, } + local function addMnem(mnem, opcode) + instrs[mnem] = opcode + if mnem:find("%*") then instrs[mnem:gsub("%*", "%[").." ]"] = opcode end + end for _, instr in ipairs(arch.instructions) do if instr.mnem then local mnem = instr.mnem mnem = mnem:gsub("([%*%+%-])", " %1 ") mnem = trim(mnem):gsub(" +", " ") - instrs[mnem] = instr.opcode - if mnem:find("%*") then instrs[mnem:gsub("%*", "%[").." ]"] = instr.opcode end + addMnem(mnem, instr.opcode) + local alias = aliases[trim(mnem)] + if alias then for _, v in ipairs(alias) do addMnem(v, instr.opcode) end end end end return instrs diff --git a/instructionList.txt b/instructionList.txt index c6f98d2..3e65e7f 100644 --- a/instructionList.txt +++ b/instructionList.txt @@ -27,7 +27,7 @@ tst b 1E 1 Set flags according to B-0 tst c 1F 1 Set flags according to C-0 inc *s+imm8 2B 4 *(S+imm8)++, set flags dec *s+imm8 2C 4 *(S+imm8)--, set flags -icc *s+imm8 2D 4 *(S+imm8)-=CF, set flags +icc *s+imm8 2D 4 *(S+imm8)+=CF, set flags tst *s+imm8 2E 3 Set flags according to *(S+imm8)-0 8-bit Arithmetic/Logic (A): @@ -90,10 +90,10 @@ jsr q 67 1 I=Q, Q=I jpr imm8 31 2 I+=imm8 jnz imm8 30 2 I+=imm8 if !Zero jpz imm8 32 2 I+=imm8 if Zero -jlt imm8 33 2 I+=imm8 if !Carry -jge imm8 34 2 I+=imm8 if Carry -jle imm8 35 2 I+=imm8 if !Zero&!Carry -jgt imm8 36 2 I+=imm8 if Zero|Carry +jge imm8 33 2 I+=imm8 if !Carry +jlt imm8 34 2 I+=imm8 if Carry +jgt imm8 35 2 I+=imm8 if !Zero&!Carry +jle imm8 36 2 I+=imm8 if Zero|Carry Stack (S): pha 40 2 *(S++)=A diff --git a/rom-8608-defs.lua b/rom-8608-defs.lua index 935271e..57d5874 100644 --- a/rom-8608-defs.lua +++ b/rom-8608-defs.lua @@ -184,12 +184,12 @@ instructions = { { mnem="jmp q" , opcode=0x66, {"jmpAbsQ" }, desc="I=Q" }, { mnem="jsr q" , opcode=0x67, {"jmpAbsQ","saveRetAddr"}, desc="I=Q, Q=I" }, { 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="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" }, + { 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="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="jgt imm8" , opcode=0x35, ncycles=2, {"loadImmed","memSaveT","instrSub23Cond","instrNext0NC","instrNext0Z"}, {}, {"jmpRelT"}, {"instrNext"}, desc="I+=imm8 if !Zero & Carry" }, + { mnem="jle imm8" , opcode=0x36, ncycles=2, {"loadImmed","memSaveT","instrSub23Cond","instrNext0NC","instrNext0Z"}, {}, {"instrNext"}, {"jmpRelT"}, desc="I+=imm8 if Zero | !Carry" }, { category = "Stack", catlet="S" }, { mnem="pha" , opcode=0x40, {"pushReg","alurA","instrSub1"}, {"instrNext"}, desc="*(S++)=A" }, diff --git a/rom-8608.lua b/rom-8608.lua index 4367bac..17964bb 100644 --- a/rom-8608.lua +++ b/rom-8608.lua @@ -124,8 +124,10 @@ local function archToUcode(arch) print(info) local fo = io.open("instructionList.txt", "w") - fo:write(info) - fo:close() + if fo then + fo:write(info) + fo:close() + end return ucode end