Browse Source

+ implemented writing .com files in the i8086-msdos internal linker

git-svn-id: trunk@31374 -
nickysn 10 years ago
parent
commit
78cbb1ba2b
1 changed files with 51 additions and 8 deletions
  1. 51 8
      compiler/ogomf.pas

+ 51 - 8
compiler/ogomf.pas

@@ -267,6 +267,8 @@ interface
         procedure CalcExeGroups;
         procedure CalcSegments_MemBasePos;
         procedure WriteMap_SegmentsAndGroups;
+        function writeExe:boolean;
+        function writeCom:boolean;
         property ExeUnifiedLogicalSegments: TFPHashObjectList read FExeUnifiedLogicalSegments;
         property ExeUnifiedLogicalGroups: TFPHashObjectList read FExeUnifiedLogicalGroups;
         property MZFlatContentSection: TMZExeSection read GetMZFlatContentSection;
@@ -1996,6 +1998,51 @@ implementation
         exemap.Add('');
       end;
 
+    function TMZExeOutput.writeExe: boolean;
+      var
+        Header: TMZExeHeader;
+      begin
+        Result:=False;
+        Header:=TMZExeHeader.Create;
+        {todo: fill header data}
+        Header.WriteTo(FWriter);
+        Header.Free;
+        Result:=True;
+      end;
+
+    function TMZExeOutput.writeCom: boolean;
+      const
+        ComFileOffset=$100;
+      var
+        i: Integer;
+        ExeSec: TMZExeSection;
+        ObjSec: TOmfObjSection;
+        StartDataPos: LongWord;
+        buf: array [0..1023] of byte;
+        bytesread: LongWord;
+      begin
+        ExeSec:=MZFlatContentSection;
+        for i:=0 to ExeSec.ObjSectionList.Count-1 do
+          begin
+            ObjSec:=TOmfObjSection(ExeSec.ObjSectionList[i]);
+            FWriter.WriteZeros(max(0,ObjSec.MemPos-ComFileOffset-FWriter.Size));
+            if assigned(ObjSec.Data) then
+              begin
+                if ObjSec.MemPos<ComFileOffset then
+                  begin
+                    ObjSec.Data.seek(ComFileOffset-ObjSec.MemPos);
+                    repeat
+                      bytesread:=ObjSec.Data.read(buf,sizeof(buf));
+                      if bytesread<>0 then
+                        FWriter.write(buf,bytesread);
+                    until bytesread=0;
+                  end
+                else
+                  FWriter.writearray(ObjSec.Data);
+              end;
+          end;
+      end;
+
     procedure TMZExeOutput.DoRelocationFixup(objsec: TObjSection);
       var
         i: Integer;
@@ -2041,15 +2088,11 @@ implementation
       end;
 
     function TMZExeOutput.writeData: boolean;
-      var
-        Header: TMZExeHeader;
       begin
-        Result:=False;
-        Header:=TMZExeHeader.Create;
-        {todo: fill header data}
-        Header.WriteTo(FWriter);
-        Header.Free;
-        Result:=True;
+        if apptype=app_com then
+          Result:=WriteCom
+        else
+          Result:=WriteExe;
       end;
 
     constructor TMZExeOutput.create;