Tutorial Programación Emulador Chip-8 - Parte 1 al 6

Revela aquí tus conocimientos o plasma tus dudas acerca de temas relacionados con los lenguajes de programación. Tan útiles a la hora de hacer nuestras propias herramientas.

Moderador: Faloppa

Tutorial Programación Emulador Chip-8 - Parte 1 al 6

Notapor darkn » Lun Mar 14, 2011 3:03 am

Hola todos, no posteaba hace 1 año y 364 días según mi amigo Hexplus. He estado alejado de las pistas pero no muerto. En este tiempo me he dedicado a otras cosas aparte del romhacking, como el desarrollo de emuladores o aprendiendo librerías para hacer juegos.

Bueno, quiero crear este hilo para que comenten o planteen sus dudas el primer capítulo de mi tutorial de creación de un Emulador de Chip-8 con C# 2.0 y Visual Studio 2008. Traté de buscar foros orientados a la programación de emuladores en español y no encontré así que lo postearé acá.

http://darkn.romhackhispano.org/ -> Sección Emulación (actualizado: 17-03-2012, parte 6)

Muchos se preguntartán, porqué Chip-8 y no otro sistema como la NES, y la respuesta es sencilla: mi idea partir enseñando desde cero con el sistema más sencillo de emular (según diversos foros) y luego si hay buen público, realizar un tutorial de emulación de un sistema más complejo, por ej. GameBoy.

Parte 1: Operaciones básicas con Bits, Operadores Shift, Instrucciones de C# que nos ayudan a extraer bits de una dirección, Leer e Unir bits.
Parte 2: Se arma esqueleto del programa. Se hará emulador en Modo Consola primero. Se explican las variables globales a utilizar. Hasta aqui si alguien lo quiere hacer en Java, sería practicamente copiar y pegar ya que el código es muy parecido.
Parte 3: Se explica como es el programa principal y el game-loop. Se muestra como es la carga de la ROM en la Memoria y como se leen las instrucciones y ejecutan en el denominado Ciclo Fetch (por ahora solo 2 instrucciones de las 36 que tiene el Chip-8).
Parte 4: Expicación de todas las instrucciones restantes.
Parte 5: Cambios en el código para transformar el emulador en modo consola a gráficas a SDL.NET, uso de Teclado.
Parte 6: Mejoras en el emulador como título de la ventana, cálculo de FPS y agregar sonido.
Parte 7: Próximamente: como hacer una ventana de Emulador con opciones: Cargar Rom, Pause.
Parte 8: Próximamente: como hacer el módulo "Save State" y "Load State".


Espero que les guste.
Nos vemos!
Última edición por darkn el Dom Mar 18, 2012 3:13 am, editado 6 veces en total
Avatar de Usuario
darkn
Usuario
Usuario
 
Mensajes: 17
Registrado: Lun Mar 14, 2011 2:28 am

Re: Tutorial Programación de Emulador Chip-8- Parte 1, 2 y 3

Notapor soywiz » Sab Abr 23, 2011 11:27 am

Genial :)
Lo acabo de ver. A ver si le sirve a la gente.
Felicidades y sigue así :D

--

Yo también he estado trasteando con C# y de hecho he creado algunas utilidades que pueden servir para el romhacking (las he ido creando conforme me hacían falta para el Tales of Vesperia y para algunas cosas del trabajo). En este caso estoy usando .NET 4.0 con Linq y otras cosas que igual no están disponibles en la 2.0:
http://code.google.com/p/csharputils/so ... SharpUtils

Ahora crearé un post para ello.

Edito: viewtopic.php?f=4&t=880
soywiz
Usuario
Usuario
 
Mensajes: 72
Registrado: Jue Ene 18, 2007 12:29 pm
Ubicación: Valencia

Re: Tutorial Programación de Emulador Chip-8- Parte 1, 2 y 3

Notapor KaOSoFt » Vie Jun 10, 2011 5:01 pm

¡Hola!

Me agrada mucho la idea. Nada como una prueba de concepto para que la gente afiance términos y metodologías, jeje.

Felicitaciones, y sigue así.

PD: soywiz, está interesante tu proyecto de utilidades en C#.
To be human is to know the fear of death, yet keep on fighting.
Avatar de Usuario
KaOSoFt
Administrador
Administrador
 
Mensajes: 42
Registrado: Lun Ene 22, 2007 8:51 pm
Ubicación: Bogotá, Colombia

Re: Tutorial Programación de Emulador Chip-8- Parte 1, 2 y 3

Notapor chester » Sab Jun 18, 2011 5:06 am

Hola y antes que nada, muy buenas noches.

Mi motivo es el siguiente. Necesito ayuda con un emulador.
No tengo nociones de programación, y sé muy poco sobre los roms. Tengo un emulador pero no sé cómo ejecutarlo. Antes que nada me gustaría saber si pueden ayudarme.

El programa viene en una carpeta conteniendo las siguientes:
DATA
ENGLISH
FRENCH
GAMES.exe
GERMAN
RUSIAN
SPANISH

y seguidamente 121 archivos.
El caso es que hay varios .exe, y parece que el programa funciona en MS-DOS. Necesito urgente ayuda.
Estos juegos son muy importantes. Si pudieran ayudarme a ejecutar el programa, de verdad les estaría muy agradecido. ???
chester
Usuario
Usuario
 
Mensajes: 2
Registrado: Sab Jun 18, 2011 4:55 am

Re: Tutorial Programación de Emulador Chip-8- Parte 1, 2 y 3

Notapor ivanzinho » Dom Jun 19, 2011 4:25 am

chester escribió:Hola y antes que nada, muy buenas noches.

Mi motivo es el siguiente. Necesito ayuda con un emulador.
No tengo nociones de programación, y sé muy poco sobre los roms. Tengo un emulador pero no sé cómo ejecutarlo. Antes que nada me gustaría saber si pueden ayudarme.

El programa viene en una carpeta conteniendo las siguientes:
DATA
ENGLISH
FRENCH
GAMES.exe
GERMAN
RUSIAN
SPANISH

y seguidamente 121 archivos.
El caso es que hay varios .exe, y parece que el programa funciona en MS-DOS. Necesito urgente ayuda.
Estos juegos son muy importantes. Si pudieran ayudarme a ejecutar el programa, de verdad les estaría muy agradecido. ???


Mirate este video http://www.youtube.com/watch?v=QpDGkDKMkW4

Darkn, gracias por el tutorial, yo ya soy un seguidor mas de tu pagina, lo mejor es que estas ejemplarizando todo en C# que me parece uno de los mejores y mas sencillos lenguajes para programar. La verdad yo iba a hacer este tutorial, pero ya que tu estas avanzadisimo en el tema, me ahorras un gran esfuerzo y nos ayudas mucho a las personas que estamos empezando. De verdad esto es de gran ayuda, muchas gracias, seguiré de cerca tus actualizaciones.

Edito de nuevo el post, estoy leyendo el codigo de tu emulador, esta interesantisimo!!! jajaja, me da risa y alegria como va aprendiendo uno este tipo de cosas.
Avatar de Usuario
ivanzinho
Usuario
Usuario
 
Mensajes: 3
Registrado: Dom Jun 19, 2011 4:09 am
Ubicación: Bogota, Colombia

Re: Tutorial Programación de Emulador Chip-8- Parte 1, 2 y 3

Notapor ivanzinho » Lun Jun 20, 2011 6:20 pm

Yo tengo la primera pregunta:

Con respecto a obtener el OPCode, en el codigo fuente de tu emulador existe una linea que dice asi:

int opcode = (instruccion & 0x0F00) >> 8;

Para que se usa el valor "0x0F00"??

Gracias por la ayuda :)
Avatar de Usuario
ivanzinho
Usuario
Usuario
 
Mensajes: 3
Registrado: Dom Jun 19, 2011 4:09 am
Ubicación: Bogota, Colombia

Re: Tutorial Programación de Emulador Chip-8- Parte 1, 2 y 3

Notapor PacoChan » Mar Jun 21, 2011 1:56 pm

Lo que pretende es dividir los dos bytes en 4 bloques de 4 bits cada uno. Es decir, por ejemplo, en el caso del primer opcode, 0x6A02, separarlo en 6, A, 0 y 2. De esta forma se pueden obtener los distintos datos que contiene el opcode.

Pues para hacer esto, va haciendo ANDs. Tal como dice ahí, 6A02 = 0110 1010 0000 0010 en binario. Y la primera instrucción que ejecuta es

opcode1 = (instruccion & 0xF000) >> 12;

Con la calculadora misma, podrás ver que 0xF000 en binario es 1111 0000 0000 0000. Por lo tanto, como deberías saber:

0110 1010 0000 0010
AND
1111 0000 0000 0000
---------------------------
0110 0000 0000 0000

Ya que, como dice el tutorial:

-True AND True = True (1 AND 1 = 1)
-True AND False = False (1 AND 0 = 0)
-False AND True = False (0 AND 1 = 0)
-False AND False = False (0 AND 0 = 0)

De esta forma nos quedamos solamente con los cuatro primeros bits. Luego hace un >> 12, que desplaza esos cuatro bits a la derecha 12 veces, quedando como resultado 0000 0000 0000 0110, que es igual a 0x06. Con lo que ya hemos obtenido el primer dígito del opcode.

Con los siguientes es lo mismo.

El siguiente caso es el que comentas: int opcode = (instruccion & 0x0F00) >> 8;

0x0F00 en binario es 0000 1111 0000 0000. Eso viene a hacer esto:

0110 1010 0000 0010
AND
0000 1111 0000 0000
---------------------------
0000 1010 0000 0000

Y luego se hace >>8, desplazando los bits 8 veces a la derecha, quedando como resultado 0000 0000 0000 1010, que es igual a 0x0A. De esta forma se obtiene el segundo dígito. Y así sucesivamente.



Por cierto, el tutorial está de puta madre. Me viene bien para saber conceptos básicos de emulación que no tenía. He estado siguiendo luego por mi cuenta y ya he implementado casi todas las instrucciones. Me estoy atragantando un poco con la de dibujar sprites, pero ya me las iré apañando xd.
Avatar de Usuario
PacoChan
Administrador
Administrador
 
Mensajes: 71
Registrado: Sab Ene 05, 2008 2:06 pm
Ubicación: Palma de Mallorca

Re: Tutorial Programación de Emulador Chip-8- Parte 1, 2 y 3

Notapor PacoChan » Mar Jun 21, 2011 8:40 pm

Bueeeno... éste es el primer resultado de rular el Pong. Bueno, en verdad es el tercero. El primero ni siquiera mostraba nada xd.

Imagen

Algunas instrucciones rulan bien, otras se ve que no. Habrá que tunear cosas. De primeras debería implementar los timers, que aún no lo he hecho xd.
Avatar de Usuario
PacoChan
Administrador
Administrador
 
Mensajes: 71
Registrado: Sab Ene 05, 2008 2:06 pm
Ubicación: Palma de Mallorca

Re: Tutorial Programación de Emulador Chip-8- Parte 1, 2 y 3

Notapor ivanzinho » Mié Jun 22, 2011 6:39 pm

Darkn, viendo el orden en el que vas a escribir tu tutorial, yo podria decir, como principiante, que es mas importante saber como paso las instrucciones a la pantalla, porque esta muy bien explicado como funcionan en Cowgod's, pero lo que no se explica es como plasmar eso, PacoChan, gracias por la ayuda anterior.
Avatar de Usuario
ivanzinho
Usuario
Usuario
 
Mensajes: 3
Registrado: Dom Jun 19, 2011 4:09 am
Ubicación: Bogota, Colombia

Re: Tutorial Programación de Emulador Chip-8- Parte 1, 2 y 3

Notapor chester » Mié Jun 22, 2011 7:40 pm

ivanzinho muchas gracias por el video. Pero lamentablemente los juegos no son para NES, al parecer, funcionan en base a una matriz llamada novomatic o algo asi (????)
la carpeta se llama GAMES-COOLFIRE2.exe

No se absolutamente nada de ellos, como funcionan, como ejecutarlos, etc... por eso no sabia ni siquiera dónde acudir. Me gustaría saber qué lenguaje de programación se usó pero principalmente como ejecutarlos o si me falta un archivo y cómo conseguirlo...

Hay archivos .resource, varios .exe, .sys, .dll, etc... y si trato de ejecutar cualquier .exe no sucede nada se abre y se cierra automaticamente la ventana... hay un install.exe y otro hinstall.exe (archivos por lotes de Windows) ....

No tengo idea de como se usan o como funcionan ya intente ejecutar todo y nada funciona :( :( :(
chester
Usuario
Usuario
 
Mensajes: 2
Registrado: Sab Jun 18, 2011 4:55 am

Re: Tutorial Programación de Emulador Chip-8- Parte 1, 2 y 3

Notapor PacoChan » Mié Jul 27, 2011 6:13 pm

Bueno, no lo posteé, pero terminé hace tiempo el emulador. Rula la inmensa mayoría de juegos, por no decir todos, y pasa los tests que he encontrado por ahí que prueban diversos opcodes y diversas situaciones especiales que es fácil que se pasen por alto. También, debido a la falta de documentación, algunos opcodes son ligeramente distintos según de dónde saques la información, y hay juegos en los que ese opcode ha de funcionar de una forma, y otros juegos en los que ha de funcionar de otra. Debido a esto, he incluido una opción para emular ambas posibilidades en caso de que el juego no funcione bien por defecto. También tiene soporte completo para SChip, que es una variante de Chip8 con más resolución, permite hacer scrolls y alguna cosilla más.

Imagen
Imagen

De paso, incluso he hecho un juego sencillo (bueno, en Chip8 no es que haya cosas muy complejas). Va de que cada 3 segundos, una estaca al azar se alza. Si te da, te mata. Básicamente es un juego de azar y de aguantar vivo lo máximo posible. Cuando termine una pantalla de título para el juego, supongo que lo publicaré.

Imagen
Avatar de Usuario
PacoChan
Administrador
Administrador
 
Mensajes: 71
Registrado: Sab Ene 05, 2008 2:06 pm
Ubicación: Palma de Mallorca

Re: Tutorial Programación de Emulador Chip-8- Parte 1, 2 y 3

Notapor darkn » Sab Ago 13, 2011 4:51 am

¡Excelente PacoChan! Te has adelantado un poco, pero se ve muy bueno tu emulador.

Por mi parte estoy terminando el capítulo 4 ya que de ahí en adelante se viene lo bueno.

¡Que bien que a muchos le sirva! Esto me da fuerzas para seguir. Nos vemos!.
Avatar de Usuario
darkn
Usuario
Usuario
 
Mensajes: 17
Registrado: Lun Mar 14, 2011 2:28 am

Re: Tutorial Programación de Emulador Chip-8- Parte 1, 2, 3 y 4

Notapor darkn » Sab Sep 17, 2011 4:58 am

He terminado y subido el extenso capítulo 4.

¡Me cuentan si les gusta! ::)
Avatar de Usuario
darkn
Usuario
Usuario
 
Mensajes: 17
Registrado: Lun Mar 14, 2011 2:28 am

Re: Tutorial Programación de Emulador Chip-8- Parte 1, 2, 3 y 4

Notapor PacoChan » Sab Sep 17, 2011 12:59 pm

Genial, hay muchas cosas que las he hecho más o menos igual. Sin embargo he visto algunas que no son exactamente como deberían y pueden dar problemas con algunos juegos. Al principio también lo hice como lo tienes, pero luego, viendo que algunos juegos no iban, y comparando con otros emuladores, me fijé en ciertos detalles:

- A la hora de dibujar un sprite, lo lógico es como lo has hecho tú. Si un píxel se sale de pantalla, éste se dibujará al otro lado. Pero realmente lo que hace el Chip-8 es que si un píxel se sale de pantalla, no se dibuja. Si el sprite entero se sale de la pantalla, entonces es cuando se traslada el sprite entero al otro lado de la pantalla. Esto se puede comprobar en el juego Blitz. No sé si es aposta o un fallo del juego, pero viene bien para testear esto. Si se implementa como has hecho, parte de los edificios se salen por abajo y y asoman por arriba, haciendo que el avión se estrelle nada más empezar. Esto no debería ser así.

- Luego hay un pequeño detalle que por estar mal documentado, no se sabe a ciencia cierta cuál es la forma correcta de hacerlo. Es en los Opcodes Fx55 y Fx65. En algunos sitios dicen que hay que incrementar I, en otros dicen que no. Y el problema es que algunos juegos están programados para ir de una forma, y otros de otra. De hecho, la mayoría, si no recuerdo mal, están hechos para que no se incremente I. Esto se puede comprobar con los juegos Animal Race y Connect 4. Animal Race requiere el incremento de I. Connect 4 no funcionará bien si se incrementa I. Así que lo que hice fue añadir una opción en los menús del emulador. Por defecto está desactivado y no se incrementa I. Y para casos especiales como el Animal Race, se activa la opción y listo. Si se emula Super-Chip, nunca se ha de incrementar I. Lo comento por si algún día se trata el tema, que es muy fácil y rápido de implementar una vez se tiene el chip-8 hecho xd.

Hay ganas de ver la parte de los timings y el dibujado de gráficos, que es con lo que tuve más problemas y quizá no implementé de la mejor manera posible.
Avatar de Usuario
PacoChan
Administrador
Administrador
 
Mensajes: 71
Registrado: Sab Ene 05, 2008 2:06 pm
Ubicación: Palma de Mallorca

Re: Tutorial Programación de Emulador Chip-8- Parte 1, 2, 3 y 4

Notapor darkn » Mié Sep 21, 2011 12:33 pm

¡Muy buen aporte PacoChan!
De daré una vuelta a mi código para optimizar lo que me dices ya que estuve mirando en foros y tienes razón, hay varias alternativas de programar el emulador y no una única forma :)

Saludos!!
Avatar de Usuario
darkn
Usuario
Usuario
 
Mensajes: 17
Registrado: Lun Mar 14, 2011 2:28 am

Siguiente

Volver a Programación

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado