Bernd Preusing 02-Nov-88 Tips&Tricks zu M2Amiga ====================== 1. Da ich sowohl vom CLI als auch von der Workbench arbeite, stört es mich gewaltig, daß von der Workbench keine Compiler- und Linker- Optionen gegeben werden können. .ref-Files kosten viel Zeit und Diskettenplatz, ein Debugger läßt immer noch auf sich warten, also brauche ich sie nicht. Mit den beiden Pseudo-Files -x.info und -d.info kann man nun auch Optionen setzen. Anwendung: Klick auf -d, SHIFT drücken und halten, Klick auf die zu kompilerenden Files, Doppelklick auf m2c. Oder beim Linker: Klick auf -x, SHIFT drücken und halten, Klick auf die zu linkenden Files, Doppelklick auf m2l. 2. Mit den Konstanten TRUE und FALSE steht der Compiler auf Kriegsfuß! Dies gilt zumindest für die REPEAT-Schleife. REPEAT ... UNTIL TRUE sollte ja nur einmal durchlaufen werden, aber der Compiler erzeugt eine Endlosschleife! REPEAT ... UNTIL FALSE sollte endlos laufen, es läuft aber nur einmal! WHILE TRUE|FALSE DO ... END wird korrekt übersetzt. 3. M2Amiga kennt auch Register-Variablen! Zunächst aber etwas zu den Register-Parametern {} allgemein: A4,A5,A6 und A7 sind tabu (siehe DisObject.doc)! D0 und D1 werden beim Aufruf erst auf den Stack gepackt und dann in die Register geladen. Solche Parameter könen wie (lokale!) Variablen benutzt werden, die entsprechenden Register werden bei Rechnungen und Prozedur-Aufrufen manchmal auf den Stack gerettet. Hier ist Vorsicht geboten, am besten mittels DisObject austesten! Die Benutzung von Register-Variablen schränkt natürlich die für den Compiler benutzbaren Register ein, allzuviel ist un- gesund! Falls die gesamte Prozedur INLINE ist, muß nur darauf geachtet werden, daß sich A4 und A5 nicht verändern. Parameter in Adressregistern können auch für Arithmetik benutzt werden, INC und DEC weist der Compiler jedoch zurück! Falls der Inhalt eines Datenregisters als Zeiger benutzt wird, wird es kurzzeitig in ein Adressregister kopiert. Berechnungen mit Adressregistern werden meist in einem freien Datenregister ausgeführt, was natürlich Zeit kostet. Wer in einer Prozedur schnelle Lokal-Variable benötigt, gibt diese im Prozedurkopf als Dummy-Parameter mit an. Hierfür eignen sich besonders D5 und D7. Beispiel: PROCEDURE XX(..normale Parameter..; i{5},j{6}:LONGINT); VAR BEGIN ... FOR i:=a TO b DO ... ... j:=v DIV 3;... END XX; Beim Prozedur-Aufruf hängt man dann einfach z.B. noch 2 Nullen als Parameter an. VAR-Parameter in Registern enthalten die Adresse der Variablen, sind also nur bedingt und mit Überlegung brauchbar! !!! Compilerfehler !!! Achtung: bei Prozedurtypen überprüft der Compiler nur Anzahl und Typen der Parameter. Falls Registerparameter benutzt werden, meldet der Compiler keinen Fehler, aber das Programm geht ins Nirwana! Beispiel: TYPE prLess = PROCEDURE(ADDRESS,ADDRESS):BOOLEAN; ... VAR MyLess: prLess; ... PROCEDURE Less(a{0}, b{1}: ADDRESS):BOOLEAN; .... MyLess:=Less; (wird anstandslos compiliert!!!) BoolVar:=MyLess(ADR(x),ADR(y)); (stürzt ab!!) 4. Als Harddisk-Besitzer ärgert es mich maßlos, wenn alle vom M2Amiga- System erzeugten Icons immer SYS: als Directory angeben. m2c erzeugt z.B. für die Object-Files als Default-Tool 'SYS:m2l', der Editor erzeugt 'SYS:m2emacs'. Nun ist SYS: aber eigentlich für andere Zwecke gedacht und wird durch solche Späße schnell übergroß, also habe ich mein gesamtes MaAmiga-System in der Directory 'M2A', die mittels eines assign-Kommandos auch via 'M2A:' ansprechbar ist. Ich patchte nun einfach m2emacs und m2c derart, daß das 'sys:' in 'm2a:' umgeändert wurde. Dabei habe ich auch gleich m2emacs in m2e umbenannt, weil es kürzer und konsistenter ist. Dazu ändert man einfach das zweite 'm' von m2emacs in eine 00. Man suche also in m2c den String 'sys:m2l' und in m2emacs den String 'sys:m2emacs'. (Über die Groß/Kleinschreibung bin ich mir nicht sicher.) Mit einem guten File-Monitor ist dies ein Kinderspiel, z.B. be- nutze ich NewZap3.0. Sicherheitshalber sollte man diese Patches aber nur auf Kopien der Files durchführen! Danach muß oder kann dann eventuell noch s:m2path geändert werden. ENDE