//---------------------------------------------------------------------------------------------
#include <stdio.h>
#include <system.h>
#include <io.h>
//---------------------------------------------------------------------------------------------
#define IOWR_VGA(base,offset,data) IOWR_16DIRECT(base,(offset)*2,data)
#define IORD_VGA(base,offset) IORD_16DIRECT(base,(offset)*2)
#define pacV 1

#define INITIAL_PACX 14
#define INITIAL_PACY 23
#define PAC_MOUTH_SPEED 15
//---------------------------------------------------------------------------------------------
int pacX = INITIAL_PACX;
int pacY = INITIAL_PACY;
int pacImgX = 203 + 9 * INITIAL_PACX;
int pacImgY = 105 + 9 * INITIAL_PACY;
int pacMove = 1;
int pacMouth = 0;
unsigned char keyBoardCode = 0;
unsigned char pacOperation = 0;
//---------------------------------------------------------------------------------------------
void paintPac(int x, int y) {
	IOWR_VGA(VGA_BASE, 0, x);
	IOWR_VGA(VGA_BASE, 1, y);
	if(pacMouth < PAC_MOUTH_SPEED / 3) {
		switch(pacMove) {
		case 1:
			IOWR_VGA(VGA_BASE, 2, 1);
			break;
		case 2:
			IOWR_VGA(VGA_BASE, 2, 3);
			break;
		case 3:
			IOWR_VGA(VGA_BASE, 2, 5);
			break;
		case 4:
			IOWR_VGA(VGA_BASE, 2, 7);
			break;
		default:
			break;
		}
	}
	if(pacMouth < 2 * PAC_MOUTH_SPEED / 3) {
		switch(pacMove) {
		case 1:
			IOWR_VGA(VGA_BASE, 2, 2);
			break;
		case 2:
			IOWR_VGA(VGA_BASE, 2, 4);
			break;
		case 3:
			IOWR_VGA(VGA_BASE, 2, 6);
			break;
		case 4:
			IOWR_VGA(VGA_BASE, 2, 8);
			break;
		default:
			break;
		}
	}
	else
		IOWR_VGA(VGA_BASE, 2, 0);
	pacMouth = (pacMouth + 1) % PAC_MOUTH_SPEED;
}

//---------------------------------------------------------------------------------------------
int movePac(int type) {
	switch(keyBoardCode)
	{
	case 117:	//up
		if(pacY > 0) {
			pacImgY -= pacV;
			pacMove = 4;
		}
		break;
	case 116:	//right
		if(pacX < 27) {
			pacImgX += pacV;
			pacMove = 1;
		}
		break;
	case 114:	//down
		if(pacY < 30) {
			pacImgY += pacV;
			pacMove = 2;
		}
		break;
	case 107:	//left
		if(pacX > 0) {
			pacImgX -= pacV;
			pacMove = 3;
		}
		break;
	default:
		break;
	}
	pacX = (pacImgX - 203) / 9;
	pacY = (pacImgY - 105) / 9;
	paintPac(pacImgX, pacImgY);
	return type;
}
//---------------------------------------------------------------------------------------------
int main() {
	unsigned gan;
	printf("PacMan is running!\n");
	while(!IORD_8DIRECT(KEYBOARD_BASE,0));
	for(;;)
	{
		while(!IORD_8DIRECT(KEYBOARD_BASE,0)){
			int i = 0;
			for(i = 0; i < 5000; i++);
			movePac(0);
		}
		keyBoardCode = IORD_8DIRECT(KEYBOARD_BASE,1);
		gan = IORD_VGA(VGA_BASE,1);
		printf("key=%d",gan);
		movePac(0);
	}

	return 0;
}


