📄 unit1.pas
字号:
end;
end;
end;
function get_info_mod(iFileHandle:integer;in_address:longword):string;
var
i:longword;
s,s1:string;
x:integer;
begin
//800400008147AF988128BF7480D7AFF80007A20001C6A88A5E0B6F7000000007
s:=get_ibyte(iFileHandle,in_address-32,32);
s1:= getname(iFileHandle,copy(s,25,8));
with Form1.ListView1 do
begin
Items.Add;//一定要add
x:=Items.Count-1;
Items[x].Caption:=s1;
Items[x].SubItems.add('--');
Items[x].SubItems.add('--');
Items[x].SubItems.add('--');
Items[x].SubItems.add(ihextoint(copy(s,33,8)));
Items[x].SubItems.add('M'+(copy(s,57,8)));
end;
FileSeek(iFileHandle,(strtoint64def('$'+address_conv(copy(s,17,8),false),-1)),0);
FileRead(iFileHandle, i, 1);
get_info_struct(iFileHandle,(strtoint64def('$'+address_conv(copy(s,9,8),false),-1)),s1,i);
end;
function get_name_sp(iFileHandle:integer;name_len:integer):longword;
var
i,i1:int64;
j:integer;
Buffer : Pchar;
b:boolean;
begin
//加文件名
result:=0;
with Form1 do
begin
i:=strtoint64def('$'+address_conv(labelededit2.Text,false),0);
i1:=strtoint64def('$'+address_conv(labelededit4.Text,false),0);
if (i<>0) and (i1<>0) then
begin
Buffer := Pchar(AllocMem(name_len+5));//多读前两位后两位 =4
b:=false;
try
repeat
FileSeek(iFileHandle,i-2,0);
FileRead(iFileHandle, Buffer^, name_len+4);
for j:=0 to name_len+3 do
begin
if (Buffer[j]<>#0) then begin b:=false; break; end;
b:=true;
end;
i:=i+2;
until b or (i>i1-name_len+4);
if b then
result:=i-2
else
begin
op_log('未找到可用文件名空间!');
result:=0;
exit;
end;
finally
FreeMem(Buffer);
end;
end;
end;
end;
function Do_compress(Pin:Pbyte;in_len:Dword; Pout:Pbyte):Dword;
TYPE
TGetCecompress= function (indata:Pbyte;inlength:Dword;outdata:Pbyte; outlength:Dword; i_1:integer; i_4096:integer):dword; cdecl;
var
DLLHandle:Thandle;
Func:TGetCecompress;
D:Dword;
begin
result:=0;
DLLHandle:=LoadLibrary('CECompressv4.dll');
if DLLHandle>0 then
try
@Func:=GetProcAddress(DLLHandle,PChar('CECompress'));
if Assigned(@Func) then
begin
D:=Func(Pin,in_len, Pout, in_len-1,1,4096);
with Form1 do
if (D=$FFFFFFFF) then op_log('压缩错误')
else result:=D;
end
else
ShowMessage('CECompress函数没有找到');
finally
FreeLibrary(DLLHandle); {释放DLL}
end
else
ShowMessage('CECompressv4.dll没有找到');
end;
function get_rom_info():integer;
var
iFileHandle:integer;
i:longword;
begin
result:=-1;
with Form1 do
if FileExists(Opendialog1.FileName) then
begin
iFileHandle := FileOpen(Opendialog1.FileName, fmOpenRead);
if iFileHandle >0 then
begin
try
rom_size := FileSeek(iFileHandle,0,2);
//找ECEC标志及入口
FileSeek(iFileHandle,0,0);
i:=0;//longword不能为-4
Repeat
i:=i+4;
application.ProcessMessages;
Until ((get_ibyte(iFileHandle,i,4)='43454345') or (i >=rom_size)or (i >=20480));
if (i >=rom_size)or (i >=20480) then
begin
showmessage(ExtractFileName(Opendialog1.Filename)+'不是正常ROM文件!');
op_log(ExtractFileName(Opendialog1.Filename)+'不是正常ROM文件!');
Opendialog1.FileName:='';
result:=-1;
end
else
begin
rom_in:=strtoint64def('$'+address_conv(get_ibyte(iFileHandle,(i+4),4),false),-1); //82ff1234->2FB1234
rom_mod_start:=rom_in+84;
rom_end:=get_ibyte(iFileHandle,(rom_in+12),4);
num_mod:=strtoint64def('$'+get_ibyte(iFileHandle,rom_in+16,4),-1);
num_filent:=strtoint64def('$'+get_ibyte(iFileHandle,rom_in+48,4),-1);
now_address:=(rom_in+84+longword(32*num_mod)+longword(28*num_filent));//文件指针区尾地址
//ROM信息
StaticText1.Caption:=' 文件大小:'+inttostr(rom_size)+#13
+' 文件总数:'+ inttostr(num_mod+num_filent)
+' [M:'+inttostr(num_mod)
+' / F:'+inttostr(num_filent)+']';
if debug then op_log('不增加ROM长度可增加Filent文件数:'+inttostr((rom_size-16-now_address) div 28));
{i:= (rom_mod_start-4); //找文件指针区的最后空位
Repeat
i:=i+4;
Until ((get_ibyte(iFileHandle,i,4)='00000000') or (i >=iFileLength));
//if i>=(iFileLength-44) then }
result:=0;
end;
finally
FileClose(iFileHandle);
end;
end;
end;
end;
function del_f_file(iFileHandle:integer;File_name:string):integer;
var
i,j:int64;
nadd,fadd:string;//name&file address
fsize:integer;
s:string;
Buffer,Buffer_0:Pbyte;
irow:integer;
begin
result:=0; //是否处理
i:=rom_in+84+longword(32*num_mod)+longword(28*num_filent);//Filent文件指针结束
j:=num_filent;
repeat
begin
//application.ProcessMessages;
nadd:=address_conv(get_ibyte(iFileHandle,i-8,4),false);
s:=getname(iFileHandle,nadd);
i:=i-28;
j:=j-1;
end;
Until (j<=1) or (File_name=s);
if File_name=s then
begin
fsize:=strtointdef('$'+get_ibyte(iFileHandle,i+16,4),0);
fadd:=address_conv(get_ibyte(iFileHandle,i+24,4),false);
j:=Fileseek(iFileHandle,0,2)-(i+28);//后面文件指针长度
Buffer_0:=Allocmem(256);
Buffer:=Allocmem(j+29);
try
//清除文件名
Fileseek(iFileHandle,strtoint64def('$'+nadd,0),0);
Filewrite(iFileHandle,Buffer_0^,length(s));//name
//清除文件指针
Fileseek(iFileHandle,i+28,0);
FileRead(iFileHandle,Buffer^,j); //copy
Fileseek(iFileHandle,i,0);
Filewrite(iFileHandle,Buffer^,j+28); //paste
//改文件数
num_filent:=num_filent-1;//file number
FileSeek(iFileHandle,rom_in+48,0);
FileWrite(iFileHandle,num_filent, sizeof(num_filent));
//清除数据
Freemem(Buffer);///
Buffer:=Allocmem(fsize+1);//delete data
FileSeek(iFileHandle,strtoint64def('$'+fadd,0),0);
FileWrite(iFileHandle,Buffer^, fsize);
with Form1 do
begin
op_log('文件"'+File_name+'"已删除!');
for irow:=0 to ListView1.Items.Count-1 Do
if ListView1.Items[irow].Caption = s then
begin
ListView1.Items.Item[irow].Delete; //删除当前选中行
break;
end else Button5.Click;
end;
result:=1;
finally
Freemem(Buffer_0);
Freemem(Buffer);
end;
end;
end;
function del_m_file(iFileHandle:integer;File_name:string):integer;
var
i,j:int64;
nadd,fadd:string;//name&file address
struct_num_add,struct_add:string;
fsize,istruct:integer;
s:string;
Buffer,Buffer_0:Pbyte;
s1,n1,n2:string;
irow:integer;
begin
result:=0; //是否处理
i:=rom_in+84+longword(32*num_mod);//+longword(28*num_filent);//Filent文件指针结束
j:=num_mod;
repeat
begin
//application.ProcessMessages;
nadd:=address_conv(get_ibyte(iFileHandle,i-16,4),false);
//获取块数
struct_num_add:=address_conv(get_ibyte(iFileHandle,i-12,4),false);
FileSeek(iFileHandle,(strtointdef('$'+struct_num_add,-1)),0);
FileRead(iFileHandle, istruct, 1);
struct_add:=address_conv(get_ibyte(iFileHandle,i-8,4),false);
s:=getname(iFileHandle,nadd);
s1:=get_ibyte(iFileHandle,strtoint64def('$'+struct_add,0),24*istruct);//读struct块数据
i:=i-32;
j:=j-1;
end;
Until (j<=1) or (File_name=s);
if File_name=s then
begin
//fsize:=strtointdef('$'+get_ibyte(iFileHandle,i+16,4),0);
//fadd:=get_ibyte(iFileHandle,i+24,4);
j:=Fileseek(iFileHandle,0,2)-(i+32);//后面文件指针长度
Buffer_0:=Allocmem(256);
Buffer:=Allocmem(j+33);
try
//清除文件名
Fileseek(iFileHandle,strtoint64def('$'+nadd,0),0);
Filewrite(iFileHandle,Buffer_0^,length(s));//name
//清除struct段
Fileseek(iFileHandle,strtoint64def('$'+struct_add,0),0);//定位到Struct地址
Filewrite(iFileHandle,Buffer_0^,24*istruct);
//清除struct_num段
Fileseek(iFileHandle,strtoint64def('$'+struct_num_add,0),0);//定位到Struct_num地址
Filewrite(iFileHandle,Buffer_0^,108);//段长为6C=108
//清除文件指针
Fileseek(iFileHandle,i+32,0);
FileRead(iFileHandle,Buffer^,j); //copy
Fileseek(iFileHandle,i,0);
Filewrite(iFileHandle,Buffer^,j+32); //paste 多写32位0
//改文件数
num_mod:=num_mod-1;//file number
FileSeek(iFileHandle,rom_in+16,0);
FileWrite(iFileHandle,num_mod, sizeof(num_mod));
//清除各块数据
while istruct>0 do
begin
fadd:=address_conv(copy(s1,48*(istruct-1)+17,8),false);
n1:=copy(s1,48*(istruct-1)+41,8);
n2:=copy(s1,48*(istruct-1)+25,8);
if n1>n2 then fsize:=strtointdef('$'+n2,0) else fsize:=strtointdef('$'+n1,0);//以小Size的计算结束地址
Freemem(Buffer);///
Buffer:=Allocmem(fsize+1);
Fileseek(iFileHandle,strtoint64def('$'+fadd,0),0);
Filewrite(iFileHandle,Buffer^,fsize);
with Form1 do//删除列表中信息
for irow:=ListView1.Items.Count-1 downto 0 Do
if ListView1.Items[irow].Caption=(' '+File_name+'_'+inttostr(istruct-1)) then
begin
ListView1.Items.Item[irow].Delete; //删除当前选中行
break;
end;
//if FindRow(' '+File_name+'_'+inttostr(istruct-1),irow)=true then DeleteRow(irow);
istruct:=istruct-1;
end;
begin
op_log('模块文件"'+File_name+'"已删除!');
with Form1 do
for irow:=ListView1.Items.Count-1 downto 0 Do
if ListView1.Items[irow].Caption=s then
begin
ListView1.Items.Item[irow].Delete; //删除当前选中行
break;
end else Button5.Click;
end;
result:=1;
finally
Freemem(Buffer_0);
Freemem(Buffer);
end;
end;
end;
function CustomSortProc(Item1,Item2:TListItem;ParamSort:Integer):integer;stdcall;//stdcall声明一定要
var
txt1,txt2:String;
n1,n2:integer;
begin
case ParamSort of
-1:begin//定义用于ListView2的大小排列
n1:= strtointdef(Item1.Caption,0);
n2:= strtointdef(Item2.Caption,0);
if m_bSort then
begin
Result:=n1-n2;
end
else
begin
Result:=n2-n1;
end;
end;
0: begin
if m_bSort then
begin
Result:=CompareText(Item1.Caption,Item2.Caption);
end
else
begin
Result:=-CompareText(Item1.Caption,Item2.Caption);
end;
end;
3,4:
begin
n1:= strtointdef(Item1.SubItems.Strings[ParamSort-1],0);
n2:= strtointdef(Item2.SubItems.Strings[ParamSort-1],0);
if m_bSort then
begin
Result:=n1-n2;
end
else
begin
Result:=n2-n1;
end;
end;
else
begin
txt1:= Item1.SubItems.Strings[ParamSort-1];
txt2:= Item2.SubItems.Strings[ParamSort-1];
if m_bSort then
begin
Result:=CompareText(txt1,txt2);
end
else
begin
Result:=-CompareText(txt1,txt2);
end;
end;
end
end;
{function CheckData0(iFileHandle:integer;iStartAddress:int64;iSize:Integer):integer;
var
Buffer:pChar;
i:integer;
begin
result:=1;
Buffer := Pchar(AllocMem(iSize+1));
FileSeek(iFileHandle,iStartAddress,0);
FileRead(iFileHandle, Buffer^, iSize);
for i:=0 to iSize-1 do
begin
if (Buffer[i]<>#0) then
begin
result:=0;
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -