Fix a emulador Gens

El espacio para revivir clásicos (y no tanto) mediante emuladores. Un lugar dedicado 100% a la emulación.
User avatar
SaturnAR
Daytona USA Player
Daytona USA Player
Posts: 1100
Joined: 24/05/13 12:36
Frase: SEGA Saturn.. Shiro!
Location: Arrakis
Contact:

Fix a emulador Gens

Post by SaturnAR »

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

Code: Select all

				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ó:

Code: Select all

				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

Code: Select all

#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
User avatar
julian_pincha
Metal Gear Solid Player
Metal Gear Solid Player
Posts: 2997
Joined: 26/04/15 4:50

Re: Fix a emulador Gens

Post by julian_pincha »

Ah sos un crack SaturnAR, te pasaste.
User avatar
Rodri3
Check Point!
Check Point!
Posts: 13692
Joined: 12/01/13 10:43
Frase: #acumulacionCero?

Re: Fix a emulador Gens

Post by Rodri3 »

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: Image | Image | Image | Image
Deudas Gamer:
Saldadas: Castlevania | Rockman
En curso: Batman Returns | Gun Nac
User avatar
Diego
Oveja en el Age of Empires
Oveja en el Age of Empires
Posts: 6717
Joined: 03/11/11 21:26
Frase: Winners Don't Use Drugs
Location: Atarilandia

Re: Fix a emulador Gens

Post by Diego »

Excelente!
User avatar
ferhound
Admin
Admin
Posts: 23260
Joined: 05/02/10 17:34
Frase: Never be game over
Location: Capital Federal

Re: Fix a emulador Gens

Post by ferhound »

Increible :O Aguante SEGA ;_;
--------------------------------------------------------------------------------------------------
User avatar
Hikaru
Tetris Player
Tetris Player
Posts: 413
Joined: 04/03/17 20:02

Re: Fix a emulador Gens

Post by Hikaru »

Gracias man.

Con el kega tengo el mismo problema.
Image
User avatar
SaturnAR
Daytona USA Player
Daytona USA Player
Posts: 1100
Joined: 24/05/13 12:36
Frase: SEGA Saturn.. Shiro!
Location: Arrakis
Contact:

Re: Fix a emulador Gens

Post by SaturnAR »

Gracias! Image
Hikaru wrote: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
User avatar
Alexei
Check Point!
Check Point!
Posts: 14170
Joined: 12/01/12 9:14

Re: Fix a emulador Gens

Post by Alexei »

Yo solucione ese problema usando Fusion, el mejor emulador de Genesis a mi gusto.
User avatar
Hikaru
Tetris Player
Tetris Player
Posts: 413
Joined: 04/03/17 20:02

Re: Fix a emulador Gens

Post by Hikaru »

SaturnAR wrote: 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.
Image
User avatar
Console Wars
As del volante en Road Fighter
As del volante en Road Fighter
Posts: 3277
Joined: 29/04/14 8:02
Location: Workin' to pay the vicio...

Re: Fix a emulador Gens

Post by Console Wars »

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