¿Qué pasa con los SIGNAL que están provocando errores en memoria?

Started by KeiDash, June 11, 2018, 11:25:11 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

KeiDash

Buenas a todos!

De nuevo vengo a buscar ayuda en este foro porque ya llevo con esto 2 semanas y no le veo sentido alguno a qué está pasando.

Informo que estoy desarrollando en PC pero para Dreamcast, así que las pruebas en PC son siempre satisfactorias, mientras que en Dreamcast estoy teniendo problemas continuos y no se si es por mi código/manejo del framework o es un fallo en sí de BennuGd. Indico que las pruebas que realizo son PC > Emulador > Consola real. Los fallos los estoy teniendo en emulador, no he llegado al paso de la consola real, pero quiero saber si estoy realizando yo algo mal o puede ser un fallo real del sistema.

Os pongo en sitaución con el caso, La prueba es la siguiente:
QuoteEl método Main, llama a 2 sub-procesos hijos. El proceso A) muestra un gráfico en pantalla, el proceso B) se encarga de DORMIR y DESPERTAR al proceso A) cada un tiempo determinado (3 seg aprox.), no es más.

Como indico, en PC funciona correctamente, pero en Dreamcast (emulador en este caso) cuando lleva un minuto o dos de ejecución el juego, el emulador se cuelga dando el error siguiente:
QuoteRelocated dynarec blocks: 1652 KB before, 1644 KB new, 8280 bytes diff, 0.49%
[GPF]unhandled access to: <una posición en memoria>

Evidentemente el emulador me está dando un error intentando acceder a una posición en memoria concreta, lo que no entiendo es porqué

El error se está provocando al utilizar los signals ¿Que cómo lo se? Pues porque si comento las líneas de código donde están los signals, el error desaparece y el juego ya no se cierra ni da error. Y el código? Aquí está:


GLOBAL
int fpgFile = 0;
END

Process Main()
Private
int screenId = 0;
string p_sMemFree = "";
End
Begin

//En caso de que sea Dreamcast
fpgFile = LOAD_FPG("/cd/assets.fpg");

screenId = ProcToTest();

SignalTester(screenId);

Loop
frame;
End

End

Process SignalTester(int screenId)
Private
Begin

frame;

Loop
Waiting(TimeToMiliseconds("3.000"));
Repeat
frame;
Until(gi_TimeFinished == 1)
gi_TimeFinished = -1;

if(EXISTS(screenId))
SIGNAL(screenId, S_SLEEP_TREE);
end

CLEAR_SCREEN();

Waiting(TimeToMiliseconds("3.000"));
Repeat
frame;
Until(gi_TimeFinished == 1)
gi_TimeFinished = -1;

if(EXISTS(screenId))
SIGNAL(screenId, S_WAKEUP_TREE);
end

frame;
End

End

Process ProcToTest()
Private
Begin
FILE = fpgFile;
GRAPH = 1;
X = 640/2;
Y = 480/2;
Z = 3;

loop frame; end
End


Indicar que el tiempo de espera se ejecuta en otro proceso con el gettimer() que simplemente va consultando el tiempo en milisegundos para generar la espera. Esto no está provocando errores de ningún tipo, por si os genera la duda. En cuanto comento los SIGNALS como indico, se eliminan todos los problemas.

¿Está el código bien?¿No es la manera de realizarlo?

Necesito de vuestra ayuda!!

Saludos y gracias de antemano.

FreeYourMind

Aunque pueda ser un error del port, deberias probarlo en la consola para salir de dudas, porque puede que el emulador no soporte alguna instruccion del juego, porque seguramente el emulador no sea perfecto y haya mas juegos de dreamcast oficiales que tambien fallen de forma similar.

Antes probaria en otros emuladores

KeiDash

Quote from: FreeYourMind on June 11, 2018, 02:05:07 PM
Aunque pueda ser un error del port, deberias probarlo en la consola para salir de dudas, porque puede que el emulador no soporte alguna instruccion del juego, porque seguramente el emulador no sea perfecto y haya mas juegos de dreamcast oficiales que tambien fallen de forma similar.

Antes probaria en otros emuladores

Pues vas a tener razón...

Resulta que lo he probado en demul y funciona perfectamente sin errores....Llevaba meses usando nullDC..que chasco :'D