Buenas,
Soy el perpetrador del emulador bare-metal para la Raspberry PI
ZXBaremulator. Por aquí ando, gracias a empardopo, dispuesto a aclarar cualquier duda respecto del emulador.
Lo primero, a la vista de algún comentario realizado en este hilo, decir que aunque empecé el emulador usando una Raspberry PI B+ actualmente esa línea está abandonada. Para desarrollar el emulador utilizo una librería llamada Circle y, en principio, solo tenía posibilidad de emular el sonido usando PWM lo que tenía el inconveniente de necesitar conectar unos auriculares al conector de 3,5mm, ya que no había manera de sacar el sonido por HDMI.
Tras un trabajo hercúleo por parte de Rene Stange, autor de la librería, consiguió sacar sonido por HDMI pero, ay! de mi, ay! infelice, nada es perfecto. El envío de los samples al VideoCore para que lo saque por el conector HDMI necesita de unos tiempos muy estrictos para ir bien. El scheduler de Circle es muy sencillo, uno de tipo cooperativo, como en los peores tiempos del infame Windows 3.11, así que la única manera de sacar sonido correctamente era dedicar una CPU para la emulación del Spectrum y otra, la principal, para todas las tareas auxiliares.
Decir además que tuve ciertos problemas con dispositivos USB, mayormente teclados, y que la solución en la librería fue manejar los dispositivos USB de diferente manera que conlleva manejar 8000 interrupciones USB por segundo. Ahora ya no falla, de hecho se manejan sin problemas varios dispositivos USB a la vez (un teclado USB estándar, un teclado Recreated ZX, un ratón para emular el Kempston Mouse y un joystick tipo PS4 o XBox One), pero las PI basadas en ARMv6 (A+, B+, Zero y Zero W) no dan de sí. En resumen, desde hace tiempo para ejecutar el emulador solo sirven las PI 2 y 3, en cualquiera de sus modelos.
A cambio, los tiempos de emulación son muy precisos. Por ejemplo, para el Spectrum 48k se genera una interrupción exactamente cada 19,968 ms como en el real, cosa imposible de conseguir usando algún sistema operativo (que no sea de tiempo real), con errores de timing menores de 10 ns. La emulación de los 128k tienen una precisión solo ligeramente peor, de 96 ciclos por segundo, debido a que la PI solo tiene un reloj de 1 Mhz y necesitaría uno al menos 10 veces más preciso.
Y me gustaría hacer una apreciación final a este ladrillo. Programación bare-metal supone que, literalmente, no tienes nada para programar. Gracias a la librería Circle al menos tengo un framework básico de sistema para trabajar, pero que ha sido necesario ir completando y depurando durante los últimos 3 años. Brutal el trabajo realizado por Rene. Pero claro, eso solo son los ladrillos y el cemento básicos. Cualquier pantalla, menú o lo que sea hay que hacerlo desde cero. Aquí no hay librerías SDL, OpenGL, Qt, GTK, WxWidgets o la que sea. Simplemente no hay *NADA*. Sacar por pantalla una simple línea de texto con diferentes colorillos hay que programarlo desde el principio. De modo que esperar un interfaz a lo Retro Virtual Machine es, simplemente, ciencia ficción. Además, el propósito inicial era que la PI pareciera un Spectrum después de arrancar y, de hecho, ya varios usuarios me han solicitado añadir soporte de teclado vía GPIOs para poder aprovechar carcasas de Spectrums estropeados para siempre y meter la PI dentro, pero usando el teclado original. De modo que, aparte del trabajo que supone, no me parece procedente añadirle un GUI moderno.
A ver si en breve consigo publicar una versión que, por fin, permita navegar por directorios para no obligar a tener todos los TAP y TZX en un solo directorio.
Saludos, disculpad por el tocho y aquí estoy, para lo que queráis saber.
![Guiñar ;)](https://arcadespain.info/Foro/Smileys/akyhne/wink.gif)