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 RAMLa 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:
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 FlashPara 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:
Y al finalizar, para deseleccionarla:
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 importanteBueno, 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

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

El resultado

