Mikroprozessor

MOS Technology 6502

aus Wikipedia, der freien Enzyklopädie

Wechseln zu: Navigation, Suche
MOS 6502-Prozessor
MOS 6502-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 II und BBC Micro), zahlreichen Schachcomputern (z. B. dem Mephisto Polgar mit 5 oder 10 MHz) und Peripherie-Geräten verbaut.

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 CP/M-Rechnern zu finden war. Der Prozessor wurde unter der Leitung von Chuck Peddle entwickelt.

Inhaltsverzeichnis

[Bearbeiten] Allgemeines

Das Design des 6502 wurde an den Motorola 6800 angelehnt. 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, 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.

Technisch war der 6502 durchaus innovativ:

  • 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.

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

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

[Bearbeiten] Technische Daten

Mitsubishi M50747 und M50734 Mikrocontroller, basierend auf 6502
Mitsubishi M50747 und M50734 Mikrocontroller, basierend auf 6502
  • Technologie: NMOS, HMOS, CMOS
  • Anzahl Transistoren: ca. 5000
  • Taktfrequenz: traditionell 20 kHz bis 4 MHz; CMOS-Version: 0 bis 14 MHz
  • Taktzyklen je Befehl: 2 bis 7
  • Adressraum: 64 KiByte, dabei kein separater I/O-Adressraum (wie z. B. beim Intel 8080), d. h. alles I/O wird per Memory Mapped I/O realisiert. Hinweis: Das Binärpräfix Ki steht für den Faktor 1024.
  • Adressbusbreite: 16 Bit
  • Datenbusbreite: 8 Bit
  • Interrupts: ein NMI, ein IRQ, sowie Software-Interrupt über BRK-Befehl
  • 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 ein Offset-Register: es wird zu einer 16-Bit-Adresse addiert, die je nach Adressierungsart im Opcode 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, Decimal, Interrupt Disable, 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 Stack 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).

[Bearbeiten] Befehlssatz

Hier ein paar Beispiele von Maschinenbefehlen, bzw. deren Mnemonics:

LDA #$FF     - lädt ("LoaD") das Register "Akkumulator" mit dem Hex-Zahleninhalt FF (also 255 dez.)

LDA $C000    - lädt den Akkumulator mit dem Inhalt der absoluten Speicheradresse
               HEX C000 (also 49152 dez.)

LDA ($24),Y  - lädt den Akkumulator mit dem Inhalt jener Speicheradresse,
               welche sich ergibt, indem zu der 16-Bit-Zahl in den Adressen HEX 24
               und HEX 25 der Inhalt des Y-Registers addiert wurde.
               Siehe Zeropage, indirekte Adressierung
STA $C000    - speichert ("STore") den Inhalt des Akkumulators (1 Byte) in der Speicheradresse HEX C000
CMP #$7F     - vergleicht ("CoMPare") den Inhalt des Akkumulators mit dem Zahlenwert HEX 7F (127 dez.)
               und setzt die Flags entsprechend

CPX $C0      - vergleicht den Inhalt des Registers X mit dem Inhalt der Speicherzelle HEX C0

CPY #$C0     - vergleicht den Inhalt des Registers Y mit dem Zahlenwert HEX C0
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.

BNE $FC00    - "Branch if result is Not Equal" = verzweigt, wenn der Vergleich
               eine Ungleichheit ergab.
INX          - "INcrement X" = erhöht den Inhalt des Registers X um 1.

DEX          - "DEcrement X" = verringert den Inhalt des Registers X um 1.
JSR $FC00    - "Jump to SubRoutine": springt zur Subroutine (Unterprogramm) nach HEX FC00.
               Die Rücksprungadresse besteht aus 2 Byte und wird auf dem Stack (Stapel) abgelegt.

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 Rücksprungadresse
               aus dem Stack 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“).

[Bearbeiten] Varianten des 6502

Teil einer C64-Platine mit einigen Chips von MOS Technology, u. a. einer 6510-CPU.
Teil einer C64-Platine mit einigen Chips von MOS Technology, u. a. einer 6510-CPU.
  • 2002
  • 38000
  • 6501
  • 6502
  • 6502A
  • 6502B
    • 3 MHz Taktung
  • 6502C
  • 65C02
    • CMOS-Technologie
    • Zusätzliche Befehle und Adressierungsmodi
    • Einige Befehle benötigen unter bestimmten Voraussetzungen weniger Taktzyklen als im 6502
    • Eingesetzt im erweiterten Apple IIe und im Apple IIc
    • 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 C65 (4510) und A2232
    • 3,54 MHz Taktung
  • 65C102, 65C112
    • Für Multiprozessorbetrieb ausgelegt, wobei der 65C112 als Slave dient
    • Eingesetzt im BBC Micro
  • 6503, 6505, 6506
    • 12 Bit Adressbus (4 KiB)
  • 6504, 6507
    • 13 Bit Adressbus (8 KiB), eingesetzt z. B. in Commodore-Tastaturen (Amiga 1000) und in Floppy-Laufwerken (Atari 1050)
    • 6507 eingesetzt im Atari 2600 mit 1,19 MHz-Taktung
  • 6508
    • Eingesetzt im NES
  • 6509
  • 6510
    • 6502 mit zusätzlichem 6-Bit-I/O-Port
    • Eingesetzt im C64 mit 985 kHz (PAL-Version) respektive 1022 kHz (NTSC-Version) Takt
  • 6511
    • Microcontroller mit I/O-Ports, serieller Schnittstelle und RAM, von Rockwell
  • 65F11
    • Variante des 6511 mit integriertem Forth-Interpreter
  • 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 MiB adressierbar)
    • 6-Kanal PSG
    • Eingesetzt in der PC Engine
  • 6702
    • eingesetzt nur im Plug-in Board des Commodore SuperPET
  • 740
    • Microcontrollerfamilie von Renesas Technology (vormals Mitsubishi Electric)
    • Basierend auf der 65C02
    • mehr als 100 Varianten
    • bis 60 KiB ROM/PROM/Flash onchip
    • bis 2 KiB 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
  • 65802 (65C802)
    • Variante des 65816, die pinkompatibel zum 6502 ist, Adressraum daher wie dieser nur 64 KiB
    • 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, den meisten Beschleunigungskarten für 6502-Rechner
    • 16-Bit-Register und ALU
    • 24-Bit-Adressbus (16 MiB)
    • Bis zu 24 MHz
    • Braucht im Vergleich zum 6502 (wohl wegen des zusätzlichen Adressbytes) für viele Befehle einen Takt länger

[Bearbeiten] Trivia

  • Der fiktive Roboter Bender aus der Zeichentrickserie Futurama hat einen 6502-Prozessor als CPU.

[Bearbeiten] Literatur

  • Bagnall, Brian: On The Edge: The Spectacular Rise and Fall of Commodore, ISBN 0973864907
  • Rodnay Zaks: Programmierung des 6502. Jetzt auch mit 6510, 65C02, 65SC02, ISBN 3887456009
  • Lance A. Leventhal: 6502. Programmieren in ASSEMBLER, ISBN 3921803101
  • Ekkehard Flögel: Programmieren in Maschinensprache mit dem 6502, ISBN 3921682614

[Bearbeiten] Weblinks

Copyright © 2005-2010 Hardware-Aktuell. Alle Rechte vorbehalten.