/*

	ddump.c  3/15/89

	property of S.I.R.

	cl ddump.c

*/
#include <math.h>
#include <stdio.h>

#define PAUSE printf("HIT ANY KEY TO CONTINUE\n");getch()

union intflo
{
	long lnum;
	float fnum;
};
union intdou
{
	unsigned char unum[8];
	double dnum;
};

unsigned char buffer[265];
FILE *fp;
int Ascii=0;
unsigned char ASCII[256]=
{
	0x00,0x01,0x02,0x03,
	0x00,0x09,0x00,0x7f,
	0x00,0x00,0x00,0x0b,
	0x0c,0x0d,0x0e,0x0f,
	0x10,0x11,0x12,0x00,
	0x00,0x13,0x08,0x00,
	0x18,0x19,0x00,0x00,
	0x1c,0x1d,0x1e,0x1f,
	0x00,0x00,0x1c,0x00,
	0x00,0x0a,0x17,0x1b,
	0x00,0x00,0x00,0x00,
	0x00,0x05,0x06,0x07,
	0x00,0x00,0x16,0x00,
	0x00,0x1e,0x00,0x04,
	0x00,0x00,0x00,0x00,
	0x14,0x15,0x00,0x1a,
	0x20,0x00,0x00,0x00,
	0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x2e,
	0x3c,0x28,0x2b,0x5e,
	0x26,0x00,0x00,0x00,
	0x00,0x00,0x00,0x00,
	0x00,0x00,0x21,0x24,
	0x2a,0x29,0x3b,0x5e,
	0x2d,0x2f,0x00,0x00,
	0x00,0x00,0x00,0x00,
	0x00,0x00,0x7c,0x2c,
	0x25,0x5f,0x3e,0x3f,
	0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x00,
	0x00,0x60,0x3a,0x23,
	0x40,0x27,0x3d,0x22,
	0x00,0x61,0x62,0x63,
	0x64,0x65,0x66,0x67,
	0x68,0x69,0x00,0x00,
	0x00,0x00,0x00,0x00,
	0x00,0x6a,0x6b,0x6c,
	0x6d,0x6e,0x6f,0x70,
	0x71,0x72,0x00,0x00,
	0x00,0x00,0x00,0x00,
	0x00,0x7e,0x73,0x74,
	0x75,0x76,0x77,0x78,
	0x79,0x7a,0x00,0x00,
	0x00,0x5b,0x00,0x00,
	0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x00,
	0x00,0x5d,0x00,0x00,
	0x7b,0x41,0x42,0x43,
	0x44,0x45,0x46,0x47,
	0x48,0x49,0x00,0x00,
	0x00,0x00,0x00,0x00,
	0x7d,0x4a,0x4b,0x4c,
	0x4d,0x4e,0x4f,0x50,
	0x51,0x52,0x00,0x00,
	0x00,0x00,0x00,0x00,
	0x5c,0x00,0x53,0x54,
	0x55,0x56,0x57,0x58,
	0x59,0x5a,0x00,0x00,
	0x00,0x00,0x00,0x00,
	0x30,0x31,0x32,0x33,
	0x34,0x35,0x36,0x37,
	0x38,0x39,0x00,0x00,
	0x00,0x00,0x00,0x00
};

void check_float();
void check_long();
void check_int();
int skip_to();

main(int argc,char *argv[])
{
	int i,j,k;
	int numread;
	char filename[40],ans;
	unsigned char val;

	if(argc>1)
	{
		fp=fopen(argv[1],"rb");
	}
	if(!fp)
	{
		do
		{
			printf("Give file to dump.\n");
			scanf("%s",filename);
			fp=fopen(filename,"rb");
			if(!fp)
				printf("Could not open %s\n\n",filename);
		}while(!fp);
	}
	k=0;
	do
	{
		for(i=0;i<256;i++)
			buffer[i]=0;
		numread=fread((char *)buffer,sizeof(char),256,fp);
		for(i=0;i<16;i++)
		{
			printf("%4x -- ",i*16+256*k);
			for(j=0;j<16;j++)
			{
				printf("%2x ",buffer[i*16+j]);
				if((j+1)%4==0)printf(" ");
			}
			printf("|");
			for(j=0;j<16;j++)
			{
				val=buffer[i*16+j];
				if(Ascii==1)
					val=ASCII[val];
				if(val>31&&val<128)
					printf("%c",val);
				else
					printf(".");
			}
			printf("|\n");
		}
		do
		{
			printf("n=next  f=float l=long i=int s=skip  x=exit program\n");
			printf("F=float (mf)  k=float (DEC) L=Long (mf) E=EBCDIC\n");
			printf("I=Integer(mf) P=float(Prime) d = double\n");
			ans=getch();
			if(ans=='E')
			{
				if(Ascii==1)
					Ascii=0;
				else
					Ascii=1;
			}
			if(ans=='f')
				check_float(k,1);
			if(ans=='d')
				check_float(k,8);
			if(ans=='F')
				check_float(k,2);
			if(ans=='k')
				check_float(k,3);
			if(ans=='P')
				check_float(k,4);
			if(ans=='l')
				check_long(k);
			if(ans=='L')
				check_long_mf(k);
			if(ans=='i')
				check_int(k);
			if(ans=='I')
				check_int_mf(k);
			if(ans=='s')
			{
				k=skip_to(k);
				ans='n';
			}
			k+=1;
		}while(ans!='n'&&ans!='x');
	}while(ans!='x'&&numread>0);

}


/********************************************************************
**
**
**
********************************************************************* */

int skip_to(num)

int num;

{
	long offset;

	printf("Give number of 256 byte block to skip to ( 0 is beginning).\n");
	scanf("%ld",&offset);
	offset*=256;
	fseek(fp,offset,SEEK_SET);
	offset/=256;
	num=offset;
	return(num);
}




/***********************************************************************
**
**		iop == 1 direct float printf
**		iop == 2 main frame float
**
***********************************************************************/

void check_float(num,iop)

int num,iop;

{
	int i,j,k;
	union intflo val;
	union intdou dvl;
	float fval;
	char cval;
	double dval,pval,base=16.0;
	int val1,val2,val3,val4;
	double frac,sign,power;

	if(iop==1)
	{
		for(i=0;i<63;i++)
		{
			printf("%2x -- ",num*256+i*4);
			for(j=0;j<4;j++)
			{
				val.lnum=buffer[i*4+j+3];
				val.lnum*=256;
				val.lnum+=buffer[i*4+j+2];
				val.lnum*=256;
				val.lnum+=buffer[i*4+j+1];
				val.lnum*=256;
				val.lnum+=buffer[i*4+j+0];
				if(fieeetomsbin(&val.fnum,&fval)==0)
				{
					fval=val.fnum;
					if(fval>-10000000.0&&fval<100000000.0)
						printf("%17.8f",val.fnum);
					else
						printf("%17.8e",val.fnum);
				}
				else
				{
						printf(" -------.--------");
				}
			}
			printf("\n");
			if((i+1)%16==0)
			{
				PAUSE;
			}
		}
	}
	else if(iop==4)
	{
		for(i=0;i<63;i++)
		{
			printf("%2x -- ",num*256+i*4);
			for(j=0;j<4;j++)
			{
				val.lnum=buffer[i*4+j+0];
				val.lnum*=256;
				val.lnum+=buffer[i*4+j+1];
				val.lnum*=256;
				val.lnum+=buffer[i*4+j+2];
				val.lnum*=256;
				val.lnum+=buffer[i*4+j+3];
				if(fieeetomsbin(&val.fnum,&fval)==0)
				{
					fval=val.fnum;
					if(fval>-10000000.0&&fval<100000000.0)
						printf("%17.8f",val.fnum);
					else
						printf("%17.8e",val.fnum);
				}
				else
				{
						printf(" -------.--------");
				}
			}
			printf("\n");
			if((i+1)%16==0)
			{
				PAUSE;
			}
		}
	}
	else if(iop==2)
	{
		for(i=0;i<63;i++)
		{
			printf("%2x -- ",num*256+i*4);
			for(j=0;j<4;j++)
			{
				val1=buffer[i*4+j+0];
				val2=buffer[i*4+j+1];
				val3=buffer[i*4+j+2];
				val4=buffer[i*4+j+3];

				sign=1.0;
				if((val1&128)==128)
					sign=-1.0;
				power=val1&127;
				power-=64.0;

				frac=val4;
				frac/=256;
				frac+=val3;
				frac/=256;
				frac+=val2;
				frac/=256;
				if(power<32.0&&power>-32.0)
				{
					fval=pow(base,power)*frac*sign;
					if(fval>-10000000.0&&fval<100000000.0)
						printf("%17.8f",fval);
					else
						printf("%17.8e",fval);
				}
				else
					printf(" *******.********");
			}
			printf("\n");
			if((i+1)%16==0)
			{
				PAUSE;
			}
		}
	}
	else if(iop==3)
	{
		for(i=0;i<63;i++)
		{
			printf("%2x -- ",num*256+i*4);
			for(j=0;j<4;j++)
			{
				val.lnum=buffer[i*4+j+3];
				val.lnum*=256;
				val.lnum+=buffer[i*4+j+2];
				val.lnum*=256;
				val.lnum+=buffer[i*4+j+1];
				val.lnum*=256;
				val.lnum+=buffer[i*4+j+0];
				dec2nec(&val.lnum,1);
				if(fieeetomsbin(&val.fnum,&fval)==0)
				{
					fval=val.fnum;
					if(fval>-10000000.0&&fval<100000000.0)
						printf("%17.8f",val.fnum);
					else
						printf("%17.8e",val.fnum);
				}
				else
				{
						printf(" -------.--------");
				}
			}
			printf("\n");
			if((i+1)%16==0)
			{
				PAUSE;
			}
		}
	}
	else if(iop==8)
	{
		for(i=0;i<64-2;i++)
		{
			printf("%2x -- ",num*256+i*4);
			for(j=0;j<4;j++)
			{
				for(k=0;k<8;k++)
					dvl.unum[k]=buffer[i*4+j+k];
				if(dieeetomsbin(&dvl.dnum,&dval)==0)
				{
					fval=val.fnum;
					if(fval>-10000000.0&&fval<100000000.0)
						printf("%17.8lf",dvl.dnum);
					else
						printf("%17.8le",dvl.dnum);
				}
				else
				{
						printf(" -------.--------");
				}
			}
			printf("\n");
			if((i+1)%16==0)
			{
				PAUSE;
			}
		}
	}
}
/**************************************************************************
**
**
**
************************************************************************* */

int dec2nec(a,n)

long *a;
int n;

{
	long *w2;
	short i,j,z[2],y;

	w2=(long *)z;
	for(i=0;i<n;i++)
	{
		*w2=a[i];
		if((z[0]==0x8000)&&(z[1]==0x0000))
		{
			z[0]=0x0000;
			z[1]=0x7f80;
			a[i]=*w2;
		}
		if((z[0]==0x0000)&&(z[1]==0x0000))
		{
			z[0]=0x0000;
			z[1]=0x0000;
			a[i]=*w2;
		}
		else	/* good number */
		{
			y=z[0]-256;
			z[0]=z[1];
			z[1]=y;
			a[i]=*w2;
		}
	}
}






/***********************************************************************
**
**
**
***********************************************************************/

void check_long(num)

int num;

{
	int i,j,k;
	long val;
	for(i=0;i<63;i++)
	{
		printf("%2x -- ",num*256+i*4);
		for(j=0;j<4;j++)
		{
			val=buffer[i*4+j+3];
			val*=256;
			val+=buffer[i*4+j+2];
			val*=256;
			val+=buffer[i*4+j+1];
			val*=256;
			val+=buffer[i*4+j+0];
			if(val<1000000000000.0||val>-1000000000000.0)
				printf("%17ld",val);
			else
				printf(" ----------------");
		}
		printf("\n");
		if((i+1)%16==0)
		{
			PAUSE;
		}
	}
}

/***********************************************************************
**
**
**
***********************************************************************/

int check_long_mf(num)

int num;

{
	int i,j,k;
	long val;
	for(i=0;i<63;i++)
	{
		printf("%2x -- ",num*256+i*4);
		for(j=0;j<4;j++)
		{
			val=buffer[i*4+j+0];
			val*=256;
			val+=buffer[i*4+j+1];
			val*=256;
			val+=buffer[i*4+j+2];
			val*=256;
			val+=buffer[i*4+j+3];
			if(val<1000000000000.0||val>-1000000000000.0)
				printf("%17ld",val);
			else
				printf(" ----------------");
		}
		printf("\n");
		if((i+1)%16==0)
		{
			PAUSE;
		}
	}
}

/***********************************************************************
**
**
**
***********************************************************************/

void check_int(num)

int num;

{
	int i,j,k;
	long val;
	for(i=0;i<31;i++)
	{
		printf("%2x -- ",num*256+i*8);
		for(j=0;j<8;j++)
		{
			val=buffer[i*8+j+1];
			val*=256;
			val+=buffer[i*8+j+0];
			printf("%8d",val);
		}
		printf("\n");
		if((i+1)%16==0)
		{
			PAUSE;
		}
	}
}

/***********************************************************************
**
**
**
***********************************************************************/

int check_int_mf(num)

int num;

{
	int i,j,k;
	long val;
	for(i=0;i<31;i++)
	{
		printf("%2x -- ",num*256+i*8);
		for(j=0;j<8;j++)
		{
			val=buffer[i*8+j+0];
			val*=256;
			val+=buffer[i*8+j+1];
			printf("%8d",val);
		}
		printf("\n");
		if((i+1)%16==0)
		{
			PAUSE;
		}
	}
}

                                                                                  