[Devlog] Vircon32: Creando mi propia consola

carra

Os presento el proyecto gamedev al que me estoy dedicando por completo. Se trata de Vircon32: una consola virtual de 32 bits que he diseñado, implementado y documentado. También he creado ya varios juegos y demos. Podéis ver bastantes de forma rápida en este video.


¿Qué es Vircon32?

Es una consola de videojuegos creada por mi desde cero. He diseñado la consola, he creado su emulador, e iré poco a poco creando un pequeño catálogo de juegos para ella. Todo esto lo pondré disponible para descargar totalmente gratis, y será de código abierto.

En este enlace podéis bajar el emulador, juegos, demos y las herramientas de desarrollo:
WEB DE VIRCON32


¿Cómo es esta consola?

Es una consola de 32 bits orientada a juegos indie 2D tipo pixel art. Está diseñada para ser muy simple de emular, y para que crear juegos en ella sea muy sencillo. En cuanto a potencia y características, es similar a consolas de la generación de la primera PlayStation aunque sin capacidades 3D.

Sus especificaciones son estas:

  • Pantalla: 640x360 (16:9), a 60Hz. Color verdadero.
  • Audio: 16 canales con calidad CD.
  • Controles: Hasta 4 gamepads con cruceta, 6 botones y Start
  • CPU de 32bits a 15MHz. 1 instrucción cada ciclo.
  • Memoria RAM de 16MB
  • Cartuchos de hasta 2.5GB de capacidad
  • Puede usar una memory card para guardar la partida
  • Dispone de una BIOS para gestión de errores y otros

¿Qué la diferencia de otras consolas inventadas?

Sistemas como Pico-8 y TIC80 están más planteados para hacer experimentos y minijuegos. Es difícil plantearse un juego más completo con las limitaciones de resolución y tamaño que tienen. Vircon32 está más orientada a juegos completos, aunque permite experimentar fácilmente.

Hay otra diferencia importante: Estos dos sistemas se basan en scripting con Lua, con lo cual su funcionamiento no tiene nada que ver con consolas reales. En cambio, Vircon32 está diseñado como una máquina real con todos sus componentes: CPU, chip grafico, etc. Pero siempre de una manera simplificada.


¿Por qué he creado este proyecto?

Me considero muy fan de las consolas clásicas y sus emuladores: creo que además de los juegos en sí, las propias plataformas tienen encanto. ¿Quién no ha pensado que le gustaría crear su propio juego en SNES o Mega Drive? Por desgracia estas consolas son complejas, están poco documentadas, y el proceso para crear juegos para ellas exige mucho esfuerzo: existen pocas herramientas, hay que programar en ensamblador y se debe conocer todos los chips de la máquina.

Vircon32 soluciona estos problemas siendo una máquina simplificada, con documentación completa y sin las limitaciones propias de aquellas máquinas (como paletas de colores, tiles, etc). Además dispone de herramientas de desarrollo que permiten programar en lenguaje C de forma muy directa, e importar nuestros archivos de imágenes y sonidos para usarlos en los juegos.


¿De qué se compone el proyecto completo?
Documentación:

  • Especificaciones de la consola
  • Guías de sus lenguajes de programación (C y ensamblador)
  • Tutoriales para crear un emulador
  • Tutoriales para aprender a programar juegos

Aplicaciones:

  • Emulador de la consola
  • Herramientas de programación
  • Herramientas para importar archivos

Software para la consola:

  • Bios
  • Catálogo de juegos
  • Programas de test
  • Tutoriales

Éste es un proyecto ambicioso, y lo desarrollo yo solo, con lo cual será un proyecto a largo plazo. De todas formas trataré de escribir aquí con frecuencia aunque sea sólo para informar de pequeños avances.

57
r2d2rigo

Me mola la idea pero no entiendo por que una velocidad de solo 6MHz, cuando ademas no hay GPU dedicada entre las specs.

Y tanta RAM y storage me parecen una barbaridad, te va a sobrar sitio por todos lados ahi.

1 1 respuesta
carra

#2 Pues todo tiene su explicación. Vamos por partes...

6 MHz es efectivamente una frecuencia muy baja, por ejemplo la CPU de la PSX (MIPS) ya funcionaba a 33 MHz. Pero ojo, no quiero exigir demasiado a las máquinas que ejecuten Vircon, y se necesita más potencia de la que en principio parece.

Cada ciclo de Vircon puede hacer bastante más que por ejemplo la MIPS de PSX que mencioné: en la MIPS multiplicar 2 enteros podía tardar hasta 13 ciclos, y dividirlos hasta 36. Vircon, por simplicidad, hace todas las instrucciones en un sólo ciclo, incluídas operaciones de coma flotante (que la PSX ni siquiera tenía) y cualquier acceso a memoria. Esto para la CPU, pero en cada ciclo también puede habérsele pedido comandos a los otros chips como a la GPU (que sí tiene) o la SPU. Y también se debe controlar si están sucediendo errores. ¿Estamos dividiendo por cero?¿Accedemos a una memoria que no existe?...).

Aún con todo esto, por las pruebas que he hecho sé que podría aumentar la velocidad. Me he planteado la opción de subirla un 50% a 9MHz, esto está aún en el aire. Pero me gustaría que Vircon se pueda ejecutar no sólo en PCs, sino también en máquinas más pequeñas como Raspberrys.

Por otro lado tenemos la capacidad de cartucho. 2.5 GB parece mucho pero hay que tener en cuenta que, de nuevo por simplicidad, todas las imágenes y sonido que usa un juego se guardan sin comprimir. Cada megapixel de imágenes ocupa 4MB, y cada minuto de audio unos 10MB. Es cierto que aún así haría falta un juego muy elaborado para llegar a ese límite (tal vez un RPG?), pero tampoco es imposible.

En la memoria sí que pienso como tú que probablemente sobre. Pero no me preocupa mucho, ya que en cualquier sistema actual 64MB es irrisorio.

4
B

Impresionante, solo te puedo dar la enhorabuena por la idea y mi apoyo. ¿Piensas sacarle algún partido económico?

PD: yo le he dado a mips con mars y he estado cerca de cortarme las venas.

¿De verdad los juegos de la megadrive estaban programados en ensamblador?

1 1 respuesta
Kalgator

Adelante con la idea, que tiene buena pinta!

1
carra

#4 No, no voy a cobrar por nada de esto. Todo lo hago porque me gusta y quiero que le llegue a cuanta más gente mejor. Además, para preguntarse eso todavía estaría por ver si habría algún interés en la consola o no se come un colín y sólo la uso yo. Yo estoy preparado para lo segundo, pero aún así seguiré haciéndolo.

La Megadrive y cualquier consola de esa época se programaban en ensamblador por varias razones: rendimiento, necesidad de acceder al hardware, falta de compiladores... hubo alguna excepción notable, como por ejemplo el Sonic Spinball que sí se programó en C. Lo consiguieron hacer pero con problemas de rendimiento (solo funciona a 30fps).

No sé si sigues con el MIPS, pero si es así ánimo jeje

1 2 respuestas
B

#6 pues ni idea tenía, pensaba que se usaban lenguajes tipo pascal o cosas así para ese tipo de juegos. Poca broma entonces, menudos cracks los programadores.

Pues si necesitas testear u opinión me quedo por aquí.

Lo de mips jaja me da risa, estuve una tarde entera para poder programar una solución de una ecuación, pero ahí vamos, poco a poco

1 1 respuesta
Jastro

#6 cuando tengas algo potable avisa, si no ha muerto por el camino y tengo tiempo, hago algun juego de prueba

1 1 respuesta
carra

#7 Pues oye cualquier testing siempre viene bien, se agradece

#8 En realidad ya lo tengo, no me importaría pasarte el emulador y las herramientas. Pero igual es un poco precipitado, creo que por lo menos me tendría que currar primero un poco alguna documentación básica y un pequeño tutorial. Que hasta ahora lo he estado usando yo solo... :sweat_smile:

1 respuesta
Jastro

#9 me parece corresto, avisame cuando tengas algo pa darle caña

1 respuesta
carra

#10 Genial! Estoy intentando aprovechar el fin de semana para irlo avanzando.

Por el momento he creado un poco de pixel art para usar en los tutoriales, lo pongo aquí como curiosidad y para crear hype :rofl::sweat_smile:

Voy a ir subiendo a YouTube una pequeña lista (videos cortos, de pocos minutos) para mostrar cómo crear un minijuego paso a paso, desde cero. Bueno casi cero, se entiende que quien ve esto ya ha programado antes. Hay gente que prefiere hacer ejemplos más teóricos, pero para mi siempre se hace más fácil seguir lo que te enseñan si hacen cosas que de verdad se parezcan a lo que tú quieres hacer.

4
B

Interesante. A ver cuando sacas algo de esa documentación para curiosear.

Me subo al hilo

2
everedx

Madre de Dios.

Aqui tienes otra persona para probar cuando esto sea una realidad.

1
carra

He creado un video inicial antes de empezar la serie de los tutoriales en sí. Es sólo una presentación inicial de lo que es el concepto de la propia consola. Os lo pongo aquí.

De momento los videos que iré creando los pondré ocultos (sólo son visibles teniendo el enlace), hasta que el proyecto esté un poco más pulido. Así en principio los vemos sólo nosotros.

Ahora estoy creando el primer video de la serie de tutoriales. Como veréis no tengo mucha idea de edición y soy novato haciendo videos. Espero que no haya quedado demasiado cutre y al menos se entienda más o menos bien, pero ya me diréis!

7
carra

Acabo de subir el siguiente video, este ya es el primero de la serie de tutoriales y aquí tenéis ya chicha de cómo funciona la consola.

En el siguiente tutorial explicaré cómo usar las herramientas de programación para crear nuestro primer programa (vamos, el típico hello world :stuck_out_tongue_closed_eyes:)

3 2 respuestas
puntocom

Interesante proyecto y una locura :joy:, estaremos pendientes.

2 1 respuesta
Jastro

#15 ya tengo pensado el juego que hare en vircon xD

1 1 respuesta
carra

#17 Sí que lo tienes claro entonces! Me encanta jaja. Estos días voy a tratar de pulir un poco las herramientas antes de poneroslas para descargar, así podréis intentar compilar algún programa cuando suba el siguiente video

#16 Locura? Naah :rofl:
Eso sí me voy a jartar a currar con esto! Ya lo estoy haciendo

1
carra

Ahora estoy invirtiendo un poco de tiempo en tratar de mejorar las cosas de cara a vosotros. Hasta ahora el emulador y la BIOS todavía no estaban haciendo ninguna gestión de errores. En plan de: como todo lo hago yo solo, me fío de que lo haré bien jaja.

Ahora ya tenemos las famosas pantallas azules para que al menos si vuestro programa tiene un error podáis saber algo de lo que ha podido fallar.

La siguiente parte va a ser intentar hacer una interfaz gráfica para el emulador (todavía muy básica). Esta es una parte peliaguda, porque en C++ nunca ha sido fácil crear GUIs portables en estos casos. Los frameworks completos no se suelen integrar muy bien con programas tipo emulador, porque necesitas controlar cómo y cuándo se ejecutan las cosas.

3 1 respuesta
B
#19carra:

tratar de mejorar las cosas de cara a vosotros. Hasta ahora el emulador y la BIOS todavía no estaban haciendo ninguna gestión de errores. En plan de: como todo lo hago yo solo, me fío de que lo haré bien

Gracias por llamarnos idiotas xdddd. No, se entiende, el desarrollador sabe los pasos que tiene que dar para que funcione, el usuario no.

Yo tengo ganas de probar a hacer algo chorra y que funcione en el emulador

1 respuesta
larkkkattack

Lleva siendo meme unos cuantos años el "me estoy haciendo mi propio motor para hacer un juego".

Y viene Carra con 2 cojones y se monta su propia consola. VAMOS AHÍ (SIN IRONÍA)

1 respuesta
r0n1n-gklan

Pintada, se nota que disfrutas con ello, buen trabajo 😘
Pintaza, puto movil

1 respuesta
carra
#20vago_21:

Gracias por llamarnos idiotas xdddd. No, se entiende, el desarrollador sabe los pasos que tiene que dar para que funcione, el usuario no.

Claro hombre. La cuestión es que las cosas sean accesibles, incluso si el que lo usa es listo también viene bien que se intente poner las cosas fáciles. Además vosotros no sois cualquiera que llega, aquí todo el mundo programamos algo y seguro que muchos controlan para leer documentación y cosas así.

Para los que tenéis ganas de trastear me estoy planteando grabar un pequeño video más "informal" donde podáis ver el emulador corriendo, la pinta que tiene el código y cómo tengo montado el tema para programar. ¿Creéis que merece la pena?

1 respuesta
carra

#22 Ya te digo que disfruto! Cada vez que avanzo con algo estoy como un niño pequeño jeje

#21 Pues sí, motores ya me creé alguno que otro. Y esto la verdad lo quería haber hecho ya hace tiempo. Lo que me echaba para atrás es no ser capaz aún de programar un compilador, porque la verdad si la consola solo se pudiera programar en ensamblador se haría pesado hasta para mi...

B

#23 si lo haces yo lo veré seguro, y si te animas a directo también, así molestamos con preguntas xdd

1 respuesta
carra

#25 Pues es buena idea, ni me lo había planteado pero podría estar bien. No lo he hecho nunca, pero creo que teniendo como tengo puesto el OBS studio, se podría

carra

Ahora estoy rehaciendo el formato de los archivos de Vircon. Quiero simplificarlo un poco, pero mantener un poco de redundancia para poder detectar errores. Quiero hacer esto ahora para que cuando vosotros ya estéis trasteando con la consola no os rompa la compatibilidad.

Para los que os mola la documentación técnica, os pongo un par de esquemas que seguramente serán los que use en las especificaciones:

1
carra

He estado haciendo algunas pruebas con imgui para intentar ir teniendo en el emulador alguna interfaz, aunque sea básica. Así es como queda por ahora, los menús no se muestran a no ser que pases el ratón por encima, y si no se ve solo la pantalla de Vircon. Cuando los menús se dibujan he hecho que la pantalla se oscurezca, parecido a lo que hacía el antiguo zsnes.

No todas las opciones que hay ahí funcionan aún. Para algunas tendré que remodelar un poco el funcionamiento del emulador (aún no estaba pensado para estar cambiando las roms, etc). Pero la que más me costará por ahora va a ser encontrar una manera de lanzar el navegador de archivos para cargar los juegos.

Aún así, la primera versión que os pasaré no creo que sea aún muy configurable. Cosas como poder cambiar los controles van a tener que esperar de momento.

1 1 respuesta
r2d2rigo

#28 en que estas programando el emulador? Te va a tocar o llamar al API nativo a mano dependiendo de la plataforma o buscar una libreria que te lo abstraiga (por ejemplo en Qt tienen el QFileDialog).

1 respuesta
carra

#29 Todo lo estoy programando en C++, junto con SDL. Uso OpenGL para gráficos y OpenAL para sonido.

Sí, una opción es llamar a la API de windows. La verdad, intentaré evitarlo (casi todo ahora mismo es multiplataforma) pero puede ser una solución para ir tirando de momento. Aquí usar frameworks tipo Qt ó WxWidgets podría ser complicado, he estado buscando cómo integrarlo con un programa tipo emulador (que necesita controlar el timing), pero no encuentro por ningún sitio cómo hacer algo así.

También he visto que para imgui existen algunos "widgets" aparte para usar un navegador de archivos propio. Lo tendré que mirar también.

1 respuesta