pico6502

Nota: El proyecto pico6502 esta en fase de desarrollo inicial y se actualizara una vez que el picoZ80 este mas completo. La informacion a continuacion describe el diseno previsto; no todas las funcionalidades estan aun implementadas en el firmware.

Vision general

El pico6502 es el equivalente para la familia 6502 del picoZ80. Utiliza el mismo hardware de placa — un microcontrolador RP2350B, 8 MB de PSRAM, 16 MB de Flash y un coprocesador ESP32 — pero apunta al socket MOS 6502 DIP-40 en lugar del Z80. Cuando se instala en cualquier computadora basada en el 6502, el pico6502 reemplaza la CPU fisica y toma el control completo y preciso al ciclo de los buses de direcciones, datos y control del 6502 a traves de las maquinas de estado PIO del RP2350.
Al igual que el picoZ80, el pico6502 esta completamente configurado mediante JSON. Un archivo config.json en la tarjeta SD define el mapa de memoria, las imagenes ROM y los bindings de drivers. No se requiere recompilacion para adaptar la placa a un host 6502 diferente o para cambiar el layout de memoria. Toda la gestion se realiza a traves de una interfaz basada en navegador servida por el ESP32 integrado.
  • Reemplazo directo del 6502
    - se instala en cualquier socket 6502 DIP-40. El host ve un timing de bus 6502 correcto desde la interfaz PIO en todo momento.
  • Interfaz de bus PIO precisa al ciclo
    - las maquinas de estado PIO del RP2350 gestionan el reloj bifasico PHI1/PHI2 del 6502, las senales RNW, SYNC, IRQ, NMI, RDY y RESET.
  • Amplio espacio de memoria en bancos
    - 8 MB de PSRAM como 64 bancos x 64 KB, configurables en bloques de 512 bytes como tipos RAM, ROM, PHYSICAL o FUNC.
  • Framework de perifericos virtuales
    - cualquier region de memoria puede estar respaldada por una funcion handler en C, habilitando perifericos virtualizados como 6522 VIA, 6845 CRTC o I/O personalizados.
  • Carga de imagenes ROM
    - las imagenes ROM para la maquina host (BIOS, monitor, ROMs de lenguaje) se almacenan en la tarjeta SD y se cargan en la PSRAM al inicio.
  • WiFi y gestion web
    - la misma interfaz web Bootstrap de siete paginas que el picoZ80 — panel de control, editor de configuracion, gestor de archivos, seleccion de persona, actualizaciones de firmware OTA, gestor WiFi.
  • Doble particion de firmware
    - dos ranuras de firmware de 5 MB con soporte para actualizaciones OTA y conmutacion de particion gestionada por el bootloader.
  • Actualizacion de firmware USB
    - el bootloader expone un puente USB para el flasheo inicial sin depurador de hardware.
X (Twitter) vista previa del proyecto — picoZ80/pico6502 en accion

Hardware

El PCB del pico6502 (revision 2.2) es una placa compacta de 52 mm x 19 mm que comparte el mismo diseno fundamental que el picoZ80 pero lleva una interfaz de bus especifica para el 6502 en lugar de una interfaz Z80. Cuatro hojas de esquematicos cubren el procesador RP2350B, el coprocesador ESP32, la interfaz de bus 6502 y la fuente de alimentacion. El hub USB presente en el picoZ80 v2.5 no esta montado en la revision actual del pico6502. Toda la logica opera a 3,3 V, con la interfaz de bus disenada para los niveles de senal de 5 V del 6502.

Componentes principales
  • RP2350B (Cortex-M33 doble nucleo)
    - procesador principal a hasta 300 MHz. El Core 1 ejecuta el bucle principal de emulacion del 6502; el Core 0 gestiona las I/O de archivos, USB y el relay ESP32. 512 KB de SRAM en chip.
  • Flash SPI de 16 MB
    - misma disposicion que el picoZ80: bootloader, dos ranuras de aplicacion de 5 MB, dos ranuras de configuracion, configuracion general y tabla de particiones.
  • PSRAM de 8 MB (SPI)
    - 64 bancos x 64 KB de espacio de direccionamiento en bancos para el 6502 emulado. Los arrays de punteros de bloques de memoria y funciones I/O residen en la PSRAM por encima del area RAM/ROM.
  • Coprocesador ESP32
    - WiFi, tarjeta SD, servidor web. Se comunica con el RP2350 via FSPI a 50 MHz y UART a 460,8 kbaud.
  • Ranura de tarjeta SD
    - FAT32, gestionada por el ESP32. Almacena el config.json, imagenes ROM e imagenes de disco.
  • Hub USB
    - hub USB integrado para conectividad del host y actualizacion de firmware por puente USB.
  • Fuente de alimentacion 3,3 V
    - convertidor buck desde los 5 V presentes en el pin VCC del DIP-40 6502.

Diseno de la placa (KiCad)
El hardware del pico6502 esta disenado en KiCad. La revision actual es la v2.2. Los archivos de esquematicos y layout del PCB estan en el repositorio del proyecto bajo kicad/PICO6502/.
Las cuatro hojas de esquematicos son:
Hoja 1 — Procesador RP2350B
Asignaciones GPIO del RP2350B QFN-80 para el bus 6502, Flash de 16 MB, PSRAM de 8 MB y comunicaciones ESP32. El bus 6502 requiere A0-A15, D0-D7, PHI0/PHI1/PHI2, RNW, SYNC, IRQ, NMI, RDY y RESET — consumiendo la mayoria de los 48 pines GPIO del RP2350B.

pico6502 Hoja de esquematico 1 — Procesador RP2350B

Hoja 2 — Coprocesador ESP32
Modulo ESP32, interfaz de tarjeta SD, antena y comunicacion interprocesador (FSPI + UART). Funcionalmente identico al diseno del picoZ80.

pico6502 Hoja de esquematico 2 — Coprocesador ESP32

Hoja 3 — Interfaz de bus 6502
Las conexiones del socket DIP-40 y la red de resistencias de la interfaz de bus. A diferencia del Z80, el 6502 no tiene un espacio I/O separado — todos los perifericos estan mapeados en memoria. Todas las senales de direcciones, datos y control se enrutan a traves de resistencias en serie hacia los pines GPIO del RP2350 gestionados por las maquinas de estado PIO.

pico6502 Hoja de esquematico 3 — Interfaz de bus 6502

Hoja 4 — Fuente de alimentacion
Convertidor buck sincrono TLV62590BV de 5 V a 3,3 V con filtrado de entrada/salida. Se alimenta desde el pin VCC del socket DIP-40 6502.

pico6502 Hoja de esquematico 4 — Fuente de alimentacion

Archivos fuente KiCad: kicad/PICO6502/PICO6502_Schematic.pdf (PDF del esquematico) y kicad/PICO6502/ (proyecto KiCad completo).
👀 BOM interactivo — pico6502 v2.2 (visualizador de ubicacion de componentes PCB)

Arquitectura

Diseno de doble nucleo
La asignacion de nucleos del RP2350B refleja la del picoZ80:
Core 0 — puente USB, coordinacion de actualizaciones de firmware, relay de I/O de archivos hacia el ESP32, despacho de comandos UART ESP32, gestion de particiones.
Core 1 — bucle principal de emulacion del 6502. Procesa los FIFO PIO para las transacciones de bus del 6502, resuelve cada direccion contra el mapa de memoria y despacha hacia PSRAM, pass-through PHYSICAL o handlers de perifericos virtuales FUNC. El bucle interno se ejecuta desde la SRAM del RP2350 para una latencia minima.
La comunicacion inter-nucleos utiliza el mismo paso de mensajes queue_t que el picoZ80, transportando mensajes para cambios de imagenes de disquete/disco, recargas de configuracion, lectura/escritura de archivos y consultas de version de firmware.

Interfaz de bus PIO
La interfaz de bus 6502 esta implementada en M6502.pio. El RP2350 proporciona tres bloques PIO; el firmware 6502 usa los tres:
  • PIO 0 — Bus de direcciones y datos (GPIO 0-23)
    - ejecuta m6502_addr (A0-A15, GPIO 0-15) y m6502_data (D0-D7, GPIO 16-23) simultaneamente. Las palabras de direccion se envian al FIFO del Core 1; los datos se manejan o muestrean segun RNW.
  • PIO 1 — Senales de control y ejecucion de ciclo (GPIO 16-47)
    - ejecuta el secuenciador de ciclo (m6502_cycle), la captura de opcode (m6502_fetch), lectura/escritura de memoria (m6502_read, m6502_write), deteccion IRQ (m6502_irq), deteccion NMI (m6502_nmi) y deteccion Set Overflow (m6502_so).
  • PIO 2 — Generacion de reloj (GPIO 16-47)
    - ejecuta m6502_clock_6502, que genera los relojes bifasicos no superpuestos PHI1 y PHI2 desde una entrada PHI0 externa, garantizando un timing de bus 6502 correcto independientemente de la programacion del Core 1.
El conjunto completo de programas PIO en M6502.pio es:
Programa Funcion
m6502_clock_6502 Genera los relojes bifasicos PHI1/PHI2 desde PHI0 externo.
m6502_addr Emite la direccion de 16 bits (A0-A15) y senala el inicio del ciclo (IRQ 0).
m6502_data Maneja o muestrea D0-D7 (IRQ 1), con control tri-state.
m6502_irq Detecta la activacion de IRQ (flag IRQ 5).
m6502_nmi Detecta la activacion de NMI (flag IRQ 4).
m6502_so Detecta la activacion del pin Set Overflow (SO) (flag IRQ 6).
m6502_cycle Secuenciador de ciclo de bus de nivel superior; IRQ 7 senala la salida del bucle de ejecucion.
m6502_fetch Ciclo de bus de captura de opcode (PHI2 + RNW = lectura).
m6502_read Ciclo de bus de lectura de memoria.
m6502_write Ciclo de bus de escritura de memoria.
Las maquinas de estado se sincronizan a traves de flags IRQ PIO: IRQ 0 (direccion/inicio de ciclo), IRQ 1 (fase de datos), IRQ 4 (NMI), IRQ 5 (IRQ), IRQ 6 (SO), IRQ 7 (salida del bucle de ejecucion). La diferencia clave con la interfaz Z80 es el reloj bifasico del 6502 — PHI1 y PHI2 no se superponen; el bus de direcciones es valido en el flanco de subida de PHI1 y los datos se presentan o muestrean antes del flanco de bajada de PHI2. Dedicar completamente PIO 2 a la generacion de reloj significa que el timing del 6502 es siempre correcto independientemente de la actividad del Core 1.

Modelo de memoria
El modelo de memoria del 6502 es estructuralmente identico al modelo Z80 pero sin un espacio I/O separado — porque el 6502 no tiene un equivalente de IORQ, todos los registros de perifericos aparecen en el mapa de memoria de 64 KB. La misma arquitectura de tres niveles se aplica:
Nivel 1 — SRAM del RP2350: array de punteros de bloques de 128 entradas para despacho O(1) por bloque de 512 bytes.
Nivel 2 — PSRAM (8 MB): 64 bancos x 64 KB de imagenes RAM/ROM y arrays de punteros de funciones.
Nivel 3 — Flash (16 MB): firmware, imagenes ROM, JSON de configuracion minificado.
Tipos de bloques de memoria disponibles para el mapa de memoria del 6502:
Tipo Descripcion
PHYSICAL Pass-through hacia el hardware real del host.
PHYSICAL_VRAM RAM de video del host con estados de espera.
RAM Lectura/escritura — respaldada por un banco PSRAM.
ROM Solo lectura — respaldada por un banco PSRAM.
FUNC Periferico virtual — handler C llamado en cada acceso. Usado para toda la emulacion de perifericos, ya que el 6502 no tiene espacio I/O.
PTR Redireccion por byte.
Disposicion de la memoria Flash
Identico al layout del picoZ80:
Particion Rango de direcciones Tamano Contenido
Bootloader 0x10000000–0x1001FFFF 128 KB Puente USB, actualizacion firmware, selector de particion
App Slot 1 0x10020000–0x1051FFFF 5 MB Firmware principal 6502 (particion 1)
App Slot 2 0x10520000–0x10A1FFFF 5 MB Firmware principal 6502 (particion 2)
App Config 1 0x10A20000–0x10C9FFFF 2,5 MB Imagenes ROM + JSON de configuracion minificado (slot 1)
App Config 2 0x10CA0000–0x10F1FFFF 2,5 MB Imagenes ROM + JSON de configuracion minificado (slot 2)
General Config 0x10F20000–0x10FFEFFF 892 KB Configuracion principal, espacio de trabajo
Partition Table 0x10FFF000–0x11000000 4 KB Slot activo, checksums, metadatos

Instrucciones de compilacion

El pico6502 usa el mismo sistema de compilacion y estructura de directorios que el picoZ80. Por favor siga las instrucciones de compilacion del picoZ80 para el procedimiento completo de configuracion. Las diferencias especificas del pico6502 se indican a continuacion.
El firmware del pico6502 no requiere la biblioteca del emulador Zeta Z80. No se necesita ningun clon de projects/Z80.
mkdir -p <root>/projects
cd <root>/projects
git clone <tzpuPico-repo-url> tzpuPico
cd <root>
./build_tzpuPico.sh        # Compilacion release estandar
./build_tzpuPico.sh DEBUG   # Compilacion debug
./build_tzpuPico.sh ALL     # Compilacion completa incluyendo firmware ESP32

Depuracion

La depuracion del pico6502 sigue el mismo procedimiento que la seccion de Depuracion del picoZ80. Las unicas diferencias respecto al picoZ80 son el directorio de compilacion del firmware principal (BaseM6502 en lugar de BaseZ80) y la entrada add-auto-load-safe-path en ~/.gdbinit.
set history save on
set history filename ~/.gdb_history
set history size 65536
add-auto-load-safe-path build/bin/model/BaseM6502/.gdbinit:build/bin/model/Bootloader/.gdbinit

Configuracion (JSON)

El pico6502 utiliza el mismo mecanismo de configuracion JSON que el picoZ80. La seccion especifica de la CPU usa la clave "6502" (en lugar de "z80"), y dado que el 6502 no tiene un espacio I/O separado, no hay un array "io" — todos los mapeos de perifericos aparecen en el array "memory" como bloques FUNC.
{
  "esp32": {
    "core": { "device": "6502", "mode": 0 },
    "wifi": { "override": 1, "wifimode": "client", "ssid": "MyNetwork", "password": "MyPassword", "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 },
    "6502": { "memory": [ ... ], "drivers": [ ... ] }
  }
}

Interfaz web

La interfaz web del pico6502 es identica en estructura a la del picoZ80 — siete paginas Bootstrap 4 servidas por el ESP32 a http://<device-ip>/. Conectese al AP WiFi de la placa en el primer arranque, luego configure el modo cliente via el gestor WiFi para unirse a su red.
Pagina URL Funcion
Panel de control / Estado del sistema en tiempo real: procesador, dispositivo, version firmware, particion activa.
Editor de configuracion /config.htm Editor config.json en el navegador con resaltado de sintaxis y recarga sin reinicio.
Gestor de archivos /filemanager.htm Navegador de archivos de la tarjeta SD: carga, descarga, renombrar, eliminar.
Seleccion de persona /personality.htm Seleccion de la persona de maquina activa por particion de firmware.
OTA ESP32 /ota-esp32.htm Carga de firmware ESP32 via WiFi.
OTA RP2350 /ota-rp2350.htm Carga de firmware RP2350 via WiFi; visualizacion y conmutacion de particion activa.
Gestor WiFi /wifimanager.htm Configuracion de SSID WiFi, contrasena y modo (AP o cliente).
Consulte la pagina del picoZ80 para una descripcion detallada de cada pagina de la interfaz web — la implementacion del pico6502 es identica.

Sitios de referencia

La tabla a continuacion contiene todos los sitios referenciados en el diseno y programacion del pico6502.
Sitio Idioma Descripcion
RP2350 Datasheet Ingles Referencia tecnica oficial y hoja de datos del Raspberry Pi RP2350.
Pico SDK Ingles SDK C/C++ Raspberry Pi Pico — sistema de compilacion y abstraccion de hardware utilizados por el firmware del pico6502.
MOS 6502 Datasheet Ingles Hoja de datos original del MPU MOS Technology 6502 — timing de bus, descripciones de pines y caracteristicas electricas.
ESP-IDF Ingles Framework de desarrollo IoT Espressif utilizado para el firmware del coprocesador ESP32.
6502 Software Repository Ingles Repositorio comunitario de software e imagenes ROM 6502.

Restriccion de uso comercial

No se permite el uso comercial sin autorizacion escrita expresa.
El diseno de hardware del pico6502 (esquematicos, layout PCB, archivos KiCad), el firmware y todo el software asociado se ponen a disposicion exclusivamente para uso personal, educativo y no comercial. Ninguna parte de este diseno puede ser utilizada, reproducida, fabricada, vendida o incorporada en cualquier producto o servicio comercial sin la autorizacion escrita expresa del autor (Philip D. Smart).
Para solicitar una licencia comercial o discutir los usos permitidos, por favor contacte al autor a traves del sitio web eaw.app.

Agradecimientos

El proyecto pico6502 se basa en el trabajo de varios individuos y proyectos de codigo abierto. Sus contribuciones se reconocen con gratitud.
  • Manuel Sainz de Baranda y Goni
    Autor de la biblioteca de emulacion de CPU Z80 en lenguaje C Z80 (github.com/redcode/Z80), utilizada por el proyecto companero picoZ80.
  • Raspberry Pi Ltd
    Autores del Pico SDK y del hardware RP2350.
  • Espressif Systems
    Autores del framework ESP-IDF y del hardware ESP32.
  • Philip Smart
    Diseno de hardware (esquematicos KiCad y layout PCB), firmware PIO del RP2350, aplicacion web ESP32, sistema de configuracion JSON y toda la documentacion del proyecto.
  • Grok (xAI)
    Asistente de IA que proporciono ayuda valiosa durante la depuracion de las maquinas de estado PIO.
  • Claude (Anthropic)
    Asistente de IA que contribuye a este proyecto en multiples areas: redaccion y estructuracion de la documentacion del proyecto, analisis de la interfaz FSPI/UART entre RP2350 y ESP32, y asistencia continua al desarrollo del firmware.

Licencias

El proyecto pico6502 esta compuesto por varios componentes, cada uno cubierto por su propia licencia:
Componente Licencia
Firmware RP2350 del pico6502 (PIO, fuentes C)GNU General Public License v3
Firmware ESP32 del pico6502 e interfaz webGNU General Public License v3
Archivos de diseno hardware KiCad (esquematicos, PCB, Gerbers)Creative Commons BY-NC-SA 4.0
Documentacion y guias de usuarioCreative Commons BY-NC-SA 4.0
Raspberry Pi Pico SDKBSD 3-Clause
Framework ESP-IDFApache License 2.0
Bootstrap 4 (interfaz web)MIT License

Aviso regulatorio inalambrico

Este dispositivo incorpora un modulo inalambrico ESP32-S3-PICO-1 que transmite en la banda ISM de 2,4 GHz, convirtiendolo en un emisor intencional segun las regulaciones de radiofrecuencia a nivel mundial (incluyendo FCC Part 15 Subpart C en los Estados Unidos y la Directiva de Equipos de Radio 2014/53/EU en la Union Europea).
Aunque el modulo ESP32-S3-PICO-1 posee certificaciones regulatorias preexistentes (FCC, CE y otras), dichas certificaciones a nivel de modulo no se extienden automaticamente a un producto terminado que incorpora el modulo. La exencion de modulos precertificados permite a los aficionados individuales construir un numero limitado de dispositivos para uso personal, experimental o educativo sin obtener una autorizacion de equipo separada.
Limitaciones importantes
  • Los dispositivos ensamblados no deben ser vendidos, ofrecidos a la venta, regalados o distribuidos de cualquier manera a terceros a menos que el producto terminado haya sido probado independientemente y haya obtenido su propia autorizacion de equipo en la jurisdiccion correspondiente.
  • La construccion de este proyecto para uso personal en cantidades limitadas generalmente esta permitida bajo las disposiciones para aficionados y uso experimental (ej. FCC § 15.23), siempre que el dispositivo no cause interferencias daninas.
  • Los requisitos regulatorios varian segun el pais. Los constructores fuera de los Estados Unidos deben consultar con su autoridad nacional de radiofrecuencia para las reglas aplicables.
Responsabilidad del constructor
Es responsabilidad exclusiva del constructor asegurarse de que cualquier dispositivo construido a partir de estos disenos cumpla con todas las regulaciones de radiofrecuencia aplicables en su jurisdiccion. El autor proporciona estos disenos para uso personal, educativo y de aficionado y no garantiza que un dispositivo construido a partir de ellos satisfaga los requisitos regulatorios para la distribucion comercial.