HiSoft DevpacST
Jump to navigation
Jump to search
HiSoft BenÂtzung der Assembler-Sprache von Personal Pascal Hier wird geschildert, wie man Prozeduren und Funktionen in Assembler Sprache schreibt und mit Pascal-Programmen linkt, indem man DevpacST und OSS Personal Pascal verwendet. Um Personal-Pascal-kompatible Objekt-Dateien zu generieren, mÂssen Sie die DevpacST Version 2.02 oder sp„tere verwenden, da frÂhere Versionen nicht kompatibel sind. Sie sollten DRI-Ausgabe- Code w„hlen, wie es im Handbuch (Seite 48) beschrieben ist. FÂgen Sie dannach COMMENT PASCAL in Ihr Programm ein. Dadurch wird GenST angewiesen, das spezielle Dateiformat fÂr Personal Pascal zu erzeugen. Die Deklaration der Funktionen und/oder Prozeduren muž mittels der XDEF-Amweisung erfolgen, deren Namen mÂssen in Grožbuchstaben erscheinen. Ihre Anweisungen sollten in der TEXT-Sektion erfolgen. Globale Variablen sollten Sie in der BSS-Sektion plazieren. Versuchen Sie nicht, die DATA-Sektion zu verwenden, denn dadurch kâ€nnte der Linker die Kontrolle verlieren. Beim Assemblieren auf Diskette wird eine .0-Datei erzeugt. Diese ist jedoch nicht identisch mit einer .0-Datei im DRI-Format, denn erstere ist nur mit dem Pascal-Linker verwendbar. Sie kâ€nnen dannach diese Datei als eine zus„tzliche Link-Datei gebrauchen. (Lesen Sie bitte dazu Seite 5-3 in Ihrem Handbuch) Die Regeln bezÂglich der von Pascal aufgerufenen Assembler Sprache kâ€nnen Sie auf den Seiten 6-142 finden. Hier ist ein kÂnstlich einfaches Beispiel, welches den Gebrauch von Parametern oder Return-Werten vermeidet. Es definiert ganz einfach eine Prozedur, einen String am Bildschirm unter Verwendung von GEMDOS auszugeben: opt l2,c8+ DRI mode, short case sensitive labels COMMENT PASCAL xdef TESTING declare export (s) TESTING move.l #message,-(a7) move.w #9,-(a7) trap #1 addq.l #6,sp rts message dc.b 'Hello',13,10,0 Diese Funktion sollte in einem Pascal-Programm deklariert werden, die mit PROCEDURE TESTING; EXTERNAL; aufgerufen werden soll, wobei die .0-Datei von DevpacST als zus„tzliche Link-Datei beim Linken des Hauptprogramms spezifiziert ist. 2 Der kombinierte Editor/Makro-Assembler -Žnderungen - Der Editor von GENST.PRG bildet das KernstÂck der vâ€llig integrierten Umgebung von Devpac ST Version 2. Sie kâ€nnen assemblieren, debuggen und auch andere Programme, wie z.B. LinkST, aufrufen, ohne jemals den Editor verlassen zu mÂssen. Wenn Sie zus„tzlich noch unser Saved!- Desk-Accessory besitzen, gibt es kaum einen Grund, w„hrend der Programmentwicklung zurÂck ins Desktop zu gehen. 2.1 Generelle Žnderungen und Erg„nzungen Zuerst wird auf die einfacheren Ver„nderungen des Editors eingegangen. Es handelt sich hiermit haupts„chlich um neue TastaturkÂrzel und -umbelegungen. Die Geschwindigkeit des Editors hat sich stark erhâ€ht. Es gibt so gut wie keinen Tastaturnachlauf mehr, und das >>Bl„ttern<< geht um ein Mehrfaches schneller als beim Editor der Version 1. Zeilen kâ€nnen jetzt bis zu 240 Zeichen lang sein. Das Seitw„rts- Scrollen ist durch Benutzung des horizontalen Scrolling-Balkens des Editorfensters mâ€glich. Der Editor scrollt auch automatisch zur Seite, wenn man sich mit dem Cursor nahe genug am Rand befindet. Dies gilt auch fÂr Ctrl-C. Shift-Alt-S ist das TastaturkÂrzel fÂr "Datei speichern". Der Editor funktioniert jetzt auch in niedriger Auflâ€sung. Tip: Wenn Sie ein Tab-Zeichen suchen bzw. ersetzen wollen, geben Sie Ctrl-I in der Dialogbox ein; als Tab wird dann eine kleine Uhr erscheinen. 2.2 Blockverwaltung Die Verwaltung von Blâ€cken ist um einiges erweitert worden. Markierte Blâ€cke werden jetzt invers dargestellt. 2.2.1 Block lâ€schen Ein Block wird nicht mehr mit Shift-F3, sondern mit Shift-F5 gelâ€scht. Der gelâ€schte Block ist auch nicht unwiederruflich verloren, sondern wird im Blockspeicher abgelegt. Voraussetzung ist, daá genug freier Speicher vorhanden ist. 2.2.2 Block in den Blockspeicher kopieren Mit Shift-F4 kopieren Sie den markierten Block in den Blockspeicher. Der markierte Block bleibt jedoch an seiner ursprÂnglichen Stelle und wird nicht - wie mit Shift-F5 -gelâ€scht. 2.2.3 Block aus dem Blockspeicher kopieren Mit F5 wird der Inhalt des Blockspeichers an die Cursorposition ko- piert. 2.2.4 Undo und Ctrl-U Eine „hnliche Funktion haben die Tastenkombinationen Ctrl-U und Undo. Eine Zeile, die mit Ctrl-Y gelâ€scht wurde, kann so oft wie nâ€tig mit Undo bzw. Ctrl-U wieder eingefÂgt werden. Das gleiche gilt fÂr Text, der mit Ctrl-Q gelâ€scht wurde. 2.3 Voreinstellungen Es ist jetzt mâ€glich, zus„tzlich zum Tab-Abstand auch all die Einstellungen, die mit dem Installationsprogramm gemacht wurden, Âber "Voreinstellungen" festzulegen: 2.3.1 Tab-Abstand Wie bei GENST.PRG Version 1 ist der Standardwert 8, kann aber auf jeden Wert zwischen 2 und 16 eingestellt werden. 2.3.2 Textspeichergrâ€Å¾e Der Standardwert ist 60 000 Byte, kann aber auf einen Wert von 4000 bis 990 000 Byte eingestellt werden. Dadurch wird die maximale Datei- grâ€Ã¡e bestimmt, die geladen und editiert werden kann. Man sollte darauf achten, genug Speicher fÂr den Assembler und ggf. MonST Âbrig zu lassen, normalerweise werden etwa 100 Kbyte benâ€tigt. Ver„ndern der Speichergrâ€Ã¡e hat zur Folge, daá der Text, der gerade bearbeitet wird, gelâ€scht wird; eine Alarmbox erscheint, wenn der Text nicht abgespeichert wurde. 2.3.3 Numerischer Tastenblock Diese Option erlaubt es, den numerischen Tastenblock der ST-Tastatur als Cursorblock, „hnlich wie bei PC-Kompatiblen, zu benutzen. Standardm„áig ist er als Cursorblock konfiguriert. 2.3.4 Backups Ohne Voreinstellung macht der Editor keine Backups. Wenn Sie in der Abfragebox "Ja" w„hlen, gibt der Editor der schon existierenden Version Ihrer Datei die Extension .BAK. Die aktuelle Datei wird dann unter dem richtigen Namen gespeichert. 2.3.5 (Automatisches) EinrÂcken Diese Funktion rÂckt eine Zeile automatisch nach Eingabe von RETURN um so viel ein, wie die vorherige Zeile durch Leerzeichen bzw. Tabs eingerÂckt wurde. 2.3.6 Cursor Die Standardeinstellung des Cursors ist ein Blinken, er kann jedoch auch so eingestellt werden, daá er feststeht. 2.3.7 MonST laden Diese Option ist standardm„áig an und bewirkt, daá jedesmal, wenn GENST.PRG geladen wird, MonST mitgeladen wird. MonST ist so per Tastendruck ohne Diskettenzugriff sofort verfÂgbar. Das Ausschalten der Option bringt einen Speichergewinn von ca. 24 Kbyte. Der neue Wert der Einstellung wird nur dann wirksam, wenn Sie die Voreinstellungen abspeichern und GENST.PRG neu starten. Es sollte beachtet werden, daá AMonST schon installiert zu haben nicht das gleiche ist, wie MonST beim Start von GenST zu laden. 2.3.8 Voreinstellungen sichern Wenn Sie den Abbruch-Knopf bet„tigen, werden s„mtliche Žnderungen, die Sie in der Voreinstellungen-Dialogbox gemacht haben, ignoriert; mit OK werden die Žnderungen wirksam. Wenn die von Ihnen gew„hlte Konfiguration permanent gespeichert werden soll, klicken Sie auf Sichern. Die Datei GENST2.INF wird erstellt und enth„lt die von Ihnen gew„hlten Voreinstellungen sowohl aus der Assemblieren-Box als auch aus der Voreinstellungen-Box. 2.4 Das Programm-Men Das Programm-Men enth„lt alle Funktionen, die mit dem Assemblieren oder der AusfÂhrung von Programmen zu tun haben. 2.4.1 Assemblieren Um das Programm, das Sie z.Zt. editieren, zu assemblieren, w„hlen Sie entweder "Assemblieren" oder drÂcken Alt-A. Es erscheint die Assemblierungs-Dialogbox, die verschiedene Optionen enth„lt; hier wird nur auf die Ausgabe-Option eingegangen, die weiteren Optionen werden im Assembler-Teil besprochen. GenST kann auf Diskette, in den Speicher, oder nirgendwohin (>>Nein<<) assemblieren; die "Nirgendwo"-Option ist nÂtzlich, wenn nur ein Syntaxcheck durchgefÂhrt werden soll. In den Speicher assemblieren ist ideal zum Ausprobieren eines Programmes, da nicht auf die Diskette geschrieben wird. Wenn Sie in den Speicher assemblieren, mÂssen Sie die Speichermenge angeben, in die das Programm hineinassembliert wird; der Standardwert ist 20 Kbyte, genug fÂr ein durchschnittlich groáes Programm mit Symbolen oder ein grâ€Ã¡eres Programm ohne Symbole. Wenn Sie die Meldung "Programmspeicher voll" erhalten, heiát das, daá die von Ihnen angegebene Speichermenge nicht ausreicht um Ihr Programm vollst„ndig zu assemblieren; Sie mÂssen also den Programm- speicher vergrâ€Ã¡ern. NatÂrlich hat ein grâ€Ã¡erer Programmspeicher zur Folge, daá der Assembler weniger Platz zum Arbeiten hat. Falls der Assembler mit der Meldung "ungenÂgender Speicher" abbricht, mÂssen Sie die Programmspeichergrâ€Ã¡e verringern. Wenn die Programmspeichergrâ€Ã¡e mit dem fÂr den Assembler notwendigen Platz nicht zu vereinbaren ist, mÂssen Sie auf Diskette assemblieren. Wenn Sie auf Diskette assemblieren, wird die Grâ€Ã¡eneinstellung des Programmspeichers ignoriert und der gesamte verfÂgbare Speicherplatz dem Assembler zur VerfÂgung gestellt. Wenn Ihr Programm auf Diskette assembliert wird, ohne daá der Assembler sich einen Namen fÂr diese Datei bilden kann, wird der Name Ihres Programms mit NONAME anfangen. Wenn Sie auf "Assemblieren" klicken oder Return drÂcken, wird der Assembler gestartet. Am Ende des Vorgangs wird auf einen Tastendruck gewartet, damit Sie ggf. erscheinende Meldungen in Ruhe lesen kâ€nnen, bevor Sie zum Editor zurÂckkehren. Wenn in Ihrem Programm Fehler auftreten, wird der Cursor des Editors bei der RÂckkehr auf der ersten fehlerhaften Zeile Ihres Programmtextes stehen; mit Alt-J gelangen Sie dann an den n„chsten Fehler. 2.4.2 Programme ausfÂhren Wenn Sie "AusfÂhren" im Programm-Men w„hlen, kâ€nnen Sie ein in den Speicher assembliertes Programm ausfÂhren; das TastaturkÂrzel hierfÂr ist Alt-X. Wenn der Vorgang beendet wird, kehren Sie in den Editor zurÂck. Falls Ihr Programm nicht vollst„ndig assembliert wurde, kann es nicht ausgefÂhrt werden. Wenn Ihr Programm abstÂrzt, kann es sein, daá Sie nicht wieder in den Editor gelangen und neu "booten" mÂssen. Es ist also ratsam, den Quelltext vor der AusfÂhrung des Programmes abzuspeichern. Vorsicht: Wenn Ihr Programm mit Fehlern, wie z.B. undefinierten Symbolen, vollst„ndig assembliert wurde, kâ€nnen Sie es zwar ablaufen lassen, jedoch ist die Gefahr eines Absturzes vorhanden. Wenn Sie ein Programm, egal welcher Art, vom Editor aus ausfÂhren, kann es vorkommen, daá der Rechner am Programmanfang oder zum Programm- ende hin zu "h„ngen" scheint. Dies ist ein Fehler im GEM, Âber den wir keine Kontrolle haben; der Mauszeiger befindet sich dabei in der MenÂleiste. Wenn Sie die Maus nach unten bewegen, mÂáte alles normal weiterlaufen. 2.4.3 Debuggen Wenn Sie ein Programm, welches in den Speicher assembliert wurde, debuggen wollen, w„hlen Sie "Debuggen" oder Alt-D. Dadurch wird MonST aufgerufen und kann Ihr Programm, das ggf. Symbole enth„lt, debuggen. Wenn Sie Ctrl-C eingeben, wird Ihr Programm abgebrochen und Sie ge- langen in den Editor zurÂck. Die Bildschirminitialisation h„ngt vom MenÂpunkt "GEM" ab, der weiter unten erl„utert wird. Wenn Sie "MonST laden" in den "Voreinstellungen" nicht gew„hlt haben, sind weder "Debuggen" noch "MonST" w„hlbar. 2.4.4 MonST Wenn Sie "MonST" w„hlen, oder Alt-M drÂcken, wird MonST aufgerufen, und zwar so, als ob Sie ihn vom Desktop aufgerufen h„tten, also ohne Diskettenzugriff (so wie es auch z.B. beim Debuggen der Fall ist). Ctrl-C bringt Sie wieder in den Editor zurÂck. Die Bildschirm- initialisation h„ngt hier auch von GEM ab. 2.4.5 GEM Normalerweise wird bei "AusfÂhren", "Debuggen" und "MonST" eine GEM- Bildschirminitialisation vorgenommen. Bei TOS-Programmen braucht man aber einen leeren Bildschirm und einen blinkenden Cursor. Wenn der MenÂpunkt "GEM" mit einem Haken gekennzeichnet ist, wird der Bildschirm auf ein GEM-Programm vorbereitet, wenn nicht, wird der Bildschirm auf ein TOS-Programm vorbereitet. Die Einstellung dieser Option wird beim Abspeichern der Voreinstellungen beibehalten. Vorsicht: Ein TOS-Programm mit einem GEM-Bildschirm ist mâ€glich, sieht aber unschâ€n aus. Ein GEM-Programm darf aber nie mit der TOS- Bildschirminitialisation ausgefÂhrt werden, da sonst ein Absturz sehr wahrscheinlich wird. 2.4.6 N„chster Fehler Hier ist so gut wie keine Ver„nderung gegenÂber der Version 1 zu erkennen. Der einzige Unterschied ist, daá bei der RÂckkehr vom Assembler in den Editor der Cursor auf der ersten fehlerhaften Zeile plaziert ist. 2.4.7 Anderes Programm Mit dieser Funktion, die auch mit Alt-O aufgerufen werden kann, kâ€nnen Sie ein anderes Programm vom Editor aus laufen lassen; wenn das Programm beendet wird, kehren Sie in den Editor zurÂck. Die Hauptanwendungen dieser Funktion sind das AusfÂhren von assemblierten Programmen und der Aufruf des Linkers. Sowohl TOS- als auch GEM-Programme kâ€nnen ausgefÂhrt werden. Voraussetzung dafÂr ist natÂrlich, daá genug Speicher vorhanden ist. Wenn Sie "Anderes Programm" aufrufen, erscheint zun„chst eine Warnung mit dem Inhalt, daá Sie Ihren Quelltext nicht gesichert haben. Danach erscheint die File-Selector-Box, in der Sie das auszufÂhrende Programm ausw„hlen. Wenn es ein TOS- oder ein TTP-Programm ist, werden Sie zus„tzlich nach einer Kommandozeile fÂr das Programm gefragt. Sie kâ€nnen in der Kommandozeile das ¯%® Zeichen angeben; dies wird dann durch den Namen (und nicht durch die Extension) der gerade editierten Datei ersetzt. Mit ¯%%® wird ein echtes "%" Zeichen in die Kommando- zeile gesetzt. Die Bildschirminitialisation h„ngt von der Extension des Programmes ab, und nicht von der Einstellung von GEM. 2.5 Benutzer von Saved! Wenn Sie die Path-Funktion Saved!s benutzen und Ihr System zum automatischen Laden von GENST.PRG mit einem Doppelklick auf die Quelldatei konfiguriert haben, gilt die Einschr„nkung nicht, daá sich GENST.PRG und Ihre Quelltexte im gleichen Ordner befinden mÂssen. Der Editor sucht nach der GENST2.INF-Datei zuerst im aktuellen Ordner (der Ordner, in dem sich die Datei befindet, auf die Sie geklickt haben), und dann in den Ordnern des Paths. Wenn Sie die Vorein- stellungen sichern, wird die Datei an der Stelle gesichert, an der sie gefunden wurde. Sie kâ€nnen Saved! mit dem TastaturkÂrzel Shift-Clr aufrufen. Dies funktioniert nur, wenn das Accessory auf Ihrer Bootdiskette SAVED!.ACC oder SAVED.ACC heiát. 2.6 Der Assembler GenST Der Assembler von Devpac ST, GenST, ist fÂr die Version 2 vâ€llig neu geschrieben worden. Nur so ist es mâ€glich gewesen, die gewÂnschten Verbesserungen zu machen. Einige der neuen Merkmale von GenST2 sind die Assemblierungsgeschwindigkeit von bis zu 75000 Zeilen pro Minute, Symbolsignifikanz von 127 Zeichen und die INCBIN- Direktive, mit der eine Bin„rdatei, wie z.B. eine Bildschirmgrafik, direkt in Ihr Programm eingebunden werden kann. GENST generiert Code, der ebenso mit Pascal Plus linkbar ist. GenST gibt es in zwei AusfÂhrungen: einmal direkt vom Editor aus aufrufbar und einmal als alleinstehendes Programm. 2.7 Den Assembler aufrufen 2.7.1 Vom Editor aus Sie kâ€nnen vom Editor aus durch W„hlen der "Assemblieren"-Funktion im Programm-Men oder mit Alt-A den Assembler aufrufen. Programmtyp Hier w„hlen Sie zwischen ausfÂhrbarem, GST-linkbarem oder DRI- linkbarem Code. Die Unterschiede zwischen den drei Programmtypen werden sp„ter genau erkl„rt. Grož/Klein Hier kâ€nnen Sie w„hlen, ob bei Symbolen Unterschiede wegen der Groá- oder Kleinschreibung gemacht werden sollen. Wenn Sie "gleich" w„hlen, dann sind die Symbole "Start" und "start", vom Assembler aus gesehen, dasselbe Symbol; wenn "Verschieden" gew„hlt wird, sind die beiden zwei verschiedene Symbole. Debug-Information Wenn Sie Ihr Programm noch debuggen, ist es nÂtzlich, daá die Symbole im fertigen Programm enthalten sind. Die Symboloptionen sind "Normal" und "Erweitert": das HiSoft- erweiterte Debug-Format erlaubt es, bis zu 22 Zeichen lange Symbole anstatt der Âblichen 8 Zeichen L„nge zu verwenden. Listing Sie kâ€nnen hiermit die Ausgabe des Listings w„hlen: auf dem Drucker, auf Diskette, auf der eine Datei mit gleichem Namen und der Extension .LST angelegt wird, oder auf den Bildschirm. Wenn Sie keine Ausgabe wollen, kâ€nnen Sie auch diese Option w„hlen. Assemblieren Hier kâ€nnen Sie die Geschwindigkeit des Assemblers bestimmen. Normalerweise sollten Sie den Schnell-Knopf bet„tigt lassen, wenn jedoch der Speicerplatz zu gering wird, sollten Sie Langsam w„hlen. Dadurch wird der Assembler gezwungen, so wenig Platz wie mâ€glich zu belegen und den Zugriff auf Diskette zu verlangsamen. In der .TTp-Version wird der Langsam-Modus mittels der Option -M in der Kommandozeile eingeschaltet. Output Wie bereits erw„hnt, kâ€nnen Sie hier w„hlen, welches Programm aus Ihrem Quelltext erzeugt wird. "Nein" heiát, daá nur ein Syntaxcheck gemacht wird und kein Programm erzeugt wird. "Speicher" heiát, daá das Programm in den Speicher assembliert wird, und so bereitsteht, um von MonST debuggt zu werden, oder auch einfach zur AusfÂhrung gebracht wird. Es wird kein Diskettenzugriff gemacht, auáer dann, wenn eine Include-Datei gebraucht wird, die meistens nur ein Mal gelesen wird; bei der Version 1 wurde eine Include- Datei immer zweimal gelesen. Diskette bedeutet, daá das Program wie gewohnt auf Diskette erzeugt wird. Die Regeln der Namensgebung fÂr die Dateien werden in KÂrze erl„utert. Wenn Sie alle gewÂnschten Optionen gew„hlt haben, klicken Sie auf "Assemblieren" oder drÂcken Sie Return. Der Ablauf wurde oben schon erl„utert. 2.8 Der Stand-alone-Assembler Wenn Sie die .TTP-Version des Assemblers aufrufen, werden Sie nach einer Kommandozeile gefragt; die Kommandozeile hat das unten beschriebene Format. Wenn Sie keine Kommandozeile Âbergeben wollen, geben Sie nur Return ein, Sie kehren dann zum Desktop zurÂck. Am Ende des Assembliervorganges wird auf einen Tastendruck gewartet. Wenn dem Assembler beim Aufruf keine Kommandozeile Âbergeben wurde, wird kein Tastendruck abgewartet, da angenommen wird, daá der Assembler von einem CLI oder einer Batch-Datei aus aufgerufen wurde. 2.8.1 Format der Kommandozeile Die Kommandozeile hat das Format Hauptdatei <-Optionen> [-Optionen] Die Hauptdatei ist der Name der Datei, die assembliert werden soll; wenn keine Extension angegeben wurde, wird .S angenommen. Optionen sollte ein "-" Zeichen voranstehen. Erlaubte Optionen sind (zusammen mit den „quivalenten OPT- Direktiven): B keine Bin„rdatei erzeugen C GROá/klein egal (OPT C-) D Debug (OPT D+) L GST-linkbarer Code (OPT L+) L2 DRI-linkbarer Code (OPT L2) O Name der erzeugten Datei, folgt dem O ohne Leerschritt dazwischen P Name der Listing-Datei, folgt dem P ohne Leerschritt dazwischen Q In jedem Fall auf einen Tastendruck am Ende warten T Der Tab-Abstand; die Zahl folgt dem T ohne Leerschritt; In der .TTp-Version wird die Tab-Einstellung durch die Option -Txx ge„ndert, z.B. -T10. X Erweiterter Debug (OPT X+) Wenn keine Optionen auf der Kommandozeile angegeben werden, wird eine ausfÂhrbare Programm-Datei erzeugt, deren Name auf dem der Source-Datei basiert, allerdings ohne Listing und mit Unterscheidung zwischen Grož- und Kleinschrift. Beispiele: test -b assembliert die Datei test.s ohne eine Datei zu erzeugen; dies w„re ein Syntaxcheck, mehr nicht. test -om:test.prg -p assembliert test.s in die Datei m:test.prg und erzeugt eine Listing-Datei namens test.lst. test -l2dpprn: -t10 assembliert test.s in DRI-linkbares Format mit vollst„ndiger Debug- Information und schickt das Listing an die parallele Schnittstelle. Wenn Sie ein Listing an die serielle Schnittstelle senden wollen, mÂssen Sie AUX: angeben. Der Tab-Abstand des Listings betr„gt 10 Zeichen. 2.8.2 Dateinamen In GenST ist geregelt, wie der Name einer Ausgabedatei kreiert wird. Der Name ist auáerdem abh„ngig von den angegebenen Optionen, wie z.B. -O, und der OUTPUT- Direktive. Wenn ein Dateiname explizit angegeben wird, dann ist Name=angegebenerName Wenn die Output-Direktive nicht benutzt wurde, dann ist Name=Source-Name + .PRG .BIN oder .O Wenn die Output-Direktive eine Extension angibt, dann ist Name=Source-Name + Extension vom Output Sonst ist Name=Name vom Output 2.9 Der Assembliervorgang GenST ist ein Zwei-Pass-Assembler; w„hrend des ersten Passes wird der Quelltext im Speicher, ggf. auch von Diskette, verarbeitet und eine Symboltabelle gebildet. Wenn Syntaxfehler w„hrend des ersten Passes gefunden wurden, werden diese angegeben, der zweite Pass wird nicht gestartet. W„hrend des zweiten Passes werden die mnemonischen Befehle in bin„re Instruktionen umgewandelt, ein Listing kann ausgegeben - wenn erforderlich mit einer Symboltabelle - und eine Bin„rdatei erzeugt werden. W„hrend des zweiten Passes gefundene Fehler und Warnungen werden angegeben. W„hrend des Assemblierens kann jede Bildschirmausgabe mit Ctrl-S angehalten werden und mit Ctrl-Q weiterlaufen. Mit Ctrl-C kann der Assembler abgebrochen werden; die bis dahin erzeugte Datei ist aber unvollst„ndig und sollte nicht ausgefÂhrt werden. 2.9.1 In den Speicher assemblieren Um die turn-around-Zeiten so gering wie mâ€glich zu halten, kann GenST in den Speicher assemblieren, damit Ihr Programm sofort ausgefÂhrt oder mit Hilfe von MonST sofort debuggt wird. Um dieses zu erreichen, wird der sog. Programmspeicher benutzt, dessen Grâ€Ã¡e in der Assemblierungs-Dialogbox einzustellen ist. Wenn Sie ohne Debug- Information arbeiten, kann der gesamte Programmspeicher fÂr Ihr Programm benutzt werden; wenn Sie aber mit Debug arbeiten, wird der Programmspeicher sowohl mit Ihrem Programm als auch mit der Debug- Information gefÂllt. Ein Programm, das im Speicher ausgefÂhrt wird, ist ein normales GEMDOS-Programm. Es sollte daher mit einem pterm- oder pterm0-Aufruf beendet werden, wie z.B. clr.w -(sp) trap #1 Programme kâ€nnen sich selbst modifizieren, sind aber bei einer erneuten AusfÂhrung wieder im Urzustand. Die Programmspeichergrâ€Ã¡e und die in der Dialogbox eingestellten Optionen des Assemblers werden beim Abspeichern der Voreinstellungen mit abgespeichert. 2.9.2 Arten der Bin„rdateien Es gibt sechs verschiedene Typen von Bin„rdateien, die GenST produzieren kann. Sie unterscheiden sich „uáerlich an den Extensions. .PRG Ein GEM-Programm, welches Fenster benutzt .TOS Ein TOS-Programm, welches keine Fenster benutzt .TTP Ein TOS-Programm, welches eine Kommandozeile braucht .ACC ein Desk-Accessory .BIN nicht ausfÂhrbare, linkbare Datei im GST-Format .O nicht ausfÂhrbare, linkbare Datei im DRI-Format Die ersten drei Arten kâ€nnen vom Desktop aus mit einem Doppelklick ausgefÂhrt werden; sie unterscheiden sich in der Vorbereitung, die das Betriebssystem macht, bevor das Programm ausgefÂhrt wird. Bei einer .PRG Datei wird der Bildschirm gelâ€scht und mit dem Muster des Desktops versehen; auáerdem wird an der Bildschirmoberseite Platz fÂr eine MenÂleiste gemacht. Bei TOS- und TTP-Programmen wird der Bildschirm bis auf die Hintergrundfarbe gelâ€scht, ein blinkender Cursor an den oberen linken Bildschirmrand gesetzt und die Maus ausgeschaltet. Wenn Sie auf ein TTP-Programm doppelklicken, dann erscheint vor Programmaufruf eine Dialogbox, in der Sie eine Kommandozeile dem Programm Âbergeben kâ€nnen. .ACC-Dateien sind zwar ausfÂhrbar, jedoch nicht vom Benutzer. Sie werden vom AES w„hrend des Bootvorganges oder w„hrend eines Wechsels der Bildschirmauflâ€sung geladen und initialisiert. .BIN- und .O-Dateien kâ€nnen nicht ausgefÂhrt werden; sie mÂssen erst von einem Linker verarbeitet werden - meist zusammen mit anderen linkbaren Dateien - um zu einem vollst„ndigen Programm zu werden. Es gibt auf dem ST zwei Standard-Formate, n„mlich das GST-Format und das DRI-Format. Die Unterschiede zwischen diesen Formaten werden sp„ter erl„utert. Die einzige Ausnahme von diesen Regeln sind Programme, die im AUTO- Ordner ausgefÂhrt werden. Sie mÂssen die Extension .PRG haben, obwohl sie TOS-Programme sein mÂssen. 2.1O Verschiedene Ver„nderungen gegenÂber der Version 1 Es gibt drei reservierte Symbole: __LK, __RS und __G2. Ihre Bedeutungen werden sp„ter erl„utert. Es gibt drei neue Operatoren, die alle mit der Priorit„t unterhalb der Addition und der Subtraktion liegen: Gleichheit (=), kleiner als (<) und grâ€Ã¡er als (>). Oktale Konstanten kâ€nnen jetzt mit "@" bezeichnet werden. Wenn Sie die Adressierungsart >>Adreáregister indirekt<< mit Index benutzen, kâ€nnen Sie den Offset weglassen. move.l (a3,d2.l),d0 wird als move.l 0(a3,d2.l),d0 assembliert. Die Daten- und Adreáregister kâ€nnen auch als R0 bis R15 bezeichnet werden, um Kompatibilit„t mit anderen Assemblern zu gew„hrleisten. R0-R7 entsprechen D0-D7, R8-R15 entsprechen A0-A7. 2.1O.1 Lokale Labels GenST2 unterstÂtzt lokale Labels. Dies sind Labels, die einem bestimmten Teil des Sources angehâ€ren. Sie beginnen mit einem Punkt (".") und sind vom vorhergehenden nicht-lokalen Label abh„ngig. l„nge1 move.l 4(sp),a0 .loop tst.b (a0)+ bne.s .loop rts l„nge2 move.l 4(sp),a0 .loop tst.b -(a0) bne.s .loop rts Es gibt zwei Labels namens .loop, von denen das erste zu l„nge1, das zweite zu l„nge2 gehâ€rt. Um Verwechslung mit Adressierungsarten zu vermeiden, sind .W und .L nicht als lokale Labels zul„ssig. Eine besondere Form eines lokalen Labels ist die Form 1234$, das aus Dezimalzahlen besteht und mit >>$<< endet.k Dadurch ist Kompatibilit„t mit anderen Assemblern gegeben. 2.1O.2 Erweiterungen des Befehlssatzes Der vollst„ndige 68000er-Befehlssatz wird von GenST2 unterstÂtzt. Es gibt aber stilistische AbkÂrzungen, die GenST2 auch akzeptiert: Condition Codes Die alternativen Condition Codes HS und LQ, „quivalent mit CC und CS, werden bei Bcc, DBcc und Scc unterstÂtzt. Branch-Befehle Um einen kurzen Branch explizit anzugeben, benutzen Sie Bcc.B oder Bcc.S. Einen Branch mit Wort-L„nge geben Sie mit Bcc.W an; Sie kâ€nnen aber auch den Optimierer die Branch-L„nge w„hlen lassen. Bcc.L wird aus Kompatibilit„tsgrÂnden zu GenST1 beibehalten, obwohl es genaugenommen ein 68020-Befehl ist; beim Vorkommnis eines Bcc.L wird eine Warnung generiert. Ein BRA.S zum darauffolgenden Befehl ist nicht erlaubt und wird, mit einer Warnung, in einen NOP verwandelt. Ein BSR.S zum darauffolgenden Befehl ist nicht erlaubt und erzeugt einen Fehler. BTST BTST ist einzigartig unter den bit-test-Befehlen, weil es PC-relative Adressiermodi unterstÂtzt. CLR CLR an ist nicht erlaubt, benutzen Sie statt dessen SUB.L An,An; die Flags werden von diesem Befehl aber nicht beeinfluát. CMP Wenn der Source-Operand immediate ist, wird CMPI erzeugt, wenn der Ziel-Operand ein Adreáregister ist, wird CMPA benutzt. Wenn die Adressierungsarten beider Operanden post-inkrement benutzen, wird ein CMPM generiert. DBcc DBRA wird fÂr DBF akzeptiert. ILLEGAL Das Wort $4AFC wird generiert. LINK Wenn der Wert positiv oder ungerade ist, wird eine Warnung ausgegeben. MOVE from CCR Dies ist ein Befehl der Prozessoren 68010 und hâ€her. Es wird in ein >>MOVE from SR<< konvertiert. MOVEQ Wenn der Wert im Bereich 128 bis 255 inklusive ist, wird eine Warnung ausgegeben. Wenn Sie ausdrÂcklich ein .L angeben, wird keine Warnung erzeugt. 2.1O.3 Assembler-Direktiven INCBIN Dateiname Mit dieser Direktive wird eine Datei vollst„ndig in Ihr Programm miteinbezogen. Dies ist z.B. nÂtzlich fÂr Grafiken, die mit anderen Programmen erstellt wurden und von Ihrem Programm in bin„rer Form benutzt werden; es entf„llt eine Konvertierung in DC-Direktiven. INCBIN startet an einer geraden Grenze und wird mit einem Nullbyte gebaddet, wenn die Datei eine ungerade L„nge besitzt. OPT Es gibt verschiedene neue Optionen, aber auch solche, die sich gegenÂber der Version 1 ver„ndert haben. Option A - Auto-PC Um AusfÂhrzeit zu sparen und die Programmgrâ€Å¾e zu reduzieren, kann die Option A+ verwendet werden. Sie erlaubt Automatik-PC- Modus, wo immer er mâ€glich ist. Die Zeile MOVE.L int_in,do wÅ¡rde zu MOVE.L int_in(pc),do assembliert werden. Dadurch wird jeoch kein positionsunabh„ngiger Code erzeugt. A+ kann z.B. im Programm GEMTEST effektiv eingestellt werden. Unter Umst„nden wird die Option nicht beachtet, z.B. beim Lesen des absoluten Speichers, oder wenn der Ausdruck .L gebraucht wird. C Grož/klein-Unterscheidung und Signifikanz Standardm„áig unterscheidet GenST2 zwischen Groá- und Kleinschreibung von Labels. Labels haben standardm„áig eine Signifikanz von 127 Zeichen, d.h. daá die ersten 127 Zeichen eines Labels zur Unterscheidung von anderen Labels bewertet werden. Sie kâ€nnen, wie bei GenST1, C- angeben, wenn keine GROá/klein-Unterscheidung gemacht werden soll. Sie kâ€nnen auch die Signifikanz ver„ndern, indem Sie eine Dezimalzahl zwischen dem C und dem + oder - angeben, z.B. C16+ um eine Signifikanz von 16 Zeichen mit einer Grož/klein-Unterscheidung einzustellen. L Linker-Modus Standardm„áig produziert GenST ausfÂhrbaren Code. Mit L+ wird GST-linkbarer Code erzeugt, mit L2 wird DRI-linkbarer Code erzeugt. Mit L- kann ausdrÂcklich ausfÂhrbarer Code erzeugt werden. Eine OPT-L- Direktive muá in der allerersten Zeile der Quelldatei stehen. O Optimierung GenST2 besitzt die F„higkeit, manche Befehle in kÂrzere oder schnellere zu verwandeln. Standardm„áig wird zwar keine Optimierung vorgenommen, jedoch kann jede Art von Optimierung wahlweise hinzugeschaltet werden. O1+ Optimiert RÂckw„rts-Branches wenn mâ€glich, kann mit O1- wieder abgeschaltet werden O2+ Optimiert Adreá-Register indirekt mit Offset in Adreáregister. Wenn der Offset Null ist, kann mit O2- abgeschaltet werden. move.l Wert(a0),d3 wird zu move.l (a0),d3 wenn Wert gleich Null O+ schaltet alle Optimierungen an. O- schaltet alle Optimierungen ab. OW- schaltet die mit den Optimierungen verbundenen Warnungen aus. Kann mit OW+ wieder eingeschaltet werden. P Positionsunabh„ngigkeit Wenn diese Option mit P+ zugeschaltet wird, wird der erzeugte Code auf Positionsunabh„ngigkeit hin geprÂft. Wenn ein Befehl nicht positionsunabh„ngig ist, wird ein Fehler erzeugt. Mit P- kann die Option wieder ausgeschaltet werden; die Option ist dann im Standardzustand. T Typen-Å¡berprÂfung GenST2 kann Programmierfehler entdecken, indem es AusdrÂcke dahingehend prÂft, ob sie absolut oder relativ sind. Da fÂr manche Anwendungen und Programmierstile eine solche Meldung hinderlich sein kann, ist sie mit T- aus-, und mit T+ wieder einschaltbar. main bsr init lea main(a6),a0 move.l (main).w,a0 Diese Zeilen wÂrden normalerweise einen Fehler erzeugen, da >>main<< ein relativer Ausdruck ist und GenST in beiden F„llen einen absoluten Ausdruck erwartet. Falls aber der Code auf einer anderen 68000er-Maschine laufen soll, kann dies zul„ssig sein: also mÂáte T- angegeben werden. U Lokale Labels mit "_" Mir U+ kâ€nnen Sie angeben, daá lokale Labels mit "_" anstatt mit einem Punkt beginnen. Diese Option exisiert, um Kompatibilit„t mit Compilern der Firma Prospero zu gew„hrleisten. X Erweiterter Debug Dies ist eine erweiterte Version der Option D. Hiermit werden Symbole mit bis zu 22 Zeichen L„nge anstatt maximal 8 Zeichen wie bei D ausgegeben. Zusammenfassung der Optionen: Alle Optionen GenST2s werden hier zusammengefaát. Die Standardeinstellungen werden in Klammern angegeben. C Grož/Klein-Unterscheidung und Signifikanz (C127+) D Debug-Information (D-) L- ausfÂhrbarer Code (Standard) L+ GST-linkbarer Code L2 DRI-linkbarer Code M Makro-Expansion (M-) O Optimierungen (O-) P auf Positionsunabh„ngigkeit prÂfen (P-) S Symboltabelle ins Listing (S-) T Typen-Å¡berprÂfung (T+) W Warnungen (W+) U Lokale Labels mit "_" (U-) X Erweiterter Debug (X-) <Label>DCB.B Anzahl,Wert <Label> DCB.W Anzahl,Wert <Label> DCB.L Anzahl,Wert Diese Direktive erlaubt es, Datenblâ€cke bestimmter Grâ€Ã¡e mit konstantem Wert zu erzeugen. "Zahl" gibt die Grâ€Ã¡e des Blocks an, "Wert" den sich wiederholenden Wert. OUTPUT Dateiname Mit dieser Direktive l„át sich der Name der Ausgabe-Datei bestimmen. Wenn der angegebene Dateiname mit einem Punkt anf„ngt, wird nur die Extension der erzeugten Datei beeinfluát. Der Name wird sonst nach den oben beschriebenen Regeln gebildet. __G2 (reserviertes Symbol) Dieses Symbol kann mit der IFD-Bedingung verwendet werden, um festzustellen, ob mit GenST2 assembliert wird. Der Wert dieses Symbols ist die Version des Assemblers und immer absolut. <Label> REPT Ausdruck ENDR Oft ist es nÂtzlich, einen oder mehrere Befehle zu wiederholen. Mit REPT ist dies durchfÂhrbar. Die zu wiederholenden Befehle werden zwischen REPT und ENDR eingegeben. Die Anzahl der Wiederholungen wird vom angegebenen Ausdruck bestimmt. Wenn der Ausdruck Null oder negativ ist, wird kein Code generiert. REPTs kâ€nnen nicht verschachtelt werden. REPT 512/4 einen Sektor kopieren move.l (a0)+,(a1)+ ENDR Dies ist ein Beispiel, um die Wirksamkeit des REPT zu zeigen: so muá im Quelltext nicht 128mal die move.l Zeile stehen. Vorsicht: Man sollte keine Labels innerhalb eines REPTs definieren, da es sonst zu mehrfach definierten Labels und den dazugehâ€rigen Fehlermeldungen kommt. LIST Zus„tzlich zur LIST-Direktive gibt es jetzt LIST+ und LIST-. Ein Z„hler wird bei jedem LIST+ um eins hâ€her gesetzt und bei jedem LIST- um eins erniedrigt. Wenn der Z„hler Null oder positiv ist, wird ein Listing ausgegeben; wenn der Z„hler negativ ist, wird kein Listing erzeugt. Der normale Z„hlerwert ist -1 (kein Listing), auáer dann, wenn beim Assemblerstart ein Listing angefordert wird, wodurch der Z„hler auf Null gesetzt wird. So haben Sie eine flexiblere Kontrolle Âber Listings, besonders bei Include-Dateien. LIST alleine setzt den Z„hler auf 0, NOLIST auf -1. SUBTTL-String Ein "Unter"-Titel wird hiermit angegeben, er kann in Hochkommas ("'") eingegrenzt sein. Die erste Direktive setzt den Unter-Titel der ersten Seite usw. FORMAT Parameter<,Parameter,...> Hiermit kâ€nnen Sie das Format einer Zeile im Listing bestimmen. Jeder Parameter entspricht einem Feld im Listing und besteht aus einer Zahl von 0 bis 2, gefolgt von einem "+" (um das Feld darzustellen) oder "-": 0 Zeilennummer, dezimal 1 SECTION-Name bzw. -Zahl und PC 2 Hex-Daten in Worten, bis zu 10 Wâ€rter (auáer, wenn der Drucker breiter als 80 Zeichen ist) Label = Ausdruck Das Gleichheitszeichen kann anstatt EQU benutzt werden. Label REG Registerliste Mit der REG-Direktive kâ€nnen Sie einem Symbol eine Registerliste zur Verwendung mit MOVEM zuordnen. Somit wird die Gefahr verringert, am Anfang und am Ende einer Routine unterschiedliche Registerlisten zu haben. Mit REG definierte Symbole kâ€nnen ausschlieálich mit MOVEM benutzt werden. RSSET Ausdruck Mit RSSET kâ€nnen Sie dem RS-Z„hler einen bestimmten Wert zuordnen. __RS (reserviertes Symbol) Dieses reservierte Symbol enth„lt den gegenw„rtigen Wert des RS-Z„hlers. Bedingte Blâ€cke Bedingte Blâ€cke kâ€nnen mit GenST2 bis zu 65535 Stufen tief verschachtelt werden. IIF Ausdruck Instruktion Dies ist eine Kurzform von IFNE und betrifft nur eine Zeile; ein ENDC sollte nicht mit IIF benutzt werden. 2.11 Makros Makros kâ€nnen jetzt bis zu 36 Parameter haben. Die Parameter beginnen wie bei GenST1 mit einem Backslash ("\"). Die zul„ssigen Parameter- Bezeichner sind die Zahlen 1-9 fÂr die ersten neun Parameter, und a-z oder A-Z fÂr die restlichen 26 Parameter. \0 beh„lt die gleiche Bedeutung wie bei GenST1. Es gibt eine besondere Form einer Makro-Expansion. Sie kâ€nnen ein Symbol in eine dezimale oder hexadezimale Zahlensequenz verwandeln. Die Syntax ist \<Symbol> oder \$<Symbol>; das Symbol muá definiert und absolut sein. Ein Makro-Aufruf kann Âber mehrere Zeilen gemacht werden; dies ist nÂtzlich bei Makros mit vielen Parametern. Um als Makro erkannt zu werden, muá eine Zeile mit einem Komma beendet werden, das erste Zeichen der n„chsten Zeile muá ein "&" sein, gefolgt von Leerschritt(en) oder Tab(s) und den weiteren Parametern. Die Verschachtelung von Macro-Aufrufen ist nur durch den Arbeitsspeicher begrenzt; Rekursion ist also mâ€glich. Die Namen der Makros werden in einer separaten Symboltabelle gespeichert und kâ€nnen daher nicht mit anderen Symbolen gleichen Namens kollidieren; auáerdem kann der Name des Makros mit einem Punkt beginnen. Ein Beispiel mit numerischer Substitution: vname MACRO dc.b \1,\<version>,0 ENDM . . version equ 42 vname <'Buchstabensuchprogramm v'> wird expandiert zu: dc.b 'Buchstabensuchprogramm' v','42',0 Beispiel eines komplexen Makro-Aufrufs: Nehmen wir an, daá ein Programm eine komplizierte Tabellenstruktur hat, die eine variable Anzahl von Feldern beinhaltet. Ein Makro kann z.B. auch dafÂr geschrieben werden, daá angegebene Parameter verwendet werden: Tabellen_Eintrag MACRO dc.b .end\@-* L„ngenbyte dc.b \1 immer IFNC '\2','' dc.w \2,\3 2. und 3. ENDC dc.l \4,\5,\6,\7 IFNC '\8','' dc.b '\8' text ENDC dc.b \9 .end\@ dc.b 0 ENDM * Beispiel eines Aufrufs Tabellen_Eintrag $42,,,t1,t2,t3,t4, & <Namen eingeben:>,%0110 Dies ist ein gutes Beispiel um zu zeigen, daá Makros das Programmieren enorm erleichtern kâ€nnen. In diesem Fall wird mit einer Datenstruktur gearbeitet, die aus einem L„ngenbyte (im Makro mit Hilfe von \@ errechnet), zwei optionalen Wâ€rtern, vier Langwâ€rtern, einem optionalen String, einem Byte, und einem Nullbyte besteht. Der Code, der aus diesen Beispiel resultiert, sieht so aus: dc.b .end_001 dc.b $42 dc.l t1,t2,t3,t4 dc.b 'Namen eingeben:' dc.b %0110 .end_001 dc.b 0 2.12 Ausgabedatei-Formate GenST2 ist sehr flexibel, was Dateiformate angeht. Die verschiedenen Formate, die er erzeugen kann, werden hier erkl„rt und bewertet. Manche Direktiven haben auch je nach Ausgabeformat andere Wirkungen. 2.12.1 AusfÂhrbare Dateien Diese Dateien sind sofort vom Desktop aus ausfÂhrbar. Eine solche Datei kann Symbole und Relozier-Information enthalten. Die normalen Extensionen fÂr diese Art von Datei sind .PRG, .TOS, .TTP und .ACC. Vorteile: Echte BSS-SECTION, Entwicklungszeit wird reduziert (da nicht gelinkt werden muá). Nachteile: Wenn mehr als ein Programmierer am Projekt arbeitet, ist es unpraktisch. 2.12.2 GST-linkbare Dateien Wenn Sie an einem grâ€Ã¡eren Projekt arbeiten oder mehrere Programmierer am Projekt beteiligt sind, oder wenn Sie Maschinenspracheroutinen fÂr eine Hochsprache schreiben, werden Sie wahrscheinlich linkbare Dateien erzeugen wollen. Das GST-Format wird von den meisten in England oder auch anderswo produzierten Hochsprachensystemen unterstÂtzt. Zu diesen Sprachen gehâ€ren HiSoft Basic, Lattice C, Prospero Pascal und Prospero Fortran. Dateien im GST-Format haben meist die Extension .BIN. Vorteile: Sehr flexible Mâ€glichkeiten: importierte Labels kâ€nnen fast Âberall verwendet werden, wie z.B. auch in AusdrÂcken. Libraries kâ€nnen vom Assembler aus erstellt, und durch die verwendete Import-Methode kâ€nnen Typenkonflikte erkannt werden. Nachteile: Aufgrund des Library-Formats kann das Linken l„nger dauern, richtige GEMDOS-SECTIONen werden standardm„áig nicht unterstÂtzt (obwohl LinkST eine BSS-SECTION erzeugen kann). 2.12.3 DRI-linkbare Dateien Dies ist das Original-Linkerformat des ST und wurde ursprÂnglich von Digital Research fÂr CP/M-68K entwickelt. Es wird, meist durch Konvertierungsprogramme, vom Groáteil der in den USA entwickelten Hochsprachensystemen unterstÂtzt. DRI-linkbare Dateien haben meist die Extension .O. Vorteile: Selektives Hinzulinken mit Libraries geht schnell, GEMDOS-SECTIONen werden voll unterstÂtzt. Nachteile: Sehr groáe Einschr„nkungen bei importierten Labels, linkbare Dateien sind doppelt so groá wie ausfÂhrbare Dateien, und Symbole kâ€nnen maximal nur 8 Zeichen lang sein. 2.12.4 Das richtige Format Wenn Sie mit einer Hochsprache zusammenarbeiten, haben Sie meistens keine Wahl: Sie mÂssen das vom Compiler unterstÂtzte Format verwenden. Wenn Sie ausschlieálich in Assembler schreiben, werden Sie wohl das ausfÂhrbare Format benutzen: die Assemblierzeit ist gering, Linken f„llt weg, und Sie kâ€nnen direkt in den Speicher assemblieren, um die Turn-around-Zeiten so klein wie mâ€glich zu halten. Wenn Sie ein grâ€Ã¡eres Programm schreiben, womâ€glich im Team, ist linkbarer Code meist am sinnvollsten. Das GST- Format ist dem DRI-Format weitaus Âberlegen und deshalb auch empfehlenswert. 2.13 Ausgabedatei-Direktiven Hier werden die Direktiven erkl„rt, deren Wirkungen vom Ausgabeformat abh„ngig sind. Die Formate kâ€nnen auf verschiedene Weise gew„hlt werden: Âber die Kommandozeile bei GENST2.TTP, in der Assemblieren-Dialogbox bei GENST2.PRG, oder mit der OPT-L-Direktive am Anfang Ihres Programms. 2.13.1 MODULE und SECTION MODULE Modul-Name Mit diesem Befehl wird der Anfang eines neuen Moduls festgelegt. Der Name muá in AnfÂhrungszeichen stehen, wenn er Leerschritte enth„lt. Diese Direktive ist nicht unumg„nglich, ein Modul namens ANON_MODULE wird automatisch erzeugt. AusfÂhrbar Diese Direktive wird ignoriert. DRI Diese Direktive wird ignoriert. GST Mit dieser Direktive kâ€nnen Sie Maschinensprache-Libraries erstellen. Jedes MODULE ist ein eigenst„ndiges Segment mit eigenen Imports und Exports. Relative Labels gehâ€ren jeweils zum eigenen Modul, Sie kâ€nnen also zwei Labels mit demselben Namen in zwei Modulen benutzen, ohne daá sie kollidieren. Absolute Labels sind fÂr alle MODULE global, was fÂr Konstanten sehr nÂtzlich ist. SECTION Section-Name Diese Direktive verursacht einen Wechsel zu der genannten Section. Ein Programm kann aus mehrereren Sectionen bestehen, die im endgÂltigen Programm mit gleichnamigen Sectionen zusammengefÂgt werden. Wenn nicht anders angegeben, wird Ihr Programm im TEXT SECTION assembliert. Sie kâ€nnen mit diesem Befehl jederzeit in eine andere Section wechseln. AusfÂhrbar Erlaubte Namen fÂr Sectionen sind TEXT (fÂr den Bereich, der das Programm enth„lt), DATA (fÂr initialisierte Daten) und BSS, ein besonderer Speicherbereich, der vom GEMDOS fÂr Ihr Programm reserviert wird. Das BSS enth„lt Nullen beim Programmstart und belegt keinen Platz auf der Diskette. Innerhalb des BSS darf nur die DS- Direktive verwendet werden. Wenn Sie den BSS-Bereich fÂr globale Variablen benutzen, kâ€nnen Sie Platz auf der Diskette sparen. DRI Die obengenannten Regeln fÂr ausfÂhrbare Programme gelten hier auch. GST Es gibt keine Regeln fÂr Namen der Sectionen. Sectionen mit gleichem Namen in verschiedenen Modulen werden beim Linken zusammengefÂgt. Die Anordnung der Sectionen im endgÂltigen Programm h„ngt von der Reihenfolge ab, in der sie von Linker begegnet werden (LinkST hat die SECTION-Direktive, mit der die Reihenfolge zur Linkzeit festgelegt werden kann). Imports und Exports Bei beiden linkbaren Formaten ist es wichtig, Symbole importieren und exportieren zu kâ€nnen, was sowohl fÂr relative Symbole wie Programmlabels als auch fÂr absolute Symbole wie Konstanten gilt. Das GST-Format trifft zwischen den beiden Arten eine Unterscheidung, das DRI-Format dagegen nicht. Das GST-Format erlaubt dem Assembler, die Typen zu ÂberprÂfen, um Programmierfehler zu finden, die sonst vielleicht Âbersehen worden w„ren. XDEF Export<,Export>... Hiermit werden Labels angegeben, die fÂr andere Module zug„nglich gemacht werden sollen. Wenn ein exportierter Label nicht existiert, erscheint eine Fehlermeldung. Es ist nicht mâ€glich, lokale Labels zu exportieren. AusfÂhrbar Diese Direktive wird ignoriert. DRI Alle Symbole werden beim Exportieren auf 8 Zeichen L„nge gekÂrzt; es ist ratsam, OPT C8 zu verwenden. XREF Import<,Import>... XREF.L Import<,Import>... Hiermit werden Labels definiert, die aus anderen Modulen importiert werden kâ€nnen; sie mÂssen dort natÂrlich exportiert worden sein, da sonst eine Fehlermeldung erscheint. Das normale XREF sollte dazu verwendet werden, relative Labels zu importieren, XREF.L wird benutzt, um absolute Labels zu importieren. Sie kâ€nnen ein und dasselbe Label mehrmals importieren. AusfÂhrbar Diese Direktive wird ignoriert. DRI Das DRI-Format unterscheidet zwar nicht zwischen absoluten und relativen Imports, man sollte sie aber trotzdem angeben, damit der Assembler die TypenÂberprÂfung vornehmen kann. Wenn Ihre Imports keine Typen haben, sollten Sie OPT T- angeben. DRI-Labels haben eine Signifikanz von nur 8 Zeichen. GST Importieren Sie nur Labels mit dem richtigen Typ; es kann sonst sein, daá die Relozier-Information des endgÂltigen Programms nicht stimmt. Imports in AusdrÂcken verwenden AusfÂhrbar Es gibt keine Imports. DRI Imports kâ€nnen innerhalb von AusdrÂcken benutzt werden, allerdings nur ein Import pro Ausdruck. Das Ergebnis eines solchen Ausdrucks muá immer Zahl + bzw. - Import sein. Imports kâ€nnen auch mit beliebig komplexen AusdrÂcken kombiniert werden, vorausgesetzt, daá der komplexe Ausdruck vor dem Import angefÂhrt wird: move.l 3+(1<<Z„hler+5)+Import GST Imports kâ€nnen innerhalb von AusdrÂcken benutzt werden, maximal zehn pro Ausdruck. Sie dÂrfen miteinander nur addiert oder subtrahiert werden, kâ€nnen aber mit beliebig komplexen AusdrÂcken kombiniert werden, vorausgesetzt, daá der komplexe Ausdruck vor dem Import angefÂhrt wird: move.l 3+(1<<Z„hler+5)+Import1-Import2 Wo ein Ausdruck mit einem Import benutzt werden darf, h„ngt vom Dateiformat ab. Die folgende Tabelle zeigt die erlaubten Kombinationen: Ausdruck GST DRI Beispiel PC-Byte J N move.w import(pc,d3.w) bsr.s import PC-Wort J J* move.w import(pc),a0 bsr import Byte J N move.b #import,d0 Wort J J move.w import(a3),d0 Langwort J J move.l import,d0 So lange das Symbol nicht in einer anderen Section des Programmes steht, ist dies unzul„ssig. DRI & GST Die Benutzung eines Symbols aus einer anderen Section muá als Import gehandhabt werden und unterliegt den obengenannten Regeln. COMMENT Bemerkung AusfÂhrbar Diese Direktive wird ignoriert. DRI Diese Direktive wird ignoriert. GST Diese Direktive Âbernimmt die angegebene Bemerkung in die .BIN-Datei; zur Linkzeit wird die Bemerkung angezeigt. ORG Ausdruck Diese Direktive l„át den Assembler positionsabh„ngigen Code erzeugen; der PC wird auf den angegebenen Ausdruck gesetzt. Normalerweise brauchen GEMDOS-Programme kein ORG, auch wenn sie nicht positionsunabh„ngig sind; der GEMDOS-Programmlader erledigt die Relozierung des Programms. Die ORG-Direktive erlaubt die Erzeugung von ROM-Code oder Code, der fÂr andere 68000er Rechner gedacht ist. Es darf mehr als ein ORG im Programm stehen, es wird aber kein "Padding" vorgenommen. AusfÂhrbar Diese Direktive sollte mit hâ€chster Vorsicht gehandhabt werden, da das erzeugte Programm wahrscheinlich nicht auf dem ST mit einem Doppelklick problemlos ausfÂhrbar ist. Die erzeugte Datei hat am Anfang den GEMDOS-Header, aber am Ende keine Relozier-Information. DRI Diese Direktive ist nicht erlaubt, die Generierung absoluten Codes ist Aufgabe des Linkers. GST Ein ORG wird dem Linker Âbergeben, der die Datei mit Nullen "paddet". Vorsicht: Es ist hâ€chst unwahrscheinlich, daá diese Direktive sinnvoll ist, wenn in den Speicher assembliert wird. OFFSET <Ausdruck> Hiermit wird die Code-Generierung in eine besondere, Assembler-interne Section umgeschaltet. Der Ausdruck, der nicht angegeben werden muá, setzt den PC dieser Section. Es werden keine Daten auf Diskette geschrieben, innerhalb dieser Section ist nur die DS-Direktive erlaubt. Labels, die innerhalb dieser Section definiert werden, sind absolut. Um einige Systemvariablen des ST zu definieren, s„he der Quelltext so aus: OFFSET $400 etv_timer ds.l 1 wird $400 sein etv_critic ds.l 1 404 etv_term ds.l 1 408 ext_extra ds.l 5 40C memvalid ds.l 1 420 __LK (reserviertes Symbol) Dies ist ein reserviertes Symbol; es kann dazu benutzt werden zu erkennen, welche Code-Art erzeugt wird. Der Wert dieses Symbols ist immer absolut und kann einen der folgenden Werte haben: 0 ausfÂhrbar 1 GST linkbar 2 DRI linkbar DRI Debug Normalerweise werden nur explizit geXDEFte Labels der Symboltabelle der linkbaren Datei beigefÂgt. Das Format erlaubt aber sog. lokale Labels, nicht zu verwechseln mit den lokalen Labels von GenST2, welche keine wahren Exports sind und deshalb nicht von anderen Modulen aus benutzt werden kâ€nnen. Diese Symbole werden aber der Symboltabelle des fertigen Programmes hinzugefÂgt. OPT D+ gibt alle nicht exportierten Labels als DRI-lokale an. GST-Libraries schreiben Wenn Sie eine GST-Library mit Hilfe mehrerer Module in eine Datei schreiben, mÂssen Sie mit RÂckw„rts-Verweisen an Imports vorsichtig sein. Innerhalb einer GST-Library sollten >>high-level<<-Routinen zuerst kommen, >>low-level<<-Routinen zuletzt. Das folgende Beispiel wÂrde nicht fehlerfrei linken: MODULE low_level XDEF low_output low_output ... MODULE high_level XDEF high_output XREF low_output high_output ... Der Grund dafÂr liegt darin, daá das zweite Modul eine Routine aus dem ersten benutzt; dies ist nicht zul„ssig. Die fehlerfreie Version sieht so aus: MODULE high_level XDEF high_output XREF low_output high_output ... MODULE low_level XDEF low_output low_output ... Beispiele fÂr verschiedene Formate: Hier folgen Beispiele, die die Unterschiede zwischen den einzelnen Formaten verdeutlichen. AusfÂhrbar SECTION TEXT start lea string(pc),a0 move.l a0,save_str bsr printstring bra quit SECTION DATA string dc.b 'Ihren Namen bitte: ',0 SECTION TEXT printstring move.l a0,-(sp) move.w #9,-(sp) trap #1 addq.l #6,sp rts SECTION BSS save_str ds.l 1 END DRI linkbar XREF.L quit SECTION TEXT start move.l #string,a0 move.l a0,save_str bsr printstring bra quit SECTION DATA string dc.b 'Ihren Namen bitte: ',0 SECTION TEXT printstring move.l a0,-(sp) move.w #9,-(sp) trap #1 addq.l #6,sp rts SECTION BSS save_str ds.l 1 END Beachten Sie, daá der erste Befehl nicht PC-relativ ist, da keine PC-relativen Verweise zwischen Sectionen erlaubt sind. GST linkbar MODULE TESTPROG COMMENT nicht vollst„ndig XREF.L quit SECTION TEXT start lea string(pc),a0 move.l a0,save_str bsr printstring bra quit SECTION DATA string dc.b 'Ihren Namen bitte: ',0 SECTION TEXT printstring move.l a0,-(sp) move.w #9,-(sp) trap #1 addq.l #6,sp rts SECTION BSS save_str ds.l 1 END 3 LinkST, der Linker LinkST in Devpac ST Version 2 hat sich gegenÂber seinem Vorg„nger nicht so stark ver„ndert wie z.B. GenST oder MonST. Es sind lediglich einige Optionen dazugekommen, die im folgenden beschrieben werden. 3.1 Optionen mit einem Buchstaben Es gibt zwei neue Optionen mit einem Buchstaben: B ein BSS-Segment im Sinne des GEMDOS wird generiert. Voraussetzung ist, daá es eine SECTION namens ¯BSS® gibt. X funktioniert wie die Option D, nur wird anstatt dem DRI-Symbolformat das HiSoft-erweiterte Format in der Symboltabelle des erzeugten Programmes generiert. 3.2 Direktiven in Kontroll-Files Es gibt vier neue Direktiven, die innerhalb eines Kontroll-Files verwendet werden kâ€nnen. SECTION <Name> Mit dieser Direktive wird die Reihenfolge der Sectionen im gelinkten Programm festgelegt. Wie in den zwei mitgelieferten Kontroll-Files sollte die Anordnung so aussehen: section text section data BSS <Name> Mit dieser Direktive benennen Sie die SECTION, die als BSS- Segment beim Linken verwendet werden soll. FÂr Lattice-C Benutzer wÂrde die Zeile nach den vorangegangenen SECTION-Direktiven bss udata heiáen. BSS sollte nie mit DATA zusammen benutzt werden. Die Section, die angegeben wird, sollte niemals Daten ungleich Null enthalten, da sonst die Fehlermeldung ¯non-zero data in BSS section® erscheint. XDEBUG hat die gleiche Wirkung wie die Option X. Es wird eine Symboltabelle im HiSoft-erweiterten Format angelegt. TRUNCATE Es werden alle Symbole auf 8 Zeichen L„nge gekÂrzt. Dies ist dann notwendig, wenn Maschinenspracheroutinen mit langen Labels mit Hochsprachenprogrammen mit kurzen Labels gelinkt werden. 3.3 Lattice-C-Benutzer Es wird eine neue C.LNK-Datei fÂr Lattice C 3.04 mitgeliefert. Wenn Sie dieses Kontroll-File verwenden, reduzieren sich Ihre Link-Zeiten und die Grâ€Ã¡e des erzeugten Programms. Wenn Sie die -n-Option des Compilers benutzen, kâ€nnen Sie das HiSoft-erweiterte-Debug-Format beim Linken angeben; dies ist nÂtzlich, da beim Debuggen mit MonST2 l„ngere, und deshalb Âbersichtlichere Symbolnamen benutzt werden kâ€nnen. 4 MonST Der symbolische Debugger 4.1 Einleitung Programme, die in Maschinensprache geschrieben sind, sind wesentlich anf„lliger fÂr kleine Fehler als solche, die in einer Hochsprache geschrieben sind. Es ist auch durchaus mâ€glich, mit kleinen Fehlern den ganzen Rechner ¯abstÂrzen® zu lassen. Es gibt die verschiedensten Arten von Fehler: triviale Fehler wie ein vergessenes Nullbyte am Ende einer Zeichenkette, Durchschnittsfehler wie ein falsches Ergebnis einer Rechenroutine bis him zum schweren Fehler, der mit einem spektakul„ren Absturz zutage kommt. Um solche Fehler zu finden und zu korrigieren, gehâ€rt zum Paket Devpac ST das Programm MonST. MonST ist ein sog. symbolischer Debugger und Disassembler. Er ermâ€glicht es dem Programmierer, sich Programme und Speicher anzusehen, Programme Schritt fÂr Schritt auszufÂhren, und die meisten Programmierfehler (wie Bus- oder Adreáfehler) ohne Schaden abzufangen. Da MonST symbolisch arbeitet, mÂssen Sie sich nicht mit langen Hex-Ziffern herumschlagen, sondern kâ€nnen sich in Ihrem Programm an Ihren eigenen Labels orientieren. Obwohl MonST ein sog. ¯low-level® Debugger ist, d.h. er arbeitet auf Maschinensprachenebene, ist es auch ohne weiteres mâ€glich, Programme, die in einer Hochsprache geschrieben worden sind, zu ¯debuggen®; die einzige Voraussetzung ist, daá der Hochsprachen- compiler 68000er Maschinencode erzeugt. Es gibt viele Compiler, die die Mâ€glichkeit bieten, Symbole im fertigen Programm zu hinterlassen. So kâ€nnen Sie genau erkennen, in welcher Prozedur Sie sich befinden, w„hrend Sie den erzeugten Code des Compilers auf dem Bildschirm vor sich haben. Wir haben MonST selber zum Debuggen von LinkST, welches in C geschrieben ist, verwendet. MonST und GenST sind beide vollst„ndig in Maschinensprache geschrieben. MonST hat seinen eigenen Bildschirmspeicher. Sie bekommen deshalb keine Probleme, wenn Sie ein Programm mit Grafiken, wie z.B. ein Spiel oder ein GEM-Programm, debuggen; das Programm hat seinen eigenen Bildschirmspeicher, MonST auch. MonST hat auch einen eigenen Bildschirmtreiber und ist deshalb nicht auf das Betriebssystem angewiesen, um seine Bildschirmausgabe zu machen. Sie kâ€nnen so problemlos die Bildschirmausgaberoutinen des AES oder des BIOS ®single-steppen¯, ohne daá der Debugger darunter leidet. Auf der Devpac ST-Originaldiskette befinden sich drei Versionen von MonST: alle sind fast gleich zu bedienen. Auf die Unterschiede wird etwas sp„ter eingegangen. 4.2 Die Exceptions des 68OOO MonST verwendet die Exceptions des 68000 um amok-gelaufene Programme zu stoppen und um ®Single-Steppen¯ zu ermâ€glichen. Es ist deshalb ganz nÂtzlich zu wissen, was normalerweise geschieht, wenn auf dem ST ein Exception passiert. Es gibt verschiedene Sorten von Exceptions: die einen sind absichtliche, die anderen eindeutige Fehler. Wenn ein Exception passiert, werden auf dem SSP (Supervisor-Stack) bestimmte Daten hinterlassen, der Prozessor geht dann in den Supervisor-Modus Âber, und springt zum sog. ®exception handler¯. Dies sind Maschinensprachebefehle, die bei einem Exception (und sonst nie) ausgefÂhrt werden. Wenn MonST geladen ist, f„ngt er manche Exceptions ab, damit kein Schaden passiert. Die verschiedenen Arten von Exceptions, was sie tun, und MonSTs Reaktion darauf sind in der folgenden Tabelle zu sehen: Exception Nr. Exception Auswirkung Auswirkung mit MonST 2 Busfehler Bomben abgefangen 3 Adreáfehler Bomben abgefangen 4 Illegaler Befehl Bomben abgefangen 5 Teilung durch Null Bomben abgefangen 6 CHK Bomben abgefangen 7 TRAPV Bomben abgefangen 8 Privilegverletzung Bomben abgefangen 9 Trace Bomben wird fÂr das Single- Steppen verwendet 10 line 1010 emulator line A Aufruf line A Aufruf Aufruf 11 line 1111 emulator TOS intern TOS intern 32 trap #0 Bomben abgefangen 33 trap #1 GEMDOS Aufruf GEMDOS Aufruf 34 trap #2 AES/VDI Aufruf AES/VDI Aufruf 35-44 trap #3-trap #12 Bomben abgefangen 45 trap #13 XBIOS Aufruf XBIOS Aufruf 46 trap #14 BIOS Aufruf BIOS Aufruf 47 trap #15 Bomben abgefangen Die genauen Ursachen dieser Exceptions werden am Ende dieses Abschnitts genauer erkl„rt, um aber zusammenzufassen: Die Exceptions 2 bis 8 sind Programmierfehler und werden von MonST abgefangen. Exception 9 kann unter Umst„nden durch einen Programmierfehler hervorgerufen werden, wird aber normalerweise von MonST fÂr das ®Single-Steppen¯ benutzt. Die Exceptions 10, 11, 33, 34, 45 und 46 werden vom Betriebssystem gebraucht und werden von MonST nicht bearbeitet. Die restlichen Exceptions werden alle von MonST abgefangen; sie kâ€nnen aber durchaus von einem Programm neu definiert und verwendet werden. Der Eintrag ®Bomben¯ in der obigen Tabelle bedeutet, daá das Betriebssystem des ST versucht, mit dem Fehler fertig zu werden und einige Bomben (bzw. kleine Atompilze) auf dem Bildschirm malt (immer so viel, wie die Exception-Nummer, z.B. zwei Bomben bei einem Busfehler), und dann versucht, das Programm abzubrechen und ins Desktop zurÂckzukehren. Wenn durch den Fehler wichtige Systemvariablen zerstâ€rt wurden, kann es ohne weiteres passieren, daá das System abstÂrzt. Es kann auch sein, daá das System von einer Exception direkt in eine andere ger„t und dadurch der ganze Bildschirm sich mit Bomben fÂllt. 4.3 Speicherbelegung Die interaktiven Versionen von MonST sind zum gleichen Zeitpunkt im Speicher wie das zu debuggende Programm, d.h. MonST wird geladen, es wird nach einem Programmnamen gefragt, und dann das angegebene Programm, gegebenenfalls mit Symbolen, geladen. MonST ist zum Zeitpunkt der Entstehung dieses Schreibens ca. 23Kbyte groá, es benâ€tigt noch zus„tzlich etwa 32Kbyte an Arbeitsspeicher. Dies mag etwas viel erscheinen, MonST braucht aber diesen Speicher, um immer eine Bildschirmseite fÂr sich zu behalten. Die drei mitgelieferten MonST-Versionen heiáen: MONST2.PRG interaktive GEM Version MONST2.TOS interaktive TOS Version AMONST2.PRG auto-residente Version Zuerst werden die ersten beiden Versionen beschrieben, die auto-residente Version wird danach erl„utert, ist aber den ersten zwei Versionen sehr „hnlich. 4.4 MonST starten 4.4.1 Vom Desktop aus Die beiden interaktiven Versionen von MonST sind bis auf die Dateinamen identisch. Die .PRG-Version sollte mit GEM-Programmen verwendet werden, die .TOS-Version sollte mit TOS-Programmen benutzt werden. GEM- und TOS-Programme werden vom Betriebssystem anders gestartet. Weil MonST das zu debuggende Programm startet, muá es selbst auch richtig gestartet werden. Ein GEM-Programm hat einen Hintergrund, Platz fÂr eine MenÂleiste und braucht einen Mauszeiger, TOS-Programme brauchen aber einen blinkenden Cursor, keine Maus und einen leeren Bildschirm. Sie kâ€nnen ein TOS-Programm mit der GEM-Version von MonST debuggen, der Bildschirminhalt kann dann aber ziemlich chaotisch aussehen. Es ist aber keine gute Idee, ein GEM-Programm mit der TOS-Version MonSTs zu debuggen, es kâ€nnen groáe Probleme auftauchen und unter Umst„nden kann das System abstÂrzen; dies sollte auf jeden Fall vermieden werden. 4.4.2 Vom Editor aus Wenn GenST gestartet wird, sucht es automatisch nach MONST2.PRG und l„dt MonST (wenn diese Option nicht anders gew„hlt wurde), falls er vorhanden ist. Der Debugger ist sofort vom Editor aus verfÂgbar. Wenn man Alt-M drÂckt oder im Programm-Men >>MonST<< w„hlt, wird MonST, wie oben beschrieben, aufgerufen, nur wesentlich schneller, da es sich schon im Speicher befindet. Man kann aber auch Alt-D drÂcken oder >>Debuggen<< vom Programm- Men w„hlen. MonST wird so auch aufgerufen, hat aber jetzt zus„tzlich das zuletzt in den Speicher assemblierte Programm bereit, ggf. auch mit Symbolen. Der anf„ngliche Bildschirmmodus wird durch den GEM-Eintrag im Programm-Men gew„hlt. Wenn der Eintrag abgehakt ist, wird die GEM-Bildschirminitialisation vorgenommen, sonst wird der Bildschirm fÂr ein TOS-Programm vorbereitet. Die oben erw„hnten Regeln bezÂglich falscher Bildschirmmodi treffen hier auch zu. 4.5 Symbolisch Debuggen Ein Hauptmerkmal von MonST ist die F„higkeit, die Originalsymbole des Programms beim Debuggen zu benutzen. MonST unterstÂtzt zwei verschiedene Formate von Symbolen: das Standard-DRI-Format, wel- ches maximal 8 Zeichen lange Symbole unterstÂtzt, und das HiSoft- erweiterte Format, welches eine Symboll„nge von maximal 22 Zeichen erlaubt. Sowohl GenST als auch LinkST kâ€nnen beide Formate produzieren; viele andere Hochsprachencompiler unterstÂtzen auch das DRI-Format. Wir versuchen z.Zt. das HiSoft- erweiterte-Format als zweiten Standard einzufÂhren; zum Zeitpunkt des Schreibens dieses Handbuchs unterstÂtzt nur der FTL-Modula-2- Compiler auch das HiSoft-Format. 4.6 Dialog- und Alertboxen MonST verwendet viele Dialog- und Alertboxen, die den GEM- Boxen entsprechen; es sind aber keine. Der Grund dafÂr ist einfach: MonST muá vom Betriebssystem so unabh„ngig wie mâ€glich sein; nur so ist es gew„hrleistet, daá MonST auch unter den schwersten Bedingungen problemlos funktioniert. Auáerdem ist auf die Maus in MonST kein Zugriff vorhanden, da es richtige GEM-Boxen und Buttons nicht unterstÂtzt. Eine MonST-Dialogbox erkennt man daran, daá "ESC um abzubrechen" Âber dem linken oberen Rand steht. In der Box steht der Mitteilungstext und (normalerweise) eine leere Zeile, in der sich der Cursor befindet. Man kann zu jedem Zeitpunkt mit Esc die Dialogbox abbrechen. Die Eingabe erfolgt Âber die Tastatur und die Cursortasten. Die Backspace- und Del-Tasten kâ€nnen zum Editieren der eingetippten Zeile benutzt werden, Clr lâ€scht die eingetippte Zeile bis zum Anfang, genauso wie die Esc-Taste in GEM-Dialogboxen. Die Eingabe wird mit der Return- Taste beendet. Falls eine Zeile einen Fehler enth„lt, wird Return so lange ignoriert, bis die Zeile akzeptabel ist. Dialogboxen, in die mehr als eine Zeile eingegeben wird, lassen keine ZeilensprÂnge durch die Cursor-oben- und Cursor-unten-Tasten zu. Eine MonST-Alertbox ist eine Box, die eine Meldung (meistens eine Fehlermeldung) anzeigt und auf Return oder Esc wartet. 4.7 Die Anzeige am Anfang Wenn Sie MonST Âber Alt-M vom Editor oder vom Desktop aus aufgerufen haben, werden Sie zuerst in einer Dialogbox nach einem Programmnamen gefragt. Wenn Sie ein Programm laden wollen, geben Sie den Programmnamen ein (die Extension ist automatisch .PRG, wenn nicht anders angegeben) und drÂcken Sie Return. Danach werden Sie nach einer Kommandozeile gefragt, die dem Programm Âbergeben werden soll. Wenn das Programm keine braucht, drÂcken Sie einfach wieder Return, und das Programm wird geladen. Wenn Sie kein Programm debuggen wollen, z.B. nur den Speicher des Rechners bearbeiten wollen, dann drÂcken Sie Esc, um direkt in MonST zu gelangen. 4.8 Die MonST-Anzeige Das Anzeigenprinzip von MonST ist dem von alten Groárechnern nachempfunden: damals hatte man immer kleine flackernde L„mpchen an der Vorderseite des Rechners beobachten kâ€nnen um festzustellen, welche Register gerade benutzt wurden. MonST zeigt in wesentlich leserlicherer Form an, was gerade in Ihrem ST passiert. MonST generiert eine Anzeige mit den Registern, Speicherinhalten und disassemblierten Instruktionen, flackernde L„mpchen sind also ÂberflÂssig. Die MonST-Anzeige beim Programmstart besteht aus vier Fenstern; in niedriger Auflâ€sung sieht die Anordnung (platzbedingt) etwas anders aus. Das obere Fenster zeigt die Registerinhalte zusammen mit den Daten, die an der Adresse stehen, die gleich dem Inhalt der Register sind. Fenster 2 ist das Disassemblierungsfenster, in dem mehrere Zeilen disassemblierten Codes zu sehen sind. Die Anfangsaddresse des Fensters ist normalerweise der PC; Das ®’¯-Zeichen ist die momentane Position des PC. Fenster 3 zeigt einen Teil des Speichers sowohl in Hex als auch in ASCII an. Das kleine Fenster ganz unten am Bildschirm enth„lt keine Zahl und wird haupts„chlich fÂr Mitteilungen verwendet. 4.9 Benutzung der Fenster MonST hat immer ein aktuelles Fenster. Dieses Fenster erkennt man daran, daá der Fenstertitel weiá auf schwarz, statt umgekehrt, ist. Die Tab-Taste kann dazu verwendet werden, durch die einzelnen Fenster zu gehen, man kann aber auch Alt zusammen mit der Fensternummer drÂcken um ein bestimmtes Fenster zum aktuellen Fenster zu machen. Das kleine Fenster unten kann nie das aktuelle Fenster werden, da es nur zur Anzeige von Mitteilungen gedacht ist. 4.1O Eingabe von Befehlen Der MonST-Befehlssatz basiert auf einzelnen Tasten, um ein schnelles Arbeiten zu ermâ€glichen. Dies ist zu Anfang natÂrlich etwas gewâ€hnungsbedÂrftig, macht sich aber schon nach geringer Zeit bezahlt. Benutzer von MonST 1 werden viele Befehle wiedererkennen. Vorsicht: Manche Befehle tun fast das gleiche in MonST2, sind aber nicht unbedingt identisch. Allgemein gilt, daá die Alt-Taste die Fenstertaste ist. Alle Befehle, die die Alt-Taste beinhalten, haben Auswirkungen auf Fenster. Befehle kâ€nnen groá- oder kleingeschrieben eingegeben werden. Alle Befehle, die unter Umst„nden katastrophale Auswirkungen haben kâ€nnen, erfordern die Control-Taste. Befehle werden sofort ausgefÂhrt, es braucht nicht nach jedem Befehl Return zus„tzlich eingegeben werden. UngÂltige Befehle werden ignoriert. Die Fenster, deren Daten sich ver„ndert haben kâ€nnten, werden auch nach jedem Befehl auf den neuesten Stand gebracht. MonST ist ein sehr funktionsstarkes und manchmal komplex erscheinendes Programm. Wir sehen natÂrlich ein, daá es unwahrscheinlich ist, daá jeder Benutzer jeden einzelnen Befehl auf Anhieb gebrauchen wird. Deshalb ist dieses Kapitel in zwei weitere Teile gegliedert: einmal eine Einleitung in die Benutzung MonSTs und darauf folgend einen vollst„ndigen Referenzteil. Es ist ohne weiteres mâ€glich, daá Anf„nger und MonST-Neulinge effektiv den Debugger benutzen, auch wenn sie nur die Bedienungsanleitung gelesen haben. Lassen Sie sich aber nicht vom Referenzteil abschrecken: er enth„lt sehr nÂtzliche und wichtige Informationen. 4.11 MonST - eine Probefahrt Es ist nicht unbedingt notwendig, jedes kleine Detail von MonST zu kennnen, um den Debugger ®fahren¯ zu kâ€nnen. In diesem Teil werden anhand eines kleinen Beispiels die wichtigsten Funktionen MonSTs erl„utert. In unserem Beispiel geben Sie das folgende kleine Programm in den Editor ein: Grâ€Ã¡e equ 20 section text moveq #0,d0 lea Ende(pc),a0 moveq #Grâ€Ã¡e-1,d1 Schleife1 move.l d0,(a0)+ dbf d1,Schleife1 moveq #-1,d0 lea Ende(pc),a0 moveq #Grâ€Ã¡e-1,d1 Schleife2 move.l d0,(a0)+ dbf d1,Schleife2 Schluá clr.w -(sp) trap #1 section data Ende dcb.l Grâ€Ã¡e,-1 Das Programm tut nichts anderes als den Bereich von 80 Byte, der mit dem Hex-Wert $FFFFFFFF gefÂllt ist, mit Nullen zu lâ€schen und daraufhin wieder mit $FFFFFFFF zu fÂllen. Wenn dies geschehen ist, gibt das Programm die Kontrolle wieder an das Betriebssystem zurÂck. Assemblieren Sie das Programm in den Speicher und starten Sie MonST mit Alt-D. Sie kâ€nnen auch das Programm auf Diskette assemblieren: speichern Sie die Quelltextdatei unter dem Namen BEISPIEL.S ab. Dann w„hlen Sie als Ziel fÂr den Assembler "Diskette" und "erweiterten Debug"; wenn er fertig ist, mÂáten Sie die Datei BEISPIEL.PRG auf Ihrer Diskette finden. Wenn Sie dann Alt-M drÂcken, fragt MonST nach einem Dateinamen. Geben Sie "BEISPIEL" ein, die Extension .PRG wird automatisch hinzugefÂgt. Mit dieser Prozedur sind Sie am gleichen Punkt angelangt, als ob Sie in den Speicher assembliert und Alt-D gedrÂckt h„tten. Sie sehen in Fenster 2 Ihr Programm in disassemblierter Form. DrÂcken Sie die Tab-Taste einmal, um Fenster 3 zum aktuellen Fenster zu machen. Dann drÂcken Sie Alt-L und geben a0 ein. Sie haben hiermit das Fenster 3 an das Adreáregister A0 gebunden. Die Bedeutung dieser Funktion wird sp„ter klar. DrÂcken Sie Alt-2, um das Disassemblierungsfenster wieder zum aktuellen Fenster zu machen. DrÂcken Sie Ctrl-Y dreimal. Sie werden nach jeder Eingabe sehen, daá der Pfeil, der den PC-Stand anzeigt, einen Befehl weiterrÂckt. Wenn Sie nach dem ersten Ctrl-Y ins Registerfenster schauen, werden Sie sehen, daá der erste Befehl den Wert 0 in das Datenregister D0 gesetzt hat (man sollte nie davon ausgehen, daá ein Register einen bestimmten Wert hat; es kann sein, daá D0 schon 0 ist, dies ist aber von GEMDOS abh„ngig und deshalb nicht unbedingt zutreffend). Das zweite Ctrl-Y l„dt die Adresse von Ende in das Adreáregister A0. Das Fenster 3, welches Sie an A0 gebunden haben, zeigt jetzt auf den Speicherbereich, der "Ende" folgt. Wie Sie sehen, ist der Bereich mit $FFFFFFFF gefÂllt. Der dritte Befehl l„dt den Schleifenz„hler in das Register D1. DrÂcken Sie Ctrl-Y erneut. Sie werden sehen, daá sich im Registerfenster der Wert von A0 um vier erhâ€ht hat, ebenso die Startadresse von Fenster 3. Ein Fenster an ein Register binden heiát also, daá bei jedes Exception die Startadresse des Fensters auf die Adresse des Registers gesetzt wird. Jetzt wollen wir aber nicht unbedingt jedes Mal die Schleife durchgehen. Mit Ctrl-A wird ein Breakpoint nach dem Befehl, der am PC ist, gesetzt, und das Programm dann laufengelassen. Das Setzen von Breakpoints ist eine Funktion von MonST. Wenn Sie ein Breakpoint an eine Adresse setzen, wird das Programm angehalten und MonST aufgerufen, wenn der PC diese Adresse erreicht. Mit Ctrl-A umgehen wir das l„stige Durchlaufen der Schleife, indem wir ein Breakpoint nach dem DBF-Befehl sezten, d.h. nachdem die Schleife zu Ende ist. DrÂcken Sie jetzt also Ctrl-A. Wenn die Schleife zu Ende ist, sind Sie dazu bereit, die zweite Schleife, die wieder $FFFFFFFF in den Speicherbereich fÂllt, auszufÂhren. DrÂcken Sie jetzt Alt-3, um Fenster 3 zum aktuellen Fenster zu machen. DrÂcken Sie wieder Alt-L und geben Sie als Binde-Register diesmal m2 ein. Sie kâ€nnen n„mlich ein Fenster an ein anderes Fenster binden. Die Startadressen der einzelnen Fenster sind in Speichern, die wie Register behandelt werden kâ€nnen, enthalten. Die Startadresse vom Fenster 2, dem Disassemblierungsfenster, ist im Speicher M2 enthalten. Jetzt wird nach jedem Einzelschritt (den wir mit Ctrl-Y machen) das Fenster 3 auf dem n„chsten Befehl stehen; der Unterschied ist aber, daá im Fenster 3 die Befehle als Hex-Zahlen ausgegeben werden und nicht disassembliert sind. Mit Alt-2 wird wieder Fenster 2 zum aktuellen Fenster. Da wir die zweite Schleife auch nicht Schritt fÂr Schritt durchlaufen wollen, benutzen wir einen Breakpoint, um zum Schluá zu kommen. DrÂcken Sie Alt-B und geben Sie Schluá, den Namen des Symbols, ein. Sie werden rechts neben dem Befehl, der an der Adresse von Schlu0 steht, [1] sehen. Dies bedeutet, daá ein Breakpoint mit Wert 1 am Schluá gesetzt wurde. Dann benutzen wir Ctrl-R um das Programm laufen zu lassen. Wenn die Schleife fertig ist, h„lt das Programm an, und zwar am Schluá, wie wir es angegeben haben. Wenn Sie zweimal Ctrl-Y drÂcken, ist das Programm fertig. Wenn Ihr Programm in den Speicher assembliert wurde, springt MonST direkt in den Editor zurÂck. Wenn nicht, meldet MonST "Programmende". Sie kâ€nnten jetzt ein weiteres Programm mit Ctrl-L laden. Wenn nicht, kommen Sie mit Ctrl-C zurÂck zum Editor. Sie haben soeben MonST ®fahren¯ gelernt. Sie kâ€nnen jetzt mit Einzelschritten, einfachen Breakpoints und Fenstern umgehen. Wenn Sie den ersten Teil des Kapitels verstanden haben, lesen Sie im Referenzteil weiter. Er beschreibt ausfÂhrlich alle Funktionen, die MonST zu bieten hat. 4. 12 MonST - Referenzteil 4.12.1 Numerische AusdrÂcke MonST kann numerische AusdrÂcke auswerten, „hnlich wie GenST. Der Hauptunterschied zu GenST liegt darin, da0 MonSTs normale Zahlenbasis in Hex-Code ist, dezimalen Zahlen muá ein ®\¯-Zeichen (kein ¯#® wie in Version 1!) vorangesetzt werden. Es gibt keine Ausdruckstypen (absolut oder relativ), das ®*¯-Zeichen wird nur fÂr die Multiplikation verwendet. Symbole kâ€nnen verwendet werden, die normalerweise ®case-sensitiv¯ sind, d.h. daž ein Unterschied zwischen kleinen und groáen Buchstaben gemacht wird. Sie haben eine Signifikanz von 8 bis 22 Zeichen (je nach Symbolformat). Diese Standardeinstellungen kâ€nnen mit "Voreinstellungen" ver„ndert werden. Register werden mit ihren Namen bezeichnet, z.B. A3 oder D7. Dies sind aber keine Hex-Zahlen. Um die Hex-Zahl A0 anzugeben, muá entweder ein ®$¯-Zeichen der Zahl vorangesetzt werden oder die Zahl Null. A7 bezeichnet immer den User-Stack-Pointer. Es gibt reservierte Symbole, die nicht ®case-sensitiv¯ sind: TEXT, DATA, BSS, END, SP, SR und SSP. END bezeichnet das erste Byte nach dem BSS-Segment, SP ist entweder der Supervisor oder der User-Stack-Pointer, abh„ngig vom Wert des Status-Registers. Es gibt 10 ®Speicher¯, M0 bis M9, „hnlich wie bei Taschenrechnern. Diese Speicher kâ€nnen, wie Register, Werte zugewiesen bekommen. Die Speicher 2 bis 5 enthalten immer die Startadresse der Fenster 2 bis 5; wenn Sie einem dieser Speicher einen neuen Wert zuweisen, ver„ndert sich auch die Anfangsadresse dieses Fensters. Vorsicht: Weisen Sie nie M4 einen neuen Wert zu, wenn Fenster 4 als ®Source¯-Fenster benutzt wird. AusdrÂcke kâ€nnen auch Indirektionen beinhalten: die Zeichen ®{¯ und ®}¯ werden dafÂr benutzt. Indirektion kann auf einer Byte-, Wort-, oder Langwortbasis angegeben werden, wenn das ®}¯ von einem Punkt und der gewÂnschten Grâ€Ã¡e gefolgt wird; der Normalwert ist Langwort. Falls der Pointer ungÂltig ist, entweder weil der Speicher unlesbar oder ungerade (wenn Wort- oder Langwortgrâ€Ã¡e angegeben ist) ist, ist der gesamte Ausdruck ungÂltig. Z.B. wird der Ausdruck {Daten_Anfang+10}.w das Wort, welches an der Adresse Daten_Anfang+10 steht, liefern. Indirektion kann auf gleiche Art wie normale Klammern verschachtelt werden. 4.12.2 Fenstertypen Es gibt vier verschiedene Fenstertypen. Die erlaubten Fenstertypen sind wie folgt: Fensternummer Erlaubte Typen 1 Registerfenster 2 Disassemblierungsfenster 3 Speicher 4 Disassemblierung, Speicher oder ®Source¯ 5 Speicher Registerfenster In einem Registerfenster werden die Inhalte der Datenregister in Hex angezeigt, zus„tzlich der ASCII-Wert des untersten Bytes und die Anzeige (in Hex) der ersten acht Byte, auf die der Registerinhalt zeigt. Die Adreáregister werden auch in Hex angezeigt, zusammen mit den ersten 12 Byte, auf die das Register zeigt. Wie in alle Hex-Anzeigen in MonST werden Werte in nicht lesbaren Speicherstellen mit ** ersetzt. Das Statusregister wird sowohl in Hex als auch als ®Flags¯ dargestellt. Zus„tzlich wird entweder U oder S angezeigt, je nachdem, ob der Rechner sich im Supervisor- oder Usermodus befindet. A7' ist der Supervisor-Stack-Pointer und wird wie ein normales Adreáregister angezeigt. Der Wert des PC ist zusammen mit der Instruktion, die am PC ist, in der untersten Zeile des Registerfensters angezeigt. Wenn die Instruktion eine oder zwei effektive Adressen hat, werden diese zusammen mit dem Speicher, der an dieser(n) Adresse(n) ist, angezeigt. TST.W $12A(A3) ;00001FAE 0F01 Diese Zeile bedeutet, daá der Wert von A3 mit $12A addiert die Adresse $1FAE ergibt. An dieser Adresse ist der Wert $0F01. Ein komplexeres Beispiel ist MOVE.W $12A(A3),-(SP) ;00001FAE 0F01 ’0002AC08 FFFF Der Ursprungsadreámodus ist der wie im ersten Beispiel, die Zieladresse ist dagegen $2AC08, die z.Zt. $FFFF enth„lt. Beachten Sie, daá die Anzeige immer so groá ist wie gerade nâ€tig. MOVEM-Daten werden als Quad-Worte (64 Bit) angezeigt. Wenn Pr„dekrement im Adressierungsmodus verwendet wird, wird dies bei der Adreáberechnung mit in Betracht gezogen. In niedriger Auflâ€sung werden keine Hex-Daten fÂr die Datenregister und nur vier Byte als Daten bei Adreáregistern angezeigt. Es kann auch in niedriger Auflâ€sung vorkommen, daá die Bildschirmbreite nicht groá genug ist, um eine komplexe Zeile (wie das zweite Beispiel) anzuzeigen. Disassemblierungs-Fenster In einem Disassemblierungs-Fenster wird Speicherinhalt in disassemblierter Form angezeigt. Ganz links auf einer Zeile wird die Adresse angezeigt, dann ggf. das Symbol an dieser Adresse, daraufhin der Befehl an dieser Adresse. Falls an dieser Adresse ein ®Breakpoint¯ gesetzt ist, wird dessen Typ in eckigen Klammern, ®[¯und ®]¯, nach dem Befehl angezeigt. Bei Stop- Breakpoints wird angezeigt, wie oft dieser Befehl noch ausgefÂhrt werden muá, bis der Breakpoint aktiv wird und das Programm stoppt. Bei einem Breakpoint mit einer Bedingung enthalten die eckigen Klammern ein Fragezeichen, gefolgt von der Bedingung. Bei Z„hler-Breakpoints enthalten die Klammern ein Gleichheitszeichen und den Z„hlerwert. Bei permanenten Breakpoints ist ein ®*¯ in den eckigen Klammern. Das Format der diassemblierten Instruktionen ist im Motorola- Standard, wie GenST ihn akzeptiert. Alle Text-Daten sind groágeschrieben, bis auf die Symbole, die kleine Buchstaben enthalten. Alle numerischen Daten sind in Hex bis auf die TRAP- Nummern. Vorangehende Nullen und der Hex-Bezeichner ®$¯ werden bei Zahlen kleiner als 10 nicht angezeigt. Wenn erforderlich, werden numerische Daten mit Vorzeichen angezeigt. Die einzige Abweichung vom Motorola-Standard ist die Darstellung der Registerliste des MOVEM Befehls: MOVEM.L D0-D3/A0-A2,-(SP) wird, um Platz zu sparen, als MOVEM.L D0-3/A0-2,-(SP) angezeigt. In niedriger Auflâ€sung ersetzen Symbole die Adresse und werden nur bis zu einer maximalen L„nge von acht Zeichen angezeigt. Speicher-Fenster In einem Speicher-Fenster wird Speicher zeilenweise im Format Hex-Adresse, Hex-Daten und ASCII-Daten angezeigt. Unlesbarer Speicher wird als ®**¯ dargestellt. Die Anzahl der angezeigten Bytes pro Zeile h„ngt von der Breite des Fensters ab und kann maximal 16 Byte betragen. Source-Fenster Sie kâ€nnen im ®Source¯-Fenster ASCII-Dateien, wie z.B. Ihren Programm-Quelltext, „hnlich wie in einem Text-Editor darstellen. Der normale Tab-Abstand ist 8, kann aber mit dem Editieren- Fenster-Befehl auf 4 umgeschaltet werden. 4.12.3 Fenster-Befehle Die Alt-Taste ist die sog. Fenster-Taste, d.h. alle Fenster-Befehle beinhalten die Alt-Taste. Jeder dieser Befehle bezieht sich auf das aktuelle Fenster, also das Fenster, dessen Titel invers dargestellt ist. Das aktuelle Fenster kann gew„hlt werden, indem man entweder die Tab-Taste so oft drÂckt, bis das gewÂnschte Fenster zum aktuellen Fenster wird oder Alt zusammen mit der Nummer des gewÂnschten Fensters drÂckt. Die meisten Fenster-Befehle funktionieren in allen Fenstern unabh„ngig davon, ob sie im ®Zoom¯-Modus sind oder nicht. Wenn ein Befehl keinen Sinn ergibt, wird er ignoriert. Alt-A Adresse setzen Dieser Befehl setzt die Anfangs-Adresse eines Fensters Alt-B Breakpoint setzen Mit diesem Befehl werden Breakpoints gesetzt; Breakpoints werden sp„ter genauer beschrieben. Alt-E Editieren In einem Speicherfenster kann man mit diesem Befehl im Speicher in Hex und ASCII editieren. Hex-Zahlen kâ€nnen mit den Tasten 0-9 und A-F eingegeben werden. Die Cursor-Tasten kâ€nnen dazu benutzt werden, den Cursor im Fenster zu bewegen. Mit der Tab-Taste kâ€nnen Sie zwischen dem Hex- und dem ASCII-Editiermodus hin- und herschalten. Der ASCII-Modus schreibt den ASCII-Wert des Tastendrucks in den Speicher. Um den Editiermodus zu verlassen, drÂcken Sie die Esc-Taste. Im Registerfenster bewirkt Alt-E das gleiche wie Alt-R, n„mlich Register setzen. Im ®Source¯-Fenster kann mit Alt-E der Tab-Abstand zwischen 4 und 8 gew„hlt werden. Alt-F Fontgrâ€Ã¡e Dieser Befehl ver„ndert die Fontgrâ€Ã¡e im aktuellen Fenster. In hoher Auflâ€sung wird zwischen 16 und 8 Pixel groáen Fonts gewechselt; in Farbe wird zwischen 8 und 6 Pixel groáen Fonts gewechselt. Wenn die Fontgrâ€Ã¡e im Register-Fenster ver„ndert wird, werden die Grâ€Ã¡en der anderen Fenster neu berechnet, um sie so groá wie mâ€glich zu machen. Alt-L Fenster binden Mit diesem Befehl kann ein Fenster an ein Register oder an ein anderes Fenster gebunden werden. Nach einer Exception werden die Startadressen aller Fenster neu berechnet und ggf. entsprechend ver„ndert. Um eine Bindung zu lâ€schen, geben Sie in die Dialogbox nichts ein. Fenster 2 ist standardm„áig an den PC gebunden. Um ein Fenster an ein anderes zu binden, mÂssen Sie den entsprechenden Speicher angeben, z.B. M2 fÂr Fenster 2. Alt-O Auswerten Eine Dialogbox erscheint, in der Sie einen Ausdruck eingeben. Dieser wird ausgewertet und in Hex, Dezimal und ggf. als Symbol ausgegeben. Alt-P Drucker Dump Der Inhalt des aktuellen Fensters wird auf dem Drucker ausgegeben. Dieser Befehl kann mit Esc abgebrochen werden. Alt-R Register setzen Mit diesem Befehl kann jedes Register gesetzt werden. Das Register muá angegeben werden, gefolgt von einem Gleichheitszeichen und dem Ausdruck des neuen Registerwerts. Zum Beispiel: A3=A2+4 setzt das Register A3 auf den Wert vom Register A2 mit vier addiert. Sie kâ€nnen z.B. im ®Zoom¯-Modus diesen Befehl dazu verwenden, einem anderen Fenster eine neue Startadresse zu geben. Wenn Sie den ®Zoom¯-Modus verlassen, zeigt das Fenster auf die angegebene Adresse. Alt-S Fenster teilen Dieser Befehl teilt Fenster 2 in die Fenster 2 und 4 oder das Fenster 3 in die Fenster 3 und 5. Jedes neue Fenster ist vom Ursprungsfenster unabh„ngig. Wenn Sie Alt-S ein zweites Mal drÂcken, werden die zwei Fenster wieder zusammengefÂgt. Dieser Befehl wird in niedriger Auflâ€sung ignoriert. Alt-T Typ ver„ndern Dieser Befehl hat nur Wirkung in Fenster 4, welches durch die Teilung von Fenster 2 entsteht, oder wenn Sie eine ASCII-Datei laden. Der Fenstertyp wird zwischen Disassemblierung, Speicheranzeige oder ®Source¯ geschaltet. Alt-Z ®Zoom¯ Das aktuelle Fenster wird mit diesem Befehl auf die volle Bildschirmgrâ€Ã¡e gebracht. Mit Esc oder einem erneuten Alt-Z wird das Fenster wieder auf Normalgrâ€Ã¡e gebracht. Alt-Befehle sind im ®Zoom¯-Modus weiterhin benutzbar. Cursor-Tasten Die Cursor-Tasten werden in Verbindung mit dem aktuellen Fenster benutzt. Ihre Wirkung h„ngt vom Fenstertyp ab. In einem Speicher-Fenster ver„ndern alle vier Cursor-Tasten die Startadresse des Fensters. Mit Shift-oben und Shift-unten kâ€nnen Sie seitenweise hoch und runter "bl„ttern". In einem Disassemblierungs-Fenster ver„ndern Cursor-oben- und Curso-unten- Tasten die Startadresse des Fensters um jeweils eine Instruktion. Cursor-links und Cursor-rechts ver„ndern die Startadresse jeweils um ein Byte. Die Shift-Tasten kâ€nnen wiederum fÂr das seitenweise Bl„ttern benutzt werden. Im ®Source¯-Fenster ver„ndert Cursor-oben und Cursor-unten die Startadresse des Fensters um eine Zeile, die Shift-Tasten ver„ndern die Startadresse um eine Seite. 4.13 Bildschirmumschaltung MonST benutzt seinen eigenen Bildschirmspeicher und seinen eigenen Bildschirmtreiber, um jeden Konflikt mit dem zu debuggenden Programm zu vermeiden. Um ein "Flackern" des Bildschirms beim "Single-Steppen" zu verhindern, wird von der Bildschirm-Anzeige auf die des Programms erst nach 20 msec umgeschaltet. Es ist auch mâ€glich, den Debugger in einer anderen Auflâ€sung wie das zu debuggende Programm zu betreiben; dies geht aber nur mit einem Farbmonitor. V Anderer Bildschirm Dieser Befehl schaltet bis zum n„chsten Tastendruck auf den Bildschirm des zu debuggenden Programms. Ctrl-O Andere Auflâ€sung Dieser Befehl schaltet MonSTs Anzeige zwischen niedriger und mittlerer Auflâ€sung hin und her. Alle Fenster werden neu initialisiert und auf die Standardgrâ€Ã¡en eingestellt. Dieser Befehl hat keine Auswirkung auf das zu debuggende Programm. Dieser Befehl wird bei einem monochromen Monitor ignoriert. Dadurch, daá MonST seinen eigenen Bildschirmspeicher hat, ist es mâ€glich, den Bildschirmspeicher Ihres Programms anzusehen; dies ist bei Grafikprogramm ideal. Vorsicht: Wenn Ihr Programm die Bildschirmauflâ€sung, -position oder die Farbpalette ver„ndert, ob mit dem XBIOS oder direkt per Hardware, ist es wichtig, daá Sie die Bildschirmumschaltung bei den Voreinstellungen, w„hrend Sie diesen Code ausfÂhren, abschalten. Wenn Sie dies nicht tun, bemerkt MonST die Ver„nderungen nicht. Wenn Sie einen Diskettenzugriff durchfÂhren, schaltet der Bildschirm auf den Bildschirm Ihres Programms um. Dies geschieht, um eine mâ€glicherweise erscheinende GEM-Alarmbox (z.B. bei einem Diskettenfehler) sofort sichtbar werden zu lassen, Sie kâ€nnen deshalb sofort darauf reagieren. 4.14 Programmunterbrechung 4.14.1 Shift-Alt-Help Ein laufendes Programm kann mit Shift-Alt-Help unterbrochen werden: durch diese Tastenkombination wird eine Trace-Exception ausgelâ€st. Wenn Sie in MonST zurÂckgelangen, kann es sein, daá sich der PC im Programm befindet oder die Unterbrechung im ROM stattfindet (was bei Programmen der Fall ist, die ausgiebigen Gebrauch vom ROM machen) oder im Line-F- oder dem TRAP-Handler. Wenn Sie sich nicht im Ihrem Programm befinden, raten wir Ihnen, ein Breakpoint an einer entsprechenden Stelle in Ihr Programm zu setzen und mit Ctrl-R das System weiterlaufen zu lassen. Alt-Help ohne Shift lâ€st einen Ausdruck des Bildschirms von Ihrem Programm aus. Wenn Sie versehentlich das Shift vergessen haben, kâ€nnen Sie den Druck mit nochmaligem Alt-Help abbrechen. Es kann sein, daá diese Tastenkombination ignoriert wird, nochmaliges DrÂcken der Tasten mÂáte MonST eingreifen lassen. Diese Kombination hat keine Wirkung, wenn sie innerhalb von MonST gedrÂckt wird. Vorsicht: Ein Programm sollte nie mit Ctrl-C abgebrochen werden, nachdem es innerhalb des ROMs unterbrochen wurde. Dies kann sehr leicht zu einem Absturz fÂhren. 4.14.2 Ctrl-S Eine Anweisung kann durch Ctrl-S abgebrochen werden. Dieser Vorgang ist gleichbedeutend damit, daž der PC x Wâ€rter nach vorne gesetzt wird. Dieser Befehl ist dann angebracht, wenn eine Anweisung seltsame Ergebnisse erzeugen kâ€nnte. 4.14.3 Reset W„hrend Sie sich im Debugger befinden, kâ€nnen Sie mit Ctrl-Alt- Num.Punkt einen Reset durchfÂhren. Es wird keine Warnung generiert. 4.14.4 Breakpoints Breakpoints erlauben es Ihnen, Ihr Programm an von Ihnen bestimmten Punkten zu unterbrechen. MonST erlaubt maximal acht gleichzeitig gesetzte Breakpoints, von denen jeder einer der fÂnf Breakpoint-Typen sein kann. Wenn ein Breakpoint erreicht wird, trifft MonST die Entscheidung, ob das Programm angehalten wird oder weiter abl„uft. Diese Entscheidung h„ngt von den Typen des Breakpoints ab. Einfache Breakpoints MonST h„lt das Programm bei Erreichen der Breakpoints an und lâ€scht dann den Breakpoint. Stop Breakpoints Diese Art unterbricht das Programm an der Stelle, an der ein bestimmter Befehl an der Adresse des Breakpoints zum n-ten Male ausgefÂhrt wurde. Ein einfacher Breakpoint ist eigentlich ein Stop-Breakpoint mit dem Wert 1. Z„hler-Breakpoints Diese Art ist nur ein Z„hler. Jedesmal, wenn der Befehl an der Adresse des Breakpoints ausgefÂhrt wird, erhâ€ht sich der Z„hler um eins, und das Programm l„uft weiter. Permanente Breakpoints Dieser Typ ist den einfachen Breakpoints „hnlich, bis auf den Unterschied, daá sie nie gelâ€scht werden. Jedesmal, wenn dieser Breakpoint erreicht wird, Âbernimmt MonST die Kontrolle. Bedingte Breakpoints Diese Art von Breakpoint erlaubt es Ihnen, Ihr Programm nur dann anzuhalten, wenn eine bestimmte Bedingung erfÂllt ist. Jeder bedingte Breakpoint hat einen Ausdruck; dieser wird jedesmal, wenn der Breakpoint erreicht wird, ausgewertet. Wenn der Ausdruck wahr (d.h. ungleich Null) ist, wird der Programmablauf unterbrochen. Alt-B Breakpoint setzen Dies ist ein Fenster-Befehl; er erlaubt das Setzen oder Lâ€schen von Breakpoints zu jeder Zeit. Die eingegebene Zeile muá je nach Breakpoint-Typ eines der folgenden Formate haben: <Adresse> setzt einen einfachen Breakpoint. <Adresse>,<Ausdruck> setzt einen Stop-Breakpoint an der angegebenen Adresse, der das Programm stoppt, nachdem <Ausdruck> eine bestimmte Anzahl oft ausgefÂhrt wurde. <Adresse>,= setzt einen Z„hler Breakpoint. Der Anfangswert des Z„hlers ist Null <Adresse>,* setzt einen permanenten Breakpoint. <Adresse>,?<Ausdruck> setzt einen bedingten Breakpoint, der vom <Ausdruck> abh„ngig ist. <Adresse>,- lâ€scht jede Art von Breakpoint an der angegebenen <Adresse>. Breakpoints kâ€nnen nicht an ungeraden und unlesbaren Adressen, und im ROM gesetzt werden. ROM-Breakpoints kâ€nnen emuliert werden, indem man den Run-Until-Befehl benutzt. Jedesmal, wenn ein Breakpoint erreicht wird, egal ob das Programm angehalten wird oder nicht, wird der Prozessorstatus im History-Buffer, der sp„ter beschrieben wird, behalten. Help Breakpoint- und Segmentanzeige Dieser Befehl zeigt die Adressen der TEXT, DATA und BSS-Segmente und deren L„ngen, zusammen mit s„mtlichen gesetzten Breakpoints, an. Alt-Befehle kâ€nnen hier auch benutzt werden. Ctrl-B Breakpoint setzen Dieser Befehl ist haupts„chlich aus Kompatibilit„tsgrÂnden zu MonST 1 noch vorhanden. Hiermit wird ein einfacher Breakpoint an der Startadresse des aktuellen Fensters gesetzt. Falls schon ein Breakpoint an dieser Adresse vorhanden ist, egal welcher Art, wird er gelâ€scht. U Go Until Dieser Befehl fragt in einer Dialogbox nach einer Adresse, an der dann ein einfacher Breakpoint gesetzt wird. Das Programm l„uft danach sofort weiter ab. Ctrl-K Kill Breakpoints Alle gesetzten Breakpoints werden gelâ€scht. Ctrl-A Breakpoint setzen und ausfÂhren Mit diesem Befehl wird ein einfacher Breakpoint nach dem Befehl am PC gesetzt, das Programm l„uft weiter. Dieser Befehl ist haupts„chlich fÂr DBF-Schleifen gedacht, die man nicht immer wieder durcharbeiten will, sondern deren Ergebnis man gleich sehen will. Ctrl-D BDOS Breakpoint Hiermit wird ein Breakpoint auf den n„chsten BDOS-Aufruf, dessen Funktionsnummer Sie angeben, gesetzt. Wenn Sie einen bestehenden BDOS-Breakpoint lâ€schen wollen, geben Sie eine leere Zeile ein. BDOS Breakpoints mÂssen gelâ€scht werden, um deaktiviert zu werden. History MonST hat einen sog. History-Speicher, in dem der Prozessorstatus nach jeder Exception behalten wird. Die h„ufigste Ursache eines Eintrags in den History-Speicher ist das ®Single-Steppen¯. Aber auch bei jedem Breakpoint und bei bestimmten Arten des Run-Befehls wird ein neuer Eintrag in den Speicher gemacht. Der Speicher enth„lt Platz fÂr fÂnf Eintr„ge. Wenn er voll ist, wird jeweils der „lteste Eintrag gelâ€scht, damit ein neuer aufgenommen werden kann. H History-Speicher-Anzeige Ein Fenster wird geâ€ffnet, in dem die maximal fÂnf Eintr„ge im History-Speicher angezeigt werden. Sowohl alle Registerwerte werden angezeigt, als auch der n„chste Befehl, der ausgefÂhrt wird. Wenn auf einen Befehl im History-Speicher ein Breakpoint gesetzt ist, zeigt der Wert in den eckigen Klammern den Wert des Breakpoints zur Zeit der Anzeige und nicht zum Zeitpunkt des Eintrags in den Speicher. 4.15 MonST verlassen Ctrl-C Abbrechen Dieser Befehl verursacht einen Programmende-Trap fÂr den aktuellen GEMDOS ®Task¯. Wenn ein Programm mit MonST debuggt wird, wird zuerst das Programm mit Ctrl-C abgebrochen, die Meldung ®Programmende¯ erscheint unten im Mitteilungsfenster; durch nochmaliges Ctrl-C wird MonST verlassen. Sie kâ€nnen aber auch ein anderes Programm laden, ohne MonST verlassen zu mÂssen. Wenn MonST vom Editor aus aufgerufen wurde, kehren Sie sofort nach Beendigung des Programmes in den Editor zurÂck, ohne Ctrl-C fÂr MonST drÂcken zu mÂssen. Vorsicht: Es kann durchaus zum Absturz kommen, wenn Sie frÂhzeitig ein GEM Programm abbrechen, ohne daá z.B. die ®Virtual Workstation¯ geschlossen wurde. 4.16 Laden und Abspeichern Ctrl-L AusfÂhrbares Programm laden Mit diesem Befehl wird ein Programm zum Debuggen geladen. Sie werden nach dem Programmnamen (wenn nicht anders angegeben, wird .PRG als Extension angenommen) und dann nach der Kommandozeile gefragt, die dem Programm Âbergeben werden soll. Wenn MonST schon ein Programm geladen hat, muá dieses Programm erst beendet werden, bevor ein neues geladen werden kann. Die Datei, die geladen werden soll, muá ein von GEMDOS ausfÂhrbares Programm sein. Wenn dies nicht der Fall ist, wird ein TOS-Fehler 66 gemeldet. Weitere Versuche, ein Programm zu laden, werden normalerweise scheitern, da GEMDOS den fÂr das Programm reservierten Speicher nicht zurÂckgibt. Wenn dies geschieht, mÂssen Sie MonST verlassen und neu starten; laden Sie die Datei dann als Bin„rdatei. B Bin„rdatei laden Es wird nach einem Dateinamen und nach einer (nicht notwendig anzugebenden) Ladeadresse gefragt. Diese Datei wird in den Speicher geladen. Wenn keine Ladeadresse angegeben wird, wird die Datei dort geladen, wo GEMDOS genÂgend Speicher freigibt. M0 enth„lt die Startadresse, M1 die Adresse des Dateiendes im Speicher. S Bin„rdatei sichern Dieser Befehl fragt nach einem Dateinamen, unter dem die Datei gesichert werden soll, nach einer Startadresse und einer Schluáadresse. Um eine zuvor geladene Bin„rdatei zu sichern, kâ€nnen Sie als Start- und Schluáadresse M0 und M1 angeben, vorausgesetzt, die Werte haben sich nicht ver„ndert. A ASCII-Datei laden Mit diesem Befehl kâ€nnen Sie eine ASCII-Datei laden, normalerweise eine Quelltextdatei, um sie in MonST anzusehen. Fenster 4 wird geâ€ffnet, falls es noch nicht vorhanden ist, und als ®Source¯-Fenster eingestellt. Der Speicher fÂr diese Datei wird von GEMDOS angefordert. Es ist deshalb ratsam, die ASCII-Datei vor Ihrem Programm zu laden, damit garantiert genÂgend Speicher dafÂr vorhanden ist. In niedriger Auflâ€sung wird Fenster 4 nicht geâ€ffnet. Sie kâ€nnen aber die Datei laden, mit Ctrl-O die Auflâ€sung „ndern und mit Alt-S und zweimaligem Alt-T den Text dann ansehen. Wenn eine ASCII-Datei nach einem Programm geladen wird, gehâ€rt der Speicher, in dem die Datei sich befindet, dem Programm und nicht MonST. Wenn das Programm zu Ende ist, wird der Speicher, in dem sich der Text befindet, von GEMDOS freigegeben. Die auto-residente Version von MonST kann diese Unterscheidung nicht machen, seien Sie also vorsichtig, wenn Sie eine ASCII-Datei in den auto-residenten MonST laden. 4.17 Programme ausfÂhren Ctrl-R ZurÂck zum Programm / Laufenlassen Hiermit wird das Programm mit voller Geschwindigkeit laufengelassen; es ist die Âbliche Methode dafÂr, das Programm nach einem Breakpoint weiterlaufen zu lassen. Ctrl-Y / Ctrl-Z ®Single-Step¯ Hiermit wird der Maschinensprachebefehl am PC ausgefÂhrt. Ein Trap, Line-A oder Line-F Opcode wird als einzelner Befehl angesehen und als solcher ausgefÂhrt. Dies kann durch >>Voreinstellungen<< ver„ndert werden. Ctrl-T Befehl interpretieren Dieser Befehl interpretiert den Opcode am PC. Er ist dem Ctrl-Y/Ctrl-Z „hnlich, verfolgt aber keine JSR, BSR, Trap, Line-A oder Line-F Befehle. Er erspart Ihnen das Durchlaufen solcher Routinen und kann mit Befehlen im ROM oder im RAM benutzt werden. R Run Dies ist ein allgemeiner Befehl und kann auf verschiedene Arten ausgefÂhrt werden. Run G Go Dieser Befehl ist mit Ctrl-R identisch und l„át das Programm mit voller Geschwindigkeit laufen. Run S Langsam (Slowly) Das Programm wird langsam ausgefÂhrt, jeder Befehl wird im History-Speicher behalten. Run I Instruktion Dieser Befehl ist dem >>Run s<< „hnlich, nimmt aber einen numerischen Parameter: die Anzahl der Instruktionen, die ausgefÂhrt werden, bevor MonST wieder eingreift. Run U Bis (Until) Sie werden nach einem Ausdruck gefragt, der nach jedem Opcode ausgewertet wird. Sobald dieser Ausdruck wahr ist, wird das Programm gestoppt. Sie kâ€nnen z.B. den folgenden Ausdruck verwenden, wenn Sie Ihr Programm im ROM mit Shift-Alt-Help angehalten haben und erst wieder Kontrolle Âbernehmen wollen, wenn Ihr Programm-Code wieder ausgefÂhrt wird: (PC>TEXT)&(PC<FC0000) Das Programm wird so lange laufen, bis der PC an einer Adresse ist, die sich nicht im ROM (PC<FC0000) und in Ihrem Programmbereich befindet (PC>TEXT). Sie kâ€nnten sicherheitshalber (PC>TEXT)&(PC<DATA)&(PC<FC0000) angeben, dies ist aber meist unnâ€tig und braucht fÂr die Auswertung nach jeder Instruktion l„nger. Bei allen Run-Befehlen werden Sie nach "Beobachten J/N?" gefragt. Wenn Sie "Ja" w„hlen, kâ€nnen Sie von MonST aus den Programmablauf mit allen Registerver„nderungen beobachten. Dieser Vorgang l„uft ziemlich langsam ab und kann mit dem DrÂcken beider Shift-Tasten abgebrochen werden. Sie kâ€nnen auch Shift-Alt-Help dazu verwenden, den Beobachtungsmodus anzuhalten. Diese Tastenkombination kann aber aus system-spezifischen GrÂnden nicht immer den Beobachtungsmodus anhalten, die beiden Shift-Tasten sind in diesem Fall zuverl„ssiger. Wenn Sie "Nein" w„hlen, wird das Programm mit seinem eigenen Bildschirm laufengelassen. Den Programmablauf kâ€nnen Sie mit Shift-Alt-Help unterbrechen. Wenn Sie den Ablauf "beobachten", ist es ratsam, die Bildschirmumschaltung in den Voreinstellungen abzuschalten. Sonst wird bei jedem Befehl der Bildschirm umgeschaltet und erzeugt dadurch ein sehr augenfeindliches Flackern, was besonders bei Farbmonitoren unangenehm ist. Bei allen Arten von Run (auáer Go) wird nach jedem ausgefÂhrten Befehl ein Eintrag in den History-Speicher gemacht. Traps werden als einzelne Befehle behandelt. Sie kâ€nnen dies mit Voreinstellungen ver„ndern, allerdings sollten Sie die Warnungen, die bei der Beschreibung von "Traps verfolgen" gegeben werden, beachten. Wenn ein Programm in einem der oben erw„hnten Modi (auáer Go) l„uft, werden Sie einige Pixel in der linken oberen Ecke Ihres Bildschirms sehen. Dieses kleine ®L„mpchen¯ zeigt, daá MonST noch aktiv arbeitet. Man kâ€nnte sonst annehmen, daá die Maschine h„ngengeblieben ist, weil sich die AusfÂhrungsgeschwindigkeit stark verlangsamt. 4.18 Speicher durchsuchen G Speicher durchsuchen Nach diesem Befehl erscheint "Suchen nach B/W/L/T/I?", wobei die KÂrzel Byte, Wort, Langwort, Text und Instruktion bedeuten. Wenn Sie B, W oder L w„hlen, werden Sie nach den Zahlensequenzen gefragt, nach denen Sie suchen wollen. MonST findet auch Zahlen an ungeraden Adressen. Wenn Sie T w„hlen, geben Sie den Text ein, nach dem gesucht werden soll, er wird dann ®case-sensitiv¯ behandelt. Geben Sie I ein, so kâ€nnen Sie nach einem ganzen oder nur einem Teil eines Maschinensprachebefehls suchen. Wenn Sie z.B. nach ®$14(A¯ suchen, werden Sie eine Instruktion wie ®MOVE.L D2,$14(A0)¯ finden. Anders als bei MonST 1, wird zwischen Groá-und Kleinschreibung unterschieden. Sie sollten auch das Ausgabeformat des Disassemblers beachten: so sollten Sie z.B. fÂr Zahlen Hex-Code verwenden, sich auf A7 anstatt SP beziehen usw. Wenn Sie die Parameter eingegeben haben, wird die Kontrolle an den N-Befehl Âbergeben. N N„chstes Vorkommnis suchen Dieser Befehl wird nach dem G-Befehl benutzt; er sucht nach dem n„chsten Vorkommnis der angegebenen Suchparameter. Wenn Sie nach Byte-, Wort- oder Langwort-Daten suchen, werden Sie immer ein Vorkommnis, n„mlich im MonST-Speicher, finden. Wenn Sie nach Text suchen, kann es auch sein, daá der Text sich noch im Tastaturpuffer befindet. Mit diesen Suchparametern wird nach 64Kbyte durchsuchten Speichers die Esc-Taste abgefragt. Bei der Suche nach Maschinensprachebefehlen wird immer nach 2 Byte auf die Esc-Taste hin geprÂft. Gesucht wird im Bereich von 0 bis zum Ende des Speichers, dann von $FA0000 bis $FEFFFF, dem Modul- und System-ROM-Bereich, und dann wieder von 0. Die Suche beginnt kurz nach der Anfangsadresse des aktuellen Fensters (wenn es nicht das Registerfenster ist). Wenn die angegebenen Daten gefunden wurden, werden die Startadressen von manchen Fenstern auf die Adresse der gefundenen Daten gesetzt. Wenn innerhalb von Fenster 2 oder 3 gesucht wurde, werden die Startadressen von 2 und 3 auf die gefundenen Daten gesetzt. Wenn innerhalb der Fenster 4 oder 5 gesucht wurde, werden die Startadressen von 4 und 5 auf die gefundenen Daten gesetzt, auáer dann, wenn Fenster 4 als ®Source¯-Fenster benutzt wird. Im "Source"-Fenster suchen Wenn Sie den G-Befehl im "Source"-Fenster verwenden, kann nur nach Text gesucht werden. Wenn er gefunden worden ist, wird die Zeile, die den Text enth„lt, angezeigt. Wenn der Text nicht gefunden wurde, wird das Fenster nicht ver„ndert. Daž die die Suche ohne Ergebnis verlief erkennen Sie daran, daá die Meldung "Suche..." nicht mehr im Mitteilungsfenster unten zu sehen ist. 4.19 Verschiedenes Ctrl-P Voreinstellungen Mit dieser Dialogbox kâ€nnen Sie verschiedene Optionen MonSTs einstellen. Die ersten drei Fragen verlangen J/N-Antworten. Sie kâ€nnen, wie in jeder Dialogbox, mit Esc abbrechen und mit Return die neuen Einstellungen Âbernehmen. Bildschirmumschaltung Normalerweise ist diese Option an; der Bildschirm wird erst 20 msec nach KontrollÂbergabe an Ihr Programm auf den Bildschirm Ihres Programms umgeschaltet. Damit wird unnâ€tiges Flackern verhindert. Diese Option sollte ausgeschaltet werden, bevor das zu debuggende Programm die Auflâ€sung, die Bildschirmadresse oder die Farbpalette ver„ndert; danach sollten Sie die Bildschirmumschaltung wieder einschalten. Traps verfolgen Normalerweise werden Traps, Line-A- und Line-F-Aufrufe als ein- zelne Befehle angesehen. Wenn >>Traps verfolgen<< eingeschaltet ist, werden solche Routinen verfolgt, um so auch das ROM untersuchen zu kâ€nnen. Vorsicht: Diese Option sollte mit grâ€Ã¡ter Vorsicht behandelt werden, da man damit sehr leicht groáen Schaden anrichten kann. Manche zeitkritische Routinen, wie Floppy- oder Festplattentreiber, mÂssen ununterbrochen ablaufen. Eine Trace- Exception in solchem Code kann ohne weiteres zum Miálingen und auch zum Datenverlust fÂhren. Andererseits macht es Spaá dem AES dabei zuzusehen, wie es MenÂs oder sich â€ffnende Fenster aufbaut. Wenn Sie Ihr Programm mit >>Traps verfolgen<< und >>Run<< ablaufen lassen, kâ€nnen Sie mit Shift-Alt-Help den Programmablauf unterbrechen und ihn mit normaler Geschwindigkeit mit Ctrl-R fortsetzen. Sowohl das AES als auch das VDI benutzen Line-A und Line-F Aufrufe, es ist deshalb sehr gut mâ€glich, daá mehrere noch bevorstehende ®Stack Frames¯ das gesetzte Trace-Bit enthalten. Es kann also den Anschein haben, als ob vâ€llig unvorhersehbare Trace-Exceptions geschehen. Nach jedem derartigen Exception sollten Sie mit Ctrl-R fortfahren. Diese unregelm„áigen Exceptions werden nur dann aufhâ€ren wenn Sie auf tiefster Ebene, d.h. wieder in Ihrem Programm, sind. Es gibt noch eine Nebenwirkung: Wenn durch AES-Event-Aufrufe ®getraced¯ wurde, kann es vorkommen, daá auch ®Stack Frames¯ innerhalb von Desk-Accessories mit gesetztem Trace-Bit existieren. Wenn das Programm zu Ende ist bevor das Desk- Accessory die Mâ€glichkeit hatte, diese ®Stack Frames¯ abzuarbeiten, wird ein Trace-Exception nach Verlassen MonSTs geschehen und einen Systemabsturz verursachen. Der Absturz erfolgt nur dann nicht, wenn AMonST2 oder das mitgelieferte NOTRACE.PRG aktiv sind. NOTRACE.PRG Dieses kleine Programm wird auch als Source mitgeliefert und dient dazu, Trace-Exceptions zu ignorieren anstatt mehrere Bomben auszulâ€sen. Das Programm sollte in Ihren AUTO-Ordner kopiert werden, falls Sie nicht schon AMonST verwenden. Relative Offsets Diese Einstellung ist normalerweise an und beeinfluát die symbolische Disassemblierung vom Adreáregister indirekt mit dem Offset Adreámodus, d.h. xxx(An). Wenn die Option an ist, wird jeder derartige Adreámodus ausgerechnet und dann die Symboltabelle durchsucht; wenn ein Symbol sich an dieser Adresse befindet, wird der Befehl als Symbol(An) disassembliert. Diese Option ist sehr hilfreich, sowohl bei manchen Assemblerprogrammstilen als auch bei der Untersuchung von Hochsprachen, die ein Adreáregister als Basisregister benutzen. HiSoft Basic z.B. verwendet A3 als Zeiger auf das ®Runtime¯- System. Symbole Diese Option ermâ€glicht es, die Behandlung von Symbolen durch MonST zu ver„ndern. Zuerst werden Sie gefragt, wie viele Buchstaben in einem Symbol signifikant sein sollen (minimal 8, maximal 22) und danach, ob die Symbole "Case-sensitiv" verarbeitet werden sollen. Diese Option ist fÂr diejenigen gedacht, die nicht jedes Mal den ganzen Symbolnamen eingeben und nicht auf Groá- und Kleinschreibung achten wollen. I Intelligentes Kopieren Dieser Befehl kopiert einen Speicherbereich in einen anderen. Die Adressen sollten in folgender Weise eingegeben werden: <Anfang>,<Einschlieáliches_Ende>,<Ziel> Das Kopieren ist deshalb intelligent, da die Ursprungs- und Endbereiche Âberlappen kâ€nnen. Vorsicht: MonST ÂberprÂft nicht, ob die Adressen gÂltig sind. Eine Kopie von oder zu einer nichtexistenten Speicherstelle wird MonST wahrscheinlich abstÂrzen lassen. Das gleiche gilt fÂr den reservierten Systemspeicherbereich. W Speicher fÂllen Dieser Befehl fÂllt einen Speicherbereich mit dem angegebenen Wert. Die Parameter sind: <Anfang>,<Einschlieáliches_Ende>,<FÂllbyte> Die Warnung Âber gÂltigen Speicher gilt auch fÂr diesen Befehl. L Labels anzeigen Wenn MonST von GenST mit Debuggen aufgerufen wurde, wird ein Fenster geâ€ffnet und alle Labels, die sich z.Zt. in MonSTs Symboltabelle befinden, werden mit ihren Adressen angezeigt. Die Symbole erscheinen in der Reihenfolge, in der sie aufgerufen wurden. Dabei ist es unerheblich, ob sie von Diskette oder vom Speicher eingelesen werden. P Disassemblieren zum Drucker/zur Diskette Mit diesem Befehl kâ€nnen Sie einen Speicherbereich zum Drucker oder auf Diskette, sowohl mit vorhandenen Symbolen als auch mit ®cross reference¯-Labels, disassemblieren. Die erste Zeile der Dialogbox sollte mit <Startadresse>,<Endadresse> angegeben werden. Die n„chste Zeile fragt nach einem Speicherbereich, den MonST zur Erstellung der "cross reference"-Liste benutzen kann: <Pufferanfang>,<Pufferende> Wenn Sie dies nicht wollen, geben Sie einfach eine leere Zeile ein. Die n„chste Zeile fragt nach den Speicherbereichen, die als DC-Direktiven disassembliert werden sollen. Die Zeile sollte so aussehen: <Datenanfang>,<Datenende>[,<Grâ€Ã¡e>] Die optionale Grâ€Ã¡e ist die der DCs und kann B, W oder L sein, wobei L der Standardwert ist. Wenn alle Datenbereiche definiert wurden, geben Sie eine leere Zeile ein. Zuletzt wird nach einem Dateinamen gefragt. Wenn keiner angegeben wird, geht die Ausgabe zum Drucker. Wenn eine "cross reference"-Liste angefertigt werden soll, gibt es zuerst w„hrend der Erstellung eine kleine Pause. Die Labels, die so generiert wurden, haben das Format >>Lxxxxxx<<, wobei >>xxxxxx<< die Hex-Adresse des Labels ist. Druckerausgabe Das Zeilenformat enth„lt zuerst eine 8stellige Hex-Zahl, bis zu 10 Wâ€rter Hex-Daten, ggf. maximal 12 Zeichen eines Symbols, und darauf den disassemblierten Befehl. Die Druckerausgabe kann mit Esc abgebrochen werden. Diskettenausgabe Das Format kann direkt von GenST verarbeitet werden. Es enth„lt zuerst ggf. ein Symbol, dann den disassemblierten Befehl, dem ein Tab vorausgeht. Ein Tab trennt auch den Opcode vom Operanden. Wenn Sie einen Speicherbereich ohne Symbole disassemblieren, ist es ratsam, die "cross reference"-Option zu benutzen, da andernfalls keine Labels vorhanden sein wÂrden. Ein Diskettenfehler oder Esc brechen die Ausgabe ab. M Adresse ver„ndern Dieser Befehl ist aus Kompatibilit„tsgrÂnden zu MonST 1 beibehalten worden. Er entspricht Alt-A. O Auswerten Dieser Befehl entspricht Alt-O und ist aus Kompatibilit„tsgrÂnden zu MonST 1 beibehalten worden. D Laufwerk und Pfad ver„ndern Mit diesem Befehl kâ€nnen Sie das aktuelle Laufwerk und den aktuellen Pfad ver„ndern. Ctrl-E Exceptions wieder installieren Mit diesem Befehl werden die von MonST abgefangenen Exceptions auf ihren Urzustand gebracht. Dies kann nÂtzlich sein beim Debuggen von kompilierten Programmen, deren Runtimes selbst Exceptions verwenden. 4.2O Auto-residenter MonST Die dritte mitgelieferte Version von MonST heiát AMONST2.PRG. Wenn Sie dieses Programm im AUTO-Ordner Ihrer Boot-Diskette ablegen, wird es automatisch nach jedem Reset neu installiert. Diese MonST-Version ruht, bis ein Exception geschieht. Sie ist haupts„chlich fÂr Programmierer gedacht, die AUTO-Programme und Desk-Accessories schreiben und debuggen wollen. Wenn ein Fehler wie ein Bus- oder Adreáfehler innerhalb einer dieser Programme auftritt, h„ngt die Maschine, bevor Sie einen interaktiven MonST aufrufen kâ€nnen. Es ist auch so mâ€glich, einen illegalen Opcode wie ILLEGAL in Ihr Programm zu setzen und dadurch den auto- residenten MonST aufzurufen. Die auto-residente Version kann auch normal vom Desktop aus aufgerufen werden und wird sich genauso initialisieren, als ob sie im AUTO-Ordner w„re, unter der Voraussetzung, daá nicht bereits ein anderer AMonST installiert ist. Wenn sie aufgerufen ist, ist die auto-residente Version von MonST der interaktiven Version von der Bedienung her sehr „hnlich. Programme und dessen Symbole kâ€nnen aber nicht geladen werden, die "base- page"-Variablen sind unbekannt und auf Null gesetzt. Der andere Unterschied liegt darin, daá, wenn das Programm beendet wird oder AMonST mit Ctrl-C verlassen wird, AMonST trotzdem im Speicher bleibt. Wenn AMonST installiert ist, kann jedes Programm mit Shift-Alt-Help unterbrochen werden. Der von MonST benâ€tigte Speicher kann nur durch einen Reset zurÂckgegeben werden. W„hrend der Installation von AMonST kâ€nnen Sie durch DrÂcken der beiden Shift-Tasten in das Programm gelangen, um z.B. Breakpoints zu setzen. Wenn Sie mit Ctrl-C AMonST verlassen, bleibt der Debugger resident, ein Verlassen mit Ctrl-R bewirkt, daá die Installation von AMonST unterbrochen wird. Es kann eine interaktive MonST-Version geladen werden, obwohl ein AMonST installiert ist. Die interaktive Version hat Kontrolle bis sie beendet wird; AMonST wird dann wieder aktiv. Vorsicht: Rufen Sie nie AMonST innerhalb eines anderen Programmes auf. Es kann dadurch vom Betriebssystem ein groáer Speicherbereich bis zum n„chsten Reset blockiert werden. 4.21 Debug-Strategien Tips Wenn Sie ein Programm mit Shift-Alt-Help oder durch den Run- Until-Befehl unterbrochen haben, ist es gut mâ€glich, daá der PC sich im ROM befindet. Die Methode, dahin zurÂckzugelangen, von wo aus Ihr Programm das ROM aufgerufen hat, ist folgende: W„hlen Sie die >>Traps-Verfolgen<<-Option in den Voreinstellungen. Dann geben Sie den Ausdruck sp=a7 beim Run-Until-Befehl ein. Sobald der Prozessor sich wieder im Usermodus befindet, also in Ihrem Programm, wird MonST aktiviert. Wenn Sie sich in einer Unterroutine befinden, die Sie nicht interessiert, kâ€nnen Sie mit dem Until-(nicht dem Run-Until- !)Befehl diese Routine Âberspringen: Geben Sie den Ausdruck {sp} als Zieladresse an. Falls die Unterroutine etwas auf dem Stack abgelegt haben sollte, oder einen lokalen Stack-Frame benutzt (oft bei kompilierten Programmen der Fall), kommen Sie mit Run Until {pc}.w=4e75 weiter. Das Programm wird langsam weiterlaufen, bis der PC an einem RTS Befehl angelangt ist. Diese Methode funktioniert dann nicht, wenn die Unterroutine eine weitere Unterroutine aufruft. In diesem Fall muá eine weitere Bedingung gestellt werden, z.B. ({pc}.w=4e75)&(sp>xxx) wobei xxx eins weniger ist als der momentane Wert. Wenn Sie Run Until benutzen, werden Sie merken, daá es eine ganze Weile dauern kann, bis die Bedingung, die Sie angegeben haben, wahr wird. Sie kâ€nnen diese Zeit so kurz wie mâ€glich halten, indem Sie den Ausdruck im voraus, soweit Sie kâ€nnen, ausrechnen. (A3>(3A400-\100+M1)) kann auf A3>xxx reduziert werden, indem Sie xxx mit Hilfe von Alt-O ausrechnen. Die MonST-Kommandozeile Wenn Sie einen Kommandointerpreter verwenden, kâ€nnen Sie MonST eine Kommandozeile Âbergeben. Zuerst geben Sie den Programmnamen ein, und, falls erwÂnscht, eine Kommandozeile, die dem zu debuggenden Programm Âbergeben werden soll. 4.22 Die Bug-Jagd Es gibt wahrscheinlich genausoviele Bug-Jagd-Strategien wie es Programmierer gibt, aber die Erfahrung ist doch der beste Lehrer. Wir haben in der Zeit, in der wir den 68000er programmieren, gelernt, wie man die Suche am besten angeht. Zuerst ist ein sehr guter Weg, um Fehler zu finden, sich den Quelltext anzusehen. Es ist eine schlechte Angewohnheit, gleich zum Debugger zu greifen und sich erst dann den Quelltext anzusehen. Es kâ€nnte sein, daá Sie dabei das System oder die Programmierumgebung wechseln und nicht mehr auf das ®Low-Level¯- Debuggen zurÂckgreifen kâ€nnen. Wenn ein Programm offensichtliche Fehler macht, wie z.B. einen Adreáfehler, ist es wesentlich leichter das Problem zu finden, als wenn das Programm nur manchmal, von Ihrer Sicht aus vâ€llig unberechenbar, das falsche Ergebnis liefert. Viele Fehler entstehen dadurch, daá bestimmte Speicherbereiche, die wichtige Daten enthalten, versehentlich Âberschrieben werden. Wenn man den Speicherbereich leicht, wie z.B. bei einem Busfehler, erkennen kann, kann man bedingte Breakpoints an verschiedenen Stellen ine Ihrem Programm unterbringen, um den Fehler so frÂh wie mâ€glich abzufangen. Wenn z.B. die globale Variable Haupt_Zeiger irgendwo ungerade wird, wird die Bedingung des Breakpoints wahrscheinlich so aussehen: {Haupt_Zeiger}&1 Wenn diese Methode nicht funktioniert, kann man davon ausgehen, daá die Variable an einer sonst unerfindlichen Stelle ver„ndert wird. Die Lâ€sung ist meist die Benutzung von Run Until mit der eben beschriebenen Bedingung. Es kann auf diese Weise sehr lange dauern bis das Problem auftaucht (deshalb auch das ®L„mpchen¯ oben links). Es kann auch ohne weiteres der Fall sein, daá der Fehler auch so nicht zu finden ist. Manche Fehler sind sehr speicherspezifisch und werden durch einen Interrupt, w„hrend der Stack an einer bestimmten Stelle ist, ausgelâ€st. Es kommt auch vor, daá ein Fehler nur dann auftaucht, wenn ausgerechnet kein MonST zugegen ist; in einer solchen Situation hilft meist nur noch GlÂck. Z„hler-Breakpoints sind auch sehr gute Hilfsmittel, um einen Bug schnell zu lokalisieren. Wenn eine Routine nach einer bestimmten Zeit schief geht, Sie aber nicht sehen kâ€nnen warum, setzen Sie einen Z„hler-Breakpoint in diese Routine und lassen das Programm ablaufen. Wenn der Fehler auftritt, schauen Sie sich mit Hilfe von >>Help<< an, wie oft die Routine durchgefÂhrt wurde. Dann laden Sie das Programm neu und setzen einen Stop-Breakpoint an diese Stelle mit dem Wert des Z„hler-Breakpoints (oder eins weniger). Lassen Sie das Programm laufen. Sie kâ€nnen die Routine dann ®single-steppen¯, falls sie schiefl„uft. Viel GlÂck! 4.23 Programme im Auto-Ordner Wenn ein Programm im AUTO-Ordner abstÂrzt, kann es sein, daá der Rechner in einer unendlichen Schleife versucht, neu zu booten. Benutzen Sie in diesem Fall AMonST, indem Sie AMonST vor dem abstÂrzenden Programm in den AUTO-Ordner kopieren. So wird bei einem Exception der Rechner nicht neugestartet, sondern AMonST greift ein. 4.23.1 Desk-Accessories Wenn ein Desk-Accessory nicht das tut, was es tun soll, sollten Sie AMonST benutzen. Um ein DA im Speicher zu finden, gehen Sie mit Shift-Alt-Help in AMonST. Dann suchen Sie ab Adresse 0 nach dem Namen Ihres Accessory. Es wird in Groábuchstaben und bis auf 8 Zeichen L„nge mit Leerschritten ausgefÂllt sein. Ignorieren Sie Vorkommnisse in Directory-Puffern (der Name wird darin von .ACC gefolgt) und in MonSTs eigenem Speicher, wobei dem Namen ein ASCII-T voransteht. Das richtige Vorkommnis wird 12 Byte nach dem Namen ein Langwort haben, das auf die Base-Page des Accessory zeigt; $100 Byte danach f„ngt es an. Von hier aus sollten Sie Ihre Hauptschleife erkennen und ein Breakpoint an einer geeigneten Stelle setzen. Mit Ctrl-R l„uft dann das Accessory weiter bis zum Breakpoint. Wenn schon bei der Initialisation eines Accessory ein Fehler auftritt, mÂssen Sie es ganz am Anfang, bevor der Fehler passiert, anhalten. Der beste Weg ist, den ILLEGAL-Befehl zu verwenden und ihn durch AMonST abfangen zu lassen. Manchmal klappt diese Methode auch nicht. Die folgende Vorgehensweise funktioniert bei den aktuellen ST-ROMs um das AES zu stoppen, bevor es das Accessory startet. Es wird darauf hingewiesen, daá diese Methode kompliziert und nicht fÂr den Anf„nger gedacht ist. Zuerst halten Sie beide Shift-Tasten gedrÂckt, damit Sie beim Bootvorgang in AMonST gelangen. Dann setzen Sie mit Ctrl-D ein BDOS-Breakpoint auf dem GEMDOS-f_open-Aufruf, $3D. Danach benutzen Sie Ctrl-C, um den Bootvorgang weiterlaufen zu lassen. AMonST wird jedes Mal, wenn ein f_open-Aufruf erfolgt, aktiviert. Machen Sie Fenster 3 zum aktuellen Fenster und setzen Sie jedesmal, wenn Sie auf ein Breakpoint kommen, die Startadresse des Fensters auf {sp+2}. Wenn der erscheinende Name nicht der Ihres Accessory ist, Âbergehen Sie den Aufruf mit Ctrl-Y. Setzen Sie dann noch ein BDOS-Breakpoint auf $3D und lassen den Bootvorgang mit Ctrl-R fortlaufen. Wenn der Name Ihres Accessory doch auftaucht, setzen Sie ein BDOS-Breakpoint auf $4B und geben dann Ctrl-R ein. AMonST stoppt den Ablauf kurz bevor das Accessory geladen wird. Diese Reihenfolge -zuerst ein f_open und dann ein p_exec - mag zwar etwas seltsam erscheinen,ist aber erfolgversprechend. Mit Ctrl-Y Âber den GEMDOS-Aufruf und dann mit Alt-B mit der Adresse d0+100 wird ein Breakpoint auf den ersten Befehl des Accessory gesetzt. Mit Ctrl-R lassen Sie das Betriebssystem so lange laufen, bis Ihr Accessory tats„chlich ausgefÂhrt wird. Diese Methode mag zwar kompliziert und zeitaufwendig sein, sie ist oft aber die einzige Mâ€glichkeit, ein Desk-Accessory zu debuggen. 4.23.2 Die Exception-Analyse Wenn eine unerwartete Exception passiert, ist es meist sehr nÂtzlich zu wissen, wo und wie sie passierte, um dann, wenn mâ€glich, das Programm zum Weiterlaufen zu bringen. Busfehler Wenn der PC sich in nicht-existentem Speicher befindet, schauen Sie sich den Stack an und versuchen Sie, eine RÂckkehradresse zu finden. Diese gibt meist Aufschluá Âber den Grund des jetzigen PC-Wertes. Wenn der PC sich innerhalb Ihres Programmes befindet, wird ein Zugriff auf einen nicht-existenten oder geschÂtzten Speicher den Busfehler ausgelâ€st haben. Es ist sehr unwahrscheinlich, daá Sie nach einem Busfehler Ihr Programm weiterlaufen lassen kâ€nnen. Adrežfehler Wenn der PC sich nicht in Ihrem Programm befindet, ist die soeben erw„hnte Methode anzuwenden. Ein Adreáfehler hat als Ursache meist einen Wort- oder Langwortzugriff auf eine ungerade Adresse. Eine Registerkorrektur hilft oft, daá das Programm wenigstens fÂr eine Weile weiterlaufen kann. Illegaler Befehl Wenn der PC in einem sehr niedrigen Speicherbereich ist, etwa unter $30, ist meist ein Sprung an die Adresse 0 schuld. Wenn Sie sich mit MonST diesen Bereich ansehen, erkennen Sie einen BRA.S, gefolgt von mehreren ORI-Befehlen, die in Wirklichkeit Langwort-Zeiger sind, dicht gefolgt von einem illegalen Befehl. Privilegverletzung Dies wird durch die AusfÂhrung eines privilegierten Befehls im User-Modus verursacht. Meistens bedeutet dies, daá Ihr Programm Amokgelaufen ist. 4.24 Zusammenfassung der MonST-Kommandos Fenster-Befehle Alt-A Startadresse setzen Alt-B Breakpoint setzen Alt-E Fenster editieren Alt-F Fontgrâ€Ã¡e Alt-L Fenster binden Alt-O Ausdruck auswerten Alt-P Drucker-Dump Alt-R Register setzen Alt-S Fenster spalten Alt-T Fenstertyp ver„ndern Alt-Z Fenster zoomen Bildschirmumschaltung V Anderer Bildschirm Alt-O Auflâ€sung ver„ndern Breakpoints Alt-B Breakpoint setzen Help Breakpoint- und Segmentanzeigen Ctrl-B Breakpoint setzen U Go Until Ctrl-K Alle Breakpoints lâ€schen Ctrl-A Breakpoint setzen und ausfÂhren Ctrl-D BDOS-Breakpoint Laden und Abspeichern Ctrl-L AusfÂhrbares Programm laden B Bin„rdatei laden S Bin„rdatei abspeichern A ASCII-Datei laden Programme ausfÂhren Ctrl-R ZurÂck zum Programm / Run Ctrl-Y ¯Single-Step® Ctrl-T Instruktion interpretieren (Trace) R Run (verschiede Arten) Speicher durchsuchen G Durchsuche Speicher N N„chstes Vorkommnis Verschiedenes Ctrl-C Abbrechen Ctrl-P Voreinstellungen I Intelligentes Kopieren W Speicher fÂllen L Labels anzeigen P An Drucker/Diskette disassemblieren M Adresse ver„ndern O Auswerten D Laufwerk und Pfad ver„ndern Shift-Alt-Help Programm unterbrechen H History-Speicher anzeigen Ctrl-E Exceptions wieder installieren