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 // ExやType等取得 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