Info
Sammeln
Dokumentation
Anleitungen
Schnittstellen
Prozessoren
Videochips
Soundchips
Computer
Videospiele


MOS Technology 6502
Beschreibung

Der 6502 war 1975 eine der letzten Entwicklungen des Halbleiterproduzenten MOS, bevor die Firma von Commodore aufgekauft wurde. So war es kein Wunder, daß Commodores erster Computer auf diesem Chip basierte. Aber auch Steven Wozniak setzte auf diesen Chip, als er die Platine entwarf, die dann als Apple I zur Legende werden sollte. Auch Atari baute sowohl das Telespiel "VCS" als auch die Homecomputer 400 und 800 rund um den 6502.

Der Grund lag sicher mit in der Unkompliziertheit dieses Prozessors, vor allem aber am Preis. Der Chip selbst war für unter $10 zu bekommen und mit einer typischen Taktfrequenz von nur 1 MHz stellten auch das Boarddesign und die Auswahl der übrigen Komponenten keine unlösbaren Aufgaben dar.

Während rein von der Anzahl verschiedener Modelle die meisten Homecomputer mit dem Z-80 arbeiteten, waren die erfolgreichsten fast alle mit dem 6502 bestückt. Vor allem der C-64, aber auch alle anderen 8-Bitter von Commodore, Atari, Apple, Acorn und Oric.

Pinbelegung

Wie beim Z-80 ist auch beim 6502 der Adressbus nicht gemultiplext. Das spart externe Bauteile ein. Ansonsten ist außer der etwas aufwendigeren Taktversorgung nichts spektakuläres an diesem Prozessor zu finden.

Nachdem Commodore die Regie bei MOS übernommen hatte, wurde der 6502 für nahezu jeden neu entwickelten Computer geringfügig geändert und unter anderem Namen eingesetzt. Im C-64 arbeitete der um sechs I/O-Leitungen erweiterte 6510, im C-16 und Plus/4 hieß er 7501, im C-128 8500. Andere Familienmitglieder waren in CMOS gefertigt (65C02, z.B. im Apple //e), hatten einen auf 4 KB reduzierten Adressraum (6507, Atari VCS) oder waren als Embedded Controller mit ROM, RAM und I/O-Leitungen ausgestattet (6500, Amiga-Tastatur).

Eine Weiterentwicklung gab es über viele Jahre hinweg nicht, da Commodore bei den neueren Maschinen auf Motorolas 68000er setzte. Erst 1985 kam mit dem 65816 eine 16-Bit-Variante auf den Markt, die aber nur im Apple //GS in Serie eingebaut wurde.


Register

AAkkumulatorDient bei allen Rechenoperationen als Ergebnisspeicher
X,YIndexregisterzur indirekten Speicheradressierung
SPStapelzeigerZeiger auf die Adresse des obersten Stapelelements.
SRStatusregisterEnthält bitweise die Statusflags (s.u.).


Zeichenerklärung

Der 6502 beherrscht etliche Adressierungsarten, die mit fast allen Befehlen kombiniert werden können:
#nfester Wert
nnfeste Adresse
nfeste Adresse in der Zeropage
nn, X
nn, Y
feste Adresse + Indexregister
n, X
n, Y
feste Adresse in der Zeropage + Indexregister
(n),X
(n),Y
aus der angegebenen Speicherstelle und der nächsthöheren wird eine Adresse geholt und mit dem Indexregister zusammengezählt
(n,X)die angegebene Speicheradresse wird mit X zusammengezählt und aus der so errechneten Speicherstelle (sowie der darauffolgenden) die Adresse gelesen
Hinter jedem Befehl der Befehlsliste stehen die Buchstaben z, n, v und c (oder auch nicht). Diese Buchstaben stehen für die Prozessorflags:
zZero = Nullflag; Wird gesetzt, wenn Ergebnis = 0.
nNegative = Wird gesetzt, wenn beim letzten Ergebnis das höchstwertige Bit gesetzt war
vOverflow = Wird gesetzt, wenn es einen numerischen Überlauf gab
cCarry = Übertrag; Wird gesetzt, wenn das Ergebnis außerhalb des verfügbaren Bereiches liegt, z.B. $80+$94=$14 mit c=1
Die in der Befehlsliste am Zeilenende stehenden Flags werden durch den entsprechenden Befehl verändert.


1. Arithmetikbefehle
Addition / Subtraktion
ADC xA=A+x+cAddition mit Übertragznvc
SBC xA=A-x-c+1Subtraktion mit Übertragznvc
INC xx=x+1Speicherstelle inkrementierenzn
INXX=X+1X-Register inkrementierenzn
INYY=Y+1Y-Register inkrementierenzn
DEC xx=x-1Speicherstelle dekrementierenzn
DEXX=X-1X-Register dekrementierenzn
DEYY=Y-1Y-Register dekrementierenzn
Binäre Verknüpfungen
AND xA = A AND xUND-Verknüpfungznc
ORA xA = A OR xODER-Verknüpfungzn
EOR xA = A XOR xExklusiv-ODER-Verknüpfungzn
Rotier- und Schiebebefehle
ASL xshift leftBitweises arithmetisches Linksschiebenznc
LSR xlog. shift rightBitweises logisches Rechtsschiebenzn=0c
ROL xrotate leftBitweises Linksrotierenznc
ROR xrotate rightBitweises Rechtsrotierenznc
Vergleichsbefehle
CMP xcompareVergleich mit Akkumulator, Ergebnis wird in den Flags codiertznc
CPX xcompareVergleich mit X-Register, Ergebnis wird in den Flags codiertznc
CPY xcompareVergleich mit Y-Register, Ergebnis wird in den Flags codiertznc
sonstige Arithmetikbefehle
BIT xA AND xFlags werden gemäß dem Ergebnis gesetzt, Akku bleibt unverändertznv
2. Registerbefehle
Laden und Speichern
LDA xA = xAkku ladenzn
LDX xX = xX-Register ladenzn
LDY xY = xY-Register ladenzn
STA xx = AAkku speichern
STX xx = XX-Register speichern
STY xx = YY-Register speichern
Transfer
TAXX = AAkku ins X-Register übertragenzn
TAYY = AAkku ins Y-Register übertragenzn
TSXX = SPStapelzeiger ins X-Register übertragenzn
TXAA = XX-Register in den Akku übertragenzn
TYAA = YY-Register in den Akku übertragenzn
TXSSP = XX-Register in den Stapelzeiger übertragen
Flags
CLCc=0Carry-Flag löschenc=0
CLDd=0Dezimal-Flag (BCD) löschen
CLVv=0Overflow-Flag löschenv=0
SECc=1Carry-Flag setzenc=1
SEDd=1Dezimal-Flag (BCD) setzen
sonstige Registerbefehle
PHA push akkuAkku auf dem Stapel ablegen
PHPpush statusStatusregister auf dem Stapel ablegen
PLApull akkuAkku vom Stapel holenzn
PLPpull statusStatusregister vom Stapel holenznvc
3. Sprungbefehle
Unbedingte Sprünge
JMP xPC = xSprung zur Adresseznvc
JMP xPC = xSprung zur Adresse
JSR xPC = xSprung zum Unterprogramm ab Adresse
RTSRückkehr aus Unterprogramm
RTIRückkehr aus Interruptprogrammznvc
Bedingte Sprünge
BCC nncarry clearSprung, wenn c=0
BCS nncarry setSprung, wenn c=1
BEQ nnequalSprung, wenn Gleichheit bei CMP
BCC nncarry clearSprung, wenn c=0
BMI nnminusSprung, wenn n=1
BNE nnnot equalSprung, wenn Ungleichheit bei CMP
BPL nnplusSprung, wenn n=0
BVC nnoverflow clearSprung, wenn v=0
BVS nnoverflow setSprung, wenn v=1
4. Interruptbefehle
SEIset interruptInterrupts unterbinden
CLIclear interruptInterrupts zulassen
BRKbreakAbbruch
NOPno operationNullbefehl