mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-11 11:46:04 +02:00
+ added class for encoding a SEGDEF(32) omf record
git-svn-id: trunk@30406 -
This commit is contained in:
parent
7f34ab27d2
commit
65212e7a34
@ -118,6 +118,7 @@ interface
|
||||
scStack = 5,
|
||||
scCommon = 6,
|
||||
scPublic7 = 7); { same as scPublic }
|
||||
TOmfSegmentUse = (suUse16, suUse32);
|
||||
|
||||
{ TOmfOrderedNameCollection }
|
||||
|
||||
@ -152,6 +153,9 @@ interface
|
||||
function ReadStringAt(Offset: Integer; out s: string): Integer;
|
||||
function WriteStringAt(Offset: Integer; s: string): Integer;
|
||||
|
||||
function ReadIndexedRef(Offset: Integer; out IndexedRef: Integer): Integer;
|
||||
function WriteIndexedRef(Offset: Integer; IndexedRef: Integer): Integer;
|
||||
|
||||
procedure CalculateChecksumByte;
|
||||
function VerifyChecksumByte: boolean;
|
||||
property ChecksumByte: Byte read GetChecksumByte write SetChecksumByte;
|
||||
@ -218,6 +222,35 @@ interface
|
||||
property NextIndex: Integer read FNextIndex write FNextIndex;
|
||||
end;
|
||||
|
||||
{ TOmfRecord_SEGDEF }
|
||||
|
||||
TOmfRecord_SEGDEF = class(TOmfParsedRecord)
|
||||
FAlignment: TOmfSegmentAlignment;
|
||||
FCombination: TOmfSegmentCombination;
|
||||
FUse: TOmfSegmentUse;
|
||||
FFrameNumber: Word;
|
||||
FOffset: Byte;
|
||||
FIs32Bit: Boolean;
|
||||
FSegmentLength: Int64; { int64, because it can be 2**32 }
|
||||
FSegmentNameIndex: Integer;
|
||||
FClassNameIndex: Integer;
|
||||
FOverlayNameIndex: Integer;
|
||||
public
|
||||
procedure DecodeFrom(RawRecord: TOmfRawRecord);override;
|
||||
procedure EncodeTo(RawRecord: TOmfRawRecord);override;
|
||||
|
||||
property Alignment: TOmfSegmentAlignment read FAlignment write FAlignment;
|
||||
property Combination: TOmfSegmentCombination read FCombination write FCombination;
|
||||
property Use: TOmfSegmentUse read FUse write FUse;
|
||||
property FrameNumber: Word read FFrameNumber write FFrameNumber;
|
||||
property Offset: Byte read FOffset write FOffset;
|
||||
property Is32Bit: Boolean read FIs32Bit write FIs32Bit;
|
||||
property SegmentLength: Int64 read FSegmentLength write FSegmentLength;
|
||||
property SegmentNameIndex: Integer read FSegmentNameIndex write FSegmentNameIndex;
|
||||
property ClassNameIndex: Integer read FClassNameIndex write FClassNameIndex;
|
||||
property OverlayNameIndex: Integer read FOverlayNameIndex write FOverlayNameIndex;
|
||||
end;
|
||||
|
||||
implementation
|
||||
|
||||
uses
|
||||
@ -299,6 +332,41 @@ implementation
|
||||
Move(s[1], RawData[Offset+1], Length(s));
|
||||
end;
|
||||
|
||||
function TOmfRawRecord.ReadIndexedRef(Offset: Integer; out IndexedRef: Integer): Integer;
|
||||
begin
|
||||
Result:=Offset+1;
|
||||
if result>RecordLength then
|
||||
internalerror(2015033103);
|
||||
IndexedRef:=RawData[Offset];
|
||||
if IndexedRef<=$7f then
|
||||
exit;
|
||||
Result:=Offset+2;
|
||||
if result>RecordLength then
|
||||
internalerror(2015033103);
|
||||
IndexedRef:=((IndexedRef and $7f) shl 8)+RawData[Offset+1];
|
||||
end;
|
||||
|
||||
function TOmfRawRecord.WriteIndexedRef(Offset: Integer; IndexedRef: Integer): Integer;
|
||||
begin
|
||||
if (IndexedRef<0) or (IndexedRef>$7FFF) then
|
||||
internalerror(2015040303);
|
||||
if IndexedRef<=$7f then
|
||||
begin
|
||||
Result:=Offset+1;
|
||||
if Result>High(RawData) then
|
||||
internalerror(2015033102);
|
||||
RawData[Offset]:=IndexedRef;
|
||||
end
|
||||
else
|
||||
begin
|
||||
Result:=Offset+2;
|
||||
if Result>High(RawData) then
|
||||
internalerror(2015033102);
|
||||
RawData[Offset]:=$80+(IndexedRef shr 8);
|
||||
RawData[Offset+1]:=Byte(IndexedRef);
|
||||
end;
|
||||
end;
|
||||
|
||||
function TOmfRawRecord.GetChecksumByte: Byte;
|
||||
begin
|
||||
if RecordLength>0 then
|
||||
@ -458,5 +526,67 @@ implementation
|
||||
NextIndex:=LastIncludedIndex+1;
|
||||
end;
|
||||
|
||||
{ TOmfRecord_SEGDEF }
|
||||
|
||||
procedure TOmfRecord_SEGDEF.DecodeFrom(RawRecord: TOmfRawRecord);
|
||||
begin
|
||||
if not (RawRecord.RecordType in [RT_SEGDEF,RT_SEGDEF32]) then
|
||||
internalerror(2015040301);
|
||||
Is32Bit:=RawRecord.RecordType=RT_SEGDEF32;
|
||||
|
||||
{TODO: implement the rest of the parsing}
|
||||
internalerror(2015040304);
|
||||
end;
|
||||
|
||||
procedure TOmfRecord_SEGDEF.EncodeTo(RawRecord: TOmfRawRecord);
|
||||
var
|
||||
B: Byte;
|
||||
Big: Boolean;
|
||||
NextOfs: Integer;
|
||||
begin
|
||||
if Is32Bit then
|
||||
begin
|
||||
RawRecord.RecordType:=RT_SEGDEF32;
|
||||
if SegmentLength>4294967296 then
|
||||
internalerror(2015040302);
|
||||
Big:=SegmentLength=4294967296;
|
||||
end
|
||||
else
|
||||
begin
|
||||
RawRecord.RecordType:=RT_SEGDEF;
|
||||
if SegmentLength>65536 then
|
||||
internalerror(2015040302);
|
||||
Big:=SegmentLength=65536;
|
||||
end;
|
||||
RawRecord.RawData[0]:=(Ord(Alignment) shl 5) or (Ord(Combination) shl 2) or (Ord(Big) shl 1) or Ord(Use);
|
||||
NextOfs:=1;
|
||||
if Alignment=saAbsolute then
|
||||
begin
|
||||
RawRecord.RawData[1]:=Byte(FrameNumber);
|
||||
RawRecord.RawData[2]:=Byte(FrameNumber shr 8);
|
||||
RawRecord.RawData[3]:=Offset;
|
||||
NextOfs:=4;
|
||||
end;
|
||||
if Is32Bit then
|
||||
begin
|
||||
RawRecord.RawData[NextOfs]:=Byte(SegmentLength);
|
||||
RawRecord.RawData[NextOfs+1]:=Byte(SegmentLength shr 8);
|
||||
RawRecord.RawData[NextOfs+2]:=Byte(SegmentLength shr 16);
|
||||
RawRecord.RawData[NextOfs+3]:=Byte(SegmentLength shr 24);
|
||||
Inc(NextOfs,4);
|
||||
end
|
||||
else
|
||||
begin
|
||||
RawRecord.RawData[NextOfs]:=Byte(SegmentLength);
|
||||
RawRecord.RawData[NextOfs+1]:=Byte(SegmentLength shr 8);
|
||||
Inc(NextOfs,2);
|
||||
end;
|
||||
NextOfs:=RawRecord.WriteIndexedRef(NextOfs,SegmentNameIndex);
|
||||
NextOfs:=RawRecord.WriteIndexedRef(NextOfs,ClassNameIndex);
|
||||
NextOfs:=RawRecord.WriteIndexedRef(NextOfs,OverlayNameIndex);
|
||||
RawRecord.RecordLength:=NextOfs+1;
|
||||
RawRecord.CalculateChecksumByte;
|
||||
end;
|
||||
|
||||
|
||||
end.
|
||||
|
Loading…
Reference in New Issue
Block a user