Inhaltsverzeichnis:

6502 Minimal Computer (mit Arduino MEGA) Teil 3: 7 Schritte
6502 Minimal Computer (mit Arduino MEGA) Teil 3: 7 Schritte

Video: 6502 Minimal Computer (mit Arduino MEGA) Teil 3: 7 Schritte

Video: 6502 Minimal Computer (mit Arduino MEGA) Teil 3: 7 Schritte
Video: [TriOS#05]: PropForth - Teil 1 - Ein Eigenbau-Forth-Computer 2024, Juli
Anonim
6502 Minimal Computer (mit Arduino MEGA) Teil 3
6502 Minimal Computer (mit Arduino MEGA) Teil 3

Um noch weiter zu gehen, habe ich der Hauptplatine jetzt einen Octal Latch, 8 rechteckige LEDs und ein 220 Ohm Widerstandsarray hinzugefügt. Es gibt auch einen Jumper zwischen dem gemeinsamen Pin des Arrays und Masse, damit die LEDs ausgeschaltet werden können. Das 74HC00 NAND-Gatter wurde durch ein 78LS08 UND-Gatter ersetzt, auch die Verdrahtung zum Gate wurde geändert. Das UND-Gatter bedeutet, dass der 6522 jetzt bei $6000 statt $E000 liegt.

Es gibt auch einen Pin für den Anschluss einer externen Clock zur Ansteuerung des 6502. Mit diesem Anschluss muss der MEGA kein Clock-Signal bereitstellen. Der MEGA überwacht weiterhin wie bisher, was mit dem Prozessor passiert.

Ich habe einen 20-poligen 74HC373 für die Verriegelung verwendet, weil ich welche hatte. Dies war auf dem Steckbrett in Ordnung, aber ein 74HC573 ist buskompatibel und hätte viel Verkabelung gespart. Der UCN5801A, ein 22-Pin-IC, könnte auch in der Schaltung berücksichtigt werden, aber die Verdrahtung ist etwas anders.

Die obere, einzelne orangefarbene LED ist eine Betriebsanzeige und die untere linke rote zeigt an, wenn ein Schreibvorgang stattfindet. Letzteres ist unbedeutend, wenn das Board mit höheren Geschwindigkeiten betrieben wird.

Die geänderte Schaltung ist oben (mit dem 74HC573).

Schritt 1: Demonstrationsprogramme

Demonstrationsprogramme
Demonstrationsprogramme

Zwei einfache Demonstrationsprogramme sind im 6502-Monitor enthalten und ihr zerlegter Code ist hier.

Dieses Programm lädt 1 in das 6502 A-Register und speichert es im Latch. Es addiert dann 1 zum A-Register und speichert diese im Latch. Dann springt es zurück auf $1005 und der Vorgang wiederholt sich für immer.

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

Dieses Programm setzt zuerst den DDR des 6522 Port B auf Ausgabe. Es speichert dann $55 (B01010101) im Port sowie im Latch. Das A-Register dreht sich dann um 1 Schritt nach rechts und enthält jetzt $AA (B10101010). Dies wird wiederum in Port B und dem Latch gespeichert. Das Programm springt auf $1005 zurück und wird für immer fortgesetzt.

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

Die scharfäugigen unter Ihnen werden feststellen, dass die farbigen LEDs ein anderes Muster aufweisen als die grünen. Dies liegt daran, dass das gemeinsame Kabel bei den farbigen mit 5 V und das gemeinsame bei den grünen mit Masse verbunden ist.

Ändern Sie diese Codezeile in program2 oder program3.

setDataPins(Programm3[Offset]);

A 6502 Assembler und Disassembler sind nützliche Werkzeuge, um Ihre Programme zu codieren.

Schritt 2: Hinzufügen eines EEPROM

Hinzufügen eines EEPROM
Hinzufügen eines EEPROM
Hinzufügen eines EEPROM
Hinzufügen eines EEPROM
Hinzufügen eines EEPROM
Hinzufügen eines EEPROM

Für die EEPROM-Platine habe ich eine 950 x 650-mm-Streifenplatine und 19-mm-Stiftleisten verwendet, damit die Platine die darunter liegende freigeben kann. Diese Platine wird in die darunter liegende 6502-Platine eingesteckt. Das EEPROM ist ein ATMEL 28C256 mit 28 Pins und 32k x 8 Bit Speicher. Dies ist für die kleinen Programme, die derzeit verwendet werden, mehr als ausreichend.

Ich habe keinen Schaltplan für diese Platine erstellt, aber es ist ziemlich einfach, wie sie mit der 6502-Platine unten verbunden wird. Diese EEPROM-Chips sind nicht busfreundlich, müssen also mit den einzelnen Pins verdrahtet werden, daher alle "grünen und weißen Spaghetti". Ich habe das Überbrückungsproblem auf der früheren Platine gelöst, indem ich die Datenleitungen auf der Unterseite der Platine miteinander verdrahtet habe.

Die 14 Adresspins des EEPROMs werden mit den entsprechenden Pins auf der linken Seite (grüne Drähte) und die I/O-Pins mit den Datenpins auf der rechten Seite (weiße Drähte) verbunden. Pin 27 (WE) ist mit Pin 28 (5v) verbunden, Pin 22 (OE) ist mit Masse verbunden und Pin 20 (CE) ist mit einem NAND-Gatter verbunden. Die 2 Eingänge des NAND-Gatters sind mit A15 auf der verbunden Hauptplatine. Dies bedeutet, dass das NAND-Gatter, wenn dieser Pin auf High geht, ein Low-Signal an den CE-Pin des EEPROMs gibt, wodurch es aktiv wird. Bei dieser Konfiguration bedeutet dies, dass das EEPROM nur vom 6502 gelesen werden kann.

Da sich das EEPROM in den oberen 32k der Speicherkarte befindet, bedeutet dies, dass $FFFC und $FFFD die Startadresse für den 6502 nach dem Zurücksetzen halten können. Da der 6522 seine Adressen zwischen $6000 und $600F hat und der Latch bei $4100 liegt, stoppt er alle Speicherkonflikte.

Ebenso könnten der NMI-Vektor ($FFFA und $FFFB) und der BRK / IRQ-Vektor ($FFFE und $FFFF) geschrieben werden.

Schritt 3: Programmierung des EEPROM

Programmierung des EEPROM
Programmierung des EEPROM
Programmierung des EEPROM
Programmierung des EEPROM

Um ein Programm auf dem EEPROM zu speichern, benötigt es einen Programmierer. Ich habe einen aus einem Stripboard, einem Arduino Pro Mini, ein paar 74HC595 und einem ZIF-Sockel gemacht. Ursprünglich wurde der Programmierer für einen AT28C16 entwickelt, der weniger Adressleitungen hat als der AT28C256 und musste daher modifiziert werden.

Der Schaltplan zeigt, wie diese beiden EEPROMs verdrahtet werden. Auf dem Foto ist nicht zu erkennen, dass die beiden 595-Chips auf dem Kopf stehen und nicht wie auf der Abbildung dargestellt. Die Pins 1 bis 7 von 595/1 stimmen mit A1 bis A7 des EEPROM überein, unabhängig davon, welches verwendet wird. Das spart 7 Anschlussdrähte. Die Platine sieht jetzt etwas eng aus und das liegt daran, dass ich ursprünglich eine 24-polige DIL-Buchse verwendet habe, die jetzt durch die viel größere 28-polige ZIF-Buchse ersetzt wurde.

Ein Programm ist enthalten, das mit meinem Board funktioniert. Das Programm funktioniert mit jedem Arduino und 595s in einer Schaltung wie gezeigt. Ich habe mich für einen 5v Pro Mini entschieden, weil er kompakt und billig genug ist, um ihn im Setup zu belassen.

Schritt 4: Die EEPROM-Programme

Die EEPROM-Programme
Die EEPROM-Programme

Es gibt drei einfache Programme im EEPROM-Programmierer. Um sie zu verwenden, entkommentieren Sie einfach die Zeile, die Sie verwenden möchten.

// Lesen von Port A von 6522

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

Das Programm zeigt einen Speicherabzug an, wenn es fertig ist. Der folgende Teil des Programms gibt Ihnen die volle Kontrolle darüber, was Sie schreiben oder löschen möchten, legt $FFFC & $FFFD fest und zeigt dann den Inhalt eines bestimmten Bereichs an. Entkommentieren oder ändern Sie die Parameter nach Bedarf. Die Adressen können auch im Dezimalformat eingegeben werden.

// löscheEEPROM (422, 930, 0x41); // Zum Löschen des gesamten oder eines Teils des EEPROM - Start, Ende, Byte

Serial.println ("Programmieren von EEPROM"); Betrag = program_numeric_data(0x1000); writeEEPROM (0x7ffc, 0x00); // Setze $FFFC für 6502 writeEEPROM (0x7ffd, 0x90); // Setze $FFFD für 6502 //writeEEPROM (0x1000, 0xA9); // 1 Byte Daten schreiben Serial.println ("fertig"); String-Umriss = " Geschrieben " + (String-)Betrag + " Bytes"; Serial.println (Übersicht); Serial.println ("EEPROM lesen"); printContents(0x0000, 0x112f); // Bereich für die Anzeige von printContents (0x7ff0, 0x7fff) einstellen; // Liest die letzten 16 Bytes auf EEPROM

Eine gekürzte Ausgabe des Programms ist oben.

Schritt 5: Ausführen des 6502 vom EEPROM

Ausführen des 6502 aus dem EEPROM
Ausführen des 6502 aus dem EEPROM
Ausführen des 6502 aus dem EEPROM
Ausführen des 6502 aus dem EEPROM
Ausführen des 6502 aus dem EEPROM
Ausführen des 6502 aus dem EEPROM

Das programmierte EEPROM kann nun in seine Platine eingefügt werden und diese wird auf der Hauptplatine 6502 huckepack angeschlossen, die auf dem MEGA huckepack steckt. Die Seiten- und Draufsichtfotos oben zeigen, wie alles zusammenpasst.

Der 6502 kann nun den Startvektor aus $FFFC und $FFFD (also $9000) lesen und dann zu dem dort abgelegten Programm springen. Der MEGA liefert immer noch das Taktsignal und sein Programm muss geändert werden, um nur das Taktsignal bereitzustellen und den 6502 zu überwachen. Dazu wird ein modifiziertes Programm bereitgestellt.

Das laufende Foto zeigt dieses Programm ausgeführt.

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

Die Switches werden an Port A angeschlossen und das Programm zeigt den Wert an, den es auf Port B und dem 74HC373 (der derzeit verdeckt ist) liest. die Schalter sind mit Masse verbunden und die LEDs sind mit 5V verbunden. Das EOR #$FF korrigiert das Problem, dass das Latch und Port B unterschiedliche Muster anzeigen, indem die Bits umgedreht werden, bevor in das Latch geschrieben wird.

Schritt 6: Externes Zeitsignal

Externes Zeitsignal
Externes Zeitsignal

Wird am Pin oben auf der Platine ein Taktsignal angelegt, kann der 6502 nun unabhängig vom MEGA laufen. Natürlich braucht es auch eine Stromversorgung. Ich habe mit verschiedenen Taktgebern experimentiert und den 6502 sogar mit 1MHz mit einem Quarzoszillator betrieben. Der MEGA kann mit höheren Geschwindigkeiten nicht mithalten und muss daher entfernt werden.

Ich habe auch die Ausgabe eines 555-Timers ausprobiert, aber das funktioniert nicht. Ich denke, es könnte daran liegen, dass es keine Rechteckwelle ist? Wenn es an einen der CD4017-Ausgänge angeschlossen war, trieb es den 6502 an. Ich habe eines der obigen Kits gepatcht, um zu versuchen, ein Taktsignal zu erhalten.

Ich suche immer noch nach verschiedenen Methoden, um ein Taktsignal zu erhalten.

Schritt 7: Fazit

Ich habe gezeigt, wie man einige komplexe Schaltungen baut und einen sehr einfachen "Computer" mit einer minimalen Anzahl von Teilen zum Arbeiten bringt. Zugegeben, der Computer kann derzeit nicht viel leisten oder wird dies wahrscheinlich in Zukunft tun.

In den frühen 80er Jahren, mit meinem VIC20, habe ich mich über die großartige Maschine gewundert und nicht die erste Idee gehabt, wie ich anfangen soll, eine zusammenzubauen. Die Zeiten haben sich weiterentwickelt und die Technologie auch, aber es ist immer noch schön, zu den Grundlagen zurückzukehren und stolz auf etwas zu sein, das man von Grund auf neu aufgebaut hat.

Um diesen Computer weiterzuentwickeln, beabsichtige ich, 2k SRAM auf 0000 bis 2047 US-Dollar zu setzen und einen 1-MHz-Oszillator hinzuzufügen. Werde wahrscheinlich so etwas wie einen CD4040 (12-Stage Binary Ripple Counter / Divider) hinzufügen, damit ich verschiedene Taktraten anzapfen kann.

Könnte sogar ein LCD-Display hinzufügen, um Textausgaben statt nur blinkender Lichter zu ermöglichen. Der EEPROM-Programmierer muss auch modifiziert werden, um mit den größeren Programmen fertig zu werden, die zum Ausführen eines LCD-Displays erforderlich sind.

Auch wenn MEGA für den Betrieb des 6502 überflüssig wird, ist es dennoch praktisch, um den Maschinencode zu debuggen. Wie jeder weiß, enthält Maschinencode immer Fehler!

Empfohlen: