Ver código fonte

+ implemented reading of SEGDEF omf records

git-svn-id: trunk@30969 -
nickysn 10 anos atrás
pai
commit
5539d6366f
1 arquivos alterados com 75 adições e 4 exclusões
  1. 75 4
      compiler/ogomf.pas

+ 75 - 4
compiler/ogomf.pas

@@ -125,6 +125,7 @@ interface
         FRawRecord: TOmfRawRecord;
 
         function ReadLNames(RawRec: TOmfRawRecord): Boolean;
+        function ReadSegDef(RawRec: TOmfRawRecord; objdata:TObjData): Boolean;
 
         property LNames: TOmfOrderedNameCollection read FLNames;
       public
@@ -895,7 +896,7 @@ implementation
                                TOmfObjInput
 ****************************************************************************}
 
-        function TOmfObjInput.ReadLNames(RawRec: TOmfRawRecord): Boolean;
+    function TOmfObjInput.ReadLNames(RawRec: TOmfRawRecord): Boolean;
       var
         LNamesRec: TOmfRecord_LNAMES;
       begin
@@ -907,6 +908,77 @@ implementation
         Result:=True;
       end;
 
+    function TOmfObjInput.ReadSegDef(RawRec: TOmfRawRecord; objdata: TObjData): Boolean;
+      var
+        SegDefRec: TOmfRecord_SEGDEF;
+        SegmentName,SegClassName,OverlayName: string;
+        SecAlign: ShortInt;
+        secoptions: TObjSectionOptions;
+        objsec: TOmfObjSection;
+      begin
+        Result:=False;
+        SegDefRec:=TOmfRecord_SEGDEF.Create;
+        SegDefRec.DecodeFrom(RawRec);
+        if (SegDefRec.SegmentNameIndex<1) or (SegDefRec.SegmentNameIndex>LNames.Count) then
+          begin
+            InputError('Segment name index out of range');
+            SegDefRec.Free;
+            exit;
+          end;
+        SegmentName:=LNames[SegDefRec.SegmentNameIndex];
+        if (SegDefRec.ClassNameIndex<1) or (SegDefRec.ClassNameIndex>LNames.Count) then
+          begin
+            InputError('Segment class name index out of range');
+            SegDefRec.Free;
+            exit;
+          end;
+        SegClassName:=LNames[SegDefRec.ClassNameIndex];
+        if (SegDefRec.OverlayNameIndex<1) or (SegDefRec.OverlayNameIndex>LNames.Count) then
+          begin
+            InputError('Segment overlay name index out of range');
+            SegDefRec.Free;
+            exit;
+          end;
+        OverlayName:=LNames[SegDefRec.OverlayNameIndex];
+        case SegDefRec.Alignment of
+          saRelocatableByteAligned:
+            SecAlign:=1;
+          saRelocatableWordAligned:
+            SecAlign:=2;
+          saRelocatableParaAligned:
+            SecAlign:=16;
+          saRelocatableDWordAligned:
+            SecAlign:=4;
+          saRelocatablePageAligned:
+            begin
+              InputError('Page segment alignment not supported');
+              SegDefRec.Free;
+              exit;
+            end;
+          saAbsolute:
+            begin
+              InputError('Absolute segment alignment not supported');
+              SegDefRec.Free;
+              exit;
+            end;
+          saNotSupported,
+          saNotDefined:
+            begin
+              InputError('Invalid (unsupported/undefined) OMF segment alignment');
+              SegDefRec.Free;
+              exit;
+            end;
+        end;
+        secoptions:=[];
+        objsec:=TOmfObjSection(objdata.createsection(SegmentName,SecAlign,secoptions,false));
+        objsec.FClassName:=SegClassName;
+        objsec.FOverlayName:=OverlayName;
+        objsec.FCombination:=SegDefRec.Combination;
+        objsec.FUse:=SegDefRec.Use;
+        SegDefRec.Free;
+        Result:=True;
+      end;
+
     constructor TOmfObjInput.create;
       begin
         inherited create;
@@ -966,9 +1038,8 @@ implementation
               if not ReadLNames(FRawRecord) then
                 exit;
             RT_SEGDEF,RT_SEGDEF32:
-              begin
-                {todo}
-              end;
+              if not ReadSegDef(FRawRecord,objdata) then
+                exit;
             RT_GRPDEF:
               begin
                 {todo}