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

このエントリーをはてなブックマークに追加このエントリのはてなブックマーク数このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをつぶやく

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
	

Posted by at 2015/2/27 17:04

よく投稿されているコード

タグ

最近投稿されたコード