メガドラパッドUSB接続その2

いいもの見つけました!NEO GEO PAD2。ELECOMのPS-USBコンバータでPS3につなげると、NEO GEO PAD USBではダメだったPS2のゲームで使えました。

http://game.snkplaymore.co.jp/official/kof94/neogeopad2/index.html

これをPCにもつなげてみて、ジョイスティックのボタン配列を確認して、メガドラ6BパッドをNEO GEO PAD2の配列に変更しました。

MD PS  WIN

A  ×   (3)

B  ○   (2)

C  R1   (8)

X  □   (4)

Y  △   (1)

Z  L1   (7)

M  SELECT(10)

S  START (9)

N/A L2   (5)

N/A R2   (6)

さらに、以下を参考に1つのFWで、6Bパッド、3Bパッド、MARK3パッドにも対応してみました

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     (0x1C)
#define MDPAD_START (0x2C)

#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)

#define MDPAD_LLLL  (0x0f)

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((pin1 & MDPAD_LEFT)==0)
		x = 0;  		//

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

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

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


	if((pin2 & MDPAD_A)==0)
		sw1 |= (1<<2);	// X

	if((pin1 & MDPAD_B)==0)
		sw1 |= (1<<1);	// O

	if((pin1 & MDPAD_C)==0 && (pin4 & MDPAD_LLLL)==0)
		sw1 |= (1<<7);	// R1

	if((pin1 & MDPAD_C)==0 && (pin4 & MDPAD_LLLL)!=0 && (pin2 & MDPAD_START)!=0)
		sw1 |= (1<<0);	// /\

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

	if((pin5 & MDPAD_X)==0 && (pin4 & MDPAD_LLLL)==0)
		sw1 |= (1<<3);	// []

	if((pin5 & MDPAD_Y)==0 && (pin4 & MDPAD_LLLL)==0)
		sw1 |= (1<<0);	// /\

	if((pin5 & MDPAD_Z)==0 && (pin4 & MDPAD_LLLL)==0)
		sw1 |= (1<<6);	// L1

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

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

return(0);
}