mirror of
https://github.com/ekeeke/Genesis-Plus-GX.git
synced 2024-11-04 18:05:06 +01:00
added sega mouse support, fixed banked EEPROM access
This commit is contained in:
parent
ea3cdd015f
commit
09657296d4
20
history.txt
20
history.txt
@ -4,20 +4,20 @@ Genesis Plus for Gamecube
|
||||
current:
|
||||
---------
|
||||
[Genesis]
|
||||
- "cycle-accurate" HINT timings: every timing sensitive games/demos are now *finally* working fine
|
||||
- fixed CRAM/VSRAM DMA timings
|
||||
- fixed SAT address mask on VRAM writes
|
||||
- improved accuracy of 68k access to Z80: fix music in Pacman 2 when entering PAUSE menu
|
||||
- disabled "Address Error" emulation when UMK3 hack is loaded: fix game crashing after a round ends up
|
||||
- added support for some additional protected "pirate" games: Pocket Monster, King of Fighter 98, Soul Blade (credits to Haze)
|
||||
- improved overall Menacer emulation accuracy
|
||||
- fixed Menacer support in Terminator 2: Arcade Game
|
||||
- added Konami Justifier emulation: fix lightgun support in Lethal Enforcers 1 & 2
|
||||
- (YM2612) fixed LFO phase update for CH3 special mode in MAME core: fix some SFX in Warlock & Alladin (thanks to AamirM)
|
||||
- (YM2612) fixed enveloppe attenuation level on "KEY ON" in MAME core: fix Ecco 2's splash sound
|
||||
- implemented cycle-accurate HINT timings: every timing sensitive games/demos are now *finally* working fine
|
||||
- fixed a bug affecting CRAM/VSRAM DMA timings
|
||||
- fixed Sprite Attribute Table address mask for VRAM writes
|
||||
- improved accuracy of 68k access to Z80: fix music in Pacman 2 when entering PAUSE menu
|
||||
- disabled "Address Error" emulation when UMK3 hack is loaded: fix game crashing after a round ends up
|
||||
- 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
|
||||
|
||||
[Wii]
|
||||
- added Wiimote IR pointing for LightGun control (Menacer/Justifier)
|
||||
- added Wiimote IR support for lightgun (Menacer/Justifier) controls
|
||||
|
||||
16/07/2008:
|
||||
-----------
|
||||
|
@ -198,8 +198,7 @@ void cart_hw_init()
|
||||
SVP CHIP
|
||||
***********************************************/
|
||||
svp = NULL;
|
||||
if ((strstr(rominfo.product,"MK-1229") != NULL) ||
|
||||
(strstr(rominfo.product,"G-7001") != NULL))
|
||||
if (strstr(rominfo.international,"Virtua Racing") != NULL)
|
||||
{
|
||||
svp_init();
|
||||
m68k_readmap_16[6] = SVP_DRAM;
|
||||
@ -211,10 +210,10 @@ void cart_hw_init()
|
||||
/**********************************************
|
||||
SEGA MENACER
|
||||
***********************************************/
|
||||
input.x_offset = 0;
|
||||
input.y_offset = 0;
|
||||
input.x_offset = 0x00;
|
||||
input.y_offset = 0x00;
|
||||
|
||||
if (strstr(rominfo.product,"MK-1658") != NULL) /* Menacer 6-in-1 pack */
|
||||
if (strstr(rominfo.international,"MENACER") != NULL)
|
||||
{
|
||||
/* save current setting */
|
||||
if (old_system[0] == -1) old_system[0] = input.system[0];
|
||||
@ -222,32 +221,40 @@ void cart_hw_init()
|
||||
|
||||
input.system[0] = NO_SYSTEM;
|
||||
input.system[1] = SYSTEM_MENACER;
|
||||
|
||||
/* specific game adjustment */
|
||||
input.x_offset = 0x52;
|
||||
input.y_offset = 0x00;
|
||||
}
|
||||
else if (strstr(rominfo.product,"T-081156") != NULL) /* T2: Arcade Game */
|
||||
else if (strstr(rominfo.international,"T2 ; THE ARCADE GAME") != NULL)
|
||||
{
|
||||
input.system[0] = SYSTEM_GAMEPAD;
|
||||
input.system[1] = SYSTEM_MENACER;
|
||||
|
||||
/* specific game adjustment */
|
||||
input.x_offset = 0x84;
|
||||
input.y_offset = 8;
|
||||
input.y_offset = 0x08;
|
||||
}
|
||||
else if (strstr(rominfo.product,"T-95136") != NULL) /* Lethal Enforcers II */
|
||||
else if (strstr(rominfo.international,"BODY COUNT") != NULL)
|
||||
{
|
||||
input.system[0] = SYSTEM_GAMEPAD;
|
||||
input.system[1] = SYSTEM_JUSTIFIER;
|
||||
input.system[0] = SYSTEM_MOUSE;
|
||||
input.system[1] = SYSTEM_MENACER;
|
||||
input.x_offset = 0x44;
|
||||
input.y_offset = 0x18;
|
||||
}
|
||||
|
||||
/* specific game adjustment */
|
||||
input.x_offset = 0x18;
|
||||
}
|
||||
else if ((strstr(rominfo.product,"T-95096") != NULL) || /* Lethal Enforcers (USA,Europe) */
|
||||
(strstr(rominfo.product,"T-95073") != NULL)) /* Lethal Enforcers (J)*/
|
||||
/**********************************************
|
||||
KONAMI JUSTIFIER
|
||||
***********************************************/
|
||||
if (strstr(rominfo.international,"LETHAL ENFORCERS II") != NULL)
|
||||
{
|
||||
input.system[0] = SYSTEM_GAMEPAD;
|
||||
input.system[1] = SYSTEM_JUSTIFIER;
|
||||
input.x_offset = 0x18;
|
||||
input.y_offset = 0x00;
|
||||
}
|
||||
else if (strstr(rominfo.international,"LETHAL ENFORCERS") != NULL)
|
||||
{
|
||||
input.system[0] = SYSTEM_GAMEPAD;
|
||||
input.system[1] = SYSTEM_JUSTIFIER;
|
||||
input.x_offset = 0x00;
|
||||
input.y_offset = 0x00;
|
||||
}
|
||||
|
||||
/**********************************************
|
||||
|
@ -150,8 +150,6 @@ static inline void Detect_STOP()
|
||||
|
||||
void eeprom_write(uint32 address, uint32 value, uint32 word_access)
|
||||
{
|
||||
error("eeprom write%d 0x%x = 0x%x (0x%x)\n", 8*(1+word_access), address, value, m68k_get_reg (NULL, M68K_REG_PC));
|
||||
|
||||
/* decode SCL and SDA value */
|
||||
if (word_access)
|
||||
{
|
||||
@ -166,11 +164,11 @@ void eeprom_write(uint32 address, uint32 value, uint32 word_access)
|
||||
}
|
||||
else
|
||||
{
|
||||
if (eeprom.type.sda_in_adr == address) eeprom.sda = (value >> eeprom.type.sda_in_bit) & 1;
|
||||
else eeprom.sda = eeprom.old_sda;
|
||||
if (eeprom.type.sda_in_adr == address) eeprom.sda = (value >> eeprom.type.sda_in_bit) & 1;
|
||||
else eeprom.sda = eeprom.old_sda;
|
||||
|
||||
if (eeprom.type.scl_adr == address) eeprom.scl = (value >> eeprom.type.scl_bit) & 1;
|
||||
else eeprom.scl = eeprom.old_scl;
|
||||
if (eeprom.type.scl_adr == address) eeprom.scl = (value >> eeprom.type.scl_bit) & 1;
|
||||
else eeprom.scl = eeprom.old_scl;
|
||||
}
|
||||
|
||||
/* EEPROM current state */
|
||||
@ -418,7 +416,6 @@ void eeprom_write(uint32 address, uint32 value, uint32 word_access)
|
||||
|
||||
uint32 eeprom_read(uint32 address, uint32 word_access)
|
||||
{
|
||||
error("eeprom read%d 0x%x (0x%x)\n", 8*(1+word_access), address, m68k_get_reg (NULL, M68K_REG_PC));
|
||||
uint8 sda_out = eeprom.sda;
|
||||
|
||||
/* EEPROM state */
|
||||
|
126
source/input.c
126
source/input.c
@ -89,7 +89,6 @@ static inline void lightgun_update(int num)
|
||||
else
|
||||
hc_latch = hc_256[(input.analog[num][0] / 2 + input.x_offset)%171];
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -97,10 +96,10 @@ static inline void lightgun_update(int num)
|
||||
unsigned int menacer_read()
|
||||
{
|
||||
int retval = 0x70;
|
||||
if ((input.pad[4] & INPUT_B)) retval |= 0x01;
|
||||
if ((input.pad[4] & INPUT_A)) retval |= 0x02;
|
||||
if ((input.pad[4] & INPUT_C)) retval |= 0x04;
|
||||
if ((input.pad[4] & INPUT_START)) retval |= 0x08;
|
||||
if (input.pad[4] & INPUT_B) retval |= 0x01;
|
||||
if (input.pad[4] & INPUT_A) retval |= 0x02;
|
||||
if (input.pad[4] & INPUT_C) retval |= 0x04;
|
||||
if (input.pad[4] & INPUT_START) retval |= 0x08;
|
||||
|
||||
return retval;
|
||||
}
|
||||
@ -118,13 +117,13 @@ unsigned int justifier_read()
|
||||
return 0x30;
|
||||
|
||||
case 0x00: /* gun #1 enabled */
|
||||
if ((input.pad[4] & INPUT_A)) retval &= ~0x01;
|
||||
if ((input.pad[4] & INPUT_START)) retval &= ~0x02;
|
||||
if (input.pad[4] & INPUT_A) retval &= ~0x01;
|
||||
if (input.pad[4] & INPUT_START) retval &= ~0x02;
|
||||
return retval;
|
||||
|
||||
case 0x20: /* gun #2 enabled */
|
||||
if ((input.pad[5] & INPUT_A)) retval &= ~0x01;
|
||||
if ((input.pad[5] & INPUT_START)) retval &= ~0x02;
|
||||
if (input.pad[5] & INPUT_A) retval &= ~0x01;
|
||||
if (input.pad[5] & INPUT_START) retval &= ~0x02;
|
||||
return retval;
|
||||
|
||||
default: /* guns disabled */
|
||||
@ -132,6 +131,108 @@ unsigned int justifier_read()
|
||||
}
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
* SEGA MOUSE specific functions
|
||||
*
|
||||
*****************************************************************************/
|
||||
struct mega_mouse
|
||||
{
|
||||
uint8 State;
|
||||
uint8 Counter;
|
||||
} mouse;
|
||||
|
||||
static inline void mouse_reset()
|
||||
{
|
||||
mouse.State = 0x60;
|
||||
mouse.Counter = 0;
|
||||
}
|
||||
|
||||
void mouse_write(unsigned int data)
|
||||
{
|
||||
if (mouse.Counter == 0)
|
||||
{
|
||||
/* TH 1->0 transition */
|
||||
if ((mouse.State&0x40) && !(data&0x40))
|
||||
{
|
||||
/* start acquisition */
|
||||
mouse.Counter = 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* TR transition */
|
||||
if ((mouse.State&0x20) != (data&0x20))
|
||||
{
|
||||
mouse.Counter ++; /* increment phase */
|
||||
if (mouse.Counter > 9) mouse.Counter = 9;
|
||||
}
|
||||
}
|
||||
|
||||
/* end of acquisition (TH=1) */
|
||||
if (data&0x40) mouse.Counter = 0;
|
||||
|
||||
/* update internal state */
|
||||
mouse.State = data;
|
||||
}
|
||||
|
||||
unsigned int mouse_read()
|
||||
{
|
||||
int temp = 0x00;
|
||||
|
||||
switch (mouse.Counter)
|
||||
{
|
||||
case 0: /* initial */
|
||||
temp = 0x00;
|
||||
break;
|
||||
|
||||
case 1: /* xxxx1011 */
|
||||
temp = 0x0B;
|
||||
break;
|
||||
|
||||
case 2: /* xxxx1111 */
|
||||
temp = 0x0F;
|
||||
break;
|
||||
|
||||
case 3: /* xxxx1111 */
|
||||
temp = 0x0F;
|
||||
break;
|
||||
|
||||
case 4: /* Axis sign and overflow */
|
||||
if (input.analog[2][0] < 0) temp |= 0x01;
|
||||
if (input.analog[2][1] < 0) temp |= 0x02;
|
||||
break;
|
||||
|
||||
case 5: /* Buttons state */
|
||||
if (input.pad[0] & INPUT_B) temp |= 0x01;
|
||||
if (input.pad[0] & INPUT_A) temp |= 0x02;
|
||||
if (input.pad[0] & INPUT_C) temp |= 0x04;
|
||||
if (input.pad[0] & INPUT_START) temp |= 0x08;
|
||||
break;
|
||||
|
||||
case 6: /* X Axis MSB */
|
||||
temp = (input.analog[2][0] >> 4) & 0x0f;
|
||||
break;
|
||||
|
||||
case 7: /* X Axis LSB */
|
||||
temp = (input.analog[2][0] & 0x0f);
|
||||
break;
|
||||
|
||||
case 8: /* Y Axis MSB */
|
||||
temp = (input.analog[2][1] >> 4) & 0x0f;
|
||||
break;
|
||||
|
||||
case 9: /* Y Axis LSB */
|
||||
temp = (input.analog[2][1] & 0x0f);
|
||||
break;
|
||||
}
|
||||
|
||||
/* TR-TL handshaking */
|
||||
if (mouse.State & 0x20) temp |= 0x10;
|
||||
|
||||
return temp;
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* GAMEPAD specific functions (2PLAYERS/4WAYPLAY)
|
||||
*
|
||||
@ -519,6 +620,13 @@ void input_reset ()
|
||||
gamepad_reset(i*4);
|
||||
break;
|
||||
|
||||
case SYSTEM_MOUSE:
|
||||
if (input.max == MAX_INPUTS) return;
|
||||
input.dev[i*4] = DEVICE_MOUSE;
|
||||
input.max ++;
|
||||
mouse_reset();
|
||||
break;
|
||||
|
||||
case SYSTEM_WAYPLAY:
|
||||
for (j=i*4; j< i*4+4; j++)
|
||||
{
|
||||
|
@ -24,20 +24,14 @@
|
||||
#ifndef _INPUT_HW_H_
|
||||
#define _INPUT_HW_H_
|
||||
|
||||
/* Available inputs */
|
||||
#ifdef HW_DOL
|
||||
#define MAX_INPUTS 4
|
||||
#else
|
||||
#define MAX_INPUTS 8
|
||||
#endif
|
||||
|
||||
/* Input devices */
|
||||
/* Max. number of devices */
|
||||
#define MAX_DEVICES (8)
|
||||
|
||||
/* Device types */
|
||||
#define DEVICE_3BUTTON (0x00) /* 3-button gamepad */
|
||||
#define DEVICE_6BUTTON (0x01) /* 6-button gamepad */
|
||||
#define DEVICE_LIGHTGUN (0x02) /* Sega Menacer */
|
||||
#define DEVICE_MOUSE (0x03) /* Sega Mouse (not supported) */
|
||||
#define DEVICE_LIGHTGUN (0x02) /* Sega Menacer or Konami Justifier */
|
||||
#define DEVICE_MOUSE (0x03) /* Sega Mouse */
|
||||
#define DEVICE_2BUTTON (0x04) /* 2-button gamepad (not supported) */
|
||||
#define NO_DEVICE (0x0F) /* unconnected */
|
||||
|
||||
@ -55,13 +49,14 @@
|
||||
#define INPUT_DOWN (0x00000002)
|
||||
#define INPUT_UP (0x00000001)
|
||||
|
||||
/* System bitmasks */
|
||||
/* System IO ports */
|
||||
#define NO_SYSTEM (0) /* Unconnected Port*/
|
||||
#define SYSTEM_GAMEPAD (1) /* Single Gamepad */
|
||||
#define SYSTEM_MENACER (2) /* Sega Lightgun */
|
||||
#define SYSTEM_JUSTIFIER (3) /* Konami Lightgun */
|
||||
#define SYSTEM_TEAMPLAYER (4) /* Sega TeamPlayer */
|
||||
#define SYSTEM_WAYPLAY (5) /* EA 4-Way Play (use both ports) */
|
||||
#define SYSTEM_MOUSE (2) /* Sega Mouse */
|
||||
#define SYSTEM_MENACER (3) /* Sega Menacer (port 2) */
|
||||
#define SYSTEM_JUSTIFIER (4) /* Konami Justifier (port 2) */
|
||||
#define SYSTEM_TEAMPLAYER (5) /* Sega TeamPlayer */
|
||||
#define SYSTEM_WAYPLAY (6) /* EA 4-Way Play (use both ports) */
|
||||
|
||||
/* Players Inputs */
|
||||
#define PLAYER_1A (0)
|
||||
@ -81,7 +76,7 @@ typedef struct
|
||||
uint8 system[2]; /* Can be any of the SYSTEM_* bitmasks */
|
||||
uint8 max; /* maximum number of connected devices */
|
||||
uint8 current; /* current PAD number (4WAYPLAY) */
|
||||
int analog[2][2]; /* analog device */
|
||||
int analog[3][2]; /* analog devices */
|
||||
int x_offset;
|
||||
int y_offset;
|
||||
} t_input;
|
||||
@ -95,6 +90,8 @@ extern void input_update(void);
|
||||
extern void input_raz(void);
|
||||
|
||||
/* Peripherals specific */
|
||||
extern void mouse_write(unsigned int data);
|
||||
extern unsigned int mouse_read(void);
|
||||
extern unsigned int menacer_read (void);
|
||||
extern unsigned int justifier_read (void);
|
||||
extern unsigned int gamepad_1_read (void);
|
||||
|
@ -60,6 +60,11 @@ void io_reset(void)
|
||||
port[0].data_r = gamepad_1_read;
|
||||
break;
|
||||
|
||||
case SYSTEM_MOUSE:
|
||||
port[0].data_w = mouse_write;
|
||||
port[0].data_r = mouse_read;
|
||||
break;
|
||||
|
||||
case SYSTEM_WAYPLAY:
|
||||
port[0].data_w = wayplay_1_write;
|
||||
port[0].data_r = wayplay_1_read;
|
||||
|
@ -213,9 +213,9 @@ void z80_write_banked_memory (unsigned int address, unsigned int data)
|
||||
if (address <= sram.end) WRITE_BYTE(sram.sram, address - sram.start, data);
|
||||
else z80bank_unused_w(address, data);
|
||||
return;
|
||||
|
||||
case EEPROM:
|
||||
if ((address == eeprom.type.sda_in_adr) || (address == eeprom.type.scl_adr)) eeprom_write(address, data);
|
||||
|
||||
case EEPROM:
|
||||
if ((address == eeprom.type.sda_in_adr) || (address == eeprom.type.scl_adr)) eeprom_write(address, data, 0);
|
||||
else z80bank_unused_w(address, data);
|
||||
return;
|
||||
|
||||
@ -345,7 +345,7 @@ unsigned int z80_read_banked_memory(unsigned int address)
|
||||
return READ_BYTE(rom_readmap[offset], address & 0x7ffff);
|
||||
|
||||
case EEPROM:
|
||||
if (address == eeprom.type.sda_out_adr) return eeprom_read(address);
|
||||
if (address == eeprom.type.sda_out_adr) return eeprom_read(address, 0);
|
||||
return READ_BYTE(rom_readmap[offset], address & 0x7ffff);
|
||||
|
||||
case CART_HW:
|
||||
|
@ -36,7 +36,7 @@ unsigned int vdp_dma_r(unsigned int address)
|
||||
case UMK3_HACK:
|
||||
return *(uint16 *)(&cart_rom[offset << 19] + (address & 0x7ffff));
|
||||
|
||||
case SVP_DRAM:
|
||||
case SVP_DRAM:
|
||||
address -= 2;
|
||||
return *(uint16 *)(svp->dram + (address & 0x1fffe));
|
||||
|
||||
@ -79,14 +79,13 @@ unsigned int vdp_dma_r(unsigned int address)
|
||||
case SRAM:
|
||||
if (address <= sram.end) return *(uint16 *)(sram.sram + (address - sram.start));
|
||||
return *(uint16 *)(rom_readmap[address >> 19] + (address & 0x7ffff));
|
||||
|
||||
|
||||
case EEPROM:
|
||||
if (address == eeprom.type.sda_out_adr) return eeprom_read(address);
|
||||
if (address == (eeprom.type.sda_out_adr & 0xfffffe)) return eeprom_read(address, 1);
|
||||
return *(uint16 *)(rom_readmap[address >> 19] + (address & 0x7ffff));
|
||||
|
||||
case J_CART:
|
||||
if (address == eeprom.type.sda_out_adr) return eeprom_read(address); /* some games also have EEPROM mapped here */
|
||||
else return jcart_read();
|
||||
return jcart_read();
|
||||
|
||||
default:
|
||||
return *(uint16 *)(work_ram + (address & 0xffff));
|
||||
|
@ -63,6 +63,7 @@ void set_config_defaults(void)
|
||||
|
||||
/* controllers options */
|
||||
ogc_input__set_defaults();
|
||||
config.crosshair = 0;
|
||||
config.gun_cursor = 1;
|
||||
config.invert_mouse = 1;
|
||||
}
|
||||
|
||||
|
@ -30,7 +30,8 @@ typedef struct
|
||||
uint16 pad_keymap[4][MAX_KEYS];
|
||||
uint32 wpad_keymap[4*3][MAX_KEYS];
|
||||
t_input_config input[MAX_DEVICES];
|
||||
uint8 crosshair;
|
||||
uint8 gun_cursor;
|
||||
uint8 invert_mouse;
|
||||
} t_config;
|
||||
|
||||
extern t_config config;
|
||||
|
@ -413,7 +413,7 @@ void ConfigureJoypads ()
|
||||
int i = 0;
|
||||
int quit = 0;
|
||||
int prevmenu = menu;
|
||||
char padmenu[7][20];
|
||||
char padmenu[8][20];
|
||||
|
||||
int player = 0;
|
||||
#ifdef HW_RVL
|
||||
@ -432,6 +432,11 @@ void ConfigureJoypads ()
|
||||
sprintf (padmenu[0], "Port 1: GAMEPAD");
|
||||
max_players ++;
|
||||
}
|
||||
else if (input.system[0] == SYSTEM_MOUSE)
|
||||
{
|
||||
sprintf (padmenu[0], "Port 1: MOUSE");
|
||||
max_players ++;
|
||||
}
|
||||
else if (input.system[0] == SYSTEM_WAYPLAY)
|
||||
{
|
||||
sprintf (padmenu[0], "Port 1: 4-WAYPLAY");
|
||||
@ -487,29 +492,30 @@ void ConfigureJoypads ()
|
||||
player = 0;
|
||||
}
|
||||
|
||||
sprintf (padmenu[2], "Gun Cursor: %s", config.crosshair ? " ON":"OFF");
|
||||
sprintf (padmenu[3], "Set Player: %d%s", player + 1, (j_cart && (player > 1)) ? "-JCART" : "");
|
||||
sprintf (padmenu[2], "Gun Cursor: %s", config.gun_cursor ? "Y":"N");
|
||||
sprintf (padmenu[3], "Invert Mouse: %s", config.gun_cursor ? "Y":"N");
|
||||
sprintf (padmenu[4], "Set Player: %d%s", player + 1, (j_cart && (player > 1)) ? "-JCART" : "");
|
||||
|
||||
if (config.input[player].device == 0)
|
||||
sprintf (padmenu[4], "Device: GAMECUBE %d", config.input[player].port + 1);
|
||||
sprintf (padmenu[5], "Device: GAMECUBE %d", config.input[player].port + 1);
|
||||
#ifdef HW_RVL
|
||||
else if (config.input[player].device == 1)
|
||||
sprintf (padmenu[4], "Device: WIIMOTE %d", config.input[player].port + 1);
|
||||
sprintf (padmenu[5], "Device: WIIMOTE %d", config.input[player].port + 1);
|
||||
else if (config.input[player].device == 2)
|
||||
sprintf (padmenu[4], "Device: NUNCHUK %d", config.input[player].port + 1);
|
||||
sprintf (padmenu[5], "Device: NUNCHUK %d", config.input[player].port + 1);
|
||||
else if (config.input[player].device == 3)
|
||||
sprintf (padmenu[4], "Device: CLASSIC %d", config.input[player].port + 1);
|
||||
sprintf (padmenu[5], "Device: CLASSIC %d", config.input[player].port + 1);
|
||||
#endif
|
||||
else
|
||||
sprintf (padmenu[4], "Device: NONE");
|
||||
sprintf (padmenu[5], "Device: NONE");
|
||||
|
||||
/* when using wiimote, force to 3Buttons pad */
|
||||
if (config.input[player].device == 1) input.padtype[player] = DEVICE_3BUTTON;
|
||||
sprintf (padmenu[5], "%s", (input.padtype[player] == DEVICE_3BUTTON) ? "Type: 3BUTTONS":"Type: 6BUTTONS");
|
||||
sprintf (padmenu[6], "%s", (input.padtype[player] == DEVICE_3BUTTON) ? "Type: 3BUTTONS":"Type: 6BUTTONS");
|
||||
|
||||
sprintf (padmenu[6], "Configure Input");
|
||||
sprintf (padmenu[7], "Configure Input");
|
||||
|
||||
ret = domenu (&padmenu[0], 7,0);
|
||||
ret = domenu (&padmenu[0], 8,0);
|
||||
|
||||
switch (ret)
|
||||
{
|
||||
@ -538,6 +544,7 @@ 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)
|
||||
{
|
||||
@ -547,10 +554,14 @@ void ConfigureJoypads ()
|
||||
break;
|
||||
|
||||
case 2:
|
||||
config.crosshair ^= 1;
|
||||
config.gun_cursor ^= 1;
|
||||
break;
|
||||
|
||||
case 3:
|
||||
config.invert_mouse ^= 1;
|
||||
break;
|
||||
|
||||
case 4:
|
||||
/* remove duplicate assigned inputs */
|
||||
for (i=0; i<8; i++)
|
||||
{
|
||||
@ -563,7 +574,7 @@ void ConfigureJoypads ()
|
||||
player = (player + 1) % max_players;
|
||||
break;
|
||||
|
||||
case 4:
|
||||
case 5:
|
||||
#ifdef HW_RVL
|
||||
if (config.input[player].device == 1)
|
||||
{
|
||||
@ -622,19 +633,19 @@ void ConfigureJoypads ()
|
||||
}
|
||||
#else
|
||||
config.input[player].device ++;
|
||||
if (config.input[player].device > 3)
|
||||
if (config.input[player].device > 0)
|
||||
{
|
||||
config.input[player].device = 0;
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
|
||||
case 5:
|
||||
case 6:
|
||||
if (config.input[player].device == 1) break;
|
||||
input.padtype[player] ^= 1;
|
||||
break;
|
||||
|
||||
case 6:
|
||||
case 7:
|
||||
ogc_input__config(config.input[player].port, config.input[player].device, input.padtype[player]);
|
||||
break;
|
||||
|
||||
|
@ -166,13 +166,8 @@ static void pad_update(s8 num, u8 i)
|
||||
s8 x = PAD_StickX (num);
|
||||
s8 y = PAD_StickY (num);
|
||||
u16 p = PAD_ButtonsHeld(num);
|
||||
|
||||
/* update keys */
|
||||
if ((p & PAD_BUTTON_UP) || (y > 70)) input.pad[i] |= INPUT_UP;
|
||||
else if ((p & PAD_BUTTON_DOWN) || (y < -70)) input.pad[i] |= INPUT_DOWN;
|
||||
if ((p & PAD_BUTTON_LEFT) || (x < -60)) input.pad[i] |= INPUT_LEFT;
|
||||
else if ((p & PAD_BUTTON_RIGHT) || (x > 60)) input.pad[i] |= INPUT_RIGHT;
|
||||
|
||||
u8 sensitivity = 60;
|
||||
|
||||
/* get current key config */
|
||||
u16 pad_keymap[MAX_KEYS];
|
||||
memcpy(pad_keymap, config.pad_keymap[num], MAX_KEYS * sizeof(u16));
|
||||
@ -201,40 +196,44 @@ static void pad_update(s8 num, u8 i)
|
||||
ConfigRequested = 1;
|
||||
}
|
||||
|
||||
int temp;
|
||||
/* LIGHTGUN screen position (x,y) */
|
||||
if (input.dev[i] == DEVICE_LIGHTGUN)
|
||||
{
|
||||
temp = input.analog[i-4][0];
|
||||
if ((input.pad[i] & INPUT_RIGHT)) temp ++;
|
||||
else if ((input.pad[i] & INPUT_LEFT)) temp --;
|
||||
if (temp < 0) temp = 0;
|
||||
else if (temp > bitmap.viewport.w) temp = bitmap.viewport.w;
|
||||
input.analog[i-4][0] = temp;
|
||||
|
||||
temp = input.analog[i-4][1];
|
||||
if ((input.pad[i] & INPUT_UP)) temp --;
|
||||
if ((input.pad[i] & INPUT_DOWN)) temp ++;
|
||||
if (temp < 0) temp = 0;
|
||||
else if (temp > bitmap.viewport.h) temp = bitmap.viewport.h;
|
||||
input.analog[i-4][1] = temp;
|
||||
}
|
||||
else if ((system_hw == SYSTEM_PICO) && (i == 0))
|
||||
{
|
||||
temp = input.analog[0][0];
|
||||
if ((input.pad[i] & INPUT_RIGHT)) temp ++;
|
||||
else if ((input.pad[i] & INPUT_LEFT)) temp --;
|
||||
if (temp < 0x17c) temp = 0x17c;
|
||||
else if (temp > 0x3c) temp = 0x3c;
|
||||
input.analog[0][0] = temp;
|
||||
|
||||
temp = input.analog[0][1];
|
||||
if ((input.pad[i] & INPUT_UP)) temp --;
|
||||
if ((input.pad[i] & INPUT_DOWN)) temp ++;
|
||||
if (temp < 0x1fc) temp = 0x1fc;
|
||||
else if (temp > 0x3f3) temp = 0x3f3;
|
||||
input.analog[0][1] = temp;
|
||||
input.analog[i-4][0] += x / sensitivity;
|
||||
input.analog[i-4][1] += y / sensitivity;
|
||||
if (input.analog[i-4][0] < 0) input.analog[i-4][0] = 0;
|
||||
else if (input.analog[i-4][0] > bitmap.viewport.w) input.analog[i-4][0] = bitmap.viewport.w;
|
||||
if (input.analog[i-4][1] < 0) input.analog[i-4][1] = 0;
|
||||
else if (input.analog[i-4][1] > bitmap.viewport.h) input.analog[i-4][1] = bitmap.viewport.h;
|
||||
}
|
||||
|
||||
/* PEN tablet position (x,y) */
|
||||
else if ((system_hw == SYSTEM_PICO) && (i == 0))
|
||||
{
|
||||
input.analog[0][0] += x / sensitivity;
|
||||
input.analog[0][1] += y / sensitivity;
|
||||
if (input.analog[0][0] < 0x17c) input.analog[0][0] = 0x17c;
|
||||
else if (input.analog[0][0] > 0x3c) input.analog[0][0] = 0x3c;
|
||||
if (input.analog[0][1] < 0x1fc) input.analog[0][1] = 0x1fc;
|
||||
else if (input.analog[0][1] > 0x3f3) input.analog[0][1] = 0x3f3;
|
||||
}
|
||||
|
||||
/* MOUSE quantity of movement (-256,256) */
|
||||
else if (input.dev[i] == DEVICE_MOUSE)
|
||||
{
|
||||
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];
|
||||
}
|
||||
|
||||
/* GAMEPAD directional buttons */
|
||||
else
|
||||
{
|
||||
if ((p & PAD_BUTTON_UP) || (y > sensitivity)) input.pad[i] |= INPUT_UP;
|
||||
else if ((p & PAD_BUTTON_DOWN) || (y < -sensitivity)) input.pad[i] |= INPUT_DOWN;
|
||||
if ((p & PAD_BUTTON_LEFT) || (x < -sensitivity)) input.pad[i] |= INPUT_LEFT;
|
||||
else if ((p & PAD_BUTTON_RIGHT) || (x > sensitivity)) input.pad[i] |= INPUT_RIGHT;
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************
|
||||
@ -400,6 +399,7 @@ static void wpad_update(s8 num, u8 i, u32 exp)
|
||||
u32 p = WPAD_ButtonsHeld(num);
|
||||
|
||||
/* get analog sticks values */
|
||||
u8 sensitivity = 60;
|
||||
s8 x = 0;
|
||||
s8 y = 0;
|
||||
if (exp != WPAD_EXP_NONE)
|
||||
@ -408,12 +408,6 @@ static void wpad_update(s8 num, u8 i, u32 exp)
|
||||
y = WPAD_StickY(num,0);
|
||||
}
|
||||
|
||||
/* update directional key input */
|
||||
if ((p & wpad_dirmap[exp][PAD_UP]) || (y > 70)) input.pad[i] |= INPUT_UP;
|
||||
else if ((p & wpad_dirmap[exp][PAD_DOWN]) || (y < -70)) input.pad[i] |= INPUT_DOWN;
|
||||
if ((p & wpad_dirmap[exp][PAD_LEFT]) || (x < -60)) input.pad[i] |= INPUT_LEFT;
|
||||
else if ((p & wpad_dirmap[exp][PAD_RIGHT]) || (x > 60)) input.pad[i] |= INPUT_RIGHT;
|
||||
|
||||
/* retrieve current key mapping */
|
||||
u32 *wpad_keymap = config.wpad_keymap[exp + (3 * num)];
|
||||
|
||||
@ -426,29 +420,81 @@ static void wpad_update(s8 num, u8 i, u32 exp)
|
||||
if (p & wpad_keymap[KEY_BUTTONZ]) input.pad[i] |= INPUT_Z;
|
||||
if (p & wpad_keymap[KEY_START]) input.pad[i] |= INPUT_START;
|
||||
|
||||
/* MODE Button */
|
||||
if ((p & WPAD_CLASSIC_BUTTON_MINUS) || (p & WPAD_BUTTON_MINUS)) input.pad[i] |= INPUT_MODE;
|
||||
/* MODE Button (FIXED) */
|
||||
if (((exp == WPAD_EXP_CLASSIC) && (p & WPAD_CLASSIC_BUTTON_MINUS)) ||
|
||||
((exp != WPAD_EXP_CLASSIC) && (p & WPAD_BUTTON_MINUS)))
|
||||
input.pad[i] |= INPUT_MODE;
|
||||
|
||||
/* ANALOG Device (use IR pointing by default) */
|
||||
/* LIGHTGUN screen position (X,Y) */
|
||||
if (input.dev[i] == DEVICE_LIGHTGUN)
|
||||
{
|
||||
struct ir_t ir;
|
||||
WPAD_IR(num, &ir);
|
||||
if (ir.valid)
|
||||
if (x || y)
|
||||
{
|
||||
input.analog[i-4][0] = (ir.x * bitmap.viewport.w) / 640;
|
||||
input.analog[i-4][1] = (ir.y * bitmap.viewport.h) / 480;
|
||||
/* analog stick */
|
||||
input.analog[i-4][0] += x / sensitivity;
|
||||
input.analog[i-4][1] += y / sensitivity;
|
||||
if (input.analog[i-4][0] < 0) input.analog[i-4][0] = 0;
|
||||
else if (input.analog[i-4][0] > bitmap.viewport.w) input.analog[i-4][0] = bitmap.viewport.w;
|
||||
if (input.analog[i-4][1] < 0) input.analog[i-4][1] = 0;
|
||||
else if (input.analog[i-4][1] > bitmap.viewport.h) input.analog[i-4][1] = bitmap.viewport.h;
|
||||
}
|
||||
|
||||
if (exp != WPAD_EXP_CLASSIC)
|
||||
{
|
||||
/* wiimote IR */
|
||||
struct ir_t ir;
|
||||
WPAD_IR(num, &ir);
|
||||
if (ir.valid)
|
||||
{
|
||||
input.analog[i-4][0] = (ir.x * bitmap.viewport.w) / 640;
|
||||
input.analog[i-4][1] = (ir.y * bitmap.viewport.h) / 480;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* PEN tablet position (x,y) */
|
||||
else if ((system_hw == SYSTEM_PICO) && (i == 0))
|
||||
{
|
||||
struct ir_t ir;
|
||||
WPAD_IR(num, &ir);
|
||||
if (ir.valid)
|
||||
if (x || y)
|
||||
{
|
||||
input.analog[0][0] = 0x3c + (ir.x * (0x17c - 0x3c + 1)) / 640;
|
||||
input.analog[0][1] = 0x1fc + (ir.y * (0x3f3 - 0x1fc + 1)) / 480;
|
||||
/* analog stick */
|
||||
input.analog[0][0] += x / sensitivity;
|
||||
input.analog[0][1] += y / sensitivity;
|
||||
if (input.analog[0][0] < 0x17c) input.analog[0][0] = 0x17c;
|
||||
else if (input.analog[0][0] > 0x3c) input.analog[0][0] = 0x3c;
|
||||
if (input.analog[0][1] < 0x1fc) input.analog[0][1] = 0x1fc;
|
||||
else if (input.analog[0][1] > 0x3f3) input.analog[0][1] = 0x3f3;
|
||||
}
|
||||
|
||||
if (exp != WPAD_EXP_CLASSIC)
|
||||
{
|
||||
/* wiimote IR */
|
||||
struct ir_t ir;
|
||||
WPAD_IR(num, &ir);
|
||||
if (ir.valid)
|
||||
{
|
||||
input.analog[0][0] = 0x3c + (ir.x * (0x17c - 0x3c + 1)) / 640;
|
||||
input.analog[0][1] = 0x1fc + (ir.y * (0x3f3 - 0x1fc + 1)) / 480;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* MOUSE quantity of movement (-256,256) */
|
||||
else if (input.dev[i] == DEVICE_MOUSE)
|
||||
{
|
||||
/* 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];
|
||||
}
|
||||
|
||||
/* GAMEPAD directional buttons */
|
||||
else
|
||||
{
|
||||
if ((p & wpad_dirmap[exp][PAD_UP]) || (y > sensitivity)) input.pad[i] |= INPUT_UP;
|
||||
else if ((p & wpad_dirmap[exp][PAD_DOWN]) || (y < -sensitivity)) input.pad[i] |= INPUT_DOWN;
|
||||
if ((p & wpad_dirmap[exp][PAD_LEFT]) || (x < -sensitivity)) input.pad[i] |= INPUT_LEFT;
|
||||
else if ((p & wpad_dirmap[exp][PAD_RIGHT]) || (x > sensitivity)) input.pad[i] |= INPUT_RIGHT;
|
||||
}
|
||||
|
||||
/* SOFTRESET */
|
||||
|
@ -21,6 +21,13 @@
|
||||
#ifndef _GC_INPUT_H_
|
||||
#define _GC_INPUT_H_
|
||||
|
||||
/* max. supported inputs */
|
||||
#ifdef HW_DOL
|
||||
#define MAX_INPUTS 4
|
||||
#else
|
||||
#define MAX_INPUTS 8
|
||||
#endif
|
||||
|
||||
/* number of configurable keys */
|
||||
#define MAX_KEYS 8
|
||||
|
||||
|
@ -687,7 +687,7 @@ void render_line(int line, uint8 odd_frame)
|
||||
}
|
||||
|
||||
/* LightGun mark */
|
||||
if ((input.dev[4] == DEVICE_LIGHTGUN) && (config.crosshair))
|
||||
if ((input.dev[4] == DEVICE_LIGHTGUN) && (config.gun_cursor))
|
||||
{
|
||||
int dy = v_counter - input.analog[0][1];
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user