*DECK RPTMOVE 
USETEXT TCMMDEF 
USETEXT TCONVRT 
USETEXT TDESATT 
USETEXT TENVIRN 
USETEXT TEXPRES 
USETEXT TREPORT 
USETEXT TXSTD 
      PROC RPTMOVE; 
  
#----------------------------------------------------------------------#
#                                                                      #
#  THE FOLLOWING PROCS ARE XDEF"D WITHIN THIS DECK:                    #
#                                                                      #
#     MVEXP                        MOVE AN EXPRESSION                  #
#     MVNM                         MOVE A NAME                         #
#     RESETMV                      RESET FOR ANOTHER MOVE              #
#                                                                      #
#----------------------------------------------------------------------#
  
      BEGIN 
  
      BASED ARRAY ADDR;            # ATTRIBUTE TABLE FOR LITERAL       #
        BEGIN 
        ITEM ADDRE    I(0,18,18);  # BEGINNING WORD POSITION           #
        ITEM ADDRLG   I(0,42,18);  # USESIZE OF ITEM                   #
        ITEM ADPTLOC  I(1,21,6);   # CHAR POS OF DECIMAL POINT         #
        ITEM ADDREW   I(0,0,60);   # ENTIRE WORD                       #
        END 
      XREF ITEM ALL          B;    # FLAG FOR *ALL* IN THE MOVE/EVAL   #
          ARRAY BB S(2);
              ITEM BFCHAR U(0,4,4), 
                   BFADDR I(0,24,18), 
                   BADDRF I(1,24,18), 
                   BCHARLG U(0,12,12),  # LENGTH OF FIELD IN CHARS     #
                   BSTACK I(1,6,18),
                   BEDIT B(0,3,1),
                   BW1 U(0,0,60), 
                   BW2 U(1,0,60); 
      ITEM ENDPTR       I;
      ITEM FIGS         B;
      ITEM IJK          I;
      ITEM J            I;         # SCRATCH TEMPORARY                 #
      ITEM MOVEDBEFORE  B;         # TRUE IF A PROGRAMSTACK FOR A MOVE #
                                   # IS ALREADY POINTED TO BY MOVE TABL#
      ITEM SAVEATTRIB   B;         # TRUE IF SAVED RESULT REQUIRES     #
                                   # ATTRIB TABLE                      #
      ITEM SAVEDRESULT  I;         # RESULT ADDRESS OF PROGRAMSTACK    #
      BASED ARRAY MOVETBL S(2); 
              ITEM MENTRY    U(0,00,03),
                   MFCHAR    U(0,04,04),
                   MTCHAR    U(0,08,04),
                   MCHARLG   U(0,12,12),  # LENGTH OF FIELD IN CHARS   #
                   MFROMADDR I(0,24,18),
                   MTOADDR   I(0,42,18),
                   MCNVT     U(1,00,06),
                   MSTACKADD I(1,06,18),
                   MADDRFR   I(1,24,18),
                   MADDRTO   I(1,42,18),
                   MWORD1    I(0,00,60),
                   MWORD2    I(1,00,60);
      XREF ITEM CURREG B;          # TRUE IF CURRENT-REGISTER          # QU3A334
      XREF ITEM MVFLAG       B;    # TRUE FOR MOVE, FALSE FOR EVALUATE #
      XREF ITEM NOSEL        B;    # FLAG FOR *NO SELECT*              #
       DEF DFTRPWD #O"40000000000001000000"#;  #DEFAULT VALUE FOR 
                                                REPORTLIST WORD 1,
                                                BEYOND IS ON, 
                                                LINE NB IS 1# 
         DEF DFTRPWD2 #O"04010000000000000000"#;
  
      XREF ITEM SM$GROUPID   I;    # GROUP ID FOR CURRENT SYNTAX STUFF #
      XREF ITEM TBLA         I; 
      ITEM TYPE         I;
  
      XREF PROC DIAG;              # ISSUE DIAGNOSTIC MESSAGE TO USER  #
      XREF PROC RECNO;
      XREF PROC RECYES; 
  
  
  
  
#----------------------------------------------------------------------#
  
  
  
  
          XDEF PROC MVEXP;
          PROC MVEXP; 
          BEGIN 
          RECYES;                  # RETURN TO STDYES IF RECORDING     #
        IF FULLSYNTX THEN 
          BEGIN 
          IF FNEXT THEN BEGIN DIAG(943); STDNO; END                     001890
              BW1[0] = 0; 
          NONEMPTYRPT = TRUE;                                           004360
              BW2[0] = 0; 
              FIGS = FALSE; 
              MOVEDBEFORE = FALSE; # INITIALIZE FOR 1ST USE OF PROG STK#
              SAVEDRESULT = 0;
              SAVEATTRIB = FALSE; 
         BEDIT[0] = FALSE;                                              020410
              IF PROGSTACKLEN GR 0 THEN 
              BEGIN 
                  BFADDR[0] = 0;
                  BADDRF[0] = RESULTSLOC; 
                  BSTACK[0] = PROGSTACKLOC; 
                  TYPE = RESULTUSAGE; 
          BCHARLG[0] = RESULTSIZE;
          IF TYPE GQ 1             # NUMERIC, INTEGER, OR UNNORM       #
            AND TYPE LQ 3 
          THEN
          BEGIN DATAWORDADDR = 0; 
               DATALENG = RESULTSIZE;                                   020510
               SAVEATTRIB = TRUE;  # CONVERT NEEDS ATTRIB TABLE        #
               GOTO MKATT;                                              020520
         END                                                            020530
              END 
              ELSE
              BEGIN 
          IF INDICED THEN BEGIN FIGS = TRUE;
          BSTACK[0] = INDCTBLOC; END
                  TYPE = DATATYPE;
                  IF NOT ABSADDRESS THEN BADDRF[0] = DATANAMEBASE;
                                                                        020440
          IF (TYPE GQ 1            # IF NUMERIC, INTEGER, OR UNNORM    #
              AND TYPE LQ 3)
            OR INDICED
          THEN
         BEGIN IF FIGLITDATA NQ 1 THEN                                  020460
          BEGIN P<DESATT1> = DATANAMEPTR; 
              IF DECLASS[0] GR 7 THEN BEDIT[0] = TRUE;
                BFADDR[0] = DATANAMEPTR;                                020470
          END 
               ELSE 
         BEGIN MKATT: # #                                               020550
          P<ADDR> = CMM$ALF(2, 0, SM$GROUPID);
          ADDRE[0] = DATAWORDADDR;
          ADDRLG[0] = DATALENG; 
         BFADDR[0] = P<ADDR> - 1;                                       020580
               END
          END 
          ELSE
                  BFADDR[0] = DATAWORDADDR; 
              BCHARLG[0] = DATALENG;
              END 
              BFCHAR[0] = DATACHARPOS;
          END 
          STDYES;                                                       001930
          END 
  
  
  
  
#----------------------------------------------------------------------#
  
  
  
  
          XDEF PROC MVNM; 
          PROC MVNM;
          BEGIN 
        RECYES;                    # RETURN TO STDYES IF RECORDING     #
        IF FULLSYNTX THEN 
          BEGIN 
          IF FIGLITDATA EQ 1       # IF LITERAL                        # QU3A334
            OR FIGLITDATA EQ 3     # IF DESCRIBED ITEM                 # QU3A334
            OR CURREG              # IF CURRENT-REGISTER               # QU3A334
          THEN                                                           QU3A334
            BEGIN                                                        QU3A334
            STDNO;                                                       QU3A334
            END                                                          QU3A334
          IF ENDPTR EQ 7 THEN 
            BEGIN 
            MTOADDR[7] = CMM$ALF(15, 0, SM$GROUPID);
                P<MOVETBL> = MTOADDR[7];
                ENDPTR = 0; 
          END 
          IF MOVEDBEFORE           # IF NOT 1ST USE OF PROG STACK      #
          THEN
            BEGIN 
            BSTACK[0] = 0;
            BADDRF[0] = 0;
            IF SAVEATTRIB          # IF CONVERT NEEDS ATTRIB TABLE     #
            THEN
              BEGIN 
              P<ADDR> = CMM$ALF(2, 0, SM$GROUPID);  # REQUEST ATTRIB TB#
              ADDRE[0] = SAVEDRESULT;  # ADDRESS OF VALUE              #
              BFADDR[0] = LOC(ADDR) - 1;  # ADDRESS OF ATTRIB TABLE    #
              END 
            ELSE                   # NO ATTRIB TABLE REQUIRED          #
              BEGIN 
              BFADDR[0] = SAVEDRESULT;  # ADDRESS OF VALUE             #
              END 
            END 
              MWORD1[ENDPTR] = BW1[0];
              MWORD2[ENDPTR] = BW2[0];
              MTCHAR[ENDPTR] = DATACHARPOS; 
          IF NOT FIGS THEN BEGIN
            IF BSTACK[0] EQ 0      # IF NO PROGRAMSTACK                #
            THEN
              BEGIN 
              MENTRY[ENDPTR] = 2;  # CALL CONVERT                      #
              END 
            ELSE
              BEGIN 
              MENTRY[ENDPTR] = 3;  # CALL EXPEVAL                      #
              MOVEDBEFORE = TRUE;  # MOVE TBL POINTS TO PROG STACK     #
              SAVEDRESULT = BADDRF[0];  # RESULT OF PROG STACK         #
              END 
          END 
          ELSE MENTRY[ENDPTR] = 4;
        IF DATATYPE LS 4
        THEN
          BEGIN 
                P<DESATT1> = DATANAMEPTR; 
               IJK = DATACHARPOS * 6; 
                 IF NOT INDICED AND (IJK NQ DBITPOS[0] OR 
                    DATAWORDADDR NQ DEWPOS[0]) THEN 
                     BEGIN P<ADDR> = P<DESATT1>;
                           P<DESATT1> = CMM$ALF(7, 0, SM$GROUPID);
                           FOR J=0 STEP 1 UNTIL 6 DO
                              DDWORD0[J] = B<0,60>ADDREW[J];
                           DEWPOS[0] = DATAWORDADDR;
                           DBITPOS[0] = IJK;
                           MTOADDR[ENDPTR] = P<DESATT1>;
                     END
                     ELSE 
           MTOADDR[ENDPTR] = DATANAMEPTR;                               020610
          END 
                      ELSE MTOADDR[ENDPTR] = DATAWORDADDR;
                  IF ABSADDRESS THEN MADDRTO[ENDPTR] = 0; 
                      ELSE MADDRTO[ENDPTR] = DATANAMEBASE;
         IF TYPE EQ 0 AND DATATYPE GR 0 AND DATATYPE LS 7 THEN          020630
          BEGIN DIAG(169);
                STDNO;
          END 
         MCNVT[ENDPTR] = B<DATATYPE*6,6>CCODE[TYPE];                    020650
          IF INDICED THEN 
          BEGIN 
          IF BSTACK[0] NQ 0 THEN
         BEGIN IF FIGS THEN IJK = 5; ELSE IJK = 7;
          END ELSE IJK = 6; 
          MENTRY[ENDPTR] = IJK; 
                  P<ADDR> = INDCTBLOC;
          ITEM KJI;                                                     002460
          KJI = ADDREW[1];                                              005220
          IJK = ADDREW[0];                                              005230
          P<ADDR> = CMM$ALF(3, 0, SM$GROUPID);
          ADDREW[1] = KJI;                                              005250
          ADDREW[0] = IJK;                                              005260
          ADDRLG[2] = BSTACK[0];                                        002490
          ADDRE[2] = DATANAMEPTR;                                       002500
                MSTACKADD[ENDPTR] = P<ADDR>;
           END                                                          002530
              ENDPTR = ENDPTR + 1;
          END 
              STDYES; 
          END 
  
  
  
  
#----------------------------------------------------------------------#
  
  
  
  
          XDEF PROC RESETMV;
          PROC RESETMV; 
          BEGIN 
              MVFLAG = TRUE;
          ENDPTR = 0; 
          ALL = FALSE;             # CLEAR *ALL/ANY* FLAG              #
        RECNO;                     # RETURN TO STDNO IF RECORDING      #
          IF FULLSYNTX THEN 
            BEGIN 
            P<MOVETBL> = CMM$ALF(15, 0, SM$GROUPID);
            END 
          TBLA = P<MOVETBL>;
         NOSEL = FALSE;                                                 020760
          TYPEALOW = 7; 
          STDNO;
          END 
  
  
  
  
#----------------------------------------------------------------------#
  
  
      END 
      TERM
