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

⟦77fa7defe⟧ TextFile

    Length: 22975 (0x59bf)
    Types: TextFile
    Names: »RTP86P4A.PAS«

Derivation

└─⟦037c0ce35⟧ Bits:30010524 DVBS1.SW2114.src.2.6-2 RTP compiler source SW2104+SW2114 Disk#2 30/1-92 HHA
    └─⟦this⟧ »RTP\RTP86P4A.PAS« 
└─⟦828f0d3dd⟧ Bits:30010527 DVBS1.SW2114.src.2.6-5 RTP Compiler Source SW2104+SW2114 Disk 2 92.02.03 HEJ HHA
    └─⟦this⟧ »RTP\RTP86P4A.PAS« 
└─⟦891417be1⟧ Bits:30010519 DVBS1.SW2114.src.2-1 SW2114 1/4 Real Time Pascal 2.7 92.06.16
    └─⟦this⟧ »RTP\RTP86P4A.PAS« 
└─⟦a2bcc95d7⟧ Bits:30010511 DVBS1.SW2114.src.2.14-2 SW2114 REAL #2/4 TIME PASCAL SOURCE REL 2.14 92.09.01
    └─⟦this⟧ »RTP\RTP86P4A.PAS« 

TextFile

\r
\r
\r
\r
      (******************* RTPPASS4 ************************)\r
\r
\r
    (* The main part of pass4 *)\r
\r
    VAR\r
\r
      OldInCode,\r
      InCode : Codes; (* Variabel containing the last read code *)\r
\r
      LookAhead : boolean;\r
              (* true if the next incode has been read *)\r
\r
      InPar : Word; (* Variabel containing the last read word param *)\r
\r
      InSymbol : St_Address; (* Variabel containing the last read symbol *)\r
\r
      MoreInput : Boolean; (* false when infile has been read *)\r
\r
      PtrST, Ptr : st_elemptr;\r
\r
      ELab, SLab, Lab : St_Address;  (* Address to label nodes *)\r
\r
      Inst : Instruction;\r
\r
      Addr, Addr1 : Address;\r
\r
      Reg, Reg1,Reg2  : Register;\r
\r
      Value : Word;\r
\r
      ValueInt : integer;\r
\r
      Size, No : Word;\r
\r
      IntegerOpr : Boolean;\r
      InstType : InstrucType;\r
           (* IntegerOpr And InstType describes the operation to be made *)\r
      ShiftInstType,helpInst : InstrucType;\r
\r
      TypeAddr, TypeAddr1, ListRef : St_Address;\r
\r
      Par : ParType;\r
\r
      GlobalBlock : Boolean;  (* true if the block beeing parsed is global *)\r
\r
      FarRoutine : Boolean;\r
\r
      TheProgramType : St_declaremode;\r
\r
      SSTTemp : SSTelementRef;\r
\r
      SecendOpr : ESTelementRef;\r
\r
      Packed1, Packed2 : Boolean;\r
\r
      neg ,bool, bool1 : boolean;\r
\r
      PoolParam : boolean;\r
      alligned : boolean;\r
      AllignSize : Integer;\r
\r
      Low, High : word;\r
      LowInt, Highint : integer;\r
\r
      BitOffset, BitLength : word;\r
\r
      ParSize : word;\r
\r
      Dynamic, InitPointer : boolean;\r
esttest : estelementref;\r
      i : integer;\r
\r
      OldCurrentNiv : integer;\r
\r
      NoOfDynFields : integer;\r
\r
      NoOfTimesInContext : Integer;\r
\r
\r
      OldCode : Boolean;\r
\r
      oldSourceNumber : Word;\r
{$IFDEF PI3}\r
      InStrucValue : Integer;\r
{$ENDIF}\r
{$IFDEF RC3502}\r
      InStrucValue : Integer;\r
      helplong : Longint;\r
      OwnException : Boolean;\r
      ExceptionProc : St_Address;\r
      RC3502ProgramOffset : integer;\r
      sharedalloc  : St_Address;\r
{$ENDIF}\r
      rc3502packed : boolean;\r
      NotPack,MakingAssign, OnStack : Boolean;\r
\r
      PushReg : Register;\r
      TempAddrOffset : Integer;\r
      OldObjectOffset : longint;\r
\r
      InDeclPart : Boolean;\r
\r
      DoNotPopTop : Boolean;\r
\r
      ProgStat : State;\r
\r
      SetRoutine : integer;\r
\r
      FunctionResultPointer : Boolean;\r
\r
      AssignType : ( Simpelassign, Assignbymov, strucassign );\r
\r
      OldLineNumber : Word;\r
\r
      Comp_unit_bit : Word;\r
\r
      LengthOfProgParam : integer;\r
      LowerBoundIndexEq0 : Boolean;\r
    (* ----------------------------------------------------------- *)\r
\r
\r
\r
    PROCEDURE ReadPar;\r
      (* The procedure reads the next parameter from infile *)\r
\r
      BEGIN\r
\r
          (*#BEGINTEST\r
             IF TestPass4 > 1 THEN\r
               writeln(TestOutput,' START  ','ReadPar');\r
          (*ENDTEST#*)\r
\r
            InPar := Get_2_Byte;\r
\r
          (*#BEGINTEST\r
             IF TestPass4 > 1 THEN\r
               writeln(TestOutput,' SLUT  ','ReadPar ',InPar);\r
          (*ENDTEST#*)\r
      END;\r
\r
\r
\r
\r
    (* ---------------------------------------------------------------- *)\r
\r
\r
\r
    PROCEDURE ReadCode;\r
      (* The procedure reads the next code from infile *)\r
      VAR\r
        NewLineNum : boolean;\r
        Pass : ModuleRange;\r
        Passno : integer;\r
        HelpTest : Word;\r
      BEGIN\r
\r
\r
          (*#BEGINTEST\r
             IF TestPass4 > 1 THEN\r
               writeln(TestOutput,' START  ','ReadCode');\r
          (*ENDTEST#*)\r
\r
            InCode := codes(Get_Byte);\r
\r
            NewLineNum := False;\r
            WHILE ((InCode = cNewLine) OR (InCode = cOption) ) DO\r
              BEGIN\r
                IF (InCode = CNewLine) THEN\r
                  BEGIN\r
                    ReadPar;\r
                    LineNumber := InPar;\r
                    NewLineNum := true;\r
                    InCode := Codes(Get_byte);\r
                  END\r
                ELSE\r
                IF InCode = cOption THEN\r
                  BEGIN\r
                    ReadPar;  (* Pass4 or Allpass*)\r
                    Pass := ModuleRange(InPar);\r
                    ReadPar;  (* option *)\r
\r
                    CASE Option_Tokens(InPar) OF\r
                      NoCode_, code_ : BEGIN\r
                                         SetCodeTo(InPar = ord(Code_));\r
                                         ReadPar;\r
                                       END;\r
\r
                      Test_ :\r
                      BEGIN\r
                        ReadPar;\r
                        IF (Pass = Pass4) AND (TestPass4 >= 0) THEN\r
                          BEGIN\r
                            TestPass4 := InPar MOD 256;\r
                            HelpTest := InPar DIV 256;\r
                            IF HelpTest = 1 THEN TestSth := true;\r
                            IF HelpTest = 2 THEN TestSth := false;\r
                            IF (HelpTest = 3)  AND ( original_testvmm = 0)\r
                              THEN TestvmmUpdate := true;\r
                            IF (HelpTest = 4 )  AND ( original_testvmm = 0) THEN\r
                              TestvmmUpdate := false;\r
                          END\r
\r
\r
                        ELSE\r
                          IF (Pass = vmm) AND ( TestvmmUpDate ) THEN\r
                            Testvmm := InPar;\r
                      END;\r
                    SourceNo_ :\r
                      BEGIN\r
                        ReadPar;\r
                        SourceNumber := InPar;\r
                      END;\r
                    VersionPass1,VersionPass2 ,VersionPass3 ,VersionPass4 :\r
                      BEGIN\r
                        PassNo := InPar - ord(VersionPass1) + 1;\r
                        ReadPar;\r
                        IF (PassNo = 3) THEN\r
                          IF ((InPar DIV 100) <>\r
                                             (Pass4VerNo DIV 100)) THEN\r
                          Fatal_Error(Pass4,21);\r
                        VersionNumber[PassNo] := InPar;\r
                      END;\r
\r
                    (*Otherwise*) ELSE\r
                      ReadPar;\r
\r
                    End; (* case *)\r
\r
\r
                    InCode := Codes(Get_Byte);\r
                  END;\r
              END;\r
\r
            IF NewLineNum THEN NewLine(LineNumber);\r
\r
\r
          (*#BEGINTEST\r
             IF TestPass4 >= 1 THEN\r
              begin\r
                writeln(testoutput,'line: ',LineNumber,'code ',ord(incode));\r
              end;\r
          (*ENDTEST#*)\r
      END;\r
\r
\r
\r
    (* ----------------------------------------------------------- *)\r
\r
\r
\r
    PROCEDURE ReadSymbol;\r
      (* The procedure reads the next Symbol from infile *)\r
\r
      BEGIN\r
\r
          (*#BEGINTEST\r
             IF TestPass4 > 1 THEN\r
               writeln(TestOutput,' START  ','ReadSymbol');\r
          (*ENDTEST#*)\r
\r
            InSymbol.Va_Low := Get_2_Byte;\r
            InSymbol.Va_High := Get_2_Byte;\r
\r
          (*#BEGINTEST\r
             IF TestPass4 > 1 THEN\r
               writeln(TestOutput,' SLUT  ','ReadSymbol');\r
          (*ENDTEST#*)\r
      END;\r
\r
\r
    (* ------------------------------------------------------ *)\r
\r
\r
\r
\r
\r
    (* ---------------------------------------------------------- *)\r
\r
\r
\r
    FUNCTION ResultMustBeEncode : Boolean;\r
      (* The function lookahead in the code to see if the result of\r
         the last opertion ( which is a boolean result ) must be in\r
         Decode form or in encode form *)\r
\r
      BEGIN\r
        ReadCode;\r
        LookAHead := true;\r
        IF ((InCode = cWhileExpr) OR (InCode = cEndRepeat) OR\r
            (InCode = cIfExpr ) OR (InCode = cPreAnd) OR\r
            (InCode = cPreOr) OR (InCode = cAnd) OR (InCode = cOR) OR\r
            (InCode = cNOT) )\r
          THEN (* In decode forme *)\r
            ResultMustBeEncode := false\r
          ELSE (* In encode form *)\r
            ResultMustBeEncode := true;\r
      END;\r
\r
\r
\r
\r
\r
\r
\r
\r
\r
\r
\r
    (* ----------------------------------------------------------*)\r
\r
\r
    PROCEDURE AndOrOnBoolean;\r
      (* The procedure makes the AND and OR operation on boolean *)\r
\r
      BEGIN\r
        IF ESTTop^.kind <> O_Decode THEN Decode;\r
\r
        (* merge ESTTop^.Falselab And ESTTop^.BackWard^.Falselab *)\r
        Lab := ESTTop^.FalseLab;\r
        IF Equal_Addr(ESTTop^.BackWard^.FalseLab,St_NillAddr) THEN\r
          ESTTop^.BackWard^.FalseLab := Lab\r
        ELSE\r
          IF NOT Equal_Addr(Lab,St_NillAddr) THEN\r
            GenAsLabel(Lab,ESTTop^.BackWard^.FalseLab);\r
\r
        (* merge ESTTop^.TrueLab And ESTTop^.BackWard^.TrueLab *)\r
        Lab := ESTTop^.TrueLab;\r
        IF Equal_Addr(ESTTop^.BackWard^.TrueLab,St_NillAddr) THEN\r
          ESTTop^.BackWard^.TrueLab := Lab\r
        ELSE\r
          IF NOT Equal_Addr(Lab,St_NillAddr) THEN\r
            GenAsLabel(Lab,ESTTop^.BackWard^.TrueLab);\r
\r
\r
        Inst := ESTTop^.Condition;\r
        ESTPop;\r
        ESTTop^.Condition := Inst;\r
\r
        IF ResultMustBeEncode THEN EnCode;\r
      END;\r
\r
\r
\r
\r
\r
    (*------------------------------------------------------------------ *)\r
\r
\r
\r
\r
\r
   PROCEDURE BeforeStringOpr;\r
       (* procedure used when assign string, exchange string and compare\r
          string *)\r
     VAR\r
       Reg1,Reg2 : Register;\r
       Lab : St_Address;\r
\r
     BEGIN\r
{$IFDEF RC5000}\r
       MegaMakeAddr(ESTTop);\r
       IF ESTTop^.T_ObjectOffset <> 0 THEN\r
         CodeConst(mADC,ESTTop^.T_ObjectOffset,AnonymousSpix);\r
       CodeConst(mSTL,ParamIndex,AnonymousSpix);\r
       Lab := ESTTop^.OprType;\r
       ESTPop;\r
       MegaMakeAddr(ESTTop);\r
       IF ESTTop^.T_ObjectOffset <> 0 THEN\r
         CodeConst(mADC,ESTTop^.T_ObjectOffset,AnonymousSpix);\r
       MakeFreeReg(2);\r
       St_Retrievetype(ESTTop^.OprType,Ptr);\r
       ESTPop;\r
       IF is_dynamic(Ptr,Ptr^.st_Size) THEN PushAddr(Ptr)\r
                               ELSE ESTPUSHConst(IntegerType,Ptr^.St_Size);\r
       MegaLoad(ESTTop);\r
       ESTPop;\r
       St_Retrievetype(Lab,Ptr);\r
       IF is_dynamic(Ptr,Ptr^.st_Size) THEN PushAddr(Ptr)\r
                               ELSE ESTPUSHConst(IntegerType,Ptr^.St_Size);\r
       MegaLoad(ESTTop);\r
       ESTPop;\r
\r
{$ENDIF}\r
{$IFDEF RC3502}\r
       MegaLoad(ESTTop);\r
       Lab := ESTTop^.OprType;\r
       ESTPop;\r
       St_Retrievetype(ESTTop^.OprType,Ptr);\r
       IF is_dynamic(Ptr,Ptr^.st_Size) THEN PushAddr(Ptr)\r
                               ELSE ESTPUSHConst(IntegerType,Ptr^.St_Size);\r
       MegaLoad(ESTTop);\r
       ESTPop;\r
       St_Retrievetype(Lab,Ptr);\r
       IF is_dynamic(Ptr,Ptr^.st_Size) THEN PushAddr(Ptr)\r
                               ELSE ESTPUSHConst(IntegerType,Ptr^.St_Size);\r
       MegaLoad(ESTTop);\r
       ESTPop;\r
       ESTPop;\r
{$ENDIF}\r
{$IFDEF pi3}\r
\r
       MinFreeReg := 0;\r
\r
       if (incode=clt) or (incode=cge) then\r
       BEGIN Reg1 := DX; Reg2 := CX END ELSE\r
       BEGIN Reg1 := CX; Reg2 := DX END;\r
\r
       St_Retrievetype(ESTTop^.OprType,Ptr);\r
       ReturnLengthIn(Reg1,Ptr);\r
       St_RetrieveType(ESTTop^.BackWard^.OprType,Ptr);\r
       ReturnLengthIn(Reg2,Ptr);\r
\r
       if Reg1 = CX THEN LoadAddrOfTopElems\r
       ELSE LoadAddr2OfTopElems;\r
\r
       CodeRegReg(iSUB,w,DX,CX);\r
       St_Declaration(cLabel,AnonymousName,Lab,Ptr);\r
       CodeJump(iJGE,Lab);\r
       CodeRegReg(iADD,w,CX,DX);\r
       GenerateLabel(Lab);\r
       GenCode(iCLD);\r
{$ENDIF}\r
     END;\r
\r
\r
\r
\r
\r
   PROCEDURE AfterStringOpr;\r
       (* procedure used when assign string, exchange string and compare\r
          string *)\r
     BEGIN\r
{$IFDEF PI3}\r
       ReleaseRegister(DX);\r
       ReleaseRegister(CX);\r
       ReleaseRegister(ES);\r
       ReleaseRegister(DI);\r
       ReleaseRegister(SI);\r
       ESTPop;\r
       ESTPop;\r
       UpdateDsAndSP;\r
\r
       MinFreeReg := NormalMinFreeReg;\r
{$ENDIF}\r
     END;\r
\r
\r
\r
    (*------------------------------------------------------------------ *)\r
{$IFDEF RC5000}\r
   Function BitsInWord(L : Longint): Integer;\r
   VAR I, Count : Integer;\r
   Begin\r
     Count := 0;\r
     For i := 0 TO 31 DO\r
     If (L AND (1 SHL i)) <> 0 THEN Count := Count + 1;\r
     BitsInWord := Count;\r
   END;\r
{$ENDIF}\r
\r
    PROCEDURE CheckRange(StAddr : St_Address; ErrorInt, ErrorExc : integer);\r
      (* StAddr specifies a type node. IF the node is a subrange type\r
         the procedure generates code to check if stacktop is in the range *)\r
\r
      VAR\r
        Low, High : integer;\r
        longlow,longhigh : longint;\r
        InstType : InstrucType;\r
        Static : boolean;\r
        Kind : codes;\r
        Size : word;\r
        two_power : Boolean;\r
\r
      BEGIN\r
{$IFDEF pi3}\r
        St_RetrieveType(ESTTop^.OprType,PtrSt);\r
        Size := PtrSt^.St_Size;\r
\r
        IF Size = 1 THEN\r
          BEGIN\r
            InstType := b;\r
            St_GetBaseType(ESTTop^.OprType,PtrSt);\r
            IF PtrSt^.St_Size = 2 THEN\r
              BEGIN\r
                SetHighByteTo0(ESTTop);\r
                ESTTop^.OprType := IntegerType;\r
                InstType := w;\r
              END;\r
          END\r
        ELSE\r
          InstType := w;\r
\r
        LoadRegister(ESTTop,AllRegister,RNil,InstType);\r
{$ENDIF}\r
\r
        St_RetrieveType(StAddr,PtrSt);\r
\r
        Kind := PtrSt^.St_Kind;\r
        IF Kind = CArrayType THEN\r
          BEGIN\r
            IF is_dynamic(PtrSt, Size) THEN\r
              Static := false\r
            ELSE\r
              BEGIN\r
                St_RetrieveType(PtrSt^.IType,PtrSt);\r
                Kind := PtrSt^.St_Kind;\r
                Static := PtrSt^.Subr_Mode = stat;\r
              END;\r
          END\r
        ELSE\r
          IF Kind = cSubRange THEN\r
            Static := PtrSt^.Subr_Mode = Stat\r
          ELSE\r
            Static := true;\r
\r
\r
\r
        IF Static THEN\r
          BEGIN\r
\r
\r
\r
                (* Make the check *)\r
                IF Kind = cSubrange THEN\r
                  BEGIN\r
                    Low := PtrSt^.Subr_Low;\r
                    High := PtrSt^.Subr_High;\r
                  END\r
                ELSE\r
                IF Kind = cScalar THEN\r
                  BEGIN\r
                    Low := 0;\r
                    High := PtrSt^.Scalar_no - 1;\r
                  END\r
                ELSE\r
                IF Kind = cBoolean THEN\r
                  BEGIN\r
                    Low := 0;\r
                    High := 1;\r
                  END;\r
\r
{$IFDEF PI3}\r
\r
                Reg := ESTTop^.R;\r
\r
                (* Code for Check *)\r
                IF Low <> 0 THEN\r
                  BEGIN\r
                    CodeRegConst(iCMP,InstType,Reg,Low);\r
                    St_Declaration(CLabel,AnonymousName,Lab,Ptr);\r
                    CodeJump(iJL,Lab);\r
                  END;\r
                CodeRegConst(iCMP,InstType,Reg,High);\r
                St_Declaration(CLabel,AnonymousName,ELab,Ptr);\r
                IF Low <> 0 THEN\r
                  BEGIN\r
                    CodeJump(iJLE,ELab);\r
                    GenerateLabel(Lab);\r
                  END\r
                ELSE\r
                  CodeJump(iJBE,ELab);\r
                CodeFault(ErrorInt,ErrorExc);\r
                GenerateLabel(ELab);\r
{$ENDIF}\r
{$IFDEF RC5000}\r
                MegaLoad(ESTTop);\r
                MakeFreeReg(1);\r
\r
                longlow := low;\r
                longhigh := high;\r
                IF (InCode = cRangeCheck) AND\r
                   (Longhigh = (-longlow - 1)) AND\r
                   (BitsInWord(-Longlow) = 1) THEN\r
                BEGIN\r
                  CodeConst(mLDC,-Longlow ,Anonymousspix);\r
                  GenCode(mCWORD);\r
                END\r
                ELSE\r
                BEGIN\r
                (* Code for Check *)\r
                IF LongLow <> 0 THEN\r
                  BEGIN\r
                    CodeConst(mADC,-LongLow,Anonymousspix);\r
                  END;\r
                CodeConst(mLDC,LongHigh - Longlow + 1,Anonymousspix);\r
                GenCode(mCSUB0);\r
                IF (InCode = cRangeCheck) AND (LongLow <> 0) THEN\r
                  CodeConst(mADC,Longlow,Anonymousspix);\r
                IF (InCode = cIndexCheck) THEN\r
                   LowerBoundIndexeq0 := true;\r
                END;\r
\r
                StoreStackToTemp(ESTTop);\r
{$ENDIF}\r
              END\r
            ELSE\r
              BEGIN (* Dynamic subrange *)\r
\r
{$IFDEF RC5000}\r
                PushAddr(PtrSt); (* The dopevektores address *)\r
                MegaLoad(ESTTop^.Backward);\r
                IF Kind = cArrayType THEN AddOffsetToAddr(ESTTop,4);\r
                MegaLoad(ESTTop);\r
                GenCode(mSUB);\r
                ESTPop;\r
                PushAddr(PtrSt);\r
                IF Kind = cArrayType THEN AddOffsetToAddr(ESTTop,8)\r
                                     ELSE AddOffsetToAddr(ESTTop,4);\r
                MegaLoad(ESTTop);\r
                CodeConst(mADC, 1, AnonymousSpix);\r
                PushAddr(PtrSt);\r
                IF Kind = cArrayType THEN AddOffsetToAddr(ESTTop,4);\r
                MegaLoad(ESTTop);\r
                GenCode(mSUB);\r
                ESTPop;\r
                GenCode(mCSUB0);\r
                ESTPop;\r
                IF (InCode = cRangeCheck) THEN\r
                  BEGIN\r
                    PushAddr(PtrSt);\r
                    IF Kind = cArrayType THEN AddOffsetToAddr(ESTTop,4);\r
                    MegaLoad(ESTTop);\r
                    GenCode(mADD);\r
                    ESTPop;\r
                  END;\r
                IF (InCode = cIndexCheck) THEN\r
                   LowerBoundIndexeq0 := true;\r
                StoreStackToTemp(ESTTop);\r
\r
\r
{$ENDIF}\r
{$IFDEF PI3}\r
\r
                PushAddr(PtrSt); (* The dopevektores address *)\r
                (* Code For Check *)\r
                MinFreeReg := 0;\r
                Loc(ESTTop,Addr);\r
                ESTPop;\r
                Reg := ESTTop^.R;\r
\r
(* $nocheck*)\r
                IF Kind = CArrayType THEN\r
                  Addr.Displacement := Addr.Displacement + 2;\r
(* $Check *)\r
\r
                (* Addr gives the address of lower *)\r
\r
                CodeRegAddr(iCMP,InstType,Reg,Addr);\r
                St_Declaration(cLabel,AnonymousName,Lab,Ptr);\r
                CodeJump(iJL,Lab);\r
(* $nocheck*)\r
                Addr.Displacement := Addr.Displacement + 2;\r
(* $check*)\r
\r
                (* Addr gives the address of higher *)\r
\r
                CodeRegAddr(iCMP,InstType,Reg,Addr);\r
                St_Declaration(cLabel,AnonymousName,ELab,Ptr);\r
                CodeJump(iJLE,ELab);\r
                GenerateLabel(Lab);\r
                CodeFault(ErrorInt,ErrorExc);\r
                GenerateLabel(ELab);\r
                ReleaseAddr(Addr);\r
                MinFreeReg := NormalminFreeReg;\r
{$ENDIF}\r
              END;\r
{$IFDEF RC3502}\r
         IF Incode = cRangecheck then\r
           BEGIN\r
             MegaLoad(ESTTop);\r
             IF static and (low = 0) THEN\r
               BEGIN\r
                 CodeConst(rINTH0,high,anonymousspix);\r
               END\r
             ELSE\r
               BEGIN\r
                st_retrieveType(stAddr,PtrST);\r
                pushaddr(ptrST);\r
                ESTTop^.IndVar := false;\r
                LoadAbsAddr(ESTTop);\r
                ESTPop;\r
                GenCode(rINTRS);\r
               END;\r
           END;\r
{$ENDIF}\r
      END;\r
    (*---------------------------------------------------------------- *)\r
\r
\r
\r
\r
\r
\r
   PROCEDURE StoreRepCounter(Reg : Register; Offset : Word);\r
      (* Rep Counter is given in Reg. Reg is stored in the word given by\r
         offset *)\r
      VAR\r
        Addr : Address;\r
        Ptr : St_elemptr;\r
        Lab : St_Address;\r
      BEGIN\r
{$IFDEF PI3}\r
         MakeAddr(CurrentNiv,Offset,Addr,False);\r
         St_Declaration(cLabel,AnonymousName,Lab,Ptr);\r
         CodeRegConst(iCMP,w,Reg,0);\r
         CodeJump(iJGE,Lab);\r
         CodeFault(StrucInt,StrucExc);\r
         GenerateLabel(Lab);\r
         CodeAddrReg(iAdd,w,Addr,Reg);\r
{$ENDIF}\r
      END;\r
\r
   PROCEDURE InsertExternalNumber(ListOfExt : St_Address);\r
     (* the routine initilaize the current number for the external routines *)\r
     VAR\r
       i : integer;\r
       Str : Ptr_String;\r
       Ptr : st_elemptr;\r
     BEGIN\r
{$IFDEF RC5000}\r
       NoExtDecl := 0;\r
{$ENDIF}\r
       FirstExtDec := ListOfExt;\r
       i := NoPreExtDecl;\r
       WHILE Not Equal_Addr(ListOfExt,St_NillAddr) DO\r
         BEGIN\r
           i := i + 1;\r
           St_Retrieve(ListOfExt,Ptr);\r
           ListOfExt := Ptr^.Ext_Ref;\r
           St_NameOfSpix(Ptr^.Ext_Spix,Str);\r
           LengthOfAllExtName := LengthOfAllExtName + Length(Str^);\r
           St_Get(Ptr^.Ext_Owner,Ptr);\r
           Ptr^.St_CurNo := i;\r
           NoExtDecl := NoExtDecl + 1;\r
         END;\r
     END;\r
\r
   Procedure MegaTestLoad(Ahead : Boolean);\r
   VAR Size : integer;\r
       Int16 : boolean;\r
       rangech : boolean;\r
       loadkind : (usemegaload,usemove,notload);\r
     BEGIN\r
{$IFDEF RC5000}\r
       St_RetrieveType(ESTTop^.OprType,Ptr);\r
       Size := Ptr^.St_Size;\r
       Int16 := (Ptr^.St_Kind = CSubrange) AND (Size = 2);\r
       RangeCh := false;\r
\r
       IF Ahead then\r
         BEGIN\r
           readcode;\r
           LookAHead := True;\r
           IF (InCode = cRangeCheck) AND Int16 THEN\r
             BEGIN\r
               ReadSymbol;\r
               St_RetrieveType(InSymbol,Ptr);\r
               IF NOT ((Ptr^.St_Kind = CSubrange) AND (Ptr^.St_Size = 2))\r
               THEN\r
                 BEGIN\r
                   RangeCh := true;\r
                   LookAHead := false;\r
                 END\r
               ELSE\r
                 ReadCode;\r
             END;\r
         END;\r
       IF (InCode <> cEndAssign) THEN\r
         BEGIN\r
        IF (Int16) THEN\r
       BEGIN\r
         LoadInt16;\r
       END\r
       ELSE\r
         BEGIN\r
           IF Size =  1 THEN LoadKind := usemegaload\r
           ELSE\r
           IF (Size = 4) THEN\r
              IF MegaAllign(ESTTop) THEN\r
                 LoadKind := usemegaload\r
              ELSE\r
                 LoadKind := UseMove\r
           ELSE\r
           IF (InCode = cValueParam) AND\r
              ( (Size = 2) OR\r
                (Size = 3)) THEN\r
             IF MegaAllign(ESTTop) THEN\r
                 LoadKind := usemegaload\r
              ELSE\r
                 LoadKind := UseMove\r
           ELSE\r
             LoadKind := NotLoad;\r
\r
\r
          IF LoadKind = UseMove THEN\r
            MegaMoveToTemp(ESTTop)\r
          ELSE\r
           IF (LoadKind = UseMegaLoad) AND\r
           ((ESTSort(ESTTop) = S_Stack) OR (ESTTop^.Kind = O_Temp)) AND\r
           (ESTTop^.T_Address) THEN\r
             BEGIN\r
               MegaLoad(ESTTop);\r
               StoreStackToTemp(ESTTop);\r
             END;\r
         END;\r
        END;\r
       IF Rangech then CheckRange(InSymbol,OutOfRangeInt,OutOfRangeExc);\r
{$ENDIF}\r
    END;\r
«eof»