pico6502 Guida Tecnica
Nota: Il progetto pico6502 e in fase di sviluppo iniziale. Hardware, interfaccia bus PIO, modello di memoria e sistema di compilazione sono completamente implementati e funzionali. I driver persona macchina sono in fase iniziale. Questa guida descrive l'architettura tecnica come esiste oggi.
Panoramica
L'architettura tecnica del pico6502 e identica a quella del picoZ80 sotto tutti gli aspetti tranne l'interfaccia bus CPU. Lo stesso processore dual-core RP2350B, il modello di memoria PSRAM, il layout Flash, il coprocessore ESP32 e il framework driver sono condivisi tra i due prodotti. Questa guida si concentra sulle differenze specifiche del 6502 e fa riferimento alla Guida tecnica del picoZ80 per gli argomenti completamente condivisi.
Architettura hardware
Schema a blocchi
┌─────────────────────────────────────────────────────────────────────────┐ │ pico6502 Board (v2.2) │ │ │ │ ┌───────────────┐ PIO 0: A0–A15, D0–D7 ┌───────────────────┐ │ │ │ │◄──────────────────────────►│ DIP-40 Interface │ │ │ │ RP2350B │ PIO 1: cycle/ctrl/irq │ (6502 socket) │ │ │ │ (300 MHz) │◄──────────────────────────►│ A0–A15, D0–D7 │ │ │ │ │ PIO 2: PHI1/PHI2 clock ──►│ PHI0/RNW/SYNC │ │ │ │ Core 0 │ │ IRQ/NMI/RDY/SO │ │ │ │ (USB/IO/ESP) │ └───────────────────┘ │ │ │ │◄──QSPI──►[ 8MB PSRAM ] │ │ │ Core 1 │◄──SPI───►[ 16MB Flash ] │ │ │ (6502 loop) │ │ │ │ │◄──FSPI──►┌───────────┐ │ │ │ │◄──UART──►│ ESP32 │◄──SPI──►[ SD Card ] │ │ └───────────────┘ │ (WiFi) │──────────[ Web Server ] │ │ └───────────┘ │ │ [ USB Hub ]──USB──►[ RP2350 USB Bridge ] │ └─────────────────────────────────────────────────────────────────────────┘
Componenti principali
| Componente | Riferimento | Specifica |
|---|---|---|
| Processore principale | RP2350B | Dual Cortex-M33, fino a 300 MHz, 512 KB SRAM, 48 GPIO |
| PSRAM | SPI PSRAM | 8 MB, interfaccia QSPI, fino a 133 MHz |
| Flash | SPI NOR Flash | 16 MB, XIP (esecuzione sul posto) |
| Coprocessore | ESP32-S3 | WiFi, scheda SD, server web, UART 460,8 kbaud verso RP2350 |
| Scheda SD | FAT32 | Immagini ROM, immagini disco, config.json, file web |
| Interfaccia bus | Rete di resistenze | Resistenze in serie per traduzione livello 5 V / 3,3 V |
| Alimentazione | TLV62590BV | Buck sincrono, 5 V (pin VCC) verso 3,3 V, alimentazione completa scheda |
| USB | Hub integrato | Bridge memoria di massa USB RP2350 per flashing firmware |
Assegnazione GPIO
Le assegnazioni GPIO seguenti sono indicative del layout tipico della scheda pico6502 v2.2. Lo schema KiCad (
kicad/PICO6502/PICO6502_Schematic.pdf) e la fonte autorevole.
| GPIO | Segnale | Direzione | Note |
|---|---|---|---|
| 0–15 | A0–A15 | Uscita | Bus indirizzi 6502 — pilotato da PIO 0 m6502_addr |
| 16–23 | D0–D7 | Bidir | Bus dati 6502 — pilotato/campionato da PIO 0 m6502_data |
| 24 | PHI0 | Ingresso | Ingresso clock esterno verso PIO 2 |
| 25 | PHI1 | Uscita | Uscita clock fase 1 — generato da PIO 2 |
| 26 | PHI2 | Uscita | Uscita clock fase 2 — generato da PIO 2 |
| 27 | RNW | Ingresso | Read/Not-Write — campionato da PIO 1 |
| 28 | SYNC | Uscita | Indicatore fetch opcode — pilotato da PIO 1 |
| 29 | IRQ | Ingresso | Interrupt mascherabile (attivo basso) — monitorato da PIO 1 |
| 30 | NMI | Ingresso | Interrupt non mascherabile (attivo basso) — monitorato da PIO 1 |
| 31 | RDY | Ingresso | Segnale Ready — campionato da PIO 1 |
| 32 | SO | Ingresso | Set Overflow — monitorato da PIO 1 |
| 33 | RESET | Bidir | Reset di sistema (attivo basso) |
| 34–39 | Flash | — | Flash SPI NOR (XIP) |
| 40–45 | PSRAM | — | PSRAM QSPI |
| 46–47 | ESP32 FSPI | — | SCLK, CS verso ESP32 |
| 48–49 | ESP32 UART | — | TX/RX 460,8 kbaud verso ESP32 |
Architettura firmware
Layout della memoria Flash
Identico al layout del picoZ80:
| Partizione | Intervallo indirizzi | Dimensione | Contenuto |
|---|---|---|---|
| Bootloader | 0x10000000–0x1001FFFF |
128 KB | Bridge USB, aggiornamento firmware, selettore partizione |
| App Slot 1 | 0x10020000–0x1051FFFF |
5 MB | Firmware principale 6502 (partizione 1) |
| App Slot 2 | 0x10520000–0x10A1FFFF |
5 MB | Firmware principale 6502 (partizione 2) |
| App Config 1 | 0x10A20000–0x10C9FFFF |
2,5 MB | Immagini ROM + JSON configurazione minificato (slot 1) |
| App Config 2 | 0x10CA0000–0x10F1FFFF |
2,5 MB | Immagini ROM + JSON configurazione minificato (slot 2) |
| General Config | 0x10F20000–0x10FFEFFF |
892 KB | Impostazioni principali, spazio di lavoro |
| Partition Table | 0x10FFF000–0x11000000 |
4 KB | Slot attivo, checksum, metadati |
Progettazione dual-core
| Core | Responsabilita |
|---|---|
| Core 0 | Bridge memoria di massa USB; gestione partizioni firmware; relay I/O file verso ESP32; dispatch comandi UART ESP32; servizio coda inter-core |
| Core 1 | Loop di emulazione bus 6502 — elabora i FIFO PIO per ogni ciclo bus, risolve gli indirizzi rispetto alla mappa di memoria, esegue dispatch verso handler PSRAM / PHYSICAL / FUNC, chiama callback poll dei driver |
Interfaccia bus PIO
L'interfaccia bus 6502 e implementata in
M6502.pio attraverso tutti e tre i blocchi PIO dell'RP2350. La differenza chiave dall'interfaccia Z80 e lo schema di clock bifase non sovrapposto del 6502: PHI0 e un ingresso di clock esterno; PIO 2 genera PHI1 e PHI2 da esso. Questo garantisce un timing bus 6502 corretto indipendentemente dalla schedulazione del Core 1.
Programmi PIO
| Blocco PIO | Programma | Macchine a stati | Funzione |
|---|---|---|---|
| PIO 0 | m6502_addr |
SM 0 | Emette indirizzo 16 bit A0-A15; segnala IRQ 0 (inizio ciclo) |
| PIO 0 | m6502_data |
SM 1 | Pilota o campiona D0-D7; segnala IRQ 1 (fase dati); controllo tri-state via RNW |
| PIO 1 | m6502_cycle |
SM 0 | Sequenziatore ciclo bus di livello superiore; IRQ 7 = uscita loop esecuzione |
| PIO 1 | m6502_fetch |
SM 1 | Ciclo fetch opcode (SYNC attivo, PHI2 alto, RNW=1) |
| PIO 1 | m6502_read |
SM 1 | Ciclo lettura memoria |
| PIO 1 | m6502_write |
SM 2 | Ciclo scrittura memoria |
| PIO 1 | m6502_irq |
SM 2 | Monitora pin IRQ; segnala PIO IRQ 5 all’asserzione |
| PIO 1 | m6502_nmi |
SM 3 | Monitora pin NMI; segnala PIO IRQ 4 all’asserzione |
| PIO 1 | m6502_so |
SM 3 | Monitora pin SO (Set Overflow); segnala PIO IRQ 6 |
| PIO 2 | m6502_clock_6502 |
SM 0 | Genera clock bifase PHI1 / PHI2 da ingresso PHI0 esterno |
Convenzioni segnali IRQ
| Flag IRQ PIO | Segnale | Attivato da | Consumato da |
|---|---|---|---|
| IRQ 0 | Inizio ciclo | m6502_addr — indirizzo valido su PHI1 |
Loop dispatch Core 1 |
| IRQ 1 | Fase dati | m6502_data — bus dati attivo |
Loop dispatch Core 1 |
| IRQ 4 | NMI | m6502_nmi — pin NMI basso |
Handler NMI Core 1 |
| IRQ 5 | IRQ | m6502_irq — pin IRQ basso |
Handler IRQ Core 1 |
| IRQ 6 | SO | m6502_so — pin SO alto |
Handler SO Core 1 |
| IRQ 7 | Uscita loop | Richiesta software | m6502_cycle — esce dal loop esecuzione |
Generazione clock PHI1 / PHI2
Il 6502 richiede due fasi di clock non sovrapposte. PIO 2 esegue il programma
m6502_clock_6502 che accetta un ingresso PHI0 esterno su un GPIO dedicato e genera PHI1 e PHI2 con il corretto timing di non sovrapposizione. Dedicare un intero blocco PIO alla generazione del clock significa che il timing bus del 6502 non e mai influenzato dall'attivita del Core 1 o dagli stalli FIFO.
Stati di attesa e RDY
Il segnale
RDY del 6502 puo essere utilizzato per inserire stati di attesa — mantenere RDY basso durante un ciclo di lettura mette in pausa il processore fino a quando RDY torna alto. Il pico6502 puo attivare RDY programmaticamente dal Core 1 per inserire stati di attesa quando si accede a periferiche virtuali piu lente (es. emulazione floppy disk). Il parametro tcycwait nella voce JSON della mappa di memoria specifica il numero di stati di attesa da inserire per una data regione di memoria.
Architettura PIO — Come vengono ricreati i cicli bus 6502
Il sottosistema I/O programmabile (PIO) dell'RP2350 ricrea un timing bus 6502 preciso al ciclo utilizzando 10 macchine a stati attraverso tutti e tre i blocchi PIO. L'architettura differisce dal PIO del picoZ80 in due modi fondamentali: il 6502 usa uno schema di clock bifase non sovrapposto (PHI1/PHI2) anziche un singolo clock, e usa un singolo segnale
Generazione clock bifase
R/W̄ (Read/Not-Write) anziche segnali /RD e /WR separati.
Il 6502 richiede due clock non sovrapposti — PHI1 e PHI2. Un segnale PHI0 esterno fornisce il riferimento; PIO 2 genera PHI1 e PHI2 da esso. La macchina a stati
m6502_clock_6502 (PIO 2 SM 0) implementa questo:
PHI0 (input): ──┐ ┌──┐ ┌──
│ │ │ │
└────────┘ └────────┘
PHI1 (output): ┌──────┐ ┌──────┐
│ │ │ │
───┘ └──────────────┘ └───
PHI2 (output): ───┐ ┌──────┐ ┌──
│ │ │ │
└──────────────┘ └──────────────┘
↑ ↑ ↑
│ │ │
PHI0 scende PHI0 sale PHI0 scende
→ breve gap → breve gap → breve gap
La SM usa
jmp pin per rilevare i fronti di PHI0 e set pins per pilotare sia PHI1 che PHI2 con i corretti gap di non sovrapposizione. L'annotazione di ritardo [1] sulla prima istruzione set pins crea il periodo di non sovrapposizione — entrambi i clock sono bassi per un breve intervallo durante le transizioni. Dedicare un intero blocco PIO alla generazione del clock garantisce che il timing bus del 6502 non sia mai influenzato dagli stalli FIFO o dalla latenza del Core 1.
Modello di memoria
Il modello di memoria del pico6502 e strutturalmente identico al modello del picoZ80 con una differenza critica: il 6502 non ha uno spazio di indirizzamento I/O separato. Non c'e un array
ioPtr[] in t_6502PSRAM e nessuna sezione JSON iomap. Tutti i registri delle periferiche sono mappati nello spazio di indirizzamento memoria da 64 KB utilizzando blocchi di tipo FUNC.
Livello 1 — SRAM dell'RP2350 (tabella dispatch rapido)
128 voci a 32 bit in
_membankPtr[], una per ogni blocco da 512 byte dello spazio di indirizzamento da 64 KB. Ogni voce codifica il tipo di blocco, il numero di banco PSRAM e l'indirizzo base del blocco in una singola parola a 32 bit per un dispatch O(1) ad ogni ciclo bus:
// Codifica membankPtr a 32 bit // Bit 31–24: costante MEMBANK_TYPE_xxx // Bit 23–16: numero banco PSRAM (0–63) // Bit 15–0: indirizzo base blocco >> 9 (cioe 7 bit superiori dell'indirizzo a 16 bit) #define MEMBANK_ENCODE(type, bank, base) (((type) << 24) | ((bank) << 16) | ((base) >> 9))
Tipi di blocchi di memoria
| Costante | Valore | Comportamento |
|---|---|---|
MEMBANK_TYPE_PHYSICAL |
0 | Pass-through verso hardware reale dell’host — RP2350 rilascia il bus |
MEMBANK_TYPE_PHYSICAL_VRAM |
1 | RAM video dell’host con stati di attesa configurabili |
MEMBANK_TYPE_RAM |
2 | Lettura/scrittura — supportata da banco PSRAM |
MEMBANK_TYPE_ROM |
3 | Sola lettura — supportata da banco PSRAM; le scritture vengono scartate silenziosamente |
MEMBANK_TYPE_VRAM |
4 | Mirror RAM video PSRAM con stati di attesa |
MEMBANK_TYPE_FUNC |
5 | Periferica virtuale — handler memioPtr[addr] chiamato ad ogni accesso |
MEMBANK_TYPE_PTR |
6 | Reindirizzamento per byte — handler memPtr[addr] usato per le letture |
Riferimento configurazione
Il pico6502 utilizza lo stesso meccanismo di configurazione JSON del picoZ80. Le chiavi di livello superiore sono
"esp32" e "rp2350". La sezione specifica CPU usa la chiave "6502" (anziche "z80"). Poiche il 6502 non ha spazio I/O non c'e un array "io" — solo un array "memory".
rp2350.6502.memory[ ]
Definisce la mappa di memoria del 6502. Tutte le periferiche devono apparire qui come voci di tipo
FUNC — non c'e una mappa I/O separata.
| Chiave | Tipo | Descrizione |
|---|---|---|
enable |
0/1 | Se questa voce e attiva. |
addr |
hex string | Indirizzo iniziale nello spazio di indirizzamento del 6502 (es. "0xE000"). |
size |
hex string | Dimensione della regione in byte (es. "0x2000"). |
type |
string | PHYSICAL, PHYSICAL_VRAM, RAM, ROM, FUNC o PTR. |
bank |
integer | Numero banco PSRAM per tipi RAM/ROM (0-63). |
tcycwait |
integer | Stati di attesa da inserire (stretching RDY) per questa regione. |
task |
string | Task/handler driver nominato per blocchi tipo FUNC. |
file |
string | Percorso scheda SD verso immagine ROM da caricare all’avvio (tipo ROM). |
Framework periferiche virtuali
Il framework periferiche virtuali e strutturalmente identico al framework del picoZ80 descritto nella Guida tecnica del picoZ80. La differenza chiave e che tutte le periferiche virtuali sono registrate in
memioPtr[] — non c'e un equivalente ioPtr[] per il 6502.
Firme degli handler
// Handler memoria / periferica — installato in memioPtr[addr] // Chiamato per ogni accesso a un blocco MEMBANK_TYPE_FUNC typedef uint8_t (*MemoryFunc)(M6502CPU *cpu, bool read, uint16_t addr, uint8_t data); // Funzione init driver — registrata in virtualFuncMap[] // Chiamata due volte: pass=0 (validazione), pass=1 (configurazione) typedef int (*VirtualFunc)(M6502CPU *cpu, t_drvConfig *drvConfig, int pass);
Consultare la Guida dello sviluppatore pico6502 per un esempio completo di lavoro inclusa un'implementazione periferica VIA6522.
Coprocessore ESP32
Il coprocessore ESP32 e identico in funzione e implementazione a quello del picoZ80 — fare riferimento alla Guida tecnica del picoZ80 — Coprocessore ESP32 per la descrizione completa dell'interfaccia scheda SD, struttura del server web e protocollo di comando RP2350-ESP32.
Debug SWD — RP2350
La configurazione del debug SWD per il pico6502 e identica a quella del picoZ80 — fare riferimento alla Guida tecnica del picoZ80 — Debug SWD per la descrizione completa. Le differenze dal picoZ80 sono:
- L'ELF del firmware principale e
build/bin/model/BaseM6502/BaseM6502_0x10020000.elf(nonBaseZ80). - La voce
add-auto-load-safe-pathin~/.gdbinitdeve referenziareBaseM6502.
Sistema di compilazione
Il sistema di compilazione e identico a quello del picoZ80 — CMake con Pico SDK 2.x che targetta l'RP2350. Il pico6502 non richiede la libreria emulatore Zeta Z80. Fare riferimento alla Guida tecnica del picoZ80 — Sistema di compilazione per la descrizione completa dei prerequisiti, la configurazione Docker per ESP-IDF e lo script di compilazione.
Target di compilazione
| Target | Output | Descrizione |
|---|---|---|
BaseM6502 |
BaseM6502_0x10020000.uf2 |
Firmware principale 6502 — indirizzo caricamento Slot 1 |
BaseM6502 |
BaseM6502_0x10520000.uf2 |
Firmware principale 6502 — indirizzo caricamento Slot 2 |
Bootloader |
Bootloader.uf2 |
Bootloader condiviso (stesso del picoZ80) |
| ESP32 | main.bin |
Firmware ESP32 (condiviso con picoZ80) |
Siti di riferimento
| Risorsa | Link |
|---|---|
| Pagina progetto pico6502 | /pico6502/ |
| Manuale utente pico6502 | /pico6502-usermanual/ |
| Guida sviluppatore pico6502 | /pico6502-developersguide/ |
| Guida tecnica picoZ80 | /picoz80-technicalguide/ |
| Pagina progetto picoZ80 | /picoz80/ |
| Scheda tecnica RP2350 | datasheets.raspberrypi.com |
| API Multicore Pico SDK | raspberrypi.github.io/pico-sdk-doxygen |
| Scheda tecnica MOS 6502 | archive.org |
| Documentazione esptool | docs.espressif.com |
| Libreria cJSON | github.com/DaveGamble/cJSON |
Avviso normativo wireless
Questo dispositivo incorpora un modulo wireless ESP32-S3-PICO-1 che trasmette nella banda ISM a 2,4 GHz, rendendolo un emettitore intenzionale secondo le normative sulle radiofrequenze a livello mondiale (incluso FCC Part 15 Subpart C negli Stati Uniti e la Direttiva Apparecchiature Radio 2014/53/EU nell'Unione Europea).
Sebbene il modulo ESP32-S3-PICO-1 stesso possieda certificazioni normative preesistenti (FCC, CE e altre), tali certificazioni a livello di modulo non si estendono automaticamente a un prodotto finito che incorpora il modulo. L'esenzione per moduli pre-certificati consente agli hobbisti individuali di costruire un numero limitato di dispositivi per uso personale, sperimentale o educativo senza ottenere un'autorizzazione separata per l'apparecchiatura.
Limitazioni importanti
E responsabilita esclusiva del costruttore assicurarsi che qualsiasi dispositivo costruito da questi design sia conforme a tutte le normative sulle radiofrequenze applicabili nella propria giurisdizione. L'autore fornisce questi design per uso personale, educativo e hobbistico e non garantisce che un dispositivo costruito da essi soddisfi i requisiti normativi per la distribuzione commerciale.
- I dispositivi assemblati non devono essere venduti, offerti in vendita, regalati o altrimenti distribuiti a terzi a meno che il prodotto finito non sia stato testato indipendentemente e abbia ottenuto la propria autorizzazione per l'apparecchiatura (es. FCC ID, marcatura CE con valutazione di un Organismo Notificato) nella giurisdizione pertinente.
- La costruzione di questo progetto per uso personale in quantita limitate e generalmente consentita in base alle disposizioni per hobbisti e uso sperimentale (es. FCC § 15.23), a condizione che il dispositivo non causi interferenze dannose.
- I requisiti normativi variano da paese a paese. I costruttori al di fuori degli Stati Uniti dovrebbero consultare la propria autorita nazionale per le radiofrequenze per le regole applicabili.
E responsabilita esclusiva del costruttore assicurarsi che qualsiasi dispositivo costruito da questi design sia conforme a tutte le normative sulle radiofrequenze applicabili nella propria giurisdizione. L'autore fornisce questi design per uso personale, educativo e hobbistico e non garantisce che un dispositivo costruito da essi soddisfi i requisiti normativi per la distribuzione commerciale.