メガドラパッドUSB接続

いいもの見つけました

http://d.hatena.ne.jp/nicotakuya/20081103

リンク先URLが間違っていたので再リンク

http://nicotak.com/usb/mdpad.zip

ここら辺を参考にmdpad.cを、6Bパッドに対応してみました

http://applause.elfmimi.jp/md6bpad.html

//---------------------------------------------------------------------
// megadrive pad
//  by Takuya Matsubara / NICO Corp. 2006-2008
// http://www.nicotak.com/usb/

// 動作無保証です。


#include "fx2.h"
#include "fx2regs.h"
#include "mdpad.h"

#define MDPAD_PORT  IOA	// 
#define MDPAD_DDR   OEA	 //
#define MDPAD_PIN   IOA	// 

#define MDPAD_SELPORT  IOA	// 用ポート
#define MDPAD_SELDDR   OEA	 // 用ポート
#define MDPAD_SELBIT   (1<<6)	// 用ポート

#define MDPAD_SELB    MDPAD_SELPORT|=MDPAD_SELBIT	// 
#define MDPAD_SELA    MDPAD_SELPORT&=~MDPAD_SELBIT	// 


#define MDPAD_UP    (1<<0)
#define MDPAD_DOWN  (1<<1)

#define MDPAD_LOW1  (1<<2)
#define MDPAD_LOW2  (1<<3)
#define MDPAD_A     (1<<4)
#define MDPAD_START (1<<5)

#define MDPAD_LEFT  (1<<2)
#define MDPAD_RIGHT (1<<3)
#define MDPAD_B     (1<<4)
#define MDPAD_C     (1<<5)

#define MDPAD_Z     (1<<0)
#define MDPAD_Y     (1<<1)
#define MDPAD_X     (1<<2)
#define MDPAD_M     (1<<3)

char mdpad_get(unsigned char *p)
{
	char pin1;
	char pin2;
	char pin3;
	char pin4;
	char pin5;
	char pin6;
	char x;
	char y;
	char sw1;
	char sw2;

	x=128;
	y=128;
	sw1=0;
	sw2=0;

	MDPAD_SELDDR |= MDPAD_SELBIT;

	MDPAD_SELB;
	EZUSB_Delay(0);
	pin1 = MDPAD_PIN;

	MDPAD_SELA;
	EZUSB_Delay(0);
	pin2 = MDPAD_PIN;

	MDPAD_SELB;
	EZUSB_Delay(0);
	pin3 = MDPAD_PIN;

	MDPAD_SELA;
	EZUSB_Delay(0);
	pin4 = MDPAD_PIN;

	MDPAD_SELB;
	EZUSB_Delay(0);
	pin5 = MDPAD_PIN;

	MDPAD_SELA;
	EZUSB_Delay(0);
	pin6 = MDPAD_PIN;

	if((pin3 & MDPAD_LEFT)==0)
		x = 0;  		//

	if((pin3 & MDPAD_RIGHT)==0)
		x = 255;		//

	if((pin3 & MDPAD_UP)==0)
		y = 0;  		//

	if((pin3 & MDPAD_DOWN)==0)
		y = 255;		//


	if((pin4 & MDPAD_A)==0)
		sw1 |= (1<<0);	// batu

	if((pin3 & MDPAD_B)==0)
		sw1 |= (1<<1);	// maru 

	if((pin3 & MDPAD_C)==0)
		sw1 |= (1<<2);	// sikaku

	if((pin4 & MDPAD_START)==0)
		sw2 |= (1<<1);	// start


	if((pin5 & MDPAD_X)==0)
		sw2 |= (1<<2);	// L

	if((pin5 & MDPAD_Y)==0)
		sw1 |= (1<<3);	// sankaku 

	if((pin5 & MDPAD_Z)==0)
		sw2 |= (1<<3);	// R

	if((pin5 & MDPAD_M)==0)
		sw2 |= (1<<0);	// select

	*p++ = x;	// x
	*p++ = y;	// y
	*p++ = sw1;	// sw1
	*p++ = sw2;	// sw2

return(0);
}