MOS Technology 6502

aus Wikipedia, der freien Enzyklopädie
(Weitergeleitet von MOS Technologies 6502)
Wechseln zu: Navigation, Suche
MOS-6502-Prozessor
MOS-6510-Prozessor

Der MOS Technology 6502 ist ein 8-Bit-Mikroprozessor von MOS Technology, Inc., der 1975 auf den Markt kam. Aufgrund seiner Unkompliziertheit und vor allem des im Vergleich zu den etablierten Intel- und Motorola-Prozessoren sehr niedrigen Preises bei großer Leistungsfähigkeit wurde er in vielen Heimcomputern (z. B. dem Commodore VC-20 und seinem Vorgänger PET 2001, dem Atari 800 XL, Apple I, Apple II und BBC Micro), zahlreichen Schachcomputern (z. B. dem Mephisto Polgar mit 5 oder 10 MHz), im weltweit ersten Skatcomputer Skat Champion und vielen Peripheriegeräten verbaut. Der Prozessor wurde unter der Leitung von Chuck Peddle entwickelt.

Auch andere Mitglieder dieser Prozessorfamilie waren sehr erfolgreich, so der 6510, ein Bestandteil des Commodore 64, und der 6507 in den Atari-Spielkonsolen. Hauptkonkurrent war damals der Zilog Z80, der z. B. in den Sinclair- und Schneider-Computern sowie in vielen CP/M-Rechnern zu finden war.

Allgemeines[Bearbeiten]

MOS-6502-Prozessor Keramik weiß

Das Design des 6502 wurde an das des 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 wird. Deswegen haben 6502-Programme einen anderen Stil: Für Arrays, die größer als 256 Bytes sind, muss ein zusätzlicher Programmieraufwand betrieben werden. Andererseits geht die Manipulation von 8-Bit-Werten auf einem 8-Bit-Mikroprozessor erheblich schneller vonstatten. Anders als 16-Bit-Register des 6800 oder etwa Z80, welche eine absolute Adresse darstellen, stellen die 8-Bit-Register des 6502 lediglich einen Array-Index dar (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 implementierbar 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 (s. u.) 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, besitzt 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, wo das High-Byte der 16-Bit-Adresse seinen Wert wechselt:

  • 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 ($FFFA–$FFFF) 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 $FFFC/$FFFD wird in den Programmzähler kopiert und dann ab dieser Stelle die Software abgearbeitet.

Technisch war der 6502 durchaus innovativ:

  • Er enthielt – im Gegensatz zu anderen Mikroprozessoren der Zeit – bereits einen integrierten Taktgenerator, der nur ein externes Taktsignal benötigte und selbst zwei nicht überlappende Taktsignale (φ1 und φ2) für andere Schaltkreise generierte.
  • Er war der erste Mikroprozessor mit rudimentärer (zweistufiger) Pipeline-Architektur, d. h. wenn nur noch interne Schaltschritte für einen Befehl notwendig waren, konnte der nächste Befehl bereits gleichzeitig aus dem Speicher geholt werden. Eine echte Pipeline mit Überlappung der Lese- und Schreibzugriffe mehrerer Befehle gab es aber noch nicht.
  • Sein Befehlssatz kann – zumindest im Vergleich zur direkten Konkurrenz Intel 8080 – als „fast orthogonal“ angesehen werden.
  • Anstelle von Mikrocode enthielt er ein PLA, dessen 130 Ausgänge in Abhängigkeit vom Maschinensprachebefehl und dem internen Taktsignal die interne Ablaufsteuerung direkt übernahmen. Dadurch konnte die Anzahl der pro Befehl benötigten Taktzyklen deutlich kleiner gehalten werden als bei der Konkurrenz.

Varianten des 6502-Prozessors werden heute (Stand 2008) unter anderen in folgenden Geräten eingesetzt:

Als Cross-Compiler wird häufig der cc65 eingesetzt.

Technische Daten[Bearbeiten]

Mitsubishi M50747 und M50734 Mikrocontroller, basierend auf 6502
  • Technologie: NMOS, HMOS, CMOS
  • Anzahl Transistoren: ca. 3510[1][2]
  • 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 z. B. beim Intel 8080), d. h. alles 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 ($FFFA bis $FFFF).
  • 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, eigentlich sind dies Offset-Register: je eines der Register wird zu einer 16-Bit-Adresse addiert (Ausnahme: Addition zu 8-Bit-Zeropage-Adresse), die je nach Adressierungsart im Maschinenbefehl selbst oder in der Zeropage steht.
    • Stapelzeiger, 16 Bit, allerdings ist das High-Byte konstant auf $01 festgelegt, so dass der Stapel nur 256 Bytes umfasst.
    • Prozessorstatus-Register, 7 Bit (Flags: Carry, Zero, Interrupt Disable, Decimal, Break*, unbenutzt, Overflow, Negative)
    • Befehlszähler, 16 Bit
    • Die Zeropage (Adressbereich $00xx) kann aufgrund ihrer speziellen, schnelleren Adressierungsarten und ihrer Verwendung bei indizierter Adressierung auch als Registerbank oder Register-File angesehen werden

*Hinweis: Das Break-Flag existiert nur auf dem Stapel nach einem BRK-Befehl, nicht im Prozessor selbst. Es hat keine eigenen Setz- und Testbefehle und wird auch durch die Befehle PLP und PHP nicht verarbeitet.

Befehlssatz[Bearbeiten]

Beispiele von Maschinenbefehlen, bzw. deren Opcode und Mnemonics in Verbindung mit verschiedenen Adressierungsarten:[3]

Opcode Mnemonic Funktion
$A9 LDA #$FF Lädt ("LoaD") das Register "Akkumulator" mit $FF (255 dezimal).
$AD LDA $C000 Lädt den Akkumulator mit dem Inhalt der absoluten Speicheradresse $C000 (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 $24 und $25 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 $C000
$6D ADC $C001 Addiert ("ADd with Carry-Bit") den Inhalt der Speicheradresse $C001 (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 $7F (127 dezimal) und setzt die Flags entsprechend.
$E4 CPX $C0 Vergleicht den Inhalt des Registers X mit dem Inhalt der Speicherzelle $C0.
$C0 CPY #$C0 Vergleicht den Inhalt des Registers Y mit dem Zahlenwert $C0.
$F0 BEQ $FC00 ("Branch if result is EQual") Verzweigt, wenn der vorausgegangene Vergleich eine Gleichheit ergab (wird anhand der Flags erinnert). In diesem Fall würde das Maschinenprogramm an Adresse $FC00 weiterlaufen, andernfalls einfach beim nächsten Befehl. Die Branch-Befehle erlauben nur die relative Adressierung mit einem vorzeichenbehaftetem 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 $FC00. 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 („immediate“ auch: „Literal“) Zahl und nicht eine Speicheradresse, deren Inhalt zu verwenden ist.
( ) – Die in den Klammern genannte Speicheradresse ist nicht direkt zu verwenden, sondern enthält selbst wiederum die gemeinte Speicheradresse (indirekte Adressierung: „Pointer“).

Undokumentierte Opcodes[Bearbeiten]

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 keinen Standard bei ihrer Benennung mit Mnemonics. Ein Beispiel:

Opcode Mnemonic Funktion
$AF LDA-LDX $C000 Lädt den Akkumulator sowie das Register X gleichermaßen mit dem Inhalt der absoluten Speicheradresse $C000 hexadezimal (49152 dezimal).

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. Dadurch würde das Programm seine Funktion nicht mehr korrekt oder gar nicht erfüllen.

Weitere inoffizielle Funktionen des 6502 sind (nur inoffizielle Mnemonics):[4]

Befehl Funktion
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 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. Praktisch ist es allerdings nicht möglich, eine Speicherzelle gleichzeitig mit zwei unterschiedlichen Werten zu versehen, daher ist die effektive Auswirkung dieses Befehls unklar.
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.
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.

Varianten des 6502[Bearbeiten]

Teil einer C64-Platine mit einigen Chips von MOS Technology, u. a. einer 6510-CPU.
  • 2A03
    • von Ricoh für Nintendo produziert
    • Eingesetzt im NES
  • 2A07
    • PAL Version des 2A03
    • Geänderte Frequenzteiler und Farbtabellen
    • Eingesetzt in Europäischen und Australischen NES-Versionen
  • 2002
  • 38000
  • CM630
  • 5A22
    • Mikrocontroller von RICOH mit 65816 Kern. Siehe 65816
    • Eingesetzt im SNES
  • 6500/1
    • 2 KB ROM, 64 Bytes RAM und eine UART
    • eingesetzt im Commodore Plotter 1520
  • 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.
  • 6502
  • 6502A
    • 2 MHz Taktung
    • eingesetzt im Apple III
    • eingesetzt in den 8-Bit-Atari-Homecomputern 400, 800 und 1200XL mit 1,79 MHz (1,77 MHz im PAL-Modus)
    • eingesetzt im Skat Champion, dem weltweit ersten Skatcomputer von Novag Industries Ltd.
  • 6502B
    • 3 MHz Taktung
  • 6502C
    • extra Pin namens HALT
    • eingesetzt in den 8-Bit-Atari-Homecomputerserien XL (außer 1200XL) und XE mit 1,79 MHz Taktung (1,77 MHz im PAL-Modus)
  • 65C02
    • 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 Western Design Center
  • 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
  • 65CE02
    • Zusätzliche 16-Bit-RMW-Befehle
    • Relative Sprünge und Unterprogrammaufrufe mit 16-Bit-Offset
    • Eingesetzt im Commodore 65 (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
  • 6503, 6505, 6506
    • 12 Bit Adressbus (4 KB)
  • 6504, 6507
    • 13 Bit Adressbus (8 KB), eingesetzt z. B. in Commodore-Tastaturen (Amiga 1000) und in Floppy-Laufwerken (Atari 1050)
    • 6507 eingesetzt im Atari 2600 mit 1,19 MHz-Taktung
  • 6509
  • 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
  • 6511
    • Mikrocontroller mit I/O-Ports, serieller Schnittstelle und RAM, von Rockwell
    • Erweiterte Bitbefehle
  • 65F11
    • Variante des 6511 mit integriertem Forth-Interpreter (3 KB on-chip ROM)
  • 6512 bis 6518
    • Variante des entsprechenden 650x, aber ohne eingebauten Oszillator.
  • 65C00/21, 65C29
    • Multiplizier-Befehl
    • von Rockwell
  • 6570, 6571
    • Eingesetzt in Amiga-Tastaturen
  • 6280
    • Entwickelt von NEC auf Basis der 65SC02
    • incl. MMU (2 MB adressierbar)
    • 6-Kanal PSG
    • Eingesetzt in der PC Engine als HuC6280
  • 6702
    • eingesetzt nur im Plug-in Board des Commodore SuperPET
  • 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
  • 7501
  • 8500
    • 6510 in CMOS-Technologie
  • 8502
    • 6510 umschaltbar auf 2 MHz
    • 7-Bit-I/O-Port
    • Eingesetzt im C128
  • M50740
  • 65802 (65C802)
    • 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
  • 65816 (65C816)
    • Entwickelt von Western Design Center
    • 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[Bearbeiten]

  • Der fiktive Roboter Bender aus der Zeichentrickserie Futurama hat einen 6502-Prozessor als CPU.
  • 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[5] ist der Prozessor in der Variante 65C02 wieder (26. Januar 2012) lieferbar
  • Für diesen Prozessor wurde eine Simulation auf seiner Transistor-Ebene hin erstellt[6]

Literatur[Bearbeiten]

  • Brian Bagnall: On The Edge: The Spectacular Rise and Fall of Commodore. ISBN 0-9738649-0-7.
  •  Brian Bagnall, Winnie Forster, Boris Kretzinger (Hrsg.): Volkscomputer – Aufstieg und Fall des Computer Pioniers Commodore. Gameplan, Utting am Ammersee 2011 (Originaltitel: On the Edge: the Spectacular Rise and Fall of Commodore, übersetzt von Winnie Forster, Boris Kretzinger), ISBN 978-3-00-023848-2, DNB 1009780867.
  • 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[Bearbeiten]

 Commons: MOS microprocessors – Sammlung von Bildern, Videos und Audiodateien

Einzelnachweise[Bearbeiten]

  1. Transistor count in 6502
  2. Reverse Engineering the 6502 ... with 3,510 transistors
  3. Übersicht 6502-Assemblerbefehle auf C64-Wiki.de
  4. Full 6502 Opcode List Including Undocumented Opcodes, J.G.Harston, 25. November 1998
  5. Wieder lieferbar: der 6502-Mikroprozessor
  6. visual6502.org