📄 unit1.pas
字号:
unit Unit1;
interface
uses
Windows, P2KApi3, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TBytes=array[1..8] of Byte;
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
GroupBox1: TGroupBox;
Label3: TLabel;
GroupBox2: TGroupBox;
Edit2: TEdit;
Label4: TLabel;
Label5: TLabel;
Edit5: TEdit;
Button3: TButton;
Button2: TButton;
Button4: TButton;
Button5: TButton;
Label1: TLabel;
Label2: TLabel;
Label6: TLabel;
RadioGroup1: TRadioGroup;
Button6: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure Button6Click(Sender: TObject);
private
PhoneConn,FlashConn,IsInProgress:Boolean;
FlashIfName:string;
procedure PwrDown;
public
procedure SetPhoneConn(IfId:Integer;IfName:string);
end;
var
Form1: TForm1;
implementation
var rd:byte;
{$R *.dfm}
function HexToInt(s: string): Longword;
var
b: Byte;
c: Char;
begin
Result := 0;
s := UpperCase(s);
for b := 1 to Length(s) do
begin
Result := Result * 16;
c := s[b];
case c of
'0'..'9': Inc(Result, Ord(c) - Ord('0'));
'A'..'F': Inc(Result, Ord(c) - Ord('A') + 10);
// else
// raise EConvertError.Create('No Hex-Number');
end;
end;
end;
procedure P2KCallback(Status:Integer; lpszIFName:PChar);stdcall;
begin
Form1.SetPhoneConn(Status,lpszIFName);
end;
procedure TForm1.SetPhoneConn(IfId:Integer; IfName:string);
begin
if IfId<>0 then begin
Label3.Caption:='Connected: '+IfName;
Memo1.Lines.Append('Ready to read...');
Button3.Enabled:=true;
Button1.Enabled:=true;
end
else begin
Label3.Caption:='Not Connected';
Button3.Enabled:=false;
Button1.Enabled:=false;
end;
PhoneConn:=IfId<>0;
FlashConn:=IfId=2;
if FlashConn then FlashIFName:=IfName
else FlashIfName:='';
end;
procedure TForm1.PwrDown;
var
Size: Cardinal;
OutData:array[0..1023] of Char;
begin
Size:=1024;
Flash_SendCmd('POWER_DOWN',nil,0,OutData,Size,200);
end;
function RQRC(startaddr,endaddr:integer):string;
var
Size: Cardinal;
OutData:array[0..1023] of Char;
begin
Size:=1024;
Flash_SendCmd('RQRC',PChar(IntToHex(startaddr,8)+','+IntToHex(endaddr,8)),17,OutData,Size,10000);
RQRC:=copy(String(OutData),7,4);
end;
function setlength(str:string;len:integer):string;
var i:integer;
begin
for i:=1 to len-Length(str) do str:=str+' ';
result:=str;
end;
{function loging(addr:integer;buffer:array of Byte;len:integer):string;
var
i,j,k:integer;
s:string;
begin
result:='';
for i:=0 to ((len+15) div 16)-1 do begin
result:=result+IntToHex(addr+i*16,8)+' | ';
for j:=0 to 15 do begin
if(len>=i*16+j+1)then s:=s+IntToHex(buffer[i*16+j],2)+' '
else s:=s+' ';
end;
result:=result+s+'| ';
s:='';
for j:=0 to 15 do begin
if(len>=i*16+j+1)then
if(32<=buffer[i*16+j])and(buffer[i*16+j]<128)then result:=result+char(buffer[i*16+j])
else result:=result+'.';
end;
if(i<>((len+15+1) div 16)-1)then result:=result+#13+#10;
s:='';
end;
end; }
function loging(addr:integer;buffer:array of Byte;len:integer):string;
var
i,j,k:integer;
adr,pat,str:string;
begin
result:='';
i:=0;j:=0;k:=0;adr:='';pat:='';str:='';
if((len) mod 16 = 0)then k:=len div 16
else k:=len div 16 + 1;
for i:=0 to 63 do begin
adr:=IntToHex(addr+i*16,8);
for j:=0 to 15 do begin
if(len>=i*16+j+1)then pat:=pat+IntToHex(buffer[i*16+j],2)+' '
else pat:=pat+' ';
end;
for j:=0 to 15 do begin
if(len>=i*16+j+1)then
if(32<=buffer[i*16+j])and(buffer[i*16+j]<128)then str:=str+char(buffer[i*16+j])
else str:=str+'.';
end;
result:=result+adr+' | '+pat+'| '+str;
if(i<>k-1)then result:=result+#13+#10;
pat:='';
str:='';
end;
i:=0;j:=0;k:=0;adr:='';pat:='';str:='';
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
P2K3_Init(@P2KCallback);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
PwrDown;
end;
procedure TForm1.Button3Click(Sender: TObject);
var i,d,u,j,s0,a:integer;
r:Longword;
Size,ls: Cardinal;
startaddr,readsize,endaddr:integer;
h,y,ss,k:string;
p:byte;
t:array[0..0] of byte;
r1:array[0..1023] of Char;
b:array[0..1023] of byte;
s:array[0..1024] of integer;
F:file of byte;
time:Cardinal;
this_cs,last_cs:integer;
begin
//--------------------------------------------------
AssignFile(F,Edit2.Text+'.bin');
Rewrite(F);
Size:=1024;
startaddr:=HexToInt(Edit2.Text);
readsize:=HexToInt(Edit5.Text);
endaddr:=startaddr+readsize;
a:=startaddr;
time:=GetTickCount;
Caption:='[Reading] RQRC Memory Dumper (c) 2008 DmT & motoprogger';
Application.Title:=Caption;
rd:=0;
Button3.Enabled:=false;
Button4.Enabled:=true;
Button5.Enabled:=true;
y:='';
j:=1;
//--------------------------------------------------
Memo1.Lines.Append('Start dumping memory from '+IntToHex(startaddr,8)+' to '+IntToHex(startaddr+readsize,8));
//==================================================
if(RadioGroup1.ItemIndex=0)then begin
for i:=0 to readsize-1 do begin
while true do begin
Application.ProcessMessages;
if (rd=0)or(rd=2)then break;
end;
if rd=2 then break;
Caption:='[Reading: '+IntToStr(round((i/readsize)*100))+'%] RQRC Memory Dumper (c) 2008 DmT & motoprogger';
Application.Title:=Caption;
d:=startaddr+i;
u:=startaddr+i+1024;
h:=RQRC(d,u+1);
r:=HexToInt(h);
h:=RQRC(d+1,u+1);
r:=r-HexToInt(h);
p:=r;
if(i=0)or(i mod 16 <> 0)then begin
if(32<=p)and(p<128)then ss:=ss+String(char(p))
else ss:=ss+'.';
y:=y+' '+IntToHex(p,2);
end
else j:=1;
if((i<>0)and(i mod 16 = 0))or(i+1=readsize)then begin
Memo1.Lines.Append(copy(IntToHex(d-16,8),1,7)+'0 |'+setlength(y,48)+' | '+ss);
y:='';
ss:='';
end;
if(j=1)then begin
j:=0;
if(32<=p)and(p<128)then ss:=ss+String(char(p))
else ss:=ss+'.';
y:=y+' '+IntToHex(p,2);
end;
t[0]:=r;
BlockWrite(F,t,1,ls);
Label1.Caption:='Uptime: '+IntToStr(trunc((GetTickCount-time)/1000))+' sec.';
Label2.Caption:='Dump size: '+FloatToStr(trunc(1000*i/1024)/1000)+' KB.';
Label6.Caption:='Speed: '+FloatToStr(trunc( i/((GetTickCount-time+1)/100000) )/100)+' b/sec.';
end;
end
else begin
//==================================================
for i:=0 to 1024 do begin
Application.ProcessMessages;
s[i]:=HexToInt(RQRC(a+i,a+2048));
end;
//--------------------------------------------------
for i:=0 to 1023 do begin
b[i]:=s[i]-s[i+1];
end;
if(readsize<1024)then begin
BlockWrite(F,b,readsize,ls);
Memo1.Lines.Append(loging(startaddr,b,readsize));
end
else begin
BlockWrite(F,b,1024,ls);
Memo1.Lines.Append(loging(startaddr,b,1024));
//--------------------------------------------------
//last_cs:=HexToInt(RQRC(a,a+1024));
last_cs:=b[0]+HexToInt(RQRC(a-1023,a));
a:=a+1024;
while a<endaddr do begin
for i:=0 to 1023 do begin
while true do begin
Application.ProcessMessages;
if (rd=0)or(rd=2)then break;
end;
if rd=2 then break;
Caption:='[Reading: '+IntToStr(round((((j*1024)+i+1)/readsize)*100))+'%] RQRC Memory Dumper (c) 2008 DmT & motoprogger';
Application.Title:=Caption;
if((j*1024)+i+1=readsize)then break;
this_cs:=HexToInt(RQRC(a+i-1023,a+i+1));
b[i]:=b[i]+byte(this_cs-last_cs);
last_cs:=this_cs;
Label1.Caption:='Uptime: '+IntToStr(trunc((GetTickCount-time)/1000))+' sec.';
Label2.Caption:='Dump size: '+FloatToStr(trunc(1000*((j*1024)+i+1)/1024)/1000)+' KB.';
Label6.Caption:='Speed: '+FloatToStr(trunc( ((j*1024)+i+1)/((GetTickCount-time+1)/100000) )/100)+' b/sec.';
end;
if rd=2 then break;
inc(j);
Memo1.Lines.Append(loging(a,b,i+1));
a:=a+1024;
BlockWrite(F,b,i+1,ls);
end;
end;
//==================================================
end;
//--------------------------------------------------
Button3.Enabled:=true;
Button4.Enabled:=false;
Button5.Enabled:=false;
Caption:='RQRC Memory Dumper (c) 2008 DmT & motoprogger';
Application.Title:=Caption;
time:=GetTickCount-time;
Memo1.Lines.Append('End of dump');
Memo1.Lines.Append('In time: '+FloatToStr(round(time/10)/100)+' sec.');
Memo1.Lines.Append('Speed: '+IntToStr(round((readsize+1)/(time/1000)))+' b/sec.');
//--------------------------------------------------
//ShowMessage('The file cannot be rewritten.\nProbably it is already in use.');
CloseFile(F);
//--------------------------------------------------
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Memo1.Clear;
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
rd:=2;
end;
procedure TForm1.Button5Click(Sender: TObject);
begin
rd:=abs(rd-1);
end;
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
rd:=2;
end;
procedure TForm1.Button6Click(Sender: TObject);
var a,s0,i,j:integer;
F:file of byte;
b:array[0..1023] of byte;
s:array[0..1023] of integer;
ls:Cardinal;
startaddr,endaddr,readsize:integer;
this_cs,last_cs:integer;
begin
//--------------------------------------------------
AssignFile(F,Edit2.Text+'.bin');
Rewrite(F);
a:=HexToInt(Edit2.Text);
startaddr:=HexToInt(Edit2.Text);
readsize:=HexToInt(Edit5.Text);
endaddr:=startaddr+readsize;
j:=1;
//--------------------------------------------------
//--------------------------------------------------
s0:=HexToInt(RQRC(a,a+2048));
//--------------------------------------------------
for i:=1 to 1023 do begin
s[i-1]:=HexToInt(RQRC(a+i,a+2048));
end;
//--------------------------------------------------
b[0]:=s0-s[0];
for i:=1 to 1023 do begin
b[i]:=s[i-1]-s[i];
end;
if(readsize>=1024)then BlockWrite(F,b,1024,ls)
else BlockWrite(F,b,readsize,ls);
//--------------------------------------------------
a:=a+1024;
while a<endaddr do begin
for i:=0 to 1023 do begin
if((j*1024)+i+1=readsize)then break;
this_cs:=HexToInt(RQRC(a+i-1023,a+i+1));
b[i]:=b[i]+byte(this_cs-last_cs);
last_cs:=this_cs;
end;
inc(j);
a:=a+1024;
BlockWrite(F,b,i+1,ls);
end;
//--------------------------------------------------
CloseFile(F);
//--------------------------------------------------
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -