„MOS Technology 6502“ – Versionsunterschied
[ungesichtete Version] | [ungesichtete Version] |
Toten Link durch Link auf Vortragsfolien ersetzt. |
K Datenblatt MOS 65xx verlinkt Markierungen: Zurückgesetzt Visuelle Bearbeitung |
||
Zeile 37: | Zeile 37: | ||
* Technologie: [[NMOS-Logik|NMOS]], [[HMOS]], [[Complementary metal-oxide-semiconductor|CMOS]] |
* Technologie: [[NMOS-Logik|NMOS]], [[HMOS]], [[Complementary metal-oxide-semiconductor|CMOS]] |
||
* Anzahl Transistoren: ca. 3510<ref>[http://hardware.slashdot.org/story/11/01/07/023215/preserving-great-tech-for-posterity-the-6502 Transistor count in 6502]</ref><ref> |
* Anzahl Transistoren: ca. 3510<ref>[http://hardware.slashdot.org/story/11/01/07/023215/preserving-great-tech-for-posterity-the-6502 Transistor count in 6502]</ref><ref>[https://www.youtube.com/watch?v=K5miMbqYB4E Reverse Engineering the 6502 ... with 3,510 transistors]</ref> |
||
* Taktfrequenz: traditionell 20 kHz bis 4 MHz; CMOS-Version 0 bis 14 MHz |
* Taktfrequenz: traditionell 20 kHz bis 4 MHz; CMOS-Version 0 bis 14 MHz |
||
* Taktzyklen je Befehl: 2 bis 7 |
* Taktzyklen je Befehl: 2 bis 7 |
||
Zeile 107: | Zeile 107: | ||
Mit vielen undokumentierten Opcodes lässt sich die Datenverarbeitung beschleunigen, da sie in wenigen Taktzyklen Funktionen erledigen, die sonst nur mit mehreren aufeinanderfolgenden Befehlen möglich sind, was insgesamt erheblich mehr Taktzyklen verbraucht. Dies birgt allerdings das Risiko, dass solche Befehle nicht auf allen produzierten CPUs gleichermaßen funktionieren oder ein mögliches Nachfolgemodell diese Befehle gar nicht beherrscht oder andere Funktionen ausführt, wodurch das Programm nicht mehr lauffähig wäre. |
Mit vielen undokumentierten Opcodes lässt sich die Datenverarbeitung beschleunigen, da sie in wenigen Taktzyklen Funktionen erledigen, die sonst nur mit mehreren aufeinanderfolgenden Befehlen möglich sind, was insgesamt erheblich mehr Taktzyklen verbraucht. Dies birgt allerdings das Risiko, dass solche Befehle nicht auf allen produzierten CPUs gleichermaßen funktionieren oder ein mögliches Nachfolgemodell diese Befehle gar nicht beherrscht oder andere Funktionen ausführt, wodurch das Programm nicht mehr lauffähig wäre. |
||
Einige inoffizielle Funktionen des 6502 sind (Mnemonics nur inoffiziell):<ref>[http://bbc.nvg.org/doc/6502OpList.txt Full 6502 Opcode List Including Undocumented Opcodes], J.G.Harston, 25. November 1998</ref> |
|||
{| class="wikitable" |
{| class="wikitable" |
||
|- |
|- |
||
! Opcode !! Mnemonic !! Funktion |
! Opcode !! Mnemonic !! Funktion |
||
|- |
|- |
||
| <code>$ |
| <code>$AF</code> || <code>LDA-LDX $C000</code> || Lädt den Akkumulator sowie das Register X gleichermaßen mit dem Inhalt der absoluten Speicheradresse <code>C000<sub>16</sub></code> hexadezimal (49152 dezimal). |
||
|- |
|||
| || <code>HALT</code> || Hält den Prozessor an. Führt faktisch zum Absturz, der nur durch einen Reset zu beheben ist. |
|||
|- |
|- |
||
⚫ | | || <code>NOP</code> || "'''N'''o '''OP'''eration". Befehl ohne Funktion. Wie bei den meisten Opcodes gibt es auch mehrere für <code>NOP</code> mit unterschiedlichen Adressierungsarten, welche sich jedoch effektiv nur in der Anzahl verwendeter Bytes und verbrauchter Taktzyklen unterscheiden. <code>NOP</code> wird zum Überspringen von mehreren Bytes im Programm benutzt. |
||
| <code>$0B</code> || <code>AND #n‑MOV b7‑>Cy</code> || Adressierungsart „immediate“. Führt eine UND-Verknüpfung des Akkumulators mit #n durch und übernimmt das siebte Bit des Akkumulators als neuen Zustand für das Carry-Flag. |
|||
|- |
|- |
||
| || <code>ASL-ORA</code> || Führt <code>ASL</code> mit den Daten aus und verknüpft den Inhalt des Akkumulators ODER mit dem Ergebnis. |
|||
⚫ | |||
|- |
|- |
||
| |
| || <code>AND #n‑MOV b7‑>Cy</code> || Führt eine UND-Verknüpfung der Daten mit dem Inhalt des Akkumulators durch und übernimmt das siebte Bit des Akkumulators als neuen Zustand für das Carry-Flag. |
||
|- |
|- |
||
| |
| || <code>ROL-AND</code> || Führt <code>ROL</code> mit den Daten aus und verknüpft den Inhalt des Akkumulators UND mit dem Ergebnis. |
||
|- |
|- |
||
| |
| || <code>LSR-EOR</code> || Führt <code>LSR</code> mit den Daten aus und verknüpft den Inhalt des Akkumulators EXKLUSIV-ODER mit dem Ergebnis. |
||
|- |
|- |
||
| |
| || <code>ROR-ADC</code> || Führt <code>ROR</code> mit den Daten aus und addiert das Ergebnis zum Inhalt des Akkumulators. |
||
|- |
|- |
||
⚫ | | || <code>STA-STX</code> || Soll den Inhalt des Akkumulators und des Registers X gleichzeitig an eine Speicheradresse schreiben. Dadurch, dass beide Registerinhalte gleichzeitig an der Busleitung liegen, ergibt das effektiv eine UND-Verknüpfung der beiden Register, die in die angegebene Speicheradresse geschrieben wird. Auch bekannt als SAX. |
||
⚫ | |||
|- |
|- |
||
⚫ | |||
⚫ | | |
||
|- |
|- |
||
| |
| || <code>LDA-LDX</code> || Lädt die gleichen Daten in den Akkumulator sowie in das Register X. Einige Adressierungsarten können instabil sein, der Befehl also mit unvorhersehbaren Seiteneffekten verknüpft sein. Auch bekannt als LAX. |
||
|- |
|- |
||
| |
| || <code>DEC-CMP</code> || Verringert den Wert der Daten um 1 und vergleicht das Ergebnis mit dem Inhalt des Akkumulators. |
||
|- |
|- |
||
| |
| || <code>INC-SBC</code> || Erhöht den Wert der Daten um 1 und subtrahiert das Ergebnis vom Inhalt des Akkumulators. |
||
|} |
|} |
||
== Taktvarianten des MOS 6502 == |
== Taktvarianten des MOS 6502 == |
||
Der Prozessor existiert in vier Varianten mit jeweils unterschiedlicher Taktfrequenz:<ref>{{Internetquelle |url=http://archive.6502.org/datasheets/mos_6500_mpu_nov_1985.pdf |titel=MOS Technoligy 650x Datasheet |seiten=1 |abruf=2021-03-15 |format=PDF |sprache=en}}</ref> |
|||
* ≈1 MHz: MOS 6502 |
* ≈1 MHz: MOS 6502 |
||
** in den Commodore-PET- und -CBM-Modellen [[PET 2001]] bis [[CBM-8000-Serie|CBM 8296]] sowie im [[Commodore VC 20|VC20]] und den Floppy-Laufwerken [[VC1540]] und [[VC1541]] |
** in den Commodore-PET- und -CBM-Modellen [[PET 2001]] bis [[CBM-8000-Serie|CBM 8296]] sowie im [[Commodore VC 20|VC20]] und den Floppy-Laufwerken [[VC1540]] und [[VC1541]] |
||
Zeile 310: | Zeile 310: | ||
* In dem Spielfilm [[Terminator (Film)|Terminator]] (1984) wird aus Sicht des Terminators ein 6502-Assembler-Programm angezeigt (vermutlich vom [[Apple IIe]]). Weiterhin wird das Ergebnis des [[Prüfsumme]]n-Programms [[Key Perfect]] (in der Version 4.0), das im ''[[Nibble (Zeitschrift)|Nibble magazine]]'' veröffentlicht wurde, angezeigt. |
* In dem Spielfilm [[Terminator (Film)|Terminator]] (1984) wird aus Sicht des Terminators ein 6502-Assembler-Programm angezeigt (vermutlich vom [[Apple IIe]]). Weiterhin wird das Ergebnis des [[Prüfsumme]]n-Programms [[Key Perfect]] (in der Version 4.0), das im ''[[Nibble (Zeitschrift)|Nibble magazine]]'' veröffentlicht wurde, angezeigt. |
||
* Laut Heise<ref>[http://heise.de/-1421469/ Wieder lieferbar: der 6502-Mikroprozessor]</ref> ist der Prozessor in der Variante 65C02 wieder (26. Januar 2012) lieferbar. |
* Laut Heise<ref>[http://heise.de/-1421469/ Wieder lieferbar: der 6502-Mikroprozessor]</ref> ist der Prozessor in der Variante 65C02 wieder (26. Januar 2012) lieferbar. |
||
* Für diesen Prozessor wurde eine |
* Für diesen Prozessor wurde eine Simlation auf seiner Transistor-Ebene in Software<ref>[http://visual6502.org/ visual6502.org]</ref> und in Hardware auf einer ca. 30 × 40 cm großen Platine ("MOnSter6502")<ref>[http://monster6502.com/ monster6502.com]</ref> erstellt. |
||
== Literatur == |
== Literatur == |
||
Zeile 321: | Zeile 321: | ||
== Weblinks == |
== Weblinks == |
||
{{Commonscat|MOS microprocessors}} |
{{Commonscat|MOS microprocessors}} |
||
* [http://archive.6502.org/datasheets/mos_6500_mpu_nov_1985.pdf MOS Technoligy 650x Datasheet.] |
|||
* [http://www.6502.org/ 6502.org] – Informationen zum 6502-Prozessor |
* [http://www.6502.org/ 6502.org] – Informationen zum 6502-Prozessor |
||
* [http://cbmmuseum.kuto.de/cpu_mos6502.html CCOM] – Commodore Computer Online Museum |
* [http://cbmmuseum.kuto.de/cpu_mos6502.html CCOM] – Commodore Computer Online Museum |
Version vom 15. März 2021, 20:51 Uhr
Der Computerchip MOS Technology MCS6502 ist ein 8-Bit-Mikroprozessor von MOS Technology, Inc.,[1] der 1975 auf den Markt kam. Wegen seines einfachen Aufbaus und vor allem seines im Vergleich zu den damals etablierten Intel- und Motorola-Prozessoren sehr niedrigen Preises bei vergleichbarer Leistungsfähigkeit wurde er in vielen Heimcomputern (zum Beispiel dem Commodore PET 2001 und dessen Nachfolger VC 20, dem Atari 800, Apple I, Apple II und BBC Micro), zahlreichen Schachcomputern (zum Beispiel dem Mephisto Polgar mit 5 oder 10 MHz), im weltweit ersten Skatcomputer Skat Champion, vielen Peripheriegeräten und zahlreichen Einplatinencomputern für Steuerungs- und Entwicklungszwecke eingesetzt. Der Prozessor wurde unter der Leitung von Chuck Peddle entwickelt.
Auch andere Mitglieder dieser Prozessorfamilie waren sehr erfolgreich, so der 6510, der Prozessor des Commodore 64, und der 6507 in den Atari-Spielkonsolen. Der Hauptkonkurrent von MOS Technology war damals Zilog, dessen Z80 zum Beispiel in vielen CP/M-Rechnern sowie in den Heimcomputern von Sinclair und Amstrad/Schneider zu finden war.
Allgemeines
Das Design des 6502 wurde an das des 8-Bit-Prozessors Motorola 6800 angelehnt (nicht zu verwechseln mit dem jüngeren Motorola 68000). Der Befehlssatz ist ähnlich, aber statt eines 16-Bit-Index-Registers werden zwei 8-Bit-Index-Register verwendet, deren Wert auf eine im Speicher (auch im Programmcode) vorgegebene 16-Bit-Adresse addiert werden kann.[2] Deswegen besteht hier für 6502-Programme die Notwendigkeit, Arrays, die größer als 256 Bytes sind, abschnittsweise anzusprechen.
Anders als 16-Bit-Register des 6800 oder etwa Z80, die eine absolute Adresse darstellen, enthalten die 8-Bit-Register des 6502 lediglich einen Array-Index (im engen Wertebereich von 0 bis 255), und in manchen Fällen kann ein einziger 8-Bit-Increment- oder -Decrement-Befehl sowohl das Zählen der Adressen als auch das Setzen der Bedingung für den Schleifenabbruch bei index=0 leisten, was zu kompakten und schnellen Schleifen führt. Der einfacher gehaltene Befehlssatz führt allerdings dazu, dass 6502-Programme im Normalfall deutlich mehr Speicher benötigen als das Gleiche leistende 6800- oder Z80-Programme; zudem sind standardkonforme Compiler für höhere Programmiersprachen wie etwa Pascal oder C auf dem 6502 deutlich schwieriger zu implementieren und erzeugen langsameren Code als auf anderen 8-Bit-Prozessoren. Die Ursache hierfür ist vor allem die auf 256 Bytes beschränkte Größe des Hardware-Stapelspeichers (siehe unten) im 6502, so dass der für die meisten modernen Hochsprachen nötige große Stapelspeicher per Software nachgebildet werden muss. Um die Chipfläche klein zu halten, hat der 6502 des Weiteren nur einen Akkumulator im Gegensatz zu den zwei Akkumulatoren A und B im 6800.
Der 64 KB große Adressraum des 6502 teilt sich in mehrere Bereiche auf, die sich vor allem an den Page-Grenzen orientieren, an denen das High-Byte der 16-Bit-Adresse seinen Wert wechselt, d. h. jede Page stellt einen zusammenhängenden Block von 256 Bytes dar:
- Zeropage (erste 256 Bytes), sie dient praktisch als Registerbank, auf ihre Inhalte kann besonders schnell zugegriffen werden, und jeweils zwei aufeinanderfolgende Bytes können als 16-Bit-Wert für diverse indirekte Adressierungsarten verwendet werden.
- Die folgenden 256 Bytes dienen als Stapelspeicher (Stack-Page), der von oben herab wächst. Wenn die in Anspruch genommene Stacktiefe unter Kontrolle gehalten wird, werden oft die unteren Bereiche dieser Page für andere Zwecke benutzt (wie normales RAM).
- Der ganze restliche Bereich, bis auf die allerletzten 6 Bytes, kann beliebig für RAM, ROM oder Memory Mapped I/O verwendet werden. Der 6502 beherrscht, anders als etwa der Z80, kein Isolated I/O.
- In den letzten 6 Bytes (FFFA16–FFFF16) stehen drei Zeiger für (von oben beginnend) den „normalen“ Interrupt (IRQ), den Reset-Vektor und den Non Maskable Interrupt (NMI). Damit diese Speicherstellen beim Reset vernünftige Werte enthalten, ist üblicherweise das Betriebssystem- oder Firmware-ROM am oberen Adressbereichsende angeordnet, während das RAM bei Adresse 0 beginnt. Bei einem Hardware-Reset wird also nicht wie bei vielen anderen Prozessoren einfach das ab Speicheradresse 0 vorgefundene Programm abgearbeitet, sondern der Vektor aus den beiden Adressen FFFC16–FFFD16 wird in den Programmzähler kopiert und dann ab dieser Stelle die Software abgearbeitet.
Technisch war MOS Technology mit dem 6502 durchaus innovativ:
- Er enthielt – im Gegensatz zu anderen Mikroprozessoren zu seiner Zeit – bereits einen integrierten Taktgenerator, der nur ein externes Taktsignal benötigte und selbst zwei nicht überlappende Taktsignale (φ1 und φ2) für seine internen Schaltkreise generierte.[1]
- Er war der erste Mikroprozessor mit rudimentärer (zweistufiger) Pipeline-Architektur, d. h. bis während des Ladens des ersten Operanden des nachfolgenden Opcodes (also des auf den Opcode folgenden Bytes) konnte eine Mikroinstruktion des zuvor geladenen Opcodes noch intern ausgeführt werden.[3] Eine echte Pipeline mit Überlappung der Lese- und Schreibzugriffe mehrerer Befehle gab es aber noch nicht.
- Sein Befehlssatz kann – zumindest im Vergleich zum Konkurrenzprodukt Intel 8080 – als „fast orthogonal“ angesehen werden.
- Anstelle von Mikrocode enthielt er ein PLA, dessen 130 Ausgänge in Abhängigkeit vom Maschinensprachebefehl, d. h. vom geladenen Opcode, und von dem internen Taktzähler die Ablaufsteuerung als erste Stufe übernahmen.[4] Die zweite Stufe der Ablaufsteuerung stellte die Random Control Logic dar, die schließlich die Signale zur Steuerung des Datenpfads erzeugte.[5]
Varianten des 6502-Prozessors wurden (Stand 2008) unter anderen in folgenden Geräten eingesetzt:
- Prozessorkern der Mikrocontroller Mitsubishi/Renesas (38000/740 Series)
- VMC Scal von Micronas Intermetall (eingesetzt in Automotive- und Fernseh-Technik)
- Taschenrechnern wie HP 35s
- Controller in verschiedenen PC-Tastaturen
- Controller in digitalen Bilderrahmen (Sitronix St2205)
Als Cross-Compiler wird häufig der cc65 eingesetzt.
Technische Daten
- Technologie: NMOS, HMOS, CMOS
- Anzahl Transistoren: ca. 3510[6][7]
- Taktfrequenz: traditionell 20 kHz bis 4 MHz; CMOS-Version 0 bis 14 MHz
- Taktzyklen je Befehl: 2 bis 7
- Adressraum: 64 KByte, dabei kein separater I/O-Adressraum (wie zum Beispiel beim Intel 8080), d. h. der gesamte I/O wird per Memory-Mapped I/O realisiert.
- Adressbusbreite: 16 Bit
- Datenbusbreite: 8 Bit
- Interrupts: ein NMI, ein IRQ, sowie Software-Interrupt über BRK-Befehl. Der Reset des 6502 ist schaltungstechnisch ebenfalls als Interrupt realisiert. Die Interruptvektoren stehen an festen Adressen am Ende des Adressraums (FFFA16 bis FFFF16).
- Befehle: traditionell 56, CMOS-Version: 70
- Adressierungsarten: traditionell 13, CMOS-Version: 16
- Byte-Reihenfolge: Little Endian
- Register:
- Akkumulator, 8 Bit
- 2 Index-Register (X und Y), 8 Bit; der Wert je eines der Register wird als Offset zu einer 16-Bit-Adresse addiert (Ausnahme: Addition zu einer 8-Bit-Zeropage-Adresse), die je nach Adressierungsart im Maschinenbefehl selbst oder in der Zeropage steht.
- Stapelzeiger, 8 Bit; der Stapelzeiger (Low-Byte) wird um ein konstantes High-Byte (0116) erweitert, um eine 16-Bit-Adresse zu erzeugen. Somit umfasst der Stapel 256 Bytes im Adressbereich von 010016 bis 01FF16 (die Page 1).
- Prozessorstatus-Register, 8 Bit (davon 1 Bit reserviert); Flag-Bit 7 bis Flag-Bit 0: Negative (N), Overflow (V), reserviert, Break (B), Decimal (D), Interrupt Disable (I), Zero (Z), Carry (C).
- Programmzähler, 16 Bit[8]
Die Zeropage (Adressbereich 00xy16) kann durch spezielle, schnellere Adressierungsarten angesprochen werden. Durch ihre Verwendung bei indizierter Adressierung kann sie auch als Registerbank oder Register-File angesehen werden.
Der Zustand des Break-Flags kann nur auf dem Stapel nach einem BRK-Befehl[9] ausgelesen werden.[10] Es hat keine eigenen Setz- und Testbefehle und wird auch von den Befehlen PLP, RTI und PHP nicht berücksichtigt, wobei PHP das Break-Flag auf dem Stapel als Teil des Prozessorstatus immer mit dem Wert eins angibt.[11] Die CPU setzt bei einem erkannten NMI oder IRQ (sofern der IRQ über das Interrupt-Flag zugelassen ist) das Break-Flag auf null. Hierdurch wird als nächster Befehl ein BRK-Befehl ausgeführt (wenn nicht gerade schon ein BRK-Befehl ausgeführt wird) und somit nicht der gemäß dem Programmzähler nächste Befehl. Ein BRK-Befehl, der aufgrund eines IRQ oder Opcodes ausgeführt wird, verwendet denselben Interruptvektor. Anhand des Break-Flags lassen sich in diesem Fall dennoch die beiden Ursachen im Interrupt-Handler unterscheiden.[12] Am Ende des BRK-Befehls hat das Break-Flag stets den Wert eins.
Befehlssatz
Beispiele von Maschinenbefehlen, bzw. deren Opcode und Mnemonics in Verbindung mit verschiedenen Adressierungsarten.[13]
Opcode | Mnemonic | Funktion |
---|---|---|
$A9 |
LDA #$FF |
Lädt ("LoaD") das Register "Akkumulator" mit FF16 (255 dezimal).
|
$AD |
LDA $C000 |
Lädt den Akkumulator mit dem Inhalt der absoluten Speicheradresse C00016 (49152 dezimal).
|
$A1 |
LDA ($24),Y |
Lädt den Akkumulator mit dem Inhalt jener Speicheradresse, welche sich ergibt, indem zu der 16-Bit-Zahl in den Adressen 2416 und 2516 der Inhalt des Y-Registers addiert wurde. Siehe Zeropage, indirekte Adressierung.
|
$8D |
STA $C000 |
Speichert ("STore") den Inhalt des Akkumulators (1 Byte) in der Speicheradresse C00016 .
|
$6D |
ADC $C001 |
Addiert ("ADd with Carry-Bit") den Inhalt der Speicheradresse C00116 (1 Byte) zum Inhalt des Akkumulators (plus 1 falls das Carry-Bit gesetzt ist).
|
$C9 |
CMP #$7F |
Vergleicht ("CoMPare") den Inhalt des Akkumulators mit dem Zahlenwert 7F16 (127 dezimal) und setzt die Flags entsprechend.
|
$E4 |
CPX $C0 |
Vergleicht den Inhalt des Registers X mit dem Inhalt der Speicherzelle C016 .
|
$C0 |
CPY #$C0 |
Vergleicht den Inhalt des Registers Y mit dem Zahlenwert C016 .
|
$F0 |
BEQ $FC00 |
("Branch if result is EQual") Verzweigt, wenn der vorausgegangene Vergleich eine Gleichheit ergab (wird anhand der Flags ermittelt). In diesem Fall würde das Maschinenprogramm an Adresse FC0016 weiterlaufen, andernfalls beim nächsten Befehl, der auf BEQ folgt. Die Branch-Befehle erlauben nur die relative Adressierung mit einem vorzeichenbehafteten Offset von ±127, also mit einem einzelnen Byte als Argument.
|
$D0 |
BNE $FC00 |
("Branch if result is Not Equal") Verzweigt, wenn der Vergleich eine Ungleichheit ergab. |
$E8 |
INX |
("INcrement X") Erhöht den Inhalt des Registers X um 1. |
$88 |
DEY |
("DEcrement Y") Verringert den Inhalt des Registers Y um 1. |
$20 |
JSR $FC00 |
("Jump to SubRoutine") Springt zur Subroutine (Unterprogramm) an die Adresse FC0016 . Die Rücksprungadresse besteht aus 2 Byte und wird auf dem Stapel abgelegt.
|
$60 |
RTS |
("ReTurn from Subroutine") Kehrt aus der Subroutine zurück und fährt bei dem Befehl direkt hinter dem zuletzt ausgeführten JSR fort. Dabei wird die letzte Rücksprungadresse auf dem Stapel ausgelesen.
|
In Assembler-Programmtexten des 6502 haben das Dollar- und Nummern-Zeichen sowie die Klammern folgende Bedeutung:
- $ – Der auf das $-Zeichen folgende Wert ist eine in HEX angegebene Zahl. Ohne $ ist bei Ziffern eine Dezimalzahl, bei Buchstaben eine symbolische Konstante gemeint.
- # – Der auf das #-Zeichen folgende Wert ist eine direkt zu verwendende Zahl (immediate) und nicht eine Speicheradresse, deren Inhalt zu verwenden ist. Das Zeichen kennzeichnet also eine andere Adressierungsart, die unmittelbare Adressierung.
- ( ) – Die in den Klammern genannte Speicheradresse ist nicht direkt zu verwenden, sondern enthält selbst wiederum die gemeinte Speicheradresse (indirekte Adressierung, Zeiger).
Es gibt von verschiedenen Herstellern CMOS-Versionen des 6502, die einen erweiterten Befehlssatz bzw. weitere Adressierungsarten haben. Durch diese Änderungen dürfte es auch zu mitunter gravierenden Änderungen bei den im Folgenden behandelten undokumentierten Opcodes kommen.
Undokumentierte Opcodes
Der 6502 ist bekannt für eine ganze Reihe von Befehlen, die nicht in der offiziellen Dokumentation stehen, aber dennoch existieren und funktionieren. Umgangssprachlich nannte man solche Befehle „illegale Opcodes“. Von den prinzipiell 256 möglichen Opcodes sind nur 151 tatsächliche Befehle. Unter den verbleibenden 105 nicht dokumentierten Codes gibt es viele, die Funktionen haben, und zwar durchaus nützliche. Einige Assembler unterstützen solche Befehle, es gibt jedoch keine einheitliche Vorschrift ihrer Benennung mit Mnemonics.
Mit vielen undokumentierten Opcodes lässt sich die Datenverarbeitung beschleunigen, da sie in wenigen Taktzyklen Funktionen erledigen, die sonst nur mit mehreren aufeinanderfolgenden Befehlen möglich sind, was insgesamt erheblich mehr Taktzyklen verbraucht. Dies birgt allerdings das Risiko, dass solche Befehle nicht auf allen produzierten CPUs gleichermaßen funktionieren oder ein mögliches Nachfolgemodell diese Befehle gar nicht beherrscht oder andere Funktionen ausführt, wodurch das Programm nicht mehr lauffähig wäre.
Einige inoffizielle Funktionen des 6502 sind (Mnemonics nur inoffiziell):[14]
Opcode | Mnemonic | Funktion |
---|---|---|
$AF |
LDA-LDX $C000 |
Lädt den Akkumulator sowie das Register X gleichermaßen mit dem Inhalt der absoluten Speicheradresse C00016 hexadezimal (49152 dezimal).
|
HALT |
Hält den Prozessor an. Führt faktisch zum Absturz, der nur durch einen Reset zu beheben ist. | |
NOP |
"No OPeration". Befehl ohne Funktion. Wie bei den meisten Opcodes gibt es auch mehrere für NOP mit unterschiedlichen Adressierungsarten, welche sich jedoch effektiv nur in der Anzahl verwendeter Bytes und verbrauchter Taktzyklen unterscheiden. NOP wird zum Überspringen von mehreren Bytes im Programm benutzt.
| |
ASL-ORA |
Führt ASL mit den Daten aus und verknüpft den Inhalt des Akkumulators ODER mit dem Ergebnis.
| |
AND #n‑MOV b7‑>Cy |
Führt eine UND-Verknüpfung der Daten mit dem Inhalt des Akkumulators durch und übernimmt das siebte Bit des Akkumulators als neuen Zustand für das Carry-Flag. | |
ROL-AND |
Führt ROL mit den Daten aus und verknüpft den Inhalt des Akkumulators UND mit dem Ergebnis.
| |
LSR-EOR |
Führt LSR mit den Daten aus und verknüpft den Inhalt des Akkumulators EXKLUSIV-ODER mit dem Ergebnis.
| |
ROR-ADC |
Führt ROR mit den Daten aus und addiert das Ergebnis zum Inhalt des Akkumulators.
| |
STA-STX |
Soll den Inhalt des Akkumulators und des Registers X gleichzeitig an eine Speicheradresse schreiben. Dadurch, dass beide Registerinhalte gleichzeitig an der Busleitung liegen, ergibt das effektiv eine UND-Verknüpfung der beiden Register, die in die angegebene Speicheradresse geschrieben wird. Auch bekannt als SAX. | |
TXA-AND #n |
Transferiert den Inhalt des Registers X in den Akkumulator und verknüpft den neuen Inhalt des Akkumulators UND mit #n. | |
LDA-LDX |
Lädt die gleichen Daten in den Akkumulator sowie in das Register X. Einige Adressierungsarten können instabil sein, der Befehl also mit unvorhersehbaren Seiteneffekten verknüpft sein. Auch bekannt als LAX. | |
DEC-CMP |
Verringert den Wert der Daten um 1 und vergleicht das Ergebnis mit dem Inhalt des Akkumulators. | |
INC-SBC |
Erhöht den Wert der Daten um 1 und subtrahiert das Ergebnis vom Inhalt des Akkumulators. |
Taktvarianten des MOS 6502
- ≈1 MHz: MOS 6502
- 2 MHz: MOS 6502A
- im Apple III
- in den 8-Bit-Atari-Homecomputern 400 und 800 mit 1,79 MHz (1,77 MHz im PAL-Modus)
- in einigen Floppy-Laufwerken von Commodore, zum Beispiel VC1570, VC1571 und VC1581
- im Skat Champion, dem weltweit ersten Skatcomputer von Novag Industries Ltd.
- 3 MHz: MOS 6502B
- 4 MHz: MOS 6502C
Varianten anderer Hersteller (Second source und unlizenziert)
- Rockwell
- R6502P (1 MHz)
- R6502AP (2 MHz)
- R6502ACE (2 MHz, Keramikgehäuse, erweiterter Temperaturbereich)
- UMC
- UM6502
- UM6502A
- Synertek
- SY6502A
- KMT-Prawez
- SM630 (СМ630) (bulgarischer Klon des 6502)
Abgeleitete Designs
- Ricoh 2A03
- Ricoh 2A07
- PAL-Version des 2A03
- Geänderte Frequenzteiler und Farbtabellen
- Eingesetzt in Europäischen und Australischen NES-Versionen
- YM-2002
- Entwickelt von Yamaha
- Sun Plus SPLB31A
- Embedded-Variante des 8502 mit integrierten Display- und I/O-Controllern
- Eingesetzt im HP 35s
- Renesas 38000
- Mikrocontrollerfamilie von Renesas Technology mit 740er Kern. Siehe 740
- M50740
- Mikrocontroller von Mitsubishi mit 65C02 Kern
- Ricoh 5A22
- HuC 6280
- Entwickelt von Hudson Soft auf Basis des 65SC02-Designs
- incl. MMU (2 MB adressierbar)
- 6-Kanal PSG
- Eingesetzt in NECs PC Engine
- MOS 6500/1
- 2 KB ROM, 64 Bytes RAM und eine UART integriert
- Eingesetzt im Commodore Plotter 1520
- MOS 6501
- Gehäuse- und signalkompatibel (nicht softwarekompatibel) zum Motorola 6800 (ohne den – oben erwähnten – internen Taktgenerator des 6502). Musste nach einer Patentverletzungsklage Motorolas eingestellt werden.
- 6502B
- 6502C („SALLY“)
- Custom-Design des MOS 6502, entworfen und hergestellt für ATARI
- HALT-Signal auf Pin 35
- zweites R/W-Signal auf Pin 36
- bis 1,79 MHz Taktung (1,77 MHz im PAL-Modus)
- Eingesetzt in Ataris 8-Bit-Homecomputerserien XL und XE sowie in den Spielkonsolen Atari 5200 und Atari 7800
- W65C02
- Entwickelt von Western Design Center (WDC)
- CMOS-Technologie
- Zusätzliche Befehle und Adressierungsmodi
- Keine illegalen Opcodes
- Einige Befehle benötigen unter bestimmten Voraussetzungen weniger oder mehr Taktzyklen als im 6502
- Eingesetzt im erweiterten Apple IIe und im Apple IIc und in einigen frühen Beschleunigerkarten für 6502-Systeme
- Hergestellt von WDC, Rockwell, Synertek, Sanyo und anderen.
- Die WDC-Variante ist nicht pinkompatibel zum 6502
- 65SC02
- Leicht eingeschränkter Befehlssatz (keine Bitbefehle, echte Teilmenge des 65816) gegenüber dem 65C02
- Eingesetzt im Atari Lynx und Watara Supervision mit 4 MHz-Taktung
- Hergestellt von GTE und CMD
- CSG 65CE02
- 1988 entwickelt von der Commodore Semiconductor Group (CSG)
- Zusätzliche 16-Bit-RMW-Befehle
- Relative Sprünge und Unterprogrammaufrufe mit 16-Bit-Offset
- Eingesetzt im Commodore 65 (als Prozessorkern des 4510) und der Commodore A2232 7-Port Serial Card
- 3,54 MHz Taktung
- 65C102, 65C112
- Für Multiprozessorbetrieb ausgelegt, wobei der 65C112 als Slave dient
- Eingesetzt im BBC Micro und Commodore LCD
- MOS 6503, MOS 6505, MOS 6506, Rockwell R6503, R6505, R6506, R6513, R6515
- 12 Bit Adressbus (4 KB)
- MOS 6504, MOS 6507, Rockwell R6504, R6507
- 13 Bit Adressbus (8 KB), eingesetzt z. B. in Commodore-Tastaturen (Amiga 1000) und in Floppy-Laufwerken (Atari 1050) und Druckern (z. B. MPS 802)
- 6507 eingesetzt im Atari 2600 mit 1,19 MHz-Taktung
- MOS 6509
- 20 Bit Adressbus (1 MB) durch internes Bankswitching
- Eingesetzt in den Commodore-PET-II Modellen (CBM 500, 600 und 700).
- MOS 6510
- DMA (AEC Pin 5) fähiger 6502 mit zusätzlichem 8-Bit-I/O-Port, von dem in der häufigsten Pin-Konfiguration nur 6 Bit herausgeführt sind.
- Verschiedene Varianten mit gleicher Bezeichnung (in der im C64 verwendeten Variante sind z. B. nur 6 Bit des Ports verfügbar)
- Eingesetzt im C64 mit 985 kHz (PAL-Version) respektive 1022 kHz (NTSC-Version) Takt
- Eingesetzt in der VC1551 mit 2 MHz als 6510T
- Rockwell R6511Q
- Mikrocontroller mit I/O-Ports, serieller Schnittstelle und RAM, von Rockwell
- Erweiterte Bitbefehle
- Rockwell R65F11
- Variante des 6511 mit integriertem Forth-Interpreter (3 KB on-chip ROM)
- MOS 6512 bis MOS 6518
- Variante des entsprechenden 650x, aber ohne eingebauten Oszillator.
- 65C00/21, 65C29
- Multiplizier-Befehl
- von Rockwell
- 6570, 6571
- Eingesetzt in Amiga-Tastaturen
- UA6588F / 81489
- Eingesetzt im Bit Corporation Gamate
- Hergestellt von UMC und NCR
- 6702
- eingesetzt nur im Plug-in Board des Commodore SuperPET
- Renesas 740
- Mikrocontrollerfamilie von Renesas Technology (vormals Mitsubishi Electric)
- Basierend auf der 65C02
- mehr als 100 Varianten
- bis 60 KB ROM/PROM/Flash onchip
- bis 2 KB RAM onchip
- erweiterter Befehlssatz
- Multiplikation
- Division
- Erweiterte Bitbefehle
- Stop/Wait
- Neue Adressierungsarten
- Transfer (Speicher Speicher Befehle)
- Special Page
- Bit-Relativ
- Bis 17 MHz
- MOS 7501
- zum 6502 befehlskompatible CPU in HMOS-Technologie
- 8-Bit-I/O-Port (nur 7 Leitungen nach außen geführt)
- Maximaltakt: 2 MHz
- Eingesetzt im Commodore 16 und Plus/4
- MOS 8500
- 6510 in HMOS-Technologie
- MOS 8502
- 6510 umschaltbar auf 2 MHz
- 7-Bit-I/O-Port
- Eingesetzt im C128
- W65C134S
- Entwickelt von Western Design Center (WDC)
- Mikrocontroller, der u. a. eine W65C02S-CPU, 4096 bytes ROM, 192 byte RAM, vier 16-Bit-Timer sowie einen UART auf demselben Chip integriert
- Maximaltakt: 8 MHz
- W65C802
- Entwickelt von Western Design Center (WDC)
- Variante des 65816, die pinkompatibel zum 6502 ist, Adressraum daher wie dieser nur 64 KB
- Zum direkten Austausch des 6502 in bereits bestehenden Schaltungen gedacht
- Bis zu 16 MHz
- W65C816S
- Entwickelt von Western Design Center (WDC)
- Eingesetzt u. a. im Apple IIgs, Nintendo SNES (als Ricoh 5A22), den meisten Beschleunigungskarten für 6502-Rechner
- 16-Bit-Register und ALU
- 24-Bit-Adressbus (16 MB)
- Bis zu 24 MHz
- Braucht im Vergleich zum 6502 wegen des zusätzlichen Adressbytes für viele Befehle einen Takt länger
Trivia
- Der fiktive Roboter Bender aus der Zeichentrickserie Futurama hat einen 6502-Prozessor als CPU (Staffel 2 Episode 4 – Die Party mit Slurm McKenzie).
- In dem Spielfilm Terminator (1984) wird aus Sicht des Terminators ein 6502-Assembler-Programm angezeigt (vermutlich vom Apple IIe). Weiterhin wird das Ergebnis des Prüfsummen-Programms Key Perfect (in der Version 4.0), das im Nibble magazine veröffentlicht wurde, angezeigt.
- Laut Heise[16] ist der Prozessor in der Variante 65C02 wieder (26. Januar 2012) lieferbar.
- Für diesen Prozessor wurde eine Simlation auf seiner Transistor-Ebene in Software[17] und in Hardware auf einer ca. 30 × 40 cm großen Platine ("MOnSter6502")[18] erstellt.
Literatur
- Brian Bagnall: On The Edge: The Spectacular Rise and Fall of Commodore. ISBN 0-9738649-0-7.
- Brian Bagnall: Volkscomputer – Aufstieg und Fall des Computer Pioniers Commodore. Hrsg.: Winnie Forster, Boris Kretzinger. Gameplan, Utting am Ammersee 2011, ISBN 978-3-00-023848-2 (amerikanisches Englisch: On the Edge: the Spectacular Rise and Fall of Commodore. Übersetzt von Winnie Forster, Boris Kretzinger).
- Ekkehard Flögel: Programmieren in Maschinensprache mit dem 6502. ISBN 3-921682-61-4.
- Lance A. Leventhal: 6502. Programmieren in ASSEMBLER. ISBN 3-921803-10-1.
- Rodnay Zaks: Programmierung des 6502. Jetzt auch mit 6510, 65C02, 65SC02. ISBN 3-88745-600-9.
Weblinks
- 6502.org – Informationen zum 6502-Prozessor
- CCOM – Commodore Computer Online Museum
- 6502-Seite von Homecomputermuseum.de
- 6502 Prozessoren und Varianten: Bilder und Beschreibungen auf cpu-collection.de
- CPU-World – Überblick über die verschiedenen Hersteller
- visual6502.org: Mikroskopiebilder und Simulator mit einzelnen Transistoren (engl.)
- Easy 6502: 6502-Assembler-Tutorial mit integriertem Emulator (engl.)
Einzelnachweise
- ↑ a b MOS TECHNOLOGY, INC. (Hrsg.): MOS MICROCOMPUTERS HARDWARE MANUAL. Januar 1976, 1.2.2 The MCS6502 (englisch).
- ↑ MOS TECHNOLOGY, INC. (Hrsg.): MOS MICROCOMPUTERS PROGRAMMING MANUAL. Januar 1976, CHAPTER 6 INDEX REGISTERS AND INDEX ADDRESSING CONCEPTS (englisch).
- ↑ MOS TECHNOLOGY, INC. (Hrsg.): MOS MICROCOMPUTERS PROGRAMMING MANUAL. Januar 1976, 5.1 CONCEPTS OF PIPELINING AND PROGRAM SEQUENCE (englisch).
- ↑ MOS TECHNOLOGY, INC. (Hrsg.): MOS MICROCOMPUTERS PROGRAMMING MANUAL. Januar 1976, 4.0.1 The microprocessor contains an internal timing and state control counter. This counter, along with a decode matrix, governs the operation of the microprocessor on each clock cycle. (englisch).
- ↑ Donald F. Hanson: Block Diagram of 6502 Microprocessor, Circa 1979. Abgerufen am 7. März 2021 (englisch).
- ↑ Transistor count in 6502
- ↑ Reverse Engineering the 6502 ... with 3,510 transistors
- ↑ MOS TECHNOLOGY, INC. (Hrsg.): MOS MICROCOMPUTERS PROGRAMMING MANUAL. Januar 1976, PROGRAMMING MODEL MCS650X (englisch).
- ↑ MOS TECHNOLOGY, INC. (Hrsg.): MOS MICROCOMPUTERS HARDWARE MANUAL. Januar 1976, A. 5.4. Break Operation--(Hardware Interrupt)-BRK (7 cycles) – (englisch).
- ↑ MOS TECHNOLOGY, INC. (Hrsg.): MOS MICROCOMPUTERS PROGRAMMING MANUAL. Januar 1976, 3.4 BREAK COMMAND (B) – (englisch).
- ↑ 6502 BRK and B bit. VisualChips, abgerufen am 12. März 2021 (englisch).
- ↑ MOS TECHNOLOGY, INC. (Hrsg.): MOS MICROCOMPUTERS PROGRAMMING MANUAL. Januar 1976, 9.11 BRK - BREAK COMMAND (englisch).
- ↑ Übersicht 6502-Assemblerbefehle auf C64-Wiki.de
- ↑ Full 6502 Opcode List Including Undocumented Opcodes, J.G.Harston, 25. November 1998
- ↑ InfoWorld, Band 5, Nr. 12 (21. März 1983), InfoWorld Media Group, Inc.; S. 41. ISSN 0199-6649.
- ↑ Wieder lieferbar: der 6502-Mikroprozessor
- ↑ visual6502.org
- ↑ monster6502.com