Hace algún tiempo escribí un emulador de Zx Spectrum enfocado a la reproducción de archivos RZX, los cuales contienen el programa de un juego y la grabación de las pulsaciones de teclado y joystick de alguien jugando a ese juego.

Dichos archivos se utilizan principalmente para la grabación de partidas de juegos de Spectrum, y al reproducirles se puede ver la partida tal y como se jugó originalmente. Se puede encontrar una buena colección de archivos RZX en ‘‘The RZX Archive’’.

El proyecto se llama SpecNix y está hospedado en CodePlex. Contiene algún bug y no reproduce correctamente todos los archivos RZX pero un buen puñado de ellos si que son reproducidos correctamente.

Con la aparición de los bits de la Beta 1 de Silverlight 2 decidí portar el proyecto a dicho entorno, habiéndose requerido algunas pequeñas modificaciones principalmente en la librería SharpZipLib utilizada para descomprimir una parte de los archivos RZX.

También fue necesario adaptar la parte dedicada a la representación gráfica de la salida de vídeo del Spectrum.

El resultado se puede ver a continuación. Debido principalmente a los dos archivos RZX incluidos en el ensamblado, la aplicación ocupa en torno a 1MB.

Al pulsar en cualquiera de los dos botones comenzará ejecución del juego en cuestión y la reproducción del archivo RZX.

Los propietarios de todos los archivos binarios incluidos en el emulador han permitido su distribución como se puede leer en las páginas enlazadas a través de los bloques de texto con los nombres de las compañías (en rojo), así como en el inferior (en amarillo).

Aunque seguro que el código tiene muchos puntos posibles de optimización, el mayor problema de rendimiento parece ser debido a que Silverlight no proporciona una forma de crear y manipular mapas de bits, por lo que se tienen que simular utilizando un Canvas con rectángulos distribuidos a lo largo de su superficie a modo de pixels.

No obstante, debido a que la resolución nativa del Spectrum es relativamente baja (256x192) y solo permite un número muy limitado de colores, en este caso, se consigue un rendimiento más que aceptable modificando solo los pixels (relleno de los rectángulos) que han cambiado de un frame a otro.

Se puede descargar el código fuente aquí.