[Devlog] Vircon32: Creando mi propia consola

r2d2rigo

#30 echale un ojo a esto: https://github.com/mlabbe/nativefiledialog

1 respuesta
carra

#31 Gracias! Tenía buena pinta, por desgracia he estado un rato intentando compilarla para mingw y no hay manera.

Pero he encontrado otra que se llama osdialog que sí me ha funcionado :thumbsup:

thenanox

guardado en favoritos, me molan estos temas asi que lo seguire. tienes repositorio?

1 1 respuesta
carra

#33 Me alegro!

Qué va, por ahora no me veo trabajando contra un repositorio. La idea es hacerlo todo muy sencillo: en algún momento haré una pequeña web, y ahí subiré tanto los programas como sus fuentes

1 1 respuesta
thenanox

#34 pensando a largo plazo, quizas si te renta subirlo, sobretodo por si empieza a existir una comunidad

es verdad que tendras la parte de gestion del proyecto open source que es algo tedioso, pero las constribuciones a largo suelen hacer que compense

1 respuesta
carra

#35 Eso es verdad. No lo descarto para más adelante, no tengo problemas con que quien quiera se haga un fork o sus propios emuladores. Al contrario, estoy intentando ponerlo fácil. Aunque ahora que aún estoy en los primeros pasos, me viene muy bien la flexibilidad que da el trabajar por libre: si tengo que cambiar medio emulador de golpe, lo hago y sin problemas :grin:

Aunque quizás, si surge una comunidad para la consola, el meollo puede estar más en los juegos que vayan saliendo que en mis programas en sí.

2
carra

¡Os traigo noticias! Os he subido una primera versión del emulador, para que los que queráis lo podáis ir probando. Lo podéis descargar y ejecutar directamente (no hay que instalar nada).

Aquí tenéis el enlace:
Emulador provisional Vircon32

Aún no hay juegos como tal, así que os he puesto una carpeta con unos cuantos programas de test para el emulador. También hay una pequeña demo de un juego tipo Arkanoid, que es lo único jugable por ahora. Pero tiempo al tiempo...

Espero vuestras opiniones! :grin::thumbsup:

5
carra

Hoy me he levantado con ganas, así que voy a hablar por fin de mi compilador de C. Es uno de los temas importantes de Vircon, y hasta ahora sólo lo he tocado de pasada.

Para poneros en situación, y ya que aún no habéis visto nunca el código, os enseño aquí una muestra de la pinta que tienen los programas de Vircon, tanto en ensamblador como en C.

Al principio no tenía aún compilador, así que sólo podía hacer programas en ensamblador (a la izquierda). Programarse un ensamblador tiene cierta miga, pero es MUCHO más fácil que hacer un compilador.

Quienes conozcáis el lenguaje ensamblador, veréis que la notación de Vircon es similar a la de intel para X86. Hay bastantes instrucciones que están elegidas para funcionar de la misma forma.

El código en C (mitad derecha), tiene los elementos típicos: funciones y variables, expresiones, comentarios, bucles... pero sin embargo el lenguaje C que uso en Vircon tiene ciertas diferencias con el estándar. Y también ciertas limitaciones. Algunas de esas diferencias o limitaciones vienen por cómo es la propia consola, pero otras vienen simplemente de MIS propias limitaciones. Hacer un compilador tiene mucha tela, hay cosas que no sé bien cómo hacer, y a veces que tengo que tomar atajos o simplificar algunas cosas.

De forma muy resumida, la evolución hasta ahora ha sido esta:


Versión inicial de Vircon:

  • No hay compilador (sólo ensamblador)

Compilador versión 1.0:

  • No tenía sistema de tipos, sólo había los tipos elementales (int, float, bool, void).
  • Incluía funciones y expresiones, aunque sólo se podían usar algunos operadores.
  • Había control de flujo, aunque los únicos bucles eran while.
  • El preprocesador tenía sólo #include y #define.
  • Y no había mucho más, el resto se solucionaba con código ensamblador ya que el compilador permite incrustarlo.

Compilador versión 1.1:

  • En expresiones ya se podían usar casi todos los operadores.
  • Añadía los bucles for y do-while.
  • Ya está, no fue una gran evolución.

Compilador versión 1.2:

  • Ampliaba el preprocesador con varias directivas más.
  • Tenía varios cambios de arquitectura para soportar el futuro sistema de tipos

Compilador versión 1.3:

  • Ya incorpora un primer sistema de tipos, y soporta arrays y punteros.
  • Como hay arrays y punteros, ya se puede operar con cadenas de texto.
  • Ya hay una primera "librería estándar" del lenguaje, con funciones de todo tipo: audio, video, gamepads, matemáticas, strings...
  • Además esta versión permite incrustar datos de archivos externos. Así se pueden usar tilemaps, datos de nuestros niveles, etc.

Esta versión 1.3 es la actual, y ha sido la mayor evolución. Con esta versión están hechos todos los programas que os pasé con el emulador (y alguno más), así que la considero bastante testeada.

Estos días no estoy haciendo mucho ruido porque estoy trabajando en la versión siguiente. Esa versión 1.4 va a incorporar algo que va a ser muy útil: estructuras y uniones. Posiblemente también alguna otra cosa relacionada, como listas de inicialización o type castings explícitos. Pero ya se verá.

Aún así habrá todavía cosas que falten. Cosas como enumerados o switches no sé si las incluiré o cuándo, ya que no las veo esenciales. Pero para versiones futuras me gustaría incorporar también, al menos, punteros a funciones. Así, con eso y las uniones, ya se podría simular de una forma básica una especie de polimorfismo aunque no existan clases. Eso seguramente se va a usar mucho en juegos.

6
7 días después
carra

El trabajo me ha tenido ocupado estos días, pero ya por fin puedo poneros más progresos.

He mejorado el emulador, ahora ya se pueden conectar los 4 mandos. Eso sí: aún no se pueden mapear, así que aún sólo se pueden usar los 2 primeros (el mando 1 con el teclado como hasta ahora, y el mando 2 con el joystick). Además veréis que he añadido en la esquina derecha unos porcentajes, para poder ver cuánto carga cada juego la CPU y la GPU de la consola.

También ya se pueden crear y usar memory cards. Estoy creando un pequeño programa de test que cargue y guarde algo, para probarlo y para que os sirva de ejemplo de cómo acceder a la tarjeta.

El compilador de C ya puede usar estructuras y uniones. He actualizado algunos programas para usarlos, y he mejorado algunas cosas de la librería estándar del lenguaje.

Mientras también estoy intentando tener aunque sea una documentación muy básica para cuando os ponga ya para usar las herramientas de programación, que espero no retrasarlo mucho (pero prefiero tenerlo todo bien preparado aunque se me vaya unos días más).

Como véis tengo muchos frentes abiertos :relaxed:

5
carra

Hola de nuevo, sigo informando. He hecho nuevas pruebas de rendimiento y... debo haber optimizado algo por el camino, porque ahora el emulador ya con interfaz gráfica y control de errores, tiene más rendimiento que antes :sweat_smile:.

Para tener una referencia, mi máquina es un Intel Core i7-4820K a 3.7 GHz y la RAM es DDR3 a 800MHz. El emulador no usa multinúcleo, y este PC es capaz de correr Vircon suavemente hasta unos 37.4 MHz. Frente a esto los 6MHz actuales de Vircon son muy asequibles (usaría un 16% de este Core i7).

Esto me ha dado la suficiente confianza para decidir subir la velocidad de CPU de Vircon32 de los 6MHz hasta 9MHz. Creo que esto va a dar bastante juego, y va a venir bien ya que mi compilador no optimiza mucho que digamos. No me planteo de momento subirlo más porque me gustaría que Vircon pudiera correr en una Raspberry Pi 4, y la diferencia de rendimiento con un PC como el mío es importante.

Otro tema: he hecho una pequeña mejora en el juego de instrucciones de la CPU. Quería aprovechar antes de lanzar la siguiente versión: este era el último cambio que me planteaba hacer ya que no quiero romper la compatibilidad en el futuro. Sin embargo sí que la he roto con la versión provisional que ya os puse para probar. Así que cuando salga la siguiente, no intentéis ejecutar las roms que ya teníais!

1 1 respuesta
Jastro

#40 Genial a lo de las raspberry. Tengo ganas de darle caña y testear cosillas.

2 1 respuesta
carra

#41 Lo sé! Quería haberos puesto ya las herramientas, pero vuelvo a descubrir que no soy capaz de hacer una documentación contando sólo 4 cosas básicas. Así que estoy tardando un poco más. Eso sí, estoy contento con lo que me va saliendo. Creo que es más o menos completo y fácil de entender.

1 respuesta
Jastro

#42 No pasa nada, cuanto mas clara la doc, menos problemas tenemos luego a la hora de desarrollar

1
carra

Pequeña crisis. Mientras estaba haciendo el programa de test para la memory card, me he encontrado con algo que no funcionaba como debía y lo que hacía el programa no tenía mucho sentido.

En mi caso encontrar un error puede ser bastante complicado porque:

  • Puedo tener un error en el propio programa que estoy escribiendo para Vircon
  • Puede ser un error del compilador (¡horror!) o del ensamblador
  • Tal vez el emulador no lo está ejecutando como debería
  • Puede que TODO esté bien, y haya un problema con el diseño de la consola (¡pánico!)

En este caso es un error en el compilador, creo tenerlo ya localizado. Por supuesto cuando encuentro algo de este tipo paro todo lo demás y esto tiene la prioridad máxima.

Creo que el arreglo en sí no me llevará mucho tiempo.
Por el momento, crisis solucionada.

4 2 respuestas
thenanox

#44 error, o meta error? :p

1 respuesta
carra

#45 Bueno... supongo que ponerse a hacer una consola ya es un error de por sí :rofl::sweat_smile:

1
r2d2rigo

#44 no tienes tests unitarios para descubrir/comprobar estas movidas?

1 respuesta
carra

#47 Tengo algunos tests, pero no con esos métodos. En un compilador la variedad de casos posibles a cubrir es gigante, incluso en uno un poco simplificado como el mío. Por ahora le doy prioridad a avanzar, ya que si trato de hacerlo todo muy metódico seguramente se me va a hacer muy árido y puedo acabar más fácilmente abandonando el proyecto.

1
B

@carra que tanto sabes de WebAssembly?

1 1 respuesta
carra

#49 Pues entre cero y nada :sweat_smile:. Nunca me he dedicado a desarrollo web. Sé lo básico de HTML, CSS y Javascript, pero no mucho más. Reconozco que sí me molaría explorar WebAssembly y WebGL, pero de momento voy a tener las manos llenas jeje

1 respuesta
B

#50 esto iría más bien de c++ eh... El primer enlace de Google, estoy con el móvil sino pondría algo mejor...

https://blog.esciencecenter.nl/using-c-in-a-web-app-with-webassembly-efd78c08469

Echale un vistazo al enlace aunque no llegues a investigar el tema.

1 1 respuesta
carra

#51 No tiene mala pinta! Alguien me recomendó algo parecido en el hilo de Climb to the Top, y que además parece que se podía usar también con código de SDL como uso yo.

Claro, luego habría que ver qué tal funciona en la práctica. Siempre te lo van a vender como muy automático pero supongo que en un programa más complejo no lo será tanto o podrá dar algún problema. Algún día se puede probar. Aunque para eso primero habrá que tener una web.

2
carra

Hoy os subiré la nueva versión, que ya va a incluir las herramientas de desarrollo y la documentación. Hay también un par de pequeños programas de tutorial para quien prefiera aprender con ejemplos. También voy a incluir los fuentes de todos los programas que tengo hechos, bios incluída. Todos incluyen bastantes comentarios, así que los podéis usar como ejemplos más avanzados.

También he hecho que el compilador nos ayude cuando hay diferencias con el C estándar. Por ejemplo si intentamos crear un enumerado nos dirá que no está soportado, en vez de tonterías tipo "la variable enum no está declarada". Esto en la práctica ayuda muchísimo.

Cuando suba la nueva versión voy a borrar la que puse antes. A fin de cuentas era provisional, y no es compatible con la actual. De todas formas, todo lo que incluía lo incluye también la nueva.

2
carra

Como prometí, aquí lo tenéis:
DESCARGAS VIRCON32

También he actualizado el primer post del hilo para incluir las descargas allí.

Como no todo el mundo se pondrá a programar, he dividido la descarga en 2: por un lado el emulador con algunas roms, y por otro las herramientas de desarrollo que incluyen documentación y fuentes de las diversas roms.


Para crear juegos:
Os recomiendo que lo primero que hagáis sea leer la guía llamada "Cómo crear juegos", que lo explica todo desde cero. También, en los fuentes tenéis un par de proyectos que son tutoriales muy básicos para que veáis cómo se pone esto en práctica.

De todas formas, ya que somos pocos, si a alguien le surge alguna duda o las herramientas le dan problemas puede decírmelo y le ayudaré :thumbsup:

3
B

Me he leído los pdf por encima, así de primeras veo que lo tienes todo muy estudiado y "cerrado".

Cuando tenga tiempo lo miro más a fondo y si puedo aportar algo comento.

Muy profesional. Felicitaciones @carra, gran curro... muy TOP

1 1 respuesta
B

He leído la documentación del development kit y está muy detallado, también he probado el arkanoid que tienes hecho jajaj muy guapo. Hay mucho curro detrás de esto.

Tengo ganas de pelearme que ya he terminado los exámenes.

He visto los 4 tipos datos básicos, y al no existir char los strings los metes como array de enteros, pero ¿cómo usarías una de esas constantes en el código?

2 1 respuesta
B

Tengo una pregunta, ¿cómo has llegado hasta aquí? es decir ¿que formación tienes para llegar al nivel de crearte tu propia consola y tu propio compilador?

1 respuesta
carra

#55 Gracias! Me alegra que lo veas todo cerrado porque era uno de mis objetivos. Hace algún tiempo hice un emulador de Chip-8, que es un sistema para calculadoras gráficas donde hay unos pocos juegos. Me sorprendió que las especificaciones se dejaban algunas cosas muy importantes, por ejemplo la velocidad a la que tiene que correr la máquina. Algunos juegos iban mucho más rápido que otros.

En mi máquina he intentado que nada quede sin decir, y que lo que diga no tenga varias interpretaciones. Y si algo las tuviera, como ya existe un emulador "oficial", se puede tomar como referencia para ver lo que debe hacer Vircon. Así se ponen las cosas mucho más fáciles a quien hace juegos o crea emuladores (lo digo por experiencia).

1
carra
#56vago_21:

He visto los 4 tipos datos básicos, y al no existir char los strings los metes como array de enteros, pero ¿cómo usarías una de esas constantes en el código?

No sé si te entiendo bien :sweat_smile:. Las string funcionan igual que en C, sólo que se almacenan con 4 bytes por caracter. Pero para ti cada caracter sigue siendo una posición individual (no se puede acceder a los bytes separados). Es decir, las puedes manejar así:

int* Text = "hola";
if( Text[ 3 ] == 'a' ) return;

Sobre lo de cómo he llegado a esto, más tarde te contesto en condiciones, ahora no me puedo entretener mucho :wink:

1 respuesta
B

#59 Ok gracias, no sé demasiado de C, pero se creaban como tipo char no?

char hola[20] = "";

¿no era así?

Pero bueno, que yo ya tengo una idea para empezar, ya te iré molestando.

Sobre lo de cómo he llegado a esto, más tarde te contesto en condiciones, ahora no me puedo entretener mucho

sin problemas

1 respuesta