*DECK GMOVR4
          IDENT  GMOVR4 
          TITLE  GMOVR4 - GENERATE R42XX MOVES
  
          MACHINE  ANY,I
          SST 
          COMMENT  GENERATE R42XX MOVES 
          SPACE  4
**        GMOVR4 - GENERATE R42XX MOVES 
* 
* R42C1   LINK   CGR42C1
* R42C2   LINK   CGR42C2
* R42ND   LINK   CGR42ND
* R42NE   LINK   CGR42NE
* R42RN   LINK   CGR42RN
* R42R1   LINK   CGR42R1
* R42R2   LINK   CGR42R2
* R42R4   LINK   CGR42R4
* 
*         REGB = DNAT POINTER TO SOURCE.
*         REGC = DNAT POINTER TO DESTINATION
* 
*         GENERATES CODE TO PERFORM THE INDICATED MOVE. 
  
  
  
*      COMDECKS 
  
  
  
  
  
 CONTROL  OPSYN  NIL
  
  
  
  
*CALL CCT 
  
          EJECT 
 GMOVR4   MODULE
  
*      REGTABLE EQUATES 
  
  
 MOVEREGA EQU    REGB 
 MOVEREGB EQU    REGC 
 MOVEREGD EQU    REGQ 
 MOVEREGE EQU    REGR 
 MOVEREGF EQU    REGS 
 MOVEREGM EQU    REGM 
  
*      VIRTUAL REGISTER EQUATES 
  
 VREGA    EQU    VREG1
 VREGB    EQU    VREG2
 VREGC    EQU    VREG3
 VREGD    EQU    VREG9
 VREGE    EQU    VREG5
 VREGF    EQU    VREG6
 VREGG    EQU    VREG7
 VREGH    EQU    VREG8
 VREGI    EQU    VREG9
 VREGJ    EQU    VREG10 
 VREGK    EQU    VREG11 
 VREGL    EQU    VREG12 
 VREGU    EQU    VREG16 
 VREGV    EQU    VREG17 
 VREGW    EQU    VREG18 
 VREGX    EQU    VREG4
 VREGAC   EQU    VREG1
  
*      FIXED TABLE EQUATES
  
  
*      MISCELLANEOUS EQUATES
  
  
*      LINKAGE FROM CALLING ROUTINES IN OTHER MODULES 
  
 R42C1    KNIL   CGR42C1
 R42C2    KNIL   CGR42C2
 R42C4    KNIL   CGR42C4
 R42ND    KNIL   CGR42ND
 R42NE    KNIL   CGR42NE
 R42RN    KNIL   CGR42RN
 R42R1    KNIL   CGR42R1
 R42R2    KNIL   CGR42R2
 R42R4    KNIL   CGR42R4
  
*      LINKAGE TO CALLED ROUTINES IN OTHER MODULES
  
 ADNAT    LINK   ADNAT       * TO CGSTART 
 RN2ND    LINK   CGRN2ND     * TO GMOVSTO 
 RN2NE    LINK   CGRN2NE     * TO GMOVRN
 R22RN    LINK   CGR22RN     * TO GMOVR2
 R22R1    LINK   CGR22R1     * TO GMOVR2
 SETBREG  LINK   CGSETB4     * TO GMOVSUB 
 STORC1C2 LINK   CGSTORC     * TO GMOVSUB 
 STORC4   LINK   STORC4     * TO GMOVSUB
 SUBDNAT  LINK   SUBDNAT     * TO CGSTART 
  
*      SYMBOLIC PARAMETER DEFINITIONS 
  
 CBDTENS  SETSY  (EXT$OF,C.DTENS),T1
          SPACE  4
          LISTSEC  R42C1
          TITLE  R42C1 -  REGISTER D.P. COMP-2 TO COMP-1
**        R42C1 -  REGISTER D.P. COMP-2 TO COMP-1 
* 
*         REGB = DNAT POINTER TO SOURCE REGISTER
*         (TREGOF,REGB) = VIRTUAL REGISTER NUMBER OF SOURCE REGISTER
*         REGC = DNAT POINTER TO DESTINATION ITEM 
  
  
 R42C1    EGO    2
          NOTE   R42C1
            MOVEZ  REGU2,REGT 
            CALLZ  ADNAT
            MOVEZ  (POINTOF,REGC),(POINTOF,REGU2) 
          MOVEZ  (SIGNOF,REGC),(SIGNOF,REGU2) 
            PUSH   REGC 
            MOVEZ  REGU2,REGC 
            CALLZ  R42R1
            MOVEZ  (TREGOF,REGC),P1 
            CALLZ  SUBDNAT
            POP    REGC 
          CALLZ  STORC1C2 
          RETURN
          SPACE  4
          LISTSEC  R42C2
          TITLE  R42C2 -  REGISTER D.P. COMP-2 TO COMP-2
**        R42C2 -  REGISTER D.P. COMP-2 TO COMP-2 ITEM
* 
*         REGB = DNAT POINTER TO SOURCE REGISTERS.
*         (TREGOF,REGB) = VIRTUAL REGISTER NUMBER OF REGISTER 
*           CONTAINING MOST SIGNIFICANT PART OF SOURCE. 
*         REGC = DNAT POINTER TO DESTINATION ITEM.
*         FWARECV = ADDRESS OF DESTINATION. 
* 
*         CALLZ  R42C2
* 
*         GENERATES CODE TO PERFORM THE INDICATED MOVE. 
  
  
 R42C2    EGO    2
          NOTE   R42C2
          IFTHEN ((POINTOF,REGB),EQ,(POINTOF,REGC)) 
            MOVEZ  (TREGOF,REGB),P1 
          ELSEZ 
            MOVEZ  REGU1,REGT 
            CALLZ  ADNAT
            MOVEZ  (POINTOF,REGC),(POINTOF,REGU1) 
            PUSH   REGC 
            MOVEZ  REGU1,REGC 
            CALLZ  R42R2     SCALE
            MOVEZ  (TREGOF,REGC),P1 
            CALLZ  SUBDNAT
            POP    REGC 
          ENDIFZ
          CALLZ  STORC1C2 
          RETURN
          SPACE  4
          LISTSEC  R42C4
          TITLE  R42C4 -REGISTER  DPCOMP-2  TO COMP-4 ITEM
************************************************************************
*         R42C4  REGISTER DPCOMP-2 TO COMP-4                           *
*                                                                      *
*         REGB=  DNAT POINTER TO SOURCE REGISTER                       *
*         (TREGOF,REGB) = VIRTUAL REGISTER NUMBER OF SOURCE REGISTER   *
*         REGC=  DNAT POINTER TO DESTINATION ITEM                      *
*                                                                      *
************************************************************************
 R42C4    EGO    2
          NOTE   R42C4
          MOVEZ  REGU2,REGT                      REGU2 POINTS TO DNAT 
          CALLZ  ADNAT                           CREATE DNAT
          MOVEZ  (POINTOF,REGC),(POINTOF,REGU2) 
          MOVEZ  (SIGNOF,REGC),(SIGNOF,REGU2) 
          PUSH   REGC 
          MOVEZ  REGU2,REGC 
          CALLZ  R42R1
          MOVEZ  (TREGOF,REGC),P1 
          CALLZ  SUBDNAT                         DELETE REGU2 DNAT
          POP    REGC                            RESTORE ORIGINAL DEST
          CALLZ  STORC4 
          RETURN
          SPACE  4
          LISTSEC  R42ND
          TITLE  R42ND -  REGISTER D.P. COMP-2 TO NUMERIC DISPLAY ITEM
**        R42ND -  REGISTER D.P. COMP-2 TO NUMERIC DISPLAY ITEM 
* 
*         REGB = DNAT POINER TO SOURCE REGISTERS. 
*         (TREGOF,REGB) = VIRTUAL REGISTER NUMBER OF REGISTER 
*           CONTAINING MOST SIGNIFICANT PART OF SOURCE VALUE. 
*         (TREGP1OF,REGB) = VIRTUAL REGISTER NUMBER OF REGISTER 
*           CONTAINING LEAST SIGNIFICANT PART OF SOURCE VALUE.
*         (SIGNOF,REGB) = 1 IFF SOURCE IS SIGNED. 
*         REGC = DNAT POINTER TO DESTINATION ITEM.
*         FWARECV = ADDRESS OF DESTINATION ITEM.
*         (NUMLENOF,REGC) = NUMBER OF DIGITS IN DESTINATION.
*         (POINTOF,REGC) = POSITION OF LEAST SIGNIFICANT DIGIT
*           RELATIVE TO DECIMAL POINT.   (E.G. PIC 999V9 _ 1) 
*         (SIGNOF,REGC) = 1 IFF DESTINATION IS SIGNED.
*         (LDSIGNOF,REGC) = 1 IFF DESTINATION HAS A LEADING SIGN. 
*         (SCHAROF,REGC) = 1 IFF DESTINATION HAS A SEPARATE SIGN. 
* 
*         CALLZ  R42ND
* 
*         GENERATES CODE TO PERFORM THE INDICATED MOVE. 
* 
*         USES-  REGU3
*                SAVREGC2 
*                REGU2       (BY R42RN) 
*                REGU1       (BY R42RN) 
*                SAVREGB1    (ALSO BY R42RN)
*                SAVREGB2    (BY R42RN) 
*                SAVREGC1    (BY R42RN) 
  
  
 R42ND    EGO    2
          NOTE   R42ND
  
*      CREATE A DUMMY DESTINATION DNAT
  
          MOVEZ  REGU3,REGT                      ENTRY REGU3 _ DNAT 
          CALLZ  ADNAT                           CREATE DNAT
          MOVEZ  (NUMLENOF,REGC),(NUMLENOF,REGU3) 
          MOVEZ  (POINTOF,REGC),(POINTOF,REGU3) 
          MOVEZ  (SIGNOF,REGC),(SIGNOF,REGU3) 
  
*      CONVERT R4 (IN REGB) TO RN (IN REGU3)
  
          PUSH   REGC                            SAVE ORIG. DESTINATION 
          MOVEZ  REGU3,REGC                      THIS DEST. IS REGU3
          CALLZ  R42RN                           CONVERT (REGB) _ (REGC)
          POP    REGC                            RESTORE ORIGINAL DEST. 
  
*      CONVERT RN (IN REGU3) TO ND (IN REGC)
  
          PUSH   REGB                            SAVE ORIGINAL SOURCE 
          MOVEZ  REGU3,REGB                      THIS SOURCE IS REGU3 
          CALLZ  RN2ND                           CONVERT (REGB) _ (REGC)
          POP    REGB                            RESTORE ORIGINAL SOURCE
  
          CALLZ  SUBDNAT                         DELETE REGU3 DNAT
          RETURN
          SPACE  4
          LISTSEC  R42NE
          TITLE  R42NE -  REGISTER D.P. COMP-2 TO NUMERIC-EDITED ITEM 
**        R42NE -  REGISTER D.P. COMP-2 TO NUMERIC-EDITED ITEM
* 
*         REGB = DNAT POINTER TO SOURCE REGISTER. 
*         (TREGOF,REGB) = VIRTUAL REGISTER NUMBER OF REGISTER 
*           CONTAINING MOST SIGNIFICANT PART OF SOURCE. 
*         (TREGP1OF,REGB) = VIRTUAL REGISTER NUMBER OF REGISTER 
*           CONTAINING LEAST SIGNIFICANT PART OF SOURCE.
*         (SIGNOF,REGB) = 1 IFF SOURCE IS SIGNED. 
*         REGC = DNAT POINTER TO DESTINATION ITEM.
* 
*         CALLZ  R42NE
* 
*         GENERATES CODE TO PERFORM THE INDICATED MOVE. 
  
  
 R42NE    EGO    2
          NOTE   R42NE
  
*      CREATE A DUMMY DNAT
  
          MOVEZ  REGU3,REGT                      ENTRY REGU3 _ DNAT 
          CALLZ  ADNAT                           CREATE DNAT
          MOVEZ  (NUMLENOF,REGC),(NUMLENOF,REGU3) 
          MOVEZ  (POINTOF,REGC),(POINTOF,REGU3) 
          MOVEZ  (SIGNOF,REGC),(SIGNOF,REGU3) 
  
*      CONVERT R4 (IN REGB) TO RN (IN REGU2)
  
          PUSH   REGC                            SAVE ORIG. DESTINATION 
          MOVEZ  REGU3,REGC                      THIS DEST. IS REGU3
          CALLZ  R42RN                           CONVERT (REGB) _ (REGC)
          POP    REGC                            RESTORE ORIGINAL DEST. 
  
*      CONVERT RN (IN REGU2) TO NE (IN REGC)
  
          PUSH   REGB                            SAVE ORIGINAL SOURCE 
          MOVEZ  REGU3,REGB                      THIS SOURCE IS REGU3 
          CALLZ  RN2NE                           CONVERT (REGB) _ (REGC)
          POP    REGB                            RESTORE ORIGINAL SOURCE
  
          CALLZ  SUBDNAT                         DELETE REGU2 DNAT
          RETURN
          SPACE  4
          LISTSEC  R42RN
          TITLE  R42RN -  REGISTER D.P. COMP-2 TO REGISTER NUMERIC
**        R42RN -  REGISTER D.P. COMP-2 TO REGISTER NUMERIC 
* 
*         REGB = DNAT POINTER TO SOURCE REGISTERS 
*         (TREGOF,REGB) = VIRTUAL REGISTER NUMBER OF REGISTER 
*           WITH MOST SIGNIFICANT PART OF SOURCE. 
*         (TREGP1OF,REGB) = VIRTUAL REGISTER NUMBER OF REGISTER 
*           WITH LEAST SIGNIFICANT PART OF RESULT.
*         (SIGNOF,REGB) = 1 IFF SOURCE IS SIGNED. 
*         REGC = DNAT POINTER TO DESTINATION REGISTER(S)
*         (NUMLENOF,REGC) = NUMBER OF DIGITS IN DESTINATION.
*         (POINTOF,REGC) = POSITION OF LEAST SIGNIFICANT DIGIT
*           RELATIVE TO DECIMAL POINT.   (E.G. PIC 99V999 _ 3)
*         (SIGNOF,REGC) = 1 IFF DESTINATION IS SIGNED.
* 
*         CALLZ  R42RN
* 
*         GENERATES CODE TO PERFORM THE INDICATED MOVE. 
*         SETS (TREGOF,REGC) = VIRTUAL REGISTER NUMBER OF REGISTER
*           CONTAINING MOST SIGNIFICANT DIGITS OF RESULT. 
*         (TREGP1OF,REGC) WILL CONTAIN THE VIRTUAL REGISTER NUMBER OF 
*           REGISTER CONTAINING LEAST SIGNIFICANT DIGITS OF RESULT. 
*           (IF 2-REGISTER DESTINATION) 
* 
*         USES-  REGU2
*                SAVREGB2 
*                REGU4       (BY R22RN) 
*                REGU1       (BY R22RN) 
*                SAVREGB1    (BY R22RN) 
*                SAVREGC1    (BY R22RN) 
  
  
 R42RN    EGO    2
          IFZ    ((NUMLENOF,REGC),GT,14),R42RN1  IF BIG CONVERSION
  
          NOTE   R42RN
  
          MOVEZ  REGU1,REGT 
          CALLZ  ADNAT
          MOVEZ  (POINTOF,REGC),(POINTOF,REGU1) 
          PUSH   REGC 
          MOVEZ  REGU1,REGC 
          CALLZ  R42R2       SCALE
          MOVEZ  (TREGOF,REGC),VREG1
          CALLZ  SUBDNAT
          POP    REGC 
*      CREATE A DUMMY DNAT
  
          MOVEZ  REGU2,REGT                      ENTRY REGU2 _ DNAT 
          CALLZ  ADNAT                           CREATE DNAT
          MOVEZ  VREG1,(TREGOF,REGU2) 
          MOVEZ  (NUMLENOF,REGC),(NUMLENOF,REGU2) 
          MOVEZ  (SIGNOF,REGB),(SIGNOF,REGU2) 
          MOVEZ  (POINTOF,REGC),(POINTOF,REGU2) 
  
*      CONVERT R2 (IN REGU2) TO RN (IN REGC)
  
          PUSH   REGB                            SAVE ORIGINAL SOURCE 
          MOVEZ  REGU2,REGB                      THIS SOURCE IS REGU2 
          CALLZ  R22RN                           CONVERT (REGB) _ (REGC)
          POP    REGB                            RESTORE ORIGINAL SOURCE
  
          CALLZ  SUBDNAT                         DELETE REGU2 DNAT
          RETURN
  
  
*                            DESTINATION IS 15-18 DIGITS
 R42RN1   LABEL 
          NOTE   R42RN1 
  
          IFTHEN ((SIGNOF,REGB),EQ,1)            IF SOURCE SIGNED 
           ANDIF ((SIGNOF,REGC),EQ,0)             AND DESTINATION UNSIGN
            GEN    XMIT,(VREGOF,VREG3),(TREGOF,REGB)
            GEN    SHR,VREG3,59 
            GEN    LXOR,(VREGOF,VREG1),(TREGOF,REGB),VREG3
            GEN    LXOR,(VREGOF,VREG2),(TREGP1OF,REGB),VREG3
          ELSEZ                                  IF SIGN RETAINED 
            MOVEZ  (TREGOF,REGB),VREG1
            MOVEZ  (TREGP1OF,REGB),VREG2
            ENDIFZ
  
          SUBZ   (POINTOF,REGB),(POINTOF,REGC),P1 
          CALLZ  SETBREG
          GENOBJ N=C.R4S18,I=(VREG1,VREG2,VREG4),O=((VREGOF,VREG1),(VREG
,OF,VREG2))                                                VREG1
                                                           VREG2=VREG1+1
          MOVEZ  VREG1,(TREGOF,REGC)
          RETURN
          SPACE  4
          LISTSEC  R42R1
          TITLE  R42R1 -  REGISTER D.P. COMP-2 TO REGISTER COMP-1 
**        R42R1 -  REGISTER D.P. COMP-2 TO REGISTER COMP-1
* 
*         REGB = DNAT POINTER TO SOURCE REGISTER. 
*         (TREGOF,REGB) = VIRTUAL REGISTER NUMBER OF REGISTER 
*           CONTAINING MOST SIGNIFICANT PART OF SOURCE VALUE. 
*         (SIGNOF,REGB) = 1 IFF SOURCE IS SIGNED. 
*         REGC = DNAT POINTER TO DESTINATION REGISTER.
*         (NUMLENOF,REGC) = NUMBER OF DIGITS IN DESTINATION VALUE.
*         (POINTOF,REGC) = POSITION OF LEAST SIGNIFICANT DIGIT
*           RELATIVE TO DECIMAL POINT.   (E.G. PIC 99V9999 _ 4) 
*         (SIGNOF,REGC) = 1 IFF DESTINATION IS SIGNED.
* 
*         CALLZ  R42R1
* 
*         GENERATES CODE TO PERFORM THE INDICATED MOVE. 
*         SETS (TREGOF,REGC) = VIRTUAL REGISTER NUMBER OF DESTINATION 
*           REGISTER. 
* 
*         USES-  REGU1
  
  
 R42R1    EGO    2
          NOTE   R42R1
  
          IFTHEN ((POINTOF,REGB),EQ,(POINTOF,REGC)) 
            MOVEZ  (TREGOF,REGB),VREG1
          ELSEZ 
            MOVEZ  REGU1,REGT 
            CALLZ  ADNAT
            MOVEZ  (POINTOF,REGC),(POINTOF,REGU1) 
            PUSH     REGC 
            MOVEZ    REGU1,REGC 
            CALLZ  R42R2     SCALE
            MOVEZ  (TREGOF,REGC),VREG1
            CALLZ    SUBDNAT
            POP      REGC 
          ENDIFZ
*      CREATE A DUMMY SOURCE DNAT 
  
          MOVEZ  REGU1,REGT                      ENTRY REGU1 _ DNAT 
          CALLZ  ADNAT                           CREATE DNAT
          MOVEZ  (POINTOF,REGC),(POINTOF,REGU1) 
          MOVEZ  VREG1,(TREGOF,REGU1) 
          MOVEZ  (SIGNOF,REGB),(SIGNOF,REGU1) 
  
*      CONVERT R2 (IN REGU1) TO R1 (IN REGC)
  
          PUSH   REGB                            SAVE ORIGINAL SOURCE 
          MOVEZ  REGU1,REGB                      THIS SOURCE IS REGU1 
          CALLZ  R22R1                           CONVERT (REGB) _ (REGC)
          POP    REGB                            RESTORE ORIGINAL SOURCE
  
          CALLZ  SUBDNAT                         DELETE REGU1 DNAT
          RETURN
          SPACE  4
          LISTSEC  R42R2
          TITLE  R42R2 -  REGISTER D.P. COMP-2 TO REGISTER COMP-2 
**        R42R2 -  REGISTER D.P. COMP-2 TO REGISTER COMP-2
* 
*         REGB = DNAT POINTER TO SOURCE ITEM. 
*         (TREGOF,REGB) = VIRTUAL REGISTER NUMBER OF REGISTER 
*           CONTAINING MOST SIGNIFICANT PART OF SOURCE. 
*         REGC = DNAT POINTER TO DESTINATION REGISTER.
* 
*         CALLZ  R42R2
* 
*         GENERATES CODE TO PERFORM THE INDICATED MOVE. 
  
  
 R42R2    EGO    2
          NOTE   R42R2
          IFTHEN ((POINTOF,REGB),EQ,(POINTOF,REGC)) 
            GEN    XMIT,(VREGOF,VREG1),(TREGOF,REGB)
          ELSEZ 
            SUBZ   (POINTOF,REGB),(POINTOF,REGC),T1 
            LSHIFT T1,1 
            GEN    SLRBPK,(VREGOF,VREG4),,CBDTENS (+T1) 
            GEN    SLRAPB,(VREGOF,VREG5),VREG4,VREGB1 
            GENM   MULTDDD
              REGP   VREG4,VREG5,(TREGOF,REGB),(TREGP1OF,REGB),(VREGOF,V
,REG1),(VREGOF,VREG2) 
            ENDG
            GEN    RADD,(VREGOF,VREG1),VREG1,VREG2
            GEN    NORM,(VREGOF,VREG1),,VREG1 
          ENDIFZ
          MOVEZ  VREG1,(TREGOF,REGC)
          RETURN
          SPACE  4
          LISTSEC  R42R4
          TITLE  R42R4 -  REGISTER D.P. COMP-2 TO REGISTER D.P. COMP-2
* 
*         REGB = DNAT POINTER TO SOURCE REGISTERS.
*         (TREGOF,REGB) = VIRTUAL REGISTER NUMBER OF REGISTER 
*           CONTAINING MOST SIGNIFICANT PART OF SOURCE. 
*         (TREGP1OF,REGB) = VIRTUAL REGISTER NUMBER OF REGISTER 
*           CONTAINING LEAST SIGNIFICANT PART OF SOURCE.
*         REGC = DNAT POINTER TO DESTINATION REGISTERS. 
* 
*         CALLZ  R42R4
* 
*         GENERATES CODE TO PERFORM THE INDICATED MOVE. 
*         SETS (TREGOF,REGC) = VIRTUAL REGISTER NUMBER OF REGISTER
*           CONTAINING MOST SIGNIFICANT PART OF RESULT. 
*         (TREGP1OF,REGC) WILL CONTAIN VIRTUAL REGISTER NUMBER OF 
*           REGISTER WITH LEAST SIGNIFICANT PART OF RESULT. 
  
  
 R42R4    EGO    2
          NOTE   R42R4
          SUBZ   (POINTOF,REGB),(POINTOF,REGC),T1 
          IFTHEN (T1,NE,0)
            LSHIFT T1,1      C.DTENS ENTRY IS 2 WORDS 
            GEN    SLRBPK,(VREGOF,VREG4),,CBDTENS  (+T1)
            GEN    SLRAPB,(VREGOF,VREG5),VREG4,VREGB1 
            GENM   MULTDDD
              REGP   VREG4,VREG5,(TREGOF,REGB),(TREGP1OF,REGB),(VREGOF,V
,REG1),(VREGOF,VREG4) 
            ENDM
          ELSEZ 
            GEN    XMIT,(VREGOF,VREG1),(TREGOF,REGB)
            GEN    XMIT,(VREGOF,VREG2),(TREGP1OF,REGB)
          ENDIFZ
          MOVEZ  VREG1,(TREGOF,REGC)
          RETURN
          SPACE  4
          LISTSEC  *
          END 
