jeffh@weycord.WEYCO.COM (01/09/88)
A while back someone asked for a dec to hp real number conversion routine. The following code was written for a s200 running the pascal workstation. It's in 68000 assembly but the general concept should be easily understood. Here goes: * 14 JAN 85 JWH * REAL_CNV.TEXT * *DEC TO HP REAL CONVERSI0N ROUTINE * * DEC REAL FORMAT: * * ....SIGN BIT * . .....eight EXPONENT BITS * . . .....TWELVE MANTISSA BITS * . . . ... ALWAYS ZERO * v v v v * X/MMMMMMM|S/XXXXXXX|00000000|MMMMM000 <- - - - - 32 BITS TOTAL * * NOTE: 1) NEGATIVE NUMBERS ARE 2's COMPLEMENTED * 2) .5<= MANTISSA <1.0 * 3) EXPONENT IS BIASED BY 128 * *********************************************************************** *********** ^^ DEC HEWLETT-PACKARD vv *********** *********************************************************************** * * HEWLETT-PACKARD REAL FORMAT: * * ..SIGN BIT * . .....ELEVEN EXPONENT BITS * . . .....FIFTY-TWO MANTISSA BITS * . . . * v v v * S/XXXXXXXXXXX/MMMMMMMMMMMMMMMMMMMM/MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM * * NOTE: . * 1) NEGATIVES ARE NOT 2's COMPLEMENTED . * 2) 0<=MANTISSA<1.0 .. 64-BITS TOTAL * 3) EXPONENT IS BIASED BY 1023 * 4) MC->HP REAL=(MANTISSA-.5)*2 & BIASED EXPONENT-1 PAGE * * * CALLING SEQUENCE FROM PASCAL: * * R_CNVRT(COUNT,RAW[1],RESULT[1]); * ^ ^ ^ * . . . * . . . * . . ..........ARRAY REAL CONVERTED NUMBERS * . ...........DATA IN (ARRAY OF INTEGER) * ..........SHORTINT ( NUMBER OF REALS TO CONVERT ) * *------------------------------------------------ MNAME MREALCNVRT SRC MODULE Mrealcnvrt; SRC EXPORT src PROCEDURE R_cnvrt(ANYVAR cnt,raw,result : INTEGER); SRC END; DEF Mrealcnvrt_R_cnvrt DEF Mrealcnvrt_Mrealcnvrt RORG 0 ************************************************************************ * REGISTER ASSIGNMENT: * * D0=dec REAL * * D1=COPY OF dec REAL * * D2,D3=HP REAL * ************************************************************************ MREALCNVRT_R_CNVRT NOP MOVEA.L 4(SP),A0 ^result array MOVEA.L 12(SP),A1 ^loop count MOVE.W (A1),D4 Fetch loop counter SUB.W #1,D4 DBRA counts to -1 MOVEA.L 8(SP),A1 ^raw array CLR.L D3 CLEAR RESULT REGISTER 2 loop MOVE.L (A1)+,D0 fetch one DEC real CLR.L D2 CLEAR RESULT REGISTER 2 MOVE.L D0,D1 COPY DEC REAL BTST #23,D0 X/MMMMMMM|S/XXXXXXX|00000000|MMMMM000 BEQ PLUS WAS SIGN BIT PLUS OR MINUS MINUS BSET #31,D2 SET RESULT SIGN BIT TO MINUS * v CLEAR EXP PLUS AND.L #$7F000000,D0 0/MMMMMMM0000/00000000000000000000 LSR.L #8,D0 0/00000000000/MMMMMMM0000000000000 LSR.L #3,D0 0/00000000000/MMMMMMM0000000000000 OR.L D0,D2 SET 7 BITS OF MANTISSA IN RESULT MOVE.L D1,D0 X/MMMMMMMSXXX/XXXX00000000MMMMM000 AND.L #$000000F8,D0 0/00000000000/000000000000MMMMM000 LSL.L #5,D0 0/00000000000/0000000MMMMM00000000 OR.L D0,D2 SET 5 BITS OF MANTISSA IN RESULT MOVE.L D1,D0 X/MMMMMMMSXXX/XXXX00000000MMMMM000 AND.L #$007F0000,D0 0/00000000XXX/XXXX0000000000000000 LSL.L #5,D0 0/000XXXXXXX0/00000000000000000000 BTST #31,D1 X/MMMMMMM|S/XXXXXXX|00000000|MMMMM000 BEQ NOT_SET WAS LSB OF EXP SET BSET #20,D0 NOT_SET ADD.L #$37E00000,D0 ADD HP BIAS-(MC BIAS) OR.L D0,D2 SET EXPONENT IN RESULT nxt_one MOVE.L D2,(A0)+ push ms words in result MOVE.L D3,(A0)+ push ls words in result DBRA D4,LOOP MOVEA.L (SP)+,A0 pop return addr ADDA.L #12,SP pop call stack JMP (A0) RETURN *------------------------------------------------ MREALCNVRT_MREALCNVRT RTS INITIALIZATION BODY END
dsmith@hplabsb.UUCP (David Smith) (01/12/88)
In article <400008@weycord.WEYCO.COM>, jeffh@weycord.WEYCO.COM writes: > * DEC REAL FORMAT: > * > * ....SIGN BIT > * . .....eight EXPONENT BITS > * . . .....TWELVE MANTISSA BITS > * . . . ... ALWAYS ZERO > * v v v v > * X/MMMMMMM|S/XXXXXXX|00000000|MMMMM000 <- - - - - 32 BITS TOTAL > * > * NOTE: 1) NEGATIVE NUMBERS ARE 2's COMPLEMENTED > * 2) .5<= MANTISSA <1.0 > * 3) EXPONENT IS BIASED BY 128 Dec Vax/Pdp-11 32 bit float format is like HP's (IEEE's), exept for byte ordering. There are no "always zero" bits. Negative numbers are not 2's complemented, but have their sign bits set. The high-order (2^-1) mantissa bit is not stored. David Smith
jeffh@hpubvwa.HP.COM (Jeff Harrell) (01/14/88)
Yes, you are correct. The low order bits are NOT clear! The code I provided was based on an instrument that did not use the low bits! However, the the rest is CORRECT we've used it for several data transfers and it works! Maybe we are talking about more than the byte order... Give me a call if you have any questions. Jeff ( the guy that wants DIL ) Harrell (206) 924-6142
jeffh@hpubvwa.HP.COM (Jeff Harrell) (01/14/88)
Yes, you are correct. The low order bits are NOT clear! The code I provided was based on an instrument that did not use the low bits! The complement comment was a leftover from ModComp conversion code. Again, the routine was written for the Pascal workstation which does not support 32 bit floats. Jeff ( the guy that wants DIL ) Harrell (206) 924-6142