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

⟦318339f30⟧ TextFile

    Length: 63370 (0xf78a)
    Types: TextFile
    Names: »RTP86P4C.PAS«

Derivation

└─⟦037c0ce35⟧ Bits:30010524 DVBS1.SW2114.src.2.6-2 RTP compiler source SW2104+SW2114 Disk#2 30/1-92 HHA
    └─⟦this⟧ »RTP\RTP86P4C.PAS« 
└─⟦828f0d3dd⟧ Bits:30010527 DVBS1.SW2114.src.2.6-5 RTP Compiler Source SW2104+SW2114 Disk 2 92.02.03 HEJ HHA
    └─⟦this⟧ »RTP\RTP86P4C.PAS« 
└─⟦891417be1⟧ Bits:30010519 DVBS1.SW2114.src.2-1 SW2114 1/4 Real Time Pascal 2.7 92.06.16
    └─⟦this⟧ »RTP\RTP86P4C.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\RTP86P4C.PAS« 

TextFile

Procedure Do_cField;\r
          BEGIN\r
            ReadSymbol;\r
\r
            IF InCode = CFieldInit THEN\r
              BEGIN\r
{$IFDEF PI3}\r
                LoadAddrUse(ESTTop,DI);\r
                IF (ESTTop^.A_Seg = ES) AND InDeclPart THEN\r
                  BEGIN\r
                ReleaseRegister(ESTTop^.A_Seg);\r
                ESTTop^.A_Seg := SS;\r
                  END;\r
{$ENDIF}\r
                ReadCode;\r
                LookAHead := true;\r
                St_RetrieveType(InSymbol,PtrSt);\r
{$IFDEF PI3}\r
                DoNotPopTop := (InCode = cPointerType) AND\r
                           (PtrSt^.Field_Mode = Stat);\r
                IF DoNotPopTop = false THEN\r
                  BEGIN\r
                Reg := ESTTop^.A_Seg;\r
                PushOperand;\r
                GetReg(DI);\r
                IF Reg = ES THEN GetReg(Reg);\r
                ESTPushAbsAddr(AnonymousSpix,St_NillAddr,false,P_Normal,\r
                                       Reg,false,0,DI);\r
                  END;\r
{$ENDIF}\r
{$IFDEF RC3502}\r
                ESTTop^.OprType := IntegerType;\r
{$ENDIF}\r
{$IFDEF RC35_50}\r
                MakeCopyOfTop;\r
{$ENDIF}\r
              END;\r
\r
            IF ESTTop^.Par = P_Share THEN\r
              BEGIN\r
{$IFDEF PI3}\r
                ESTTop^.par := P_Normal;\r
                LoadIndAddrUse(ESTTop,RNil);\r
{$ENDIF}\r
{$IFDEF RC35_50}\r
                  MegaMakeAddr(ESTTop);\r
{$ENDIF}\r
\r
              END;\r
\r
            St_Retrieve(InSymbol,PtrSt);\r
            BitLength := PtrSt^.Bit_size;\r
            BitOffset := PtrSt^.Bit_Offset;\r
\r
            Packed1 := (PtrSt^.Bit_Size <> 0);\r
            RC3502packed := (PtrSt^.St_PackedFiel = Packed3502);\r
            TypeAddr := PtrSt^.TypeRef;\r
            ESTTop^.OprType := TypeAddr;\r
\r
            IF PtrSt^.Field_Mode = Stat THEN\r
              BEGIN\r
\r
(* $NoCheck*)\r
                CASE ESTTop^.Kind OF\r
                  O_Addr : ESTTop^.A_Offset := ESTTop^.A_Offset +\r
                                         PtrSt^.Field_Offset;\r
                  O_IndAddr : ESTTop^.I_ObjectOffset :=\r
                          ESTTop^.I_ObjectOffset + PtrSt^.Field_Offset;\r
                  O_AbsAddr : ESTTop^.A_Displacement := ESTTop^.A_Displacement +\r
                                        PtrSt^.Field_Offset;\r
\r
\r
                  O_CAddr : ESTTop^.C_ObjectOffset :=\r
                         ESTTop^.C_ObjectOffset + PtrSt^.Field_Offset;\r
{$IFDEF RC35_50}\r
                  O_Stack,\r
                  O_StackORTemp,\r
                  O_Temp : ESTTop^.T_ObjectOffset :=\r
                         ESTTop^.T_ObjectOffset + PtrSt^.Field_Offset;\r
{$ENDIF}\r
                END;\r
(* $Check*)\r
\r
              END\r
            ELSE\r
              BEGIN (* Dynamic field *)\r
                PushAddr(PtrSt);\r
{$IFDEF PI3}\r
                Loc(ESTTop,Addr);\r
                ESTPop;\r
                SetSourceAddr(Addr);\r
\r
                Reg := GetRegister(AddrRegister,RNil);\r
                CodeRegAddr(iMOV,w,Reg,Addr);\r
                ReleaseAddr(Addr);\r
\r
                AddRegToTopAddr(Reg);\r
{$ENDIF}\r
{$IFDEF RC5000}\r
                MegaMakeAddr(ESTTop^.Backward);\r
                MegaLoad(ESTTop);\r
                ESTPop;\r
                GenCode(mADD);\r
                ESTTop^.T_Allign := false;\r
                StoreStackToTemp(ESTTop);\r
{$ENDIF}\r
{$IFDEF RC3502}\r
                MegaLoad(ESTTop);\r
                ESTPop;\r
                GenCode(rUADD);\r
{$ENDIF}\r
              END;\r
            IF Packed1 THEN\r
              BEGIN\r
                (* a packed field *)\r
                   ReadCode;\r
{$IFDEF RC5000}\r
                   IF InCode = CIndVar THEN\r
                   BEGIN\r
                     if ((Bitoffset + bitlength) <= 8) OR\r
                         ((Bitlength = 16) AND RC3502Packed) THEN\r
                           ESTTop^.OprType := BooleanType\r
                     ELSE ESTTop^.OprType := IntegerType;\r
                     MegaTestLoad(False);\r
                   END ELSE LookAhead := True;\r
{$ENDIF}\r
{$IFDEF RC3502}\r
               MegaLoad(ESTTop);\r
               LoadAbsAddr(ESTTop);\r
{$ELSE}\r
                   IF Rc3502Packed THEN\r
                      BitOffset := 8 - (BitOffset + BitLength);\r
{$ENDIF}\r
\r
\r
                ESTPushConst(IntegerType,BitOffset);\r
                ESTTop^.BitLength := BitLength;\r
                IF Rc3502Packed THEN ESTTop^.Set_Temp := true;\r
{$IFDEF RC3502}\r
               LoadPacked(ESTTop);\r
{$ENDIF}\r
\r
                IF InCode = CIndVar THEN\r
                  BEGIN\r
{$IFDEF RC35_50}\r
                GetPackedElement(Esttop,TypeAddr);\r
{$ENDIF}\r
\r
{$IFDEF PI3}\r
                GetPackedElement(ESTTop,Reg);\r
{$ENDIF}\r
                St_RetrieveType(TypeAddr,Ptr);\r
                IF Ptr^.St_Kind = cSubRange THEN\r
                  TypeAddr := Ptr^.TypeRef;\r
                PopPackedElement;\r
{$IFDEF PI3}\r
                  ESTPushReg(TypeAddr,Reg);\r
{$ENDIF}\r
{$IFDEF RC35_50}\r
                  ESTPushStack(TypeAddr,false);\r
                  StoreStackToTemp(ESTTop);\r
{$ENDIF}\r
{$IFDEF RC5000}\r
                  ESTTop^.Indvar := true;\r
{$ENDIF}\r
\r
                  END\r
                ELSE\r
                  LookAHead := True;\r
              END;\r
\r
\r
END;\r
PROCEDURE do_cWithVar;\r
  var pointersize : integer;\r
          BEGIN\r
            pointersize := 4;\r
            ReadSymbol;\r
\r
            St_Retrieve(InSymbol,PtrSt);\r
\r
            TypeAddr := PtrSt^.TypeRef;\r
{$IFDEF PI3}\r
            MakeAddr(CurrentNiv,PtrSt^.Var_Offset,Addr,false);\r
\r
\r
            LoadAddrUse(ESTTop,RNil);\r
            Reg := ESTTop^.A_Index;\r
\r
            CodeAddrReg(iMOV,w,Addr,Reg);\r
            ReleaseRegister(Reg);\r
\r
            Addr.Spix := Anonymousspix;\r
(* $Nocheck*)\r
            Addr.Displacement := Addr.Displacement + 2;\r
(* $check*)\r
            CodeAddrReg(iMOV,w,Addr,ESTTop^.A_Seg);\r
            ReleaseRegister(ESTTop^.A_Seg);\r
\r
            ReleaseAddr(Addr);\r
            ESTPop;\r
{$ENDIF}\r
\r
{$IFDEF RC3502}\r
            LoadAbsAddr(ESTTop);\r
            pointersize := 3;\r
{$ENDIF}\r
\r
{$IFDEF RC35_50}\r
            PtrSt^.Var_InDir := false;\r
            PushAddr(PtrSt);\r
            PtrSt^.Var_InDir := true;\r
\r
            ExchangeTopElements;\r
            PushOperand;\r
            ESTTop^.T_Address := false;\r
{$IFDEF RC5000}\r
            ESTTop^.OprType := IntegerType;\r
{$ENDIF}\r
            MegaStore(pointersize);\r
{$ENDIF}\r
            ReadCode;\r
            IF InCode = cCheckSize THEN\r
              BEGIN\r
                ReadSymbol;\r
                St_RetrieveType(TypeAddr,Ptr);\r
                IF is_dynamic(Ptr, Ptr^.St_size) THEN\r
                  BEGIN\r
{$IFDEF PI3}\r
                Reg := RNil;\r
                ReturnLengthIn(Reg,Ptr);\r
                ESTPushReg(WordType,Reg);\r
{$ENDIF}\r
{$IFDEF RC35_50}\r
                PushAddr(Ptr);\r
{$ENDIF}\r
                  END\r
                ELSE\r
                   ESTPushConst(WordType,Ptr^.St_Size);\r
\r
                St_RetrieveType(InSymbol,Ptr);\r
                IF is_dynamic(Ptr,Ptr^.St_size) THEN\r
(*                IF (dynamictype in Ptr^.Spec_Struct) OR\r
                   (Ptr^.St_size = 0)  THEN *)\r
                  BEGIN\r
{$IFDEF PI3}\r
                Reg := RNil;\r
                ReturnLengthIn(Reg,Ptr);\r
                ESTPushReg(WordType,Reg);\r
{$ENDIF}\r
{$IFDEF RC35_50}\r
                PushAddr(Ptr);\r
{$ENDIF}\r
                  END\r
                ELSE\r
                   ESTPushConst(WordType,Ptr^.St_Size);\r
\r
                St_Declaration(cLabel,AnonymousName,Lab,Ptr);\r
{$IFDEF PI3}\r
                CMPTopElements(Neg);\r
                IF neg THEN CodeJump(iJAE,Lab)\r
                   ELSE CodeJump(iJBE,Lab);\r
{$ENDIF}\r
{$IFDEF RC5000}\r
                Inst := mGT;\r
                CMPTopElements(Inst,false);\r
                CodeJump(mCJ,Lab);\r
{$ENDIF}\r
{$IFDEF RC3502}\r
                ExchangeTopElements;\r
                MegaLoad(ESTTop);\r
                ESTPop;\r
                ESTPop;\r
                GenCode(rULT);\r
                CodeJump(rJMZEQ,Lab);\r
                St_RetrieveType(InSymbol,Ptr);\r
                IF is_dynamic(Ptr, Ptr^.St_size) THEN\r
                  BEGIN\r
                    PushAddr(Ptr);\r
                  END\r
                ELSE\r
                   ESTPushConst(WordType,Ptr^.St_Size);\r
\r
                St_RetrieveType(TypeAddr,Ptr);\r
                IF is_dynamic(Ptr,Ptr^.St_size) THEN\r
                  BEGIN\r
                    PushAddr(Ptr);\r
                  END\r
                ELSE\r
                   ESTPushConst(WordType,Ptr^.St_Size);\r
                MegaLoad(ESTTop);\r
                ESTPop;\r
                ESTPop;\r
{$ENDIF}\r
                CodeFault(WithInt,WithExc);\r
                GenerateLabel(Lab);\r
              END\r
            ELSE\r
              LookAHead := true;\r
          END;\r
\r
  PROCEDURE Do_cUp;\r
          BEGIN\r
            (* The step variabels address is on the stack *)\r
            St_Declaration(CLabel,AnonymousName,Lab,Ptr);\r
\r
\r
            SSTPushLoop;\r
            eLab := SSTTop^.ExitLabel;\r
            SSTTop^.RepeatLabel := Lab;\r
            SSTTop^.Up := (Incode = cUp);\r
            St_RetrieveType(ESTTop^.OprType,PtrST);\r
\r
            IF PtrSt^.Subr_Mode = stat THEN\r
              BEGIN (* Static subrange *)\r
(* $nocheck*)\r
                Low := PtrSt^.Subr_Low;\r
                LowInt := Low;\r
                High := PtrSt^.Subr_High;\r
                HighInt := High;\r
(* $check*)\r
                IF ( ((InCode = cUp) AND (LowInt > HighInt)) OR\r
                 ((InCode = cDown) AND (LowInt < HighInt))  ) THEN\r
                  BEGIN\r
                (* Jump to the end of the for loop *)\r
                CodeJump(iJMP,ELab);\r
                ESTPop;\r
                  END\r
                ELSE\r
                  BEGIN\r
{$IFDEF PI3}\r
                IF PtrSt^.St_Size = 1 THEN InstType := b\r
                                  ELSE InstType := w;\r
                Loc(ESTTop,Addr);\r
                CodeAddrConst(iMOV,InstType,Addr,Low);\r
                ESTPop;\r
                ReleaseAddr(Addr);\r
{$ENDIF}\r
{$IFDEF RC35_50}\r
                ESTPushConst(IntegerType,Low);\r
                MegaStore(wordsize);\r
{$ENDIF}\r
                  END;\r
              END\r
            ELSE\r
              BEGIN  (* Dynamic Subrange *)\r
{$IFDEF PI3}\r
                PushAddr(PtrST);\r
                Loc(ESTTop,Addr1);\r
                ESTPop;\r
                Reg := GetRegister(AllRegister,RNil);\r
\r
(* $Nocheck*)\r
                Addr1.Displacement := Addr1.Displacement;\r
                (* Addr1 gives the address of lower bound *)\r
\r
                CodeRegAddr(iMOV,w,Reg,Addr1);\r
                Loc(ESTTop,Addr);\r
                CodeAddrReg(iMOV,w,Addr,Reg);\r
                ESTPop;\r
                ReleaseAddr(Addr);\r
\r
                Addr1.Displacement := Addr1.Displacement + 2;\r
                (* Addr1 gives the address of high bound *)\r
\r
(* $check *)\r
                (* Make the check *)\r
                CodeRegAddr(iCMP,w,Reg,Addr1);\r
\r
                IF InCode = cUP THEN CodeJump(iJG,ELab)\r
                        ELSE CodeJump(iJL,ELab);\r
\r
                ReleaseRegister(Reg);\r
                ReleaseAddr(Addr1);\r
{$ENDIF}\r
{$IFDEF RC35_50}\r
\r
                PushAddr(PtrSt);\r
                PushAddr(PtrSt);\r
                ESTTop^.A_Offset := ESTTop^.A_Offset + wordsize;\r
{$IFDEF RC5000}\r
                Inst := mGT;\r
                CMPTopElements(Inst,incode=cDown);\r
                ESTPushDecode(St_NillAddr,St_NillAddr,mEQC);\r
{$ELSE}\r
                if incode = cDown THEN Inst := rGE ELSE Inst := rLE;\r
                CMPTopElements(Inst,false);\r
{$ENDIF}\r
                FallThruTrue;\r
                SSTTop^.ExitLabel := ESTTop^.FalseLab;\r
                ESTPop;\r
\r
                PushAddr(PtrST);\r
                MegaStore(wordsize);\r
\r
{$ENDIF}\r
              END;\r
\r
            GenerateLabel(Lab);\r
\r
END;\r
PROCEDURE Do_cShift;\r
var i : integer;\r
          BEGIN\r
{$IFDEF RC5000}\r
\r
             IF ESTTop^.Kind = O_Const THEN\r
              BEGIN\r
               i := ESTTop^.Value;\r
               IF i < 0 THEN\r
                 BEGIN\r
                   ESTTop^.Value := -i;\r
                   inst := mSHR;\r
                 END\r
               ELSE inst := mSHL;\r
               MegaOperationOnStack(Inst,false);\r
              END\r
             ELSE\r
               BEGIN\r
                 St_Declaration(CLabel,AnonymousName,Lab,Ptr);\r
                 St_Declaration(CLabel,AnonymousName,SLab,Ptr);\r
                 MegaLoad(ESTTop);\r
                 CodeConst(mSTL,ParamIndex,AnonymousSpix);\r
                 MegaLoad(ESTTop^.Backward);\r
                 CodeConst(mLDL,ParamIndex,AnonymousSpix);\r
                 MakeFreeReg(1);\r
                 CodeConst(mLDC,0,AnonymousSpix);\r
                 GenCode(mGT);\r
                 CodeJump(mCJ,Lab);\r
                 CodeConst(mLDL,ParamIndex,AnonymousSpix);\r
                 GenCode(mSHL);\r
                 CodeConst(mLDC,0,AnonymousSpix);\r
                 CodeJump(mCJ,SLab);\r
                 GenerateLabel(Lab);\r
                 CodeConst(mLDL,ParamIndex,AnonymousSpix);\r
                 gencode(mSUB);\r
                 GenCode(mSHR);\r
                 CodeConst(mLDC,0,AnonymousSpix);\r
                 GenerateLabel(SLab);\r
                 GenCode(mOR);\r
\r
                 ESTPop;\r
                 ESTTop^.oprType := IntegerType;\r
                 StoreStackToTemp(ESTTop);\r
               END;\r
{$ENDIF}\r
{$IFDEF RC3502}\r
             IF ESTTop^.Kind = O_Const THEN\r
              BEGIN\r
               i := ESTTop^.Value;\r
               IF i > 0 THEN\r
                 BEGIN\r
                   MegaLoad(ESTTop^.Backward);\r
                   CodeConst(rRECHW,(-1 SHR i) , anonymousspix);\r
                   GenCode(rAND);\r
                 END;\r
               MegaOperationOnStack(rSHC,false);\r
               IF i < 0 THEN\r
                 BEGIN\r
                   CodeConst(rRECHW,(-1) SHR -i , anonymousspix);\r
                   GenCode(rAND);\r
                 END;\r
              END\r
             ELSE\r
               BEGIN\r
                 MegaLoad(ESTTop);\r
                 CallRoutine(Anonymousspix,shift,st_Extern);\r
                 ESTPop;\r
                 ESTTop^.oprType := IntegerType;\r
               END;\r
{$ENDIF}\r
{$IFDEF PI3}\r
{$IFNDEF RTP86}\r
            MakeOperationReady(InstType,IntegerOpr);\r
{$ELSE}\r
            (*St_retrieveType(ESTTop^.BackWard^.Oprtype,PtrSt);*)\r
            St_GetBaseType(ESTTop^.BackWard^.Oprtype,PtrSt);\r
            IF PtrSt^.St_Kind = cByte\r
               (*PtrSt^.St_Size = 1*) THEN InstType := b\r
                              ELSE InstType := w;\r
{$ENDIF}\r
            IF ESTSort(ESTTop) = S_Const THEN\r
              BEGIN\r
(* $nocheck*)\r
                ValueInt := ESTTop^.Value;\r
                ESTPop;\r
\r
                IF ValueInt > 0 THEN Inst := iSHL\r
                         ELSE BEGIN\r
                             INST := iSHR;\r
                             ValueInt := -ValueInt;\r
                           END;\r
\r
                IF ValueInt <= 3 THEN\r
                  BEGIN\r
                LoadRegister(ESTTop,AllRegister,RNil,InstType);\r
                FOR i := 1 TO ValueInt DO\r
                  CodeReg(Inst,InstType,ESTTop^.R);\r
                  END\r
\r
                ELSE\r
                IF (((ValueInt >= 8 ) AND ( InstType = b)) OR\r
                ((ValueInt >= 16) AND ( InstType = w))) THEN\r
                  BEGIN   (* Result is 0 *)\r
                LoadRegister(ESTTop,AllRegister,RNil,InstType);\r
                CodeRegReg(iXOR,InstType,ESTTop^.R,ESTTop^.R);\r
                  END\r
\r
                ELSE\r
                  BEGIN\r
                GetReg(CX);\r
                CodeRegConst(iMOV,w,CX,ValueInt);\r
                LoadRegister(ESTTop,AllRegister,RNil,InstType);\r
\r
                IF InstType = w THEN InstType := vw\r
                            ELSE InstType := vb;\r
\r
                CodeReg(Inst,InstType,ESTTop^.R);\r
                ReleaseRegister(CX);\r
                  END;\r
              END\r
\r
(* $Check*)\r
            ELSE\r
              BEGIN\r
                HelpInst := InstType;\r
                IF InstType = w THEN\r
                  BEGIN\r
                Value := 16;\r
                ShiftInstType := vw;\r
                  END\r
                ELSE\r
                  BEGIN\r
                Value := 8;\r
                ShiftInstType := vb;\r
                  END;\r
                St_RetrieveType(ESTTop^.OprType,PtrSt);\r
                IF PtrSt^.St_Size = 1 THEN InstType := b\r
                              ELSE InstType := w;\r
                LoadRegister(ESTTop,SpecificReg,CX,InstType);\r
                ESTPop;\r
                LoadRegister(ESTTop,AllRegister,RNil,HelpInst);\r
                Reg := ESTTop^.R;\r
\r
\r
                St_Declaration(CLabel,AnonymousName,Lab,Ptr);\r
                St_Declaration(CLabel,AnonymousName,SLab,Ptr);\r
                St_Declaration(CLabel,AnonymousName,ELab,Ptr);\r
\r
                (* Code for shift *)\r
                CodeRegReg(iOR,InstType,CX,CX);\r
                CodeJump(iJLE,SLab);\r
                CodeRegConst(iCMP,InstType,CX,Value);\r
                CodeJump(iJGE,Lab);\r
                CodeReg(iSHL,ShiftInstType,Reg);\r
                CodeJump(iJMP,ELab);\r
                GenerateLabel(Lab);\r
                CodeRegReg(iXOR,HelpInst,Reg,Reg);\r
                CodeJump(iJMP,ELab);\r
                GenerateLabel(SLab);\r
                CodeReg(iNEG,InstType,CX);\r
                CodeRegConst(iCMP,InstType,CX,Value);\r
                CodeJump(iJGE,Lab);\r
                CodeReg(iSHR,ShiftInstType,Reg);\r
                GenerateLabel(ELab);\r
\r
                ReleaseRegister(CX);\r
              END;\r
{$ENDIF}\r
          END;\r
\r
\r
\r
      PROCEDURE  Do_cProgramCall;  (* Symbol *)\r
          VAR help : integer;\r
          BEGIN\r
            ReadSymbol;\r
\r
\r
            St_Get(InSymbol,Ptr);\r
{$IFDEF PI3}\r
\r
            PushAddr(Ptr);\r
{$ENDIF}\r
if Ptr^.st_kind<>cprogram then\r
st_retrievetype(Ptr^.TypeRef, Ptr);\r
{$IFDEF PI3}\r
while Ptr^.st_kind=cpointertype do\r
begin\r
  if not functionresultpointer then loadindaddruse(esttop,rnil);\r
  st_retrievetype(Ptr^.typeref,Ptr);\r
  esttop^.indvar:= false;\r
  functionresultpointer:= false;\r
end;\r
            Loc(ESTTop,Addr);\r
            ReleaseAddr(Addr);\r
            ESTPop;\r
(* $nocheck*)\r
            Addr.Displacement := Addr.Displacement + NoParamOffset;\r
(* $check*)\r
            Addr.Spix := AnonymousSpix;\r
            CodeAddrConst(iMOV,b,Addr,Ptr^.St_ParamSize);\r
\r
            IF Ptr^.St_ParamSize <> 0 THEN\r
              BEGIN\r
(* $nocheck*)\r
                Addr.Displacement := Addr.Displacement  - 4;\r
                CodeAddrReg(iMOV,w,Addr,SP);\r
                CodeAddrConst(iADD,w,Addr,ParamSizeForCreate);\r
                Addr.Displacement := Addr.Displacement + 2;\r
                CodeAddrReg(iMOV,w,Addr,SS);\r
(* $check*)\r
              END;\r
{$ENDIF}\r
{$IFDEF RC5000}\r
            ESTPushAddr(Anonymousspix,Integertype,false,P_Normal,Currentniv,\r
                         (Paramindex + 2) * 4);\r
            PushParam(cVarParam);\r
            ESTPushConst(IntegerType,(Ptr^.St_ParamSize + 3) div 4 );\r
            PushParam(cValueParam);\r
\r
{$ENDIF}\r
{$IFDEF RC3502}\r
            if Ptr^.st_kind<>cprogram then\r
            st_retrievetype(Ptr^.TypeRef, Ptr);\r
\r
            ParSize := Ptr^.St_ParamSize;\r
            MegaLoad(ESTTop);\r
\r
            St_Retrieve(InSymbol,Ptr);\r
            help := MegaOffset(CurrentNiv,Ptr^.Var_Offset);\r
            CodeConst(rSTVLA,Help,Anonymousspix);\r
            GenCode(rREAXD);\r
            CodeConst(rREASD,-(ParSize + 9),Anonymousspix);\r
            CodeConst(rSTVLA,Help + 3,Anonymousspix);\r
            CodeConst(rRECHW,ParSize,Anonymousspix);\r
            CodeConst(rSTVLW,Help + 6,Anonymousspix);\r
            CodeConst(rREALD,Help,Anonymousspix);\r
            RC3502programoffset := help;\r
{$ENDIF}\r
          END;\r
\r
\r
\r
PROCEDURE do_cendexchange;\r
VAR\r
  BitLength,Sign : integer;\r
  Routineno : integer;\r
\r
             BEGIN\r
\r
         IF ESTTop^.BitLength <> 0 THEN\r
           BEGIN\r
             (* The top element is packed *)\r
{$IFDEF RC3502}\r
             SecendOpr := ESTTop^.BackWard;\r
{$ELSE}\r
             SecendOpr := ESTTop^.BackWard^.BackWard;\r
{$ENDIF}\r
             Packed1 := True;\r
           END\r
         ELSE\r
           BEGIN\r
             Packed1 := False;\r
             SecendOpr := ESTTop^.BackWard;\r
           END;\r
\r
         Packed2 := SecendOpr^.BitLength <> 0;\r
{$IFDEF PI3}\r
         IF Packed1 OR Packed2 THEN\r
           BEGIN\r
             (* Packed Exchange *)\r
             (* Get The Type *)\r
             IF Packed1 THEN TypeAddr := ESTTop^.BackWard^.OprType\r
                  ELSE TypeAddr := ESTTop^.OprType;\r
             St_Retrieve(TypeAddr,Ptr);\r
             IF Ptr^.St_Size = 1 THEN InstType := b\r
                           ELSE InstType := w;\r
\r
\r
\r
             MinFreeReg := 0;\r
             IF Packed2 THEN GetPackedElement(Secendopr,Reg)\r
             ELSE\r
               BEGIN\r
                 Reg := GetRegister(ABCDRegister,RNil);\r
                 Loc(SecendOpr,Addr);\r
                 CodeRegAddr(iMOV,InstType,Reg,Addr);\r
               END;\r
\r
             ESTPushReg(IntegerType,Reg);\r
\r
             MinFreeReg := NormalMinFreeReg;\r
             WHILE NoOfFreeReg <= NormalMinFreeReg DO\r
               Push1Operand;\r
\r
\r
             MinFreeReg := 0;\r
             IF Packed1 THEN GetPackedElement(ESTTop^.BackWard,Reg)\r
             ELSE\r
               BEGIN\r
                 Reg := GetRegister(ABCDRegister,RNil);\r
                 Loc(ESTTop^.BackWard,Addr);\r
                 CodeRegAddr(iMOV,InstType,Reg,Addr);\r
               END;\r
\r
             Reg1 := ESTTop^.R;\r
             ESTPop;\r
             ESTPushReg(IntegerType,Reg);\r
\r
             MinFreeReg := NormalMinFreeReg;\r
             WHILE NoOfFreeReg < NormalMinFreeReg DO\r
               Push1Operand;\r
\r
\r
\r
             MinFreeReg := 0;\r
             IF Packed1 THEN PutPackedElement(ESTTop^.BackWard,Reg1)\r
             ELSE\r
               BEGIN\r
                 Loc(ESTTop^.BackWard,Addr);\r
                 CodeAddrReg(iMOV,InstType,Addr,Reg1);\r
                 ReleaseRegister(Reg1);\r
               END;\r
\r
              Reg := ESTTop^.R;\r
              ESTpop;\r
\r
              IF Packed1 THEN PopPackedElement\r
                ELSE\r
                  BEGIN\r
                    ESTpop;\r
                    ReleaseAddr(Addr);\r
                  END;\r
\r
             IF Packed2 THEN PutPackedElement(ESTTop,Reg)\r
             ELSE\r
               BEGIN\r
                 Loc(ESTTop,Addr);\r
                 CodeAddrReg(iMOV,InstType,Addr,Reg);\r
                 ReleaseRegister(Reg);\r
               END;\r
\r
\r
             IF Packed2 THEN PopPackedElement\r
               ELSE\r
                 BEGIN\r
                    ESTpop;\r
                    ReleaseAddr(Addr);\r
                 END;\r
\r
             MinFreeReg := NormalMinFreeReg;\r
           END\r
         ELSE\r
\r
\r
        BEGIN\r
          (* not packed exchange *)\r
          St_Retrieve(ESTTop^.OprType,PtrSt);\r
          Size := PtrSt^.St_Size;\r
\r
          MinFreeReg := 0;\r
\r
          IF (Size = 0) and not (dynamictype in PtrSt^.spec_struct) then\r
          begin\r
            estpop; estpop;\r
          end else\r
          IF (Size = 2) or (Size = 1) THEN\r
            BEGIN\r
              (* Simpel type *)\r
              Loc(ESTTop^.BackWard,Addr);\r
              Reg := GetRegister(ABCDRegister,RNil);\r
              CodeRegAddr(iMOV,w,Reg,Addr);\r
\r
              IF Size = 1 THEN InstType := b\r
                    ELSE InstType := w;\r
\r
              Loc(ESTTop,Addr);\r
              CodeRegAddr(iXCHG,InstType,Reg,Addr);\r
\r
              TypeAddr := ESTTop^.OprType;\r
              ESTPop;\r
              ReleaseAddr(Addr);\r
\r
\r
\r
              Loc(ESTTop,Addr);\r
              CodeAddrReg(iMOV,InstType,Addr,Reg);\r
              ESTPop;\r
              ReleaseAddr(Addr);\r
\r
              ReleaseRegister(Reg);\r
\r
            END\r
          ELSE\r
            (* a struc exchange . Length > 2 or dynamic length *)\r
            BEGIN\r
              IF (Size = 4) or (Size = 3) THEN\r
                BEGIN\r
                  (* The exchange is made by two xchg *)\r
                  Loc(ESTTop,Addr);\r
                  Reg1 := GetRegister(ABCDRegister,RNil);\r
                  Reg := GetRegister(AllRegister,RNil);\r
                  CodeRegAddr(iMOV,w,Reg,Addr);\r
\r
                  IF Size = 3 THEN InstType := b\r
                        ELSE InstType := w;\r
                  Addr.Spix := AnonymousSpix;\r
(* $NoCheck*)\r
                  Addr.Displacement := Addr.Displacement + 2;\r
(* $Check*)\r
                  CodeRegAddr(iMOV,InstType,Reg1,Addr);\r
\r
                  Loc(ESTTop^.BackWard,Addr1);\r
\r
\r
                  CodeRegAddr(iXCHG,w,Reg,Addr1);\r
                  Addr1.Spix := AnonymousSpix;\r
(* $NoCheck*)\r
                  Addr1.Displacement := Addr1.Displacement + 2;\r
(* $Check*)\r
\r
                  CodeRegAddr(iXCHG,InstType,Reg1,Addr1);\r
                  Loc(ESTTop,Addr);\r
                  CodeAddrReg(iMOV,w,Addr,Reg);\r
\r
                  Addr.Spix := AnonymousSpix;\r
(* $NoCheck*)\r
                  Addr.Displacement := Addr1.Displacement + 2;\r
(* $Check*)\r
\r
                  CodeAddrReg(iMOV,w,Addr,Reg1);\r
                  ReleaseAddr(Addr);\r
                  ReleaseAddr(Addr1);\r
                  ReleaseRegister(Reg);\r
                  ReleaseRegister(Reg1);\r
\r
\r
                END\r
              ELSE\r
                BEGIN\r
                  (* Struc exchange is made by MOVS *)\r
                  Bool1 := ReferenceType IN PtrSt^.Spec_Struct;\r
                  Bool := Bool1 OR\r
                    (ProcessType IN PtrSt^.Spec_Struct)\r
                 OR (ProgramType IN PtrST^.spec_Struct);\r
                  if bool and (size>4) then size:=size-4;\r
                  IF is_dynamic(PtrSt, Size) THEN\r
(*                  IF Size = 0 THEN *)\r
                    BEGIN\r
(*if (dynamictype in PtrSt^.Spec_Struct) then*)\r
begin\r
                Reg := CX;\r
                St_RetrieveType(ESTTop^.OprType,PtrSt);\r
                ReturnLengthIn(Reg,PtrSt);\r
                Inst := iMOVSB;\r
                InstType := b;\r
end;\r
                    END\r
                  ELSE\r
                    BEGIN\r
                GetReg(CX);\r
                IF ODD(Size) THEN\r
                  BEGIN\r
                    CodeRegConst(iMOV,w,CX,Size);\r
                    Inst := iMOVSB;\r
                    InstType := b;\r
                  END\r
                ELSE\r
                  BEGIN\r
                    CodeRegConst(iMOV,w,CX,Size DIV 2);\r
                    Inst := iMOVSW;\r
                    InstType := w;\r
                  END;\r
                    END;\r
\r
\r
\r
\r
                  LoadAddrOfTopElems;\r
\r
                  (* Release all register *)\r
                  ReleaseRegister(CX);\r
                  ReleaseRegister(DI);\r
                  ReleaseRegister(SI);\r
                  ReleaseRegister(ESTTop^.A_Seg);\r
                  ReleaseRegister(ESTTop^.BackWard^.A_Seg);\r
\r
\r
                  Addr.spix := Anonymousspix;\r
                  Addr.Seg := DS;\r
                  Addr.Base := RNil;\r
                  Addr.Index := SI;\r
\r
                  Addr1.Spix := ESTTop^.BackWard^.Spix;\r
                  Addr1.Seg := ES;\r
                  Addr1.Base := RNil;\r
                  Addr1.Index := DI;\r
\r
\r
                  GenCode(iCLD);\r
\r
                  IF Bool THEN\r
                  BEGIN\r
                    GenCode(iCLI);\r
                    IF Bool1 THEN\r
                    BEGIN\r
                Addr.Displacement := lockedoffset;\r
                Addr1.Displacement := lockedoffset;\r
                St_Declaration(CLabel,AnonymousName,Lab,Ptr);\r
                St_Declaration(CLabel,AnonymousName,ELab,Ptr);\r
                CodeAddrConst(iCMP,w,Addr,0);\r
                CodeJump(iJLE,Lab);\r
                GenerateLabel(ELab);\r
                CodeFaultAX(IntOnFault,reflockexc);\r
                GenerateLabel(Lab);\r
                CodeAddrConst(iCMP,w,Addr1,0);\r
                CodeJump(iJG,ELab);\r
                    END;\r
                  END;\r
\r
                  IF InstType = b THEN\r
(* $Nocheck*)\r
                    Addr.Displacement :=  $FFFF (*-1*)\r
                  ELSE\r
                    Addr.Displacement := $FFFE (* -2 *);\r
\r
(* $check*)\r
                  Addr1.Displacement := 0;\r
\r
                  St_Declaration(CLabel,AnonymousName,Lab,Ptr);\r
\r
                  GenerateLabel(Lab);\r
\r
\r
                  CodeRegAddr(iMOV,InstType,AX,Addr1);\r
                  GenCode(Inst);\r
\r
                  CodeAddrReg(iMOV,InstType,Addr,AX);\r
                  CodeJump(iLOOP,Lab);\r
\r
                  IF Bool THEN GenCode(iSTI);\r
\r
                  UpDateDSAndSp;\r
\r
\r
                END;\r
\r
\r
              ESTPop;\r
              ESTPop;\r
\r
\r
            END;\r
          MinFreeReg := NormalMinFreeReg;\r
\r
\r
\r
        END;\r
{$ENDIF}\r
{$IFDEF RC35_50}\r
        St_Retrieve(ESTTop^.OprType,PtrSt);\r
        Size := PtrSt^.St_Size;\r
\r
        IF Packed1 OR Packed2 THEN\r
          BEGIN\r
{$IFDEF RC5000}\r
            sign := ord((PtrSt^.St_Kind = csubrange) and\r
                        (PtrSt^.subr_Low >= $8000 ));\r
\r
            IF Packed1 THEN\r
              BEGIN\r
                MegaLoad(ESTTop);\r
                BitLength := ESTTop^.BitLength;\r
                CodeConst(mSTL,1,Anonymousspix);\r
                ESTPop;\r
                MegaMakeAddr(ESTTop);\r
                IF ESTTop^.T_ObjectOffset <> 0 THEN\r
                CodeConst(mADC,ESTTop^.T_ObjectOffset,Anonymousspix);\r
                ESTpop;\r
                CodeConst(mSTL,0,Anonymousspix);\r
                CodeConst(mLDC,BitLength,Anonymousspix);\r
                CodeConst(mSTL,2,Anonymousspix);\r
              END\r
            ELSE\r
              BEGIN\r
                MegaMakeAddr(ESTTop);\r
                IF ESTTop^.T_ObjectOffset <> 0 THEN\r
                CodeConst(mADC,ESTTop^.T_ObjectOffset,Anonymousspix);\r
                ESTpop;\r
                CodeConst(mSTL,0,Anonymousspix);\r
                CodeConst(mLDC,0,Anonymousspix);\r
                CodeConst(mSTL,1,Anonymousspix);\r
                CodeConst(mLDC,Size * 8,Anonymousspix);\r
                CodeConst(mSTL,2,Anonymousspix);\r
              END;\r
            IF Packed2 THEN\r
              BEGIN\r
                IF (ESTSort(ESTTop) = S_Stack) AND\r
                   (ESTSort(ESTTop^.Backward) = S_Stack)\r
                 THEN GenCode(mREV);\r
\r
                MegaMakeAddr(ESTTop^.Backward);\r
                IF ESTTop^.Backward^.T_ObjectOffset <> 0 THEN\r
                CodeConst(mADC,ESTTop^.Backward^.T_ObjectOffset,Anonymousspix);\r
\r
                IF ESTSort(ESTTop) = S_Stack THEN GenCode(mREV);\r
                MegaLoad(ESTTop);\r
                BitLength := ESTTop^.BitLength;\r
                ESTPop;\r
                ESTPop;\r
                CodeConst(mLDC,(BitLength SHL 1) + sign ,Anonymousspix);\r
              END\r
            ELSE\r
              BEGIN\r
                MegaMakeAddr(ESTTop);\r
                IF ESTTop^.T_ObjectOffset <> 0 THEN\r
                CodeConst(mADC,ESTTop^.T_ObjectOffset,Anonymousspix);\r
                ESTpop;\r
                CodeConst(mLDC,0,Anonymousspix);\r
                CodeConst(mLDC,((Size * 8) SHL 1) + sign,Anonymousspix);\r
              END;\r
            CallRoutine(AnonymousSpix,ExcPack,St_Extern);\r
\r
{$ELSE}\r
            RoutineNo := ExcPack;\r
            IF Not Packed1 THEN\r
              BEGIN\r
                LoadAbsAddr(ESTTop);\r
                RoutineNo := ExcPackRec;\r
              END;\r
            ESTPop;\r
            IF Not Packed2 THEN\r
             BEGIN\r
               IF (ESTTop^.Kind <> O_Stack) THEN\r
                 BEGIN\r
                   LoadAbsAddr(ESTTop);\r
                   RoutineNo := ExcPackRec;\r
                 END\r
               ELSE\r
                 RoutineNo := ExcRecPack\r
              END;\r
            ESTPop;\r
\r
\r
            CallRoutine(AnonymousSpix,RoutineNo,St_Extern);\r
\r
{$ENDIF}\r
          END\r
        ELSE\r
        BEGIN\r
          (* not packed exchange *)\r
            Bool1 := ReferenceType IN PtrSt^.Spec_Struct;\r
            Bool := Bool1 OR\r
                    (ProcessType IN PtrSt^.Spec_Struct)\r
                     OR (ProgramType IN PtrST^.spec_Struct);\r
{$IFDEF RC5000}\r
             if bool and (size>4) then size:=size-4;\r
{$ELSE}\r
             if bool and (size>3) then size:=size-3;\r
             Bool := bool1;\r
             Bool1 := bool1 or  (ProcessType IN PtrSt^.Spec_Struct);\r
{$ENDIF}\r
            LoadAbsAddr(ESTTop);\r
            ESTpop;\r
            LoadAbsAddr(ESTTop);\r
            St_RetrieveType(ESTTop^.OprType,PtrSt);\r
            ESTpop;\r
            IF Not Bool1 then\r
            BEGIN\r
              IF is_dynamic(PtrSt,size) then\r
                BEGIN\r
                  PushAddr(PtrSt);\r
                END\r
              ELSE\r
                ESTPushConst(IntegerType,size);\r
\r
              MegaLoad(ESTTop);\r
              ESTPop;\r
              CallRoutine(AnonymousSpix,ExcRec,St_Extern);\r
            END\r
            ELSE\r
{$IFDEF RC3502}\r
              IF Bool THEN GenCode(rCEXCH)\r
              ELSE CallRoutine(AnonymousSpix,ExcProcess,St_Extern);\r
{$ELSE}\r
              CallRoutine(AnonymousSpix,Exchange,St_Extern);\r
{$ENDIF}\r
        END;\r
{$ENDIF}\r
END;\r
\r
  PROCEDURE Do_cRecField;\r
  VAR DoAllign : Boolean;\r
          BEGIN\r
{$IFDEF PI3}\r
\r
            IF NoOfDynFields = 0 THEN\r
              BEGIN\r
                Reg := GetRegister(AllRegister,RNil);\r
                CodeRegConst(iMOV,w,Reg,ESTTop^.Value);\r
                ESTPop;\r
              END\r
            ELSE\r
              BEGIN\r
                IF ESTTop^.Kind = O_Const THEN\r
                  CodeRegConst(iADD,w,Reg,ESTTop^.Value)\r
                ELSE\r
                  BEGIN\r
                Loc(ESTTop,Addr1);\r
                CodeRegAddr(iADD,w,Reg,Addr1);\r
                ReleaseAddr(Addr1);\r
                  END;\r
                ESTPop;\r
\r
                CodeJump(iJB,Lab);\r
\r
                Loc(ESTTop,Addr);\r
(* $nocheck*)\r
                Addr.Displacement := Addr.Displacement + 2;\r
                CodeAddrReg(iMOV,w,Addr,Reg);\r
                ESTTop^.A_Displacement := ESTTop^.A_Displacement + 2;\r
(* $check*)\r
              END;\r
            NoOfDynFields := NoOfDynFields + 1;\r
{$ENDIF}\r
{$IFDEF RC5000}\r
            if incode = crecfield then readsymbol;\r
            IF NoOfDynFields = 0 THEN\r
              BEGIN\r
                CodeConst(mLDC,ESTTop^.Value,AnonymousSpix);\r
                allignsize := ((Esttop^.Value+3)DIV 4)*4 - ESTTop^.Value;\r
                alligned := true;\r
                ESTPop;\r
              END\r
            ELSE\r
              BEGIN\r
              if incode = cRecfield THEN\r
                 St_Retrieve(Insymbol,PtrSt)\r
              else\r
                St_Retrieve(ELab,PtrSt);\r
              doallign :=  ((shieldType*PtrSt^.Spec_Struct) <> []);\r
\r
              IF ESTTop^.Kind = O_Const THEN\r
                BEGIN\r
                  allignsize :=(((Esttop^.Value+3)DIV 4)*4 - ESTTop^.Value +\r
                                allignsize) mod 4;\r
                  IF DoAllign THEN\r
                  IF Alligned THEN\r
                    BEGIN\r
                      ESTTop^.Value := ESTTop^.Value + AllignSize;\r
                      allignSize := 0;\r
                      doallign := false;\r
                    END\r
                  ELSE\r
                    BEGIN\r
                      ESTTop^.Value := ESTTop^.Value + 3;\r
                    END;\r
                  CodeConst(mADC,ESTTop^.Value,AnonymousSpix);\r
                END\r
                ELSE\r
                  BEGIN\r
                    alligned := false;\r
                    MegaLoad(ESTTop);\r
                    GenCode(mADD);\r
                    IF DoAllign THEN CodeConst(mADC,3,AnonymousSpix);\r
                  END;\r
                IF DoAllign THEN\r
                  BEGIN\r
                    CodeConst(mLDC,3,Anonymousspix);\r
                    GenCode(mNOT);\r
                    GenCode(mAND);\r
                    alligned := true;\r
                    allignsize := 0;\r
                  END;\r
                ESTPop;\r
\r
              St_Retrievetype(ELAB,PtrSt);\r
              PushAddr(PtrSt);\r
              IF incode <> cEndRecord THEN\r
                 AddOffsetToAddr(ESTTop,NoOfDynFields * 4);\r
              ESTPushStack(IntegerType,true);\r
              MegaStore(4);\r
\r
              IF incode <> cEndRecord THEN\r
              BEGIN\r
                St_Retrievetype(ELAB,PtrSt);\r
                PushAddr(PtrSt);\r
                AddOffsetToAddr(ESTTop,NoOfDynFields * 4);\r
                MegaLoad(ESTTop);\r
              END;\r
              ESTPop;\r
              END;\r
            NoOfDynFields := NoOfDynFields + 1;\r
{$ENDIF}\r
{$IFDEF RC3502}\r
            if incode = crecfield then readsymbol;\r
            IF NoOfDynFields = 0 THEN\r
              BEGIN\r
                megaload(ESTTop);\r
                Alligned := true;\r
                ESTPop;\r
              END\r
            ELSE\r
              BEGIN\r
              if incode = cRecfield THEN\r
               BEGIN\r
                 St_Retrieve(Insymbol,PtrSt);\r
                 doallign :=  ((shieldType35*PtrSt^.Spec_Struct) <> []);\r
               END\r
              else\r
                doallign := false;\r
\r
              IF ESTTop^.Kind = O_Const THEN\r
                BEGIN\r
                  CodeConst(rUADHW,ESTTop^.Value,AnonymousSpix);\r
                END\r
                ELSE\r
                  BEGIN\r
                    MegaLoad(ESTTop);\r
                    GenCode(rUADD);\r
                  END;\r
                ESTPop;\r
                IF DoAllign THEN\r
                      BEGIN\r
                        GenCode(rREVPW);\r
                        CodeConst(rRECHW,1,Anonymousspix);\r
                        GenCode(rAND);\r
                        GenCode(rUADD);\r
                      END;\r
\r
              IF incode <> cEndRecord THEN\r
                BEGIN\r
                  St_Retrievetype(ELAB,PtrSt);\r
                  PushAddr(PtrSt);\r
                  ESTTop^.IndVar := false;\r
                  AddOffsetToAddr(ESTTop,NoOfDynFields * 2);\r
                  GenCode(rREVPW);\r
                END;\r
              ESTPushStack(IntegerType,false);\r
              MegaStore(2);\r
\r
              END;\r
            NoOfDynFields := NoOfDynFields + 1;\r
{$ENDIF}\r
          END;\r
  PROCEDURE do_cThunkDecl;\r
  var  Offset,ParSize : integer;\r
       ReadCont : boolean;\r
  BEGIN\r
            ReadSymbol;\r
            St_Retrieve(Insymbol,PtrSt);\r
            ReadCont := true;\r
\r
{$IFDEF RC5000}\r
            ReadCont := PtrSt^.Fam_Used <> 0;\r
{$ELSE}\r
            ReadCont := Odd(PtrSt^.Fam_Used DIV Comp_Unit_Bit);\r
{$ENDIF}\r
            IF ReadCont THEN\r
            BEGIN\r
\r
            SetCodeModeToFalse;\r
\r
            RoutineDecl(InSymbol,True);\r
\r
            St_Retrieve(InSymbol,PtrSt);\r
{$IFDEF RC3502}\r
            SSTPushRoutine(PtrSt^.Type_Label,PtrSt^.St_Size,\r
                            PtrSt^.St_Type_MaxOffset,false);\r
{$ELSE}\r
            SSTPushRoutine(PtrSt^.Type_Label,0,\r
                            PtrSt^.St_Type_MaxOffset,false);\r
{$ENDIF}\r
            IF InContext THEN CurrentNiv := Routine_Level\r
                     ELSE CurrentNiv := CurrentNiv + 1;\r
            SetCodeModeToTrue;\r
            (* move the parameter *)\r
{$IFDEF PI3}\r
\r
\r
            Addr.Spix := AnonymousSpix;\r
            Addr.Seg := ss;\r
            Addr.Base := BP;\r
(* TOG *)\r
            St_Retrieve(InSymbol,Ptr);\r
            if ptr^.st_t_local_near then\r
            Addr.Displacement := 4\r
            else\r
            addr.displacement := 6;\r
            Addr.index := RNil;\r
\r
            CodeRegAddr(iLES,w,BX,Addr);\r
\r
            Addr1.Spix := AnonymousSpix;\r
            Addr1.Seg := ES;\r
            Addr1.Base := BX;\r
            Addr1.Displacement := 0;\r
            Addr1.Index := RNil;\r
\r
            ListRef := Ptr^.ListRef;\r
            WHILE Not Equal_Addr(ListRef,St_StopAddr)  DO\r
              BEGIN\r
                St_Retrieve(ListRef,Ptr);\r
                Addr.Displacement := Ptr^.Var_Offset;\r
                ListRef := Ptr^.ListRef;\r
                CodeRegAddr(iMOV,w,AX,Addr);\r
                St_GetBaseType(Ptr^.TypeRef,Ptr);\r
                IF Ptr^.St_Size = 1 THEN CodeRegReg(iXOR,b,AH,AH);\r
                CodeAddrReg(iMOV,w,Addr1,AX);\r
                Addr1.Displacement := Addr1.Displacement + 2;\r
              END;\r
{$ENDIF}\r
\r
{$IFDEF RC5000}\r
            St_Retrieve(InSymbol,Ptr);\r
            parsize := Ptr^.Type_ParamSize div 4;\r
            offset := 0;\r
            ListRef := Ptr^.ListRef;\r
            WHILE Not Equal_Addr(ListRef,St_StopAddr)  DO\r
              BEGIN\r
                St_Retrieve(ListRef,Ptr);\r
                PushAddr(Ptr);\r
                Megaload(ESTTop);\r
                ESTpop;\r
                CodeConst(mLDL,VarOff +ParSize + 2 ,Anonymousspix);\r
                CodeConst(mSTNL,Offset,AnonymousSpix);\r
                offset := Offset + 1;\r
                ListRef := Ptr^.ListRef;\r
              END;\r
{$ENDIF}\r
{$IFDEF RC3502}\r
            St_Retrieve(InSymbol,Ptr);\r
            offset := 0;\r
            ListRef := Ptr^.ListRef;\r
            WHILE Not Equal_Addr(ListRef,St_StopAddr)  DO\r
              BEGIN\r
                St_Retrieve(ListRef,Ptr);\r
                PushAddr(Ptr);\r
                ESTTop^.IndVar := true;\r
                Megaload(ESTTop);\r
                ESTpop;\r
                CodeConst(rSTVLW,8 + Offset,AnonymousSpix);\r
                offset := Offset + 2;\r
                ListRef := Ptr^.ListRef;\r
              END;\r
{$ENDIF}\r
\r
              END ELSE Files_Skip_To(PtrSt^.St_File_Mark);\r
          END;\r
\r
\r
PROCEDURE do_cEndFor;\r
          BEGIN\r
            ReadSymbol;\r
            GenerateLabel(SSTTop^.ContLabel);\r
\r
            St_Retrieve(InSymbol,PtrSt);\r
{$IFDEF PI3}\r
\r
            MakeAddr(CurrentNiv,PtrSt^.Var_Offset,Addr,False);\r
\r
            St_RetrieveType(PtrSt^.TypeRef,PtrSt);\r
\r
\r
            IF PtrSt^.St_Size = 1 THEN InstType := b\r
                          ELSE InstType := w;\r
\r
\r
            Reg := GetRegister(ABCDRegister,RNil);\r
            CodeRegAddr(iMOV,InstType,Reg,Addr);\r
\r
            IF SSTTop^.Up THEN CodeAddr(iINC,InstType,Addr)\r
                      ELSE CodeAddr(iDEC,InstType,Addr);\r
\r
\r
            IF PtrSt^.Subr_Mode = Stat THEN\r
              CodeRegConst(iCMP,InstType,Reg,PtrSt^.Subr_High)\r
            ELSE\r
              BEGIN\r
                (* Dynamic subrange *)\r
                MakeAddr(CurrentNiv,PtrSt^.Subr_Addr.Offset,Addr,False);\r
(* $nocheck*)\r
                Addr.Displacement := Addr.Displacement + 2;\r
(* $check*)\r
                (* Addr gives the address of high bound *)\r
\r
                CodeRegAddr(iCMP,w,Reg,Addr);\r
              END;\r
            CodeJump(iJNE,SSTTop^.RepeatLabel);\r
            GenerateLabel(SSTTop^.ExitLabel);\r
            ReleaseRegister(Reg);\r
{$ENDIF}\r
{$IFDEF RC5000}\r
            PushAddr(PtrSt);\r
            MakeCopyOfTop;\r
            MakeCopyOfTop;\r
            MegaLoad(ESTTop);\r
\r
            IF SSTTop^.Up THEN CodeConst(mADC,1,Anonymousspix)\r
                          ELSE CodeConst(mADC,-1,Anonymousspix);\r
            MegaStore(4);\r
\r
            St_Retrieve(InSymbol,PtrSt);\r
            St_RetrieveType(PtrSt^.TypeRef,PtrSt);\r
\r
\r
            IF PtrSt^.Subr_Mode = Stat THEN\r
              ESTPUSHConst(IntegerType,PtrSt^.Subr_High)\r
            ELSE\r
             BEGIN\r
               PushAddr(PtrSt);\r
               ESTTop^.A_Offset := ESTTop^.A_Offset + 4;\r
             END;\r
\r
             inst := mGT;\r
             CMPTopElements(Inst,not SSTTop^.Up);\r
                 ESTPushDecode(SSTTop^.RepeatLabel,St_NillAddr,iNIL);\r
             FallThruTrue;\r
             ESTPop;\r
            GenerateLabel(SSTTop^.ExitLabel);\r
{$ENDIF}\r
{$IFDEF RC3502}\r
            PushAddr(PtrSt);\r
            ESTTop^.Indvar := true;\r
            PushAddr(PtrSt);\r
            MegaLoad(ESTTop);\r
            GenCode(rREVPW);\r
            ESTPushStack(IntegerType,false);\r
\r
            IF SSTTop^.Up THEN CodeConst(rUADHW,1,Anonymousspix)\r
                          ELSE CodeConst(rUADHW,-1,Anonymousspix);\r
            MegaStore(2);\r
\r
            St_Retrieve(InSymbol,PtrSt);\r
            St_RetrieveType(PtrSt^.TypeRef,PtrSt);\r
\r
\r
            IF PtrSt^.Subr_Mode = Stat THEN\r
              ESTPUSHConst(IntegerType,PtrSt^.Subr_High)\r
            ELSE\r
             BEGIN\r
               PushAddr(PtrSt);\r
               ESTTop^.A_Offset := ESTTop^.A_Offset + 2;\r
             END;\r
\r
             Inst := rEQ;\r
             CMPTopElements(Inst,false);\r
             Decode;\r
             ESTTop^.FalseLab := SSTTop^.RepeatLabel;\r
             FallThruTrue;\r
             ESTPop;\r
            GenerateLabel(SSTTop^.ExitLabel);\r
{$ENDIF}\r
            SSTPop;\r
          END;\r
\r
\r
\r
\r
    PROCEDURE do_cStrucConst;\r
          BEGIN\r
            PushOperands;\r
\r
            ReadSymbol;\r
            St_RetrieveType(InSymbol,Ptr);\r
\r
\r
            IF is_dynamic(Ptr, Ptr^.st_size) THEN\r
(*            IF (dynamictype in Ptr^.Spec_Struct) OR\r
               (Ptr^.st_size = 0) THEN *)\r
              BEGIN (* Dynamic Type *)\r
{$IFDEF RC5000}\r
               IF ESTTop = Bottom_ESTTop THEN ReleaseStrucDyn;\r
               St_RetrieveType(Ptr^.TypeRef,Ptr);\r
\r
                PushAddr(Ptr);\r
                MakeFreeReg(3);\r
                MegaLoad(ESTTop);\r
                ESTPop;\r
                Callroutine(Anonymousspix,DynAlloc,St_Extern);\r
                St_retrieve(InSymbol,Ptr);\r
                Ptr^.Var_Indir := false;\r
                PushAddr(ptr);\r
                Ptr^.Var_Indir := true;\r
                IF (StrucInExp = false) THEN\r
                  BEGIN\r
                    StrucInExp := true;\r
                    StrucOffset := ESTTop^.A_Offset DIV 4;\r
                  END;\r
                ESTPushStack(IntegerType,true);\r
                MegaStore(4);\r
{$ENDIF}\r
{$IFDEF PI3}\r
                Reg := CX;\r
                ReturnLengthIn(Reg,Ptr);\r
\r
                (* Makes the length even *)\r
                CodeReg(iINC,w,Reg);\r
                CodeReg(iSHR,w,Reg);\r
                CodeReg(iSHL,w,Reg);\r
                SubRegToSP(Reg);\r
                ReleaseRegister(Reg);\r
{$ENDIF}\r
              END\r
            ELSE\r
              BEGIN\r
{$IFDEF PI3}\r
                (* Static type *)\r
                CodeRegConst(iSUB,w,SP,Ptr^.St_Size +\r
                      ord(odd(Ptr^.St_Size)));\r
{$ENDIF}\r
              END;\r
{$IFDEF RC5000}\r
        St_Retrieve(InSymbol,Ptr);\r
        PushAddr(Ptr);\r
        PushAddr(Ptr);\r
{$ENDIF}\r
{$IFDEF PI3}\r
            GetReg(DI);\r
            CodeRegReg(iMOV,w,DI,SP);\r
            ESTPushStack(InSymbol,True);\r
            ESTPushAbsAddr(AnonymousSpix,InSymbol,False,P_Normal,DS,False\r
                           ,0,DI);\r
{$ENDIF}\r
            NotPack := True;\r
            InStrucValue := InStrucValue + 1;\r
          END;\r
\r
\r
\r
\r
        Procedure Do_CNull;\r
        VAR Value : integer;\r
          BEGIN\r
            ReadPar;\r
            Value := InPar;\r
            ReadCode;\r
\r
            IF InCode = cEndAssign THEN\r
              BEGIN\r
{$IFDEF PI3}\r
                GetReg(AX);\r
                GetReg(CX);\r
                LoadAddrUse(ESTTop,di (* TOG RNil*));\r
                CodeRegReg( iXOR, w, AX, AX );\r
                if odd(value) then\r
                begin\r
                  if value>5 then begin\r
                CodeRegConst( iMOV, w, CX, value);\r
                GenCode(iREP);\r
                GenCode(iSTOSB);\r
                  end else\r
                for value:=1 to value do GenCode(iSTOSB);\r
                end else begin\r
                  value:= value div 2;\r
                  if value>5 then begin\r
                CodeRegConst( iMOV, w, CX, value);\r
                GenCode(iREP);\r
                GenCode(ISTOSW);\r
                  end else\r
                for value:=1 to value do GenCode(iSTOSW);\r
                end;\r
                ReleaseRegister(CX);\r
                ReleaseRegister(AX);\r
(* TOG          CodeRegConst(iADD,w,ESTTop^.A_Index,Value); *)\r
{$ENDIF}\r
{$IFDEF RC5000}\r
               IF ESTSort(ESTTop) = S_Stack THEN\r
                 CodeConst(mSTL,ParamIndex,Anonymousspix);\r
               IF (ESTTop^.Kind = O_Temp) OR (ESTTop^.Kind = O_StackOrTemp) THEN\r
                 TempOffset := TempOffset + 1;\r
               ESTPop;\r
{$ENDIF}\r
              END\r
            ELSE\r
              BEGIN\r
                (* Incode = cSaveRep *)\r
                ReadPar;\r
{$IFDEF RC5000}\r
                MegaLoad(ESTTop);\r
                CodeConst(mSTL,ParamIndex,AnonymousSpix);\r
                CodeConst(mLDL,ParamIndex,AnonymousSpix);\r
                MakeFreeReg(2);\r
                CodeConst(mLDL,MegaOffset(CurrentNiv,InPar) DIV 4,AnonymousSpix);\r
                GenCode(mADD);\r
                CodeConst(mSTL,MegaOffset(CurrentNiv,InPar) DIV 4,AnonymousSpix);\r
                ESTPop;\r
                CodeConst(mLDL,ParamIndex,AnonymousSpix);\r
                CodeConst(mLDC,Value,AnonymousSpix);\r
                GenCode(mMUL);\r
                MegaMakeAddr(ESTTop);\r
                GenCode(mADD);\r
\r
                ExchangeTopElements;\r
                IF ESTTop^.Kind = O_Temp THEN MegaAlloctemp(1);\r
                ESTPop;\r
                StoreStackToTemp(ESTTop);\r
{$ENDIF}\r
{$IFDEF PI3}\r
                LoadRegister(ESTTop,AllRegister,AX,w);\r
                St_RetrieveType(ESTTop^.OprType,Ptr);\r
                IF Ptr^.St_Size = 1 THEN SetHighByteTo0(ESTTop);\r
                GetReg(CX);\r
                GetReg(DX);\r
                CodeRegConst(iMOV,w,DX,Value);\r
                StoreRepCounter(AX,InPar);\r
                CodeReg(iMUL,w,DX);\r
                ESTPop;\r
                LoadAddrUse(ESTTop,DI (* TOG RNil*) );\r
                CodeRegReg( iMOV, w, CX, AX);\r
                CodeRegReg( iXOR, w, AX, AX);\r
                GenCode(iREP);\r
                GenCode(iSTOSB);\r
(* TOG                CodeRegReg(iADD,w,ESTTop^.A_Index,AX); *)\r
                ReleaseRegister(AX);\r
                ReleaseRegister(CX);\r
                ReleaseRegister(DX);\r
{$ENDIF}\r
                ReadCode; (* Skip endassign *)\r
                ReadCode; (* Skip RepStruc *)\r
              END;\r
          END;\r
\r
\r
        PROCEDURE  Do_RepStruc;\r
          BEGIN\r
{$IFDEF RC5000}\r
            St_RetrieveType(ESTTop^.OprType,Ptr);\r
            IF Is_Dynamic(Ptr,Ptr^.St_Size) THEN\r
             BEGIN\r
               PushAddr(Ptr);\r
               MegaLoad(ESTTop);\r
               ESTPop;\r
             END\r
            ELSE\r
              Codeconst(mLDC,Ptr^.St_Size,AnonymousSpix);\r
\r
            CodeConst(mLDL,TempAddrOffset,AnonymousSpix);\r
            GenCode(mAdd);\r
            CodeConst(mSTL,TempAddrOffset,Anonymousspix);\r
            CodeJump(mJ,SSTTop^.ContLabel);\r
            GenerateLabel(SSTTop^.EXITLabel);\r
            SSTPop;\r
\r
            IF ESTTop^.Kind <> O_Temp THEN\r
             BEGIN\r
              IF ESTTop^.Kind <> O_StackOrTemp THEN MegaAllocTemp(1);\r
              IF ESTSort(ESTTop) <> S_Stack THEN\r
                BEGIN\r
                  ESTTop^.T_Allign := (MegaAllign(ESTTop)) AND\r
                                      ((Ptr^.St_Size MOD 4) = 0);\r
                  ESTTop^.T_Address := true;\r
                END;\r
              ESTTop^.Kind := O_Temp;\r
\r
             END;\r
           ESTTop^.T_ObjectOffset := OldObjectOffset;\r
           ESTTop^.T_Offset := TempAddrOffset;\r
           TempOffset := TempOffset + 1;\r
           IF TempAddrOffset <> TempOffset THEN\r
             begin\r
              MegaMakeAddr(ESTTop);\r
              storestacktotemp(ESTTop);\r
             end;\r
{$ENDIF}\r
{$IFDEF PI3}\r
\r
            IF PushReg <> RNil THEN\r
              BEGIN\r
                GetReg(PushReg);\r
                CodeReg(iPOP,w,PushReg);\r
              END;\r
            GetReg(CX);\r
            CodeReg(iPOP,w,CX);\r
            CodeJump(iLOOP,SSTTop^.ContLabel);\r
            GenerateLabel(SSTTop^.EXITLabel);\r
            SSTPop;\r
\r
            ReleaseRegister(CX);\r
            IF PushReg <> RNIL THEN ReleaseRegister(PushReg);\r
            IF OnStack THEN\r
              BEGIN\r
                CodeReg(iPOP,w,AX);\r
                CodeRegReg(iADD,w,SP,AX);\r
              END;\r
\r
            IF DSIsChange THEN\r
              BEGIN\r
                CodeRegReg(iMOV,w,AX,SS);\r
                CodeRegReg(iMOV,w,DS,AX);\r
                DSIsChange := false;\r
              END;\r
{$ENDIF}\r
          END;\r
\r
\r
  PROCEDURE Do_CheckNumber;   (* Symbol Offset Diff *) (* cConstCheckNumber :\r
                                         Offset Number *)\r
  VAR HelpI : Integer;\r
          BEGIN\r
            IF InCode = cCheckNumber THEN\r
              BEGIN\r
                ReadSymbol;\r
                St_RetrieveType(InSymbol,Ptr);\r
\r
                PushAddr(Ptr);\r
{$IFDEF PI3}\r
                Loc(ESTTop,Addr);\r
                Addr.Displacement := Addr.Displacement + 4;\r
                (* addr gives high *)\r
                Reg := GetRegister(AllRegister,RNil);\r
\r
                CodeRegAddr(iMOV,w,Reg,Addr); (* TOG *)\r
                Addr.Displacement := Addr.Displacement - 2;\r
                CodeRegAddr(iSUB,w,Reg,Addr); (* TOG *)\r
\r
                ReleaseAddr(Addr);\r
{$ENDIF}\r
\r
{$IFDEF RC5000}\r
                AddOffsetToAddr(ESTTop,8);\r
                (* addr gives high *)\r
                Megaload(ESTTop);\r
                PushAddr(Ptr);\r
                AddOffsetToAddr(ESTTop,4);\r
                (* addr gives low *)\r
                Megaload(ESTTop);\r
                GenCode(mSUB);\r
                ESTPop;\r
{$ENDIF}\r
\r
                ESTPop;\r
              END;\r
\r
            ReadPar;\r
{$IFDEF PI3}\r
            MakeAddr(CurrentNiv,InPar,Addr,False);\r
{$ENDIF}\r
{$IFDEF RC5000}\r
            MakeFreeReg(3);\r
            CodeConst(mLDL,MegaOffset(CurrentNiv,InPar) DIV 4,Anonymousspix);\r
{$ENDIF}\r
\r
            ReadPar;\r
\r
{$IFDEF RC5000}\r
            IF InCode = cCheckNumber THEN\r
              BEGIN\r
                  GenCode(mSUB);\r
                  InPar := inpar - 1\r
              END;\r
{$ENDIF}\r
{$IFDEF PI3}\r
            IF InCode = cCheckNumber THEN\r
              BEGIN\r
                  CodeRegAddr(iSUB,w,Reg,Addr);\r
                  CodeRegConst(iCMP,w,Reg,InPar - 1);\r
                  ReleaseRegister(Reg);\r
              END\r
            ELSE\r
              CodeAddrConst(iCMP,w,Addr,InPar);\r
{$ENDIF}\r
            St_Declaration(cLabel,AnonymousName,Lab,Ptr);\r
{$IFDEF PI3}\r
            CodeJump(iJE,Lab);\r
{$ENDIF}\r
{$IFDEF RC5000}\r
            HelpI := InPar;\r
            CodeConst(mLDC,HelpI,AnonymousSpix);\r
            GenCode(mDIFF);\r
            CodeJump(mCJ,Lab);\r
{$ENDIF}\r
            CodeFault(StrucInt,StrucExc);\r
\r
            GenerateLabel(Lab);\r
          END;\r
\r
\r
\r
PROCEDURE do_cInitShar;\r
          BEGIN\r
            ESTTop^.Par := P_Normal;\r
{$IFDEF PI3}\r
            LoadAddrUse(ESTTop,SI);\r
\r
            (* Push paramater to InitShared *)\r
            CodeReg(iPUSH,w,SS);\r
            CodeReg(iPUSH,w,SI);\r
\r
            CodeReg(iPUSH,w,SS);\r
            IF InCode = cInitShar THEN\r
              CodeRegConst(iADD,w,SI,LengthOfSharedtype + LengthOfSemaphore)\r
            ELSE\r
              BEGIN\r
                CodeRegReg(iMOV,w,SI,SP);\r
                CodeRegConst(iADD,w,SI,LengthOfSemaphore + 6 );\r
                (* 6 bytes have been pushed after allocdynshare *)\r
              END;\r
\r
            CodeReg(iPUSH,w,SI);\r
\r
            (* Push parameter to InitSemaphore *)\r
            CodeRegConst(iSUB,w,SI,LengthOfSemaphore);\r
            CodeReg(iPUSH,w,SS);\r
            CodeReg(iPUSH,w,SI);\r
            CodeRegConst(iMOV,w,SI,1);\r
            CodeReg(iPUSH,w,SI);\r
\r
\r
            ReleaseRegister(SI);\r
            ESTPop;\r
\r
            CallRoutine(AnonymousSpix,Init_Semaphore,St_Extern);\r
            CallRoutine(AnonymousSpix,Init_Shared,St_Extern);\r
{$ENDIF}\r
{$IFDEF RC3502}\r
            (* Push paramater to InitShared *)\r
            HelpLong := ESTTop^.A_Offset;\r
            ESTPop;\r
            CodeConst(rREALD,HelpLong,Anonymousspix);\r
            CallRoutine(AnonymousSpix,Init_Reference,St_Extern);\r
            IF InCode = cInitShar THEN\r
              BEGIN\r
                 CodeConst(rREALD,helpLong\r
                          + LengthOfSharedType + LengthOfSemaphore,Anonymousspix);\r
                 CodeConst(rSTVLA,HelpLong + referencesize,Anonymousspix);\r
                 CodeConst(rREALD,helpLong\r
                          + LengthOfSharedType,Anonymousspix);\r
\r
              END\r
            ELSE\r
              BEGIN\r
                AllocDynamic(SharedAlloc,referencesize,HelpLong + referencesize);\r
                CodeConst(rREVLA,HelpLong + referencesize,Anonymousspix);\r
                GenCode(rREVPD);\r
                CodeConst(rREASD,LengthOfSemaphore,Anonymousspix);\r
                CodeConst(rSTVLA,HelpLong + referencesize,Anonymousspix);\r
              END;\r
\r
\r
            GenCode(rREVPD);\r
            CallRoutine(AnonymousSpix,Init_MailBox,St_Extern);\r
\r
            (* Push parameter to InitSemaphore *)\r
\r
            CodeConst(rRECHW,1,Anonymousspix);\r
            CodeConst(rRECHW,0,Anonymousspix);\r
            CallRoutine(AnonymousSpix,Init_semaphore,St_Extern);\r
{$ENDIF}\r
{$IFDEF RC5000}\r
            (* Push paramater to InitShared *)\r
            IF InCode = cInitShar THEN\r
              BEGIN\r
                MakeCopyOfTop;\r
                MakeCopyOfTop;\r
                MegaMakeAddr(ESTTop);\r
                ESTTop^.T_ObjectOffset := ESTTop^.T_ObjectOffset\r
                       + LengthOfSharedType + LengthOfSemaphore;\r
              END\r
            ELSE\r
              BEGIN\r
                ESTPushStack(IntegerType,False);\r
                ESTTop^.T_Address := True;\r
                ESTTop^.T_ObjectOffset := LengthOfSemaphore;\r
                CodeConst(mSTL,ParamIndex,Anonymousspix);\r
                CodeConst(mLDL,ParamIndex,Anonymousspix);\r
              END;\r
            PushOperand;\r
            ESTPop;\r
            PushOperand;\r
            ESTPop;\r
            CallRoutine(AnonymousSpix,Init_Shared,St_Extern);\r
            (* Push parameter to InitSemaphore *)\r
\r
            CodeConst(mLDC,1,Anonymousspix);\r
            IF InCode = cInitDynShar THEN\r
              BEGIN\r
                CodeConst(mLDL,ParamIndex,Anonymousspix);\r
              END\r
            ELSE\r
              BEGIN\r
                AddOffsetToAddr(ESTTop,LengthOfSharedType);\r
                PushOperand;\r
              END;\r
            ESTPop;\r
            CallRoutine(AnonymousSpix,Init_Semaphore,St_Extern);\r
{$ENDIF}\r
          END;\r
\r
Procedure Do_cDiv;\r
          BEGIN\r
{$IFDEF RC35_50}\r
           IF incode = cDIV then Inst := iDIV ELSE Inst := iMOD;\r
           MegaOperationOnStack(Inst,false);\r
{$ENDIF}\r
\r
{$IFDEF PI3}\r
\r
            LoadRegister(ESTTop^.BackWard,SpecificReg,AX,w);\r
\r
            MakeOperationReady(InstType,IntegerOpr);\r
            IF InstType = b THEN\r              BEGIN\r
                CodeRegReg(iXOR,b,AH,AH);\r
                Inst := iDIV;\r
              END\r
            ELSE\r
              BEGIN\r
                GetReg(DX);\r
                IF IntegerOpr THEN\r
                  BEGIN\r
                GenCode(iCWD);\r
                Inst := iIDIV;\r
                  END\r
                ELSE\r
                  BEGIN\r
                CodeRegReg(iXOR,w,DX,DX);\r
                Inst := iDIV;\r
                  END;\r
               END;\r
\r
            IF ESTSort(ESTTop) = S_Memery  THEN\r
             BEGIN\r
               MinFreeReg := 0;\r
               Loc(ESTTop,Addr);\r
               MinFreeReg := NormalMinFreeReg;\r
               ESTPop;\r
               CodeAddr(Inst,InstType,Addr);\r
               ReleaseAddr(Addr);\r
             END\r
\r
            ELSE\r
              BEGIN\r
                LoadRegister(ESTTop,AllRegister,Rnil,InstType);\r
                Reg := ESTTop^.R;\r
                ESTPop;\r
                CodeReg(inst,InstType,Reg);\r
\r
                ReleaseRegister(Reg);\r
              END;\r
\r
            IF InCode = cMOD THEN\r
              IF InstType = b THEN\r
                CodeRegReg(iMOV,b,AL,AH)\r
              ELSE\r
                BEGIN\r
                  TypeAddr := ESTTop^.OprType;\r
                  ESTPop;\r
                  ESTPushReg(TypeAddr,DX);\r
                  ReleaseRegister(AX);\r
                END\r
            ELSE (* InCode = cDIV *)\r
              IF InstType = w THEN ReleaseRegister(DX);\r
{$ENDIF}\r
          END;\r
\r
\r
\r
Procedure Do_cprocdecl;\r
          BEGIN\r
            ReadSymbol;\r
            St_Retrieve(InSymbol,ptrSt);\r
\r
            (* a normal routine declaration *)\r
            SetCodeModeToFalse;\r
\r
            RoutineDecl(InSymbol,True);\r
\r
            St_Retrieve(InSymbol,ptrSt);\r
\r
            SLab := PtrSt^.St_Label;\r
            SSTPushRoutine(SLab,PtrSt^.St_VarSize,PtrSt^.Max_Offset,\r
                           (ReferenceType IN PtrSt^.spec_struct));\r
\r
            IF PtrSt^.St_Specs = St_Global THEN\r
              BEGIN  (* a global routine *)\r
                MakeExternalLBDR(InSymbol,SLab,0,0,0,PtrSt^.St_Spix,1);\r
\r
                InsertExternalNumber(PtrSt^.St_External_List);\r
\r
\r
                GlobalBlockSymbol := InSymbol;\r
\r
                CurrentNiv := Routine_Level;\r
\r
{$IFDEF RC5000}\r
                SSTTop^.ExternalRoutine := True;\r
\r
                IF Comp_Unit_Bit = Last_Comp_Unit_bit THEN\r
{$ENDIF}\r
              BEGIN\r
                (* Read The context *)\r
                OldCurrentNiv := CurrentNiv;\r
                oldcode := codeon;\r
                oldSourceNumber := SourceNumber;\r
                CurrentNiv := Context_Level;\r
\r
                InContext := true;\r
                NoOfTimesInContext := NoOfTimesInContext + 1;\r
\r
                Files_Jump_Start;\r
               END;\r
                IF Comp_Unit_Bit = Last_Comp_Unit_bit\r
                THEN Comp_Unit_Bit := 1\r
                ELSE Comp_Unit_Bit := Comp_Unit_bit * 2;\r
{$IFDEF RC5000}\r
               Comp_unit_bit := 1;\r
{$ENDIF}\r
\r
              END\r
            ELSE\r
              CurrentNiv := CurrentNiv + 1;\r
\r
{$IFDEF PI3}\r
if incode=cfuncdecl then\r
if (ptrst^.st_size>4) or (dynamictype in ptrst^.spec_struct) then\r
begin\r
SetCodeModeToTrue;\r
getreg(SI);\r
with ptrst^ do\r
estpushaddr(st_spix,typeref,false,p_normal,currentniv,func_result_offset);\r
loc(esttop,addr);\r
codeaddrreg(imov,w,addr,SI);\r
releaseRegister(SI);\r
addr.displacement:=addr.displacement+2;\r
codeaddrreg(imov,w,addr,DS);\r
releaseaddr(addr);\r
estpop;\r
end;\r
{$ENDIF}\r
\r
          END;\r
\r
\r
«eof»