ZX-Uno FAQ (versión desUBIKado)

Sobre estas FAQ

Estas FAQ son mantenidas por @desUBIKado, y nacen como un «fork» de las FAQ en español creadas por @uto_dev. Puedes seguir accediendo a sus FAQ del ZX-Uno, tanto en español como en inglés, desde este enlace.

Licencia de Creative Commons
Este obra está bajo una licencia de Creative Commons Reconocimiento-CompartirIgual 4.0 Internacional.

ÍNDICE

LO MÁS PREGUNTADO

¿Cual es la contraseña del repositorio?

Sin lugar a dudas, la pregunta más preguntada es esta. En algunas otras preguntas de esta FAQ haremos referencia al repositorio. Pues bien, esta es la respuesta:

  • Usuario: guest
  • Contraseña: zxuno

¿Hay algún emulador que emule ZX-Uno?

Bueno, el ZX-Uno es una placa con una FPGA, emularla completamente sería emular la posibilidad de «reconfigurarla» para implementar cualquier hardware, cosa que desde luego no es posible.

Sin embargo, si hablamos de emular el core de Spectrum de ZX-Uno, sí, ZesarUX hace una emulación muy completa del core de Spectrum, así como Retro Virtual Machine.

¿Existe un solo modelo de ZX-Uno?

No. El proyecto ZX-Uno nació como un proyecto libre y desde el comienzo se promovió que se pudiesen hacer copias o nuevos modelos con funcionalidades adicionales. Sin embargo, el soporte a esas nuevas placas las debe realizar el fabricante de las mismas, y no el equipo original del ZX-Uno, que solo se responsabilizó de las unidades que se hicieron para el crowdfunding. Así existen distintos modelos:

  • ZX-Uno 4.1 del crowdfunding
  • ZX-Uno 4.1 vendido por Antonio Villena (idéntico al del crowdfunding)
  • ZX-Uno 4.1 vendido por Carmeloco – José Ángel Velasco Fernández – (idéntico al del crowdfunding pero con pines soldados y jumpers para el uso opcional del JoySplitter)
  • ZX-Uno 4.1 vendido por ManuFerHi – Manuel Fernández Higueras – (compatible 4.1 con conector VGA estándar)
  • ZX-Uno 4.2 vendido por Antonio Villena (idéntico al del crowdfunding  pero  preparado para usar el JoySplitter ya de serie)
  • ZX-Uno (M) vendido por 8bits4ever
  • ZX-Uno VGA 2M vendido por ManuFerHi – Manuel Fernández Higueras –
  • ZX GO+ vendido por ManuFerHi – Manuel Fernández Higueras-
  • ZX-Uno XL vendido por 8bits4ever
  • ZXUNO+ 2M vendido por Antonio Villena
  • µZX1 VGA 2M vendido por Antonio Villena
  • +UNO 2MB vendido por Antonio Villena

Todos los modelos son compatibles a nivel de cores con el modelo original 4.1 del crowdfunding, y varían generalmente en el número, tipo y disposición de los conectores de expansión, audio, video, joystick y alimentación, así como en la cantidad de memoria SPI Flash y SRAM.

¿Merece la pena tener 2MB de memoria SRAM o con 512KB es suficiente?

Voy a realizar un recorrido core por core de aquellos que sacan provecho de los 2MB que se pueden poner a un ZX-Uno, ya sean internos o externos, y que ventajas se consiguen con ellos:

PC XT

Gana mucho la compatibilidad del core al permitir «mapear» mucha más memoria. La distribución de la memoria queda de la siguiente forma en los cores para 2MB:

· 640 KB de memoria convencional
· 224 KB de memoria superior
· 32 KB para alojar la BIOS
· 64 KB de memoria alta
· 448 KB de memoria extendida (XMS)

Fuente: viewtopic.php?f=56&t=936#p12983

MSX

La versión de 2MB permite tener 1 Mega de Memory mapper y 512K de ESE-SCC con lo que se pueden cargar ficheros .rom de mayor tamaño. En la versión 512K solo se tiene soporte de Megaram SCC/SCC+ de 256K.

En la versión de 512K funciona el programa Sofa Run que es un gestor de archivos y lanzador de programas, sin embargo no podrás lanzar imágenes de disquetes (*.DSK) porque las intenta cargar primero en memoria, y siempre devuelve el error «No free segments». Con los modelos de 2MB no da ese error y se pueden cargar imágenes de disquetes sin problemas.

En el versión 1.3 del core se cambió la forma de hacer teclados personalizados, y no se pueden cargar en los modelos de 512K debido a que el core necesitaba espacio para unas rom del sistema más grandes. Por eso, el teclado en español solo se podrá usar en los modelos con 2MB.

Fuente: viewtopic.php?f=63&t=1115&start=150#p16149

Spectrum

Se pueden cargar archivos .PZX más grandes (por ejemplo juegos multicargas con gran cantidad de cargas).

Atari 800XL

– Se pueden cargar cartuchos grandes (de hecho, enormes, hasta 1024K de cartucho, como el Space Harrier)!
– Se pueden seleccionar 3 ampliaciones de RAM más en el menú F12: 576K Compy, 576K Rambo y 1MB.

Fuente: viewtopic.php?f=48&t=1192#p14012

Amstrad con soporte de carga desde SD

– Con la versión del core de 2MB se pueden usar tarjetas SD de 1, 4, u 8 GB, con la versión del core para 512 KB solo tarjetas de 4 GB
– Con 2 MB de memoria las imágenes dsk se cargan enteras en memoria y su compatibilidad aumenta. Con la versión de 512 KB solo una cara del diskette y hay que cambiar de cara manualmente. Disminuye la compatibilidad.

Fuente: viewtopic.php?f=59&t=1933&start=60#p22329

NES

En los ZX-Unos con 2 MB funcionarán juegos grandes que no funcionaban con 512KB, como Kirby Adventure, Megaman 6, Contra 1000-in-1, etc…, ya que ahora permite la carga de juegos que usen hasta 1MB de CHR RAM y 1MB de PRG RAM (2MB en total).

Fuente: viewtopic.php?f=18&t=1415#p15993

MULTICOMP

En este core de una máquina CP/M, en los programas Wordstar o Turbo Pascal, el emulador de terminal funciona correctamante para la versión de 2MB internos, pero no en las de 512K internos o 2MB externos.

¿Qué addons se han creado para el ZX-Uno y que utilidad tienen?

El ZX-Uno del crowfunding, y la mayoría de los modelos de ZX-Uno que se han creado después, tienen un conector de expansión de 36 pines hembra. Este conector permite que
puedan conectarse a él una serie de addons que expanden las posibilidades hardware del ZX-Uno. A continuación recogemos los addons que se han ido creando y su funcionalidad:

  • Ampliación de memoria de 2MB externos (Antonio Villena):
    Permite aumentar la capacidad de memoria SRAM de los 512K originales hasta los 2MB. Hay cores que aprovechan esa memoria extra de diferentes formas. Se puede ver más detalladamente su utilidad en esta entrada del foro.
  • MIDI (McLeod Ideafix – Miguel Ángel Rodríguez Jódar): Implementa un sintetizador MIDI de 64 voces, con 128 instrumentos y varios sets de percusión. La salida de audio de este sintetizador se mezcla con el resto de fuentes de audio del ZXUNO para poder ser
    escuchado a través de la salida de sonido que se esté usando. Está diseñado para ser usado como si fuera un sintetizador conectado al conector MIDI/RS232 del ZX Spectrum 128K y superior.
  • YomboTFT (Yombo – Juan José Luna Espinosa –):
    Permite conectar una pantalla TFT de 3.2″ con el chip ILI9341. Se necesita una versión especial de los cores para poder ver la imagen en la pantalla TFT. POr ahora solo existe adaptado una versión del core de Spectrum antigua que se puede obtener aquí.
  • UnoIEC= (Quest – Samuel Baselga López –):
    Permite conectar cualquier unidad externa IEC (un SD2IEC, una disquetera real 1541, 1571…, incluso varias conectadas en serie ) a los cores de Commodore, tanto C64 como C16/Plus4 y VIC-20. Necesita versiones de esos cores modificados para poder trabajar con el UnoIEC=.
  • DAC 18 bits (VGA) + WIFI (Antonio Villena): El DAC permite mejor calidad de imagen para cores que la necesiten, como el de PC. El DAC de video del ZX-Uno es de 8 bit y no permite sacar todos los colores que permite una VGA en el core de PC. El modulo wifi permite conectar por wifi simulando una UART, eso permite usar el cliente FTP de Yombo o las utilidades que ha ido publicando Nihirash (wget, clientes irc, gopher y plato, etc).
  • WIFI (Antonio Villena): Solo el WIFI sin el DAC de 18 bits.
  • DAC 18 bits (VGA) (Antonio Villena): Solo el DAC de 18 bits sin el WIFI.
  • Entrenadora VHDL o Verilog (Antonio Villena):
    Permite aprender HDL y también sirve para depuración y testeo de cores. Tiene 8 switches, 4 pulsadores, un display de 4 dígitos y 7 segmentos y 6 leds.
  • Uno-jamma (Antonio Villena): Permite conectar el ZX-Uno a una máquina Arcade que admita este tipo de conector y ejecutar los cores arcades adaptados instalados en el ZX-Uno.
  • HDMI con conector para ESP8266/ESP12 (Antonio Villena):
    Solo fue un prototipo para dar salida HDMI a los cores que se adaptasen, además de proporcionar WIFI. Como no funcionaba bien en todas las TV al final no se comercializó.
  • Z80 real para el ZX-Uno (McLeod Ideafix – Miguel Ángel Rodríguez Jódar): Fue un addon experimental para depurar mejor los cores, sin utilidad para los usuarios normales.
  • Netuno (Antonio Villena): Fue un addon experimental para unir
    dos zxunos por el puerto de expansión. La idea era hacer que 2 zxunos
    se repartiesen el trabajo y cooperasen para implementar una máquina
    superior. También vale para sacar señales con jumpers dupont, porque
    obtienes el conector de expansión invertido con pines macho. No fue comercializado.

¿Qué accesorios pueden utilizarse con el ZX-Uno?

Para el ZX-Uno se han ido creando una serie de accesorios propios que son muy útiles, y otros, que sin ser exclusivos para su uso con el ZX-Uno, también son muy interesantes:

  • Cable VGA para ZX-Uno versión 4.x (Antonio Villena): Proporciona una salida VGA al ZX-Uno del crowfunding.
  • Conector VGA->SCART Activo (Antonio Villena):
    Para conectar un cable VGA del ZX-Uno como el anterior, que emplea pines no usados del puerto VGA para transmitir el audio, y utilizarlo con una entrada de Euroconector/SCART en un Monitor/TV.
  • PS/2 Splitter:
    Se pueden comprar fácilmente por internet. Sirve para duplicar el conector PS/2 del ZX-Uno y poder conectar a la vez un teclado y un ratón.
  • JoySplitter (Antonio Villena): Permite duplicar el conector DB9 de joystick del ZX-Uno del crowfunding. No funciona en todos los modelos de ZX-Uno y ese necesario que los cores tengan versiones específicas para usarlo.
  • Joy2PS2 (Spark2k06 – Aitor Gómez -):
    Se trata de una interfaz a la que se le puede conectar uno o dos gamepads de diversas plataformas antiguas, convirtiendo y redirigiendo los eventos de éstos en pulsaciones de teclado hacia un puerto PS/2. Existe una versión incrustada en un mando de SNES.
  • Etiquetas de teclado (Hark0 – Jordi Bayó ): Bonitas etiquetas para pegarlas sobre las teclas de un teclado PS/2 y darle un aspecto spectrumero.
  • Maxduino (ManuFerHi – Manuel Fernández Higueras ) y Miniduino (Antonio Villena): Reproducen ficheros de audio TZX, TSX, TAP, CDT, CAS, P, O desde una tarjeta SD para cargar programas usando la entrada de audio del ZX-Uno en aquellos cores que la soportan como los de ZX Spectrum, ZX81, BBC Micro, Amstrad CPC y MSX. Los
    miniduinos se venden sin carcasa o bien con la carcasa diseñada por Jorge Mejías.
  • Carcasa para el ZX-Uno del crowfunding (Mejias3D – Jorge Mejías ): Una carcasa impresa en 3D muy chula para el ZX-Uno del crowfunding
  • Carcasa para el Miniduino de Antonio Villena (Mejias3D – Jorge Mejías ): Una carcasa impresa en 3D muy recomendable para el miniduino de Antonio Villena.
  • Carcasa para el Joy2PS2 de Spark2k06 (Mejias3D – Jorge Mejías ): Una carcasa impresa en 3D para ese accesorio.

¿Qué proyectos han sido desarrollados alrededor del ZX-Uno?

La comunidad de usuarios del ZX-Uno es muy inquieta y a veces nos sorprenden con proyectos muy interesantes como los siguientes:

  • ZX-Uno Gomas (ManuFerHi – Manuel Fernández Higueras Neuro, Spark2k06 – Aitor Gómez -, Uto): El proyecto consistía en introducir un ZX-UNO en una carcasa de ZX Spectrum 48K «gomas». Al final se diseñó el ZX GO+, una placa completamente nueva por parte de ManuFerHi y otros, basado en el proyecto ZX-UNO de Superfo, Mcleod, Quest, AVillena y Hark0.
  • Sugarless +2 (A ZX-Uno Companion) (Spark2k06 – Aitor Gómez ): Se trata de una tarjeta adaptadora que permite conectar una placa ZX-Uno (4.1 o 4.2) en una carcasa de un Spectrum +2A/+2B/+3. También es posible instalarla en una carcasa de +2 (gris) pero requiere hacer modificaciones a la carcasa.
  • Mando X-Arcade para el ZX-Uno (ajsbernal Antonio Jesus Sánchez Bernal -) Un mando arcade para 2 jugadores construido artesanalmente con un ZX-Uno en su interior.
  • ZX-Uno Pocket (wilco2009): Es un ZX-UNO convertido en una consola portatil. Consta de una placa diseño de superfo, a la que se conecta un ZX-UNO, una bateria y un circuito cargador/inverter/step-up para alimentar el sistema, y se diseñó para usar como carcasa la del spectrum portatil de Ben-Heck. Se puede ver un vídeo de este proyecto ya  finalizado.

INSTALACION Y JUEGOS

¿Que cables o conectores necesito para poner en marcha mi ZX-Uno?

Esta es la lista básica:

  • Un cargador de móvil microUSB o al menos un cable USB a microUSB para conectar a la salida USB de la tele o similar
  • Un cable con conector RCA para vídeo compuesto, el típico conector amarillo.
  • Unos altavoces de PC para conectar a la salida de audio, o un cable
    jack-stereo a dos conectores RCA rojo/blanco para conectar a la TV
  • Una tarjeta SD, no necesariamente muy grande (2Gb está bastante bien). Valen microSD con adaptador.
  • Un teclado PS/2

Opcionalmente tambien puedes:

  • Un cable VGA para conectar el ZX-Uno por VGA
  • Un joystick norma Atari, como por ejemplo, un joystick de spectrum protocolo Kempston (Nota: son baratos, y funcionan bastante bien, los clones chinos de mandos de Megadrive con conector tipo DB9)
  • Un splitter de ratón/teclado, para poder conectar un ratón PS/2 además del teclado

Si estás interesado en conectar el ZX-Uno por VGA lee la sección Pantalla y monitores

¿Cómo poner en marcha mi ZX-Uno

Normalmente el fabricante de tu ZX-Uno te habrá facilitado instrucciones de como hacer esto. Si no es así solicítaselas. No obstante los pasos básicos para lanzar ZX-Uno en modo Spectrum es tener una tarjeta SD formateada con FAT16 o FAT32, varios ficheros tap, z80 o sna dentro, y conectarlo a una tele por el conector de video compuesto.
Además en la tarjeta tienes que meter los ficheros de ESXDOS correspondientes a la versión de ESXDOS que lleve vuestro ZX-Uno (de ahí que conviene que el fabricante os de ese dato y os diga que fichero meter).

Si tu ZX-Uno proviene del crowdfunding, es muy probable que los ficheros en el
enlace «Archivos de ESXDOS para la tarjeta SD» en la página de instrucciones para los backers te valga. Si algo no va bien (ver las siguientes preguntas) pregunta a tu fabricante por la version de ESXDOS y sobreescribe los ficheros de ese paquete con la distribución estándar de ESXDOS para esa versión. Sobreescribe y no reemplaces, para que se queden los comandos especiales de ZX-Uno que hay en la carpeta BIN.

Nuestra recomendación es formatear con FAT16 porque hay cores que solo funcionan con FAT16, mientras que los que lo hacen con FAT32 también lo hacen con FAT16. También recomendamos que formateéis las tarjetas aunque vengan ya formateadas, y que os aseguréis que no están formateadas con NTFS o exFAT. Asimismo, con la tarjeta SD recien formateada, aseguraros de que si queréis usar el core de BBC Micro el primer fichero que copieis en ella sea el BEEB.MMB.

¿Pero qué es ESXDOS?

ESXDOS es un sistema operativo para DivIDE y DivMMC, es decir, para interfaces que permiten el acceso a discos IDE en el caso de DivIDE, o de tarjetas SD haciendo de discos duros en el caso de DivMMC. ESXDOS incluye comandos para movernos por el disco muy al estilo UNIX, aunque para escribirlos en nuestro Spectrum tenemos que precederlos con un
punto, por ejemplo «.ls», «.cd»,».mv», etc.

Además, ESXDOS incluye un gestor NMI, es decir, una aplicación que se carga cuando pulsamos NMI en nuestro ZX-Uno (ver apartado siguente). Desde el 1/11/2017
hay un nuevo navegador NMI realizado por Dr. Slump que incluye muchas nuevas funcionalidades, y que es recomendable usar en lugar del antiguo. Fue presentado en este hilo del foro de ESXDOS, y es allí donde se van presentando las sucesivas versiones que va saliendo, y donde podréis descargar la última versión. Para reemplazar el actual gestor de NMI por este nuevo, renombrad el fichero NMI.SYS en la carpeta SYS a NMI.OLD, y extraer todo el contenido del paquete, incluida la carpeta NMI, en el mismo sitio (/SYS).

También desde el 25/05/2020 a aparecido un nuevo navegador NMI. Su autor er Bob Fossil y trae como característica estrella el soportar nombre largos de ficheros. Prácticamente tiene las mismas funcionalidades que el de el Dr. Slump, y trae otras como el cambiar la velocidad de la CPU o el tipo de timing de la ULA que son exclusivas para usar con un ZX-Uno. En esta entrada del foro del ZX-Uno se puede ver su evolución.

Es posible tener el navegador NMI del Dr. Slump como navegador principal y el de Bob  Fossil como secundario, y pasar de uno a otro simplemente pulsando la tecla J.

ZX-Uno implementa el interfaz DivMMC exactamente como es, por lo que soporta exactamente lo mismo que soporta un DivMMC real.

¿Puedo usar ESXDOS en otros cores?

ESXDOS es un sistema operativo para DivMMC, que es un interfaz para Spectrum, por lo que la respuesta es solo lo usarán ciertos cores de Spectrum, como el de mcleod_ideafix o el de kyp, pero no cores que no sean de Spectrum. Otros cores pueden acceder a la tarjeta SD pero no usan ESXDOS.

¿Cómo cargo juegos desde la tarjeta SD?

Una vez que tengas juegos en la SD y ESXDOS esté funcionando (comprobad que se ven el logo de ESXDOS al arrancar y en esa misma pantalla se ve que detecta vuestra tarjeta SD) solo tenéis que generar una NMI (Ctrl+Alt+F5 o simplemente F5 en las versiones más nuevas del core de Spectrum) para acceder a un menú en el que os movéis con los cursores y podéis cargar ficheros Z80, SNA, TAP, TRD, SCR y BASIC.

Cuando pulso NMI (Ctrl+Alt+F5 o F5) el ZX-Uno se reinicia

Las causas más comunes de ese problema son:

  • Tu ZX-Uno no ha detectado tu tarjeta SD. Fijate en el arranque de ESXDOS y aseguraté de que esté formateada con FAT
  • Los ficheros de ESXDOS que hay en las carpetas BIN y SYS no concuerdan con la versión de ESXDOS que está instalada en tu ZX-Uno, o ni siquiera existen esas carpetas. Consulta con el fabricante para que te diga que versión lleva, y poner la misma versión. Si has actualizado la versión de ESXDOS de tu ZX-Uno (ver más adelante) asegúrate de
    actualizar también dichas carpetas.

Cuando pulso NMI el ZX-Uno hace un pitido grave y no pasa nada

Te falta meter los ficheros de ESXDOS en la tarjeta SD o no te ha reconocido la tarjeta. Revisa el primer punto de esta sección.

¿Puedo grabar la partida en la tarjeta SD para volver más tarde?

Sí, en el navegador NMI (Ctrl+Alt+F5 o F5) de ESXDOS hay una opción que pulsando «S» graba un snapshot en la carpeta en la que estuvieramos en la SD. El primer snapshot se llama SNAP0000.SNA, el segundo SNAP0001.SNA, etc.

Sin embargo hay que tener en cuenta que cuando reiniciamos el ZX-Uno si usamos el antiguo navegador NMI, este pierde la cuenta de por qué número iba, por lo que si volvemos a grabar volverá a intentar grabar el SNAP0000.SNA y dará error. En esos casos pulsad «S» hasta que diga que se ha grabado correctamente, lo cual ocurrirá cuando hayas pulsado S tantas veces como fichero SNAPxxxx.SNA hubiera más una. Sin embargo, este funcionamento explicado es el que ocurre con el navegador NMI antiguo a 32 columnas, pero el nuevo navegador NMI a 64 columnas del Dr.Slump tiene corregido este problema, y los snapshots se graban con la siguiente secuencia libre que encuentran sin dar error. Por eso es conveniente actualizar al nuevo navegador NMI, que además trae muchas mejoras con respecto al antiguo.

Para salir del navegador NMI debes hacer BREAK (tecla ESC)

¿Cuáles son los comandos esxDOS exclusivos del ZX-Uno?

El sistema operativo de disco esxDOS es usado en dispositivos como el divIDE o el divMMC, los cuales se conectan a spectrums reales. También se encuentra implementado en otros clones como el OMNI 128HQ (una versión mejorada de la placa Harlequin), o en placas FPGA como el ZX-Uno o el ZX Spectrum Next. Para el esxDOS se han creado una multitud
de comandos para las más diversas funciones, pudiéndose ver una lista muy completa de ellos aquí.

Los comandos esxDOS exclusivos del ZX-Uno son los siguientes:

  • backup: Copia a un fichero FLASH.ZX1 en el directorio raíz de la tarjeta SD el contenido de toda la memoria SPI Flash. Funciona solo con memorias SPI Flash de 4 Megas (las originales del crowdfunding para 9 cores). Tras terminar su ejecución hay que ejecutar el comando .ls para que se termine de grabar la cache en la tarjeta SD, sino lo haces la longitud del archivo se quedará en 0 de forma errónea.
  • back16m: Versión del comando backup exclusivo para memorias SPI Flash de 16 Megas (las de hasta 45 cores). Igual que en el comando anterior, hay que hacer un .ls a continuación para que quede bien grabada en la tarjeta SD.
  • corclean: Para limpiar los caracteres extraños que quedan en la lista de cores cuando se pasa de una SPI Flash de 9 cores a una de 45.
  • core: Carga el core del slot indicado (1 a 9).
  • corebios: Para hacer una actulización conjunta del core de Spectrum y de la BIOS.
    Necesario para la actualización al core de Spectrum EXP26 desde versiones anteriores.
  • dmaplayw: Reproduce un archivo de audio .wav,  que debe ser de 8 bits, sin signo y muestreado a 15625 Hz.
  • esprst: Resetea el addon WIFI ESP12
  • iwconfig: Para almacenar la configuración del WIFI (SSID, clave, etc)
  • joyconf: Configura y prueba los joysticks keyboard y DB9.
  • keymap: Sirve para cargar una definición de teclado diferente
  • loadpzx: Para cargar un archivo de imagen de cinta .pzx
  • playmid: Reproduce archivos musicales .mid en el addon MIDI
  • playrmov: Reproduce videos en formato radastaniano (ficheros .RDM)
  • romsback: Copia
    a un fichero ROMS.ZX1 en el directorio raíz de la tarjeta SD todas las
    roms del core Spectrum almacenadas en la memoria SPI Flash
  • romsupgr: Copia el contenido de un fichero ROMS.ZX1 en el directorio raíz de la tarjeta
    SD con todas las roms para el core Spectrum a la memoria SPI Flash.
  • upgrade: Copia el contenido de un fichero FLASH.ZX1 en el directorio raíz de la
    tarjeta SD a la memoria SPI Flash. Funciona solo con memorias SPI Flash
    de 4 Megas (las originales del crowdfunding para 9 cores).
  • upgr16m: Versión del comando upgrade exclusivo para memorias SPI Flash de 16 Megas (las de hasta 45 cores).
  • wget: Para descargar algo desde HTTP( https no está soportado) y almacenarlo a la tarjeta SD via esxDOS.
  • zxuc: Configura todas las opciones de la BIOS, permitiendo grabar en la SD las
    opciones  seleccionadas en archivos de configuración que pueden
    posteriormente ser cargados.
  • zxunocfg:
    Configura determinados aspectos del funcionamiento del ZX-Uno como los timings, la contención, el tipo de teclado, la velocidad de la CPU, el tipo y frecuencia vertical del vídeo.

Y hay multitud de comandos esxDOS, que sin ser exclusivos para su uso con el ZX-Uno, sí son de gran utilidad:

  • 128: Para pasar al modo 128K desde el modo 48K.
  • cd: Cambiar de directorio.
  • chmod: cambiar los atributos de los ficheros de la tarjeta SD.
  • cp: Copiar un archivo.
  • divideo: Reproduce un archivo de video DivIDEo (.dvo).
  • drives: Cambiar de unidad de disco
  • dzx7: Descomprime archivos comprimidos en un archivo .ZX7
  • launcher: Crea comandos esxDOS que cargan ficheros .TAP
  • ls: Ver el contenido de un directorio.
  • mkdir: Crear un directorio.
  • mktrd: Crear un fichero imagen de disquete .TRD
  • more: Ver el contenido de un archivo de texto
  • mv: Mover un archivo
  • ownrom: Cargar una rom de 16K
  • playpt3: Reproducir un archivo musical .PT3
  • playsqt: Reproducir un archivo musical .SQT
  • playstc: Reproducir un archivo musical .STC
  • playtfm: Reproducir un archivo musical .TFC
  • playwav: Reproducir un archivo musical .WAV
  • playzxm: Reproducir un archivo de vídeo .ZXM
  • rm: Borrar un archivo o directorio
  • scl2trd: Convierte una imagen de disquete .SCL a formato .TRD
  • sidplay: Reproducir un archivo musical SIDDUMP
  • snapload: Carga archivos .SNA y .Z80
  • tap2mic: Reproduce el audio de un fichero .TAP
  • tapein: Montar un archivo .TAP para poder ser utilizado luego desde BASIC con la sentencia LOAD
  • tapeout: Montar un archivo .TAP para poder ser utilizado luego desde BASIC con la sentencia SAVE
  • te: Un editor de archivos de texto
  • trd: Para pasar al entorno TR-DOS del esxDOS y ejecutar comandos de ese entorno
  • vdisk: Monta una unidad de disquete .TRD para usar en el entorno TR-DOSç

Podéis echar un vistazo a las posibilidades que ofrece el sistema operativo de disco esxDOS consultando estos manuales de uso:

El juego X no me funciona

Hay distintas razones para que un juego no funcione, algunas vienen del ZX-Uno propiamente dicho, y otras vienen de problemas anteriores ya conocidos de incompatibilidades con Spectrum 128K o con DivIDE/DivMMC.
Estos son algunos casos conocidos:

  • Algunos juegos de 48K no funcionan si el Spectrum elegido es 128K: haz OUT 32765,48 o bien carga este fichero tap ya preparado con el OUT 32765,48 antes.
  • Algunos juegos no cargan bien, especialmente algunos juegos hechos con «La Churrera». Prueba este POKE 23388,16 antes, o carga este otro fichero tap que contiene el POKE 23388,16.
    La última versión de ESXDOS hasta la fecha (19/9/2016), que es la 0.8.6 beta 5.1, tiene un cambio que viene a paliar este problema, pero ni está probado muy a fondo ni la mayoría de los ZX-Uno hasta la fecha llevan esa versión.
  • Algunos juegos (por ejemplo Mad Mix game) parecen perder la información de color y se ven fatal: Prueba con estos OUT antes de jugar: OUT 64571,15 : OUT 64827,7 o utiliza ZXUC para desactivar los modos Timex. Hay una tercera opción que es desactivar los modos gráficos adiciones desde la BIOS, pero eso hará que juegos que puedan usar esos modos (Radastan, Timex o la ULA Plus no funcione). Una cuarta opción es tener una ROM específica para jugar estos juegos con el setting de los modos Timex desactivado (ver más adelante como instalar y configurar ROMs).

¿Hay otras teclas útiles para el core de Spectrum?

Sí, esto es lo más importante:

  • Ctrl+Alt+backspace: Hard reset. Backspace es la tecla de borrar hacia atrás, encima del enter.
  • Ctrl+Alt+Supr: Soft reset.
  • Bloq. Despl.: cambia de modo video compuesto a VGA y viceversa.
  • Ctrl+Alt+F5 o simplemente F5: NMI
  • F7: Play /Pause en la reproducción de archivos .PZX (a partir del core EXP26).
  • F8: Rebobinar al archivo .PZX hasta la marca anterior (a partir del core EXP26).
  • F12: Turbo Boost. Pone a la CPU a 28MHz mientras se mantenga pulsada (a partir del core EXP27).

Y durante el arranque:

  • F2: Entras en la BIOS
  • Bloq. Mayús o cursor abajo: Menú de selección de cores
  • ESC: Menú de selección de roms del core de Spectrum
  • R: Cargará la rom del core de Spectrum en modo «real» deshabilitando esxDOS, nuevos modos gráficos, etc.
  • / del teclado numérico: Cargará la rom del core de Spectrum en modo «root»
  • 1,2,3,..,9 : Arrancará el core que esté grabado en esos slots.

Al arrancar ESXDOS veo un mensaje que pone RTC.SYS ERROR

No pasa nada. ESXDOS es un sistema operativo genérico que soporta dispositivos DivMMC que tienen la posibilidad de guardar la fecha, para grabar los archivos con fecha. El DivMMC implementado dentro del ZX-Uno no es uno de ellos, por lo que el módulo RTC da error al arrancar, pero no pasa nada (salvo que todos los archivos se generan con una fecha por defecto en lugar de la actual). Sin embargo, para evitar que en el arranque se viese ese error se puede colocar el archivo RTC.SYS en la carpeta /SYS/. Este archivo se incluyo
por primera vez con la versión EXP26 del core de Spectrum.

¿Cómo elijo con que ROM arrancar el core de Spectrum?

Si cuando sale el logo de ZX-Uno pulsamos la tecla Esc, nos saldrá una lista para elegir la ROM a utilizar. Si quieres cambiar la ROM por defecto, lo puedes hacer en la BIOS (ver apartado «Configuración» de esta misma FAQ).

Nota: es posible que entre las ROMs disponibles haya una cuya descripción incluya la palabra «rooted». Avisamos que NO debéis usar dicha ROM para jugar ni para uso normal. Se trata de una ROM que permite acceder a funciones del ZX-Uno que otra no pueden, como grabar la Flash, y que por tanto está hecha especialmente para acciones que lo requieren, pero usarla de manera continua es un riesgo de dañar accidentalmente tu ZX-Uno.

¿Puedo poner pokes?

Sí, para ello puede usar el nuevo navegador NMI o bien usar la ROM «cargandoleches».

1º Método. Usando el nuevo cargador NMI.

Simplemente pulsar NMI Ctrl+Alt+F5 o simplemente F5, y luego la tecla
P para pokear.

2º Método. Usando la ROM «cargandoleches».

Con esa ROM no podrás cargar juegos con el menú de NMI así que tendrás que usar comandos de ESXDOS, después de hacer BREAK al arracar la ROM:

Para cargar taps hay que acceder al directorio donde estén usando así:

.cd <directorio>

y luego cargar el juego así:

.tapein <nombre del fichero tap>
LOAD ""

Una vez cargado el juego, pulsas NMI y te saldrá arriba al a izquierda un recuadro donde primero escribes la dirección del POKE (lo que va antes de la coma), pulsas enter, y después tecleas el valor del POKE (lo que va detrás de la coma). Cuando no quieras poner más pokes
simplemente pulsa enter en lugar de escribir la dirección y volverás al juego ya pokeado.

¿Cómo elijo con que core quiero arrancar mi ZX-Uno?

Por defecto el ZX-Uno arrancará con el core de Spectrum, pero si cuando sale el logo de ZX-Uno pulsamos la tecla Bloqueo Mayúsculas, nos saldrá una lista para elegir el core a arrancar. Tened en cuenta que algunos cores solo funcionan por VGA, por lo que si estáis por video compuesto no veréis nada si los elegís.

También podéis arrancar directamente los cores en los slots 2 a 9 pulsando las teclas 2 a 9 en el momento del arranque del ZX-Uno.

¿Puedo elegir core una vez arrancado en modo Spectrum?

Sí siempre que te sepas el slot en el que está el core que quieres arrancar, escribe «.CORE n» , donde n es el numero de slot. Solo funciona para valores de n entre 1 y 9. Si se pone un número mayor solo cogerá el primer dígito, así tanto .CORE 2 como .CORE 24 arrancan con el core del slot 2.

CONFIGURACION

¿Cómo entro a la BIOS?

En la BIOS de Zx-Uno se pueden configurar varias cosas el core de Spectrum, y realizar  algunas opciones avanzadas como actualizaciones. Para entrar, solo hay que pulsar la tecla F2 cuando se muestra el logo de ZX-Uno en el arranque.Hay otra forma alternativa de entrar, que es en el arranque pulsar la tecla cursor abajo o dirección abajo en el joystick. Eso nos presentará una pantalla con todos los cores instalados y también una última opción
«Enter Setup» que nos permitirá entrar en la BIOS.

¿Cómo puedo seleccionar la ROM de Spectrum por defecto?

Desde dentro de la BIOS. Accede a la BIOS y ve al menú ROMS. Selecciona la ROM que quieres que sea por defecto, pulsa ENTER y luego elige «Set active».

¿Como puedo seleccionar el core por defecto?

Entra a la BIOS, ve al menú BOOT y pulsa enter sobre el core elegido.

Pero selecciono un modelo de 128K y me arranca en 48K

Si tienes activado DivMMC para poder cargar juegos desde la tarjeta SD, este fuerza arrancar en 128K pero en el llamado «modo USR 0», que arranca con la ROM del 48K. En la práctica estarás en un 128K pero en modo 48k. Si quieres que aparezca los menúes de inicio de los modelos de 128K puedes ejecutar el comando esxDOS .128  en caso de que lo tengas
instalado. También puedes seleccionar una rom que ya arranque en modo 128 como la Derby++ 64K.

Pero yo quiero ver el +3DOS o programar BASIC en modo 128K

Para eso tienes dos opciones:

  • Entrar a la BIOS y cambiar el setting de «DivMMC» de «auto» a «disabled», pero dejarás de poder cargar desde la SD desde todas las ROMS.
  • Crear e instalar un ROM específica de 128K con DivMMC disabled. Ver el apartado de instalar o cambiar ROMs más adelante.

¿Que opciones se pueden cambiar en la BIOS?

Estas son las opciones de la BIOS 0.75 a fecha de hoy (05/10/2019):

  • Seleccion de tipo de teclado (Issue 2/Issue 3)
  • Timing ULA (48K, 128K, Pentagon)
  • Contended memory Sí/no
  • DivMMC Sí/no
  • NMI DivMMC Sí/no
  • Layout de teclado ES/EN/Spectrum
  • Joystick DB9: Kempston, SJS1, SJS2, Protek, Fuller o OPQAspM
  • Joystick emulado en teclado: Kempston, SJS1, SJS2, Protek o Fuller
  • Video: PAL, NTSC o VGA
  • Scanlines para modo VGA Sí/no
  • Frecuencia: 50, 51, 53.5, 55.8, 57.4, 59.5, 61.8 y 63.8
  • Velocidad de la CPU: x1, x2, x4 y x8
  • CSync: Spectrum o PAL
  • Opción de deshabilitar modos gráficos avanzados (ULAPlus, Timex, Radastan)

Además la BIOS tiene opciones para hacer varios upgrades, cambiar las ROMS, y algunos  test de memoria, teclado, cinta, para comprobar que nuestro ZX-Uno está en forma.

¿Esas opciones se pueden cambiar cuando el Spectrum ya ha arrancado?

La mayoría sí. Existen utilidades que vienen con el ESXDOS de ZX-Uno como .JOYCONF, .KEYMAP o .ZXUNOCFG. Puedes ejecutar dichos comandos sin parámetros para que te indiquen que opciones tienen.

También esta ZXUC, que es un interfaz gráfico que permite modificar muchas opciones y viene en formato .tap.

Finalmente, también es posible modificar muchas opciones a base de OUTs, para lo
cual es necesario entender principalmente los registros MASTERCONF, DEVCONTROL y DEVCTRL2 de ZX-Uno, que podemos ver en el listado de registros de ZX-Uno.

No me funciona ni .joyconf, ni .zxunocfg ni nada

Probablemente instalaste un ESXDOS estándar y no el que incluye los comandos específicos de ZX-Uno. Si el fabricante de tu ZX-Uno te facilitó instrucciones repasalas para ver si te has dejado algo, sino preguntale. También pueden descargarse estas aplicaciones, pero si quiere descargar la última version mejor preguntar en el foro donde están.

PANTALLA Y MONITORES

¿Video compuesto, RGB o VGA?

La mejor calidad te la da VGA, en la que además puedes añadir scanlines para simular TVs antiguas. Necesita un cable específico no obstante. Además, algunos cores como el de NES solo van por VGA.

Por otro lado video compuesto es sencillo  de utilizar y solo requiere un cable sencillo, pero la calidad de imagen es inferior. Sin embargo cuando se selecciona video compuesto el ZX-Uno también saca señal RGB por el conector VGA, de esta forma se puede, con el cable adecuado, conectar el ZX-Uno a la entrada Euroconector/SCART de una televisión, y ver la imagen con una gran calidad.

¿Cómo cambio a VGA?

Conecta el cable, y pulsa la tecla Bloq Despl. Si se ve bien ve a la BIOS, pulsa de nuevo Bloq Despl y cambia los valores de VGA y Frecuencia en «Advanced options».

No obstante, es posible que tu monitor soporte resoluciones inferiores a los 60Hz por VGA, por lo que puede usar .zxunocfg o ZXUC para probar y tratar de reducir hasta la menor frecuencia que soporte tu monitor, y una vez comprobado, volver a la BIOS y ponerlo así.

Es recomendable elegir la frecuencia menor a la que nuestro monitor sea capaz de sincronizar, porque una frecuencia mayor implica que el Spectrum va más rápido, así que a 60Hz va un 20% pero a 55Hz solo un 10%. Cuanto menos, mejor.

He cambiado de modo de video y ahora no veo nada en la pantalla

Reinicia el ZX-Uno y pulsa F2 para entrar en la BIOS (aunque no la veas). Pulsa la tecla Bloq Despl. Dicha tecla cambia entre modo PAL 50Hz (ideal para video compuesto o RGB) y modo VGA a 60Hz(ideal para conector VGA).

Una vez puedas ver la BIOS puedes cambiar los settings y restaurar los de por defecto por ejemplo.

ACTUALIZACIONES

¿Que son los upgrades y cuales puedo hacer?

El ZX-Uno te permite hacer upgrade (actualizar):

  • El firmware o BIOS, que es lo que sale al arrancar y que pulsando F2 se accede al setup del core de Spectrum al estilo BIOS de PC.
  • Los cores, o la implementación de las distintas máquinas que el ZX-Uno puede soportar.
  • Las ROMS del core de Spectrum. Estas se pueden actualizar por separado del core de Spectrum aunque son solo para dicho core. El resto de cores llevan su propia ROM dentro del core en sí.
  • ESXDOS, el sistema operativo para acceder a la tarjeta SD desde el core de Spectrum.
  • Toda la flash, incluyendo ESXDOS, las ROMS, los CORES y el firmware

NOTA IMPORTANTE:
Si vas a actualizar a una BIOS >= 0.70 o a un core >= EXP26 desde una versión de BIOS < 0.70 o de core < EXP26 (p.e: T24 o EXP25) hay que hacer una actualización conjunta de CORE y BIOS a la vez. Está explicado en este hilo.

¿Qué firmware tengo y cómo lo actualizo?

En la pantalla de arranque de ZX-Uno, donde se ve el logo, podéis ver en algún sitio «ZX Uno BIOS v0.xx», o bien si entráis en la BIOS pulsando F2, en la línea inferior veréis
la versión que tenéis instalada. A día de hoy (05/10/2019) la última versión es 0.75.

Para actualizarlo debemos descargar el fichero FIRMWARE.ZX1, que podéis obtener en el  github de Antonio Villena, su autor. Veréis que puede haber otros archivos de firmware con otras extensiones: ZX2, ZX3, o ZXD. Son firmwares para otras placas FPGA que no debéis emplear.

Nota: actualizar el firmware (BIOS) es delicado, no lo hagas si no es necesario, y si lo haces trata de que tu ZX-Uno tenga alimentación ininterumpida (usa un SAI o conecta la corriente a un USB de portatil con bateria).

Una vez tenemos el fichero, lo ponemos en la carpeta raiz de nuestra tarjeta SD, encendemos nuestro ZX-Uno y pulsamos F2 para entrar en la BIOS, nos vamos a Upgrade, elegimos «Upgrade BIOS for ZX», luego «SD file». El sistema leerá el fichero FIRMWARE.ZX1 y  avisará cuando esté actualizado. Es el momento de reiniciar nuestro ZX-Uno y disfrutar de
nuestra nueva BIOS.

No debe sorprenderos si la barra de progreso no se rellena entera. El firmware ocupa solo una pequeña parte de la flash del ZX-Uno, y la barra de progreso marca solo esa pequeña parte.

¿Cómo instalo o actualizo cores?

Lo primero que debes saber es que hay 9 o 45 slots para cores disponibles (depende del tamaño de la SPI Flash de tu modelo de ZX-Uno), estando reservado el primer slot para el de Spectrum.

En los ZX-Uno 4.1 del crowdfunding se utilizó el chip de memoria flash W25Q32 (4 megas – 9 cores) y a partir del ZX-Uno 4.2 se usó el  W25Q128 (16 megas – 45 cores). Aquí se puede ver el mapa de memoria de la flash Q128 de 16MB

Mapa de memoria FLASH.ZX1 (16MB) formato SPIQ128

(los primeros 4 MB corresponde con la misma disposición de la flash Q32)

Nota importante: Desde la versión de BIOS 0.80 se ha cambiado la convención para los nombres de los archivos de los cores a COREnnS.ZX1, donde nn siempre deben ser 2 dígitos, y S es una cadena de caracteres (puede incluir espacios). Así un archivo viejo CORE4.ZX1 debe ser renombrado a CORE04.ZX1 para que funcione. La cadena de caracteres es ignorada, por eso se puede dar nombres a los ficheros como CORE04 C64 BETA7b.ZX1. Para BIOS más antigua la convención es la que se emplea en los párrafos siguientes.

Todos los cores se actualizan igual, excepto el de Spectrum. Para actualizar o instalar un core necesitamos primero la última versión del fichero que lo define, que será un fichero llamado COREn.ZX1. ¿Dónde están esos ficheros? Pues dependiendo del core puede que lo encuentres en el foro, aunque un buen primer sitio para mirar es el github de Antonio Villena. Una vez tenemos el fichero COREn.ZX1 decidimos en que slot lo vamos a poner (2 a 9, 10 a 45) y renombramos el fichero COREn.ZX1 o COREnn.ZX1, sustituyendo la n o nn por el número de slot (por ejemplo CORE2.ZX1 para el slot 2).

Una vez tenemos nuestro fichero, lo ponemos en la carpeta raíz de nuestra tarjeta SD, encendemos nuestro ZX-Uno y pulsamos F2 para entrar en la BIOS, nos vamos a Upgrade, elegimos la fila correspondiente al core elegido (en nuestro ejemplo la 2 – justo después de la de Spectrum – pulsamos enter y luego «SD file». El sistema leerá el fichero CORE2.ZX1 y avisará cuando esté actualizado, aunque antes preguntará el nombre – es el nombre con el que se verá en la lista para elegir el core en el arranque, y en el listado del a BIOS. Una vez instalado el CORE podemos acceder a él al arrancar.

No debe sorprenderos si la barra de progreso no se rellena entera. Cada core ocupa solo una pequeña parte de la flash del ZX-Uno, y la barra de progreso marca solo esa pequeña parte.

¿Cómo actualizo el core de Spectrum?

Nota: actualizar el core de Spectrum es delicado, no lo hagas si no es necesario, y si lo haces trata de que tu ZX-Uno tenga alimentación ininterumpida (usa un SAI o conecta la corriente a un USB de portatil con bateria).

Exactamente igual que los otros cores, pero en lugar del fichero CORE1.ZX1 necesitarás un fichero llamado SPECTRUM.ZX1. Pregunta por él en los foros.

¿Y como puedo borrar un core?

No se puede. Si quieres que no salga en la lista grabale otro encima o graba uno cualquiera y cuando pregunte el nombre dejalo vacío, pero eso no hará que no esté ahí.

¿Cómo actualizo ESXDOS?

Para actualizarlo debemos visitar la página oficial de ESXDOS, y  descargamos los archivos de la versión que queramos instalar, y luego seguir esta «receta» :

  • Copia las carpetas BIN y SYS al directorio raíz de tu tarjeta SD, sobrescribiendo los archivos. pero ojo, no las borres, grabalas encima. Esto es para asegurarse de que los comando nuevos de ESXDOS creados para ZX-Uno no se pierden, porque no vienen con las distribuciones de ESXDOS estándar. Si estás usando un navegador NMI alternativo, no copies NMI.SYS ni NMI_HELP.SCR de la carpeta SYS.
  • Haz una copia de ESXMMC.BIN, renómbralo a ESXDOS.ZX1, y cópialo a la carpeta raíz de tarjeta SD.
  • Inserta la tarjeta SD en tu ZX-Uno.
  • Enciende tu ZX-Uno y pulsa F2 para entrar en la BIOS.
  • Dirígete al menú Upgrade y elige «Upgrade ESXDOS for ZX».
  • En los diálogos de la opción elige «SD file», y cuando presente «Load from SD» contesta «Yes»  a la pregunta «Are you sure?».
  • El sistema leerá el fichero ESXDOS.ZX1 y avisará cuando esté actualizado. No debe sorprenderos si la barra de progreso no se rellena entera. ESXDOS ocupa solo una pequeña parte de la flash del ZX-Uno, y la barra de progreso marca solo esa pequeña parte.
  • Haz un Hard-reset de tu ZX-Uno, o apágalo y enciéndelo.
  • ¡Lo has conseguido!

¿Cómo actualizo o cambio las ROMS de Spectrum?

Hay dos posibilidades:

  • Obtener el fichero .tap que corresponde a cada una de las ROMS y desde la BIOS acceder al apartado «ROMS» y pulsar N, elegir un slot y reproducir el fichero .tap desde una fuente externa por la entrada EAR (desde un PC por ejemplo). Hay que tener en cuenta que algunas ROMS ocupan un slot (16k) y otras más (hasta 4), por lo que dependiendo de
    la ROM a cargar tendréis que elegir un slot vacío, o una zona que tenga 2, 3 o 4 slots vacíos juntos. En caso de querer reemplazar una ROM, primero hay que borrarla (pulsar enter sobre la mismo y elegir «delete») y después cargarla de nuevo.
  • Generar un fichero con todas las ROMs usando la utilidad ZX1RomPack, que además permite poner determinado ajustes a las ROMS – como el timing de la ULa, si tiene habilitado DivMMC, modo Radastan, etc. Si usáis esta aplicación acabaréis grabando un fichero llamado ROMS.ZX1, que tenéis que colocar en el raiz de vuestra tarjeta SD, y después arrancar el ZX-Uno usando una ROM específica «rooted» (buscad en vuestro listado de ROMs y seguro que hay una). Una vez arrancado el ZX-Uno con la ROM rooted, teclead «.ROMSUPGR» (no olvidéis el punto al inicio). Se grabarán todas las ROMs y podremos utilizar nuestro ZX-Uno con nuestras nuevas ROMs. Existe un comando de ESXDOS llamado «.ROMSBACK» que hace el proceso contrario, es decir, coge las ROMS del ZX-Uno y las graba en un fichero ROMS.ZX1 en el raiz de nuestra tarjeta SD. De ese modo – en lugar de partir de cero – podemos extraer las ROMS del ZX-Uno, utilizar ZX1Rompack para modificar lo que queramos, y volver a grabar el  ROMS.ZX1 en nuestro ZX-Uno.

Nota: a partir de la BIOS 0.65 si se pulsa / (signo de dividir) en la pantalla del arranque se iniciará en modo rooted la ROM por defecto, o la ROM que se elija si después de pulsarla seleccionamos otra ROM. Verás el borde en color rojo para indicarte que se arrancará en
modo rooted.

¿Puedo generar yo mis propios ficheros .tap para cambiar ROMS?

Sí, puedes utilizar la utilidad GenROM, para obtener la última versión podéis preguntar en el foro. Dicha utilidad es para línea de comandos, y requiere entender los parámetros de configuración de la BIOS. Si la ejecutáis sin parámetros podréis ver como funciona, y si tenéis dudas sobre alguna opción, lo mejor es que comprobéis lo que significa en la descripción de registros de ZX-Uno.

¿Hay alguna ROM que sea exacta a determinado modelo de ZX-Spectrum?

Por defecto no, porque todas las ROMS suelen venir con cosas como DivMMC, modos Timex, ULAPlus, etc. activados. Esto son funcionalidades extra que facilita ZX-Uno pero que no traía ningún Spectrum original. En otros casos, como el chip de sonido AY, solo lo traían los modelos de 128K, pero en ZX-Uno incluso el modelo de 48K lo puede llevar
activado.

Si queréis un Spectrum puro, solo teneís que crearos vuestra propia ROM (por ejemplo con la ROM del Spectrum 48K y desactivando modos Timex, modo Radastan, ULAPlus, chip AY y DivMMC) e instalarla. Así tendréis un Spectrum 48K puro hasta el punto de que cargar los juegos por EAR será lá única opción. Otra opción más sencilla es arrancar en modo real. A partir de la BIOS 0.65 si se pulsa «r» en la pantalla de arranque se iniciará en modo real con todos los extras anteriores desactivados. Verás el borde en color cyan para indicarte que se arrancará en modo real.

¿Puedo hacer un backup de todo lo que lleva internamente el ZX-Uno?

Sí, tienes que arrancar con la ROM que ponga «rooted» y ejecutar el comando «.BACKUP». Eso creará en el raiz de tu tarjeta un fichero llamado FLASH.ZX1 que después se puede restaurar desde la BIOS (menú upgrade, «Upgrade flash from SD»)

OTROS CORES

Aunque el objetivo de esta FAQ es documentar el core de Spectrum, vamos a dar alguna información sobre otros cores, teniendo en cuenta que no es intención del autor de esta FAQ tener este contenido actualizado, para eso, mejor el foro de ZX-Uno

¿Qué otros cores hay para Zx-Uno?

A día de hoy (5 de octubre de 2019) hay varios cores para ZX-Uno:
Amstrad CPC 464 (varias versiones), Commodore 64, MSX 1, PC-XT, Sam Coupe, Jupiter Ace, Sega Master System, Oric Atmos, BBC Micro, Atari 800XL, Vic 20, Acorn Electron, Commodore 16, Commodore PET, ZX-81, Sharp MZ-700, Colecovision, Atari 2600, Apple 2, Acorn Atom, Nintendo Entertainment System (NES), otras versiones de Spectrum como la TBBlue o la Kyp, Vectrex, Galaksija, TRS-80 Model I, Multicomp, Apple I, Flappy Bird y además una serie de máquinas arcade.

Muchos de estos cores tienen requisitos especiales, como una tarjeta formateada de una manera especial, o usar solo salida VGA no pudiendo funcionar por video compuesto.

Una lista actualizada de todos los cores la podéis encontrar aquí.

Asimismo, podéis encontrar las teclas utilizadas por cada core, así como la función que realizan, en este otro documento.

¿Puedo cambiar las ROMS de otros cores? ¿La de Sam Coupé por ejemplo?

No, las ROMs de otros cores van dentro del core y salvo que el core lo permita expresamente o el core tenga las ROMS en la SD, no será posible cambiarlas.

¿Cómo hago funcionar el core de Amstrad CPC 464?

Actualmente hay 3 cores de Amstrad CPC para el ZX-Uno. El core de McLeod_Ideafix para el modelo CPC 464, una versión del anterior adaptada por jepalza para paginar hasta 128K (sería como un CPC6128 al que no le funcionase la disquetera), y el core de Renaud Helias que tiene un soporte limitado de carga desde tarjeta SD.

El core de McLeod_Ideafix  no necesita nada en especial, ni siquiera una tarjeta SD, porque solo permite por ahora cargar por la entra EAR. Conecta tu casette o reproductor alternativo al ZX-Uno por dicha entra y teclea RUN» en el ZX-Uno. En la versión de jepalza, antes de poder cargar desde cinta, es necesario teclear el comando |TAPE para indicar que la carga se va a realizar desde el cassette, y no desde la disquetera. Para  utilizar el core de Renaud Helias mejor mirar sus instrucciones en el foro del ZX-Uno.

¿Cómo hago funcionar el core de MSX 1?

Una guía muy completa para el uso de este core la podéis encontrar en esta entrada en el foro del ZX-Uno.

De este core hay una versión para funcionar con 2 joysticks a la vez para el para el modelo ZX-UNO VGA 2M.

¿Cómo hago funcionar el core de Commodore 64?

Una vez configurada la tarjeta SD con las instrucciones que podréis encontrar en el foro (necesita tarjeta propia), el C64 queda con un disco D64 cargado y varios más en la SD preparados para ser cargados. A partir de ahí os recomiendo mirar el final de este post de desUBIKado que recopila todas las teclas para usar el core.

¿Cómo hago funcionar el core de PC XT?

Este core tiene distintas versiones: la básica para ZX-Uno con 512K de RAM, y dos avanzadas para ZX-Uno con 2Mb de RAM internos, o con 2MB de RAM externos. Elige correctamente la que corresponda a tu equipo.

Para funcionar necesita grabar una imagen en la tarjeta SD, que debe ser de máximo 4Gb y SDHC. Dicha imagen está disponible en el foro. Tened en cuenta que con las últimas versiones del core no es necesario grabar el fichero de la BIOS al final de la tarjeta como algún tutorial indica, lo cual hace todo mucho más fácil, pero sigue siendo necesario grabar la imagen porque graba el sector de arranque de DOS. Una vez grabada la imagen de la tarjeta, se puede meter en cualquier PC y añadir juegos y utilidades para DOS.

El core emula un PC 80186, con algun cambio para dar soporte a algunas instrucciones de 286, con soporte de modo de texto, y modos EGA 320x200x16 y MCGA 320x200x256 (también llamado VGA). Esto implica que puede ejecutar juegos creados principalmente en la primera mitad de los 90, descartando por antiguos aquellos que solo tengan salida CGA o
anteriores, y aquellos que usen modo protegido o requieran un 386 o superior.

Como en los tiempos de DOS, la cantidad de memoria convencional libre puede ser un problema, y es por eso que en la versión de 512K, que al final tras cargar el DOS, controlador de ratón, etc. queda poca RAM libre (menos de 500K) habrá juegos que no funcionen. La presencia de los 2Mb permite salvar ese problema y además hace funcionar mejor a algunos juegos que usan el resto de RAM como caché de disco, por ejemplo «El Día del Tentáculo».

Si queréis estrujar la RAM del PC como en los buenos tiempos, esta versión de CuteMouse ocupa bastante menos que la que viene con el core, y este controlador de teclado puede sustituir al original KEYB ocupando mucha menos RAM. Aparte de eso, la necesidad de carcar DOSKEY en un sistema que solo se use para jugar es dudosa.

Tened en cuenta que no había sitio suficiente para almacenar el modo VGA 320x200x256 por lo que veréis que en esos juegos faltan unas lineas en la parte de abajo de la pantalla. Según el juego que sea esto afectará mucho, poco o nada.

¿Cómo hago funcionar el core de Sega Master System?

El core de Sega Master system solo necesita que metas algunos juegos en formato .SMS en una carpeta de tu tarjeta SD. Al arrancar directamente te presenta un selector para cargarlos. Si te dice que hay error de disco probablemente no soporte bien tu tarjeta, prueba a reformatearla que este core es un poco especial con las tarjetas SD.

Ten en cuenta que el core no soporta todos los juegos de Sega Master System, solo una gran cantidad, por lo que si el primero no te funciona no desesperes, prueba más.

Pulsando F12 se accede al menú, y el juego puede pausarse con la tecla Pausa

De este core hay también versiones para funcionar con 2 joysticks a la vez, tanto para  joysplitter, como para el modelo ZX-UNO VGA 2M

¿Cómo hago funcionar el core de NES?

El core de NES solo necesita que metas algunos juegos en formato .NES en una carpeta.

Ten en cuenta que el core no soporta todos los juegos de NES, solo una gran cantidad, por lo que si el primero no te funciona no desesperes, prueba más.

Importante: este core solo funciona por VGA

De este core hay también versiones para funcionar con 2 joysticks a la vez, tanto para  joysplitter, como para el modelo ZX-UNO VGA 2M.

¿Cómo hago funcionar el core de TTBlue/ZX Next?

Nota: esta información está obsoleta, los últimos cores del Next no caben en el ZX-Uno por lo que las instrucciones que hay aquí son para uno relativamente antiguo.

Instalar el core en sí se hace igual que los demás cores, necesitas el fichero COREn.ZX1 e instalarlo. Además de eso, necesitáis instalar estos ficheros del firmware de TTBlue en la tarjeta SD.

Sin embargo el fichero arriba enlazado tiene el problema de contener cosas en exceso. Del mismo solo tenéis que extraer, de la carpeta SDCard, las carpetas TTBLUE y TMP, y el fichero TTBLUE.FW y ponerlos en vuestra tarjeta SD. Eso os permitirá arrancar, pero es posible que una vez arrancado ESXDOS no funciones: al pulsar F10 se produce un reset, y
si pones comandos de ESXDOS dice «Nonsense in BASIC». Si esto ocurre es que el core y vuestra tarjeta no tienen el mismo ESXDOS. Para solucionar eso solo tenéis que saber que versión exacta de ESXDOS tenéis instalada en vuestro ZX-Uno, buscar el paquete original de dicha versión, sacar el fichero esxmmc.bin de dicho paquete, renombrarlo como esxmmc.rom y grabarlo dentro de la carpeta TTBLUE de la tarjeta SD, sustituyendo al que hay en dicha carpeta.

¿Cómo hago funcionar el core de Jupiter Ace?

Existen dos versiones de este core, la original de McLeod_Ideafix, y una mejorada por azesmbog, con soporte de carga desde la tarjeta SD. La versión originalno requiere configuración especial, pero solo puedes carga juegos por la entrada EAR, y no soporta la tarjeta SD.

¿Cómo hago funcionar el core de Sam Coupé?

No requiere configuración especial, pero solo puedes carga juegos por la entrada EAR, no soporta la tarjeta SD.

Para cargar un juego, desde la pantalla inicial de las bandas de colores pulsa 7 en el teclado numérico (equivalente a pulsar F7 en el teclado del SAM Coupé), o bien desde BASIC teclea LOAD «»(como en el Spectrum)

¿Cómo hago funcionar el core de BBC Micro?

Hay que formatear una SD sin formato rápido, preparar fichero BEEB.MMB en la raíz con MMBImager e introducirlo como el primer archivo de la tarjeta.

Con RePag, AvPag cambiamos de modo VGA a vídeo compuesto, con Shift+F12 mostramos el selector de archivos (sin soltar Shift) y con F12 hacemos reset.

¿Cómo hago funcionar el core de Acorn Atom?

Formatear la tarjeta en FAT y meter estos ficheros para el core de Acorn Atom en la raíz.

Con Shift+F10 mostramos el selector de ficheros, con F10 hacemos reset, y F1-F4 elige modo turbo (F1 = 1Mhz, F2 = 2Mhz, F3 = 4Mhz, F4 = 8Mhz)

Importante: este core solo funciona por VGA

¿Cómo hago funcionar el core de Acorn Electron?

Hay que formatear una SD sin formato rápido, preparar fichero un BEEB.MMB e  introducirlo como el primer archivo de la tarjeta (de igual forma que en el BBC Micro). Tambień es posible cargar programas por la entrada de audio.

Con RePag, AvPag cambiamos de modo VGA a vídeo compuesto. También hay otros modos (60Hz, etc) usando combinaciones de ctrl+CapsLock+1 al 4).

Podemos hacer Reset con F10 y ctrl+F10.

¿Cómo hago funcionar el core de Colecovision?

La tarjeta SD debe estar formateada en FAT16 (en FAT32 no funciona) y se deben copiar a ella ficheros de este archivo. En la carpeta Coleco se introducirán los juegos que queramos añadir y en el fichero MENU.TXT estarán los nombres largos de los juegos y el nombre de los ficheros .rom. Si se añade un nuevo juego habrá que modificar este fichero para que el nuevo juego aparezca en el menú de selección. El final de líneadel fichero MENU.TXT debe ser en formato DOS (0x0D + 0x0A), no el de linux (solo 0x0D).

De este core hay una versión para funcionar con 2 joysticks a la vez para el para el modelo ZX-UNO VGA 2M.

¿Cómo hago funcionar el core de Atari 2600?

Simplemente pulsa Esc para mostrar el menú

Importante: este core solo funciona por VGA

¿Cómo hago funcionar el core de Apple II?

Necesitamos lo siguiente:

  • Una imagen de disco en formato .nib, si no está en ese formato (suelen estar en .dsk o .do), puedes usar en windows la utilidad dsk2nib.exe disponible en la carpeta roms del core para convertirlo. Hay un par de imágenes preparadas en la carpeta roms, el DOS 3.3
    (Apple33.nib) y el juego Spy vs. Spy (SpyVsSpy.nib)
  • Una tarjeta SD dedicada (se borra todo el contenido).
  • Una utilidad de volcado RAW de archivos a disco, como dd de GNU/Linux o HDD Raw Copy Tool de Windows, con la que volcaremos el archivo .nib a la SD.

Importante: este core solo funciona por VGA

Shift+Fx carga el disco x, por ejemplo Shift+F1 carga el primer disco.

¿Y los demás cores?

Para el resto de cores tendrás que elegir el hilo adecuado del foro de ZX-Uno

¿Hay cores de máquinas arcade?

Sí, algunas máquinas clásicas: échale un ojo a este hilo del foro sobre los cores de arcades.

PROGRAMACION DE ZX-UNO

¿Qué funcionalidades especiales tiene ZX-Uno?

ZX-Uno reune muchas funcionalidades que vienen heredadas de distintos periféricos, y en algun caso de algunas expansiones modernas o de antiguos clones. Esta es una lista de funcionalidades ‘extra’ que no estaban en el Spectrum de 48K original y que se encuentran en la versión EXP27, última a día de hoy (05/10/2019):

  • Modos gráficos HiRes y HiColor de Timex
  • Modo gráfico radastan, con scroll hardware y grupo de paleta seleccionable
  • ULAplus
  • Interrupción raster programable en número de línea, para cualquier linea de TV
  • Kempston mouse
  • Sonido chip AY
  • Turbo sound (segundo chip AY)
  • Configuración de sonido Stereo
  • Memoria adiciona
  • Soporte de SpecDrum
  • Soporte ZXMMC para +3e
  • Soporte DIVMMC para ESXDOS, UnoDOS, y firmwares compatibles
  • Soporte de joystick real y joystick en teclado con protocolo Kempston, Sinclair 1 y 2, Cursor y Fuller.
  • Soporte de modo turbo a 7MHz, 14MHz y 28MHz
  • Posibilidad de salida de video en modo de video compuesto, RGB 15kHz, o VGA.
  • Carga de ficheros .PZX (son .TZX simplificados) desde la SD para simular carga por audio
  • DMA para hacer transferencias de memoria a memoria, de memoria a I/O, de I/O a memoria, o incluso de I/O a I/O
  • Soporte para el addon WIFI (chip ESP8266 / ESP12E) que permite conectarse a Internet al ZX-Uno
  • Soporte
    para el addon MIDI (chip SAM9773) con 15 canales más percusión,
    polifonía de 38 voces y ROM de instrumentos interna de 4 Mbits

¿Cómo puedo detectar un ZX-Uno?

En general si se va a usar una funcionalidad de ZX-Uno, y es posible realizar una comprobación de dicha funcionalidad, se recomienda hacerlo así. Sin embargo en ocasiones no es posible, y la única manera posible es detectar el ZX-Uno en si. Para ello lo mejor es acceder al registro COREID de ZX-Uno. Para ello hay que tener en cuenta que este registro
devuelve una cadena de caracteres, devolviendo un carácter cada vez que lo leemos, y un cero al final. Si el registro devuelve un cero la primera vez (cadena vacía) o si devuelve cualquier carácter fuera del rango ASCII 32 a 127, es que no es un ZX-Uno.

Este código permite determinarlo:

10 OUT 64571, 255
20 LET A$=””
30 LET A= IN 64827
40 IF (A < 32) OR (A > 127) THEN GOTO 60
50 IF (A <> 0) THEN LET A$ = A$ +CHR(A): GOTO 30
60 IF (A$=””) GOTO 80
70 PRINT “ES UN ZX-UNO”: STOP
80 PRINT “NO ES UN ZX-UNO”

¿Y como sé si el ZX-Uno está actualizado a cierta versión del core que soporta una nueva funcionalidad que necesito?

Muy sencillo, el formato del COREID es el siguiente ETIQUETA-FECHA, por ejemplo T24-03122016 o EXP25-01092017. La etiqueta no sirve de gran cosa, por ejemplo los cores originales del ZX-Uno eran T22, T23, etc. pero el último a fecha de hoy es experimental y es el EXP27, y por ejemplo el emulador ZesarUX lleva la etiqueta Z22 en lugar de T22. Sin
embargo la fecha que va tras el guion está mucho más clara (formato DDMMAAAA), y solo tienes que comprobar que el usuario tiene un core con una fecha igual o posterior a la que llevaba el core que incluyó la característica que necesitas por primera vez.

¿Qué modos gráficos soporta el ZX-Uno

El ZX-Uno soporta 4 modos gráficos:

  1. El normal de ZX-Spectrum: 256×192 pixeles, con un color de paper/ink/birght/flash por cada bloque de 8×8 pixeles.
  2. El modo HiColour de Timex, con 256×192 pixeles, y un color de paper/ink/bright/flash por cada bloque de 8×1 pixeles.
  3. El modo HiRes de Timex, con 512×192 pixeles, con solo un color de paper y uno de ink para toda la pantalla.
  4. El modo Radastan, con 128×96 pixeles, linear, con 16 colores por pixel.

Además, gracias a ULAplus es posible modificar la paleta de colores y llegar a modos con hasta 64 colores simultáneos.

ZX-Uno arranca con el modo normal de ZX-Spectrum, en el que no vamos a ahondar porque es de sobre conocido, respecto a los otros modos, hay que tener en cuenta que los Timex permitían tener dos bancos de memoria de pantalla, que pueden intercambiarse. Uno de ellos estaría situado en la zona habitual (0x4000, es decir, 16384) y es llamado Screen 0, y el
segundo estaría situado en 0x6000 (24576) y es llamado Screen 1. En el modo normal de ZX Spectrum es posible utilizar esta característica para cambiar rápidamente el contenido de pantalla preparando una pantalla en 0x6000 mientras se muestra la que hay en 0x4000, y luego cambiar a la de 0x6000 cuando ya está lista, o al revés, siendo el cambio instantáneo. Veremos como hacer este cambio más adelante.

El modo HiColour utiliza el área habitual de pantalla (Screen 0) para definir los pixeles activos y los no activos, es decir, desde 0x4000 (16384) en adelante, ocupando los habituales 6144 bytes. Sin embargo la zona de atributos, en lugar de estar situada justo tras la zona de datos como en el modo normal, está situada en Screen 1 (0x6000), ocupando 6144 bytes también. La colocación de los atributos es similar a la de los datos, es decir, primero los de la primera fila, luego los de la octava, etc. para el primer tercio de pantalla, luego el segundo tercio, etc.

El modo HiRes utiliza ambas zonas, Screen 0 y Screen 1. Cada zona guarda datos de píxeles igual que el Spectrum original. En cada linea de 512 píxeles, cada trozo de 8 píxeles corresponde alternativamente a Screen 0 y Screen 1. Es decir, los primeros 8 píxeles de una cierta línea están en Screen 0, en la posición de memoria que le correspondería según el esquema habitual del Spectrum. Los siguientes 8 píxeles estarían en la Screen 1, en la posición de memoria equivalente, y así sucesivamente. No hay atributos. Los bits 3 a 5 del puerto $FF definen el color de tinta. El color de borde y paper se establece automáticamente como 7-tinta. El brillo está siempre activado tanto en borde como en paper. No es posible cambiar el color del borde para que sea distinto de paper. El puerto $FE por tanto no funcionará para este cometido.

Una forma de ver este modo es con el siguiente programa:

10 OUT 255,6
20 FOR n=0 TO 6143
30 POKE 16384+n,255:POKE 24576+n,0
40 NEXT n

En cada linea, cada dos columnas de 8 píxeles valen 11111111 y 00000000.

El modo radastan, es un modo linear en el que se utiliza el Screen 0, siendo cada byte utilizado para describir el color de dos pixeles. Por ejemplo si un byte es así (en binario)

[AAAABBBB]

quiere decir que el pixel de más a la izquierda tiene el colore AAAA y el de más a la derecha el color BBBB. La pantalla ocupa por tanto 128×96/2 = 6144 bytes una vez más.

¿Cómo se activan los modos HiRes y HiColor de Timex?

Los modos Timex se manejan ambos a través del puerto 0xFF (255), lo que se escriba en este puerto mediante un OUT 255,X maneja esta información:

Bits 0-2: Modo: 000=modo clásico en screen 0, 001= modo clásico en screen 1,
                010 = modo HiColour, 110=Modo HiRes, otros valores no son válidos

Bits 3-5: Solo para el modo HiRes, define el color de PAPER e INK
              000 – Negro sobre blanco   100 – Verde sobre magenta
              001 – Azul sobre amarillo  101 - Cyan on Red
              010 – Rojo sobre Cyan      110 – Amarillo sobre azul
              011 – Magenta sobre verde  111 – Blanco sobre negro

Bit 6:    Si se pone a 1 deshabilita la generación de la interrupción de timer

Bit 7:    Selecciona que banco debe usar el MMU horizontal 0=DOCK, 1=EX-ROM.

Con estos datos en la mano, las acciones necesarias para activar el modo HiColour es hacer un OUT 255, 2, y para el modo HiRes un OUT 255, 6, si bien eso hará que se active con la combinación de negro sobre blanco.

Respecto a los dos bits superiores, por lo que respecta a este manual no vamos a entrar en detalles, pero salvo que tengáis claro lo que hacen, dejadlos a 0.

Existe un método alternativo de activar los modos Timex gracias a ULAPlus, lo podéis ver detallado, junto con otras funcionalidades de ULAplus que indicaremos más adelante,aquí:

Wiki de ULAPlus

Desde la BIOS 0.55 es posible deshabilitar los modos extra desde la propia BIOS. Esto se hizo porque los modos Timex provocan incompatibilidad con algunos juegos que los activan por error. Esto es una desventaja para juegos que utilicen estos modos, porque impide
activarlos. Para evitar esto, hacer un OUT 64571,15: OUT 64827,0 reactiva la posibilidad de activar esos modos.

También es posible deshabilitar los nuevos modos gráficos con la utilidad .zxunocfg (versión azesmbog) y la opción -gd

¿Cómo se activa el modo Radastan?

El modo radastan es un modo (por ahora) exclusivo de ZX-Uno. Es un modo de baja resolución que a cambio da la posibilidad nunca vista en el Spectrum de tener un color por pixel, evitando así el attribute clash. Para activar el modo radastan es necesario utilizar el registro RADASCTRL (0x40, o 64 en decimal) de ZX-Uno, para lo cual básicamente esta es la secuencia para activarlo, que es la misma para escribir en cualquier registro de ZX-Uno:

OUT 64571,64
OUT 64827,3

Para desactivarlo, el segundo OUT deberá asignar el valor 0.

Notas:

  • En los primeros cores de Spectrum de Zx-Uno se utilizaba otro método utilizando los registros de ULAplus. Ese método ha quedado anulado y ya no funciona, actualiza tu core si es el caso.
  • El modo Radastan utiliza los 16 primeros colores de la paleta de ULAPlus, y dicha paleta por defecto está puesta a cero, lo cual quiere decir que salvo que cambiemos la paleta (ver detalles más adelante en esta FAQ) los 16 colores son negro, así que no apreciaremos cambios.
  • Desde la BIOS 0.55 es posible deshabilitar los modos extra desde la propia BIOS. Esto se hizo porque los modos Timex provocan incompatibilidad con algunos juegos que los activan por error. Esto es una desventaja para juegos que utilicen estos modos, porque impide activarlos. Para evitar esto, hacer un OUT 64571,15: OUT 64827,0 reactiva la posibilidad de activar esos modos.

Existe una librería creada para Z88DK que permite manejar el modo Radastan sin problemas, podéis encontrar la última versión disponible a día de hoy en este enlace del foro sobre Z88DK y el modo Radastan. Además, hay una libraría para modo Radastaniano para ZX Basic.

¿Y el scroll hardware del modo Radastan?

El modo Radastan soporta también scroll hardware a partir del core EXP25, lo cual quiere decir que la pantalla mapeada en memoria puede ser más grande que la pantalla real, y que solo se vea una parte de dicha pantalla mayor en la real.

Para controlar el scroll hardware hay dos registros del ZX-Uno llamados RADASOFFSET Y RADASPADDING. En RADASOFFSET se mete un valor de 16 bits para indicar en qué offset a partir de la dirección de video ($4000 en principio, aunque podria ser la shadow en C000 si lo hemos cambiado). Por ejemplo modificándolo de 64 en 64 bytes se puede hacer
scroll vertical directamente.

RADASPADDING indica cuantos bytes ocupa una linea en modo Radastaniano, por defecto son 64 bytes, que es el mínimo, y en ese caso el valor del registro es 0. Si ponemos por ejemplo 65 (o sea, metemos un 1 en el registro), solo se pintarán en pantalla 64 de cada 65 bytes, quedando el otro «oculto» por la derecha. Eso permite usar RADASOFFSET para mover y hacer scroll de derecha a izquierda de 1 byte en 1 byte (o sea, de dos en dos pixeles).

Hay que tener en cuenta que RADASOFFSET se circunscribe a una página de 16k, es decir, si hacemos que Radaoffset haga leer más allá de 16384 bytes del inicio de la página, en  realidad volverá a leer del principio de la página (es circular).

El registro RADASOFFSET es el 65, por lo que para escribir en él se escribe primero el byte menos significativo del valor de 16 bits, y luego el más significativo:

OUT 64571,65
OUT 64827,LSB
OUT 64827,MSB

El registro RADASPADDING es el 66, y se escribe así:

OUT 64571,66
OUT 64827, valor

¿Cómo se cambia de página usando los modos Timex?

Es posible conmutar entre las zonas de video Screen 1 y Screen 0, para lo cual simplemente hay que seleccionar el modo 0 o 1 cuando se actua sobre el puerto 255, es decir, OUT 255,0 para seleccionar Screen 0 en 0x4000, y OUT 255,1 para seleccionar Screen 1 en 0x6000. De esa manera se pueden intercambiar rápidamente dos pantallas previamente definidas.

Al ser los modos Timex y el modo Radastan totalmente independientes, también se puede utilizar para intercambiar dos pantallas en modo Radastan, situadas en las dos áreas de memoria correspondientes.

Yendo más allá, este sistema de paginación combinado con el bit 3 del puerto 0x7FFD (si está habilitada la paginación de 128K) permite tener un total de 4 pantallas en 4000h, 6000h, C000h y E000h

¿Cómo se cambia la paleta de color con ULAPlus?

Usando ULAplus podemos usar una paleta de 64 colores, para lo cual debemos cambiar primero a modo 64 colores así:

OUT 48955, 64
OUT 65339, 1

Luego podemos modificar la entrada n (0-63) de la paleta asignándole el color x así:

OUT 48955, n
OUT 65339, x

X es una representación RGB del color en 8 bits: GGGRRRBB. Es decir, se usan 3 bits para el verde, 3 para el rojo y 2 para el azul (esto es así porque el ojo humano diferencia peor los azules)

Los 64 colores de la paleta se presentan en 4 grupos de 16 colores, 8 para INK y 8 para paper (permite así tener colores diferentes de tinta y papel). A la hora de elegir el color a pintar en un bloque de 8×8 el color elegido depende de los valores de flash/bright/ink/paper de la siguiente manera:

Spectrum color 0 1 2 3 4 5 6 7
Flash off
Bright off
Ink 0 1 2 3 4 5 6 7
Paper 8 9 10 11 12 13 14 15
Flash off
Bright on
Ink 16 17 18 19 20 21 22 23
Paper 24 25 26 27 28 29 30 31
Flash on
Bright off
Ink 32 33 34 35 36 37 38 39
Paper 40 41 42 43 44 45 46 47
Flash on
Bright on
Ink 48 49 50 51 52 53 54 55
Paper 56 57 58 59 60 61 62 63

Aunque en teoría esto permitiría tener 64 colores en pantalla, la realidad es que solo puede conseguirse si se pintan barras, porque es imposible utilizar el color de tinta de uno de los cuatro bloques con el color de papel de otro bloque diferente.

Podemos redefinir la paleta en todos los modos mencionados anteriormente, es decir, en el estándar de Spectrum, en los dos modos Timex, y en el modo radastan.

En este último caso caso se usarán los 16 primeros colores de la paleta para los 16 colores que puede mostrar dicho modo. En el momento de escribir estas líneas hay planes para que el color de borde del modo radastan utilice un color aparte de la paleta, de modo que sea
independiente de esos 16 colores, pero ese cambio aún no se ha concretado.

¿Cómo funciona la interrupción raster?

El ZX Spectrum produce una interrupción no enmascarable que se produce con una frecuencia de 50Hz y va sincronizada con el retrazado vertical de la pantalla. Esto se ha utilizado tradicionalmente para realizar distintos efectos gráficos.

Por su parte ZX-Uno permite activar lo que se denomina la interrupción raster, que se produce cuando el repintado de pantalla empieza a pintar el borde derecho de la línea que le indiquemos.

Para utilizar esta interrupción tenemos utilizar los registros $0c y $0D del Zx-Uno (RASTERLINE y RASTERCTRL). El valor de RASTERLINE indicará la línea de pantalla donde se produce la interrupción, siendo esta línea relativa a la línea de la pantalla donde empieza la zona de paper. Por ejemplo si RASTERLINE vale 0, se lanzará cuanto se empiece a pintar el borde de la línea inmediatamente encima de la primera línea de paper, y 192 al comienzo del borde inferior, debajo del paper.

Por su parte RASTERCTRL queda definido así:

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 porretrazo 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á.

Como veis, para activar la interrupción raster es necesario activarla expresamente con ENARIT, pero además lo normal será desactivar la interrupción clásica del retrazado vertical, salvo que queramos hacer algún efecto que necesite ambas y podamos controlarlo.

La interrupción raster puede ser utilizada para hacer combinaciones de colores muy avanzadas, usando ULAplus y los modos avanzados de video de ZX-Uno, porque aunque en teoría hay una paleta de 64 colores con ULAPlus, nada impide cambiar los colores de esa paleta a partir de cierta línea de pantalla, de modo que sean colores nuevos, y llevando
así a imágenes con más de 64 colores. Incluso es posible cambiar el modo de video a mitad de pintado de pantalla, con lo que sería posible, si el sistema está bien hecho,tener una parte superior con modo Timex HiColor por ejemplo para una imagen, y una parte inferior con modo Timex HiRes para pintar el texto en una aventura conversacional.

¿Se pueden usar distintos bancos de paleta en modo radastan?

Sí. Para ello se puede usar, desde el core EXP25, el registro RADASPALBANK, el numero 0x43 (67). Se usan los bits 2,1 y 0.

La paleta de ULAPlus tiene 64 colores y a priori en el modo radastan podemos usar los 16 primeros, con los bits 1 y 0 indicamos cual de los cuatro bancos de 16 colores de entre los 64 totales se usará, si los 16 primeros (si valen 00), los 16 siguientes si vale 01, los 16 terceros si vale (10) o los 16 últimos si vale (00). Por defecto es 00 y por eso se usan los 16 primeros.

El bit 2 indica que mitad de la paleta del modo radastan se usará para fijar el color de borde, indicando un 0 que se usa las primeras 8 entradas del bloque de 16 seleccionado, y un 1 las últimas 8. Así un BORDER 7 usará el color 7 de la paleta si el bit es 0, y el color 15 si
el bit 2 vale 1, pero si hemos cambiado a otro banco de 16 colores, en lugar del 7 o el 15 un BORDER 7 usará el color 7 del bloque actual, o el color 15 del bloque actual. Por ejemplo, si los tres bits valen 1 (111) un BORDER 7 usará la entrada 63 de la paleta.

Notese que utilizando la interrupción raster y este registro al tiempo, es posible conseguir hasta 64 colores en pantalla (cambiando de bloque de paleta cada vez que llega la interrupción)

¿Cómo activo los modos turbo?

El Zx-Uno es capaz de hacer funcionar la CPU a 7, 14 o 28 Mhz (además de con los 3.5Mhz estándar de un Spectrum). Para activar dichas velocidades es necesario modificar el registro SCANDBLCTRL (0x0B) de Zx-Uno.

Si simplemente queréis probarlo podéis hacerlo desde la BIOS, o bien usar ZXUC una vez arrancado el ZX-Uno.

Si lo que queréis es modificar la velocidad en vuestros programas, tened en cuenta que el registro 0X0B tiene este formato a nivel de bit (bit 7 a la izquierda):

TURBO 0 FREQ ENSCAN VGA

Donde TURBO es 00 para seleccionar 3.5 MHz, 01 para seleccionar 7 MHz,  10 para seleccionar 14 MHz y 11 para 28 MHz.

En principio podría parecer que ponerlo todo a 0 pone el modo normal, a 64 el modo de 7Mhz y a 128 el modo de 14Mhz:

OUT 64571,11      (0X0B)
OUT 64827,128

Sin embargo es necesario tener en cuenta que el bit más bajo (ENSCAN) es el que controla si la salida es por VGA o PAL, por lo que no es conveniente ponerlo a 0 si está a 1 (podríamos dejar a nuestro usuario sin ver la pantalla). Por tanto lo correcto es leer el valor de dicho registro:

OUT 64571,11   (0X0B)
LET VAL = IN 64827,128

Quitar los dos bits superiores, que como en Basic Sinclair no existe el AND bitwise se puede hacer así:

IF (VAL>=128) THEN LET VAL=VAL-128
IF (VAL>=64) THEN LET VAL=VAL-64

Y después sumarle 0 para modo normal, 64 para modo 7Mhz o 128 para 14Mhz:

LET VAL=VAL+64
OUT 54571,11
OUT 64827,VAL

Sin embargo, después de todas estas explicaciones, el ZX-Uno tiene otro puerto no documentado para alterar la velocidad, y cuya manipulación es mucho más sencilla. El puerto es el $8e3b (36411), y basta poner en él los valores 0, 1, 2 o 3 para variar la velocidad. Así con:

OUT 36411,3

Pondremos la CPU a 28Mhz. Este puerto es el mismo que usa el clon de Spectrum ZX Prism para variar la velocidad.

¿Cómo maneja ZX-Uno el ratón?

El ZX-Uno implementa la interfaz Kempston Mouse a través del puerto PS/2, al que podemos conectar un ratón PS/2 usando un splitter (para poder conectar el teclado también).

Básicamente, la lectura del ratón se realiza mediante acceso a varios puertos:

Puerto Hex Valor
64479 FBDF Posición horizontal (Eje-X)
65503 FFDF Posición vertical (Eje-Y)
64223 FADF Estado de botones (bitwise)

Así PRINT IN 64479 nos devuelve la posición en el eje X.

El contenido del puerto 64223 se puede leer el siguiente modo, bit a bit:

Bit Contenido
0 A cero si el botón derecho está pulsado
1 A cero si el botón izquierdo está pulsado
2 A cero si el botón central está pulsado
3 A cero si el cuarto botón está pulsado
4 a 7 Devuelven la posición de la rueda del ratón, por defecto valen 1111

Nota: hay que tener en cuenta que no existe ningún tipo de driver que de soporte al ratón, lo cual se manifiesta principalmente en el hecho de que no hay ningún puntero de ratón, salvo que lo pintemos nosotros mismos.

Aparte de poder leer el ratón como un dispositivo Kempston Mouse, en ZX-Uno también podemos leer directamente los datos PS/2 recibidos, para lo cual debemos usar los registros MOUSEDATA (0x09) y MOUSESTATUS (0x10) de ZX-Uno. La lectura (o escritura) de estos registros y su significado se escapa del alcance de este manual, pero no queríamos dejar de constatar el hecho por si pudiera ser útil. Más información al respecto de esto en la descripción de registros del Zx-Uno.

¿Cómo programar el sonido por el chip AY del ZX-Uno?

El chip AY, disponible en los modelos de 128k de ZX Spectrum, está también disponible en ZX-Uno aun para los modelos de 48K. Por supuesto si arrancamos con una ROM de 128K podemos usar el comando PLAY del BASIC, pero para usos más avanzados será necesario conocer lo siguiente.

El chip AY tiene varios registros programables:

Registro Función Rango
0 Canal A fine pitch 8-bit (0-255)
1 Canal A course pitch 4-bit (0-15)
2 Canal B fine pitch 8-bit (0-255)
3 Canal B course pitch 4-bit (0-15)
4 Canal C fine pitch 8-bit (0-255)
5 Canal C course pitch 4-bit (0-15)
6 Noise pitch 5-bit (0-31)
7 Mixer 8-bit (ver abajo)
8 Canal A volumen 4-bit (0-15, ver abajo)
9 Canal B volumen 4-bit (0-15, ver abajo)
10 Canal C volumen 4-bit (0-15, ver abajo)
11 Envolvente fine duración 8-bit (0-255)
12 Envolvente course duración 8-bit (0-255)
13 Forma de la envolvente 4-bit (0-15)
14 I/O port A 8-bit (0-255)
15 I/O port B 8-bit (0-255)

Para modificar un registro del chip AY debe escribirse en el puerto de control 65533 el número del registro a modificar, y seguidamente en el puerto de datos 49149 el valor. Para leer el valor (raro pero posible) se debe escribir en el puerto de control 65533 el número del
registro, y después leer el dato del mismo puerto de control (no del de datos).

Por ejemplo esté código pone un 255 en el registro 7:

OUT 65533,7
OUT 49149,255

El registro “mixer” tiene los siguientes campos, permitiendo activar o desactivar los canales:

7 6 5 4 3 2 1 0
E/S E/S Noise C Noise B Noise A Tone C Tone B Tone A

Las salidas E/S por ahora no hacen nada en el ZX-Uno, aunque es posible que en el futuro sean aprovechadas para algo.

Valores de pitch

Para determinar la frecuencia de la onda que suene por cada canal – o dicho de otro modo la nota que queremos que suene – se utilizan los valores de pitch. Cada nota musical tiene una frecuencia específica asignada, y cualquier valor fuera de ella son notas desafinadas.
Podemos ver en la siguiente tabla los valores de frecuencia para una escala completa en una octava media.

Nota Frecuencia (Hz) Nota Frecuencia (Hz)
La 220 Re# 311.1
La # 233.3 Mi 329.63
Si 246.94 Fa 349.23
Do (medio) 261.63 Fa# 370
Do# 277.2 Sol 392
Re 293.66 Sol# 415.3

Ahora bien, el chip AY no nos deja indicar directamente la frecuencia que queremos que suene en un canal, sino que lo tenemos que hacer mediante el pitch. El pitch es un valor entre 1 y 4095, y la frecuencia que suene por un canal es la resultado de dividir 110,83Khz
entre el pitch. Es decir, podemos obtener un valor entre aproximadamente 27Hz (con pitch 4095) y 110.83Khz (con pitch 1).

El pitch se selecciona para cada canal con dos registros, el llamado course, que guarda los 4 bits más significativos (0-15) y el llamado fine, que guarda los 8 bits menos significativos (0-255).

Ejemplo de un sonido sencillo en BASIC:

OUT 65533,0 :REM Fine Pitch canal A=43
OUT 49149,43
OUT 65533,1 : REM Course Pitch canal A=1
OUT 49149,1
OUT 65533,8 : REM Volumen canal A a  = 12  
OUT 49149,12
OUT 65533,7 : REM registro MIXER, activo canal A
OUT 49149,1

En definitiva, con un course pitch de 1 y un fine pitch de 43, el valor de Pitch es 299, y 110,83Khz dividido de 299 son 370hz, es decir, un Fa sostenido, que sonará a un volumen de 12 (de un máximo de 15) por el canal A porque el mixer tiene activo ese canal.

Hay que tener en cuenta que por las limitaciones técnicas que este cálculo impone, es más difícil afinar bien las frecuencias para que cuadren con las notas oficiales occidentales cuanto más baja sea la frecuencia.

Volumen

Los registros de volumen (8,9 y 10) contienen un valor de 4 bits con el volumen de cada canal, pero si el bit 5 está a uno entonces la onda envolvente indicada en el registro 13 es aplicada, y el valor de volumen es ignorado.

Envolventes

El chip AY soporta las siguientes envolventes o formas de onda, que se establecen mediante el registro 13. Notese que estas envolventes afectan a la amplitud de la onda (volumen) pero no a la frecuencia (pitch o tono).

La onda viene dada por una combinación de los siguientes cuatro bits en dicho registro:

Bit Comando
3 Continue
2 Attack
1 Alternate
0 Hold

Dependiendo de los bit seleccionado encontraremos unas ondas diferentes.

La frecuencia de la onda envolvente dependerá de los valores en los registros 11 y 12, que permiten marcar un valor entre 1 y 65535 (siendo el registro course el que guarda el byte más significativo, y el fine el menos significativo). Dicho valor dividirá a una frecuencia de
6,91Khz, de modo que si el periodo es 1, la onda envolvente tendrá una frecuencia de 6,91Khz, y si es valor es 65535 será de 0,11Hz.

Se puede encontrar una descripción más detallada de las envolventes, y del chip AY en general, en las especificaciones del chip AY.

¿Cómo programo el Turbo Sound en ZX-Uno?

ZX-Uno soporta Turbo Sound, que básicamente es un segundo chip AY que puede reproducir música a la vez que el primero. Para ello basta con seleccionar a que chip queremos acceder, mediante un OUT 65533,255 para acceder al primero, y un OUT 65533,254. Una vez seleccionado el chip en cuestión, la escritura en registros AY afecta solamente a ese chip.

¿Cómo se programa el SpecDrum?

Debido a la complejidad del interfaz, sugerimos acceder a la información del propio Cheetah SpecDrum.

¿Cómo controlo la configuración mono/stereo?

A través del puerto 0xF7 (247) es posible controlar por que altavoces se reproducen los distintos canales del Spectrum, así como por que altavoces suena el beeper original del Spectrum, y el interfaz SpecDrum. El valor enviado o leído de ese puerto es un byte cuyos bits se interpretan así:

bits Control
0-1 SpecDrum y beeper
2-3 Canal C
4-5 Canal B
6-7 Canal A

Así, cada canal del chip AY, y el beeper y SpecDrum podrán tener un valor de dos bits que indique por donde deben sonar:

Valor Altavoz
00 Ninguno
01 Derecho
10 Izquierdo
11 Ambos (mono)

El valor por defecto de este puerto es 10011111b, que viene a querer decir que el el canal A suena por el altavoz izquierdo, el canal B por el derecho, el canal C por ambos y tanto beeper como SpecDrum por ambos también. Esto viene a ser lo que se denomina configuración ACB.

Como puedo acceder a la tarjeta SD?

La información sobre como acceder al disco con ESXDOS no es pública, sin embargo son conocidas algunas funciones de manera extraoficial. Estos datos no son oficiales y son válidos para ESXDOS 0.8.6 pero podría no funcionar en futuras versiones si las hubiera, usadlo a vuestro propio riesgo.

Lo primero que debéis saber, es que todas las llamadas a ESXDOS son a través de la instrucción RST 8, y que justo detrás de esa instrucción debe venir el código de la función concreta solicitada (leer, escribir, etc.). Además según el caso determinados registros de la CPU deben llevar asignados distintos valores.

Detectar si la unidad de disco está lista (Ready)

M_GETSETDRV   equ   $89
XOR a
RST $08
DB M_GETSETDRV

El carry flag se activa si hubo error.

Abrir un archivo

F_OPEN   equ   $9a
XOR a
LD B, FA_READ   ; b = modo de apertura
LD IX, FileName   ; ix = Puntero al nombre del fichero (ASCIIZ)
RST $08
DB F_OPEN      ; abrir archivo en modo lectura

Devuelve en el registro A el handler para manejar el fichero.

Activa el carry flag si el fichero no se puedo abrir.

Otros modos de abrir fichero:

FA_READ   equ   $01
FA_APPEND equ $06 
FA_OVERWRITE equ $0C

Leer desde un archivo

F_READ   equ   $9d
LD IX, 16384   ; ix=dirección donde almacenar lo leido
LD BC, 6912   ; bc=bytes a leer
LD A, handler; A = el handler del fichero abierto anteriormente en F_OPEN
RST $08
DB F_READ      ; Leer archivo

El carry flag se activa si hubo un problema al leer.

Escribir a archivo

F_WRITE   equ   $9e
LD IX, 16384   ; ix=dirección de memoria que se va a copiar en disco
LD BC, 6912   ; bc=bytes a escribir
LD A, handler; A = el handler del fichero abierto anteriormente en F_OPEN
RST $08
DB F_WRITE     ; Escribir archivo

El carry flag se activa si hubo un problema al escribir.

Cerrar archivo

F_CLOSE   equ   $9b
LD A, handler ; A =handler del fichero a cerrar
RST $08
DB F_CLOSE

El carry flag se activa si hubo un problema al cerrar el fichero.

Notas

  • Para los path de los archivos cuando hay directorios por medio se utiliza el carácter ‘/’ como en UNIX.

¿Como puedo usar memoria adicional?

Hay tres maneras de acceder a más memoria en ZX-Uno:

  • Memoria del DivMMC
  • Paginación horizontal Timex MMU
  • Acceso directo a la memoria de ZX-Uno vía registro MASTERMAPPER

El ZX-Uno implementa un DivMMC con 128K RAM, así que es posible usar esa RAM extra para tus desarrollos. Este es un enlace a la página de documentación de Velesoft’s acerca de la memoria en el DivIDE, compatible con el mapa de memoria de DivMMC.

Las maquinas Timex emuladas por el ZX-Uno tienen una funcionalida de paginacion horizontal.

El mapa de memoria de estos equipos es:

         EX-ROM      HOME       DOCK
0xffff +----------+----------+----------+
       |  Bank 7' | 32K RAM  |  Bank 7  |
       |          |          |          |
0xe000 +----------+          +----------+
       |  Bank 6' |          |  Bank 6  |
       |          |          |          |    
0xc000 +----------+          +----------+
       |  Bank 5' |          |  Bank 5  |
       |          |          |          |
0xa000 +----------+          +----------+
       |  Bank 4' |          |  Bank 4  |
       |          |          |          |
0x8000 +----------+----------+----------+
       |  Bank 3' | Screen 1 |  Bank 3  |
       |          |          |          |
0x6000 +----------+----------+----------+
       |  Bank 2' | Screen 0 |  Bank 2  |
       |          |          |          |
0x4000 +----------+----------+----------+
       |  Bank 1' | 16K ROM  |  Bank 1  |
       |          |          |          |
0x2000 +----------+          +----------+
       |  Bank 0' |          |  Bank 0  | 
       |          |          |          | 
0x0000 +----------+----------+----------+

La memoria es paginada en bancos de 8K banks bien de DOCK or EX-ROM, pero estos bancos son mutuamente exclusivos, no puedes paginar un banco de cada a la vez. El bit 7 del puerto 0xff determina que banco usamos (0=DOCK, 1=EX-ROM). El puerto 0xf4 determina que bancos son paginados con cada bit refiriendose al banco en cuestión (0-7 o 0′-7′). Cuando la memoria va a ser paginada, se deben deshabilitar las interrupciones y el stack (SP) debe estar en un área que no vaya a paginarse.

El banco HOME es la zona normal de memoria del Spectrum, los 32K superiores son memoria sin contienda pero los 16K inferiores son con contienda. Los bancos se paginan sobre estos, pero paginar la zona de pantalla no hace que la ULA acceda a esa RAM.

Leer estos puertos devuelve el último byte enviado a ellos.

Usar la RAM del 128K + 128K RAM del DivMMC + 128K RAM del Timex permite usar hasta 384K RAM. Si necesitas más debes acceder a la memoria del ZX-Uno en modo RAW:

Esto es posible usando el registro MASTERMAPPER (0x01). Cuando se escribe en dicho registro, el banco de 16K seleccionado (0 a 31 en el ZX-Uno original de 512K) se mapeará en 0xC000-0xFFFF. De esa manera se puede acceder a toda la memoria. Tristemente, este acceso raw solo es posible usando una ROM rooted, en este momento, dado que bit LOCK del registro MASTERCONF (0x00) deshabilita tanto la escritura en SPI flash como el acceso directo a memoria. Esto es así porque acceder directamente a la RAM es un poco peligroso:

  • Algunos de los bancos de la RAM se usan para almacenar ROMS (System ROMs y ESXDOS ROMS). Mapear esos bancos en 0xC000 y modificarlos es modificar las ROMs, y no volverán a su estado original hasta que se haga un hard reset. Aunque se puede hacer a propósito, en general es una cosa arriesgada.
  • Además, la RAM es usada por los dot command de ESXDOS, y pueden ser corrompidos si no se tiene cuidado

Por otro lado, si una vez tu programa inicia no necesita ni la ROM de Spectrum ni la de ESXDOS, se pueden usar esos dos slots sin problema, siempre que nos aseguremos que el banco de la ROM contiene al principio (direccion 0000) una rutina simple que escriba en pantalla que debe reiniciarse con hard reset para restaurar la ROM original.

¿Cómo utilizo el DMA?  (in english)

The DMA engine can do these types of transfer:

– Memory to memory (both using incrementing addresses)
– Memory to I/O (memory address incrementing)
– I/O to memory (memory address incrementing)
– I/O to I/O

I/O address is never changed during an I/O involved transfer.

The DMA module sits side by side with the Z80 CPU, so it «sees» the very same memory map that the Z80 sees. This means that DMA cannot transfer from or to memory that is not currently paged into the CPU address space.

It can operate in foreground, halting the main CPU during the transfer, or in the background, allowing the CPU to continue working (although a bit slower than usual).

DMA transfers can be burst transfers, in which data are transferred as fast as possible, normally halting the CPU in between, or timed, in which data is retrieved and transferred at a specified rate, controlled by an onchip timer. This last option is best suited for audio streaming directly from memory to a capable digital audio device, such a Specdrum or Covox (both integrated into the ZX-UNO)

Transfers can be retriggerable, or one shot. A retriggerable DMA transfer is the one that when it ends, it starts from the beginning again without software intervention. A one shot DMA transfer is that which ends and doesn’t start over again unless software ditactes it so. Burst transfers can be only of type one shot. They cannot be retrigerable.

It’s possible to know, for a non CPU halting DMA transfer, if certain source or destination address has been reached.

Currently, the DMA engine doesn’t trigger any interrupt signal to the CPU.

I recommend reading the source code of dmaplayw . An ESXDOS command that streams a WAV file from SD to the Specdrum (I/O port $DF) device using DMA.

http://svn.zxuno.com/svn/zxuno/software/dma/dmaplayw

From the software point of view, the DMA engine is commanded by a group of registers. These are addressed and operated using two I/O ports from the ZXI address space:
$FC3B : register number to address
$FD3B : read or write to last addressed register. Note that the high order byte of this address is one more than the high order byte of the register number.

DMA register number to follow.

DMACTRL             equ 0a0h
DMASRC              equ 0a1h
DMADST              equ 0a2h
DMAPRE              equ 0a3h
DMALEN              equ 0a4h
DMAPROB             equ 0a5h
DMASTAT             equ 0a6h

Description of each register:

DMASRC :

Holds the source address in memory for a memory to memory transfer, or memory to I/O transfer.
Holds the I/O source address for a I/O to memory transfer, or I/O to I/O transfer.
16 bit R/W register (it needs two reads or two writes to transfer a 16 bit value from/to this register).
During and after a transfer, this register is not changed.

Example:

;Send 16 bit memory address in HL to DMASRC
ld bc,$FC3B  ;select register number
ld a,DMASRC  ;select DMASRC
out (c),a    ;do it
inc b        ;select register read/write
out (c),l    ;send LSB
out (c),h    ;send MSB
;Read it back into DE
in e,(c)     ;read LSB
in d,(c)     ;read MSB

DMADST :

Holds the destination address in memory for a memory to memory transfer, or memory to I/O transfer.
Holds the I/O destination address for a I/O to memory transfer, or I/O to I/O transfer.
16 bit R/W register (it needs two reads or two writes to transfer a 16 bit value from/to this register).
Example (see the DMASRC example)
During and after a transfer, this register is not changed.

DMALEN :

Holds the transfer byte length. 0 means 65536 bytes to transfer (need to check this though)
16 bit R/W register (it needs two reads or two writes to transfer a 16 bit value from/to this register).
Example (see the DMASRC example)
After a transfer, this register is not changed.

DMAPRE :

Holds a 16 bit preescaler value, which is used to determine the frequency rate for a timed transfer. The actual rate is determined by this formula:
Transfers per second = 28000000 / preescaler_value (for memory to memory transfers)
Transfers per second = 3500000 / preescaler_value (for transfers involving some sort of I/O address)
16 bit R/W register (it needs two reads or two writes to transfer a 16 bit value from/to this register).
Example (see the DMASRC example)
During and after a transfer, this register is not changed.

DMAPROB :

Holds a 16 bit value which identifies a memory address involved in a DMA transfer (it can be a source or destination address). When the DMA reads from (if configured as a source address) or writes to (if configured as a destination address) this memory address, bit 7 of DMASTAT is set.
16 bit R/W register (it needs two reads or two writes to transfer a 16 bit value from/to this register).
Example (see the DMASRC example)
During and after a transfer, this register is not changed.

DMASTAT :

8 bit status register. Currently, it uses only bit 7.
Bit 7: set to 1 when DMAPROB address has been reached. It automatically reset to 0 after reading this register.
8 bit, read only.

DMACTRL :

8 bit control register. Read/write. Reading it will give you the last written value. A DMA transfer is initiated from the «stop» condition, by writting any value other than 00 into the MODE bits. Stopping and initiating again a DMA transfer doesn’t resume it. It starts from the beginning.
The bitfield description is this:

MODE : bits 1 and 0.
00 = DMA is stopped. The software can stop a timed DMA at any time writting 00 to these bits.
01 = burst DMA transfer. CPU is halted during the transfer. One shot.
10 = timed DMA transfer. One shot.
11 = timed DMA transfer, retriggerable.
DST : bit 2. 0 = destination address is memory. 1 = destination address is I/O
SRC : bit 3. 0 = source address is memory. 1 = source address is I/O
PROB: bit 4. 0 = address in DMAPROB is related to source (read) memory address. 1 = address in DMAPROB is related to destination (write) memory address.
Bits 5 to 7: Reserved. Written and read as 0.

ZXUNO Radastan mode description and usage example (in english)

The Radastan video mode shows 128×96 pixels on screen, with a border. Each pixel uses 4 bits of memory, so allowing 16 colours.

It uses linear addressing. One byte of memory holds two pixels. The high nibble (bit 4 to 7) holds the left pixel, and the low nibble (bits 0 to 3) holds the right pixel.

The memory bitmap file is at the same address as the regular ULA screen: banks 5 and 7 of the 128K memory map.

It allows hardware scrolling and raster interrupts can be used to have more than one video mode on screen in the same frame, or the same video mode with a different palette.

While in Radastan mode, there is no video memory contention. CPU can run with no wait states even if reading or writting to video memory banks.

Radastan mode use the tacks per scanline as configured in the ZXUNO ULA timings register. So if ULA 48K or Pentagon is selected, a scanline lasts 224 tacks. If using 128K timings, it’s 228 tacks.

Memory organization (for page 5, normally paged in at $4000 – $7FFF)
Byte at $4000 holds pixels 0 and 1 of the first scanline (pixel 0 is stored in bits 4 to 7, pixel 1 in bits 0 to 3).
Byte at $4001 holds pixels 2 and 3, and so on.
Byte at $403F holds pixels 126 and 127.
Byte at $4040 holds pixels 0 and 1 of the second scanline.

The size of the memory bitmap file is therefore 128*96*(1/2) = 6144 bytes, the same size of the standard bitmap ULA screen. Radastan mode does not need a separate attribute area.

If using 128K, a second (shadow) screen is available at bank 7. Standard double buffer techniques can be applied.

Each colour can be chosen from a palette of 256 colours. ULAplus palette and logic is used for this:

– ULAplus palette has 64 entries. This can be viewed as 4 subpalettes of 16 entries each. Radastan mode can be programmed to use on of these 4 subpalettes. By default, first subpalette (entries 0 to 15) is selected.
– Raster interrupts can be used to quickly switch palettes during screen exploration, and allow up to 64 colours on screen with very low CPU effort.
– Border colour can be set to one of the 16 entries of the current subpalette. As there is only 3 bits in port $FE to choose the color, the fourth bit is taken from a configuration register.

To manage Radastan video mode settings, a set of ZXUNO registers is used. These registers are managed through two I/O ports.
$FC3B : keeps the register number to be accessed (read/write)
$FD3B : current value of the currently accessed register (read/write). Note that the high byte of this address is one byte more than the previous I/O port.
Example: to switch the Radastan mode on, the value 3 must be written to ZXUNO register $40, so the following sequence can be used to accomplish this:

ld bc,$fc3b
ld a,$40
out (c),a
inc b
ld a,3
out (c),a

Radastan mode registers (all accessible as ZXUNO registers):

Name          Number  Description
RADASCTRL     $40     Enable/disable Radastan video mode. ULAplus does not need to be active. Only bits 1 and 0
                      are used. Both must be set to 1 to enable Radastan mode. The new video mode is
                      inmediately active.
RADASPALBANK  $43     Subpalette selection. Bits 1 and 0 select which set of ULAplus entries to use.
                      00: entries 0 to 15
                      01: entries 16 to 31
                      10: entries 32 to 47
                      11: entries 48 to 63.
                      Defaults to 00, so Radastan uses ULAplus palette entries 0 to 15.
                      Bit 2 is used as the fourth bit to select which from the 16 entries to apply to border
                      colour. Defaults to 0
RADASOFFSET   $41     Offset in bytes from the beginning of the memory page to the beginning of the bitmap area.
                      Used along with RADASPADDING to achieve hardware scrolling. It's a 16 bit value
                      (14 bits actually) so you need two OUTs to send first the low byte of the offset value,
                      then the high byte (bits 6 and 7 are ignored) of the offset value. Defaults to 0
RADASPADDING  $42     Length in bytes of a scanline in memory. The value stored here is actually length - 64.
                      So a value of 0 in this register actually means a scanline length of 64 bytes (128 pixels).
                      Used to define a screen wider than 128 pixels so you can scroll it horizontally by
                      increasing or decreasing the value of RADASOFFSET. The value stored here is a byte, so the
                      maximum width is 64+255=319 bytes = 638 pixels. Defaults to 0

Take into account that the ULA, while in Radastan mode, won’t read past the current video bank, so if a combination of RADASPADDING and RADASOFFSET makes the video address to go beyond $3FFF (being address $0000 the start of the bank) it will wrap around.
The memory address for a pixel (X,Y), related to the beginning of the current video bank, can be expressed as: (RADASOFFSET + Y*(64+RADASPADDING) + (X/2)) mod 16384

See hardware scrolling examples in the ZXUNO SVN repository at: http://svn.zxuno.com/svn/zxuno/software/modo_radastan/hwscroll

See one (familiar? ;) ) example of NON hardware scrolling at: http://svn.zxuno.com/svn/zxuno/software/modo_radastan/scroll_radas

To set up actual colours for each palette entry, ULAplus registers are used.
ULAplus registers is used in a similar way as ZXUNO registers.
$BF3B : keeps the ULAplus register number ($00 to $40)
$FF3B : current value of the currently accessed ULAplus register.

Register $40 is used to enable/disable ULAplus, and this is not necessary to use Radastan. Only registers $00 to $3F are used.
Each one of these ($00 to $3F) is a palette entry. The colour stored here is 8 bits with the following format: GGGRRRBB

Example: set up Radastan mode and plot a yellow pixel at position (18,48).

;set up ULAplus palette. We will use entry $06 and entry $00
ld bc,$bf3b
ld a,6         ;entry
out (c),a
ld b,$ff
ld a,%1111100  ;colour (yellow)
out (c),a
ld b,$bf       ;
xor a          ;
out (c),a      ; Now set up entry 0 with colour black
ld b,$ff       ;
out (c),a      ;

;enable Radastan video mode and clear screen
ld bc,$fc3b
ld a,$40
out (c),a
inc b
ld a,3
out (c),a
ld hl,$4000
ld de,$4001
ld bc,$17ff
ld (hl),l
ldir

;Plots pixel at (18,48)
ld hl,$4000+48*64+(18/2)
ld a,(hl)
and $0f        ; Preserve the current colour of the neighbouring pixel
or $60         ; (X+1,Y) while modifying the one we want (X,Y)
ld (hl),a

;Wait for SPACE key and exit
WaitForKey:
ld a,$7f
in a,($fe)
rra
jr c,WaitForKey
ld bc,$fd3b    ; ZXUNO register $40 is still the
xor a          ; current register so no need to
out (c),a      ; re-select it. Just write 0 to disbable Radastan
ret

UNBRICK DE ZX-UNO

Algo ha pasado y mi ZX-Uno no arranca. Unbrick fácil.

Si tu ZX-Uno no arranca pero se enciende los leds es posible que en un upgrade o por alguna otra razón se te haya brickeado.

Hay varios pasos a seguir si así es:

Arranca el ZX-Uno con un joystick conectado y manteniendo la palanca hacia arriba y el botón de disparo pulsado. Si te sale algo parecido a una carta de ajuste estás de enhorabuena. En esas condiciones el ZX-Uno está esperando a que le cargues la BIOS por la entrada EAR, por lo que necesitarás el fichero firmware.tap que contine una versión de la BIOS (lo puedes descargar de aquí) y algo para reproducir .tap (tu móvil con alguna app, o un PC normalmente). También necesitarás el firmware en versión ZX1, es decir, el fichero FIRMWARE.ZX1, que debes poner en el raiz de la SD. Si no sabes donde encontrar el último FIRMWARE.ZX1, pregunta en el foro.

Simplemente arranca como se ha dicho y dale al play. Estate atento mientras carga para nada más terminar empezar a pulsar F2 rápidamente para entrar a la BIOS. Si se te pasa, tendrás que volver a empezar. Una vez dentro de la BIOS, elige la opción «Upgrade BIOS from SD del menú upgrade para restaurar la BIOS, y a partir de ahí ya puedes arrancar
normal, y entrar en la BIOS para instalar el core de Spectrum y los demás, o bien restaurar todo con un fichero FLASH.ZX1.

Si no ha funcionado pasamos a restauración por cable, que es más complicado. La opción original en este caso es usar el cable de Xilinx, que es el oficial, pero hay otros métodos usando un cable clónico de Altera bastante má barato, o una Raspberry Pi.

Nota técnica: Si quisieramos crear el fichero firmware.tap se puede hacer con el comando
GenRom sm12 BIOS firmware.rom firmware.tap
con lo que podremos crearlo con la versión del firmware que queramos, pudiendo obtener el programa GenRom de aquí

¿Cómo puedo hacer unbrick con una Raspberry Pi?

Si disponemos de una Raspberry Pi, podemos ahorrarnos el cable Altera, y reprogramar nuestro ZX-Uno directamente desde la Raspberry. Para ello debemos hacer lo siguiente:

Bajamos el archivo del apartado anterior para extraer el fichero recovery.bit y lo grabamos en la tarjeta SD de la Raspberry Pi, que tiene que ser una A+, B+ o posterior. Podéis colocarlo por ejemplo en la carpeta /boot de la tarjeta, que es accesible desde Windows porque está en FAT, o podéis hacerlo directamente desde la Raspberry.

En nuestra Raspberry, y asumiendo que usamos Raspbian, hacemos lo siguiente:

sudo apt-get install autoconf
sudo apt-get install autopoint
sudo apt-get install libtool
sudo apt-get install libreadline-dev
sudo rm -rf /var/lib/apt/lists/*
sudo apt-get update
sudo apt-get install python-dev
sudo apt-get install git

Ahora nos bajamos el urjtag del repositorio git:

git clone git://git.code.sf.net/p/urjtag/git urjtag-git
cd urjtag-git/urjtag

Editamos el fichero src/cmd/cmd_bfin.c con nuestro editor favorito:

nano src/cmd/cmd_bfin.c

Y ponemos los siquiente en la primera línea:

#define _SYS_UCONTEXT_H

Y ahora compilamos con las siguientes órdenes:

./autogen.sh
make
sudo make install

Una vez compilador, arrancamos ldconfig y jtag:

sudo ldconfig
sudo jtag

Y desde dentro de jtag, como en el caso anterior, cargamos el recovery.bit

pld load /boot/recovery.bit

Ahora enchufamos el ZX-Uno y le metemos una SD con el fichero FLASH.ZX1 en el raiz.

Conectamos el cable JTAG a la Raspberry Pi siguiendo el siguiente esquema que podemos ver más abajo.

Una vez esté todo conectado escribe las siguientes órdenes:

cable gpio tdi=13 tdo=19 tck=26 tms=6
detect

Si todo va bien, el detect mostrará un mensaje en pantalla con el modelo de FPGA, y escribimos el siguiente comando (si pusimos el recovery.bit en la carpeta /boot)

pld load /boot/recovery.bit

Esperamos un rato hasta ver el menú upgrade de la BIOS y con el teclado PS/2 conectado al ZX-Uno pulsamos intro para que se flashee el fichero FLASH.ZX1 en el ZX-Uno.

El cable para flashear lleva la siguiente conectividad:

Zx-Uno Raspberry pi
JTAG Pin GPIO Pin
TMS 6 GPIO6 31
TDI 5 GPIO13 33
TDO 4 GPIO19 35
TCK 3 GPIO26 37
GND 2 GND 39
3.3V 1 N/C N/C

Nótese que el cable de 3.3v del ZX-Uno no se conecta de ninguna manera a la Raspberry Pi.

Si tienes una Raspberry PI de las primeras puedes a priori usar otros puertos GPIO, siempre  que cambias acordemente esta orden:

cable gpio tdi=13 tdo=19 tck=26 tms=6
detect

¿Cómo puedo hacer unbrick con el cable Altera?

Por apenas 3,50€ se puede comprar este cable en Aliexpress. Tardará entre 1 y 2 meses en llegar eso sí.

Además necesitaremos un conector microJST para la conexión JTAG del ZX-Uno, un conector para el conector de 10 pines del cable, y unos hilos de cobre para hacer el cable adaptador.

Este sería el esquema de como conectar los cables en el conector de 10 pines del cable grabador.

Pin Señal
1 TCK
2 GND
3 TDO
4 3.3V
5 TMS
6 N/C
7 N/C
8 N/C
9 TDI
10 GND

Nota importante: si miras de frente el conector del blaster, colocando la muesca que tiene a la izquierda, y viéndose por tanto dos columnas de pines, los dos de arriba serán 1 y 2, los dos siguientes 3 y 4, etc. El pin 5 queda por tanto junto a la muesca.

Y este es el pinout del conector JTAG:

Pin Señal
1 3.3V
2 GND
3 TCK
4 TDO
5 TDI
6 TMS

Se recomienda utilizar cables cortos para hacer las conexiones, se ha observado que cuanto más largos más posibilidad de que no funcione.

Una vez hecho el cable necesitamos el software urjtag y los drivers para Windows, junto con el fichero para recuperar el arranque. Lo más fácil es bajarse este archivo desde el foro de Zx-Uno:

http://www.zxuno.com/forum/download/file.php?id=505

Conectamos el cable JTAG al ZX-Uno y al USB Blaster. Alimentamos el ZX-Uno y conectamos el USB Blaster al PC. Descomprimimos el fichero descargado y lo primero es instalar los drivers: nos vamos al Administrador de dispositivos y lo buscamos, luego le damos a añadir ficheros manualmente y apuntamos a la carpeta drivers que acabamos de
descomprimir. Si todo ha ido bien debemos ver el dispositivo «Altera USB-Blaster» en el Administrador de dispositivos.

Ahora, desde la línea de comandos (símbolo del sistema) nos vamos a la carpeta donde está el jtag y escribimos

jtag

Una vez dentro del programa tecleamos:

cable usbblaster
detect

Si todo va bien, el detect mostrará un mensaje en pantalla con el modelo de FPGA.

Luego escribimos el siguiente comando:

pld load recovery.bit

En la pantalla debe aparecer el menú de la BIOS (puede tardar hasta un minuto en aparecer. paciencia). Metes una SD con el FLASH.ZX1 en la raíz y pulsas Intro y aceptar para que se flashee el contenido del fichero FLASH.ZX1. Si no sabes donde obtener la última versión del
FLASH.ZX1 pregunta en el foro.

¿Cómo puedo hacer unbrick con el cable Xilinx?

Obviamente la última opción es grabar el bitstream con el propio cable de Xilinx, el oficial para ZX-Uno. No vamos a dar detalles sobre esta solución.

ENLACES ÚTILES

Dado que ZX-Uno está en continua evolución, a veces no es fácil saber dónde está la última versión de tal o cual cosa, y es por eso que en esta FAQ no se añaden enlaces a algunos ficheros y se dice en su lugar «tienes que hacer esto pero por el último fichero pregunta en el
foro».

Sin embargo, hay algunos sitios donde podéis buscar, que a priori tienen ciertas garantías de contener ciertos ficheros necesarios para algunas opciones, sobre todo para upgrades, instalación de COREs y cambio de ROMs. Aun así sigo recomendando que para cosas delicadas como upgrades preguntéis en el foro, no sea que instaleis lo que no se debe.

Además hay otros enlaces interesantes en sí mismos.