D A S H A L - M A N U A L I N H A L T 1 Vorwort . . . . . . . . . . . . . . . . . . . . . . . . 1 2 Aufbau des HAL-Prozessors . . . . . . . . . . . . . . . 2 2.1 Die General Purpose Register . . . . . . . . . . 2 2.2 Die Special Register . . . . . . . . . . . . . . 2 2.3 Die Ausstattungsregister . . . . . . . . . . . . 3 2.4 Speicherorganisation . . . . . . . . . . . . . . 4 2.4.1 Der Display-Speicher . . . . . . . . . . . 4 2.4.2 Der Code . . . . . . . . . . . . . . . . . 5 2.4.3 Der Heap . . . . . . . . . . . . . . . . . 5 2.4.4 Der Stack . . . . . . . . . . . . . . . . . 5 2.5 Adressierungsarten . . . . . . . . . . . . . . . 5 2.5.1 Direkt . . . . . . . . . . . . . . . . . . 5 2.5.2 Indirekt . . . . . . . . . . . . . . . . . 6 2.5.3 Implizit . . . . . . . . . . . . . . . . . 7 2.6 Operandentyp . . . . . . . . . . . . . . . . . . 7 3 Bedienung des HAL . . . . . . . . . . . . . . . . . . . 9 3.1 Programmaufruf . . . . . . . . . . . . . . . . . 9 3.2 Der Menbaum . . . . . . . . . . . . . . . . . . 9 3.2.1 Die Dialogzeile . . . . . . . . . . . . . . 10 3.2.1.1 Steuerung durch Mens . . . . . . . . 10 3.2.1.2 Eingabe von Werten . . . . . . . . . 10 3.2.2 Das Hauptmen . . . . . . . . . . . . . . . 10 3.2.3 Das Men "Source" . . . . . . . . . . . . . 10 3.2.4 Das Men "Execute" . . . . . . . . . . . . 12 3.2.5 Die Mens "Heap" und "Stack" . . . . . . . 13 3.2.6 Das Men "Registers" . . . . . . . . . . . 15 3.2.7 Das Men "Options" . . . . . . . . . . . . 15 3.2.8 Das Men "Quit" . . . . . . . . . . . . . . 16 3.2.9 Das Men "Radix Vals" . . . . . . . . . . . 16 3.2.10 Das Men "Radix Adr" . . . . . . . . . . . 16 3.3 Besonderheiten der Bildschirmfenster . . . . . . 17 3.3.1 Der Maschinenzyklenz„hler . . . . . . . . . 17 3.3.2 Das Screen-Fenster . . . . . . . . . . . . 17 4 Das HAL-Instructionset . . . . . . . . . . . . . . . . 18 ADD . . . . . . . . . . . . . . . . . . . . . . . 18 ADDC . . . . . . . . . . . . . . . . . . . . . . 19 AND . . . . . . . . . . . . . . . . . . . . . . . 20 CALL . . . . . . . . . . . . . . . . . . . . . . 21 CMP . . . . . . . . . . . . . . . . . . . . . . . 22 DEC . . . . . . . . . . . . . . . . . . . . . . . 23 DIV . . . . . . . . . . . . . . . . . . . . . . . 24 INC . . . . . . . . . . . . . . . . . . . . . . . 25 JMC . . . . . . . . . . . . . . . . . . . . . . . 26 JMCN . . . . . . . . . . . . . . . . . . . . . . 27 JMP . . . . . . . . . . . . . . . . . . . . . . . 28 MOV . . . . . . . . . . . . . . . . . . . . . . . 29 MUL . . . . . . . . . . . . . . . . . . . . . . . 30 MVSTR . . . . . . . . . . . . . . . . . . . . . . 31 NOP . . . . . . . . . . . . . . . . . . . . . . . 32 NOT . . . . . . . . . . . . . . . . . . . . . . . 33 OR . . . . . . . . . . . . . . . . . . . . . . . 34 POP . . . . . . . . . . . . . . . . . . . . . . . 35 PUSH . . . . . . . . . . . . . . . . . . . . . . 36 RET . . . . . . . . . . . . . . . . . . . . . . . 37 RTL . . . . . . . . . . . . . . . . . . . . . . . 38 RTR . . . . . . . . . . . . . . . . . . . . . . . 39 SHL . . . . . . . . . . . . . . . . . . . . . . . 40 SHR . . . . . . . . . . . . . . . . . . . . . . . 41 STOP . . . . . . . . . . . . . . . . . . . . . . 42 SUB . . . . . . . . . . . . . . . . . . . . . . . 43 SUBC . . . . . . . . . . . . . . . . . . . . . . 44 UADD . . . . . . . . . . . . . . . . . . . . . . 45 UADDC . . . . . . . . . . . . . . . . . . . . . . 46 UDIV . . . . . . . . . . . . . . . . . . . . . . 47 UMUL . . . . . . . . . . . . . . . . . . . . . . 48 USUB . . . . . . . . . . . . . . . . . . . . . . 49 USUBC . . . . . . . . . . . . . . . . . . . . . . 50 XOR . . . . . . . . . . . . . . . . . . . . . . . 51 5 Die HAL-Direktiven . . . . . . . . . . . . . . . . . . 52 .BYTE . . . . . . . . . . . . . . . . . . . . . . 52 .DEF . . . . . . . . . . . . . . . . . . . . . . 53 .WORD . . . . . . . . . . . . . . . . . . . . . . 54 1 Vorwort Um die šbung maschinennaher Programmierung zu vereinfachen, wurde eine hypothetische Assemblersprache (Hypothetic Assemb- ler Language - HAL) entworfen. Mit dieser Assemblersprache wird ein hypothetischer Prozessor programmiert. Die Eigen- schaft "hypothetisch" bedeutet dabei, daá es den erw„hnten Prozessor nicht wirklich als Hardware gibt. Er besteht viel- mehr aus einem Programm, seine Register sind bestimmte Daten- strukturen in diesem Programm, seine Instruktionen werden durch Unterprogramme nachgebildet. Die Programme fr HAL-As- sembler und HAL-Prozessor sind in eine Benutzeroberfl„che in- tegriert. Dadurch ist es m”glich, alle Vorg„nge, wie Start einer Assemblierung oder Ausfhren eines bersetzten Program- mes von der selben Oberfl„che aus zu steuern. Weiters k”nnen die Komponenten des Prozessors sowie der Speicher beim Ablauf des Programmes beobachtet werden. - 1 - 2 Aufbau des HAL-Prozessors Im Folgenden soll die Architektur des HAL-Prozessors vorge- stellt werden. Es handelt sich dabei um einen 16-Bit Prozessor mit einem maximalen Adressraum von 64 KByte. Bei der Defini- tion des Registermodells wurden im Sinne leichter Erlernbar- keit des Assemblers die Orthogonalit„t, soweit m”glich, ver- wirklicht: Das bedeutet, daá alle HAL-Register in der gleichen Weise (also ohne Einschr„nkungen fr bestimmte Register) als Operanden in Instruktionen auftreten k”nnen. Dem Programmierer stehen 3 Gruppen von Registern zur Verf- gung: 8 General Purpose Register (R0..R7), die Special Regi- ster, bestehend aus Instructionpointer (IP), Stackpointer SP sowie dem Flagregister (FL), das auch Program Status Word (PSW) genannt wird und die Ausstattungsregister (PST, SCR und MES). Alle Register sind 16 Bit breit. 2.1 Die General Purpose Register Die General Purpose Register werden als Akkumulator, Index- oder Basisregister oder fr Zwischenergebnisse verwendet. Der jeweilige Verwendungszweck ergibt sich aus dem Inhalt des Re- gisters: Enth„lt das Register Daten (Operanden), so dient es als Akkumulator oder zur Speicherung von Zwischenergebnissen. Enth„lt es hingegen eine Adresse, so dient es als Basisregi- ster, enth„lt es einen Offset, so dient es als Indexregister. Die GP-Register k”nnen sowohl als Word-Register (R0 bis R7) angesprochen werden, als auch als zwei Register zu je 1 Byte verwendet werden. Diese werden dann R0L..R7L bzw. R0H..R7H fr die Low- bzw. Highbytes genannt. 2.2 Die Special Register Diesen Registern ist eine spezielle Funktion zugeordnet, ihr Inhalt wird meist implizit durch den Programmlauf bestimmt. Zum Unterschied zu den General Purpose Registern k”nnen diese Register ausschlieálich als Word-Register verwendet werden. Im folgenden werden diese Register nun erl„utert. Der Instruction Pointer (IP) Das IP-Register enth„lt die Adresse der n„chsten Instruk- tion. Der IP ist impliziter Operand aller Sprung- und Ver- zweigungsbefehle. Das bedeutet er wird durch CALL, JMP u.„. ver„ndert, ohne als Ziel der Operation ersichtlich zu - 2 - sein. Der IP kann auch als expliziter Operand in allen Instruktionen auftreten, er kann also so wie jedes andere Register behandelt werden. Dabei muá man sich aber immer vor Augen halten, daá eine Manipulation des IP den Pro- grammfluá „ndert. Das kann unter Umst„nden katastrophale Folgen haben, wenn der IP z.B. nicht auf eine gltige In- struktion sondern auf Daten gesetzt wird. Der Stack Pointer (SP) Der Stackpointer enth„lt die Adresse des n„chsten freien Word am Stack (Top of Stack, TOS). Er wird implizit durch die Stackoperationen PUSH und POP sowie bei den "Unterpro- gramminstruktionen" CALL und RET ver„ndert. Genau wie der IP kann auch der SP explizit durch beliebige Instruktionen ver„ndert werden. Das Program Status Word (PSW) Im Program Status Word sind die Condition Codes (Flags), die Informationen ber Resultate frherer Operationen ge- ben, gespeichert. 6 Bits dieses Registers ist eine beson- dere Bedeutung zugeordnet. Diese Flags sind: Carry (C), ist "1", wenn eine Instruktion einen šbertrag erzeugt. Overflow (O), ist "1", wenn das Resultat einer In- struktion die Registerkapazit„t ber- steigt. Zero (Z), ist "1", wenn das Resultat einer In- struktion 0 war. Negativ (N), ist "1", wenn das Resultat einer In- struktion negativ war. Divide by Zero (D), wird beim Versuch gesetzt, eine Divi- sion durch 0 durchzufhren. Das Re- sultat dieser Division ist FFFFh. Adress Error (A), wird beim Versuch gesetzt, nichtvor- handenen Speicher innerhalb des Adressraumes anzusprechen. Das Carry- und das Overflowflag werden nur durch arithme- tische Operationen beeinfluát. Das Zero- und das Negativ- flag werden von arithmetischen, logischen und den Ver- schiebeoperationen sowie von der Instruktion MOV ver„n- dert. Divide by Zero wird beim Versuch gesetzt, eine Divi- sion mit Divisor 0 auszufhren. Ein Adress Error tritt auf, wenn eine Speicheradresse an- gesprochen wird, die zwar innerhalb des m”glichen nicht aber im Bereich des tats„chlich implementierten Adress- raums liegt. In der Benutzeroberfl„che fhrt das Auftreten so eines Fehlers zu einem Prozessor-Reset. Dabei wird der IP auf die Programmstartadresse zurckgesetzt, der Benut- zer wird auf den Fehler aufmerksam gemacht. 2.3 Die Ausstattungsregister Die Ausstattungsregister enthalten verschiedene Kenngr”áen, die die Umgebung, in der der HAL-Prozessor eingesetzt wird, beschreiben. Diese Register k”nnen nur gelesen werden, es ist - 3 - zwar m”glich, sie als Zieloperand einer Instruktion zu verwen- den, eine solche Instruktion hat aber keine Wirkung auf den Inhalt der Ausstattungsregister. PST Dieses Register enth„lt die Programmstartadresse, gibt also gleichzeitig die Gr”áe des Display-Speichers an. SCR Das Low-Byte dieses Registers enh„lt die Zeilenzahl des Display-Speichers, das High-Byte enth„l die Anzahl der Spalten. W„hrend die brigen Ausstattungsregister nur als Word anzusprechen sind, k”nnen bei SCR High- und Lowbyte getrennt angesprochen werden: SCRL = Zeilenzahl, SCRH = Spaltenzahl. MES In diesem Register steht die Gr”áe des tats„chlich zur Verfgung stehenden Speichers. (Der HAL-Prozessor bietet zwar einen Adressraum, von 64KByte, es ist aber meist nur ein Teil des Adressraumes wirklich implementiert. In der derzeit vorliegenden HAL-Version stehen dem Benutzer 16 KByte zur Verfgung) 2.4 Speicherorganisation Die elementaren Dateneinheiten, mit denen operiert wird, sind Byte und Word. Der Speicher ist byteweise organisiert, das be- deutet, jedem Byte ist eine eindeutige Adresse zugeordnet, aber keiner kleineren Speichereinheit. Ein Byte besteht aus 8 Bit, die von rechts nach links von 0 bis 7 numeriert gedacht werden. Ein Word besteht aus 2 im Speicher aufeinanderfolgen- den Bytes, also 16 Bits. Das niederwertige Byte (Bits 0..7) hat die niedrigere Adresse. Das niederwertige Byte eines Words wird Least Significant Byte (LSB), das h”herwertige Most Sig- nificant Byte (MSB) genannt. Da der Datenbus und die Register 16 Bit breit sind, kann pro Speicherzugriff maximal ein Word angesprochen werden. Die Breite des Adressbus betr„gt ebenfalls 16 Bit, und begrenzt damit den m”glichen Adressraum auf 2^16 Byte, das sind 65.536 Byte oder 64 KByte. Der Aufbau des Speichers wird in den fol- genden Abschnitten n„her erl„utert. 2.4.1 Der Display-Speicher Der Display-Speicher erstreckt sich von der Adresse 0 ausge- hend. Die Bytes in diesem Speicherbereich korrespondieren mit Zeichen am Bildschirm (siehe Screenfenster). Dieser besteht aus n Zeilen und m Spalten, endet also bei der Speicheradresse n*m-1. Wird ein bestimmter Wert im Byte mit der Adresse (y*m)+x gespeichert, so erscheint das nach dem ASCII-Code mit diesem Wert verbundene Zeichen in der Zeile y in Spalte x. - 4 - 2.4.2 Der Code Anschlieáend an den Display-Speicher werden lauff„hige HAL- Programme abgelegt. Der Code beinhaltet dabei alle Instruktio- nen und Operanden eines Programmes in codierter Form, es k”n- nen aber auch Variablen in diesem Bereich ihre Speicherstellen haben. Der Instructionpointer IP zeigt in diesem Speicherbe- reich auf die jeweils n„chste Instruktion des Programmes. 2.4.3 Der Heap Jener Teil des Speichers, in dem Bereiche fr dynamische Ob- jekte belegt ("allokiert") werden, nennt man Heap. Er beginnt blicherweise nach dem Ende des Codes und w„chst in Richtung h”herer Speicheradressen. Fr die Verwaltung des Heap gibt es keine speziellen Prozessorbefehle oder -register. 2.4.4 Der Stack Vor allem aus Grnden der Unterprogrammtechniken, aber auch zum Auswerten arithmetischer Ausdrcke, ist es sehr empfehlenswert, auáer dem Heap einen zweiten Speicherbereich zu haben, den Stack. Beim Stack handelt es sich um eine Struk- tur im Arbeitsspeicher des Computers, deren Vorteil darin liegt, daá nur die Adresse an der das oberste Element liegt, verwaltet werden muá. Dies geschieht mittels eines speziellen Registers, des Stackpointers im Zusammenhang mit den Prozes- sorbefehlen PUSH und POP. Der Stack arbeitet nach dem LIFO-Prinzip (Last In - First Out). Das bedeutet, daá man auf den Stack entweder ein Element "oben drauf" legen (PUSH) oder das oberste Element "wegnehmen" kann (POP). Dabei w„chst der Stack in Richtung fallender Adressen. Nach der Initialisierung des Prozessors zeigt der Stackpointer SP auf die h”chste Speicheradresse. 2.5 Adressierungsarten Beim HAL-Prozessor wurde ein orthogonales Adressierungsmodell gew„hlt. Es k”nnen also alle Register in allen Adressierungs- arten verwendet werden. Jede Adressierungsart ben”tigt eine gewisse Anzahl von Taktzyklen, bis der adressierte Operand zur Bearbeitung zur Verfgung steht, dieser ist im Folgenden unter "Aufwand" angefhrt. Es lassen sich folgende Adressierungsar- ten unterscheiden. 2.5.1 Direkt Bei direkter Adressierungstechnik werden drei Operandenarten unterschieden. Je nach dem, ob der Operand in einem Register, an einer beliebigen Adresse im Arbeitsspeicher oder in der Instruktion selbst enthalten ist, unterscheidet man: - 5 - Register Der Operand befindet sich in einem der internen Register des HAL-Prozessors. Dabei k”nnen sowohl General Purpose Register als auch die Special Register verwendet werden. Beispiel: Die Instruktion INC R0 erh”ht den Inhalt des Registers R0 um 1. Aufwand: 2 Memory Der Operand befindet sich im Arbeitsspeicher. Der Operand wird entweder als Konstante oder als Variablenname no- tiert. Beispiel: Die Instruktionen INC 0AFFEh INC AFFE erh”hen den Inhalt der Speicherzelle mit der Adresse 0AFFEh bzw. den Inhalt der durch den Variablennamen "AFFE" bezeichnetzen Speicherzelle um 1. Aufwand: 4 Immediate Der Operand ist in der Instruktion enthalten. Das "#" vor einer Konstanten zeigt die Verwendung der Adressierungsart "immediate" an. Beispiel: Die Instruktion PUSH #0123h PUSH #WERNER legt den Zahlenwert 0123h, bzw. die Adresse des Symbols WERNER im Hauptspeicher an der Spitze des Stacks ab. Aufwand: 1 2.5.2 Indirekt Diese Adressierungsart stellt das Analogon zum Pointerkonzept h”herer Programmiersprachen (wie z.B. C oder Pascal) auf As- semblerebene dar. Bei indirekter Adressierungstechnik werden zwei Operandenarten unterschieden. Je nach dem, ob die Adresse des Operanden in einem Register oder an einer beliebigen Adresse im Arbeits- speicher enthalten ist, unterscheidet man: - 6 - Register Die Adresse des Operanden befindet sich in einem der in- ternen Register des HAL-Prozessors. Notiert wird diese Adressierungsart durch Einschluá der Registerbezeichnung in runden Klammern. Beispiel: Die Instruktion INC (R0) erh”ht den Inhalt jener Speicherzelle um 1, deren Adresse im Registers R0 enthalten ist. Aufwand: 6 Memory Die Adresse des Operanden befindet sich im Arbeits- speicher. Notiert wird diese Adressierungsart durch Ein- schluá einer Konstanten oder eines Variablennamens in run- den Klammern. Beispiel: Die Instruktionen INC (0AFFEh) INC (AFFE) erh”ht den Inhalt jener Speicherzelle um 1, deren Adresse in der Speicherzelle mit der Adresse 0AFFEh bzw. in der durch "AFFE" bezeichneten Speicherzelle enthalten ist. Aufwand: 8 2.5.3 Implizit Bei dieser Adressierungsart ist der Operand implizit in der Instruktion enthalten. Zum Beispiel ver„ndert PUSH implizit den Stack Pointer SP, JMP hat den Instruction Pointer IP als impliziten Operanden (in gewissem Sinn ist der IP impliziter Operand jeder Instruktion). Das besondere an dieser Adressie- rungsart ist also, daá man den Operanden "nicht sieht". Beispiel: Die Instruktion JMP #label l„dt das IP-Register mit dem Wert(=die Adresse) von label. Aufwand: 0 2.6 Operandentyp Bei der Programmierung von 16 Bit-Prozessoren steht man oft vor dem Problem, einzelne Bytes manipulieren zu mssen. Die Byteadressierung im HAL-Assembler wird durch zwei Konzepte erm”glicht: * Verwendung von Byteregistern. Jedes der General Purpose Register im HAL-Prozessor ist 16 Bit breit, besteht als aus je zwei Bytes. Das Byte, das die Bits 0..7 eines gan- zen Registers enth„lt, wird als Low-Byte, jenes, das die Bits 8..15 enth„lt, als High-Byte bezeichnet. Die Low- bzw. High-Bytes eines Registers k”nnen durch anh„ngen ei- nes "L" bzw. "H" an den Registernamen angesprochen werden. Dieser Bytezugriff ist auf die General Purpose Register beschr„nkt, da eine byteweise Verarbeitung der Special Register nicht sinnvoll w„re. - 7 - * Explizite Typumwandlung. Der HAL-Assembler erlaubt, jedem Operanden, der eine Adresse im Arbeitsspeicher oder eine Konstante bezeichnet, einen sogenannten Modifier voranzu- stellen, der seinen Typ bestimmt. Ein Modifier kann byte oder word lauten. Durch den Modifier werden auch Deklara- tionen berlaufen, die durch die Direktiven .byte bzw. .word getroffen wurden. Folgende Beispiele sollen die Verwendung der vorgestellten Konzepte illustrieren: .byte b 2 ; Zwei aufeinanderfolgende Bytes .word w 1 ; ein Word mov word b, R0 ; Die beiden Bytes, die bei Adresse b ; beginnen, werden als Word aufgefaát und ; in R0 abgelegt mov byte w, R0H ; Das Low-Byte von w wird im ; High-Byte von R0 gespeichert mov b, byte (R0) ; Das Byte an Adresse b wird in das Byte ; an der in R0 enthaltenen Adresse gebracht mov b, (R0) ; Das Byte an Adresse b wird in das Word ; an der in R0 enthaltenen Adresse gebracht mov w, R1L ; Obwohl w ein Word bezeichnet, bestimmt der ; Zieloperand, daá nur das Low-Byte von w im ; Low-Byte von R1 abgelegt wird - 8 - 3 Bedienung des HAL 3.1 Programmaufruf Das gesamte HAL-Paket ist in der Programmdatei HAL.EXE enthal- ten. Das Programm wird vom DOS-Prompt folgendermaáen gestar- tet: hal [setupdatei] "setupdatei" bezeichnet dabei den Dateinamen einer HAL-Setup- datei. In einer Setupdatei k”nnen alle Einstellungen der Be- dieneroberfl„che zu einem bestimmten Zeitpunkt gespeichert werden. Das erleichtert das Fortsetzen der Arbeit mit HAL nach einer Unterbrechung. Wird HAL ohne Parameter gestartet, gibt die Oberfl„che die Standardeinstellungen vor. Beim Programmstart muá davon ausgegangen werden, daá sich Speicher und Prozessor in einem undefinierten Zustand befin- den. Lediglich der IP zeigt auf die Programmstartadresse und SP enth„lt die h”chste verfgbare Speicheradresse. Wurde HAL mit einer Setupdatei gestartet, die das Laden eines HAL-Programmes bewirkt hat, sind auch die von diesem Programm belegten Speicherstellen definiert. Alle anderen Prozessorre- gister und Speicherstellen des HAL-Arbeitsspeichers enthalten zuf„llige Werte. 3.2 Der Menbaum Anmerkung: Im folgenden Text werden Menzeilen ausschlieálich in Kleinbuchstaben dargestellt. Lediglich die "Auswahl- buchstaben" in diesem Men werden groá geschrieben. Damit soll die optische Hervorhebung am HAL-Bildschirm dar- gestellt werden. Aus Platzgrnden erstreckt sich die Darstellung einiger Mens ber zwei Zeilen. Nach dem Programmstart erscheint der Bildschirm in sechs Be- reiche gegliedert: - 9 - * Sourcefenster * Heapfenster * Stackfenster * Registerfenster * Userscreen * Dialogzeile 3.2.1 Die Dialogzeile šber die Dialogzeile steuert der Benutzer das Programm und erh„lt Rckmeldungen ber den Programmzustand. Zwei Eingabe- arten k”nnen dabei unterschieden werden 3.2.1.1 Steuerung durch Mens In Mens werden dem Benutzer mehrere Optionen zur Auswahl ge- stellt. Jede angebotene Option enth„lt einen optisch hervor- gehobenen Buchstaben. Die Auswahl der gewnschten Option er- folgt durch drcken dieses hervorgehobenen Zeichens auf der Tastatur. Jedes Men enth„lt als eine Option ein "Q" (als Ab- krzung fr "Quit"). "Q" bringt den Benutzer in das jeweils vorige Men zurck. Die Auswahl "Q" im Hauptmen bewirkt einen Ausstieg aus dem Programm. 3.2.1.2 Eingabe von Werten Verlangt eine Option die Eingabe eines bestimmten Zeichen- oder Zahlenwertes, gibt die Dialogzeile einen Hinweis auf die Art des erwarteten Wertes, daran anschlieáend kann der Benut- zer in ein optisch abgehobenes Eingabefeld Werte ber die Ta- statur eingeben. Zur Positionierung des Cursors k”nnen dabei die Tasten "Pfeilchen links", "Pfeilchen rechts", "Home" und "End" verwendet werden. Die Tasten "Backspace" und "Del" k”n- nen zum L”schen von Zeichen verwendet werden. Mit "Enter" wer- den Eingaben abgeschlossen. 3.2.2 Das Hauptmen Nach dem Aufruf von HAL zeigt die Dialogzeile folgendes Men, das Hauptmen: Source, Heap, sTack, Registers, Options, quit Alle Optionen in diesem Men verzweigen zu weiteren Mens, die im Folgenden erl„utert werden: 3.2.3 Das Men "Source" Optionen zur Auswahl: Load, Edit, Mode, Radix vals, radix Adr, eXecute, shift: leFt, riGht, Q - 10 - Load L„dt ein HAL-Programm. Der Ladevorgang besteht aus drei Schritten: * Assemblieren des Sourcecodes * Tritt beim Assemblieren ein Fehler auf, wird ein Hin- weis auf die Fehlerursache sowie die Nummer der Zeile, in der der Fehler gefunden wurde, ausgegeben. * Der Prozessor wird zurckgesetzt ("Reset"). Danach zeigt das IP-Register auf die Programmstartadresse und das SP-Register enth„lt den Wert der h”chsten Speiche- radresse. Um ein HAL-Programm, das bereits ausgefhrt wurde wieder in seinen Ausgangszustand zu versetzen (etwa um initiali- sierten Variablen ihre Anfangswerte zuzuordnen) kann das Programm erneut geladen werden. Der Dateiname eines geladenen HAL-Programms wird bei Ver- wendung von Setup-Dateien gespeichert. Das Starten von HAL unter Angabe einer Setupdatei bewirkt das Laden der dort gespeicherten Sourcedatei. Edit Im Men "Options" kann das DOS-Kommando zum Aufruf eines Editors festgelegt werden. Nach erfolgter Festlegung wird von der Option "Edit" dieses Kommando ausgefhrt, wobei dem Editoraufruf der Name des gerade geladenen Sourcepro- gramms als Startoption mitgegeben wird. Bei Verwendung geeigneter Editoren (z.B. Norton-Editor, Edlin, Edit ab DOS-Version 5.0) kann damit komfortabel zur Bearbeitung des Sourcetextes verzweigt werden. Bei der Rckkehr aus dem Editor wird die zuletzt geladene Sourcedatei - wie oben unter "Load" beschrieben - erneut geladen. Mode Verzweigt in ein weiteres Men: source Only, Show adress Source Only Im Sourcefenster wird ausschlieálich der Sourcetext (ohne Speicheradressen) angezeigt. Diese Einstellung ist dann empfehlenswert, wenn ein Programm besonders lange Instruktionszeilen enth„lt, da durch den Wegfall der Adressen mehr Platz zur Textdarstellung zur Ver- fgung stehen. Show Adress Im Sourcefenster wird neben jeder Sourcezeile jene Speicheradresse angezeigt, an der der mit einer Zeile korrespondierende HAL-Code beginnt. (Standardeinstel- lung) Radix Vals Verzweigt in ein Men (siehe Men Radix Vals). Das dort ausgew„hlte Zahlensystem legt die Darstellung der im HAL- Programm vorkommenden Zahlenkonstanten fest. Im Rahmen des Sourcefensters wird die momentane Einstellung angezeigt. - 11 - Radix Adr Diese Auswahl steht nur zur Verfgung, wenn unter "Mode" (siehe oben) "Show Adress" gew„hlt wurde. Verzweigt in ein Men (siehe Men Radix Adr). Das dort ausgew„hlte Zahlen- system legt die Darstellung der neben den Sourcezeilen stehenden Adressen fest. Execute siehe Men "Execute" Shift: Left, Right Durch Auswahl von Left oder Right wird der Inhalt des Sourcefensters um jeweils eine Bildschirmposition nach links oder rechts verschoben. Damit k”nnen Teile von Sour- cezeilen, die im Sourcefenster nicht ganz angezeigt werden k”nnen, sichtbar gemacht werden. Q Zurck zum Hauptmen 3.2.4 Das Men "Execute" Das Men Execute enth„lt die nachstehenden Optionen: Step, Animate, run Until ret, Run, shift: leFt, right, reseT, Q Step Step bewirkt die Ausfhrung der n„chsten HAL-Programmin- struktion. Die Adresse der zur Ausfhrung gelangenden In- struktion ist im IP-Register enthalten. Im Sourcefenster wird diese Instruktion invers ("Balken") angezeigt. Step bewirkt also ein Weiterrcken des Balkens zur n„chsten Instruktion. Nach jedem "Step" zeigen alle Fenster der Benutzerumgebung die aktuellen Werte an. Animate Verzweigt in ein weiteres Men: Interval, Go, Q Interval Hier kann ein Interval (gemessen in Millisekunden) bestimmt werden, daá bei der Auswahl von "Go" (siehe unten) zwischen zwei Steps liegen soll. Go Go bewirkt, daá in spezifizierten Intervallen jeweils ein "Step" (siehe oben) ausgefhrt wird. Diese Option erm”glicht es, Programme mit langer Laufzeit bei der Ausfhrung zu beobachten. Mit Go akivierte Programme k”nnen vom Benutzer durch bet„tigen einer beliebigen Taste gestoppt werden. Die Ausfhrung wird auch angehalten, wenn der Prozessor im Programm eine STOP-Instruktion antrifft. - 12 - Q Rckkehr ins Men "Execute" Run until ret Das momentan geladene Programm wird ausgefhrt. Zwischen je zwei Instruktionen erfolgt keine Aktualisierung des Bildschirms. Dadurch wird die schnellstm”gliche Ausfh- rungsgeschwindigkeit fr ein HAL-Programm erreicht. Die Programmausfhrung kann vom Benutzer durch Tastendruck jederzeit angehalten werden. Das Programm stoppt auch, wenn der Prozessor bei der Abarbeitung auf eine RET- oder STOP-Instruktion trifft. Dadurch eignet sich diese Option zur Beobachtung von Unterprogrammen. Run Das momentan geladene Programm wird ausgefhrt. Zwischen je zwei Instruktionen erfolgt keine Aktualisierung des Bildschirms. Dadurch wird die schnellstm”gliche Ausfh- rungsgeschwindigkeit fr ein HAL-Programm erreicht. Die Programmausfhrung kann vom Benutzer durch Tastendruck jederzeit angehalten werden. Das Programm stoppt auch, wenn der Prozessor bei der Abarbeitung auf eine STOP-In- struktion trifft. Diese Option ist geeignet, fertige HAL-Programme "laufen zu lassen". Durch die gezielte Verwendung von STOP-In- struktionen kann damit auch der HAL-Maschinenzustand nach bestimmten Programmabschnitten beobachtet werden. Shift: Left, Right Durch Auswahl von Left oder Right wird der Inhalt des Sourcefensters um jeweils eine Bildschirmposition nach links oder rechts verschoben. Damit k”nnen Teile von Sour- cezeilen, die im Sourcefenster nicht ganz angezeigt werden k”nnen, sichtbar gemacht werden. Reset Bringt den HAL-Prozessor in seinen Ausgangszustand zurck. Dabei wird das IP-Register mit der Programmstartadresse geladen, dem Stackpointer wird die h”chste verfgbare Speicheradresse zugewiesen, im Flagregister werden das A- und D-Flag auf "0" gesetzt. Durch eine "Reset" wird auch der Maschinenzyklenz„hler im Registerfenster auf 0 ge- stellt. Q Zurck ins Men "Source" 3.2.5 Die Mens "Heap" und "Stack" Die Mens "Heap" und "Stack" sind nahezu identisch aufgebaut, sie k”nnen daher gemeinsam dargestellt werden. Auf die gerin- gen Abweichungen zwischen beiden wird im Folgenden hingewie- sen. - 13 - Beide Mens enthalten folgende Optionen: Mode, Display as,Radix values,radix Adress, Startadress, Q Mode Im Untermen "Mode" kann zwischen folgenden Darstellungs- arten gew„hlt werden: Dump, Text, Stack Dump Die Werte in einem ausgew„hlten Speicherbereich (siehe Startadress) werden als Zahlenwerte dargestellt. Text Die Werte in einem ausgew„hlten Speicherbereich (siehe Startadress) werden als Folge von ASCII-Zeichen inter- pretiert und dargestellt. Stack Diese Option steht ausschlieálich im Stackfenster zur Verfgung. Ist dieser Darstellungsmode gew„hlt, zeigt das Stack- fenster, beginnend beim "Top of Stack" (also jener Adresse, auf die das SP-Register zeigt) in jeder Zeile je ein Word. Damit wird die Beobachtung der "dyna- mischen Speicherstruktur" Stack m”glich. In jeder Zei- le wird zu den Stackeintr„gen auch deren Adresse rela- tiv zum SP-Register angezeigt. In jedem der drei Darstellungmodes wird links von jeder Zeile die Speicheradresse angezeigt, bei der die folgenden Daten beginnen. Die momentan gew„hlte Darstellungsart wird im Rahmen des jeweiligen Fensters angezeigt. Display as Im Untermen "Display as" kann zwischen folgenden Optionen gew„hlt werden: Byte, Word "Display as" ist aber nur zug„nglich, wenn als Darstel- lungsmode "Dump" gew„hlt wurde. Die momentane Einstellung wird im Rahmen des jeweiligen Fensters angezeigt. Byte Jedes Byte wird als eigener Zahlenwert aufgefaát und angezeigt. Word Beginnend bei der Startadresse (siehe Startadress) werden je zwei Byte - zu einem Word zusammengefaát - als Zahlenwert aufgefaát und dargestellt. Radix Values Verzweigt in ein Men (siehe Men Radix Vals). Das dort ausgew„hlte Zahlensystem legt die Darstellung der im Dump- - 14 - bzw. Stack-Mode dargestellten Zahlen fest. Im Rahmen des Heap- bzw. Stackfensters wird die momentane Einstellung angezeigt. Radix Adress Diese Auswahl verzweigt in ein Men (siehe Men Radix Adr). Das dort ausgew„hlte Zahlensystem legt die Darstel- lung der in den Fenstern Heap und Stack angezeigten Spei- cheradressen fest. Startadress Wird diese Option gew„hlt, wird der Benutzer aufgefordert, die Speicheradresse anzugeben, bei der die Darstellung im Heap- bzw. Stackfenster beginnen soll. Die Eingabe kann entweder eine Zahl (im jeweils unter "Radix Adress" gw„hl- ten Zahlensystem notiert) oder der Name eines im momentan geladenen HAL-Programm verwendeten Symbols sein. Q Rckkehr ins Hauptmen 3.2.6 Das Men "Registers" Das Men "Registers" stellt folgende Optionen zur Auswahl: Radix, Quit to main menue Radix Verzweigt in ein Men (siehe Men Radix Vals). Das dort ausgew„hlte Zahlensystem legt die Darstellung der im Regi- sterfenster angezeigten Prozessorregister fest. Das momen- tan gew„hlte Zahlensystem wird im Rahmen des Registerfen- sters angezeigt. Quit to main menue Rckkehr ins Hauptmen 3.2.7 Das Men "Options" "Options" enth„lt folgende Auswahl: Load setup, Save setup, define Editor, Q Load setup Load setup gestattet es, eine neue Setupdatei zu laden. Diese enth„lt neben dem Namen einer HAL-Sourcedatei und dem DOS-Kommando zum Editoraufruf (siehe "define Editor") auch alle oben dargestellten Einstellungen der ver- schiedenen Bildschirmfenster. Save setup Die momentan gw„hlten Fenstereinstellungen sowie der Name der momentan geladenen HAL-Sourcedatei und die Editordefi- nition (siehe "define Editor") werden unter dem einzuge- - 15 - benden Dateinamen gespeichert. Die so entstandene Setupda- tei kann sp„ter mit "Load setup" geladen, oder beim Aufruf von HAL als Startoption angegeben werden. define Editor Als Eingabe wird das DOS-Kommando zum Aufruf eines Editors erwartet. Dieses Kommando kann den Pfad und Dateinamen einer Batch- (z.B. c:\apps\edit.bat) oder Programmdatei (z.B. c:\dos\edit.exe) enthalten. Da beim Aktivieren (sie- he "Edit" unter "Das Men Source") des hier definierten Kommandos der Name der momentan geladenen HAL-Sourcedatei als Startoption verwendet wird, empfiehlt es sich, einen Editor zu w„hlen, der eine Startoption als Dateinamen ei- ner zu ladenden Textdatei verwendet. 3.2.8 Das Men "Quit" Wurde das Program HAL mit einer Setupdatei als Startoption aufgerufen, werden beim Ausstieg nachstehende Optionen angebo- ten, ansonsten wird HAL beendet. save setup? (Yes/No/Continue) Yes Alle Einstellungen der Benutzeroberfl„che werden unter dem beim Programmstart angegebenen Dateinamen gespeichert, anschlieáend wird das Programm beendet No Die Einstellungen werden nicht gespeichert, das Programm wird beendet. Continue Rckkehr ins Hauptmen 3.2.9 Das Men "Radix Vals" In diesem Men k”nnen folgende Zahlensysteme zur Darstellung von Zahlenwerten gew„hlt werden: Octal, Decimal, Signed decimal, Hexadecimal 3.2.10 Das Men "Radix Adr" In diesem Men k”nnen folgende Zahlensysteme zur Darstellung von Adresswerten gew„hlt werden: Decimal, Hexadecimal - 16 - 3.3 Besonderheiten der Bildschirmfenster Durch den oben vorgestellten Menbaum ist auch die Arbeitswei- se der Fenster am Bildschirm weitgehend festgelegt. Zwei Fen- ster bieten jedoch noch nicht vorgestellte Eigenschaften. 3.3.1 Der Maschinenzyklenz„hler Im Registerfenster werden alle Prozessorregister mit Ausnahme der Ausstattungsregister dargestellt. Darberhinaus wird in diesem Fenster auch ein Z„hler - bezeichnet mit Cl fr "Clock" - dargestellt. Dieser Z„hler zeigt die Anzahl der seit Beginn der Programmabarbeitung ausgefhrten Maschinenzyklen an. Die Maschinenzyklen, die zur Ausfhrung einer Instruktion not- wendig sind setzen sich dabei aus dem Aufwand fr die Rechen- operation sowie aus dem Adressierungsaufwand fr die Operanden zusammen (siehe dazu die Angaben "Ausfhrungszeit" im Kapitel Instructionset und "Aufwand" im Kapitel Adressierungsarten). Durch Beobachtung dieses Z„hlers kann die Effizienz von HAL- Programmen abgesch„tzt und der Rechenaufwand verschiedener Algorithmen verglichen werden. 3.3.2 Das Screen-Fenster Dieses Fenster bildet den Inhalt des Bildschirmspeichers ab. Ausgaben eines HAL-Programms k”nnen in diesem Fenster beobach- tet werden. Zur Ermittlung der Gr”áe dieses Screens k”nnen die Ausstattungsregister (siehe dort) verwendet werden. - 17 - 4 Das HAL-Instructionset ADD Add Format: ADD op, sum Wirkung: sum <- op + sum Flags: N <- sum < 0 Z <- sum = 0 O <- {overflow} C <- {carry from most significant bit} Beschreibung: ADD fhrt eine Addition mit den beiden Operanden op und sum durch. Das h”chste Bit der Operanden wird dabei als Vorzeichen aufgefasst. Das Resultat der Addition wird in sum gespeichert, und die Flags werden entsprechend ge- setzt. Ausfhrungszeit: 4 Anmerkung: Es kommt zu einem Overflow, falls Summanden mit gleichem Vorzeichen zu einem Ergebnis mit entgegengesetztem Vorzei- chen fhren. - 18 - ADDC Add with Carry Format: ADDC op, sum Wirkung: sum <- op + sum + C Flags: N <- sum < 0 Z <- sum = 0 O <- {overflow} C <- {carry from most significant bit} Beschreibung: ADDC fhrt eine Addition mit den beiden Operanden (op, sum) und dem Carryflag C durch. Das h”chste Bit der Ope- randen wird dabei als Vorzeichen aufgefasst. Das Resultat der Addition wird in sum gespeichert, und die Flags werden entsprechend gesetzt. Ausfhrungszeit: 4 Anmerkung: Es kommt zu einem Overflow, falls Summanden mit gleichem Vorzeichen zu einem Ergebnis mit entgegengesetztem Vorzei- chen fhren. - 19 - AND Logical And Format: AND op1, op2 Wirkung: op2 <- op1 and op2 Flags: N <- op2 < 0 Z <- op2 = 0 O <- 0 C <- 0 Beschreibung: Die Verarbeitung der Operanden erfolgt bitweise, das heiát, das jedes Bit des Resultates aus einer Verknpfung der korrespondierenden Bits in den beiden Operanden her- vorgeht. Jedes Bit des Resultats einer AND Operation ist "1", wenn beide korrespondierenden Operandenbits ebenfalls "1" waren. Ist eines der beiden Operandenbits oder beide "0", so ist das korrespondierende Resultatbit "0". Ausfhrungszeit: 4 - 20 - CALL Call Subroutine Format: CALL adr Wirkung: SP <- SP - 2 mem[SP] <- IP IP <- adr Flags: Kein Einfluá Beschreibung: CALL fhrt eine Verzweigung zu einem Unterprogramm durch. Dazu wird der Stackpointer um 2 erniedrigt und zeigt damit auf das n„chste freie Word. Die Adresse der auf CALL fol- genden Instruktion wird nun auf den Stack gesichert. Da- nach wird der IP mit adr geladen. Dadurch wird die erste Instruktion des Unterprogramms als n„chste abgearbeitet. Ist die letzte Instruktion des Unterprogramms ein RET, wird mit der dem CALL folgenden Instruktion fortgesetzt. Ausfhrungszeit: 16 - 21 - CMP Compare Format: CMP op1, op2 Wirkung: op2 - op1 Flags: N (op2 - op1) < 0 Z (op2 - op1) = 0 O {overflow} C {carry from most significant bit} Beschreibung: CMP fhrt eine Subtraktion mit den beiden Operanden (op1, op2) durch. Das h”chste Bit der Operanden wird dabei als Vorzeichen aufgefasst. Das Resultat eines mit CMP durchge- fhrten Vergleiches besteht im setzen der Flags. Diese k”nnen z.B. zur Steuerung einer nachfolgenden JMPC oder JMCN Instruktion verwendet werden. Ausfhrungszeit: 4 Anmerkung: Es kommt zu einem Overflow, falls Argumente mit ver- schiedenem Vorzeichen zu einem Ergebnis mit dem Vorzeichen des Subtrahenden fhren. - 22 - DEC Decrement by 1 Format: DEC op Wirkung: op <- op - 1 Flags: N <- op < 0 Z <- op = 0 O <- {overflow} Beschreibung: DEC erniedrigt den Operanden um 1. Ausfhrungszeit: 2 Anmerkung: Es kommt zu einem Integer-Overflow, falls ein positiver Operand ein negatives Ergebnis liefert oder vice versa. Das Carry-Flag wird von DEC nicht ver„ndert. Um das Carry- Flag zu beeinfluáen, muá eine SUB Instruktion mit einem Subtrahenden 1 ausgefhrt werden! - 23 - DIV Divide Format: DIV dvr, dvd Wirkung: dvd <- dvd / dvr dvr <- dvd - (dvd / dvr) * dvr Flags: D <- {dvr (vor Ausfhrung von DIV) = 0} Beschreibung: DIV fhrt eine Division mit den Operanden dvd und dvr durch. Ist dvd ein Byte-Argument wird von DIV ein Word angesprochen, bezeichnet dvd ein Word, so adressiert DIV vier aufeinanderfolgende Bytes. Das Resultat der Division besteht aus einem ganzzahligen Quotienten in dvd und einem Rest in dvr. Ausfhrungszeit: 80 Anmerkung: Beim Versuch, eine Zahl durch 0 zu teilen, wird das Divide by Zero-Flag gesetzt. Dvd erh„lt den Wert 0FFFFh und dvr bleibt 0! Fr DIV stellen die Prozessorregister einen Speicher von 28 Byte Gr”áe dar, die niedrigste Adresse hat R0L, die h”chste MES. Bei der Verwendung von Prozessorregistern als zweites Argument ist daher zu beachten, daá DIV auch "be- nachbarte" Register ver„ndert. - 24 - INC Increment by 1 Format: INC op Wirkung: op <- op + 1 Flags: N <- op < 0 Z <- op = 0 O <- {overflow} Beschreibung: INC erh”ht den Operanden um 1. Ausfhrungszeit: 2 Anmerkung: Es kommt zu einem Integer-Overflow, falls ein positiver Operand ein negatives Ergebnis liefert oder vice versa. Das Carry-Flag wird von INC nicht ver„ndert. Um das Carry- Flag zu beeinfluáen, muá eine ADD Instruktion mit einem Summanden 1 ausgefhrt werden! - 25 - JMC Jump conditional Format: JMC mask, adr Wirkung: PSW and mask = 0: Fortsetzung mit n„chster Instruktion PSW and mask <> 0: IP <- adr Flags: Kein Einfluá Beschreibung: Eine bitweise Und-Verknpfung des Operanden mask mit dem Program Status Word PSW erlaubt, eine vom Zustand bestimm- ter, "maskierter" Flags abh„ngige Programmverzweigung durchzufhren. Die Verzweigung findet statt, falls das Ergebnis der Und-Verknpfung ungleich 0 ist. In diesem Falle wird der Instruction Pointer IP mit adr geladen. Ansonsten wird mit der auf JMC folgenden Instruktion fort- gesetzt. Ausfhrungszeit: 8 falls Bedingung erfllt, sonst 6. - 26 - JMCN Jump conditional not Format: JMCN mask, adr Wirkung: PSW and mask <> 0: Fortsetzung mit n„chster Instruktion PSW and mask = 0: IP <- adr Flags: Kein Einfluá Beschreibung: Eine bitweise Und-Verknpfung des Operanden mask mit dem Program Status Word PSW erlaubt, eine vom Zustand bestimm- ter, "maskierter" Flags abh„ngige Programmverzweigung durchzufhren. Die Verzweigung findet statt, falls das Ergebnis der Und-Verknpfung gleich 0 ist. In diesem Falle wird der Instruction Pointer IP mit adr geladen. Ansonsten wird mit der auf JMCN folgenden Instruktion fortgesetzt. Ausfhrungszeit: 8 falls Bedingung erfllt, sonst 6. - 27 - JMP Jump Format: JMP adr Wirkung: IP <- adr Flags: Kein Einfluá Beschreibung: Der Instructionpointer wird mit adr geladen. Ausfhrungszeit: 8 - 28 - MOV Move Format: MOV src, dst Wirkung: dst <- src Flags: N <- dst < 0 Z <- dst = 0 Beschreibung: Dst wird mit src geladen. Ausfhrungszeit: 3 Anmerkung: Eigentlich erstellt MOV eine Kopie von src, da src erhal- ten bleibt. - 29 - MUL Multiply Format: MUL mkt, prd Wirkung: prd <- mkt prd Flags: O <- { overflow } Beschreibung: MUL fhrt eine Integermultiplikation mit den beiden Ope- randen (mkt, prd) durch. Das Resultat der Multiplikation wird in prd gespeichert. Ist prd ein Byte-Argument wird von MUL ein Word angesprochen, bezeichnet prd ein Word, so adressiert MUL vier aufeinanderfolgende Bytes. Nur das Overflowflag wird von dieser Opeartion beeinfluát. Ausfhrungszeit: 60 Anmerkung: Ist prd ein Byte-Argument kommt es zu einem Overflow, falls signifikante Stellen des Produkts im Highbyte von prd stehen. Ist prd ein Word-Argument kommt es zu einem Overflow, falls signifikante Stellen des Produkts im h”- herwertigen Word von prd stehen. Fr MUL stellen die Prozessorregister einen Speicher von 28 Byte Gr”áe dar, die niedrigste Adresse hat R0L, die h”chste MES. Bei der Verwendung von Prozessorregistern als zweites Argument ist daher zu beachten, daá MUL auch "be- nachbarte" Register ver„ndert. - 30 - MVSTR Move String Format: MVSTR src, dst, len Wirkung: dst[0] <- src[0] dst[1] <- src[1] . . . . dst[len-1] <- src[len-1] Flags: Keine Auswirkung Beschreibung: Von der Quelladresse src beginnend werden die n„chsten len Byte in die bei Zieladresse dst beginnenden len Byte ko- piert. Ausfhrungszeit: 5 + len * Adressierungsaufwand Anmerkung: len wird als Cardinalzahl aufgefaát. Daraus ergibt sich, daá negative L„ngenangaben ausgeschlossen sind. - 31 - NOP No Operation Format: NOP Wirkung: -- Flags: Keine Auswirkung Beschreibung: Wie der Name schon sagt, hat NOP keine Auswirkung auf den Zustand des Prozessors, abgesehen davon, daá der Instruc- tionpointer erh”ht wird. Ausfhrungszeit: 1 Anmerkung: NOP dient einerseits zum Reservieren von Speicherstellen innerhalb des Programmcodes, die sp„ter vom Programm ver- „ndert werden. Andererseits wird NOP in Warteschleifen verwendet. - 32 - NOT Logical Not Format: NOT op Wirkung: op <- not op Flags: N <- op < 0 Z <- op = 0 O <- 0 C <- 0 Beschreibung: Die NOT Operation invertiert den Operanden; das bedeutet jede "1" wird "0" und vice versa. Ausfhrungszeit: 3 - 33 - OR Logical Or Format: OR op1, op2 Wirkung: op2 <- op1 or op2 Flags: N <- op2 < 0 Z <- op2 = 0 O <- 0 C <- 0 Beschreibung: Die Verarbeitung der Operanden erfolgt bitweise, das heiát, das jedes Bit des Resultates aus einer Verknpfung der korrespondierenden Bits in den beiden Operanden her- vorgeht. Jedes Bit des Resultats einer OR Operation ist "1", wenn mindestens eines der beiden Operandenbits ebenfalls "1" war. Sind beide Operandenbits "0", so ist das korrespondierende Resultatbit ebenfalls "0". Ausfhrungszeit: 4 - 34 - POP Pop Word From Stack Format: POP op Wirkung: op <- mem[SP] SP <- SP + 2 Flags: N <- op < 0 Z <- op = 0 Beschreibung: POP stellt das oberste Element vom Stack in den Operanden. Der Stackpointer wird danach um 2 erh”ht. Ausfhrungszeit: 10 - 35 - PUSH Push Word Onto Stack Format: PUSH op Wirkung: SP <- SP - 2 mem[SP] <- op Beschreibung: Der Stackpointer wird um 2 erniedrigt. Danach stellt PUSH den Operanden an die Spitze des Stack. Ausfhrungszeit: 10 - 36 - RET Return from Subroutine Format: RET Wirkung: IP <- mem[SP] SP <- SP + 2 Flags: Keine Auswirkung Beschreibung: RET fhrt die Rckkehr aus einem Unterprogramm in das auf- rufende Programm durch. Dazu wird der auf dem Stack gesi- cherte Inhalt des Instructionpointer wieder in den IP ge- laden, der Stackpointer wird um 2 erh”ht. Dadurch wird die auf das aufrufende CALL folgende Instruktion als n„chste abgearbeitet. Ausfhrungszeit: 12 - 37 - RTL Rotate Left Format: RTL op Flags: N <- op < 0 Z <- op = 0 Beschreibung: Jede Rotationsinstruktion verschiebt die Bits des Operan- den op um 1 Bit. Die Linksrotation verschiebt alle Bits in Richtung h”herwertiger Bits; das "herausfallende" h”chst- wertig Bit, wird in das niedrigstwertige Bit nachgescho- ben. Ausfhrungszeit: 10 - 38 - RTR Rotate Right Format: RTR op Flags: N <- op < 0 Z <- op = 0 Beschreibung: Jede Rotationsinstruktion verschiebt die Bits des Operan- den op um 1 Bit. Die Rechtsrotation verschiebt alle Bits in Richtung niederwertiger Bits; das "herausfallende" nie- drigstwertige Bit wird ins h”chstwertige Bit nachgescho- ben. Ausfhrungszeit: 10 - 39 - SHL Shift Left Format: SHL op Flags: N <- op < 0 Z <- op = 0 C <- { das links "herausgeschobene" Bit} Beschreibung: SHL verschiebt die Bits des Operanden op um 1 Bit in Rich- tung h”herwertiger Bits. In das "freiwerdende" Bit wird das Carry-Flag nachgeschoben, das seinerseits mit dem h”chstwertigen Bit des Operanden gefllt wird. Ausfhrungszeit: 9 - 40 - SHR Shift Right Format: SHR op Flags: N <- op < 0 Z <- op = 0 C <- { das rechts "herausgeschobene" Bit } Beschreibung: SHR verschiebt die Bits des Operanden op um 1 Bit in Rich- tung niederwertiger Bits. In das "freiwerdende" Bit wird das Carry-Flag nachgeschoben, das seinerseits mit dem niedrigstwertigen Bit des Operanden gefllt wird. Ausfhrungszeit: 9 - 41 - STOP Stop Format: STOP Wirkung: -- Beschreibung: STOP unterbricht die Programmexekution. Ausfhrungszeit: -- Anmerkung: STOP eignet sich zum Testen von Programmen. Die Programm- ausfhrung wird angehalten, kann aber bei der auf STOP folgenden Instruktion fortgesetzt werden ("Breakpoint"). - 42 - SUB Subtract Format: SUB op, dif Wirkung: dif <- dif - op Flags: N <- dif < 0 Z <- dif = 0 O <- {overflow} C <- {carry from most significant bit} Beschreibung: SUB fhrt eine Subtraktion mit den beiden Operanden (op, dif) durch. Das h”chste Bit der Operanden wird dabei als Vorzeichen aufgefasst. Das Resultat der Subtraktion wird in dif gespeichert, und die Flags werden entsprechend ge- setzt. Ausfhrungszeit: 4 Anmerkung: Es kommt zu einem Overflow, falls Argumente mit ver- schiedenem Vorzeichen zu einem Ergebnis mit dem Vorzeichen des Subtrahenden fhren. - 43 - SUBC Subtract with Carry Format: SUBC op, dif Wirkung: dif <- dif - (op + C) Flags: N <- dif < 0 Z <- dif = 0 O <- {overflow} C <- {carry from most significant bit} Beschreibung: SUBC fhrt eine Subtraktion mit den beiden Operanden (op, dif) und dem Carryflag durch. Das h”chste Bit der Operan- den wird dabei als Vorzeichen aufgefasst. Das Resultat der Subtraktion wird in dif gespeichert, und die Flags werden entsprechend gesetzt. Ausfhrungszeit: 4 Anmerkung: Es kommt zu einem Overflow, falls Argumente mit ver- schiedenem Vorzeichen zu einem Ergebnis mit dem Vorzeichen des Subtrahenden fhren. - 44 - UADD Unsigned Integer Add Format: UADD op, sum Wirkung: sum <- op + sum Flags: N <- sum < 0 Z <- sum = 0 O <- {overflow} C <- {carry from most significant bit} Beschreibung: UADD fhrt eine Addition mit den beiden Operanden (op, sum) durch, sie werden dabei als Cardinalzahlen, also als Zahlen ohne Vorzeichen, behandelt. Das Resultat der Addi- tion wird in sum gespeichert, und die Flags werden ent- sprechend gesetzt. Ausfhrungszeit: 4 Anmerkung: Es kommt zu einem Overflow, falls * die h”chsten Bits der Operanden verschieden sind und das h”chste Bit der Summe "0" ist oder * die h”chsten Bits der Operanden beide "1" sind. - 45 - UADDC Unsigned Integer Add with Carry Format: UADDC op, sum Wirkung: sum <- op + sum + C Flags: N <- sum < 0 Z <- sum = 0 O <- {overflow} C <- {carry from most significant bit} Beschreibung: UADDC fhrt eine Addition mit den beiden Operanden (op, sum) und dem Carryflag durch, sie werden dabei als Cardi- nalzahlen, also als Zahlen ohne Vorzeichen, behandelt. Das Resultat der Addition wird in sum gespeichert, und die Flags werden entsprechend gesetzt. Ausfhrungszeit: 4 Anmerkung: Es kommt zu einem Overflow, falls * die h”chsten Bits der Operanden verschieden sind und das h”chste Bit der Summe "0" ist oder * die h”chsten Bits der Operanden beide "1" sind. - 46 - UDIV Unsigned Integer Divide Format: UDIV dvr, dvd Wirkung: dvd <- dvd dvr dvr <- dvd - (dvd dvr) dvr Flags: D <- {dvr (vor Ausfhrung von UDIV) = 0} Beschreibung: UDIV fhrt eine Division mit den Operanden dvd und dvr durch. Ist dvd ein Byte-Argument wird von UDIV ein Word angesprochen, bezeichnet dvd ein Word, so adressiert UDIV vier aufeinanderfolgende Bytes. Das Resultat der Division besteht aus einem ganzzahligen Quotienten in dvd und einem Rest in dvr. Ausfhrungszeit: 80 Anmerkung: Beim Versuch, eine Zahl durch 0 zu teilen, wird das Divide by Zero-Flag gesetzt. Dvd erh„lt den Wert 0FFFFh und dvr bleibt 0! Fr UDIV stellen die Prozessorregister einen Speicher von 28 Byte Gr”áe dar, die niedrigste Adresse hat R0L, die h”chste MES. Bei der Verwendung von Prozessorregistern als zweites Argument ist daher zu beachten, daá UDIV auch "be- nachbarte" Register ver„ndert. - 47 - UMUL Unsigned Integer Multiply Format: UMUL mkt, prd Wirkung: prd <- mkt prd Flags: O <- { overflow } Beschreibung: UMUL fhrt eine Multiplikation mit den beiden Operanden (mkt, prd) durch. Das Resultat der Multiplikation wird in prd gespeichert. Ist prd ein Byte-Argument wird von UMUL ein Word angesprochen, bezeichnet prd ein Word, so adressiert UMUL vier aufeinanderfolgende Bytes. Nur das Overflowflag wird von dieser Opeartion beeinfluát. Ausfhrungszeit: 60 Anmerkung: Ist prd ein Byte-Argument kommt es zu einem Overflow, falls signifikante Stellen des Produkts im Highbyte von prd stehen. Ist prd ein Word-Argument kommt es zu einem Overflow, falls signifikante Stellen des Produkts im h”- herwertigen Word von prd stehen. Fr UMUL stellen die Prozessorregister einen Speicher von 28 Byte Gr”áe dar, die niedrigste Adresse hat R0L, die h”chste MES. Bei der Verwendung von Prozessorregistern als zweites Argument ist daher zu beachten, daá UMUL auch "be- nachbarte" Register ver„ndert. - 48 - USUB Unsigned Integer Subtract Format: USUB op, dif Wirkung: dif <- dif - op Flags: N <- sum < 0 Z <- dif = 0 O <- {overflow} C <- {carry from most significant bit} Beschreibung: USUB fhrt eine Subtraktion mit den beiden Operanden (op, dif) durch, sie werden dabei als Cardinalzahlen, also als Zahlen ohne Vorzeichen, behandelt. Das Resultat der Sub- traktion wird in dif gespeichert, und die Flags werden entsprechend gesetzt. Ausfhrungszeit: 4 Anmerkung: Es kommt zu einem Overflow, falls * die h”chsten Bits von Subtrahend und Differenz ver- schieden sind und das h”chste Bit des Subtraktors "0" ist oder * die h”chsten Bits von Subtrahend und Differenz beide "1" sind. - 49 - USUBC Unsigned Integer Subtract with Carry Format: USUBC op, dif Wirkung: dif <- dif - (op + C) Flags: N <- sum < 0 Z <- dif = 0 O <- {overflow} C <- {carry from most significant bit} Beschreibung: USUBC fhrt eine Subtraktion mit den beiden Operanden (op, dif) und dem Carryflag C durch, sie werden dabei als Car- dinalzahlen, also als Zahlen ohne Vorzeichen, behandelt. Das Resultat der Subtraktion wird in dif gespeichert, und die Flags werden entsprechend gesetzt. Ausfhrungszeit: 4 Anmerkung: Es kommt zu einem Overflow, falls * die h”chsten Bits von Subtrahend und Differenz ver- schieden sind und das h”chste Bit des Subtraktors "0" ist oder * die h”chsten Bits von Subtrahend und Differenz beide "1" sind. - 50 - XOR Exclusive Or Format: XOR op1, op2 Wirkung: op2 <- op1 xor op2 Flags: N <- op2 < 0 Z <- op2 = 0 O <- 0 C <- 0 Beschreibung: Die Verarbeitung der Operanden erfolgt bitweise, das heiát, das jedes Bit des Resultates aus einer Verknpfung der korrespondierenden Bits in den beiden Operanden her- vorgeht. Jedes Bit des Resultats einer XOR Operation ist "0", wenn beide Operandenbits "1" oder "0" waren. Sind die beiden Operandenbits verschieden, so ist das korrespondie- rende Resultatbit "1". Ausfhrungszeit: 4 - 51 - 5 Die HAL-Direktiven In HAL stehen Direktiven zur Speicherplatzreservierung sowie zur Definition von Konstanten zur Verfgung. .BYTE Byte Storage Directive Format: .BYTE .BYTE constant .BYTE name .BYTE name constant .BYTE name constant DUP initvalue .BYTE name constant "text" .BYTE name "text" Beschreibung: Die Direktive dient zum Reservieren von aufeinanderfolgen- den Speicherzellen im Hauptspeicher. Dabei ist es m”glich, nur ein Byte zu reservieren (.BYTE) oder aber durch Angabe einer Zahl (constant) mehrere Bytes zu reservieren. Unab- h„ngig kann den reservierten Bytes ein symbolischer Name (name) gegeben werden. Auáerdem kann eine Initialisierung der reservierten Bytes mit einem bestimmten Zahlenwert (initvalue) vorgenommen werden. Ebenfalls ist es m”glich, die Bytes mit einem String (text) zu initialisieren. Der String muá dabei in Anfhrungszeichen gesetzt werden. - 52 - .DEF Define Constant Format: .DEF name constant Beschreibung: Die Direktive definiert eine Konstante. Dabei wird dem symbolischen Namen name der Zahlenwert constant zugeord- net. Mit dieser "Konstantendeklaration" gelingt es, ber- sichtliche, leicht „nderbare Programme zu verfassen. Anmerkung: Mit .DEF deklarierte Namen drfen nicht als Argument ande- rer Direktiven verwendet werden. Beispiel: .DEF prg_start 0B00h kann bei mov #prg_start,R0 verwendet werden, aber nicht bei .BYTE screen prg_start Hier muá weiterhin .BYTE screen 0B00h geschrieben werden. - 53 - .WORD Word Storage Directive Format: .WORD .WORD constant .WORD name .WORD name constant .WORD name constant DUP initvalue .WORD name constant "text" .WORD name "text" Beschreibung: Die Direktive dient zum Reservieren von aufeinanderfolgen- den Words im Hauptspeicher. Dabei ist es m”glich, nur ein Word zu reservieren (.WORD) oder aber durch Angabe einer Zahl (constant) mehrere Words zu reservieren. Unabh„ngig kann den reservierten Words ein symbolischer Name (name) gegeben werden. Auáerdem kann eine Initialisierung der reservierten Words mit einem bestimmten Zahlenwert (init- value) vorgenommen werden. Ebenfalls ist es m”glich, die Words mit einem String (text) zu initialisieren, wobei die einzelnen Zeichen des Strings jeweils in die LSBs (Least Significant Bytes) der reservierten Words gestellt werden. Der String muá dabei in Anfhrungszeichen gesetzt werden. - 54 -