codeHack.perl 1.29 KB
#! /usr/sbin/perl
#---------------------------------------------------------------------
#	Copyright (C) 1997, Nintendo.
#	
#	File		codeHack.perl
#	Coded    by	Yoshitaka Yasumoto.	Mar 28, 1997.
#	Modified by	
#	Comments	
#	
#	$Id: codeHack.perl,v 1.1.1.1 2002/05/02 03:29:12 blythe Exp $
#---------------------------------------------------------------------
#
# Usage:
#
#    perl codeHack.perl [label] [ucode]
#
# Function:
#      ucode.dbg から label と label_SZ を探し, ucode の先頭 label バイト
#      位置から label_SZ バイト分のデータを標準出力へ出力する.
#
open(CODE_FILE, $ARGV[1])        || die "Cannot open $ARGV[1]\n";
open(DBG_FILE,  $ARGV[1].".dbg") || die "Cannot open $ARGV[1].dbg\n";

# ラベルのサーチ
$code_start = -1;
$code_size  = -1;
while (<DBG_FILE>){
    /^$ARGV[0] (\S*)/    && ($code_start = unpack("N",pack("H*", $1)));
    /^$ARGV[0]_SZ (\S*)/ && ($code_size  = unpack("N",pack("H*", $1)));
}
# ラベルが見つからないなら終了
($code_start != -1 && $code_size != -1) || die "Not found label $ARGV[0]\n";

# code ファイルの code_start byte 目から code_size 分読み込む
seek(CODE_FILE, $code_start, 0) || die "Too short file $ARGV[1]\n";
read(CODE_FILE, $buf, $code_size) == $code_size
				|| die "Too short file $ARGV[1]\n";

# 標準出力へ書き出す
print $buf;

#======== End of codeHack.perl ========