//Sean Riddle, 2/1/2012
//www.seanriddle.com

//creates binary file to program into 27256 EPROM to convert 49-way joystick outputs to 8-way, 4-way, 2-way, diagonal, etc outputs
//joystick outputs are connected to EPROM low address bits, data bits 3-0 are U/D/L/R (data bits 7-4 are U/D/L/R inverted)
//higher EPROM address bits select 1 of 16 mappings and reflection for x and y and rotation

//bits from Midway/Happ 49-way joystick (Williams are inverted)
#define DIR_CENTER 0x0	//MAME Analog+ website says center should be 0x8, but my Midway stick outputs 0x0 when centered

#define DIR_UP_3 0x7
#define DIR_UP_2 0x3
#define DIR_UP_1 0x1

#define DIR_DOWN_3 0xf
#define DIR_DOWN_2 0xe
#define DIR_DOWN_1 0xc

#define DIR_LEFT_3 0x7
#define DIR_LEFT_2 0x3
#define DIR_LEFT_1 0x1

#define DIR_RIGHT_3 0xf
#define DIR_RIGHT_2 0xe
#define DIR_RIGHT_1 0xc

//bits to game
#define UP			0x08
#define DOWN		0x04
#define LEFT		0x02
#define RIGHT		0x01
#define CENTER		0x00
#define UP_LEFT		(UP+LEFT)
#define UP_RIGHT	(UP+RIGHT)
#define DOWN_LEFT	(DOWN+LEFT)
#define DOWN_RIGHT	(DOWN+RIGHT)

//mappings
int mapping_8_way_medium_dead_zone[7][7]={
	UP_LEFT,   UP_LEFT,   UP,        UP,        UP,        UP_RIGHT,  UP_RIGHT,
	UP_LEFT,   UP_LEFT,   UP,        UP,        UP,        UP_RIGHT,  UP_RIGHT,
	LEFT,      LEFT,      UP_LEFT,   CENTER,    UP_RIGHT,  RIGHT,     RIGHT,
	LEFT,      LEFT,      CENTER,    CENTER,    CENTER,    RIGHT,     RIGHT,
	LEFT,      LEFT,      DOWN_LEFT, CENTER,    DOWN_RIGHT,RIGHT,     RIGHT,
	DOWN_LEFT, DOWN_LEFT, DOWN,      DOWN,      DOWN,      DOWN_RIGHT,DOWN_RIGHT,
	DOWN_LEFT, DOWN_LEFT, DOWN,      DOWN,      DOWN,      DOWN_RIGHT,DOWN_RIGHT
};
int mapping_4_way_medium_dead_zone[7][7]={
	CENTER,UP,UP,UP,UP,UP,CENTER,
	LEFT,CENTER,UP,UP,UP,CENTER,RIGHT,
	LEFT,LEFT,CENTER,UP,CENTER,RIGHT,RIGHT,
	LEFT,LEFT,LEFT,CENTER,RIGHT,RIGHT,RIGHT,
	LEFT,LEFT,CENTER,DOWN,CENTER,RIGHT,RIGHT,
	LEFT,CENTER,DOWN,DOWN,DOWN,CENTER,RIGHT,
	CENTER,DOWN,DOWN,DOWN,DOWN,DOWN,CENTER
};
int mapping_diagonal_small_dead_zone[7][7]={
	UP_LEFT,UP_LEFT,UP_LEFT,CENTER,UP_RIGHT,UP_RIGHT,UP_RIGHT,
	UP_LEFT,UP_LEFT,UP_LEFT,CENTER,UP_RIGHT,UP_RIGHT,UP_RIGHT,
	UP_LEFT,UP_LEFT,UP_LEFT,CENTER,UP_RIGHT,UP_RIGHT,UP_RIGHT,
	CENTER,CENTER,CENTER,CENTER,CENTER,CENTER,CENTER,
	DOWN_LEFT,DOWN_LEFT,DOWN_LEFT,CENTER,DOWN_RIGHT,DOWN_RIGHT,DOWN_RIGHT,
	DOWN_LEFT,DOWN_LEFT,DOWN_LEFT,CENTER,DOWN_RIGHT,DOWN_RIGHT,DOWN_RIGHT,
	DOWN_LEFT,DOWN_LEFT,DOWN_LEFT,CENTER,DOWN_RIGHT,DOWN_RIGHT,DOWN_RIGHT
};
int mapping_diagonal_centers_UL_DR[7][7]={
	UP_LEFT,UP_LEFT,UP_LEFT,UP_LEFT,UP_RIGHT,UP_RIGHT,UP_RIGHT,
	UP_LEFT,UP_LEFT,UP_LEFT,UP_LEFT,UP_RIGHT,UP_RIGHT,UP_RIGHT,
	UP_LEFT,UP_LEFT,UP_LEFT,UP_LEFT,UP_RIGHT,UP_RIGHT,UP_RIGHT,
	UP_LEFT,UP_LEFT,UP_LEFT,CENTER,DOWN_RIGHT,DOWN_RIGHT,DOWN_RIGHT,
	DOWN_LEFT,DOWN_LEFT,DOWN_LEFT,DOWN_RIGHT,DOWN_RIGHT,DOWN_RIGHT,DOWN_RIGHT,
	DOWN_LEFT,DOWN_LEFT,DOWN_LEFT,DOWN_RIGHT,DOWN_RIGHT,DOWN_RIGHT,DOWN_RIGHT,
	DOWN_LEFT,DOWN_LEFT,DOWN_LEFT,DOWN_RIGHT,DOWN_RIGHT,DOWN_RIGHT,DOWN_RIGHT
};
int mapping_diagonal_centers_UR_DL[7][7]={
	UP_LEFT,UP_LEFT,UP_LEFT,UP_RIGHT,UP_RIGHT,UP_RIGHT,UP_RIGHT,
	UP_LEFT,UP_LEFT,UP_LEFT,UP_RIGHT,UP_RIGHT,UP_RIGHT,UP_RIGHT,
	UP_LEFT,UP_LEFT,UP_LEFT,UP_RIGHT,UP_RIGHT,UP_RIGHT,UP_RIGHT,
	DOWN_LEFT,DOWN_LEFT,DOWN_LEFT,CENTER,UP_RIGHT,UP_RIGHT,UP_RIGHT,
	DOWN_LEFT,DOWN_LEFT,DOWN_LEFT,DOWN_LEFT,DOWN_RIGHT,DOWN_RIGHT,DOWN_RIGHT,
	DOWN_LEFT,DOWN_LEFT,DOWN_LEFT,DOWN_LEFT,DOWN_RIGHT,DOWN_RIGHT,DOWN_RIGHT,
	DOWN_LEFT,DOWN_LEFT,DOWN_LEFT,DOWN_LEFT,DOWN_RIGHT,DOWN_RIGHT,DOWN_RIGHT
};
int mapping_2_way_horizontal_small_dead_zone[7][7]={
	LEFT,LEFT,LEFT,CENTER,RIGHT,RIGHT,RIGHT,
	LEFT,LEFT,LEFT,CENTER,RIGHT,RIGHT,RIGHT,
	LEFT,LEFT,LEFT,CENTER,RIGHT,RIGHT,RIGHT,
	LEFT,LEFT,LEFT,CENTER,RIGHT,RIGHT,RIGHT,
	LEFT,LEFT,LEFT,CENTER,RIGHT,RIGHT,RIGHT,
	LEFT,LEFT,LEFT,CENTER,RIGHT,RIGHT,RIGHT,
	LEFT,LEFT,LEFT,CENTER,RIGHT,RIGHT,RIGHT
};
int mapping_2_way_vertical_small_dead_zone[7][7]={
	UP,UP,UP,UP,UP,UP,UP,
	UP,UP,UP,UP,UP,UP,UP,
	UP,UP,UP,UP,UP,UP,UP,
	CENTER,CENTER,CENTER,CENTER,CENTER,CENTER,CENTER,
	DOWN,DOWN,DOWN,DOWN,DOWN,DOWN,DOWN,
	DOWN,DOWN,DOWN,DOWN,DOWN,DOWN,DOWN,
	DOWN,DOWN,DOWN,DOWN,DOWN,DOWN,DOWN
};
int mapping_8_way_large_dead_zone[7][7]={
	UP_LEFT,UP_LEFT,UP,UP,UP,UP_RIGHT,UP_RIGHT,
	UP_LEFT,UP_LEFT,UP,UP,UP,UP_RIGHT,UP_RIGHT,
	LEFT,LEFT,CENTER,CENTER,CENTER,RIGHT,RIGHT,
	LEFT,LEFT,CENTER,CENTER,CENTER,RIGHT,RIGHT,
	LEFT,LEFT,CENTER,CENTER,CENTER,RIGHT,RIGHT,
	DOWN_LEFT,DOWN_LEFT,DOWN,DOWN,DOWN,DOWN_RIGHT,DOWN_RIGHT,
	DOWN_LEFT,DOWN_LEFT,DOWN,DOWN,DOWN,DOWN_RIGHT,DOWN_RIGHT
};
int mapping_8_way_no_dead_zone[7][7]={
	UP_LEFT,UP_LEFT,UP,UP,UP,UP_RIGHT,UP_RIGHT,
	UP_LEFT,UP_LEFT,UP,UP,UP,UP_RIGHT,UP_RIGHT,
	LEFT,LEFT,UP_LEFT,UP,UP_RIGHT,RIGHT,RIGHT,
	LEFT,LEFT,LEFT,CENTER,RIGHT,RIGHT,RIGHT,
	LEFT,LEFT,DOWN_LEFT,DOWN,DOWN_RIGHT,RIGHT,RIGHT,
	DOWN_LEFT,DOWN_LEFT,DOWN,DOWN,DOWN,DOWN_RIGHT,DOWN_RIGHT,
	DOWN_LEFT,DOWN_LEFT,DOWN,DOWN,DOWN,DOWN_RIGHT,DOWN_RIGHT
};
int mapping_4_way_large_dead_zone[7][7]={
	CENTER,UP,UP,UP,UP,UP,CENTER,
	LEFT,CENTER,UP,UP,UP,CENTER,RIGHT,
	LEFT,LEFT,CENTER,CENTER,CENTER,RIGHT,RIGHT,
	LEFT,LEFT,CENTER,CENTER,CENTER,RIGHT,RIGHT,
	LEFT,LEFT,CENTER,CENTER,CENTER,RIGHT,RIGHT,
	LEFT,CENTER,DOWN,DOWN,DOWN,CENTER,RIGHT,
	CENTER,DOWN,DOWN,DOWN,DOWN,DOWN,CENTER
};
int mapping_4_way_corners_up_down[7][7]={
	UP,UP,UP,UP,UP,UP,UP,
	LEFT,LEFT,UP,UP,UP,RIGHT,RIGHT,
	LEFT,LEFT,CENTER,CENTER,CENTER,RIGHT,RIGHT,
	LEFT,LEFT,CENTER,CENTER,CENTER,RIGHT,RIGHT,
	LEFT,LEFT,CENTER,CENTER,CENTER,RIGHT,RIGHT,
	LEFT,LEFT,DOWN,DOWN,DOWN,RIGHT,RIGHT,
	DOWN,DOWN,DOWN,DOWN,DOWN,DOWN,DOWN
};
int mapping_4_way_corners_left_right[7][7]={
	LEFT,UP,UP,UP,UP,UP,RIGHT,
	LEFT,UP,UP,UP,UP,UP,RIGHT,
	LEFT,LEFT,CENTER,CENTER,CENTER,RIGHT,RIGHT,
	LEFT,LEFT,CENTER,CENTER,CENTER,RIGHT,RIGHT,
	LEFT,LEFT,CENTER,CENTER,CENTER,RIGHT,RIGHT,
	LEFT,DOWN,DOWN,DOWN,DOWN,DOWN,RIGHT,
	LEFT,DOWN,DOWN,DOWN,DOWN,DOWN,RIGHT
};
int mapping_4_way_corners_up_down2[7][7]={
	UP,UP,UP,UP,UP,UP,UP,
	LEFT,UP,UP,UP,UP,UP,RIGHT,
	LEFT,LEFT,UP,UP,UP,RIGHT,RIGHT,
	LEFT,LEFT,LEFT,CENTER,RIGHT,RIGHT,RIGHT,
	LEFT,LEFT,DOWN,DOWN,DOWN,RIGHT,RIGHT,
	LEFT,DOWN,DOWN,DOWN,DOWN,DOWN,RIGHT,
	DOWN,DOWN,DOWN,DOWN,DOWN,DOWN,DOWN
};
int mapping_4_way_corners_left_right2[7][7]={
	LEFT,  UP,    UP,    UP,    UP,    UP,    RIGHT,
	LEFT,  LEFT,  UP,    UP,    UP,    RIGHT, RIGHT,
	LEFT,  LEFT,  LEFT,  UP,    RIGHT, RIGHT, RIGHT,
	LEFT,  LEFT,  LEFT,  CENTER,RIGHT, RIGHT, RIGHT,
	LEFT,  LEFT,  LEFT,  DOWN,  RIGHT, RIGHT, RIGHT,
	LEFT,  LEFT,  DOWN,  DOWN,  DOWN,  RIGHT, RIGHT,
	LEFT,  DOWN,  DOWN,  DOWN,  DOWN,  DOWN,  RIGHT
};
int mapping_diagonal_medium_dead_zone[7][7]={
	UP_LEFT,UP_LEFT,UP_LEFT,CENTER,UP_RIGHT,UP_RIGHT,UP_RIGHT,
	UP_LEFT,UP_LEFT,UP_LEFT,CENTER,UP_RIGHT,UP_RIGHT,UP_RIGHT,
	UP_LEFT,UP_LEFT,CENTER,CENTER,CENTER,UP_RIGHT,UP_RIGHT,
	CENTER,CENTER,CENTER,CENTER,CENTER,CENTER,CENTER,
	DOWN_LEFT,DOWN_LEFT,CENTER,CENTER,CENTER,DOWN_RIGHT,DOWN_RIGHT,
	DOWN_LEFT,DOWN_LEFT,DOWN_LEFT,CENTER,DOWN_RIGHT,DOWN_RIGHT,DOWN_RIGHT,
	DOWN_LEFT,DOWN_LEFT,DOWN_LEFT,CENTER,DOWN_RIGHT,DOWN_RIGHT,DOWN_RIGHT
};
int mapping_diagonal_large_dead_zone[7][7]={
	UP_LEFT,UP_LEFT,CENTER,CENTER,CENTER,UP_RIGHT,UP_RIGHT,
	UP_LEFT,UP_LEFT,CENTER,CENTER,CENTER,UP_RIGHT,UP_RIGHT,
	CENTER,CENTER,CENTER,CENTER,CENTER,CENTER,CENTER,
	CENTER,CENTER,CENTER,CENTER,CENTER,CENTER,CENTER,
	CENTER,CENTER,CENTER,CENTER,CENTER,CENTER,CENTER,
	DOWN_LEFT,DOWN_LEFT,CENTER,CENTER,CENTER,DOWN_RIGHT,DOWN_RIGHT,
	DOWN_LEFT,DOWN_LEFT,CENTER,CENTER,CENTER,DOWN_RIGHT,DOWN_RIGHT
};
int mapping_2_way_horizontal_medium_dead_zone[7][7]={
	LEFT,LEFT,CENTER,CENTER,CENTER,RIGHT,RIGHT,
	LEFT,LEFT,CENTER,CENTER,CENTER,RIGHT,RIGHT,
	LEFT,LEFT,CENTER,CENTER,CENTER,RIGHT,RIGHT,
	LEFT,LEFT,CENTER,CENTER,CENTER,RIGHT,RIGHT,
	LEFT,LEFT,CENTER,CENTER,CENTER,RIGHT,RIGHT,
	LEFT,LEFT,CENTER,CENTER,CENTER,RIGHT,RIGHT,
	LEFT,LEFT,CENTER,CENTER,CENTER,RIGHT,RIGHT,
};
int mapping_2_way_horizontal_large_dead_zone[7][7]={
	LEFT,CENTER,CENTER,CENTER,CENTER,CENTER,RIGHT,
	LEFT,CENTER,CENTER,CENTER,CENTER,CENTER,RIGHT,
	LEFT,CENTER,CENTER,CENTER,CENTER,CENTER,RIGHT,
	LEFT,CENTER,CENTER,CENTER,CENTER,CENTER,RIGHT,
	LEFT,CENTER,CENTER,CENTER,CENTER,CENTER,RIGHT,
	LEFT,CENTER,CENTER,CENTER,CENTER,CENTER,RIGHT,
	LEFT,CENTER,CENTER,CENTER,CENTER,CENTER,RIGHT,
};
int mapping_2_way_vertical_medium_dead_zone[7][7]={
	UP,UP,UP,UP,UP,UP,UP,
	UP,UP,UP,UP,UP,UP,UP,
	CENTER,CENTER,CENTER,CENTER,CENTER,CENTER,CENTER,
	CENTER,CENTER,CENTER,CENTER,CENTER,CENTER,CENTER,
	CENTER,CENTER,CENTER,CENTER,CENTER,CENTER,CENTER,
	DOWN,DOWN,DOWN,DOWN,DOWN,DOWN,DOWN,
	DOWN,DOWN,DOWN,DOWN,DOWN,DOWN,DOWN
};
int mapping_2_way_vertical_large_dead_zone[7][7]={
	UP,UP,UP,UP,UP,UP,UP,
	CENTER,CENTER,CENTER,CENTER,CENTER,CENTER,CENTER,
	CENTER,CENTER,CENTER,CENTER,CENTER,CENTER,CENTER,
	CENTER,CENTER,CENTER,CENTER,CENTER,CENTER,CENTER,
	CENTER,CENTER,CENTER,CENTER,CENTER,CENTER,CENTER,
	CENTER,CENTER,CENTER,CENTER,CENTER,CENTER,CENTER,
	DOWN,DOWN,DOWN,DOWN,DOWN,DOWN,DOWN
};


//takes a 7x7 mapping array and reflection/rotation flags, writes binary data to file
void addmapping(FILE* outfile,int mapping[7][7],int reflectx,int reflecty,int rotate) {
	int newmapping[7][7];
	int newx,newy,tmp;

	//reflect and rotate the mapping based on input flags
	for(int y=0;y<7;y++) {
		for(int x=0;x<7;x++) {
			if(reflectx==0)
				newx=x;
			else
				newx=6-x;
			if(reflecty==0)
				newy=y;
			else
				newy=6-y;
			if(rotate==1) {
				tmp=newx;
				newx=6-newy;
				newy=tmp;
			}
			newmapping[newy][newx]=mapping[y][x];
		}
	}

	//output the mapping to the EPROM file
	for(int raddr=0;raddr<256;raddr++) {
		int data=DIR_CENTER,invalid=0;
		int matrixx,matrixy;

		//translate 49-way coords to our mapping
		//joystick only produces 49 of the 256 possible addresses; get the row/col of the mapping for valid addresses, fill the rest with CENTER
		if(((raddr>>4)&0x0f)==DIR_UP_3) {
			matrixy=0;
		} else if(((raddr>>4)&0x0f)==DIR_UP_2) {
			matrixy=1;
		} else if(((raddr>>4)&0x0f)==DIR_UP_1) {
			matrixy=2;
		} else if(((raddr>>4)&0x0f)==DIR_CENTER) {
			matrixy=3;
		} else if(((raddr>>4)&0x0f)==DIR_DOWN_1) {
			matrixy=4;
		} else if(((raddr>>4)&0x0f)==DIR_DOWN_2) {
			matrixy=5;
		} else if(((raddr>>4)&0x0f)==DIR_DOWN_3) {
			matrixy=6;
		} else {
			invalid=1;
		}

		if((raddr&0x0f)==DIR_LEFT_3) {
			matrixx=0;
		} else if((raddr&0x0f)==DIR_LEFT_2) {
			matrixx=1;
		} else if((raddr&0x0f)==DIR_LEFT_1) {
			matrixx=2;
		} else if((raddr&0x0f)==DIR_CENTER) {
			matrixx=3;
		} else if((raddr&0x0f)==DIR_RIGHT_1) {
			matrixx=4;
		} else if((raddr&0x0f)==DIR_RIGHT_2) {
			matrixx=5;
		} else if((raddr&0x0f)==DIR_RIGHT_3) {
			matrixx=6;
		} else {
			invalid=1;
		}
		if(invalid==1) {
			data=DIR_CENTER;
		} else {
			data=newmapping[matrixy][matrixx];
		}

		fputc(((15-data)<<4)+data,outfile);//top 4 bits are bottom 4 bits inverted
	}
}


//writes binary data to file for 49-way output
void add49waymapping(FILE* outfile,int willy,int reflectx,int reflecty,int rotate) {
	//output the mapping to the EPROM file
	for(int raddr=0;raddr<256;raddr++) {
		int xdata=DIR_CENTER,ydata=DIR_CENTER,invalid=0;

		//joystick only produces 49 of the 256 possible addresses; get the row/col of the mapping for valid addresses, fill the rest with CENTER
		if(rotate==0) {
			if(((raddr>>4)&0x0f)==DIR_UP_3) {
				if(reflecty==0)
					ydata=DIR_UP_3;
				else
					ydata=DIR_DOWN_3;
			} else if(((raddr>>4)&0x0f)==DIR_UP_2) {
				if(reflecty==0)
					ydata=DIR_UP_2;
				else
					ydata=DIR_DOWN_2;
			} else if(((raddr>>4)&0x0f)==DIR_UP_1) {
				if(reflecty==0)
					ydata=DIR_UP_1;
				else
					ydata=DIR_DOWN_1;
			} else if(((raddr>>4)&0x0f)==DIR_CENTER) {
				ydata=DIR_CENTER;
			} else if(((raddr>>4)&0x0f)==DIR_DOWN_1) {
				if(reflecty==0)
					ydata=DIR_DOWN_1;
				else
					ydata=DIR_UP_1;
			} else if(((raddr>>4)&0x0f)==DIR_DOWN_2) {
				if(reflecty==0)
					ydata=DIR_DOWN_2;
				else
					ydata=DIR_UP_2;
			} else if(((raddr>>4)&0x0f)==DIR_DOWN_3) {
				if(reflecty==0)
					ydata=DIR_DOWN_3;
				else
					ydata=DIR_UP_3;
			} else {
				invalid=1;
			}

			if((raddr&0x0f)==DIR_LEFT_3) {
				if(reflectx==0)
					xdata=DIR_LEFT_3;
				else
					xdata=DIR_RIGHT_3;
			} else if((raddr&0x0f)==DIR_LEFT_2) {
				if(reflectx==0)
					xdata=DIR_LEFT_2;
				else
					xdata=DIR_RIGHT_2;
			} else if((raddr&0x0f)==DIR_LEFT_1) {
				if(reflectx==0)
					xdata=DIR_LEFT_1;
				else
					xdata=DIR_RIGHT_1;
			} else if((raddr&0x0f)==DIR_CENTER) {
				xdata=DIR_CENTER;
			} else if((raddr&0x0f)==DIR_RIGHT_1) {
				if(reflectx==0)
					xdata=DIR_RIGHT_1;
				else
					xdata=DIR_LEFT_1;
			} else if((raddr&0x0f)==DIR_RIGHT_2) {
				if(reflectx==0)
					xdata=DIR_RIGHT_2;
				else
					xdata=DIR_LEFT_2;
			} else if((raddr&0x0f)==DIR_RIGHT_3) {
				if(reflectx==0)
					xdata=DIR_RIGHT_3;
				else
					xdata=DIR_LEFT_3;
			} else {
				invalid=1;
			}
		} else { //rotate==1
			if(((raddr>>4)&0x0f)==DIR_UP_3) {
				if(reflectx==0)
					xdata=DIR_LEFT_3;
				else
					xdata=DIR_RIGHT_3;
			} else if(((raddr>>4)&0x0f)==DIR_UP_2) {
				if(reflectx==0)
					xdata=DIR_LEFT_2;
				else
					xdata=DIR_RIGHT_2;
			} else if(((raddr>>4)&0x0f)==DIR_UP_1) {
				if(reflectx==0)
					xdata=DIR_LEFT_1;
				else
					xdata=DIR_RIGHT_1;
			} else if(((raddr>>4)&0x0f)==DIR_CENTER) {
				xdata=DIR_CENTER;
			} else if(((raddr>>4)&0x0f)==DIR_DOWN_1) {
				if(reflectx==0)
					xdata=DIR_RIGHT_1;
				else
					xdata=DIR_LEFT_1;
			} else if(((raddr>>4)&0x0f)==DIR_DOWN_2) {
				if(reflectx==0)
					xdata=DIR_RIGHT_2;
				else
					xdata=DIR_LEFT_2;
			} else if(((raddr>>4)&0x0f)==DIR_DOWN_3) {
				if(reflectx==0)
					xdata=DIR_RIGHT_3;
				else
					xdata=DIR_LEFT_3;
			} else {
				invalid=1;
			}

			if((raddr&0x0f)==DIR_LEFT_3) {
				if(reflecty==0)
					ydata=DIR_DOWN_3;
				else
					ydata=DIR_UP_3;
			} else if((raddr&0x0f)==DIR_LEFT_2) {
				if(reflecty==0)
					ydata=DIR_DOWN_2;
				else
					ydata=DIR_UP_2;
			} else if((raddr&0x0f)==DIR_LEFT_1) {
				if(reflecty==0)
					ydata=DIR_DOWN_1;
				else
					ydata=DIR_UP_1;
			} else if((raddr&0x0f)==DIR_CENTER) {
				ydata=DIR_CENTER;
			} else if((raddr&0x0f)==DIR_RIGHT_1) {
				if(reflecty==0)
					ydata=DIR_UP_1;
				else
					ydata=DIR_DOWN_1;
			} else if((raddr&0x0f)==DIR_RIGHT_2) {
				if(reflecty==0)
					ydata=DIR_UP_2;
				else
					ydata=DIR_DOWN_2;
			} else if((raddr&0x0f)==DIR_RIGHT_3) {
				if(reflecty==0)
					ydata=DIR_UP_3;
				else
					ydata=DIR_DOWN_3;
			} else {
				invalid=1;
			}
		}
		if(invalid==1) {
			xdata=DIR_CENTER;
			ydata=DIR_CENTER;
		}
		if(willy==1) {	//Williams 49-way - invert lower 3 bits
			ydata^=0x07;
			xdata^=0x07;
		}
		fputc(((ydata<<4)&0xf0)+xdata,outfile);
	}
}


void main(void) {
	int reflectx;
	int reflecty;
	int rotate;

	FILE *outfile=fopen("49way.dat","wb");	//binary so no ASCII translations

	for(int i=0;i<8;i++) {	//8 rotations/reflections: normal, reflect x, reflect y, reflect x&y, rot, rot+reflect x, rot+reflect y, rot+reflect x&y
		reflectx=i&1;
		reflecty=(i&2)>>1;
		rotate=(i&4)>>2;

		//mappings added to EPROM file in order listed below
		add49waymapping(outfile,0,reflectx,reflecty,rotate);	//Midway/Happ 49-way mapping
		addmapping(outfile,mapping_8_way_no_dead_zone,reflectx,reflecty,rotate);
		addmapping(outfile,mapping_4_way_medium_dead_zone,reflectx,reflecty,rotate);
		addmapping(outfile,mapping_4_way_corners_up_down2,reflectx,reflecty,rotate);
		addmapping(outfile,mapping_4_way_corners_left_right2,reflectx,reflecty,rotate);
		addmapping(outfile,mapping_diagonal_small_dead_zone,reflectx,reflecty,rotate);
		addmapping(outfile,mapping_diagonal_centers_UL_DR,reflectx,reflecty,rotate);
		addmapping(outfile,mapping_diagonal_centers_UR_DL,reflectx,reflecty,rotate);
		addmapping(outfile,mapping_2_way_horizontal_small_dead_zone,reflectx,reflecty,rotate);
		addmapping(outfile,mapping_2_way_vertical_small_dead_zone,reflectx,reflecty,rotate);

		add49waymapping(outfile,1,reflectx,reflecty,rotate);	//Williams 49-way mapping
		addmapping(outfile,mapping_8_way_medium_dead_zone,reflectx,reflecty,rotate);
		addmapping(outfile,mapping_8_way_large_dead_zone,reflectx,reflecty,rotate);
		addmapping(outfile,mapping_4_way_large_dead_zone,reflectx,reflecty,rotate);
		addmapping(outfile,mapping_4_way_corners_up_down,reflectx,reflecty,rotate);
		addmapping(outfile,mapping_4_way_corners_left_right,reflectx,reflecty,rotate);
		

//      some other, likely useless mappings
//		addmapping(outfile,mapping_diagonal_medium_dead_zone,reflectx,reflecty,rotate);
//		addmapping(outfile,mapping_diagonal_large_dead_zone,reflectx,reflecty,rotate);
//		addmapping(outfile,mapping_2_way_horizontal_medium_dead_zone,reflectx,reflecty,rotate);
//		addmapping(outfile,mapping_2_way_horizontal_large_dead_zone,reflectx,reflecty,rotate);
//		addmapping(outfile,mapping_2_way_vertical_medium_dead_zone,reflectx,reflecty,rotate);
//		addmapping(outfile,mapping_2_way_vertical_large_dead_zone,reflectx,reflecty,rotate);
	}
	fclose(outfile);
}

