PDA

Ver la versión completa : Problemas portando Osmose



WinterN
23/11/2005, 07:15
Bueno, pues resulta que estaba yo compilando felizmente este emulador de Master System para la GP2X... y en uno de los archivos me da este error:



PrecisionTimer.cpp: In member function 'void PrecisionTimer::calibrate(int)':
PrecisionTimer.cpp:46: error: impossible constraint in 'asm'
PrecisionTimer.cpp:48: error: impossible constraint in 'asm'

El método en cuestión es éste:



void PrecisionTimer::calibrate(int s)
{
unsigned long long start;
unsigned long long stop;
if (verbose)
{
cout << "Calibrating:" << dec<< s << " seconds." << endl;
}
rdtsc(start); // <------------------------ ERROR AQUI
PORTABLE_SLEEP_FUNC;
rdtsc(stop); // <------------------------ ERROR AQUI
tick_per_second = (unsigned long long) ( stop - start );
tick_per_second = (tick_per_second / s);
if (verbose)
{
cout << "tick_per_second is: " << dec << tick_per_second << endl;
cout << "CPU seems to run at " << dec <<(tick_per_second / 1000000.0) << "Mhz." << endl;
}
}


He marcado las dos lineas erroneas. Despues de investigar un poco la funcion rdtsc, me he enterado que es una instrucción para contar los ciclos de reloj ejecutados en la arquitectura Pentium (de ahí que dé el error al compilar para ARM).

¿Alguien puede darme alguna alternativa? Gracias!!

esp3tek
23/11/2005, 07:21
pasate por #retrodev alli hay unos cuantos que te podrian ayudar

WinterN
23/11/2005, 07:51
pasate por #retrodev alli hay unos cuantos que te podrian ayudar

Voy para allá. Gracias !!

PD: Sigo aceptando ayuda por aqui ;)

mog_ur
23/11/2005, 14:13
Entonces entre esas tres lineas (entre las dos de los errores) lo que parece que hace es una pausa ¿no?, una pausa que depende de la velocidad del procesador ¿no? y como la gp2x tiene siempre la misma velocidad podrías hacer una pausa constante.

No tengo ni idea de programar emuladores y de C casi se me ha olvidado todo, pero bueno, yo doy mi humilde opinión

BuD
23/11/2005, 14:17
No podrias usar las SDL para crear esa pausa? o es que se necesita mucha mas precision?

bitrider
23/11/2005, 16:50
Fueno, fueno, teniendo que los PCs son muy diversos, no sabes su velocidad, etc, etc. Tienes sin más cojones que calibrarla de alguna manera para conseguir una emulación de velocidad similar en todas las máquinas.

Con las consolas no pasa eso. Tienes una consola de un modelo dado, todas las de su clase van a tener unas características mínimas comunes, entre ellas la velocidad.

Por lo tanto puedes sustituir el trozo de código:

rdtsc(start); // <------------------------ ERROR AQUI
PORTABLE_SLEEP_FUNC;
rdtsc(stop); // <------------------------ ERROR AQUI
tick_per_second = (unsigned long long) ( stop - start );
tick_per_second = (tick_per_second / s);

por :
tick_per_second = CONSTANTE;

Donde constante sería una constante que tú mismo tendrías que elaborar a partir de los datos que tengas de la GP2X. O más chapuzeramente, ir probando unos cuantos valores hasta que encuentres uno que vaya bien. (sin conocer más del emulata en cuenstión y cómo utiliza el tick_per_second no te puedo ayudar mucho más).

Editado: echándole un nuevo vistazo al código una solución un tanto trivial sería:

tick_per_second = 200 * 1000000; // pasando de Mhz a hz o ticks por segundo

WinterN
25/11/2005, 09:08
Gracias por la info. De momento he usado la funcion SDL_GetTicks() que alguien me ha recomendado. De velocidad va bien, pero el sonido se retrasa un poco... a ver que tal va en la GP2X.

Si no va ya pruebo tu método ;)