#include <stdio.h>
#include <conio.h>
#include <dos.h>
#include "renbow.h"

// mode_mw = 1 - 93C46 16 organization
// mode_mw = 2 - 93C56 16 organization
// mode_mw = 3 - 93C66 16 organization

// instruction
unsigned int READ_MW  = 0x180;		// 1 1000 0000
unsigned int EWEN_MW  =	0x130;		// 1 0011 0000
unsigned int ERASE_MW =	0x1C0;		// 1 1100 0000
unsigned int ERAL_MW  = 0x120;		// 1 0010 0000
unsigned int WRITE_MW = 0x140;		// 1 0100 0000
unsigned int WRAL_MW  =	0x110;		// 1 0001 0000
unsigned int EWDS_MW  =	0x100;		// 1 0000 0000

void set_scr(void);
int read_renbow(unsigned int* dim, int dim_size, int PORT);
int write_renbow(unsigned int* dim, int dim_size, int PORT);
void print_damp(unsigned int* dim, unsigned int dim_size,unsigned int adr_hi);
//--------------------------------------------------------------------------
main()
{
FILE* dmp;
char string[12];
int PORT=LPT1;
unsigned int mykey, i, k;
int errors;
set_scr();
int dim_size=64;
unsigned int* dim = new unsigned int[dim_size];
for(i=0; i<dim_size; i++) dim[i]=0;
while(mykey != 27)
	{
	if (kbhit() != 0) mykey = getch();

	if(mykey==106)	// Alt/F3 WRITE
		{
		errors=write_renbow(dim, dim_size, PORT);
		mykey=0;
		}

	if(mykey==107)	// Alt/F4 READ
		{
		set_scr();
		errors=read_renbow(dim, dim_size, PORT);
		if(errors != 0) printf("\nERRORS READING\n");
		else
			{
			print_damp(dim, dim_size, 0);
			}
		mykey=0;
		}

	if(mykey == 111) //Alt/F8 save
		{
		printf("\nENTER SAVE FILE NAME  ", string);
		cscanf("%s", string);
		dmp = fopen (string, "wb" );
		fwrite(dim, dim_size*2, 1, dmp);
		fclose(dmp);
		printf("\nFILE SEVED TO %s", string);
		mykey=0;
		}

	if(mykey == 112) //Alt/F9 load
		{
		printf("\nENTER LOAD FILE NAME  ", string);
		cscanf("%s", string);
		if ((dmp = fopen(string, "rb")) == NULL)
			{
			fprintf(stderr, "Cannot open input file.\n");
			}
		else
			{
			fread(dim, dim_size*2, 1, dmp);
			fclose(dmp);
			print_damp(dim, dim_size, i);
			printf("\nFILE LOADED TO %s", string);
			}
		mykey=0;
		}

	}
fclose(dmp);
delete(dim);
return 0;
}
// --------------------------------------------------------------------
void set_scr(void)
{
clrscr();
gotoxy(1, 1);
printf("ALT/F3-write,ALT/F4-read,ALT/F8-save,ALT/F9-load\n");
return;
}
//--------------------------------------------------------------------
int read_renbow(unsigned int* dim, int dim_size, int PORT)
{
unsigned int i, p;
unsigned int command;
unsigned char data;
outp(PORT+2, 0x04);					//reset direct signals
for(i=0; i<dim_size; i++)
	{
	outp(PORT  , 0x28);					// SC=0
	outp(PORT  , 0x00);					// CS=1
	outp(PORT  , 0x10);					// CS=1
	command = READ_MW + i;
	for(p=0x100; p>0; p>>=1)
		{
		if((command & p) > 0) data=0x12;
		else data=0x10;
		outp(PORT, data);
		outp(PORT, data | 0x01);
		if((p==1) & ((inp(PORT+1) & 0x80) != 0)) return 1;
		outp(PORT, data & 0xFE);
		}
	for(p=0x8000; p>0; p>>=1)
		{
		outp(PORT, 0x13);
		if((inp(PORT+1) & 0x80) != 0) dim[i] |= 1;
		else dim[i] &= 0xFFFE;
		outp(PORT, 0x12);
		if(p>1) dim[i] <<=1;
		}
	outp(PORT  , 0x28);					// SC=0
	delay(1);
	}
return 0;
}
//--------------------------------------------------------------------
int write_renbow(unsigned int* dim, int dim_size, int PORT)
{
unsigned int i, p;
unsigned int command;
unsigned char data;
outp(PORT+2, 0x04);					//reset direct signals
for(i=0; i<dim_size; i++)
	{
	outp(PORT  , 0x28);					// SC=0
	outp(PORT  , 0x00);					// CS=1
	outp(PORT  , 0x10);					// CS=1
	command = EWEN_MW;
	for(p=0x100; p>0; p>>=1)
		{
		if((command & p) > 0) data=0x12;
		else data=0x10;
		outp(PORT, data);
		outp(PORT, data | 0x01);
		outp(PORT, data & 0xFE);
		}
	outp(PORT  , 0x28);					// SC=0
	outp(PORT  , 0x00);					// CS=1
	outp(PORT  , 0x10);					// CS=1
	command = WRITE_MW + i;
	for(p=0x100; p>0; p>>=1)
		{
		if((command & p) > 0) data=0x12;
		else data=0x10;
		outp(PORT, data);
		outp(PORT, data | 0x01);
		outp(PORT, data & 0xFE);
		}
	for(p=0x8000; p>0; p>>=1)
		{
		if((dim[i] & p) > 0) data=0x12;
		else data=0x10;
		outp(PORT, data);
		outp(PORT, data | 0x01);
		outp(PORT, data & 0xFE);
		}
	outp(PORT  , 0x28);					// SC=0
	delay(10);
	outp(PORT  , 0x00);					// CS=1
	outp(PORT  , 0x10);					// CS=1
	command = EWDS_MW;
	for(p=0x100; p>0; p>>=1)
		{
		if((command & p) > 0) data=0x12;
		else data=0x10;
		outp(PORT, data);
		outp(PORT, data | 0x01);
		outp(PORT, data & 0xFE);
		}
	outp(PORT  , 0x28);					// SC=0
	delay(1);
	}
return 0;
}
//--------------------------------------------------------------------
void print_damp(unsigned int* dim, unsigned int dim_size,unsigned int adr_hi)
{
unsigned int i, k;
for(i=0; i<dim_size; i++)
	{
	if((i & 0x07) == 0) printf("%04X: ", (i+(adr_hi << 8)));
	printf("%04X ", dim[i]);
	if((i & 0x07) == 7)
		{
		printf(" ");
		for(k=0; k<8; k++)
			{
			if(((dim[k+i-7] & 0x00FF) > 0x2F) && ((dim[k+i-7] & 0xFF00) > 0x2F00))
				printf("%c%c", ((dim[k+i-7] & 0xFF00)>>8), (dim[k+i-7] & 0x00FF)) ;
			else printf(".");
			}
		printf("\n");
		}
	}
return;
}
//--------------------------------------------------------------------

