DataMuseum.dk

Presents historical artifacts from the history of:

DANOSI

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DANOSI

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦a654a290c⟧ TextFile

    Length: 45130 (0xb04a)
    Types: TextFile
    Names: »P450.PAS«

Derivation

└─⟦02956c927⟧ Bits:30010510 DVBS1.SW2114.src.2.14-1 SW2114 REAL #1/4 TIME PASCAL SOURCE REL 2.14
    └─⟦this⟧ »RTP\P450.PAS« 
└─⟦4f587ad96⟧ Bits:30010518 DVBS1.SW2114.src.2.7-1 SW2114 1/4 Real Time Pascal 2.7 92.06.16
    └─⟦this⟧ »RTP\P450.PAS« 
└─⟦a2a9e188c⟧ Bits:30010526 DVBS1.SW2114.src.2.6-4 RTP Compiler Source SW2104+SW2114 Disk 1 92.02.03 HEJ HHA
    └─⟦this⟧ »RTP\P450.PAS« 
└─⟦b607d6035⟧ Bits:30010532 RTP compiler Source 1 2.14 26/9(?)-92 DVBS1.SW2114.src.2.14-8
    └─⟦this⟧ »P450.PAS« 
└─⟦fd2665794⟧ Bits:30010523 DVBS1.SW2114.src.2.6-1 RTP compiler source SW2104+SW2114 Disk#1 30/1-92 HHA
    └─⟦this⟧ »RTP\P450.PAS« 

TextFile

     PROCEDURE GetTBinFile;\r
      BEGIN\r
        if filebufferindex = filebufferlast then\r
         BEGIN\r
         filebufferindex := 0;\r
         if eof(Tbinfile) then\r
          begin\r
            filebufferlast := 0;\r
            eoftbinfile := true;\r
          end\r
         else\r
          begin\r
           blockread(TBinFile,Filebufferptr^,lengthoffilebuffer,filebufferlast);\r
           if filebufferlast = 0 THEN\r
             eoftbinfile := true\r
           else\r
             eoftbinfile := false;\r
          end\r
         END;\r
\r
        if not eoftbinfile then\r
         begin\r
           filebufferindex := filebufferindex + 1;\r
           tbinfileptr := filebufferptr^[filebufferindex];\r
         end;\r
      END;\r
\r
\r
      PROCEDURE PutToCodeFile( x : Byte);\r
        (* x is written to CodeFile and checksum is updated *)\r
        BEGIN\r
          Put_Byte(x);\r
          CheckSum := (CheckSum + x ) MOD MaxByte;\r
        END;\r
\r
\r
      (* The following procedure writes on file CodeList *)\r
\r
      PROCEDURE WriteHexByte( x : integer );\r
        (* The procedure writes a hex byte to codefile *)\r
\r
        BEGIN\r
          write(CodeList,HexNumber[x DIV Max4Bit MOD Max4Bit]);\r
          write(CodeList,HexNumber[x MOD Max4Bit]);\r
\r
          CurrentPos := CurrentPos + 2;\r
        END;  (* WriteHexByte *)\r
\r
\r
      (*---------------------------------------------------------*)\r
\r
      PROCEDURE WriteHexWord(x : Word);\r
        (* The procedure writes a Hex word to CodeList *)\r
\r
      VAR\r
\r
      WordByte : RECORD\r
                   CASE Int : integer OF\r
                     1 : (i : Integer);\r
                     2 : (Byte1 : 0..255;\r
                          Byte2 : 0..255);\r
                     3 : (w : Word);\r
                 END;\r
               (* Used to convert a integer/Word to two bytes or two bytes\r
                  to a integer/Word *)\r
\r
\r
\r
        BEGIN\r
          WordByte.w := x;\r
          WriteHexByte(WordByte.Byte2);\r
          WriteHexByte(WordByte.Byte1);\r
\r
        END;  (* WriteHexWord *)\r
\r
\r
      (* ----------------------------------------------------------- *)\r
\r
\r
\r
\r
      PROCEDURE WriteSpace( x : integer);\r
        (* The procedure writes x spaces to CodeList *)\r
\r
        VAR\r
          i : integer;\r
\r
        BEGIN\r
          FOR i := 1 TO x DO\r
            write(CodeList,' ');\r
          CurrentPos := CurrentPos + x;\r
        END;  (* WriteSpace *)\r
\r
\r
\r
\r
      (* ---------------------------------------------------------- *)\r
\r
\r
\r
      PROCEDURE WriteLabel( Lab : St_elemptr);\r
        (* The procedure writes the label pointed to by lab to CodeList *)\r
\r
        VAR\r
          i : integer;\r
          Str : Ptr_string;\r
        BEGIN\r
          IF Lab^.St_Spix <> AnonymousSpix THEN\r
            BEGIN\r
              St_NameOfSpix(Lab^.St_Spix,Str);\r
              (*FOR i := 1 TO Str^.Length DO\r
                write(CodeList,Str^.Name[i]); *)\r
              (* TURBO *)\r
              write(CodeList,str^);\r
              write(CodeList,':');\r
            END\r
          ELSE\r
          BEGIN\r
            write(CodeList,'?',Lab^.MegaLabel_Offset,':');\r
          END;\r
\r
        END;  (* WriteLabel *)\r
\r
     PROCEDURE MegaPutInteger(ww : Longint);\r
     VAR w : array[0..4] of byte;\r
         i : integer;\r
         out : boolean;\r
     BEGIN\r
         for i := 0 To 4 do\r
           w[4 - i] := (ww SHR (7 * i)) AND 127;\r
         out := false;\r
         for i := 0 to 3 do\r
          begin\r
            out :=  Out or (w[i] <> 0)  or (w[i + 1] >= 64);\r
            if out then put_byte(128 + w[i]);\r
          end;\r
         put_byte(w[4]);\r
     END;\r
\r
     Procedure MegaPutIntegerValue(w:Longint);\r
     BEGIN\r
       Put_byte(117);\r
       MegaPutInteger(4);\r
       wordbyte.i := w;\r
       Put_byte(wordbyte.byte1);\r
       Put_byte(wordbyte.byte2);\r
       w := w SHR 16;\r
       wordbyte.i := w;\r
       Put_byte(wordbyte.byte1);\r
       Put_byte(wordbyte.byte2);\r
     END;\r
\r
     PROCEDURE MegaPutName(s: String);\r
     VAR i : Integer;\r
     BEGIN\r
       MegaPutInteger(length(s));\r
       FOR i := 1 TO Length(s) DO Put_byte(ORD(s[i]));\r
     END;\r
\r
     PROCEDURE MegaPutExtName(s: String);\r
     VAR i, j : Integer;\r
     BEGIN\r
       j := Length(s);\r
       FOR i := 1 TO Length(s) DO\r
         IF s[i] = '_' THEN j := j - 1;\r
       MegaPutInteger(j);\r
       FOR i := 1 TO Length(s) DO\r
        IF s[i] <> '_' THEN Put_byte(ORD(s[i]));\r
     END;\r
\r
     PROCEDURE MegaPutExt(VAR ext: String);\r
     VAR i : integer;\r
     BEGIN\r
       Put_byte(34);\r
       for i := 1 to Length(ext) do\r
         BEGIN\r
           IF (ord(ext[i]) >= ord('A')) AND (ord(ext[i]) <= ord('Z')) THEN\r
             ext[i] := chr(ord(ext[i]) - ord('A') + ord('a') );\r
         END;\r
       MegaPutExtName(ext);\r
     END;\r
\r
     PROCEDURE ReadRestSymLine;\r
     VAR Ch : char;\r
     BEGIN\r
         WHILE NOT eoln(TSymFile) DO\r
         BEGIN\r
           read(TSymFile,ch);\r
           write(CodeList,ch);\r
         END;\r
         readln(TSymFile);\r
         writeln(CodeList);\r
         CurrentPos := 0;\r
     END;\r
\r
     PROCEDURE MegaPutCallExt(Inst: CodeFormat;\r
                              Offz: Longint; ExtNo: Integer);\r
     VAR i : Integer;\r
         Noop : byte;\r
     BEGIN\r
       IF CodeOnPass2 THEN\r
       BEGIN\r
         WriteHexWord(Offset);\r
         WriteSpace(2);\r
       END;\r
\r
       If Inst = LongJump THEN Put_byte(0) ELSE Put_byte(9);\r
       MegaPutInteger(Offz);\r
       Put_byte(37);\r
       MegaPutInteger(ExtNo);\r
       Put_byte(117);\r
       MegaPutInteger(8);\r
       noop := MegaInstructionValue[mPFIX] AND 255;\r
       FOR i := 1 TO 8 DO Put_byte(noop);\r
       Offset := Offset + 8;\r
\r
       IF CodeOnPass2 THEN\r
       BEGIN\r
         WriteSpace(CodePos - CurrentPos);\r
         FOR i := 1 TO 4 DO WriteHexByte(noop);\r
         Writeln(Codelist);\r
         Currentpos := 0;\r
         WriteHexWord(Offset-4);\r
         WriteSpace(CodePos - CurrentPos);\r
         FOR i := 1 TO 4 DO WriteHexByte(noop);\r
         WriteSpace(CommentPos - CurrentPos + 1);\r
         ReadRestSymLine;\r
       END;\r
     END;\r
\r
     PROCEDURE MegaPutDefineExt(VAR routine: String; CodePos: Longint);\r
     VAR i: Integer;\r
         c : char;\r
     BEGIN\r
       Put_byte(45);\r
       for i := 1 to Length(routine) do\r
         BEGIN\r
           IF (ord(routine[i]) >= ord('A')) AND\r
              (ord(routine[i]) <= ord('Z')) THEN\r
             routine[i] := chr(ord(routine[i]) - ord('A') + ord('a') );\r
         END;\r
       MegaPutExtName(routine);\r
       MegaPutInteger(CodePos);\r
     END;\r
\r
     PROCEDURE MegaPutCode(CodeLength: Integer);\r
     VAR i, j, InstLength : Integer;\r
         ch : Char;\r
     BEGIN\r
       Put_byte(117);\r
       MegaPutInteger(CodeLength);\r
       i := 0;\r
       WHILE i < CodeLength DO\r
       BEGIN\r
         IF CodeOnPass2 THEN\r
         BEGIN\r
           WriteHexWord(Offset);\r
           WriteSpace(2);\r
           WriteSpace(CodePos - CurrentPos);\r
           Read(Tsymfile, InstLength);\r
           FOR j := 1 TO InstLength DO\r
           BEGIN\r
             GetTBinfile;\r
             WriteHexByte(Tbinfileptr);\r
             Put_byte(Tbinfileptr);\r
           END;\r
           WriteSpace(CommentPos - CurrentPos);\r
           ReadRestSymLine;\r
           i := i + InstLength;\r
           Offset := Offset +  InstLength;\r
         END ELSE\r
         BEGIN\r
           GetTBinfile;\r
           Put_byte(Tbinfileptr);\r
           i := i + 1;\r
           Offset := Offset + 1;\r
         END;\r
       END;\r
     END;\r
\r
     Procedure MegaPutPfixInst(Inst : Instruction; Value: Longint;\r
                             Var InstLength : Integer; minlength : integer);\r
     VAR Pfix : Pfix_type;\r
         i : Integer;\r
     BEGIN\r
       IF (Inst = mJ) AND (Value = 0) THEN Inst := mPFIX;\r
       MegaPfixCode(Inst, Value, Pfix,Minlength);\r
       Put_byte(117);\r
       InstLength := Pfix.Prefixes;\r
       MegaPutInteger(InstLength);\r
       FOR i:=1 TO InstLength DO Put_byte(Pfix.Code[i]);\r
\r
       IF CodeOnPass2 THEN\r
       BEGIN\r
         WriteHexWord(Offset);\r
         WriteSpace(2);\r
         WriteSpace(CodePos - CurrentPos);\r
         FOR i:=1 TO InstLength DO WriteHexByte(Pfix.Code[i]);\r
         WriteSpace(commentPos - CurrentPos);\r
         write(Codelist, ' ', MegaInstructionName[Inst],'  ');\r
       END;\r
\r
     END;\r
\r
     PROCEDURE MegaPutJump(VAR Rec: Tempbin1_record; Offz: Integer);\r
     VAR Inst : Instruction;\r
         Pfix : Pfix_type;\r
         InstLength, i : Integer;\r
         Ptr : St_Elemptr;\r
         RelJumpValue,helpoffset : Longint;\r
     BEGIN\r
       i := Rec.Bin1Param;\r
\r
       CASE Rec.Bin1Code OF\r
         UnCondJump  : Inst := mJ;\r
         CondJump    : Inst := mCJ;\r
         InternalCall: Inst := mCALL;\r
         ELSE\r
         BEGIN\r
           Inst := mLDC;\r
           i    := i - 2;\r
         END;\r
       END;\r
\r
       RelJumpValue := Offset + Rec.Bin1Param;\r
       St_Retrieve(Rec.Bin1Label,Ptr);\r
       IF Inst <> mLDC THEN\r
         WHILE NOT Equal_Addr(Ptr^.DefAsLabel,St_NillAddr)\r
	   DO St_Retrieve(Ptr^.DefAsLabel,Ptr);\r
       HelpOffset := Offz + Ptr^.MegaLabel_Offset;\r
       IF Offset > HelpOffset THEN\r
         RelJumpValue := -(RelJumpValue - HelpOffset) ELSE\r
         RelJumpValue := HelpOffset - RelJumpValue;\r
\r
\r
       MegaPutPfixInst(Inst, RelJumpValue, InstLength, i);\r
\r
       IF Inst = mLDC THEN\r
       BEGIN\r
         Put_byte(117);\r
         MegaPutInteger(2);\r
         WordByte.w := MegaInstructionValue[mLDPI];\r
         Put_Byte(WordByte.Byte2);\r
	 Put_Byte(WordByte.Byte1);\r
       END;\r
\r
       IF CodeOnPass2 THEN\r
       BEGIN\r
         WriteLabel(Ptr);\r
         IF Offz <> 0 THEN write(Codelist,' + ',Offz);\r
         Writeln(Codelist);\r
         Offset := Offset +InstLength;\r
         CurrentPos := 0;\r
         If Inst = mLDC THEN\r
         BEGIN\r
           WriteHexWord(Offset);\r
           WriteSpace(CodePos - CurrentPos);\r
           WriteHexWord(MegaInstructionValue[mLDPI]);\r
           WriteSpace(commentPos - CurrentPos);\r
           writeln(Codelist, ' ', MegaInstructionName[mLDPI]);\r
           CurrentPos := 0;\r
           Offset := Offset + 2;\r
         END;\r
       END ELSE\r
       BEGIN\r
         Offset := Offset + InstLength;\r
         IF Inst = mLDC THEN Offset := Offset + 2;\r
       END;\r
     END;\r
\r
\r
    PROCEDURE MakePass4_2;\r
      (* The procedure is called when there is no more code for\r
         the block. The procedure makes the <Object Block> for the block\r
         That is the secound pass is made . FileOffset gives the length\r
         of the code in the block *)\r
\r
      VAR\r
        Ptr : St_ElemPtr;\r
        i, j , CharValue : integer;\r
        Leng, NoLabels, StepW : Word;\r
        ch : char;\r
	Lab, Lab1, Lab2 : St_Address;\r
        Inst : Instruction;\r
        Low, High :  integer;\r
        Off, OtherwiseOffset : Longint;\r
            (* Gives the offset of the next byte written to\r
               CodeFile *)\r
        Str : Ptr_string;\r
        LastLBDR : longint;\r
        firstlbdr : boolean;\r
        CurrentFile1 : Boolean;\r
\r
	JumpRec1,Helprec : Tempbin1_record;\r
        StartOffset : LongInt;\r
        DateAndTime : DateTime;\r
     CONST\r
         NameEntryLength = 10;\r
         LineTabLength = 16;\r
     VAR\r
         NameEntry :\r
           record\r
             case b : boolean of\r
               true : ( firstOffset : Longint;\r
                        CodeLength : Longint;\r
                        blocktype : byte;\r
                        length : byte);\r
                false : ( a : array[1..NameEntryLength] of byte);\r
           end;\r
\r
        LineTab :\r
          Record\r
            case b : boolean of\r
              true : ( FirstLine : Longint;\r
                       FirstOffset : Longint;\r
                       OffsetSpacing : Longint;\r
                       LastOffset : Longint );\r
              False : ( a : array[1..LineTabLength] of byte)\r
          End;\r
\r
\r
        LengthOfLineTabel : word ;\r
        LineTabelAddr, TempLineTabelAddr : St_Address;\r
        LineTabelIndex : Word;\r
        LineTabelOffset : Longint;\r
        MakingLineTab : Boolean;\r
        LastLine, LineRest, LineDiff : Word;\r
\r
\r
\r
\r
        NoSegFixUp : Word;\r
        FirstSegFixUp, LastSegFixup : St_Address;\r
        SegNumber : Byte;\r
        UseLabel : Boolean;\r
        RoutineOffset : Word;\r
\r
        CodeDumpLength : integer;\r
        skip : boolean;\r
        ActivePI3Routines : Integer;\r
        ConvertExtNumber:Array[1..NoOfPi3RoutinesAndSetRoutines] OF Integer;\r
        help : longint;\r
        allignedLengthOfNameTable : word;\r
        bigstring : String[255];\r
\r
     PROCEDURE InsertLineDiff;\r
       (* This procedure is only used when making linetabel. The procedure\r
          inserts the next linediff. in the linetabel *)\r
\r
       BEGIN\r
         WHILE (Offset - LineTabelOffset) >= Spacing DO\r
           BEGIN\r
             LineDiff := ( LineNumber - LastLine) + LineRest;\r
\r
             IF LineDiff > 255 THEN\r
               BEGIN\r
                 LineRest := LineDiff - 255;\r
                 LineDiff := 255;\r
               END\r
             ELSE\r
               LineRest := 0;\r
             LastLine := LineNumber;\r
\r
             LineTabelOffset := LineTabelOffset + Spacing;\r
             St_Get(TempLineTabelAddr,Ptr);\r
\r
             Ptr^.Data_area[LineTabelIndex] := LineDiff;\r
             LineTabelIndex := LineTabelIndex + 1;\r
\r
             IF LineTabelIndex > Ptr^.St_Size THEN\r
               BEGIN\r
                 TempLineTabelAddr := Ptr^.ListRef;\r
                 LineTabelIndex := 1;\r
               END;\r
           END;\r
       END;\r
\r
      PROCEDURE ResetBin1Files;\r
      BEGIN\r
        St_unlock(JumpRec);\r
        ST_get(FirstTempPage, JumpRec);\r
        tempIndex := 0;\r
        ST_lock(JumpRec);\r
      END;\r
\r
      PROCEDURE ReadJumpRec(VAR r: Tempbin1_record);\r
      BEGIN\r
        NextTempPage;\r
        r := JumpRec^.Jump_data[TempIndex];\r
      END;\r
\r
      PROCEDURE WriteJumpRec(VAR r: Tempbin1_record);\r
      BEGIN\r
        JumpRec^.Jump_data[TempIndex] := R;\r
      END;\r
\r
      PROCEDURE ReadLabelDisp(VAR Disp: Integer);\r
      BEGIN\r
        NextTempPage;\r
        Disp := JumpRec^.Jump_data[TempIndex].Bin1Label.Va_High;\r
      END;\r
\r
      PROCEDURE InsertJumpSizes;\r
      VAR Stable     : Boolean;\r
          JumpBack   : Boolean;\r
          InstLength : Integer;\r
          InstCode   : Pfix_type;\r
          noturns    : integer;\r
          diff       : integer;\r
      BEGIN\r
\r
      noturns := 2;\r
      offset := internaloffset;\r
        REPEAT\r
(*          writeln('stabel fors  off: ',offset,' noturns ',noturns,' diff ',diff);*)\r
          Stable := True;\r
          Offset := 0;\r
          diff := 0;\r
          ResetBin1Files;\r
\r
          WHILE NOT eofTempPage DO\r
          BEGIN\r
\r
            ReadJumpRec(JumpRec1);\r
            Offset := Offset + JumpRec1.Bin2Code;\r
\r
            CASE JumpRec1.Bin1Code OF\r
\r
              Lineno:;\r
\r
              DeclareLabel :  (* Label *)\r
                BEGIN\r
                  St_Get(JumpRec1.Bin1Label, Ptr);\r
                  Ptr^.MegaLabel_offset := Offset;\r
                  Ptr^.Label_Scope := NoTurns;\r
                END;\r
\r
               TempSTL:\r
                 Offset := Offset + MegaPfixNo(JumpRec1.Bin1Label.Va_high);\r
\r
               AddLabelToDis :\r
                 BEGIN\r
		   St_Retrieve(JumpRec1.Bin1Label,Ptr);\r
                   WHILE NOT Equal_Addr(Ptr^.DefAsLabel,St_NillAddr) DO\r
		   St_Retrieve(Ptr^.DefAsLabel,Ptr);\r
		   ReadJumpRec( Helprec);\r
                   JumpBack := Ptr^.Label_scope = NoTurns;\r
                   IF JumpBack then\r
                     InstLength := 0\r
                   else\r
                     InstLength := diff;\r
\r
		   InstLength := 2 + MegaPfixNo(Ptr^.MegaLabel_Offset +\r
					    Helprec.Bin1Label.Va_high +\r
                                            Instlength +\r
                                           -(Offset+JumpRec1.Bin1Param));\r
\r
		   IF (InstLength > JumpRec1.Bin1Param) OR\r
                      (( noturns > 0) AND (InstLength <> JumpRec1.Bin1Param))THEN\r
                   BEGIN\r
(*   writeln('addlabtodis instlength ' , instlength,\r
           ' old ',JumpRec1.bin1param,' off ',offset,\r
           ' label ', Ptr^.MegaLabel_Offset);*)\r
\r
                     Stable := False;\r
                     diff := diff + (InstLength - JumpRec1.Bin1Param);\r
                     JumpRec1.Bin1Param := InstLength;\r
		   END;\r
                   Offset := Offset + JumpRec1.Bin1Param;\r
                   JumpRec^.Jump_data[TempIndex-1] := JumpRec1;\r
		   JumpRec1 := Helprec;\r
                 END;\r
\r
\r
	       UnCondJump, InternalCall, CondJump :\r
                 BEGIN\r
                   St_Retrieve(JumpRec1.Bin1Label,Ptr);\r
                   WHILE NOT Equal_Addr(Ptr^.DefAsLabel,St_NillAddr) DO\r
                   St_Retrieve(Ptr^.DefAsLabel,Ptr);\r
                   JumpBack := Ptr^.Label_scope = NoTurns;\r
                   IF JumpBack then\r
                     InstLength := 0\r
                   else\r
                     InstLength := diff;\r
                   InstLength := MegaPfixNo(Ptr^.MegaLabel_Offset +\r
                                            InstLength\r
                                           -(Offset+JumpRec1.Bin1Param));\r
\r
		   IF (InstLength > JumpRec1.Bin1Param) OR\r
                      (( noturns > 0) AND (InstLength <> JumpRec1.Bin1Param)) THEN\r
                   BEGIN\r
(*\r
    writeln('jump instlength ' , instlength,\r
            ' old ',JumpRec1.bin1param,'off ' ,offset,\r
            ' label ', Ptr^.MegaLabel_Offset ,\r
            ' back ', ord(jumpback),\r
            ' diff ',diff);*)\r
                     Stable := False;\r
                     diff := diff + (InstLength - JumpRec1.Bin1Param);\r
                     JumpRec1.Bin1Param :=  InstLength;\r
                   END;\r
                   Offset := Offset + JumpRec1.Bin1Param;\r
                 END;\r
\r
               ExternalCall,\r
               LongJump:\r
                 BEGIN\r
                   Offset := Offset + 8;\r
                 END;\r
\r
               CaseLabList :   (* a list of case labels *)\r
		 BEGIN\r
                  Offset := Offset + JumpRec1.Bin1Param;\r
                 END;\r
\r
               AllignCode :   (* a list of case labels *)\r
                 BEGIN\r
		   InstLength := ((Offset+3)DIV 4)*4 - Offset;\r
                   IF (InstLength <> JumpRec1.Bin1Param) THEN\r
                   BEGIN\r
                  (* writeln('allign instlength ' , instlength,\r
                                     ' old ',JumpRec1.bin1param,\r
                                     ' off ' ,offset);*)\r
                     Stable := False;\r
                     Diff := Diff + (InstLength - JumpRec1.Bin1Param);\r
                     JumpRec1.Bin1Param := InstLength;\r
                   END;\r
		   Offset := Offset + JumpRec1.Bin1Param;\r
		 END;\r
\r
               ExternalLBDR:  (* external LBDR *)\r
                 BEGIN\r
                   Offset := Offset + 40;\r
		 END;\r
\r
               InternalLBDR:  (* external LBDR *)\r
                 BEGIN\r
                   Offset := Offset + 28;\r
		 END;\r
\r
	       ELSE;\r
\r
	      END; (* end case *)\r
\r
            WriteJumpRec(JumpRec1);\r
\r
          END; (* while *)\r
\r
          CurrentFile1 := NOT CurrentFile1;\r
\r
          noturns := noturns - 1;\r
\r
        UNTIL Stable;\r
      END;\r
   PROCEDURE MegaPutAllign(off : integer);\r
     Var i : Integer;\r
     BEGIN\r
      IF CodeOnPass2 THEN\r
        IF off > 0 THEN\r
	BEGIN\r
	  WriteHexWord(Offset);\r
	  WriteSpace(CodePos - CurrentPos);\r
	END;\r
      For i := 1 TO Off DO\r
	BEGIN\r
	  IF CodeOnPass2 THEN WriteHexByte(32);\r
	  Put_byte(32);\r
	  Offset := Offset + 1;\r
	END;\r
      IF CodeOnPass2 THEN\r
	IF Off > 0 THEN\r
	BEGIN\r
          Writespace(CommentPos - CurrentPos);\r
	  CurrentPos := 0;\r
	  Writeln(Codelist,' ALLIGNMENT');\r
        END;\r
\r
     END;\r
\r
   PROCEDURE DumpNameEntryOnCodeList;\r
     VAR i : integer;\r
     BEGIN\r
        WriteHexWord(Offset);\r
        WriteSpace(CodePos - CurrentPos);\r
\r
        For i := 1 to NameEntryLength do writehexbyte(NameEntry.a[i]);\r
        writeln(CodeList, ' Firstoff(L), CodeLength(L), Type(B), Length(B)');\r
        CurrentPos := 0;\r
        WriteHexWord(Offset + NameEntryLength);\r
        WriteSpace(CodePos - CurrentPos);\r
        For i := 1 to length(Str^) do\r
                WriteHexbyte(ord(Str^[i]));\r
        WriteSpace(CommentPos - CurrentPos);\r
        writeSpace(1);\r
        Writeln(CodeList,Str^);\r
        CurrentPos := 0;\r
     END;\r
\r
\r
   PROCEDURE DumpLineTableStartOnCodeList;\r
     VAR i : integer;\r
     BEGIN\r
        Writeln(CodeList,'   LineTable:');\r
        WriteHexWord(Offset);\r
        WriteSpace(CodePos - CurrentPos);\r
        FOR i := 1 to LineTabLength do WriteHexbyte(LineTab.a[i]);\r
        writeln(CodeList, ' Firstline(L), Firstoff(L), Spacing(L), Lastoff(L)');\r
        CurrentPos := 0;\r
     END;\r
\r
      BEGIN  (* MakePass4_2 *)\r
\r
        LastLBDR := 0;\r
        LengthOfLineTabel := 0;\r
        FirstLBDR := true;\r
        CurrentFile1 := True;\r
\r
        InsertJumpSizes;\r
\r
        InternalOffset := Offset;\r
\r
        Put_byte(89); (*112*)\r
        Put_byte(10); (* For All Transputers: T414, T425, and T800 *)\r
        Put_byte(1);\r
        MegaPutName('occam 2 product compiler (19th September 1988)');\r
        MegaPutName('RTP Compiler to Transputer 414');\r
\r
        (* Write the external names to codefile *)\r
        St_Retrieve(FirstExtDec,Ptr);\r
\r
        j := 0;\r
        for i := 1 to NoOfPi3RoutinesAndSetRoutines DO\r
          IF Not Equal_Addr(PreExtCalled[i], St_Stopaddr) THEN\r
            BEGIN\r
              ConvertExtNumber[i] := j;\r
              j := j + 1;\r
            END;\r
\r
        ActivePI3Routines := j;\r
\r
        FOR i := 1 TO (NoExtDecl + NoPreExtDecl) DO\r
        BEGIN\r
          skip := false;\r
          IF i > NoPreExtDecl THEN\r
             St_NameOfSpix(Ptr^.Ext_Spix,Str)\r
          ELSE\r
          IF Not Equal_Addr(PreExtCalled[i], St_Stopaddr) THEN\r
            St_NameOfSpix(PreExtName[i],Str)\r
          else\r
            skip := true;\r
\r
          if not skip THEN MegaPutExt(Str^);\r
\r
          IF i  > NoPreExtDecl THEN\r
           BEGIN\r
             Lab1 := Ptr^.Ext_ref;\r
(*             MakeParamDesc(Ptr^.Ext_owner,bigstring);\r
             Put_byte(111);\r
             MegaPutName(bigstring);\r
*)           St_Retrieve(Lab1,Ptr);\r
           END;\r
\r
\r
        END;\r
\r
\r
        CurrentPos    := 0;\r
        CodeDumpLength:= 0;\r
        MakingLineTab := false;\r
        Offset        := 0;\r
        Init_pass4_2;\r
\r
        ResetBin1Files;\r
\r
        WHILE NOT eofTempPage DO\r
          BEGIN\r
\r
            ReadJumpRec(JumpRec1);\r
            CodeDumpLength := CodeDumpLength + JumpRec1.Bin2Code;\r
            IF JumpRec1.Bin1Code <> LineNo THEN\r
            BEGIN\r
              IF CodeDumpLength <> 0 THEN MegaPutCode(CodeDumpLength);\r
              CodeDumpLength := 0;\r
            END;\r
            CASE JumpRec1.Bin1Code OF\r
\r
              LineNo :\r
                BEGIN\r
                  IF MakingLineTab THEN InsertLineDiff;\r
                  LineNumber := JumpRec1.Bin1Label.va_high;\r
\r
                  IF CodeOnPass2 THEN\r
                  BEGIN\r
                    writeln(CodeList,'$L',LineNumber);\r
                  END;\r
                END;\r
\r
\r
              DeclareLabel :  (* Label *)\r
                BEGIN\r
\r
                  IF CodeOnPass2 THEN\r
                  BEGIN\r
                    St_Retrieve(JumpRec1.Bin1Label, Ptr);\r
                    IF Equal_Addr(Ptr^.DefAsLabel,St_NillAddr) THEN\r
                    BEGIN  (* write the label *)\r
                      WriteHexWord(Offset);\r
                      WriteSpace(LabelPos - CurrentPos);\r
                      WriteLabel(Ptr);\r
                      Writeln(Codelist);\r
                      CurrentPos := 0;\r
                    END;\r
                  END;\r
\r
                END;\r
\r
\r
              SetCode:\r
                BEGIN\r
                  CodeOnPass2 := JumpRec1.Bin1Label.Va_high <> 255;\r
                  IF CodeOnPass2 THEN\r
                     WriteLn(CodeList,'$S',JumpRec1.Bin1Label.Va_high);\r
                END;\r
\r
              ContextEnd :\r
                IF LineTabel THEN\r
                BEGIN\r
                  LengthOfLineTabel := (InternalOffset - offset) DIV Spacing\r
                                        + 1;\r
                  (* Start Making linetabel *)\r
                  St_Reserve(LengthOfLineTabel,LineTabelAddr,Ptr);\r
\r
                  LineTabelIndex := 1;\r
                  (* linenumber gives the line of endinclude *)\r
                  LineTab.FirstLine := LineNumber;\r
                  LineTab.FirstOffset := Offset;\r
                  LineTab.OffsetSpacing := Spacing;\r
\r
                  LineTabelOffset := Offset;\r
                  MakingLineTab := true;\r
                  LastLine := LineTab.FirstLine;\r
                  LineRest := 0;\r
                  TempLineTabelAddr := LineTabelAddr;\r
                END;\r
\r
\r
                RoutineStart :\r
                  BEGIN\r
                    (* Get Routine node *)\r
                    St_Get(JumpRec1.Bin1Label,Ptr);\r
                    IF Ptr^.St_Kind = cType THEN\r
                      BEGIN\r
                        Ptr^.MegaT_First_Offset := Offset;\r
                        Ptr^.t_Name_Entry_List := LastNameEntry;\r
                      END\r
                    ELSE\r
                      BEGIN\r
                        IF (Ptr^.St_Kind = cProgram) AND\r
                           (Ptr^.St_Specs = St_Global) THEN\r
                            StartOffset := Offset;\r
                        Ptr^.MegaFirst_Offset := Offset;\r
                        Ptr^.Name_Entry_List := LastNameEntry;\r
                      END;\r
\r
                     LastNameEntry := JumpRec1.Bin1Label;\r
                     (* update lengthofnametabel *)\r
                     st_NameofSpix(Ptr^.St_Spix,Str);\r
                      LengthOfNameTabel := LengthOfNameTabel + length(Str^)\r
                                                      + NameEntryLength;\r
                  END;\r
\r
\r
\r
                RoutineStop :\r
                  BEGIN\r
                    St_Get(JumpRec1.Bin1Label,Ptr);\r
                    IF Ptr^.St_Kind = cType THEN\r
                      BEGIN\r
                        Ptr^.MegaT_Last_Offset := Offset-1;\r
                      END\r
                    ELSE\r
                      BEGIN\r
                        IF (Ptr^.St_Kind = cProgram) AND\r
                           (Ptr^.St_Specs = St_Global) THEN\r
                          BEGIN\r
                            Ptr^.St_Size := Offset - StartOffset;\r
                            Ptr^.Last_offset := (Offset - StartOffset) SHR 16;\r
                          END;\r
                        Ptr^.MegaLast_Offset := Offset-1;\r
                        St_Retrieve(Ptr^.St_Label,Ptr);\r
                        WHILE Not Equal_Addr(Ptr^.DefAsLabel,St_NillAddr) DO\r
                           St_Retrieve(Ptr^.DefAsLabel,Ptr);\r
                        help := ptr^.MegaLabel_Offset;\r
                        St_Get(JumpRec1.Bin1Label,Ptr);\r
                        Ptr^.MegaFirst_Offset :=help;\r
                      END;\r
                    SizeOfConst := offset;\r
                  END;\r
\r
              TempSTL:\r
                BEGIN\r
                  MegaPutPfixInst(mSTL, JumpRec1.Bin1Label.Va_High, i,0);\r
\r
                  IF CodeOnPass2 THEN\r
                  BEGIN\r
                    writeln(Codelist, '  ', JumpRec1.Bin1Label.Va_high);\r
                    CurrentPos := 0;\r
                  END;\r
\r
                  Offset := Offset + i;\r
                END;\r
\r
               AddLabelToDis :\r
                 BEGIN\r
                   ReadLabelDisp(i);\r
                   MegaPutJump(JumpRec1, i);\r
                 END;\r
\r
               UnCondJump, InternalCall, CondJump :\r
                 BEGIN\r
                   MegaPutJump(JumpRec1,0);\r
                 END;\r
\r
               LongJump,\r
               ExternalCall:\r
                 BEGIN\r
                   i := JumpRec1.Bin1Label.Va_high;\r
                   IF i < NoOfPI3RoutinesAndSetRoutines THEN\r
                   BEGIN\r
                     i := ConvertExtNumber[i+1];\r
                   END ELSE\r
                   BEGIN\r
                     i :=i-NoOfPi3RoutinesAndSetRoutines+ActivePI3Routines;\r
                   END;\r
                   MegaPutCallExt(JumpRec1.Bin1Code,Offset,i);\r
                 END;\r
\r
               CaseLabList :   (* a list of case labels *)\r
		 BEGIN\r
		   Put_byte(117);\r
		   MegaPutInteger(JumpRec1.Bin1Param);\r
		   NoLabels := JumpRec1.Bin1Label.Va_High;\r
		   ReadJumpRec(JumpRec1);\r
		   Lab := JumpRec1.Bin1Label; (* Casetable *)\r
\r
		   ReadJumpRec(JumpRec1);\r
		   Lab1 := JumpRec1.Bin1Label; (* Otherwise *)\r
\r
		   ReadJumpRec(JumpRec1);\r
		   Lab2 := JumpRec1.Bin1Label; (* IndJump *)\r
\r
		   St_Get(Lab2, Ptr);\r
		   Off := Ptr^.MegaLabel_Offset;\r
\r
\r
		   St_Retrieve(Lab1,Ptr);\r
		   WHILE NOT Equal_Addr(Ptr^.DefAsLabel,St_NillAddr)\r
		     DO St_Retrieve(Ptr^.DefAsLabel,Ptr);\r
		   OtherwiseOffset := Ptr^.MegaLabel_Offset;\r
\r
		   WHILE NoLabels > 0 DO\r
		     BEGIN\r
		       St_Retrieve(Lab,Ptr);\r
		       Low := Ptr^.Label_Low;\r
		       High := Ptr^.Label_High;\r
\r
		       Lab1 := Ptr^.ListRef;\r
\r
		       WHILE NOT Equal_Addr(Ptr^.DefAsLabel,St_NillAddr)\r
			 DO St_Retrieve(Ptr^.DefAsLabel,Ptr);\r
			 FOR i := Low TO High DO\r
			   BEGIN\r
\r
\r
                              (* put label offset *)\r
			    WordByte.w := Ptr^.MegaLabel_Offset - off;\r
			    Put_Byte(WordByte.Byte1);\r
			    Put_Byte(WordByte.Byte2);\r
			    Put_Byte(0);\r
			    Put_byte(0);\r
\r
			    IF CodeOnPass2 THEN\r
                                BEGIN\r
                                  WriteHexWord(Offset);\r
                                  WriteSpace(CodePos - CurrentPos);\r
                                  WriteHexByte(WordByte.Byte1);\r
                                  WriteHexByte(WordByte.Byte2);\r
				  WriteHexByte(0);\r
				  WriteHexByte(0);\r
				  WriteSpace(CommentPos - CurrentPos);\r
				  write(CodeList,' DW  ');\r
\r
                                  (* write Label *)\r
                                  WriteLabel(Ptr);\r
                                  writeln(CodeList);\r
\r
                                  CurrentPos := 0;\r
                                END;\r
\r
                              NoLabels := NoLabels - 1;\r
			      Offset := Offset + 4;\r
                            END;\r
\r
                          IF NoLabels > 0 THEN\r
                            BEGIN\r
                              St_Retrieve(Lab1,Ptr);\r
                              FOR i := (High + 1) TO (Ptr^.Label_Low - 1) DO\r
                                BEGIN\r
\r
                                  (* put label offset *)\r
				  WordByte.w := OtherWiseOffset -off;\r
				  Put_Byte(WordByte.Byte1);\r
				  Put_Byte(WordByte.Byte2);\r
				  Put_Byte(0);\r
				  Put_byte(0);\r
\r
\r
                                  IF CodeOnPass2 THEN\r
                                    BEGIN\r
                                      WriteHexWord(Offset);\r
                                      WriteSpace(CodePos - CurrentPos);\r
				      WriteHexByte(WordByte.Byte1);\r
				      WriteHexByte(WordByte.Byte2);\r
				      WriteHexByte(0);\r
				      WriteHexByte(0);\r
				      WriteSpace(CommentPos - CurrentPos);\r
				      write(CodeList,' DW  ');\r
\r
                                      (* write Label *)\r
                                      Writeln(CodeList,'?',OtherWiseOffset,':');\r
\r
                                      CurrentPos := 0;\r
                                    END;\r
\r
                                  NoLabels := NoLabels - 1;\r
				  Offset := Offset + 4;\r
                                END;\r
                            END;\r
                          Lab := Lab1;\r
                        END; (* While *)\r
\r
		 END;\r
\r
               AllignCode :\r
		 BEGIN\r
                   off := JumpRec1.Bin1Param;\r
		   IF off <> 0 THEN\r
                     begin\r
                       Put_byte(117);\r
		       MegaPutInteger(off);\r
                       MegaPutAllign(off);\r
                     end;\r
	        END;\r
\r
               InternalLBDR,\r
               ExternalLBDR:  (* external LBDR *)\r
                 BEGIN\r
                   St_Retrieve(JumpRec1.Bin1Label, Ptr);\r
                   St_NameOfSpix(Ptr^.St_Spix,Str);\r
                   MegaPutDefineExt(Str^, Ptr^.MegaLabel_Offset);\r
\r
                   IF CodeOnPass2 THEN\r
                   BEGIN\r
                     writeln(Codelist);\r
                     writeln(CodeList);\r
                     writeln(CodeList,'  LBDR: ');\r
                   END;\r
\r
                   (* EntryPoint *)\r
                   MegaPutIntegerValue(Ptr^.MegaLabel_Offset - offset);\r
                   IF CodeOnPass2 THEN\r
                   BEGIN\r
                     write(CodeList,'       ','EntryPoint: ');\r
                     WriteLabel(Ptr);\r
                     writeln(CodeList);\r
                   END;\r
\r
                   (* BlKind *)\r
                   ReadJumpRec(JumpRec1);\r
                   off := JumpRec1.Bin1Label.Va_High;\r
                   MegaPutIntegerValue(off);\r
                   IF CodeOnPass2 THEN\r
                   BEGIN\r
                     write(CodeList,'       ','BlockKind: ');\r
                     WriteHexByte(JumpRec1.Bin1Label.Va_High);\r
                     writeln(CodeList);\r
                   END;\r
\r
                   (* BlName *)\r
                   ReadJumpRec(JumpRec1);\r
                   St_NameOfSpix(JumpRec1.Bin1Label.Va_High,Str);\r
                   Put_Byte(117);\r
                   MegaPutInteger(12);\r
                   FOR i := 1 TO Length(Str^) DO\r
                      IF i <= 12 THEN Put_byte(ORD(str^[i]));\r
                   FOR i := Length(Str^) + 1 TO 12 DO Put_Byte(32);\r
                   IF CodeOnPass2 THEN\r
                   BEGIN\r
                     write(CodeList,'       ','BlockName: ');\r
\r
                     writeln(CodeList,Str^);\r
                   END;\r
\r
                   (* Next *)\r
                   IF not firstLBDR THEN\r
                     LastLBDR := LastLBDR - (Offset +(5*4))\r
                   ELSE\r
                    BEGIN\r
                      Put_byte(16);\r
                      MegaPutInteger(Offset+5*4);\r
                      Put_byte(37);\r
                      MegaPutInteger(Rtplbdr-1);\r
                      FirstLBDR := false;\r
                    END;\r
\r
                   MegaPutIntegervalue(Lastlbdr);\r
                   IF CodeOnPass2 THEN\r
                   BEGIN\r
                     write(CodeList,'       ','Next: ');\r
                     WriteHexWord(Lastlbdr);\r
                     writeln(CodeList);\r
                   END;\r
\r
\r
                   (* LineTable *)\r
                   MegaPutIntegerValue(InternalOffset - offset + lengthofversion);\r
\r
                   IF CodeOnPass2 THEN\r
                   BEGIN\r
                     write(CodeList,'       ','LineTable : ');\r
                     WriteHexWord(InternalOffset - offset + lengthofversion);\r
                     writeln(Codelist);\r
                   END;\r
\r
                IF off <> 1 THEN\r
                BEGIN\r
                   (* LinkCount *)\r
                   MegaPutIntegerValue(0);\r
                   IF CodeOnPass2 THEN\r
                   BEGIN\r
                     write(CodeList,'       ','LinkCount: ');\r
                     WriteHexByte(0);\r
                     writeln(CodeList);\r
                   END;\r
\r
\r
                   (* Appetite *)\r
                   ReadJumpRec(JumpRec1);\r
                   MegaPutIntegerValue(JumpRec1.Bin1Label.Va_High);\r
                   IF CodeOnPass2 THEN\r
                   BEGIN\r
                     write(CodeList,'       ','Appetite: ');\r
                     WriteHexWord(JumpRec1.Bin1Label.Va_High);\r
                     writeln(CodeList);\r
                   END;\r
\r
                   (* Stackextra *)\r
                   MegaPutIntegerValue(0);\r
                   IF CodeOnPass2 THEN\r
                   BEGIN\r
                     write(CodeList,'       ','OccamStack: ');\r
                     WriteHexWord(0);\r
                     writeln(CodeList);\r
                   END;\r
\r
                END;\r
\r
                  CurrentPos := 0;\r
                  LastLBDR := Offset;\r
                  IF Off = 1 THEN Offset := Offset + 28\r
                             ELSE Offset := Offset + 40;\r
                 END;\r
              END; (* end case *)\r
\r
          END; (* while *)\r
\r
          St_nameOfSpix(PreExtName[rtplbdr], Str);\r
          MegaPutDefineExt(Str^, LastLBDR);\r
\r
\r
\r
          IF CodeDumpLength <> 0 THEN MegaPutCode(CodeDumpLength);\r
\r
          (* Dump NameEntry And LineTabel*)\r
          j := (((Offset+3)DIV 4) * 4) - Offset;\r
          IF j <> 0 THEN\r
          BEGIN\r
            Put_byte(117);\r
            MegaPutInteger(j);\r
            MegaPutAllign(j);\r
          END;\r
\r
          sizeofconst := Offset - SizeOfConst;\r
          SizeOfLineTable := Offset;\r
\r
          internaloffset := offset;\r
\r
          (* Insert Version *)\r
          Put_byte(117);\r
          MegaPutInteger(LengthOfVersion);\r
\r
          UnPackTime(SourceDate,DateAndTime);\r
          with DateAndtime Do\r
          BEGIN\r
            Put_byte(Year - 1900);\r
            Put_byte(Month);\r
            Put_byte(day);  (* Source Date *)\r
            Put_byte(hour);\r
            Put_byte(min);\r
            IF CodeOnPass2 THEN\r
            BEGIN\r
              writehexword(Offset);\r
              WriteSpace(CodePos - CurrentPos);\r
              writehexbyte(Year - 1900);\r
              writehexbyte(Month);\r
              writehexbyte(day);\r
              writehexbyte(hour);\r
              writehexbyte(min);\r
              WriteSpace(CommentPos - CurrentPos + 1);\r
              Writeln(Codelist,' Source Date');\r
              Currentpos := 0;\r
            END;\r
            Offset := Offset + 5;\r
          END;\r
          Put_byte(Call_options.version);\r
          Put_Byte(Call_options.subversion ); (* Version *)\r
          IF CodeOnPass2 THEN\r
          BEGIN\r
            writehexword(Offset);\r
            WriteSpace(CodePos - CurrentPos);\r
            writehexbyte(Call_options.Version);\r
            writehexbyte(Call_options.SubVersion);\r
            WriteSpace(CommentPos - CurrentPos + 1);\r
            Writeln(Codelist,' Version');\r
            Currentpos := 0;\r
          END;\r
          Offset := Offset + 2;\r
          with DateAndtime Do\r
          BEGIN\r
            GetDate(Year,Month,day,stepw);\r
            GetTime(Hour,Min,Sec,stepw);\r
            Put_byte(Year - 1900);\r
            Put_byte(Month);\r
            Put_byte(day);  (* Object Date *)\r
            Put_byte(hour);\r
            Put_byte(min);\r
            IF CodeOnPass2 THEN\r
            BEGIN\r
              writehexword(Offset);\r
              WriteSpace(CodePos - CurrentPos);\r
              writehexbyte(Year - 1900);\r
              writehexbyte(Month);\r
              writehexbyte(day);\r
              writehexbyte(hour);\r
              writehexbyte(min);\r
              WriteSpace(CommentPos - CurrentPos + 1);\r
              Writeln(Codelist,' Object Date');\r
              Currentpos := 0;\r
            END;\r
          END;\r
          Offset := Offset + 5;\r
          MegaPutIntegerValue(-offset);\r
          IF CodeOnPass2 THEN\r
            BEGIN\r
              writehexword(Offset); Writeln(Codelist);\r
              writeln(CodeList,'    NameTable and LineTable');\r
              write(CodeList,'       ','FirstLBDR: ');\r
              WriteHexword(-offset);\r
              writeln(CodeList);\r
            END;\r
          allignedLengthofnametable := ((LengthOfNameTabel + 3) DIV 4) * 4;\r
\r
          IF LengthOfLineTabel = 0 THEN\r
            Help := 0\r
          ELSE\r
            Help := AllignedLengthOfNameTable+4;\r
          MegaPutIntegerValue(help);\r
          IF CodeOnPass2 THEN\r
            BEGIN\r
              write(CodeList,'       ','LineTable Pointer: ');\r
              WriteHexword(help);\r
              writeln(CodeList);\r
              CurrentPos := 0;\r
              writeln(CodeList,'    NameTable:');\r
            END;\r
\r
          Offset := Offset + 8;\r
          Put_byte(117);\r
          MegaPutInteger(AllignedLengthOfNameTable + LengthOfLineTabel\r
                         + LineTabLength);\r
          (* Dump NameTable *)\r
          WHILE Not Equal_Addr(LastNameEntry,St_NillAddr) DO\r
            BEGIN\r
\r
              St_Retrieve(LastNameEntry,Ptr);\r
              IF Ptr^.St_Kind = CType THEN\r
                BEGIN\r
                  LastNameEntry := Ptr^.T_Name_Entry_List;\r
                  NameEntry.FirstOffset := Ptr^.MegaT_First_Offset;\r
                  NameEntry.CodeLength := Ptr^.MegaT_Last_Offset -\r
                                          Ptr^.MegaT_First_Offset + 1;\r
                  IF Ptr^.St_T_local_near THEN\r
                    NameEntry.BlockType := 0  (* internal *)\r
                  ELSE\r
                    NameEntry.BlockType := 1;  (* external *)\r
                END\r
              ELSE\r
                BEGIN\r
                  LastNameEntry := Ptr^.Name_Entry_List;\r
                  NameEntry.FirstOffset := Ptr^.MegaFirst_Offset;\r
                  NameEntry.CodeLength := Ptr^.MegaLast_Offset -\r
                                          Ptr^.MegaFirst_Offset + 1;\r
                  IF (Ptr^.St_Specs = St_Local) AND (Ptr^.St_Local_Near) THEN\r
                    NameEntry.BlockType := 0  (* internal *)\r
                  ELSE\r
                    NameEntry.BlockType := 1; (* External *)\r
                END;\r
\r
              St_nameOfSpix(Ptr^.St_Spix,Str);\r
              NameEntry.Length := length(Str^);\r
              Leng := length(Str^) + NameEntryLength;\r
(*               IF  Not Equal_Addr(LastNameEntry,St_NillAddr) THEN\r
                NameEntry.NextName := Offset + Leng\r
              ELSE\r
                NameEntry.NextName := 0;\r
  *)\r
\r
              For i := 1 to NameEntryLength do Put_byte(NameEntry.a[i]);\r
              For stepw := 1 to length(Str^) do\r
                Put_byte(ord(Str^[stepw]));\r
\r
              If CodeOnPass2 THEN DumpNameEntryOnCodelist;\r
\r
              Offset := offset + leng;\r
            END;\r
\r
          MegaPutAllign(AllignedLengthOfNameTable - LengthOfNameTabel);\r
\r
          IF LengthOfLineTabel <> 0  THEN\r
            BEGIN (* Dump LineTabel *)\r
              LineTab.LastOffset := InternalOffset - 1;\r
\r
              IF InternalOffset > LineTabelOffset THEN\r
                BEGIN\r
                  (* Insert last line diff. *)\r
                  LineDiff := LineNumber - LastLine + LineRest;\r
                  IF LineDiff > 255 THEN  LineDiff := 255;\r
                  St_Get(TempLineTabelAddr,Ptr);\r
                  Ptr^.Data_Area[LineTabelIndex] := LineDiff;\r
                END;\r
\r
              FOR i := 1 to LineTabLength do Put_byte(LineTab.a[i]);\r
\r
              If CodeOnPass2 THEN DumpLineTableStartOnCodelist;\r
              Offset := Offset + LineTabLength;\r
\r
              TempLineTabelAddr := LineTabelAddr;\r
              WHILE Not Equal_Addr(TempLineTabelAddr,St_StopAddr) DO\r
                BEGIN\r
                  St_Retrieve(TempLineTabelAddr,Ptr);\r
                IF CodeOnPass2 THEN\r
                IF Ptr^.St_Size > 0 THEN\r
	         BEGIN\r
	           WriteHexWord(Offset);\r
	           WriteSpace(CodePos - CurrentPos);\r
	         END;\r
                For Stepw := 1 TO Ptr^.St_Size DO\r
                  BEGIN\r
                    Put_Byte(Ptr^.Data_area[Stepw]);\r
                    Offset := Offset + 1;\r
                    IF CodeOnPass2 THEN\r
                    BEGIN\r
                      WriteHexByte(Ptr^.Data_area[Stepw]);\r
                      IF (stepw MOD 10 = 0) OR (Stepw = Ptr^.St_Size) THEN\r
                      BEGIN\r
                        Writeln(CodeList);\r
                        CurrentPos := 0;\r
                        IF (Stepw <> Ptr^.St_Size) THEN\r
                        BEGIN\r
                          WriteHexWord(Offset);\r
	                  WriteSpace(CodePos - CurrentPos);\r
                        END;\r
                      END;\r
                    END;\r
                  END;\r
                  TempLineTabelAddr := Ptr^.ListRef;\r
                END;\r
            END;\r
\r
          j := (((Offset+3)DIV 4) * 4) - Offset;\r
          IF j <> 0 THEN\r
          BEGIN\r
            Put_byte(117);\r
            MegaPutInteger(j);\r
            MegaPutAllign(j);\r
          END;\r
\r
        Put_byte(118);\r
        MegaPutInteger(Offset);\r
        MegaPutInteger(0);\r
\r
        SizeOfLineTable := Offset - SizeOfLineTable;\r
      END;  (* MakePass4_2 *)\r
«eof»