C PROGRAM DPARITH.FT C ================ C C C C A FAST DOUBLE PRECISION INTEGER PACKAGE FOR OS/8 FORTRAN II. C ----------------------------------------------------------- C C C PETER LEMKIN C NATIONAL INSTITUTES OF HEALTH C BETHESDA, MD 20014 C C C C C APRIL 10, 1972 C REVISED DECEMBER 1, 1972 C C C C ABSTRACT C ============ C A FAST DOUBLE PRECISION INTEGER ARITHMETIC PACKAGE FOR USE IN C OS/8 FORTRAN II. THESE FUNCTIONS ARE AVAILIABLE ON AN 8/E C WITH THE EAE OPTION. HOWEVER, THIS PACKAGE WILL WORK ON ANY C PDP8. THE VARIABLES IT REFERENCES MUST BE LOCAL TO THE PROGRAM C OR SUBROUTINE USING THE SET OF SUBROUTINES. A DOUBLE PRECISION C ACCUMULATOR SIMULATED IN MEMORY IS CALLED THE EIAC. THE PACKAGE C IS USED BY LOADING, ADDING, 2'S COMPLEMENTING AND COMPARING C DATA IN MEMORY WITH THE EIAC. FOR COMPLETENESS, A DOUBLE C PRECISION 1 AND -1 ARE INCLUDED: DPONE=+1, DPMONE=-1. THE C PACKAGE IS MOST USEFUL WHEN ADDED PRECISION IS NEEDED C BUT THE FLOATING POINT ARITHMETIC IS TOO SLOW. C C C C THE SUBROUTINES AVAILIABLE ARE: C ------------------------------- C 1. DADD - DOUBLE PRECISON ADD C 2. DPTC - DOUBLE PRECISON NEGATION (2'S COMPLEMENT). C 3. LOAD - DOUBLE PRECISON LOAD TO EIAC C 4. STORE - DOUBLE PRECISON STORE FROM EIAC C 5. CMPAR - DOUBLE PRECISION COMPARE WITH RESULT IN C COMMON VARIABLE ICMPR .(SEE THE DESCRIPTION BELOW). C 6. DOUBLE PRECIOSION CONSTANTS FOR +1 AND -1 ARE C ALSO INCLUDED FOR COMPLETENESS DPONE, AND DPMONE C RESPECTIVELY. C C C C C ***BYPASS THIS CODE**** GOTO 1999 C *********************** C C C C C C 1. SUBROUTINE DADD C IS USED TO DO DOUBLE PRECISION INTEGER ADDITION. C C + C ==> C. C CALLING SEQUENCE: C JMS DADD C ARG1 /ADDRESSS OF THE VARIABLE C RETURN C S CPAGE 52 SDADD, 0 S CLA CLL S TAD I DADD /GET THE ADDRESS S DCA QTRANS S ISZ DADD S TAD I QTRANS S DCA \EIACX /PUT IN HI ACC EIAC S ISZ QTRANS S TAD I QTRANS S DCA \EIACX# /GET LOW PART OF ARG1 S CLL S TAD \EIAC# /ADD .LOW ORDER S TAD \EIACX# S DCA \EIAC# S RAL /GET THE LINK BIT S TAD \EIAC /GET THE HIGH ORDER PART S TAD \EIACX S DCA \EIAC S RAR S DCA \JDIL /SAVE THE LINK BIT S JMP I DADD /RETURN SQTRANS, 0 /DUMMY VAR C C C C 2. SUBROUTINE DPTC C TAKE THE TWO'S COMPLEMENT OF THE EIAC C CALLING SEQUENCE: C JMS DPTC C RETURN S CPAGE 32 SDPTC, 0 S CLA CLL S TAD \EIAC# S CMA IAC /LOW ORDER 2'S COMPL. S DCA \EIAC# S RAL /SAVE THE LINK S DCA \JDIL S TAD \EIAC S CMA S TAD \JDIL /ADD THE LINK S DCA \EIAC /SAVE THE HI PART S JMP I DPTC /RETURN C C C C 3. SUBROUTINE LOAD C IS USED TO LOAD THE DOUBLE PRECISION INTEGER GIVEN IN THE CALL C INTO THE EIAC C CALLING SEQUENCE: C JMS LOAD C ARG VARIABLE /ADDRESS OF VARIABLE C RETURN C S CPAGE 20 SLOAD, 0 S CLA CLL S TAD I LOAD S DCA RTRANS S ISZ LOAD S TAD I RTRANS S DCA \EIAC S ISZ RTRANS S TAD I RTRANS S DCA \EIAC# S JMP I LOAD SRTRANS, 0 C C C C 4. SUBROUTINE STORE C IS USED TO STORE THE EIAC INTO A DOUBLE PRECISION C MEMORY LOCATION. C ADDRESSED BY ARG 1 C CALLING SEQUENCE: C JMS STORE C ARG 1 /ADDRESS IN WHICH TO STORE THE EIAC. C RETURN C S CPAGE 20 SSTORE, 0 S CLA CLL S TAD I STORE /GET THE ADDRESS S DCA TRANS S ISZ STORE S TAD \EIAC S DCA I TRANS S ISZ TRANS S TAD \EIAC# S DCA I TRANS S JMP I STORE STRANS, 0 /DUMMY VARIABLE IN PAL8 STYLE. C C C C C C 5. SUBROUTINE CMPAR C COMPARES THE EIAC WITH THE CONTENTS OF ARG 1. C IF C(EIAC) > C(ARG 1) THEN ICMPR<==+1 C " = " " ICMPR<==0 C " < " " ICMPR<==-1 C C CALLING SEQUENCE: C JMS CMPAR C ARG 1 /ADDRESS OF VARIABLE C RETURN C S CPAGE 35 SCMPAR, 0 S CLA CLL S TAD I CMPAR S DCA CMPR1 /SAVE ADDRESS FOR ADD CALL S ISZ CMPAR S JMS DPTC /2' COMPLEMENT. S JMS DADD SCMPR1, 0 /ARG PUT HERE BY PROLOGUE S TAD \EIAC /C <== C - C S SPA /HI WORD IS + OR ZERO. S JMP POS /EIAC > ARG1 S SZA CLA /?HI WORD ZERO? S JMP NEG /ARG1 < EIAC S TAD \EIAC# /HI WD ZERO . LOW CAN STILL BE + S SNA CLA /LOW WORD =0? S JMP ZER /NO, MUST BE 0. EIAC = ARG1 SNEG, CLA CMA S JMP ZER# SPOS, CLA IAC S JMP ZER# SZER, CLA S DCA \ICMPR /SET THE FLAG S JMP I CMPAR /RETURN C C C C *******DOUBLE PRECISION CONSTANTS**** C A. DPONE IS DOUBLE PRECISON 1 S CPAGE 2 SDPONE, 0 S 1 C C C B. DPMONE IS DOUBLE PRECISON -1 S CPAGE 2 SDPMONE, 7777 S 7777 C C S\EIAC, 0 S 0 S\EIACX, 0 S 0 S\JDIL, 0 C C *******CONTINUE HERE AFTER BYPASS IT**** 1999 CONTINUE C C *******END OF DPARITH.FT***************************************