#include "ehead.h"
void emovi(), emovo(), ecleaz(), eshdn8(), emdnorm();
void todec();
void dectoe( d, e )
unsigned short *d;
unsigned short *e;
{
unsigned short y[NI];
register unsigned short r, *p;
ecleaz(y);
p = y;
r = *d;
if( *d & (unsigned int )0x8000 )
*p = 0xffff;
++p;
r &= 0x7fff;
if( r == 0 )
goto done;
r >>= 7;
r += EXONE - 0201;
*p++ = r;
r = *d++;
r &= 0177;
r |= 0200;
*p++ = r;
*p++ = *d++;
*p++ = *d++;
*p = *d;
eshdn8(y);
done:
emovo( y, e );
}
#if 0
static unsigned short decbit[NI] = {0,0,0,0,0,0,0200,0};
void etodec( x, d )
unsigned short *x, *d;
{
unsigned short xi[NI];
register unsigned short r;
int i, j;
emovi( x, xi );
*d = 0;
if( xi[0] != 0 )
*d = 0100000;
r = xi[E];
if( r < (EXONE - 128) )
goto zout;
i = xi[M+4];
if( (i & 0200) != 0 )
{
if( (i & 0377) == 0200 )
{
if( (i & 0400) != 0 )
{
for( j=M+5; j<NI; j++ )
{
if( xi[j] != 0 )
goto yesrnd;
}
}
goto nornd;
}
yesrnd:
eaddm( decbit, xi );
r -= enormlz(xi);
}
nornd:
r -= EXONE;
r += 0201;
if( r < 0 )
{
zout:
*d++ = 0;
*d++ = 0;
*d++ = 0;
*d++ = 0;
return;
}
if( r >= 0377 )
{
*d++ = 077777;
*d++ = -1;
*d++ = -1;
*d++ = -1;
return;
}
r &= 0377;
r <<= 7;
eshup8( xi );
xi[M] &= 0177;
r |= xi[M];
*d++ |= r;
*d++ = xi[M+1];
*d++ = xi[M+2];
*d++ = xi[M+3];
}
#else
extern int rndprc;
void etodec( x, d )
unsigned short *x, *d;
{
unsigned short xi[NI];
long exp;
int rndsav;
emovi( x, xi );
exp = (long )xi[E] - (EXONE - 0201);
rndsav = rndprc;
rndprc = 56;
emdnorm( xi, 0, 0, exp, 64 );
rndprc = rndsav;
todec( xi, d );
}
void todec( x, y )
unsigned short *x, *y;
{
unsigned short i;
unsigned short *p;
p = x;
*y = 0;
if( *p++ )
*y = 0100000;
i = *p++;
if( i == 0 )
{
*y++ = 0;
*y++ = 0;
*y++ = 0;
*y++ = 0;
return;
}
if( i > 0377 )
{
*y++ |= 077777;
*y++ = 0xffff;
*y++ = 0xffff;
*y++ = 0xffff;
return;
}
i &= 0377;
i <<= 7;
eshup8( x );
x[M] &= 0177;
i |= x[M];
*y++ |= i;
*y++ = x[M+1];
*y++ = x[M+2];
*y++ = x[M+3];
}
#endif