Innehållsförteckning:

6502 Minimal dator (med Arduino MEGA) Del 3: 7 steg
6502 Minimal dator (med Arduino MEGA) Del 3: 7 steg

Video: 6502 Minimal dator (med Arduino MEGA) Del 3: 7 steg

Video: 6502 Minimal dator (med Arduino MEGA) Del 3: 7 steg
Video: Day in My Life as a Quantum Computing Engineer! 2024, November
Anonim
6502 Minimal dator (med Arduino MEGA) Del 3
6502 Minimal dator (med Arduino MEGA) Del 3

När jag fortsätter vidare har jag nu lagt till en Octal Latch, 8 rektangulära lysdioder och ett 220 Ohm motståndsarray till huvudkortet. Det finns också en bygel mellan matrisens gemensamma stift och jord, så att lysdioderna kan stängas av. 74HC00 NAND -grinden har ersatts med en 78LS08 OCH grind, ledningarna till porten har också ändrats. OCH -grinden betyder att 6522 nu ligger på $ 6000 istället för $ E000.

Det finns också en stift för anslutning av en extern klocka för att driva 6502. Med denna anslutning behöver MEGA inte ge någon klocksignal. MEGA övervakar fortfarande vad som händer med processorn som tidigare.

Jag använde en 20 -stifts 74HC373 för spärren eftersom jag hade några. Detta var OK när det var på brödbrädan, men en 74HC573 är busskompatibel och skulle ha sparat massor av ledningar. UCN5801A som är en 22 -stifts IC kan också övervägas i kretsen, men ledningarna kommer att vara något annorlunda.

Den övre, orange orange lysdioden är en strömindikator och den nedre vänstra röda indikerar när en skrivning pågår. Det senare blir obetydligt om brädet körs i högre hastigheter.

Den modifierade kretsen är ovan (med 74HC573).

Steg 1: Demonstrationsprogram

Demonstrationsprogram
Demonstrationsprogram

Två enkla demonstrationsprogram ingår i 6502 -skärmen och deras isärtagna kod finns här.

Detta program laddar 1 i 6502 A -registret och lagrar det i spärren. Det lägger sedan till 1 i A -registret och lagrar det i spärren. Sedan hoppar det tillbaka till $ 1005 och processen upprepas för 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

Detta program sätter först DDR i 6522 -port B till utmatning. Den lagrar sedan $ 55 (B01010101) i porten samt spärren. A -registret roterar sedan 1 steg åt höger och rymmer nu $ AA (B10101010). Detta lagras igen i port B och spärren. Programmet hoppar tillbaka till $ 1005 och fortsätter för 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 skarpa ögonen bland er kanske märker att de färgade lysdioderna visar ett annat mönster än de gröna. Detta beror på att den gemensamma ledningen är ansluten till 5v på de färgade och den gemensamma på de gröna är anslutna till jord.

Ändra denna kodrad till program2 eller program3.

setDataPins (program3 [offset]);

En 6502 Assembler och Disassembler är användbara verktyg för att koda dina program.

Steg 2: Lägga till en EEPROM

Lägger till en EEPROM
Lägger till en EEPROM
Lägger till en EEPROM
Lägger till en EEPROM
Lägger till en EEPROM
Lägger till en EEPROM

För EEPROM -kortet använde jag en 950 x 650 mm bandplatta och 19 mm hanstiften för att göra det möjligt för kortet att rensa den under. Detta kort ansluts till 6502 -kortet nedan. EEPROM är en ATMEL 28C256 som har 28 stift och innehåller 32k x 8 bitar minne. Detta är mer än tillräckligt för de små program som används för närvarande.

Jag har inte gjort ett kretsschema för detta kort, men det är ganska rakt fram hur det ansluter till 6502 -kortet nedan. Dessa EEPROM -chips är inte bussvänliga så måste kopplas till de enskilda stiften, därav all "grön och vit spaghetti". Jag har löst överbryggningsproblemet på det tidigare kortet genom att koppla ihop datalinjerna på undersidan av kortet.

EEPROM: s 14 adressnålar ansluts till lämpliga stift på vänster sida (gröna trådar) och I/O -stiften till datastiften till höger (vita trådar). Stift 27 (WE) är anslutet till stift 28 (5v), stift 22 (OE) är anslutet till jord och stift 20 (CE) är anslutet till en NAND -grind. NAND -grindens 2 ingångar är anslutna till A15 på moderkort. Detta betyder att när denna stift går högt ger NAND -grinden en låg signal till CE -stiftet på EEPROM som gör den aktiv. Med denna inställning betyder det att EEPROM bara kan läsas av 6502.

Eftersom EEPROM bor i topp 32k på minneskartan betyder det att $ FFFC och $ FFFD kan hålla startadressen för 6502 efter att den har återställts. Eftersom 6522 har sina adresser mellan $ 6000 och $ 600F och spärren är på $ 4100, stoppar det alla minneskonflikter.

NMI -vektorn ($ FFFA och $ FFFB) och BRK / IRQ -vektorn ($ FFFE och $ FFFF) kan också skrivas på samma sätt.

Steg 3: Programmering av EEPROM

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

För att lagra ett program på EEPROM behöver det en programmerare. Jag gjorde en av en bandplatta, en Arduino Pro Mini, ett par 74HC595: er och och ett ZIF -uttag. Ursprungligen gjordes programmeraren för en AT28C16 som har färre adressrader än AT28C256 så den måste ändras.

Kretsschemat visar hur man kopplar båda dessa EEPROM. Det framgår inte av fotot att de två 595 chipsen är upp och ner och inte som visas på diagrammet. Stiften 1 till 7 av 595/1 ligger i linje med A1 till A7 i EEPROM, oavsett vilken som används. Detta sparar 7 anslutningskablar. Kortet ser nu lite tätt ut och det beror på att jag ursprungligen använde ett 24 -stifts DIL -uttag som nu har ersatts av det mycket större 28 -stifts ZIF -uttaget.

Ett program ingår som fungerar med min styrelse. Programmet fungerar med alla Arduino och 595 i en krets som visas. Jag valde en 5v Pro Mini eftersom den är kompakt och billig nog att lämna i installationen.

Steg 4: EEPROM -programmen

EEPROM -programmen
EEPROM -programmen

Det finns tre enkla program i EEPROM programmerare. För att använda dem, avmarkera bara raden du vill använda.

// Läst från port A 6522

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

Programmet visar en minnesdump när den är klar. Delen av programmet nedan ger dig full kontroll över vad du vill skriva eller radera, ställer in $ FFFC & $ FFFD och visar sedan innehållet i ett givet intervall. Bara att kommentera eller ändra parametrarna som du behöver. Adresserna kan också anges i decimalformat.

// radera EEPROM (422, 930, 0x41); // Använd för att radera hela eller delar av EEPROM - start, slut, byte

Serial.println ("Programmering av EEPROM"); mängd = program_numerisk_data (0x1000); writeEEPROM (0x7ffc, 0x00); // Ställ in $ FFFC för 6502 writeEEPROM (0x7ffd, 0x90); // Ställ in $ FFFD för 6502 // writeEEPROM (0x1000, 0xA9); // Skriv 1 byte med data Serial.println ("klart"); String outline = "Skriven" + (String) mängd + "byte"; Serial.println (disposition); Serial.println ("Läser EEPROM"); printContents (0x0000, 0x112f); // Ställ in intervall för att visa printContents (0x7ff0, 0x7fff); // Läser de senaste 16 bytesna på EEPROM

En förkortad utmatning från programmet är ovan.

Steg 5: Kör 6502 från EEPROM

Kör 6502 från EEPROM
Kör 6502 från EEPROM
Kör 6502 från EEPROM
Kör 6502 från EEPROM
Kör 6502 från EEPROM
Kör 6502 från EEPROM

Den programmerade EEPROM kan nu sättas in i sitt bräda och denna spargris backar till huvud 6502 -kortet som grisar tillbaka på MEGA. Sidan och ovanifrån bilderna ovan visar hur allt hänger ihop.

6502 kan nu läsa startvektorn från $ FFFC och $ FFFD (vilket är $ 9000) och sedan hoppa till programmet som lagras där. MEGA tillhandahåller fortfarande klocksignalen och dess program måste ändras för att ge endast klocksignalen och övervaka 6502. Ett modifierat program tillhandahålls för att göra detta.

Det löpande fotot visar detta program som körs.

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

Brytarna är anslutna till port A och programmet visar det värde det läser på port B och 74HC373 (som för närvarande är skymd). omkopplarna är anslutna till jord och lysdioderna är anslutna till 5v. EOR #$ FF korrigerar problemet med spärren och port B som visar olika mönster genom att vända bitarna innan de skrivs till spärren.

Steg 6: Extern tidssignal

Extern tidssignal
Extern tidssignal

Om en klocksignal appliceras på tappen på toppen av kortet kan 6502 nu köras oberoende av MEGA. Naturligtvis behöver den också en strömförsörjning. Jag har experimenterat med olika klockor och till och med kör 6502 vid 1MHz med en kristalloscillator. MEGA kan inte hänga med i snabbare hastigheter, så måste tas bort.

Jag testade också utmatningen från en 555 -timer men det fungerar inte. Jag tror att det kan bero på att det inte är en fyrkantvåg? När den var ansluten till en av CD4017 -utgångarna körde den 6502. Jag lappade in i ett av satserna ovan för att försöka få en klocksignal.

Jag tittar fortfarande på olika metoder för att få en klocksignal.

Steg 7: Slutsats

Jag har visat hur man bygger några komplexa kretsar och får en mycket enkel "dator" att arbeta med en minimal mängd delar. Visst, datorn kan inte göra så mycket för närvarande eller kommer sannolikt att göra det i framtiden.

I början av 80 -talet, med min VIC20, brukade jag undra över den fantastiska maskinen och inte ha den första uppfattningen om hur jag ska börja sätta ihop en. Tiderna har gått och tekniken har också gått, men det är fortfarande skönt att komma tillbaka till grunderna och vara stolt över något du har byggt från grunden.

För att vidareutveckla den här datorn tänker jag lägga 2k SRAM på $ 0000 till $ 2047 och lägga till en 1 MHz oscillator. Kommer förmodligen att lägga till något som en CD4040 (12-stegs binär rippelräknare / avdelare) så att jag kan utnyttja olika klockhastigheter.

Kan till och med lägga till en LCD -skärm för att ge textutmatning snarare än bara blinkande lampor. EEPROM -programmeraren måste också modifieras för att hantera de större program som behövs för att köra en LCD -skärm.

Även om MEGA blir onödigt för driften av 6502, är det fortfarande praktiskt för felsökning av maskinkoden. Som någon vet innehåller maskinkoden alltid buggar!

Rekommenderad: