pico6502
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.
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 elconfig.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.
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
Hoja 1 — Procesador RP2350B
kicad/PICO6502/.
Las cuatro hojas de esquematicos son:
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.

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

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.

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.

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
Interfaz de bus PIO
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.
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)
- ejecutam6502_addr(A0-A15, GPIO 0-15) ym6502_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)
- ejecutam6502_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.
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:
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. |
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 web | GNU General Public License v3 |
| Archivos de diseno hardware KiCad (esquematicos, PCB, Gerbers) | Creative Commons BY-NC-SA 4.0 |
| Documentacion y guias de usuario | Creative Commons BY-NC-SA 4.0 |
| Raspberry Pi Pico SDK | BSD 3-Clause |
| Framework ESP-IDF | Apache 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
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.
- 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.
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.