Avances en el desarrollo del ZX-Uno

Sinclair QL, ZX81, +2, +3, 128K ...
Avatar de Usuario
antoniovillena
Amiga 1200
Amiga 1200
Mensajes: 2013
Registrado: 16 Abr 2012, 21:22
Gracias recibidas: 8 veces

Avances en el desarrollo del ZX-Uno

Mensajepor antoniovillena » 28 Feb 2014, 14:36

Imagen

Este hilo es continuación de la saga:

PiZx: Clon barato de spectrum con FPGA (WIP)
ZX-Uno, clon barato basado en FPGA
Montaje del ZXUNO
Sintetizando un Spectrum con el ZX-Uno
Teclado para ZX-Uno (fork)

Web oficial del proyecto:
zxuno.speccy.org

Repositorio de McLeod:
http://www.atc.us.es/svn/zxuno/
Usuario: guest
Contraseña: zxuno

Estado de los prototipos, por orden de montaje:

Código: Seleccionar todo

  1 superfo         montada y funcionando
+ 2 jepalza         montada, no llegó a funcionar
+ 3 McLeod          montada, funcionó y se estropeó
  4 antoniovillena  montada y funcionando
  5 julio           montada y funcionando
  6 jepalza         montada y funcionando
  7 McLeod          montada y funcionando
  8 garillete       sin montar
  9 flopping        sin montar
 10 radastan        sin montar
*11 TallerSeverino  en fase de montaje

+No funcionan, ambos pidieron un segundo prototipo
*Se está buscando los componentes por su cuenta
Última edición por antoniovillena el 12 Abr 2014, 03:24, editado 2 veces en total.

jepalza

Re: Avances en el desarrollo del ZX-Uno

Mensajepor jepalza » 01 Mar 2014, 16:26

Continuamos entonces por aquí.
He tenido parado el tema, hoy he retomado, pero no consigo avanzar. Me atasco. Así que, "nesecito sopitas".... >|

Tengo ya implementado el tema del SPI para que cargue una ROM mas un SNA pegados juntos (de modo que tengamos, 16k de rom mas 48k de SNA=64k) y esos 64k acoplarlos al MCS generado del ZXUNO y que el módulo SPI lo coja desde la posición 0x40000 longitud 0x10000 y lo copie en la SRAM bloque 2 desde la 0 (tal como Mcleod_Ideafix ha preparado el "dos_memorias").
Hasta ahí todo correcto, pero no consigo ver avances. El ZXUNO arranca, pero me arranca la ROM generada en la BRAM, y al iniciarse el Spectrum, resetea la RAM y adios a lo copiado por el SPI.
SI anulo la ROM, no me borra lo copiado, pero tampoco sale el SNA que debería salir (desde la direccion de inicio que lleva el SNA) o en su defecto la ROM que acompaña a este.
He preparado el BOOTLOADER de modo que se carga solo cuando RST_N es contrario al estado del resto del Spectrum, para que le de tiempo a cargarse, pero tampoco así logro nada.

¿alguna ayuda/idea? ¿Mcleod, le puedes echar un ojillo?

Pego aquí los cuatro ficheros tocados del TEST9 (no el de radas, sino el anterior), para que solo sea "copiar/pegar" y sintetizar. Os construis un MCS con una ROM pegada en la 0x40000 y podéis hacer pruebas.

A ver si entre los tres o cuatro que podemos, conseguimos hacerlo andar, que para mi esto es importante, por que si lo logramos, solo tenemos que meter un pequeño programa de boot (que lo he visto ya creado en una página que tienen un ZX metido en una Altera DE1) y con eso, podemos acceder a la SD desde el Spectrum.
Adjuntos
mirar_SPI_test9.rar
(8.7 KiB) Descargado 498 veces

Avatar de Usuario
mcleod_ideafix
Amiga 2500
Amiga 2500
Mensajes: 5316
Registrado: 06 Oct 2009, 04:12
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Vectrex
Primera consola: TV Games/Pong Clone
Ubicación: Jerez de la Frontera
Gracias dadas: 12 veces
Gracias recibidas: 53 veces
Contactar:

Re: Avances en el desarrollo del ZX-Uno

Mensajepor mcleod_ideafix » 01 Mar 2014, 23:27

En cuanto pueda lo retomo... me ha pillado una fiebre tonta que me ha dejado todo flojo en cama todo el día de hoy. A ver si me recupero, me espabilo, y sigo :)
Recuerda: cada vez que se implementa un sistema clásico en FPGA, Dios mata a un purista

Avatar de Usuario
mcleod_ideafix
Amiga 2500
Amiga 2500
Mensajes: 5316
Registrado: 06 Oct 2009, 04:12
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Vectrex
Primera consola: TV Games/Pong Clone
Ubicación: Jerez de la Frontera
Gracias dadas: 12 veces
Gracias recibidas: 53 veces
Contactar:

Re: Avances en el desarrollo del ZX-Uno

Mensajepor mcleod_ideafix » 04 Mar 2014, 02:25

Esto ya es otra cosa... :D ROM leída desde la Flash, transferida a memoria, y usada para arrancar al Spectrum. La interfaz ZXMMC aún no está diseñada, por eso aparece 0 MMC en la pantalla.

Imagen

Luego subo al respositorio los cambios y os cuento algunas cosas importantes...
Recuerda: cada vez que se implementa un sistema clásico en FPGA, Dios mata a un purista

Avatar de Usuario
antoniovillena
Amiga 1200
Amiga 1200
Mensajes: 2013
Registrado: 16 Abr 2012, 21:22
Gracias recibidas: 8 veces

Re: Avances en el desarrollo del ZX-Uno

Mensajepor antoniovillena » 04 Mar 2014, 02:33

Biennn. Yo mañana vuelvo a casa. Que ganas tengo ya de probar los últimos avances. Tengo una refactorización de CargandoLeches a medio hacer.

Una preguntilla, ¿la transferencia desde Flash a SRAM cómo la has hecho? ¿En plan trasferencia directa o vía puerto Z80+bootloader?

Avatar de Usuario
mcleod_ideafix
Amiga 2500
Amiga 2500
Mensajes: 5316
Registrado: 06 Oct 2009, 04:12
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Vectrex
Primera consola: TV Games/Pong Clone
Ubicación: Jerez de la Frontera
Gracias dadas: 12 veces
Gracias recibidas: 53 veces
Contactar:

Re: Avances en el desarrollo del ZX-Uno

Mensajepor mcleod_ideafix » 04 Mar 2014, 02:39

antoniovillena escribió:Una preguntilla, ¿la transferencia desde Flash a SRAM cómo la has hecho? ¿En plan trasferencia directa o vía puerto Z80+bootloader?

Puerto Z80 + bootloader. Otra opción hubiera sido añadir complejidad innecesaria al diseño.

Hay un par de puertos de E/S dedicados a la Flash SPI, de forma que desde programa se puede leer y/o escribir en ella. Cuando el ZX-Uno arranca lo hace usando una ROM interna, que hace de bootloader (aunque ahora mismo esa ROM interna no es más que la ROM estándar del 48K, que viene muy bien para hacer pruebas).

Esta ROM interna será la que tenga el programa que saca el banner de ZX-Uno, lista los contenidos de la Flash, da a elegir al usuario qué ROM arrancar, la copia en ciertos bancos de la SRAM que se convertirán en la nueva ROM, y por último, hace el consabido salto a la dirección 0 para ejecutar la nueva ROM.
Recuerda: cada vez que se implementa un sistema clásico en FPGA, Dios mata a un purista

Avatar de Usuario
antoniovillena
Amiga 1200
Amiga 1200
Mensajes: 2013
Registrado: 16 Abr 2012, 21:22
Gracias recibidas: 8 veces

Re: Avances en el desarrollo del ZX-Uno

Mensajepor antoniovillena » 04 Mar 2014, 02:46

Genial. Precisamente lo preguntaba para ver si podía aportar algo en la escritura de la BIOS. Ahora mismo estoy buscando los mensajes en los que hablábamos del formato de la tabla de particiones dentro de la SPI Flash, que vendría a ser cómo organizamos la parte que no se usa para almacenar la configuración de la FPGA.

-- Actualizado 04 Mar 2014, 02:54 --

Ya lo he encontrado. En vez de linkar hago un copy/paste de lo importante, ahí va:

--------------------

Según los datasheets, la SPI Flash acepta $80000 bytes, es decir desde la dirección 0 hasta la dirección $7ffff. Por otra parte la FPGA necesita 1,353,728 bits de configuración, esto son 169216 bytes, en hexadecimal $29500. Digamos que nos sobran $80000-$29500= $56b00 (346.75Kb). Esto nos da para más de 21 ROMs de 16K. No obstante prefiero no apurar tanto la SPI Flash, porque al fin y al cabo en la SD todo el espacio que queramos. Así que propongo usar:
La dirección $30000 para la configuración/tabla de particiones
Desde $40000 hasta $7ffff para guardar 16 bancos roms de 16K cada uno.

Para la configuración propongo esto:
  • $30000: Tabla de ROMs
  • $30200: Parámetros de la BIOS

En los parámetros de la BIOS se almacenarían cosas como si debe aparecer el logo de ZX-Uno al comienzo, con qué ROM y máquina bootear, etc... Serían cosas genéricas independientemente de la máquina/ROM que elijamos.

En la tabla de ROMs el máximo es de 16 elementos (en el caso de que todas sean de 16K), aunque no es necesario usarlas todas. Cada item de la tabla ocuparía 32 bytes, así que el item 1 sería $30000, el item 2 $30020 y así hasta el item 16 que sería $301e0. De esos 32 bytes en los dos primeros podemos guardar lo esencial y dejamos los 30 bytes últimos con un identificador ASCII (rellenando con ceros) con un texto descriptivo tipo "English Amstrad +2A 4.0". En los 2 primeros se puede poner:
  • Byte 0: Máquina a implementar, aquí ya va implícito el tamaño de la ROM y el modo de inicio (48K/128K).
  • Byte 1: Dirección inicial (4 bits) y nos sobran 4 bits para flags que queramos implementar. Sólo necesitamos 4 bits porque limitamos las posibles ubicaciones a sólo 16.

Falta el detalle de "Máquina a implementar". De aquí también nos pueden sobrar bits para usarlos como flags.

--------------------

Si te parece bien que colabore, podrías darme acceso al repositorio para yo ir desarrollando la BIOS.

Avatar de Usuario
mcleod_ideafix
Amiga 2500
Amiga 2500
Mensajes: 5316
Registrado: 06 Oct 2009, 04:12
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Vectrex
Primera consola: TV Games/Pong Clone
Ubicación: Jerez de la Frontera
Gracias dadas: 12 veces
Gracias recibidas: 53 veces
Contactar:

Re: Avances en el desarrollo del ZX-Uno

Mensajepor mcleod_ideafix » 04 Mar 2014, 03:02

antoniovillena escribió:Genial. Precisamente lo preguntaba para ver si podía aportar algo en la escritura de la BIOS.

¿Aportar? ¡¡Cuento enteramente contigo para esa tarea!! Estoy dando los últimos toques, subo el repositorio, y cuento los "gory details". A partir de ahí, ya puedes trabajar :)
Recuerda: cada vez que se implementa un sistema clásico en FPGA, Dios mata a un purista

Avatar de Usuario
antoniovillena
Amiga 1200
Amiga 1200
Mensajes: 2013
Registrado: 16 Abr 2012, 21:22
Gracias recibidas: 8 veces

Re: Avances en el desarrollo del ZX-Uno

Mensajepor antoniovillena » 04 Mar 2014, 03:09

mcleod_ideafix escribió:¿Aportar? ¡¡Cuento enteramente contigo para esa tarea!! Estoy dando los últimos toques, subo el repositorio, y cuento los "gory details". A partir de ahí, ya puedes trabajar :)


Perfecto. Me meteré de lleno en cuanto pueda, o sea mañana mismo por la noche.

Avatar de Usuario
mcleod_ideafix
Amiga 2500
Amiga 2500
Mensajes: 5316
Registrado: 06 Oct 2009, 04:12
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Vectrex
Primera consola: TV Games/Pong Clone
Ubicación: Jerez de la Frontera
Gracias dadas: 12 veces
Gracias recibidas: 53 veces
Contactar:

Re: Avances en el desarrollo del ZX-Uno

Mensajepor mcleod_ideafix » 04 Mar 2014, 05:18

Bueno, el test10 está subido al repositorio. Hay un BIT y un MCS. La novedad de este MCS es que incorpora un par de ROMs para probar: la del +3e y la Open SE IV.

La gran novedad es que se ha refactorizado toda la descripción del manejador de memoria. Con el anterior era muy difícil incorporar ROMs paginadas en la SRAM. También se ha añadido un puerto SPI para manejar la flash. Este puerto es sencillo, es decir, que no implementa los comandos por hardware, como la descripción de jepalza, sino que es el usuario mediante programa quien le va dando los comandos que sean a la flash escribiéndolos en el puerto SPI.

En el fichero MCS está el diseño sintetizado, más dos ROMs: la ROM del proyecto +3e para ZXMMC (dirección $30000, 64KB), y la ROM Open SE IV de Andrew Owen (dirección $40000, 32KB). Las direcciones dadas son direcciones LBA de la flash (mirar comando 3 de la SPI flash para las lecturas)

Manejo de la RAM
La SRAM de 512KB se divide en 32 páginas de 16KB cada una. Luego veremos como usarla desde el modo boot

Puertos de E/S:
Como ya sabeis, para poder implementar todas las nuevas funcionalidades del clon sin colisionar con hardware existente, se pidió a la comisión ZXI la asignación de dos puertos. Nos han dado el $FC3B y el $FD3B. En decimal son el 64571 y el 64827.

Para poder implementar múltiples registros de E/S con solo dos puertos, se ha usado el método de registro indirecto: un puerto guarda la dirección del registro de E/S sobre el que queremos actuar, y el otro puerto lee/escribe a ese registro. De esta forma, tenemos disponibles hasta 256 registros diferentes.

La asignación actual de los registros es la siguiente:

Código: Seleccionar todo

Addr  |   Dir  |  Description
------+--------+----------------------------------------------
$00   |   R/W  | Master configuration: 0 0 0 0 0 ENDIV ENBOOT  . ENDIV=1 enables DIVMMC . ENBOOT=1 boot ROM in use
$01   |   R/W  | Master memory mapper: 0 0 0 B4 B2 B2 B1 B0    . B4-B0: 16K bank to map onto $C000-$FFFF.
      |        |                          System RAM (128K) uses banks 0-7
      |        |                          System ROM (64K) is located from bank 8 to bank 11.
      |        |                          DIVMMC ROM (ESXDOS) is located at bank 12 (16KB, only 8KB are used).
      |        |                          DIVMMC RAM is located at banks 13-14 (32KB)
$02   |   R/W  | Flash SPI port
$03   |   R/W  | Flash SPI CS pin


Así, por ejemplo (y usando el BASIC), si queremos leer el valor del registro maestro de configuración, que se encuentra en el registro 0, haremos:

Código: Seleccionar todo

OUT 64571,0
PRINT IN 64827


El registro 0 (MASTERCONF) sirve para configurar el clon justo antes de lanzar una ROM. Ahora mismo sólo tiene dos bits: uno para indicar que estamos en modo boot, y otro para habilitar o no el DIVMMC (que ahora mismo no hace nada). Sólo puede ser escrito desde el modo boot.

El modo boot es aquel en el que entra la máquina tras un encendido, o tras pulsar Ctrl-Alt-Bkspace. Desde él, la única ROM que se ejecuta es la interna (y que en este momento no es más que una copia de la ROM del 48K, pero aquí deberá estar la que escriba Antonio). Para salir del modo boot, hay que escribir un 0 en el bit 0 del registro MASTERCONF.

Pulsando Ctrl-Alt-Supr no se vuelve al modo boot.


En el modo boot, el mapa de memoria es el siguiente:

Código: Seleccionar todo

$0000 - $3FFF : ROM de boot.
$4000 - $7FFF : SRAM, página 5
$8000 - $BFFF : SRAM, página 2
$C000 - $FFFF : SRAM, página indicada por el valor del registro MASTERMAPPER


El registro MASTERMAPPER (registro 1) contiene un valor de 5 bits, de 0 a 31, que indica cuál de las 32 páginas de 16KB pertenecientes a la SRAM debe "verse" en este intervalo. Este registro sólo puede ser escrito desde el modo boot.

El siguiente programa, sólo ejecutable en modo boot, hace una comprobación rápida de las 32 páginas de RAM presentes en el sistema: en cada página, en la primera posición de memoria cada una, guarda un número igual al índice de esa página. Luego se itera de nuevo y se muestra lo guardado. Si todo sale bien, debe verse en pantalla la secuencia 0,1,2,3.....,31

Código: Seleccionar todo

10 CLEAR 49151
20 OUT 64571,1
30 FOR n=0 TO 31: OUT 64827,n: POKE 49152,n: NEXT n
40 PRINT
50 FOR n=0 TO 31: OUT 64827,n: PRINT PEEK 49152;" ";: NEXT n

Nótese que al escribir en la página 5, en realidad se escribe a pantalla por lo que se ven unos puntitos en la esquina superior izquierda, que corresponden al valor (5) escrito en ella. De ahí el PRINT, para que la segunda parte del programa no machaque el dato.

Puerto SPI Flash

Para poder manejar la flash hay que poder enviar comandos y recibir resultados. Además, durante el transcurso de una sesión con la flash, la línea FLASH CS debe permanecer a nivel bajo todo el tiempo, subiendo al finalizar la sesión. Se han dispuesto dos registros: el registro 2 (FLASHSPI) y el registro 3 (FLASHCS)

El registro FLASHCS es muy simple: sólo se usa el bit 0, y su valor es el estado que tomará el pin CS de la SPI Flash. Así, antes de enviar comandos/datos a la flash, hay que habilitarla con:

Código: Seleccionar todo

OUT 64571,3: OUT 64827,0


Y al finalizar, para deseleccionarla:

Código: Seleccionar todo

OUT 64571,3: OUT 64827,1



Mientras la línea CS está seleccionada (a nivel bajo) podemos enviar comandos y datos a la flash, o recibir estado e información. Consultar el datasheet de la flash para ver el juego de instrucciones soportado.

El comando más usual va a ser el comando 3 (read). Este comando le sigue una dirección de 24 bits donde comienzan los datos que queremos leer, y a continuación, en cada lectura obtenemos un byte. La dirección se da troceada en 3 bytes, comenzando por el más significativo.

Por ejemplo, para ver los primeros 10 bytes de la ROM almacenada en la flash en la dirección LBA 030000h haremos:

Código: Seleccionar todo

10 OUT 64571,3:OUT 64827,0 : REM CS a nivel bajo
20 OUT 64571,2 : REM selecciono FLASHSPI
30 OUT 64827,3 : REM comando de lectura
40 OUT 64827,3:OUT 64827,0:OUT 64827,0 : REM direccion LBA
50 FOR n=1 TO 10:PRINT IN 64827;" ";:NEXT n
60 OUT 64571,3:OUT 64827,1 : REM CS de nuevo a nivel alto


Hay un ejemplo más elaborado en ensamblador en el propio repositorio (en test10). Se llama testrom.asm y está escrito para PASMO (lo digo por las macros). Con ese programa puedes escoger (modificando el código fuente) cargar la ROM del proyecto +3e, o la ROM Open SE IV de Andrew Owen.


Ahora un aviso importante
Bueno, algunos:
- Nos estamos acercando al 100% de ocupación de la FPGA y aún nos falta diseñar el puerto SPI para la SD y toda la lógica de soporte del DIVMMC. Ahora estamos al 85% de ocupación.
- Si cambio la estrategia de síntesis a optimizar área en lugar de velocidad, el resultado no nos sirve, ya que aunque reducimos la ocupación al 75%, la máxima velocidad a la que puede ir el diseño en ese caso es de 13MHz. Necesitamos en algunos sitios llegar holgados a 28MHz (el módulo que implementa el doble puerto en la SRAM por ejemplo).
- El prototipo tiene serios problemas de ruido. En días pasados he visto en el foro probemas al grabar la SPI Flash con diversos cables grabadores, aunque el BIT se transfiere bien. He podido ver que la SPI Flash es un poco delicada a este respecto, y parece que según sea la calidad del alimentador que uses en el ZX-Uno, se portará mejor o peor. La cosa es grave porque cuando no le da la gana de portarse bien, la lectura de la SPI Flash devuelve bytes basura entre los bytes verdaderos. Una opción que estoy barajando para paliar esto es bajar la velocidad del reloj del SPI Flash (ahora mismo a 14MHz 25MHz). Esto puede implicar algún que otro cambio en la forma de leer la SPI Flash para volcarla a SRAM.
- En un vistazo rápido a la placa, veo algo que no está contribuyendo bien en esto, y es que las pistas de reloj y datos de la SPI Flash, aunque están muy cerquita de la FPGA, no tienen por de bajo una pista de masa, como debería ser para disminuir la impedancia. Sería conveniente mejorar esto.
- A la placa el falta un buen plano de masa. Si se hace con 4 capas no hay problema, pero a dos capas y con la densidad de pistas y componentes, el plano de masa está demasiado cuarteado. Como solución de compromiso voy a probar a hacer lo que he visto que tienen algunos aparatos con carcasa de plástico: una chapa de metal (papel de aluminio con plástico por encima para no hacer contacto con la placa) conectada con un cable a un punto de masa de la placa. Quizás sea suficiente :)

-- Actualizado 04 Mar 2014, 05:25 --

Cuando se porta bien, carga Open SE IV sin problemas. Esta es la pantalla inicial, a 80 columnas con el mensaje de copyright :shock:

Imagen

Tecleando una pequeña demo en BASIC que Andrew enseñó en speccy.org para mostrar comandos gráficos dibujando en toda la pantalla:

Imagen

El resultado :)

Imagen
Recuerda: cada vez que se implementa un sistema clásico en FPGA, Dios mata a un purista


Volver a “Sinclair/Spectrum”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 11 invitados