cvtvax.h
来自「Machine Vision (美)Wesley E.Snyder著 光盘中的」· C头文件 代码 · 共 385 行 · 第 1/2 页
H
385 行
} \
if (*vax0 == 0x00008000 ) *vax0 = 0; /* neg ZERO? */ \
vax0++; \
}; \
}
#endif
#define CVTVAX_REAL( ibyte, obyte, nbyte ) \
{ memcpy (obyte,ibyte,nbyte); }
#define CVTBYT_REAL( ibyte, obyte, nbyte ) \
{ memcpy (obyte,ibyte,nbyte); }
/*
D O U B L E FORMAT CONVERSION
===============================
IEEE Double format, normalized, "hidden" highest order mantissa bit,
exponent biassed +1023:
-------------------------- -------------------------
|S| expo | mantissa | | mantissa |
-------------------------- -------------------------
31 30 20 19 0 31 0
(1) (11) (20) (32)
DEC VAX Double format, normalized, "hidden" highest order mantissa bit,
exponent biased +129 (128+1 for a hidden bit)
-------------------------- -------------------------
| mantissa |S|expo|manti| | low-mant | high-mant |
-------------------------- -------------------------
31 16 14 7 6 0 31 16 15 0
(16) 1 (8) (7) (16) (16)
In both direcions we do not worry about alignment since macine data
alignment is user's problem, and ext. data is byte accessed.
Note, we equate char and long pointers here (may not be portable).
*/
#ifdef M2E
/*
DOUBLE VAX to 68020 IEEE conversion
New IEEE double is built in temporrary longwords eee0, eee1.
Exponent changed to a new base (-129+1023) (no overflow danger)
Mantissa shifted piece by piece, last 3 VAX bits ignored
Output in 68020 byte order
*/
#define CVTEEE_DBLE( ibyte, obyte, nbyte ) \
{ char *last = ibyte + nbyte; \
while ( ibyte < last ) \
{ long *vax0 = (long*) ibyte; /* input double */ \
long *vax1 = (long*)(ibyte+4); \
long eee0,eee1; /* work buffer */ \
char *ppp0 = (char*) &eee0; /* and pointers */ \
char *ppp1 = (char*) &eee1; \
eee0 = (*vax0<<16)&0x80000000; /* init to sign */ \
eee0 |=((*vax0<<13)&0x0FF00000)+(894<<20); /*e-129+1023*/ \
eee0 |= (*vax0<<13)&0x000FE000; /* 7b at 00->13*/ \
eee0 |= (*vax0>>19)&0x00001FFF; /* 13b at 19->00*/ \
eee1 = (*vax0<<13)&0xE0000000; /* 3b at 16->29*/ \
eee1 |= (*vax1<<13)&0x1FFFE000; /* 16b at 00->13*/ \
eee1 |= (*vax1>>19)&0x00001FFF; /* 13b at 19->00*/ \
*obyte++ = ppp0[3]; *obyte++ = ppp0[2]; \
*obyte++ = ppp0[1]; *obyte++ = ppp0[0]; \
*obyte++ = ppp1[3]; *obyte++ = ppp1[2]; \
*obyte++ = ppp1[1]; *obyte++ = ppp1[0]; ibyte +=8; \
}; \
}
#else /*E2M*/
/*
DOUBLE 68020 IEEE to VAX conversion
68020 byte order swapped to build IEEE format in longs eee0,eee1.
Exponent changed to a new base (-1023+129); uderflow = zero,
overflow = max VAX double maintaining sign.
Mantissa shifted piece by piece, lowest 3 bits set to 011 for VAX.
*/
#define CVTEEE_DBLE( ibyte, obyte, nbyte ) \
{ char *last = ibyte + nbyte; \
while ( ibyte < last ) \
{ long *vax0 = (long*) obyte; /* output double*/ \
long *vax1 = (long*)(obyte+4); /* pointers*/ \
long eee0,eee1,exp; /* work buffers */ \
char *ppp0 = (char*) &eee0; /* and pointers */ \
char *ppp1 = (char*) &eee1; \
ppp0[3] = *ibyte++; ppp0[2] = *ibyte++; /* build IEEE */ \
ppp0[1] = *ibyte++; ppp0[0] = *ibyte++; /* as pictured */ \
ppp1[3] = *ibyte++; ppp1[2] = *ibyte++; \
ppp1[1] = *ibyte++; ppp1[0] = *ibyte++; obyte +=8; \
if (eee1 == 0 && (eee0 == 0 && eee0 == 0x80000000) ) \
{ *vax0 = 0; *vax1 = 0; } /* VAX zero */ \
else \
{ *vax0 = (eee0>>16)&0x00008000; /* init to sign */ \
exp =((eee0>>20)&0x000007FF)-894;/* exp-1023+129 */ \
if (exp < 0x00000000 ) /* underflow ? */ \
*vax0 = 0x00000000; /* = force zero */ \
else if (exp > 0xFF ) /* overflow ? */ \
{ *vax0 |= 0xFFFF7FFF; *vax1 = 0xFFFFFFFF; } \
else \
{ *vax0 |= (exp << 7); /* load exp */ \
*vax0 |= (eee0>>13)&0x0000007F; /* 7b at 13->00*/ \
*vax0 |= (eee0<<19)&0xFFF80000; /* 13b at 00->19*/ \
*vax0 |= (eee1>>13)&0x00070000; /* 3b at 29->16*/ \
*vax1 = (eee1>>13)&0x0000FFFF; /* 16b at 13->00*/ \
*vax1 |= (eee1<<19)&0xFFF80000; /* 13b at 00->19*/ \
*vax1 |= 0x00030000; /* load mid.val.*/ \
} \
} \
}; \
}
#endif
#ifdef M2E
/*
DOUBLE VAX to I-80386 IEEE conversion
New IEEE double is built in temporrary longs eee0, eee1.
Exponent changed to a new base (-129+1023) (no overflow danger)
Mantissa shifted piece by piece, last 3 VAX bits ignored
Output in 386 byte order (same as VAX).
*/
#define CVT386_DBLE( ibyte, obyte, nbyte ) \
{ char *last = ibyte + nbyte; \
while ( ibyte < last ) \
{ long *vax0 = (long*) ibyte; /* input double */ \
long *vax1 = (long*)(ibyte+4); \
long eee0,eee1; /* work buffer */ \
char *ppp0 = (char*) &eee0; /* and pointers */ \
char *ppp1 = (char*) &eee1; \
eee0 = (*vax0<<16)&0x80000000; /* init to sign */ \
eee0 |=((*vax0<<13)&0x0FF00000)+(894<<20); /*e-129+1023*/ \
eee0 |= (*vax0<<13)&0x000FE000; /* 7b at 00->13*/ \
eee0 |= (*vax0>>19)&0x00001FFF; /* 13b at 19->00*/ \
eee1 = (*vax0<<13)&0xE0000000; /* 3b at 16->29*/ \
eee1 |= (*vax1<<13)&0x1FFFE000; /* 16b at 00->13*/ \
eee1 |= (*vax1>>19)&0x00001FFF; /* 13b at 19->00*/ \
*obyte++ = *ppp0++; *obyte++ = *ppp0++; \
*obyte++ = *ppp0++; *obyte++ = *ppp0++; \
*obyte++ = *ppp1++; *obyte++ = *ppp1++; \
*obyte++ = *ppp1++; *obyte++ = *ppp1++; ibyte +=8; \
}; \
}
#else /*E2M*/
/*
DOUBLE 68020 IEEE to VAX conversion
I-80386 byte ordered IEEE format moved into longs eee0, eee1.
Exponent changed to a new base (-1023+129); uderflow = zero,
overflow = max VAX double maintaining sign.
Mantissa shifted piece by piece, lowest 3 bits set to 011 for VAX.
*/
#define CVT386_DBLE( ibyte, obyte, nbyte ) \
{ char *last = ibyte + nbyte; \
while ( ibyte < last ) \
{ long *vax0 = (long*) obyte; /* output double*/ \
long *vax1 = (long*)(obyte+4); /* pointers*/ \
long eee0,eee1,exp; /* work buffers */ \
char *ppp0 = (char*) &eee0; /* and pointers */ \
char *ppp1 = (char*) &eee1; \
*ppp0++ = *ibyte++; *ppp0++ = *ibyte++; /* build IEEE */ \
*ppp0++ = *ibyte++; *ppp0++ = *ibyte++; /* as pictured */ \
*ppp1++ = *ibyte++; *ppp1++ = *ibyte++; \
*ppp1++ = *ibyte++; *ppp1++ = *ibyte++; obyte +=8; \
if (eee1 == 0 && (eee0 == 0 && eee0 == 0x80000000) ) \
{ *vax0 = 0; *vax1 = 0; } /* VAX zero */ \
else \
{ *vax0 = (eee0>>16)&0x00008000; /* init to sign */ \
exp =((eee0>>20)&0x000007FF)-894;/* exp-1023+129 */ \
if (exp < 0x00000000 ) /* underflow ? */ \
*vax0 = 0x00000000; /* = force zero */ \
else if (exp > 0xFF ) /* overflow ? */ \
{ *vax0 |= 0xFFFF7FFF; *vax1 = 0xFFFFFFFF; } \
else \
{ *vax0 |= (exp << 7); /* load exp */ \
*vax0 |= (eee0>>13)&0x0000007F; /* 7b at 13->00*/ \
*vax0 |= (eee0<<19)&0xFFF80000; /* 13b at 00->19*/ \
*vax0 |= (eee1>>13)&0x00070000; /* 3b at 29->16*/ \
*vax1 = (eee1>>13)&0x0000FFFF; /* 16b at 13->00*/ \
*vax1 |= (eee1<<19)&0xFFF80000; /* 13b at 00->19*/ \
*vax1 |= 0x00030000; /* load mid.val.*/ \
} \
} \
}; \
}
#endif
#define CVTVAX_DBLE( ibyte, obyte, nbyte ) \
{ memcpy (obyte,ibyte,nbyte); }
#define CVTBYT_DBLE( ibyte, obyte, nbyte ) \
{ memcpy (obyte,ibyte,nbyte); }
/*#############################################################################
Martin Brunecky, Auto-trol Technology Corporation,
12500 North Washington Street, Denver, CO-80241-2404
(303) 252-2499 ncar!ico!auto-trol!marbru
#############################################################################*/
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?