
/*--------------------------------------------------------------------*/
/* HistoXEX                                                           */
/* by GienekP                                                         */
/* (c) 2023                                                           */
/*--------------------------------------------------------------------*/
#include <stdio.h>
/*--------------------------------------------------------------------*/
#define RAMSIZE (64*1024)
#define PATHSIZE (1024)
/*--------------------------------------------------------------------*/
unsigned int readpath(FILE *pf, char *path)
{
	unsigned int ret=0,i;
	char b[1];
	for (i=0; i<PATHSIZE; i++) {path[i]=0;};
	for (i=0; i<PATHSIZE; i++)
	{
		b[0]=0;
		if (feof(pf)) {i=PATHSIZE;}
		else
		{
			fread(b,sizeof(char),sizeof(b),pf);
			char rb=b[0];
			if (rb==0x0D)
			{
				fread(b,sizeof(char),sizeof(b),pf);
				i=PATHSIZE;
			} else
			if (rb==0x0A) 
			{
				i=PATHSIZE;
			} 
			else
			{
				path[i]=rb;
				ret=1;
			};	
		};
	};
	return ret;	
}
/*--------------------------------------------------------------------*/
unsigned int vw(unsigned char *b)
{
	unsigned int ret=0;
	ret=b[1];
	ret<<=8;
	ret|=b[0];
	b[0]=0;
	b[1]=0;
	return ret;
}
/*--------------------------------------------------------------------*/
unsigned int xexanalyze(const char *filexex, unsigned int *ram)
{
	unsigned char tmp[1024*1024];
	unsigned char b[2];
	unsigned int ret=0,first=1,i;
	int r;
	//printf("%s\n",filexex);
	FILE *pf;
	pf=fopen(filexex,"rb");
	if (pf)
	{
		while (!ret)
		{
			if (feof(pf)) {ret=1;}
			else
			{
				unsigned int h,s,e;
				fread(b,sizeof(unsigned char),sizeof(b),pf);
				h=vw(b);
				if (!feof(pf))
				{
					if ((first) && (h!=0xFFFF)) {ret=1;}
					else
					{
						if (h==0xFFFF)
						{
							fread(b,sizeof(unsigned char),sizeof(b),pf);
							s=vw(b);
						}
						else
						{
							s=h;
						};
						fread(b,sizeof(unsigned char),sizeof(b),pf);
						e=vw(b);
						if (e>=s) 
							{
								unsigned char dosalert=0;
								r=1+e-s;
								for (i=s; i<=e; i++)
								{
									ram[i]+=1;
									if (dosalert==0)
									{
										if ((i>=0x0700) && (i<=0x07FF)) {dosalert=1;};
									};
								};
								if (dosalert) {printf("Block $%04X - $%04X [%ib] in \"%s\"\n",s,e,r,filexex);};
								fread(tmp,sizeof(unsigned char),r,pf);							
							} else {r=0;ret=1;};
						first=0;
					};
				}
				else
				{
					ret=1;
				};
			};
		};
		fclose(pf);
	}
	else
	{
		printf("Error \"%s\"\n",filexex);
	};
	return ret;
};
/*--------------------------------------------------------------------*/
void histoxex(const char *files, const char *raport)
{
	unsigned int atariram[RAMSIZE];
	char path[PATHSIZE];
	unsigned int norf=0,i;
	FILE *pf;
	pf=fopen(files,"r");
	if (pf)
	{
		for (i=0; i<RAMSIZE; i++) {atariram[i]=0;};
		while (readpath(pf,path))
		{
			norf+=xexanalyze(path,atariram);
		};
		fclose(pf);
		if (norf)
		{
			pf=fopen(raport,"w");
			if (pf)
			{
				fprintf(pf,"Files,%i\n",norf);
				for (i=0; i<RAMSIZE; i++) {fprintf(pf,"%i,%i\n",i,atariram[i]);};
				fclose(pf);
			}
			else
			{
				printf("Error %s\n",raport);
			};
		};
	}
	else {printf("Error %s\n",files);};
}
/*--------------------------------------------------------------------*/
int main( int argc, char* argv[] )
{	
	printf("HistoXEX - ver: %s\n",__DATE__);
	if (argc==3) {histoxex(argv[1],argv[2]);}
	else
	{
		printf("(c) GienekP\n");
		printf("use:\nhistoxex files.txt raport.txt\n");
	};
	printf("\n");
	return 0;
}
/*--------------------------------------------------------------------*/

