picoZ80 Manual de Usuario
picoZ80 Manual de Usuario
El
picoZ80 es un reemplazo directo para una CPU Z80 en cualquier ordenador con zocalo DIP-40. Se conecta directamente al zocalo Z80 de su ordenador vintage y — sin ninguna modificacion al ordenador anfitrion — proporciona memoria expandida, perifericos virtuales, emulacion de disquete y QuickDisk, sistemas de archivos, y una interfaz de gestion basada en navegador mediante WiFi.
Este manual cubre la placa fisica, la configuracion inicial, la conexion a un ordenador anfitrion, y el uso de la interfaz web. Para detalles de arquitectura, referencia de configuracion e informacion de desarrollo consulte la
Guia Tecnica picoZ80.
Descripcion General de la Placa
La PCB del picoZ80 esta disenada para caber dentro de las dimensiones de un paquete DIP de 40 pines estandar. Los 40 pines DIP emergen de la parte inferior de la placa, coincidiendo exactamente con la distribucion de pines de un Z80 real, por lo que se inserta directamente en cualquier zocalo Z80 sin doblar ni adaptar.
La superficie superior de la placa aloja todos los componentes activos. La placa es mas estrecha que las holguras internas de la mayoria de los ordenadores Z80, y la altura sobre el zocalo esta dentro de las dimensiones de un CI estandar con un zocalo DIP-40 montado debajo.
Conectores e Indicadores
La placa picoZ80 expone los siguientes conectores e indicadores:
| Elemento |
Descripcion |
| 6-pin Debug Header |
Situado en el borde de la placa. Proporciona acceso SWD (Serial Wire Debug) al RP2350, lineas BOOTSEL y Reset para la programacion inicial, y Reset para el ESP32. Consulte Debug Header Pinout a continuacion. |
| USB Port (Mini-B) |
Conectividad USB para programacion de firmware via almacenamiento masivo USB (flash inicial) y para puente USB-UART al ESP32. En revisiones de placa v2.3a y posteriores, un segundo puerto USB dedicado para el ESP32 tambien puede estar presente. |
| SD Card Slot |
Ranura para tarjeta SD de tamano completo gestionada por el ESP32. Contiene config.json, imagenes ROM, imagenes de disco y arboles de sistema de archivos. |
El conector de 6 pines es la interfaz hardware principal para la programacion inicial y la depuracion a nivel de codigo fuente. Los pines se numeran desde el Pin 1 en el extremo mas cercano al marcador del borde de la placa.
| Pin |
Signal |
Funcion |
| 1 |
SWCLK |
Serial Wire Debug clock (ARM SWD) |
| 2 |
SWDIO |
Serial Wire Debug data (ARM SWD) |
| 3 |
Reset RP2350 |
Reset activo-bajo para el RP2350. Poner a nivel bajo para reiniciar el RP2350. |
| 4 |
Reset ESP32 |
Reset activo-bajo para el ESP32. Poner a nivel bajo para mantener el ESP32 en reset. |
| 5 |
GND |
Referencia de tierra |
| 6 |
BOOTSEL |
Seleccion de modo de arranque del RP2350. Mantener a nivel bajo durante el encendido/reset para entrar en modo de almacenamiento masivo USB. |
NB. Los pines 1, 2 y 5 se utilizan para depuracion SWD (SWCLK, SWDIO, GND). Los pines 3 y 6 se utilizan solo para la programacion inicial. El pin 4 se usa cuando se necesita impedir que el ESP32 arranque durante el inicio del RP2350 (p. ej. durante la programacion inicial del firmware del ESP32).
Primeros Pasos
Siga estos pasos en orden la primera vez que configure una placa picoZ80:
- Programar el bootloader del RP2350 via modo de almacenamiento masivo USB (BOOTSEL).
- Programar el firmware del ESP32 via
esptool.
- Preparar una tarjeta SD con
config.json y las imagenes ROM/disco necesarias.
- Instalar el picoZ80 en el zocalo Z80 de su ordenador anfitrion.
- Encender, conectarse a la interfaz web del picoZ80 y configurar segun sea necesario.
Si tiene intencion de compilar el firmware usted mismo en lugar de usar las imagenes precompiladas, los
scripts de configuracion automatizada (
setup_picoZ80.sh para Linux/macOS,
setup_picoZ80_windows.ps1 para Windows) instalan la cadena de herramientas, clonan el repositorio y el Pico SDK, y opcionalmente configuran la imagen Docker de ESP-IDF en un solo paso. El comportamiento del firmware, las personalidades y la interfaz web tambien pueden probarse sin ningun hardware usando el
simulador de anfitrion.
Paso 1 — Programar el Bootloader del RP2350
El RP2350 no tiene botones fisicos de BOOTSEL ni Reset. Ambas senales estan disponibles en el conector de depuracion de 6 pines. Para entrar en el bootloader de almacenamiento masivo USB:
- No inserte el picoZ80 en un ordenador anfitrion todavia — conectelo a un PC solo mediante cable USB.
- Usando un jumper o sonda, mantenga el Pin 6 (BOOTSEL) a nivel bajo.
- Aplique alimentacion al puerto USB — el RP2350 comienza a arrancar.
- Suelte BOOTSEL inmediatamente despues de que la placa se enumere como dispositivo de almacenamiento masivo USB. (Si mantiene BOOTSEL demasiado tiempo despues del reset, el RP2350 no puede acceder al chip Flash.)
- El PC montara una unidad etiquetada como RPI-RP2 (o similar).
- Copie
Bootloader_<version>.uf2 a la unidad montada. El RP2350 se autoprograma y reinicia automaticamente.
Tras programar el bootloader, todas las actualizaciones posteriores del firmware del RP2350 pueden realizarse de forma inalambrica mediante la pagina web OTA — no necesitara tocar el conector de depuracion de nuevo para actualizaciones normales de firmware.
Paso 2 — Programar el Firmware del ESP32
El firmware del ESP32 se programa usando
esptool. En revisiones de placa v2.3a y posteriores, el ESP32 tiene su propio puerto USB y aparece de forma independiente en el PC. En revisiones anteriores (v2.0 – v2.2), se accede al ESP32 a traves del RP2350 actuando como puente USB-UART.
Configure el entorno Python (solo una vez):
python3 -m venv ./venv/
source ./venv/bin/activate
cd $HOME/esptool
Luego programe los cuatro componentes del firmware del ESP32. Ajuste PORT al nodo de dispositivo asignado por su sistema operativo:
PORT=/dev/ttyUSB0 # Linux — ajustar segun sea necesario
# PORT=/dev/tty.usbmodem141403 # macOS
BINPATH=/path/to/esp32/build
python3 ./esptool.py \
-p ${PORT} -b 115200 \
--before default_reset --after hard_reset \
--chip esp32s3 \
write_flash \
--flash_mode dio --flash_size 4MB --flash_freq 80m \
0x0 ${BINPATH}/bootloader.bin \
0x8000 ${BINPATH}/partition-table.bin \
0x9000 ${BINPATH}/ota_data_initial.bin \
0x10000 ${BINPATH}/sd_card.bin
NB. Todas las actualizaciones posteriores del firmware del ESP32 pueden realizarse a traves de la pagina web OTA (ota-esp32.htm) una vez completada la programacion inicial.
Paso 3 — Preparar la Tarjeta SD
La tarjeta SD es el medio de almacenamiento principal para el picoZ80. Contiene el archivo de configuracion, imagenes ROM, imagenes de disco y directorios del sistema de archivos.
Requisitos de formato:
- Sistema de archivos FAT32.
- Cualquier capacidad compatible con FAT32 (se recomienda tipicamente hasta 32GB para un formateo fiable).
Archivos minimos requeridos:
config.json en la raiz de la tarjeta SD — el archivo de configuracion principal. Consulte Configuracion Basica para un ejemplo minimo.
- Directorio
webfs/ — los recursos de la interfaz web del ESP32. Copie el contenido del directorio webfs/ del repositorio del proyecto a la raiz de la tarjeta SD.
Directorios opcionales pero recomendados:
| Directorio |
Contenido |
MZF/ |
Archivos de programa en formato MZF para carga mediante el sistema de archivos |
ROM/ |
Imagenes ROM referenciadas por config.json |
DSK/ |
Imagenes de disquete (formato DSK) para emulacion WD1773 |
QD/ |
Imagenes QuickDisk para emulacion de QuickDisk |
TZFS/ |
Arboles del TranZPUter Filing System |
RFS/ |
Arboles de programas del ROM Filing System |
La tarjeta SD puede gestionarse completamente a traves del Gestor de Archivos web una vez que el picoZ80 esta en funcionamiento — puede subir imagenes ROM, editar `config.json` y crear directorios desde el navegador sin necesidad de extraer fisicamente la tarjeta.
Paso 4 — Instalar en el Ordenador Anfitrion
La seguridad primero: Apague siempre y desenchufe el ordenador anfitrion antes de instalar o retirar el picoZ80. La placa opera internamente a 3,3V; los pines DIP-40 se conectan al bus de 5V del anfitrion a traves de circuitos de interfaz apropiados, pero la placa nunca debe insertarse ni retirarse mientras esta alimentada.
Procedimiento de instalacion:
- Apague el ordenador anfitrion y descargue cualquier electricidad estatica.
- Retire el chip Z80 CPU existente de su zocalo DIP-40. Se recomienda una herramienta extractora de chips para evitar doblar los pines.
- Inserte la tarjeta SD en la ranura de tarjeta SD del picoZ80.
- Alinee el picoZ80 con el zocalo Z80, asegurandose de que el Pin 1 del picoZ80 (marcado con un punto o muesca) se alinee con el Pin 1 del zocalo (tambien marcado, y tipicamente adyacente a la muesca en la serigrafia del contorno del CI).
- Presione el picoZ80 suave y uniformemente en el zocalo. Asegurese de que los 40 pines estan asentados. No fuerce — si siente resistencia, retire y verifique la alineacion de los pines.
- Encienda el ordenador anfitrion.
En el primer encendido tras una instalacion de firmware nueva, el ESP32 arrancara en
modo Punto de Acceso, emitiendo una red WiFi llamada
picoZ80. Conectese a esta red para acceder a la interfaz web y completar la configuracion WiFi inicial.
NB. El picoZ80 se alimenta del suministro de 5V en el pin VCC del zocalo Z80. El convertidor buck integrado suministra 3,3V a todos los componentes de la placa. Asegurese de que la fuente de 5V de su ordenador anfitrion pueda entregar al menos 500mA — el picoZ80 puede consumir hasta 400mA bajo carga maxima (RP2350 a 300MHz con WiFi activo).
Configuracion WiFi
La conectividad WiFi requiere que la red de adaptacion de antena este poblada en la PCB y que el firmware del ESP32 este compilado con WiFi habilitado. Consulte el
Aviso Regulatorio a continuacion. Si utiliza firmware solo NCM, omita esta seccion y use la
conexion USB NCM en su lugar.
El coprocesador ESP32 del picoZ80 proporciona conectividad WiFi. En el primer arranque (o cuando no se han guardado credenciales WiFi) el ESP32 arranca en
modo Punto de Acceso (AP) para que pueda conectarse desde cualquier dispositivo con navegador y configurar los ajustes de su red domestica.
Conexion en Modo Punto de Acceso
- En su telefono, tableta u ordenador portatil, abra los ajustes WiFi y busque una red llamada picoZ80 (o segun lo configurado en el campo
esp32.wifi.ssid de su config.json cuando esta en modo AP).
- Conectese a la red picoZ80. La contrasena AP por defecto es pZ80pZ80 (consulte las notas de version de su firmware si esto ha cambiado).
- Abra un navegador y navegue a http://192.168.4.1 — esta es la direccion IP por defecto en modo AP. Aparecera la interfaz web del picoZ80.
- Navegue a la pagina del WiFi Manager para introducir el SSID y la contrasena de su red domestica.
- Haga clic en Save & Connect. El ESP32 se reiniciara y se conectara a su red domestica como cliente.
Modo Cliente (Station)
Una vez configurado en modo cliente, el ESP32 se une a su red WiFi domestica y es accesible en la direccion IP mostrada en la pagina del Panel de Control. Si configuro una IP fija en `config.json` (recomendado para facilitar el acceso), navegue directamente a:
http://192.168.1.192
Sustituya la direccion IP que configuro. Si esta usando DHCP, busque la direccion asignada en la lista de clientes DHCP de su router.
La interfaz web se ejecuta completamente en su navegador. No se requiere software adicional. El servidor web del picoZ80 funciona en el puerto 80.
Conexion USB NCM (Sin WiFi Necesario)
Si la placa esta compilada con el firmware NCM (
sdkconfig.mode_ncm_only o
sdkconfig.mode_wifi_and_ncm), un adaptador Ethernet virtual aparece en el ordenador anfitrion cuando se conecta el puerto USB del ESP32. El servidor DHCP integrado del picoZ80 asigna automaticamente una direccion IP al anfitrion — no se necesita configuracion de red manual.
- Conecte un cable USB desde el ordenador anfitrion al puerto USB del ESP32 en el picoZ80.
- Espere unos segundos para que el sistema operativo del anfitrion detecte el nuevo adaptador de red.
- Abra un navegador web y navegue a
http://192.168.7.1.
- Deberia aparecer la pagina del Panel de Control del picoZ80.
Este modo proporciona acceso completo a todas las funciones de la interfaz web: edicion de configuracion, actualizaciones de firmware, gestion de archivos y seleccion de personalidad. No se requieren componentes de antena ni radio WiFi.
Interfaz Web
La interfaz web del picoZ80 es una aplicacion Bootstrap 4 de ocho paginas servida por el ESP32. Todas las paginas — incluyendo el nuevo editor de configuracion GUI — son accesibles desde la barra de navegacion en la parte superior de cada pagina. Los recursos web se almacenan en el directorio webfs/ de la tarjeta SD y pueden actualizarse de forma independiente al firmware.
Panel de Control (index.htm)
El Panel de Control es la pagina principal de la interfaz web. Muestra informacion del sistema en tiempo real y proporciona una vision general rapida del estado del picoZ80.
La informacion mostrada en el Panel de Control incluye:
- Firmware Version — la version del firmware del RP2350 actualmente en ejecucion y la fecha de compilacion.
- ESP32 Version — la version del firmware del coprocesador ESP32.
- Active Partition — cual de las dos ranuras de firmware (1 o 2) esta actualmente activa.
- Active Persona — la personalidad de maquina actualmente cargada (p. ej. MZ-700, MZ-80A).
- RP2350 Clock — frecuencia actual de la CPU en MHz.
- PSRAM Clock — frecuencia actual del reloj SPI de la PSRAM.
- WiFi Status / Network Status — en modos WiFi: modo (AP o cliente), SSID y direccion IP asignada. En modo solo NCM: este panel se titula Network Configuration y muestra el estado de la red USB NCM (direccion IP, mascara de red) — no hay campos relacionados con WiFi.
- WiFi RSSI (solo modos WiFi) — indicador de intensidad de senal recibida en tiempo real (dBm) que se actualiza automaticamente cada tres segundos. Codificado por color: verde (≥ -50 dBm, excelente), azul (≥ -70 dBm, bueno), naranja (≥ -80 dBm, regular), o rojo (< -80 dBm, deficiente). No se muestra en modo solo NCM.
- WiFi TX Power (solo modos WiFi) — potencia de transmision actual en dBm, tambien actualizada en tiempo real. No se muestra en modo solo NCM.
- SD Card — si hay una tarjeta SD presente y el estado de montaje del sistema de archivos.
- Uptime — tiempo desde el ultimo reinicio.
El Panel de Control tambien proporciona botones para reiniciar el RP2350 y para activar una recarga de configuracion desde la tarjeta SD sin un reinicio completo.
Dos menus desplegables en la esquina superior derecha de la barra de navegacion estan disponibles en cada pagina:
- Menu Actions
- Change Floppy Disk 1 / 2 — seleccionar un nuevo archivo de imagen DSK de la tarjeta SD y montarlo en la ranura 1 o 2 del controlador de disquete virtual WD1773 sin reiniciar. El nombre del archivo de imagen de disco actualmente cargado se muestra junto a cada entrada (o "none" si no hay imagen cargada). Cuando el controlador de disquete activo soporta mas de dos unidades, tambien aparecen Change Floppy Disk 3 y 4 (de lo contrario permanecen ocultas).
- Change QD Disk — intercambiar el archivo de imagen QuickDisk activo al vuelo. El nombre del archivo de imagen QD actualmente cargado se muestra junto a la entrada.
- Reload RP2350 Config — enviar un comando de recarga al RP2350 a traves del UART ESP32–RP2350; el RP2350 reanaliza config.json y reaplicala configuracion del mapa de memoria y controladores sin un ciclo completo de apagado y encendido.
- Menu Reboot
- ESP32 — reinicio suave del coprocesador ESP32 (reinicia el servidor web y la pila WiFi, el RP2350 no se ve afectado).
- RP2350B — reiniciar el procesador RP2350 (re-ejecuta el bootloader y recarga la ranura de firmware activa, la CPU del anfitrion se pausa durante el reinicio).
- Host — activar la linea de reset del ordenador anfitrion, reiniciando el ordenador vintage en el zocalo Z80 sin afectar a la propia placa picoZ80.
- IPL Reset — realizar un reinicio IPL (Initial Program Load) conmutando el bit 3 del Puerto C del 8255 PPI, devolviendo la maquina al modo de arranque (BST). Disponible en las personalidades MZ-80B, MZ-2000, MZ-2200 y MZ-2500 — equivalente a pulsar el boton IPL en el hardware original.
- RP2350 UF2 Boot / RP2350 UF2 Boot (App) — reiniciar el RP2350 en su bootloader USB (BOOTSEL) para poder arrastrar y soltar un firmware .uf2 sobre la unidad montada. La variante simple entra en el bootloader directamente; la variante (App) vuelve a entrar en el desde la ranura de aplicacion en ejecucion.
Editor de Configuracion (config.htm)
La pagina del Editor de Configuracion proporciona un editor en el navegador para el archivo
config.json almacenado en la tarjeta SD. El editor incluye resaltado de sintaxis y validacion basica de JSON.
Para editar la configuracion:
- Navegue a la pagina del Editor de Configuracion.
- El
config.json actual se carga en el editor automaticamente.
- Realice sus cambios. El editor resaltara los errores de sintaxis en rojo.
- Haga clic en Save para escribir el archivo actualizado de vuelta a la tarjeta SD.
- Haga clic en Apply (o reinicie) para aplicar la nueva configuracion. El RP2350 lee la configuracion al arrancar, la minifica y la almacena en Flash — los arranques posteriores usan la copia en Flash si no hay tarjeta SD presente.
Los cambios en el mapa de memoria, imagenes ROM y mapa de E/S surten efecto en el siguiente reinicio del RP2350. Los cambios en los ajustes WiFi del bloque
esp32.wifi surten efecto en el siguiente reinicio del ESP32.
NB. El Editor de Configuracion opera directamente sobre el archivo de la tarjeta SD. Es buena practica mantener una copia de seguridad de un config.json funcional en su PC antes de realizar cambios significativos.
Configuracion GUI (configgui.htm)
La pagina de Configuracion GUI proporciona una alternativa grafica al Editor de Configuracion JSON en bruto. Todos los ajustes de configuracion se presentan como campos de entrada etiquetados, menus desplegables y tablas editables, organizados en cuatro pestanas:
- RP2350 Global — ajustes globales de voltaje del nucleo, frecuencia de CPU y frecuencia de PSRAM que se aplican a ambas particiones.
- Partition 1 / Partition 2 — mapa de memoria por particion (direccion, tamano, tipo, estados de espera, banco, archivo ROM), mapa de puertos E/S (direccion, tamano, tipo, handler), y configuracion de controladores (p. ej. MZ80AFI, RFS, MZ-1E30, Celestite, PCW9512) con controles de activar/desactivar y un boton Add Driver para el conjunto completo de controladores de interfaz disponibles. Cada seccion tiene botones de agregar/eliminar filas.
Ajuste del bus GPIO. Los ajustes del nucleo por particion le permiten ajustar las caracteristicas electricas del bus Z80 de forma independiente para cada uno de los tres grupos del bus —
Address,
Data y
Control. Para cada grupo puede establecer la intensidad de conduccion (2 / 4 / 8 / 12 mA), la velocidad de cambio (lenta = bajo EMI, o rapida), la entrada Schmitt-trigger (on / off) y la resistencia de pull (flotante / arriba / abajo). Una tabla opcional de
anulacion por pin le permite anular cualquiera de estos para pines GPIO individuales cuando una maquina anfitriona concreta lo necesita. El valor por defecto es conduccion de 2 mA con cambio lento (menor EMI). Los ajustes del nucleo tambien exponen el valor de
refresco Z80:
0 deshabilita el refresco DRAM,
1 emite un refresco en cada busqueda de opcode, y
N emite un refresco cada
N busquedas — permitiendo equilibrar la actividad de refresco con la temporizacion de los perifericos.
- ESP32 — tipo de dispositivo ESP32, controles de interfaz de red (WiFi Enable, NCM Enable, NCM Retries, NCM Retry Period), y configuracion WiFi (SSID, contrasena, direccion IP, mascara de red, modo AP/Cliente, DHCP, TX power). Ademas de los campos WiFi puede establecer la direccion IP NCM y la mascara de red USB, y un nombre de producto USB personalizado — util para distinguir varias placas conectadas al mismo anfitrion.
Haga clic en
Save Configuration para escribir los cambios en
config.json (la version anterior se respalda) y recargar automaticamente la configuracion del RP2350. Haga clic en
Reload para releer el
config.json actual de la tarjeta SD, descartando los cambios no guardados. Para edicion avanzada mas alla de lo que expone la GUI, use el
Editor de Configuracion para modificar el JSON en bruto directamente.
Explorador de archivos. Los campos de ROM e imagen de disco proporcionan un boton
Browse que abre un selector de archivos de la tarjeta SD, para que pueda seleccionar un archivo sin escribir su ruta. La ruta elegida se almacena de forma relativa a la raiz de la tarjeta SD.
Puerto de tarjeta serie. Las interfaces serie RS-232C MZ-8BIO3 y MZ-1E24 admiten un parametro
port — la direccion base de E/S de la tarjeta (por defecto
0xB0) — que es editable en la fila del controlador.
Serie de controlador y Puerto Base de E/S. El menu desplegable
Add Driver ofrece solo los controladores validos para el firmware en ejecucion — la pagina detecta si el firmware es una version Sharp, Amstrad, Tatung u
Open (experimentador). Para las tarjetas de interfaz reubicables — MZ-1R12, MZ-1R18, MZ-1R23, MZ-1R37, PIO-3034, MZ-8BIO3, MZ-1E24, MZ-1E05 y Celestite — se muestra un unico campo
Base I/O Port, prerrellenado con la base autentica de la tarjeta. Cambielo para mover los puertos de la tarjeta cuando el picoZ80 se usa en una placa de su propio diseno; la GUI escribe el mapeo correcto automaticamente. Cada controlador tambien puede cargar sus propias imagenes de
System ROM, que sobrescriben las ROM del anfitrion cuando el controlador esta activado.
Modo demo. Un asistente de presentacion opcional que oculta campos sensibles — SSID y contrasena WiFi, y direcciones IP/gateway — de las paginas web, para que la interfaz pueda mostrarse de forma segura en capturas de pantalla o grabaciones de pantalla sin exponer los detalles de su red.
Gestor de Archivos (filemanager.htm)
El Gestor de Archivos proporciona una vista basada en navegador del contenido de la tarjeta SD. Puede navegar por directorios, subir nuevos archivos (imagenes ROM, imagenes de disco, archivos de programa MZF), descargar archivos existentes a su PC, crear nuevos directorios y eliminar archivos y directorios.
Tareas comunes en el Gestor de Archivos:
- Subir una imagen ROM — navegue al directorio
ROM/ y use el boton Upload para transferir el archivo ROM desde su PC.
- Subir una imagen de disco — navegue a
DSK/ (disquete) o QD/ (QuickDisk) y suba el archivo de imagen. Una vez cargado, el nombre del archivo de imagen de disco actual se muestra en el menu Actions junto a cada ranura de disquete y QD para referencia rapida.
- Subir programas MZF — navegue a
MZF/ o al directorio del sistema de archivos correspondiente y suba sus archivos MZF.
- Respaldar config.json — haga clic en el icono de descarga junto a
config.json para guardar una copia en su PC.
- Respaldar Tarjeta SD — haga clic en el boton Backup SD para descargar todo el contenido de la tarjeta SD como un unico archivo comprimido a su ordenador local. Esto es particularmente util cuando el picoZ80 esta instalado dentro de un ordenador anfitrion y extraer fisicamente la tarjeta SD no es practico. La copia de seguridad captura todos los archivos de configuracion, imagenes ROM, imagenes de disco y datos del sistema de archivos en una sola operacion.
Las operaciones de archivo se realizan directamente en la tarjeta SD a traves del ESP32. Las subidas de archivos grandes pueden tardar unos segundos dependiendo del tamano del archivo y la calidad de la senal WiFi.
Seleccion de Personalidad (personality.htm)
La pagina de Seleccion de Personalidad le permite elegir que personalidad de maquina (persona) presenta el picoZ80 al ordenador anfitrion. Diferentes personalidades cargan diferentes mapas de memoria, imagenes ROM y vinculaciones de controladores virtuales desde la configuracion.
Personalidades actualmente soportadas:
- MZ-700 — personalidad MZ-700 completa con conmutacion de bancos, video virtual, E/S de teclado, emulacion de disquete WD1773, emulacion de QuickDisk y ROM Filing System. Incluye CP/M v2.23 (48K), SA-1510 BASIC y Microsoft BASIC v4.7, todos con acceso de lectura/escritura a tarjeta SD.
- MZ-80K — personalidad Sharp MZ-80K con monitor SP-1002, 8255 PPI, 8253 PIT y teclado LS367. Hay dos interfaces de disquete disponibles: la nativa MZ80FIO (Toshiba T3444M) — la interfaz de disco MZ-80FD original, que arranca y lee todos los discos del MZ-80K (juegos, aplicaciones, BASIC y CP/M); y la tarjeta MZ80AFI (el FDC del MZ-80A) — usada para CP/M, que puede arrancar CP/M del MZ-80K y leer discos CP/M originales del MZ-80K desde dentro de CP/M como las unidades C:/D:. La personalidad puede ademas vincular las demas tarjetas de interfaz del MZ-80A (RFS, MZ-1E14/E19, MZ-1R12/R18/R37, PIO-3034). CP/M requiere el modo de personalidad virtual.
- MZ-80A — personalidad Sharp MZ-80A con monitor SA-1510, 8253 PIT, 8255 PPI, escaner de teclado LS367, intercambio de memoria MEMSW para CP/M y el controlador de disquete MZ80AFI.
- MZ-80B — personalidad Sharp MZ-80B con ROM IPL de 2K, conmutacion de modos BST/NST, dos paginas de VRAM grafica, interfaz de disquete MZ-8BFI y el conjunto completo de tarjetas de expansion del MZ-80B, incluida la pletina de cassette virtual (de transporte controlado).
- MZ-1500 — personalidad Sharp MZ-1500: un superconjunto del MZ-700 con Quick Disk integrado, PCG, sonido PSG estereo y el conjunto de tarjetas de interfaz del MZ-700.
- MZ-2000 / MZ-2200 — personalidades Sharp MZ-2000 y MZ-2200 con modos de memoria BST/NST, superposicion de VRAM, 8253 PIT, 8255 PPI, Z80 PIO y la interfaz de disquete MZ-8BFI (MB8866); modos fisico y virtual.
- MZ-2500 — personalidad Sharp MZ-2500 (SuperMZ) con la MMU de 8 paginas, modos de compatibilidad MZ-2000 / MZ-80B, disquete MZ-8BFI, disco duro SASI MZ-1E30 y la pletina de cassette virtual.
- Einstein TC-01 — personalidad Tatung Einstein TC-01 con el controlador de disquete basado en WD1770 que sirve imagenes de disco desde la SD.
- X1 — personalidad Sharp X1 / X1 turbo (modo fisico): la maquina aporta todo por si misma y el picoZ80 anade el controlador de disquete MB8877A, el DMA de disquete en el turbo y el cassette virtual
.tap — vease Sharp X1.
- MZ-800 — personalidad Sharp MZ-800 — maquina de doble modo que funciona en modo de compatibilidad MZ-700 o en modo nativo MZ-800 (graficos 320×200 / 640×200, paleta de 4/16 colores mediante el GDG), sonido PSG SN76489, disquete WD1773 y QuickDisk. Cambia de modo al vuelo. Puede vincular el conjunto completo de tarjetas de interfaz del MZ-80A/MZ-700 mas las tarjetas serie RS-232C MZ-8BIO3 / MZ-1E24.
- PCW-8256 — personalidad Amstrad PCW-8256/8512 con gate array, uPD765 FDC, RAM paginada y controlador de impresora matricial. Soporta los modos de controlador PHYSICAL y VIRTUAL, arranque sin disco desde imagenes DSK, intercambio en vivo de unidad Virtual/Real y expansion de memoria PSRAM — vease Serie Amstrad PCW.
- PCW-9512 — personalidad Amstrad PCW-9512 con gate array, uPD765 FDC, 512KB de RAM paginada y controlador de impresora de margarita. Mismo conjunto de funciones que la personalidad PCW-8256.
- Basic CPU — un Z80 puro en el zocalo sin controladores especificos de maquina, para un reemplazo directo simple o desarrollo Z80 generico.
- OpenZ80 — la personalidad de experimentador para una placa de su propio diseno o una maquina no soportada (vease Otras Maquinas). A diferencia de las personalidades anteriores, es una version de firmware dedicada en lugar de una seleccion en esta pagina: programe el firmware
OpenZ80 en una particion usando las paginas de Actualizaciones de Firmware, luego agregue sus tarjetas de interfaz y establezca sus puertos base de E/S en la pagina de Configuracion GUI.
Cambiar de personalidad modifica el mapa de memoria activo y las imagenes ROM cargadas sin reiniciar el anfitrion. El picoZ80 reinicializa su gestion de bancos de memoria a la configuracion de la nueva personalidad y el anfitrion ve el nuevo esquema de memoria en la siguiente transaccion del bus Z80.
Actualizaciones de Firmware (OTA)
El firmware tanto del RP2350 como del ESP32 puede actualizarse de forma inalambrica (OTA) desde la interfaz web sin ningun acceso fisico al conector de depuracion.
Actualizacion OTA del RP2350 (ota-rp2350.htm)
- Compile el firmware del RP2350 usando los scripts de compilacion — el binario de salida estara en
fw/bin/ con un nombre de archivo con sello de version (p. ej. BaseZ80_2.948.bin — la version del modelo sin prefijo v).
- Navegue a http://<device-ip>/ota-rp2350.htm.
- Seleccione a que ranura de particion actualizar (Slot 1 o Slot 2). La ranura actualmente activa se muestra en el Panel de Control — es buena practica actualizar la ranura inactiva para que el firmware existente permanezca disponible si la actualizacion falla. Hay dos casillas opcionales disponibles: Clear App Config borra las imagenes ROM y los datos de configuracion de la ranura destino, y Clear Flash Header restablece la tabla de particiones a los valores de fabrica — use estas opciones al actualizar a una version de firmware con un esquema de configuracion incompatible.
- Haga clic en Choose File, seleccione el archivo
.bin, luego haga clic en Upload.
- Espere a que se completen la subida y la verificacion. La pagina confirmara el exito y mostrara la nueva particion como disponible.
- Para activar el nuevo firmware, navegue a la seccion de seleccion de particion de la misma pagina, elija la ranura recien actualizada y haga clic en Set Active & Reboot. El RP2350 se reinicia con el nuevo firmware.
Las particiones de aplicacion usan formato binario puro (no UF2) porque residen en direcciones Flash no estandar. El bootloader verifica la suma de comprobacion de la imagen antes de activar la nueva particion — si la verificacion falla, la ranura activa existente permanece en uso.
Actualizacion OTA del ESP32 (ota-esp32.htm)
- Compile el firmware del ESP32 — el binario de salida es
esp32/build/tzpuPico_esp32.bin.
- Navegue a http://<device-ip>/ota-esp32.htm.
- Haga clic en Choose File, seleccione el archivo
.bin, luego haga clic en Upload.
- El ESP32 se reinicia automaticamente con el nuevo firmware tras una subida exitosa.
La pagina OTA tambien acepta un archivo
FilePack para actualizar los recursos de la interfaz web almacenados en el directorio
webfs/ de la tarjeta SD. Esto permite actualizar la interfaz web de forma independiente al binario del firmware del ESP32.
WiFi Manager (wifimanager.htm)
Nota: La pagina WiFi Manager solo esta disponible cuando el firmware del ESP32 esta compilado con WiFi habilitado (
sdkconfig.mode_wifi_only o
sdkconfig.mode_wifi_and_ncm). En modo solo NCM esta pagina no esta presente — la conectividad de red se proporciona automaticamente via USB NCM sin necesidad de configuracion por parte del usuario.
La pagina WiFi Manager configura los ajustes de red inalambrica del ESP32. Los cambios realizados aqui se persisten en el NVS (almacenamiento no volatil) del ESP32 y surten efecto en el siguiente reinicio.
Ajustes disponibles:
- WiFi Mode — Access Point (el picoZ80 crea su propia red) o Client (el picoZ80 se une a una red existente).
- SSID — el nombre de la red a crear (modo AP) o a la que unirse (modo cliente).
- Password — la frase de contrasena WiFi.
- IP Address / Netmask / Gateway — ajustes de IP fija para modo cliente (recomendado para acceso consistente).
- DHCP — habilitar para obtener una direccion de su router automaticamente; deshabilitar para usar los ajustes de IP fija anteriores.
- TX Power — potencia de transmision WiFi en unidades de 0,25 dBm (rango 8–84, es decir 2–21 dBm). Configurar a 0 para usar el valor por defecto especifico de la region. La PCB del picoZ80 esta disenada para una emision minima de RF, asi que cuando la placa esta instalada dentro de una carcasa metalica de ordenador, la senal al router puede ser debil. Aumentar TX Power puede mejorar la conectividad a expensas de un consumo ligeramente mayor; disminuirla puede reducir interferencias en entornos con muchos dispositivos WiFi. El RSSI actual y la TX Power efectiva se muestran en el Panel de Control y en esta pagina, actualizados en tiempo real cada tres segundos.
Despues de guardar, haga clic en
Reboot ESP32 para aplicar los nuevos ajustes. El ESP32 se reiniciara y se conectara usando la nueva configuracion. Si la conexion en modo cliente falla (SSID o contrasena incorrectos), el ESP32 volvera al modo Punto de Acceso tras un tiempo de espera, permitiendole reconectarse y corregir los ajustes.
Configuracion Basica
Todo el comportamiento del picoZ80 se controla mediante
config.json en la tarjeta SD. Lo siguiente es una configuracion minima funcional para un Sharp MZ-700. Consulte la
Guia Tecnica — Referencia de Configuracion para una descripcion completa de todas las opciones.
{
"esp32": {
"core": {
"device": "Z80",
"mode": 0
},
"wifi": {
"override": 1,
"wifimode": "client",
"ssid": "YourNetwork",
"password": "YourPassword",
"ip": "192.168.1.192",
"netmask": "255.255.255.0",
"gateway": "192.168.1.1",
"dhcp": 0,
"webfs": "webfs",
"persist": 0
}
},
"rp2350": {
"core": {
"cpufreq": 300000000,
"psramfreq": 133000000,
"voltage": 1.10
},
"z80": [
{
"memory": [
{
"enable": 1,
"addr": "0x0000",
"size": "0x1000",
"type": "ROM",
"bank": 0,
"tcycwait": 0,
"tcycsync": 0,
"task": "",
"file": "/ROM/mz700.rom",
"fileofs": 0
},
{
"enable": 1,
"addr": "0x1000",
"size": "0xCFFF",
"type": "RAM",
"bank": 0,
"tcycwait": 0,
"tcycsync": 0,
"task": "",
"file": "",
"fileofs": 0
},
{
"enable": 1,
"addr": "0xD000",
"size": "0x3000",
"type": "PHYSICAL_VRAM",
"bank": 0,
"tcycwait": 2,
"tcycsync": 1,
"task": "",
"file": "",
"fileofs": 0
}
],
"io": [],
"drivers": []
}
]
}
}
Este ejemplo mapea:
0x0000 – 0x0FFF — 4KB de ROM cargada desde /ROM/mz700.rom en la tarjeta SD al banco 0 de PSRAM.
0x1000 – 0xCFFF — 48KB de RAM en el banco 0 de PSRAM (lectura/escritura, cero estados de espera).
0xD000 – 0xFFFF — 12KB pasados al hardware fisico del anfitrion (VRAM y registros de E/S), con 2 estados de espera y sincronizacion T1 habilitada.
Configuracion del Servidor de Archivos en Red
El picoZ80 puede cargar, guardar y listar programas BASIC a traves de la red usando el prefijo de dispositivo NETx: en Sharp MZ BASIC. Esto requiere tres componentes: la interfaz virtual Celestite (configurada en el JSON de la personalidad), el picoZ80 conectado a la misma red que el PC (via WiFi o USB NCM) y el servidor de archivos Python netfs.py ejecutandose en el PC.
Prerrequisitos
- Python 3.6 o posterior instalado en el PC.
- La personalidad del picoZ80 debe incluir la interfaz Celestite en su configuracion de controladores de
config.json.
- La interfaz Celestite debe tener el parametro
ip configurado con la direccion IP del PC y el puerto de netfs.py en config.json.
- El picoZ80 y el PC deben estar en la misma red (modo cliente WiFi o USB NCM).
- Un directorio en el PC que contenga archivos de programa MZF para servir.
Iniciar el Servidor de Archivos
El servidor de archivos se encuentra en tools/NetFileServer/netfs.py en el repositorio del picoZ80. Inicielo desde un terminal:
# Servir archivos desde el directorio actual en el puerto predeterminado 6800:
python3 netfs.py --dir ./mzf_files
# Servir archivos en un puerto personalizado con multiples directorios de unidad:
python3 netfs.py --port 6800 --dir ./games --dir2 ./utilities --dir3 ./basic_programs
# Cada --dirN se asigna a NETx: en BASIC (--dir = NET1:, --dir2 = NET2:, etc.)
El servidor soporta unidades 1–7 (
NET1: a
NET7:), cada una mapeada a un directorio separado en el PC. Escucha conexiones TCP en el puerto 6800 (configurable con
--port). El servidor es multi-hilo y gestiona el analisis de cabeceras MZF automaticamente.
Formatos de archivo soportados: .mzf,
.mzt,
.m12 (formato de cinta Sharp MZ con cabecera de 128 bytes), y archivos binarios sin formato (
.bin,
.rom,
.dat).
Uso de NETx: en BASIC
Una vez que el servidor de archivos esta en ejecucion en el PC, use el prefijo de dispositivo NETx: en los comandos BASIC. El controlador W5100 Celestite del picoZ80 se conecta al PC automaticamente:
DIR NET1: Listar archivos en la unidad de red 1 (directorio del PC)
LOAD "NET1:MYPROG" Cargar un programa desde el PC
SAVE "NET1:MYPROG" Guardar un programa en el PC
LOAD "NET3:GAME" Cargar desde la unidad 3 (asignada a --dir3)
Solucion de Problemas: Si la conexion falla, verifique que la direccion IP del picoZ80 puede alcanzar el PC (compruebe la pagina de estado del Panel de Control para la IP asignada), asegurese de que ningun firewall esta bloqueando el puerto 6800, y confirme que el servidor de archivos esta en ejecucion. El servidor imprime informacion de conexion en el terminal cuando un cliente se conecta.
Unidad de Cassette Virtual (CMT)
La
unidad de Cassette Virtual (CMT) es una pletina de cassette a nivel de forma de onda para la serie Sharp MZ. A diferencia de la carga desde tarjeta SD — que es la via
rapida — la CMT es la via
autentica: reproduce la
forma de onda del cassette en lugar de atajar el cargador, por lo que desde el punto de vista de la maquina anfitriona es indistinguible de una pletina de cinta real. El comando
LOAD del monitor, BASIC, los cargadores personalizados y turbo, y
SAVE funcionan todos exactamente como lo harian con una grabadora fisica. Tome cualquier archivo
.mzf y carguelo "como un cassette real", o grabe un programa en ejecucion de vuelta a un nuevo
.mzf.
La CMT se adapta automaticamente a la maquina anfitriona. En la familia
simple (MZ-80K, MZ-80A, MZ-700, MZ-800) la pletina es controlada por la linea de encendido/apagado del motor de la maquina y se comporta como una cinta lineal simple a 1200 baudios. En la familia
controlada por ordenador (MZ-80B, MZ-2000, MZ-2200, MZ-2500) el anfitrion puede comandar el transporte directamente (PLAY, STOP, avance rapido, rebobinado, expulsion y busqueda de programa APSS) a 2000 baudios. No necesita elegir la familia — se infiere de la personalidad activa.
Habilitar la Interfaz CMT
La CMT es un controlador de interfaz y esta desactivada por defecto. Habilitela estableciendo
"enable": 1 en el bloque de interfaz
CMT en
config.json, o agregandola y habilitandola desde la pagina de
Configuracion GUI web. Una vez habilitada una interfaz CMT, aparece un nuevo panel
CMT en la GUI web para construir la cinta, y aparece un elemento
CMT: Virtual / Real en el menu
Actions.
Construir la Cola de Cinta
La cinta virtual es una
cola ordenada de hasta 16 archivos MZF — los programas que estarian uno tras otro en un cassette fisico. Construya y edite la cola en vivo desde el panel CMT en la GUI web:
agregue un archivo desde la tarjeta SD,
elimine una entrada, o
reordene entradas para cambiar el orden de reproduccion. Los cambios surten efecto inmediatamente, sin reiniciar.
Al final de cada programa la cinta
avanza automaticamente a la siguiente entrada, exactamente como una cinta real que continua hacia la siguiente grabacion. El siguiente
LOAD encuentra por tanto el siguiente programa en la cola automaticamente, sin intervencion manual.
Cargar Programas
Cargue desde la cinta virtual exactamente como lo haria desde una pletina real — no hay nada especifico de la CMT que escribir. Use el comando LOAD del monitor, cargue desde BASIC, o ejecute cualquier cargador personalizado o turbo; cada uno lee el programa actual desde la cabeza de la cola, y la cola avanza entonces automaticamente lista para la siguiente carga.
Comportamiento del Transporte
La forma en que responde la pletina depende de la familia del anfitrion:
- Familia simple (MZ-80K / MZ-80A / MZ-700 / MZ-800) — la maquina solo tiene una linea de encendido/apagado del motor, por lo que la cinta simplemente avanza mientras el motor esta energizado, exactamente como la pletina original. No hay controles de transporte gestionados por el anfitrion. En el MZ-800, el propio IPL / monitor nativo de la maquina carga desde la pletina virtual ademas de TZFS: la pletina esta conectada al mapa de memoria nativo, el pulso ciego de encendido de motor que emite el monitor durante su inicializacion del 8255 se ignora, y la cinta se pausa mientras el motor esta apagado y se reanuda exactamente donde se detuvo, de modo que los huecos largos entre registros no danan la cabecera.
- Familia controlada (MZ-80B / MZ-2000 / MZ-2200 / MZ-2500) — la maquina puede comandar el transporte directamente: PLAY, STOP, avance rapido y rebobinado (que saltan programas completos), EJECT, y busqueda de programa APSS, que busca el limite del programa siguiente o anterior y se detiene automaticamente.
Grabacion (SAVE)
El guardado tambien funciona. Cuando el anfitrion pone la pletina en modo de grabacion (motor encendido, grabacion) y emite un SAVE, la CMT captura la forma de onda saliente, la decodifica, verifica su suma de comprobacion, y escribe un nuevo archivo MZF en el directorio CMT/ de la tarjeta SD. El archivo se nombra:
CMT/taperecord_<name>_<YYYYMMDD_HHMMSS>.mzf
donde <name> es el propio nombre de archivo Sharp del programa (convertido a ASCII y saneado para que sea un nombre de archivo FAT legal — cualquier caracter ilegal se convierte en _). Si el reloj del ESP32 no se ha ajustado, se usa un numero de secuencia en lugar de la marca de tiempo (p. ej. taperecord_<name>_0001.mzf) para que las grabaciones nunca colisionen en la fecha 1980 por defecto. El nombre Sharp original se almacena dentro de la propia cabecera MZF, por lo que el programa conserva su nombre real cuando lo vuelve a cargar.
Conmutador Real / Virtual (CMT, Disquete y QD)
El mismo conmutador Virtual / Real en vivo que cambia la pletina CMT se aplica tambien a las interfaces de
Disquete (FDD) y
Quick Disk (QD). En la GUI web el conmutador de pletina es un elemento de menu —
CMT: Virtual / Real en el menu CMT, y elementos de conmutacion
Floppy y
QD disponibles en todas las paginas. Cualquiera de los tres puede cambiarse entre los dos modos en vivo, sin reiniciar:
- Virtual — el firmware emula la unidad o la pletina: el cassette virtual, o las imagenes de disquete / QuickDisk respaldadas en la SD, suministran lo que lee el anfitrion, y los comandos de motor/transporte a cualquier hardware conectado fisicamente se suprimen. Este es el modo normal para cargar y grabar imagenes de la tarjeta SD.
- Real — paso directo puro a la unidad o pletina conectada fisicamente. El anfitrion excita el hardware real directamente y el picoZ80 solo escucha el bus en modo de solo lectura.
Una interfaz que esta
configurada fisicamente arranca ahora en modo Real, con el menu y el conmutador presentes para que pueda cambiarla a Virtual en cualquier momento. El modo actual de cada pletina se informa por la interfaz de estado (INF) — los nuevos campos
fddMode y
qdMode para el Disquete y el QD, mientras que la CMT informa de su propio modo como antes. Internamente, un cambio de modo ejecuta una tarea de cambio de modo de unidad y envia el comando inverso correspondiente (
FDDM /
QDDM) por la cola de comandos inversos ESP32→RP2350 — el mismo mecanismo que el conmutador CMT — instalando o desinstalando los hooks por controlador en cada cambio. En modo QD
Real, el paso directo del SIO real en los puertos F4–F7 esta
ritmado con un suelo de recuperacion entre accesos de 10 µs, porque el Z80 SIO necesita varios ciclos de reloj de recuperacion entre accesos.
Los menus Floppy y QD ganan ademas cada uno un boton
EJECT. Expulsar monta una ruta vacia, desmontando la unidad para que el FDC informe de que no hay disco presente — util para software que sondea en busca de un disco o espera un estado de puerta abierta.
El conmutador es util para transferir programas entre medios — por ejemplo, cargar un programa desde una imagen o cinta virtual, luego cambiar a
Real y guardarlo con
SAVE en la unidad o cassette fisico, o viceversa.
Anadir Chips — Dispositivos Perifericos Virtuales
El picoZ80 puede anadir chips de apoyo a una maquina que nunca los tuvo. Un controlador Z80 DMA, un contador/temporizador, un puerto paralelo, un controlador de disquete — cada uno es un modelo fiel del circuito integrado real, y cada uno puede colocarse en cualquier maquina y cablearse desde la interfaz web. No se suelda nada y no se escribe firmware; los chips se describen en la configuracion y se construyen al arrancar la maquina.
Asi es como puede experimentar con un diseno antes de llevarlo al hardware, anadir un periferico del que la maquina original carecia, o construir sobre el picoZ80 un ordenador Z80 enteramente nuevo de su propia invencion. Los chips disponibles se enumeran a continuacion; la
Guia Tecnica documenta todos y cada uno de sus pines.
| Chip |
Para que sirve |
| Direct Memory Access (DMA) |
Mueve bloques de datos entre memoria y E/S sin el procesador. Tambien puede buscar un valor de byte. |
| Counter / Timer (CTC) |
Cuatro temporizadores o contadores de eventos independientes. Se usa para interrupciones periodicas y para generar velocidades de transmision. |
| Parallel Input / Output (PIO) |
Dos puertos de 8 bits con protocolo de reconocimiento. Se usa para impresoras, teclados y lineas de control generales. |
| Interval Timer (8253 / 8254) |
Tres contadores con seis modos de cuenta. Se usa para temporizacion, generacion de tonos e interrupciones. |
| Parallel Interface (8255) |
Tres puertos de 8 bits con direccion programable. |
| Floppy Disk Controller (WD1773) |
Lee y escribe imagenes de disquete guardadas en la tarjeta SD. |
| Serial Port (68B50 ACIA) |
Puerto serie asincrono sencillo — el componente serie mas comun en los disenos Z80 caseros. |
| Serial Port (8251 USART) |
Puerto serie asincrono o sincrono, muy usado en las maquinas de la era CP/M y MSX. |
| Dual Serial Port (Z80 DART) |
Dos canales serie asincronos con interrupciones vectorizadas — el SIO sin los modos sincronos. |
| Real Time Clock (MSM5832) |
Reloj y calendario con respaldo de bateria. Lee la fecha y hora reales una vez que la red las ha establecido. |
| Printer Port (Centronics) |
Puerto de impresora paralelo. La salida aparece en un canal serie USB dedicado. |
| Latch / Port |
Una escritura excita ocho cables, una lectura muestrea ocho cables — la logica de enlace que un diseno usa para bancos y lineas de control. |
| Signal Port |
Un puerto de prueba que coloca ocho cables en una sola direccion, para que un programa pueda excitarlos y leerlos directamente. |
Los chips serie y la impresora se comunican con el mundo exterior a traves del propio puerto USB del picoZ80: conecte la placa a un PC y cada chip serie aparece alli como un puerto serie USB ordinario, y la salida de impresora llega por un canal propio. Ni siquiera necesita un terminal conectado — desde el
ICE,
ser teclea en un chip serie y lee de vuelta lo que la maquina envio, y
prn muestra lo que imprimio.
Anadir un Chip
Abra la interfaz web y elija Config en el menu de la izquierda, y despues GUI. La pagina de configuracion se abre con cuatro pestanas; seleccione la particion en la que quiere montar los chips — Partition 1 o Partition 2. Baje mas alla de Core Settings, Memory, I/O y Drivers y encontrara dos paneles, Dispositivos (Devices) y Conexiones (Connections).
Haga clic en el titulo del panel Dispositivos para abrirlo y pulse Anadir Dispositivo (Add Device). Aparece una lista de los chips disponibles, cada uno con una breve descripcion de lo que hace. Haga clic en el que quiera y se anade de inmediato — no hay ningun cuadro de dialogo que rellenar.
El chip llega listo para funcionar. El picoZ80 le asigna una direccion libre y un nombre, conecta todas y cada una de sus entradas, une su linea de interrupcion al procesador y lo situa en la cadena de prioridad de interrupciones. Puede anadir un contador/temporizador, no cambiar absolutamente nada, guardar, y la maquina arrancara con un temporizador montado y funcionando. Esto es deliberado — un chip a medio cablear es la forma mas habitual de acabar con un diseno que no hace nada, asi que la interfaz no le permitira crear uno.
Ajustes del Chip
Cada chip ocupa una fila. Los ajustes que normalmente tocara son:
- En — marque la casilla para montar el chip, o dejela sin marcar para excluirlo sin borrar su trabajo.
- Device — que chip es este. Pase el raton por encima para recordar lo que hace.
- Name — el nombre que usara al cablear este chip con otros. Elija algo corto y facil de recordar;
ctc0 y dma0 son los valores por defecto.
- Space — si el chip aparece en el mapa de E/S o en el mapa de memoria. Casi siempre I/O.
- Address — la primera direccion a la que responde el chip. Si la casilla se vuelve rosa, la direccion choca con la de otro chip; elija otra distinta.
- Size — cuantas direcciones ocupa. Deje el valor que eligio el picoZ80 salvo que sepa que debe ser otro.
El boton Avanzado (Advanced) revela algunos ajustes mas que solo se aplican a chips concretos. El controlador DMA tiene dos — si senaliza que ha tomado el bus, y el mayor numero de bytes que puede mover antes de devolver el control al procesador. Los chips serie y de impresora tienen un ajuste de canal USB que elige cual de los canales serie USB del picoZ80 transporta sus datos (el DART usa dos: su propio canal y el siguiente). La impresora puede capturar un byte en la escritura de datos o en un strobe de control, y puede generar una interrupcion por cada byte; el reloj puede cambiarse al modo de 12 horas; y el latch puede configurarse para leer de vuelta lo que se escribio en lugar de muestrear sus pines de entrada. Los valores por defecto son razonables y conviene dejarlos como estan hasta que tenga un motivo para cambiarlos.
No renombre un chip despues de haberlo cableado. Las conexiones se refieren al chip por su nombre y no se actualizan, asi que apareceran como ausentes. Si necesita un nombre distinto, elimine el chip y vuelva a anadirlo.
Cablear Chips Entre Si
El panel Conexiones (Connections) es el mazo de cables. Cada fila es un cable: algo excita a otra cosa. Pulse Anadir Conexion (Add Connection) para crear uno nuevo.
Elija de donde sale el cable en la lista Origen (Source) y a donde llega en la lista Destino (Destination). Ambas listas estan escritas en lenguaje llano — vera entradas como Counter / Timer (CTC) — Channel 0 output (time out) en lugar de numeros de pin. Las salidas solo aparecen como origenes y las entradas solo como destinos, de modo que no es posible conectar por error dos salidas entre si. Una entrada que ya esta excitada se muestra atenuada y marcada como (already connected) (ya conectada), porque una entrada real solo puede ser excitada por una cosa.
Hay tres tipos de conexion que puede realizar.
- Un cable directo — elija un origen y un destino y ya esta. Es el equivalente de una pista en una placa de circuito que une un chip con otro.
- Un nivel fijo — elija como origen Siempre activo (1) (Always on (1)) o Siempre inactivo (0) (Always off (0)). Es el equivalente de amarrar un pin a la linea de alimentacion o a masa, y es lo que debe hacer con cualquier entrada que el diseno no use.
- Una condicion logica — haga clic en another input (otra entrada) para anadir un segundo origen. Aparece una casilla Combinar (Combine) que ofrece Cuando ambas estan activas (When both are on (AND)), Cuando cualquiera esta activa (When either is on (OR)), Cuando no lo estan ambas (When not both are on (NAND)), Cuando ninguna esta activa (When neither is on (NOR)), Cuando exactamente una esta activa (When exactly one is on (XOR)) y Cuando ambas o ninguna (When both or neither (XNOR)). Es el equivalente de montar una pequena puerta logica entre los chips.
Junto a cada origen hay una casilla invertir (invert). Marcarla invierte esa senal, de modo que un chip que espera una entrada activa a nivel bajo puede excitarse desde una salida activa a nivel alto sin mas quebraderos de cabeza. La columna Nota (Note) es una etiqueta para su propia comodidad y no tiene ningun efecto sobre la maquina.
Si queda alguna entrada sin conectar, aparece un aviso amarillo junto a Anadir Conexion enumerandolas. No es un error — una entrada sin conectar simplemente lee su nivel de reposo — pero conectarlo todo de forma explicita hace que el diseno diga lo que usted quiso decir.
El pin de interrupcion del puerto serie 68B50 se llama IRQ, como en su hoja de datos, en lugar de INT. Las versiones de la interfaz web anteriores a la 3.58 no lo unian al procesador al anadir el chip — si las interrupciones serie no se disparan, revise el panel de Conexiones y cablee la Salida de peticion de interrupcion del 68B50 a la Peticion de interrupcion enmascarable del procesador; las versiones actuales establecen esta conexion automaticamente.
Un Ejemplo Resuelto — un DMA Habilitado por Temporizador
Supongamos que quiere un controlador DMA que mueva datos solo mientras un temporizador se lo permita, para que la transferencia no pueda monopolizar la maquina. Tres pasos:
- En Dispositivos, pulse Anadir Dispositivo y elija Counter / Timer (CTC). Pulselo de nuevo y elija Direct Memory Access (DMA). Ambos chips estan ya montados y completamente conectados.
- En Conexiones, pulse Anadir Conexion. Ponga Origen en Counter / Timer (CTC) — Channel 0 output (time out), haga clic en another input y ponga el segundo origen en Channel 1 output (time out). Ponga Combinar en Cuando ninguna esta activa (When neither is on (NOR)). Ponga Destino en Direct Memory Access (DMA) — Transfer request from the peripheral.
- Pulse Guardar Configuracion (Save Configuration).
El DMA transferira ahora solo mientras ambas salidas del temporizador esten a nivel bajo. Todo lo demas sobre la transferencia — de donde, a donde, cuantos bytes, y si mueve o busca — lo programa el software que corre en el Z80, exactamente igual que ocurriria con un chip real.
Guardar Sus Cambios
Pulse Save Configuration al pie de la pagina. Los ajustes se escriben en config.json en la tarjeta SD y el archivo anterior se conserva como copia de seguridad. Reload descarta sus ediciones y vuelve a leer el archivo de la tarjeta.
Importante: unos segundos despues de guardar, la maquina emulada se reinicia por si sola para que los chips nuevos puedan construirse. Todo lo que estuviera ejecutandose en el Z80 en ese momento se pierde, asi que guarde antes su trabajo en la maquina emulada. La pagina no le avisa de esto.
Cosas a tener en cuenta
- Cada particion tiene sus propios chips. Dispositivos y Conexiones se configuran por particion, asi que un chip montado en la Particion 1 no aparece en la Particion 2. Acuerdese de configurar la particion que realmente pretende ejecutar.
- Guardar reescribe todo el archivo de configuracion. Los comentarios se eliminan y las direcciones se reescriben en decimal. La maquina no se ve afectada, pero si mantiene un
config.json cuidadosamente anotado, guarde una copia en otro sitio antes de usar el editor grafico.
- Las direcciones que chocan no impiden guardar. La casilla de direccion se vuelve rosa pero se permite guardar. Compruebe que no haya casillas rosas antes de guardar.
- Al anadir una conexion, elija siempre el Destino de forma explicita, aunque la lista ya muestre el que usted quiere.
- Si la lista de Anadir Dispositivo esta vacia o la pagina Config GUI falta por completo, la tarjeta SD lleva una interfaz web antigua. Actualice el paquete de archivos de la tarjeta.
Los chips tambien pueden declararse a mano en
config.json mediante el
Editor de Configuracion (
Config Editor), que es la unica via para llegar a unos pocos ajustes menos habituales, como las imagenes de disco del controlador de disquete y la frecuencia de reloj del temporizador de intervalo. El formato esta documentado en la
Guia Tecnica.
Controladores e Interfaces
El picoZ80 utiliza una arquitectura de controladores modular. Cada maquina anfitriona se implementa como un controlador de personalidad que define el mapa de memoria, los handlers de E/S y los perifericos soportados. El hardware de expansion se implementa como controladores de interfaz que se conectan a una personalidad. Todos los controladores se configuran via JSON en config.json en la tarjeta SD. Los controladores de personalidad se agrupan por fabricante a continuacion.
Sharp MZ / X1 Series
Las maquinas de las series Sharp MZ y X1 son los objetivos principales del proyecto picoZ80. Cada modelo de maquina tiene un controlador de personalidad dedicado con soporte para su conjunto especifico de perifericos.
Controladores de Personalidad de Maquina
Cada controlador de personalidad emula un ordenador Sharp MZ completo. La personalidad se selecciona mediante la pagina web de
Seleccion de Personalidad o editando el campo
"name" en el array
"drivers" de
config.json.
| Persona |
Driver |
Descripcion |
| MZ-700 |
MZ700 |
Sharp MZ-700 con memoria conmutada por bancos, VRAM, E/S de teclado, 8253 PIT. La personalidad por defecto. |
| MZ-1500 |
MZ1500 |
Superset del MZ-700 con Quick Disk integrado, PCG, PSG estereo (SN76489AN), impresora Z80 PIO. |
| MZ-80K |
MZ80K |
Sharp MZ-80K con monitor SP-1002, 8253 PIT, 8255 PPI, teclado LS367, disquete nativo MZ-80FD (T3444M) y MEMSW para CP/M. Puede usar el conjunto completo de tarjetas de interfaz del MZ-80A. CP/M requiere modo virtual. |
| MZ-800 |
MZ800 |
Sharp MZ-800. Doble modo (compatible MZ-700 + graficos GDG nativos de 320/640 de ancho, 4/16 colores), PSG SN76489, FDC WD1773 + QuickDisk. Ejecuta software MZ-700 y CP/M. |
| MZ-80A |
MZ80A |
Sharp MZ-80A con monitor SA-1510, 8253 PIT, 8255 PPI, MEMSW para CP/M. |
| MZ-2000 |
MZ2000 |
Sharp MZ-2000 con ROM IPL, conmutacion de modo BST/NST, overlay de VRAM, MB8866 FDC. |
| MZ-2200 |
MZ2200 |
Sharp MZ-2200, variante del MZ-2000 con la misma arquitectura. |
| MZ-80B |
MZ80B |
Sharp MZ-80B. ROM IPL de 2K, modos BST/NST, monocromo con doble pagina GRPH, 8253 PIT, 8255 PPI, Z80 PIO. |
| MZ-2500 |
MZ2500 |
Sharp MZ-2500 (SuperMZ). MMU de 8 paginas, modos de compatibilidad MZ-2000/MZ-80B, YM2203 FM+PSG, G-CRTC, MB8876 FDC. El modo virtual soporta software controlado por interrupciones, formato de disco nativo D88 y supresion de interrupciones de un solo disparo. |
| X1 / X1 Turbo |
X1 |
Sharp X1 y X1 Turbo, ejecutados en modo fisico — la maquina real aporta memoria, video, teclado, sub-CPU y sonido. Anade unidades de disquete virtuales en tarjeta SD sobre el FDC integrado y una pletina de cassette virtual a nivel de muestra. Version inicial; vease mas abajo. |
Sharp X1 — Unidades de Disquete Virtuales
La personalidad X1 es una primera version y su alcance es deliberadamente reducido. El picoZ80 no emula el X1 en si: la maquina real aporta su propia memoria, la ROM del IPL y la BIOS, el hardware de video, el teclado y el sub-CPU, el generador de sonido y los chips integrados de contador, serie y DMA. Lo que anade el picoZ80 es el controlador de disquete integrado, de modo que las imagenes de disco guardadas en la tarjeta SD se presentan al X1 como unidades reales.
El controlador emulado es el MB8877A montado en el X1, y el propio IPL de la maquina arranca desde el sin modificacion alguna. Se soportan hasta cuatro unidades, aunque el numero realmente disponible depende de la memoria libre y suele ser de dos o tres — el registro de arranque indica cuantas se montaron. Los discos pueden ser de formato 2D (40 pistas), 2DD (80 pistas) o — en el X1 turbo — 2HD (1MB). Se aceptan imagenes de sectores en bruto, imagenes .D88 e imagenes Extended CPC .DSK, y el formato se reconoce por el contenido del archivo y no por su nombre. Las escrituras se guardan de vuelta en el archivo de imagen de la tarjeta SD.
En el X1 turbo la personalidad tambien emula la ruta DMA de disquete de la maquina, de modo que el turbo arranca CZ-8FB02 BASIC desde una imagen 1M (2HD) exactamente como lo haria desde un disco 2HD real. El DMA se monta automaticamente como dispositivo integrado cuando la pletina es Virtual — un X1 funcional no necesita cableado manual en el editor de Dispositivos — mientras que en el modo de pletina Real el propio DMA y el MB8877 de la maquina siguen emparejados. La seleccion de medios se comporta como en el hardware real: el anfitrion elige la densidad (la seleccion del menu del IPL), y una imagen 2HD informa de no-preparado hasta que se selecciona 2HD. Los discos 2D/2DD, los discos 2HD y el cassette virtual pueden usarse todos en la misma sesion.
Las imagenes se montan desde el menu Floppy de la interfaz web de la manera habitual, y pueden cambiarse o expulsarse con la maquina en marcha. El conmutador FDD Unit: Virtual / Real funciona en el X1 igual que en las maquinas MZ, devolviendo los puertos del controlador al propio hardware del X1 cuando se pone en Real y manteniendo sus imagenes cargadas listas para cuando vuelva a conmutar.
Para usarlo, seleccione Sharp X1 / Turbo en la pagina de Personalidad. Ambas particiones deben establecerse en el X1 — todavia no se contempla una configuracion mixta con otra maquina. No hacen falta archivos ROM, ya que el X1 usa los suyos. Cree un directorio dsk/X1/ en la tarjeta SD y coloque alli sus imagenes de disco; la personalidad espera drive0.2d y drive1.2d por defecto, aunque despues puede montar lo que quiera desde la interfaz web.
Sharp X1 — Pletina de Cassette Virtual
El X1 tiene su propia pletina de cassette virtual, distinta de la que usan las maquinas MZ. Funciona a nivel de muestra: una imagen de cinta del X1 es un archivo .tap, que no es un archivo de programa estructurado sino una grabacion de la propia linea de lectura del cassette, un bit por muestra. El picoZ80 simplemente vuelca esa grabacion sobre la linea de lectura de la maquina al ritmo que especifica el archivo, y muestrea de vuelta la linea de escritura en esa misma forma al grabar. Como no se descodifica ni se recodifica nada, cualquier cargador se comporta exactamente igual que con una cinta real.
Por eso la pletina del X1 es un motor distinto del de las MZ. Las cintas de las Sharp MZ se almacenan como archivos .mzf — un registro de cabecera y un cuerpo — que el picoZ80 tiene que codificar en una forma de onda. Las cintas del X1 ya son la forma de onda. Los dos formatos no son intercambiables.
Los archivos de cinta se muestrean habitualmente a 8 kHz, aunque tambien se aceptan archivos a 22,05, 24, 32, 44,1 y 48 kHz, y la frecuencia se lee del archivo. Se soportan tanto la disposicion .tap estandar como la variante sin cabecera. Los archivos suelen alcanzar varios megabytes, asi que la reproduccion se transmite en flujo desde la tarjeta SD en lugar de cargarse en memoria — una cinta larga no cuesta nada de RAM.
La pletina responde a los propios controles de transporte del X1, porque el X1 comanda su cassette a traves del sub-CPU en lugar de conmutar una linea de motor como hacen las maquinas MZ. Reproducir, parar, avance rapido, rebobinado, expulsion y grabacion funcionan todos desde el software, al igual que APSS — la busqueda automatica de programa que avanza o retrocede hasta el siguiente hueco entre grabaciones. La maquina tambien puede leer los sensores de la pletina, de modo que el software que comprueba si hay un cassette presente, si esta protegido contra escritura, o si la cinta ha llegado al final, obtendra respuestas sensatas.
Las cintas se montan desde el menu CMT de la interfaz web de la misma manera que en las maquinas MZ. Coloque sus archivos .tap en un directorio CMT/X1/ de la tarjeta SD; la personalidad carga tape0.tap por defecto. La grabacion captura la linea de escritura a 48 kHz y escribe un nuevo archivo .tap de vuelta en la tarjeta, nombrado a partir de la propia cabecera de la cinta.
Todavia no soportado en el X1
- Todo lo que no sea el controlador de disquete y la pletina de cassette. No hay emulacion de la memoria, el video, la RAM grafica, el teclado ni el sonido del X1 — todo eso lo aporta la maquina real. Un X1 totalmente virtual es un proyecto posterior.
- Hardware especifico del Turbo mas alla del subsistema de disquete. Se proporciona un unico perfil generico de X1. El DMA de disquete y los medios 2HD del Turbo estan soportados (vease arriba), pero el resto del hardware exclusivo del Turbo no esta modelado.
Controladores de Interfaz
Los controladores de interfaz se agregan a una personalidad mediante el array "if" en la configuracion JSON del controlador. Cada interfaz puede habilitarse o deshabilitarse de forma independiente y tiene su propia configuracion de ROM, imagen de disco y E/S.
| Interfaz |
JSON Name |
I/O Ports |
Descripcion |
| ROM Filing System |
RFS |
0x51–0x53, 0xC1–0xC8, 0xEFF8–0xEFFF |
Monitor mejorado con almacenamiento en tarjeta SD, arranque CP/M, gestion de bancos ROM. |
| TranZPUter Filing System |
TZFS |
0x60 (modos de memoria), 0x68 (procesador de servicio) |
Monitor multibanco + sistema de archivos CP/M para la personalidad MZ-700 (mutuamente excluyente con RFS). Arranca CP/M; las imagenes de unidad se establecen por unidad mediante los campos file de param. |
| Floppy Controller (MZ-700) |
MZ-1E05 |
0xD8–0xDE |
FDC basado en WD1773. Hasta 4 unidades. Imagenes DSK/RAW/D88. |
| Floppy Controller (MZ-80K) |
MZ80FIO |
0xF8–0xFB, 0xF000–0xF3FF |
Interfaz nativa MZ-80FD/MZ-80FIO que controla un FDC Toshiba T3444M. Sectores FM de 128 bytes, hasta 4 unidades, imagenes DSK extendidas CPC. |
| Floppy Controller (MZ-80A) |
MZ80AFI |
0xD8–0xDE, 0xF3FE–0xF3FF |
MZ-80A AFI con conmutacion A10 basada en DRQ para operacion a 2 MHz. |
| Floppy Controller (MZ-2000) |
MZ-8BFI o E0054PA |
0xD8–0xDE |
MB8866 FDC sin ROM de controlador (codigo en IPL). Soporte D88. |
| QuickDisk (con ROM) |
MZ-1E14 |
0xF4–0xF7 |
Controlador QD con BIOS ROM para MZ-700/MZ-800. |
| QuickDisk (sin ROM) |
MZ-1E19 |
0xF4–0xF7 |
Controlador QD para MZ-800/MZ-2000/MZ-2200/MZ-2500. |
| 32KB Battery RAM |
MZ-1R12 |
0xF8–0xFA |
SRAM CMOS con respaldo de bateria, persistida en tarjeta SD. Hasta 2 instancias. |
| 64KB RAM Board |
MZ-1R18 |
0xEA–0xEB |
Expansion de RAM utilizada como disco RAMFILE. |
| Kanji ROM |
MZ-1R23 |
0xB8–0xB9 |
ROM Kanji de 128KB (16x16 JIS) + ROM de diccionario opcional de 256KB. |
| 640KB EMM |
MZ-1R37 |
0xAC–0xAD |
Expanded Memory Manager con espacio de direcciones de 20 bits. |
| 320KB EMM |
PIO-3034 |
configurable |
IO DATA EMM con puerto de datos de auto-incremento. |
| Celestite LAN |
Celestite |
0x60–0x6F |
Ethernet W5100, controlador de interrupciones, UFM, MZ-1R12/MZ-1R37 integrados. IP del servidor configurable via parametro JSON ip. |
| SASI Hard Disk |
MZ-1E30 |
0xA4–0xA5, 0xA8–0xA9 |
Controlador de disco duro SASI MZ-1E30 (MZ-2500/MZ-80B). Hasta 4 discos (~21,4 MB cada uno). ROM IPL de 32KB. Imagenes de disco en tarjeta SD. |
| RS-232C Serial (BI) |
MZ-8BIO3 |
0xB0–0xB3 (configurable) |
Tarjeta RS-232C de doble canal (Z80 SIO emulado). Los canales A/B se conectan a los puertos serie USB CDC 2 y 3. Cableado de conector “BI”. |
| RS-232C Serial (ST) |
MZ-1E24 |
0xB0–0xB3 (configurable) |
Como MZ-8BIO3 pero con cableado de conector Sharp “ST”. |
TZFS y CP/M (personalidad MZ-700)
TZFS es un monitor de bajo nivel y sistema de archivos ofrecido como una interfaz seleccionable en la
personalidad MZ-700 (en la practica se usa en lugar de RFS — habilite uno u otro). Mas alla del monitor, arranca y ejecuta
CP/M. TZFS se distribuye en la configuracion del MZ-700 pero esta
desactivado por defecto: habilitelo estableciendo
"enable": 1 en el bloque de interfaz
TZFS en
config.json, o activandolo desde la pagina de Configuracion de la GUI web. Su ROM (
roms/tzfs.bin) debe estar presente en la tarjeta SD.
Las imagenes de disco CP/M se configuran
por unidad mediante el array
param de la interfaz — cada entrada
param[].file da la ruta de un archivo de imagen completa en la tarjeta SD para esa unidad. Cuando una unidad no tiene una entrada
file explicita, se usa la plantilla de ruta de reserva
CPM/SDC16M/RAW/CPMDSK<nn>.RAW. picoZ80 no tiene acceso directo a la SD, por lo que estos sectores se leen y escriben a traves del ESP32.
Arrancar un Disquete desde TZFS
Desde
TZFS v1.8.3, puede arrancar un sistema operativo de disquete en las personalidades MZ-80A, MZ-700 y MZ-800
directamente desde dentro de TZFS —
incluyendo CP/M del MZ-800. Inserte una imagen de disco arrancable en el controlador de disquete (vease
Actions → Change Floppy Disk) y arranquela desde el monitor TZFS; TZFS carga y ejecuta el propio IPL del disco exactamente como lo haria la ROM de arranque nativa de la maquina, por lo que disk BASIC, CP/M y otros sistemas operativos basados en disco arrancan normalmente.
Una vez que un sistema operativo arrancado desde disquete esta en ejecucion, pulsar el interruptor hardware
RESET del anfitrion le devuelve a
TZFS en lugar de al monitor de maquina desnudo — TZFS se restaura a si mismo y arranca en frio, por lo que siempre se le devuelve a un prompt familiar listo para cargar el siguiente programa.
Compatibilidad Personalidad–Interfaz
No todos los controladores de interfaz estan disponibles para cada personalidad. La tabla a continuacion muestra que interfaces pueden usarse con cada personalidad de maquina mediante el array "if".
| Interface |
MZ-700 |
MZ-1500 |
MZ-80K |
MZ-800 |
MZ-80A |
MZ-2000 |
MZ-2200 |
MZ-80B |
MZ-2500 |
| RFS |
Si |
Si |
Si |
Si |
Si |
Si |
— |
— |
— |
| TZFS |
Si |
— |
— |
— |
— |
— |
— |
— |
— |
| MZ-1E05 |
Si |
Si |
— |
Si |
— |
— |
— |
— |
— |
| MZ80FIO |
— |
— |
Si |
Si |
— |
— |
— |
— |
— |
| MZ80AFI |
— |
— |
Si |
Si |
Si |
— |
— |
— |
— |
| MZ-8BFI / E0054PA |
— |
— |
— |
Si |
— |
Si |
Si |
Si |
Si |
| MZ-1E14 |
Si |
Si |
Si |
Si |
— |
— |
— |
Si |
Si |
| MZ-1E19 |
Si |
Si |
Si |
Si |
— |
Si |
Si |
Si |
Si |
| MZ-1R12 |
Si |
Si |
Si |
Si |
Si |
Si |
Si |
Si |
Si |
| MZ-1R18 |
Si |
Si |
Si |
Si |
Si |
Si |
Si |
Si |
Si |
| MZ-1R23 |
— |
Si |
— |
Si |
— |
— |
— |
Si |
Si |
| MZ-1R37 |
— |
Si |
Si |
Si |
— |
— |
— |
Si |
Si |
| PIO-3034 |
— |
Si |
Si |
Si |
— |
— |
— |
Si |
Si |
| Celestite |
— |
Si |
— |
Si |
— |
— |
— |
Si |
Si |
| MZ-1E30 |
— |
— |
— |
— |
— |
— |
— |
Si |
Si |
| MZ-8BIO3 |
Si |
Si |
— |
Si |
— |
— |
— |
Si |
— |
| MZ-1E24 |
Si |
Si |
— |
Si |
— |
— |
— |
Si |
— |
Ejemplo de Configuracion JSON
El siguiente ejemplo muestra como configurar una personalidad MZ-700 con RFS, un controlador de disquete y una unidad QuickDisk. Esto se coloca en el array "drivers" dentro del bloque z80 de la particion en config.json:
"drivers": [
{
"name": "MZ700",
"enable": 1,
"type": "VIRTUAL",
"if": [
{
"name": "RFS",
"type": "VIRTUAL",
"enable": 1,
"rom": [
{
"file": "roms/MROM_PICOZ80_256.bin",
"enable": 1,
"loadaddr": [
{ "enable": 1, "position": "0x0", "addr": "0x0",
"bank": 32, "size": "0x80000", "tcycwait": 0, "tcycsync": 0 }
]
},
{
"file": "roms/USER_ROM_PICOZ80_256.bin",
"enable": 1,
"loadaddr": [
{ "enable": 1, "position": "0x0", "addr": "0x0",
"bank": 40, "size": "0x80000", "tcycwait": 0, "tcycsync": 0 }
]
}
]
},
{
"name": "MZ-1E05",
"type": "VIRTUAL",
"enable": 1,
"param": [
{ "file": "dsk/MZ-2Z009-RFS.dsk", "enable": 1 }
]
},
{
"name": "MZ-1E19",
"type": "VIRTUAL",
"enable": 1,
"param": [
{ "file": "qd/BASIC_5Z008A_RFS.qd", "enable": 1 },
{ "file": "qd/BASIC_5Z008B.qd", "enable": 1 }
]
},
{
"name": "Celestite",
"type": "VIRTUAL",
"enable": 1,
"param": [
{ "file": "ram/celestite_r12.ram", "enable": 1 },
{ "file": "ram/celestite_r37.ram", "enable": 1 },
{ "ip": "192.168.1.210:6800", "enable": 1 }
]
}
]
}
]
Configuracion de la direccion del servidor de archivos: Agregue una entrada
ip al array
param de la interfaz Celestite en
config.json, especificando la direccion IP del PC y el puerto de netfs.py:
{ "ip": "192.168.1.210:6800", "enable": 1 }
Configuracion del disco duro SASI MZ-1E30: Agregue una interfaz MZ-1E30 al array
"if" de la personalidad. La entrada
rom proporciona la ROM IPL de 32KB, y las entradas
param especifican las imagenes de disco duro (hasta 4):
{
"name": "MZ-1E30",
"type": "VIRTUAL",
"enable": 1,
"rom": [{ "file": "roms/MZ-1E30.ROM", "enable": 1 }],
"param": [
{ "file": "hdd/boot.hdd", "enable": 1 },
{ "file": "hdd/data.hdd", "enable": 1 }
]
}
Campos JSON clave:
- name — nombre de la personalidad o interfaz (debe coincidir con un controlador compilado).
- enable — establecer a 1 para activar, 0 para omitir.
- type —
"VIRTUAL" (emulado en PSRAM) o "PHYSICAL" (paso directo al hardware real).
- rom — array de imagenes ROM a cargar. Cada entrada tiene una ruta
file (relativa a la raiz de la tarjeta SD) y un array loadaddr que especifica donde colocar los datos (direccion Z80, banco PSRAM, tamano).
- param — array de archivos de imagen de disco/RAM.
param[0].file es el primer disco, param[1].file el segundo, etc.
- addrmap — remapeo de direcciones opcional (origen a destino).
- iomap — remapeo de puertos de E/S opcional.
Todas las rutas de archivo son relativas al directorio raiz de la tarjeta SD (p. ej.
"roms/MROM_PICOZ80_256.bin").
Amstrad PCW Series
El picoZ80 soporta toda la familia Amstrad PCW — el PCW-8256 y el PCW-8512 con su impresora matricial y sus unidades CF2 de 3", y el PCW-9512 con su impresora de margarita y sus unidades de 3,5" de 720K. Las dos personalidades comparten un unico nucleo de controlador: las maquinas son identicas salvo por la impresora, y la geometria de la unidad proviene de la imagen de disco, asi que elija PCW8256 para un 8256 o un 8512, y PCW9512 para un 9512.
Controladores de Personalidad de Maquina
Cada controlador de personalidad Amstrad emula una maquina Amstrad completa. La personalidad se selecciona mediante la pagina web de
Seleccion de Personalidad o editando el campo
"name" en el array
"drivers" de
config.json.
| Persona |
Driver |
Descripcion |
| PCW-8256 / PCW-8512 |
PCW8256 |
El procesador de textos CP/M original: impresora matricial y unidades CF2 de 3”. Z80A @ 4MHz, 256KB (8256) o 512KB (8512) de RAM con paginacion de 4 bancos de 16KB (puertos F0-F3), gate array (ASIC) para video/reloj del sistema/enrutamiento FDC/control de motor, NEC uPD765 FDC con soporte de formato CPC DSK, controlador de impresora matricial. Modos de controlador PHYSICAL y VIRTUAL. |
| PCW-9512 |
PCW9512 |
Amstrad PCW-9512. Z80A @ 4MHz, 512KB de RAM con paginacion de 4 bancos de 16KB (puertos F0-F3), gate array (ASIC) para video/reloj del sistema/enrutamiento FDC/control de motor, NEC uPD765 FDC con soporte de formato CPC DSK, controlador de impresora de margarita. Modos de controlador PHYSICAL y VIRTUAL. |
Ambas personalidades incluyen una emulacion completa de la secuencia de arranque: el flujo de bytes del gate array carga el BIOS, que luego carga CP/M desde disco. Los comandos del gate array incluyen fin de arranque, reinicio, enrutamiento de interrupciones FDC (NMI/INT/ignorar), terminal count y motor encendido/apagado. Las personalidades PCW suministradas ejecutan el RP2350 a 330 MHz con el nucleo a 1,20V.
Modos de Controlador — PHYSICAL y VIRTUAL
El campo
type del controlador PCW selecciona uno de dos modos, y la eleccion importa mas en esta maquina que en cualquier otra, porque el gate array del PCW media en cada acceso a memoria:
- PHYSICAL — el picoZ80 excita el bus exactamente como lo hace un Z80 real. Este es el modo autentico; la temporizacion marginal del gate array puede causar ocasionalmente pixeles sueltos en pantalla.
- VIRTUAL — la CPU se ejecuta desde una sombra interna de la memoria de la maquina mientras la pantalla y el hardware se comportan de forma identica. El resultado es estable, notablemente mas rapido (LocoScript visiblemente), inmune a las peculiaridades de la DRAM de la maquina y autorreparable: un barrido en segundo plano compara continuamente la memoria de video con la sombra y repara cualquier corrupcion, normalmente en menos de un segundo.
VIRTUAL es el modo recomendado y es el que usan las personalidades suministradas. PHYSICAL sigue disponible para quien quiera que el picoZ80 se comporte como silicio puro.
Arrancar Sin Unidad de Disquete
Con un FDC Virtual la maquina arranca CP/M o LocoScript directamente desde una imagen .dsk de la tarjeta SD — no se necesita ningun disco fisico ni una unidad de disquete en funcionamiento. Un PCW con la unidad averiada o ausente arranca y funciona por tanto con normalidad: el uPD765 virtual responde a la ROM de arranque desde el archivo de imagen, y los discos se cambian desde el menu Floppy de la interfaz web mientras la maquina esta en marcha.
Intercambio Entre Unidades Virtuales y Reales
El conmutador Floppy de la GUI web cambia el FDC entre Virtual (imagenes .dsk de la tarjeta SD) y Physical (la propia unidad de la maquina) en vivo, a mitad de sesion — el mismo conmutador de pletina Real / Virtual usado en las maquinas Sharp. Esto convierte al PCW en una herramienta de rescate de discos: arranque desde una imagen virtual en una maquina cuya unidad aun funciona, cambie a Physical y lea o copie un disco real; vuelva a cambiar y sus imagenes cargadas siguen montadas. Al cambiar a Physical el controlador acondiciona el uPD765 real (specify y recalibrate) para que el primer acceso caiga en la pista correcta aunque el arranque nunca haya tocado el controlador fisico.
Interfaces PCW
Las personalidades PCW ofrecen cuatro interfaces, que se anaden y activan desde la pagina de Configuracion GUI:
| Interface |
Descripcion |
FDC |
El controlador de disquete uPD765, que sirve imagenes DSK desde la tarjeta SD cuando esta en VIRTUAL, o pasa directamente al controlador real de la maquina cuando esta en PHYSICAL. |
PRINTER |
El puerto de impresora integrado — de margarita en el 9512, matricial en el 8256/8512. Establezca VIRTUAL para que responda como una impresora lista cuando no hay ninguna conectada, de modo que CP/M y LocoScript no se queden colgados esperando una; PHYSICAL pasa directamente a una impresora real. |
MEMORY |
Expansion de memoria servida desde la PSRAM del picoZ80, anadida por encima de la RAM propia de la maquina. Un PCW-8256 de 256KB gana hasta 1,25MB mas, que CP/M dimensiona en una unidad RAM M: mucho mayor; un 8512/9512 de 512KB gana hasta 1MB. Funciona en ambos modos de controlador. |
PAGEPROBE |
Diagnostico de una sola ejecucion que mapea empiricamente como el gate array de la maquina decodifica cada valor del registro de bancos, imprimiendo el resultado en el registro de depuracion. |
PAGEPROBE sacrifica la maquina a la medicion — el PCW no arrancara mientras este activado. Ejecutelo, capture el registro y desactivelo de nuevo.
Precision de Temporizacion
El soporte PCW se valido con un analizador logico de 500 MHz frente a un Z80 Zilog autentico montado en la misma maquina. En cada senal que excita la DRAM del PCW, los strobes de bus del picoZ80 coinciden con el silicio real dentro de ~10 nanosegundos — la mayoria dentro de 5 ns — con independencia del reloj del nucleo del RP2350. La tabla completa de mediciones y el metodo estan en la
Guia Tecnica.
Creacion de Imagenes de Disco
El picoZ80 puede crear imagenes de disquetes fisicos cuando se ejecuta con una personalidad PCW. El comando ICE
dskimage inyecta codigo Z80 que lee todas las pistas mediante el FDC del anfitrion y guarda el resultado como un archivo CPC DSK en la tarjeta SD. Consulte la
Referencia de Comandos ICE para detalles de uso.
Tatung Einstein Series
El picoZ80 soporta el Tatung Einstein TC-01 — un ordenador domestico basado en Z80A con unidad de disquete integrada.
Controladores de Personalidad de Maquina
Cada controlador de personalidad Tatung emula una maquina Tatung completa. La personalidad se selecciona mediante la pagina web de
Seleccion de Personalidad o editando el campo
"name" en el array
"drivers" de
config.json.
| Persona |
Driver |
Descripcion |
| Einstein TC-01 |
EinsteinTC01 |
Tatung Einstein TC-01. Z80A @ 4MHz, 64KB RAM + 8KB ROM conmutable (X-TAL MOS), conmutacion ROM/RAM via puerto 0x24 (cualquier acceso conmuta; las escrituras siempre van a RAM), WD1770 FDC con soporte de disco virtual (40 pistas, 1 cabeza, 10 sectores, 512 bytes — discos de 200KB), TMS9129 VDP (procesador de visualizacion de video) con aplicacion de temporizado entre accesos (~2us de separacion), AY-3-8910 PSG (sonido de 3 canales) en puertos 0x02-0x03, Z80 CTC (4 canales) en puertos 0x28-0x2B, Z80 PIO en puertos 0x30-0x33, interfaz de teclado en puerto 0x20. Creacion de imagenes de disco fisico: lectura de disquete fisico a DSK, escritura de DSK a disquete fisico. Modos virtual y fisico soportados. |
Creacion de imagenes de disco: La personalidad Einstein TC-01 soporta la creacion de imagenes de disco fisico mediante el comando ICE
dskimage con los subcomandos
read y
write.
dskimage read crea una imagen de un disquete fisico a un archivo DSK en la tarjeta SD, mientras que
dskimage write escribe un archivo DSK desde la tarjeta SD a un disquete fisico.
Otras Maquinas
El soporte para maquinas adicionales basadas en Z80 esta planificado. Cada nueva maquina seguira la misma arquitectura de controlador de personalidad — un controlador de personalidad dedicado que implementa el mapa de memoria, E/S y perifericos de la maquina, con controladores de interfaz para hardware de expansion. Consulte el repositorio del proyecto para la lista mas actualizada de maquinas soportadas.
OpenZ80 — para su propia placa o una maquina no soportada. Si esta construyendo su propia placa Z80, o tiene un ordenador Z80 que aun no dispone de una personalidad picoZ80 dedicada, use la version de firmware
OpenZ80. Su principal atractivo es que le permite agregar
tarjetas de interfaz virtuales tomadas de otras maquinas Sharp, Amstrad y Tatung a su ordenador Z80 a medida o desconocido, de modo que puede escribir nuevo software para esas tarjetas — o adaptar software existente para que funcione en su maquina. OpenZ80 se comporta como un Z80 puro: en modo
fisico transfiere todo el espacio de memoria y E/S de 64K a su placa, y en modo
virtual presenta una RAM plana de 64K en la que puede cargar sus propias imagenes ROM. Expone solo las tarjetas de interfaz agnosticas de maquina (las tarjetas de memoria MZ-1R12/1R18/1R23/1R37, la tarjeta paralela PIO-3034, las tarjetas serie RS-232C MZ-8BIO3 / MZ-1E24, la interfaz de disquete MZ-1E05 y la placa LAN Celestite), y cada una de estas puede tener su
Base I/O Port reubicado para coincidir con su placa en la pagina de Configuracion GUI. Para adaptar una de las maquinas existentes, los desarrolladores pueden tomar cualquiera de los controladores suministrados y el codigo fuente de su ROM monitor / IPL / BIOS (suministrado como ensamblador Z80 en los directorios
asm/ de los proyectos RFS y TZFS) como punto de partida — vease la
Guia del Desarrollador.
ICE (Shell de Depuracion)
El picoZ80 incluye un shell de depuracion interactivo integrado (ICE — In-Circuit Emulator) para la inspeccion y control en tiempo real de la emulacion de CPU Z80.
El shell de depuracion ICE esta incluido en la variante de firmware DBGSH. Si utiliza el firmware estandar, el shell de depuracion no esta disponible. Programe la variante DBGSH para habilitar la funcionalidad ICE.
Conexion: El shell de depuracion esta disponible en el segundo puerto serie USB. Cuando el picoZ80 esta conectado via USB, aparecen dos puertos serie en el ordenador anfitrion — el primero es la salida estandar del registro de depuracion, el segundo es el shell de depuracion. Abralo con cualquier emulador de terminal a 115200 baudios, 8N1. El prompt
dbg> aparece cuando se conecta.
Capacidades principales:
- Inspeccion de registros —
regs muestra todos los registros Z80, flags y conteo de ciclos.
- Volcado de memoria —
dm p 0000 100 vuelca 256 bytes desde la direccion 0x0000 via el bus fisico; dm v 0000 100 lee la PSRAM virtual directamente.
- Breakpoints —
bp E800 establece un breakpoint en 0xE800. Hasta 8 breakpoints. bl los lista, bc * los elimina todos.
- Ejecucion paso a paso —
hold pausa la CPU, luego step ejecuta una instruccion mostrando el estado de los registros antes/despues.
- Traza de ejecucion —
trace on graba cada instruccion ejecutada. trace dump 20 muestra las ultimas 20 con desensamblado.
- Desensamblado —
dis v E800 20 desensambla 32 instrucciones desde 0xE800.
- Acceso de E/S —
in D8 lee el puerto 0xD8; out D8 03 escribe 0x03 en el puerto 0xD8.
- Informacion del sistema —
status muestra la frecuencia de la CPU, reloj PSRAM, velocidad de emulacion y tiempo activo. drivers lista los controladores activos.
Escriba
help en el prompt para un resumen rapido.
Referencia de Comandos
El conjunto completo de comandos ICE se lista a continuacion. Todos los valores de direccion y datos se introducen en hexadecimal sin prefijo 0x.
| Command |
Parameters |
Descripcion |
| help |
— |
Mostrar un resumen de todos los comandos disponibles. |
| regs |
— |
Volcar el conjunto completo de registros Z80: registros principales (AF, BC, DE, HL), registros alternativos (AF’, BC’, DE’, HL’), registros indice (IX, IY), pila y contador de programa (SP, PC), estado de interrupciones (I, R, IM, IFF1, IFF2), flags decodificados (S, Z, H, P/V, N, C), estado de la linea HALT, MEMPTR y el conteo acumulado de ciclos T. |
| dm |
<p|f|v|r> <addr> [len] |
Volcar memoria en hexadecimal y ASCII. Cuatro modos: p (fisico) lee via el bus Z80 activando hardware real; f (fetch) lee usando ciclos de busqueda M1; v (virtual) lee PSRAM directamente sin actividad de bus; r (RP2350) lee el propio espacio de direcciones del microcontrolador (Flash, SRAM, perifericos). addr es la direccion de inicio, len es el numero de bytes (por defecto 256). |
| search |
[p|v] <start> <end> <hex..>|"text" |
Buscar en memoria un patron de bytes o cadena de texto ASCII. p = bus fisico, v = PSRAM virtual, omitir para mapeado (sigue el mapa de memoria). Especifique el patron como bytes hex (p. ej. ED 4D 00) o una cadena ASCII entre comillas (p. ej. "HELLO"). Las coincidencias se muestran con 8 bytes de contexto antes y despues. Pausa automatica de CPU para acceso fisico/mapeado. Longitud de patron hasta 32 bytes. |
| cmp |
[f] <phys> <virt> <len> |
Comparar memoria del bus fisico con PSRAM virtual. El f opcional usa ciclos de busqueda (M1) en lugar de ciclos de lectura. Reporta discrepancias con direcciones y valores. |
| dis |
[p|v] [addr] [count] |
Desensamblar codigo maquina Z80. p lee opcodes del bus fisico, v de la PSRAM virtual (por defecto). addr por defecto es el PC actual. count es el numero de instrucciones (por defecto 16). El PC actual se marca con >. |
| asm |
[addr] |
Entrar al ensamblador interactivo Z80 en addr (por defecto: PC actual). Escriba mnemonicos Z80 uno por linea; los bytes ensamblados se escriben en la PSRAM virtual y la direccion avanza. Soporta directivas db y dw/defw. Introduzca una linea vacia o . para salir. |
| memmap |
[block] |
Mostrar la tabla de punteros de bloques de memoria SRAM. Cada entrada muestra el numero de bloque, rango de direcciones Z80, tipo de memoria (PHYSICAL, RAM, ROM, FUNC), numero de banco y offset PSRAM. Si se proporciona block, mostrar solo ese bloque de 512 bytes. |
| memptr |
[addr] |
Mostrar las tablas memPtr/memioPtr de PSRAM para la direccion dada, mostrando el puntero a la funcion handler y los atributos. |
| iomap |
[port] |
Mostrar la tabla de handlers de puertos E/S. Cada entrada muestra la direccion del puerto, funcion handler y direccion (lectura/escritura/ambos). Si se proporciona port, mostrar solo ese puerto. |
| status |
— |
Vision general del estado del sistema: frecuencia de CPU del RP2350, reloj SPI de PSRAM, reloj Z80 del anfitrion, ratio de velocidad de emulacion, SRAM libre y tiempo activo. |
| ver |
— |
Mostrar version del firmware, fecha de compilacion, esquema de particiones Flash (direccion, tamano, checksum, flag activo), autor y licencia. |
| drivers |
— |
Listar todos los controladores de personalidad de maquina activos y sus sub-interfaces, mostrando el estado de inicializacion. |
| hold |
— |
Pausar la emulacion de CPU Z80. El nucleo 1 termina la instruccion actual y deja de buscar. El shell espera a que la pausa sea confirmada antes de retornar. Requerido antes de usar out u otros comandos que modifican el estado en ejecucion. |
| release |
— |
Reanudar la emulacion de CPU Z80 desde el punto en que fue pausada. Los breakpoints permanecen activos. |
| break |
— |
Detener la CPU Z80 en ejecucion y devolver el control al prompt del shell de depuracion. Alias: b. |
| go |
— |
Continuar la ejecucion (igual que release). Si posteriormente se alcanza un breakpoint, la CPU se pausara automaticamente de nuevo. |
| cont |
— |
Alias de go. Continuar la ejecucion desde el punto de pausa actual. Los breakpoints permanecen activos. |
| step |
[n] |
Ejecutar paso a paso una instruccion (o n instrucciones). Para cada paso el shell muestra el estado de los registros antes de la ejecucion, la instruccion desensamblada con bytes hex, y el estado de los registros despues de la ejecucion. La CPU debe estar pausada previamente. Si se alcanza un breakpoint durante pasos multiples, la ejecucion se detiene anticipadamente. |
| next |
[n] |
Saltar una instruccion (o n instrucciones). Como step, pero CALL y otras invocaciones de subrutina se ejecutan hasta completarse en lugar de entrar en ellas paso a paso. La CPU debe estar detenida primero. Alias: n. |
| bp |
<addr> |
Establecer un breakpoint en la direccion Z80 dada. Hasta 8 breakpoints pueden estar activos simultaneamente. Cuando el PC coincide con una direccion de breakpoint durante la busqueda de opcode, la CPU se pausa automaticamente y se reporta la coincidencia. Las direcciones duplicadas se rechazan. |
| bc |
<n|*> |
Eliminar la ranura de breakpoint n (0–7) o todos los breakpoints (*). |
| bl |
— |
Listar todos los breakpoints activos mostrando numero de ranura y direccion. |
| wm |
[p|v] <addr> <byte> [byte]... |
Escribir uno o mas bytes en memoria. p = bus fisico Z80, v = PSRAM virtual, omitir para automatico (sigue el mapa de memoria). Se pueden especificar multiples bytes separados por espacios. Pausa automatica de CPU para escrituras fisicas/mapeadas. |
| fill |
[p|v] <addr> <len> [w|d] <val> |
Rellenar una region de memoria con un valor constante. p = fisico, v = virtual, omitir para automatico. Por defecto 8 bits; w = 16 bits, d = 32 bits (little-endian). Pausa automatica de CPU cuando es necesario. |
| copy |
<pv|fp|vp> <src> <len> <dst> |
Copiar memoria entre fisico y virtual. pv = lectura fisica a virtual, fp = busqueda fisica a virtual, vp = virtual a escritura fisica. Pausa automatica de CPU. |
| memtest |
<addr> <len> [pattern] |
Probar memoria fisica con tres pasadas: escritura+lectura, escritura+busqueda, intercalada. Patron por defecto: bytes ascendentes. Reporta errores por pasada. |
| in |
<port> |
Leer un puerto de E/S Z80. Ejecuta un ciclo real de bus IORQ+RD y muestra el byte leido. |
| out |
<port> <byte> |
Escribir un byte en un puerto de E/S Z80. La CPU debe estar pausada previamente. Ejecuta un ciclo real de bus IORQ+WR. |
| trace |
<on|off|dump [n]|clear|rt|byte ...> |
Controlar la traza de ejecucion. on habilita la grabacion de cada instruccion ejecutada en un buffer circular de 512 entradas (PC, opcode, flags). off deshabilita la grabacion. dump muestra las ultimas n entradas (por defecto: todas) con desensamblado y flags decodificados. clear reinicia el buffer. rt habilita la salida de traza en tiempo real a la consola de depuracion mientras se ejecutan instrucciones. byte habilita la traza a nivel de bytes de transacciones de memoria/E/S. |
| verify |
<on|off> |
Activar/desactivar la verificacion completa de busqueda de opcodes. Cuando esta activada, cada busqueda se verifica contra readPhysicalMem (reduccion del 50% en velocidad). Cuando esta desactivada (por defecto), solo verifica opcodes 0x00/0xFF. |
| fwait |
<0-4> |
Forzar estados de espera adicionales en ciclos M1 (busqueda de opcode). <n> son 0–4 T-estados adicionales (0 = desactivado, por defecto). Util para depurar codigo que se comporta de forma diferente con estados de espera — algunos perifericos o dispositivos de memoria requieren margenes de temporizado especificos. Sin parametro, muestra la configuracion actual. |
| iowait |
<0-8> |
Forzar estados de espera adicionales en ciclos de lectura y escritura de E/S. <n> son 0–8 T-estados adicionales (0 = desactivado, por defecto). Extiende los ciclos de E/S para diagnosticar perifericos con tiempos de respuesta lentos. Sin parametro, muestra la configuracion actual. |
| corrupt |
[clear] |
Mostrar corrupciones de busqueda detectadas (PC, opcode buscado, opcode verificado). clear reinicia el registro. |
| fdctrace |
<on|off|dump> |
Habilitar, deshabilitar o volcar la traza de E/S del FDC. on/off controla la grabacion de accesos a registros del WD1773 FDC en un buffer circular de 64 entradas. dump muestra las ultimas 64 operaciones, mostrando el nombre del registro (Status/Command, Track, Sector, Data, DriveSel, SideSel, DDEN), direccion de lectura o escritura, valor del byte y estado del FDC. |
| qdtrace |
<on|off|dump> |
Habilitar, deshabilitar o volcar la traza de E/S del Quick Disk. on/off controla la grabacion de accesos a registros SIO del QD en un buffer circular de 64 entradas. dump muestra las ultimas 64 operaciones, mostrando puerto, direccion, valor del byte y posicion de la cinta (offset en bytes). |
| qdprobe |
[seconds] / eng [pace_us] |
Accionar manualmente el SIO real del Quick Disk (puertos F4/F6/F7) y mapear sus senales — motor encendido, busquedas (hunts) y eventos de sincronizacion (A = ChA RR0: b3=HDST, b4=hunt, b0=Rx; B = ChB RR0: b3=HOME). Se ejecuta durante seconds (por defecto 20, maximo 60), manteniendo detenida la CPU Z80 mientras sondea; go reanuda. qdprobe eng [pace_us] reproduce la secuencia exacta del motor QD de TZFS (init, hunt, read) con un ritmo entre accesos configurable, para validar la temporizacion del hardware real. |
| piodbg |
[clear] |
Mostrar diagnosticos del hardware PIO del RP2350 para los tres bloques PIO (PIO 0, PIO 1, PIO 2). Muestra flags de error persistentes de FDEBUG (stall, RX underflow, TX overflow), estado FSTAT, niveles de llenado del FIFO, contadores de programa por maquina de estado, mascara de habilitacion de salida GPIO y niveles de pines GPIO. clear reinicia los flags persistentes de FDEBUG. Util para diagnosticar bloqueos de maquinas de estado PIO o contenciones de bus. |
| load |
<p|v> <file> <addr> [len] [ofs] |
Cargar un archivo desde la tarjeta SD del ESP32 a la memoria Z80. p = escribir al bus fisico, v = escribir a PSRAM virtual banco 0. file es relativo a /sdcard/ en el ESP32. addr es la direccion Z80 de inicio. Si se omite len se carga el archivo completo (hasta 64KB); si se especifica, carga esa cantidad de bytes (max 1MB). El ofs opcional es el offset del archivo desde donde comenzar a leer. Pausa automatica de CPU para escrituras fisicas. Usa el banco 63 de PSRAM como buffer temporal. |
| save |
<p|pf|v> <file> <addr> <len> |
Guardar memoria Z80 a un archivo en la tarjeta SD del ESP32. p = leer via bus fisico, pf = leer via busqueda fisica (ciclos M1), v = leer desde PSRAM virtual banco 0. file es relativo a /sdcard/. addr es la direccion Z80 de inicio, len son los bytes a guardar (max 64KB). Pausa automatica de CPU para lecturas fisicas. Realiza refresco periodico de DRAM durante lecturas fisicas. |
| dir |
[path] |
Listar archivos en la tarjeta SD del ESP32. La ruta opcional es relativa a /sdcard/. Muestra nombres de archivo y tamanos. |
| echo |
[on|off] |
Activar/desactivar o establecer el eco de caracteres. Cuando esta activado (por defecto), los caracteres escritos se repiten de vuelta al terminal. |
| reset |
— |
Forzar un reinicio inmediato de la CPU Z80. La emulacion se reinicia desde el vector de reset (tipicamente 0x0000). |
| set |
<reg|flags|memmap|memptr|iomap> <idx> <val> |
Modificar un registro Z80, flags, mapa de memoria, memPtr de PSRAM o entrada del mapa de puertos de E/S en tiempo de ejecucion. reg establece un registro Z80, flags establece el registro de flags, memmap/memptr/iomap modifican la configuracion de memoria o E/S. idx es el nombre del registro o indice de la tabla (decimal o hex), val es el nuevo valor. Esto permite parchear en caliente registros y configuracion de memoria/E/S sin recargar config.json. |
| hist |
[n] |
Mostrar el buffer de historial de comandos. Muestra los ultimos n comandos (por defecto: todas las entradas, hasta 16). El historial se preserva entre ciclos de encendido via almacenamiento NVS del ESP32. |
| savehst |
— |
Forzar el guardado inmediato del historial de comandos actual al almacenamiento NVS del ESP32. El historial normalmente se guarda automaticamente en el apagado ordenado; este comando fuerza un guardado inmediato. |
| ipl |
— |
Realizar un reinicio IPL (modo BST) conmutando el bit 3 del Puerto C del 8255 PPI. Reinicia la maquina al modo de arranque sin un reinicio completo del Z80. Util para maquinas MZ-80B, MZ-2000 y MZ-2500 que distinguen entre modos BST (arranque) y NST (normal). |
| mmutrace |
— |
Volcar informacion de traza especifica de la maquina como el estado de la MMU e instantaneas de registros de E/S. La salida varia segun la personalidad — cada controlador registra su propio handler de traza, por lo que la informacion mostrada depende de la personalidad de maquina activa. |
| intcount |
— |
Mostrar el conteo de reconocimiento de interrupciones y el estado actual de las interrupciones. Util para depurar software controlado por interrupciones — muestra cuantos ciclos de reconocimiento de interrupciones han ocurrido y si las interrupciones estan actualmente pendientes o habilitadas. |
| psync |
[start end] |
Sincronizar memoria fisica a PSRAM leyendo el bus fisico y escribiendo a memoria virtual. Los parametros opcionales start y end especifican un rango de direcciones; si se omiten, se sincroniza todo el espacio de direcciones. Util para diagnosticos despues de operaciones DMA o cuando la memoria fisica y virtual pueden haber divergido. |
| dskimage |
read <filename> [cylinders] [heads] / write <filename> |
Crear imagen de un disquete fisico a un archivo DSK en la tarjeta SD (read), o escribir un archivo DSK desde la tarjeta SD a un disquete fisico (write). dskimage <filename> por defecto ejecuta read (compatible con versiones anteriores). filename es la ruta del archivo DSK relativa a /sdcard/. Si se omiten cylinders y heads para read, la geometria se autodetecta. La CPU debe estar pausada previamente. Se reporta el progreso durante la creacion de la imagen. |
| busdiag |
— |
Mostrar diagnosticos del bus incluyendo estado del PIO, niveles de senal y estado de contencion del bus. Util para diagnosticar problemas electricos con la conexion del bus del anfitrion. |
| fdcimage |
— |
Mostrar estado y progreso de la creacion de imagenes FDC. |
| fdcdiag |
— |
Mostrar informacion de diagnostico del FDC (estado del controlador, volcado de registros). |
| gadiag |
— |
Mostrar informacion de diagnostico del gate array (estado de comandos, enrutamiento de interrupciones). |
| ser |
[id] [tx <text> \| rx] |
Mostrar el estado de un dispositivo serie (68B50, 8251 o Z80 DART). tx teclea caracteres en el chip como si vinieran de un terminal conectado, rx lee de vuelta lo que la maquina envio — asi un diseno serie puede ejercitarse sin nada conectado. La inyeccion en el DART es solo por el canal A. |
| rtc |
[id] |
Mostrar los registros del reloj de tiempo real decodificados en una fecha y hora legibles. |
| prn |
[id] [dump] |
Mostrar el estado del puerto de impresora. dump muestra la cola de impresion en el shell en lugar de enviarla al canal USB. |
Flujo de trabajo de depuracion tipico:
- Conecte un terminal al segundo puerto serie USB (115200, 8N1).
hold — pausar la CPU.
regs — inspeccionar el estado actual de los registros.
dis v — desensamblar codigo en el PC actual.
bp E800 — establecer un breakpoint.
go — reanudar. La CPU se detendra cuando alcance 0xE800.
step 5 — ejecutar 5 instrucciones paso a paso desde el breakpoint.
dm v D000 80 — inspeccionar el contenido de la VRAM.
trace on / go / trace dump 50 — trazar y revisar el historial de ejecucion.
Solucion de Problemas
El ordenador anfitrion no arranca
- Verificar orientacion — asegurese de que el Pin 1 del picoZ80 se alinea con el Pin 1 del zocalo. Insertar la placa al reves danara tanto el picoZ80 como el ordenador anfitrion.
- Verificar asentamiento — retire el picoZ80 y reinsertelo, asegurandose de que los 40 pines estan completamente asentados y ninguno esta doblado debajo de la placa.
- Verificar la tarjeta SD — si
config.json falta o esta malformado, el firmware intentara usar la configuracion Flash previamente almacenada en cache. Si no existe una configuracion valida, el RP2350 no inicializara el mapa de memoria y el anfitrion vera un bus abierto.
- Confirmar que el firmware esta programado — intente conectar el picoZ80 via USB (sin insertarlo en el anfitrion) y verifique que la placa se enumera en el PC.
- Verificar la fuente de alimentacion del anfitrion — el picoZ80 puede consumir hasta 400mA del rail de 5V. Algunos ordenadores vintage tienen fuentes de alimentacion marginales; verifique el voltaje del rail de 5V bajo carga con un multimetro.
El disquete virtual se cuelga en DIR o no arranca
- Actualice el firmware — un fallo del motor WD1773 presente hasta septiembre de 2026 colgaba el MZ-2500 (modo MZ-2000) en DIR y daba un error de arranque de disco en el MZ-700: un sondeo de estado durante READ ADDRESS abortaba el comando con LOST DATA antes de que el anfitrion hubiera leido el campo ID. El firmware actual limita ese tiempo de espera a un unico READ SECTOR.
- Compruebe el modo de la pletina — una interfaz de disquete montada fisicamente arranca en modo Real; cambiela a Virtual desde el menu Floppy del Panel de Control antes de esperar que aparezcan las imagenes de la tarjeta SD.
- Compruebe el formato de la imagen — DSK, RAW y D88 se reconocen por su contenido; una imagen con la geometria incorrecta para la personalidad informa de no-preparado o de errores de lectura.
- Los problemas de reloj parecen problemas de disco — si la hora del RP2350 no esta establecida, el reloj de tiempo real MSM5832 permanece invalido; la placa obtiene la hora de pared del ESP32 (establecida por el navegador en cada carga de pagina, o desde la pasarela por SNTP) y reintenta cada 10 s.
No se puede conectar a la interfaz web
- Verificar modo WiFi — en el primer arranque o tras un restablecimiento de fabrica, el ESP32 arranca en modo AP. Conectese primero a la red WiFi
picoZ80, luego navegue a http://192.168.4.1.
- Verificar direccion IP configurada — si el modo cliente esta configurado con una IP fija, verifique que la IP coincide con la subred de su red.
- Verificar que la tarjeta SD esta presente — los recursos web en
webfs/ de la tarjeta SD son necesarios. Sin la tarjeta SD el servidor web no puede servir ninguna pagina.
- Verificar el directorio webfs — confirme que el directorio
webfs/ existe en la tarjeta SD y contiene los archivos HTML/CSS/JS del repositorio del proyecto.
- Restablecimiento de fabrica WiFi — si las credenciales se han perdido, reprograme el firmware del ESP32 para borrar los ajustes NVS y comenzar de nuevo.
Tarjeta SD no reconocida
- Asegurese de que la tarjeta SD esta formateada como FAT32. NTFS, exFAT y FAT16 no estan soportados.
- Pruebe con una tarjeta SD diferente — algunas tarjetas de alta capacidad o alta velocidad pueden tener problemas de compatibilidad con la interfaz SD SPI del ESP32.
- Las tarjetas de hasta 32GB estan bien soportadas. Las tarjetas muy grandes (>32GB) pueden requerir un formateo especial.
- Reinserte la tarjeta SD — extraigala y vuelvala a insertar para asegurar un buen contacto.
Las imagenes ROM no cargan
- Verifique que la ruta del archivo en
config.json coincide exactamente con la ubicacion del archivo en la tarjeta SD (las rutas distinguen entre mayusculas y minusculas).
- Confirme que el archivo de imagen ROM esta presente en la tarjeta SD — use el Gestor de Archivos para navegar a la ubicacion esperada.
- Verifique el valor de
fileofs — un offset incorrecto cargara datos basura en el banco ROM.
- Verifique que el campo
size en la entrada del mapa de memoria no es mayor que el archivo de imagen ROM. Los mapeos sobredimensionados se rellenaran con datos indefinidos.
La placa se reinicia inesperadamente
- El picoZ80 tiene un temporizador watchdog hardware que reinicia automaticamente el RP2350 si el firmware se bloquea durante el arranque o la operacion normal. Si la placa se reinicia repetidamente, el watchdog se esta activando porque una etapa de arranque no se completa a tiempo.
- Verificar la tarjeta SD — un
config.json faltante o corrupto puede causar que la secuencia de arranque se detenga durante el analisis de configuracion.
- Verificar los ajustes WiFi — si el ESP32 no puede establecer una conexion, el handshake SPI entre el RP2350 y el ESP32 puede expirar, activando el watchdog.
- Usar depuracion SWD — conecte una sonda de depuracion e inspeccione los registros scratch del watchdog (
watchdog_hw->scratch[5] a scratch[7]). El codigo de progreso de arranque en scratch[6] indica a que etapa llego el firmware antes de que se activara el watchdog, y scratch[0–3] contienen un historial de los ultimos cuatro intentos de reinicio.
- Verificar el registro persistente — el firmware escribe mensajes criticos de arranque en los ultimos 4KB de PSRAM usando
plogf(). Estos mensajes sobreviven al reinicio del watchdog y se vuelcan a la consola de depuracion en el siguiente arranque exitoso, revelando lo que sucedio antes del reinicio.
La actualizacion OTA falla
- Asegurese de que esta subiendo un archivo
.bin (no un .uf2) para actualizaciones OTA del RP2350.
- Asegurese de que esta subiendo a la ranura inactiva para preservar el firmware funcional.
- Si la actualizacion OTA falla o resulta en una particion que no arranca, el bootloader mantendra la ranura activa anterior en funcionamiento — repita el proceso de subida.
- Para fallos en OTA del ESP32, reprograme via
esptool usando la conexion USB del conector de depuracion.
Sitios de Referencia
Aviso Regulatorio FCC / RED
La placa picoZ80 no ha sido presentada para certificacion de radiador intencional FCC (EE.UU.) ni RED (UE). Tal como se entrega, la placa debe tener los componentes de adaptacion de antena WiFi sin poblar y el firmware del ESP32 compilado con la configuracion
NCM Only. En este estado no se emite energia de radiofrecuencia y la placa no cae bajo las regulaciones de radiadores intencionales.
Los usuarios finales que deseen usar WiFi pueden poblar la red de adaptacion de antena, compilar la variante de firmware WiFi y operar bajo la exencion de hobbista/experimental aplicable en su jurisdiccion. Cualquier parte que desee vender la placa comercialmente con WiFi habilitado debe obtener primero la certificacion FCC y/o RED para el ensamblaje completo.