Start.AXを比較・解析するとき用
Start.AXを比較・解析するとき用
#cmpopt varinit 1dialog "ax", 16, "HSP Object File"if stat == 0 : endfilename = refstr// 読み込みexist filenameaxsize = strsizeif axsize < 0 : endsdim axdata, axsizebload filename, axdata// 形式チェック(簡易)if lpeek(axdata,0) != 0x33505348 {dialog "AXじゃない", 1end}// 使いやすいように別変数にとっとくdupptr hsphead, varptr(axdata), 96, 4dupptr codeseg, varptr(axdata)+hsphead(4), hsphead(5), 2// 出力用変数準備sdim res, hsphead(5) / 4 * 41 + 256sdim datares = "OFFSET 48bit Ex0 Ex1 Ex2 TYPE CODE (JUMP)\n\n"// CSをなめるdim csptrdim csptr_bdim resptrresptr = strlen(res)repeatif csptr >= hsphead(5) {// 探索終了break}csptr_b = csptr// ExやType等取得info = wpeek(codeseg, csptr)Is48 = info >> 15 & 1Ex2 = info >> 14 & 1Ex1 = info >> 13 & 1Ex0 = info >> 12 & 1Type = info & 0x0FFFcsptr += 2// Code取得if Is48 {Code = lpeek(codeseg, csptr)csptr += 4} else {Code = wpeek(codeseg, csptr)csptr += 2}// TYPE_CMPCMDのときはジャンプ先が記録されている// それを取得するJump = -1if 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), resptrresptr += strlen(data)loop// ファイルに保存notesel resnotesave filename+".txt"noteunsel// 保存したファイルを開くexec filename+".txt", 16end