/*--------------------------------------------------------------------*/
/* XEX analyzer - GienekP                                             */
/*--------------------------------------------------------------------*/
#include <stdio.h>
/*--------------------------------------------------------------------*/
unsigned char getB(FILE *file, unsigned int *i)
{
	unsigned int j;
	unsigned char ret[1];
	fread(ret,1,1,file);
	j=*i;
	j++;
	*i=j;
	return ret[0];
}
/*--------------------------------------------------------------------*/
unsigned int getW(FILE *file, unsigned int *i)
{
	unsigned char a,b;
	unsigned int ret;
	a=getB(file,i);
	b=getB(file,i);
	ret=b;
	ret<<=8;
	ret|=a;
	return ret;
}
/*--------------------------------------------------------------------*/
void xexanalyzer(const char *fn)
{
	unsigned int i,cnt=0,fsize,w;
	unsigned int start, end;
    FILE *f;
    f=fopen(fn,"rb");
    if (f)
    {
		printf("Open \"%s\"\n",fn);
		fseek(f,0,SEEK_END);
		fsize=ftell(f);
		fseek(f,0,0);
		printf("File size: %i bytes\n",fsize);
		w=getW(f,&cnt);
		if (w==0xFFFF)
		{
			printf("[FFFF] XEX Header\n");
			while (cnt<fsize)
			{
				start=getW(f,&cnt);
				if (start==0xFFFF)
				{
					printf("[FFFF] Old Style\n");
					start=getW(f,&cnt);
				};
				end=getW(f,&cnt);
				printf("Block $%04X - $%04X\n",start,end);
				if ((start<=0x02E2) && (end>=0x02E3)) {printf("INITAD = $02E2\n");};
				if ((start<=0x02E0) && (end>=0x02E1)) {printf("RUNAD  = $02E0\n");};
				for (i=0; i<=(end-start); i++) {getB(f,&cnt);};
			};
		}
		else
		{
				printf("No XEX [ %04X ]\n",w);
		};
		fclose(f);
	};
}
/*--------------------------------------------------------------------*/
int main(int argc, char *argv[])
{
	printf("XEX anlyzer\n");
	switch (argc)
	{
		case 2:
		{
			xexanalyzer(argv[1]);
		} break;
		default:
		{
			printf("use:\n");
			printf("   xexanalyzer file.xex\n");	
		} break;
	};
	return 0;
}
/*--------------------------------------------------------------------*/
