C PROGRAM DPCVRT.FT C ---------------- C SUBROUTINE DPCVRT(DPINTEGER,FLTVARIABLE,IOPR) C C C C PETER LEMKIN C NATIONAL INSTITUTES OF HEALTH C BETHESDA, MD 20014 C C MARCH 13, 1975 C REVISED OCT 22, 1975 C REVISED NOV 21, 1975 C C C C C PURPOSE C ------- C DPCVRT IS USED TO CONVERT A DOUBLE PRECISION C INTEGER TO OR FROM A OS/8 FLOATING POINT C WORD. THE EAE IS USED AND THE D.P. CONVENTION C FOR NUMBERS IS THAT THE C(N)=LSW, C(N+1)=MSW. C C C C ARGUMENTS C --------- C 1. DPINTEGER(1) - LOW DOUBLE PRECISION WORD. C 2. DPINTEGER(2) - HIGH " " " . C 3. FLTVARIABLE - FLOATING POINT WORD. C 4. IOPR - THE CONVERSION DIRECTION WORD C 0 (OR -1) D.P. TO FLOAT C 1 FLOAT TO D.P. C C C C C PDP8E IOTS NOT DEFINED IN SABER C ------------------------------- S OPDEF CLAMQ 7621 /CLA MQL S OPDEF SWP 7521 S OPDEF BSW 7002 S OPDEF MQL 7421 S OPDEF MQA 7501 S OPDEF MUY 7405 S OPDEF DVI 7407 S OPDEF SHL 7413 /SHIFT LEFT S OPDEF LSR 7417 /LOGICAL SHIFT RIGHT S OPDEF SWAB 7431 /A ==> B (ALSO DOES AN MQL) S OPDEF SWBA 7447 /B ==> A S OPDEF DAD 7443 S OPDEF DST 7445 S OPDEF DPIC 7573 S OPDEF DCM 7575 S OPDEF DPSZ 7451 C DIMENSION K(2) EQUIVALENCE(K(2),K2) C C C C [1] CHECK WHETHER IOPR IS 0. IF(IOPR)10,10,50 10 SIGN=1.0 S SWAB S TAD \DPINTEGER# /GET THE ADDRESS S DCA DP1 /SET UP THE ADDRESS S TAD \DPINTEGER /SET UP THE DATA FIELD S DCA DOFLD1 S DOFLD1, 6201 /CDF TO DATA FIELD S CPAGE 2 S DAD S DP1, 0 /POINTER TO DPINTEGER S CPAGE 2 S JMS 45 /CDFSKP S NOP S CPAGE 2 S DST /SAVE IT IN K S \K S CLAMQ C C C C C C C [2] COMPUTE THE SIGN IF MINUS,COMPLEMENT K C AND CHANGE SIGN. S TAD \K# /TEST THE SIGN BIT S SMA CLA S JMP \30 /IT IS POSITIVE SIGN=-1.0 S CPAGE 2 S DAD /K INTO DIAC. S \K C S DCM /2'S COMPLEMENT C S CPAGE 2 S DST /RESTORE K. S \K S CLAMQ C C C C C C [3] SAVE THE SIGN OF THE LSW DPINTEGER WORD C AND REMOVE THE SIGN BIT. S \30, TAD \K /IE K(1) 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 FLTVARIABLE FROM K(.). 40 FLTVARIABLE = SIGN * (FLOAT(K2)*4096.0 1 + FLOAT(ICARRY)*2048.0 + FLOAT(K) ) S SWBA RETURN C C C C C [5] CONVERT FLTVARIABLE TO D.P.(DPINTEGER[1:2]). 50 ISIGN=+1 POSVARIABLE=FLTVARIABLE IF(FLTVARIABLE)51,60,70 51 ISIGN=-1 POSVARIABLE=-FLTVARIABLE GOTO 70 C C C C C C [6] IF FLTVARIABLE IS ZERO, ZERO DPINTEGER. S \60, DCA I \DPINTEGER /0==>DPINTEGER[1] S INC \DPINTEGER# /INCREEMENT THE POINTER S DCA I \DPINTEGER /0==>DPINTEGER[2] S SWBA RETURN C C C C C [7] COMPUTE THE HIGH WORD 70 FMSW=POSVARIABLE/4096.0 K2=FMSW FLSW=POSVARIABLE - 4096.0*FLOAT(K2) C HAVE TO WORRY ABOUT THE SIGN SINCE OS/8 FORTRAN C WILL CONVERT FLOAT TO +/- INTEGER INCORRECTLY C AND WE HAVE TO FIX IT UP. IF(FLSW-2048.0)72,71,71 71 LSW=FLSW-2048.0 C NOTE: THE OS8 FORTRAN TREATS K AS THE SAME AS K WHICH C EXECUTES FASTER. S TAD (4000 S TAD \LSW S DCA \K GOTO 81 72 K=FLSW C C C C C C [8] CHECK WHETHER COMPLEMENT K(.). 81 IF(ISIGN)80,90,90 S\80, SWAB /GOTO MODE B TO DO 2'S COMPLEMENT S CPAGE 2 S DAD /LOAD K INTO DIAC S \K C S DCM /2'S COMPLEMENT C S CPAGE 2 S DST / SAVE IT IN K. S \K S CLAMQ C C C C C [9] SAVE RESULTS IN DPINTEGER 90 CONTINUE S TAD \K /SAVE DP RESULT S DCA I \DPINTEGER S INC \DPINTEGER# S TAD \K# S DCA I \DPINTEGER S SWBA RETURN C S\ICMPR, BLOCK 1 END