#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>

typedef unsigned char u8;
typedef unsigned short u16;
typedef char s8;
typedef short s16;

u8 transaction(u8 s) {
	SPDR = s;
	while(!(SPSR & 0x80));
	return SPDR;
}

int main() {
	u8 data4, data5, joybits;

	DDRC = 0x3f;
	PORTC = 0x00;

	DDRB = 0x2c;
	PORTB = 0x34;

	SPCR = 0x7c;

	TCCR0B = 0x02;	// clk/8
	TIMSK0 = 0x01;

	asm("sei");

	for(;;) {
		PORTB &= ~0x04;
		(void) transaction(0x01);
		(void) transaction(0x42);
		(void) transaction(0x00);
		data4 = transaction(0x00);
		data5 = transaction(0x00);
		PORTB |= 0x04;

		joybits = 0;

		if(!(data4 & 0x10)) joybits |= 0x20;	// up
		if(!(data4 & 0x40)) joybits |= 0x10;	// down
		if(!(data4 & 0x80)) joybits |= 0x08;	// left
		if(!(data4 & 0x20)) joybits |= 0x04;	// right

		if(!(data4 & 0x01)) joybits |= 0x01;	// select -> fire
		if(!(data4 & 0x08)) joybits |= 0x01;	// start -> fire

		if(!(data5 & 0x10)) joybits |= 0x10;	// triangle -> down

		PORTC = joybits;

		SMCR = 0x01;
		asm("sleep");
		SMCR = 0x00;
	}
}

SIGNAL(_VECTOR(16)) {
}
