⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unit1.pas

📁 This use unusual method for calculate binary array from motorola phones
💻 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 + -