Sommario:

6502 Computer minimale (con Arduino MEGA) Parte 1: 7 passaggi
6502 Computer minimale (con Arduino MEGA) Parte 1: 7 passaggi

Video: 6502 Computer minimale (con Arduino MEGA) Parte 1: 7 passaggi

Video: 6502 Computer minimale (con Arduino MEGA) Parte 1: 7 passaggi
Video: DIY Radar With Ultrasonic Sensor And Chat-GPT Generated Arduino Code | Coders Cafe 2024, Luglio
Anonim
6502 Computer minimale (con Arduino MEGA) Parte 1
6502 Computer minimale (con Arduino MEGA) Parte 1

Il microprocessore 6502 è apparso per la prima volta nel 1975 ed è stato progettato da un piccolo team guidato da Chuck Peddle per la tecnologia MOS. All'epoca era utilizzato nelle console video e negli home computer inclusi Atari, Apple II, Nintendo Entertainment System, BBC Micro, Commodore VIC20 e 64. A quel tempo era uno dei più economici sul mercato. Non è mai andato veramente via e ora è utilizzato da hobbisti e professionisti per molte applicazioni.

La versione che sto usando è la W65C02S6TPG-14 prodotta da Western Design Center e utilizza dieci volte meno energia dell'originale. È speciale in quanto non deve funzionare a 1 MHz come il chip originale. Può funzionare molto più lentamente o essere utilizzato per eseguire un singolo passaggio in un programma e persino aumentare fino a 14 MHz. La scheda tecnica del chip ne spiega le capacità. Altri chip 6502 non hanno questa capacità e non funzioneranno in questo modo. I chip sono attualmente disponibili su Ebay e da altre fonti.

Forniture

Tutte le parti utilizzate sono attualmente disponibili su Ebay, AliExpress e altri.

Passaggio 1: il concetto

Mi sono ispirato a Ben Eater che ha prodotto una serie di video su YouTube sul 6502 e su molti altri aspetti della costruzione di computer e circuiti. Il programma è stato originariamente scritto da lui e ho modificato questo e alcuni dei suoi progetti per creare questo Instructable. Un'altra persona che mi ha ispirato è stato Andrew Jacobs che ha una sezione su GitHub in cui usa un micro PIC per controllare il suo 6502.

Come Ben, sto usando un Arduino MEGA per monitorare il 6502. Sto anche usando il MEGA per fornire il segnale di clock a differenza di Ben. Al momento non sto usando nemmeno EEPROM o RAM.

Passaggio 2: requisiti

Requisiti
Requisiti

Per costruire questo "computer" un elenco di elementi è il seguente:

1 x Arduino MEGA

1 x Centro di progettazione occidentale W65C02S6TPG-14

1 x 74HC00N IC (gate NAND quadruplo a 2 ingressi) o simile

1 x 74HC373N IC (chiusura ottale trasparente di tipo D) o simile

2 taglieri per pane da 830 fori (1 in caso di necessità)

Vari Dupont maschio - cavi maschio e fili di collegamento

2 x LED (ho usato 5 mm blu come puoi farla franca senza resistori)

1 x interruttore a pulsante tattile momentaneo da 12 mm montato su PCB SPST o simile

1 x 1K resistore

2 condensatori ceramici da 0,1 uF

1 x 8 LED Water Light Marquee 5mm LED rosso (come sopra) o 8 LED e resistori

NOTA: Se si acquista il kit dissaldato, è possibile inserire i LED al contrario in modo che siano a catodo comune. Attacco un cavo volante (invece del pin) in modo che possa collegarsi facilmente altrove. VCC ora diventa Ground. Ovviamente puoi girare i LED (su un elemento assemblato) e risaldarli, ma questo è un sacco di guai! I kit sono attualmente disponibili su AliExpress.

Passaggio 3: metterlo insieme

Metterlo insieme
Metterlo insieme
Metterlo insieme
Metterlo insieme

Ho trovato più facile utilizzare i nuovi cavi DuPont che non erano stati separati dal loro nastro per l'indirizzo e i bus dati.

Collegare il pin 9 (A0) del 6502 al pin 52 del MEGA, pin 10 (A1) del 6502 al pin 50 ecc…

fino a

Collegare il pin 25 (A15) del 6502 al pin 22 del MEGA.

Finora 16 collegamenti.

allo stesso modo

Collegare il pin 26 (D7) del 6502 al pin 39 del MEGA, pin 27 (D6) del 6502 al pin 41 ecc…

fino a

Collegare il pin 33 (D0) del 6502 al pin 53 del MEGA.

8 connessioni in più.

Collegare il pin 8 (VDD) a 5v sul MEGA.

Un condensatore da 0.1uF collegato dal pin 8 a Gnd della breadboard potrebbe essere utile qui ma non necessario.

Collegare il pin 21 (VSS) a Gnd sul MEGA.

I pin 2, 4, 6, 36 e 38 possono essere collegati a 5v

Collegare il pin 37 (Clock) al pin 2 e al pin 7 del MEGA.

Collegare il pin 34 (RWB) al pin 3 del MEGA.

Collegare il pin 40 (Reset) come nello schema sopra.

Passaggio 4: test del circuito

Testare il circuito
Testare il circuito

A questo punto il 6502 funzionerà e sarà possibile utilizzare il programma1. Se stai usando il tendone a 8 vie (come sopra), può essere inserito direttamente nella breadboard e il cavo volante collegato a terra, oppure puoi usare 8 LED e resistori. I LED mostreranno cosa c'è sul bus dati.

A questo punto sarebbe opportuno impostare i ritardi nel Loop() a 500 o più, per seguire ciò che sta accadendo.

Dovresti ottenere un output simile sul monitor seriale come quello sopra. Quando si preme Reset, il processore esegue 7 cicli e quindi cerca l'inizio del programma nelle posizioni $FFFC e $FFFD. Poiché non ci sono indirizzi fisici da leggere per il 6502, dobbiamo fornirli dal MEGA.

Nell'output sopra, il 6502 legge $FFFC e $FFFD e ottiene $00 e $10 (Low byte, High byte) che è l'inizio del programma a $1000. Il processore avvia quindi l'esecuzione del programma nella posizione $1000 (come sopra). In questo caso legge $A9 e $55, cioè LDA#$55 (Carica 85 nell'accumulatore). Anche in questo caso, poiché non esiste una posizione di memoria fisica, il MEGA simula ciò che viene letto dal bus dati.

$55 (85) fornisce il modello binario 01010101 e quando viene ruotato di 1 bit a sinistra fornisce $AA (170) 10101010.

Il programma mostra che il processore funziona correttamente ma presto diventa un po' noioso, quindi vai alla parte successiva.

Passaggio 5: passaggio successivo

Passo successivo
Passo successivo
Passo successivo
Passo successivo

Il "mucchio di spaghetti" sopra è probabilmente qualcosa di simile a quello che avrai dopo questa fase.

Successivamente è necessario aggiungere i circuiti integrati 74HC373N e 74HC00N alla breadboard.

Sfortunatamente i pin del 373 non si allineano con il bus dati, quindi dovranno essere collegati con dei fili.

Collegare 5v al pin 20.

Collegare la terra al pin 10.

Collegare il pin 33 (D0) del 6502 al pin 3 (D0) del 74HC373N

e allo stesso modo con i pin D1 a D7.

Da Q0 a Q7 sono le uscite e queste dovranno essere collegate al tendone LED o ai singoli LED e resistori.

Con il 74HC00 sono necessarie solo 2 delle sue porte

Collegare 5v al pin 14.

Collegare la terra al pin 7.

Collegare il pin 17 (A8) del 6502 al pin 1 (1A) del 74HC00

Collegare il pin 25 (A15) del 6502 al pin 2 (1B) del 74HC00

Collegare il pin 34 (R/W) del 6502 al pin 5 (2B) del 74HC00

Collegare il pin 3 (1Y) del 74HC00 al pin 4 (2A) del 74HC00

Collegare il pin 6 (2Y) del 74HC00 al pin 11 (LE) del 74HC373N

Collegare il pin 11 (LE) del 74HC373N al pin 1 (OE) del 74HC373N

È possibile collegare un LED blu a 1Y e terra e 2Y a terra, questo indicherà quando il cancello è attivo.

Infine cambia la riga nella procedura onClock da program1 a program2

setDataPins(programma2[offset]);

Passaggio 6: il programma

Il programma
Il programma
Il programma
Il programma

Il programma 6502-Monitor contiene le due routine 6502 descritte sopra.

Il programma è ancora in fase di sviluppo ed è un po' disordinato.

Quando si esegue program2, i ritardi nel loop() possono essere 50 o meno e persino rimossi del tutto. Commentare le righe Serial.print() rende anche il 6502 più veloce. Scollegando il pin 1 (OE) del 373 dal pin 11 (LE) si ottengono risultati diversi. Scollegando il pin 1 e il pin 11 del 373 dalle porte NAND è possibile vedere cosa c'è sul bus dati ad ogni ciclo di clock.

Potrebbe essere necessario collegare OE a terra piuttosto che lasciarlo flottante poiché le 8 linee di uscita sono disabilitate se questo pin diventa alto. Quando il pin LE è alto, i pin di uscita sono gli stessi degli ingressi. Portando il pin LE basso, le uscite vengono bloccate, ovvero se i pin di ingresso cambiano, le uscite rimangono le stesse.

Ho cercato di mantenere il programma il più semplice possibile per renderlo più facile da capire.

Sperimentare con i ritardi ti consente di seguire esattamente ciò che sta facendo il 6502.

Di seguito sono riportati i due programmi (entrambi eseguiti all'indirizzo $1000) in 6502 Assembler:

programma1

LDA#$55

NO

ROL

STA$1010

JMP$ 1000

Il ROL ruota il contenuto dell'accumulatore di un bit a sinistra, il che significa che $ 55 ora diventa $ AA.

In codice macchina (esadecimale): A9 55 EA 2A 8D 10 10 4C 00 10

programma2

LDA#$01

STA$8100

ADC#$03

STA$8100

JMP$ 1005

Nel codice macchina (esadecimale): A9 01 8D 00 81 69 03 8D 00 81 4C 05 10

Nel program2 ora c'è un indirizzo fisico $8100 che è dove si trova il 74HC373 sul bus degli indirizzi.

cioè A15 del 6502 è 32768 ($ 8000) e A8 è 256 ($ 0100) = 33024 ($ 8100).

Quindi, quando il 6502 scrive su $8100 (STA$8100) l'R/W del 6502 è basso e i dati sul bus dati del 6502 sono bloccati quando il 373 LE va basso. A causa del 74HC00 NAND Gate, i segnali sono invertiti.

Nella serigrafia sopra, la seconda scrittura è aumentata di 3 (ADC#$03) - passata da $7F a $82.

In realtà, sarebbero utilizzate più di 2 linee del bus degli indirizzi per la posizione specifica del 373. Poiché questo è l'unico indirizzo fisico tra i possibili 65536, dimostra come funziona il bus degli indirizzi. Potresti sperimentare con diversi pin di indirizzo e metterlo in una posizione diversa. Naturalmente, sarà necessario modificare gli operandi STA nella nuova posizione. per esempio. Se hai usato le linee di indirizzo A15 e A9, l'indirizzo sarebbe $ 8200 (32768 + 512).

Passaggio 7: conclusione

Conclusione
Conclusione

Ho cercato di dimostrare quanto sia facile far funzionare un 6502.

Non sono un esperto in questo campo, quindi sarei lieto di ricevere commenti o informazioni costruttivi.

Sei libero di svilupparlo ulteriormente e sarei interessato a ciò che hai fatto.

Ho intenzione di aggiungere una EEPROM, SRAM e un 6522 al progetto, oltre a metterlo su strip board in futuro.

Consigliato: