C PROGRAM DPCVT.FT C ---------------- C C C C C DOUBLE PRECISON ARITHMETIC FOR OS/8 FORTRAN II C ---------------------------------------------- C C C C C PETER LEMKIN C NATIONAL INSTITUTES OF HEALTH C BETHESDA, MD 20014 C C C MARCH 13,1972 C REVISED DECEMBER 4, 1972 C C C ABSTRACT C -------- C "DPARITH.FT" IS A FAST DOUBLE PRECISION INTEGER ARITHMETIC C INTERNAL SABR TYPE CODE SUBROUTINE PACKAGE FOR USE IN C OS/8 FORTRAN II. THIS PACKAGE WILL WORK ON ANY PDP8 WITH OR C WITHOUT EAE. "DPCVT.FT" IS A FORTRAN II SUBROUTINE USING C "DPARITH.FT" TO CONVERT DOUBLE PRECISION INTEGERS TO AND FROM C FLOATING POINT NUMBERS. C C C C **PAGE C C C C OS/8 FORTRAN II DOUBLE PRECISION/FLOATING POINT CONVERSION C ---------------------------------------------------------- C C C C C SUBROUTINE DPCVT(IHIGH,ILOW,A,IOPR) C C C C C INTRODUCTION C ------------- C SUBROUTINE DPCVT IS USED TO CONVERT A DOUBLE PRECISION C INTEGER TO OR FROM A OS/8 FLOATING POINT WORD. THE DPARITH.FT C DOUBLE PRECISION ARITHMETIC PACKAGE IS USED. C C C C ARGUMENTS C --------- C C 1. IHIGH - HIGH DOUBLE PRECISION WORD. C 2. ILOW - LOW " " " . C 3. A - FLOATING POINT WORD. C 4. IOPR - THE COMMAND DIRECTION WORD C WHERE: C DOUBLE PRECISION TO FLOAT IF IOPR=0 C FLOAT TO DOUBLE PRECISION IF IOPR=1 C ***NOTE: INSERT DPARITH.FT HERE*** C **PAGE C C 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 INTRODUCTION 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*************************************** C **PAGE C ------------------------------------------------------------ C DIMENSION K(2) C C C C 1. CHECK WHETHER IOPR IS 0. IF(IOPR)10,10,50 10 S=1.0 K(1)=IHIGH K(2)=ILOW C C C C C C 2.COMPUTE THE SIGN IF MINUS,COMPLEMENT K C AND CHANGE SIGN. IF(K(1))20,30,30 20 S=-1.0 S CPAGE 2 S JMS LOAD /K INTO DIAC. S \K C S JMS DPTC /2'S COMPLEMENT C S CPAGE 2 S JMS STORE /RESTORE K. S \K C C C C C C 3. SAVE THE SIGN OF THE ILOW WORD C AND REMOVE THE SIGN BIT. S\30, CLA S TAD \K# /IE: K(2) S SPA CLA S IAC /"-" LOAD 1. S DCA \ICARRY S TAD \K# S AND (3777 S DCA \K# C C C C C C 4. COMPUTE A FROM K(.). 40 A=S*(FLOAT(K(1))*4096.0+FLOAT(ICARRY)*2048.0+FLOAT(K(2))) RETURN C C C C C 5. CONVERT A TO D.P.(IHIGH,ILOW). 50 ISIGN=+1 AA=A IF(A)51,60,70 51 ISIGN=-1 AA=-A GOTO 70 C C C C C C 6. A IS ZERO, ZERO (IHIGH,ILOW). 60 IHIGH=0 ILOW=0 RETURN C C C C C 7. COMPUTE THE HIGH WORD 70 B=AA/4096.0 K(1)=B CCC=AA-4096.0*FLOAT(K(1)) IF(CCC-2048.0)72,71,71 71 IK2=CCC-2048.0 K(2)=IK2+1+2047 GOTO 81 72 K(2)=CCC C C C C C C 8.0 CHECK WHETHER COMPLEMENT K(.). 81 IF(ISIGN)80,90,90 S CPAGE 2 S\80, JMS LOAD /LOAD K INTO DIAC S \K S JMS DPTC /2'S COMPLEMENT S CPAGE 2 S JMS STORE / SAVE IT IN K. S \K C C C C C 9.0 SAVE RESULTS IN IHIGH, ILOW. 90 IHIGH=K(1) ILOW=K(2) RETURN S\ICMPR, 0 END