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
		
		// 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