Core de Spectrum alternativo
Publicado: 04 Sep 2016, 11:20
Poco antes de que empezara el desarrollo del ZX-Uno me compré una placa de desarrollo de FPGAs, la Papilio Pro. Un poco por eso y por el respeto que me daba soldar los componentes SMD, al final no me apunté a las pruebas de los prototipos, así que, como quería aprender a usar las FPGAs, me puse a diseñar mi propio clon de Spectrum.
Para no enrollarme mucho, a base de un poco de estudio, y muchas pruebas y errores, este es el resultado: ZXpp
Son seis pasos:
01 - Vídeo VGA
02 - decodificando la pantalla
03 - Juntando las primeras piezas: CPU, ULA, ROM y RAM baja
04 - Añadiendo el resto: RAM alta, teclado, sonido y joystick
05 - Mejorando el sonido: chip AY
06 - Mejorando el teclado
· Implementa un Spectrum 48K.
· El core de la CPU es el TV80. Pensaba que era el mismo que usa el ZX-Uno pero lo he ido a comprobar y resulta que no, que el TV80 está basado en el T80 pero es diferente.
· La ULA es una implementación libre de la del Spectrum basada más en 'como tiene que interpretarse la memoria' más que en como funciona realmente la ULA del Spectrum. No hay contención de memoria y la salida de vídeo es VGA nativa a 640x480@60Hz. Para 'llenar' la pantalla hace un escalado x2 pero sólo de la zona de pixeles. Es decir, que la imagen generada es de 512x384 y el resto se rellena con el color de borde. Es un engendro un poco raro pero funciona en cualquier monitor VGA
· Toda la memoria, ROM y RAM, está implementada con la BRAM de la FPGA. La RAM baja es de doble puerto ya que el Z80 y la ULA funcionan cada uno a su ritmo (la CPU a 3.5 MHz y la ULA a 25,143 MHz).
· Para el teclado PS2 he adaptado éste módulo de Mike Field para la comunicación con el teclado, y he adaptado mi revisión del código para CPLD del interfaz Speckey para la interfaz con el Spectrum.
· También le he añadido un core de chip de sonido AY.
· Como uso toda la BRAM de la FPGA para la memoria del Spectrum no quedan recursos para nada más así que me he quedado a medio implementar el DivMMC. Al menos, mediante un sencillo adaptador, más que nada para no freír la FPGA si no se tiene cuidado, se puede cargar de cinta.
Ahora voy a coger todo esto y lo primero es hacer que funcione en el hardware del ZX-Uno. Luego le iré haciendo mejoras y, sobre todo ahora que dispongo de más RAM, lo primero es que funcione el DivMMC y luego ampliarlo a un 128K.
Para no enrollarme mucho, a base de un poco de estudio, y muchas pruebas y errores, este es el resultado: ZXpp
Son seis pasos:
01 - Vídeo VGA
02 - decodificando la pantalla
03 - Juntando las primeras piezas: CPU, ULA, ROM y RAM baja
04 - Añadiendo el resto: RAM alta, teclado, sonido y joystick
05 - Mejorando el sonido: chip AY
06 - Mejorando el teclado
· Implementa un Spectrum 48K.
· El core de la CPU es el TV80. Pensaba que era el mismo que usa el ZX-Uno pero lo he ido a comprobar y resulta que no, que el TV80 está basado en el T80 pero es diferente.
· La ULA es una implementación libre de la del Spectrum basada más en 'como tiene que interpretarse la memoria' más que en como funciona realmente la ULA del Spectrum. No hay contención de memoria y la salida de vídeo es VGA nativa a 640x480@60Hz. Para 'llenar' la pantalla hace un escalado x2 pero sólo de la zona de pixeles. Es decir, que la imagen generada es de 512x384 y el resto se rellena con el color de borde. Es un engendro un poco raro pero funciona en cualquier monitor VGA
· Toda la memoria, ROM y RAM, está implementada con la BRAM de la FPGA. La RAM baja es de doble puerto ya que el Z80 y la ULA funcionan cada uno a su ritmo (la CPU a 3.5 MHz y la ULA a 25,143 MHz).
· Para el teclado PS2 he adaptado éste módulo de Mike Field para la comunicación con el teclado, y he adaptado mi revisión del código para CPLD del interfaz Speckey para la interfaz con el Spectrum.
· También le he añadido un core de chip de sonido AY.
· Como uso toda la BRAM de la FPGA para la memoria del Spectrum no quedan recursos para nada más así que me he quedado a medio implementar el DivMMC. Al menos, mediante un sencillo adaptador, más que nada para no freír la FPGA si no se tiene cuidado, se puede cargar de cinta.
Ahora voy a coger todo esto y lo primero es hacer que funcione en el hardware del ZX-Uno. Luego le iré haciendo mejoras y, sobre todo ahora que dispongo de más RAM, lo primero es que funcione el DivMMC y luego ampliarlo a un 128K.