Innholdsfortegnelse:

6502 Minimal datamaskin (med Arduino MEGA) Del 3: 7 trinn
6502 Minimal datamaskin (med Arduino MEGA) Del 3: 7 trinn

Video: 6502 Minimal datamaskin (med Arduino MEGA) Del 3: 7 trinn

Video: 6502 Minimal datamaskin (med Arduino MEGA) Del 3: 7 trinn
Video: Lesson 06: Arduino Variables Data Types | Robojax Arduino Step By Step Course 2024, Juli
Anonim
6502 Minimal datamaskin (med Arduino MEGA) Del 3
6502 Minimal datamaskin (med Arduino MEGA) Del 3

Når jeg går videre, har jeg nå lagt til en Octal Latch, 8 rektangulære lysdioder og et 220 Ohm motstandsarray til hovedkortet. Det er også en jumper mellom matrisens vanlige pinne og bakken, slik at lysdiodene kan slås av. 74HC00 NAND -porten er erstattet med en 78LS08 AND -port, ledningene til porten er også endret. OG -porten betyr at 6522 nå ligger på $ 6000 i stedet for $ E000.

Det er også en pinne for tilkobling av en ekstern klokke for å drive 6502. Med denne tilkoblingen er det ikke nødvendig for MEGA å gi et klokkesignal. MEGA overvåker fortsatt hva som skjer med prosessoren som før.

Jeg brukte en 20 -pinners 74HC373 for låsen fordi jeg hadde noen. Dette var OK når det var på brødbrettet, men en 74HC573 er busskompatibel og ville ha spart masse ledninger. UCN5801A, som er en 22 -pinners IC, kan også vurderes i kretsen, men ledningene vil være litt forskjellige.

Den øverste, oransje LED -lampen er en strømindikator og den nedre venstre røde indikerer når det skrives. Sistnevnte vil være ubetydelig hvis brettet kjøres i høyere hastigheter.

Den modifiserte kretsen er ovenfor (med 74HC573).

Trinn 1: Demonstrasjonsprogrammer

Demonstrasjonsprogrammer
Demonstrasjonsprogrammer

To enkle demonstrasjonsprogrammer er inkludert i 6502 -skjermen, og den demonterte koden er her.

Dette programmet laster 1 inn i 6502 A -registeret og lagrer det i låsen. Den legger deretter 1 til A -registeret og lagrer det i låsen. Deretter hopper den tilbake til $ 1005, og prosessen gjentas for alltid.

* = 1000

1000 A9 01 LDA #$ 01 1002 8D 00 41 STA $ 4100 1005 69 01 ADC #$ 01 1007 8D 00 41 STA $ 4100 100A 4C 05 10 JMP $ 1005 100D. END

Dette programmet setter først DDR på 6522 port B til utgang. Den lagrer deretter $ 55 (B01010101) i porten, så vel som låsen. A -registeret roterer deretter 1 trinn til høyre og innehar nå $ AA (B10101010). Dette lagres igjen i port B og låsen. Programmet hopper tilbake til $ 1005 og fortsetter for alltid.

* = 1000

1000 A9 FF LDA #$ FF 1002 8D 02 60 STA $ 6002 1005 A9 55 LDA #$ 55 1007 38 SEK 1008 8D 00 60 STA $ 6000 100B 8D 00 41 STA $ 4100 100E 6A ROR A 100F 8D 00 60 STA $ 6000 1012 8D 00 41 STA $ 4100 1015 4C 05 10 JMP $ 1005 1018. END

De skarpe øynene blant dere vil kanskje legge merke til at de fargede lysdiodene viser et annet mønster enn de grønne. Dette er fordi den vanlige ledningen er koblet til 5v på de fargede og den vanlige på de grønne er koblet til bakken.

Endre denne kodelinjen til program2 eller program3.

setDataPins (program3 [offset]);

En 6502 Assembler og Disassembler er nyttige verktøy for å hjelpe deg med å kode programmene dine.

Trinn 2: Legge til en EEPROM

Legger til en EEPROM
Legger til en EEPROM
Legger til en EEPROM
Legger til en EEPROM
Legger til en EEPROM
Legger til en EEPROM

For EEPROM -kortet brukte jeg et 950 x 650 mm stripebrett og 19 mm mannlige toppstifter for å gjøre det mulig for brettet å fjerne det under. Dette kortet kobles til 6502 -kortet nedenfor. EEPROM er en ATMEL 28C256 som har 28 pinner og inneholder 32k x 8 bits minne. Dette er mer enn tilstrekkelig for de små programmene som brukes for tiden.

Jeg har ikke laget et kretsdiagram for dette brettet, men det er ganske rett frem hvordan det kobles til 6502 -kortet nedenfor. Disse EEPROM -sjetongene er ikke bussvennlige, så de må kobles til de enkelte pinnene, derav all "grønn og hvit spaghetti". Jeg har løst broproblemet på det tidligere kortet ved å koble datalinjene sammen på undersiden av brettet.

EEPROMs 14 adressepinner kobles til de riktige pinnene på venstre side (grønne ledninger) og I/O -pinnene til datapinnene til høyre (hvite ledninger). Pin 27 (WE) er koblet til pin 28 (5v), pin 22 (OE) er koblet til jord og pin 20 (CE) er koblet til en NAND -gate. 2 innganger på NAND -porten er koblet til A15 på hovedkort. Dette betyr at når denne pinnen går høyt, gir NAND -porten et lavt signal til CE -pinnen til EEPROM som gjør den aktiv. Med dette oppsettet betyr det at EEPROM bare kan leses av 6502.

Ettersom EEPROM bor i topp 32k på minnekartet, betyr det at $ FFFC og $ FFFD kan holde startadressen for 6502 etter at den har blitt tilbakestilt. Med 6522 som har sine adresser mellom $ 6000 og $ 600F og låsen er på $ 4100, stopper den eventuelle minnekonflikter.

NMI -vektoren ($ FFFA og $ FFFB) og BRK / IRQ -vektoren ($ FFFE og $ FFFF) kan også skrives på samme måte.

Trinn 3: Programmering av EEPROM

Programmering av EEPROM
Programmering av EEPROM
Programmering av EEPROM
Programmering av EEPROM

For å lagre et program på EEPROM trenger det en programmerer. Jeg lagde en av et stripebrett, en Arduino Pro Mini, et par 74HC595 -er og en ZIF -kontakt. Opprinnelig ble programmereren laget for en AT28C16 som har færre adresselinjer enn AT28C256, så den måtte endres.

Kretsdiagrammet viser hvordan du kobler begge disse EEPROM -ene. Det er ikke klart fra bildet at de to 595 sjetongene er opp ned og ikke som vist på diagrammet. Pinnene 1 til 7 av 595/1 står på linje med A1 til A7 i EEPROM, uansett hvilken som brukes. Dette sparer 7 tilkoblingsledninger. Brettet ser nå litt stramt ut, og dette er fordi jeg opprinnelig brukte en 24 -pins DIL -kontakt som nå er erstattet av den mye større 28 -pins ZIF -kontakten.

Et program er inkludert som fungerer med brettet mitt. Programmet vil fungere med alle Arduino og 595 -er i en krets som vist. Jeg valgte en 5v Pro Mini fordi den er kompakt og billig nok til å stå i oppsettet.

Trinn 4: EEPROM -programmene

EEPROM -programmene
EEPROM -programmene

Det er tre enkle programmer i EEPROM programmerer. For å bruke dem, bare kommenter linjen du vil bruke.

// Les fra port A på 6522

// const byte data = {0xA9, 0x00, 0x8D, 0x03, 0x60, 0xAD, 0x01, 0x60, 0x4C, 0x05, 0x90, 0x00};

Programmet viser en minnedump når den er ferdig. Delen av programmet nedenfor gir deg full kontroll over hva du vil skrive eller slette, setter $ FFFC og $ FFFD og viser deretter innholdet i et gitt område. Bare kommenter eller endre parameterne etter behov. Adressene kan også legges inn i desimalformat.

// slette EEPROM (422, 930, 0x41); // Brukes til å slette hele eller deler av EEPROM - start, slutt, byte

Serial.println ("Programmering av EEPROM"); beløp = program_numerisk_data (0x1000); writeEEPROM (0x7ffc, 0x00); // Sett $ FFFC for 6502 writeEEPROM (0x7ffd, 0x90); // Sett $ FFFD for 6502 // writeEEPROM (0x1000, 0xA9); // Skriv 1 byte med data Serial.println ("ferdig"); String outline = "Skrevet" + (String) beløp + "byte"; Serial.println (disposisjon); Serial.println ("Lese EEPROM"); printContents (0x0000, 0x112f); // Angi område for å vise printContents (0x7ff0, 0x7fff); // Leser de siste 16 byte på EEPROM

En forkortet utskrift fra programmet er ovenfor.

Trinn 5: Kjøre 6502 fra EEPROM

Kjører 6502 fra EEPROM
Kjører 6502 fra EEPROM
Kjører 6502 fra EEPROM
Kjører 6502 fra EEPROM
Kjører 6502 fra EEPROM
Kjører 6502 fra EEPROM

Den programmerte EEPROM kan nå settes inn i brettet, og denne grisen rygger videre til hoved 6502 -kortet som grisen bakker til MEGA. Bildeene fra siden og ovenfra viser hvordan det hele henger sammen.

6502 kan nå lese startvektoren fra $ FFFC og $ FFFD (som er $ 9000) og deretter hoppe til programmet som er lagret der. MEGA leverer fremdeles klokkesignalet, og programmet må endres for å gi bare klokkesignalet og overvåke 6502. Et modifisert program tilbys for å gjøre dette.

Det løpende bildet viser at dette programmet kjører.

9000 LDA #$ 00 A9 00

9002 STA $ 6003 8D 03 60 9005 LDA #$ FF A9 FF 9007 STA $ 6002 8D 02 60 900A LDA $ 6001 AD 01 60 900D STA $ 6000 8D 00 60 9010 EOR #$ FF 49 FF 9012 STA $ 4100 8D 00 41 9015 JMP $ 900A 4C 0A 90

Bryterne er koblet til port A, og programmet viser verdien det leser på port B og 74HC373 (som er skjult for tiden). bryterne er koblet til jord og lysdiodene er koblet til 5v. EOR #$ FF korrigerer problemet med låsen og port B som viser forskjellige mønstre ved å snu bitene før du skriver til låsen.

Trinn 6: Eksternt tidssignal

Eksternt tidssignal
Eksternt tidssignal

Hvis et klokkesignal blir påført pinnen på toppen av brettet, kan 6502 nå kjøre uavhengig av MEGA. Selvfølgelig trenger den også en strømforsyning. Jeg har eksperimentert med forskjellige klokker og til og med kjørt 6502 på 1MHz med en krystalloscillator. MEGA kan ikke følge med raskere hastigheter, så den må fjernes.

Jeg prøvde også utgangen fra en 555 timer, men det fungerer ikke. Jeg tror det kan være fordi det ikke er en firkantbølge? Når den ble koblet til en av CD4017 -utgangene, kjørte den 6502. Jeg lappet inn i et av settene ovenfor for å prøve å få et klokkesignal.

Jeg ser fremdeles på forskjellige metoder for å få et klokkesignal.

Trinn 7: Konklusjon

Jeg har vist hvordan man bygger noen komplekse kretser og får en veldig enkel "datamaskin" til å fungere med en minimal mengde deler. Riktignok kan datamaskinen ikke gjøre mye i dag eller vil sannsynligvis gjøre det i fremtiden.

På begynnelsen av 80 -tallet, med min VIC20, lurte jeg på den fantastiske maskinen og hadde ikke den første ideen om hvordan jeg skulle begynne å sette sammen en. Tidene har gått videre og det samme har teknologien, men det er fortsatt hyggelig å komme tilbake til det grunnleggende og være stolt av noe du har bygget fra bunnen av.

For å videreutvikle denne datamaskinen har jeg tenkt å sette 2k SRAM på $ 0000 til $ 2047 og legge til en 1 MHz oscillator. Vil sannsynligvis legge til noe som en CD4040 (12-trinns binær rippel teller / divider) slik at jeg kan få tilgang til forskjellige klokkehastigheter.

Kan til og med legge til en LCD -skjerm for å gi tekstutdata i stedet for bare blinkende lys. EEPROM -programmereren må også modifiseres for å håndtere de større programmene som trengs for å kjøre en LCD -skjerm.

Selv om MEGA blir unødvendig for driften av 6502, er det likevel nyttig for feilsøking av maskinkoden. Som noen vet, inneholder maskinkode alltid feil!

Anbefalt: