* LOAD DECIMAL ACCUMULATOR                              HEADER  C:LOAD  0001.000
*                                                                       0002.000
*              LOAD DECIMAL ACCUMULATOR                                 0003.000
*                                                                       0004.000
         M.PGM     C:LOAD,MPX-32,3.6.1,00                               0005.000
*                                                                       0006.000
*    THIS PROCEDURE LOADS A DECIMAL STRING INTO THE SPECIFIED DECIMAL   0007.000
* ACCUMULATOR ( DECA ).  THE STRING CAN BE LOADED FROM ANOTHER DECA,    0008.000
* OR FROM AN AREA SPECIFIED BY A DATA DESCRIPTOR (DD).  THIS ROUTINE    0009.000
* REQUIRES TWO ARGUMENTS:                                               0010.000
*       R - NUMBER OF THE DESTINATION DECA                              0011.000
*       DD- DATA DESCRIPTOR FOR SOURCE STRING (OR SOURCE ACCUMULATOR)   0012.000
*                                                                       0013.000
*                                                                       0014.000
          M.REQS                                                        0015.000
          DEF  C:LOAD,CR.LOAD                                           0016.000
          EXT  CR.SIGN                                                  0017.000
          EXT  CR.ABORT                                                 0018.000
          DD.EQU                                                        0019.000
          COBOLDAT                                                      0020.000
*                                                                       0021.000
* ENTRY POINT-1  --- ARGUMENTS FOLLOW CALL                              0022.000
*                                                                       0023.000
C:LOAD   LOAD 2                   LOAD ARGUMENTS                        0024.000
*                                                                       0025.000
* ENTRY POINT-2  --- ARGUMENTS PASSED IN REGISTERS                      0026.000
*    R0 - RETURN ADDRESS                                                0027.000
*    R1 - R    DESTINATION DECA NUMBER                                  0028.000
*    R2 - DD   DATA DESCRIPTOR FOR SOURCE STRING                        0029.000
*                                                                       0030.000
CR.LOAD   CI   R2,8                DETERMINE TYPE OF LOAD               0031.000
          BGT  DDLOAD                                                   0032.000
*                                                                       0033.000
* REGISTER TO REGISTER LOAD                                             0034.000
*    R0 - RETURN ADDRESS      R3 - UNUSED         R6 - TEMPORARY        0035.000
*    R1 - DESTINATION INDEX   R4 - TEMPORARY      R7 - UNUSED           0036.000
*    R2 - SOURCE INDEX        R5 - TEMPORARY                            0037.000
*                                                                       0038.000
          LB   R4,DOFLO,X2         LOAD OVERFLOW FLAG FROM SOURCE       0039.000
          STB  R4,DOFLO,X1         SAVE IT IN DESTINATION               0040.000
          SLL  R1,1                SET UP INDEXES FOR HALFWORD ADDRESSIN0041.000
          SLL  R2,1                                                     0042.000
          LH   R5,NDECA,X1         DETERMINE OFFSETS FOR DESTINATION    0043.000
          LH   R6,NDECA,X2              AND SOURCE DECAS                0044.000
          LH   R4,DDECA,X2         LOAD SOURCE DDECA                    0045.000
          SUR  R6,R4               ADJUST DECA BY  PR-DDR               0046.000
          ADR  R5,R4                                                    0047.000
          STH  R4,DDECA,X1         SAVE IN R DDECA                      0048.000
          TRR  R5,R1               MOVE BEGINNING ADDRESSES OF THE DECAS0049.000
          TRR  R6,R2                 INTO THE INDEX REGISTERS           0050.000
*                                                                       0051.000
* TRANSFER DECA CONTENTS                                                0052.000
*                                                                       0053.000
          LI   R6,-5              SET UP COUNT                          0054.000
MOVRR     LD   R4,DECA,X2          MOVE WORD FROM SOURCE DECA TO        0055.000
          STD  R4,DECA,X1            DESTINATION DECA                   0056.000
          ABR  R1,28               INCREMENT INDEX REGISTERS R1 AND R2  0057.000
          ABR  R2,28                 BY 2W                              0058.000
          BIB  R6,MOVRR            INCREMENT COUNT, LOOP IF POSITIVE    0059.000
          TRSW 0                   RETURN                               0060.000
*                                                                       0061.000
* MEMORY TO MEMORY LOAD                                                 0062.000
*                                                                       0063.000
*   ENTRY CONDITIONS                                                    0064.000
*     R0 - RETURN ADDRESS                                               0065.000
*     R1 - R, DESTINATION DECA                                          0066.000
*     R2 - DD, SOURCE DECA                                              0067.000
*                                                                       0068.000
DDLOAD   ZMB   DOFLO,X1            CLEAR OVERFLOW TOGGLE                0069.000
         SLL   R1,1                SET UP HALFWORD INDEX                0070.000
         TRR   R1,R6               TRANSFER IT TO R6                    0071.000
         LH    R1,NDECA,X1         LOAD OFFSET TO DESTINATION DECA      0072.000
         LH    R5,DD.LEN,X2        LOADLENGTH                           0073.000
         TBM   DD.T,0,X2           IF SOURCE DATA IS NUMBERIC THEN      0074.000
         BS    NUMERIC               GO INITIALIZE NUMERIC LOAD.        0075.000
*                                                                       0076.000
* SOURCE DATA IS ALPHANUMERIC                                           0077.000
         LI    R4,G'+'             LOAD PLUS SIGN                       0078.000
         LW    R3,DD.PTR,X2        LOAD POINTER TO FIRST CHARACTER      0079.000
         CI    R5,18               IF LENGTH>18 THEN ADJUST POINTER     0080.000
         BLE   LOADAC                                                   0081.000
         ADR   R5,R3               DETERMINE LAST CHARACTER POSITION    0082.000
         LI    R5,18               LOAD 18 FOR THE LENGTH               0083.000
         SUI   R3,18               SUBTRACT 18 FROM POINTER             0084.000
         BU    LOADAC              GO PERFORM LOAD OPERATION            0085.000
*                                                                       0086.000
* SOURCE DATA IS NUMERIC --- CALL SIGN ROUTINE                          0087.000
*                                                                       0088.000
NUMERIC  TRR   R0,R7               SAVE RETURN ADDRESS IN R7            0089.000
         BL    CR.SIGN             EXECUTE SIGN SUBROUTINE              0090.000
         TRR   R7,R0               RESTORE RETURN ADDRESS               0091.000
*                                                                       0092.000
* PERFORM MEMORY TO DECA LOAD                                           0093.000
*     R0 - RETURN ADDRESS         R4 - SIGN OF SOURCE/MASK              0094.000
*     R1 - DECA LOCATION          R5 - LENGTH OF SOURCE OPERAND         0095.000
*     R2 - DD POINTER             R6 - ACCUMULATOR NUMBER (HALFWORD)    0096.000
*     R3 - PTR TO FIRST DIGIT     R7 - COUNTER                          0097.000
*                                                                       0098.000
LOADAC   STB   R4,DECA,X1          STORE SIGN                           0099.000
         TRR   R1,R7               SAVE RR IN R7                        0100.000
         LB    R2,DD.D,X2          LOAD DECIMAL POSITION                0101.000
         SLL   R2,26               EXTEND THE SIGN                      0102.000
         SRA   R2,26                                                    0103.000
         ADI   R2,18               ADD 18 AND SUBTRACT LENGTH TO OBTAIN 0104.000
         SUR   R5,R2                 THE NUMBER OF LEADING ZERO'S       0105.000
         TRN   R2,R2               NEGATE IT FOR LOOP COUNT             0106.000
         BNN   NOZERO              SKIP LOOP IF ITS NOT NEGATIVE        0107.000
MOVZ1    ADI   R1,1                INCREMENT DECA INDEX                 0108.000
         ZMB   DECA,X1             ZERO NEXT BYTE                       0109.000
         BIB   R2,MOVZ1            INCREMENT COUNT AND REPEAT IF NEGATIV0110.000
NOZERO   XCR   R1,R6               EXCHANGE R1                          0111.000
         ABR   R6,31               INCREMENT R6 BY 1                    0112.000
         STH   R6,DDECA,X1         STORE POINTER TO MSD IN DDECA.       0113.000
         XCR   R1,R6               EXCHANGE REGISTERS AGAIN             0114.000
         TRN   R5,R5               NEGATE LENGTH FOR LOOP COUNT         0115.000
         LI    R4,X'7F'            LOAD MASK                            0116.000
*                                                                       0117.000
* MOVE SOURCE DATA INTO DECA                                            0118.000
*                                                                       0119.000
MOVDATA  LMB   R2,0,X3             LOAD LOWER ORDER 7 BITS OF NEXT BYTE 0120.000
         LB    R2,DIGIT,X2         TRANSLATE IT                         0121.000
         CI    R2,X'FF'            IF ITS ILLEGAL, GO TO ERROR          0122.000
         BEQ   ERROR                                                    0123.000
         STMB  R2,DECA,X1          STORE BYTE IN DECA.                  0124.000
         ABR   R1,31               INCREMENT R1 BY 1                    0125.000
         ABR   R3,31               INCREMENT R2 BY 1                    0126.000
         BIB   R5,MOVDATA          INCREMENT COUNT AND LOOP IF NEGATIVE 0127.000
         SUR   R1,R7               SUBTRACT R2 FROM R1 AND STORE IN R2  0128.000
         TRN   R7,R7                                                    0129.000
         ADI   R7,-38              SUBTRACT 38 TO SET UP LOOP COUNT     0130.000
         BNN   RETURN              IF NON-NEGATIVE SKIP LOOP            0131.000
SETTZ    ZMB   DECA,X1                                                  0132.000
         ADI   R1,1                SET TRAILING ZEROS                   0133.000
         BIB   R7,SETTZ                                                 0134.000
RETURN   TRSW  0                   RETURN                               0135.000
ERROR    LI    R1,1                LOAD WARNING CODE FOR INVALID DIGIT  0136.000
         TRR       R0,R7                                                0137.000
         BL    CR.ABORT             EXIT                                0138.000
         END                                                            0139.000
