Start.AXのコードセグメントをテキストに書き出す

Start.AXを比較・解析するとき用

Start.AXを比較・解析するとき用

  • タグ:
  • タグはありません
#cmpopt varinit 1
dialog "ax", 16, "HSP Object File"
if stat == 0 : end
filename = refstr
//
exist filename
axsize = strsize
if axsize < 0 : end
sdim axdata, axsize
bload filename, axdata
//
if lpeek(axdata,0) != 0x33505348 {
dialog "AX", 1
end
}
// 使
dupptr hsphead, varptr(axdata), 96, 4
dupptr codeseg, varptr(axdata)+hsphead(4), hsphead(5), 2
//
sdim res, hsphead(5) / 4 * 41 + 256
sdim data
res = "OFFSET 48bit Ex0 Ex1 Ex2 TYPE CODE (JUMP)\n\n"
// CS
dim csptr
dim csptr_b
dim resptr
resptr = strlen(res)
repeat
if csptr >= hsphead(5) {
//
break
}
csptr_b = csptr
// ExType
info = wpeek(codeseg, csptr)
Is48 = info >> 15 & 1
Ex2 = info >> 14 & 1
Ex1 = info >> 13 & 1
Ex0 = info >> 12 & 1
Type = info & 0x0FFF
csptr += 2
// Code
if Is48 {
Code = lpeek(codeseg, csptr)
csptr += 4
} else {
Code = wpeek(codeseg, csptr)
csptr += 2
}
// TYPE_CMPCMD
//
Jump = -1
if Type == 11/*TYPE_CMPCMD*/ {
Jump = wpeek(codeseg, csptr)
csptr += 2
}
//
if Jump >= 0 {
data = strf("%08X %d %d %d %d %4d %08X %08X\n", csptr_b, Is48, Ex0, Ex1, Ex2, Type, Code, csptr+(Jump<<1))
} else {
data = strf("%08X %d %d %d %d %4d %08X\n", csptr_b, Is48, Ex0, Ex1, Ex2, Type, Code)
}
memcpy res, data, strlen(data), resptr
resptr += strlen(data)
loop
//
notesel res
notesave filename+".txt"
noteunsel
//
exec filename+".txt", 16
end
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX