ZX Spectrum

De ZX-Uno wiki
Saltar a: navegación, buscar

Características

Diagrama de bloques

Diagrama bloques core zx spectrum.png

El core usa el módulo T80, con un pequeño wrapper para separar el bus de datos en dos: uno de entrada a la CPU (cpudin) y otro de salida desde la CPU (cpudout). Un multiplexor elige qué dato entra a la CPU según el periférico o región de memoria que se esté usando en ese momento, y equivale al bus triestado que existiría en el sistema original. El bus de datos de salida va hasta los demás módulos.

El módulo del manejador de memoria en realidad contiene muchas cosas:

  • El gestor de la memoria de doble puerto, que convierte la SRAM de alta velocidad incluida en la placa del ZX-Uno en una memoria de doble puerto, con un puerto de lectura/escritura, y otro independiente de sólo lectura. El primero es de uso exclusivo de la CPU, y el otro de uso exclusivo para la ULA.
  • La MMU vertical que proporciona el sistema de bancos de memoria y que implementa el esquema seguido en el Spectrum +2A/+3, que incluye a su vez el esquema del 128K/+2 gris. Esta MMU se ampliará para dar cabida a la MMU horizontal para dar soporte a la paginación compatible con Chloe 280SE.

La ULA es una versión extendida, con los timmings del 48K, pero con soporte para los modos Timex HiColour y HiRes, y ULAplus. Uno de los cores contempla además un modo de pantalla especial, diseñado como parte de un experimento, para dotar al Spectrum de una resolución de 128x96 pixeles, 16 colores de una paleta de 256, y con color independiente para cada pixel.

El módulo SPI alberga un pequeño core que implementa una interfaz SPI que se comparte entre los dos periféricos que usan este protocolo: la SPI flash y la tarjeta SD/MMC. Los chip-enable para cada uno de estos periféricos son antagonistas: si está habilitado uno, se deshabilita automaticamente el otro, para que no haya conflictos. Para la SD/MMC se implementan tanto los puertos DIVMMC como los puertos ZXMMC.

Para controlar todos los nuevos periféricos añadidos a ZX-Uno (en este momento, la SPI Flash, el registro de configuración maestro, y el mapeador de memoria maestro), se usan dos puertos asignados por el comité ZXI. Estos puertos dan lugar a usar hasta 256 registros diferentes de E/S. La dirección del registro aparece en "addr" y la operación (lectura o escritura), en las señales "ior" e "iow".

El mixer es un codificador Sigma-Delta de 8 bits, que mezcla las señales del altavoz, mic, ear y la salida de 8 bits del módulo AY-3-8912. La salida de la mezcla va directamente a la salida de audio.

Los relojes del sistema

La ULA

Ulaplus timex radastan.png

Generador de sincronismos y señal WSS

El teclado

La memoria

Módulo de multiplexión de la SRAM para obtener una memoria de doble puerto

Mapa de memoria de la SRAM

Mapa memoria zxuno core spectrum.png

Sistemas de banking vertical y horizontal

Periféricos SPI

El Z80

El bus de expansión

Nuevos registros E/S para control de ZX-Uno

Se dispone de los puertos $FC3B y $FD3B, asignados por el comité ZXI. A través de estos puertos se accede a un total de 256 registros de E/S diferentes exclusivos para ZX-Uno.

  • El puerto $FC3B (64571) guarda la dirección ($00 - $FF) del registro de E/S al que se quiere acceder. Puede leerse para saber cuál es la última dirección de registro asignada.
  • El puerto $FD3B (64827) es el puerto de acceso al registro seleccionado con el puerto anterior. Su sentido (lectura/escritura) dependerá de la implementación de cada registro.

Los registros implementados hasta ahora en ZX-Uno son:

Registros de ZX-Uno
Número Nombre Sentido Descripción Valor tras reset de usuario Valor tras reset maestro Valor tras poweron
$00 MASTERCONF Lectura/Escritura Formato binario (en gris, los campos que sólamente pueden alterarse cuando LOCK=0):
LOCK MODE1 DISCONT MODE0 I2KB DISNMI DIVEN BOOTM
  • BOOTM: a 1 indica que ZX-Uno está en modo boot (modo configuración). El modo boot sólo tiene sentido mientras se está ejecutando el firmware de arranque, donde se permite configurar algunos aspectos de ZX-Uno antes de pasar al modo ejecución. MASTERCONF siempre puede ser leído, tanto en modo boot como en modo ejecución. Se pone a 0 manualmente por programa, y en ese momento, ZX-Uno entra en modo ejecución.
  • DIVEN: a 0 indica que DIVMMC no está habilitado en el sistema, aunque los puertos de acceso a la interfaz SPI del slot SD/MMC siguen estando disponibles. La memoria usada por DIVMMC queda disponible para otros usos. A 1 indica que DIVMMC está habilitada. Si se habilita, antes de pasar al modo ejecución hay que cargar una imagen de ESXDOS en el banco de RAM correspondiente. El valor por defecto de este bit es 0.
  • DISNMI: a 1 indica que la función NMI de DIVMMC no estará disponible. NMI funcionará, pero no causará que ESXDOS se automapee, dejando así el control de NMI en manos de la ROM principal del sistema. Bit añadido para mejorar la compatibilidad de DIVMMC con SE Basic IV. Su valor por defecto es 0 (ESXDOS maneja los eventos NMI).
  • I2KB: a 1 configura la ULA para que devuelva un valor acorde con un Spectrum issue 2 al leer el puerto de teclado ($FE). A 0, el valor devuelto es compatible con issue 3 y posteriores. Por defecto su valor es 0.
  • MODE1,MODE0: especifica el modo de timing de la ULA para acomodarse a diferentes modelos de Spectrum. 00 = ULA ZX Spectrum 48K PAL, 01 = ZX Spectrum 128K/+2 gris, 10 = Pentagon 128, 11 = 48K NTSC (262 scans).
  • DISCONT: indica si se debe producir contienda de memoria en la memoria de video. 0 para habilitar contienda (compatibilidad con 48K y 128K). 1 para deshabilitar contienda (compatibilidad con Pentagon 128)
  • LOCK: Cuando vale 1, impide que se puedan hacer más cambios a ciertos bits del registro MASTERCONF, e impide además acceder a la SPI Flash. Este bit se pone a 0 sólo mediante un reset maestro (Ctrl-Alt-BkSpace) o al apagar y encender el clon.
No cambia 00000001 00000001
$01 MASTERMAPPER Lectura/Escritura De este registro sólo se usan sus 5 bits inferiores (valores $00 a $1F). El valor guardado es el número de un banco de 16KB de SRAM que será paginado en las direcciones $C000-$FFFF durante el modo boot. Los valores de este registro no tienen ningún efecto cuando ZX-Uno está en modo ejecución. 32 valores diferentes para este registro permiten direccionar hasta 512KB de SRAM. Si ZX-Uno se amplía con más memoria, se usarán más bits en este registro. La máxima cantidad de memoria manejable es de 4MB. No cambia 00000000 00000000
$02 FLASHSPI Lectura/Escritura Puerto de acceso al registro SPI conectado a la SPI Flash. Escribiendo un valor en este registro, se envía a la SPI Flash, si ésta está seleccionada. Leyendo un valor de este registro, se lee el último valor enviado por la SPI Flash, y además, la misma operación de lectura provoca que la SPI envíe un nuevo valor (que sería leído con la siguiente operación de lectura a este registro). Por esta razón, en operaciones de lectura de bloques, el primer byte leído con este puerto debe descartarse. No cambia No cambia 00000000
$03 FLASHCS Lectura/Escritura Sólo se emplea el bit 0. El valor escrito en este registro determinado el estado de la línea CS de la Flash SPI (0 = Flash seleccionada, 1 = flash no seleccionada) No cambia No cambia 00000001
$04 SCANCODE Lectura/Escritura En lectura, permite obtener el valor del último scancode generado por el teclado. En escritura permite enviar comandos al teclado. No cambia No cambia No cambia
$05 KEYSTAT Lectura Varios bits que indican si hay o no una nueva tecla pulsada, o soltada, y si ésta es una tecla extendida o normal.
BSY 0 0 0 ERR RLS EXT PEN
  • BSY: a 1 para indicar que hay una transmisión de datos al puerto PS/2 aún en proceso. Se debe esperar a que valga 0 para iniciar una nueva transmisión.
  • ERR: a 1 para indicar que la última transmisión a o desde el puerto PS/2 tuvo errores.
  • RLS: a 1 para indicar que el último evento pertenece a una tecla que ha sido soltada.
  • EXT: a 1 para indicar que el último evento pertenece a una tecla con código extendido (E0+scancode)
  • PEN: a 1 para indicar que hay un dato nuevo listo para ser leído en el registro SCANCODE. Tras leer KEYSTAT, este bit pasa a valer 0.
No cambia No cambia No cambia
$06 JOYCONF Lectura/Escritura Los bits 0 a 2 indican el modo de funcionamiento del joystick mapeado en teclado (o del segundo joystick físico si hay splitter). Los bits 4 a 6 indican el modo de funcionamiento del joystick físico (conector DB-9 lateral). El bit 3 indica el autofuego del segundo joystick o keypad. El bit 7 indica el autofuego del joystick principal. Los valores son: 000 = Disabled, 001 = Kempston, 010 = Sinclair 1, 011 = Sinclair 2, 100 = Protek/Cursor/AGF, 101 = Fuller, 110 = OPQAspM, 111 = reservado. No cambia No cambia 00100001
$07 KEYMAP Lectura/Escritura En lectura, cada acceso proporciona el siguiente byte del mapa de teclado cargado en ZX-Uno actualmente. En escritura, el byte correspondiente al mapa de teclado marcado por la posición actual es modificado. En ambos casos, el puntero de direcciones se incrementa automáticamente para señalar al siguiente byte del mapa de teclado. Este puntero vuelve a 0 automáticamente tras un reset, una escritura en el registro $FC3B, o cuando se termina el mapa de teclado. El mapa de teclado, en la implementación actual, ocupa 16384 bytes. Ver descripción Ver descripción Ver descripción
$09 MOUSEDATA Lectura/Escritura Registro de datos del puerto PS/2 del ratón. Usado para leer o enviar comandos directos al ratón PS/2. Por ejemplo: para inicializar el ratón, debe enviarse el valor $F4 a este registro. No cambia No cambia No cambia
$0A MOUSESTATUS Lectura/Escritura Registro de estado del puerto PS/2 del ratón. Se definen los siguientes bits:
BSY 0 0 0 ERR 0 0 PEN
  • BSY: a 1 para indicar que hay una transmisión de datos al puerto PS/2 aún en proceso. Se debe esperar a que valga 0 para iniciar una nueva transmisión.
  • ERR: a 1 para indicar que la última transmisión a o desde el puerto PS/2 tuvo errores.
  • PEN: a 1 para indicar que hay un dato nuevo listo para ser leído en el registro MOUSEDATA. Tras leer MOUSESTATUS, este bit pasa a valer 0.
No cambia No cambia No cambia
$0B SCANDBLCTRL Lectura/Escritura Registro de control del scandoubler y control de la velocidad del sistema. Se definen los siguientes bits:
TURBO COPT FREQ ENSCAN VGA
  • TURBO: 00 para seleccionar 3.5 MHz, 01 para seleccionar 7 MHz, 10 para seleccionar 14 MHz y 11 para seleccionar 28 MHz. Estos bits también son actualizados con el valor de los bits D0-D3 del puerto $8E3B, usado en el ZX Prism para seleccionar las distintas velocidades para la CPU.
  • COPT: selecciona la forma de generar los sincronismos compuestos para RGB y video compuesto: 0 para usar el tipo de sincronismo original del Spectrum. 1 para usar pulsos de sincronismo según el estándar PAL
  • FREQ: estos tres bits definen la frecuencia del reloj maestro, del cual derivan el resto de relojes del circuito. Entre otras, se define también aquí la frecuencia de refresco vertical, que puede usarse para mejorar la compatibilidad con algunos monitores VGA que no soportan una frecuencia de refresco vertical de 50Hz. Los valores de refresco vertical son los siguientes:
    • 000 : 50Hz para modo 48K y Pentagon
    • 001 : 50Hz para modo 128K
    • 010 : 52 Hz
    • 011 : 53 Hz
    • 100 : 55 Hz
    • 101 : 57 Hz
    • 110 : 59 Hz
    • 111 : 60 Hz
  • ENSCAN: a 1 para habilitar el efecto de scanlines en el modo VGA. No tiene efecto si el modo VGA está deshabilitado.
  • VGA: a 1 para habilitar el scandoubler. La salida del scandoubler es la misma que la salida RGB normal, pero doblando la frecuencia de retrazo horizontal. A 0 para usar una salida de 15kHz RGB / video compuesto.
No cambia No cambia 00000000
$0C RASTERLINE Lectura/Escritura Almacena los 8 bits menos significativos de la línea de pantalla en la que se desea provocar un disparo de una interrupción enmascarable. Un valor 0 para este registro (con LINE8 también igual a 0) establece que la interrupción ráster se disparará, si está habilitada, justo al comenzar el borde derecho de la línea anterior a la primera línea de pantalla en la que comienza la zona de "paper". Dicho en otras palabras: el conteo de líneas de esta interrupción asume que una línea de pantalla se compone de: borde derecho + intervalo de blanking horizontal + borde izquierdo + zona de paper. Si se asume de esta forma, el disparo de la interrupción se haría al comienzo de la línea seleccionada.

Un valor para RASTERLINE igual a 192 (con LINE8 igual a 0) dispara la interrupción ráster al comienzo del borde inferior. Los números de línea para el fin del borde inferior y comienzo del borde superior dependen de los timings empleados. El mayor valor posible en la práctiva para RASTERLINE corresponde a una interrupción ráster disparada en la última línea del borde superior (ver RASTERCTRL)

11111111 11111111 11111111
$0D RASTERCTRL Lectura/Escritura Registro de control y estado de la interrupción ráster. Se definen los siguientes bits.
INT 0 0 0 0 DISVINT ENARINT LINE8
  • INT: este bit sólo está disponible en lectura. Vale 1 durante 32 ciclos de reloj a partir del momento en que se dispara la interrupción ráster. Este bit está disponible aunque el procesador tenga las interrupciones deshabilitadas. No está disponible si el bit ENARINT vale 0.
  • DISVINT: a 1 para deshabilitar las interrupciones enmascarables por retrazo vertical (las originales de la ULA). Tras un reset, este bit vale 0.
  • ENARINT: a 1 para habilitar las interrupciones enmascarables por línea ráster. Tras un reset, este bit vale 0.
  • LINE8: guarda el bit 8 del valor de RASTERLINE, para poder definir cualquier valor entre 0 y 511, aunque en la práctica, el mayor valor está limitado por el número de líneas generadas por la ULA (311 en modo 48K, 310 en modo 128K, 319 en modo Pentagon). Si se establece un número de línea superior al límite, la interrupción ráster no se producirá.
00000001 00000001 00000001
$0E DEVCONTROL Lectura/Escritura Registro de habilitacion/deshabilitacion de distintas caracteristicas. Se definen los siguientes bits.
DISD ENMMU DIROMSEL1F DIROMSEL7F DI1FFD DI7FFD DITAY DIAY
  • DISD: a 1 para deshabilitar la interfaz hardware SPI para SD (usada en DivMMC y ZXMMC). Deshabilitando esta interfaz se liberan los puertos $1F en escritura, $3F, $E7 y $EB. Tras reset maestro, vale 0.
  • ENMMU: a 1 para habilitar la MMU horizontal usada en el Timex Sinclair. Habilitando esta interfaz se usa el bit 7 del puerto $FF, se usa el puerto $F4 y una lectura al puerto $FF devuelve el ultimo valor escrito en el. Tras reset maestro, vale 0.
  • DIROM1F: el valor de este bit se enmascara con el valor del bit 2 del puerto $1FFD según la operación ~DIROM1F & $1FFD[2]. El resultado neto es que si este bit vale 1, el sistema trabajará como si el valor del bit 2 del puerto $1FFD fuera siempre 0, independientemente del valor que se escriba en él. Tras reset maestro, vale 0, que permite que los cambios al bit 2 de $1FFD sean tenidos en cuenta.
  • DIROM7F: el valor de este bit se enmascara con el valor del bit 4 del puerto $7FFD según la operación ~DIROM7F & $7FFD[4]. El resultado neto es que si este bit vale 1, el sistema trabajará como si el valor del bit 4 del puerto $7FFD fuera siempre 0, independientemente del valor que se escriba en él. Tras reset maestro, vale 0, que permite que los cambios al bit 4 de $7FFD sean tenidos en cuenta.
  • DI1FFD: a 1 para deshabilitar el sistema de paginación compatible con +2A/+3. Deshabilitando esta interfaz se libera el puerto $1FFD en escritura. Tenga en cuenta que la decodificación del puerto $7FFD, si está activa, es diferente dependiendo de si el puerto $1FFD está activo o no.
  • DI7FFD: a 1 para deshabilitar el sistema de paginación compatible con 128K. La deshabilitación de este sistema implica la deshabilitación del sistema de paginación del +2A/+3 aunque no se haya desactivado explicitamente.
  • DITAY: a 1 para deshabilitar el segundo chip AY, deshabilitando así el modo Turbo Sound.
  • DIAY: a 1 para deshabilitar el chip principal AY. La deshabilitación de este chip implica la deshabilitación del segundo chip AY, aunque no se haya deshabilitado explicitamente.
No cambia 00000000 00000000
$0F DEVCTRL2 Lectura/Escritura Registro de habilitacion/deshabilitacion de distintas caracteristicas (continuación de DEVCONTROL). Se definen los siguientes bits.
Resv Resv SPLITTER DIMIXER DISPECDRUM DIRADAS DITIMEX DIULAPLUS
  • Resv: Este bit está reservado. En la implementación actual, debe escribirse un 0 en él si se actualiza el valor del registro.
  • SPLITTER: a 1 para habilitar el splitter de joystick.
  • DIMIXER: a 1 se deshabilita la salida de sonido.
  • DISPECDRUM: a 1 se deshabilita el soporte de SpecDrum/Covox.
  • DIRADAS: a 1 para deshabilitar el modo radastaniano. Tenga en cuenta que si el modo radastaniano no se deshabilita, pero se deshabilita la ULAplus, al intentar usar el modo radastaniano, el datapath usado en la ULA no será el esperado y el comportamiento de la pantalla en este caso no está documentado.
  • DITIMEX: a 1 para deshabilitar los modos de pantalla compatible Timex. Cualquier escritura al puerto $FF es por tanto ignorada. Si la MMU del Timex está habilitada, una lectura al puerto $FF devolverá 0.
  • DIULAPLUS: a 1 para deshabilitar la ULAplus. Cualquier escritura a los puertos de ULAplus se ignora. Las lecturas a dichos puertos devuelven el valor del bus flotante. No obstante tenga en cuenta que el mecanismo de contención para este puerto sigue funcionando aunque esté deshabilitado.
No cambia 00000000 00000000
$10 MEMREPORT Lectura/Escritura No cambia 00000000 00000000
$40 RADASCTRL Lectura/Escritura Registro para establecer el modo radastaniano y establecer sus características. Las escrituras a este registro son ignoradas si el bit correspondiente en DEVCTRL2 está activo. Se definen los siguientes bits
Resv Resv Resv Resv Resv Resv EN1 EN0
  • Resv: Este bit está reservado. En la implementación actual, debe escribirse un 0 en él si se actualiza el valor del registro.
  • EN1, EN0: ambos bits deben valer 1 para habilitar el modo radastaniano. Si EN0 está habilitado, pero EN1 está deshabilitado, el resto de bits, del 2 al 7, está definido según lo implementado en el emulador ZEsarUX (consultar la documentación de César Hernández sobre esto).
00000000 00000000 00000000
$41 RADASOFFSET Lectura/Escritura Contiene el número de bytes que hay que añadir a la dirección base de la pantalla (4000h, 6000h, C000h o E000h según la configuración) para obtener la dirección donde se encuentran los dos primeros píxeles en modo radastaniano. Es un registro de 14 bits. Para escribir un valor, primero se escriben los 8 bits menos significativos, seguidos inmediatamente de los 8 bits más significativos (los 2 bits más significativos de este valor se ignoran).

Si el valor de offset es tal que hace que al explorar la memoria de pantalla para crear la imagen se llegue al final de una página de 16KB, la exploración continuará al principio de esa misma página.

00000000 00000000 00000000
$42 RADASPADDING Lectura/Escritura Contiene el número de bytes - 64 que ocupa un scanline en modo radastaniano. Es decir, si este registro vale 0, la longitud en bytes de un scanline es de 64 bytes (128 pixeles). Si este registro vale 4, la longitud de un scanline es de 68 bytes (136 píxeles). Si vale 255, la longitud de un scanline es de 64+255=319 bytes, o 638 píxeles.

Si el valor de offset es tal que hace que al explorar la memoria de pantalla para crear la imagen se llegue al final de una página de 16KB, la exploración continuará al principio de esa misma página.

00000000 00000000 00000000
$43 RADASPALBANK Lectura/Escritura Registro para establecer qué sección de la paleta de ULAplus se usará para definir los colores en el modo radastaniano, y cómo se comportará el borde.
Resv Resv Resv Resv Resv BOR3 RADPALQUARTER
  • Resv: Este bit está reservado. En la implementación actual, debe escribirse un 0 en él si se actualiza el valor del registro.
  • BOR3: dentro de la paleta actual seleccionada, indica si el color del borde se tomará de las entradas 0 a 7 (0) o de las entradas 8 a 15 (1). Puede considerarse como el bit 3 del color del borde en modo radastaniano.
  • RADPALQUARTER: dos bits que indican qué sección de la paleta de ULAplus se va a usar para el modo radastaniano. 00 para usar la sección de entradas 0 a 15. 01 para las entradas 16 a 31, 10 para las entradas 32 a 47 y 11 para usar las entradas 48 a 63.
00000000 00000000 00000000
$80 HOFFS48K Lectura/Escritura Valor de ajuste de centrado horizontal de la pantalla para la ULA de 48K No cambia No cambia $38
$81 VOFFS48K Lectura/Escritura Valor de ajuste de centrado vertical de la pantalla para la ULA de 48K No cambia No cambia $01
$82 HOFFS128K Lectura/Escritura Valor de ajuste de centrado horizontal de la pantalla para la ULA de 128K No cambia No cambia $3A
$83 VOFFS128K Lectura/Escritura Valor de ajuste de centrado vertical de la pantalla para la ULA de 128K No cambia No cambia $01
$84 HOFFSPEN Lectura/Escritura Valor de ajuste de centrado horizontal de la pantalla para la ULA de Pentagon No cambia No cambia $37
$85 VOFFSPEN Lectura/Escritura Valor de ajuste de centrado vertical de la pantalla para la ULA de Pentagon No cambia No cambia $00
$A0 DMACTRL Lectura/Escritura No cambia 00000000 00000000
$A1 DMASRC Lectura/Escritura No cambia 00000000 00000000
$A2 DMADST Lectura/Escritura No cambia 00000000 00000000
$A3 DMAPRE Lectura/Escritura No cambia 00000000 00000000
$A4 DMALEN Lectura/Escritura No cambia 00000000 00000000
$A5 DMAPROB Lectura/Escritura No cambia 00000000 00000000
$A6 DMASTAT Lectura/Escritura No cambia 00000000 00000000
$C6 UARTDATA Lectura/Escritura No cambia 00000000 00000000
$C7 UARTSTAT Lectura/Escritura No cambia 00000000 00000000
$C8 - $DF RESERVED Lectura/Escritura Rango de registros de ZXUNO reservados para experimentos o uso privado Definido por el usuario Definido por el usuario Definido por el usuario
$F0 SRAMADDR Lectura/Escritura No cambia 00000000 00000000
$F1 SRAMADDRINC Lectura/Escritura No cambia 00000000 00000000
$F2 SRAMDATA Lectura/Escritura No cambia 00000000 00000000
$F3 VDECKCTRL Lectura/Escritura No cambia 00000000 00000000
$F7 AUDIOMIX Lectura/Escritura Control de la mezcla de los canales izquierdo/derecho partiendo de los 4 canales del AY-8912. Se definen los siguientes grupos de 2 bits cada uno:
CHANNELA CHANNELB CHANNELC BEEPDRUM
  • BEEPDRUM : Canal para Beeper y Specdrum.
  • El significado de cada grupo de 2 bits es: 00 = Silencio, 01 = Canal derecho, 10 = Canal izquierdo, 11 = Ambos
No cambia No cambia 10011111
$FB AD724 Lectura/Escritura Control del modo de funcionamiento del chip encoder AD724. Se definen los siguientes bits:
Resv Resv Resv Resv Resv Resv Resv MODE
  • Resv : el significado de estos bits está reservado y no debe alterarse.
  • MODE : modo de funcionamiento del AD724. 0 = codifica norma PAL. 1 = codifica norma NTSC
No cambia No cambia 00000000
$FC COREADDR Lectura/Escritura Almacena la dirección, dentro de la memoria SPI, de inicio del core a arrancar. Para almacenar una dirección diferente, se han de realizar tres escrituras a este registro, conteniendo los tres bytes de la dirección, en orden de más a o menos significativo. En lectura, cada acceso a este registro devuelve una parte de la última dirección almacenada, de la parte más significativa a la menos significativa. No cambia No cambia $058000
$FD COREBOOT Escritura Registro de control de arranque. Escribiendo un 1 en el bit 0 de este registro (el resto de bits están reservados y deben quedarse a 0) hace que se desencadene el mecanismo interno de la FPGA que permite arrancar otro core. La dirección de comienzo de este segundo core será la última que se escribiera usando el registro COREADDR. No cambia No cambia No cambia
$FE SCRATCH Lectura/Escritura No cambia 00000000 00000000
$FF COREID Lectura Cada operación de lectura proporciona el siguiente carácter ASCII de la cadena que contiene la revisión actual del core del ZX-Uno. Cuando la cadena termina,lecturas posteriores emiten bytes con el valor 0 (al menos se emite uno de ellos) hasta que vuelve a comenzar la cadena. Este puntero vuelve a 0 automáticamente tras un reset o una escritura en el registro $FC3B. Los caracteres entregados que forman parte de la cadena son ASCII estándar imprimibles (códigos 32-127). Cualquier otro valor es indicativo de que este registro no está operativo. Ver descripción Ver descripción Ver descripción

Por ejemplo, para asignar el banco 16 de la SRAM al espacio de direcciones $C000 - $FFFF durante el modo boot, mediante el registro MASTERMAPPER, se haría así:

ld bc,$fc3b     ;Puerto para establecer el número de registro a usar
ld a,1          ;Registro $01 (MASTERMAPPER)
out (c),a       ;Se selecciona. A partir de ahora, cualquier acceso a $FD3B está usando MASTERMAPPER
inc b           ;Puerto de acceso al registro ($FD3B, basta con incrementar B)
ld a,16         ;Banco 16 de la SRAM
out (c),a       ;Se escribe en el registro MASTERMAPPER

Modos gráficos disponibles

Firmwares disponibles

Layouts de teclado

El módulo que se encarga de gestionar el teclado está gobernado por una tabla en la que se especifica, para cada scancode recibido desde el teclado PS/2, qué tecla o combinación de teclas del teclado del Spectrum le corresponde.

El usuario puede crear y cargar mapas de teclado en la memoria de la FPGA, alterando así la forma en la que el teclado PS/2 se comporta respecto del core de Spectrum. Los mapas sólo afectan a este core, lo que incluye la BIOS.

A partir del core EXP26, el mapa de teclado se compone de un par de vectores: keymap1 y keymap2, cada uno de 2048 posiciones x 8 bits. Cada posición se corresponde con una posible pulsación de tecla en el teclado PS/2, de acuerdo al siguiente esquema:

10 9 8 7 6 a 0
ALT CTRL SHIFT EXT SCANCODE

Los bits 10, 9 y 8 de la dirección indican si esa tecla se ha de pulsar en combinación con alguna de las teclas modificadoras: Shift, Control, o Alt. Hay 8 combinaciones posibles a aplicar en una tecla.

El bit 7 indica si el scancode de la tecla es un scancode extendido (el teclado envía E0 antes del scancode)

Los bits 6 a 0 son el scancode de la tecla. El mapa sólo admite teclas cuyo scancode (extendido o no) esté en el rango 00h a 7Fh. En un teclado estándar, esta restricción sólo afecta a la tecla F7.

Los vectores keymap1 y keymap2 contienen, cada uno, 8 bits en cada elemento, con el siguiente formato:

7 a 5 4 a 0
ROW COLUMBITS

ROW es una de las 8 filas de teclas de la matriz del Spectrum, codificado en binario, donde se encuentra la tecla de Spectrum que debe activarse en respuesta a la tecla PS/2 usada. COLUMBITS es un valor de 5 bits, que se corresponde con el estado de las teclas de la fila seleccionada en ROW. Un bit a 1 indica que la tecla en la posición del bit está pulsada. 0 que no está pulsada.

Usando estos dos vectores, es posible asignar a cada pulsación de tecla del teclado PS/2, 0, 1 o 2 pulsaciones del teclado del Spectrum. Ejemplo: si en el teclado PS/2 se pulsa la tecla +, en el teclado de Spectrum debe pulsarse SYMBOL SHIFT y K

En el teclado inglés, la tecla + se obtiene pulsando SHIFT y la tecla =, cuyo scancode es 55h no extendido (1010101 en binario). Esto significa que en la dirección de vector 001 0 1010101 (esto es, modificador SHIFT a 1, EXT a 0, y scancode 55h) se almacenará la pulsación de SYMBOL SHIFT y la pulsación de K. La primera pulsación se almacenará en keymap1 y la segunda, en keymap2.

Dirección keymap1 keymap2
001 0 1010101 111 00010 110 00100

Las teclas que sólo requieran de una pulsación en la matriz del Spectrum, almacenarán en keymap2 el valor 00000000.

Es posible usar uno de los vectores y aún así especificar la pulsación de más de una tecla, si se da el caso de que ambas teclas están en la misma fila. Ejemplo: si en el teclado PS/2 se pulsa el punto ( . ) , en el Spectrum esa pulsación se corresponde con SYMBOL SHIFT + M. Como estas dos teclas están en la misma semifila, es posible especificarlas de una vez, así:

Dirección keymap1 keymap2 Comentarios
001 0 1001001 111 00110 000 00000 En keymap1 se registra tanto la pulsación de SYMBOL SHIFT como de M


ROW COLUMBITS
4 3 2 1 0
000 V C X Z CAPS SHIFT
001 G F D S A
010 T R E W Q
011 5 4 3 2 1
100 6 7 8 9 0
101 Y U I O P
110 H J K L ENTER
111 B N M SYMBOL SHIFT SPACE

Joysticks

Hay soporte para 2 joysticks desde el core. El joystick 1 es un joystick físico (puerto DB9 del ZX-Uno) mientras que el joystick 2 es a la vez un joystick virtual generado con el teclado numérico (keypad) y un segundo joystick físico (DB9) disponible en modelos con splitter. Ambos joysticks tienen 2 botones de disparo y se pueden configurar por separado a una de estas 7 normas:

  • 000 = Disabled
  • 001 = Kempston, segundo disparo bit 5
  • 010 = Sinclair 1, segundo disparo tecla X
  • 011 = Sinclair 2, segundo disparo tecla Z
  • 100 = Protek/Cursor/AGF, segundo disparo tecla 9
  • 101 = Fuller, segundo disparo bit 5
  • 110 = OPQAspM, segundo disparo tecla M

TO DO

  • Modificar el core del AY-3-8912 (o quizás buscar otro, ya veremos) que me dé los tres canales por separado, para así poderlos mezclar usando el esquema ACB o uno similar. Ahora mismo el sonido que tenemos es monoaural.
  • Añadir el tema de las teclas para cambiar de modo de video on-the-fly

Acceso a los ficheros del core

Acceso al repositorio SVN

La versión más reciente del core (11/02/2017) es test24. Las características de este core son:

  • Implementación ZX Spectrum 48K, 128K, Pentagon y Chloe 280SE
  • ULA con modos ULAplus, Timex y modo Radastan
  • Scroll hardware en modo Radastan
  • Grupo de paleta seleccionable en modo Radastan
  • Posibilidad de desactivar la contención de memoria (para compatibilidad con Pentagon 128)
  • Posibilidad de elegir el comportamiento del teclado (issue 2 o issue 3)
  • Posibilidad de elegir el timing de la ULA (48K, 128K o Pentagon)
  • Control del encuadre de pantalla configurable para tipo de timing, y posibilidad de elegir entre sincronismos originales de Spectrum o sincronismos estándar PAL progresivo.
  • Soporte de la MMU horizontal del Timex con bancos HOME, DOC y EXT en RAM.
  • Interrupción ráster programable en número de línea, para cualquier linea de TV.
  • Posibilidad de activar/desactivar los registros de manejo de bancos de memoria, para mejor compatibilidad con cada modelo implementado
  • Posibilidad de activar/desactivar los dispositivos incorporados al core para mejorar la compatibilidad con ciertos programas
  • Soporte ZXMMC para +3e
  • Soporte DIVMMC para ESXDOS, UnoDOS, y firmwares compatibles
  • Soporte Turbo Sound
  • Soporte de SpecDrum
  • Cada canal A,B,C de los dos chips AY-3-8912, beeper y SpecDrum pueden dirigirse a las salidas izquierda, derecha, ambas o ninguna, permitiendo la implementación de configuraciones tales como ACB, ABC, etc.
  • Soporte de joystick real y joystick en teclado con protocolo Kempston, Sinclair 1 y 2, Cursor y Fuller.
  • Soporte de modo turbo a 7MHz y 14MHz
  • Soporte de teclado con protocolo PS/2 y mapeado configurable por el usuario desde el propio Spectrum.
  • Soporte de ratón PS/2 emulando el protocolo Kempston Mouse.
  • Posibilidad de salida de video en modo de video compuesto, RGB 15kHz, o VGA.
  • Frecuencia de refresco vertical seleccionable por el usuario para mejorar la compatibilidad con monitores VGA.
  • Soporte de arranque multicore: desde el Spectrum se puede seleccionar una dirección de la SPI Flash y la FPGA cargará un core desde ahí.