git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlToolsRED@585 7061adef-622a-194b-ae81-725974e89856

This commit is contained in:
mizu 2013-01-16 00:36:58 +00:00
parent 0a8fc3efdc
commit 87a51d3bcb
4 changed files with 191 additions and 93 deletions

Binary file not shown.

Binary file not shown.

View File

@ -32,11 +32,20 @@ type
bottom:Longword; // end; bottom:Longword; // end;
end; end;
TRomh = record TRomh = record //ROMヘッダ(nitro_romheader.hより)
title: array[1..12] of Char; title: array[1..12] of Char;
game_code: array[1..4] of Byte; game_code: array[1..4] of Char;
//0x10 //0x10
dumy:array[1..16]of Byte;//ツールで使用しない部分 maker_code: array[1..2] of Byte;
machine_code: Byte;
rom_type: Byte;
rom_size: Byte;
resv_A: array[1..8] of Byte; //Reserve(All 0)
region: Byte;
// b0 = china,b1 = koria
rom_version: Byte;
comp_boot_area: Byte;//b7 =A9,b6=A7
// //
// 0x020 for Static modules (Section:B) // 0x020 for Static modules (Section:B)
@ -79,82 +88,131 @@ implementation
function TForm1.CheckSrlHeader: integer; function TForm1.CheckSrlHeader: integer;
var var
Rec: TSearchRec; Rec: TSearchRec;
s: String; sf,s,ss: String;
i,n,Count: integer; i,n,Count: integer;
fsrl: file; fsrl: file;
flog:TextFile;
romh: TRomh; romh: TRomh;
noc_size,noc_sectors,size,sectors,nums,max_sectors,total_sectors: integer; noc_size,noc_sectors,size,sectors,nums,max_sectors,total_sectors: integer;
fat: TRom_Fat; fat: TRom_Fat;
top,btm,all_sectors: Longword;
begin begin
{$I-} {$I-}
Count :=0; //ログファイル作成
//指定ディレクトリからファイルを取り出す ListBox_log.Items.Add('Create Log file');
// ** 内容で判別しないので違うファイル置かないよう注意 ** s := 'log.txt';
if FindFirst(SrlDir + '*.*', faAnyFile, Rec) = 0 then AssignFile (flog,s);
try Rewrite(flog);
if IOResult <> 0 then begin
Count := -1;
ListBox_log.Items.Add('faild')
end else begin
Count := 0;
//指定ディレクトリからファイルを取り出す
// ** 内容で判別しないので違うファイル置かないよう注意 **
if FindFirst(SrlDir + '*.*', faAnyFile, Rec) = 0 then
try
repeat repeat
//フォルダやカレントディレクトリや親ディレクトリは対象外で //フォルダやカレントディレクトリや親ディレクトリは対象外
if not((Rec.Attr and faDirectory > 0)) and if not((Rec.Attr and faDirectory > 0)) and
(Rec.Name <> '.') and (Rec.Name <> '..') then (Rec.Name <> '.') and (Rec.Name <> '..') and (Rec.name<>'log.txt')then
begin begin
Inc(Count); Inc(Count);
ListBox_log.Items.Add('file: '+Rec.Name); //ListBox_log.Items.Add(' ********************************** ');
Writeln(flog,' ********************************** ');
sf := 'file: '+Rec.Name;
//ListBox_log.Items.Add(sf);
Writeln(flog,sf);
AssignFile (fsrl,SrlDir+Rec.Name); AssignFile (fsrl,SrlDir+Rec.Name);
FileMode := fmOpenRead;//リード専用指定 FileMode := fmOpenRead;//リード専用指定
Reset(fsrl,1);//ファイル開く Reset(fsrl,1);//ファイル開く
if IOResult = 0 then begin if IOResult = 0 then begin
BlockRead(fsrl,romh,SizeOf(TRomh),n); BlockRead(fsrl,romh,SizeOf(TRomh),n);//ヘッダリード
if SizeOf(TRomh) <> n then if SizeOf(TRomh) <> n then
s := ' size too small' s := ' header read error'
else begin else begin
SetLength(s,12); //SetLength(s,12);
s := '[ ( )]';
for i:=1 to 12 do begin for i:=1 to 12 do begin
if romh.title[i] = char(0) then break; if romh.title[i] = char(0) then break;
s[i] := romh.title[i]; s[i+1] := romh.title[i];
end; end;
if i<12 then Setlength(s,i); s[15] := romh.game_code[4];//idの文字目(仕向地)
ListBox_log.Items.Add('title = '+s); //ListBox_log.Items.Add(s); //title
Writeln(flog,s);
s := 'game_code = ';
for i:=1 to 4 do s[12+i] := romh.game_code[i];
//ListBox_log.Items.Add(s); //game code
//ListBox_log.Items.Add('version = '+inttostr(romh.rom_version));
//ListBox_log.Items.Add(' ');
Writeln(flog,s);
Writeln(flog,'version = '+inttostr(romh.rom_version));
Writeln(flog);//改行
//オーバレイチェック //オーバレイチェック
if romh.main_ovt_size >0 then begin if romh.main_ovt_size >31 then begin
//DHT_OVERLAY_MAX (512*1024) //DHT_OVERLAY_MAX (512*1024)
total_sectors := 0; total_sectors := 0;
nums := romh.main_ovt_size div 32;// 32 = Nitro用(Twlは33) all_sectors := 0;
noc_size :=0; nums := romh.main_ovt_size div 32;//Ovl count
noc_sectors := 0; noc_size :=0;//範囲外トータルsize
noc_sectors := 0;// 同セクタ
for i := 0 to nums-1 do begin for i := 0 to nums-1 do begin
top := 0;btm := 0;
seek( fsrl,romh.fat_offset+sizeof(TRom_Fat)*i); seek( fsrl,romh.fat_offset+sizeof(TRom_Fat)*i);
BlockRead( fsrl,fat,sizeof(fat),n); BlockRead( fsrl,fat,sizeof(fat),n);//top,bottom取得
size := fat.bottom - fat.top;
if total_sectors >= 1024 then begin//MAX超えたファイルは検証外に加算
s := 'OL['+inttostr(i)+'] $'+ inttohex(fat.top,8)+' - $'+
inttohex(fat.bottom,8)+' :size '+ inttostr(size);
noc_size := noc_size + size;
noc_sectors := noc_sectors + ((size+511) and $fffffe00) div 512;
next;
end;
//max_sectors = (DHT_OVERLAY_MAX/512 - total_sectors) / (nums-i);
max_sectors := (1024 - total_sectors) div (nums-i);
if n <> sizeof(fat) then begin if n <> sizeof(fat) then begin
s := s+'Cannot read fat id='+ inttostr(i); s := s+'Cannot read fat id='+ inttostr(i);
break; break;
end; end;
sectors := ( ((fat.bottom+511) and $fffffe00)- fat.top) div 512; size := (fat.bottom - fat.top)+1;
if sectors > max_sectors then begin sectors := size shr 9;//div 512
size := size - max_sectors*512;//検証されない残りサイズ if (size and $1ff) <>0 then inc(sectors);
s := 'OL['+inttostr(i)+'] $'+ inttohex(fat.top+max_sectors*512,8)+' - $'+ size := sectors shl 9;
inttohex(fat.bottom,8)+' :size '+ inttostr(size); inc(all_sectors,sectors);
ListBox_log.Items.Add(s); //max_sectors = (DHT_OVERLAY_MAX/512 - total_sectors) / (nums-i);
noc_size := noc_size+size; if (total_sectors < 1024)then max_sectors := (1024 - total_sectors) div (nums-i)
noc_sectors := noc_sectors + (max_sectors-sectors); else max_sectors := 0;
btm := fat.bottom;
if max_sectors = 0 then begin//残検証サイズなければ丸ごと検証外
top := fat.top;
ss := '(A9 Overlay の全部)';
end else begin
if sectors > max_sectors then begin //最大割当サイズ超
sectors := sectors - max_sectors;//検証されないセクタ数
top := fat.top + max_sectors;
inc(total_sectors,max_sectors);
ss := '(A9 Overlay の一部)';
end else begin //超過なし
inc(total_sectors,sectors);
sectors := 0;
end;
end;
if sectors > 0 then begin
size := sectors shl 9;
s := 'offset'+inttostr(i)+' = 0x'+ inttohex(top,8)
+' ; 0x'+ inttohex(top,8)
+'-0x' + inttohex(btm,8)+ss;
//ListBox_log.Items.Add(s);
Writeln(flog,s);
s := 'length'+ inttostr(i) + ' = 0x' + inttohex(size,4)
+ ' ; '+ inttostr(size)+' bytes';
//ListBox_log.Items.Add(s);
Writeln(flog,s);
inc(noc_size,size);
inc(noc_sectors,sectors);
end; end;
total_sectors := total_sectors + sectors;
end; end;
if i = nums then begin if i = nums then begin //中断なし
ListBox_log.Items.Add('total sectors = '+inttostr(total_sectors)); //ListBox_log.Items.Add('total sectors = '+inttostr(all_sectors));
ListBox_log.Items.Add('no check sectors = '+inttostr(noc_sectors)); //ListBox_log.Items.Add('no check sectors = '+inttostr(noc_sectors));
ListBox_log.Items.Add('no check size = '+inttostr(noc_size)); //ListBox_log.Items.Add('no check size = '+inttostr(noc_size));
//ListBox_log.Items.Add(' '); //間をあける
Writeln(flog); //開業
Writeln(flog,'total sectors = '+inttostr(all_sectors));
Writeln(flog,'no check sectors = '+inttostr(noc_sectors));
Writeln(flog,'no check size = '+inttostr(noc_size));
if noc_size > 0 then s:= 'NG' if noc_size > 0 then s:= 'NG'
else s:= 'OK'; else s:= 'OK';
end; end;
@ -162,12 +220,16 @@ begin
end; end;
end else s := ' Open Error'; end else s := ' Open Error';
CloseFile(fsrl); CloseFile(fsrl);
ListBox_log.Items.Add(s); Writeln(flog,s);//結果
if (s='OK') or (s='NG') then s := 'done';
ss := sf + ' : ' + s;
ListBox_log.Items.Add(ss);
end; end;
until (FindNext(Rec) <> 0); until (FindNext(Rec) <> 0);
finally finally
FindClose(Rec); FindClose(Rec);
end;
CloseFile(flog);
end; end;
{$I+} {$I+}
Result :=Count; Result :=Count;
@ -178,15 +240,16 @@ end;
procedure TForm1.Button1Click(Sender: TObject); procedure TForm1.Button1Click(Sender: TObject);
var var
FileCount :integer; FileCount :integer;
s :string;
begin begin
ListBox_log.Clear; ListBox_log.Clear;
//指定ディレクトリのsrlファイルをチェック //指定ディレクトリのsrlファイルをチェック
FileCount := CheckSrlHeader; FileCount := CheckSrlHeader;
if FileCount>0 then begin if FileCount>0 then begin
ListBox_log.Items.Add(' ------------------------ '); ListBox_log.Items.Add(' ------------------------------ ');
ListBox_log.Items.Add('total '+inttostr(FileCount)+' files'); s := 'total '+inttostr(FileCount)+' files';
end else end else if FileCount = 0 then s := ' file not ditect' ;
ListBox_log.Items.Add(' file not ditect'); ListBox_log.Items.Add(s);
end; end;

View File

@ -32,11 +32,20 @@ type
bottom:Longword; // end; bottom:Longword; // end;
end; end;
TRomh = record TRomh = record //ROMヘッダ(nitro_romheader.hより)
title: array[1..12] of Char; title: array[1..12] of Char;
game_code: array[1..4] of Byte; game_code: array[1..4] of Char;
//0x10 //0x10
dumy:array[1..16]of Byte;//ツールで使用しない部分 maker_code: array[1..2] of Byte;
machine_code: Byte;
rom_type: Byte;
rom_size: Byte;
resv_A: array[1..8] of Byte; //Reserve(All 0)
region: Byte;
// b0 = china,b1 = koria
rom_version: Byte;
comp_boot_area: Byte;//b7 =A9,b6=A7
// //
// 0x020 for Static modules (Section:B) // 0x020 for Static modules (Section:B)
@ -79,12 +88,13 @@ implementation
function TForm1.CheckSrlHeader: integer; function TForm1.CheckSrlHeader: integer;
var var
Rec: TSearchRec; Rec: TSearchRec;
s: String; s,ss: String;
i,n,Count: integer; i,n,Count: integer;
fsrl: file; fsrl: file;
romh: TRomh; romh: TRomh;
noc_size,noc_sectors,size,sectors,nums,max_sectors,total_sectors: integer; noc_size,noc_sectors,size,sectors,nums,max_sectors,total_sectors: integer;
fat: TRom_Fat; fat: TRom_Fat;
top,btm,all_sectors: Longword;
begin begin
{$I-} {$I-}
@ -94,67 +104,92 @@ begin
if FindFirst(SrlDir + '*.*', faAnyFile, Rec) = 0 then if FindFirst(SrlDir + '*.*', faAnyFile, Rec) = 0 then
try try
repeat repeat
//フォルダやカレントディレクトリや親ディレクトリは対象外 //フォルダやカレントディレクトリや親ディレクトリは対象外
if not((Rec.Attr and faDirectory > 0)) and if not((Rec.Attr and faDirectory > 0)) and
(Rec.Name <> '.') and (Rec.Name <> '..') then (Rec.Name <> '.') and (Rec.Name <> '..') then
begin begin
Inc(Count); Inc(Count);
ListBox_log.Items.Add(' ********************************** ');
ListBox_log.Items.Add('file: '+Rec.Name); ListBox_log.Items.Add('file: '+Rec.Name);
AssignFile (fsrl,SrlDir+Rec.Name); AssignFile (fsrl,SrlDir+Rec.Name);
FileMode := fmOpenRead;//リード専用指定 FileMode := fmOpenRead;//リード専用指定
Reset(fsrl,1);//ファイル開く Reset(fsrl,1);//ファイル開く
if IOResult = 0 then begin if IOResult = 0 then begin
BlockRead(fsrl,romh,SizeOf(TRomh),n); BlockRead(fsrl,romh,SizeOf(TRomh),n);//ヘッダリード
if SizeOf(TRomh) <> n then if SizeOf(TRomh) <> n then
s := ' size too small' s := ' file error'
else begin else begin
SetLength(s,12); //SetLength(s,12);
s := '[ ( )]';
for i:=1 to 12 do begin for i:=1 to 12 do begin
if romh.title[i] = char(0) then break; if romh.title[i] = char(0) then break;
s[i] := romh.title[i]; s[i+1] := romh.title[i];
end; end;
if i<12 then Setlength(s,i); s[15] := romh.game_code[4];//idの文字目(仕向地)
ListBox_log.Items.Add('title = '+s); ListBox_log.Items.Add(s); //title
s := 'game_code = ';
for i:=1 to 4 do s[12+i] := romh.game_code[i];
ListBox_log.Items.Add(s); //game code
ListBox_log.Items.Add('version = '+inttostr(romh.rom_version));
ListBox_log.Items.Add(' '); //間をあける
//オーバレイチェック //オーバレイチェック
if romh.main_ovt_size >0 then begin if romh.main_ovt_size >31 then begin
//DHT_OVERLAY_MAX (512*1024) //DHT_OVERLAY_MAX (512*1024)
total_sectors := 0; total_sectors := 0;
nums := romh.main_ovt_size div 32;// 32 = Nitro用(Twlは33) all_sectors := 0;
noc_size :=0; nums := romh.main_ovt_size div 32;//Ovl count
noc_sectors := 0; noc_size :=0;//範囲外トータルsize
noc_sectors := 0;// 同セクタ
for i := 0 to nums-1 do begin for i := 0 to nums-1 do begin
top := 0;btm := 0;
seek( fsrl,romh.fat_offset+sizeof(TRom_Fat)*i); seek( fsrl,romh.fat_offset+sizeof(TRom_Fat)*i);
BlockRead( fsrl,fat,sizeof(fat),n); BlockRead( fsrl,fat,sizeof(fat),n);//top,bottom取得
size := fat.bottom - fat.top;
if total_sectors >= 1024 then begin//MAX超えたファイルは検証外に加算
s := 'OL['+inttostr(i)+'] $'+ inttohex(fat.top,8)+' - $'+
inttohex(fat.bottom,8)+' :size '+ inttostr(size);
noc_size := noc_size + size;
noc_sectors := noc_sectors + ((size+511) and $fffffe00) div 512;
next;
end;
//max_sectors = (DHT_OVERLAY_MAX/512 - total_sectors) / (nums-i);
max_sectors := (1024 - total_sectors) div (nums-i);
if n <> sizeof(fat) then begin if n <> sizeof(fat) then begin
s := s+'Cannot read fat id='+ inttostr(i); s := s+'Cannot read fat id='+ inttostr(i);
break; break;
end; end;
sectors := ( ((fat.bottom+511) and $fffffe00)- fat.top) div 512; size := (fat.bottom - fat.top)+1;
if sectors > max_sectors then begin sectors := size shr 9;//div 512
size := size - max_sectors*512;//検証されない残りサイズ if (size and $1ff) <>0 then inc(sectors);
s := 'OL['+inttostr(i)+'] $'+ inttohex(fat.top+max_sectors*512,8)+' - $'+ size := sectors shl 9;
inttohex(fat.bottom,8)+' :size '+ inttostr(size); inc(all_sectors,sectors);
ListBox_log.Items.Add(s); //max_sectors = (DHT_OVERLAY_MAX/512 - total_sectors) / (nums-i);
noc_size := noc_size+size; if (total_sectors < 1024)then max_sectors := (1024 - total_sectors) div (nums-i)
noc_sectors := noc_sectors + (max_sectors-sectors); else max_sectors := 0;
btm := fat.bottom;
if max_sectors = 0 then begin//残検証サイズなければ丸ごと検証外
top := fat.top;
ss := '(A9 Overlay の全部)';
end else begin
if sectors > max_sectors then begin //最大割当サイズ超
sectors := sectors - max_sectors;//検証されないセクタ数
top := fat.top + max_sectors;
inc(total_sectors,max_sectors);
ss := '(A9 Overlay の一部)';
end else begin //超過なし
inc(total_sectors,sectors);
sectors := 0;
end;
end;
if sectors > 0 then begin
size := sectors shl 9;
s := 'offset'+inttostr(i)+' = 0x'+ inttohex(top,8)
+' ; 0x'+ inttohex(top,8)
+'-0x' + inttohex(btm,8)+ss;
ListBox_log.Items.Add(s);
s := 'length'+ inttostr(i) + ' = 0x' + inttohex(size,4)
+ ' ; '+ inttostr(size)+' bytes';
ListBox_log.Items.Add(s);
inc(noc_size,size);
inc(noc_sectors,sectors);
end; end;
total_sectors := total_sectors + sectors;
end; end;
if i = nums then begin if i = nums then begin //中断なし
ListBox_log.Items.Add('total sectors = '+inttostr(total_sectors)); ListBox_log.Items.Add('total sectors = '+inttostr(all_sectors));
ListBox_log.Items.Add('no check sectors = '+inttostr(noc_sectors)); ListBox_log.Items.Add('no check sectors = '+inttostr(noc_sectors));
ListBox_log.Items.Add('no check size = '+inttostr(noc_size)); ListBox_log.Items.Add('no check size = '+inttostr(noc_size));
ListBox_log.Items.Add(' '); //間をあける
if noc_size > 0 then s:= 'NG' if noc_size > 0 then s:= 'NG'
else s:= 'OK'; else s:= 'OK';
end; end;
@ -183,7 +218,7 @@ begin
//指定ディレクトリのsrlファイルをチェック //指定ディレクトリのsrlファイルをチェック
FileCount := CheckSrlHeader; FileCount := CheckSrlHeader;
if FileCount>0 then begin if FileCount>0 then begin
ListBox_log.Items.Add(' ------------------------ '); ListBox_log.Items.Add(' ------------------------------ ');
ListBox_log.Items.Add('total '+inttostr(FileCount)+' files'); ListBox_log.Items.Add('total '+inttostr(FileCount)+' files');
end else end else
ListBox_log.Items.Add(' file not ditect'); ListBox_log.Items.Add(' file not ditect');