add labels to dasm
This commit is contained in:
@@ -449,29 +449,85 @@ local function mnemsFromArch(arch)
|
||||
local mnems = {}
|
||||
for _, instr in ipairs(arch.instructions) do
|
||||
if instr.mnem then
|
||||
mnems[instr.opcode] = instr.mnem
|
||||
local len = 1
|
||||
for l in instr.mnem:gmatch("imm([0-9]+)") do len = len + tonumber(l)/8 end
|
||||
mnems[instr.opcode] = { mnem = instr.mnem, rel = instr.rel, jmp = instr.jmp, len = len, }
|
||||
end
|
||||
end
|
||||
return mnems
|
||||
end
|
||||
local function toSigned8(x) return x>=128 and x-256 or x end
|
||||
local function disassembleMemory(mem, code, arch)
|
||||
print("Disassembly:")
|
||||
local mnems = mnemsFromArch(arch)
|
||||
local addr = 0
|
||||
local function nextByte() local b = mem[addr]; addr = addr+1; return b; end
|
||||
local function nextByte(d) local b = mem[addr]; addr = addr+1; return b or d; end
|
||||
local lastaddr = 0
|
||||
local jmpaddrs = {}
|
||||
local labelnum = 0
|
||||
local subnum = 0
|
||||
while addr<=0xFFFF do
|
||||
local startaddr = addr
|
||||
local opcode = nextByte()
|
||||
if opcode and ((not code) or code[addr-1]) then
|
||||
if opcode and ((not code) or code[startaddr]) then
|
||||
local mnem = mnems[opcode]
|
||||
if mnem then
|
||||
if mnem.jmp then
|
||||
local jmpdest
|
||||
if mnem.rel then jmpdest = toSigned8(nextByte(0)) + addr
|
||||
else jmpdest = nextByte(0)*256 + nextByte(0)
|
||||
end
|
||||
if jmpdest then
|
||||
if not jmpaddrs[jmpdest] then
|
||||
jmpaddrs[jmpdest] = {
|
||||
name = (mnem.rel and "label_"..labelnum or "subroutine_"..subnum),
|
||||
from = {},
|
||||
}
|
||||
if mnem.rel then labelnum = labelnum+1 else subnum = subnum+1 end
|
||||
end
|
||||
table.insert(jmpaddrs[jmpdest].from, startaddr)
|
||||
end
|
||||
else
|
||||
addr = addr + mnem.len - 1
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
addr = 0
|
||||
while addr<=0xFFFF do
|
||||
local startaddr = addr
|
||||
local opcode = nextByte()
|
||||
if opcode and ((not code) or code[startaddr]) then
|
||||
local line = {}
|
||||
local mnem = mnems[opcode] or "???"
|
||||
local mnem = mnems[opcode].mnem or "???"
|
||||
table.insert(line, trim(mnem:gsub("imm[0-9]+", "")))
|
||||
local tlen = 1
|
||||
for lens in mnem:gmatch("imm([0-9]+)") do local len = tonumber(lens)/8
|
||||
if len==1 then
|
||||
table.insert(line, "$"..string.format("%02X", nextByte() or 0))
|
||||
local data = nextByte(0)
|
||||
local jmp
|
||||
if mnems[opcode].rel then
|
||||
local jmpdest = (addr + toSigned8(data))%65536
|
||||
jmp = jmpaddrs[jmpdest]
|
||||
if jmp then
|
||||
table.insert(line, jmp.name)
|
||||
--table.insert(line, ";")
|
||||
--table.insert(line, "$"..string.format("%04X", jmpdest)..",")
|
||||
end
|
||||
end
|
||||
if not jmp then table.insert(line, "$"..string.format("%02X", data)) end
|
||||
elseif len==2 then
|
||||
table.insert(line, "$"..string.format("%04X", (nextByte() or 0)*256 + (nextByte() or 0)))
|
||||
local data = nextByte(0)*256 + nextByte(0)
|
||||
local jmp
|
||||
if mnems[opcode].jmp then
|
||||
local jmpdest = data
|
||||
jmp = jmpaddrs[jmpdest]
|
||||
if jmp then
|
||||
table.insert(line, jmp.name)
|
||||
--table.insert(line, ";")
|
||||
end
|
||||
end
|
||||
if not jmp then table.insert(line, "$"..string.format("%04X", data)) end
|
||||
else error("invalid imm len") end
|
||||
tlen = tlen + len
|
||||
end
|
||||
@@ -479,9 +535,12 @@ local function disassembleMemory(mem, code, arch)
|
||||
for i = addr-tlen, addr-1 do
|
||||
table.insert(lineb, string.format("%02X", mem[i] or 0))
|
||||
end
|
||||
local label = ""
|
||||
local jmp = jmpaddrs[startaddr]
|
||||
if jmp then label = jmp.name..":" end
|
||||
local lb = table.concat(lineb, " ")
|
||||
if lastaddr~=addr-tlen then print("...") end
|
||||
print(string.format("%04X", addr-tlen).." | "..(" "):rep(8-#lb)..lb.." | "..table.concat(line, " "))
|
||||
print(string.format("%04X", addr-tlen).." | "..(" "):rep(8-#lb)..lb.." | "..(" "):rep(13-#label)..label.." "..table.concat(line, " "))
|
||||
lastaddr = addr
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user