.TITLE FLTIBM ;MAKE DEC FLOATING POINT FROM IBM ;FLOATING POINT (SINGLE PRECISION) ;NUMBERS. .IDENT /GCE001/ ;G.C. EVERHART .ENABLE DEBUG .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 ; *** SPECIAL VERSION *** ; *** PERFORMS BYTE REVERSALS TOO *** ; FLTIBM:: .WORD ^M MOVL @4(AP),R0 ;GET IBM F.P. NUMBER EXTZV #7,#1,R0,R4 ;GET SIGN BIT FROM R0 TO R4 BICL2 #128,R0 ;REMOVE SIGN BIT FOR CASE OF -0 BEQL EXIT ;IF EXACT 0, ALREADY OK SO DO NOTHING EXTZV #24,#8,R0,R2 ;GET LSB OF MANTISSA FROM R0 TO R2 EXTZV #16,#8,R0,R1 ;GET NEXT BYTE OF MANTISSA EXTZV #8,#8,R0,R3 ;GET MSB OF MANTISSA INSV R1,#8,#8,R2 ;PUT NEXT BYTE OF MANTISSA IN R2 INSV R3,#16,#8,R2 ;PUT MSB OF MANTISSA IN R2 EXTZV #0.,#7,R0,R1 ;EXTRACT IBM EXPONENT SUBL2 #64.,R1 ;MAKE IT BINARY 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 R4,#31,#1,R0 ;FILL IN SIGN INSV R1,#23.,#8.,R0 ;FILL IN DEC EXPONENT INSV R2,#0,#23.,R0 ;AND MANTISSA (THROWS OUT HIDDEN BIT) ROTL #16.,R0,R0 ;ROTATE R0 16 BITS ;NOW ALL SET UP EXIT: RET ;BACK TO USER .END