Fix a emulador Gens

El espacio para revivir clásicos (y no tanto) mediante emuladores. Un lugar dedicado 100% a la emulación.
Avatar de Usuario
SaturnAR
Daytona USA Player
Daytona USA Player
Mensajes: 1100
Registrado: 24/05/13 12:36
Frase: SEGA Saturn.. Shiro!
Ubicación: Arrakis
Contactar:

Fix a emulador Gens

Mensaje por SaturnAR » 03/08/18 16:37

Un cliente me mencionó que uno de mis productos no estaba funcionando correctamente con el emulador Gens. Convencido de que el error era del emulador y no de mi producto, me dispuse a revisar lo que me mencionaba. El síntoma era claro: no andan las diagonales de los joysticks USB, donde se usa el POV para dicha función (POV = Point Of View y es la típica cruceta digital que tenemos en la Genesis por ejemplo... contraria a la palanca analógica).

Efectivamente, no funcionaban las diagonales. Sólo las 4 direcciones principales (arriba, derecha, abajo, izquierda). En el Mortal Kombat estaba claro que no se podía saltar ni hacia adelante ni hacia atrás. Sólo hacia arriba. En el Sonic 3D Blast! no podía moverme en diagonal, etc.

Me dispuse entonces a ver el emulador, y como estaba el código fuente disponible... me decidí a corregir el problema, que de paso, ví mencionado infinidad de veces a lo largo de los años. Por ej:
en el FAQ del mismísimo Gens: http://www.gens.me/faq.shtml
Q : I can't get diagonals using my joypad, or diagonals have stopped working how do I fix it?

A : Several people have reported this problem and it seems to be a Gens.cfg problem. Quit Gens, find and delete your Gens.cfg file. Now restart Gens and set your joypads up again, hopefully you should now be able to get diagonals.
Totalmente erróneo. Eso no soluciona el problema. El problema está en el código del emulador.

Otro link: https://forum.rpg.net/showthread.php?53 ... oller-work

Otro más (y no jodo más): https://forums.emulator-zone.com/showthread.php?t=3410

ETC.

Entonces, mirando el código me encontré con el error:

Código original de la función int Check_Key_Pressed(unsigned int key) del archivo G_dinput.cpp):

Código: Seleccionar todo

				switch(key & 0xF)
				{
					case 1:
						if (Joy_State[Num_Joy].rgdwPOV[(key >> 4) & 3] == 0) return(1); break;

					case 2:
						if (Joy_State[Num_Joy].rgdwPOV[(key >> 4) & 3] == 9000) return(1); break;

					case 3:
						if (Joy_State[Num_Joy].rgdwPOV[(key >> 4) & 3] == 18000) return(1); break;

					case 4:
						if (Joy_State[Num_Joy].rgdwPOV[(key >> 4) & 3] == 27000) return(1); break;
				}
Lo que claramente sólo contemplaba las cuatro direcciones principales, pero no las diagonales...
Luego de modificar el código y mejorar un poco los valores numéricos por etiquetas, quedó:

Código: Seleccionar todo

				switch(key & 0xF)
				{
					case 1:
						if (Joy_State[Num_Joy].rgdwPOV[(key >> 4) & 3] == JOY_POVFORWARD_POVLEFT) return(1);
						if (Joy_State[Num_Joy].rgdwPOV[(key >> 4) & 3] == JOY_POVFORWARD) return(1);
						if (Joy_State[Num_Joy].rgdwPOV[(key >> 4) & 3] == JOY_POVFORWARD_POVRIGHT) return(1);
						break;
					case 2:
						if (Joy_State[Num_Joy].rgdwPOV[(key >> 4) & 3] == JOY_POVFORWARD_POVRIGHT) return(1);
						if (Joy_State[Num_Joy].rgdwPOV[(key >> 4) & 3] == JOY_POVRIGHT) return(1);
						if (Joy_State[Num_Joy].rgdwPOV[(key >> 4) & 3] == JOY_POVBACKWARD_POVRIGHT) return(1);
						break;

					case 3:
						if (Joy_State[Num_Joy].rgdwPOV[(key >> 4) & 3] == JOY_POVBACKWARD_POVRIGHT) return(1);
						if (Joy_State[Num_Joy].rgdwPOV[(key >> 4) & 3] == JOY_POVBACKWARD) return(1);
						if (Joy_State[Num_Joy].rgdwPOV[(key >> 4) & 3] == JOY_POVBACKWARD_POVLEFT) return(1);
						break;

					case 4:
						if (Joy_State[Num_Joy].rgdwPOV[(key >> 4) & 3] == JOY_POVBACKWARD_POVLEFT) return(1);
						if (Joy_State[Num_Joy].rgdwPOV[(key >> 4) & 3] == JOY_POVLEFT) return(1);
						if (Joy_State[Num_Joy].rgdwPOV[(key >> 4) & 3] == JOY_POVFORWARD_POVLEFT) return(1);
						break;
				}
Contemplando las diagonales... los valores fueron agregados y definidos en G_dinput.h

Código: Seleccionar todo

#define JOY_POVFORWARD 0
#define JOY_POVFORWARD_POVRIGHT 4500
#define JOY_POVRIGHT 9000
#define JOY_POVBACKWARD_POVRIGHT 13500
#define JOY_POVBACKWARD 18000
#define JOY_POVBACKWARD_POVLEFT 22500
#define JOY_POVLEFT 27000
#define JOY_POVFORWARD_POVLEFT 31500
Y recompilando el código, solucionado el problema que hace más de una década arrastraba este emulador.

Última release pública (2.14):
http://www.gens.me/downloads.shtml

Les dejo el link de descarga a la nueva versión compilada, con el fix (2.14.1):
https://mega.nz/#!fcoyWKCL!fdaUuDZmeiqE ... -uhWf9Zfo0

Avatar de Usuario
julian_pincha
Metal Gear Solid Player
Metal Gear Solid Player
Mensajes: 2996
Registrado: 26/04/15 4:50

Re: Fix a emulador Gens

Mensaje por julian_pincha » 03/08/18 16:41

Ah sos un crack SaturnAR, te pasaste.

Avatar de Usuario
Rodri3
Check Point!
Check Point!
Mensajes: 13564
Registrado: 12/01/13 10:43
Frase: #acumulacionCero?

Re: Fix a emulador Gens

Mensaje por Rodri3 » 03/08/18 16:45

Genio!
Estaba buscando a ver si tenían el código fuente publicado en un github o similar, para avisar de esto.
Encontré el sourceforge y vi que ya subiste el cambio para todo el mundo :P
Eventos en RG: Imagen | Imagen | Imagen | Imagen
Deudas Gamer:
Saldadas: Castlevania | Rockman
En curso: Batman Returns | Gun Nac

Avatar de Usuario
Diego
Oveja en el Age of Empires
Oveja en el Age of Empires
Mensajes: 6717
Registrado: 03/11/11 21:26
Frase: Winners Don't Use Drugs
Ubicación: Atarilandia

Re: Fix a emulador Gens

Mensaje por Diego » 03/08/18 17:01

Excelente!

Avatar de Usuario
ferhound
Admin
Admin
Mensajes: 23260
Registrado: 05/02/10 17:34
Frase: Never be game over
Ubicación: Capital Federal

Re: Fix a emulador Gens

Mensaje por ferhound » 03/08/18 17:10

Increible :O Aguante SEGA ;_;
--------------------------------------------------------------------------------------------------

Avatar de Usuario
Hikaru
Tetris Player
Tetris Player
Mensajes: 413
Registrado: 04/03/17 20:02

Re: Fix a emulador Gens

Mensaje por Hikaru » 03/08/18 17:24

Gracias man.

Con el kega tengo el mismo problema.
Imagen

Avatar de Usuario
SaturnAR
Daytona USA Player
Daytona USA Player
Mensajes: 1100
Registrado: 24/05/13 12:36
Frase: SEGA Saturn.. Shiro!
Ubicación: Arrakis
Contactar:

Re: Fix a emulador Gens

Mensaje por SaturnAR » 03/08/18 17:34

Gracias! Imagen
Hikaru escribió:Gracias man.

Con el kega tengo el mismo problema.
El Kega usa este código de base... pero leí que no pasaba...

Después miro si hay repo del kega y modifico el código si me lo permiten... en el otro no se podía hacer fork ni más... por no ser colaborador solo pude publicar un parche

Avatar de Usuario
Alexei
Check Point!
Check Point!
Mensajes: 14170
Registrado: 12/01/12 9:14

Re: Fix a emulador Gens

Mensaje por Alexei » 03/08/18 17:49

Yo solucione ese problema usando Fusion, el mejor emulador de Genesis a mi gusto.

Avatar de Usuario
Hikaru
Tetris Player
Tetris Player
Mensajes: 413
Registrado: 04/03/17 20:02

Re: Fix a emulador Gens

Mensaje por Hikaru » 03/08/18 17:56

SaturnAR escribió:
03/08/18 17:34

El Kega usa este código de base... pero leí que no pasaba...

Después miro si hay repo del kega y modifico el código si me lo permiten... en el otro no se podía hacer fork ni más... por no ser colaborador solo pude publicar un parche
Probé con varios mandos y diferentes os, siempre lo mismo, imposible jugar decentemente a los de pelea.
Imagen

Avatar de Usuario
Console Wars
As del volante en Road Fighter
As del volante en Road Fighter
Mensajes: 3277
Registrado: 29/04/14 8:02
Ubicación: Workin' to pay the vicio...

Re: Fix a emulador Gens

Mensaje por Console Wars » 03/08/18 19:31

Guau, un golazo y un orgullo que un miembro del foro haya solucionado un problema que tenia tanto tiempo!
Imagen

Responder