Mikroprozessor Aus Wikipedia, der freien Enzyklopädie
Der MOS Technology 6502 ist ein 8-Bit-Mikroprozessor vom Unternehmen MOS Technology, der 1975[1] zunächst im Keramikgehäuse als MOS MCS 6502[2] 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 10MHz), 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.[3]
Werbung für den Mikroprozessor MOS 6502 (MCS6502) aus dem September 1975Pinbelegung des MOS 6502 (40-Pin-DIP)
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.
Das Design des 6502 wurde an das des 8-Bit-Prozessors Motorola 6800 angelehnt (nicht zu verwechseln mit dem jüngeren Motorola 68000) und orientierte sich an einem Einsatz des 6502 als Teil eines Mikrocontrollers.[4] Die Befehlssätze von 6502 und MC6800 sind sich ähnlich, aber anstatt des einen 16-Bit-Index-Registers beim MC6800 werden beim 6502 zwei 8-Bit-Index-Register verwendet, deren Wert im Rahmen einer Befehlsausführung auf eine im Programmcode (absolute indizierte Adressierung) oder im Speicher (indirekte indizierte Adressierung) vorgegebene 16-Bit-Adresse addiert werden kann.[5] Deswegen besteht hier für 6502-Programme die Notwendigkeit, Arrays, die größer als 256 Bytes sind, abschnittsweise anzusprechen.
Im Gegensatz dazu weisen im gleichen Zusammenhang andere 8-Bit-CPUs wie etwa der MC6800 oder der Z80 16-Bit-Index-Register auf, deren Wert zu einer im Programmcode vorgegebenen 8-Bit-Adresse addiert werden kann; die Möglichkeit, den Wert eines Indexregisters auf eine im Speicher vorhandene Adresse zu addieren, besteht bei diesen CPUs nicht.
Beispielsweise kann für einen Kopiervorgang ein Indexregister als Adresszähler verwendet werden, das innerhalb einer Schleife im Programmcode mit einem dedizierten Befehl um eins erhöht bzw. erniedrigt und anschließend noch vom selben Befehl auf den Wert null getestet wird. Der unmittelbar folgende Befehl beendet die Ausführung der Schleife, wenn zuvor der Wert null festgestellt wurde.[6] Einen Befehl, der einen solchen Anwendungsfall noch effizienter ausführt, wie z.B. der LDIR-Befehl des Z80, besitzt der 6502 nicht.
Der einfacher gehaltene Befehlssatz führt allerdings dazu, dass 6502-Programme im Normalfall deutlich mehr Speicher benötigen als das Gleiche leistende MC6800- oder Z80-Programme; zudem sind standardkonforme Compiler für höhere Programmiersprachen wie etwa Pascal oder C für den 6502 deutlich schwieriger zu implementieren und erzeugen langsameren Code als entsprechende Compiler für andere 8-Bit-Prozessoren. Die Ursache hierfür ist vor allem die auf 256Bytes beschränkte Größe des Stapelspeichers (siehe unten) des 6502, so dass der für die meisten modernen Hochsprachen nötige größere 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 MC6800.
Als Cross-Compiler für die Programmiersprache C kann für den 6502 cc65 eingesetzt werden.[7] Alternativ dazu kann mit dem 6502 eine einfache virtuelle CPU emuliert werden, womit dann sein Befehlssatz als Mikrocode behandelt wird.[8]
Der 64KB große Adressraum des 6502 teilt sich in mehrere Bereiche auf, die sich 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 256Bytes dar:[9]
Die Zeropage (die ersten 256Bytes des Adressraums): sie dient praktisch als Registerbank,[10] auf ihre Inhalte kann besonders schnell zugegriffen und jeweils zwei aufeinanderfolgende Bytes können als 16-Bit-Wert für diverse indirekte Adressierungsarten verwendet werden.[5]
Die folgenden 256Bytes dienen als Stapelspeicher (Stack-Page), der von oben herab wächst. Wenn die in Anspruch genommene Stapeltiefe 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 letzten 6Bytes, 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 6Bytes des Adressraums (d.h. in den Adressen FFFA16–FFFF16) befinden sich drei 16-Bit-Zeiger (auch Vektoren genannt) für den „normalen“ Interrupt (IRQ) und BRK-Befehl (in FFFE16–FFFF16), das Reset-Signal (in FFFC16–FFFD16) und den Non-Maskable Interrupt (NMI) (in FFFA16–FFFB16), wobei stets die hier angegebene niedrigere Adresse die Bits7 bis 0 und die höhere Adresse die Bits15 bis 8 des jeweiligen 16-Bit-Zeigerwerts enthalten.[11] Leitet die CPU die jeweilige Behandlung der Unterbrechungsanforderung mit einem BRK-Befehl ein, wird dabei der entsprechende Zeigerwert in den Programmzähler geladen (auch ein Reset führt zum Ausführen des BRK-Befehls, allerdings sind dabei die Schreibzugriffe der CPU deaktiviert[12]). Damit diese Speicherstellen beim Reset definierte Werte enthalten, ist üblicherweise das Betriebssystem- oder Firmware-ROM am oberen Adressbereichsende angeordnet, während das RAM bei Adresse null beginnt. Bei einem Hardware-Reset wird also nicht wie bei vielen anderen Prozessoren einfach das ab Adresse null im Speicher vorgefundene Programm abgearbeitet, sondern der Vektor in den beiden Adressen FFFC16–FFFD16 wird in den Programmzähler kopiert und dann ab dieser Stelle das dort gespeicherte Programm abgearbeitet.
Im Normalfall liest bzw. schreibt die CPU einmal pro Taktzyklus ein Byte aus einer bzw. in eine Speicherzelle im Adressraum. Falls nötig, kann jedoch der Lesezugriff der CPU verzögert werden, indem der RDY-Pin der CPU takt-synchron vom adressierten Speicher- oder Peripheriebaustein auf einen niedrigen Pegel gesetzt wird. Dadurch wird der interne Zustand der CPU eingefroren, d.h. die aktuelle Mikroinstruktion wird nicht zu Ende ausgeführt und der Adressbus unverändert angesteuert. Zudem befinden sich die Datenbustreiber der CPU (wie bei jedem Lesezugriff) im hochohmigen Zustand.[13] Kann der Speicher- oder Peripheriebaustein schlussendlich das Byte am Datenbus bereitstellen, setzt er das RDY-Signal wieder takt-synchron auf einen hohen Pegel. Daraufhin liest die CPU das Datenbyte ein und stellt die aktuelle Mikroinstruktion fertig. Bei einem Schreibzugriff wird das RDY-Signal von der CPU allerdings ignoriert.[14]
Das RDY-Signal kann auch dazu benutzt werden, die CPU für einen DMA-Zugriff anzuhalten. Da die CPU erst bei einem Lesezugriff in den Wartezustand übergeht, können davor noch bis zu drei Taktzyklen vergehen (die drei aufeinander folgenden Schreibzugriffe des BRK-Befehls stellen hierbei den ungünstigsten Fall dar[15]). Da während des DMA der Adressbus und die Lese-/Schreibleitung allein vom DMA-Controller angesteuert werden müssen und der 6502 diese – im Gegensatz zum Datenbus – ununterbrochen ansteuert, muss eine zusätzliche Schaltung eingesetzt werden, um die Ansteuerung zwischen DMA-Controller und 6502 umschalten zu können. Hierzu können Multiplexer-Chips wie z.B. der 74LS157 eingesetzt werden[16] oder der Adressbus des 6502 wird über Puffer-Chips wie z.B. den 74LS244 geführt, deren Ausgänge hochohmig geschaltet werden können.[17] Alternativ dazu kann beispielsweise der 6510 zum Einsatz kommen, dessen Adressbustreiber über seinen AEC-Pin hochohmig geschaltet werden können.
Für die Durchführung eines DMA zusammen mit dem Speicherzugriff des 6502 kommen neben der Verwendung des RDY-Signals noch weitere Methoden zum Einsatz:
Insofern es die Zugriffszeit des angesprochenen Speichers zulässt, kann ein DMA während der ersten Hälfte des Taktzyklus des 6502 stattfinden, da der 6502 nur während der zweiten Hälfte seines Taktzyklus eine Datenübertragung mit dem Speicher durchführt. Dieses Verfahren wird z.B. vom Video-Chip VIC II im C64 angewendet.[18]
Weiterhin ist es möglich, das Signal am Takteingang Φ0 des 6502 auf einem niedrigen Pegel zu halten, so dass der interne Zustand des 6502 einfriert. Dies kann beim 6502 allerdings nur zeitlich begrenzt aufrechterhalten werden, da sich sein dynamischer Speicher, d.h. seine Kapazitäten, mit der Zeit entlädt.[19] Diese Methode wird z.B. vom ANTIC-Chip im Atari 400 und Atari 800 eingesetzt,[20] der den 6502 so bis zu ca. 54μs anhält.[21][22]
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.[23]
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.[24] Eine echte Pipeline mit Überlappung der Lese- und Schreibzugriffe mehrerer Befehle gab es aber noch nicht.
Anstelle von Mikrocode enthielt er ein PLA, dessen 130Ausgänge in Abhängigkeit vom Maschinensprachebefehl, d.h. vom geladenen Opcode, und von dem internen Taktzähler die Ablaufsteuerung als erste Stufe übernahmen.[25] Die zweite Stufe der Ablaufsteuerung stellte die Random Control Logic dar, die schließlich die Signale zur Steuerung des Datenpfads erzeugte.[26]
Anzahl der Transistoren (NMOS-Version): ca. 3510[27][28]
Taktfrequenz: traditionell 20kHz bis 4MHz; CMOS-Version 0 bis 14MHz
Taktzyklen je Befehl: 2 bis 7
Adressraum: 64KByte, 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: 16Bit
Datenbusbreite: 8Bit
Interrupts: ein NMI, der durch eine fallende Flanke an seinem Pin ausgelöst wird;[29] ein IRQ, der durch einen niedrigen Pegel an seinem Pin ausgelöst wird.[30] Ein Software-Interrupt über den BRK-Befehl. Der Reset des 6502 ist schaltungstechnisch ebenfalls als Interrupt realisiert. Die Interrupt-Vektoren stehen an festen Adressen am Ende des Adressraums (FFFA16 bis FFFF16).
2 Index-Register (X und Y), 8Bit; 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, 8Bit; der Stapelzeiger wird als Low-Byte zusammen mit einem konstanten High-Byte (0116) verwendet, um eine 16-Bit-Adresse zu erzeugen, wenn ein Befehl auf den Stapel zugreift. Somit umfasst der Stapel 256Bytes im Adressbereich von 010016 bis 01FF16 (die Page eins).
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[15] ausgelesen werden.[32] 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.[33] 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.[34] Am Ende des BRK-Befehls hat das Break-Flag stets den Wert eins.
Lädt ("LoaD") das Register "Akkumulator" mit FF16 (255 dezimal).
$AD
LDA$C000
Lädt den Akkumulator mit dem Speicherinhalt an der absoluten Adresse C00016 (49152 dezimal).
$A1
LDA($24),Y
Lädt den Akkumulator mit dem Inhalt an jener Speicheradresse, welche sich ergibt, indem zu der 16-Bit-Zahl in den Adressen 2416 und 2516 der Inhalt des Y-Registers addiert wird. Siehe Zeropage, indirekte Adressierung.
$8D
STA$C000
Speichert ("STore") den Inhalt des Akkumulators (ein Byte) an der Speicheradresse C00016.
$6D
ADC$C001
Addiert ("ADd with Carry-Flag") den Inhalt an der Speicheradresse C00116 (ein Byte) zum Inhalt des Akkumulators (plus eins, falls das Carry-Flag 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 RegistersX ("ComPare X") mit dem Inhalt der Speicherzelle an der absoluten Adresse C016.
$C0
CPY#$C0
Vergleicht den Inhalt des RegistersY ("ComPare Y") mit dem Zahlenwert C016.
$F0
BEQ$FC00
("Branch if result is EQual") Verzweigt, wenn beispielsweise der letzte vorausgegangene Vergleich eine Gleichheit ergab (wird anhand des Z-Flags ermittelt). In diesem Fall würde das Maschinenprogramm an der Adresse FC0016 (auch als Sprungadresse bezeichnet) weiter ausgeführt. Andernfalls wird der auf BEQ unmittelbar folgende Befehl als nächstes ausgeführt. Die Branch-Befehle erlauben nur die relative Adressierung mit einem vorzeichenbehafteten Offset im Bereich von -128 bis 127, also mit einem einzelnen Byte als Argument. Die CPU ermittelt die Sprungadresse, indem sie das Offset zur Adresse des auf den Branch-Befehl unmittelbar folgenden Befehls addiert.[36]
$D0
BNE$FC00
("Branch if result is Not Equal") Verzweigt, wenn beispielsweise der letzte vorausgegangene Vergleich eine Ungleichheit ergab.
$E8
INX
("INcrement X") Erhöht den Inhalt des RegistersX um eins.
$88
DEY
("DEcrement Y") Verringert den Inhalt des RegistersY um eins.
$20
JSR $FC00
("Jump to SubRoutine") Springt zur Subroutine (Unterprogramm) an der Adresse FC0016. Die Rücksprungadresse, welche aus zwei Byte besteht und auf dem Stapel abgelegt wird, ist die Adresse des letzten Bytes des drei Byte langen JSR-Befehls.[37]
$60
RTS
("ReTurn from Subroutine") Kehrt aus der Subroutine zurück und führt das Maschinenprogramm an der Rücksprungadresse aus, welche zuvor vom Stapel genommen und um eins erhöht wurde.[37]
$00
BRK
("BReaK") Speichert am Anfang einer Interrupt-Behandlung bzw. als BRK-Befehl im Programmcode erst den Programmzähler bzw. den Programmzähler erhöht um zwei auf dem Stapel, dann das Statusbyte. Lädt den passenden Interrupt-Vektor in den Programmzähler. Hierbei hat das Laden des NMI-Vektors Priorität vor dem Laden des IRQ/BRK-Vektors. Setzt das I- und B-Flag und hebt die Registrierung eines NMI auf.[38][15]
$EA
NOP
("No OPeration") Befehl ohne Funktion, erhöht den Programmzähler um eins.
Schließen
In Assembler-Programmtexten des 6502 haben das Dollar- und Nummern-Zeichen sowie die Klammern folgende Bedeutung:
$ – Der auf das $-Zeichen folgende Wert ist eine Hexadezimalzahl. Ohne $ stellt eine nur aus Ziffern bestehende Zeichenfolge die entsprechende Dezimalzahl dar. Ansonsten ist der Wert einer symbolischen Konstanten gemeint.
# – Der auf das #-Zeichen folgende Wert ist eine direkt zu verwendende Zahl (immediate) und nicht eine Speicheradresse, deren Inhalt zu verwenden ist, d.h. das #-Zeichen kennzeichnet die sogenannte unmittelbare Adressierung.
() – Die in den Klammern genannte Speicheradresse ist nicht direkt zu verwenden, sondern sie enthält selbst wiederum die zu verwendende Speicheradresse (indirekte Adressierung, Zeiger).
Opcode-Matrix
Weitere Informationen Alle Opcodes des dokumentierten 6502-Befehlssatzes, Höherwertiges Nibble ...
Alle Opcodes des dokumentierten 6502-Befehlssatzes[35]
Adressierungsarten: A – Accumulator, # – unmittelbar, zpg – Zeropage, abs – absolut, ind – indirekt, X – indiziert indirekt mit X-Register, Y – indirekt indiziert mit Y-Register, rel – relativ
Höherwertiges Nibble
Niederwertiges Nibble
0
1
2
4
5
6
8
9
A
C
D
E
0
BRK
ORA (ind,X)
ORA zpg
ASL zpg
PHP
ORA #
ASL A
ORA abs
ASL abs
1
BPL rel
ORA (ind),Y
ORA zpg,X
ASL zpg,X
CLC
ORA abs,Y
ORA abs,X
ASL abs,X
2
JSR abs
AND (ind,X)
BIT zpg
AND zpg
ROL zpg
PLP
AND #
ROL A
BIT abs
AND abs
ROL abs
3
BMI rel
AND (ind),Y
AND zpg,X
ROL zpg,X
SEC
AND abs,Y
AND abs,X
ROL abs,X
4
RTI
EOR (ind,X)
EOR zpg
LSR zpg
PHA
EOR #
LSR A
JMP abs
EOR abs
LSR abs
5
BVC rel
EOR (ind),Y
EOR zpg,X
LSR zpg,X
CLI
EOR abs,Y
EOR abs,X
LSR abs,X
6
RTS
ADC (ind,X)
ADC zpg
ROR zpg
PLA
ADC #
ROR A
JMP (ind)
ADC abs
ROR abs
7
BVS rel
ADC (ind),Y
ADC zpg,X
ROR zpg,X
SEI
ADC abs,Y
ADC abs,X
ROR abs,X
8
STA (ind,X)
STY zpg
STA zpg
STX zpg
DEY
TXA
STY abs
STA abs
STX abs
9
BCC rel
STA (ind),Y
STY zpg,X
STA zpg,X
STX zpg,Y
TYA
STA abs,Y
TXS
STA abs,X
A
LDY #
LDA (ind,X)
LDX #
LDY zpg
LDA zpg
LDX zpg
TAY
LDA #
TAX
LDY abs
LDA abs
LDX abs
B
BCS rel
LDA (ind),Y
LDY zpg,X
LDA zpg,X
LDX zpg,Y
CLV
LDA abs,Y
TSX
LDY abs,X
LDA abs,X
LDX abs,Y
C
CPY #
CMP (ind,X)
CPY zpg
CMP zpg
DEC zpg
INY
CMP #
DEX
CPY abs
CMP abs
DEC abs
D
BNE rel
CMP (ind),Y
CMP zpg,X
DEC zpg,X
CLD
CMP abs,Y
CMP abs,X
DEC abs,X
E
CPX #
SBC (ind,X)
CPX zpg
SBC zpg
INC zpg
INX
SBC #
NOP
CPX abs
SBC abs
INC abs
F
BEQ rel
SBC (ind),Y
SBC zpg,X
INC zpg,X
SED
SBC abs,Y
SBC abs,X
INC abs,X
Fehlende Opcodes (z.B. 02) und alle Opcodes mit den niederwertigen Nibbles 3, 7, B und F sind nicht Bestandteil des 6502-Befehlssatzes.
Schließen
Es gibt von verschiedenen Herstellern CMOS-Versionen des 6502, die einen erweiterten Befehlssatz bzw. weitere Adressierungsarten haben. Dadurch kann es zu Änderungen bei den nachfolgend beschriebenen 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. Nur 151 der prinzipiell 256 möglichen Opcodes sind reguläre Befehle. Aber auch unter den verbleibenden 105 nicht dokumentierten Codes gibt es etliche, die Funktionen haben, darunter durchaus nützliche. Einige Assembler unterstützen solche Befehle, es gibt jedoch keine einheitliche Vorschrift für ihre 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.
Wie bei den meisten regulären Befehlen gibt es auch für viele der undokumentierten Funktionen unterschiedliche Adressierungsarten und demzufolge auch unterschiedliche Opcodes. In der nachstehenden Tabelle werden – sofern nichts anderes angegeben ist – beispielhaft Opcodes für die Adressierungsart „absolut“ aufgeführt, die beiden auf den Opcode folgenden Bytes werden also als eine absolute Adresse interpretiert. Die Mnemonics sind inoffiziell.[39][40]
Weitere Informationen Opcode, Mnemonic ...
Opcode
Mnemonic
Funktion
$02
HLT
("HaLT") Ein-Byte-Befehl, hält den Prozessor an. Führt faktisch zum Absturz, der nur durch einen Reset zu beheben ist.
$0B
ANC#n
("AND#n, N-Flag→C-Flag") Adressierungsart „immediate“. Führt eine UND-Verknüpfung des Akkumulators mit n durch, speichert das Ergebnis im Akkumulator und übernimmt danach den Wert des Negative-Flags (der mit dem Wert des siebten Bits des Akkumulators übereinstimmt) als neuen Wert für das Carry-Flag.
$0C
SKW
("SKip next Word") Befehl ohne Funktion, erhöht den Programmzähler um drei und wird zum Überspringen der unmittelbar auf den Opcode folgenden zwei Bytes benutzt.
$0F
ASO $C000
("ASL, ORA") Führt den Befehl ASL mit dem Speicherinhalt an der Adresse C00016 aus, anschließend wird eine ODER-Verknüpfung des Akkumulators mit dem neuen Speicherinhalt durchgeführt und das Ergebnis im Akkumulator gespeichert.
$2F
RLA $C001
("ROL, AND") Führt den Befehl ROL mit dem Speicherinhalt an der Adresse C00116 aus, anschließend wird eine UND-Verknüpfung des Akkumulators mit dem neuen Speicherinhalt durchgeführt und das Ergebnis im Akkumulator gespeichert.
$4F
LSE $C002
("LSR, EOR") Führt den Befehl LSR mit dem Speicherinhalt an der Adresse C00216 aus, anschließend wird eine EXKLUSIV-ODER-Verknüpfung des Akkumulators mit dem neuen Speicherinhalt durchgeführt und das Ergebnis im Akkumulator gespeichert.
$6F
RRA $C003
("ROR, ADC") Führt den Befehl ROR mit dem Speicherinhalt an der Adresse C00316 aus, anschließend wird der neue Speicherinhalt zum Akkumulator addiert (plus eins, falls das Carry-Flag gesetzt ist).
$8B
XAA#n
("TXA, AND#n") Adressierungsart „immediate“. Transferiert den Inhalt des RegistersX in den Akkumulator, führt danach eine UND-Verknüpfung des Akkumulators mit n aus und speichert das Ergebnis im Akkumulator.
$8F
SAX $C004
("Store (A & X)") Soll den Inhalt des Akkumulators und des RegistersX gleichzeitig an die Speicheradresse C00416 schreiben. Dadurch, dass beide Registerinhalte gleichzeitig am internen Datenbus anliegen, ergibt sich eine UND-Verknüpfung der beiden Registerinhalte, deren Ergebnis an der Adresse C00416 gespeichert wird.
$AF
LAX $C005
("LDA, LDX") Lädt den Speicherinhalt an der Adresse C00516 in den Akkumulator sowie in das RegisterX. Einige Adressierungsarten von LAX können instabil sein, der Befehl also zu unvorhersehbaren Seiteneffekten führen.
$CF
DCM $C006
("DEC, CMP") Verringert den Wert an der Speicheradresse C00616 um eins und vergleicht anschließend den neuen Speicherinhalt mit dem Inhalt des Akkumulators.
$EF
INS $C007
("INC, SBC") Erhöht den Wert an der Speicheradresse C00716 um eins und subtrahiert anschließend den neuen Speicherinhalt vom Inhalt des Akkumulators (zusätzlich um eins, falls das Carry-Flag den Wert null besitzt).
Schließen
Das nachfolgende Beispielprogramm ermittelt das Maximum einer Bytefolge.[41] Die erste Spalte zeigt die Speicheradressen gefolgt vom Maschinencode als Hexadezimalzahlen. Die zweite Spalte zeigt den dazugehörigen Quellcode für einen 6502-Assembler.
; Das Programm ab der Adresse findmax findet das Maximum einer Folge von Bytes,; wobei jedes Byte einen Wert von 0 bis 255 annehmen kann.; Die Länge der Zahlenfolge befindet sich an der Adresse len und muss einen Wert; im Bereich von 1 bis 255 aufweisen.; Die Folgenglieder sind unmittelbar nach dem Längenbyte gespeichert.; Das ermittelte Maximum im Bereich von 0 bis 255 wird an der Adresse max gespeichert.; Die im Programmcode gewählten Adressen und die Bytefolge sind beispielhaft gewählt.ORG$40maxDS1; Speicherplatz für MaximumlenDC3; Länge der ZahlenfolgeDC213; 1. FolgengliedDC28; 2. FolgengliedDC57; 3. FolgengliedORG$0200; Startadresse des ProgrammcodesfindmaxLDXlen; X-Register (X) mit Folgenlänge ladenLDA#0; Akkumulator (A) mit null (kleinster Wert) initialisierennextCMPlen,X; A mit aktuellem Folgenglied vergleichenBCSnotmax; verzweige an die Stelle notmax, falls Folgenglied nicht größer als A istLDAlen,X; A mit aktuellem Folgenglied laden, ist neues MaximumnotmaxDEX; X um eins vermindernBNEnext; verzweige an die Stelle next, falls X größer als null istSTAmax; speichere gefundenes Maximum an der Adresse max
Der Prozessor existiert in vier Varianten mit jeweils unterschiedlicher Taktfrequenz:[42]
Entwickelt von Hudson Soft und NEC auf Basis des R65C02-Befehlssatzes
Zusätzliche Befehle zum Nullsetzen und Tauschen der Inhalte des A-, X- und Y-Registers
Zusätzliche Befehle zum Kopieren des Inhalts von Speicherbereichen[55]
8 Mapping-Register, um 64K logische Adressen in einen 2-MB-Adressraum physikalischer Adressen einzubetten[56]
Enthält zudem 7-Bit-Timer, 8-Bit-Eingabeport, 8-Bit-Ausgabeport sowie einen programmierbaren Klanggenerator mit sechs Kanälen
Bis zu 21,48MHz Taktfrequenz
Eingesetzt in NECs PC Engine aka TurboGrafx-16 mit bis zu 7,16MHz Taktfrequenz[57]
Atari C014377
Atari-eigene Bezeichnung für einen unmodifizierten MOS 6502[58]
Gelegentlich in der Atari-Literatur als „6502B“ bezeichnet[59]
Eingesetzt in den 8-Bit-Homecomputern Atari 400 und Atari 800 mit 1,77MHz Taktfrequenz (PAL-Version) bzw. 1,79MHz Taktfrequenz (NTSC-Version)
Atari C014806 („SALLY“)
Atari-eigene Bezeichnung für einen erweiterten MOS 6502,[60] der zusätzlich die Logik-Chips der ältesten CPU-Karte des Atari 400 und Atari 800 zum Stoppen des Taktsignals und zum Trennen der CPU vom Adressbus und der Lese-/Schreibleitung enthält
Gelegentlich in der Atari-Literatur als „6502C“ bezeichnet[61]
Alle Mikroprozessoren weisen im Vergleich zum MCS6502 zusätzlich die Befehle BRA, PHX, PHY, PLX, PLY, STZ, TRB, TSB auf
Bei den Mikroprozessoren der R65C00-Familie und dem WDC W65C02S kommen noch die Befehle BBR, BBS, RMB, SMB hinzu
Allein der W65C02S besitzt darüber hinaus die beiden Befehle WAI und STP
Zusätzliche Adressierungsmodi (indirekte Adressierung in der Page null; indirekte indizierte Adressierung beim JMP-Befehl)
Keine illegalen Opcodes (jeder illegale Opcode gleicht in seiner Wirkung einem oder mehreren aufeinander folgenden NOP-Befehlen)
Gültiges N-, V- und Z-Flag nach einer Addition oder Subtraktion in BCD-Arithmetik
Einige Befehle benötigen unter bestimmten Voraussetzungen weniger oder mehr Taktzyklen als beim MCS6502[67]
Maximale Taktfrequenz von 14MHz beim W65C02S (ursprünglich bei allen Versionen 1bis 4MHz Taktfrequenz)
Das RDY-Signal, wenn es auf einem niedrigen Pegel gehalten wird, hält nun den Mikroprozessor im Vergleich zum MCS6502 auch bei Schreibzugriffen an
Die WDC-Variante im Dual in-line package ist nicht pinkompatibel zum MCS6502, lässt sich aber ggf. mit geringen Änderungen auf der Platine dennoch als Ersatz für einen MCS6502 einsetzen
R65C102, R65C112, G65SC102 und G65SC112 sind für Multiprozessorbetrieb ausgelegt und zeigen deswegen an ihrem ML-Pin das Abarbeiten eines Read-Modify-Write-Befehls an; damit kann sichergestellt werden, dass ein solcher Befehl unterbrechungsfrei ausgeführt wird
R65C102 und G65SC102 können bei Multiprozessorbetrieb das Taktsignal für den R65C112 und den G65SC112 erzeugen
In der Vergangenheit hergestellt von GTE, Rockwell, Synertek, NCR, Sanyo und anderen; aktuell gefertigt bei TSMC auf Basis eines 0,6-μm-CMOS-Prozesses (Stand 2023)[67]
Relative Sprünge und Unterprogrammaufrufe auch mit 16-Bit-Offset
Indirekte indizierte Adressierung, bei der die Summe aus Stapelzeiger und Offset im Programmcode die Zeropage-Adresse der Adressierungsart (Indirect),Y ersetzt
2bis 10MHz Taktfrequenz
Eingesetzt im Commodore 65 als Prozessorkern im CSG-Mikrocontroller 4510[70] (mit bis zu 3,5MHz Taktfrequenz)[71] und in der Commodore A2232 Multiport Serial Card (mit bis zu 3,5MHz Taktfrequenz)[72]
MOS 6501 im Keramikgehäuse (MCS6501)
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 im März 1976 eingestellt werden.[73][74]
Mikroprozessor mit 20-Bit-Adressbus (1MB) und mit Unterstützung für Bankswitching
Zwei zusätzliche 4-Bit-Register zur Auswahl der Memory Bank. Die Befehle LDA (Indirect),Y und STA (Indirect),Y verwenden während des Zugriffs auf den Speicherinhalt an der effektiven Adresse das Indirect-Register, ansonsten wird stets das Execute-Register verwendet
Eingesetzt in den Commodore-PET-II-Modellen (CBM 500, 600 und 700)
Mikroprozessor mit der Möglichkeit, seine Adressbustreiber über seinen AEC-Pin hochohmig zu schalten, so dass ein DMA-Controller neben der CPU auf den Speicher zugreifen kann
Zusätzlicher interner 8-Bit-I/O-Port, von dem je nach Variante gemäß Datenblatt sechs oder acht Anschlüsse herausgeführt werden
Eingesetzt im C64 mit 985kHz (PAL-Version) bzw. 1,023MHz (NTSC-Version) Taktfrequenz und mit sechs herausgeführten Anschlüssen des internen I/O-Ports
Teil einer C64-Platine mit Chips von MOS Technology, u.a. einer 6510-CPU.
Eingesetzt im Diskettenlaufwerk VC1551 mit 2MHz Taktfrequenz als 6510T
Mikroprozessor mit der Möglichkeit, seine Adressbustreiber über seinen AEC-Pin hochohmig zu schalten, so dass ein DMA-Controller neben der CPU auf den Speicher zugreifen kann
Zusätzlicher interner 8-Bit-I/O-Port, von dem sieben Anschlüsse herausgeführt werden
Zusätzlicher GATE-IN-Pin, um die Lese-/Schreibleitung hochohmig schalten zu können[81]
Mikroprozessor mit der Möglichkeit, seine Adressbustreiber über seinen AEC-Pin hochohmig zu schalten, so dass ein DMA-Controller neben der CPU auf den Speicher zugreifen kann
Zusätzlicher interner 8-Bit-I/O-Port, von dem sieben Anschlüsse herausgeführt werden
Enthält u.a. einen W65C02S-Prozessorkern, 4KB ROM mit Speichermonitor-Software, 192Bytes RAM, vier 16-Bit-Timer, UART, sechs 8-Bit-I/O-Ports und einen 8-Bit-Output-Port
Der fiktive Roboter Bender aus der Zeichentrickserie Futurama hat einen 6502-Prozessor als CPU (Staffel 2, Episode 4 – Die Party mit Slurm McKenzie).[95]
Im Spielfilm Terminator (1984) wird aus Sicht des Terminators ein 6502-Assembler-Programm für den Apple II angezeigt. Zudem ist eine Ausgabe des Prüfsummen-Programms Key Perfect (in der Version 4.0), das im Nibble Magazine veröffentlicht wurde, zu sehen.[96]
WDC lässt den W65C02S weiterhin produzieren und er kann käuflich erworben werden (Stand 2023).[97]
Für den MCS6502-Mikroprozessor wurde eine Simulation seiner Transistor-Ebene in Software[98] bzw. in Hardware auf einer etwa 30,5cm×38cm großen Platine (The MOnSter 6502)[99] erstellt.
Brian Bagnall:Volkscomputer – Aufstieg und Fall des Computer Pioniers Commodore und die Geburt der PC-Industrie. 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.
Brian Bagnall:Commodore. Variant Press (englisch): “... he envisioned a microcontroller for cash registers, home electronics, home appliances, automobiles, and industrial machines ...”
MOS TECHNOLOGY, INC. (Hrsg.):MOS MICROCOMPUTERS PROGRAMMING MANUAL. Januar 1976, CHAPTER 6 INDEX REGISTERS AND INDEX ADDRESSING CONCEPTS (englisch): “Example 6.5: Moving Five Bytes of Data by Decrementing the Index Register”
Stephen Wozniak:SWEET16: The 6502 Dream Machine.Byte November 1977,abgerufen am 19.Juni 2022(englisch):„My solution was to implement a nonexistent 16 bit "metaprocessor" ...“
Stephen Cass:Q&A With Co-Creator of the 6502 Processor.In:IEEE Spectrum.16.September 2021,abgerufen am 2.Januar 2024(englisch):„And we figured out how to have addressable registers by using zero page ...“
MOS TECHNOLOGY, INC. (Hrsg.):MOS MICROCOMPUTERS HARDWARE MANUAL. Januar 1976, 2.3.4.2 Direct Memory Address [sic] (DMA) Techniques (englisch): “The processor will stop in the first non-write cycle with the data bus in the high-impedance state.”
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 HARDWARE MANUAL. Januar 1976, 2.3.4.2 Direct Memory Address [sic] (DMA) Techniques (englisch): “This can be accomplished very easily with a Quad 2-input data selector.”
Design case history: the Commodore 64.(PDF; 13,4 MB)In:IEEE SPECTRUM.März 1985,abgerufen am 18.März 2023(englisch):„Since the central processor uses a two-phase clock and accesses memory only on the second phase, ...“
Joseph Decuir:Joe Decuir Engineering Notebook 1978.1978,S.38,abgerufen am 20.April 2021(englisch):„If the dynamic storage ... in the MPU can tolerate that ...“
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).
Yamaha PU1-10 Central processing unit.Yamaha Black Boxes online archive,abgerufen am 2.Mai 2021(englisch):„The CPU is equipped with a custom chip developed by Yamaha called YM2002 which is said to be an extension of the 6502 architecture.“
GAMATE Hardware.taizou,abgerufen am 3.Mai 2021(englisch):„... it appears that some Gamates have a large UMC chip only where others have a large NCR ...“
Kevtris:Gamate Inside.Abgerufen am 3.Mai 2021(englisch):„The CPU is an NCR 65CX02, which is very similar to a stock NMOS 6502. It is *NOT* A [sic] 65C02!“
Rodrigo Copetti:PC Engine/TurboGrafx-16 Architecture.Abgerufen am 8.Mai 2021(englisch):„Inside this console, we find the HuC6280, a chip made by Hudson Soft that houses two components. One of them is the CPU, which can operate at two speeds: ~1.79 MHz and ~7.16 MHz.“
C64DX SYSTEM SPECIFICATION.(PDF; 16,2 MB)Commodore Business Machines, Inc.,1991,abgerufen am 8.Mai 2021(englisch):„2.3 The CSG 4510 Microcontroller Chip“
CPU 6510/8500.MJK's Commodore 64 & LCD Page,abgerufen am 27.April 2021(englisch):„... Commodore replaced the 6510 by the 8500, which is fully compatible.“
The original Commodore Business Machines PLUS/4 docs.(PDF; 78 KB)Abgerufen am 27.April 2021(englisch):„If AEC is low when Gate In makes a low to high transition, the R/W line will go to a high impedance until the next transition of the Gate In line and AEC is high prior to the transition.“
David Eyes, Ron Lichty:Programming the 65816 - Including the 6502, 65C02 and 65802. 4 – Sixteen-Bit Architecture: The 65816 and the 65802 (englisch): “The primary distinction between the two processors is the range of addressable memory: ... the 65802 is constrained by its 6502 pinout to 64K.”
David Eyes, Ron Lichty:Programming the 65816 - Including the 6502, 65C02 and 65802. 4 – Sixteen-Bit Architecture: The 65816 and the 65802 (englisch): “The 65802, on the other hand, has a pinout that is identical to that of the 6502 and 65C02 and can indeed be used as a replacement upgrade.”
Gregg Williams, Richard Grehan:The Apple II GS.In:BYTE.Oktober 1986,abgerufen am 10.Mai 2021(englisch):„The 65C816 processor brings the Apple II into the 16-bit world.“
Erico Guizzo:The Truth About Bender’s Brain.IEEE Spectrum,1.Mai 2009,abgerufen am 11.Mai 2021(englisch):„In the episode, “Fry and the Slurm Factory,” a character ... points his F-ray at the head of the show’s famously ill-tempered robot, Bender. It reveals a little rectangle, apparently a chip, labeled “6502.”“
Michael Steil:The 6502 in "The Terminator".pagetable.com,5.Mai 2009,abgerufen am 11.Mai 2021(englisch):„It’s Apple-II code taken from Nibble Magazine. ... On the right, there is output of a run of the checksum application Key Perfect ...“
The MOnSter 6502.Abgerufen am 11.Mai 2021(englisch):„A dis-integrated circuit project to make a complete, working transistor-scale replica of the classic MOS 6502 microprocessor.“