mirror of
https://github.com/rvtr/TwlToolsRED.git
synced 2025-10-31 06:41:18 -04:00
不正ROMメーカ:2バイト/4バイト単位でビットをいじれるように変更。
git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlToolsRED@340 7061adef-622a-194b-ae81-725974e89856
This commit is contained in:
parent
1733e94d09
commit
9ff748853d
@ -60,7 +60,10 @@ typedef struct _SContext
|
||||
// 引数
|
||||
u32 byteAddr; // 不正挿入バイトアドレス
|
||||
u32 bitAddr; // 不正挿入ビットアドレス(オプション)
|
||||
u8 assignValue; // ‘ã“ü’l(ƒIƒvƒVƒ‡ƒ“)
|
||||
u32 assignValue; // 代入値(オプション)
|
||||
|
||||
// 不正値を入れる箇所を何バイトとして扱うか
|
||||
u32 targetSize;
|
||||
}
|
||||
SContext;
|
||||
|
||||
@ -102,6 +105,8 @@ void usage()
|
||||
printf( "-d bitAddr : desable the specific bit. [0-7]\n" );
|
||||
printf( "-c : clear the byte.\n" );
|
||||
printf( "-a value : assign the value into the byte. [00-FF]\n" );
|
||||
printf( "-2 : treat the target as 2 byte.\n" );
|
||||
printf( "-4 : treat the target as 4 byte.\n" );
|
||||
printf( "-h : print help only.\n" );
|
||||
printf( "-f : force to overwrite a output_file.\n" );
|
||||
printf( "-----------------------------------------------------------------------------\n" );
|
||||
@ -126,8 +131,11 @@ int main(int argc, char *argv[])
|
||||
// context の初期化
|
||||
memset( &context, 0, sizeof(SContext) );
|
||||
|
||||
// デフォルトでは不正値を入れる箇所を1バイトとして扱う
|
||||
context.targetSize = 1;
|
||||
|
||||
// オプション
|
||||
while( (opt = getopt(argc, argv, "e:d:ca:hf")) >= 0 )
|
||||
while( (opt = getopt(argc, argv, "e:d:ca:24hf")) >= 0 )
|
||||
{
|
||||
switch( opt )
|
||||
{
|
||||
@ -150,6 +158,14 @@ int main(int argc, char *argv[])
|
||||
context.assignValue = strtol(optarg, &errptr, 16);
|
||||
break;
|
||||
|
||||
case '2':
|
||||
context.targetSize = 2;
|
||||
break;
|
||||
|
||||
case '4':
|
||||
context.targetSize = 4;
|
||||
break;
|
||||
|
||||
case 'h':
|
||||
usage();
|
||||
return 0;
|
||||
@ -263,12 +279,12 @@ FINALIZE:
|
||||
|
||||
static BOOL iMain( SContext *pContext )
|
||||
{
|
||||
u8 byte;
|
||||
u32 target = 0; // 1,2,4バイトのいずれかを書き換えるので最大の4バイトにしておく
|
||||
|
||||
// 指定されたバイトをリード
|
||||
printf("Byte Address : 0x%X\n", (unsigned int)pContext->byteAddr);
|
||||
fseek( pContext->ifp, pContext->byteAddr, SEEK_SET );
|
||||
if( 1 != fread( &byte, 1, 1, pContext->ifp ) )
|
||||
if( pContext->targetSize != fread( &target, 1, pContext->targetSize, pContext->ifp ) )
|
||||
{
|
||||
printf( "\n*** Error: Failed to read the byte from input_file. ***\n" );
|
||||
return FALSE;
|
||||
@ -276,33 +292,33 @@ static BOOL iMain( SContext *pContext )
|
||||
|
||||
if( pContext->isBitEnable )
|
||||
{
|
||||
u8 mask = 1 << pContext->bitAddr;
|
||||
u8 oldbyte = byte;
|
||||
byte |= mask;
|
||||
printf("Enable bit %d : 0x%02X -> 0x%02X\n", (int)pContext->bitAddr, oldbyte, byte);
|
||||
u32 mask = 1 << pContext->bitAddr;
|
||||
u32 old = target;
|
||||
target |= mask;
|
||||
printf("Enable bit %2d : 0x%08X -> 0x%08X\n", (int)pContext->bitAddr, (unsigned int)old, (unsigned int)target);
|
||||
}
|
||||
if( pContext->isBitDisable )
|
||||
{
|
||||
u8 mask = 1 << pContext->bitAddr;
|
||||
u8 oldbyte = byte;
|
||||
byte &= ~mask;
|
||||
printf("Disable bit %d : 0x%02X -> 0x%02X\n", (int)pContext->bitAddr, oldbyte, byte);
|
||||
u32 mask = 1 << pContext->bitAddr;
|
||||
u32 old = target;
|
||||
target &= ~mask;
|
||||
printf("Enable bit %2d : 0x%08X -> 0x%08X\n", (int)pContext->bitAddr, (unsigned int)old, (unsigned int)target);
|
||||
}
|
||||
if( pContext->isByteClear )
|
||||
{
|
||||
u8 oldbyte = byte;
|
||||
byte = 0;
|
||||
printf("Clear byte : 0x%02X -> 0x%02X\n", oldbyte, byte);
|
||||
u32 old = target;
|
||||
target = 0;
|
||||
printf("Clear byte : 0x%08X -> 0x%08X\n", (unsigned int)old, (unsigned int)target);
|
||||
}
|
||||
if( pContext->isByteAssign )
|
||||
{
|
||||
printf("Assign : 0x%02X -> 0x%02X\n", byte, pContext->assignValue);
|
||||
byte = pContext->assignValue;
|
||||
printf("Assign : 0x%08X -> 0x%08X\n", (unsigned int)target, (unsigned int)pContext->assignValue);
|
||||
target = pContext->assignValue;
|
||||
}
|
||||
|
||||
// 変更したバイトを出力ファイルに書き出す
|
||||
fseek( pContext->ofp, pContext->byteAddr, SEEK_SET );
|
||||
if( 1 != fwrite( &byte, 1, 1, pContext->ofp ) )
|
||||
if( pContext->targetSize != fwrite( &target, 1, pContext->targetSize, pContext->ofp ) )
|
||||
{
|
||||
printf( "\n*** Error: Failed to write the byte to output_fie. ***\n" );
|
||||
return FALSE;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user