mirror of
https://github.com/ekeeke/Genesis-Plus-GX.git
synced 2024-11-05 02:15:07 +01:00
fixed DVD support (gamecube), improved controller options
This commit is contained in:
parent
ec3f6c3d37
commit
0d367d7d16
@ -14,7 +14,7 @@ current:
|
||||
- added support for some more unlicensed games: Pocket Monster, King of Fighter 98, Soul Blade (credits to Haze)
|
||||
- improved Menacer emulation: fix lightgun support in Body Count & T2: The Arcade Game
|
||||
- implemented Konami Justifier emulation: fix lightgun support in Lethal Enforcers 1 & 2
|
||||
- implemented Sega Mouse emulation (Populous 2, Body Count, Shangai 2...)
|
||||
- implemented Sega Mouse emulation (Populous 2, Body Count, Shangai 2, Fun'n Games, ...)
|
||||
|
||||
[Wii]
|
||||
- added lightgun support (Menacer/Justifier) through Wiimote IR
|
||||
|
@ -51,8 +51,8 @@
|
||||
|
||||
/* System IO ports */
|
||||
#define NO_SYSTEM (0) /* Unconnected Port*/
|
||||
#define SYSTEM_GAMEPAD (1) /* Single Gamepad */
|
||||
#define SYSTEM_MOUSE (2) /* Sega Mouse */
|
||||
#define SYSTEM_MOUSE (1) /* Sega Mouse */
|
||||
#define SYSTEM_GAMEPAD (2) /* Single Gamepad */
|
||||
#define SYSTEM_MENACER (3) /* Sega Menacer (port 2) */
|
||||
#define SYSTEM_JUSTIFIER (4) /* Konami Justifier (port 2) */
|
||||
#define SYSTEM_TEAMPLAYER (5) /* Sega TeamPlayer */
|
||||
|
@ -64,6 +64,6 @@ void set_config_defaults(void)
|
||||
/* controllers options */
|
||||
ogc_input__set_defaults();
|
||||
config.gun_cursor = 1;
|
||||
config.invert_mouse = 1;
|
||||
config.invert_mouse = 0;
|
||||
}
|
||||
|
||||
|
@ -17,24 +17,22 @@
|
||||
***************************************************************************/
|
||||
|
||||
#include "shared.h"
|
||||
#ifdef WII_DVD
|
||||
#include "wdvd.h"
|
||||
#endif
|
||||
|
||||
#ifdef HW_DOL
|
||||
#include "dvd.h"
|
||||
|
||||
u64 DvdMaxOffset = 0x57057C00;
|
||||
|
||||
/** DVD I/O Address base **/
|
||||
#ifndef HW_RVL
|
||||
static vu32* const dvd = (u32*)0xCC006000;
|
||||
static unsigned char *inquiry=(unsigned char *)0x80000004;
|
||||
#endif
|
||||
|
||||
/** Due to lack of memory, we'll use this little 2k keyhole for all DVD operations **/
|
||||
unsigned char DVDreadbuffer[2048] ATTRIBUTE_ALIGN (32);
|
||||
|
||||
#ifdef HW_RVL
|
||||
u64 DvdMaxOffset = 0x118244F00LL;
|
||||
#else
|
||||
u64 DvdMaxOffset = 0x57057C00; // default
|
||||
#include "wdvd.h"
|
||||
u64 DvdMaxOffset = 0x118244F00LL;
|
||||
#endif
|
||||
|
||||
/***************************************************************************
|
||||
@ -44,37 +42,41 @@ u64 DvdMaxOffset = 0x57057C00; // default
|
||||
***************************************************************************/
|
||||
int dvd_read (void *dst, unsigned int len, u64 offset)
|
||||
{
|
||||
#ifndef HW_RVL
|
||||
//unsigned char *buffer = (unsigned char *) (unsigned int) DVDreadbuffer;
|
||||
|
||||
// if (len > 2048) return 1; /*** We only allow 2k reads **/
|
||||
/* DCInvalidateRange((void *)buffer, len);
|
||||
/*** We only allow 2k reads **/
|
||||
if (len > 2048) return 0;
|
||||
|
||||
/*** Let's not read past end of DVD ***/
|
||||
if(offset < DvdMaxOffset)
|
||||
{
|
||||
dvd[0] = 0x2E;
|
||||
dvd[1] = 0;
|
||||
dvd[2] = 0xA8000000;
|
||||
dvd[3] = (u32)(offset >> 2);
|
||||
dvd[4] = len;
|
||||
dvd[5] = (u32) buffer;
|
||||
dvd[6] = len;
|
||||
dvd[7] = 3; *//*** Enable reading with DMA ***/
|
||||
// while (dvd[7] & 1);
|
||||
// memcpy (dst, buffer, len);
|
||||
// }
|
||||
// else return 1; // Let's not read past end of DVD
|
||||
|
||||
// if (dvd[0] & 0x4) return 0; /* Ensure it has completed */
|
||||
if (DVD_LowRead(dst,len,offset,NULL) == 1)
|
||||
return 0;
|
||||
#elif WII_DVD
|
||||
|
||||
if (WDVD_LowUnencryptedRead((unsigned char **)&dst, len, (u32)(offset >> 2)) == 1)
|
||||
return 0;
|
||||
#ifdef HW_DOL
|
||||
unsigned char *buffer = (unsigned char *) (unsigned int) DVDreadbuffer;
|
||||
DCInvalidateRange((void *)buffer, len);
|
||||
/*dvd[0] = 0x2E;
|
||||
dvd[1] = 0;
|
||||
dvd[2] = 0xA8000000;
|
||||
dvd[3] = (u32)(offset >> 2);
|
||||
dvd[4] = len;
|
||||
dvd[5] = (u32) buffer;
|
||||
dvd[6] = len;
|
||||
dvd[7] = 3; */
|
||||
|
||||
/*** Enable reading with DMA ***/
|
||||
DVD_LowRead(buffer,len,offset,NULL);
|
||||
while (dvd[7] & 1);
|
||||
memcpy (dst, buffer, len);
|
||||
|
||||
/*** Ensure it has completed ***/
|
||||
if (dvd[0] & 0x4) return 0;
|
||||
|
||||
return 1;
|
||||
|
||||
#elif WII_DVD
|
||||
return WDVD_LowUnencryptedRead((unsigned char **)&dst, len, (u32)(offset >> 2));
|
||||
#endif
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
@ -86,11 +88,10 @@ int dvd_read (void *dst, unsigned int len, u64 offset)
|
||||
*
|
||||
* libOGC tends to foul up if you don't, and sometimes does if you do!
|
||||
****************************************************************************/
|
||||
#ifndef HW_RVL
|
||||
#ifdef HW_DOL
|
||||
void uselessinquiry ()
|
||||
{
|
||||
dvddrvinfo drive_info;
|
||||
|
||||
DVD_LowInquiry(&drive_info,NULL);
|
||||
|
||||
/*
|
||||
@ -114,7 +115,7 @@ void uselessinquiry ()
|
||||
*
|
||||
* This can be used to prevent the Disc from spinning during playtime
|
||||
****************************************************************************/
|
||||
#ifndef HW_RVL
|
||||
#ifdef HW_DOL
|
||||
void dvd_motor_off( )
|
||||
{
|
||||
|
||||
@ -143,7 +144,7 @@ void dvd_motor_off( )
|
||||
* Detect the DVD Drive Type
|
||||
*
|
||||
****************************************************************************/
|
||||
#ifndef HW_RVL
|
||||
#ifdef HW_DOL
|
||||
void dvd_drive_detect()
|
||||
{
|
||||
/*dvd[0] = 0x2e;
|
||||
|
@ -455,6 +455,11 @@ void ConfigureJoypads ()
|
||||
sprintf (padmenu[1], "Port 2: GAMEPAD");
|
||||
max_players ++;
|
||||
}
|
||||
else if (input.system[0] == SYSTEM_MOUSE)
|
||||
{
|
||||
sprintf (padmenu[0], "Port 1: MOUSE");
|
||||
max_players ++;
|
||||
}
|
||||
else if (input.system[1] == SYSTEM_WAYPLAY)
|
||||
{
|
||||
sprintf (padmenu[1], "Port 2: 4-WAYPLAY");
|
||||
@ -472,7 +477,7 @@ void ConfigureJoypads ()
|
||||
else if (input.system[1] == SYSTEM_JUSTIFIER)
|
||||
{
|
||||
sprintf (padmenu[1], "Port 2: JUSTIFIERS");
|
||||
max_players += 1;
|
||||
max_players += 2;
|
||||
}
|
||||
else
|
||||
sprintf (padmenu[1], "Port 2: NONE");
|
||||
@ -526,11 +531,10 @@ void ConfigureJoypads ()
|
||||
break;
|
||||
}
|
||||
input.system[0] ++;
|
||||
if (input.system[0] == SYSTEM_MENACER) input.system[0] ++;
|
||||
if (input.system[0] == SYSTEM_JUSTIFIER) input.system[0] ++;
|
||||
|
||||
if (input.system[0] == SYSTEM_WAYPLAY) input.system[1] = SYSTEM_WAYPLAY;
|
||||
if (input.system[0] > SYSTEM_WAYPLAY)
|
||||
if (input.system[0] == SYSTEM_MENACER) input.system[0] = SYSTEM_TEAMPLAYER;
|
||||
else if ((input.system[0] == SYSTEM_MOUSE) && (input.system[1] == SYSTEM_MOUSE)) input.system[1] ++;
|
||||
else if (input.system[0] == SYSTEM_WAYPLAY) input.system[1] = SYSTEM_WAYPLAY;
|
||||
else if (input.system[0] > SYSTEM_WAYPLAY)
|
||||
{
|
||||
input.system[0] = NO_SYSTEM;
|
||||
input.system[1] = SYSTEM_GAMEPAD;
|
||||
@ -544,9 +548,9 @@ void ConfigureJoypads ()
|
||||
break;
|
||||
}
|
||||
input.system[1] ++;
|
||||
if (input.system[1] == SYSTEM_MOUSE) input.system[0] ++;
|
||||
if (input.system[1] == SYSTEM_WAYPLAY) input.system[0] = SYSTEM_WAYPLAY;
|
||||
if (input.system[1] > SYSTEM_WAYPLAY)
|
||||
if ((input.system[1] == SYSTEM_MOUSE) && (input.system[0] == SYSTEM_MOUSE)) input.system[0] ++;
|
||||
else if (input.system[1] == SYSTEM_WAYPLAY) input.system[0] = SYSTEM_WAYPLAY;
|
||||
else if (input.system[1] > SYSTEM_WAYPLAY)
|
||||
{
|
||||
input.system[1] = NO_SYSTEM;
|
||||
input.system[0] = SYSTEM_GAMEPAD;
|
||||
@ -576,7 +580,7 @@ void ConfigureJoypads ()
|
||||
|
||||
case 5:
|
||||
#ifdef HW_RVL
|
||||
if (config.input[player].device == 1)
|
||||
if (config.input[player].device > 0)
|
||||
{
|
||||
config.input[player].port ++;
|
||||
}
|
||||
@ -592,7 +596,58 @@ void ConfigureJoypads ()
|
||||
if (config.input[player].port<4)
|
||||
{
|
||||
WPAD_Probe(config.input[player].port,&exp);
|
||||
if ((exp == WPAD_EXP_NONE) && (config.input[player].port == (player % 4))) exp = WPAD_EXP_CLASSIC;
|
||||
if (exp == WPAD_EXP_NUNCHUK) exp = 4;
|
||||
}
|
||||
|
||||
while ((config.input[player].port<4) && (exp == 4))
|
||||
{
|
||||
config.input[player].port ++;
|
||||
if (config.input[player].port<4)
|
||||
{
|
||||
exp = 4;
|
||||
WPAD_Probe(config.input[player].port,&exp);
|
||||
if (exp == WPAD_EXP_NUNCHUK) exp = 4;
|
||||
}
|
||||
}
|
||||
|
||||
if (config.input[player].port >= 4)
|
||||
{
|
||||
config.input[player].port = 0;
|
||||
config.input[player].device = 2;
|
||||
}
|
||||
}
|
||||
|
||||
if (config.input[player].device == 2)
|
||||
{
|
||||
exp = 4;
|
||||
if (config.input[player].port<4)
|
||||
{
|
||||
WPAD_Probe(config.input[player].port,&exp);
|
||||
}
|
||||
|
||||
while ((config.input[player].port<4) && (exp != WPAD_EXP_NUNCHUK))
|
||||
{
|
||||
config.input[player].port ++;
|
||||
if (config.input[player].port<4)
|
||||
{
|
||||
exp = 4;
|
||||
WPAD_Probe(config.input[player].port,&exp);
|
||||
}
|
||||
}
|
||||
|
||||
if (config.input[player].port >= 4)
|
||||
{
|
||||
config.input[player].port = 0;
|
||||
config.input[player].device = 3;
|
||||
}
|
||||
}
|
||||
|
||||
if (config.input[player].device == 3)
|
||||
{
|
||||
exp = 4;
|
||||
if (config.input[player].port<4)
|
||||
{
|
||||
WPAD_Probe(config.input[player].port,&exp);
|
||||
}
|
||||
|
||||
while ((config.input[player].port<4) && (exp != WPAD_EXP_CLASSIC))
|
||||
@ -602,41 +657,17 @@ void ConfigureJoypads ()
|
||||
{
|
||||
exp = 4;
|
||||
WPAD_Probe(config.input[player].port,&exp);
|
||||
if ((exp == WPAD_EXP_NONE) && (config.input[player].port == (player % 4))) exp = WPAD_EXP_CLASSIC;
|
||||
}
|
||||
}
|
||||
|
||||
if (config.input[player].port >= 4)
|
||||
{
|
||||
config.input[player].port = player % 4;
|
||||
config.input[player].device = 2;
|
||||
config.input[player].device = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (config.input[player].device == 2)
|
||||
{
|
||||
exp = 4;
|
||||
WPAD_Probe(config.input[player].port,&exp);
|
||||
if (exp != WPAD_EXP_NUNCHUK) config.input[player].device ++;
|
||||
}
|
||||
|
||||
if (config.input[player].device == 3)
|
||||
{
|
||||
exp = 4;
|
||||
WPAD_Probe(config.input[player].port,&exp);
|
||||
if (exp != WPAD_EXP_CLASSIC) config.input[player].device ++;
|
||||
}
|
||||
|
||||
if (config.input[player].device > 3)
|
||||
{
|
||||
config.input[player].device = 0;
|
||||
}
|
||||
#else
|
||||
config.input[player].device ++;
|
||||
if (config.input[player].device > 0)
|
||||
{
|
||||
config.input[player].device = 0;
|
||||
}
|
||||
config.input[player].device = 0;
|
||||
#endif
|
||||
break;
|
||||
|
||||
|
@ -223,7 +223,7 @@ static void pad_update(s8 num, u8 i)
|
||||
{
|
||||
input.analog[2][0] = x * 2;
|
||||
input.analog[2][1] = y * 2;
|
||||
if (config.invert_mouse) input.analog[2][1] = 0 - input.analog[2][1];
|
||||
if (!config.invert_mouse) input.analog[2][1] = 0 - input.analog[2][1];
|
||||
}
|
||||
|
||||
/* GAMEPAD directional buttons */
|
||||
@ -485,7 +485,7 @@ static void wpad_update(s8 num, u8 i, u32 exp)
|
||||
/* analog stick */
|
||||
input.analog[2][0] = x * 2;
|
||||
input.analog[2][1] = y * 2;
|
||||
if (config.invert_mouse) input.analog[2][1] = 0 - input.analog[2][1];
|
||||
if (!config.invert_mouse) input.analog[2][1] = 0 - input.analog[2][1];
|
||||
}
|
||||
|
||||
/* GAMEPAD directional buttons */
|
||||
|
Loading…
Reference in New Issue
Block a user