source: branches/AVR/UIntelHexFile.pas

Last change on this file was 1, checked in by george, 15 years ago
  • Přidáno: Větve AVR a Z80.
File size: 2.1 KB
Line 
1unit UIntelHexFile;
2
3interface
4
5uses
6 UTextFileStream, SysUtils;
7
8type
9 TArrayofByte = array of Byte;
10
11 TIntelHexFile = class(TTextFileStream)
12 public
13 function ReadContent: TArrayOfByte;
14 end;
15
16
17implementation
18
19{ TIntelHexFile }
20
21function TIntelHexFile.ReadContent: TArrayOfByte;
22var
23 Row: string;
24 DataCount: Byte;
25 RecordType: Byte;
26 I: Integer;
27 CRC: Byte;
28 ComputedCRC: Byte;
29 Address: Word;
30 SegmentAddress: Word;
31 ExtendedAddress: Word;
32 EndOfFile: Boolean;
33
34function SplitString(var Text: string; Count: Word): string;
35begin
36 Result := Copy(Text, 1, Count);
37 Delete(Text, 1, Count);
38end;
39
40begin
41 ExtendedAddress := 0;
42 SegmentAddress := 0;
43 EndOfFile := False;
44 repeat
45 ComputedCRC := 0;
46 Row := ReadLn;
47 if SplitString(Row, 1) <> ':' then raise Exception.Create('File corrupted');
48 for I := 0 to (Length(Row) div 2) - 2 do
49 ComputedCRC := ComputedCRC + StrToInt('$' + Row[I * 2 + 1] + Row[I * 2 + 2]);
50 ComputedCRC := not (ComputedCRC ) + 1;
51
52 DataCount := StrToInt('$' + SplitString(Row, 2));
53 Address := StrToInt('$' + SplitString(Row, 4)) + (SegmentAddress shl 4) +
54 (ExtendedAddress shl 16);
55 RecordType := StrToInt('$' + SplitString(Row, 2));
56 case RecordType of
57 0: begin // Data
58 if Length(Result) < (Address + DataCount) then
59 SetLength(Result, Address + DataCount);
60 for I := 0 to DataCount - 1 do begin
61 Result[Address + I] := StrToInt('$' + SplitString(Row, 2));
62 end;
63 end;
64 1: begin // End-of-file
65 EndOfFile := True;
66 end;
67 2: begin // Segment address
68 SegmentAddress := StrToInt('$' + SplitString(Row, 4));
69 ExtendedAddress := 0;
70 end;
71 4: begin // Linear extended address
72 ExtendedAddress := StrToInt('$' + SplitString(Row, 4));
73 SegmentAddress := 0;
74 end;
75 end;
76 CRC := StrToInt('$' + SplitString(Row, 2));
77 if CRC <> ComputedCRC then raise Exception.Create('Checksum error');
78 until Eof or EndOfFile;
79end;
80
81end.
Note: See TracBrowser for help on using the repository browser.