         SYSTEM   SIG7FDP
         PAGE
         TITLE    'DOUBLE PRECISION MULTIPLICATION'
         DEF      C:DPM
BSR      EQU      10
R1       EQU      1
R2       EQU      2
R3       EQU      3
R4       EQU      4
R5       EQU      5
R6       EQU      6
R7       EQU      7
R8       EQU      8
         BOUND    8
DECA1    RES      2                 SAVE DECA
DECA2    RES      2
MORY1    RES      2                 SAVE MULTIPLIER
MORY2    RES      2
NBYTS    RES      1                 NUMBER OF BYTES
BYTAD    RES      1                 MULTIPLIER BYTE ADDRESS
SHIFTN   RES      1                 NO OF SHIFT REQUIRED
STDIGT   RES      1                 STARTING DIGIT NUMBER
ADDTD    RES      4                 ADDED RESULT
REGSV    RES      14                SAVE REGISTERS
RESULT   RES      8                 RESULT
DECZR    DATA     X'0000000C'       DECIMAL ZERO
C:DPM    LCI      10                START
         STM,1    REGSV
         LW,R2    BSR
         SLD,R2   -4
         SLS,R3   -28
         CI,R3    0
         BCS,3    %+2
         LI,R3    16
         STW,R3   NBYTS             # OF BYTES
         SLD,R2   -8
         SAS,R3   -24
         STW,R3   SHIFTN            SHIFT NUMBER
         LW,R3    REGSV-1,R2
         STW,R3   BYTAD             BYTE ADDRESS
         LB,R2    12
         SLS,R2   -4
         CI,R2    0
         BCS,3    DPMEND            CHECK FIRST DIGIT
         LW,R1    NBYTS
         CI,R1    16
         BCS,3    MULT
         LW,R1    BYTAD
         LB,R2    0,R1
         SLS,R2   -4
         CI,R2    0
         BCS,3    DPMEND
MULT     DC,4     DECZR
         BCS,3    %+3
MULT0    DL,4     DECZR             RESULT IS ZERO
         B        DPMEND1
         DST,8    DECA2             SAVE DECA
         DSA      -15
         DST,8    DECA1
         DL,4     DECZR             CLEAR DECA
         LI,R3    64
         SW,R3    NBYTS
         LW,R2    NBYTS
         STB,R2   R3
         LW,R2    BYTAD
         MBS,R2   0
         DC,4     DECZR
         BCR,3    MULT0
         DST,8    MORY2             SAVE MULTIPLICAND
         DSA      -15
         DST,8    MORY1
         LI,R2    8                 CLEAR RESULT BUFFER
         LI,R3    0
         STW,R3   RESULT-5,R2
         BDR,R2   %-1
         DL,8     DECA2
         DM,8     MORY2             (DECA2)*(MORY2)
         DST,0    RESULT+4
         DSA      -15
         DST,0    ADDTD
         DL,8     DECA1
         BCR,3    MULT1
         DM,8     MORY2             (DECA1)*(MORY2)
         DA,0     ADDTD
         DST,0    ADDTD
         BAL,R8   ADDTO
MULT1    DL,8     MORY1
         BCR,3    MULT2
         DM,8     DECA2             (DECA2)*(MORY|)
         DA,0     ADDTD
         BAL,R8   ADDTO
         DSA      -16
         DST,0    ADDTD
MULT2    DL,8     DECA1
         BCR,3    SHIFT
         DL,8     MORY1
         BCR,3    SHIFT
         DM,8     DECA1             (DECA1)*(MORY|)
         DA,0     ADDTD
         LI,R3    BA(RESULT)+1
         BAL,R8   ADDTO+2
         LW,R3    RESULT+4          STORE LAST DIGIT
         SLS,R3   4
         LW,R2    15
         SLS,R2   -4
         SLD,R2   4
         STB,R2   RESULT+4
SHIFT    LW,R2    SHIFTN            MOVE RESULT IN DECA
         BCS,3    SHIFT1
         BAL,R8   CKOFLW            NO SHIFT
         B        DPMEND1
SHIFT1   BCS,1    SHIFT2
         BAL,R8   CKOFLW
         DSA      *R2
         BCS,4    DPMEND
         B        DPMEND1
SHIFT2   CI,R2    -61               NEGATIVE SHIFT
         BCR,2    MULT0
         LI,R3    64
         AW,R3    R2
         AI,R3    -32
         STW,R3   STDIGT
         BCR,2    SHIFT5
         LI,R4    0                 CHECK OVERFLOW
SHIFT3   LI,R5    8
         LW,R7    RESULT,R4
         LI,R6    0
SHIFT4   SLD,R6   4
         CI,R6    0
         BCS,3    DPMEND
         BDR,R3   %+2
         B        SHIFT5
         BDR,R5   SHIFT4
         AI,R4    1
         B        SHIFT3
SHIFT5   LW,R2    STDIGT
         LI,R3    0
         AI,R2    1
         SAD,R2   -1
         STW,R3   BYTAD             ODD OR EVEN DIGIT FLAG
         LI,R5    48
         LI,R4    16
         STB,R4   R5
         LI,R4    BA(RESULT)
         AW,R4    R2
         MBS,R4   0                 MOVE RESULT IN DECA
         LI,R5    X'F'              SET SIGN
         AND,R5   RESULT+7
         SCS,R5   -4
         LW,R4    15
         SLS,R4   -4
         SLD,R4   4
         STW,R4   15
         LW,R1    BYTAD
         BCS,3    SHIFT6
         DSA      -1
         AI,R2    -1
         LB,R2    RESULT,R2         ODD DIGIT
         SLS,R2   28
         OR,R2    12
         STW,R2   12
SHIFT6   LW,R2    STDIGT
         BCR,1    DPMEND1
         LCW,R3   R2                ANSWER EXCEED RESULT
         DSA      *R3
         DSA      *R2
         B        DPMEND1
DPMEND   LI,R3    X'40'             SET CONDITON CODE
         B        DPMEND2+1
DPMEND1  DC,4     DECZR
         BCR,3    DPMEND2
         BCS,1    %+3
         LI,R3    X'20'
         B        DPMEND2+1
         LI,R3    X'10'
         B        DPMEND2+1
DPMEND2  LI,R3    0                 RESET REGISTERS & CC
         STB,R3   NBYTS
         LCI      10
         LM,1     REGSV
         LCF      NBYTS
         B        *11
ADDTO    DSA      1                 STORE INTERMEDIATE RESULT
         LI,R3    BA(RESULT)+9
         LI,R2    15
         STB,R2   R3
         LI,R2    48
         MBS,R2   0
         B        *R8
CKOFLW   LI,R6    4                 CHECK OVERFLOW
         LW,R7    RESULT-1,R6
         BCS,3    DPMEND
         BDR,R6   %-2
         DL,0     RESULT+4
         B        *R8
         END
