.TITLE FLTIBM ;MAKE DEC FLOATING POINT FROM IBM ;FLOATING POINT (SINGLE PRECISION) ;NUMBERS. .IDENT /GCE001/ ;G.C. EVERHART .GLOBL FLTIBM ;VAX VERSION ;9/16/1981 ; ; THIS PROGRAM WILL RETURN THE FORTRAN CALLER THE ; PDP11 EQUIVALENT OF THE CALLED ARGUMENT. ; ; X = FLTIBM(IBM F.P. NO) ; DOES THE RETURN. ; RESULT RETURNS IN AC0. FPP REGS OTHER THAN AC0 UNDISTURBED. ; ALL CPU REGS REMAIN UNCHANGED ; FLTIBM:: .WORD ^M MOVL @4(AP),R0 ;GET IBM F.P. NUMBER BEQL EXIT ;IF EXACT 0, ALREADY OK SO DO NOTHING EXTZV #24.,#7,R0,R1 ;EXTRACT IBM EXPONENT BEQL EXIT ;-0 ALSO CAUSES EXIT SUBL2 #64.,R1 ;MAKE IT BINARY EXTZV #0,#24.,R0,R2 ;GET IBM MANTISSA ASHL #2,R1,R1 ;MAKE DEC EXPONENT ADDL2 #128.,R1 ;IN EXCESS 200 NOTATION MOVL #5.,R3 ;SET U A COUNTER AS A GUARD 1$: BITL #^X800000,R2 ;SEE IF H.O. BIT OF MANTISSA NOW IS SET BNEQ 2$ ;WHEN SET ALL IS WELL ASHL #1,R2,R2 ;ELSE SHIFT IT UP A PLACE DECL R1 ;AND COUNT DOWN EXPONENT 1 BRB 1$ ;THEN GO BACK AND LOOK FOR BIT AGAIN DECL R3 BNEQ 1$ ;GO BACK FOR 4 OR 5 BITS TILL WE FIND NORM. 2$: ;NOW WE HAVE THE MANTISSA AND EXPONENT OK INSV R1,#23.,#8.,R0 ;FILL IN DEC EXPONENT INSV R2,#0,#23.,R0 ;AND MANTISSA (THROWS OUT HIDDEN BIT) ;NOW ALL SET UP EXIT: ROTL #16.,R0,R0 ;SWAP WORDS FOR STD FMT RET ;BACK TO USER .END