/*

USB to parallel output

*/

#define ALLOCATE_EXTERN
#include <fx2regs.h>

// Read TRM p.15-115 for an explanation on this. 
// A single nop is sufficient for default setup but like that we're on 
// the safe side. 
#define	SYNCDELAY	_asm  nop; nop; nop; nop;  _endasm


static void Initialize(void)
{
	CPUCS=0x10;   // 48 MHz, CLKOUT output disabled. 
	
	IFCONFIG=0xc0;  // Internal IFCLK, 48MHz; A,B as normal ports. 
	SYNCDELAY;
	
	REVCTL=0x03;  // See TRM...
	SYNCDELAY;
	
	EP6CFG=0xe2;  // 1110 0010 (bulk IN, 512 bytes, double-buffered)
	SYNCDELAY;
	
	EP2CFG=0xa2;  // 1010 0010 (bulk OUT, 512 bytes, double-buffered)
	SYNCDELAY;
	
	FIFORESET = 0x80;  SYNCDELAY;  // NAK all requests from host. 
	FIFORESET = 0x02;  SYNCDELAY;  // Reset individual EP (2,4,6,8)
	FIFORESET = 0x04;  SYNCDELAY;
	FIFORESET = 0x06;  SYNCDELAY;
	FIFORESET = 0x08;  SYNCDELAY;
	FIFORESET = 0x00;  SYNCDELAY;  // Resume normal operation. 
	
	EP2FIFOCFG = 0x00;  // Make sure AUTOOUT=0. 
	SYNCDELAY;
	
	// Be sure to clear the 2 buffers (double-buffered) (required!). 
	OUTPKTEND = 0x82;  SYNCDELAY;
	OUTPKTEND = 0x82;  SYNCDELAY;
}

static void bit_write(void)
{
	unsigned int dtime=10000;
	unsigned int num=10000;
	unsigned int i;
	xdata const unsigned char *in_data=EP2FIFOBUF;
	//unsigned int len = ((int)EP2BCH)<<8 | EP2BCL;
	unsigned int len = 8;
	unsigned int mask=0x01;
	unsigned int out_data;
	unsigned int tmp_data;
	OEB = 0xFF; // PBを出力に =11111111
	out_data = 0x00;
	for(i=0; i<len; i++,in_data++)
	{
		out_data=out_data << 1;
		//DATA set
		tmp_data = mask & *in_data;
		//tmp_data = tmp_data*2;
		out_data|= tmp_data; 
	}
	//Output
	IOB = out_data;
}

void main(void)
{
	//USB initialize
	Initialize();
	for(;;)
	{
		// Wait for input on EP2 (EP2 non-empty). 
		if(!(EP2CS & (1<<2)))
		{
				bit_write();
				// Be sure to clear the 2 buffers (double-buffered) (required!). 
				OUTPKTEND = 0x82;  SYNCDELAY;
				OUTPKTEND = 0x82;  SYNCDELAY;
		}
	}

}
