* CONVERT DECIMAL TO BINARY                             HEADER  C:CVNB  0001.000
*                                                                       0002.000
*              CONVERT DECIMAL TO BINARY                                0003.000
*                                                                       0004.000
         M.PGM     C:CVNB,MPX-32,3.6.1,00                               0005.000
         DEF   C:CVNB,CR.CVNB                                           0006.000
*                                                                       0007.000
* CONVERT DECIMAL TO BINARY                                             0008.000
*    ARG1 - DECIMAL DD                                                  0009.000
*    ARG2 - BINARY DD                                                   0010.000
*                                                                       0011.000
         EXT   CR.BSTO                                                  0012.000
         EXT   CR.LOAD                                                  0013.000
         M.REQS                                                         0014.000
         DD.EQU                                                         0015.000
         COBOLDAT                                                       0016.000
*                                                                       0017.000
* INTERNAL DATA                                                         0018.000
*                                                                       0019.000
         ORG   WORKAREA                                                 0020.000
RET      RES   1W             RETURN ADDRESS                            0021.000
DD       RES   1W             BINARY DD                                 0022.000
         REL                                                            0023.000
*                                                                       0024.000
* LOAD DECIMAL INTO DECA-8                                              0025.000
*                                                                       0026.000
C:CVNB  LOAD  2              LOAD ARGUMENTS                             0027.000
CR.CVNB  STW   R0,RET         SAVE RETURN ADDRESS                       0028.000
         STW   R2,DD          SAVE BINARY DD                            0029.000
         CI    R1,8                                                     0030.000
         BEQ   $+4W                                                     0031.000
         LI    R2,8           INDICATE DECA-8 FOR LOAD                  0032.000
         XCR   R1,R2                                                    0033.000
         BL    CR.LOAD        LOAD DECIMAL INTO DECA-8                  0034.000
         ZR    R6                                                       0035.000
         ZR    R7             CLEAR (R6,R7)                             0036.000
*                                                                       0037.000
* DETERMINE POSITON OF MOST SIGNIFICANT DIGIT                           0038.000
*                                                                       0039.000
         LI    R3,-37         INITIALIZE POINTER/COUNT                  0040.000
MSDLOOP  LB    R4,DECA+358,X3 GET NEXT BYTE                             0041.000
         BNZ   GETLSD         IF ITS NON-ZERO GOTO GETLSD               0042.000
         BIB   R3,MSDLOOP     REPEAT IF END OF DECA HASN'T BEEN REACHED 0043.000
         LI    R2,0           INDICATE SCALE FACTOR OF 0                0044.000
         BU    SAVACC         GO SAVE 0 IN AS RESULT                    0045.000
*                                                                       0046.000
* FIND LEAST SIGNIFICANT DIGIT POSITION                                 0047.000
*                                                                       0048.000
GETLSD   TRR   R3,R2                                                    0049.000
         ADI   R2,18          LET R2 POINT 18 DIGITS PAST R3            0050.000
         BNP   FNDLSD         IF R2 POINTS PAST END OF DECA-8           0051.000
         LI    R2,0              THEN LET IT POINT TO END OF DECA-8     0052.000
FNDLSD   SUI   R2,1           DECREMENT POINTER                         0053.000
         LB    R4,DECA+358,X2 GET NEXT DIGIT FROM DECA-8                0054.000
         BZ    FNDLSD         REPEAT IF DIGIT IS ZERO                   0055.000
*                                                                       0056.000
* DETERMINE DECIMAL SCALE FACTOR AND CONVERSION COUNT                   0057.000
*                                                                       0058.000
         CI    R2,-20         IF LSD IS ONE OR MORE POSITIONS TO        0059.000
         BGE   DETCNT            THE LEFT OF THE DECIMAL POINT,         0060.000
         LI    R2,-20            THEN LET IT POINT TO UNITS DIGIT       0061.000
DETCNT   TRN   R2,R1          TRANSFER LSD POINTER TO R1 AND NEGATE IT  0062.000
         ADR   R3,R1          DETERMINE NUMBER OF DIGITS TO CONVERT     0063.000
         SUI   R1,1              BY R1 = R3 - R2 - 1.                   0064.000
         ADI   R2,20          DETERMINE DECIMAL SCALE FACTOR IN R2      0065.000
*                                                                       0066.000
* CONERT NUMBER                                                         0067.000
*                                                                       0068.000
CONVLOOP SLAD  R6,1                                                     0069.000
         STD   R6,ACC+8D      MULTIPLY (R6,R7) BY 10                    0070.000
         SLAD  R6,2                                                     0071.000
         ARMD  R6,ACC+8D         AND SAVE RESULT IN ACC-8               0072.000
         ZR    R6                                                       0073.000
         LB    R7,DECA+358,X3 LOAD NEXT DIGIT INTO (R6,R7)              0074.000
         ADMD  R6,ACC+8D      ADD IN ACC-8                              0075.000
         ADI   R3,1           INCREMENT POINTER                         0076.000
         BIB   R1,CONVLOOP    REPEAT                                    0077.000
*                                                                       0078.000
* NEGATE RESULT IF SIGN OF DECA IS '-'                                  0079.000
*                                                                       0080.000
         LB    R4,DECA+320    LOAD SIGN                                 0081.000
         CI    R4,G'+'        IF ITS '+'                                0082.000
         BEQ   SAVACC            THEN GO SAVE ACCUMULATOR               0083.000
         STD   R6,ACC+8D                                                0084.000
         LND   R6,ACC+8D         OTHERWISE NEGATE (R6,R7)               0085.000
*                                                                       0086.000
* SAVE ACCUMULATOR                                                      0087.000
*                                                                       0088.000
SAVACC   STD   R6,ACC+8D      SAVE (R6,R7) IN ACC-8                     0089.000
         STH   R2,DACC+8H     SAVE DECIMAL SCALE FACTOR                 0090.000
         LB    R4,DOFLO+8     TRANSFER OVERFLOW INDICATION FROM DECA-8  0091.000
         STB   R4,BOFLO+8        TO BINARY ACC-8.                       0092.000
         LI    R1,8           INDICATE THAT ACC-8                       0093.000
         LW    R2,DD             IS TO BE SAVED IN AREA SPECIFIED BY DD 0094.000
         LW    R0,RET                                                   0095.000
         CI        R2,8                                                 0096.000
         BNE       CR.BSTO                                              0097.000
         TRSW      R0                                                   0098.000
         END                                                            0099.000
