Inhoudsopgave:

6502 Minimal Computer (met Arduino MEGA) Deel 3: 7 stappen
6502 Minimal Computer (met Arduino MEGA) Deel 3: 7 stappen

Video: 6502 Minimal Computer (met Arduino MEGA) Deel 3: 7 stappen

Video: 6502 Minimal Computer (met Arduino MEGA) Deel 3: 7 stappen
Video: Assembly and Review - PE6502 Hobby Computer 2024, Juli-
Anonim
6502 Minimal Computer (met Arduino MEGA) Deel 3
6502 Minimal Computer (met Arduino MEGA) Deel 3

Om nog verder te gaan, heb ik nu een Octal Latch, 8 rechthoekige LED's en een 220 Ohm weerstandsarray aan het moederbord toegevoegd. Er is ook een jumper tussen de gemeenschappelijke pin van de array en aarde, zodat de LED's kunnen worden uitgeschakeld. De 74HC00 NAND-poort is vervangen door een 78LS08 AND-poort, ook de bedrading naar de poort is gewijzigd. De EN-poort betekent dat de 6522 zich nu op $ 6000 bevindt in plaats van $ E000.

Er is ook een pin voor de aansluiting van een externe klok om de 6502 aan te sturen. Bij deze aansluiting hoeft de MEGA geen kloksignaal te leveren. De MEGA houdt nog steeds als voorheen in de gaten wat er met de processor gebeurt.

Ik gebruikte een 20-pins 74HC373 voor de grendel omdat ik er een paar had. Dit was OK op het breadboard, maar een 74HC573 is buscompatibel en zou veel bedrading hebben bespaard. De UCN5801A, een 22-pins IC, kan ook in het circuit worden overwogen, maar de bedrading zal iets anders zijn.

De bovenste, enkele oranje LED is een stroomindicator en de rode linksonder geeft aan wanneer er wordt geschreven. Dit laatste zal onbeduidend zijn als het bord op hogere snelheden wordt gebruikt.

De aangepaste schakeling staat hierboven (bij de 74HC573).

Stap 1: Demonstratieprogramma's

Demonstratieprogramma's
Demonstratieprogramma's

Twee eenvoudige demonstratieprogramma's zijn opgenomen in de 6502-monitor en hun gedemonteerde code is hier.

Dit programma laadt 1 in het 6502 A-register en slaat het op in de grendel. Het voegt vervolgens 1 toe aan het A-register en slaat dat op in de vergrendeling. Dan springt het terug naar $ 105 en het proces herhaalt zich voor altijd.

* = 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

Dit programma stelt eerst de DDR van de 6522 poort B in op output. Het slaat dan $ 55 (B01010101) op in de poort en in de vergrendeling. Het A-register draait dan 1 stap naar rechts en bevat nu $AA (B1010010). Deze wordt weer opgeslagen in poort B en de grendel. Het programma springt terug naar $ 105 en gaat voor altijd door.

* = 1000

1000 A9 FF LDA #$FF 1002 8D 02 60 STA $6002 1005 A9 55 LDA #$55 1007 38 SEC 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 scherpe ogen onder jullie zullen misschien opmerken dat de gekleurde LED's een ander patroon vertonen dan de groene. Dit komt omdat de gemeenschappelijke kabel is aangesloten op 5v op de gekleurde en de gemeenschappelijke op de groene is aangesloten op aarde.

Verander deze regel code in programma2 of programma3.

setDataPins (programma3 [offset]);

A 6502 Assembler en Disassembler zijn handige hulpmiddelen om uw programma's te coderen.

Stap 2: Een EEPROM toevoegen

Een EEPROM toevoegen
Een EEPROM toevoegen
Een EEPROM toevoegen
Een EEPROM toevoegen
Een EEPROM toevoegen
Een EEPROM toevoegen

Voor het EEPROM-bord heb ik een stripbord van 950 x 650 mm en mannelijke koppennen van 19 mm gebruikt om het bord in staat te stellen de onderliggende vrij te maken. Dit bord wordt aangesloten op het onderstaande 6502-bord. De EEPROM is een ATMEL 28C256 die 28 pinnen heeft en 32k x 8 bits geheugen bevat. Dit is meer dan voldoende voor de kleine programma's die momenteel worden gebruikt.

Ik heb geen schakelschema voor dit bord gemaakt, maar het is vrij eenvoudig hoe het wordt aangesloten op het onderstaande 6502-bord. Deze EEPROM-chips zijn niet busvriendelijk, dus moeten ze worden aangesloten op de afzonderlijke pinnen, vandaar alle "groene en witte spaghetti". Ik heb het overbruggingsprobleem op het eerdere bord opgelost door de datalijnen aan de onderkant van het bord aan elkaar te bedraden.

De 14 adrespinnen van de EEPROM worden aangesloten op de juiste pinnen aan de linkerkant (groene draden) en de I/O-pinnen op de datapinnen aan de rechterkant (witte draden). Pin 27 (WE) is verbonden met pin 28 (5v), pin 22 (OE) is verbonden met aarde en pin 20 (CE) is verbonden met een NAND-poort. De 2 ingangen van de NAND-poort zijn verbonden met A15 op de hoofdbord. Dit betekent dat wanneer deze pin hoog wordt, de NAND-poort een laag signaal geeft aan de CE-pin van de EEPROM waardoor deze actief wordt. Met deze opzet betekent dit dat de EEPROM alleen door de 6502 kan worden uitgelezen.

Omdat de EEPROM in de top 32k op de geheugenkaart staat, betekent dit dat $FFFC en $FFFD het startadres voor de 6502 kunnen bevatten nadat deze is gereset. Met de 6522 met adressen tussen $ 6000 en $ 600F en de vergrendeling op $ 4100, stopt het alle geheugenconflicten.

De NMI-vector ($FFFA en $FFFB) en BRK / IRQ-vector ($FFFE en $FFFF) kunnen ook op dezelfde manier worden geschreven.

Stap 3: Programmeren van de EEPROM

Programmeren van de EEPROM
Programmeren van de EEPROM
Programmeren van de EEPROM
Programmeren van de EEPROM

Om een programma op de EEPROM op te slaan, heeft het een programmeur nodig. Ik heb er een gemaakt van een stripbord, een Arduino Pro Mini, een paar 74HC595's en een ZIF-socket. Oorspronkelijk was de programmer gemaakt voor een AT28C16 die minder adresregels heeft dan de AT28C256 en moest dus worden aangepast.

Het schakelschema laat zien hoe beide EEPROM's moeten worden aangesloten. Op de foto is niet duidelijk te zien dat de twee 595-chips ondersteboven liggen en niet zoals op de afbeelding te zien is. Pins 1 tot 7 van 595/1 komen overeen met A1 tot A7 van de EEPROM, ongeacht welke wordt gebruikt. Dit scheelt 7 aansluitdraden. Het bord ziet er nu wat strak uit en dit komt omdat ik oorspronkelijk een 24-pins DIL-socket gebruikte die nu is vervangen door de veel grotere 28-pins ZIF-socket.

Er wordt een programma meegeleverd dat werkt met mijn bord. Het programma werkt met elke Arduino en 595s in een circuit zoals weergegeven. Ik koos voor een 5v Pro Mini omdat deze compact en goedkoop genoeg is om in de set-up te laten staan.

Stap 4: De EEPROM-programma's

De EEPROM-programma's
De EEPROM-programma's

Er zijn drie eenvoudige programma's in de EEPROM-programmeur. Om ze te gebruiken, hoeft u alleen maar de regel die u wilt gebruiken te verwijderen.

// Lezen van poort A van 6522

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

Het programma toont een geheugendump als het klaar is. Het deel van het programma hieronder geeft je volledige controle over wat je wilt schrijven of wissen, stelt $FFFC & $FFFD in en geeft vervolgens de inhoud van een bepaald bereik weer. Maak gewoon een opmerking of wijzig de parameters naar wens. De adressen kunnen ook in decimaal formaat worden ingevoerd.

// wis EEPROM (422, 930, 0x41); // Gebruik om de EEPROM geheel of gedeeltelijk te wissen - start, end, byte

Serial.println ("Programmeer-EEPROM"); bedrag = program_numeric_data(0x1000); schrijfEEPROM (0x7ffc, 0x00); // Stel $FFFC in voor 6502 writeEEPROM (0x7ffd, 0x90); // Stel $FFFD in voor 6502 //writeEEPROM (0x1000, 0xA9); // Schrijf 1 byte aan gegevens Serial.println ("klaar"); String outline = " Geschreven " + (String)bedrag + " bytes"; Serial.println(overzicht); Serial.println ("EEPROM lezen"); printContents (0x0000, 0x112f); // Stel het bereik in om printContents (0x7ff0, 0x7fff) weer te geven; // Leest laatste 16 bytes op EEPROM

Een verkorte uitvoer van het programma staat hierboven.

Stap 5: De 6502 uitvoeren vanaf de EEPROM

De 6502 uitvoeren vanaf de EEPROM
De 6502 uitvoeren vanaf de EEPROM
De 6502 uitvoeren vanaf de EEPROM
De 6502 uitvoeren vanaf de EEPROM
De 6502 uitvoeren vanaf de EEPROM
De 6502 uitvoeren vanaf de EEPROM

De geprogrammeerde EEPROM kan nu in zijn bord worden gestoken en dit gaat mee met het 6502-hoofdbord dat meelift met de MEGA. De foto's van het zij- en bovenaanzicht hierboven laten zien hoe het allemaal in elkaar past.

De 6502 kan nu de startvector van $FFFC en $FFFD (dat is $9000) lezen en dan naar het programma springen dat daar is opgeslagen. De MEGA levert nog steeds het kloksignaal en het programma moet worden gewijzigd om alleen het kloksignaal te leveren en de 6502 te bewaken. Hiervoor is een aangepast programma beschikbaar.

De lopende foto toont dit programma in werking.

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

De schakelaars zijn aangesloten op poort A en het programma geeft de waarde weer die het leest op poort B en de 74HC373 (die momenteel verborgen is). de schakelaars zijn verbonden met aarde en de LED's zijn verbonden met 5v. De EOR #$FF corrigeert het probleem dat de vergrendeling en poort B verschillende patronen weergeven door de bits om te draaien voordat ze naar de vergrendeling schrijven.

Stap 6: Extern tijdsignaal

Extern tijdsignaal
Extern tijdsignaal

Als een kloksignaal wordt toegepast op de pin aan de bovenkant van het bord, kan de 6502 nu onafhankelijk van de MEGA draaien. Natuurlijk heeft het ook een voeding nodig. Ik heb met verschillende klokken geëxperimenteerd en heb zelfs de 6502 op 1 MHz gedraaid met een kristaloscillator. De MEGA kan de hogere snelheden niet bijhouden en moet daarom worden verwijderd.

Ik heb ook de uitvoer van een 555-timer geprobeerd, maar dat werkt niet. Ik denk dat het misschien komt omdat het geen blokgolf is? Wanneer aangesloten op een van de CD4017-uitgangen, dreef het de 6502 aan. Ik heb een van de bovenstaande kits gepatcht om te proberen een kloksignaal te krijgen.

Ik ben nog steeds op zoek naar verschillende methoden om een kloksignaal te krijgen.

Stap 7: Conclusie

Ik heb laten zien hoe je een aantal complexe circuits kunt bouwen en een heel eenvoudige "computer" kunt laten werken met een minimale hoeveelheid onderdelen. Toegegeven, de computer kan op dit moment niet veel, of zal dat in de toekomst waarschijnlijk doen.

In de vroege jaren 80, met mijn VIC20, verwonderde ik me over de geweldige machine en had ik niet het eerste idee hoe ik er een in elkaar moest zetten. De tijden zijn verder gegaan en de technologie ook, maar het is nog steeds leuk om terug te gaan naar de basis en trots te zijn op iets dat je helemaal opnieuw hebt opgebouwd.

Om deze computer verder te ontwikkelen, ben ik van plan om 2k SRAM op $ 0000 tot $ 2047 te zetten en een 1 MHz-oscillator toe te voegen. Zal waarschijnlijk iets toevoegen als een CD4040 (12-Stage Binary Ripple Counter / Divider) zodat ik verschillende kloksnelheden kan aanboren.

Kan zelfs een LCD-scherm toevoegen om tekstuitvoer te geven in plaats van alleen knipperende lampjes. De EEPROM-programmeur moet ook worden aangepast om de grotere programma's aan te kunnen die nodig zijn om een LCD-scherm te laten werken.

Hoewel de MEGA overbodig wordt voor het draaien van de 6502, is het nog steeds handig voor het debuggen van de machinecode. Zoals iedereen weet, bevat machinecode altijd bugs!

Aanbevolen: