//-----------------------------------------------------------------------------
// UU comp., bit parity, Dec/Hex ..
// Dvorka
// 1996
//-----------------------------------------------------------------------------
#include "bit.h"
typedef unsigned char byte;
typedef unsigned int word;
typedef unsigned long dword;
static union { word w; struct x { byte lo:8; byte hi:8; }b;} Wrd;
static byte *tab,
invtab[256], // initialized by InitTab();
hex[]={'0','1','2','3','4','5','6','7',
'8','9','A','B','C','D','E','F'};
word ByteToHex( byte in )
{ Wrd.b.lo=hex[in>>4];Wrd.b.hi=hex[in&0xF];return (Wrd.w); }
byte HexToByte( word in )
{
return (((in&0x00FF)>'9'? ((in&0x00FF)-'A'+10)<<4: ((in&0x00FF)-'0')<<4)|
((in&0xFF00)>'9'<<8? (in>>8)-'A'+10 :(in>>8)-'0'));
}
dword dw3Todw4( dword in )
{
return ( (in&0x700ul)>>4|(in&0x3F800ul)>>3|
(in&0x1FC0000ul)>>2|(in&0xFE000000ul)>>1 );
}
dword dw4Todw3( dword in )
{
return ((in&0x7F000000ul)<<1|(in&0x7F0000ul)<<2|(in&0x7F00)<<3|(in&0x70)<<4);
}
void InitTab( byte *ntab )
{
byte i; tab=ntab; for( i=0; i<=63; i++ ) invtab[tab[i]]=i; // create inv. tab
}
dword dw3Tabdw4( dword in )
{
dword i=(in&0xFC000000ul)>>2|(in&0x03F00000ul)>>4|
(in&0x000FC000ul)>>6|(in&0x00003F00ul)>>8;
in=tab[*(((char*)&i)+3)]<<8 | tab[*(((char*)&i)+2)];
in<<=16;
return ( in | tab[*(((char*)&i)+1)]<<8 | tab[*((char*)&i)] );
}
dword dw4Tabdw3( dword in )
{
dword i=invtab[(in&0xFF000000ul)>>24]<<8 | invtab[(in&0xFF0000ul)>>16] ;
i<<=16;
i|=invtab[(in&0xFF00)>>8]<<8 | invtab[in&0xFF];
return ( (i&0x3F000000ul)<<2 | (i&0x003F0000ul)<<4 |
(i&0x00003F00ul)<<6 | (i&0x0000003Ful)<<8 );
}