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

⟦73c8df5da⟧ TextFile

    Length: 31571 (0x7b53)
    Types: TextFile
    Names: »RTP86P4D.PAS«

Derivation

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

TextFile

\r
procedure do_clockstat;\r
             BEGIN\r
         ReadSymbol;\r
\r
{$IFDEF PI3}\r
\r
         LoadAddrUse(ESTTop,SI);\r
         Loc(ESTTop,Addr);\r
(* $nocheck*)\r
         Addr.Displacement := Addr.Displacement + LockedOffset;\r
(* $check*)\r
\r
         CodeAddrConst(iCMP,w,Addr,$FFFF);\r
\r
         St_Declaration(cLabel,AnonymousName,Lab,Ptr);\r
         CodeJump(iJNE,Lab);\r
         CodeFault(LockInt,LockExc);\r
         GenerateLabel(Lab);\r
\r
         CodeAddr(iINC,w,Addr);\r
(* $nocheck*)\r
         Addr.Displacement := Addr.Displacement - LockedOffset;\r
(* $check*)\r
\r
         (* Push the address of th ref variabel *)\r
         CodeReg(iPUSH,w,ESTTop^.A_Seg);\r
         CodeReg(iPUSH,w,SI);\r
         SSTPush;\r
         SSTTop^.Kind := S_Lock;\r
\r
         SetSourceAddr(Addr);\r
         GetReg(ES);\r
         CodeRegAddr(iMOV,w,ES,Addr);\r
         ReleaseAddr(Addr);\r
         ESTPop;\r
\r
\r
         (* ES:0 Gives the address of the buffer attribute *)\r
\r
         With Addr Do\r
           BEGIN\r
             Spix := AnonymousSpix;\r
             Seg := ES;\r
             Base := RNil;\r
             Index := RNil;\r
           END;\r
\r
\r
         Reg := GetRegister(AllRegister,RNil);\r
         Addr.Displacement :=  OffSetOffSet;\r
\r
         Reg1 := GetRegister(AllRegister,RNil);\r
         IF InCode = cLockBufStat THEN\r
           Addr.Displacement := DataSizeOffset\r
         ELSE BEGIN\r
           CodeRegAddr(iMOV,w,Reg,Addr);\r
           Addr.Displacement := TopOffset;\r
         END;\r
         CodeRegAddr(iMOV,w,Reg1,Addr);\r
\r
         Addr.Displacement := DataPartOffset;\r
         CodeRegAddr(iMOV,w,ES,Addr);\r
\r
         (* Address of the buffer is : ES:0 *)\r
\r
\r
\r
         St_Retrieve(InSymbol,Ptr);\r
\r
\r
         TypeAddr := Ptr^.TypeRef;\r
         MakeAddr(CurrentNiv,Ptr^.Var_Offset,Addr,False);\r
         IF InCode = cLockBufStat THEN CodeAddrConst(iMOV,w,Addr,0)\r
                            ELSE CodeAddrReg(iMOV,w,Addr,Reg);\r
(* $nocheck*)\r
         Addr.Displacement := Addr.Displacement + 2;\r
(* $check*)\r
         CodeAddrReg(iMOV,w,Addr,ES);\r
         ReleaseRegister(ES);\r
\r
\r
             OldInCode:= InCode;\r
             ReadCode;\r
             IF InCode = CNoLocalDecl THEN\r
             BEGIN\r
         IF OldInCode = CLockBufStat THEN\r
           BEGIN\r
{$IFDEF RTP86}\r
             CodeReg(iPUSH,w,Reg1);\r
{$ENDIF}\r
           END\r
         ELSE\r
           BEGIN (* CLockStat *)\r
{$IFDEF RTP86}\r
             CodeReg(iPUSH,w,Reg);\r
             CodeReg(iPUSH,w,Reg1);\r
{$ELSE}\r
             CodeRegReg(iSUB,w,Reg1,Reg);\r
{$ENDIF}\r
           END;\r
         ReleaseRegister(Reg);\r
{$IFNDEF RTP86}\r
         St_Retrieve(TypeAddr,ptr);\r
         PushAddr(ptr);\r
         Loc(ESTTop,Addr);\r
         CodeAddrReg(iMOV,w,Addr,Reg1);\r
         ReleaseAddr(Addr);\r
         ESTPop;\r
{$ENDIF}\r
\r
         ReleaseRegister(Reg1);\r
             END ELSE\r
\r
             IF InCode = CCheckSize THEN\r
             BEGIN\r
         IF OldInCode = CLockStat THEN\r
           CodeRegReg(iSUB,w,Reg1,Reg);\r
         ReleaseRegister(Reg);\r
\r
         EstPushReg(WordType, Reg1);\r
         ReadSymbol;\r
         St_RetrieveType(InSymbol, ptr);\r
         IF ptr^.st_size=0 THEN\r
         BEGIN\r
           Reg2 := RNil;\r
           ReturnLengthIn( Reg2, ptr);\r
           EstPushReg(WordType, Reg2);\r
         END ELSE EstPushConst(WordType, ptr^.St_Size);\r
\r
         CmpTopElements(neg);\r
         St_Declaration(clabel,anonymousname,lab,ptr);\r
         IF neg THEN CodeJump(iJBE,Lab)\r
         ELSE CodeJump(iJAE,LAB);\r
         CodeFault(WithInt,WithExc);\r
         GenerateLabel(Lab);\r
             END ELSE\r
             BEGIN\r
         ReleaseRegister(Reg);\r
         ReleaseRegister(Reg1);\r
             END;\r
\r
         (* Call the familye *)\r
\r
{$ENDIF}\r
{$IFDEF RC5000}\r
         ReleaseStrucDyn;\r
         ESTTop^.OprType := IntegerType;\r
         MakeCopyOfTop;\r
         ExchangeTopElements;\r
         SSTPush;\r
         SSTTop^.Kind := S_Lock;\r
         SSTTop^.ESTLockVar := ESTTop;\r
         ESTTop := ESTTop^.Backward;\r
         ESTTop^.xforward := nil;\r
\r
         MakeCopyOfTop;\r
\r
         MakeCopyOfTop;\r
         MegaLoad(ESTTop);\r
         CodeConst(mEQC,0,Anonymousspix);\r
         St_Declaration(cLabel,AnonymousName,Lab,Ptr);\r
         CodeJump(mCJ,Lab);\r
         CodeFault(LockInt,LockExc);\r
         GenerateLabel(Lab);\r
         ESTPop;\r
\r
         AddOffsetToAddr(ESTTop, LockedOffset);\r
         MakeCopyOfTop;\r
\r
         MegaLoad(ESTTop);\r
         CodeConst(mADC,1,Anonymousspix);\r
         MegaStore(4);\r
\r
         IF (ESTTop^.Kind = O_Addr) AND (ESTTop^.A_Niv = CurrentNiv) THEN\r
         BEGIN\r
           MegaPointer;\r
           ESTTop^.AccessCheck := false;\r
         END\r
         ELSE\r
         BEGIN\r
            MegaLoad(ESTTop);\r
            ESTTop^.T_Address := true;\r
            ESTTop^.T_ObjectOffset := 0;\r
            ESTTop^.T_Allign := true;\r
          END;\r
         MakeCopyOfTop; (* pointer to header *)\r
         IF Incode <> cLockBufStat THEN\r
         BEGIN\r
           MakeCopyOfTop;\r
           AddOffsetToAddr(ESTTop,OffsetOffset);\r
           MegaLoad(ESTTop);\r
           MegaLoad(ESTTop^.Backward);\r
           GenCode(mADD);\r
           ESTPop;\r
         END\r
         ELSE\r
           MegaLoad(ESTTop);\r
\r
\r
\r
         St_Retrieve(InSymbol,Ptr);\r
\r
\r
         TypeAddr := Ptr^.TypeRef;\r
         Ptr^.Var_InDir := false;\r
         PushAddr(Ptr);\r
         Ptr^.Var_InDir := True;\r
         ExchangeTopElements;\r
         MegaStore(4);\r
\r
\r
         OldInCode:= InCode;\r
         ReadCode;\r
\r
         IF InCode = CNoLocalDecl THEN\r
           BEGIN\r
             ESTTop^.IndVar := true;\r
             IF OldInCode = CLockBufStat THEN\r
               BEGIN\r
                 AddOffsetToAddr(ESTTop, DataSizeOffset);\r
                 MegaLoad(ESTTop);\r
               END\r
             ELSE\r
              BEGIN (* CLockStat *)\r
                MakeCopyOfTop;\r
                AddOffsetToAddr(ESTTop,TopOffset);\r
                Megaload(ESTTop);\r
                ExchangeTopElements;\r
                AddOffsetToAddr(ESTTop, OffsetOffset);\r
                MegaLoad(ESTTop);\r
                GenCode(mSUB);\r
                ESTPop;\r
              END;\r
          St_Retrieve(TypeAddr,Ptr);\r
          PushAddr(Ptr);\r
          ExchangeTopElements;\r
          MegaStore(4);\r
         END\r
\r
       ELSE\r
\r
         IF InCode = CCheckSize THEN\r
           BEGIN\r
             ReadSymbol;\r
             St_RetrieveType(InSymbol, ptr);\r
            IF is_dynamic(ptr,ptr^.St_Size) THEN\r
             BEGIN\r
              PushAddr(Ptr);\r
             END ELSE EstPushConst(WordType, ptr^.St_Size);\r
             MegaLoad(ESTTop);\r
             ExchangeTopElements;\r
\r
             IF OldInCode = CLockBufStat THEN\r
               BEGIN\r
                 AddOffsetToAddr(ESTTop,DataSizeOffset);\r
                 MegaLoad(ESTTop);\r
               END\r
             ELSE\r
              BEGIN (* CLockStat *)\r
                MakeCopyOfTop;\r
                AddOffsetToAddr(ESTTop,TopOffset);\r
                Megaload(ESTTop);\r
                ExchangeTopElements;\r
                AddOffsetToAddr(ESTTop, OffsetOffset);\r
                MegaLoad(ESTTop);\r
                GenCode(mSUB);\r
                ESTPop;\r
              END;\r
           Inst := mGT;\r
           CmpTopElements(Inst,false);\r
           ESTPushDecode(St_NillAddr,St_NillAddr,iNil);\r
           FallThruTrue;\r
           CodeFault(WithInt,WithExc);\r
           GenerateLabel(EstTop^.FalseLab);\r
           ESTPop;\r
         END\r
         ELSE\r
          LookAHead := true;\r
         (* Call the familye *)\r
\r
{$ENDIF}\r
{$IFDEF RC3502}\r
         SSTPush;\r
         SSTTop^.Kind := S_Lock;\r
\r
         LoadAbsAddr(ESTTop);\r
\r
         ESTPop;\r
\r
         OldInCode:= InCode;\r
         TypeAddr := InSymbol;\r
         ReadCode;\r
         IF InCode = cCheckSize THEN\r
          ReadSymbol;\r
\r
         IF OldInCode = CLockBufStat THEN\r
          BEGIN\r
            IF InCode = CNoLocalDecl THEN\r
              BEGIN\r
                GenCode(rREVPD);\r
                CodeConst(rREVSA,1,Anonymousspix);\r
                CodeConst(rREVSW,MSize,Anonymousspix);\r
                GenCode(rREVPW);\r
                CodeConst(rUADHW,-3,Anonymousspix);\r
                CodeConst(rRECHW,2,AnonymousSpix);\r
                GenCode(rMUL);\r
              END\r
            ELSE\r
             BEGIN\r
               St_RetrieveType(InSymbol, ptr);\r
               IF is_dynamic(ptr,ptr^.St_Size) THEN\r
                 BEGIN\r
                   PushAddr(Ptr);\r
                   MegaLoad(ESTTop);\r
                   CodeConst(rUADHW,6 + 1,AnonymousSpix);\r
                   CodeConst(rRECHW,2,AnonymousSpix);\r
                   GenCode(rDIV);\r
                 END\r
               ELSE\r
                BEGIN\r
                  EstPushConst(WordType, (ptr^.St_Size + 1 + 6) div 2);\r
                  MegaLoad(ESTTop);\r
                END;\r
               ESTPop;\r
             END;\r
          END\r
         ELSE\r
           BEGIN  (* LockData *)\r
             GenCode(rREVPD);\r
             CodeConst(rREVSA,1,Anonymousspix);\r
             CodeConst(rREVSD,mstart,Anonymousspix);\r
             IF InCode = CNoLocalDecl THEN\r
             BEGIN\r
               GenCode(rREVPD);\r
               CodeConst(rREVSD,MFirst,Anonymousspix);\r
               CodeConst(rUADHW,1,Anonymousspix);\r
               GenCode(rMSUB);\r
               GenCode(rNEG);\r
             END;\r
           END;\r
\r
         IF InCode = CNoLocalDecl THEN\r
           BEGIN  (* store size *)\r
             St_Retrieve(TypeAddr,Ptr);\r
             St_retrieve(Ptr^.TypeRef,Ptr);\r
             CodeConst(rSTVLW,MegaOffset(CurrentNiv,Ptr^.Record_Addr.Offset),\r
                        anonymousspix);\r
           END;\r
\r
         IF OldInCode <> CLockBufStat THEN\r
         BEGIN\r
           IF InCode = CCheckSize THEN\r
           BEGIN\r
             CodeConst(rREVSW,MFirst,Anonymousspix);\r
             St_RetrieveType(InSymbol, ptr);\r
             IF is_dynamic(ptr,ptr^.St_Size) THEN\r
                 BEGIN\r
                   PushAddr(Ptr);\r
                   MegaLoad(ESTTop);\r
                   GenCode(rAdd);\r
                   CodeConst(rUADHW,1,AnonymousSpix);\r
                   ESTpop;\r
                 END\r
               ELSE\r
                BEGIN\r
                  CodeConst(rUADHW,ptr^.St_Size + 1 ,Anonymousspix );\r
                END;\r
           END\r
           ELSE\r
           BEGIN\r
             CodeConst(rREVSW,MLast,Anonymousspix);\r
             CodeConst(rUADHW,1 ,Anonymousspix );\r
           END;\r
           CodeConst(rRECHW,2,AnonymousSpix);\r
           GenCode(rDIV);\r
         END;\r
\r
         St_retrieve(TypeAddr,Ptr);\r
         CodeConst(rLLock,MegaOffset(CurrentNiv,Ptr^.var_Offset),\r
                        anonymousspix);\r
\r
         GenCode(rREVPD);\r
         GenCode(rLRESE);\r
\r
         IF OldInCode = cLockBufStat THEN\r
         BEGIN\r
           CodeConst(rREVLA, MegaOffset(CurrentNiv,Ptr^.var_Offset), AnonymousSpix);\r
           CodeConst(rRECHW, 6, AnonymousSpix);\r
           GenCode(rUADD);\r
           CodeConst(rSTVLA, MegaOffset(CurrentNiv,Ptr^.var_Offset), AnonymousSpix);\r
         END ELSE\r
         BEGIN\r
           GenCode(rREVPD);\r
           CodeConst(rREVSA, 1, AnonymousSpix);\r
           CodeConst(rREVSD, MStart, AnonymousSpix);\r
           CodeConst(rREVSW, MFirst, AnonymousSpix);\r
           CodeConst(rREVLW, MegaOffset(CurrentNiv,Ptr^.var_Offset)+1, AnonymousSpix);\r
           GenCode(rUADD);\r
           CodeConst(rSTVLW, MegaOffset(CurrentNiv,Ptr^.var_Offset)+1, AnonymousSpix);\r
         END;\r
         CodeConst(rRESTA,0,Anonymousspix);\r
\r
{$ENDIF}\r
             END;\r
\r
PROCEDURE Do_cSaveRep;\r
        VAR RepIx : Integer;\r
        BEGIN\r
          ReadPar;\r
          Value := InPar;\r
\r
          ReadCode;\r
          LookAHead := True;\r
{$IFDEF PI3}\r
          IF InCode = cEndAssignSet THEN\r
            BEGIN\r
              WHILE LastOnStack <> ESTTop^.BackWard DO Push1Operand;\r
              TypeAddr := ESTTop^.BackWard^.BackWard^.OprType;\r
              PushSetOnStack(TypeAddr);\r
              ESTPushStack(TypeAddr,True);\r
              InCode := cEndAssign;\r
            END;\r
\r
          TypeAddr := ESTTop^.OprType;\r
          St_RetrieveType(TypeAddr,Ptr);\r
          Size := Ptr^.St_Size;\r
\r
          IF ESTTop^.Kind = O_Stack THEN\r
            BEGIN (* Last exp was a struc value *)\r
              GetReg(SI);\r
              CodeRegReg(IMOV,w,SI,SP);\r
              IF is_dynamic(Ptr, Size) THEN\r
                BEGIN\r
                  Reg := BX;\r
                  ReturnLengthIn(Reg,Ptr);\r
                  (* Make BX Even *)\r
                  CodeReg(iINC,w,BX);\r
                  CodeReg(iSHR,w,BX);\r
                  CodeReg(iSHL,w,BX);\r
                END\r
              ELSE\r
                BEGIN\r
                  GetReg(BX);\r
                  CodeRegConst(iMOV,w,BX,Size + ord(odd(Size)));\r
                END;\r
              ESTpop;\r
              GetReg(CX);\r
              Addr.Spix := AnonymousSpix;\r
              Addr.Base := BX;\r
              Addr.Seg := DS;\r
              Addr.Index := SI;\r
              Addr.Displacement := 0;\r
              IF ESTTop^.kind = O_Const THEN\r
                CodeRegConst(iMOV,w,CX,ESTTop^.Value)\r
              ELSE\r
                BEGIN\r
                  CodeRegAddr(iMOV,w,CX,Addr);\r
                  Addr.Displacement := 2;\r
                END;\r
              GetReg(ES);\r
              GetReg(DI);\r
              CodeRegAddr(iLES,w,DI,Addr);\r
              CodeRegConst(iADD,w,BX,4 + Addr.Displacement);\r
              ESTPop;\r
              TypeAddr1 := ESTTop^.OprType;\r
              ESTpop;\r
              CodeReg(iPUSH,w,BX);\r
              ReleaseRegister(BX);\r
              OnStack := true;\r
              ESTPushAbsAddr(AnonymousSpix,TypeAddr1,false,P_normal,\r
                          ES,false,0,DI);\r
              ESTPushReg(IntegerType,CX);\r
              ESTPushAbsAddr(AnonymousSpix,TypeAddr,true,P_normal,\r
                          DS,false,0,SI);\r
            END\r
          ELSE\r
            OnStack := false;\r
\r
          St_RetrieveType(ESTTop^.BackWard^.OprType,PtrST);\r
          IF PtrSt^.St_Size = 1 THEN SetHighByteTo0(ESTTop^.BackWard);\r
          LoadRegister(ESTTop^.BackWard,specificReg,CX,w);\r
\r
          (*  Rep Counter in CX *)\r
          StoreRepCounter(CX,Value);\r
\r
          MakingAssign := False;\r
          IF (Size = 0) OR (Size > 4) OR ( incode = cEndAssignString)\r
          THEN AssignType := StrucAssign\r
          ELSE\r
          IF ( ( Size = 1) OR ( Size = 2)) THEN\r
             AssignType := SimpelAssign\r
          ELSE\r
             AssignType := AssignByMov;\r
\r
          PushReg := RNil;\r
\r
          IF ESTTop^.BackWard^.BackWard^.BitLength <> 0 THEN\r
            BEGIN  (* Make Ready for packed assignment *)\r
              LoadRegister(ESTTop,ABCDRegister,RNil,w);\r
              PushReg := ESTTop^.R;\r
              TypeAddr := ESTTop^.OprType;\r
              ESTPop;\r
              ESTPop;\r
              LoadRegister(ESTTop,AllRegister,RNil,w);\r
              LoadAddrUse(ESTTop^.BackWard,DI);\r
              IF ESTTop^.BackWard^.A_Seg = ES THEN\r
               BEGIN\r
                 ReleaseRegister(ES);\r
                 ESTTop^.BackWard^.A_Seg := DS;\r
               END;\r
              ESTPushReg(TypeAddr,PushReg);\r
            END\r
          ELSE\r
            BEGIN\r
              Bool := ESTTop^.IndVar; (* if false result of a function*)\r
\r
              IF AssignType <> SimpelAssign THEN\r
                BEGIN\r
                  IF Bool THEN LoadAddrUse(ESTTop,SI);\r
                  IF AssignType = StrucAssign THEN PushReg := SI;\r
                END\r
              ELSE\r
                LoadRegister(ESTTop,SpecificReg,AX,w);\r
\r
              LoadAddrUse(ESTTop^.BackWard^.BackWard,DI);\r
              Reg := ESTTop^.A_Seg;\r
              ESTPop;\r
              ESTPop;\r
\r
              DSIsChange := false;\r
              IF AssignType = strucAssign THEN\r
                BEGIN\r
                  IF (Reg <> DS) AND (Reg <> SS) THEN\r
                    BEGIN\r
                ReleaseRegister(Reg);\r
                IF Ord(Reg) >= Ord(ES) THEN\r
                  BEGIN\r
                    CodeRegReg(iMOV,w,AX,Reg);\r
                    Reg := AX;\r
                  END;\r
                CodeRegReg(iMOV,w,DS,Reg);\r
                DSIsChange := true;\r
                Reg := DS;\r
                    END;\r
                END;\r
\r
             Reg1 := ESTTop^.A_Seg;\r
             IF (Reg1 <> ES) AND (AssignType <> AssignByMov) THEN\r
               BEGIN\r
                 ReleaseRegister(Reg1);\r
                 IF Ord(Reg1) >= Ord(ES) THEN\r
                   BEGIN\r
                     IF Reg1 = DS THEN Reg1 := SS;\r
                     CodeRegReg(iMOV,w,BX,Reg1);\r
                     Reg1 := BX;\r
                   END;\r
                 GetReg(ES);\r
                 CodeRegReg(iMOV,w,ES,Reg1);\r
                 ESTTop^.A_Seg := ES;\r
               END;\r
\r
            IF AssignType = SimpelAssign THEN\r
              BEGIN\r
                MakingAssign := true;\r
                St_RetrieveType(ESTTop^.OprType,Ptr);\r
                IF Ptr^.St_Size = 1 THEN Inst := iSTOSB ELSE Inst := iSTOSW;\r
\r
                GenCode(iCLD);\r
                GenCode(iREP);\r
                GenCode(Inst);\r
                ReadCode;\r
                LookAhead := False;\r
                ReleaseRegister(ES);\r
                ReleaseRegister(AX);\r
                ReleaseRegister(CX);\r
                ESTTop^.A_Seg := DS;\r
              END\r
            ELSE\r
             BEGIN\r
              IF Bool THEN Reg1 := SI ELSE Reg1 := BX;\r
              ESTPushAbsAddr(AnonymousSpix,TypeAddr,Bool,P_Normal,\r
                               Reg,False,0,Reg1);\r
             END;\r
\r
           END;\r
\r
         IF MakingAssign = false THEN\r
           BEGIN (* Everthing has been pushed ready for assignment *)\r
             SSTPushLoop;\r
             CodeJump(iJCXZ,SSTTop^.ExitLabel);\r
             GenerateLabel(SSTTop^.ContLabel);\r
             ReleaseRegister(CX);\r
             CodeReg(iPUSH,w,CX);\r
             IF PushReg <> RNil THEN CodeReg(iPUSH,w,PushReg);\r
           END;\r
{$ENDIF}\r
{$IFDEF RC5000}\r
          IF (ESTSort(ESTTop) = S_Stack) AND\r
             (ESTSort(ESTTop^.Backward) = S_Stack) THEN GenCode(mREV);\r
          ExchangeTopElements;\r
          IF (ESTTop^.Kind <> O_StackOrTemp) AND\r
             (ESTTop^.Kind <> O_Temp) THEN\r
            BEGIN\r
               MegaLoad(ESTTop);\r
               StoreStackToTemp(ESTTop);\r
             END;\r
          IF (ESTTop^.Kind <> O_Temp) THEN\r
             StoreTempOK(ESTTop^.T_IndexToSTL);\r
          RepIx := ESTTop^.T_offset;\r
          ESTPop;\r
          IF ESTSort(ESTTop) = S_Stack THEN\r
            BEGIN\r
              StoreStackToTemp(ESTTop);\r
              StoreTempOK(ESTTop^.T_IndexToSTL);\r
              ESTTop^.Kind := O_Temp;\r
            END;\r
          IF (ESTTop^.Backward^.Kind <> O_StackOrTemp) AND\r
             (ESTTop^.Backward^.Kind <> O_Temp) THEN\r
            BEGIN\r
               MegaMakeAddr(ESTTop^.BackWard);\r
               StoreStackToTemp(ESTTop^.Backward);\r
             END;\r
          IF (ESTTop^.Backward^.Kind <> O_Temp) THEN\r
             StoreTempOK(ESTTop^.Backward^.T_IndexToSTL);\r
          ESTTop^.Backward^.Kind := O_Temp;\r
          IF MegaAllign(ESTTop^.Backward) THEN\r
            BEGIN\r
              St_RetrieveType(ESTTop^.Backward^.OprType,Ptr);\r
              IF Is_Dynamic(ptr,Ptr^.St_Size) OR\r
                 ((Ptr^.St_Size MOD 4) <> 0) THEN\r
                 ESTTop^.Backward^.T_Allign := false;\r
            END;\r
          OldObjectOffset := ESTTop^.Backward^.T_ObjectOffset;\r
          TempAddrOffset := ESTTop^.Backward^.T_Offset;\r
\r
          SSTPushLoop;\r
\r
          GenerateLabel(SSTTop^.ContLabel);\r
          CodeConst(mLDL,RepIx,AnonymousSpix);\r
          CodeConst(mLDC,0,Anonymousspix);\r
          GenCode(mGT);\r
          CodeJump(mCJ,SSTTop^.ExitLabel);\r
          CodeConst(mLDL,RepIx,AnonymousSpix);\r
          CodeConst(mADC,-1,Anonymousspix);\r
          CodeConst(mSTL,RepIx,AnonymousSpix);\r
          CodeConst(mLDL,MegaOffset(CurrentNiv,Value) DIV 4,AnonymousSpix);\r
          CodeConst(mADC,1,Anonymousspix);\r
          CodeConst(mSTL,MegaOffset(CurrentNiv,Value) DIV 4,AnonymousSpix);\r
{$ENDIF}\r
        END;\r
\r
       procedure  do_cEndArrayInit;\r
       VAR AllignLength : boolean;\r
          BEGIN\r
            ReadSymbol;\r
{$IFDEF PI3}\r
            IF InitPointer = False THEN\r
              BEGIN\r
                CodeReg(iPOP,w,AX);\r
                CodeReg(iPOP,w,CX);\r
                CodeReg(iPOP,w,DI);\r
                If InDeclPart = false THEN CodeReg(iPOP,w,ES);\r
\r
                CodeRegReg(iSUB,w,CX,AX);\r
\r
                CodeRegReg(iADD,w,DI,AX);\r
\r
                CodeRegConst(iCMP,w,CX,0);\r
                CodeJump(iJNE,SSTTop^.ContLabel);\r
                GenerateLabel(SSTTop^.ExitLabel);\r
\r
\r
                SSTPop;\r
              END\r
            ELSE\r
              InitPointer := false;\r
{$ENDIF}\r
\r
{$IFDEF RC5000}\r
         IF ESTTop^.Backward^.Value = 0 THEN\r
         BEGIN\r
            MakeCopyofTop;\r
            CodeConst(mLDL,TempOffset-1,AnonymousSpix);\r
                     (* addr of the array fusk *)\r
            IF ESTTop^.Kind = O_Const THEN\r
              CodeConst(mADC,ESTTop^.Value,AnonymousSpix)\r
            ELSE\r
              BEGIN\r
                MegaLoad(ESTTop);\r
                GenCode(mADD);\r
              END;\r
            ESTPop;\r
            CodeConst(mSTL,TempOffset-1,Anonymousspix);\r
         END;\r
\r
            CodeConst(mLDL,Paramindex - 1,Anonymousspix);\r
            MegaLoad(ESTTop);\r
            GenCode(mSUB);\r
            ESTPop;\r
            CodeConst(mSTL,ParamIndex - 1,Anonymousspix);\r
            CodeJump(mJ,SSTTop^.ContLabel);\r
            GenerateLabel(SSTTop^.EXITLabel);\r
            SSTPop;\r
            ParamIndex := ParamIndex - 1;\r
            ESTPop;\r
{$ENDIF}\r
{$IFDEF RC3502}\r
          IF InStack < 2 THEN CodeConst(rRESTA,4,Anonymousspix);\r
          St_Retrievetype(InSymbol,PtrSt);\r
          St_Retrieve(PtrSt^.TypeRef,PtrSt);\r
          allignlength := (PtrSt^.spec_struct*ShieldType35 <> []);\r
          St_RetrieveType(PtrSt^.TypeRef,PtrSt);\r
          IF is_Dynamic(PtrSt,PtrSt^.St_Size) THEN\r
            BEGIN\r
                 St_Retrievetype(InSymbol,PtrSt);\r
                 PushAddr(PtrSt);\r
                 AddOffsetToAddr(ESTTop,6);\r
            END\r
          ELSE\r
            BEGIN\r
               ESTPushConst(IntegerType, PtrSt^.St_Size);\r
               if (allignlength) THEN\r
               If Odd(ESTTop^.Value) THEN ESTTop^.Value := ESTTop^.Value + 1;\r
            END;\r
\r
          MegaLoad(ESTTop);\r
          Gencode(rUADD);\r
          ESTPop;\r
          CodeConst(rREVLW,SSTTop^.OffsetOfSize,Anonymousspix);\r
          St_Retrievetype(InSymbol,PtrSt);\r
          St_Retrievetype(PtrSt^.TypeRef,PtrSt);\r
          IF is_Dynamic(PtrSt,PtrSt^.St_Size) THEN\r
            BEGIN\r
                 St_Retrievetype(InSymbol,PtrSt);\r
                 PushAddr(PtrSt);\r
                 AddOffsetToAddr(ESTTop,6);\r
            END\r
          ELSE\r
            BEGIN\r
               ESTPushConst(IntegerType, PtrSt^.St_Size);\r
               if (AllignLength) THEN\r
               If Odd(ESTTop^.Value) THEN ESTTop^.Value := ESTTop^.Value + 1;\r
            END;\r
          MegaLoad(ESTTop);\r
          Gencode(rUSUB);\r
          ESTPop;\r
\r
          CodeConst(rSTVLW,SSTTop^.OffsetOfSize,Anonymousspix);\r
          CodeJump(iJMP,SSTTop^.ContLabel);\r
          GenerateLabel(SSTTop^.EXITLabel);\r
          SSTPop;\r
          CodeConst(rSTNHB,4,Anonymousspix);\r
{$ENDIF}\r
          END;\r
\r
        Procedure Do_CheckParam; (* Symbol, Symbol *)\r
         VAR paramsize : integer;\r
          BEGIN\r
            ReadSymbol;\r
            St_Retrieve(InSymbol,Ptr);\r
            PushAddr(Ptr);\r
            ReadSymbol;\r
            St_Retrieve(InSymbol,Ptr);\r
            PushAddr(Ptr);\r
            WHILE Ptr^.St_Node_Copy DO\r
              St_Retrieve(Ptr^.St_Family_Ref,Ptr);\r
            ParamSize := Ptr^.Type_ParamSize;\r
{$IFDEF PI3}\r
            IF ParamSize <= 2 THEN\r
              BEGIN\r
                Loc(ESTTop,Addr);\r
                Reg := GetRegister(AllRegister,RNil);\r
                CodeRegAddr(iMOV,w,Reg,Addr);\r
                ReleaseAddr(Addr);\r
                ESTPop;\r
                Loc(ESTTop,Addr);\r
                CodeRegAddr(iCMP,w,Reg,Addr);\r
                ReleaseAddr(Addr);\r
                ESTPop;\r
                ReleaseRegister(Reg);\r
              END\r
            ELSE\r
              BEGIN\r
                LoadAddrOFTopElems;\r
                GetReg(CX);\r
                CodeRegConst(iMOV,w,CX,paramsize div 2);\r
                GenCode(iCLD);\r
                GenCode(iREP);\r
                GenCode(iCMPSW);\r
\r
                ReleaseRegister(CX);\r
                ReleaseRegister(DI);\r
                ReleaseRegister(SI);\r
                ReleaseRegister(ES);\r
\r
                UpDateDSAndSP;\r
                ESTPop;\r
                ESTPop;\r
              END;\r
            St_Declaration(cLabel,AnonymousName,Lab,Ptr);\r
            CodeJump(iJE,Lab);\r
            CodeFault(CheckParamInt,CheckParamExc);\r
            GenerateLabel(Lab);\r
{$ENDIF}\r
{$IFDEF RC5000}\r
            IF ParamSize <= 4 THEN\r
              BEGIN\r
                MegaLoad(ESTTop^.Backward);\r
                MegaLoad(ESTTop);\r
                GenCode(mDIFF);\r
              END\r
            ELSE\r
              BEGIN\r
                MegaMakeAddr(ESTTop^.Backward);\r
                IF ESTTop^.Backward^.T_ObjectOffset <> 0\r
                  THEN CodeConst(mADC,ESTTop^.Backward^.T_ObjectOffset, AnonymousSpix);\r
                MegaMakeAddr(ESTTop);\r
                IF ESTTop^.T_ObjectOffset <> 0\r
                  THEN CodeConst(mADC,ESTTop^.T_ObjectOffset, AnonymousSpix);\r
                CodeConst(mLDC,ParamSize,Anonymousspix);\r
                CallRoutine(Anonymousspix,EqRec,St_Extern);\r
                CodeConst(mEQC,0,Anonymousspix);\r
              END;\r
            St_Declaration(cLabel,AnonymousName,Lab,Ptr);\r
            CodeJump(mCJ,Lab);\r
            CodeFault(CheckParamInt,CheckParamExc);\r
            GenerateLabel(Lab);\r
            ESTPop;\r
            ESTPop;\r
{$ENDIF}\r
{$IFDEF RC3502}\r
            IF ParamSize <= 2 THEN\r
              BEGIN\r
                ESTTop^.Backward^.IndVar := true;\r
                ESTTop^.IndVar := true;\r
                MegaLoad(ESTTop^.Backward);\r
                MegaLoad(ESTTop);\r
                GenCode(rNE);\r
              END\r
            ELSE\r
              BEGIN\r
                ESTTop^.Backward^.IndVar := false;\r
                ESTTop^.IndVar := false;\r
                LoadAbsAddr(ESTTop^.Backward);\r
                LoadAbsAddr(ESTTop);\r
                CodeConst(rRECHW,ParamSize,Anonymousspix);\r
                GenCode(rSTCEA);\r
              END;\r
            St_Declaration(cLabel,AnonymousName,Lab,Ptr);\r
            CodeJump(rJMZEQ,Lab);\r
            CodeFault(CheckParamInt,CheckParamExc);\r
            GenerateLabel(Lab);\r
            ESTPop;\r
            ESTPop;\r
{$ENDIF}\r
          END;\r
\r
 PROCEDURE Do_cCompareString;\r
        BEGIN\r
          ReadCode;\r
{$IFDEF RC5000}\r
          IF (InCode = cGE) OR (Incode = cLT) THEN\r
            BEGIN\r
              ExchangeTopElements;\r
              IF (ESTSort(ESTTop) = S_Stack) AND\r
                 (ESTSort(ESTTop^.Backward) = S_Stack) THEN GenCode(mREV);\r
            END;\r
{$ENDIF}\r
\r
          BeforeStringOpr;\r
{$IFDEF RC5000}\r
          IF (InCode = cEQ) OR (Incode = cNE) THEN\r
            CallRoutine(Anonymousspix,EqStr,st_Extern)\r
          ELSE\r
            CallRoutine(Anonymousspix,GtStr,st_Extern);\r
\r
          if (incode = cEQ) OR (Incode = cGT) OR (Incode = cLT) THEN\r
            Inst := iNIL\r
          ELSE\r
            Inst := mEQC;\r
          ESTPushDecode(St_NillAddr,St_NillAddr,Inst);\r
          IF ResultMustBeEncode THEN EnCode;\r
{$ENDIF}\r
{$IFDEF RC3502}\r
          IF (InCode = cEQ) OR (Incode = cNE) THEN\r
            CallRoutine(Anonymousspix,EqStr,st_Extern)\r
          ELSE\r
          IF (InCode = cGT) OR (Incode = cLE) THEN\r
            CallRoutine(Anonymousspix,GtStr,st_Extern)\r
          ELSE\r
          IF (InCode = cGE) OR (Incode = cLT) THEN\r
            CallRoutine(Anonymousspix,LtStr,st_Extern);\r
\r
          if (incode = cLT) OR (Incode = cGT) OR (Incode = cEQ) THEN\r
            Inst := rOR\r
          ELSE\r
            Inst := rNOT;\r
          ESTPushDecode(St_NillAddr,St_NillAddr,Inst);\r
          IF ResultMustBeEncode THEN EnCode;\r
{$ENDIF}\r
{$IFDEF PI3}\r
          GenCode(iREP);\r
          GenCode(iCMPSB);\r
          St_Declaration(cLabel,AnonymousName,Lab,Ptr);\r
          St_Declaration(cLabel,AnonymousName,ELab,Ptr);\r
\r
          IF (incode=cEQ) OR (incode=cNE) THEN\r
          BEGIN\r
            CodeJump(iJNE,Lab);\r
\r
            CodeRegReg(iCMP,w,DX,CX);\r
            CodeJump(iJGE,ELab);\r
            CodeReg(iNEG,w,DX);\r
            CodeRegReg(iMOV,w,DI,SI);\r
            CodeRegReg(iMOV,w,SI,DS);\r
            CodeRegReg(iMOV,w,ES,SI);\r
            GenerateLabel(ELab);\r
            CodeRegReg(iMOV,w,CX,DX);\r
            CodeRegconst(iMOV,b,AX,32);\r
            GenCode(iREP);\r
            GenCode(iSCASB);\r
\r
            (* IF AfterStringOpr generate code Lab must always be generated\r
               before this code; *)\r
            IF (dsChanged) OR ( NewSp <> RNil) THEN\r
            BEGIN\r
              GenerateLabel(Lab);\r
              Lab := St_NillAddr;\r
            END;\r
\r
            AfterStringOpr;\r
\r
            IF InCode = cEQ  THEN ESTPushDecode(Lab,St_NillAddr,iJNE)\r
            ELSE ESTPushDecode(St_NillAddr,Lab,iJE);\r
\r
          END ELSE (* incode not = or <> *)\r
          BEGIN\r
            AfterStringOpr;\r
            CodeJump(iJNE,ELab);\r
            CodeRegReg(iCMP,w,DX,CX);   (* use that CX = 0 *)\r
            CodeJump(iJLE,Lab);\r
            CodeRegReg(iMOV,w,CX,DX);\r
            CodeRegconst(iMOV,b,AX,32);\r
            GenCode(iREP);\r
            GenCode(iSCASB);\r
            GenerateLabel(ELab);\r
\r
            IF Incode = cLT THEN Inst := iJGE\r
            ELSE IF Incode = cLE THEN Inst := iJL\r
            ELSE IF Incode = cGT THEN Inst := iJGE\r
            ELSE Inst := iJL;\r
\r
            IF Inst = iJGE THEN\r
              ESTPushDecode(Lab,St_NillAddr,Inst)\r
            ELSE\r
              ESTPushDecode(St_NillAddr,Lab,Inst);\r
          END;\r
{$ENDIF}\r
        END;\r
\r
  PROCEDURE Do_cPreSet;\r
          BEGIN\r
{$IFDEF PI3}\r
\r
            While ESTTop^.BackWard <> LastOnStack do Push1Operand;\r
            ESTTop^.IndVar := False;\r
            PushOperand;\r
\r
{$ENDIF}\r
{$IFDEF RC5000}\r
            ESTTop^.IndVar := False;\r
            TypeAddr := ESTTop^.OprType;\r
            StartCall;\r
            PushSetParam;\r
{$ENDIF}\r
{$IFDEF PI3}\r
            IF (InCode = cPreSetFunc) AND ( ESTTop^.Set_Temp = False)  THEN\r
              BEGIN\r
                CallRoutine(AnonymousSpix,PushSet,St_Extern);\r
                CodeReg(iPUSH,w,ES);\r
                CodeReg(iPUSH,w,BX);\r
                ESTTop^.Set_Temp := True;\r
              END;\r
{$ENDIF}\r
{$IFDEF RC3502}\r
     MakeSetOprReady;\r
     (*   ESTTop^.Set_Temp := True;  (* FUSK *)\r
{$ENDIF}\r
          END;\r
«eof»