add aliases, fix cond jumps
This commit is contained in:
parent
dfc9f18ec7
commit
46e5b83cef
@ -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
|
||||
|
@ -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
|
||||
|
@ -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" },
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user