* CONVERT 128 UNSIGNED INTEGER TO DISPLAY DECIMAL P10MB1 ZMFACC CODE,START,NAME='MATS BROBERG AT SEB SWEDEN' * LMG 6,7,INPUT THE NUMBER IS R6*2**64 + R7 * 2**64 = 10**19 + 8446 744 073 709 551 616 = POT10 + B * R6*2**64 + R7 = * R6*(POT10 + B) + R7 = * R6*POT10 + R6*B + R7 * * ONLY R6*B + R7 CONTRIBUTE TO THE RIGHTMOST 19 DECIMAL DIGITS * IT MAY VERY WELL CONTRIBUTE TO THE LEFTMOST 20 DIGITS ALSO. * WE WILL FIRST COMPUTE R6*B + R7 * LGR 9,6 COMPUTE R6 ... MLG 8,B ... TIMES B INTO R8-R9 ALGR 9,7 ADD R7 ALCG 8,NULL ADD ANY CARRY INTO R8 * R6*B + R7 NOW EQUALS R8*2**64 + R9 * DIVIDING BY POT10 WILL GIVE THE REMAINDER IN R8 AND THAT IS THE * RIGHTMOST 19 DIGITS. R9 CONTAINS WHAT CONTRIBUTES TO THE LEFTMOST * 20 DIGITS. DLG 8,POT10 * AND NOW THE SAME NUMBER (R6*B + R7) IS R9*POT10 + R8 * THE NUMBER WE STARTED WITH IS R6*POT10 + R9*POT10 + R8 = * THE NUMBER WE STARTED WITH IS (R6 + R9)*POT10 + R8 * IN THE PACKED FORMAT THEY WILL GO INTO L2 L1 H * SO FAR THE ARITHMETIC HAS BEEN UNSIGNED, BUT CVDG IS SENSITIVE TO * THE SIGN. SO WE MUST COMPENSATE FOR THAT. * FIRST THE RIGHTMOST 19 DIGITS IN R8 CVDG 8,H LTGR 8,8 BNM NOTMIN0 AP H,TVATO64 * THEN ONE PART OF THE VALUE IN THE FIRST 20 POSITIONS NOTMIN0 CVDG 9,L1 LTGR 9,9 BNM NOTMIN1 AP L1,TVATO64 * AND THE NEXT PART NOTMIN1 CVDG 6,L2 LTGR 6,6 BNM NOTMIN2 AP L2,TVATO64 * FINALLY ADD THE TWO LEFT PARTS. NOTMIN2 AP L2,L1 SRP L2,1,0 MVC HD(10),L2+5 MVC RES,MASK ED RES,HD ZMFACC CODE,END ZMFACC INPUT,START INPUT DC 0FD,XL16'BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB' ZMFACC INPUT,END ZMFACC OUTPUT,START RES DS CL(MASKL) ZMFACC OUTPUT,END MASK DC X'40',12X'20202040',X'202120' MASKL EQU *-MASK DS 0FD NULL DC 16X'0' POT10 DC X'8AC7230489E80000' 10000000000000000000 (10**19) B DC X'7538DCFB76180000' 8446744073709551616 TVATO64 DC PL16'18446744073709551616' X'10000000000000000' HD DS XL20 H EQU HD+4,16,C'P' L1 DS PL16 L2 DS PL16 END