mirror of
https://github.com/ekeeke/Genesis-Plus-GX.git
synced 2024-11-14 06:45:09 +01:00
[Core/IO] fixed TeamPlayer emulation (fixes multitap detection in Gauntlet 4)
This commit is contained in:
parent
54210e8222
commit
262a8c7fbc
@ -2,7 +2,7 @@
|
|||||||
* Genesis Plus
|
* Genesis Plus
|
||||||
* Team Player support
|
* Team Player support
|
||||||
*
|
*
|
||||||
* Copyright (C) 2007-2011 Eke-Eke (Genesis Plus GX)
|
* Copyright (C) 2007-2014 Eke-Eke (Genesis Plus GX)
|
||||||
*
|
*
|
||||||
* Redistribution and use of this code or any derivative works are permitted
|
* Redistribution and use of this code or any derivative works are permitted
|
||||||
* provided that the following conditions are met:
|
* provided that the following conditions are met:
|
||||||
@ -87,18 +87,20 @@ INLINE unsigned int teamplayer_read(int port)
|
|||||||
/* acquisition sequence */
|
/* acquisition sequence */
|
||||||
switch (counter)
|
switch (counter)
|
||||||
{
|
{
|
||||||
case 0: /* initial state: TH = 1, TR = 1 -> RLDU = 0011 */
|
case 0: /* initial state: xxx0011 */
|
||||||
{
|
{
|
||||||
return 0x73;
|
/* TL should match TR */
|
||||||
|
return ((teamplayer[port].State & 0x20) >> 1) | 0x03;
|
||||||
}
|
}
|
||||||
|
|
||||||
case 1: /* start request: TH = 0, TR = 1 -> RLDU = 1111 */
|
case 1: /* start request: xxx1111 */
|
||||||
{
|
{
|
||||||
return 0x3F;
|
/* TL should match TR */
|
||||||
|
return ((teamplayer[port].State & 0x20) >> 1) | 0x0F;
|
||||||
}
|
}
|
||||||
|
|
||||||
case 2:
|
case 2:
|
||||||
case 3: /* ack request: TH=0, TR=0/1 -> RLDU = 0000 */
|
case 3: /* ack request: xxx0000 */
|
||||||
{
|
{
|
||||||
/* TL should match TR */
|
/* TL should match TR */
|
||||||
return ((teamplayer[port].State & 0x20) >> 1);
|
return ((teamplayer[port].State & 0x20) >> 1);
|
||||||
@ -107,7 +109,7 @@ INLINE unsigned int teamplayer_read(int port)
|
|||||||
case 4:
|
case 4:
|
||||||
case 5:
|
case 5:
|
||||||
case 6:
|
case 6:
|
||||||
case 7: /* PAD type */
|
case 7: /* PAD type: xxx0000 (3B), xxx0001 (6B) or xxx1111 (NC)*/
|
||||||
{
|
{
|
||||||
unsigned int retval = input.dev[(port << 2) + (counter - 4)];
|
unsigned int retval = input.dev[(port << 2) + (counter - 4)];
|
||||||
|
|
||||||
@ -115,7 +117,7 @@ INLINE unsigned int teamplayer_read(int port)
|
|||||||
return (((teamplayer[port].State & 0x20) >> 1) | retval);
|
return (((teamplayer[port].State & 0x20) >> 1) | retval);
|
||||||
}
|
}
|
||||||
|
|
||||||
default: /* PAD status */
|
default: /* PAD status: xxxRLDU -> xxxSACB -> xxxMXYZ */
|
||||||
{
|
{
|
||||||
unsigned int retval = 0x0F;
|
unsigned int retval = 0x0F;
|
||||||
|
|
||||||
@ -136,23 +138,22 @@ INLINE void teamplayer_write(int port, unsigned char data, unsigned char mask)
|
|||||||
/* update bits set as output only */
|
/* update bits set as output only */
|
||||||
unsigned int state = (teamplayer[port].State & ~mask) | (data & mask);
|
unsigned int state = (teamplayer[port].State & ~mask) | (data & mask);
|
||||||
|
|
||||||
/* TH & TR handshaking */
|
/* check if TH is HIGH */
|
||||||
if ((teamplayer[port].State ^ state) & 0x60)
|
if (state & 0x40)
|
||||||
{
|
{
|
||||||
if (state & 0x40)
|
/* reset counter */
|
||||||
{
|
teamplayer[port].Counter = 0;
|
||||||
/* TH high -> reset counter */
|
|
||||||
teamplayer[port].Counter = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* increment counter */
|
|
||||||
teamplayer[port].Counter++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* update internal state */
|
|
||||||
teamplayer[port].State = state;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* TH & TR handshaking */
|
||||||
|
else if ((teamplayer[port].State ^ state) & 0x60)
|
||||||
|
{
|
||||||
|
/* increment counter */
|
||||||
|
teamplayer[port].Counter++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* update internal state */
|
||||||
|
teamplayer[port].State = state;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned char teamplayer_1_read(void)
|
unsigned char teamplayer_1_read(void)
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
* Genesis Plus
|
* Genesis Plus
|
||||||
* Team Player support
|
* Team Player support
|
||||||
*
|
*
|
||||||
* Copyright (C) 2007-2011 Eke-Eke (Genesis Plus GX)
|
* Copyright (C) 2007-2014 Eke-Eke (Genesis Plus GX)
|
||||||
*
|
*
|
||||||
* Redistribution and use of this code or any derivative works are permitted
|
* Redistribution and use of this code or any derivative works are permitted
|
||||||
* provided that the following conditions are met:
|
* provided that the following conditions are met:
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
* Support for Master System (315-5216, 315-5237 & 315-5297), Game Gear & Mega Drive I/O chips
|
* Support for Master System (315-5216, 315-5237 & 315-5297), Game Gear & Mega Drive I/O chips
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald (original code)
|
* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald (original code)
|
||||||
* Copyright (C) 2007-2013 Eke-Eke (Genesis Plus GX)
|
* Copyright (C) 2007-2014 Eke-Eke (Genesis Plus GX)
|
||||||
*
|
*
|
||||||
* Redistribution and use of this code or any derivative works are permitted
|
* Redistribution and use of this code or any derivative works are permitted
|
||||||
* provided that the following conditions are met:
|
* provided that the following conditions are met:
|
||||||
@ -80,16 +80,9 @@ void io_init(void)
|
|||||||
/* Initialize IO Ports handlers & connected peripherals */
|
/* Initialize IO Ports handlers & connected peripherals */
|
||||||
switch (input.system[0])
|
switch (input.system[0])
|
||||||
{
|
{
|
||||||
case SYSTEM_MS_GAMEPAD:
|
case SYSTEM_GAMEPAD:
|
||||||
{
|
{
|
||||||
port[0].data_w = dummy_write;
|
port[0].data_w = (input.dev[0] == DEVICE_PAD2B) ? dummy_write : gamepad_1_write;
|
||||||
port[0].data_r = gamepad_1_read;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case SYSTEM_MD_GAMEPAD:
|
|
||||||
{
|
|
||||||
port[0].data_w = gamepad_1_write;
|
|
||||||
port[0].data_r = gamepad_1_read;
|
port[0].data_r = gamepad_1_read;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -160,16 +153,9 @@ void io_init(void)
|
|||||||
|
|
||||||
switch (input.system[1])
|
switch (input.system[1])
|
||||||
{
|
{
|
||||||
case SYSTEM_MS_GAMEPAD:
|
case SYSTEM_GAMEPAD:
|
||||||
{
|
{
|
||||||
port[1].data_w = dummy_write;
|
port[1].data_w = (input.dev[4] == DEVICE_PAD2B) ? dummy_write : gamepad_2_write;
|
||||||
port[1].data_r = gamepad_2_read;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case SYSTEM_MD_GAMEPAD:
|
|
||||||
{
|
|
||||||
port[1].data_w = gamepad_2_write;
|
|
||||||
port[1].data_r = gamepad_2_read;
|
port[1].data_r = gamepad_2_read;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
* Support for Master System (315-5216, 315-5237 & 315-5297), Game Gear & Mega Drive I/O chips
|
* Support for Master System (315-5216, 315-5237 & 315-5297), Game Gear & Mega Drive I/O chips
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald (original code)
|
* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald (original code)
|
||||||
* Copyright (C) 2007-2013 Eke-Eke (Genesis Plus GX)
|
* Copyright (C) 2007-2014 Eke-Eke (Genesis Plus GX)
|
||||||
*
|
*
|
||||||
* Redistribution and use of this code or any derivative works are permitted
|
* Redistribution and use of this code or any derivative works are permitted
|
||||||
* provided that the following conditions are met:
|
* provided that the following conditions are met:
|
||||||
|
Loading…
Reference in New Issue
Block a user