MOS Technology 6502

Mikroprozessor From Wikipedia, the free encyclopedia

Der MOS Technology 6502 ist ein 8-Bit-Mikroprozessor des Unternehmens MOS Technology, der 1975[2] zunächst im Keramikgehäuse als MOS MCS 6502[3] 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.[4]

HerstellerMOS Technology, Rockwell, Synertek, UMC
Produktionsbeginn1975
TechnologieNMOS
Transistoren3510[1]
Schnelle Fakten Hersteller, Produktionsbeginn ...
MOS Technology 6502

Mikroprozessor MOS 6502 im Plastikgehäuse (40-Pin-DIP)
Hersteller MOS Technology, Rockwell, Synertek, UMC
Produktionsbeginn 1975
Technologie NMOS
Transistoren 3510[1]
Gehäuse 40-Pin-DIP
Max. Taktfrequenz 1 MHz bis 2 MHz
Datenbus 8 Bit
Adressbus 16 Bit
Adressraum 64 KiB (Memory Mapped I/O)
Befehlssatz 56 Befehle (MOS 6502)
Register
A Akkumulator
X, Y Indexregister
S Stapelzeiger
P Statusregister
PC Programmzähler
Interrupts IRQ, NMI, Reset, BRK (Software)
Schließen

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.

Geschichte

Entwicklung

Ende der 1960er-Jahre entwickelte Chuck Peddle während seiner Tätigkeit bei General Electric (GE) das Konzept der „verteilten Intelligenz“. Als das Geschäft von GE zur Vermietung von Rechenzeit auf Großrechnern eingebrochen war, begann er sich für die Modernisierung von Kassensystemen zu interessieren. Dabei entwickelte er die Idee intelligenter Terminals, die mit einem Minicomputer verbunden sein sollten und deren Funktionsumfang deutlich über dem der damals üblichen Großrechner-Terminals lag. Nachdem General Electric 1970 den Ausstieg aus dem Großrechnergeschäft beschlossen hatte, verließ Peddle gemeinsam mit zwei Kollegen das Unternehmen. Ihr Versuch, das Konzept der „verteilten Intelligenz“ eigenständig weiterzuentwickeln, scheiterte jedoch an fehlendem Kapital. Während dieser Phase gelangte Peddle zu der Erkenntnis, dass für die praktische Umsetzung der geplanten Terminals ein neuer technologischer Baustein entscheidend war: der Mikroprozessor.[5]

Als Peddle 1973 durch einen Headhunter von der Entwicklung des Motorola-6800-Mikroprozessors erfuhr, die zu diesem Zeitpunkt bereits seit eineinhalb Jahren lief, nahm der das Angebot an, das Entwicklungsprogramm zum Abschluss zu führen. Der leitende Entwickler Tom Bennett bat Peddle, die weitere Entwicklung an den Anforderungen für Kassensysteme auszurichten, wie Peddle sie zuvor definiert hatte. In der Folgezeit bei Motorola machte Peddle immer wieder die Erfahrung, dass potenzielle Kunden zwar vom 6800 beeindruckt waren, den angestrebten Preis von 300 US-Dollar jedoch als zu hoch empfanden. Während Bennett den Mikroprozessor architektonisch am PDP-8-Minicomputer von DEC orientiert hatte, forderten die Kunden für preisgünstige Produkte eher einen Mikrocontroller – einen Prozessor mit reduziertem Funktionsumfang zu niedrigen Kosten.[6]

Da Motorola Peddles Vorschlag ablehnte, einen Mikrocontroller zu entwickeln, suchte er nach Möglichkeiten, die Geschäftsidee eigenständig umzusetzen. Dabei traf er auf John Paivinen, seinen ehemaligen Vorgesetzten bei GE und Mitgründer sowie Präsident von MOS Technology. Das Unternehmen war auf integrierte Schaltkreise für Taschenrechner spezialisiert und belieferte unter anderem Commodore. Peddle und Paivinen einigten sich darauf, bei MOS Technology einen preisgünstigen Mikroprozessor zu entwickeln und zu vermarkten. Als Motorola im August 1974 die Markteinführung des 6800 ankündigte, verließen Peddle und sieben seiner Kollegen das Unternehmen, um noch im selben Monat bei MOS Technology zu beginnen. Zu dieser Gruppe gehörten neben Peddle Wil Mathys, Terry Holdt, Rod Orgill, Ray Hirt, Mike Janes, Harry Bawcom und Bill Mensch.[7][8]

Nach ihrer Ankunft bei MOS Technology teilte sich die Gruppe um Peddle informell auf. Peddle, Mathys und Orgill waren für den initialen Entwurf der beiden zunächst geplanten Mikroprozessoren 6501 und 6502 zuständig. Der 6501 war dabei als pin-kompatibler Ersatz für den Motorola 6800 konzipiert – ein Umstand, gegen den Motorola später erfolgreich gerichtlich vorging.[9]

Struktur des Mikroprozessors MOS 6502 auf dem Halbleiter mit einem eingezeichneten rekonstruierten Schaltplan

Rückblickend unterteilt Mathys den Entwurf eines Mikroprozessors in fünf Phasen. Zuerst wird die Architektur festgelegt, wozu die Register und Hilfsregister, der Befehlssatz, die Handhabung von Unterbrechungen (Interrupts) sowie Datenbusse für den Informationstransfer zählen. Danach wird die Befehlsausführung entworfen. Dies geschieht durch die Definition aller Datentransfers zwischen Registern innerhalb des Mikroprozessors sowie mit externen Bausteinen. Anschließend wird die Befehlsausführung durch logische Gleichungen ausgedrückt, um damit einen vollständigen Schaltplan (Logikdiagramm) zu erstellen. Dieser muss jedes Bauteil – jeden Transistor, jeden Bus und jede Teilschaltung – enthalten. Sobald der Schaltplan fertiggestellt ist, übernehmen spezialisierte Schaltungsentwickler und Layout-Zeichner dessen Umsetzung in eine Struktur, die später auf dem Halbleiter als Teil der Produktion des Mikroprozessors hergestellt wird.[10]

In dieser finalen Entwicklungsphase waren Bill Mensch und Ray Hirt für den Schaltkreisentwurf zuständig, während Harry Bawcom, Sydney Anne Holt und Mike Janes daraus das zweidimensionale Layout des Mikroprozessors auf dem Halbleiter erstellten, indem sie Polygone manuell auf Mylarfolien zeichneten. Die Einhaltung der Fertigungsregeln zur Vermeidung von Fehlfunktionen wurde durch eine wochenlange Präzisionsarbeit sichergestellt, indem die Abstände der Polygone zueinander überprüft wurden. Schlussendlich wurde das Layout durch eine Digitalisierung in einzelne Ebenen zerlegt, um die Fotomasken für die Halbleiterfertigung herzustellen. Im Juni 1975 war der Entwurf abgeschlossen.[11][12][13]

Markteinführung

Im September 1975 stellte MOS Technology den 6502 auf der Fachmesse Western Electronic Show and Convention (Wescon) in San Francisco vor. Da die Messeleitung den Direktverkauf vor Ort untersagte, mietete das Team um Chuck Peddle eine Suite im nahegelegenen St. Francis Hotel an. Um die sofortige Lieferfähigkeit zu demonstrieren, bot das Unternehmen den 6502 dort in einer großen Glasvase zum Kauf an. Flankiert wurde die Offerte von zwei Handbüchern zur Systemintegration und Programmierung, die in Fachkreisen später aufgrund ihrer Verständlichkeit gelobt wurden. Zusätzliche Bausteine mit Speicher und Ein-/Ausgabe-Schnittstellen sowie Entwicklungssysteme wie der KIM-1 rundeten das Angebot ab, um das Interesse der Entwickler zu wecken.[14]

Um den Markt zu durchdringen, verfolgte MOS Technology eine aggressive Preisstrategie: Während Konkurrenzprodukte wie der Motorola 6800 oder der Intel 8080 rund 300 US-Dollar kosteten, wurde der 6502 für 25 US-Dollar (und der 6501 für 20 US-Dollar) angeboten. Diese Preisgestaltung war für MOS Technology dennoch rentabel. Nach Bill Seiler beliefen sich die Produktionskosten auf lediglich vier bis fünf US-Dollar, während das Konkurrenzmodell Intel 8080 für etwa 90 US-Dollar gehandelt wurde. Seiler zufolge war Abnehmern wie Atari dieser enorme preisliche Spielraum nicht bewusst; ermöglicht wurde er vor allem durch eine im Branchenvergleich außergewöhnlich hohe Fertigungsausbeute. Dieser Preissturz machte Mikroprozessoren erstmals für Privatanwender sowie kleine Unternehmen – darunter das von Steve Wozniak und Steve Jobs mitgegründete Apple Computer – erschwinglich und hatte einen erheblichen Einfluss auf die Computerindustrie. Damit schuf der MOS 6502 die ökonomische Basis für die aufkommende Spielkonsolen- und Heimcomputer-Ära, da er leistungsfähige Hardware für Massenmarkt-Produkte wie das Atari 2600 (in Form des preisgünstigeren 6507) und den Commodore VC 20 möglich machte.[14]

Zur Absicherung der Marktakzeptanz lizenzierte MOS Technology den Entwurf an weitere Hersteller (Second Sources). Laut Chuck Peddle war dies strategisch notwendig, da Kunden wie Atari ein Herstellermonopol ablehnten und den Prozessor nur bei garantierter Lieferfähigkeit durch einen Zweitproduzenten einsetzten.[15] Zu den Lizenznehmern gehörten neben Synertek auch UMC und Rockwell. Letzteres Unternehmen bot spezialisierte Varianten des MOS 6502 mit Zusatzkomponenten für industrielle und militärische Anwendungen an. Über zehn Jahre später entstand in Bulgarien mit dem CM630 vom KMT-Prawez ein unlizenzierter Nachbau.[16][17][18]

Rezeption

Zeitgenössische Kritik

Die Fachzeitschrift EDN ordnete den MOS 6502 im September 1975 als Vertreter einer neuen „2,5. Mikroprozessorgeneration“ ein. Diese zeichne sich dadurch aus, dass sie zur drastischen Senkung der Herstellungskosten bewusst technische Kompromisse eingehe, ohne jedoch die Leistung in gängigen Hauptanwendungen zu beeinträchtigen. Tatsächlich übertreffe der 6502 bei einfachen Benchmarks sogar etablierte Prozessoren der zweiten Generation wie den Intel 8080 oder den Motorola 6800. Die Redaktion charakterisierte diese Generation als integrierte Bausteine, die bereits Komponenten wie Taktgeneratoren, I/O-Schnittstellen sowie Arbeits- oder Festwertspeicher enthielten und dadurch besonders einfach in Betrieb zu nehmen seien.[19]

Bei der Realisierung wurde die Verwendung von Lasttransistoren vom Verarmungstyp (Depletion-mode Loads) gelobt. Diese ermöglichten im Vergleich zur vorherigen Generation eine deutlich geringere Leistungsaufnahme, die teils weniger als die Hälfte betragen habe. Zwar wurde der Befehlssatz zur Einsparung von Chipfläche auf 55 (später 56) Instruktionen begrenzt, doch wurde dies laut Chuck Peddle durch effizientere Adressierungsarten im Vergleich zum Motorola 6800 mehr als aufgewogen. Als potenziellen Nachteil in minimalen Systemkonfigurationen sah die Fachzeitschrift die Notwendigkeit von externem Arbeitsspeicher an, da der 6502 im Gegensatz zu einigen Konkurrenzmodellen diesen nicht integriere. MOS Technology beabsichtigte jedoch, diesen Umstand durch einen kombinierten Zusatzbaustein zu kompensieren, um ein wirtschaftlich marktführendes System aus lediglich zwei Bausteinen zu ermöglichen. Im selben Artikel wurde bereits ein technisch verbesserter Nachfolger des Motorola 6800 angekündigt.[19]

Das Magazin Byte wertete das Erscheinen der 6500-Serie als eine Zäsur für den Heimcomputer-Markt. Vor allem der geringe Preis von 20 US-Dollar pro Stück galt als disruptiv, da er selbst optimistische Erwartungen an die Erschwinglichkeit von Mikroprozessoren unterbot. In technischer Hinsicht verglich Byte den 6502 differenziert mit dem Konkurrenzmodell Motorola 6800. Positiv hervorgehoben wurden die fortschrittlichen Adressierungsmodi, durch welche die Prozessoren von MOS Technology bei der Systemprogrammierung gegenüber dem 6800 überlegen erschienen. Demgegenüber stand Kritik an funktionalen Einschränkungen des Befehlssatzes. So wurde das Fehlen vorzeichenbehafteter Vergleiche und die Notwendigkeit, das Carry-Flag vor jeder Addition manuell per Befehl zu löschen, als unpraktisch für die Anwendungsentwicklung beschrieben. Weitere Kritikpunkte betrafen das Fehlen von Befehlen wie das Rechts-Rotieren (ROR), Negieren (NEG) sowie die Unmöglichkeit, den Akkumulator direkt per Einzelbefehl zu inkrementieren oder dekrementieren. Auch wurde die fehlende Konsistenz bemängelt, mit der die verschiedenen Adressierungsmodi über den Befehlssatz hinweg verfügbar seien. Trotz dieser als einschränkend empfundenen Details sah Byte den 6502 als richtungsweisend für die Entwicklung der ersten Heimcomputer.[20]

Retrospektive Kritik

In einem Nachruf auf Chuck Peddle im Magazin Retro Gamer aus dem Jahr 2020 wird der MOS 6502 als entscheidender Katalysator für die Verbreitung der Heimcomputer gewürdigt. Peddles Strategie, eine zuvor kostspielige Prozessorbaugruppe auf einen kostengünstigen integrierten Schaltkreis zu reduzieren, habe den Grundstein für den Erfolg von Unternehmen wie Apple, Acorn und Commodore gelegt. Der Informatiker Steve Furber betonte in diesem Zusammenhang die technische Tragweite des Designs: Die Dominanz des 6502 im 8-Bit-Markt und seine guten Echtzeit-Eigenschaften beeinflussten maßgeblich die spätere Entwicklung der ARM-Architektur, da man bei Acorn unzufrieden mit frühen 16-Bit-Prozessoren war und auf den Erfahrungen mit dem 6502 aufbaute. Laut Daniel Fylstra, der 1977 als Redakteur für das Magazin Byte tätig war, ermöglichte der Mikroprozessor nicht nur erschwingliche Hardware wie den Commodore PET, sondern half auch das Fundament für eine florierende Softwareindustrie zu legen und machte Softwareprodukte erstmals für Privatpersonen statt nur für Großunternehmen erschwinglich.[21]

Die Fachzeitschrift IEEE Spectrum wählte den 6502 in ihre „Chip Hall of Fame“ und würdigte ihn als eines der maßgeblichen „Gehirne“ der 8-Bit-Ära. Sein Einsatz im Apple I durch Steve Wozniak habe einen Wendepunkt markiert, dem die Verwendung des Prozessors sowie seiner Varianten in wegweisenden Systemen wie dem Apple II, dem Commodore PET, dem Commodore 64 und dem BBC Micro folgte. Auch im Konsolenbereich sei er mit dem Nintendo Entertainment System (NES) und dem Atari 2600 wegweisend gewesen. Der entscheidende Marktvorteil habe dabei im Preis gelegen: Während Konkurrenzprodukte wie der Intel 8080 oder der Motorola 6800 für fast 200 US-Dollar gehandelt wurden, kam der 6502 für lediglich 25 US-Dollar auf den Markt. Dieser signifikante Preisvorteil sei durch einen minimierten Befehlssatz sowie ein optimiertes Fertigungsverfahren ermöglicht worden, das eine bis zu zehnmal höhere Ausbeute an funktionsfähigen CPUs im Vergleich zur Konkurrenz erlaubt habe. Die anhaltende kulturelle Bedeutung des 6502 spiegelte sich auch in der Populärkultur wider, etwa durch die fiktive Verwendung als Prozessoreinheit des Roboters Bender in der Serie Futurama.[22][23]

Programmiermodell

Der Entwurf des MOS 6502 als 8-Bit-Mikroprozessor war maßgeblich von dem Ziel geprägt, die Produktionskosten durch eine minimale Chipfläche gering zu halten und so die Ausbeute funktionierender Chips zu maximieren. Trotz dieses reduzierten Ansatzes wies Chuck Peddle bei der Markteinführung darauf hin, dass der 6502 durch seine effiziente interne Logik Geschwindigkeitsvorteile gegenüber Konkurrenzmodellen besitze.[24]

Registerstruktur

Die Architektur des 6502 verfügt über eine bewusst minimalistische Ausstattung mit spezialisierten Registern. Da der Chip im Vergleich zu zeitgenössischen Mikroprozessoren weniger interne Register besitzt, ist er stärker auf Speicherzugriffe angewiesen (memory-bound).[24] Um diesen Flaschenhals auszugleichen, sieht das Design einen Bereich im Hauptspeicher (Zero Page) vor, auf den besonders effizient zugegriffen werden kann.[25]

Weitere Informationen Register, Funktion ...
Die Registerstruktur im Einzelnen
Register Funktion
Akkumulator (A) Das zentrale 8-Bit-Register für alle arithmetischen und logischen Operationen.[26]
Indexregister (X und Y) Zwei 8-Bit-Register, die für indizierte Adressierungsmodi, als Zähler oder als Zwischenspeicher eingesetzt werden können.[27]
Programmzähler (PC) Ein 16-Bit-Register, das den Zugriff auf einen Adressraum von bis zu 64 KB ermöglicht.[28]
Stapelzeiger (S) Ein 8-Bit-Register, das den Stack innerhalb der Speicherseite eins ($0100 bis $01FF) adressiert. Da das High-Byte fest auf $01 verdrahtet ist, ist der Stapelspeicher auf 256 Byte begrenzt.[29]
Statusregister (P) Enthält 7 aktive Flags (Negative (N), Overflow (V), Break (B), Decimal (D), Interrupt Disable (I), Zero (Z), Carry (C)), die den Zustand der CPU anzeigen und so auch den Ablauf von bedingten Sprüngen steuern.[30]
Schließen

Adressraum und Speicherorganisation

Für den Datentransfer mit externen Bausteinen verfügt der 6502 über einen Adressraum von 64 KB, in dem ein 16-Bit-Adressbus und ein 8-Bit-Datenbus einzelne Speicherstellen ansprechen. Da sich Programmbefehle und Daten diesen Adressraum teilen, besitzt die CPU eine Von-Neumann-Architektur.[19] Die Belegung des Adressraums ist mit den nachfolgenden Ressourcen nahezu beliebig gestaltbar.[31]

Weitere Informationen Ressource, Funktion ...
Externe Ressourcen
Ressource Funktion
Festwertspeicher (ROM) Zur dauerhaften Ablage von Firmware, Betriebssystemen oder fest installierten Programmen.
Arbeitsspeicher (RAM) Für die Speicherung von Variablen, temporären Programmdaten und Rechenergebnissen.
I/O-Register externer Bausteine Zur Steuerung externer Funktionen über Memory-Mapped-I/O.
Schließen

Einige Bereiche des Adressraums sind durch die CPU-Architektur fest vorgegeben: Die Speicherseite null ($0000 bis $00FF) ist für die effiziente Zero-Page-Adressierung vorgesehen, während die Seite eins ($0100 bis $01FF) als Stapelspeicher (Stack) dient.[32][29] Am oberen Ende des Adressraums befinden sich die Interrupt-Vektoren ($FFFA bis $FFFF). In diesen fest reservierten Speicherplätzen sind die Startadressen der Befehlsfolgen für die Verarbeitung wichtiger Systemereignisse im Little-Endian-Format hinterlegt.[33]

Weitere Informationen Unterbrechungstyp, Speicherort ...
InterruptVektoren
Unterbrechungstyp Speicherort Verwendung
Nicht maskierbarer Interrupt (NMI) $FFFA–$FFFB Verweist auf die Programmstelle zur sofortigen Verarbeitung kritischer externer Signale, die softwareseitig nicht ignoriert werden können.
Reset (RES) $FFFC–$FFFD Teilt der CPU beim Einschalten oder nach einem Neustart mit, an welcher Speicheradresse die Programmausführung beginnt.
Interrupt-Anforderung (IRQ) und BRK-Befehl $FFFE–$FFFF Enthält die Einsprungadresse für den Standard-Interrupt (IRQ) sowie für den Software-Interrupt-Befehl BRK. Die Verarbeitung von IRQs kann über das I-Flag deaktiviert werden. Da das prozessorinterne B-Flag das Vorliegen einer externen Unterbrechungsanforderung signalisiert und vor dem Aufruf der Unterbrechungsroutine als Teil des Statusregisters auf dem Stapel abgelegt wird, ermöglicht es anschließend die Unterscheidung zwischen einem IRQ und einem BRK.[34][35]
Schließen

Befehlssatz

Die Steuerung des 6502 basiert auf einer fest verdrahteten Logik, die 56 offizielle Befehle bereitstellt. Diese lassen sich funktional in verschiedene Gruppen unterteilen:

Arithmetische und logische Operationen: Die CPU unterstützt grundlegende 8-Bit-Operationen wie Addition (ADC) und Subtraktion (SBC) sowie bitweise logische Verknüpfungen (AND, ORA, EOR). Ein besonderes Merkmal ist die Fähigkeit, über das Decimal-Flag Berechnungen im binär codierten Dezimalformat (BCD) durchzuführen.

Speicherzugriff und Datenmanipulation: Befehle wie LDA, LDX und LDY dienen dem Laden von Werten in die Register, während STA, STX und STY die Registerwerte im Speicher ablegen. Zudem stehen Befehle für Inkrementierung, Dekrementierung sowie für Verschiebungen um ein Bit (ASL, LSR) und Rotationen um ein Bit (ROL, ROR) zur Verfügung.

Ablaufsteuerung: Die Befehlsfolgen werden durch unbedingte Sprünge (JMP), Unterprogrammaufrufe (JSR) und deren Rücksprünge (RTS) gesteuert. In Kombination mit bedingten Verzweigungen (Branches), die auf den Status-Flags basieren (wie BEQ für „Branch if Equal“), lassen sich so einschlägige Kontrollstrukturen realisieren.

Spezialbefehle und Systemsteuerung: Hierzu zählen Befehle zur Manipulation der Status-Flags (beispielsweise SEI zum Sperren von Interrupts, CLC zum Löschen des Carry-Flags) sowie Instruktionen für den Software-Interrupt (BRK) oder das Ende einer Interrupt-Service-Routine (RTI).[36]

Adressierungsarten

Unabhängig von der Art des Befehls legen die Adressierungsarten fest, wie die zu verarbeitenden Operanden ermittelt werden. Dabei ist zu beachten, dass nicht jeder Befehl jede Adressierungsart unterstützt. Besonders hervorzuheben sind folgende Varianten:

Unmittelbare Adressierung (Immediate): Hierbei folgt der Operand im Speicher unmittelbar auf den Befehl.

Zero-Page-Adressierung: Diese ermöglicht einen schnellen Zugriff auf die ersten 256 Byte des Speichers ($0000 bis $00FF). Da für die Adressierung lediglich ein Byte benötigt wird, sind diese Operationen kürzer und beanspruchen weniger Taktzyklen.

Indizierte Adressierung: Sie erlaubt den Zugriff auf Speicherbereiche, indem der Wert eines Indexregisters (X oder Y) zu einer Basisadresse addiert wird. Dies ist eine Grundvoraussetzung für die effiziente Verarbeitung von Tabellen oder Arrays.

Indirekte Adressierung mit Indexregister: Hier verweist die im Befehl angegebene Adresse auf einen Zeiger in der Zero-Page. In Kombination mit einem Indexregister ergeben sich dann zwei spezialisierte Verfahren:

Nachindiziert (mit Y): Der Prozessor liest eine Adresse aus der Zero-Page und addiert danach den Wert des Y-Registers hinzu (beispielsweise LDA ($24),Y). Dies wird genutzt, um über einen festen Zeiger auf Arrays oder Datenstrukturen zuzugreifen, die an beliebiger Stelle im Speicher liegen können.

Vorindiziert (mit X): Das X-Register wird bereits innerhalb der Zero-Page zur Adresse addiert, um einen von mehreren dort hinterlegten Zeigern auszuwählen (beispielsweise LDA ($24,X)). Dieses Verfahren ist ideal für den Zugriff mittels Tabellen von Zeigern, wie es beispielsweise bei der Verarbeitung paralleler Datenströme oder bei Sprungtabellen vorkommt.[37]

Die folgende Auswahl zeigt einige der 56 Befehle des 6502 und verdeutlicht das Zusammenspiel zwischen Operationscodes, Befehlskürzeln der Assemblersprache (Mnemonics) und Adressierungsarten.[38]

Weitere Informationen Opcode, Mnemonic ...
Typische Assembler-Befehle und ihre Funktionsweise
OpcodeMnemonicAdressierungFunktion
$A9LDA #$FFunmittelbarLädt („LoaD“) den Akkumulator direkt mit dem Wert $FF (255 dezimal).
$ADLDA $C000absolutLädt den Akkumulator mit dem Inhalt der Adresse $C000.
$A1LDA ($24,X)indiziert indirektLädt den Akkumulator über einen Zeiger in der Zero Page (indiziert mit X).
$8DSTA $C000absolutSpeichert („STore“) den Inhalt des Akkumulators (ein Byte) an der Adresse $C000.
$6DADC $C001absolutAddiert („ADd with Carry-Flag“) den Inhalt von $C001 zum Akkumulator (plus eins, falls das Carry-Flag gesetzt ist).
$C9CMP #$7FunmittelbarVergleicht („CoMPare“) den Akkumulator mit dem Wert $7F und setzt die Statusflags.
$F0BEQ $FC00relativ(„Branch if result is EQual“) Verzweigt zur Adresse $FC00, wenn das Zero-Flag gesetzt ist (Ergebnis gleich).
$E8INXimplizit(„INcrement X“) Erhöht den Inhalt des X-Registers um eins.
$20JSR $FC00absolut(„Jump to SubRoutine“) Springt zum Unterprogramm bei $FC00 und legt die Rücksprungadresse auf den Stack.
$60RTSimplizit(„ReTurn from Subroutine“) Kehrt aus einem Unterprogramm zurück (nimmt die Rücksprungadresse vom Stack).
$00BRKimplizit(„BReaK“) Erzwingt einen Software-Interrupt und rettet den Programmzähler und das Statusregister auf dem Stack.
$EANOPimplizit(„No OPeration“) Keine Operation; dient als Platzhalter oder zur Zeitverzögerung.
Schließen

Beispielprogramm

Die Programmierung des MOS 6502 lässt sich anhand eines Assembler-Programms verdeutlichen, das das Maximum einer Folge vorzeichenloser Zahlen ermittelt. Das folgende Beispiel zeigt typische Merkmale wie die Verwendung von Registern (A, X), den Einsatz eines Vergleichs mit anschließender bedingter Verzweigung sowie die Nutzung einer indizierten Adressierungsart.

Das Programm beginnt an der Adresse findmax ($0200). Es setzt voraus, dass die Länge der Zahlenfolge (1 bis 255) an der Adresse len ($0041) hinterlegt ist und die einzelnen Folgenglieder unmittelbar darauf folgen. Das ermittelte Maximum wird nach Abschluss der Berechnung an der Adresse max ($0040) gespeichert. Die gewählten Adressen und Datenwerte sind beispielhaft.

In der nachstehenden Tabelle zeigt die linke Spalte die Speicheradressen gefolgt vom Maschinencode in Hexadezimaldarstellung. Die rechte Spalte enthält den dazugehörigen Quelltext in der für den 6502 üblichen Assemblersprache.[39]

0040
 
0040  00
0041  03
0042  D5
0043  1C
0044  39
 
0200
 
0200  A6 41
0202  A9 00
0204  D5 41
0206  B0 02
 
0208  B5 41
020A  CA
020B  D0 F7
 
020D  85 40
        ORG $40

max     DS 1          ; Speicherplatz für Maximum
len     DC 3          ; Länge der Zahlenfolge
        DC 213        ; 1. Folgenglied
        DC 28         ; 2. Folgenglied
        DC 57         ; 3. Folgenglied

        ORG $0200     ; Startadresse des Programmcodes

findmax LDX len       ; X-Register (X) mit Folgenlänge laden
        LDA #0        ; Akkumulator (A) auf null (kleinster Wert) setzen
next    CMP len,X     ; A mit aktuellem Folgenglied vergleichen
        BCS notmax    ; verzweige an die Stelle notmax, falls Folgenglied <= A

        LDA len,X     ; A mit aktuellem Folgenglied laden, ist neues Maximum
notmax  DEX           ; X um eins vermindern
        BNE next      ; verzweige an die Stelle next, falls X > 0

        STA max       ; speichere gefundenes Maximum an der Adresse max

Opcode-Matrix

Die folgende Matrix bietet eine Übersicht über den dokumentierten Befehlssatz des 6502-Prozessors. Sie ordnet jedem der 151 offiziellen Opcodes seinen Befehl und Adressierungsart zu.[38]

Weitere Informationen Höherwertiges Nibble, Niederwertiges Nibble ...
Alle dokumentierten Opcodes des 6502
Adressierungsarten:  A  (Akkumulator / implizit),  #  (unmittelbar),  zpg  (Zero-Page),  abs  (absolut),  ind  (indirekt: mit X vorindiziert; mit Y nachindiziert),  rel  (relativ)
Höherwertiges NibbleNiederwertiges Nibble
01245689ACDE
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 (wie 02) und alle Opcodes mit den niederwertigen Nibbles 3, 7, B und F sind nicht Bestandteil des 6502-Befehlssatzes.
Schließen

Undefinierte Operationscodes

Von den 256 möglichen Operationscodes des MOS 6502 sind lediglich 151 offiziell dokumentiert. Die verbleibenden 105 Werte werden als „undefinierte“ oder „undokumentierte“ Opcodes bezeichnet. Ein Teil dieser Befehle kombiniert die Operationen mehrerer regulärer Instruktionen, was eine effizientere Programmausführung ermöglicht. Da diese Opcodes offiziell für Nachfolgemodelle reserviert waren, war ihre Verwendung mit dem Risiko von Inkompatibilitäten verbunden.[40][41][42]

Weitere Informationen Opcode, Mnemonic ...
Beispiele undefinierter Opcodes des 6502
OpcodeMnemonicAdressierungFunktion
$02HLTimplizit(„HaLT“) Versetzt den Prozessor in einen Halt-Zustand, der nur durch einen Reset beendet werden kann.
$0BANC #nunmittelbar(„AND #n, N-Flag  C-Flag“) Führt eine Und-Verknüpfung des Akkumulators mit dem Wert n aus und speichert das Ergebnis im Akkumulator. Das Carry-Flag wird anschließend auf den Wert des Negative-Flags gesetzt.
$0CSKWimplizit(„SKip next Word“) Überspringt die folgenden zwei Bytes durch Erhöhung des Programmzählers (entspricht drei NOP-Befehlen).
$0FASO $C000absolut(„ASL, ORA“) Kombiniert ASL $C000 und ORA $C000.
$2FRLA $C001absolut(„ROL, AND“) Kombiniert ROL $C001 und AND $C001.
$6FRRA $C003absolut(„ROR, ADC“) Kombiniert ROR $C003 und ADC $C003.
$8BXAA #nunmittelbar(„TXA, AND #n“) Transferiert den Inhalt des X-Registers in den Akkumulator, führt danach eine Und-Verknüpfung des Akkumulators mit dem Wert n aus und speichert das Ergebnis im Akkumulator.
$8FSAX $C004absolut(„Store (A & X)“) Speichert das Ergebnis einer Und-Verknüpfung von Akkumulator und X-Register an der Zieladresse $C004.
$AFLAX $C005absolut(„LDA, LDX“) Lädt den Inhalt an der Adresse $C005 in den Akkumulator und das X-Register. Einige Adressierungsarten von LAX können instabil sein.
$CFDCM $C006absolut(„DEC, CMP“) Kombiniert DEC $C006 und CMP $C006.
Schließen

Software-Entwicklung und Emulation

Aufgrund fehlender 16-Bit-Register und eines auf 256 Byte begrenzten Stapelspeichers gilt die Architektur des 6502 als wenig geeignet für Hochsprachen wie C. So erreicht beispielsweise der vom Cross-Compiler cc65 erzeugte Maschinencode nicht annähernd die Ausführungsgeschwindigkeit von handoptimiertem Assembler-Code.[43] Um die Einschränkungen der 8-Bit-Register zu umgehen und die Speichereffizienz des Programmcodes zu steigern, kann alternativ eine virtuelle CPU mit 16-Bit-Registern emuliert werden. Ein bekanntes Beispiel hierfür ist der von Steve Wozniak entwickelte Interpreter Sweet16, der den Befehlssatz des 6502 als Mikrocode nutzt. Solche virtuellen Architekturen bieten zudem den Vorteil der Portabilität, da der erzeugte Bytecode unverändert auch auf anderen Prozessortypen ausgeführt werden kann, sofern dort ein entsprechender Emulator existiert.[44]

Systemarchitektur

Die hardwareseitige Realisierung des Programmiermodells im MOS 6502 basiert auf einer Architektur, die für ihre Zeit mehrere innovative Ansätze vereinte:

Integrierter Taktgenerator: Im Vergleich zu zeitgenössischen Mikroprozessoren enthält der 6502 einen internen Taktgenerator. Dieser benötigt lediglich ein einfaches externes Taktsignal und generiert daraus selbstständig zwei phasenverschobene, nicht überlappende Taktsignale für die Steuerung der internen Schaltkreise.[45]

Obwohl das offizielle Hardware Manual eine maximale externe Taktfrequenz von 1 MHz auswies, verwies Chuck Peddle kurz nach der Veröffentlichung der CPU auf das Potenzial für 2 MHz. Er begründete dies mit der Verwendung eines internen Festwertspeichers (PLA) zur Befehlsdekodierung, der die Signallaufzeiten verkürzt habe. Die Fachzeitschrift EDN bestätigte dies in ihrer Ausgabe vom September 1975 und berichtete, dass eigene Untersuchungen einen stabilen Betrieb des 6502 in einem Frequenzbereich von unter 100 kHz bis über 2 MHz belegten.[24][19] Später wurde der Prozessor in Varianten gefertigt, die für unterschiedliche maximale Taktfrequenzen spezifiziert waren. Die Kennzeichnung erfolgte durch Suffixe hinter der Typenbezeichnung.[46]

Weitere Informationen Modell, Maximale Taktfrequenz ...
Einsatz der 6502-Hauptvarianten in Computern und Peripheriegeräten
ModellMaximale TaktfrequenzBeispielhafte Verwendung
MOS 65021 MHzCommodore PET 2001, VC 20, Floppy-Laufwerk VC1541; Apple I, Apple II
MOS 6502A2 MHzApple III; Atari 400, 800; Commodore-Laufwerk VC1581; Novag Skat Champion
Schließen

Pipeline-Architektur: Das Design nutzt eine Pipeline-Architektur, die auf der Trennung von internen und externen (beobachtbaren) Operationen beruht. Da der 6502 während jeder Taktphase gleichzeitig einen Speicherzugriff (externe Operation) und eine interne Operation durchführt, kann er beispielsweise bereits das erste Byte des nächsten Befehls laden, während der vorangegangene Befehl noch intern abgearbeitet wird.[47]

PLA-Steuerung: Die CPU verwendet anstelle von Mikrocode ein Programmable Logic Array (PLA). Dessen 130 Ausgangssignale übernehmen in Abhängigkeit vom geladenen Opcode und dem internen Taktzähler die erste Stufe der Ablaufsteuerung. Eine nachgeschaltete Random Control Logic wertet diese Signale aus und erzeugt die spezifischen Steuersignale für die Datenpfade des Prozessors.[48]

Bussteuerung und Speicherzugriff

Im regulären Betrieb führt der 6502 in jedem Taktzyklus einen Speicherzugriff durch, bei dem ein Byte gelesen oder geschrieben wird. Um jedoch langsame Speicher- oder Peripheriebausteine zu unterstützen, kann der Lesezugriff der CPU verzögert werden, ohne deren Taktfrequenz zu verringern. Hierzu wird der RDY-Pin (Ready) der CPU taktsynchron durch den adressierten Baustein auf einen niedrigen Pegel gesetzt. In diesem Fall wird der interne Zustand des 6502 „eingefroren“ und die Ausführung der aktuellen Mikroinstruktion unterbrochen. Sobald der adressierte Baustein das Datenbyte am Bus bereitstellt, setzt er das RDY-Signal wieder auf einen hohen Pegel. Daraufhin schließt die CPU den Lesevorgang ab und stellt die laufende Mikroinstruktion fertig. Bei einem Schreibzugriff wird das RDY-Signal von der CPU hingegen ignoriert.[49]

Über das RDY-Signal kann der 6502 insbesondere für einen DMA-Zugriff (Direct Memory Access) angehalten werden, wobei der Wartezustand erst mit dem nächsten Lesezugriff eintritt. Da der 6502 im Gegensatz zum Datenbus den Adressbus und die Lese-/Schreibleitung permanent ansteuert, müssen externe Bausteine wie Multiplexer oder Puffer eingesetzt werden, um diese Signalleitungen für einen DMA-Controller freizugeben. Bei dem später entwickelten 6510 kann die Trennung vom Adressbus direkt über dessen AEC-Pin (Address Enable Control) erfolgen.[50]

Mikrocontroller HuC6280 mit 6502-basierter CPU, verbaut in der Spielkonsole PC Engine/TurboGrafx-16

Neben dem RDY-Signal kommen weitere Methoden zum Einsatz, um einen DMA unter Berücksichtigung des Speicherzugriffs des 6502 durchzuführen:

Transparenter DMA: Sofern es die Zugriffszeit des Speichers zulässt, kann ein DMA während der ersten Hälfte des Taktzyklus stattfinden, da der 6502 erst während der zweiten Hälfte eine Datenübertragung durchführt. Dieses Verfahren wird beispielsweise vom Videochip VIC II im Commodore 64 angewendet.[51]

Anhalten des Taktsignals: Das Signal am Takteingang des 6502 kann auf einem konstanten Pegel gehalten werden, um den internen Zustand einzufrieren. Da sich jedoch der interne Speicher des 6502 mit der Zeit entlädt, kann dieser Zustand nur zeitlich begrenzt aufrechterhalten werden.[52] Diese Methode wird etwa vom ANTIC-Chip in den Atari-8-Bit-Heimcomputern verwendet.[53]

Varianten und Erweiterungen des Befehlssatzes

Die grundlegende Architektur des 6502 blieb über Jahrzehnte hinweg bestehen. Diese Beständigkeit erlaubte es Entwicklern, bestehendes Know-how auf neue Varianten zu übertragen, während die Hardware gezielt an spezifische Marktanforderungen angepasst wurde. Die Evolution reichte von kostenoptimierten Versionen für den Massenmarkt über Varianten mit neuen Befehlen für Arithmetik sowie Bit-Manipulationen und integrierte Systeme bis hin zur 16-Bit-Erweiterung. Die folgende Tabelle gibt einen Überblick über einige Varianten kategorisiert nach Anforderungen.

Weitere Informationen Anforderung / Varianten, Umsetzung ...
Varianten und Anforderungen
Anforderung / Varianten Umsetzung Typische Einsatzgebiete
Kostenminimierung
6507, 6503–06, 6513–15
Reduzierter Adressbus (4–8 KiB); 28-Pin-Gehäuse zur Senkung der Fertigungskosten Atari 2600, Nadeldrucker MPS 802, Schachcomputer Chessmate[54]
Schnittstellen-Integration
6510, 8500, 8502, 7501, 8501
8-Bit-I/O-Port (Anzahl herausgeführter Anschlüsse verschieden); AEC-Pin zur Grafikchip-DMA-Unterstützung Commodore 64, 128, 16, Plus/4[54][55][56][57][58]
Busfreigabe
C014806 (6502C)
Zusätzlicher HALT-Pin zur Bus-Freigabe und CPU-Stopp für Grafikchip-DMA Atari XL/XE-Serie, Atari 5200, Atari 7800[59]
Effizienz und Verbesserung
W65C02S, R65C02, G65SC02
CMOS-Technologie; neue Befehle wie BRA, STZ; Design-Verbesserungen wie bei JMP Apple IIc, Apple IIe, Atari Lynx, Ersatzteil[60][61][62]
Speichererweiterung
6509
Zwei Bankswitching-Register für 20-Bit-Adressbus (1 MiB) CBM-500-Serie, CBM-600-Serie[54]
Gaming
RP2A03, RP2A07, HuC6280
Tongenerator; Deaktiviertes BCD (Ricoh); Taktfrequenz bis 21 MHz und Bankswitching (Hudson Soft) NES, PC Engine[63][64]
16-Bit-Evolution
W65C816S
16-Bit-Register/ALU; 24-Bit-Adressbus (16 MiB mithilfe von Zeitmultiplexing); 6502-Emulationsmodus Apple IIgs, SNES, SuperCPU[65]
All-In-One (SoC)
6500/1, R65F11, Renesas 740
Integrierte Peripherie: RAM, ROM, I/O-Port, Timer; Forth-Interpreter (Rockwell); MUL/DIV (Renesas) Plotter VC-1520, Amiga-1000-Tastatur[54][66][67]
Schließen

Einhergehend mit der Hardware-Diversifizierung wurde auch der Befehlssatz der 6500-Familie erweitert. Während die CMOS-Varianten des 6502 vor allem die Effizienz der Programmierung und Bit-Verarbeitung steigerten, ergänzten spezialisierte Varianten sogar komplexere Rechenoperationen. Die folgende Übersicht zeigt beispielhaft hinzugefügte Befehle.[60][61][62]

Weitere Informationen Befehle, Varianten ...
Ausgewählte BefehlssatzErweiterungen der 6500-Familie
Befehle Varianten Beschreibung
BRA W65C02S, R65C02, G65SC02 Branch Always: Unbedingter relativer Sprung
BBR / BBS W65C02S, R65C02 Branch on Bit Reset/Set: Sprung, falls das Bit den Wert 0/1 besitzt
RMB / SMB W65C02S, R65C02 Reset/Set Bit: Setzt ein Bit im Speicher auf den Wert 0/1
STZ W65C02S, R65C02, G65SC02 Store Zero: Setzt Speicherstelle auf Null
PHX / PLX
PHY / PLY
W65C02S, R65C02, G65SC02 Push/Pull Indexregister: Sichert X/Y direkt auf dem Stapel
TRB / TSB W65C02S, R65C02, G65SC02 Test and Reset/Set Bits: Bit-Manipulationen im Speicher
WAI / STP W65C02S Wait/Stop: Versetzt die CPU in den Schlafmodus bis zu einem Interrupt oder stoppt sie komplett
MUL / DIV Renesas 740 Multiply/Divide: Hardware-Multiplikation/-Division
Schließen

Trivia

The MOnSter 6502
  • 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.[68]
  • Für den MCS6502-Mikroprozessor wurde eine Simulation seiner Transistor-Ebene in Software[69] bzw. in Hardware auf einer etwa 30,5 cm×38 cm großen Leiterplatte (The MOnSter 6502)[70] erstellt.[71]

Literatur

  • Brian Bagnall: Commodore – a company on the edge. ISBN 978-0-9738649-6-0 (englisch).
  • 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 (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.
  • David Eyes, Ron Lichty: Programming the 65816 - Including the 6502, 65C02 and 65802. ISBN 0-89303-789-3 (englisch).
  • MOS Microcomputers Programming Manual. 2. Auflage. Januar 1976 (englisch, archive.org [PDF; abgerufen am 21. Februar 2026]).
  • MOS Microcomputers Hardware Manual. 2. Auflage. Januar 1976 (englisch, archive.org [PDF; abgerufen am 26. Februar 2026]).
Commons: MOS microprocessors – Sammlung von Bildern, Videos und Audiodateien

Einzelnachweise

Related Articles

Wikiwand AI