pico6502

Panoramica

Il pico6502 è l'equivalente per la famiglia 6502 del picoZ80. Utilizza esattamente lo stesso hardware della scheda — un microcontrollore RP2350B, 8 MB di PSRAM, 16 MB di Flash e un coprocessore ESP32 — ma si rivolge allo zoccolo MOS 6502 DIP-40 anziché allo Z80. Una volta installato in qualsiasi computer basato sul 6502, il pico6502 sostituisce la CPU fisica e assume il controllo completo, preciso al ciclo, dei bus di indirizzi, dati e controllo del 6502 attraverso le macchine a stati PIO dell'RP2350.
Come il picoZ80, il pico6502 è interamente configurato tramite JSON. Un file config.json sulla scheda SD definisce la mappa di memoria, le immagini ROM e i binding dei driver. Non è necessaria alcuna ricompilazione per adattare la scheda a un host 6502 diverso o per modificare il layout della memoria. Tutta la gestione avviene tramite un'interfaccia basata su browser servita dall'ESP32 integrato.
  • Sostituzione diretta del 6502
    - si installa in qualsiasi zoccolo 6502 DIP-40. Verificato in un BBC Model B e in una replica di Apple I: l'host vede un comportamento del bus da 6502 "vanilla" — scritture in un ciclo, cambi di indirizzo entro la finestra di 110–225 ns del chip reale, letture campionate sul fronte di discesa di PHI2, /IRQ sensibile al livello, /RES con antirimbalzo.
  • Motore bus PIO con fetch speculativo in pipeline
    - otto macchine a stati PIO dell'RP2350 possiedono ogni decisione di temporizzazione (generazione di PHI1/PHI2, scala degli indirizzi, dati di scrittura asserviti a R/W, un latch di lettura trasparente, monitor IRQ/NMI/SO). Con una persona macchina che dichiara la propria finestra I/O e il registro di paginazione, il motore trasmette i byte di istruzione a un ciclo host per byte, replica (shadow) e verifica ogni byte che serve, ed esegue il software del BBC Model B a pieno ritmo mentre il bus resta identico byte per byte a quello di un 6502 reale. Un host "vanilla" senza mappa dichiarata funziona comunque, ma in modo conservativo.
  • Core NMOS e CMOS
    - tutte le 151 istruzioni ufficiali più ogni opcode NMOS non documentato (incluso il gruppo JAM), con un overlay 65C02/65C12 selezionato tramite cputype: indirizzamento (zp), PHX/PHY/PLX/PLY, STZ, TSB/TRB, BRA, INC/DEC A, il JMP (abs) corretto e le colonne NOP CMOS.
  • Ampio spazio di memoria a banchi
    - 8 MB di PSRAM come 64 banchi × 64 KB, configurabili in blocchi da 512 byte come tipi RAM, ROM, PHYSICAL o FUNC.
  • Framework di periferiche virtuali
    - qualsiasi regione di memoria può essere supportata da una funzione handler in C, abilitando periferiche virtualizzate come 6522 VIA, 6845 CRTC o I/O personalizzati. Le periferiche virtuali possono asserire una linea /IRQ virtuale che il core campiona insieme al pin fisico.
  • Persona BBC Model B
    - una persona a passthrough fisico che porta con sé la conoscenza della macchina Model B (finestra I/O, finestra di scrittura shadow, paginazione ROMSEL, profondità di burst). Aggiunge 16 zoccoli sideways ROM/RAM virtuali (supportati dalla PSRAM, che seguono ROMSEL — caricano MMFS o una ROM di linguaggio da SD senza uno zoccolo fisico), uno zoccolo OS virtuale, un overlay RAM da 16K per gli host Model A, un modello di memoria BBC Master (LYNNE/HAZEL/ANDY, ACCCON virtuale) e la persistenza di CMOS/sideways RAM su SD o flash.
  • Registratore a cassette virtuale UEF
    - l'interfaccia CMT-UEF virtualizza l'ACIA 6850 e la Serial ULA del BBC e riproduce nastri UEF (anche gzippati) alla cadenza reale di 1200/300 baud attraverso la linea di interrupt virtuale; SAVE cattura il flusso in trasmissione in un nuovo UEF sulla scheda SD. Un carosello di nastri a sei slot è gestito dalla GUI web o dal comando di shell bbc tape.
  • Controller floppy virtuale — Intel 8271 o WD1770, DFS e ADFS
    - l'interfaccia BBC-FDC offre una scelta di controller, ciascuno un modello di chip indipendente dall'host scritto a partire dal suo datasheet: l'Intel 8271 nativo del Model B a $FE80 (Acorn DFS 0.90/1.20, ROM 8271 Watford e Solidisk), oppure un WD1770 dietro un latch di controllo unità come montato dalla scheda di upgrade Acorn Model B 1770, dalla scheda Watford Electronics 1770 o dal controller integrato del BBC Master 128 — con doppia densità e supporto ADFS (Acorn DFS 2.2x, DDFS, ADFS 1.3x/1.5x). Due unità a doppia faccia sono servite dalla scheda SD: immagini DFS .ssd/.dsd, immagini DDFS a doppia densità, immagini ADFS .adf (S/M/L, faccia dopo faccia) e .adl (L, interlacciate), un disco all'interno di un bundle MMB (mmb/BEEB.MMB:3), oppure due immagini a faccia singola accoppiate come le due facce di un unico disco a doppia faccia — unità DFS 0/2 e 1/3, esattamente come le distribuiscono archivi quali ACORN3_A / ACORN3_B. Il tipo di immagine è impostato per slot o dedotto da estensione e dimensione. Le scritture tornano indietro attraverso una cache a blocchi write-back; i dischi si cambiano al volo dal menu Floppy della Dashboard.
  • Scheda MMFS virtuale
    - l'interfaccia BBC-MMC colloca una scheda SD dietro la User VIA per la ROM MMFS non modificata (build user-port, non turbo): l'MMB sulla scheda del pico6502 viene presentato come BEEB.MMB su una facciata FAT16, così centinaia di dischi sono disponibili senza alcun hardware sulla user port. Caricando la stessa ROM MMFS da uno zoccolo sideways virtuale, l'intero filing system è autonomo.
  • Econet virtuale su IP
    - l'interfaccia BBC-NET è un modulo Econet virtuale — l'ADLC 68B54 a $FEA0 e i link del numero di stazione a $FE18, esattamente come li programmano le ROM NFS 3.60 / ANFS 4.x — trasportato sul collegamento di rete WiFi o USB dell'ESP32 come AUN (Acorn Universal Networking, pacchetti Econet in UDP sulla porta 32768), il protocollo usato da BeebEm e RISC OS. L'handshake Econet a quattro vie viene eseguito frame per frame con la ROM e tradotto in AUN come farebbe un bridge, così qualsiasi file server AUN serve il BBC: due demoni open-source collaudati, aund e il file server PiEconetBridge, sono inclusi in tools/econet/ con uno script di build e un file server avviabile con un solo comando. Verificato con ANFS 4.25 su una scheda in modalità Master e con NFS 3.60 e ANFS 4.18 nel simulatore.
  • Caricamento di immagini ROM
    - le immagini ROM per la macchina host (BIOS, monitor, ROM di linguaggio) sono memorizzate sulla scheda SD e caricate nella PSRAM all'avvio; la configurazione stessa viene minificata e resa persistente nella flash esattamente come sul picoZ80, così la scheda si avvia senza alcuna dipendenza dal collegamento con l'ESP32.
  • Assembler e disassembler integrati
    - un disassembler 6502 completo e un assembler a riga singola integrati nella shell di debug, che coprono tutti i 13 modi di indirizzamento e gli opcode non documentati (con prefisso *), verificati su 2048 casi di andata e ritorno.
  • Shell di debug ICE
    - la shell di debug indipendente dalla CPU condivisa con il picoZ80: 61 comandi sul 6502 (62 nella build BBC6502), inclusi diagnostica di bring-up (busdiag, busprobe, busverify, bustest, busstate), regolazioni in tempo reale del motore bus (buspipe, writestrobes, iopark, readsettle, readphase), un tabellone delle prestazioni (cpustat, cpuprof) e il comando persona bbc.
  • Simulatore host
    - pico6502sim esegue il firmware reale — le metà RP2350 ed ESP32 — in modo nativo su un PC, ora con un host BBC Model B sintetico (system VIA, matrice di tastiera, MODE 7 renderizzato su un terminale) accanto all'Apple I. I nuovi driver, come il registratore UEF, vengono collaudati qui prima di toccare l'hardware.
  • WiFi e gestione web
    - la stessa interfaccia web Bootstrap a otto pagine del picoZ80 — dashboard, GUI di configurazione strutturata, editor della configurazione raw, file manager, selezione persona, aggiornamenti firmware OTA, gestore WiFi. L'interfaccia è consapevole della CPU: con il firmware pico6502 in esecuzione mostra solo le persona e i driver 6502, nasconde i menu I/O e media dello Z80 e aggiunge clock/tensione per partizione, un pannello Bus Engine Tuning, le opzioni macchina BBC e la tabella degli zoccoli sideways.
  • Doppia partizione firmware
    - due slot firmware da 5 MB con supporto per aggiornamenti OTA e commutazione di partizione gestita dal bootloader.
  • Aggiornamento firmware via USB
    - il bootloader espone un bridge USB per il flashing iniziale senza un debugger hardware.
Anteprima del progetto su X (Twitter) — picoZ80/pico6502 in azione

Hardware

Il PCB del pico6502 è una scheda compatta di 52 mm × 19 mm che condivide lo stesso design fondamentale del picoZ80 ma monta un'interfaccia bus specifica per il 6502 anziché un'interfaccia Z80. Quattro fogli di schema coprono il processore RP2350B, il coprocessore ESP32, l'interfaccia bus 6502 e l'alimentazione. La revisione v2.2 (visibile sotto accanto a un 6502 originale e installata in una replica di Apple 1) ha dimostrato il formato meccanico e ha messo in funzione entrambi i processori, ma sbagliava la temporizzazione del bus e del clock; la riprogettazione v2.3 risponde a ciò con un'interfaccia completamente bufferizzata — buffer di indirizzi/controllo 74AHCT244, un buffer dati 74AHCT245 e percorsi di clock separati in uscita e in ritorno, così che un buffer guasto possa essere distinto da un clock assente. La v2.3a è la scheda attuale e quella collaudata nel BBC Model B e nell'Apple I; il suo schema è pico6502_v2_3a.pdf nel repository, ed è la scheda fotografata sotto, lato componenti e lato inferiore. L'hub USB presente nel picoZ80 v2.5 non è montato sulla revisione v2.2 illustrata. Tutta la logica opera a 3,3 V, con l'interfaccia bufferizzata che pilota i livelli di segnale a 5 V del 6502.

Componenti principali
  • RP2350B (Cortex-M33 dual-core)
    - processore principale, overcloccato in base alla persona: la persona BBC Model B lo fa girare a 340 MHz (la tensione dipende dalla singola scheda — 1,20 V sull'unità di riferimento; 330 MHz hanno richiesto ~1,35 V su un'altra), le persona vanilla e Apple I a 150 MHz. Il Core 1 esegue il loop caldo di emulazione del 6502; il Core 0 gestisce l'I/O su file, l'USB e il relay verso l'ESP32. 512 KB di SRAM on-chip.
  • Flash SPI da 16 MB
    - stesso layout del picoZ80: bootloader, due slot applicazione da 5 MB, due slot di configurazione, configurazione generale e tabella delle partizioni.
  • PSRAM da 8 MB (SPI)
    - 64 banchi × 64 KB di spazio di indirizzamento a banchi per il 6502 emulato. Gli array di puntatori a blocchi di memoria e gli array di puntatori a funzioni I/O risiedono nella PSRAM sopra l'area RAM/ROM.
  • Coprocessore ESP32
    - WiFi, scheda SD, server web. Comunica con l'RP2350 tramite FSPI a 60 MHz (frame IPC binari con CRC32 e validazione di opcode/sequenza) e un bridge UART a 460,8 kbaud.
  • Slot per scheda SD
    - FAT32, gestita dall'ESP32. Memorizza config.json, le immagini ROM e le immagini disco.
  • Hub USB
    - hub USB integrato per la connettività host e il bridge di aggiornamento firmware.
  • Alimentazione a 3,3 V
    - convertitore buck dai 5 V presenti sul pin VCC del DIP-40 del 6502.

Progettazione della scheda (KiCad)
L'hardware del pico6502 è progettato in KiCad. I file dello schema e del layout PCB per le revisioni v2.1 e v2.2 si trovano nel repository del progetto sotto kicad/PICO6502/; la revisione attuale è la v2.3a (pico6502_v2_3a.pdf), che aggiunge l'interfaccia bus bufferizzata descritta sopra ed è la scheda utilizzata per tutti i risultati hardware di questa pagina.
I quattro fogli di schema sono:
Foglio 1 — Processore RP2350B
Assegnazioni GPIO dell'RP2350B QFN-80 per il bus 6502, la Flash da 16 MB, la PSRAM da 8 MB e le comunicazioni con l'ESP32. Il bus 6502 richiede A0–A15, D0–D7, PHI0/PHI1/PHI2, RNW, SYNC, IRQ, NMI, RDY e RESET — consumando la maggior parte dei 48 pin GPIO dell'RP2350B.

pico6502 Foglio di schema 1 — Processore RP2350B

Foglio 2 — Coprocessore ESP32
Modulo ESP32, interfaccia scheda SD, antenna e comunicazione inter-processore (FSPI + UART). Funzionalmente identico al design del picoZ80.

pico6502 Foglio di schema 2 — Coprocessore ESP32

Foglio 3 — Interfaccia bus 6502
Le connessioni dello zoccolo DIP-40 e l'interfaccia bus. A differenza dello Z80, il 6502 non ha uno spazio I/O separato — tutte le periferiche sono mappate in memoria. Dalla v2.3 i segnali dello zoccolo passano attraverso un'interfaccia completamente bufferizzata: i buffer 74AHCT244 pilotano in uscita le linee di indirizzo e controllo, un 74AHCT245 gestisce il bus dati bidirezionale e le due fasi di clock hanno percorsi separati in uscita e in ritorno, così che il firmware possa confrontare ciò che pilota con ciò che compare effettivamente sullo zoccolo (la diagnostica busdiag clk — esattamente la distinzione che la scheda v2.2 non bufferizzata non poteva fare). Il tri-state dei buffer segue il pin DBE dello zoccolo, combinato con un override DBE_OVR pilotato dall'ESP32 (~EN = NOR(DBE, DBE_OVR)), così gli host che non pilotano DBE funzionano senza modifiche.

pico6502 Foglio di schema 3 — Interfaccia bus 6502

Foglio 4 — Alimentazione
Convertitore buck sincrono TLV62590BV da 5 V a 3,3 V con filtraggio di ingresso/uscita. Si alimenta dal pin VCC dello zoccolo DIP-40 del 6502.

pico6502 Foglio di schema 4 — Alimentazione

File sorgente KiCad: kicad/PICO6502/PICO6502_Schematic.pdf (PDF dello schema) e kicad/PICO6502/ (progetto KiCad completo).
👀 BOM interattiva — pico6502 v2.2 (visualizzatore del posizionamento dei componenti sul PCB)

Architettura

Progettazione dual-core
L'assegnazione dei core dell'RP2350B rispecchia quella del picoZ80:
Core 0 — bridge USB, coordinamento degli aggiornamenti firmware, relay dell'I/O su file verso l'ESP32, dispatch dei comandi UART dell'ESP32, gestione delle partizioni.
Core 1 — il loop caldo di emulazione del 6502. Serve i FIFO PIO per elaborare le transazioni del bus 6502, risolve ogni indirizzo rispetto alla mappa di memoria ed esegue il dispatch verso la PSRAM, il pass-through PHYSICAL o gli handler delle periferiche virtuali FUNC. Il loop interno viene eseguito dalla SRAM dell'RP2350 per una latenza minima.
La comunicazione inter-core utilizza lo stesso passaggio di messaggi queue_t del picoZ80, trasportando messaggi per i cambi di immagine floppy/disco, i ricaricamenti della configurazione, la lettura/scrittura di file e le query sulla versione del firmware.

Interfaccia bus PIO
L'interfaccia bus 6502 è implementata in M6502.pio e pilotata da M6502CPU.c. Il principio di progettazione, maturato durante il bring-up del BBC Model B, è che il PIO prende ogni decisione di temporizzazione — nessuna temporizzazione lato C interviene in un ciclo di bus. Vengono caricate otto macchine a stati distribuite sui tre blocchi PIO:
PIO SM Programma Funzione
PIO 0 0 m6502_addr Il motore degli indirizzi (v3, “ladder + gated + burst unificati”). Pilota A0–A15 e possiede R/W e SYNC. Ogni parola del FIFO è {instr:16 | ~addr:16} — la metà alta viene eseguita con out exec, così una sola parola può significare “lettura con burst di N”, “scrittura” o “ciclo singolo gated”.
PIO 0 2 m6502_latch Latch di ingresso trasparente (v4): campiona D0–D7 in continuo mentre PHI2 è alto e consegna l’ultimo stato prima del fronte di discesa — il punto in cui il sistema video del BBC prende il bus della RAM.
PIO 1 0 m6502_cycle Sequenziatore di ciclo pilotato da exec per il percorso gated (serializzato) — accessi I/O, blocchi lenti e stati di attesa RDY.
PIO 1 1 m6502_so Monitora il pin SO (PIO IRQ 6).
PIO 1 2 m6502_irq Riflette /IRQ in PIO IRQ 5; il core lo campiona a ogni istruzione con semantica a livello, come il silicio reale.
PIO 1 3 m6502_nmi Riflette /NMI in PIO IRQ 4; il Core 1 ne rileva il fronte, inizializzando lo stato precedente dalla linea reale al reset così che un livello basso preesistente non sia un fronte spurio.
PIO 2 0 m6502_clock_6502 / m6502_clock_6512 Modalità 6502: genera PHI1/PHI2 dal PHI0 dell’host. Modalità 6512: parcheggiato, l’host fornisce entrambe le fasi.
PIO 2 1 m6502_data Driver dei dati di scrittura, asservito puramente a R/W: pilota D0–D7 mentre R/W è basso e rilascia quando torna alto, così una scrittura è un ciclo con uno strobe, come su un 6502 reale.
Ogni macchina a stati del bus si sincronizza su CLK2_IN — la fase PHI2 effettivamente presente sullo zoccolo, riletta attraverso il percorso di ritorno del buffer — così lo stesso programma serve il 6502 e il 6512. I programmi m6502_fetch, m6502_read e m6502_write restano nel sorgente come sequenze di riferimento; le loro istruzioni sono ciò che la SM di ciclo esegue come parole exec. Le scritture mantengono i dati per il tHW del chip reale (~44 ns a 340 MHz) e il motore degli indirizzi cambia l'indirizzo solo dopo un autentico fronte di discesa di PHI2 seguito dal tempo di setup tADS, interrogando il proprio FIFO su una "scala" di quattro pioli così che il pilotaggio nel caso peggiore cada a ~206–215 ns — entro la finestra di cambio indirizzo di un 6502 reale. Si veda la Guida tecnica per la descrizione completa.

Modello di memoria
Il modello di memoria del 6502 è strutturalmente identico al modello Z80 ma senza uno spazio di indirizzamento I/O separato — poiché il 6502 non ha un equivalente di IORQ, tutti i registri delle periferiche compaiono nella mappa di memoria da 64 KB. Si applica la stessa architettura a tre livelli:
Livello 1 — SRAM dell'RP2350: array di puntatori a blocchi da 128 voci per un dispatch O(1) per blocco da 512 byte.
Livello 2 — PSRAM (8 MB): 64 banchi × 64 KB di immagini RAM/ROM e array di puntatori a funzioni.
Livello 3 — Flash (16 MB): firmware, immagini ROM, JSON di configurazione minificato.
Tipi di blocco di memoria disponibili per la mappa di memoria del 6502:
Tipo Descrizione
PHYSICAL Pass-through verso l’hardware reale dell’host.
PHYSICAL_VRAM RAM video dell’host con stati di attesa.
RAM Lettura/scrittura — supportata da un banco PSRAM.
ROM Sola lettura — supportata da un banco PSRAM.
PHYSICALHW Regione pass-through dichiarata come hardware dell’host (una finestra I/O). Il motore bus non specula mai al suo interno né attraverso di essa, e la destinazione configurabile di parcheggio degli indirizzi diventa guidata dalla configurazione quando una tale regione è dichiarata.
VRAM Mirror di RAM video supportato dalla PSRAM con stati di attesa.
FUNC Periferica virtuale — handler C chiamato a ogni accesso. Usato per tutta l’emulazione di periferiche, poiché il 6502 non ha uno spazio I/O.
PTR Reindirizzamento per byte.
Layout della memoria Flash
Identico al layout del picoZ80:
Partizione Intervallo di indirizzi Dimensione Contenuto
Bootloader 0x10000000–0x1001FFFF 128 KB Bridge USB, aggiornamento firmware, selettore di partizione
App Slot 1 0x10020000–0x1051FFFF 5 MB Firmware 6502 principale (partizione 1)
App Slot 2 0x10520000–0x10A1FFFF 5 MB Firmware 6502 principale (partizione 2)
App Config 1 0x10A20000–0x10C9FFFF 2,5 MB Immagini ROM + JSON di configurazione minificato (slot 1)
App Config 2 0x10CA0000–0x10F1FFFF 2,5 MB Immagini ROM + JSON di configurazione minificato (slot 2)
General Config 0x10F20000–0x10FFEFFF 892 KB Impostazioni del core, spazio scratch
Partition Table 0x10FFF000–0x11000000 4 KB Slot attivo, checksum, metadati
Da settembre 2026 il firmware 6502 memorizza la propria configurazione nella flash esattamente come fanno i modelli Z80: l'applicazione di una configurazione (Apply / ricarica nella GUI web) legge config.json dalla scheda SD, lo minifica, scrive il blob più la definizione macchina analizzata e il clock/tensione del core nella regione App Config della partizione, e riavvia — l'avvio successivo legge tutto dalla flash senza alcuna dipendenza dall'ESP32. L'opzione "persist": "flash" della persona BBC-B ricava inoltre una regione non volatile (un settore meta più 16 × slot di sideways RAM da 16K, ~260 KB per partizione) dalla coda dell'area General Config per la sua CMOS virtuale e la sideways RAM.

Motore bus e prestazioni
Il 6502 emulato è veloce solo quanto il motore bus riesce a prelevare il suo flusso di istruzioni. Il design serializzato che per primo ha fatto funzionare il BBC — un viaggio di andata e ritorno lato C per ogni operazione di bus — era corretto ma lento, e una campagna di ottimizzazione della velocità nel settembre 2026 (documentata passo per passo in PIPELINE_REDESIGN.md) lo ha sostituito con un motore in pipeline. Le tecniche, nell'ordine in cui sono state collaudate:
  • Scala degli indirizzi e regime a 1 ciclo
    - la SM degli indirizzi interroga il proprio FIFO a pioli fissi dopo ogni fronte di discesa di PHI2, così una parola accodata in tempo viene pilotata entro la finestra di cambio indirizzo del chip reale e un'operazione si completa in un singolo ciclo host senza alcuna temporizzazione C nel loop.
  • Motore di burst
    - una parola di lettura può richiedere fino a 6 indirizzi consecutivi; la SM incrementa l'indirizzo da sola (il PIO non ha un sommatore, quindi decrementa un indirizzo invertito) e i byte di istruzione fluiscono a un ciclo per byte. I byte recuperati quando un'operazione di bus interrompe il flusso vengono conservati in un buffer di raccolta (harvest buffer) e serviti ai fetch successivi senza alcuna operazione di bus.
  • Shadow e serve
    - una copia shadow write-through da 64 KB con una bitmap di validità si riempie in modo lazy dal flusso del bus (ROM inclusa, finestra I/O mai). Ogni byte estratto dal bus viene verificato rispetto alla shadow e il conteggio delle discordanze deve restare a zero — qualsiasi blocco da 256 byte che presenti anche una sola discordanza viene messo in quarantena sul percorso lento gated. Una volta dimostrato (1,38 miliardi di byte serviti con zero discordanze), serve restituisce al core i byte validi nella shadow immediatamente mentre il ciclo di bus reale è ancora in corso, così il bus resta identico byte per byte a un 6502 reale mentre il core smette di aspettarlo.
  • Scritture native e fetch fusi
    - le scritture diventano parole della scala "fire-and-forget" con una barriera di scrittura pendente e contropressione del FIFO; i fetch di opcode e operandi sono chiamate dirette inlined sotto ottimizzazione parziale a tempo di link.
  • Inseguimento I/O (I/O chase)
    - ogni accesso all'interno della finestra I/O dichiarata è seguito da una lettura di parcheggio senza cattura del vettore di reset, così un registro con effetti collaterali (i FIFO della Tube ULA, nel caso del PiCoPro) non viene mai ri-decodificato da un indirizzo mantenuto durante i cicli di inattività.
Tutto quanto sopra è condizionato dalla dichiarazione di una finestra I/O da parte della persona — senza di essa il motore resta conservativo. È ciò che fornisce il driver BBC Model B, ed è il motivo per cui selezionarlo trasforma la velocità della macchina — Elite, Aviator, Galaxians, MMFS e lunghe sessioni di soak test girano tutti senza errori, e il comando cpustat della shell riporta la frequenza emulata rispetto al clock host misurato così che i progressi possano essere monitorati man mano che il motore si sviluppa. Le regolazioni — profondità di burst, finestre I/O e di scrittura shadow, registro di paginazione, serve, pipeline — sono disponibili anche per driver dal pannello Bus Engine Tuning della GUI web e dal comando di shell buspipe, così un'altra macchina può essere messa a punto senza modifiche al firmware.

Persona macchina

Come sul picoZ80, una persona è una configurazione con nome che seleziona la mappa di memoria, le ROM e il driver per una particolare macchina host, scelta per partizione firmware dall'interfaccia web. La pagina delle persona è consapevole della CPU: con il firmware pico6502 in esecuzione offre solo le persona 6502. I file delle persona accoppiano una macchina per partizione (config_<Partition1>_<Partition2>.json), e vengono fornite tre macchine:
  • Basic6502 — "6502 vanilla"
    - il driver Open6502 senza nulla di virtualizzato; ogni ciclo di bus passa alla macchina host a 150 MHz. Questa è la persona con cui mettere in funzione una scheda nuova.
  • Apple-I — "Apple I / replica"
    - l'host Apple I / replica RC6502 sul driver Open6502. La sua PIA 6821, la RAM e la ROM monitor sono tutte sull'host, quindi nulla è virtualizzato; il monitor Woz e il BASIC girano sulla scheda v2.3a.
  • BBC-B — "BBC Model B"
    - il driver BBC-B (src/drivers/Acorn/BBCModelB.c, nella build firmware BBC6502): una persona a passthrough fisico che apporta la conoscenza della macchina Model B — finestra I/O $FC00–$FEFF, finestra di scrittura shadow $0000–$7FFF, ROMSEL a $FE30 (maschera $FFF0, decodifica parziale) che pagina $8000–$BFFF, profondità di burst 6 — come valori predefiniti che il JSON può sovrascrivere. Fa girare l'RP2350 a 340 MHz. Oltre al passthrough offre 16 zoccoli sideways ROM/RAM virtuali, uno zoccolo OS virtuale, l'overlay RAM Model A, la modalità BBC Master (che forza il core CMOS, poiché il MOS 3.x è codice 65C12), la persistenza di CMOS/sideways RAM e quattro interfacce associabili: il registratore CMT-UEF, il controller floppy virtuale BBC-FDC (Intel 8271 o WD1770 — DFS, DDFS e ADFS), la scheda MMFS virtuale BBC-MMC e il modulo Econet virtuale BBC-NET (AUN su IP).
Il driver Open6502 carica le immagini ROM configurate nelle rispettive porzioni bank:addr, contrassegna i blocchi ROM del banco 0 come sola lettura e per il resto lascia lo spazio di indirizzamento esattamente come lo definisce l'array memory della persona. I driver specifici per macchina si innestano attraverso lo stesso framework di driver delle macchine Z80; il 65C12, la shadow RAM e la paginazione del BBC Master sono gestiti oggi come una modalità del driver BBC-B, e diventerebbero un driver a sé stante come fratello.

Istruzioni di build

Il pico6502 utilizza lo stesso sistema di build e la stessa struttura di directory del picoZ80. Si prega di seguire le istruzioni di build del picoZ80 per la procedura di configurazione completa — creazione della directory radice, impostazione di PICO_PATH, esecuzione di get_and_build_sdk.sh e configurazione dell'alias Docker per ESP-IDF. Le differenze specifiche del pico6502 sono riportate di seguito.
Il firmware del pico6502 non richiede la libreria di emulazione Zeta Z80. Non è necessario alcun clone di projects/Z80 — il core della CPU 6502 (M6502.c) fa parte del progetto stesso e implementa tutte le 151 istruzioni ufficiali e tutti gli opcode non documentati.
Dallo stesso albero dei sorgenti dei modelli Z80 del picoZ80 vengono compilati due modelli 6502: Base6502 (versione 2.224 — la sostituzione vanilla del MOS 6502/6512 con il solo driver Open6502) e BBC6502 (versione 1.049 — core e valori predefiniti identici, più i driver Acorn: la persona BBC-B, il registratore UEF, il controller floppy 8271 / WD1770, la scheda MMFS e il modulo Econet). Come ogni modello Z80, ciascuno produce quattro varianti di firmware: una per partizione flash (Base6502_0x10020000, Base6502_0x10520000), ognuna con e senza la shell di debug (_DBGSH). M6502.c e M6502CPU.c sono compilati con ottimizzazione parziale a tempo di link (-flto, limiti di inlining aumentati) — parte della campagna di ottimizzazione della velocità. I nomi dei binari distribuiti riportano la versione del modello, ad es. BBC6502_0x10020000_DBGSH_1.048.bin.
Clonare il progetto
mkdir -p <root>/projects
cd <root>/projects
git clone <tzpuPico-repo-url> tzpuPico
Compilare il firmware RP2350
Si utilizza lo stesso script build_tzpuPico.sh. Assicurarsi che PICO_PATH sia impostato correttamente all'inizio dello script, quindi eseguire dalla radice:
cd <root>

# pico6502 vanilla firmware (Base6502 model) — four variants
./build_tzpuPico.sh 6502

# Debug build (includes the debug shell)
./build_tzpuPico.sh 6502 DEBUG

# BBC6502 (Base6502 + Acorn drivers) is built as part of the full
# all-models build; its binaries land in fw/bin/ beside the others
./build_tzpuPico.sh

Compilare i demoni del file server Econet
tools/econet/ include due demoni Econet-over-IP (AUN) per host Linux, mantenuti identici all'upstream così da poter essere compilati da questo albero: aund (il file server AUN di Ben Harris, licenza BSD — una directory servita come file server in stile Level 3) e econet-hpbridge (il bridge, file server e print server in spazio utente del PiEconetBridge di Chris Royle, GPLv3, compilato qui senza l'Econet HAT per Raspberry Pi così da funzionare come puro file server AUN su qualsiasi PC). build.sh verifica la presenza degli strumenti necessari e indica il pacchetto da installare quando ne manca uno; fileserver.sh avvia un server già configurato con un solo comando. Configurazione e uso sono descritti nel Manuale utente — Eseguire un file server Econet.
# Once (Debian/Ubuntu; Fedora: gcc make autoconf automake flex libxcrypt-devel openssl-devel)
sudo apt install build-essential autoconf automake flex libcrypt-dev libssl-dev

cd <root>/projects/tzpuPico
tools/econet/build.sh            # both daemons -> tools/econet/bin/aund, tools/econet/bin/econet-hpbridge
tools/econet/build.sh aund       # or just one: aund | hpbridge
tools/econet/build.sh clean

# One-command file server (builds econet-hpbridge first if needed)
tools/econet/fileserver.sh start            # station 254 on UDP 32768, serving tools/econet/fileserver/fsroot
tools/econet/fileserver.sh status | log | stop
Compilare separatamente il firmware ESP32
cd <root>/projects/tzpuPico/esp32
idf54 build
Si vedano le istruzioni di build del picoZ80 per la definizione dell'alias Docker idf54.

Flashing
La procedura di flashing è identica a quella del picoZ80 — flash iniziale dell'RP2350 tramite memoria di massa USB, flash iniziale dell'ESP32 tramite esptool e aggiornamenti successivi tramite le pagine web OTA. Si veda la sezione Flashing del picoZ80 per tutti i dettagli, incluso il comando esptool e le note sulle revisioni della scheda.

Debug

Il debug del pico6502 segue la stessa procedura della sezione Debug del picoZ80 — fare riferimento a quella per la descrizione completa delle connessioni hardware, della configurazione di OpenOCD e dell'inizializzazione globale di GDB. Le uniche differenze rispetto al picoZ80 sono la directory di build del firmware principale (Base6502 invece di BaseZ80) e la voce add-auto-load-safe-path in ~/.gdbinit.

RP2350 — Debug SWD
Collegare una sonda CMSIS-DAP a SWCLK (Pin 1), SWDIO (Pin 2) e GND (Pin 5) del connettore di debug a 6 pin. Il pico6502 utilizza lo stesso target OpenOCD personalizzato rp2350_tzpu.cfg del picoZ80 — si veda la sezione Debug del picoZ80 per il contenuto completo del file. Installarlo una volta, quindi avviare OpenOCD:
sudo cp rp2350_tzpu.cfg /usr/local/share/openocd/scripts/target/
openocd -f interface/cmsis-dap.cfg -f target/rp2350_tzpu.cfg -c "adapter speed 5000"
Aggiungere quanto segue a ~/.gdbinit (adattare i percorsi in assoluti se necessario):
set history save on
set history filename ~/.gdb_history
set history size 65536
add-auto-load-safe-path build/bin/model/Base6502/.gdbinit:build/bin/model/Bootloader/.gdbinit
Debug del bootloader
# Core 0
cd build/bin/model/Bootloader
cp ../../../../.gdbinit.bootloader.3333 .gdbinit
gdb-multiarch Bootloader.elf

# Core 1 (separate terminal)
cd build/bin/model/Bootloader
cp ../../../../.gdbinit.bootloader.3334 .gdbinit
gdb-multiarch Bootloader.elf
Debug del firmware principale
# Core 0
cd build/bin/model/Base6502
cp ../../../../.gdbinit.3333 .gdbinit
gdb-multiarch Base6502_0x10020000.elf

# Core 1 (separate terminal)
cd build/bin/model/Base6502
cp ../../../../.gdbinit.3334 .gdbinit
gdb-multiarch Base6502_0x10020000.elf

ESP32 — Debug USB
Collegare un cavo USB alla porta USB dell'ESP32 sulla scheda pico6502. L'interfaccia USB-JTAG integrata dell'ESP32-S3 non richiede alcuna sonda esterna. Avviare OpenOCD e quindi lanciare il GDB Xtensa:
openocd -f board/esp32s3-builtin.cfg
xtensa-esp32s3-elf-gdb esp32/build/main.elf
(gdb) target extended-remote :3333

Configurazione (JSON)

Il pico6502 utilizza lo stesso meccanismo di configurazione JSON del picoZ80. La chiave di primo livello è "rp2350", con una sezione "core" per i parametri operativi dell'RP2350. La sezione specifica della CPU usa la chiave "6502" (anziché "z80") e, esattamente come "z80", è un array indicizzato per partizione flash — l'indice 0 è lo slot bootloader inutilizzato, gli indici 1 e 2 configurano le due partizioni firmware. Poiché il 6502 non ha uno spazio I/O separato, non esiste un array "io" — tutte le mappature delle periferiche compaiono nell'array "memory" come blocchi di tipo FUNC. La configurazione viene letta dalla scheda SD quando viene applicata (Apply o ricarica nella GUI web), minificata e memorizzata nella flash, e la scheda si avvia poi dalla copia in flash esattamente come fa il picoZ80.
{
  "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": [
      { },
      {
        "cputype":     "6502",
        "dbeoverride": true,
        "core":        { "cpufreq": 340000000, "psramfreq": 133000000, "voltage": 1.20 },
        "memory":      [ ... ],
        "drivers":     [ ... ]
      }
    ]
  }
}
esp32 — Configurazione dell'ESP32
L'oggetto di primo livello esp32 configura il coprocessore ESP32. Contiene due sotto-oggetti: core e wifi.
esp32.core
Chiave Tipo Descrizione
device stringa Tipo di dispositivo CPU — indica all’ESP32 quale personalità di processore usare. Valori validi: "Z80" (picoZ80), "6502" (pico6502), "6512" (pico6512).
mode intero Modalità di avvio predefinita: 0 = modalità client (station), 1 = modalità Access Point. Persistente in NVS.
esp32.wifi
L'oggetto wifi inietta le credenziali WiFi e le impostazioni di rete da config.json, sovrascrivendo quanto memorizzato in NVS. Impostare override a 0 per ignorare questo blocco e affidarsi alle impostazioni NVS precedentemente salvate.
Chiave Tipo Descrizione
override 0/1 Interruttore principale. 1 = applica tutte le impostazioni sottostanti; 0 = ignora questo blocco e usa le impostazioni NVS salvate.
wifimode stringa "ap" per la modalità Access Point; "client" per la modalità client/station.
ssid stringa Nome della rete WiFi da creare (AP) o a cui connettersi (client).
password stringa Passphrase WiFi.
ip stringa Indirizzo IP fisso (ad es. "192.168.1.192").
netmask stringa Maschera di sottorete (ad es. "255.255.255.0").
gateway stringa Indirizzo del gateway predefinito.
dhcp 0/1 Solo modalità client. 1 = DHCP; 0 = usa ip/netmask/gateway fissi.
webfs stringa Sovrascrive la directory radice del filesystem web sulla scheda SD (predefinito "webfs").
persist 0/1 1 = riscrive le impostazioni risolte in NVS; 0 = applica solo per questa sessione.

core — Parametri operativi dell'RP2350
Chiave Tipo Descrizione
cpufreq intero Frequenza del clock di sistema dell’RP2350 in Hz (ad es. 340000000 per la persona BBC, 150000000 per la persona vanilla). Un avvio che si blocca sul watchdog ripiega su una modalità sicura a 150 MHz.
psramfreq intero Frequenza del clock SPI della PSRAM in Hz (ad es. 133000000 per 133 MHz).
voltage float Tensione del core dell’RP2350 (ad es. 1.20). Il margine dipende dalla singola scheda: 340 MHz girano a 1,20 V sull’unità di riferimento, 330 MHz hanno richiesto ~1,35 V su un’altra. Alzare la tensione prima di incolpare qualsiasi altra cosa.
Le stesse tre chiavi possono essere ripetute in un oggetto "core" all'interno di ciascuna voce di partizione; la GUI web memorizza lì il clock e la tensione di una partizione, e il blocco globale è solo il fallback. Entrambi vengono registrati nel log all'avvio (CFG: partition N core: ...).

6502 — Voce di partizione della CPU
Ogni voce dell'array di partizioni "6502" contiene la selezione della CPU insieme alla mappa di memoria e ai driver:
Chiave Tipo Descrizione
cputype stringa "6502", "6512", "65C02" o "65C12". 6502 e 6512 sono lo stesso processore NMOS al di sopra dei pin — registri, set di istruzioni (inclusi gli opcode non documentati) e temporizzazione dei cicli identici — e differiscono solo nel clocking: il 6502 ha il generatore di clock on-chip (PHI0 in ingresso, PHI1/PHI2 pilotati in uscita dal firmware); il 6512 non ce l’ha e riceve le fasi fornite dall’host. Le varianti C selezionano lo stesso clocking con l’overlay del set di istruzioni CMOS.
dbeoverride booleano Controlla l’override di abilitazione dei buffer DBE_OVR dell’interfaccia bufferizzata v2.3 (~EN = NOR(DBE, DBE_OVR), con DBE_OVR pilotato dall’ESP32). Le persona 6502 fornite lo impostano a true (un host 6502 non ha un pin DBE); la GUI lo disattiva per impostazione predefinita per un 6512 — si veda la Guida tecnica.
core oggetto Override per partizione di cpufreq / psramfreq / voltage (si veda sopra).
ioparkaddr stringa esadecimale Indirizzo su cui il motore bus si parcheggia dopo un accesso I/O quando il parcheggio degli indirizzi è abilitato. Il valore predefinito è 0xFFFC (il vettore di reset — ROM mappata su qualsiasi 6502 avviabile) una volta dichiarata una regione PHYSICALHW.
memory array La mappa di memoria — si veda sotto.
drivers array Voci dei driver, ciascuna opzionalmente con immagini ROM, override della messa a punto del motore bus e opzioni macchina — si veda sotto.

memory — Mappa di memoria
Poiché il 6502 è un'architettura con I/O mappato in memoria, tutte le periferiche compaiono nell'array memory. Usare il tipo FUNC per qualsiasi intervallo di indirizzi che corrisponde a un handler di periferica virtuale.
Chiave Tipo Descrizione
enable 0/1 Se questa voce è attiva.
addr stringa esadecimale Indirizzo iniziale nello spazio di indirizzamento del 6502.
size stringa esadecimale Dimensione della regione.
type stringa PHYSICAL, PHYSICALVRAM, PHYSICALHW, RAM, VRAM, ROM, FUNC.
bank intero Numero del banco PSRAM per i tipi RAM/ROM.
task stringa Identificatore di task opzionale: COPYTOPHYSICAL / COPYTORAM copiano la regione tra la memoria dell’host e la PSRAM all’inizializzazione.
file stringa Percorso sulla scheda SD di un’immagine ROM da caricare all’avvio.
"memory": [
  {
    "enable": 1,
    "addr":   "0xE000",
    "size":   "0x2000",
    "type":   "ROM",
    "bank":   0,
    "task":   "",
    "file":   "/ROM/host_bios.rom"
  },
  {
    "enable": 1,
    "addr":   "0x0000",
    "size":   "0xE000",
    "type":   "RAM",
    "bank":   0,
    "task":   "",
    "file":   ""
  },
  {
    "enable": 1,
    "addr":   "0xC000",
    "size":   "0x0010",
    "type":   "FUNC",
    "bank":   0,
    "task":   "via6522",
    "file":   ""
  }
]

drivers — Driver macchina, caricatori ROM e messa a punto del bus
Ogni voce driver seleziona un driver macchina per nome (Open6502 o BBC-B), carica opzionalmente immagini ROM nella PSRAM all'avvio e può sovrascrivere la messa a punto del motore bus che il driver applica come propri valori predefiniti. Non esistono sotto-tabelle di rimappatura degli indirizzi o dell'I/O; tutto il layout della memoria è definito nell'array memory. La conoscenza della macchina appartiene al driver: i valori predefiniti del driver BBC-B si applicano quando viene selezionato, e qualsiasi chiave di messa a punto tra quelle sottostanti posta nell'oggetto driver li sovrascrive (il pannello Bus Engine Tuning della GUI web scrive esattamente queste chiavi, e solo quelle impostate).
Chiave Tipo Descrizione
enable 0/1 Se questa voce driver è attiva.
name stringa Nome del driver, confrontato senza distinzione tra maiuscole e minuscole con la tabella dei driver del firmware: Open6502, BBC-B.
rom array Immagini ROM da caricare nella PSRAM all’avvio.
ioregionlo / ioregionhi intero La finestra I/O dell’host. Dichiararla è ciò che abilita la speculazione — il motore non esegue mai burst al suo interno o attraverso di essa. (Predefinito BBC-B 0xFC00–0xFF00.)
shadowwrlo / shadowwrhi intero Intervallo di indirizzi di cui questa CPU è l’unico scrittore, mantenuto come shadow write-through; le scritture al di fuori di esso invalidano soltanto (la sideways ROM ignora le scritture). (Predefinito BBC-B 0x0000–0x8000.)
pageregaddr / pageregmask intero Il registro di paginazione e la sua maschera di decodifica; una scrittura su di esso invalida la regione paginata. (BBC-B: ROMSEL 0xFE30, maschera 0xFFF0.)
pageregionlo / pageregionhi intero La regione commutata a banchi dal registro di paginazione. (Predefinito BBC-B 0x8000–0xC000.)
burstspec 1–6 Profondità del burst speculativo di opcode. (Predefinito BBC-B 6, sicuro per MMFS una volta dichiarato ROMSEL.)
busserve / buspipe / fastfetch booleano Override a tre stati (assente = predefinito del driver) per il serve dalla shadow, il percorso di emissione in pipeline e il fetch rapido degli opcode.
Il driver BBC-B accetta inoltre le proprie opzioni macchina nello stesso oggetto:
Chiave Tipo Descrizione
modelaram booleano Host Model A: sovrappone 16K di RAM supportata dalla PSRAM a $4000–$7FFF così che l’OS veda una macchina da 32K (spazio programmi/dati; il comportamento dello schermo su un Model A è ancora da verificare).
mastermode booleano Modello di memoria del BBC Master 128 — shadow LYNNE da 20K, HAZEL da 8K, ANDY da 4K, con ACCCON ($FE34) virtualizzato. Si aspetta un’immagine MOS 3.x nello zoccolo OS e forza il core CMOS.
ossocket oggetto { "enable", "file", "fileoffset" } — una ROM OS da 16K virtualizzata su $C000–$FFFF; la finestra I/O passa sempre al bus e i vettori $FF00–$FFFF provengono dall’immagine. fileoffset seleziona l’OS all’interno di un’immagine più grande (MegaROM).
sockets array { "socket" 0–15, "enable", "ram", "file", "fileoffset", "persist" } — zoccoli sideways ROM/RAM virtuali. Uno zoccolo abilitato sovrascrive il banco fisico: ram: true è sideways RAM da 16K, altrimenti file è un’immagine ROM da 16K. La scrittura su ROMSEL raggiunge comunque il latch hardware.
presetdiscroms booleano Riempie i banchi 9 (DFS) e 13 (ADFS) da una MegaROM del Master.
persist stringa "sd" (predefinito), "flash" o "off" — dove vengono salvati i contenuti della CMOS virtuale e della sideways RAM.
if array Interfacce associabili. CMT-UEF: { "name": "CMT-UEF", "speed": ..., "param": [ { "file": "cmt/tape.uef" }, ... ] } — il registratore con fino a sei slot. BBC-FDC: { "name": "BBC-FDC", "chip": "8271|1770", "board": "acorn|master|watford", "speed": 0, "param": [ unità 0 faccia A, unità 0 faccia B, unità 1 faccia A, unità 1 faccia B ] } — chip seleziona l’Intel 8271 (predefinito, $FE80) o un WD1770; board (solo 1770) seleziona il latch e la decodifica dei registri: acorn (scheda di upgrade Model B, latch $FE80, chip $FE84), master (Master 128, latch $FE24, chip $FE28 — attivo per impostazione predefinita quando mastermode è impostato, e consente di preimpostare i banchi DFS/ADFS del MOS del Master) o watford. Ogni slot è { "file": "dsk/x.ssd", "type": "auto|ssd|dsd|mmb|adf|adl|dds|ddd" }; un’immagine a doppia faccia (dsd, adl, ddd o un’immagine adf L) in uno slot faccia A fornisce entrambe le facce, una seconda immagine a faccia singola nello slot faccia B accoppia due file in un unico disco a doppia faccia, mmb/BEEB.MMB:<n> seleziona un disco da un bundle, auto deduce il tipo da estensione e dimensione; "speed": 1 aggiunge la temporizzazione meccanica di avvio rotazione, seek, assestamento e rotazione. BBC-MMC: { "name": "BBC-MMC", "param": [ { "file": "mmb/BEEB.MMB" } ] } — l’immagine MMB dietro la scheda MMFS virtuale. BBC-NET: { "name": "BBC-NET", "station": 0, "net": 0, "aunport": 32768, "server": "192.168.1.210:32768", "serverstation": 254, "servernet": 0, "hosts": [ { "station": 10, "ip": "192.168.1.50", "port": 32768 } ] } — il modulo Econet; station 0 prende il byte basso dell’indirizzo IP del pico6502 (la convenzione AUN), server è l’indirizzo del file server (vuoto = <subnet>.254:32768) e hosts[] mappa qualsiasi stazione che non segue la convenzione.

Voce rom[]:

Chiave Tipo Descrizione
enable 0/1 Se questa immagine ROM viene caricata.
file stringa Percorso sulla scheda SD del binario ROM.
loadaddr array Descrittori dell’indirizzo di caricamento.

Voce loadaddr[]:

Chiave Tipo Descrizione
enable 0/1 Se questa voce di indirizzo di caricamento è attiva.
position intero Indice all’interno del file (per file multi-ROM).
addr stringa esadecimale Indirizzo di destinazione nello spazio di indirizzamento del 6502.
bank intero Banco PSRAM in cui caricare.
size stringa esadecimale Numero di byte da caricare.
"drivers": [
  {
    "enable": 1,
    "name":   "BIOS",
    "rom": [
      {
        "enable":   1,
        "file":     "/ROM/host_bios.rom",
        "loadaddr": [
          {
            "enable":   1,
            "position": 0,
            "addr":     "0xE000",
            "bank":     0,
            "size":     "0x2000"
          }
        ]
      }
    ]
  },
  {
    "enable": 1,
    "name":   "CharROM",
    "rom": [
      {
        "enable":   1,
        "file":     "/ROM/charrom.bin",
        "loadaddr": [
          {
            "enable":   1,
            "position": 0,
            "addr":     "0xB800",
            "bank":     0,
            "size":     "0x0800"
          }
        ]
      }
    ]
  }
]

Esempi di configurazione completi
Una configurazione minima per un host 6502 generico con un'area RAM di pagina zero/stack da 2 KB, 48 KB di RAM generale, una ROM BIOS da 8 KB e un handler di periferica VIA a 0xC000:
{
  "rp2350": {
    "core": {
      "cpufreq":   150000000,
      "psramfreq": 133000000,
      "voltage":   1.15
    },
    "6502": [
      { },
      {
        "cputype":     "6502",
        "dbeoverride": true,
        "memory": [
          { "enable":1, "addr":"0x0000", "size":"0x0200",
            "type":"RAM", "bank":0, "task":"", "file":"" },
          { "enable":1, "addr":"0x0200", "size":"0xBE00",
            "type":"RAM", "bank":0, "task":"", "file":"" },
          { "enable":1, "addr":"0xC000", "size":"0x0010",
            "type":"FUNC", "bank":0, "task":"via6522", "file":"" },
          { "enable":1, "addr":"0xE000", "size":"0x2000",
            "type":"ROM", "bank":0, "task":"", "file":"/ROM/host_bios.rom" }
        ],
        "drivers": [
          {
            "enable":1, "name":"Open6502",
            "rom": [
              { "enable":1, "file":"/ROM/host_bios.rom",
                "loadaddr":[{ "enable":1, "position":0,
                              "addr":"0xE000", "bank":0, "size":"0x2000" }] }
            ]
          }
        ]
      }
    ]
  }
}
La persona BBC Model B fornita: passthrough fisico completo a 340 MHz, la conoscenza della macchina portata dal driver, con MMFS fornito da uno zoccolo sideways virtuale e un nastro nel registratore UEF:
{
  "rp2350": {
    "core": { "voltage": 1.20, "cpufreq": 340000000, "psramfreq": 133000000 },
    "6502": [
      { },
      {
        "cputype":     "6502",
        "dbeoverride": true,
        "core":    { "voltage": 1.20, "cpufreq": 340000000, "psramfreq": 133000000 },
        "memory":  [ ],
        "drivers": [ {
          "enable":     1,
          "name":       "BBC-B",
          "modelaram":  false,
          "mastermode": false,
          "ossocket":   { "enable": 0, "file": "" },
          "sockets":    [ { "socket": 12, "enable": 1, "ram": false,
                            "file": "roms/bbc/MMFS.rom" } ],
          "if":         [ { "name": "CMT-UEF", "enable": 1,
                            "param": [ { "file": "cmt/Elite.uef" } ] },
                          { "name": "BBC-FDC", "enable": 1, "speed": 0,
                            "chip": "1770", "board": "acorn",
                            "param": [ { "file": "dsk/ACORN3_A.ssd", "type": "ssd" },
                                       { "file": "dsk/ACORN3_B.ssd", "type": "ssd" },
                                       { "file": "adfs/Apps.adl",    "type": "adl" },
                                       { "file": "" } ] },
                          { "name": "BBC-MMC", "enable": 1,
                            "param": [ { "file": "mmb/BEEB.MMB" } ] },
                          { "name": "BBC-NET", "enable": 1,
                            "station": 0, "net": 0, "aunport": 32768,
                            "server": "192.168.1.210:32768", "serverstation": 254 } ],
          "rom":        [ ]
        } ],
        "device":    [ ],
        "interlink": [ ]
      }
    ]
  },
  "esp32": {
    "core": { "device": "6502", "mode": 0 },
    "wifi": { "ssid": "p6502", "password": "p6502p6502", "ip": "192.168.4.4",
              "netmask": "255.255.255.0", "gateway": "192.168.4.1",
              "wifimode": "ap", "dhcp": 1, "override": 1, "webfs": "webfs", "persist": 0 }
  }
}

Shell di debug (ICE)

Il pico6502 incorpora la stessa shell di debug integrata (ICE) del picoZ80 — un'unica shell indipendente dalla CPU, con dispatch attraverso una tabella di operazioni per CPU, così che il set di comandi e il comportamento siano condivisi tra le due schede. Sul 6502 presenta 61 comandi (62 nella build BBC6502, che aggiunge bbc); i comandi dello Z80 per lo spazio I/O, il framework dei dispositivi e le periferiche Z80 non si applicano. Copre i registri (A/X/Y/S/PC, flag NV-BDIZC), single-step e step-over, breakpoint (incluso il break prima dell'esecuzione con ripresa one-shot), visualizzazione/modifica della memoria, un disassembler e un assembler a riga singola 6502 completi — la tabella degli opcode è generata dalla logica di decodifica dell'emulatore stesso, così ciò che si disassembla è esattamente ciò che viene eseguito; gli opcode non documentati sono mostrati con un prefisso *, l'overlay CMOS viene disassemblato quando è selezionato un tipo C, e disdesc aggiunge a ogni mnemonico una descrizione in linguaggio semplice.
I comandi specifici del 6502 rientrano in tre gruppi:
  • Bring-up della scheda
    - busdiag (istantanea di ogni segnale dello zoccolo; busdiag clk confronta PHI0 con i PHI1_IN/PHI2_IN di ritorno per distinguere un buffer guasto da un clock assente; busdiag watch [n] per i segnali in movimento), busprobe <addr> (legge ripetutamente un indirizzo per esporre linee dati instabili), busverify <addr> <len> (rilettura sicura per la ROM di un intervallo che segnala letture instabili e discordanze tra fetch e lettura), memtest (inclusa una modalità decay per il refresh della DRAM), bustest e wrtest (pilotano pattern riconoscibili per un analizzatore logico), busstate (stato in tempo reale del motore PIO per l'analisi dei blocchi) e piodbg.
  • Regolazioni del motore bus
    - writestrobes <1|2> (1 è vanilla), iopark on|off, readsettle <0-31>, readphase latch|hi|lo e buspipe con i sotto-comandi on|off, fetch, rungs, burst <1-6>, iochase, iorange <lo> <hi>, serve, natwr, wrregion, wrhold, wrverify, slowclr e stats — gli interruttori A/B in tempo reale con cui è stata condotta la campagna di ottimizzazione della velocità. pipetest <iters> esegue sul Core 1 il banco di verifica con operazioni di bus miste.
  • Prestazioni e persona
    - cpustat (istruzioni/s e cicli emulati/s rispetto al clock host misurato — chiamare due volte), cpuprof (istogramma dei tempi per istruzione per classe di bus) e, nella build BBC6502, bbc (mask, socket <n> <0|1>, cmosdef, oscheck, tape sel|next|rew|trace|on|off per il registratore UEF, fdc <drive> <file|eject> [A|B] [auto|ssd|dsd|mmb|adf|adl|dds|ddd] / fdc trace on|off per il controller floppy, mmc / mmc trace on|off per la scheda MMFS, e net / net trace on|off per il modulo Econet — frame, UDP in ingresso/uscita, acknowledgement, timeout e latenza delle risposte).
Si veda il Manuale utente — ICE (Shell di debug) per l'utilizzo.

Simulatore host (pico6502sim)

pico6502sim compila il firmware reale del pico6502 — i sorgenti RP2350 e la metà ESP32 con la sua interfaccia web e la scheda SD virtuale — in modo nativo per un PC e lo esegue headless. È autonomo (nessun framework di emulazione esterno; bastano un compilatore C/C++, pthreads e zlib) ed è il modo in cui il firmware è stato collaudato mentre la scheda v2.3 veniva sbrogliata; ora funge da banco di regressione e da luogo in cui vengono scritti i nuovi driver — LOAD e SAVE del registratore UEF sono stati esercitati sul BBC simulato prima che sull'hardware. La shell di debug, le persona, l'analisi della configurazione, il collegamento con l'ESP32 e la GUI web servita al browser girano tutti per davvero; il bus è o uno zoccolo flottante (le letture restituiscono 0xFF, che gira liberamente esattamente come un 6502 reale scollegato) oppure una macchina host sintetica.
Il launcher (sim/run.sh) fornisce tre macchine, tutte eseguibili contemporaneamente:
Macchina CPU Clock host Porta GUI web Modello host
apple1 6502 1,023 MHz 8110 Apple I sintetico: 32 KB di RAM, PIA 6821 a $D010-$D013 (replicata su $D000-$DFFF), finestra ROM da 8 KB $E000-$FFFF; terminale su una porta seriale virtuale.
bbcmodelb 6502 2 MHz 8111 BBC Model B sintetico (sim/src/host_bbc.c): 32K di RAM, 16 banchi sideways tramite ROMSEL, MOS + BASIC + DFS da SD/default/roms/BBC/, system VIA 6522 con timer, IFR/IER, latch IC32 e matrice di tastiera (portata da B-em), vsync a 50 Hz; tastiera su una porta seriale virtuale e teletext MODE 7 renderizzato dal vivo in ANSI sullo stesso terminale. I registri CRTC/video ULA sono solo memorizzati; la user VIA, l’FDC, l’Econet e il Tube risultano assenti. Compilato con i driver Acorn, così la persona BBC-B e il registratore UEF funzionano.
bbcmaster 65C12 2 MHz 8112 Nessuno (headless). Gira sul core CMOS.
Nessuna ROM Apple viene distribuita (il monitor Woz è di Apple); run.sh cerca nelle directory roms/APPLE1/ e roms/BBC/ della scheda SD e --rom= consente di sovrascrivere. Senza una ROM Apple viene eseguito un piccolo programma integrato di banner/echo — sufficiente a dimostrare fetch, esecuzione, salti, chiamate e la PIA in entrambe le direzioni. L'API host consente a un modello di asserire /IRQ e /NMI, e la persona 6502 simulata viene applicata dalla GUI web esattamente come sull'hardware (l'applicazione scrive l'archivio in flash e riavvia).
Il simulatore dimostra la logica, non la temporizzazione — non modella alcun clock, nessuna fase PHI1/PHI2, nessun tempo di setup o hold e nessuna contesa del bus. Un'esecuzione pulita convalida il firmware, le persona e l'interfaccia web; tutto ciò che riguarda il bus in sé è stato stabilito sulla scheda v2.3a con un analizzatore logico.

Interfaccia web

L'interfaccia web del pico6502 è identica nella struttura a quella del picoZ80 — otto pagine Bootstrap 4 servite dall'ESP32 a http://<device-ip>/. Al primo avvio connettersi all'AP WiFi della scheda, quindi configurare la modalità client tramite il WiFi Manager per unirsi alla propria rete.
Pagina URL Funzione
Dashboard / Stato del sistema in tempo reale: processore, dispositivo, versione firmware, partizione attiva. Su un host 6502 i menu CMT e Quick Disk, esclusivi dello Z80, sono nascosti e il menu Floppy presenta le due unità dell’8271 virtuale come Drive 0 / Drive 1, Side A / Side B — cambiare o espellere un’immagine al volo, con il tipo di immagine (auto / SSD / DSD / MMB / ADF / ADL / DDS / DDD) scelto per faccia.
GUI di configurazione /configgui.htm Editor strutturato dell’intera configurazione. Per una partizione 6502: cputype (6502 / 6512 / 65C02 / 65C12) e dbeoverride; tensione del core per partizione (0,85–1,50 V), cpufreq (100–400 MHz, con avviso sopra i 330) e psramfreq; forza di pilotaggio dei pad per gruppo di bus; l’editor della mappa di memoria; la sezione driver con un pannello Bus Engine Tuning per driver (finestra I/O, finestra di scrittura shadow, registro e regione di paginazione, profondità di burst, serve / pipeline / fast-fetch); le opzioni macchina BBC-B (RAM Model A, modalità Master, ROM disco preimpostate, persistenza) e la tabella Sideways ROM / RAM Sockets (zoccolo OS più zoccoli 0–15 con flag RAM, browser delle immagini ROM, offset MegaROM e destinazione di salvataggio); e il carosello di nastri a sei slot CMT-UEF, l’interfaccia floppy BBC-FDC con i selettori di chip (8271 / WD1770) e scheda (Acorn / Master 128 / Watford) e quattro slot fissi (Drive 0 · Side A/B, Drive 1 · Side A/B, ciascuno con un selettore di tipo), la scheda MMFS BBC-MMC con la sua immagine MMB, e il modulo Econet BBC-NET con numero di stazione, indirizzo del file server, stazione del file server e porta AUN. La sezione I/O è nascosta, poiché il 6502 non ha uno spazio I/O.
Editor di configurazione /config.htm Editor raw di config.json nel browser con evidenziazione della sintassi e ricarica senza riavvio.
File Manager /filemanager.htm Browser dei file della scheda SD: caricamento, download, rinomina, eliminazione. Trasferire immagini ROM e immagini disco senza rimuovere la scheda SD.
Selezione persona /personality.htm Selezione della persona macchina attiva per partizione firmware.
OTA ESP32 /ota-esp32.htm Caricamento del firmware ESP32 via WiFi; caricamento dell’archivio versionato del filesystem web FilePack sulla scheda SD.
OTA RP2350 /ota-rp2350.htm Caricamento del firmware RP2350 via WiFi; visualizzazione e commutazione della partizione attiva.
WiFi Manager /wifimanager.htm Configurazione di SSID, password e modalità WiFi (AP o client).
Si veda la pagina del picoZ80 per una descrizione dettagliata di ogni pagina dell'interfaccia web — l'implementazione del pico6502 è identica.

Siti di riferimento

La tabella seguente contiene tutti i siti consultati nella progettazione e nella programmazione del pico6502.
Sito Lingua Descrizione
RP2350 Datasheet Inglese Riferimento tecnico e datasheet ufficiali dell'RP2350 di Raspberry Pi.
Pico SDK Inglese SDK C/C++ per Raspberry Pi Pico — sistema di build e astrazione hardware utilizzati dal firmware del pico6502.
MOS 6502 Datasheet Inglese Datasheet originale della MPU MOS Technology 6502 — temporizzazione del bus, descrizione dei pin e caratteristiche elettriche.
ESP-IDF Inglese Espressif IoT Development Framework utilizzato per il firmware del coprocessore ESP32.
6502 Software Repository Inglese Repository comunitario di software e immagini ROM per 6502.

Manuali e datasheet

La tabella seguente contiene tutti i datasheet e i manuali consultati nella progettazione e nella programmazione del pico6502.
Datasheet Lingua Descrizione
RP2350 Inglese Datasheet del microcontrollore Raspberry Pi RP2350.
ESP32-S3 Inglese Datasheet del SoC Espressif ESP32-S3 — coprocessore WiFi/BT sulla scheda pico6502.
APS6404L PSRAM Inglese Datasheet della PSRAM SPI da 8 MB — la RAM estesa principale utilizzata per il banking della memoria.
W25Q128 Flash Inglese Datasheet della Flash NOR SPI Winbond da 16 MB — memorizza firmware e immagini ROM.
TLV62590 Inglese Convertitore buck sincrono Texas Instruments da 5 V→3,3 V che alimenta il pico6502 dal pin VCC del DIP-40 del 6502.
CH334F Inglese Controller hub USB 2.0 a 4 porte CH334F — fornisce la funzionalità di hub USB per gli aggiornamenti firmware.

Anteprima del progetto

I progetti picoZ80 e pico6502 sono stati presentati in anteprima su X (ex Twitter):
https://x.com/engineerswork1/status/1953171627065188841

Video dimostrativi
I video dimostrativi del pico6502 saranno aggiunti man mano che il progetto matura. Si vedano i video dimostrativi del picoZ80 per esempi della piattaforma condivisa in azione.

Restrizione all'uso commerciale

Nessun uso commerciale è consentito senza espressa autorizzazione scritta.
Il design hardware del pico6502 (schemi, layout PCB, file KiCad), il firmware e tutto il software associato sono resi disponibili esclusivamente per uso personale, educativo e non commerciale. Nessuna parte di questo design — inclusi, a titolo non esaustivo, l'artwork del PCB, la distinta base, i binari del firmware, il codice sorgente o la documentazione — può essere utilizzata, riprodotta, fabbricata, venduta o incorporata in qualsiasi prodotto o servizio commerciale senza l'espressa autorizzazione scritta dell'autore (Philip D. Smart).
Per richiedere una licenza commerciale o discutere gli usi consentiti, si prega di contattare l'autore tramite il sito web eaw.app.

Riconoscimenti

Il progetto pico6502 si basa sul lavoro di diverse persone e progetti open-source. I loro contributi sono riconosciuti con gratitudine.
  • Manuel Sainz de Baranda y Goñi
    Autore della libreria di emulazione della CPU Z80 in linguaggio C Z80 (github.com/redcode/Z80), utilizzata dal progetto gemello picoZ80. La stessa filosofia di emulazione ad alta precisione e l'infrastruttura firmware condivisa ispirano il design del pico6502, e il lavoro di Manuel è riconosciuto con gratitudine come parte della più ampia famiglia di progetti.
  • Raspberry Pi Ltd
    Autori del Pico SDK e dell'hardware RP2350. L'assembler PIO, l'SDK C, l'integrazione della toolchain CMake e il silicio RP2350B rendono possibile l'interfaccia bus 6502 precisa al ciclo.
  • Espressif Systems
    Autori del framework ESP-IDF e dell'hardware ESP32. Il coprocessore ESP32, lo stack WiFi, la libreria OTA e il framework di archiviazione NVS sono alla base dell'interfaccia di gestione web.
  • Philip Smart
    Progettazione hardware (schemi KiCad e layout PCB), firmware PIO per RP2350, applicazione web ESP32, sistema di configurazione JSON e tutta la documentazione del progetto.
  • Grok (xAI)
    Assistente IA che ha fornito un aiuto prezioso durante il debug delle macchine a stati PIO — in particolare nella diagnosi dei casi limite di temporizzazione e dei problemi di interazione con il bus precisa al ciclo nei programmi PIO dell'RP2350.
  • Claude (Anthropic)
    Assistente IA che contribuisce a questo progetto in più ambiti: redazione e strutturazione della documentazione del progetto, analisi dell'interfaccia FSPI/UART tra RP2350 ed ESP32 con raccomandazioni per il miglioramento del firmware, e assistenza continua allo sviluppo del firmware.

Licenze

Il progetto pico6502 è composto da diversi componenti, ciascuno coperto dalla propria licenza:
Componente Licenza
Firmware RP2350 del pico6502 (PIO, sorgenti C)GNU General Public License v3
Firmware ESP32 e interfaccia web del pico6502GNU General Public License v3
File di progettazione hardware KiCad (schemi, PCB, Gerber)Creative Commons BY-NC-SA 4.0
Documentazione e guide utenteCreative Commons BY-NC-SA 4.0
Raspberry Pi Pico SDKBSD 3-Clause
Framework ESP-IDFApache License 2.0
Bootstrap 4 (interfaccia web)MIT License
In breve: il firmware e il software che si compilano dal codice sorgente di questo progetto sono open-source sotto GPL v3; i design hardware e la documentazione sono rilasciati sotto licenza CC BY-NC-SA 4.0 (solo uso non commerciale — licenza commerciale disponibile su richiesta); le librerie di terze parti mantengono le proprie licenze come elencato sopra. Si vedano i file LICENSE e NOTICE nel repository per tutti i dettagli.

Termini di licenza

Copyright © 2019–2026 Philip Smart. Tutti i diritti riservati.
Design hardware — CC BY-NC-SA 4.0
Tutti i design hardware (schemi KiCad, layout PCB, file di fabbricazione Gerber, distinte base) sono rilasciati sotto la licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 4.0 Internazionale. È possibile condividere e adattare i design esclusivamente per scopi non commerciali, a condizione di fornire un'attribuzione adeguata e di distribuire eventuali modifiche sotto la stessa licenza. La fabbricazione o la vendita commerciale richiede una licenza separata — si prega di contattare info@eaw.app.
Firmware & Software — GNU GPL v3
Il codice sorgente del firmware e del software è software libero sotto la GNU General Public License v3. È possibile ridistribuire e modificare il codice secondo i termini della GPL v3. Qualsiasi modifica distribuita deve essere anch'essa rilasciata sotto GPL v3 con il codice sorgente reso disponibile.
Marchi & Attribuzione
I nomi picoZ80, pico6502 ed engineers@work sono marchi di Philip Smart. Non è consentito utilizzare questi nomi per promuovere prodotti derivati senza autorizzazione scritta. Non è consentito rimuovere o alterare le note di copyright, l'attribuzione dell'autore o i crediti delle schermate di avvio/splash. Rimarchiare questo progetto e presentarlo come proprio lavoro è espressamente vietato. Si veda il file NOTICE nel repository per tutti i dettagli.
Licenza commerciale
Se siete un produttore o un distributore interessato a realizzare schede picoZ80 o pico6502 per la vendita commerciale, si prega di contattare: info@eaw.app. L'uso personale, educativo e hobbistico/di club è sempre consentito secondo le licenze open-source sopra indicate.
I testi completi delle licenze sono inclusi nel repository come LICENSE, LICENSE-HARDWARE.txt e LICENSE-SOFTWARE.txt.

Avviso normativo sulle comunicazioni wireless

Questo dispositivo incorpora un modulo wireless ESP32-S3-PICO-1 che trasmette nella banda ISM a 2,4 GHz, il che lo rende un radiatore intenzionale ai sensi delle normative sulle radiofrequenze di tutto il mondo (incluse la FCC Parte 15 Sottoparte C negli Stati Uniti e la Direttiva sulle apparecchiature radio 2014/53/UE nell'Unione Europea).
Sebbene il modulo ESP32-S3-PICO-1 in sé 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 i moduli pre-certificati consente ai singoli hobbisti di costruire un numero limitato di dispositivi per uso personale, sperimentale o educativo senza ottenere un'autorizzazione separata per l'apparecchiatura.
Limitazioni importanti
  • 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 in modo indipendente e non abbia ottenuto la propria autorizzazione per l'apparecchiatura (ad es. FCC ID, marcatura CE con valutazione da parte di un Organismo Notificato) nella giurisdizione pertinente.
  • La costruzione di questo progetto per uso personale in quantità limitate è generalmente consentita ai sensi delle disposizioni per hobbisti e uso sperimentale (ad 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 devono consultare la propria autorità nazionale per le radiofrequenze per le norme applicabili.
Responsabilità del costruttore
È esclusiva responsabilità del costruttore garantire che qualsiasi dispositivo realizzato a partire 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 in alcun modo che un dispositivo costruito a partire da essi soddisfi i requisiti normativi per la distribuzione commerciale.