Buenas, como me ha mencionado
@nu_kru, comento un poco mis experiencias, en base a haber escrito varios emuladores, en su mayoria de CPU para integrarse a otro emulador/programa, aunque si he echo algun proyecto completo, un emulador de Atari ST y alguna cosilla mas algun tiempo atras
Lo primero es simplemente recopilar informacion de como funciona lo que quieras emular, a estas alturas da igual el lenguaje que quieras usar, lo primero es entender perfectamente como funciona la maquina
La NES tiene un 6502, es un cpu low-endian, por ejemplo si no sabes bien el concepto, es buscar informacion de como funciona ese tipo de cpus. Si sabes te saltas este paso, y al siguiente
Yo que se, si podes identificar el porque de este codigo, tal vez podes ahorrarte estudiar como funciona el cpu
#include <stdio.h>
#include <stdint.h>
int main(void)
{
int16_t a = 1;
int8_t *p = (int8_t *) &a;
if (p[0] != 1)
printf("big-endian");
else
printf("little-endian ");
return 0;
}
Cuando tengas estudiada la maquina, te podes plantear el tipo de emulacion, interprete o recompilacion. Lo mas comun para emular hardware poco potente como la nes, sera interprete, que tambien requiere menos conocimientos (o nulos) de ensamblador
Un codigo tipico para interprete es
while(CPUactivo)
{
buscar opcode
Interpretar opcode
}
Basicamente una vez tengas estudiado el CPU a emular, es interceptar las llamadas, interpretarlas, y devolver un valor esperado. Parece facil en papel, un dolor de huevos delante del notepad (o lo q uses para tipear codigo)...
Una vez que tengas identificado todo sobre papel, y decidido el tipo de emulacion, recien podes plantearte el lenguaje, plataforma a programar, etc
No se en que estado esta tu "proyecto" como para dar otros consejos realmente
Para darte un ejemplo del tema practico, hace unos tres años atras, me pille una PSP GO para remplazar a la PSP FAT que ya molestaba en el bolsillo
Cuestion que mi principal objetivo era jugar a la neogeo pocket en la PSP, consola que me gusta muchisimo. Cual fue mi sorpresa al darme cuenta que el unico emulador existente para PSP de NeoGeoPocket *decente*, era realmente un desastre
Dejemos de lado que tenia filtro bilinear, fallos a doquier... etc etc el principal problema era que no llegaba ni al 50% de la velocidad en la mayoria de los juegos , y solo se podia mantener la velocidad usando frameskip , un jodido desastre, asi no se disfruta......
Me baje el codigo del emulador, y despues de analizarlo, llege a la conclusion que el problema era que el emulador del CPU central, un TLCS-900H era extremadamente ineficiente. Escrito en C
Asi que me puse a escribir mi propio emulador de TLCS-900H en ensamblador, pero en vez de estudiarme el TLCS-900H de arriba a abajo (que tambien lo estudie) lo que hice fue basarme en los resultados que daba el core en C, viendo los opcodes, memoria, etc, pero principalmente tratando de mantener la estructura original
Resultado? ademas de lograr 100% de velocidad, es que pude escribir el emulador en unos pocos 3 meses, y lo logre integrar al resto del codigo existente de manera facil, ya que no hice cambios significativos a la estructura
http://www.elotrolado.net/hilo_emulador-neogeo-pocket-para-psp_2043905Realmente no se que ventajas puede dar estudiar el codigo de un emulador ya existente, no puedo aconsejarte sobre ese tema, pero si que puedo aconsejarte que comienzes por algun lenguaje facil, no ensamblador, a menos, que te pase como a mi, que estas muy ajustado por el hardware, y no queda otra
Por eso tal vez echar un vistazo a algun emu ya existente en C, pueda darte alguna idea. Pero solo, solo, despues que te estudiaras la teoria. No sirve de nada meter mano al codigo sin conocer el hardware
@amchacon hombre, para ser un emulador de un CPU, 3700 lineas es relativamente simple y poco. El emulador original en C del TLCS-900H que comento arriba, andaba por las 20mil lineas
Cual es el problema de los inline? yo los veo constantemente en codigo de emuladores, aunque programo muy poco en C, suelo usarlos tambien