Página 1 de 2

Emulador ZX Spectrum 16k en un STM32F103 ARM

Publicado: 25 Dic 2012, 20:01
por jepalza
"Me aburría", y me he puesto ha hacer un emulador de ZX Spectrum 16k (luego explico el porqué 16k) en una placa de prototipos STM32F103 ARM.
Esto sería la continuación de mi "tontería cerebral" inciada AQUI esta mañana.

Esas cosas que te dan en la cabeza, cuando uno se aburre de hacer siempre lo mismo. Me he puesto a investigar cuantos emuladores hay para este tipo de placas ARM, y la verdad, que muy pocos. Lo poco que he encontrado, son de la NES, la Coleco, Atari2600 y alguna conversión del "Jet Set Willy", pero curiosamente, todos ponen un vídeo funcionando, y nadie pone código fuente o compilado para poderlos probar, por lo que casi diría que son mentiras para ganar visitas a sus vídeos. :---)

Por eso, hace unos días (tres o cuatro) me puse a convertir un emulador que ya tengo del Spectrum en PC, pero para este aparatito. Es un chisme curioso, del que alguna vez ya he hablado AQUI, muy útil con su pantalla LCD, pero muy limitado en recursos. Solo tiene 128k de flash, 20k de ram y 70mhz de velocidad, eso sí, en 32bits de proceso. Debido a sus escasos 20k, solo he podido implementar un Spectrum de 16k (obvio). La ROM no tengo problema, ya que, junto al código aún sin pulir, ocupan unos 90k de los 128, osea, que me queda espacio justo para acbar el emulador.

Ya es funcional, como veís, (aunque para probarlo, he metido una ROM de 8k, en lugar de la original de 16k), pero me queda meterle un teclado PS2 y lectura de "SNA" o "Z80" desde la tarjeta SD que lleva.
No sé si llegaré a acabarlo al 100%, por que últimamente, cuanto mas "viejo", mas vago soy (como bien he dicho en el hilo de "cómo nos afecta la edad"), pero prometo intentarlo, y dejar los fuentes libres al que los quiera (yo no me guardo nada, lo suelto todo :-ss ).

Una pega que tengo por ahora, es la velocidad, ya que, para que vaya a su velocidad, debo saltarme varios cuadros por segundo (la mitad), y eso hace muy tosco el funcionamiento. Tengo que pulir el código para este pequeño cacharro, ya que el emulador deriva de uno de PC, donde no importa cómo esté hecho el código.

Otra idea que tengo, es ponerle SRAM externa, por que tiene pines de sobra, y así meter un 48k (o incluso un 128). Por cierto, no tiene sonido por ahora, por que el chisme no lleva salida para ello, y desconozco como enviar sonido a los GPIO por ahora.

Re: Emulador ZX Spectrum 16k en un STM32F103 ARM

Publicado: 25 Dic 2012, 20:08
por mcleod_ideafix
¡Cómo mola! ¿Qué tool-chain usas? ¿Este chisme tuyo lleva integrado el JTAG?

Re: Emulador ZX Spectrum 16k en un STM32F103 ARM

Publicado: 25 Dic 2012, 20:21
por jepalza
mcleod_ideafix escribió:¡Cómo mola! ¿Qué tool-chain usas? ¿Este chisme tuyo lleva integrado el JTAG?


El "tool-Chain" es propio de ARM (Soft Micro-u4 o uVision4), pero retocado por mi, por que el original está muy enrevesado y es asqueroso de interpretar, ademas de tener la gran mayoría de comentarios en chino. Simplemente, reuní en un pequeño pack, las cuatro cadenas de uso del LCD, los GPIO, los Leds, botones, SD y demas, exclusivos de mi hard, para ir a tiro hecho, sin rebuscar en sus cientos de megas de info.

En cuanto al JTAG, no lo lleva integrado, tiene su conector para enchufar uno de ARM (como ESTE), pero lo bueno, es que este circuito no lo necesita, por que puede programar mediante el USB en modo RS232 (115200 baud), y para los 128k que admite, es suficiente en velocidad (menos de 30 segundos)

Re: Emulador ZX Spectrum 16k en un STM32F103 ARM

Publicado: 25 Dic 2012, 20:30
por Luigi
Joder lo que hace el aburrimiento. Como dicen por mi tierra "menuda cabecica tienes". Enhorabuena

Re: Emulador ZX Spectrum 16k en un STM32F103 ARM

Publicado: 08 Ene 2013, 18:02
por jepalza
He conseguido al fín, meter el emulador de ZX Spectrum 16k en el MINI-STM32 (chip F103RB).
Ya he comentado alguna vez, que es un chip muy simple, para iniciarse justo. Es un ARM de 72Mhz, 128k flash y 20k RAM.
Lo que si tiene es muchas entradas/salidas, ademas de dos botones configurables (los de la izquierda), y dos LEDS de usuario.
La pantalla va por separado, aunque compré todo junto en su día, pero no es parte del MINI-STM32, y yo compré un modelo que lleva ademas una ranura para tarjetas SD (debajo de la pantalla), que es la que uso para leer los SNA del Spectrum.

Como solo tiene 20k de RAM, nada mas se puede meter un Spectrum 16k (o un Jupiter ACE o un ZX81), como le pasaba al OLS.
De los 4k de RAM que le quedan, 1k es para la SD, otro "k" para variables de sistema, y los 2k restante para el emulador en sí. Total, que mas aprovechado imposible. Creo que me han quedado unos 200bytes libres.

Me ha recordado a cuando hice el juego de CPC Abracadabra, que me quedé sin RAM, y tuve que hacer virguerías para que entrara.

La Flash sí que me ha sobrado, solo he gastado unos 100k de los 128k, que incluye los 16K de ROM del Spectrum, y todos los periféricos, como el manejo del LCD, la pantalla táctil, el teclado PS2, la lectura desde SD, y el emulador de Z80 (por cierto, para evitar movidas legales, empleo el de Marat Fayzullin, que permite su uso, mientras no sea comercial).

Previamente a poder hacer el emulador, he tenido que hacerme una librería del STM32 exclusivo para mi "hard", por que cada aparato es diferente (incluso entre iguales, hay diferencias de GPIO). Me he tirado las últimas dos semanas haciendo una librería para leer la SD, la pantall táctil, imprimir en el LCD (textos y gráficos), leer desde el PS2 (esto es invento mio, no había referentes en internet), y con esas librerías adaptadas, he metido el resto.

La mayor pega (aparte de la RAM, que limita el tema), es la velocidad. El cacharro funciona a 72mhz, pero lo he forzado sin problemas a 128mhz, y he ganado mucho para emular, pero el LCD es lentíiiiisimo, y hace cuello de botella. Por eso se ve tan lento en el vídeo. No lo he logrado hacer mejor (por ahora). Hay un modo "hard", que si sueldo un par de puntos al LCD, pasa de tener 16bits de color a solo 8bits (256 colores), con lo que se gana en velocidad, pero aún no lo he hecho.

He tratado de optimizar el código, pero me pierdo entre tantas líneas (empezar de cero es fácil, pero cuando crece en archivos y líneas, se hace inmanejable, te vuelves loco al final). Es algo que dejo para mas adelante.

Ahora lo que mas me interesaba era que funcionara, y así es. No es como un Xilinx en velocidad, pero en tamaño, le gana, por que incluye todo en el tamaño de una cajetilla de tabaco. Esto ha sido por puro placer, por competir conmigo mismo.

Cuando depure el código, lo pondré en mi web, libre de uso, por que según mis fuentes de información (o sea, "San Gugle") no existe nada igual en el mundo (solo encontré "simuladores", que no emuladores, del JetSetWilly o del Mario Bros de la NES).

En el vídeo se ve que cometo errores al tratar de cargar juegos, pero mirar a través de la cámara y tratar de "picar" en la pantalla en "3d" es muy difícil. Se me ha colado por ahí una imágen de mis hijos (estuve haciendo pruebas para convertir este cacharrillo en un cuadro de fotos a medida), pero como se ve de pasada, lo dejo ahí ;-)

Nota final: a este chisme se le puede poner SRAM externa (hay pines de sobra) pero debido a lo poco potente que es, no merece la pena esforzarse (no al menos, con ese LCD). Lo dejo en tareas pendientes para otro día que me aburra.



Re: Emulador ZX Spectrum 16k en un STM32F103 ARM

Publicado: 08 Ene 2013, 18:23
por radastan
Joseba, lo tuyo con las FPGA, CPLD, y similares es de órdago. Has pasado de ser un enemigo de estos chismes a ser el primer defensor.

Apabullante.

Que ganas de poder empezar nuevamente con mi ZDP-80 (¡ya he terminado la mudanza!) y poder pasarme a estos chismes también.

Re: Emulador ZX Spectrum 16k en un STM32F103 ARM

Publicado: 08 Ene 2013, 18:28
por mcleod_ideafix
radastan escribió:Joseba, lo tuyo con las FPGA, CPLD, y similares es de órdago. Has pasado de ser un enemigo de estos chismes a ser el primer defensor.

Errrr... esto no es ni una CPLD ni una FPGA... Es un microcontrolador de 32 bits

Re: Emulador ZX Spectrum 16k en un STM32F103 ARM

Publicado: 08 Ene 2013, 18:32
por jepalza
Digamos, que ye me he aburrido de la electrónica digital, tras tantos años, y ahora toca la electrónica "virtualizada".

Por cierto, para el que no lo sepa, los SOC ARM (como el de este chip) son los típicos de teléfonos móviles Android, Windows Mobile, o tablet PC. Hay cuadros de fotos digitales que tambien lo llevan. Y las PDA de antaño (ahora clásicas retro) tambien llevan en su mayoría un ARM. Pero de mayores velocidades, lógico. Este solo da 72 (máximo 128 forzado), cuando una PDA de hace 12-14 años, ya daba al menos 200mhz. Un móvil moderno, dan un mínimo de 400mhz, lo normal es que den entre 600 y 1ghz, una diferencia de 1 a 10 sobre este "pobre" ARM, pero para jugar y hacer cosillas en él, va sobrado (por ejemplo, hacer un robot, o un cuadro de fotos o un terminal de datos, etc.)

Re: Emulador ZX Spectrum 16k en un STM32F103 ARM

Publicado: 08 Ene 2013, 19:05
por radastan
mcleod_ideafix escribió:
radastan escribió:Joseba, lo tuyo con las FPGA, CPLD, y similares es de órdago. Has pasado de ser un enemigo de estos chismes a ser el primer defensor.

Errrr... esto no es ni una CPLD ni una FPGA... Es un microcontrolador de 32 bits


Era una forma de hablar, conozco desde hace tiempo los STM32, muy usados en telecomunicaciones como procesadores digitales de señal (DSP). Tengo manuales y CD's de cuando Franco era corneta de otros microcontroladores similares (en concreto los de Texas Instruments).

Os recomiendo echar un vistazo en:

http://www.ti.com/lsds/ti/dsp/overview.page

Los hay con 320Kb de RAM por menos de 10 euros... ¿alguien dice ZX Spectrum 128K? ¿Un Sam Coupé con 256K?

La serie C5000 ya viene preparada para manejar USB y SD/MMC de serie y todo, con velocidades hasta 300 MHz, los mencionados 320Kb de RAM, etc.

Re: Emulador ZX Spectrum 16k en un STM32F103 ARM

Publicado: 08 Ene 2013, 19:19
por ZX-81
jepalza escribió:Digamos, que ye me he aburrido de la electrónica digital, tras tantos años, y ahora toca la electrónica "virtualizada".

Por cierto, para el que no lo sepa, los SOC ARM (como el de este chip) son los típicos de teléfonos móviles Android, Windows Mobile, o tablet PC. Hay cuadros de fotos digitales que tambien lo llevan. Y las PDA de antaño (ahora clásicas retro) tambien llevan en su mayoría un ARM. Pero de mayores velocidades, lógico. Este solo da 72 (máximo 128 forzado), cuando una PDA de hace 12-14 años, ya daba al menos 200mhz. Un móvil moderno, dan un mínimo de 400mhz, lo normal es que den entre 600 y 1ghz, una diferencia de 1 a 10 sobre este "pobre" ARM, pero para jugar y hacer cosillas en él, va sobrado (por ejemplo, hacer un robot, o un cuadro de fotos o un terminal de datos, etc.)


Viendo la página de ST observo que hay modelos de la misma familia que ese pero con hasta 1 MB de Flash y 96 KB de RAM, que daría para implementar un 48k con relativa comodidad. Lo que ya desconozco es si son mucho más caros que el modelo que has usado.

Dan ganas de probar el aparatito... :-)~~