Die Motorola 68000 Prozessor-Familie

Transcription

Die Motorola 68000 Prozessor-Familie
Rechnerstrukturen (RST) – Labor
M68K –
Die 68000er Prozessor-Familie
Dozent:
Prof. Th. Risse
Student:
David Dietrich, I8I1
Matr. Nr. 56553
Semester:
WS 02 / 03
1
1. Einleitung, die 68000er
Die 68000er Familie besteht nicht nur aus den bekannten 68000, 68020, 68030 usw. – Viel
mehr muss man zu der Prozessorfamilie neben den 680x0 auch die Prozessoren der Reihe
683xx1 sowie eine Vielzahl von 68er Peripheriebausteinen2 zählen.
Schwerpunkt dieser Ausarbeitung sollen nun aber die 680x0-Prozessoren mit ihren
Variationen sowie die 6888x-Gleitkomma-Prozessoren bilden. Eingesetzt wurden Prozessoren
dieser Reihe überwiegend in Kleinrechnern. In klassischen Macintosh und Amiga-Systemen
wurden seinerzeit ausschließlich 680x0-Prozessoren verwendet. Die Konkurenz der sogenannten „IBM-kompatiblen PCs“ benutzte Prozessoren der 80x86-Reihe von Intel sowie
später auch x86-Nachbauten beispielsweise von AMD, Cyrix/IBM oder TI.
Abbildung 1: MC68000 MPU
Anmerkung: Prozessor-Namen / Bezeichnung
Status:
Modifier:
MC68 = Serienmodell / SC68 = Spezialentwicklung / XC68 = Prototyp
EC = Embedded Controller, no FPU oder MMU / LC = Low Cost, no FPU /
HC = HCMOS / <nichts> = FULL CPU
Serie:
000 / 001 / 008 / 010 / 012 / 020 / 030 / 040 / 060 / 881 / 882
-> Beispiel: MC68 EC 030
Auf dem Baustein können hinter der Kurzbezeichnung noch folgende Merkmale notiert sein:
Temperaturbereich, Gehäuseart, Taktfrequenz, Spannungsversorgung.
1979 wurde der Ur-68000er eingeführt. Der MC68000 ist ein 16-Bit-Mikroprozessor, besitzt
allerdings intern eine 32-Bit-Struktur. Er ist in der Lage, einen Speicherbereich von 16 MByte
zu adressieren. Der typische CISC-Prozessor mit einem Basis-Befehlsvorrat von 56 Befehlen
1
Mikrocontroller bzw. integrated processors, EC000 (MC68EC000 CPU) od. CPU32 (MC68020 CPU-> 32 Bit
extern) integriert
2
Übersicht siehe Anhang A.1
2
kennt 14 verschiedene Adressierungsarten. Im Gegensatz zum x86 sind beim 680x0 die
Register streng nach Daten- und Adressregistern aufgeteilt. Technisch gibt es Versionen für
eine maximale Taktung von 8 bis 20 MHz. Er besitzt 68.000 Transistoren. Der MC68008 ist
die Version mit einem auf 8 Bit reduzierten Datenbus. Auch 1979 wurde der 68010
eingeführt. Er bekam neue Register mit denen es möglich war, virtuellen Speicher zu
adressieren. Durch einen internen Cache bot er eine kleine Leistungssteigerung gegenüber
dem 68000. Der 68012 unterschied sich nur in
der Bauform vom 68010. Er gelangte nicht in
die Massenproduktion.
Der MC68020 war der erste „echte“ 32-BitProzessor der Familie, er besitzt einen 32-BitDatenbus.
Somit
ist
auch
die
interne
Organisation erheblich komplexer. Eingeführt
wurde mit ihm auch das „Dynamic Bus Sizing“
(Intel erst ab 486) – Speicherwort passt sich
der Busgröße an. Der Befehlsvorrat wurde
optimiert, Befehle werden nun in einer Pipeline
abgearbeitet.
Abbildung 2: MC68020 MPU
Außerdem gab es nun eine
Koprozessor-Schnittstelle für FPUs und MMUs. Die EC-Variante (68EC020) ist eine
abgespeckte Version mit einem adressierbaren Speicherbereich von 16 MByte im Gegensatz
zu den beim 020er üblichen 4 GByte. Taktfrequenzen liegen bei 16 bis 33 MHz. Eingeführt
wurde der MC68020 im Jahr 1984.
Vier Jahre später erschien der MC68030. Wesentliche Neuerungen waren „nur“ der
zusätzliche
Datencache
neben
dem
Befehlscache sowie die integrierte MMU3.
Diese war fast identisch mit der 68851, welche
extern sonst für den 020er verwendet werden
konnte. Allerdings ist diese nicht Bestandteil
der preiswerteren Variante MC68EC030. Die
maximale
Taktfrequenz
beträgt
bei
den
68030ern 16 bis 50 MHz.
Mit dem MC68040, welcher 1990 erschien,
Abbildung 3: MC68030 MPU
3
wurde ein Prozessor entwickelt, der über eine
Memory Management Unit
3
Abbildung 4: Anzahl Transistoren in Intel und Motorola MPUs
Million Transistoren besitzt. Technisch wurde er mit einer zweiten MMU-Einheit versehen.
Daten- und Befehlscache sind nun jeweils 4 KByte groß. Erstmals gab es nun einen 68er mit
integrierter FPU (MC68881/82 kompatibel) – die LC-Variante besitzt keine FPU. Die ECVariante besitzt weder FPU noch MMU. Die Befehlspipeline der CPU arbeitet nun 6-stufig,
was die Anzahl der Taktzyklen pro Befehl weiter verringert. Gängige Taktraten liegen
zwischen 20 und 40 MHz.
Abbildung 6: MC68040 MPU
Abbildung 5: MC68060 MPU
4
Der letzte Prozessor der 680x0-Serie ist der 68060. Mit seiner superskalaren Integer-Einheit
kann er zwei Integer-Befehle und zusätzlich einen Sprungbefehl gleichzeitig abarbeiten.
Hinzugekommen ist noch ein zusätzlicher Sprung-Cache. Befehls- und Datencache wurden
auf je 8 KByte erweitert. Im Endeffekt erlangt der 68060 eine Geschwindigkeitssteigerung
vom Faktor 2,5 bis 3,5 gegenüber dem Vorgänger. Wie bei diesem gelten hier auch die
Einschränkungen bei EC/LC060er Varianten. Der 68060 kann mit bis zu 754 MHz getaktet
werden.
Abbildung 7: Taktbereiche ausgewählter Prozessoren
Einen MC68050 gab es offiziell nicht. Angeblich soll aus marketing-technischen Gründen der
050er übersprungen worden sein. Die Kunden könnten bei ungeraden Ziffern subjektiv
weniger Produktverbesserung vermuten als bei geraden Ziffern.
Zu erwähnen bleiben noch die 6888x-FPUs von Motorola. Dies sind die MC68881 und
MC68882 FPU5. Dabei ist die 882 eine überarbeitete Version der 881 FPU, sonst sind sie
funktions- und pinkompatibel. Die 882 kann einige Operationen parallel durchführen und
bietet so eine höhere Verarbeitungsgeschwindigkeit. Diese FPUs können in Verbindung mit
einem MC68020 oder MC68030 betrieben werden. Ab dem MC68040 war die FPU nur noch
integriert. Diese FPUs erfüllen den Fließpunkt-Arithmetik-Standard IEEE P754 und enthalten
4
5
80 MHz bei Übertaktung
Floating Point Unit
5
darüber hinaus noch einige Funktionen für trigonometrische und transzendente Operationen.
Im Baustein sind eigene Floating-Point Anwendungs- und Datenregister enthalten. Außerdem
ist ein Konstanten-ROM mit 22 Werten wie z.B. Π oder e vorhanden.
6
2. Motorola 68000 vs. Intel 8086/80286
In folgender Tabelle sollen ausgewählte Fakten der jeweils ersten Mikroprozessoren der 68K und x86-Serie gegenübergestellt und kurz diskutiert
werden. Zählen zwar beide Vertreter zu den klassischen CISC-Prozessoren, so gibt es doch starke Unterschiede, die auch alle Nachfolger-Modelle
betreffen. Da wäre zum einen die Art der Adressierung von externen Komponenten. Während bei Motorola ein bestimmter Speicherbereich für die
Kommunikation mit externen Komponenten reserviert wird, können bei Intels Prozessoren externe Komponenten nur über einen eigens
einzurichtenden Speicherbereich angesprochen werden. Zusätzliche Steuerungstechnik ist somit erforderlich. Ein weiterer wichtiger Punkt der
Unterscheidung sind die internen Register. Bemerkenswert sind die 32-Bit breiten Register des 68000. Dies bleibt bei Intel bis zum 386 ein Traum.
Auch bietet Motorola mit seiner Vielseitigkeit der Benutzbarkeit der Daten- und Adressregister, nicht nur aufgrund der höheren Anzahl, einen
höheren Programmierkomfort. Außerdem kann beim 68000 gleichzeitig der gesamte Adressbereich angefragt werden.
Befehlssatz
Anzahl Befehle7
interne Register
Motorola 68000
CISC6
56 / > 1000
-acht 32-Bit-Daten-Register (D0-D7)
-acht 32-Bit-Address-Register (A0-A7)8
-ein 32-Bit-Program Counter
-ein 16-Bit-Statusregister
16 Bit
23 Bit10, 16 MByte, linear
externer Datenbus
Adressbus,
ansprechbarer Bereich
I/O-Kommunikation
Reserv. Speicheradr., Memory-mapped
Adressierungsarten
14
Intel 8086
CISC
Intel 80286
CISC, Befehlspipelining
? ca. 200
-vier allgemeine 8/16-Bit-Register (AX-DX)
-vier allgemeine 16-Bit-Register (SI,DI,BP,SP)
-vier 16-Bit-Segment-Register (CS,DS,SS,ES)
-16-Bit IP- und FLAGS-Register, 16-Bit-Steuerregister (286)
16 Bit9
16 Bit
20 Bit, 1 MByte über 64
24 Bit, 16 MByte über variable
KByte-Segmente
Segmentgrößen, 1 GByte virtuell
Zusätzliche Steuersignale, I/O-mapped
8?
24 ?
6
Complex Instruction Set Computer
Basis-Befehle / Kombinationen
8
A7 wird als User- oder Supervisor-Stackpointer benutzt
9
Intel 8088 – 8 Bit
10
effektiv 24 Bit
7
7
3. Der MC68000 im Detail
3.1 Signalbeschreibung
Abb. 6 zeigt die Anschlüsse des
MC68000-Prozessor-Bausteins. Er
ist beispielsweise in einem 64-Pin
DIL-Gehäuse
untergebracht.
können
in
gegliedert
(siehe
Die
folgende
werden:
Datenbus,
A.2)
Anschlüsse
Gruppen
Adressbus,
asynchrone
Bussteuerung,
Busberechtigungs-
Steuerung,
Interruptsteuerung,
Abbildung 8: Input/Output Signale 68000
Systemsteuerung, 6800-Peripherie-Steuerung synchron, Prozessorstatus sowie Taktung und
Spannungsversorgung. Diese werden nun kurz erläutert.
•
Adressbus (A23-A1) – Auf dem Adressbus liegen die Adressen für eine BusOperation. Da der MC68000 eine Wortlänge von 16 Bit besitzt, können die Adressen
auch nur in 16-Bit (bzw. 2-Byte) – Schritten angesprochen werden. Aus diesem Grund
ist hier auch keine Adressleitung 0 vorhanden, denn diese würde 20 = 1 Byte
Adressbereich entsprechen. Über den Datenbus kann dann allerdings beliebig das
Upper oder Lower Byte eines jeden Worts angefragt werden.
Während der Interrupt-Aktivität werden über A1 bis A3 die Interrupt-Levels11 kodiert.
•
Datenbus (D15-D0) – Über den Datenbus können Daten bidirektional als Word12 oder
Byte ausgetauscht werden.
•
Steuerung des asynchronen Buszugriffs – UDS,LDS (Upper/Lower Data Strobe)
bestimmen die Gültigkeit der oberen oder unteren acht Bit. Sind beide Signale true, so
gilt das ganze Word. R/W bestimmt einen Lese- oder Schreib-Vorgang. AS (AdressStrobe) bestätigt die Gültigkeit der Adresse auf dem Adressbus. DTACK (Data
Transfer Acknowledge) entspricht der Fertigmeldung eines Transfers.
•
Busberechtigungssteuerung – Damit der Bus nicht wahllos genutzt wird, müssen
Devices ihren Busbenutzungswunsch ankündigen. Dies geschieht über das BR-Signal.
Während eine andere Komponente als die CPU den Bus benutzt, erhält diese als
11
12
sieben mögliche Level
16 Bit
8
Bestätigung das BGACK-Signal (Bus Grant Acknowledge). Mit dem Signal BG (Bus
Grant) kündigt die CPU die automatische Übernahme der Busberechtigung an.
•
Interruptanfragen (IPL2-IPL0) – Devices welche Interrupts anfragen, tun dies über
IPL2-IPL013 (Interrupt Priority Level). Dabei bedeutet Level 0, dass kein Interrupt
angefragt wird, Level 7 hat die höchste Priorität.
•
Systemsteuersignale – Die Systemsteuersignale dienen zur Übermittlung der
Feststellung eines Busfehlers während des aktuellen Buszyklus an die CPU (BERR,
Bus Error) oder auch zur Durchführung eines Stopps (HALT) bzw. Neustarts
(RESET) auf Prozessor oder Device-Seite (bidirektional).
•
Steuerung des synchronen Buszugriffs – Er dient zum Anschluss von 6800Peripheriebausteinen (z.B. 6821 Parallelschnittstelle). Dazu liefert der 68000 einen
Takt
E (1/10 Clock). Die CPU zeigt über VMA (Valid Memory Address) die
Gültigkeit der Speicheradressen an – Über VPA (Valid Peripheral Address) erhält sie
die Bestätigung, dass die aktuelle Adresse ein 6800-Peripheriegerät ist, somit wird ein
Synchrontransfer mit dem nächstmöglichen Buszyklus erzwungen. Außerdem
verwendet die CPU bei einem VPA=true einen internen Interruptvektor.
•
Prozessorstatus (FC2-FC0) – Diese drei Ausgangssignale kodieren die aktuelle
Betriebsart
(User
oder
Supervisor) sowie die Art des
verwendeten
Adressraums
(Data, Program, CPU Space).
•
Außerdem kommen noch die
Signale CLK (Clock) für die
Taktung des Bausteins und
GND (Ground) sowie VCC für
die
Spannungsversorgung
hinzu. Die Eingangsspannung
bei Bausteinen dieses Typs
beträgt 5,0V ±5%.
Für die Nachfolger-MPUs kommen
natürlich noch weitere Signale hinzu.
Beispiel 68040 siehe Abbildung.
Abbildung 9: Input/Output Signale 68040
13
IPL2 = most significant bit
9
3.2 Interner Aufbau
Die Architektur des MC68000 ist
im
Gegensatz
zu
denen
des
MC68040 oder 060 noch leicht zu
durchschauen.
aus
dazu
kommt
die
CPU
des
MC68000 besteht einfach gesehen
Abbildung 10: grobes Blockschaltbild des MC68000
Befehlsprozessor,
Die
Bussteuerung.
Der
einem
Daten-
Datenprozessor
und
bzw.
die
Ausführungseinheit besteht aus zwei ALUs. Eine ALU ist mit den Datenregistern (inkl.
Statusregister) und Datenbus verbunden, die andere ALU ist mit den Adressregistern (inkl.
Stackpointer, Program Counter) und dem Adressbus verbunden. Sie sind somit jeweils für
Daten- oder Adressoperationen benutzbar.
Der Befehlsprozessor hat Befehle zu dekodieren und dessen Ausführung zu steuern. Teil des
Befehlsprozessors ist das Steuerwerk. Das Steuerwerk des MC68000 zeigt folgende
Abbildung. Das mikroprogrammierte Steuerwerk ist mit dem Datenprozessor so gekoppelt,
dass Holen, Dekodieren und Ausführen
von Befehlen überlappt verläuft. Neben
einem
Mikroprogrammspeicher
besitzt
der MC68000 auch einen sogenannten
Nanoprogrammspeicher,
einzelnen
welcher
von
Mikrobefehlen angesprochen
werden kann.14
Mit
Abbildung 11: Steuerwerk des MC68000
den
Folgeentwicklungen
kamen
einige Änderungen, welche dazu führten,
dass die neueren Prozessoren immer
komplexer wurden. Der MC68040, welcher der Harvard-Architektur entspricht, besitzt eine
getrennte Instruction- und Data Memory Unit. Außerdem enthält die CPU eine sechs-stufige
Befehlspipeline. Einen Schritt weiter ging man beim MC68060. Die Integereinheit des 060ers
ist zweigeteilt: zwei ALUs arbeiten unabhängig voneinander. Somit können zwei Befehle
gleichzeitig ausgeführt werden. Man spricht dann von einer superskalaren CPU. Die
Blockschaltbilder des MC68040/060 sind im Anhang unter A.5 zu finden.
14
[Ober98] / S.329
10
3.3 Register
Wie bereits einführend erwähnt, unterscheidet sich das Registermodell des 68K wesentlich
von dem des x86. Wichtig ist hier zunächst die Unterscheidung von Daten- und
Adressregistern. Die acht 32-BitDatenregister
Operationen,
können
welche
für
auf
alle
Bytes,
Words und Longwords arbeiten,
benutzt
werden.
Die
sieben
Adressregister (A0-A6) ermöglichen
zusätzliche
Adressiermöglichkeiten.
So könnte beispielswiese ein KopierBefehl aussehen: move.w (a0)+,d0
Die
CPU
wird
hier
dazu
aufgefordert, das Word im Speicher
(auf welches A0 zeigt) nach D0 zu
kopieren und anschließend den Inhalt
Abbildung 12: User Registermodell des 68000
des Registers A0 um 2 zu erhöhen.
Das Register A7 ist der Stack-
Pointer. Er ist im Wechsel mit dem A7’ aktiv. Dieser Wechsel ist abhängig von der
Betriebsart „User“ oder „Supervisor“. Der Program Counter ist der Zeiger für die
abzuarbeitende Programmstelle im Speicher. Von den 32 Bits des Registers finden nur die
Bits 0 bis 23 Anwendung. Das Statusregister ist in folgender Abbildung gesondert dargestellt.
Dabei bedeuten die Condition Codes, welche meist durch mathematische Operationen
ausgelöst werden: X – benutzt als Bit-Zwischenspeicher, N – negatives Ergebnis bei
Subtraktion, Z – Gleichheit, V – Überlauf, C – Übertrag oder Borgen bei Addition /
Subtraktion. Das System-Byte des Statusregisters ist nur im Supervisor-Modus verfügbar.
Abbildung 13: Status Register des 68000
11
3.4 Adressierungsarten
Der 68000 kennt 14 Adressierungsarten. Diese lassen sich zunächst in fünf Gruppen
unterteilen: Register direkt, Register indirekt, absolute Adressierung, Adressierung mit
Konstante oder Statusregister, Programm-Counter-relativ.
1.
Register direkt:
Ein Daten- oder Adreßregister wird direkt angesprochen.
move.l
move.l
2.
d0,d1
a0,a1
Register indirekt (ARI):
Der Inhalt eines Adreßregisters wird als Speicherstelle angesehen, auf die dann der Befehl
ausgeführt wird.
move.l
d0,(a0)
Der Inhalt von d0 wird an die Speicherstelle kopiert, dessen Adresse in a0 steht.
2.a
ARI mit Postinkrement:
Hier wird zusätzlich nach dem Kopieren das entsprechende Adressregister um die
Zugriffsbreite erhöht.
move.b
move.w
move.l
2.b
d0,(a0)+
d0,(a0)+
d0,(a0)+
; Erhöhung um 1
; Erhöhung um 2
; Erhöhung um 4
ARI mit Predekrement:
Wie 2.a, jedoch wird hier vor dem Zugriff erniedrigt.
move.w
2.c
d0,-(a0)
; a0 Erniedrigung um 2
ARI mit Adressdistanz:
Hier wird zum Inhalt des Adress-Registers noch ein Offset hinzuaddiert bzw. abgezogen. Die
Summe aus Distanz und Registerinhalt ist die Adresse, auf welche sich der Befehl bezieht.
move.l
d0,-10(a0)
Würde in diesem Beispiel nun in a0 der Wert 30 stehen, so würde der Inhalt von d0 an die
Speicherstelle 20 kopiert werden.
2.d
ARI mit Adressdistanz und Index:
Ein Register wird zusätzliches als Index benutzt, welcher zusammen mit dem Offset und dem
Adressregister addiert die entsprechend zu benutzende Adresse ergibt.
move.w
d0,10(a0,d1)
Würde in d1 eine 80 und in a0 eine 100 stehen, so ergäbe sich ein Adresswert 190.
12
3.
Absolute Adressierung:
Bei der absoluten Adressierung werden die Speicherstellen direkt angesprochen.
move.l
4000,6000
Hier wird der Inhalt der Speicherstelle 4000 in die Speicherstelle 6000 geschrieben.
4.
Konstanten-Adressierung:
Um einen Wert direkt zu benutzen, markiert man ihn mit einem #-Zeichen.
move.l
#4711,d0
In diesem Beispiel würde der Wert 4711 in das Datenregister D0 kopiert werden.
Adressierung PC-relativ15: (siehe auch Programm-Beispiel)
5.
Der Program Counter (Befehlszähler) dient dazu, beispielsweise aus dem Befehlsbereich
eines Assemblerprogramms Daten aus dem Datenbereich zu adressieren, ohne dass ihre
Speicherstelle fest definiert werden muss. Der PC wird wie ein Adressregister behandelt und
ist auch mit einem Index gültig.
move.l
50(pc),d0
Eine Übersicht der Adressierungsarten findet sich im Anhang unter A.3
3.5 Befehle
Der 68000 verfügt über die klassischen Befehle:
•
Transfer-Befehle (Kopieren, Laden, ...),
•
Arithmetische Befehle (Addieren, Subtrahieren, Multiplizieren, Dividieren, Negieren,
Löschen, Vergleichen),
•
Logischen Befehlen (UND, ODER, NICHT, XOR),
•
Bit-Befehlen (Ändern, Löschen, Setzen, Prüfen),
•
Schiebe- und Rotierbefehlen (logisch, arithmetisch) und
•
Programmsteuer-Befehlen (Verzweigen, Schleife, Rücksetzen, ...).
Mit den Nachfolgern des klassischen 68000 kamen noch weitere Befehle dazu. Die
Gleitkommaprozessoren besitzen spezielle Befehle. Der vollständige Befehlssatz ist im
Anhang unter A.4 zu finden. Detaillierte Informationen sind im
68000 Family Programmer's Reference Manual (siehe Quellenangabe) zu finden.
15
PC = Program Counter
13
4. Programmierung
4.1 Maschinencode-Beispiele
Beispiel 1
Das erste Beispiel ist ein Assemblerprogramm, welches die Bitfolge des Maschinencodes in
ein Datenregister kopiert.
nop
move.w
rts
-4(pc),d1
Der Befehl nop macht gar nichts, er dient hier nur als der Beispielbefehl. Der move-Befehl
kopiert von der Quelle (der Speicheradresse PC-4) in das Register d1.
Im Debugger würde man die Speicheradressen sehen (Beispiel):
0005F6F0
0005F6F2
0005F6F6
NOP
MOVE.W
RTS
$0005F6F0(PC),D1
Dies ist also das Beispielprogramm im Speicher. Der Debugger hat hier schon die
Quelladresse des move-Befehls aufgelöst. Diese Adresse zeigt auf den vorhergehenden
Befehl nop. Nach der Ausführung des Programms steht im Datenregister d1 der Wert 4E71.
Ein Blick in das Programmiererhandbuch16 verrät, dass der zu nop gehörende
Maschinenbefehl die Bitfolge 0100 1110 0111 0001 hat. Dies entspricht dem hexadezimalen
Wert 4E71.
Beispiel 2
Umgekehrt geht das natürlich auch. Da der Program Counter nicht direkt als Ziel adressiert
werden darf, muss die Adresse der aktuellen Programm-Speicherstelle zunächst in ein AdressRegister geladen werden.
lea.l
move.w
nop
rts
6(pc),a4
#%0100100001000010,(a4)
Der lea-Befehl17 läd also die Adresse des Program Counters + 6 in das a4-Datenregister. Im
Debugger wird man dann sehen, dass diese Adresse die Adresse ist, an der der move-Befehl
startet.
16
17
[MotoFPRM], S. 8-13
lade effektive Adresse
14
Nach dem Programmers Reference Manual18 ist beispielsweise der SWAP-Befehl so
aufgebaut:
Die Bits 15-3 bilden hier den Basisteil. Die Bits 2-0 geben das zu benutzende Register an. Der
Wert 010 würde dann dem Wert 2 und somit dem Register d2 entsprechen. Der Quellwert des
move-Befehls entspricht also der Bitfolge des Maschinenbefehls swap d2. Ein Test mit dem
Debugger, wird zeigen was passiert:
0005F880
0005F884
0005F888
0005F88A
LEA
MOVE.W
SWAP
RTS
$0005F888(pc),a4
#$4842,(A4)
D2
Tatsächlich wurden durch die Ausführung die beiden Datenwörter im Longword-Register D2
vertauscht (durch den swap-Befehl). Beim Blick in das Befehlsfenster des Debuggers hat sich
nach der Ausführung des Programms der erwartete SWAP-Befehl an die Stelle gesetzt, an der
vorher der NOP-Befehl stand.
4.2 Beispiel Memory-mapped
Beispiel 3
Wie bereits erwähnt, gilt beim 68000 das
Memory-mapped Prinzip, Peripherie wird
also
über
reservierte
Speicherbereiche
angesprochen. In der Abbildung rechts ist
der 16MB – Speicherbereich eines Amiga
500 mit MC68000 CPU dargestellt.
Mit folgendem Befehl
move.w #$0f00,$dff180
würde die Hintergrundfarbe (0) über den
Grafikchip, dessen Adresse für dieses
Farbregister dff180 ist, auf den Wert f00
gesetzt, was nach RGB19-Vorgabe der
Farbe rot entspricht.
18
[MotoFPRM], S. 8-11
Rot-Grün-Blau, die Farbkodierung erfolgt hier also über drei Halb-Bytes, was 2(4+4+4) = 212 = 4096 möglichen
Farben entspricht
19
15
4.3 Beispiel BCD-Arithmetik
Beispiel 4
Im Gegensatz zu anderen CPUs kann man mit dem 68000 BCD20-Zahlen in einem Schritt
addieren und subtrahieren, ohne dass das Prüfen von Carry-Bits und eine Korrektur nötig
sind. Eine BCD-Ziffer belegt immer ein eigenes Halb-Byte, wobei die Werte A bis F nicht
genutzt werden. In folgendem Beispiel werden die Dezimalwerte 44 und 17 jeweils in den
Datenregistern D1 und D2 abgelegt. Der ABCD-Befehl (Addiere BCD) addiert D1 und D2
korrekt, das Ergebnis 61 steht dann im Zielregister D2.
move.b
move.b
abcd.b
#$44,d1
#$17,d2
d1,d2
Was hier so selbstverständlich einfach aussieht, geht ohne die XBCD-Befehle nur mit
erhöhten Aufwand. Würde man anstelle des BCD-Befehls einfach add.b d1,d2 einsetzen,
so würde im Zielregister D2 der Wert 5B stehen. 5B ist natürlich keine richtige Dezimalzahl
mehr. Da B dem dezimalen Wert 11 entspricht, müsste man diesen Übertrag zum oberen
Halbbyte dazu addieren und A = 10 vom unteren Halbbyte abziehen. Außerdem müsste man
jedes mal prüfen ob ein Übertrag vorliegt.
4.4 Beispiel arithmetisches schieben
Beispiel 5
Weitere Vorteile bietet der 68000er durch seine umfangreichen Bitbefehle. Der 68000 kann
sogar arithmetisch shiften, wobei das Vorzeichen wieder hergestellt wird. Und das ganze in
einem Schritt.
Als Beispiel soll nun der ASR-Befehl dienen. ASR heißt Arithmetic Shift Right. Wird ein
Wert rechts-geschoben, so entspräche dies einer Division durch 2. Doch sobald man mit
negativen Zahlen arbeitet, entsteht das Problem, dass das Bit, welches eigentlich nur das
Vorzeichen bestimmt, mitgeschoben wird und das Ergebnis verfälscht. Folgendes Experiment
soll zeigen ob der ASR-Befehl korrekt arbeitet. Folgender Programmabschnitt zeigt das zu
assemblierende Programm.
move.l
move.l
asr.l
#-1073741824,d1
#-536870912,d2
#1,d1
Dabei entspricht die erste (nach D1 zu kopierende) Konstante dem zweifachen Wert der
zweiten Konstante, die dann erstmal in D2 landet.
20
Binary Coded Decimal
16
Im Debugger könnte man dann in etwa sowas sehen:
00050160
00050166
0005016C
...
MOVE.L
MOVE.W
ASR.L
#$C0000000,D1
#$E0000000,D2
#1,D1
Man sieht, dass die Werte in der hexadezimalen Form, mit Vorzeichen, so abgelegt werden.
Interessant sind nun die ersten vier Bits. Der erste Wert beginnt mit 1100 = C, der zweite
beginnt mit 1110 = E. Nach der Durchführung des ASR-Befehls sieht man, dass der Inhalt des
Registers D1 dem Inhalt von D2 entspricht, nämlich $E0000000 oder in aufgelöster
Dezimalform mit Vorzeichen: –536870912.
Außerdem kann der 68000 natürlich noch logisch schieben und rotieren.
17
A. Anhang
A.1 68k-Peripheriebausteine (Auswahl), s.a. [faqWWW]
68150
Dynamic Bus Sizer
(for 040, LC040, EC040 and 68060)
68160
EEST
68184
Broadband Interface Controller (BIC) IEEE 802.4
68185
Twisted Pair Modem -use with 68824 for low cost LAN
68194
Carrierband Modem - IEEE 802.4 Physical Layer 1
68195
Local Talk Adapter - MC68332 and 68302 to LocalTalk networks
68230
Parallel Interface/Timer - two 8 bit ports, 24 bit timer
68338
Mac-Media Access Controller - FDDI, see BR1104/D for family
68339
FSI-FDDI System Interface (Fibre Distributed Data Interface)
68440
Dual Channel DMA - 32 bit addressing R & FN packages
68450
DMA Controller (DMAC) - 4 channel
68451
Memory Management Unit (MMU)
68605
X.25 Protocol Controller - two 22 byte FIFOs, DMA, HDLC
68606
X.25 Multi-Link LAPD Protocol Controller - in ISDN
68681
Dual Universal Asynchronous Receiver/transmitter (DUART)
68824
Token Bus Controller (TBC) - GM MAP Level 2
68836
FCG-FDDI Clock Generator - lower part of PHY of FDDI
68837
ELM Elasticity Buffer and Link - rest of PHY of FDDI
68851
32 bit Paged Memory Management Unit (PMMU) (obsolete)
68881/68882
Floating Point Coprocessor (FPU)
68901
Multi Function Peripheral - USART, 8 par I/O lines, 4 timers
10H640
MC68030/040 ECL/TTL Clock Driver (also MC100H640 @5v)
88915/88916
MC68030 and MC68040 clock drivers
(Ethernet driver) - glueless logic to MC68360.
(obsolete)
18
A.2 MC68000 in 64-Pin Dual In Line – Gehäuse
19
A.3 Adressierungsarten des 68000
20
A.4 Befehle des 68000
21
22
23
24
A.5.a Blockschaltbild des MC68040
A.5.b Blockschaltbild des MC68060
25
A.6 Quellen
[Ober98] Oberschelp, Walter: Rechneraufbau und Rechnerstrukturen, R. Oldenbourg Verlag,
München 1998
[Birm93] Birmelin, Michael: Handbuch der 80xxx-Prozessoren und Pentium, Franzis-Verlag
GmbH, München, 1993
[faqWWW] http://www.faqs.org/faqs/motorola/68k-chips-faq/
Beschreibungen zum 68K
[MotoWWW] http://e-ww.motorola.com/webapp/sps/site/taxonomy.jsp?nodeId=018rH3YTLC4622
0X0 Series - 68K Microprocessors: enthält u.A. Informationen über Varianten, Taktung,
MIPS-Performance, Cache, elektrische Kenndaten. Links zu Detailinformationen sind
vorhanden. Über Links gelangt man hier auch zu den User Manuals der einzelnen MPUs.
[Moto2WWW] http://www.motorola.com/content/0,1037,115-110,00.html
Motorola History
[IntelWWW] http://www.intel.com/pressroom/kits/quickreffam.htm
Microprocessor Quick Reference Guide: enthält Informationen über Varianten, Taktung,
Einführungsdatum, Cache, Bustaktung, Dichte µ und Anwendungsfelder der Prozessoren von
i486 (und früher) bis hin zum Pentium 4
[MotoFPRM] http://e-www.motorola.com/collateral/M68000PRM.pdf
68000 Family Programmer's Reference Manual
26

Similar documents