Info
Sammeln
Dokumentation
Anleitungen
Schnittstellen
Prozessoren
Videochips
Soundchips
Computer
Videospiele


Motorola 68000
Beschreibung

1979 brachte Motorola den 68000er heraus. Der Prozessor war nach den in ihm enthaltenen 68000 Transistoren benannt und Motorola verfolgte damit das erklärte Ziel, die Leistung eines Großcomputers in einem Chip zu konzentrieren.

Der Prozessor zeichnete sich durch eine für zukünftige Generationen gut skalierbare Architektur und einen extrem durchdachten und sehr gut strukturierten Befehlssatz aus. Leider ließ sich Motorola diese Leistung anfangs auch sehr gut bezahlen, so daß zunächst nur sündhaft teuere Computer damit ausgestattet wurden.

Wiederum war es Apple, die den 68000er erstmals in einem bezahlbaren Arbeitsplatzrechner einsetzen: Zuerst in der Lisa, dann im Macintosh. Die Preise begannen zu rutschen und bereits im Jahr darauf erschienen der Atari ST und der Commodore Amiga - ebenfalls mit einem 68000er. Somit waren alle ernsthaften Alternativen zu PCs mit dem gleichen Prozessor ausgestattet. Es folgten die 32-Bit-Prozessoren 68020, 68030, 68040 und 68060 - immer in direkter Konkurrenz zu den neuesten Entwicklungen von Intel, wobei Motorola jedoch immer mehr ins Hintertreffen geriet.

Auch wenn die Register des 68000er 32 Bit breit sind, macht ihn der 16-Bit Datenbus zum 16-Bit-Prozessor. Außergewöhnlich ist der Adressbus mit 24 Bit Breite, obwohl auch die Adressregister 32 Bit breit sind. So kann der 68000er nur 16 MB adressieren.

Erst beim 68020 gibt es sowohl den 32-Bit-Datenbus als auch den 32-Bit-Adressbus, womit sagenhafte 4 GB adressiert werden konnten.

Register

D0-D7Datenregister32 Bit; Vor allem als Zwischenspeicher und Rechenregister
A0-A7Adressregister32 Bit; Vor allem als Zwischenspeicher und zur Speicheradressierung
A7 dient als Stapelzeiger
CCR/SRStatusregisterEnthält bitweise die Statusflags (s.u.).


Zeichenerklärung
Der 68000 beherrscht etliche Adressierungsarten, die mit fast allen Befehlen kombiniert werden können. Befehle erhalten null bis drei Parameter. Arithmetikbefehle haben als ersten Parameter die Wortlänge, die mit einem Punkt direkt hinter dem Befehlswort steht. ".B" steht für Byte (8 Bit), ".W" für Wort (16 Bit) und ".L" für Langwort (32 Bit). Anschließend folgt zunächst die Quellangabe für den
Befehl und hinter einem Komma die Zielangabe.

Beispiel:
MOVE.L D3,(A0) kopiert den im Register D3 gespeicherten 32-Bit-Wert in den Arbeitsspeicher ab der Adresse, auf die das Register A0 verweist.

Die Adressierungsarten im Detail:
#nfester Wert
nnnn.Lfeste Adresse
nn.Wfeste Adresse
DnDatenregister n
AnAdressregister n
(An)Speicherstelle, auf die Adressregister n verweist.
(An)+Speicherstelle, auf die Adressregister n verweist. Nach dem Zugriff wird An um eins erhöht.
-(An)Zunächst wird An um eins vermindert, danach auf die Speicherstelle zugegriffen, auf die Adressregister n verweist.
d(An)Die Speicherstelle, auf die zugegriffen wird, errechnet sich aus dem Inhalt von Adressregister n plus dem festen Wert d.
d(An,Rx)?
d(PC)Zugriff auf Speicherstelle relativ zum Programmzähler
d(PC,Rx)?
CCR / SRZugriff auf Statusregister
Hinter jedem Befehl der Befehlsliste stehen die Buchstaben x, n, z, v und c (oder auch nicht). Diese Buchstaben stehen für die Prozessorflags:
xÜbertrag für Additionen
nNegative = Wird gesetzt, wenn beim letzten Ergebnis das höchstwertige Bit gesetzt war
zZero = Nullflag; Wird gesetzt, wenn Ergebnis = 0.
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
ABCD q,z z=z+q+x BCD-Addition mit Übertrag xnzvc
ADD.a q,z z=z+q Addition ohne Übertrag xnzvc
ADDA q,An An=An+q Addition mit Adressregister
ADDI.a #nnnn,z z=z+#nnnn Addition eines festen Werts ohne Übertrag xnzvc
ADDQ.a #n,z z=z+#n Addition eines festen Werts (0 <= #n < 8) ohne Übertrag xnzvc
ADDX.a q,z z=z+q+x Addition mit Übertrag xnzvc
SBCD q,z z=z-q-x BCD-Subtraktion mit Übertrag xnzvc
SUB.a q,z z=z-q Subtraktion ohne Übertrag xnzvc
SUBA q,An An=An-q Subtraktion mit Adressregister
SUBI.a #nnnn,z z=z-#nnnn Subtraktion eines festen Werts ohne Übertrag xnzvc
SUBQ.a #n,z z=z-#n Subtraktion eines festen Werts (0 <= #n < 8) ohne Übertrag xnzvc
SUBX.a q,z z=z-q-x Subtraktion mit Übertrag xnzvc
Multiplikation / Division
DIVS q,Dn Dn=Dn/q Division mit Vorzeichen 32-Bit-Wert durch 16-Bit-Wert. Im Ergebnisregister Dn steht der ganzzahlige Quotient in Bit 0-15, der Rest in Bit 16-31 nzvc=0
DIVU q,Dn Dn=Dn/q Division ohne Vorzeichen 32-Bit-Wert durch 16-Bit-Wert. Im Ergebnisregister Dn steht der ganzzahlige Quotient in Bit 0-15, der Rest in Bit 16-31 nzvc=0
MULS q,Dn Dn=Dn*q Multiplikation mit Vorzeichen zweier 16-Bit-Werte. Im Ergebnisregister Dn steht das 32 Bit breite Ergebnis. nzv=0c=0
MULU q,Dn Dn=Dn/q Multiplikation ohne Vorzeichen zweier 16-Bit-Werte. Im Ergebnisregister Dn steht das 32 Bit breite Ergebnis. nzv=0c=0
Binäre Verknüpfungen
AND.a q,z z = z AND q UND-Verknüpfung nzv=0c=0
ANDI.a #nnnn,z z = z AND #nnnn UND-Verknüpfung mit festem Wert nzv=0c=0
EOR.a Dn,z z = z XOR Dn Exklusiv-ODER-Verknüpfung mit Datenregister Dn nzv=0c=0
EORI.a #nnnn,z z = z XOR #nnnn Exklusiv-ODER-Verknüpfung mit festem Wert nzv=0c=0
NOT.a z z = NOT z Invertierung von z nzv=0c=0
OR.a q,z z = z OR q ODER-Verknüpfung nzv=0c=0
ORI.a #nnnn,z z = z OR #nnnn ODER-Verknüpfung mit festem Wert nzv=0c=0
Rotier- und Schiebebefehle
ASL z shift left z Bitweises arithmetisches Linksschieben des Inhalts einer Speicherstelle (16 Bit) xnzvc
ASL.a q,Dn shift left Dn q-maliges bitweises arithmetisches Linksschieben des Inhalts von Dn (16 Bit) xnzvc
ASR z shift right z Bitweises arithmetisches Rechtsschieben des Inhalts einer Speicherstelle (16 Bit) xnzvc
ASR.a q,Dn shift right Dn q-maliges bitweises arithmetisches Rechtsschieben des Inhalts von Dn (16 Bit) xnzvc
LSL z shift left z Bitweises logisches Linksschieben des Inhalts einer Speicherstelle (16 Bit) xnzvc
LSL.a q,Dn shift left Dn q-maliges bitweises logisches Linksschieben des Inhalts von Dn (16 Bit) xnzvc
LSR z shift right z Bitweises logisches Rechtsschieben des Inhalts einer Speicherstelle (16 Bit) xnzvc
LSR.a q,Dn shift right Dn q-maliges bitweises logisches Rechtsschieben des Inhalts von Dn (16 Bit) xnzvc
ROL z rotate left z Bitweises Linksrotieren des Inhalts einer Speicherstelle (16 Bit) nzv=0c
ROL.a q,Dn rotate left Dn q-maliges bitweises Linksrotieren des Inhalts von Dn (16 Bit) nzv=0c
ROR z rotate right z Bitweises Rechtsrotieren des Inhalts einer Speicherstelle (16 Bit) nzv=0c
ROR.a q,Dn rotate right Dn q-maliges bitweises Rechtsrotieren des Inhalts von Dn (16 Bit) nzv=0c
ROXL z rotate left z Bitweises Linksrotieren des Inhalts einer Speicherstelle unter Einbeziehung des x-Flags (16 Bit) nzv=0c
ROXL.a q,Dn rotate left Dn q-maliges bitweises Linksrotieren des Inhalts von Dn unter Einbeziehung des x-Flags (16 Bit) nzv=0c
ROXR z rotate right z Bitweises Rechtsrotieren des Inhalts einer Speicherstelle unter Einbeziehung des x-Flags (16 Bit) nzv=0c
ROXR.a q,Dn rotate right Dn q-maliges bitweises Rechtsrotieren des Inhalts von Dn unter Einbeziehung des x-Flags (16 Bit) nzv=0c
Vergleichsbefehle
CMP.a q,Dn compare Vergleich von q mit Datenregister Dn, Ergebnis wird in den Flags codiert nzvc
CMPA.a q,An compare Vergleich von q mit Adressregister An, Ergebnis wird in den Flags codiert nzvc
CMPI.a #nnnn,z compare Vergleich des festen Werts #nnnn mit z, Ergebnis wird in den Flags codiert nzvc
CMPM.a (An)+,(Am)+ compare Vergleich der Speicherstellen, auf die An und Am verweisen, Ergebnis wird in den Flags codiert,
An und Am werden anschließend inkrementiert.
nzvc
TAS z test sign Testet z auf Vorzeichen und setzt die Flags entsprechend (8 Bit) nzv=0c=0
TST.a z test Testet z auf >, < oder = 0 und setzt die Flags entsprechend nzv=0c=0
sonstige Arithmetikbefehle
BCHG q,z change bit Invertiert Bit Nr. q in z z
BCLR q,z clear bit Setzt Bit Nr. q in z auf 0 z
BSET q,z set bit Setzt Bit Nr. q in z auf 1 z
BTST q,z test bit Prüft Bit Nr. q in z, Ergebnis im z-Flag z
CLR.a z clear Setzt den Inhalt von z auf 0. n=0z=1v=0c=0
EXT.a Dn extend Vorzeichenrichtige Erweiterung des Inhalts von Dn auf 16 oder 32 Bit. nzv=0c=0
NBCD z negative x-Flag=0: Bildung des Zehnerkomplements von z
x-Flag=1: Bildung des Neunerkomplements von z
xnzvc
NEG.a z negative Bildung des Zweierkomplements von z
xnzvc
NEGX.a z negative Bildung des Zweierkomplements von z unter Einbeziehung des x-Flags für die Verarbeitung von Zahlen >32 Bit.
xnzvc
Scc z set on condition Setzt z auf 255, wenn Bedingung erfüllt ist, sonst auf 0. Bedingungen siehe Bcc. v=0
2. Registerbefehle
Laden und Speichern
LEA q,An load effective address Lade Adressregister An mit der Adresse, die sich aus der Auswertung des Operanden q ergibt (nicht mit dem Inhalt dieser Adresse, wie bei allen anderen Befehlen)
MOVE.a q,z move Kopiere Inhalt von q nach z nzv=0c=0
MOVE q,CCR move Belege Flags mit dem Inhalt von q xnzvc
MOVE.a q,SR move Belege Statusregister mit dem Inhalt von q xnzvc
MOVEA.a q,An move Kopiere Inhalt von q nach An
MOVEQ #nnnn,Dn move Kopiere festen Wert #nnnn ins Datenregister Dn nzv=0c=0
PEA q,An push effective address Lege die Adresse, die sich aus der Auswertung des Operanden q ergibt, auf dem Stapel ab. (nicht mit dem Inhalt dieser Adresse, wie bei allen anderen Befehlen)
Transfer
EXG Dn,Dm exchange Vertauschen der Inhalte von Dn und Dm
EXG An,Am exchange Vertauschen der Inhalte von An und Am
EXG An,Dm exchange Vertauschen der Inhalte von An und Dm
Stapelbefehle
LINK An,#nnnn link Anlegen eines neuen Stapelbereichs der Größe #nnnn ab der Speicherstelle, auf die An verweist.
UNLK An unlink Löst einen mit LINK angelegten Staperbereich wieder auf.
sonstige Registerbefehle
SWAP Dn swap Vertauscht in Dn die Bits 0-15 mit Bits 16-31. v=0c=0
3. Sprungbefehle
Unbedingte Sprünge
BRA nn PC = PC+nn Sprung relativ zur aktuellen Position
BSR nn PC = PC+nn Unterprogrammaufruf relativ zur aktuellen Position
ILLEGAL illegal Aufruf von TRAP #4 wegen illegalem Befehl
JMP z PC = z Unbedingter Sprung
JSR z PC = z Unbedingter Unterprogrammaufruf
RTE return exception Rückkehr aus Ausnahmebehandlung
RTR return exception Rückkehr aus Ausnahmebehandlung
RTS return subroutine Rückkehr aus Unterprogramm
Bedingte Sprünge
Bcc nn branch on condition Sprung, wenn gemäß der Ergebnisse des letzten Befehls die Bedingung cc erfüllt ist.
Bedingungen:
CC: c-Flag = 0
CS: c-Flag = 1
EQ: q = z
GE: q >= z
GT: q > z
HI: q > z
LE: q <= z
LS: q <= z
LT: q < z
MI: n-Flag = 1
NE: q <> z
PL: n-Flag = 0
VC: v-Flag = 0
VS: v-Flag = 1
CHK q,Dn check Prüfung, ob 0 <= Dn <= q; wenn ja: weiter, wenn nein: TRAP #6
4. Interruptbefehle
NOP no operation Nullbefehl
RESET reset externe Bausteine zurücksetzen
STOP #nnnn stop Schreibt #nnnn ins Statusregister und geht in den HALT-Zustand über. xnzvc
TRAP #nn trap Startet Ausnahmebehandlung TRAP #nn. ( 0 <= nn <= 15 )
TRAPV #nn trap Startet Ausnahmebehandlung TRAP #nn, falls v-Falg gesetzt ist. ( 0 <= nn <= 15 )