pico6502 Guida Tecnica

English

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 R/W̄ (Read/Not-Write) anziche segnali /RD e /WR separati.

Generazione clock bifase
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 (non BaseZ80).
  • La voce add-auto-load-safe-path in ~/.gdbinit deve referenziare BaseM6502.

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
  • 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.
Responsabilita del costruttore
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.