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