|
|
 |
 |
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
| A | Akkumulator | Dient bei allen Rechenoperationen als Ergebnisspeicher | | X,Y | Indexregister | zur indirekten Speicheradressierung | | SP | Stapelzeiger | Zeiger auf die Adresse des obersten Stapelelements. | | SR | Statusregister | Enthält bitweise die Statusflags (s.u.). |
Zeichenerklärung
| Der 6502 beherrscht etliche Adressierungsarten, die mit fast allen Befehlen kombiniert werden können: | | #n | fester Wert | | nn | feste Adresse | | n | feste 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:
| | z | Zero = Nullflag; Wird gesetzt, wenn Ergebnis = 0. | | n | Negative = Wird gesetzt, wenn beim letzten Ergebnis das höchstwertige Bit gesetzt war | | v | Overflow = Wird gesetzt, wenn es einen numerischen Überlauf gab | | c | Carry = Ü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 x | A=A+x+c | Addition mit Übertrag | z | n | v | c | | SBC x | A=A-x-c+1 | Subtraktion mit Übertrag | z | n | v | c | | INC x | x=x+1 | Speicherstelle inkrementieren | z | n | | | | INX | X=X+1 | X-Register inkrementieren | z | n | | | | INY | Y=Y+1 | Y-Register inkrementieren | z | n | | | | DEC x | x=x-1 | Speicherstelle dekrementieren | z | n | | | | DEX | X=X-1 | X-Register dekrementieren | z | n | | | | DEY | Y=Y-1 | Y-Register dekrementieren | z | n | | | | Binäre Verknüpfungen | | AND x | A = A AND x | UND-Verknüpfung | z | n | | c | | ORA x | A = A OR x | ODER-Verknüpfung | z | n | | | | EOR x | A = A XOR x | Exklusiv-ODER-Verknüpfung | z | n | | | | Rotier- und Schiebebefehle | | ASL x | shift left | Bitweises arithmetisches Linksschieben | z | n | | c | | LSR x | log. shift right | Bitweises logisches Rechtsschieben | z | n=0 | | c | | ROL x | rotate left | Bitweises Linksrotieren | z | n | | c | | ROR x | rotate right | Bitweises Rechtsrotieren | z | n | | c | | Vergleichsbefehle | | CMP x | compare | Vergleich mit Akkumulator, Ergebnis wird in den Flags codiert | z | n | | c | | CPX x | compare | Vergleich mit X-Register, Ergebnis wird in den Flags codiert | z | n | | c | | CPY x | compare | Vergleich mit Y-Register, Ergebnis wird in den Flags codiert | z | n | | c | | sonstige Arithmetikbefehle | | BIT x | A AND x | Flags werden gemäß dem Ergebnis gesetzt, Akku bleibt unverändert | z | n | v | | | 2. Registerbefehle | | Laden und Speichern | | LDA x | A = x | Akku laden | z | n | | | | LDX x | X = x | X-Register laden | z | n | | | | LDY x | Y = x | Y-Register laden | z | n | | | | STA x | x = A | Akku speichern | | | | | | STX x | x = X | X-Register speichern | | | | | | STY x | x = Y | Y-Register speichern | | | | | | Transfer | | TAX | X = A | Akku ins X-Register übertragen | z | n | | | | TAY | Y = A | Akku ins Y-Register übertragen | z | n | | | | TSX | X = SP | Stapelzeiger ins X-Register übertragen | z | n | | | | TXA | A = X | X-Register in den Akku übertragen | z | n | | | | TYA | A = Y | Y-Register in den Akku übertragen | z | n | | | | TXS | SP = X | X-Register in den Stapelzeiger übertragen | | | | | | Flags | | CLC | c=0 | Carry-Flag löschen | | | | c=0 | | CLD | d=0 | Dezimal-Flag (BCD) löschen | | | | | | CLV | v=0 | Overflow-Flag löschen | | | v=0 | | | SEC | c=1 | Carry-Flag setzen | | | | c=1 | | SED | d=1 | Dezimal-Flag (BCD) setzen | | | | | | sonstige Registerbefehle | | PHA | push akku | Akku auf dem Stapel ablegen | | | | | | PHP | push status | Statusregister auf dem Stapel ablegen | | | | | | PLA | pull akku | Akku vom Stapel holen | z | n | | | | PLP | pull status | Statusregister vom Stapel holen | z | n | v | c | | 3. Sprungbefehle | | Unbedingte Sprünge | | JMP x | PC = x | Sprung zur Adresse | z | n | v | c | | JMP x | PC = x | Sprung zur Adresse | | | | | | JSR x | PC = x | Sprung zum Unterprogramm ab Adresse | | | | | | RTS | | Rückkehr aus Unterprogramm | | | | | | RTI | | Rückkehr aus Interruptprogramm | z | n | v | c | | Bedingte Sprünge | | BCC nn | carry clear | Sprung, wenn c=0 | | | | | | BCS nn | carry set | Sprung, wenn c=1 | | | | | | BEQ nn | equal | Sprung, wenn Gleichheit bei CMP | | | | | | BCC nn | carry clear | Sprung, wenn c=0 | | | | | | BMI nn | minus | Sprung, wenn n=1 | | | | | | BNE nn | not equal | Sprung, wenn Ungleichheit bei CMP | | | | | | BPL nn | plus | Sprung, wenn n=0 | | | | | | BVC nn | overflow clear | Sprung, wenn v=0 | | | | | | BVS nn | overflow set | Sprung, wenn v=1 | | | | | | 4. Interruptbefehle | | SEI | set interrupt | Interrupts unterbinden | | | | | | CLI | clear interrupt | Interrupts zulassen | | | | | | BRK | break | Abbruch | | | | | | NOP | no operation | Nullbefehl | | | | |
|
|
|