u
SONDERHEFT
v6
Markt&echnik DM 9,80 öS 80,- sfr 9,80
en F a C
für Amiga-Besitzer
@ Die tollsten Kniffe für Programmierer in Basic, C und Assembler il zur Workbench, zum CLI und zur Shell ® Nützliche Hilfen für Anwender: Holen Sie alles heraus aus Textverarbeitungen, Datenbanken, Grafik- und Animationsprogrammen ® Wichtige Tricks für Einsteiger; harte Nüsse für Profis; und vieles mehr zum Amiga, seiner Hardware, OS 2.0 und, und, und... .,
MIGA az TRICKS\
4
SUPER-SOFTWARE FÜR DEN We
U 0o BETTEN BETT CUBE
es “—DIP zum Sparpreis
mn Haar lee 2 j
Ereeler Broilers ‚ladungen, Visitenkarten ect. ein ansprechendes
IR tun Aussehen. Die Gestaltung der Dokumente erfolgt
| denkbar einfach mit Mausunterstützung. Multitext
| bietet die Fähigkeiten professioneller DIP-Pakete —— zum Sparpreis. Zum leistungspektrum des Programms gehören unter anderem: Ganzheitsstellung, beliebig viele Schriften, Schattieren von Objekten, Füllmuster, vielfältige Editierfunktionen. Gestalten wie die Profis mit Multitext.
Außerdem: »C-A-O-S«: Eine faszinierende Simulation, die das Gravitationsverhalten verschiedener Planeten zueinander in Echtzeit-Animation veranschaulicht.
... Und »Real-Time«: Die voll lauffähige Demo-Version des professionellen Pakets für dreidimensionale Echtzeit-Animationen. Mit drei Beispiel-Filmen.
‘. Und
»Tatort«: Wer bringt seine Meute zuerst in den sicheren Hafen? Ein Würfelspaß für bis zu vier Spieler und 16 Spielsteine.
Sa2. un a für Labyrinth-Fans: Viel Spaß mit "Amaze".
/er, 4 vn
e
| Rolling Stones | Sag Burag
TIPS & TRICKS
INHALT
le Ta
AmigaBASIC
Damit fängt jeder an - auch das Sonderheft 4 Gfa-BASIC
Beliebter BASIC-Dialekt für Fortgeschrittene 19 Zaubersprache
Alles Assembler- oderwas? 24 C wie Cäsar
»Die Sprache« des Amiga 33 Hokus Pokus
Trickkiste für alle Programmierer 84
WORKBENCH UND CLI
Bekommen Sie den Amiga in den Griff 48 Ein komplettes Magazin voller Tips & Tricks zum 3000er und OS 2.0 Amiga, das hat‘s noch nie gegeben. Erste Kniffe zum neuen Betriebssytem 76 Entstanden ist die Idee zu diesem Sonderheft auf-
grund der regen Beteiligung unserer Leser an der
SOFTWARE monatlichen Rubrik Tips & Tricks im AMIGA-Maga-
o " " zin, Sie finden in diesem Sonderheft daher größten- öffentliche Hilfe teils unveröffentlichte Beiträge — einige sind aller-
Pubie-Doman Alaigaber 68_ dings bereits im AMIGA-Magazin erschienen, von In der Praxis denen wir glauben, daß Sie im Sonderheft nicht feh- Software-Hilfe für Anwender 74 len dürfen.
Schreiberlinge Viel Spaß beim Tricksen wünscht Ihr
Ideen zu Beckertext & Co 80 Hermann der User
HARDWARE
Vom Drucker bis Festplatte Für kleine und große Bastler 71
UND DIE SPEZIELLE »SCHATZKISTE«
Für alle Freunde der Tips & Tricks:
buntgemischte Seiten mit Ideen, Kniffen, Ratschlägen zu allem, was mit Amiga zu tun
hat; hier ist für jeden etwas dabei;
hier sollten Sie so richtig rumwühlen 58
PROGRAMMIEREN
AMIGABASIC
Computersprachen
"AmigaBAsIcC
Wenn man seinen Com- puter so richtig beherr- schen möchte, muß man Ihn auch programmie- ren. Hierzu bieten sich unterschiedliche Spra- chen an: BASIC, C, As- sembler usw. Klar, daß man gerade beim Pro- grammieren Tausende von Kniffen anwenden kann, um noch mehr aus dem Amiga herauszuho- len, sei es, um Program- me zu beschleunigen, Speicherplatz zu sparen oder um Programme komfortabler zu machen. eginnen wir den Reigen der Programmiertips mit BASIC, genauer AmigaBASIC, eine Sprache, die gerade für Ein- steiger optimal geeignet ist. Es folgt Gfa-BASIC, ein BASIC- Dialekt, der sich wachsender Beliebtheit unter Programmie- rern erfreut. Vor allem, wenn man den Gfa-Compiler einsetzt, der BASIC-Listings in schnelle, eigenständige Programme übersetzt.
Mit C und Assembler folgen dann Tips zu Sprachen, die unter fortgeschrittenen Amiga-Programmierern am gefragtesten sind. Wer die Sprachen kennenlernen möchte, sollte sich einen der C-Compi- ler auf Public Domain besorgen, gleiches gilt für Assembler, z.B:
- Sozobon-C, C-Compiler, Fish-Disk 508;
- DICE, C-Compiler, Fish-Disk 491;
— A68k, Assembler, Fish-Disk 508;
- OMA, Assembler, Programmservice-Disketten zum AMIGA-Maga- zin 11/91 und 12/91.
Und schließlich bringen wir noch Tips zu Modula-2 und einige all- gemeine Programmiertips, die für alle Sprachen gültig sind.
Der Screen ist weg
Wenn dem Amiga was nicht paßt, pflegt er seinen Unmut durch
ein Kommunikationsfenster (Requester) links oben auf dem Bild- | | Im fünften Byte dieser Struktur steht der gewünschte Wert. Man
schirm auszudrücken. Der Computer bringt hierzu die Workbench oder den Standard-Bildschirm (Screen) nach vorne, in dem sich das Ausgabe- und List-Fenster befinden. Klicken Sie »Cancel« an, ver- schwindet der Requester, aber der Screen bleibt im Vordergrund.
Um auf Ihren Screen zurückzukommen, ziehen Sie die BASIC-Fen- |
ster herunter, bis die Titelleiste des Workbench-Screens sichtbar wird. Danach klicken Sie mit der linken Maus-Taste das Tiefen-Gad- get rechts oben an. Jetzt sollte Ihr Screen wieder sichtbar sein. Dasselbe funktioniert über Tastenkombinationen: - <Amiga_links m> bringt die Workbench in den Hintergrund und - <Amiga_links n> holt sie wieder nach vorne. ub
Wie tief ist der Screen?
AmigaBASIC besitzt keine Anweisung, um die Zahl der Bitplanes für die Farbdarstellung bzw. die Tiefe eines Screens festzustellen. Doch gibt es hierzu zwei Verfahren:
« Beim ersten brauchen wir die Zahl der Farben: WINDOW(6) liefert den um 1 verringerten Wert. Dessen Zweierpotenz ist die gesuchte Ton. Wir ermuen Sie Surch:
. ‚Der Befehl
liefert die Art einer Datenstruktur, die wiederum die Adresse einer Merelon Struktur enthält. Deren Adresse holen wir uns mit:
kann ihn ganz einfach mit der ZUWeBung
auf einen Schlag aus dem Speicher lesen.
Basic mag keine Umlaute
AmigaBASIC verträgt keine Umlaute im Variablennamen. Wenn Sie es trotzdem versuchen, gibt das einen »Syntax error«. Außer- dem löscht der Interpreter kleine »ü« in Kommentarzeilen. Aus »REM ÄaÖöUüß« wird »REM ÄäÖöÜß«. Umlaute in Texten, also zwischen Anführungszeichen, machen keine Probleme. Am Bild- schirm sind jedoch das große und kleine »ü« nur schwer zu unter- scheiden, weil sie fast gleich aussehen. EHE
Die Konsequenz kann da nur sein, die Umlaute »A, O, U, ä, ö, ü« immer mit »Ae, Oe, Ue, ae, oe, ue» zu ersetzen.
ub INPUT ohne Fragezeichen
INPUT gibt ab der aktuellen Cursor-Position den hinter dem Be- fehl angegebenen Text sowie ein Fragezeichen aus und erwartet gan die Testeltreingane. Beispiel:
"Bitte Zahl eingeben*;z
sn Sie das Fragezeichen stört, können Sie es unterdrücken, Inda Sie den ‚SUNehpunK! durch ein Komma ersetzen:
Das funktioniert aber nur, wenn Sie hinter INPUT eine Zeichenket- e angegeben:
wie im Beispiel gezeigt, darf es auch ein Leerstring sein.
UNDO holt die Zeile wieder
Viele Programme haben eine Undo-Funktion, die mißlungene Operationen rückgängig macht. AmigaBASIC auch. Wenn Sie Ande- rungen in einer Zeile nicht übernehmen wollen, drücken Sie <Amiga_rechts I>, ohne die Zeile vorher zu verlassen. Sofort er- scheint die vorherige Zeile wieder am Bildschirm.
irw Müllabfuhr für BASIC Wenn Sie ein Programm mit AmigaBASIC editieren, zwi-
schendurch testen und dann auf Diskette speichern, wird es wesent-
lich länger sein als Vorversionen mit denselben Anweisungen. Durch | das Editieren und das Testen ist immer mehr Variablen- und Daten- |
müll entstanden. Beim Speichern eines Programms werden nicht nur die gültigen Variablen, sondern auch der Müll gespeichert. Er kann beseitigt werden. Geben Sie im Ausgabefenster des Interpreters
load "Progre ein, drücken Sie <Return> und speichern Sie das Programm mit
jave "Pr
Nach dem Tipp auf <Return> speichert BASIC das Programm als Textdatei ohne den Variablenmüll. An den Programmnamen haben wir ».asc« gehängt, damit das Original nicht überschrieben wird.
Zur Erfolgskontrolle können Sie ein SHELL-Fenster öffnen und die Länge beider Versionen mit dem LIST-Befehl vergleichen. Sie kön- nen das Ganze sogar noch weiter optimieren:
apaichert das Programm in binärer Form. Sie sollten nun die Länge der drei Versionen prüfen und die kürzeste behalten.
ub |
Grad in das Bogenmaß
Die trigonometrischen Funktionen von AmigaBASIC benötigen die
Winkelangaben im Bogenmaß (Einheit: rad). Die Umrechnung ist |
einfach: rad =
Und wieder zurück:
rad * 180)/pi
(pi * grad) /180
PROGRAMMIEREN
AMIGABASIC
Beachten Sie, daß Winkel gegen den Uhrzeigersinn gemessen werden. Wenn Sie sich die Definition von »Pi« erleichtern wollen, lesen Sie den Tip »Pi und Verwandte« (Seite 8).
ub
| Out of Heap Space
AmigaBASIC liefert diese Fehlermeldung bei einem Überlauf des Editor-Zwischenspeichers. Er tritt ein, wenn man versucht, sehr große Textblöcke mit Cut zu löschen. »Out of Heap Space« signali- siert auch, daß der für BASIC reservierte Stapelspeicher (Stack) nicht ausreicht; z.B. wegen zu vieler geschachtelter Schleifen oder GOSUB-Aufrufe. In so einem Fall sollten Sie mit der Anweisung CLEAR mehr Stapelspeicher zuweisen.
CLEAR dient dazu, Variablen zu löschen und offene Dateien zu schließen. Mit CLEAR ändern Sie aber auch die Speicherreservie- rung und -einteilung von BASIC. Die Mindestgröße des Arbeitsspei- chers ist 1 KByte. Nach oben ist die Grenze der verfügbare System- speicher. Die Voreinstellung für den Speicher schluckt 25000 Byte.
Der Interpreter benötigt auch einen Stack. Diesen Speicherbereich verwendet er für interne Zwischenspeicherungen und die Rückkehr- adressen der Unterprogrammaufrufe. Der Stack ist auf 4789 Byte voreingestellt. Die aktuellen Speichergrößen ermitteln Sie mit der Funktion FRE() (siehe BASIC-Handbuch).
Irw
Tip/Thema Der Screen ist weg / Screens per Tastendruck umstellen Wie tief ist der Screen / Farbanzahl bestimmen BASIC mag keine Umlaute / Keine »ü’s« in BASIC-Programmen INPUT ohne Fragezeichen / INPUT-Befehl Undo holt die Zeile wieder / Bedienung Müllabfuhr in BASIC / Programme entschlacken Grad in Bogenmaß / Umrechnung Out of Heap Space / CLEAR-Befehl Maus oder Tastaur / Menüprogrammierung LED an / Laufwerkslampe anschalten Genaue Wurzel-Behandlung / Quadratwurzel berechnen Saubere Sache / Laufwerksteuerung Existenzfragen / Dateien prüfen Wo ist der Apostroph / Sonderzeichen (REM) »Pi« und Verwandte / Definitionen Farbige Titel / Titelleiste einfärben Verschieden Schriftarten / Schreibstil ändern mit POKE Unsichtbarer Syntax Error / Störende Leerzeichen in Programmen Trigonometrie auf dem Kopf / SIN, COS usw. Fehler im BASIC-Hanmdbuch / STRIG-Funktion Object in use / Druckersteuerung Texte, die den Punkt treffen / Cursorplazierung BASIC lückenlos / Leerzeichen entfernen
Seite
4 4 5 5 5 5 5 5 6 6 6 7 7 7. 8 8 8 8 8 8 8 9 9
BASIC sortiert / Texte ändern per Programm 10 Line buffer overflow / Listingeingabe 10 Funktionstasten nutzen 10 Error while opening / Default-Tool 11 Zu wenig Speicher? / Speicher sparen 11 Zeichnen mit System / Grafik-Bibliothek nutzen 11 So liegen Sie richtig / Ausgabefenster selektieren 11 Patch: BASIC ohne Bilder / Interpreter verändern 12 GROSSES List-Fenster / List-Fenster in PAL (256 Zeilen) 12 ASCII-Codes / Programm gibt ASCII-Tabelle aus 12 CUT & COPY einfacher / Bedienungshilfe 12 Find & Replace / Editor statt BASIC-List-Fenster 13 So liegen Sie richtig / Requester umlenken 13 Maus in Motion / Sprites steuern 13 Jetzt kommt Bewegung ins Spiel / Overscan 14 Schriftzug fährt ab / Textscrolling 14 BASIC schlägt Alarm / Alerts 14 Teile von BASIC speichern / Cut-Funktion 14 Bildausschnitt / Bilder ausschneiden 14 ‚Anderer Zeichensatz / Font nachladen 15 Drucker testen / Anschluß überprüfen per BASIC-Befehl 16 Wieviel Speicher / AVAIL 16 Henon-Attraktor / Funktion plotten 16 Workbench auf und zu / System-Befehl nutzen 17
PROGRAMMIEREN
AMIGABASIC
Menüs: Maus oder Tastatur
Wenn es darum geht, einen Menüpunkt zu selektieren, nehmen viele lieber die Maus, während andere die Tastatur bevorzugen, um ihren Amiga zu bedienen. Damit Ihre BASIC-Programme benutzer- freundlich sind, sollten Sie beide Varianten zulassen.
Das ist ganz einfach zu bewerkstelligen: Im Menü-Zeilentext, der das Aussehen der Menüs im Programm festlegt, geben Sie einfach am Ende noch einen »Ctrl«-Code (A) mit ein, z.B.: »AD«, »AE«,... Menü-Zeilen sehen dann etwa so aus:
MENU 1,1,1, "Drucken
MENU 1,2,1, "Zeigen vi Nun müssen Sie im Programm parallel zur Menüabfrage, die per ON MENU-Befehl läuft, mit INKEY$ die Tastatur überwachen und te- sten, ob der Anwender eine der in den Menüs erwähnten Kombina- tionen drückt. Die CHR$-Codes für die Ctrl-Kombinationen sind:
A = CHR$( 1)
(235)
z 126)
Viel Spaß beim benutzerfreundlichen Programmieren.
Daniel Flück/ub
Mit dem Programm »LED.bas« schalten Sie die Laufwerkslampe (Leuchtdiode, LED) an und aus. Zum Anschalten müssen Sie nur in der letzten Zeile des Programms die Zahl 0 mit 255 vertauschen.
ub
Zum Ein- und Ausschalten der Laufwerks-LED
Genaue Wurzel-Behandlung
»Quadrat.bas« berechnet die Quadratwurzel von ganzen Zahlen im Bereich von 1 bis 32 761 auf theoretisch bis zu über 16 000 Nach- kommastellen genau. Für das Näherungsverfahren verwendet das Programm einen Algorithmus, der besonders schnell ist, vielleicht sogar der schnellste. Oder kennen Sie einen schnelleren?
DIM ws (bist+1), e%(2* ws(1) = INT(SOR(zahl$))
IF pr& = 2 0R pr OPEN "lpt1:" FOR OUTPUT AS #2 PRINT#2, "Die Quadratwurzel von "zahl$* ist :"
5%+2 THEN ende
: last$ = 18+18-1
&%(h$) = es(ht)+ws(at)+wt(at)
t3)+2*wE (18) -1
%{u$-1)+INT(e$ (u) /10) et(u$) MOD 10
Auf wieviel Stellen genau hätten’s denn gern?
Das Programm läuft auf allen Amigas; es ist keine besondere Ausrüstung erforderlich. Zur Druckerausgabe brauchen Sie natürlich einen Drucker, Sie können die errechneten Stellen jedoch auch auf dem Bildschirm ausgeben lassen, oder beides parallel.
Einige Hinweise zum Prinzip des Programms: Zuerst legt »Qua- drat.bas« ein Feld für die angenäherte Wurzel und eins für das an- genäherte Quadrat an, in dem jeder Stelle der Zahl ein Element des Felds entspricht. Zu Beginn stehen alle Stellen auf Null.
Wenn man die irrationale Wurzel einer Zahl berechnen will, be- nutzt man eine Intervallschachtelung. Man geht im Prinzip so vor:
Man beginnt ganz links, mit der ersten Stelle. Dann erhöht man die Stelle um eins, bildet das Quadrat, der sich so ergebenden Dezi- malzahl, und prüft, ob es größer als der vorgegebene Wurzelradi- kand ist; in diesem Fall, erniedrigt man die aktuelle Stelle wieder um eins und geht eine Stelle weiter nach rechts (und weiter wie gehabt). Im anderen Fall, und wenn die Stelle schon neun ist, kann die aktu- elle Stelle nur den Wert neun besitzen, also geht man eine Stelle weiter nach rechts (weiter wie gehabt).
Ist das Quadrat noch zu klein, die aktuelle Stelle aber nicht neun, erhöht man die Stelle wieder um eins und macht weiter wie vorher.
So kann man recht einfach die Wurzel einer Zahl berechnen, je- doch ist die Methode langsam, weil man zu oft das Quadrat einer Zahl berechnen muß, die zu allem Übel ständig länger wird. Folglich liegt es nahe, an diesem Punkt eine Verbesserung anzusetzen:
Wenn man die Multiplikation einer Zahl mit sich selbst untersucht, stellt man fest, daß man in unserem Fall, in dem sich immer nur die letzte Stelle um eins erhöht, mit dem Ergebnis der letzen Quadrie- rung weiterarbeiten kann und nicht jede Stelle mit jeder Stelle multi- plizieren muß.
Man muß bei jedem Durchlauf, in dem sich die letzte Stelle um eins erhöht, zum letzten Quadrat immer nur jede Stelle außer der letzten zweimal an die Position (Länge der Zahl + Stelle Nr. - 1) ad- dieren, sowie daß Quadrat der letzten Stelle an die Stelle (2 * Länge der Zahl - 1) setzen und dabei alle Überträge berücksichtigen.
Ein vom Zeitaufwand optimales Verfahren. Bei der Subtraktion von eins an der aktuellen Stelle, wenn man die richtige Stelle gefun- den hat, geht man analog vor, indem man die genannten Werte nicht addiert, sondern subtrahiert. Lediglich die Routine zur Über- tragsberücksichtigung muß verändert werden.
Zum Reinigen von Diskettenlaufwerken sind die im Handel ange- botenen Reinigungsdisketten ideal. Das Problem dabei ist, daß diese Disketten vom Betriebssystem nicht anerkannt werden und beim Einlegen nur die Warnung erscheint: »Not a Dos-Disk...«.
Um eine Reinigungsdiskette trotzdem zu nutzen, muß man das
Laufwerk per Software anschalten. Das folgende BASIC-Programm |
erfüllt genau diesen Zweck.
kclean(z,
END IF PRINT "Bitte linke Maustaste drüc SLEEP
Diskelean.bas
Steuert den Motor des Laufwerks, wenn Sie z.B. eine Reinigungsdiskette einlegen
Es handelt sich um eine erweiterte Version des Programms in den Tips & Tricks des AMIGA-Magazins Ausgabe 11/90. Die Routine benötigt folgende Parameter:
« »zeit« — Zeit in Sekunden, nach der das Laufwerk wieder ausge-
schaltet wird
« »laufwerk« — Laufwerksnummer (0 = internes Laufwerk usw.)
Ein gültiger Aufruf sähe z.B. so aus:
CALL diskclean(20.0,0.0)
Damit würde sich das interne Laufwerk für 20 Sekunden drehen. Alexander Scholz/ub
‚Andrea Bomke/ub |
Saubere Sache |
PROGRAMMIEREN
AMIGABASIC
xistenzfragen
Das folgende Unterprogramm »Exists.bas« ist für alle Amiga- BASIC-Programmierer gedacht, die in ihrem Programm überprüfen wollen, ob eine bestimmte Datei existiert, ohne dabei die Datei auf Diskette einzurichten, falls es sie noch nicht gibt.
Sein oder nicht sein? Antwort in AmigaBASIC
Die Routine ist verglichen mit anderen, die dieselbe Aufgabe erfül- len, besonders schnell, da sie nur Funktionen aus der DOS-Library verwendet. Deshalb ist das Offnen der DOS-Library und Deklarieren der Funktion »Lock&« Voraussetzung. Wichtig: Ihr Amiga benötig! die Datei »dos.bmap« im Verzeichnis »Ilibs:« oder im Verzeichnis, in dem »Exists.bas« steht, um das Programm auszuführen.
Das Beispielprogramm überprüft die Existenz des Befehls TYPE im Verzeichnis »C:«. Die Routine funktioniert wie folgt:
Zuerst hängt der Amiga dem Namen der zu überprüfenden Datei ein Nullbyte an, danach kommt das Herzstück der Routine: die Funktion »Lock&«. Ihr übergeben wir als ersten Parameter die Adresse des Namens des Files oder des Directories, dessen Exi- stenz wir überprüfen möchten (mit : SADD (Name$) ). Als zweiter Parameter ist der Modus gefragt, sprich »-1«, wenn in die Datei ge- schrieben werden soll, oder »-2«, wenn aus ihr gelesen werden soll.
Als Ergebnis bekommen wir von »Lock&« einen Zeiger auf eine- FileLock-Struktur, die von einigen weiteren Library-Funktionen aus der DOS-Library benötigt wird, um Informationen über eine Datei zu gewinnen. Wenn das Ergebnis des Aufrufs von »Lock&« Null lautet, existiert die Datei oder das Directory nicht.
Wir geben als Modus »-2« an, da einige Dateien nur gelesen wer- den können (Schreibschutz oder protectet). Falls wir als Modus »-1« angeben und die Existenz einer solchen Datei überprüfen, erhalten wir ein Resultat, als ob die Datei nicht vorhanden sei.
Abschließend müssen wir mit der Funktion »UnLock&« den Spei- cher für die FileLock-Struktur wieder freigeben. Hierzu übergeben
Sie der Funktion »UnLock&« den Zeiger auf FileLock&, den Sie
zuvor erhalten haben. Ein Aufruf »UnLock& 0« bleibt wirkungslos. Falls Sie den »UnLock&«-Befehl vergessen, können Sie auf die überprüfte Datei oder das Directory nicht mehr z.B. vom CLI aus zu- greifen; Sie erhielten die Fehlermeldung: »Object in Use!« Mit »Exists.bas« können Sie auch die Existenz eines Directorys überprüfen, indem Sie als Namen z.B. »Name$="df0:libs"« angeben. Dirk von Diringshofen/ub
Wo ist der Apostroph?
Im AmigaBASIC-Handbuch steht, daß man für Kommentare statt REM auch ein Apostroph (»'«) verwenden kann. Auf der deutschen Amiga-Tastatur sind gleich drei davon. Welcher ist der richtige? Kei- ner, denn der Apostroph, den Sie für REM verwenden, erreichen Sie nur mit der Tastenkombination <Alt ä>.
ub
PROGRAMMIEREN
AMIGABASIC
»Pi« und Verwandte |
« Die Entwickler von AmigaBASIC haben keine Konstanten für »Pi«
und »e« implementiert. So müssen Sie für »Pi« die Zahl »3.141593« |
oder bei doppelter Genauigkeit »3.141592653589794« selbst eintip- pen. bie Arbeit können Sie sich sparen — geben Sie stattdessen ein:
Pit = 4# ) für 7- und 15- -stellige Genauigkeit ein. « Die LOG-Funktion berechnet den natürlichen Logarithmus einer Zahl und der ist nur für positive Zahlen definiert. Der dekadische Lo- garithmus der Zahl n kann mit der Formel lg10 = LOG(n) berechnet werden.
Der natürliche Logarithmus von »e« ist 1. Für »e« können Sie
LOG(10)
daher die Eingabe von 2.718282 sparen, denn EXP(1) und EXP(1#) |
ergeben denselben Wert einfacher und doppelter Genauigkeit.
ub |
Farbige Titel in BASIC
Wußten Sie, daß man die Titelleiste eines Amiga-BASIC Fensters | einfärben kann (Das Menü wird auch farbig)? Das nächste Unterpro- |
Kamm ändert ‘die Vorder- und Hintergrundfarbe der Leiste:
Der Aufruf erfolgt 1ulgeheeimabeh: Farbe (Vordergr & Probieren Sie es Boch einfach einmal in einem Ihrer Programme aus. Beachten Sie, daß die Einfärbung erst dann erfolgt, - wenn Sie die rechte Maustaste drücken, oder — das Fenster deaktivieren und wieder aktivieren, oder - die Fenstergröße mit Hilfe des Größengadgets verändern. Norbert Tausch/ub
Verschiedene Schriftarten
In BASIC besteht die Möglichkeit, einen Text in unterschiedlichen Stilarten darzustellen: — normal - fett — kursiv - unterstrichen - invertiert Zur Wahl einer Sehtifert muß man ins Byte an der Adresse Rastport de : eine Kennziffer schien, Die Kennziffer kann sein: —0 für Normalschrift - 1 für unterstrichen -2 für fett — 4 für kursiv -8 für Breitschrift Es sind auch Kombinationen möglich, z.B. kann man einen Text kursiv und unterstrichen darstellen; die Auswahl erfolgt über die logi- sche UND-Verknüpfung der jeweiligen Kennziffern. Mit einem SUB- Programm, das alle Arbeiten bequem erledigt, macht man sich die Sache einfach:
WINDOW(8) liefert den Zeiger auf den Rastport des aktuellen Fensters. Der Rastport ist eine Datenstruktur in der wichtige Daten zu einem Fenster für die Zeichenfunktionen der Grafik-Bibliothek festgehalten sind, z.B. die Position der Schreibmarke (Cursor), die Farbe zum Zeichnen, ein Schriftstii usw. Unser Unterprogramm
schreibt die übergebene Kennziffer (sie muß mit »&« enden) an die gewünschte Adresse. Der Aufruf erfolgt mit:
Setzen Sie das Unterprogramm ein, um Textausgaben in Ihren BASIC-Programmen noch attraktiver zu machen. Norbert Tausch/ub
Unsichtbarer Syntax error
Kein Fehler im Listing zu sehen und trotzdem bricht das Pro- gramm mit »Syntax error« ab. Tja, BASIC verträgt keine Leerzei- chen hinter einem END IF. Die Abhilfe ist einfach: Cursor an’s Ende der Anweisung END IF positionieren und <Return> drücken.
ırw Trigonometrie auf dem Kopf
Oft benötigt man die Umkehrfunktionen der trigonometrischen Funktionen SIN oder COS. Man übergibt ihnen z.B. den Sinus eines Winkels und erhält den Winkel. Die Umkehrfunktionen kennzeichnen Mathematiker mit dem Präfix »Arcus«. Für den Sinus heißt sie also Arcussinus; Jeder bessere Taschenrechner beherrscht das. In Ami- gaBASIC gibt es leider nur die Arcustangens-Funktion. Die übrigen Arcus-Funktionen leiten wir aus der ATN-Funktion ab:
Beachten Sie, daß der Winkel im Bogenmaß angegeben werden muß (siehe Tip »Grad in Bogenmaß«, Seite 5, oben).
. ub Fehler im BASIC-Handbuch
Im BASIC-Handbuch sind Rückgabewerte der STRIG-Funktion vertauscht:
STRIG(n) Richtung 1 nach unten oder rechts 1 nach oben oder links
Außerdem fehlt die Angabe, daß die STRIG-Funktion bei gedrück- tem Feuerknopf den Rückgabewert -1 liefert.
Irw Object in use - File already open
Der BASIC-Befehl LPRINT gibt Daten an den Drucker aus. Der In- terpreter öffnet dafür einen Übertragungskanal zum Drucker, und so- lange er offen ist, kann kein anderes Programm - kein anderer Task — auf den Drucker zugreifen. Noch schlimmer: Wenn Sie nach LPRINT AmigaBASIC beenden, kann niemand mehr den Kanal schließen. Selbst von der Shell ist der Zugriff auf den Drucker un- möglich; nur die Notbremse <Ctri Amiga_links Amiga_rechts> hilft.
Der gute Rat: Öffnen und schließen Sie den Übertragungskanal selbst (»PRT:« ist der Gerätename des Druckers):
Die Ausgabedatei wird korrekt geschlossen, während das folgen- de ' Kommando den Kanal zum Drucker offenläßt.
Sobald Sie versuchen, während desselben Programmablaufs nach
| LPRINT mit »PAR:« oder »PRT:« einen Übertragungskanal zu öff-
nen, unterbricht BASIC das Programm mit der Fehlermeldung:
CLEAR und END schließen den mit LPRINT geöffneten Kanal: « Der Befehl CLEAR löscht allerdings gleichzeitig alle Variablen und schließt die offenen Dateien; es ist deshalb innerhalb eines Pro- gramms meist unbrauchbar.
« Mit END wird ein Programm beendet. Der Befehl ist also nur am Programmende sinnvoll. Hier hilft nur ein Trick: LPRINT "TEST1"
2»
so weiter... * FOR OUTPUT AS #1
Gewöhnen Sie sich an, jedes BASIC-Programm mit END zu been- den, und Sie werden mit LPRINT keine Probleme mehr haben. Hans Kasulske/ub
Texte, die den Punkt treffen
Jeder BASIC-Programmierer, der ein bißchen Grafik in seine Pro- gramme gebracht hat, wird sich sicherlich schon geärgert haben, daß man Text nicht genau im Fenster positionieren kann, der Befehl LOCATE arbeitet nämlich nur zeilen- und spaltenweise.
Um einen Text an eine genaue Position zu bringen, gibt es in der »graphies brary« den Befehl: lov ıX&,Y&
Er plaziert i im aktuellen Fenster, dessen Rastport-Struktur wir mir WINDOW(8) ansprechen, den Text- und Grafikcursor an der Positi- on mit den Koordinaten x&,y&.
Da es sich bei »Move&« um eine Library-Funktion handelt, benötigt Ihr Amiga die »bmap.«-Datei der »graphics.library«, die Sie am Anfang Ihres Programms öffnen müssen. Das Ganze geht natür- lich einfacher durch entsprechende POKE-Befehle, wie im folgenden ae gezeigt:
SUB T. Y&) STATIC
END SUB
Der Aufruf erfolgt durch:
TextXY (X&,y&)
Man kann also einen Text auch ohne Library genau positionieren. Jens Freisen/ub
BASIC lückenlos
Das Programm »Blank-Test.bas« ist ein schönes Beispiel, wie man eine ASCIl-Datei per BASIC-Programm ändert. »Blank- Test.bas« löscht Leerzeichen (Blanks) am Ende von Textzeilen. Sol- che Blanks stören besonders in BASIC-Programmen, da sie den AmigaBASIC-Interpreter zum Absturz bringen können.
bei Leerzeichen hinter Pro ‚ kann man sie mit Blank-Test be: ON BREAK GOSUB Breek
BREAK ON
Main:
PROGRAMMIEREN
AMIGABASIC
‚e der Datei lesen (bis CHR(13) = Return-Code)
Leerzeichen (Space)
BlankTest.bas
entfernt Leerzeichen am Ende jeder Zeile
Nach dem Start fragt das Programm zunächst nach der Quell- Datei (Source-File). Geben Sie hier den Namen und kompletten Pfad der zu überprüfenden Datei an. Danach <Return> drücken.
Die Datei muß im ASCII-Format vorliegen. BASIC-Programme sind AU zu BEER mit:
SA\ > Bei der folgenden Frage nach der Ziel-Datei (Destination-File) tip- pen Sie bitte Name und Pfad der Datei ein, in die das korregierte Li- sting geschrieben wird. Ist die Datei noch nicht vorhanden, erzeugt Blank-Test eine dementsprechede neue ASCII-Datei. Der gewählte Name darf nicht mit dem der Ursprungsdastei identisch sein.
»Blank-Test« überprüft Textdateien auf zwei Arten: entweder mit oder ohne Unterbrechung. Antworten Sie auf die entsprechende Frage im Programm mit <J> (»Ja«) bzw. <Y> (»Yes«), testet »Blank- Test« jede Zeile, gibt sie mit einigen Zusatzinformationen aus und testet die nächste. Geben Sie <N> (»Nein«) ein, unterbricht »Blank- Test« nach jeder überprüften und ausgegebenen Zeile und wartet auf einen Druck auf die Leertaste.
Hinter jede getestete und ausgegebene Zeile schreibt das Pro- gramm eine kurzes Ergebnisprotokoll, das nicht mitgespeichert wird: — Findet »Blank-Test« keine Leerzeichen hinter dem Text der Zeile, schreibt es dazu:
Am Bildschirm erscheint z.B.: prınr #
- Findet der Prüfalgorithmus Blanks hinter den Befehlen einer Zeile, lautet der Zusatztext: ##+zx0 Anschließend gibt das Programm die korrigierte Zeile und die Mel- dung ® * aus; die Zeile erscheint farbig hervorgehoben. Ein Beispiel:
PROGRAMMIEREN
AMIGABASIC
Blanks zu entfernen, ist sicher nur eine Art, ASCII-Texte zu bear- beiten. Sie können auf ähnliche Weise z.B. in einem Programm be- stimmte Zeichen durch andere ersetzen und das Ergebnis in einer neuen Datei speichern. Probieren Sie’s aus: »Blank-Test.bas« bietet Ihnen eine gute Ausgangsbasis für eigene Programme.
Christian Planckh/ub
DIET) g 1723
»SortSUB.bas« dient dazu, Unterprogramme in einem Programm zu sortieren und ans Ende des Listings zu stellen, was z.B. wichtig ist, wenn man mit dem AC-BASIC-Compiler arbeitet.
Christian Planckh/ub
REM SortSub.bas
10
$(St$,1)) <> 0)
‚phabet$,LEFT$ (Work$,1)) = 0 THEN EXIT SUB (Work$<>**) AND (INSTR(Alphabet$+Zahlen$,LEFT$ (work$,1)) <> 0) MID$ (Work$, 2)
T$(Work$,1) = ":"THEN St$ = MID$(Work$,2)
FT$(St$,1)) <> 0)
Sell HEN sortiert BASIC-Programme
Line buffer overflow
Beim Editieren von BASIC-Listings können Sie eine Zeile mit <Backspace> an die vorherige anhängen. Manchmal quittiert BASIC den Versuch jedoch mit: »Line buffer overflow«. Schneiden Sie in diesem Fall ein Leerzeichen mit CUT aus der vorherigen Zeile aus und schon funktioniert's.
irw
Funktionstasten nutzen
Professionelle Programme werden oft über die Funktionstasten gesteuert. Das funktioniert auch mit AmigaBASIC, weil der Interpre- ter bei INKEY neben den normalen Zeichen auch Steuerzeichen übergibt. Den ASCII-Code der Taste ermitteln Sie mit ASC(). Bei- spiel für eine Abfrage:
Da die ASCII-Codes der Funktionstasten nicht im Handbuch ste- hen, liefern wir sie mit der folgenden Tabelle nach.
irw F-Taste Code F-Taste _ Code Fi 129 F6 134 F2 130 F7 135 F3 131 F8 136 F4 132 rg 137 F5 133 F10 138
Error while opening |
So eine Meldung erscheint evtl. nach dem Anklicken eines Pro- grammpiktogramms. Ihre Ursache: Die Workbench hat AmigaBASIC nicht gefunden.
Beim Speichern eines Programms hinterlegt der Interpreter in der »info«-Datei die Information, in welchem Verzeichnis er selbst (also AmigaBASIC) zu finden ist (Eintrag »default tool«). Beim Anklicken des Piktogramms sucht die Workbench dort die Datei AmigaBASIC, um sie zu laden. Findet die Workbench den Interpreter nicht, er- scheint die obige Fehlermeldung.
Leider stimmt der Eintrag in der »info«-Datei in den meisten Fällen nicht. Klicken Sie dann das Piktogramm einmal an, rufen Sie danach Info im Workbench-Menü auf und tragen Sie in der Zeile »Default Tool« den korrekten Pfad ein (z.B. »ExtrasD:AmigaBASIC«).
|
Zu wenig Speicher?
Jedes geöffnete Fenster braucht Speicherplatz. Wenn Ihr Compu- ter nur 512 KByte hat, können geöffnete Fenster soviel Speicher be- legen, daß der verbleibende Anteil für das gewünschte Programm nicht reicht. Oft hilft ein Trick:
Schieben Sie das Piktogramm des gewünschten Programms aus dem Fenster auf den Workbench-Screen. Schließen Sie danach alle alle Fenster. Auf der Workbench sollten sich jetzt nur noch das Pik- togramm der RAM-Disk, das der Diskette und das Ihres Programms befinden. Wenn Sie Glück haben, hat BASIC nun genug Speicher zur Verfügung. Wenn nicht, können Sie aus der »Startup-Sequence«
PROGRAMMIEREN
AMIGABASIC
Ist die Bibliothek offen, bleibt nur eine Frage: Wie kommt ein Pro- grammierer an die Adressen der Fenster-, Screen- und Rastport- Strukturen? Der Zeiger auf den Datensatz eines Fensters ist schnell gefunden. Der Aufruf
\ liefert die gewünschte Adresse. Den Zeiger auf den Rastport eines
die Befehle LOADWB und ENDCLI löschen (nur beide zusammen), |
denn die Workbench braucht eine Menge Speicher. Programm und AmigaBASIC können jetzt nur noch vom CLI oder der Shell gestartet werden. In diesem Fall ist es sogar besser, gleich den Programm- start in die »Startup-Sequence« einzubauen.
irw Zeichnen mit System
Wer in BASIC programmiert, erstellt i.a. Grafiken in einem Fenster mit den Zeichenfunktionen des AmigaBASIC. Vielen C-Programmie- rern ist allerdings bekannt, daß das Betriebssystem des Amiga spe- zielle Grafikroutinen bereitstellt. Sie sind in der »graphics.library« zu- sammengefaßt. Diese Funktionen sind in mancher Hinsicht vielseiti- ger als die BASIC-Befehle. Sie erlauben es z.B, direkt auf einem Screen zu zeichnen. Das erspart das speicherraubende Öffnen eines Fensters. ’
Was allerdings alle Zeichenroutinen benötigen, ist die Übergabe eines speziellen Zeigers; ein Zeiger auf die Rastport-Struktur. In die- sem Datensatz sind alle wichtigen Daten zusammengefaßt, die das System zum Zeichnen auf einer bestimmten Fläche benötigt. Dabei kann es sich um ein Fenster (Window) oder auch um einen Bild- schirm (Screen) handeln. Wenn beispielsweise eine Linie in einem Window gezeichnet werden soll, sieht der Befehl in C wie folgt aus:
Ein anderer Weg ist, die Rastport-Struktur eines normalen Intuiti- on-Screens zu verwenden:
Draw (&(Screen
>RastPort) 10, 10C Die Möglichkeit, die Grafikfunktionen des Systems zu nutzen, bie- tet sich auch den BASIC-Anhängern. Doch muß der BASIC-Pro- grammierer dann auf die normalen Grafikbefehle verzichten. Dafür erhält er andere effiziente Funktionen in die Hand. Um an die be- gehrten Routinen zu kommen, benötigt man die Datei »graphics.bmap«. Sie befindet sich auf der ExtrasD-Diskette im Ord- ner »Demos«. Die Bibliothek wird geöffnet durch den Befehl: LIBRAR Am Ende eines Programms muß man dann immer daran denken, die Bibliothek wieder zu schließen. Der Befehl hierzu:
LIBRARY SE
"graphics. Library"
Fensters findet man in der Fensterstruktur an 50.Stelle.
Beim Screen sieht die Sache komplizierter aus. Zuerst öffnet man wie gewohnt einen Screen. Jetzt öffnet man ein kleines Fenster auf dem Screen, das kaum Speicherplatz kostet:
Über den Umweg des Fensters erhält man den Zeiger auf den Da- tensatz des Screens:
Der neue Zeiger liefert die Adresse der Screenstruktur. Das Fen- ster kann nun wieder geschlossen werden. Um an die Struktur des Rastports diese Screens zu gelangen, genügt die Anweisung:
Die zweite Zeile ermittelt einen Zeiger auf eine weitere wichtige Struktur; die ViewPort-Struktur. »view« wird benötigt, wenn man z.B. die RGB-Werte einer Farbe ändern möchte. Anstelle von PALETTE schreibt man:
Der Aufruf setzt die Farbe 1 auf weiß. Um eine andere Zeichenfar- be zu wählen, ruft der Programmierer nun nicht mehr COLOR son- dern die Funktion:
Ein wichtiger Befehl ist MOVE. Er erlaubt es, den Grafikcursor zu positionieren. Viele Grafikbefehle aus der Grafikbibliothek starten ihre Aktion von diesem Cursor aus.
Den kompletten Bildschirm löscht der Befehl:
- Eine Linie zieht man z.B. von (10,10) bis (100, 100) mit:
Bei der Ausgabe von Text muß man jetzt auf den Bildpunkt genau bestimmen, wo der Text stehen soll. Dies geschieht wiederum mit MOVE und dann durch den Aufruf:
Die SADD-Funktion in diesem Aufruf ist notwendig, da zur Text- ausgabe die Anfangsadresse des Textes im Speicher erforderlich ist. Damit soll es erst einmal genug sein. Probieren Sie die neuen Optionen, die Ihnen das Betriebssystem auch in BASIC eröffnet ein- mal aus. Es gibt viel zu entdecken.
Jürgen Brendel/ub
So liegen Sie richtig
In BASIC ist immer das zuletzt definierte Fenster aktiviert. Möchte man nun in einem anderen Fenster Daten von der Tastatur einlesen, leitet man mit
die Eingabe entsprechend um. Bevor jedoch eine Eingabe erfolgen
| kann, muß das Window mit der Maus aktiviert werden. Der Aufruf
der Intuition-Anweisung
vor dem INPUT-Befehl macht diesen Handgriff überflüssig. Das Ganze in einem Programm sieht so aus:
Das kurze Beispiel zeigt, wie Sie ein Fenster auch ohne Maus ak-
| tivieren. In der ersten Zeile steht ein Statement zum Öffnen der Intui- tion-Library. Eingefleischte BASIC-Programmierer wissen selbstver-
11
PROGRAMMIEREN
AMIGABASIC
ständlich, daß dieser Befehl nur funktioniert, wenn sich die Datei »In- tuition.bmap« im selben Verzeichnis wie das BASIC-Programm oder im Ordner »libs« der Startdiskette befindet.
Bruno Goldmann/ub
Patch: BASIC ohne Bilder
Viele BASIC-Programmierer haben eine »persönliche« BASIC- Diskette angelegt — mit Autostart, AmigaBASIC und allen wichtigen »bmap«-Dateien. Auf der Diskette kann man Platz sparen, wenn | man auf die Workbench verzichtet; BASIC-Programme lassen sich auch vom CLI starten, dann braucht man die Icons nicht mehr; man kann die »info«-Dateien löschen. Allerdings erzeugt AmigaBASIC immer neue Piktogramme, wenn man ein Programm sichert. Die Lö- sung hierfür ist ein Patch:
WEHREN
Brauchen Sie Icons zu Ihren BASIC-Programmen?
Dieser Patch ist für die BASIC-Version mit einer Länge von genau | 103 500 Byte geeignet. Ein kleiner Nebeneffekt: Programme werden vom BASIC-Interpreter schneller gespeichert.
Carsten Mallek/ub
GROSSES List-Fenster
Der im AMIGA-Magazin 8/88, Seite 87 abgedruckte Tip verändert das Ausgabe- und List-Fenster des AmigaBASIC mit einem Disket- ten-Monitor. Die Änderung läßt sich auch per Programm realisieren:
WEHAIEN
Spendieren Sie AmigaBASIC ein großes Fenster
Wenn Sie das Programm eingegeben haben, testen Sie es am be- sten mit einer Kopie von AmigaBASIC - sicher ist sicher. Matthias Brehl/ub
12
| ASCII-Codes
Welches Zeichen hat welchen ASCII-Code? Hier ein BASIC-Pro- gramm, das eine Liste aller verfügbaren Zeichen ausdruckt. Bitte be- achten Sie, daß dieses Programm Endlospapier voraussetzt.
Andree Popp/ub
HRS (27) ;"R";CHRS (0) ;
Das Programm gibt die ASCII-Codes aller Zeichen auf dem Drucker aus =
CUT & COPY einfacher
Wenn Sie in einem BASIC-Listing ein Wort mit »Cut« ausschnei- den oder mit »Copy« kopieren, brauchen Sie es nicht umständlich mit einer Mausbewegung markieren. Mit der Maus zweimal anklicken genügt.
irw
Find & Replace
Manchmal möchte man wissen, ob in einem Listing ein Variablen- name schon vergeben wurde. Oder man möchte eine Zeichenfolge durch eine andere ersetzen. Dafür gibt es in AmigaBASIC keine An- weisungen. Der Editor ED hat sie; er befindet sich normalerweise im Verzeichnis »c« der Workbench-Diskette. Sie können natürlich auch jeden anderen Editor mit dieser Funktion verwenden.
Kopieren Sie als erstes Ihr BASIC-Programm als Textdatei in die RAM-Disk mit:
save m: Programmname" ‚a
Dann verkleinern Sie das BASIC-Fenster so weit wie möglich.
Damit haben Sie Zugriff auf die Workbench und können ein CLI- | oder Shell-Fenster öffnen. Dort rufen Sie den ED auf und geben den |
Programmnamen an:
ed "ra
Funktionen nutzen. Wenn Sie nur einen Begriff suchen, drücken Sie <Esc> und geben ein: £"Suchtext" oder £/Suchtext
Nach <Return> sucht der Amiga ab der aktuellen Cursorposition bis zum Textende nach der Zeichenfolge »SuchText«. Hat er den Text gefunden, können Sie mit der Tastenkombination <Ctrl g> wei- tersuchen.
Wollen Sie eine Zeichenfolge durch eine andere ersetzen, geben Sie nach <Esc> ein:
erst xt ext"
satztext Nach <Return> sucht ED ab der aktuellen Cursorposition nach »Suchtext« und ersetzt ihn durch »Ersatztext«. Mit <Ctrl g> suchen und ersetzen Sie weiter.
Das Original des BASIC-Programms bleibt bei alldem unverän- dert, da wir mit dem ED nur die Version in der RAM-Disk bearbeiten. Speichern Sie das Programm unter dem alten, besser einem neuen Namen, und beenden Sie ED mit <Esc> <q>. Bringen Sie danach das BASIC-Fenster wieder auf normale Größe und laden Sie das geänderte Programm.
irw
SI LEBTE]
Mit <Amiga_links V> und <Amiga_links B> kann man DOS-Re-
quester zwar beantworten, aber es wäre auch nützlich, die Reque- |
ster auf den eigenen Screen umlenken oder verschwinden lassen zu können. Dafür ist das folgende Programm gedacht, dem man
— einen Zeiger auf das Fenster übergibt, in dem der Amiga die Re- quester anzeigen soll;
— 0 übergibt, wenn man Requester auf den Workbench-Screen um- lenken möchte; oder
— -1 übergibt, falls man Requester unterdrücken möchte
Damit haben Sie das Programm im ED und können alle seine |
PROGRAMMIEREN
AMIGABASIC
Das Ganze ist natürlich auch in Assembler machbar, wie das näch- ste Listing zeigt. ub
Requester.asm
| | | Requester umlenken - Lösung in Assembler |
Maus in Motion
Im AMIGA-Magazin 2/91 stand ein C-Programm, das den Sprite bewegt, der für den Mauszeiger verantwortlich ist. Das geht natürlich auch in BASIC. »MouseMove.bas« ändert die »Simple-Sprite«- Struktur, was in BASIC einfach zu realisieren ist.
MausMove.bas Die Maus läßt sich auch per Programm steuern
LTTTIENSCOAES
Requester umlenken - erstmal in BASIC
Sie finden im Beispiel eine Suchroutine, um die Basisadressen von Libraries zu finden; wobei über »ExecBase« die »LibList« nach den Namen durchsucht wird.
Andree Popp/ub
Kleiner zum Scrollen
|
| Viele BASIC-Programmierer vergrößern das LIST-Fenster beim Programmieren wegen der besseren Übersichtlichkeit auf das Maxi-
| mum. Ein Nachteil: Man verlangsamt dadurch die Geschwindigkeit beim Scrollen enorm. Um das zu verhindern, verkleinern Sie einfach
| das Fenster wieder soweit wie möglich, bevor Sie durch ein Listing
| scrollen.
| Sean Durkin/ub
13
PROGRAMMIEREN
AMIGABASIC
Jetzt kommt Bewegung in’s Spiel
stimmt die Höhe des Alerts in Punkten auf dem Bildschirm. Mit ver- änderter Fehlerabfrage und anderen Texten, kann man das Pro-
Der Amiga ist in der Lage, mehr als 640x512 Punkte auf dem Mo- | gramm seinen Wünschen anpassen.
nitor darzustellen. Wie? Im sog. Overscan-Modus (bis 704x564). Um in BASIC ein größeres Bild verwenden zu können, muß der Bild- schirm nach links oben verschoben werden, damit alle Punkte sicht- bar sind. Diese Einstellung erfolgt mit den Preferences. Sie kann aber auch per Programm vorgenommen werden.
ScreenShift.bas
Im Overscan-Modus vergrößert sich die höchste darstellbare Auflösung um rund 10 Prozent
Mit »MoveScreen« läßt sich ein Screen lediglich in der Vertikalen verschieben. Eine Möglichkeit, ein Bild auch in der Horizontalen zu bewegen und zu zentrieren, besteht im Ändern der View-Daten. Die letzten vier Zeilen des Beispiels stellen vor Verlassen des Pro- gramms die alte Bildposition wieder her. Es kann u.U. nötig sein, im Overscan das Bild mit den Reglern am Monitor zu verkleinern, oder je nach Gerät andere Startkoordinaten in der View-Struktur einzuset- zen. Hier sollten Sie ein wenig experimentieren.
Bruno Goldmann/ub
Schriftzug fährt ab |
Folgendes Programm scrollt den Schriftzug »AMIGA-Magazin« von links oben schräg nach unten und vergrößert in dann. ub
Ein Schriftzug kommt ins Rollen
BASIC schlägt Alarm
Auch in BASIC kann man Alarm-Meldungen (Alerts) ausgeben. Das folgende Listing zeigt, wie man vorgehen sollte.
Das Programm nutzt eine Subroutine zur Fehlerabfrage mit einem Recovery-Alert in BASIC. Aufgerufen wird der Alert mit: DispläyAlert (Typ, Text,Höhe)
Die Variable Typ gibt an, welcher Art der Alert ist (Recovery-Alert = 0). Text ist eine Zeiger auf den darzustellenden Text und Höhe be-
14
Wolfgang Stellwagen/ub
LEE System-Alert auch in BASIC machbar
Teile von BASIC speichern
Mit einem Trick ist es möglich, Teile eines BASIC-Programms zu speichern. Sie müssen lediglich im List-Fenster die erste Zeile des ausgewählten Blocks mit der Maus anklicken, die linke Maustaste drücken und die Maus bis zum Ende des gewünschten Blocks nach unten bewegen. Der ausgewählte Bereich erscheint farbig hervorge- hoben. Nun klicken Sie das »Edit«-Menü an und rufen »Copy« auf.
AmigaBASIC speichert nun den Programmteil — im ASCII-Format — im Verzeichnis »RAM:« unter dem Dateinamen »BASICClip«. Sie können die Datei über die Shell, das CL! oder mit einem CLI-Tool wie Diskmaster unbenennen und auf Diskette kopieren.
Wenn Sie den herausgeschnittenen Teil später in einem BASIC- Programm verwenden möchten, laden Sie die gespeicherte Datei über die Shell mit folgendem Befehl ins Verzeichnis »RAM:«:
Sobald Sie nun im »Edit«-Menü »Paste« anklicken, holt der Amiga den Programmteil aus der RAM-Disk und setzt in an der Stel- le im Programm ein, an dem sich die Schreibmarke gerade befindet. Als Alternative bietet es sich an, den gesicherten Programmteil mit MERGE an ein neues Programm anzuhängen.
Martin Grewey/ik
Bildausschnitt
Wer schon einmal mit dem Icon-Editor auf der Extras-Diskette ge- arbeitet hat, kennt sicher die Funktion »Frame And Save«, um einen rechteckigen Ausschnitt aus einer Grafik als Bilddatei auf Diskette zu sichern. Hierzu klickt man (Taste sofort wieder loslassen) mit der Maus einen ausgewählten Punkt an, an dem eine Ecke des Recht-
ecks liegen soll. Es erscheint ein roter Rahmen, der mit einem Ende am Eckpunkt und mit dem anderen am Mauspfeil hängt. Sie können den Rahmen mit der Maus so bewegen, daß er den gewünschten Ausschnitt umschließt; klicken Sie den entsprechenden zweiten Eck- punkt des Rechtecks, über dem der Mauszeiger am Schluß steht, ebenfalls an. Der Amiga speichert den angewählten Teil des Bilds anschließend in einer Datei, deren Name Sie im Auswahlfenster der SAVE-Funktion vorgeben.
So eine Schere für Bildausschnitte ist natürlich auch eine feine Sache, wenn man andere Grafiken bearbeiten möchte. »MakeBox.sub.bas« hält eine entsprechende Funktion für AmigaBA- SIC bereit. Das Programm, in dem Sie »MakeBox.sub.bas« aufru- fen, benötigt die geöffnete »graphics.library« (siehe Beispiel.
SUB Makebox (x,y,i,j) STATIC REM bei Programmaufruf stehen REM Rechtecks, bei Rück j die x- bzw, y-Koordi M Das Unterprogranm benötigt
x und y die Anfang Programm
LE MOUSE(0) <> 0 : WEND ‘Warten, bis Maustaste losgelassen wurde
REM Zeichnen des Rechtecks LINE (x,y)-1i1,jj),,b
MOUSE (0) MOUSE(1) MOUSE (2) ND ii =
iDjj=jm
0 box2 REM erneutes Zeichnen stellt ursprüngliches Zustand wieder her, REM da Grafik im XOR-Modus
LINE (x,y)-(ii,jj),,b ii=i 2“)
REM Maustaste nicht gedrückt IF ac>-1 THEN GOTO boxl
REM ist die Maus überhaut bewegt worden? IF x = OR y = j THEN GOTO boxl
REM normalen Graphikmodus wieder einschalten CALL Normal
END SUB
SUB Invers STATIC
REM XOR: hik einschalten, der Aufruf benötigt die Adresse der REM Rası -Struktur CALL SetDrMd& (WINDOW(8),3)
END SUB
SUB Normal STATIC
REM normalen Grafikmodus (JAMl anschalten CALL SetDrMds (WINDOW(8),1)
END SUB
MakeBox.sub.bası Schere für Grafiken
Das folgende Programm zeigt ein Beispiel für den Aufruf des Un- terprogramms »MakeBox.sub.bas«. Thomas Blenkers/ik
PROGRAMMIEREN
AMIGABASIC
HETTRIE ES Beispiel für den Einsatz von »MakeBox.sub.bas«
Anderer Zeichensa
Warum soll man immer denselben Zeichensatz (Font) verwenden, wenn man mit dem Amiga arbeitet? Benutzen Sie doch einmal einen anderen Font - im Verzeichnis »FONTS« der Workbench-Diskette bzw. der Extras-Diskette stehen so viele verschiedene.
Das Programm »Font.bas« versucht zunächst, den gewünschten Font aus dem Kickstart-ROM (»OpenFont()«) und dann von Diskette (»OpenDiskFont()«) zu laden. Falls es den Zeichensatz findet, lädt es ihn, und die Routine »SetFont()« setzt die Schrift; sie wird am Ende des Programmes mit »CloseFont()« wieder gelöscht.
Bitte achten Sie darauf, daß im Verzeichnis, in dem Sie »Font.bas« ablegen auch die Dateien »diskfont.bmap« und »gra- phics.bmap« stehen müssen, damit das Programm läuft.
Karsten Schmitt/ik
Font (FontName$,Height%) STATIC
"font *+CHR$ (0)
(TextAttr&(0)))
OpenDiskFont& (VARPTR (TextAttr&(0))) 'ont& THEN SetFont WINDOW(8) ‚Font&
END SUB
THEN CloseFont Font&
Neue Zeichensätze braucht das Land
15
PROGRAMMIEREN
AMIGABASIC
Drucker testen
Das folgende Programm liest ein Byte aus der Speicherzelle aus, in der sich der aktuelle Druckerstatus befindet und gibt je nach Wert einen bestimmten Text aus.
Karsten Schmitt/ik
LOCATE 1, »Druckstatus.bas« überprüft den angeschlossenen Drucker
Wieviel Speicher
Das Programm »Avail.bas« zeigt den momentan verfügbaren Speicher an.
DET RIERR Tankuhr für den Speicher
Das BASIC-Programm nutzt die Funktion »AvailMem(Typ)« der »exec.library«. Mögliche Speichertypen sind: -0 oder 1 : gesamter Speicher -2. oder 3: nur Chip-Mem —4 oder 5 : nur Fast-Mem Wird 131 072 zu einem Speichertyp addiert, erhalten Sie den größ- ten, freien Speicherblock.
Karsten Schmitt/ik
Darstellung des Henon-Attraktors
Das BASIC-Programm »Henon.bas« zeichnet den aus der Chaos- Forschung stammenden und von Michel Henon entwickelten Attrak-
tor auf einem Amiga-Screen. Dazu wird jeder Punkt der Zeichenebe- |
ne (bestehend aus x- und y-Koordinate) nach dem Gleichungssy- stem berechnet
x 1-1.4*x
y
Man muß nur ein Anfangspunkt wählen. Die errechneten Werte werden in einer Schleife immer wieder neu in die Gleichungen ein- gesetzt. Zur Darstellung werden die ermittelten x- und y-Werte dann noch auf die Bildschirmkoordinaten umgerechnet. Wird die Schleife
16
oft genug durchlaufen, ergibt sich ein recht genaues Abbild dieser komplexen Zahlenmenge.
Attraktor.bas Hohe Mathematik mit Amiga
\ Wenn Sie y1 und y2 verändern, können Sie Ausschnitte der Grafik \ betrachten. Alexander Lüdemann/ik
Workbench auf und zu
Folgendes Programm demonstriert, wie Sie von BASIC aus den Workbench-Screen schließen bzw. öffnen:
workbench.bas Per Programm die Workbench schließen
Die Routinen »OpenWorkBench()« und »CloseWorkBench()« wer- den zu Beginn als Funktionen definiert, da sie einen Rückgabewert besitzen. Nach erfolgreichem Öffnen der Workbench wird der alte Screen mit »WBenchToBack()« in den Vordergrund gebracht.
Um das Programm erfolgreich zu starten, müssen das List- und Ausgabefenster (Window 1) auf der Workbench geschlossen sein. Außerdem muß sich die Datei »intuition.bmap« im Ordner »libs« oder im selben Verzeichnis wie das Demo-Programm befinden.
ik
Runden mit Basic
Wer in Basic eine Zahl runden will, kann dies leicht mit den Funk- tionen CINT() und CLNG() machen. Beide haben jedoch den glei- chen Fehler: Wenn die Einerstelle gerade ist und die Nachkomma- stelle genau 5, runden die Funktionen ab, statt auf. Das nächste Programm beseitigt den Fehler mit einer Subroutine, die gleichzeitig auf n Dezimalstellen rundet.
Karsten Schmitt/ik
(x,n%) STATIC
* IF (x)-FIX(x) = .5 AND FIX(x) /2=FIX(x/2) x = CLNG(x) /10’n%
END SUB
MINLEHBIER Besser als die Rundungsfunktionen von BASIC
Eigene Icons für AmigaBASIC
Wer hat sich noch nicht darüber geärgert, daß die Icons (Bildsym- bole) der AmigaBASIC-Dateien alle gleich aussehen? Ändern der Icons mit dem »IconEd« lohnt sich nicht, denn kaum hat AmigaBA- SIC die Datei wieder bearbeitet, ist das Standard-Bildsymbol wieder da. Ein kurzes BASIC-Programm schafft hier Abhilfe. Es läßt sich einfach in bestehende Programme einbauen.
Zunächst muß einmalig mit dem Programm »ConvertFD« aus dem Verzeichnis »BasicDemos« der ExtrasD-Diskette die ».bmap«- Datei für die Icon-Bibliothek erzeugt werden. Dieser Vorgang ist im AmigaBASIC-Handbuch ausführlich beschrieben.
Anschließend können Sie das gewünschte Icon mit dem auf der Workbench-Diskette befindlichen Symbol-Editor (Icon-Ed) zeichnen.
Beim Test des Listings wurde das erstellte Icon in einem mit »MAKEDIR DBOBJ« erzeugten Verzeichnis unter dem Namen »DBlcon.info« abgelegt. Der Zusatz ».info« braucht nicht angegeben zu werden. Er wird von Put/GetDiskObjekt automatische generiert. Die ».bmap«-Datei wurde ins Verzeichnis »basiclibs« gelegt.
PROGRAMMIEREN
AMIGABASIC
Die neue Routine weist das DBlcon allen Programmen zu, deren Namen eingegeben wird. Der Filename »ende« bricht die Verarbei- tung ab. Eventuell auftretende Fehlermeldungen haben folgende Be- deutung:
Bei Verwendung in eigenen Programmen muß die Routine hinter der CLOSE-Anweisung für die jeweilige Datei stehen, da sonst wie- der das Einheitsicon auftaucht.
Hans Keutgen/pa
Gegen Monotonie — sorgt für neue BASIC-Icons
Wohin mit den .bmaps?
Um zu gewährleisten, daß AmigaBASIC die ».bmap«-Dateien auch immer findet, sollten diese ins Verzeichnis »libs« Ihrer System- Diskette kopiert werden. So können Sie Ihr BASIC-Verzeichnis belie- big mit CHDIR wechseln, ohne eine LIBRARY-Anweisung mit »File not found« quittiert zu bekommen. Außerdem brauchen Sie die ».bmap«-Dateien nun nur noch auf einer Diskette, egal wieviele BASIC-Disketten Sie haben.
Angela Schmidt/ub
| Copy und Paste
Beim Entwickeln verschiedener Programme mit ähnlichen Struktu- ren kann es vorkommen, daß sich viele Programmteile untereinan- der gleichen. Eine einfache Methode, Programmteile von einem Pro- gramm ins andere zu übertragen, ist die Verwendung der COPY- Funktion aus der Menü-Leiste. Laden Sie das Programm, in dem der
17
PROGRAMMIEREN
AMIGABASIC
gewünschte Programmteil steht, markieren Sie ihn und aktivieren danach die COPY-Funktion. Das Segment wird nun im »Clipboard« (Zwischenspeicher) gespeichert. Nun können Sie das Programm laden, in dem dieser Programmteil benötigt wird, den Cursor positio- nieren und mit PASTE das Segment in den Speicher übernehmen. Uwe Bäumler/pa
Es darf gepatcht werden
Mit einem gepatchten CLI können Sie die tollsten Sachen ma- chen, z.B.die Größe des CLI-Fensters und dessen Titel festlegen. Interessiert? Sie können außerdem einen vier Buchstaben langen CLI-Befehl angeben, der nach dem Start des CLI ausgeführt wird.
Schauen wir uns erst das zum” Patchen benötigte BASIC-Pro- gramm an. Als kleine Vorbereitung geben Sie im CLI folgendes ein: COPY system:CLI.info RAM:
PROTECT RAM:CLI.info WER ENDCLI
So wird das. Experimentieren erleichtert, da das CLI-Icon vor einem Überschreiben geschützt ist. Laden Sie nun AmigaBASIC und geben folgendes Programm ein:
OPEN »SYS:system/CLI« F( OPEN »RAM:CLI« FOR OUTPUT AS #2
M; imiga-CLI”+STRING$ (6,0)
Befehl$
CLI_Patcher.bas
Damit bekommen Sie ein CL! mit dem gewissen Extra
Die Bedeutung der Variablen:
- Wind$: Der erste Teil dieses Strings entspricht auch der Fenster- eingabe des Befehls NEWCLI. Damit dürfte die Syntax bekannt sein. Wichtig ist, daß die gesamte Zeichenkette 27 Byte lang sein muß. Falls Ihr String kürzer sein sollte, füllen Sie ihn entsprechend mit Null-Bytes auf. (Im obigen Beispiel werden 6 Null-Bytes angehängt).
- Befehl$: Der auszuführende Befehl mit maximal vier Zeichen.
Das Programm übernimmt den ersten Teil des Original-CLI und kopiert die Daten in ein neues CLI-Programm. Dann flickt der »Pat- cher« die neuen Parameter des CLI-Windows ein. Am Schluß wird der Rest des Programms CLI kopiert. Sie haben nun ein neues Pro- gramm CLI in der RAM-Disk. Probieren Sie es gleich aus: Öffnen sie das Fenster der RAM-Disk und klicken das CLI-Icon an. Wenn alles stimmt, öffnet sich ein riesiges CLI-Fenster, in dem sofort die Anwei- sung LIST ausgeführt wird. Im Prinzip können Sie auch alle anderen CLI-Befehle von der Workbench zugänglich machen. Doch damit nicht genug. Wenn Sie mehr wollen, els nur LIST oder einen ande- ren Befehl auszuführen, verwenden Sie EXECUTE.
»EXECUTE ist aber länger als vier Buchstaben«, meinen einige Zweifler. Richtig, aber nennen Sie EXECUTE einfach in »X« um. Oder geben Sie EXECUTE mittels ASSIGN einen anderen Namen:
AS:
c: Experten sehen schon, was dabei herauskommt. Sie können beim Start des CL! von der Workbench den Befehl EXECUTE ausführen lassen und damit eine beliebige Befehlsdatei abarbeiten lassen. In dieser Batch-Datei können beliebige viele und beliebige lange CLI- Befehle stehen. Allerdings darf der Name des Batch-Files nicht län- ger sein als zwei Zeichen, aber das läßt sich verkraften, oder?
Vielleicht noch ein paar Anregungen zu diesem mächtigen Tip:
Wenn Sie z.B. ED von der Workbench starten möchten. Wählen Sie ein kleines CLI-Fenster, z.B.:
"0/0/300/40
18
Als Befehl geben Sie »ED ?« ein. Wenn Sie nun das CLI-Icon in der RAM-Disk anklicken, öffnet sich ein CLI-Fenster, und der An- wender braucht nur noch den Namen der zu bearbeitenden Datei eingeben. Natürlich sollte man dafür nicht das wertvolle CLI-Icon op- fern. Weitaus besser ist es, wenn Sie ein neues CLI erstellen und beispielsweise CLI_ED nennen. Hierzu muß man nur das gepatchte RAM-CLI markieren und aus dem Menü der Workbench »Duplicate« wählen. Die Kopie wird mit »Rename« umbenannt und auf die Work- bench kopiert. Und ein letzter Hinweis. Erstellen Sie für alle CLI-Be- fehle, die Sie von der Workbench aufrufen möchten, eigene Icons.
Angela Schmidt/ub
Gut geschaltet in BASIC
Das Programm »Gadget.bas« ermöglicht es AmigaBASIC-Pro- grammierern, Schalter (Gadgets) einfach und schnell abzufragen: Die Routine besteht im wesentlichen aus zwei SUB-Befehlen:
« SET.GADGET SET.GA Nummer$,x%,y$, Text$ Dabei ist:
Nummer : x ys
die Nummer des Gadgets
Text$ : Text
Zwei Beispielaufrufe zum Ausprobieren: 0," laden®
« CHECK.GADGET
Anzahl%,wahl$%
mer der abzufragenden Gadgets
1% Diese Anweisung fragt die beiden oben gesetzten Gadgets ab. Das Ergebnis steht nun in der Variable Wahl% und kann im Pro-
gramm eingesetzt werden, z.B. so: ne - Be
Mit den Gadgetroutinen sind Sie nun in der Lage, all Ihre BASIC- Programme voll über die Maus steuern zu lassen — ein Komfort, der den Aufwand wert ist.
F.Bachmann/ub
: gadget.yl&(nr$) = yi+12
Gadgets.bas
in Basic - am besten mit Unterprogrammen
Programmieren
PROGRAMMIEREN
GFA-BASIC
Gfa-BASIC
Hier nun ein paar Tricks für Gfa-BASIC-Programmierer — sowohl für Gfa-Anfänger als auch echte Profis. Viele Kniffe lassen sich auch in andere Sprachen umsetzen.
fa-BASIC ist neben AmigBASIC einer der beliebtesten
BASIC-Dialekte für den Amiga. Deshalb haben wir für Gfa-
BASIC-Programmier natürlich auch eine Menge Tips ge-
sammelt. Alle Programme lassen sich vom GFA-Interpre- ter mit MERGE laden, wurden mit der Gfa-Version 3.5 geschrieben und auf einem Amiga 2000 mit 1 MByte Chip- und 2 MByte Fast- RAM getestet; laufen aber auch mit der Grundversion eines Amiga 500 mit 512 KByte.
Gfa-Programme immer größer W
Wenn man in Gfa-BASIC ein Programm schreibt und es oft startet, ändert und erweitert, stellt man fest, daß das Programm auf der Dis- kette immer mehr Platz benötigt und der Speichervorgang immer länger dauert. Dem Programm wird mehr und mehr Speichermüll an-
gehängt, den es gar nicht braucht. Dasselbe beobachtet man auch |
beim normalen AmigaBASIC. Die Programmgröße läßt sich zum Glück wieder reduzieren, indem Sie das Programm zwischendurch mit »SAVE, A« aus der
Menüleiste speichern. Anschließend löschen Sie den Speicher mit |
NEW und lesen das vorher gespeicherte Programm mit MERGE wieder ein.
Nach dieser Prozedur kann man das Programm wieder mit dem |
normalen SAVE speichern. Es ist jetzt ein wenig kürzer. Der Effekt macht sich besonders dann bemerkbar, wenn ein Programm viele Variablennamen verwendet. Die Aktion lohnt sich auf jeden Fall, wenn Sie ein Programm fertiggestellt haben und es unkompiliert be- nutzen möchten.
F.Reinert/ub
Gfa-Absturz
Einige Gfa-BASIC-Kommandos werden vom Gfa-Compiler V.3.5 nicht ordnungsgemäß verarbeitet:
« Als erstes ist da der Befehl CHDIR zu nennen. Normalerweise wechselt er das aktuelle Verzeichnis. Ein kompiliertes Programm stürzt allerdings früher oder später ab; spätestens, wenn man es be- endet. Ersatzweise sollte ein Pfad, der oft benötigt wird, in einer String-Variablen gespeichert und bei Bedarf dem Filename vorange- stellt werden. Das erfordert zwar mehr Programmaufwand, dafür läuft das Programm einwandfrei.
« Als zweiter Befehl ist CHAR zu erwähnen. Man verwendet ihn, um beliebige ASCII-Texte in einen bestimmten Speicherbereich zu schreiben. Bei dem Speicherbereich dürfte es sich vornehmlich um Strukturen handeln.
Ein mit CHAR geschriebener Text wird automatisch mit »CHR$(0)« abgeschlossen. Der Gfa-Interpreter erledigt diese Aufga- be einwandfrei. Ein kompiliertes Gfa-Programm, das den CHAR-Be- fehl benutzt, stürzt ab. Um dem aus dem Weg zu gehen, muß man den Text »zu Fuß«, Buchstabe für Buchstabe in den Speicher
schreiben bzw. aus dem Speicher lesen. Hierzu dienen die beiden Unterprogramme »readchar$« und »writechar$«, die Sie in Ihre Pro- gramme einbauen können:
»readchar« und »writechar«
Gfa-BASIC-Funktionen zum - absturzfreien !—- Lesen und Schreiben von Daten in Strukturen
ESaeherk ist als Funktion ausgelegt, sodaß ein Text mit: in die Variabe Ins Übertragen wird. Mit:
wird der Inhalt von in text$ ab Adresse »adresse« in den Speicher ge- schrieben und mit CHR$(0) abgeschlossen. Wenn Sie beide Unter- programme als ASCII-File mit der Endung ».LST« auf Diskette spei- chern, lassen sie sich in jedes Programm einbinden (MERGE).
ub TIPS ZU GFA-BASIC AUF EINEN BLICK
Tip Thema Seite Immer_größer Tip zum Speichern von Gfa-Programmen 19 Gfa-Absturz Fehler des Gfa-Compilers beheben 19 Color-Fade Beliebige Farbregister ein- und ausblenden. 20 IFF-Lib_mit_GFA IFF-Bilder mit der 'iff.library' von der
PD-Disk Fish 301 einlesen und darstellen. 21 Farbrequester Requester zum Ändern der Farbregister
»req.library« (Requester-Bibliothek) im Einsatz 22 Rahmenlos Fenster ohne Rahmen und Titelleiste 23
19
PROGRAMMIEREN
GFA-BASIC
CZK ENT]
Es ist immer eindrucksvoll, wenn Texte nicht einfach auf dem Computermonitor erscheinen, sondern langsam eingeblendet wer- den. Wie erreicht man so etwas in eigenen Programmen?
Ganz so leicht ist es nicht. Sicher, den ganzen Bildinhalt ein- und auszublenden, ist einfach: Die Farbpalette wird einfach von 0 bis 100 Prozent aufgebaut und schon ist es passiert. Doch wenn Ihre Ansprüche höher sind, Sie z.B. einen Schriftzug vor einem Hinter- grundbild einblenden möchten, müssen Sie beliebige Farbbereiche einblenden können.
Dabei tauchen zwei Schwierigkeiten auf:
— Wenn der Hintergrund (Farbe 0) nicht mit ausgeblendet wird, müs- sen die anderen Farben an den Hintergrund angeglichen werden.
— Wenn der Hintergrund hell ist, müssen einige Farben (je nach ihrer Helligkeit) heller, andere dunkler werden.
Die folgenden Color-Fade-Routinen bestehen aus fünf Unterpro- grammen (Listing »color-fade.Ist«), mit denen es möglich ist, jedes Farbregister einzeln oder beliebig viele auf einmal auszublenden.
Color-Fade mit Gfa-BASIC
FUNCTION read. ‚color (screen, register) col!
REEN (screen)
PROCEI
r (screen, 0)
(co: ((col$ AND &HFO),4) »
20
Colorfade.Ist
Fünf Gfa-Unterprogramme zum sauberen Einblenden, die Sie in eigene Programme einbauen können
Zu den einzelnen Funktionen: .1. Funktio! h
color = FN read_color (screen, er) Das Unterprogramm ermittelt die RGB-Zusammensetzung des Farb- FARBEN. »register«. ‚Sie setzt sich wie folgt zusammen:
56 + grün*l6 Übergeben Sie in »screen« die Nummer des Screens, den Sie ver- wenden. »color« liefert die Farbeinstellung.
.2. Funktion,
regi,
-gb(screen)
Liest alle verwendeten Farbregister und speichert die Werte nach Grundfarben getrennt in den Feldern »r()«, »g()« und »b()«.
»num_col« gibt entweder die Anzahl der möglichen Farben oder im Fehlerfall »-1« an. Sie sollten die Funktion immer aufrufen, nach- dem Sie Ihren Screen geöffnet, oder die Farbpalette gewechselt haben. Die von der Funktion gelesenen Farbwerte dienen als maxi- male Helligkeit beim Ein- und Ausblenden. « 3. Funktion:
Einblenden des Farbbereichs von »start_col« bis »end_col«. Sie müssen die Nummern der Farbregister angegeben (0 = Hintergrund, 1 = Schriftfarbe 1, usw.). Mit dem Parameter »v« bestimmen Sie die Geschwindigkeit des Einblendens. Je größer der Wert ist, desto niedriger das Tempo. Brauchbare Werte (unkompiliert) sind 15 bis 50. Bei »v =50« erkennt man aber deutlich die Farbabstufung. Übrigens: In unserem Programm ist »screen« mit anzugeben, ob- wohl sich die Helligkeitsänderungen immer auf dem aktuellen Bild- schirm (Screen) bemerkbar machen. Wir umgehen damit den (Tipp-) Aufwand, den aktuellen Screen im Programm festzustellen). ” Funktion:
Mit diesem Umierorcgetarnn werden Farbbereiche ausgeblendet. Die Parameter sind die gleichen wie bei fade_in. «5. Funktion:
Die eigentliche »fade«-Routine, die auch die Unterprogramme »fade_in« und »fade_out« benötigen. Hier werden, je nach ge- wünschter Geschwindigkeit, die Helligkeitsstufen berechnet und die Farbregister gesetzt.
Sie sollten die fünf Unterprogramme zweckmäßigerweise als
ASCII-Datei speichern. Klicken Sie hierzu »SAVE, A« in der
Menüleiste des Gfa-Interpreters an. Die Fade-Routinen stehen somit immer zum Einbinden in Programme bereit (MERGE). Das nächste Programm zeigt zur Demonstration der Routinen noch ein Beispiel. Im Listing sind die Unterprogramme zu ergänzen.
* Demo zu Color-Fade in Gfa-BASIC von J.Reinert
OPENS 2, 0,0, 640,256, 3, &H8000 OPEN #2,0,0,640,256,0,4111,2 SETCOLOR 0,6,6,6
FN get_rgb(2)
"Eine kleine Demonstration für"
Einblenden und" PCOLOR PRINT AT(20,9);" PCOLOR 5,0 PRINT PRINT * PCOLOR 6,0 PRINT PRINT * wenn man einiges be: PCOLOR 7,0
Ausblenden von Farben"
Das Aus- und Einblenden von Farb
NEXT i
FOR i=1 10 3 @fade_in(2,6,7,30) DELAY 1
NEXT i
DELAY 6
@fade_out (2,0,7,25)
aus Regis (i)*16+b(i))
NEXT n NEXT i DELAY 3
@fade_out (2,0,7,28)
cıs
LOCA" 6,13
PCOLOR 7,0
PRINT "Ende der Demonstration" @fade_in(2,5,7,30)
DELAY 3
@fade_out (2,5,7,30) DELAY 1
CLOSEW #2
CLOSES 2
END
Demo_Color-Fade.gfa Bitte einblenden -- ein Beispiel wie man’s macht
Geben Sie das Demoprogramm »Demo_Color-Fade.gfa« ein und hängen die Unterprogramme »Color-Fade« mit MERGE an. Danach können Sie starten. Unser Beispiel zeigt einige Möglichkeiten des Ein- und Ausblendens. Falsche Parameter, z.B. eine falsche Screen- Nummer, zu hohe Farbregister usw., werden im Programm nicht ab- gefangen. Treffen Sie hierfür bitte selbst Vorsorge.
F.Reinert/ub
PROGRAMMIEREN
GFA-BASIC
iff.library mit Gfa 3.5
Bilder im ungepackten ACBM-Format zu laden, ist mit den zu Amiga- oder Gfa-BASIC gelieferten Programmen relativ einfach. Bei AmigaBASIC heißt das Programm hierzu »LoadACBM« (Extras-Dis- kette) und bei Gfa-BASIC 3.5 »LOAD_ACBM«.
Und dann gibt es da noch »LoadIFF«, um eine IFF-Datei zu laden; das Programm ist aber - typisch BASIC — sehr langsam. Schneller geht’s mit der »iff.library«. Sie ist u.a. auf der Fish-Disk 301 zu fin- den. Wie die Library unter Gfa-BASIC 3.5 anzuwenden ist, zeigt das Programm »ShowIFF.bas«.
Bild auswählen
let,colotabt) ! Farben holen ! Farben aktivieren ! Bild zeigen
21
PROGRAMMIEREN
GFA-BASIC
%,colortable®)
STE
Nutzen Sie die Funktionen der IFF-Library in Gfa- BASIC, z.B. um Bilder zu laden
22
Das Programm verarbeitet alle gängigen Bildformate (Lores, Hires, interlaced, noninterlaced, HAM).
Als erstes ist es unbedingt erforderlich, die »iff.library« von der Public-Domain-Diskette ins »libs«-Verzeichnis der verwendeten Workbench-Diskette zu kopieren. Da es sich bei der »iff.library« um eine externe Bibliothek handelt, müssen die ersten vier Zeilen (ab »DIM m68%(16)«) immer am Programmanfang stehen. Die Zeilen dimensionieren ein Integer-Feld, das zur Übergabe der Prozessor- Register verwendet wird, und öffnen die »iff.library«.
Sollte die Bibliothek nicht zu öffnen sein, endet das Programm, da ansonsten ein System-Absturz erfolgt.
Am Ende des Listings befinden sich Funktionen zur Kommunikati- on mit der Library. Um sich ein wenig Tipparbeit zu sparen, können Sie diese Unterprogramme mit »FDCONV.GFA« (von der Gfa- BASIC-Diskette) aus dem »FD«-File (Endung ».fd«) zur Library selbst erzeugen. Unglücklicherweise werden von »FDCONV.GFA« Prozeduren ohne Rückgabewert erzeugt, sodaß der erzeugte Quell- code noch angepaßt werden muß. Eingefleischte Programmierer sollten das Konvertierungsprogramm so ändern, daß automatisch Funktionen erzeugt werden.
Um Speicherplatz zu sparen, brauchen Sie nur die Funktionen zu übernehmen, die Sie tatsächlich verwenden. Der Vollständigkeit hal- ber binden wir im Beispiel alle ein.
Der wichtigste Programmteil ist das Unterprogramm »loadiff()«. Es öffnet entweder automatisch einen Screen mit den richtigen Parame- tern oder Sie geben den Screen mit an, in dem die Grafik erscheinen soll. Für die richtige Screen-Einstellung müssen Sie selbst sorgen.
Weitere Erklärung entnehmen Sie bitte den Kommentaren im Li- sting. Funktionsbeschreibungen und Offsets der Library befinden
\ sich auf der PD-Disk.
Das Unterprogramm »loadiff()« öffnet, wenn kein Screen angege- ben ist (übergebene Screen-Nummer = 0), immer einen Screen mit der Nummer 2. Die Variable »iffbase%« darf nicht verändert werden (auch nicht ihr Inhalt). Alle anderen Variablen wie »breite«, »tiefe« etc. können Sie beliebig weiterverwenden.
Beachten Sie, daß der Amiga immer ein ganzes Bild lädt. Hat das Bild eine Breite von 320 und eine Höhe von 256 Punkten, kann man es trotzdem in einen Screen der Ausmaße 640 x 512 laden. Es er- scheint dann im oberen linken Viertel.
J.Reinert/ub
Farbrequester-Bibliothek
Aus vielen Programmen kennt man sie: die Color-Requester. Sie dienen dazu, die verwendete Farbpalette zu verändern. Wer so etwas schon einmal programmiert hat, weiß, wie aufwendig es ist. Die »req.library«, zu finden u.a. auf der Fish-Disk 419, nimmt einem viel Arbeit ab.
Sie beinhaltet u.a. einen einfachen Color-Requester, mit dem es möglich ist, Farben mit R-G-B-Reglern einzustellen, Farbtreppen zu erzeugen, Farben zu kopieren und zu tauschen. Außerdem werden die aktuellen RGB-Werte angezeigt.
Zur Verwendung: Als erstes muß man die »req.library« in den »libs«-Ordner der Workbench-Diskette kopieren. Testen Sie dann die Bibliothek mit dem Programm »REQ.LIB-DEMO« (Beispiel in Gfa-BASIC).
Das folgende Demo-Listing ist relativ lang, was z.B. an der Fehler- Auswertung liegt, es zeigt aber auch eine Möglichkeit, System-Rück- fragen (Requester wie »please insert..«) auf den eigenen Screen umzulenken; der Workbench-Screen bleibt also im Hintergrund.
Um die Workbenchfarben einzustellen, müssen Sie alle Zeilen mit den Variablen »mytask%« und »oldwindowptr%« löschen; ebenso
Zusätzlich finden Sie im Beispiel eine Funktion zum Ermitteln der Farbwerte: »read_color« (Farbe lesen). Sie wird aufgerufen mit: farbwert = FN read_color (screen, register)
»screen« ist die Nummer des verwendeten Screens, »register« enthält die Nummer des Farbregisters, das ausgelesen werden soll. Je nach Tiefe (Bitplanes) des Screens nimmt dieser Parameter Werte von 0 bis 31 an. In »farbwert« erhält man dann die RGB-An- teile zurück. (256*R + 16*G + B). Den Farbwert kann man direkt mit SETCOLOR verwenden. Mit einer geeigneten Programmschleife ist es möglich, die gesammte Farbpalette auf Diskette oder Festplatte zu speichern und später wieder einzustellen.
F.Reinert/ub
' ColorRequester mit der "req.library" in Gfa-) mytask$ = FindTask(0) ! eigenen Task suchen DIM m68% (16) ! 68000-Register libname$ = "req.library* ! Name der Bibliothek regbaset = OldOpenLibrary (VARPTR(libname$)) ! Library öffnen IF regbase8<>0 ! Library geöffnet? OPENS 2,0,0,640,256,3,&48000 ! Screen öffnen OPENW #2,0,0,640,256,0,4111,2 ! Fenster volle Größe IF mytask$«>0 oldwindowptrt = LONG{nytaskt+184) !Windowpointer in Task-S LONG{mytask%+184} = WINDOW(2) dowpointer setzen ! Alle Requester gehen nun in neuen Screen " =-- Ab hier steht das Hauptprogramm --- colour = 0 newcolor = FN colorrequester(colour) ! A IF newcolor = 65535 PRINT "Color-Requester wurde Abgebrochen" ELSE PRINT "Zuletzt gewähltes Farbregister war : ENDIF PRINT
uf Color-Requester
einer Taste" “" ! Warten auf Taste
VOID CloseLibr. LONGinytask$+184} = ENDIF ELSE ALERT 0,*L; ENDIF
nter restaurieren
indowptrs !
konnte n
ibrary
CLOSEW #2 ! Window und Screen schl CLOSES 2
END
colour$ = regbaset RCALL regbaset-9 RETURN m68$ (0) ENDFUNC.
Farben einstellen im Programm
Am einfachsten geht’s mit dem Farb-Requester aus der »req.library« von der Fish-Disk 419
Rahmenlose Fenster in Gfa 3.5
Wer versucht, rahmenlose Fenster mit Gfa-BASIC 3.5 zu öffnen, wird irgendwann feststellen, daß u.U. die Fenster-Titelleiste am obe- ren Bildrand auftaucht. Besonders unangenehm ist das, wenn man zuvor eine Titelgrafik lädt.
Das Ganze liegt daran, daß Gfa-BASIC automatisch einen Fest- ster-Titel vergibt. Abhilfe schafft ein kleiner Trick, der allerdings nicht ganz sauber ist: Nach Öffnen des Fensters wird der Pointer, der auf den Fenstertext zeigt, auf Null gesetzt. Der Haken an der Sache steckt wie immer im Detail:
Wenn man ein BASIC-Programm nun lad beendet, oder das Fenster schließt, stürzt der Interpreter ab. Der alte Zeiger muß des- halb in einer Variablen gespeichert werden und vor dem Schliessen des Fensters wieder an die richtige Stelle gesetzt werden. Pro-
PROGRAMMIEREN
GFA-BASIC
grammfehler müssen also unbedingt abgefangen werden. Das Pro- gramm »Borderless.gfa« zeigt, wie's geht.
Borderless-Windows mit Gfa-BASIC 3.5 |
! Borderless-Flag
Flags = &H800
fehler
ON ERROR GOSUB ON BREAK CONT.
Screen öffnen
Fenster Öffnen
Adresse Fenster-Struktur alten Titelpointer merken Titelpointer auf null Fenster löschen 2.Fenster öffnen
ormales Fenster."
und Screen ‚essen. Ende.
borderless.gfa
Mit einem Trick verschwindte auch in Gfa-BASIC die Titelzeile; aber man muß aufpassen
Wenn Sie andere Fensternummern als 2 für das Borderless-Win- dow vergeben, müssen Sie die Argumente in den Zeilen, in denen die Fensternummer auftaucht, entsprechend verändern:
Das gilt natürlich auch für die Screen-Nummern. Ein Druck auf eine
der Maustasten beendet das Programm. F.Reinert/ub
NLETATANSITSEN
Wollen Sie sich an der Rubrik »Tips & Tricks« im AMIGA-Magazin beteiligen? Schicken Sie uns Ihre Tips. Am besten, Sie senden uns Ihre Programme und Texte auf Diskette (ASCII-Format). Für Bastel- anleitungen fügen Sie bitte einen Bauplan bei. Die Adresse: AMIGA-Redaktion Kennwort: Tips & Tricks Markt & Technik Verlag AG Hans-Pinsel-Str.2 8013 Haar bei München Ki ‚Alle Einsendungen werden von uns geprüft. Wenn Ihr Beitrag in die ‚engere Wahl für eine Veröffentlichung kommt, werden Sie benach- fichtigt. Haben Sie auf jeden Fall ein wenig. Geduld: A PN:
PROGRAMMIEREN
Assembler
Programmieren
Zaubersp
Wenn Sie den Amiga in Assembler programmieren, Steht Ihnen das ganze System offen. Assembler ist zwar »gefährlicher«, da fehleranfälliger, als andere Sprachen und auch aufwendiger, aber mit den richtigen Tricks spart man Programmierarbeit und man bekommt vor allem schnelle und leistungsfähige Programme.
s grenzt an Zauberei — die Assembler-Tricks zeigen, wie Sie
den Amiga wirklich bis ins letzte Bit ausreizen. Zum Einsatz
kommen Seka, Devpac, Profimat und der OMA-Assembler.
Ganz gleich, welchen Assembler Sie verwenden, alle Li- stings lassen sich selbstverständlich an jeden anpassen.
Leuchtdiode
Schon oft wurden in Zeitschriften Programme zum Ausschalten der Power-LED vorgestellt. Wie schaltet man aber die LED des Dis- kettenlaufwerks aus bzw. an?
Hier die Lösung für Assembler-Programmierer zum Anschalten:
ersetzt man die letzte Zeile durch:
Sean Durkin/ub
Assembler optimal
Hier ein paar Tips, wie Sie Assembler-Programme optimieren: « Mit folgendem Befehl läßt sich die Addition einer vorzeichenbehaf- teten 16-Bit-Zahl zu einem Adreßregister (32 Bit; »add.! Dx.w,Ax«) einfacher realisieren, ohne das Datenregister auf 32 Bit zu erweitern:
+ Mit der Anweisung
kann man nur Zahlen bis 8 addieren. Mit einem anderen Befehl ist es jedoch möglich, bei gleicher Geschwindigkeit wie mit »addq« (8 Taktzyklen) vorzeichenbehaftete 16-Bit-Zahlen unmittelbar zu einem Adreßregister zu addieren:
® Um eine Zahl zu verdoppeln, gibt es mehrere Wege. Die langsam- ste Methode ist:
Schneller (8 Taktzyklen) geht’s schon mit:
Die schnellste Methode ist jedoch (4 Taktzyklen):
add Dx,Dx
Dieser Befehl lohnt sich auch beim Multiplizieren mit 4, da die Dauer des »IsI«-Befehls von der Anzahl der Verschiebungen abhängt. Bei
1s Dx
wären es 10, die zweimalige Addition benötigt jedoch nur 8 Zyklen.
24
che
« In einer Schleife lohnt es sich in Bezug auf Geschwindigkeitsvortei- le, wenn man keine unmittelbaren Befehle verwendet, sondern alle in der Schleife mehrmals benötigte Werte und die Zählvariable selbst vor der Schleife in Daten- oder Adreßregistern zwischenspei- chert und dann die Register verwendet, da der Prozessor dann nicht mehr den Wert aus dem Speicher holen muß.
« Oft findet man in Programmen, daß bei absoluten Adressen mit »btst« Bits über 7 geprüft werden, z.B. das »Blitter-finished-Bit«:
Das ist eigentlich falsch, da bei den Bit-Befehlen bei Anwendung
| auf eine absolute Adresse nur Zugriff auf Bit O bis 7 erlaubt ist. Im
obigen Beispiel müßte der Befehl also lauten:
Der Befehl funktioniert trotzdem, weil die meisten Assembler Eee umformen in:
Ein Fehler wäre es jedoch, wenn man mit
prüfen wollte, ob Sprite-DMA erlaubt ist. Dieser Befehl würde näm- lich das Blitter-Zero-Bit testen. Der korrekte Befehl würde lauten:
Christian Seiler/ub
Ohne Preferences
Die Preferences dienen u.a.: — zum Einstellen des Druckertreibers, - der seriellen Schnittstelle, - des Grafikdrucks, - der Workbenchfarben - oder der Zahl der Zeichen pro Zeile (80 oder 60)
Die Preferences belegen allerdings 56 628 Byte Speicher. Das kann knapp werden, wenn man keine Speichererweiterung im Amiga 500 hat und z.B. der BASIC-Interpreter sowie ein längeres Pro- gramm geladen ist. Und außerdem muß man die Preferences immer laden, was Zeit kostet.
Es geht zum Glück auch ohne Preferences, wenn man etwas an den Systemeinstellungen verändern möchte, wie das nächste Bei- spiel zeigt: Das Programm »Z_Z.asm« ist nur 332 Byte lang — und außerdem schneller als die Preferences. »Z_Z.asm« dient dazu, eine bestimmte Einstellung in den Preferences zu ändern, in unse- rem Fall die Einstellung der Zähl der Zeichen/Zeile (60/80).
Das erste Byte der Preferences-Struktur legt die Zahl der Zeichen pro Zeile fest, in der Texte auf dem Bildschirm erscheinen. Mit der Routine »GetPrefs()« (Exec-Library) prüft unser Programm den aktu- ellen Modus und speichert den gegenteiligen per »SetPrefs()«.
Die »system-configuration« im Verzeichnis »Devs:« wird durch die Umstellung nicht verändert. Nach Reset ist die alte Fassung aktiv. Es handelt sich bei »Z_Z.asm« um eine Devpac-Assembler-Routine. Speichern Sie das ausführbare Programm im C-Verzeichnis. Wenn Sie es per ICONX mit einem Icon in die Workbench einführen, än- dern Sie durch Anklicken des Symbols den Zeichenmodus.
In einer Batch-Datei oder vom CLI bzw. der Shell aus rufen Sie einfach das Programm mit seinem Namen auf:
Ein Benutzen im.CLI hat allerdings wenig Sinn, da sich der Modus eines laufenden CLI-Windos so nicht ändern läßt, es sei denn, man eröffnet einen neuen Task.
Wolfgang Wallat/ub
breit move.b
Assembler-Programm (Devpac) um die Zahl der Zei- chen (60/80) über die die Preferences zu wechseln
PROGRAMMIEREN
Assembler
Stringvergleich in Assembler
Mit der Funktion »stremp()« besteht in C die Möglichkeit, zwei Strings (Zeichenketten) miteinander zu vergleichen. In Assembler heißt es, so etwas selbst zu programmieren. .
»Stremp.s« ist eine kurze und schnelle Assembler-Routine zum Vergleich von Strings. Dabei werden die Strings jedoch nur auf Gleichheit getestet. Eine Unterscheidung in »größer« und »kleiner« wird nicht getroffen, kann aber von jedem Assembler-Programmierer eingebaut werden. Die Adressen der Strings werden der Funktion in den Adreßregistern AO und A1 übergeben. Der Aufruf erfolgt mit:
jsr stremp
Das Ergebnis wird über das Datenregister DO in Form eines Boo- leanwerts zurückgegeben (TRUE oder FALSE, entspricht 1 bzw. 0) und kann mit
abgefragt werden. »Strings_gleich« steht dabei für den Programm- teil, der abgearbeitet werden soll, wenn die Strings gleich sind. An- sonsten wird bei »Strings_verschieden« fortgefahren.
Christof Brühann/ik
ES HU EN R: Hiermit testet man zwei Strings auf Gleichheit
TIPS ZU ASSEMB UF EINEN BLICK
Tip Thema Seite Leuchtdiode Hardwareprogrammierung 24 Assembler optimal Programmiermethoden 24 Ohne Preferences Systemeinstellungen 24 Stringvergleich Programmiertechnik 25 Install RAM-Disk RAM-Disk per Programm füllen 26 Für alle Fälle gewappnet »system-configuration« 27 Vier für Strings String-Routinen 28 Pseudo-Laufzeitsystem ‚Abbruch mit <Ctrl C> 29 Alle Offsets in Assembler Programmirhilfe 30 Schnelles Pixelsetzen Grafikfunktion 31 Bildschirmsplitting Copperprogramm 32
25
PROGRAMMIEREN
ASSEMBLER
Install RAM-Disk
Jeder kennt das: Man arbeitet im CLI und braucht öfters Befehle wie DIR, COPY etc. Das Alles kostet natürlich viel Zeit, weil der Amiga die verwendeten Befehle immer wieder von Diskette lädt. Weil’s schneller geht, kopiert man die Befehle in die RAM-Disk und weist den Amiga mit ASSIGN oder PATH an, die CLI-Befehle in der RAM-Disk zu suchen, z.B. mit folgender Batch-Datei:
makedir ram:c path ram:c add SYS:c/copy SYS:e/copy ramıc copy SYS:e/dir r: copy SYS:c/list r: copy SYS:c/info ram:c
AM-Disk.bat
Sind die CLI-Befehle in der RAM-Disk, geht's um einiges schneller
Startet man seinen Amiga jedoch öfters neu, kostet auch die häu- fige Ausführung des COPY-Befehls copy SYS:c/dir ramıc. .. . eine Menge Zeit.
Nutzen Sie hierfür »Install RAM-Disk.asm«. Es ist ein Assembler- Programm, das automatisch, falls noch nicht vorhanden, die RAM- Disk installiert, um dann die gewünschten Files hineinzuschreiben.
Es sind nur das asemblierte Programm und der »RAM-Handler« im »I«-Verzeichnis der System-Diskette nötig. Falls letztere Datei fehlt, erscheint eine Fehlermeldung.
Diese Methode, die RAM-Disk mit Befehlen zu füllen, ist bedeu- tend schneller und komfortabler als die zuerst beschriebene. Das Programm wurde mit ASMone V1.0 erstellt. Passen Sie das Listing gegebenfalls an an Ihren Assembler an.
David Szpak/ub openlibrary ; Offsets Exec-Punktionen closelibrary open + Offsets DOS-Funktionen
close read write
output
; Hier File-Laengen angeben
Prog_start:
lea dosname(pc),al ; dos.library oeffnen move.1 $4.w,a6
jsr openlibrary (a6)
move.l move.l beq.w return move.1 #head,d2 move.1l #headsize,d3 bs:
; Fehler beim Oeffnen
move,l
move.1 #1005,d2 ; Modus = lesen
jsr open(a6)
tst.1 do
beq.w ram_error ; Fehler aufgetreten
move.1 tram_disk,di delete (a6)
bsr.s « move.l
Aprglength3,a3 we.l #data3,datapointer
move.l #textsize3,d3 bsr.s write_text Return:
move.1 $4.w,a6
ve. dosbase(pc),al jsr _closelibrary(a6)
errortext,d2 move.1 #errortextsize,d3 k write_text
return
; Modus = schreiben auf Filehandle-Struktur retten
‚d2
; CLI-Ausgabekanal ermitteln write(a6) ; und Text ausgeben der RAM-Disk"
ImRAM-Handler" ‚$9b, "031m" ins” directory!*,10,10
;31m' has been installed"
pe*,$9b,"0;31m' has been installed"
9b, "0;31m' has been installed"
angeben um berechnen...
au)
Sind die CLI-Befehle in der RAM-Disk, geht’s um einiges schneller
26
Für alle Fälle gewappnet
Wenn man häufig mit unterschiedlichen Konfigurationen, d.h. mit unterschiedlichen Druckereinstellungen etc. arbeitet, muß man bei jeder Änderung die Preferences laden. Das entfällt mit Hilfe des fol- genden Programms: »LoadSys.asm« lädt und aktiviert »system-con- figuration«-kompatible Dateien. Es stellt eine Optimierung zum Trick »Ohne Preferences« auf Seite 24 dar.
vadsy ... lädt dev 1-configuration
Loadsys FILENANE ... lädt system-configuration File ; Loadsys . gibt (c)opyr: Meldung aus ; Definition für Libraries Execbase = 4 » Ext fsets
OldOpenLibrary = CloseLibrary
-$01(a0,d0.w) ‚a0
#520,-(a0) i &0, MA
#1,a0
L move.l
Execbase,a6 lea Dosname, al moveq
PROGRAMMIEREN
Ausgabe
Execbase, a6 #
Dosbase,a6 EMA,a2 Lock (a6) d0,d4 Ausgabe
ASSEMBLER
locMem(byteSize, requirements) (DO/D1)
Type = Lesen
Lock (name, type) (D1/D2)
'xamine (lock, £ileInfoBlock) (D1/D2)
UnLock (lock) (DI)
» Mode_old
Error Message 4 'essMode) (D1/D2)
‚length) (D1/D2/D3)
; Close(file) (DI)
SetPrefs (preferences, size, flag) (A0,D0/DL)
; Write( ‚buffer, length) (D1/D2/D3)
nemoryBlock, byteSize) (A1,DO)
tiret
; 22 Byte kopieren
27
PROGRAMMIEREN
ASSEMBLER dbra d0,CPYM ja, fertig move.b #$a,(a3)+ ; mit $a abschließen hen >= at...
rts default
LoadSys.asm
»system-configuration« ändern mit einem Aufruf
Gehen Sie so vor:
Laden Sie Preferences, stellen Sie die gewünschte Konfiguration ein und speichern Sie sie (Save). Danach erstellen Sie eine Kopie der Datei »system-configuration« im Verzeichnis »Devs«, z.B. mit dem Namen »conv1«. In der »system-configuration« stehen alle Pa- rameter, die Sie mit Preferences einstellen:
copy devs:system-config n to nv
Auf dieselbe Art können Sie mehrere Konfigurationen erstellen, wobei Sie jeder Datei einen neuen Namen geben (»conv2«, »CONV3«, USW.).
Das Programm »loadsys« benutzt man dann so, um eine be- stimmte Konfiguration zu aktivieren:
Loadsys
convl Damit laden und initialisieren Sie die in »convi« gespeicherte Konfiguration. Das Programm wurde mit MasterSeka V1.70 geschrieben. Herwig Höller/ub
VEaTEilhleE
Im folgenden Artikel finden Sie vier nützliche Assembler-Routinen, die Ihnen die Handhabung von Zeichenketten (Strings) in Assem- bler erleichtern.
Die vier Assembler-Routinen, die wir Ihnen anbieten sind:
- UCase: Wandelt Klein- in Großbuchstaben
- String_Length: ermittelt Länge der Zeichenkette
- Instr: sucht String2 in String?
- Replace: ersetzt (Teil von) String durch (einen Teil von) String?
Die Routinen wurden mit dem Assembler Devpac 2.0 getestet. Dieser Assembler unterstützt lokale Labels, von denen hier reger Gebrauch gemacht wird, da so das doppelte Definieren eines Labels durch diese Unterprogramme ausgeschlossen bleibt.
Sollte es bei bestimmten Assemblern Probleme geben, müssen Sie eigene Labels im Listing einsetzen.
Bei allen Routinen ist Voraussetzung, daß die zu übergebenden Strings mit einem Null-Byte enden.
C.Straka/ub
.. und < ’g'
; dann wandeln
| String_Length.asm ermittelt Länge einer Zeichenkette
Replace.asm ersetzt [Teil von] Stringi durch [Teil von] String2
.1 a0,-(sp) ‚loop cmp.b #0, (a0)
28
PROGRAMMIEREN
ASSEMBLER
sucht String2 in String 1
Pseudo-Laufzeitsystem
Fast jede Hochsprache hat ein Laufzeitsystem, um z.B.: — Fehler während des Programmablaufs abzufangen, - die Tastatur auf Unterbrechungen (<Otrl C>) zu überprüfen, oder - Bibliotheken automatisch zu öffnen und am Ende des Programms wieder zu schließen.
Bei Assemblern fehlt ein solches System, doch gibt es eine einfa- che und universell einsatzbare Methode, um auch Assemblerpro- gramme mit einem Quasi-Laufzeitsystem auszusatten. Ein Beispiel- programm zeigt, was man machen muß, damit man Programme mit <Ctrl C> abbrechen kann:
Erklärung: In der »Process«-Strucktur eines Tasks gibt es eine »Except«-Struktur, die den Task bei den bestimmten Signalen unter- bricht. Das macht sich unser Pseudo-Laufzeitsystem zunutze: Es setzt das Signal zur Unterbrechung im »tc_SigExcept«-Feld fest und setzt im »tc_ ExceptCode«-Feld des Tasks einen Zeiger auf den Programmcode, der nach einer Execption ausgeführt werden soll.
Drückt man nun z.B. <Ctrl F>, hält der Amiga das laufende Pro- gramm an und legt folgendes auf dem Stack ab:
— die ExecHandler-Addresse,
- den Programm-Counter,
- die letzte Addresse im Programm, - das Status-Register (SR),
— DO bis D7 und
— AO bis A6.
Anschließend setzt der Amiga seine Arbeit ab der Adresse »Code« fort, wobei das unterbrochene Programm beendet wird.
Sie können in der Unterbrechungsroutine natürlich eigene Routi- nen einbauen, z.B. den Stack auswerten und mit »rts« an die Stelle zurückkehren, in der Ihr Programm unterbrochen wurde.
ub
Cr] Abbruch von Assembler-Programmen mit <Cirl c>
SIZEWINDOW & SizesMallWindow
»BigWindow.asm« dient zum Vergrößern eines CLI/Shell-Fensters
auf seine maximale Größe. Programme dieser Art gibt es schon eini- | ge, unsere Variante ist ein besonderer Vertreter seiner Spezies: | a.) Das ausführbare Programm belegt wenig Speicher: 312 Byte. Viel kleinere Versionen dürfte es bei dieser Art Programme kaum gehen. Man könnte es zwar ca. noch um 30 Byte reduzieren, darun- ter würde aber die Verständlichkeit des Quelltextes leiden. b.) »BigWindow« verwendet sowohl die (»Intuition«-) Systemfunkti- on »MoveWindow()« als auch »SizeWindow«. Wenn sich ein Fen- ster nicht in der richtigen Position befindet, bevor man es vergrößert, korrigiert »BigWindow« die Lage automatisch; man muß also nicht nach Indien fahren, um dort zu meditieren.
größerungsbefehls
|
29
PROGRAMMIEREN
ASSEMBLER
BigWindow.s
Vergrößern Sie ein CLI-Fenster mit einem Befehl
Rufen Sie das Programm übers CLI oder die Shell mit seinem Namen auf, vergrößert es das aktuelle Fenster. Das Programm (Seka-Assembler) sollte im Chip-Memory abgelegt sein.
In manchen Zeilen sind im Listing Alternativen angegeben. Wenn Sie diese einsetzen, erhalten Sie ein Programm, um das aktuelle Fenster zu verkleinern. Eine Anwendung ist z.B. wenn Sie mit der Workbench arbeiten möchten, aber das CLI-Fenster beim Start of- fenlassen wollen. Damit das CLI-Fenster nicht auf dem Bildschirm stört, verkleinern Sie es einfach auf seine minimale Größe. ub
Alle Offsets für Assembler
Für Assembler-Programmierer, die häufig Systemroutinen benut- |
zen, ist es oft mühsam, die Offsets für die Einsprünge in die Libra-
ries zu berechnen beziehungsweise abzutippen; und nicht jeder As- |
sembler stellt die Offsets in Form von Include-Dateien zur Verfü- gung. Es gibt einen relativ einfachen Weg, sich solche Include-Datei- en selber anzufertigen: Man kann die FD-Dateien auf der Extras-Dis-
WEND 2$ = LEFT$(Zeile$,1) IF 2$<>"*" AND z$<>"#" AND LEN(Zeile$)>1 THEN
30
U *;counter
Offset.bas
BASIC ist auch für Assembler-Programmierer nützlich
kette in ein assemblerlesliches File verwandeln. Das BASIC-Pro- gramm »Offset.bas« zeigt, wie man eine solche Konvertierung vor- nimmt. Die Einbindung der Offsets in eigene Programme sollte dann jeder Programmierer selbst vornehmen können.
ub
| Schnelles Pixelsetzen
Manchem Assemblerprogrammierer ist der Aufruf der Prozedur »WritePixel()« aus der »graphics.library« zu langsam. Schneller ist es, direkt in die Bitmap zu zeichnen. Zum Setzen eines Punkts in einer Bitplane muß das Byte ermittelt werden, in dem das Bit, und damit der Punkt, gesetzt werden soll. Dazu dividieren Sie die x-Koor- dinate durch acht; die Breite der Bitplane (in Byte) multiplizieren Sie mit der y-Koordinate; das Produkt addieren Sie zur x-Koordinate/8. Danach sind noch die übrigen 7 Bit (Bildpunkte) des Byte auszumas- kieren, damit Sie nicht mehrere Bits auf einmal setzen. Schließlich | müssen Sie das verbleibende Bit setzen. Eine Routine, die Ihnen einen Teil der Aufgabe abnimmt zeigt das Listing »SetPixel.asm«.
NAD CHBER1 1) Schneller als die »graphics.library«
»Setpixel.asm« erwartet folgendes in den entsprechenden Regi- stern: — AO: Zeiger auf die Bitplane. Die Zeiger für die einzelnen Bitplanes befinden sich im Viewport ab Adresse (Offset) $CO (siehe Tabelle). — DO: x-Koordinate — D1: y-Koordinate — D2: Breite der Bitplane (in Byte).
Offsets: Bitplanes im ViewPort
Offset Bitplane $co Bitplane 1 $C4 Bitplane 2 $C8 Bitplane 3 $CC Bitplane 4 $DO Bitplane 5
incdir *:include/”
include "exec/exec_lib.i" include “intuition/intuition_lib.i” include *graphics/graphic:
lea intname,al moveg.1 #0,d0 CALLEXEC OpenLibrary ; Intuition öffnen move.1 d0,_IntuitionBase gfxname,al #0,d0 OpenLibrary ; Graphics öffnen d0,_GfxBase screen, a0 OpenScreen ; Screen öffnen d0,screenpointer move.1 d0,a0 move.1 $c4(a0),bitplane ; lea $54 (a0) ‚a0 move.l a0,RP ; Rastport move.1 a0,al ; Farberegister 2 als move #2,d0 ; Vordergrundfarbe CALLGRAF SetAPen move.l _GfxBase,a6 move #640,d2 moveg #10,d3 loopl move d2,d0
itplane 2
move d3,dı move.l RP,al jsr _LVOWritePixel (a6) sig #2
bne.s loopi move #640,d2 add +, mi #255, bne.s loopi move.l moveq CALLGRAF $ move loop2 move.1
d2,d0 &,dl
hritePixel (a6)
#1,2 1oop2 #640,d2 #1,d3 #9,d3 10op2
inter,a0 ‚$16(a0)
#80,d4
bitplane, a0
@2,d0
@,di
SetPixel ; Punkt setzen
#640,d2 #1, #255, loop3 loopd move.l d2,d0
move.l ddl
bsr ClrPixel ; Punkt löschen subg #1,d2
bne.s loop4
move #640,d2
subq #1,
emp 49,43
bne,s loop4
ende move.l screenpointer,a0 move.l #title3,$16(a0) moveg.1 #1,00 CALLINT ShowTitle
wait bist #6,$bfe001 bne.s wait move.l sereenpointer,a0
PROGRAMMIEREN
ASSEMBLER
CALLINT CloseScreen _ GfxBase,al
5, (a0,d1.w)
; der selbe Vorgang
)
moveg #7,5
sub 0,05
belr 45, (a0,d1.w) ; Pixel (Bit) löschen rts
screen dc.w 0,0,640,256,2
SetPixelDemo.asm zeigt den Einsatz unserer Pixel-Routine
Wollen Sie einen Punkt wieder löschen, verwenden Sie statt BSET den Befehl BCLR. Eine Demonstration der Routine und den Geschwindigkeitsunterschied zu »WritePixel« zeigt »SetPixelDe- mo.asm«. Als Assembler haben wir Devpac V2.14D verwendet.
»SetPixel.asm« prüft nicht, ob die angegebenen Koordinaten in- nerhalb der Bitplane liegen, hierfür müssen Sie selbst sorgen.
Jürgen Schlierf/ik
alscher Fehler
Ruft man eine selbstgeschriebene Assembler-Routine aus der »Startup-Sequence« auf, kann es beim Rücksprung (»rts«) zu einer Fehlermeldung kommen, obwohl das Programm einwandfrei arbei- tet. Die Ursache ist im Prozessor-Register dO zu suchen. Enthält es nach Ablauf eines Programms einen Wert ungleich null, nimmt das CLI (Command Line Interpreter) an, daß ein Fehler aufgetreten ist. Ihr Programm sollte daher vor dem Rücksprung den Inhalt des Regi- sters dO löschen: end
d0 ; Register löschen rts ; und zurück
Die durch einen Rückgabewert ungleich Null erzeugten Fehlermel- dungen, »Returncode« genannt, spielen beim Ablauf von Stapelda- teien (Batch-Dateien) wie der »Startup-Sequence« eine Rolle: Mit dem CLI-Befehl FAILAT legt man fest, ab welchem Rückgabewert die Bearbeitung einer Stapeldatei abgebrochen wird. Immo Müller de Vries/C. Kögler
31
PROGRAMMIEREN
ASSEMBLER
PRINT.asm |
Befehle wie PRINT oder »printf()« erleichtern in Hochsprachen die Ausgabe eines Textes auf dem Bildschirm. Wohlgemerkt, in Hoch- sprachen - Assembler-Programmierer sind gezwungen, den Text über die Funktion »Write« aus der »dos.library« auszugeben. Das sieht in den meisten Programmen etwa so aus (Bsp. für Devpac):
textar
Die Übersichtlichkeit eines Listings geht bei dieser Methode verlo- ren, da die Ausgaberoutine und der zugehörige Text an unterschied- lichen Stellen im Programm stehen. Das Unterprogramm »Print.asm« schafft Abhilfe. Wir zeigen seine Anwendung an einem Beispiel für den Devpac-Assembler:
Folgender Trick kommt zum Einsatz: Der MC 68000 legt beim Auf- ruf eines Unterprogramms eine Rücksprungadresse als Langwort auf den Stapel (Stack). Die Adresse zeigt auf den Maschinenbefehl hinter dem -Sprungbefehl. In unserem Fall befindet sich an dieser Stelle der auszugebende Text. Die Unterroutine »Print« holt sich diese Adresse vom Stapel, ermittelt die Länge des Textes und gibt
Programmieren in Assembler wie in einer richtigen Hochsprache - mit Makros geht's
ihn aus. Nun muß die Rücksprungadresse durch Addition der Text- | länge korrigiert werden. Sie wird zusätzlich auf Wortlänge justiert, um einen Fehler durch Sprung auf eine ungerade Adresse zu verhin- dern. Wir fügen beim Devpac-Assembler hierzu die Anweisung »cnop 0,2« hinter der Definition des Strings ein. Wichtig: ein Text muß mit einer »0« enden. Der vollständige Aufruf von »Print« lautet:
In unserem Beispiel verwenden wir zusätzlich:
Der Amiga gibt in diesem Fall hinter dem Text einen Zeilenvor- schub (»10«) aus. Die Idee, die Rücksprungadresse auf dem Stack um die Länge eines Textes zu erhöhen, hatte der Amerikaner Glen Bredon. Er machte sie in 6502-Assembler populär.
Jörg Schmidt/ub
Bildschirmsplitting
Diese kleine Farbdemonstration splittet den Bildschirm in zwei Hälften. Das Programm demonstriert die Abfrage der Position des Rasterstrahls mit Hilfe der Hardwareregister.
Das Programm ist mit dem Seka-Assembler geschrieben. Nach dem Start wird zunächst jeder weitere Task gesperrt. Danach verän- dert das Programm ab einer bestimmten Bildschirmzeile die Hinter- grundfarbe. Zur besseren Demonstration wird diese Farbe laufend geändert. Nach Durchlaufen der Farbskala erhöht das Programm die Zeile in der der Bildschirm gesplittet werden soll. Sie können den Programmablauf durch einen Druck der linken Maustaste stoppen. Noch besser wäre es, die Farbe des Hintergrunds per Copper ab einer Position zu verändern, aber das ist eine andere Geschichte.
Klaus Kuphal/ub
ng aus
für Split
Das Seka-Programm spaltet den Bildschirm
32
Programmieren
wie C gehört neben BASIC zur beliebtesten Sprache auf dem Amiga. Im Mittelpunkt steht vor allem die Systemprogrammierung: Betriebssysteme wie Unix und Amiga0S wurden in G geschrieben; das zeigt wie leistungsfähig diese Hochsprache ist. Aber es muß nicht gleich ein Betriebssystem sein, fangen wir langsam an — maChbar ist alles...
it ein Grund, warum C auf dem Amiga so erfolgreich ist, | sind die beiden C-Compiler von SAS (ehem. Lattice) und Manx (Aztec-C). Mittlerweile haben Sie sich zu extrem lei- stungsfähigen Entwicklungswerkzeugen gemausert, mit denen man schnelle und speicherplatzsparende Programme erzeug- fen kann. Wer natürlich noch nicht das nötige Kleingeld für die Profi- C-Compiler hat, der kann auch mit den C-Compilern aus der Public- Domain-Szene sein Glück versuchen: - Dice: Fish-Disk 491 — Sozobon C: Fish-Disk 508 Beide Systeme sind hervoragend geeignet, um sich in C einzuarbei- ten, und man ist mit ihnen durchaus in der Lage, kleinere Projekte zu verwirklichen — versuchen Sie z.B., die Programme aus den folgen- den Tips an die PD-C-Compiler anzupassen; es ist im Grunde gar nicht so kompliziert.
Endlose Kommentare
Der SAS/Lattice Compiler V5.10 läßt als Kommentarzeichen einen | »Doppel-Slash« »//« zu. »//« gilt für eine Zeile und muß nicht ge- schlossen werden. Es gilt z.B.: tt
ein Komment
// link: ‚esen
/1 Das
a=b
E Überlegt angewandt spart das einiges an Tipparbeit ohne, daß die | Übersichtlichkeit leidet. |
Richard Buschold/ub
Für Zeitlose
»SDatum.c« ist ein einfaches Programm für Anwender, deren | Amiga keine akkugepufferte Uhr besitzt. | Immer wenn man den Amiga anschaltet, sollte man als erstes mit
Hilfe des Befehls DATE das Datum und die Zeit setzen. Das kann, wenn man öfter den Amiga ein- und ausschaltet, mit der Zeit lästig werden. Wenn man aber »SDatum.c« kompiliert, linkt und in die »Startup-Sequence« einbindet, wird man beim Start des Amiga au- tomatisch zur Eingabe des Datums und der Zeit aufgefordert. Dann | führt das C-Programm mittels der Exec-Funktion »Execute()« den Befehl DATE mit den eingegebenen Daten aus. Die Befehle DATE und RUN müssen sich im Verzeichnis »C:« befinden, damit alles funktioniert.
Das Format des Datums ist: »TT-MMM-JJ«, z.B.: »18-Jul-75« oder »03-Dez-91«. Das Format für die Zeit lautet: »SS:MM:SS«. Die Angabe der Sekunden kann entfallen. Gültige Eingaben wären: »17:45:30« oder »18:24«.
PROGRAMMIEREN
c
Cäsar
Das Programm (getestet mit Aztec C 3.4a) wird übersetzt mit:
Sören Knebel/ub
Damit Sie immer wissen, was die Uhr geschlagen hat
Optimales C die erste
Wenn man C-Programme vollends optimiert, sind die Assembler-
| { = . Ergebnisse des C-Compilers kaum noch von sauber entwickelten
Assembler-Programmen zu unterscheiden. Daß es so weit kommt, liegt neben intelligenten Optimierungsmethoden moderner C-Compi-
TIPS ZU C AUF EINEN BLICK
Tip Thema Seite Endlose Kommentare Programmiermethoden 33 Für Zeitlose Zeit einstellen 33 Optimales C die erste Programmiermethoden 33 Wie arbeitet der DIR-Befehl? |DOS-Library 34 Maus aus Hardwareregister 34 Optimales C die zweite Programmiermethoden 34 Kleine Gemeinsamkeit Kleinstes gemeinsames Vielfaches 35 Commander Programmierutility 35 Rot, grün und blau SetRGB.c 37 PowerColor Verbesserung zu SetRGB.c 38 Move Neuer CLI-Befehl 39 itoa — Lattice hat's Integer to ASCII 39 Link-Library mit Lattice Linken 39 C-opperdemo Copperprogrammierung 39 Nicht zu dynamisch Speicherverwaltung 41 MutualExclude-Gadget Gadgetprogrammierung 42 Warnungen Beep-Befehl 43 Herein, Heraus Druckerausgabe 43 Highspeed-Amiga Bildschirm ausschalten 43 Ist irgendwo ein Fenster auf? Windows abfragen 44 ‚Anmeldliste für Geräte Devices 44 Vollbremsung _ Warteschleifen sind tot . 45 Sprechen Sie C? Sprachausgabe 45 Kalender Monatskalender selbstgemacht 45 Icons automatisch öffnen Workbench 46 Vom String zur Zahl ASCII konvertieren 47 Kürzerer C-Code Programmiermethoden 47 beep, beep Noch ein Beep-Befehl 47
33
PROGRAMMIEREN
c
ler hauptsächlich am Geschick des Programmierers. Doch zu viel | einem Verzeichnis (fib_DirEntryType > 0) ist der nächste Schritt
des Guten geht häufig auch auf Kosten der Lesbarkeit und der Über- | sichtlichkeit von C-Programmen, d.h. die strukturellen Vorteile der Hochsprache gehen verloren. Es lohnt sich eigentlich nur, solche Programmteile zu optimieren, die auch mehrfach ausgeführt werden, also hauptsächlich Schleifenblöcke. Allzu kryptische und dadurch unleserliche Optimierungen sollten auch ausreichend kommentiert werden, um ein Programm lesbar zu halten. Doch nun zu den Opti- mierungs-Möglichkeiten:
« Divisionen und Multiplikationen ganzer Zahlen mit Zweierpotenzen lassen sich. effektiv mit Shift-Befehlen realisieren, doch lassen sich auch bei anderen Zahlen durch einen kleinen Trick die Berechnungs zeiten enorm verkürzen:
i = (j<<4)-j-j-j; /* entspricht i = j*13 *,
i = (je<3)+j+j; /* entspricht i = j*10 */
* Library-Funktionen aus dem umfangreichen Funktions-Kontingent heutiger C-Compiler sind mit Vorsicht zu genießen. Besonders, wenn sie häufiger aufgerufen werden, sollten sie auf ihre Effizienz hin überprüft werden.
Oftmals sind maßgeschneiderte Funktionen um ein Vielfaches kürzer und schneller als die Standardfunktionen, die mit jeder mögli- chen - und unmöglichen — Eingabe fertig werden müssen. Als Mu- sterbeispiel sei da die Funktion »pow()« genannt. Sie rechnet intern mit Logarithmus-Funktionen (um auch Kommazahlen zu verarbeiten) und ist somit relativ langsam. Oft besteht die Eingabe allerdings aus Ganzzahlen. Eine eigene Routine zur Potenzierung bewirkt hier einen deutlichen Geschwindigkeitszuwachs.
* Die Benutzung von Feldern ist bei zeitkritischen Programmteilen nicht gerade vorteilhaft. Bei jedem Feldzugriff wird nämlich intern eine Multiplikation ausgeführt:
int n,m{100];
Hierbei wird der Index (hier: 40) mit der Länge des Basiselemen- tes (hier: 4) multipliziert, das Ergebnis (Bsp.: 160) addiert auf die Adresse von »m«, ergibt schließlich die Adresse, deren Inhalt nach »n« transferiert wird. So eine nicht offensichtliche Multiplikation wird dann noch besonders schwerwiegend, wenn es sich bei der Länge von Feldbasiselementen nicht um Potenzen von »2« handelt, wie das z.B. bei Strukturen der Fall sein kann. Dann nämlich wird eine »echte« Multiplikation unvermeidbar und somit viel Rechenzeit ver- schwendet. Glücklicherweise läßt sich das in vielen Fällen durch die Benutzung von Zeigern vermeiden, was das folgende Beispiel ver- anschaulicht:
m[i]=0; /* ers!
langsam)
m{49]);p++) *p = 0; /* dann schn
Natürlich kann das obige Beispiel durch die Kalziie Verwendung von »register«-Variablen noch beschleunigt werden, falls das der Compiler nicht bereits erledigt; in Zweifelsfällen sollte man den er- zeugten (Assembler-)Code daraufhin untersuchen.
Thomas Becker/ik
Wie arbeitet der DIR-Befehl?
Der Befehl DIR aus dem »C:«-Verzeichnis dient dazu, den Inhalt eines Verzeichnisses (Directory) auf dem Bildschirm anzuzeigen. Doch wie arbeiten solche Befehle? Wie erreichen Programmierer die einzelnen Namen eines Verzeichnisses?
Das Programm »ShowDir.c« gibt Antwort auf diese Fragen. Es gibt das Verzeichnis aus, dessen Name man als Parameter übergibt. Der erste Schritt ist es, einen »Lock« auf das Verzeichnis zu besor- gen, mit dem dann im Verlauf gearbeitet wird. (Anm.: Es heißt: »der Lock«, nicht:"»die Lock«; aus dem Englischen: lock = Riegel).
Mit dem Lock und der Betriebssystemfunktion »Examine()« wird nun ein »FilelnfoBlock« ausgefüllt. In diesem Datenblock befinden sich nach dem Aufruf Informationen über das gewünschte Verzeich- nis. Aus dem Eintrag »fib_DirEntryType« geht z.B. hervor, ob es sich überhaupt um ein Verzeichnis handelt oder eine Datei. Nur bei
34
sinnvoll: Mit Hilfe von »ExNext()« gelangen wir an die Namen der Di- rectory-Einträge, denn immer wenn der Aufruf dieser Funktion erfol- greich war (TRUE), wurde ein neuer »FilelnfoBlock« ausgefüllt, in dem auch im Eintrag »fib_FileName« der Name des Files (oder Di- rectories) steht. Diese brauchen dann nur nach nacheinander aus- gedruckt werden, bis »ExNext()« FALSE zurückgibt. Handelt es sich bei einem Eintrag wieder um ein Directory, erfolgt beim Ausdrucken hinter dem Namen die Kennzeichnung »DIR«.
Christof Brühann/ik
[1] ‚ACCESS_READ) )
Das Programm zeigt, wie ein Verzeichnis gelistet wird
Das folgende C-Programm setzt ein Hardware-Register so, daß der Mauszeiger verschwindet.
Andreas Schulz/ub
»Maus_aus.c« Löschen der Maus über ein -Hardware-Register
Optimales C die zweite
Es liegt haupsächlich in den Händen des Programmierers, aus dem Universalgenie C das zu machen, was es ist: eine optimale
| Programmiersprache! Damit es auch so weit kommt, folgen nun wei-
tere Optimierungsregeln, die jeder C-Programmierer kennen und auch effektiv anwenden sollte:
« Sehr nützlich und ebenso übersichtlich ist die mehrfache Zuwei- sung, wie:
Diese Konstruktion bringt den Vorteil, daß die Zwischenergebnisse immer in den schnellen CPU-Registern zwischengespeichert werden und der Amiga somit ohne Umwege den nächste Variablenwert be-
legen kann. Noch mehr Gewinn bringt diese Regel bei geschachtel- ten Konstruktionen wie: if ((fc=getint())+100) !=
statt:
200) (...
i£ (c != 200) le.
Bei der zweiten Variante kann man davon ausgehen, daß vier Hauptspeicherzugriffe auf die Variable »c« erfolgen, während die schnellere, geschachtelte Version nur einen langsamen Hauptspei- cherzugriff benötigt. Die kompliziert aussehende verschachtelte Pro- grammierzeile erzeugt man, indem man immer den Ausdruck, der »c« gleichgesetzt wurde, in der nächsten Zeile für »c« einsetzt. Ebenso kann man durch die umgekehrte Vorgehensweise eine ver- schachtelte Zeile entschachteln.
« Auch Fallunterscheidungen können Sie durch die Verwendung des Fragezeichen-Doppelpunkt-Operators schachteln:
a= (x 23) ?arxıx+l statt: ki) arsx else a = xt; Hierbei ist der Wert von »x« nach dem Vergleich höchstwahr-
scheinlich noch in einem Register und kann dann zur Belegung von »a« weiterverwendet werden.
« Bei komplexen Fallunterscheidungen, die durch umfangreiche logi- sche Verknüpfungen verursacht werden, spart man oftmals Zeit:
if (funci() && £unc2() && £unc}()) (-..
Gibt die erste Funktion eine »0« zurück, gleichbedeutend mit FALSE, kann der gesamte Ausdruck nicht mehr wahr werden, womit »func2()« und »func3()« gar nicht mehr ausgeführt werden brauchen (»Lazy And«, oder »short evaluation«), was die meisten C-Compiler auch so in die Tat umsetzen. Durch geschicktes Sortieren der Funk- tionen, wenn man vorher schon abschätzen kann, wie häufig welche Funktion wahr oder falsch wird, lassen sich Programmteile durch Logik und vorausschauendes Abschätzen beschleunigen.
« Durch übertriebende Verwendung von Mini-Funktionen wird nicht nur die gesamte Strukturierung schlechter, sondern auch der interne Aufwand während der Programmausführung geht stark auf Kosten der Geschwindigkeit. Durch die Benutzung des Präprozessors kann ein Programmierer Mini-Funktionen und -Routinen als Makros defi- nieren, die der Compiler beim Übersetzen im Quelltext einsetzt: #define isascii(x) (11x)&0x80)==0)
Dieses Beispiel aus dem Header-File »ctype.h« testet, ob der einge- setzte Funktionsparameter ein gültiges ASCII-Zeichen ist und kehrt
dementsprechend zurück (wahr oder falsch). Die Variable »x« dient |
hierbei als Übergabeparameter. Bei diesen Makros entfällt der große Aufwand, der sonst durch die Verwendung von Funktionen angefal- len wäre. Einzig und allein der Quelltext wird etwas mächtig er, falls größere Makros häufig im Quelltext vorkommen.
Thomas Becker/ik
Kleine Gemeinsamkeit |
Bei vielen Programmierprojekten wird ein kleinstes gemeinsames Vielfaches (kurz kgV) von zwei ganzen Zahlen benötigt. Beispiels- weise das kgV von »8« und »10« ist »40«. Zur Errechnung des kgV existiert glücklicherweise ein simpler und schneller Algorithmus, den wir hier in C als Funktion »kgV()« in einem Demoprogramm umge- setzt zeigen.
Der Funktion »kgV()« werden zwei positive, ganze Zahlen überge- | ben und sie gibt dann das kleinste gemeinsame Vielfache zurück. Im |
Demo-Programm wird das kgV aus mit der Zufallsfunktion der »c.lib« gewonnenen Zufalls-Integer-Zahlen errechnet. Am praktischsten für den späteren Gebrauch von »kgV()« ist-es,
die Funktion im Demo-Programm (ohne den main-Teil) normal zu |
kompilieren (Compiler-Optionen für Aztec-C siehe Listing) und bei Bedarf beim Linken ans Hauptprogramm anzuhängen, mit:
PROGRAMMIEREN
c Dabei muß man dann die Funktion »kgV()« mit extern LONG kgV()« im Hauptprogramm anmelden. Thomas Becker/ik
Kleinstes gemeinsames Vielfaches zweier Zahlen in C
Commander
| »Commander.c« ist besonders für Aztec-C-Programmierer geeig- net. Mit diesem Werkzeug (Tool) kann man auf Mausklick einen Quelltext editieren, übersetzen lassen oder das fertige Programm ausführen. Vorher muß man allerdings die Aufrufe für die einzelnen Aufträge in die folgenden Gadgets (Schalter) eintragen:
* CC-USAGE: Hier trägt man den Aufruf des Compilers ein, z.B.:
AS-USAGE: Für Eintrag zum (wenn der Assembler nicht vom Com- piler aufgerufen wird) Aufruf des Assemblers, z.B.:
© LN-USAGE: Aufruf des Linkers, z.B.:
tragen Sie hier Ihren Editor ein. Beispiel:
» ED-USAG . PRG-USAGE: ruft Programm auf. Beispiel:
| Die Gadgets und Ihre Funktion zeigt die Tabelle.
Gadget Funktion RUN-PROGRAM ruft fertiges Programm auf CC+AS+LN PROG. kompiliert, assembliert und linkt Quelltext CC+LN PROGRAM kompilieren und linken | EDIT PROGRAM startet Editor
Sobald Sie die Gadgets »RUN-PROG.«, »CC+AS+LN-PROG.«, | »CC+LN PROG.« und »EDIT PROGRAM« auswählen, wird der Commander automatisch in den Hintergrund gesetzt. Oben wird
35
noch das Datum mit dem Wochentag und der aktuellen Uhrzeit an-
gezeigt. Darunter steht der noch verfügbare Speicherplatz in KByte. Das Programm wurde mit Aztec C 3.4a geschrieben und folgen-
dermaßen übersetzt:
ce prg.c +1 -5
In prg.o -1c32
36
Sören Knebel/ub
/* COMMANDER done by SÖREN KNEBEL */
#include <intuition/intuition.h> #include <intuition/intuitionbase.h> #include <libraries/dos.h>
#include <exec/types.h>
#include <exec/menory.h>
#include <stdio.h>
#include <time.h>
#define s 80
struct IntuitionBase *IntuitionBase = OL; struct GfxBase *GfxBase = 0L;
static struct RastPort *my_rp;
static struct ViewPort *my_vp;
struct Window *Mykin;
struct IntuiMessage message;
void *OpenLibrary(), *Openklindow(); void *CloseLibrary(), *Closewindow();
struct TextAttr Font = ("topaz.font”,
TOPAZ_SIXTY, FS_NORMAL, FPF_ROMFONT, }; unsigned char CCStringBuffer[s] « CCUndoBuffer[s]; unsigned char ASStringBuffer[s] "", ASuUndoBuffer[s]; unsigned char 1NStringBuffer[s] **, LNUndoBuffer[s]; unsigned char EDStringBuffer[s] "", EDündoBuffer[s]; unsigned char PGStringBuffer[s] "", PGundoBuffer{s];
wuonon
short PairsA[]
0, 0, 252, 0, 2532, 12,0, 1,0,0, short PairsB[] 0
, 0, 171, 0, 171,11, 0,11,0,0,
u
struct Border CCBorder struct Border ASBorder struct Border LNBorder struct Border EDBorder struct Border PGBorder struct Border RunPrgBorder struct Border CALPrgBorder struct Border CLPrgBorder struct Border EDPrgBorder struct Border AboutBorder
-2, 1, 0, JAML, 5, PairsA, NULL,); -2, 1, 0, JAML, 5, PairsA, NULL}; -2, 1, 0, JAML, 5, PairsA, NULL}; 1, 0, JAML, 5, PairsA, NULL,}; 1, 0, JAML, 5, PairsA, NULL,}; -1, 1,.0, JAML, 5, PairsB, NULL, }; -1.1, 0, JAML, 5, PairsB, NULL, }; -1, 1, 0, JAML, 5, PairsB, NULL,};
li
.}
-1, 1, 0, JAML, 5, PairsB, NULL -1, -1, 1, 0, JAML, 5, PairsB, NULL
struct IntuiText CCText = { 1, 0, JAM2, -115, 1, &Font, (UBYTE *)* CC-USAGE:", NULL, };
struct IntuiText ASText = { 1, 0, JAM2, -115, 1, &Font, (UBYTE *)" AS-USAGE:", NULL, };
struct IntuiText INText = { 1, 0, JAM2, -115, 1, &Font, (UBYTE *)" LN-USAGE:*, NULL, };
struct IntuiText EDText = ( 1, 0, JAM2, -115, 1, &Font, (UBYTE *)* ED-USAGE:", NULL, };
struct IntuiText PGText = { 1, 0, JAM2, -115, 1, &Font, (UBYTE *)"PRG-USAGE:", NULL, );
struct IntuiText RunPrgText = { 1, 0, JAM2, 1, 1, &Font, (UBYTE *) "RUN PROGRAM*, NULL, };
struct IntuiText CALPrgText = { 1, 0, JAM2, 1, 1, &Font, (UBYTE *) "CC+AS+LN PROGRAM®, NULL, };
struct IntuiText CLPrgText = ( 1, 0, JAM2, 1, 1, &Font, (UBYTE *)"CC+LN PROGRAM", NULL, };
struct IntuiText EDPrgText = { 1, 0, JAM2, 1, 1, &Font, (UBYTE *) "EDIT PROGRAM", NULL, };
struct IntuiText AboutText = { 1, 0, JAM2, 1, 1, &Font, (UBYTE *) "ABOUT. ..*, NULL, };
char Date[80], Mem[80];
struct IntuiText. DateText = { 1, 0, JAM2, 0, 0, NULL, (UBYTE *)Date, NULL };
struct IntuiText Memfext = { 1, 0, JAM2, 0, 0, NULL, (UBYTE *)Mem, NULL}; .
struct StringInfo CCStringInfo = { &CCStringBuffer[0], &CCUndoBuffer[0], 0, s, 0, 0, 0, 0, 0, 0, NULL, 0, NULL, };
struct StringInfo ASStringInfo = { &ASStringBuffer[0], &ASUndoBuffer[0], 0, s, 0, 0, 0, 0, 0,};
struct StringInfo LNStringInfo = { &LNStringBuffer[0], &LNUndoBuffer[0], 0,
8, 0, 0, 0, 0, 0, 0, NULL, 0, NULL, };
EEE
struct StringInfo EDStringInfo = { &EDStringBuffer[0], &EDUndoBuffer[0], 0, s, 0, 0, 0, 0, 0, 0, NULL, 0, NULL, );
struct StringInfo PGStringInfo = { &PGStringBuffer[0], «PGUndoBuffer[0], 0, 5, 0,0, 0, 0, 0, 0, NULL, 0, NULL,);
struct Gadget CCStringGadget = {NULL, 150, 50,250, 10, GADGHCOMP, RELVERIFY, STRGADGET, (APTR)&CCBorder, NULL, &CCText, NULL, (APTR)&CCStringInfo, 1, NULL, );
struct Gadget ASStringgadget = (&CCStringGadget, 150, 70,250, 10, GADGHCOMP, RELVERIFY,STRGADGET, (APTR)&ASBorder,
NULL, &ASText, NULL, (APTR)&ASStringInfo, 2,NULL,);
struct Gadget INStringGadget = (&ASStringGadget, 150, 90,250, 10, GADGHCOMP, RELVERIFY,STRGADGET, (APTR) &LNBorder,
NULL, &UNText, NULL, (APTR)&LNStringInfo, 3,NULL,);
struct Gadget EDStringGadget = (&1NStringGadget, 150, 110,250, 10, GADGHCOMP, RELVERIFY,STRGADGET, (APTR)&EDBorder,
NULL, &EDText, NULL, (APTR)&EDStringInfo, 4,NULL,};
struct Gadget PGStringGadget = { &EDStringGadget, 150, 130, 250, 10, GADGHCOMP, RELVERIFY, STRGADGET, (APTR)&PGBorder, NULL, &PGText, NULL, (APTR)EPGStringInfo, 5, NULL, }; 5
struct Gadget RunPrgGadget = ( &PGStringGadget, 430, 49, 170, 10, GADGHCOMP, RELVERIFY, BOOLGADGET, (APTR)&RunPrgBorder, NULL, &RunPrgText, NULL, NULL,"6, NULL, };
struct Gadget CALPrgGadget = { &RunPrgGadget, 430, 69, 170,
10, GADGHCOMP, RELVERIFY, BOOLGADGET, (APTR)&CALPrgBorder, NULL, &CALPrgText, NULL, NULL, 7, NULL};
struct Gadget CLPrgGadget = { KCALPrgGadget, 430, 89, 170,
10, GADGHCOMP, RELVERIFY, BOOLGADGET, (APTR)&CLPrgBorder, NULL, &CLPrgText, NULL, NULL, 8, NULL,};
struct Gadget EDPrgGadget = [ &CLPrgGadget, 430, 109, 170,
10, GADGHCOMP, RELVERIFY, BOOLGADGET, (APTR)&EDPrgBorder, NULL, &EDPrgText, NULL, NULL, 9, NULL,};
struct Newlindow MyNexhtin = { 0, 0, 640, 256,0, 1, CLOSEWINDOW | GADGETUP | GADGETDOWN, WINDOWDEPTH | ACTIVATE | WINDOHCLOSE |SMART_REFRESH, GEDPrgGadget, NULL, (UBYTE *)"Comnander by Sören Knebel“ ‚NULL, NULL, 100, 100, 640, 256,WBENCHSCREEN, };
void anl) { Activatelindow(Mykin); }
void auf(){
if(!(IntuitionBase = (struct IntuitionBase *) OpenLibrary("intuition.library*, 0L))) exit (FALSE) ;
1E(! (GEXBas (struct GExBase *) OpenLibrary(*graphics.library*, 0L)))
exit (FALSE|
if(!yHin = (struct Window *) Openkindon (&MyNewitin)))
{
print£("Can’t continue! Where’s Window?\n"); exit (FALSE); n
void zu(){
if(MyWin ! = OL) CloseWindow(MyWin) ;
if(GfxBase ! = OL) CloseLibrary (GfxBase) ; if(IntuitionBase ! = OL) CloseLibrary(IntuitionBase) ;}
void init(){ my_rp = (struct RastPort *)MyWin->RPort; my_vp = (struct ViewPort *)ViewPortAddress (Mykin);}
void drawbox(){ SetAPen(my_rp, 1); Move(my_rp, 2, 46); Draw(my_rp, 637, 46); Moveimy_rp, 2, 142); Draw(my_rp, 637, 142);}
char *wtag[] = { "Sunday*,. "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday");
char *mon[] = { "January", "February*, "March", "April", "May", "June*, *July*, "August", "September", "October", "November*, "Decenber"};
void main()
{
ULONG MessageClass; USHORT code, GadgetNr;
time_t just; struct tm *zt; struct Message *GetMsg();
struct Gadget *GadgetPtr; int tnr, tag, mnr, jahr, std, min, sek; register short chip, fast, all;
auf(); init(); RefreshGadgets (&CCStringGadget, Myitin, NULL) ; drawbox();
FOREVER
t
Delay (10L) ;
time (&just) ;
2t = localtime(&just); ene = zt->tmwday; tag = zt->tmmday; mr = zt->tm_mon; jahr = zt->tm_ year; std = zt->tm_hour; min = zt->tmmin; sek = zt->tm_sec;
chip = Availliem(MEMF_CHIP) » 10;
fast = AvailMen(MEMF_FAST) » 10;
all = AvailMem(MEMF_CHIP) + AvailMem(MEM sprintf (Date, * %s %d-%d %s %2d:% mon{mnr], tag, jahr, wtagltnr], std, min, sprintf(lem, * Free Memory: *4dk all);
PrintIText (my_rp, &DateText, 145L, 15L); PrintIText (my_rp, &MemPext, 145L, 26L); if(message = (struct IntuiMessage *) GetMsg (MyWin->UserPort) )
{
MessageClass = message->Class; code = message->Code; GadgetPtr = (struct Gadget *message->IAddress;
GadgetNr = GadgetPtr->GadgetID; ReplyMsg (message) ; switch (MessageClass) { case CLOSEWINDON: Delay (301); zul); exit (TRUE) ; break; case GADGETUP: case GADGETDOHN: switch (GadgetNr) { case 6: WindowToBack (MyWin) ; Execute (&PGStringBuffer[0], OL, OL); WindowToFront (Mykin) ; an); continue;
case 7: WindowToBack (MyWin) ; Execute(&CCStringBuffer[0], OL, OL); Execute (&ASStringBuffer[0], OL, OL); Execute(&LNStringBuffer[0], OL, OL); WindowToFront (MyWin) ;
an();
continue;
case 8: WindowToBack (Iylin) ; Execute (&CCStringBuffer[0], OL, OL); Execute(&LNStringBuffer[0], OL, OL); WindowToFront (MyWin) ;
anl);
continue;
case 9: WindowToBack (MyWin) ; Execute(&EDStringBuffer[0), OL, OL); WindowToFront (Myiin) ;
an);
continue;
Commander.c Zum Kompilieren und Linken per Mausklick
PROGRAMMIEREN
c
Rot, grün und blau
Das Programm »SetRGB.c« ändert die Farbe des angegebenen Farbregisters. Die einzelnen Farbkomponenten (Rot, Grün, Blau) können Werte zwischen 0 und 15 annehmen. Daraus ergeben sich 16X3 = 4096 verschiedene Farben.
Sie übersetzen »SetRGB.c« folgendermaßen (Aztec-C V.3.4a):
* Set
: %s [Farbregister) [R] IG]) [BJ \n*,av[0));
close_all(); exit (TRUE) ;
B.c zum Einstellen einer bestimmten Farbe
Beim Aufruf von SetRGB erscheint folgende Informationszeile: Usage: SetRGB [Farbregister] [R] [G] [B]
»Farbregister« ist hierbei die Nummer des Farbregisters, das Sie verändern möchten:
— »0« ist das Register der Hintergrund-,
- »1« das der Vordergrundfarbe.
— Mit »2« adressieren Sie das Register, das die Farbe der Depth-
Gadgets eines Windows enthält (Standard-Workbench- bzw. Shell- Screen) und
- mit »3« das Register der Cursorfarbe. »R«, »G« und »B« geben die Rot-, Grün- und Blaukomponente der
37
PROGRAMMIEREN
c
neuen Farbe an (Werte von 0 bis 15). Beispielaufrufe: SetRGB 0 0 0 15 + änd di r dfarbe in Blau
3 15 15 0 ; Cursorfarbe b
»SetRGB« kann nur vom CLI aus aufgerufen werden. Binden Sie es z.B. in der »Startup-Sequence« ein, um Farben beim Start zu än- dern, wenn kein Platz mehr für die Preferences auf der Diskette ist.
Sören Knebel/ub |
|
»PowerColor.c« macht dasselbe wie »SetRGB«, jedoch ist es durch seine Gadgets einfacher zu handhaben und kann auch von der Workbench gestartet werden.
Erklärung der einzelnen Gadgets:
Gadget Funktion R+ ändert Rotkomponente um +1 - R- ändert Rotkomponente um -1 G+ ändert Grünkomponente um +1 G- ändert Grünkomponente um -1 B+ ändert Blaukomponente um +1 B- ändert Blaukomponente um -1
Der Aufruf von PowerColor lautet: PowerColor [Farbregister]
Das Farbregister ist, wie bei »SetRGB«, eine Zahl zwischen »0« und »3«. »0« ist die Hinter-, »1« die Vordergrundfarbe, usw. Das Programm ist mit Aztec C 3.4a getestet worden. Übersetzung mit:
Sören Knebel/ub
MACHEN SIE MIT
Wollen Sie sich an der Rubrik »Tips & Tricks« im AMIGA-Magazin beteiligen? Schicken Sie uns Ihre Tips. Am besten, Sie senden uns Ihre.Programme und Texte auf Diskette (ASCII-Format). Für Bastel- anleitungen fügen Sie bitte einen Bauplan bei. Die Adresse:
AMIGA-Redaktion, Kennwort: Tips & Tricks
Markt & Technik Verlag AG
Hans-Pinsel-Str.2 8013
Haar bei München Alle Einsendungen werden von uns geprüft. Wenn Ihr Beitrag in die engere Wahl für eine Veröffentlichung kommt, werden Sie benach- richtigt. Haben Sie auf jeden Fall ein wenig Geduld: Vom Zeitpunkt,
‚an dem Ihr Beitrag die Redaktion erreicht, können bis zum Abdruck
im AMIGA-Magazin oder Sonderheft zwei bis drei Monate vergehen.
Bo
38
SMART_REFRESH, &RedPlusGadget ‚NULL, „NULL, 20,20, 640, 256, WBENCH! EN};
‚ 0L))) {Close.
IntuiMessage *) serPort) ){ message->Class;
*)message->IAddress;
PROGRAMMIEREN
c
HdR Wie SetRGB.c — aber mit wesentlich mehr Komfort
Das folgende als CLI-Befehl einsetzbare Programm »move« ko- piert Dateien in ein anderes Verzeichnis. Das Besondere dabei ist, daß das alte File gelöscht wird und somit nur noch ein Exemplar exi- stiert. Der Aufruf vom OLI:
Sie müssen immer die komplette Pfade angeben, also z.B.:
Ein Start von der Workbench ist nicht vorgesehen. Das »Moven« von ganzen Verzeichnissen ist allerdings nicht möglich. Andreas Stolz/ub
Ein wichtiger Befehl zum Verschieben von Dateien
itoa —- Lattice hat's
In Ausgabe 3/91 des AMIGA-Magazins wird mangels einer C- Funktion »itoa« eine kurze Assembler-Routine vorgestellt. Zuminde- stens der Lattice (SAS)-C-Compiler bietet aber eine solche Funktion, sie heißt nur anders. Hinter dem Namen »stci_d« etc. (Handbuch L196) versteckt sich genau diese Funktion. Außerdem gibt es dort die Funktion noch als Version, die eine Zahl als Hexadezimal-Wert ausgibt (»stci_h«). Die entsprechenden Umkehrfunktionen sind ebenfalls vorhanden (L190).
Als Typ wird für diese Funktionen »LATTICE« angegeben; sie ist
| bei anderen C-Compiler also nicht vorhanden. Die Benutzung ist
ganz einfach:
ub
Link-Library mit Lattice
Beim Erzeugen einer Link-Library in C machen es sich die mei- sten Leute ein wenig zu einfach: Sämtliche Routinen werden in einer Datei zusammengefaßt, diese kompiliert und dann in »Library.lib« umbenannt (Auch die Benutzung von OML zu dieser Aufgabe, wie bei den Routinen für die indexsequentiellen Dateien im AMIGA-Ma- gazin 12/90 nutzt nichts) Die Überraschung ist groß, wenn man fest- stellt, daß beim Benutzen nur einer der Funktionen gleich alle einge- bunden werden, obwohl sie nicht gebraucht werden.
Die korrekte Lösung ist etwas aufwendiger: Jede Funktion ist in eine eigene Datei zu schreiben und einzeln zu kompilieren. Und dann muß man mit dem entsprechenden Hilfsprogramm (bei SAS/Lattice: OML) diese Dateien zu einer Library zusammenbinden:
Etwas bequemer geht es beim SAS-C noch: Man kann direkt beim Kompilieren angeben, daß eine Objektdatei an eine Library angefügt werden soll:
Danach werden nur noch die wirklich benötigten Files gelinkt. ub
C-opperdemo
Was kann man nicht alles mit dem Copper machen? Dieser Co- prozessor im Amiga ist ein wahrer Zauberchip. Vor allem für Farb- spielereien auf dem Bildschirm setzen Programmierer ihn gerne ein, aber auch für anderes: Ein C-Programm zeigt, wie man den Copper programmiert, um Spiegeleffekte auf den Monitor zu zaubern.
39
PROGRAMMIEREN
c
»Copperdemo.c« besteht aus einem Haupt- und drei Unterpro- grammen. Das Hauptprogramm (main()) öffnet die benötigten Libra- ries und einen Lores-Screen mit einem Window. Für die Copperrou- tine, die den Spiegeleffekt berechnet und in die Copperliste einträgt, wird zusätzlicher Speicher für die Copperliste im System angemeldet siehe »AllocMem()« im Beispiellisting).
Copperdemo.c -> Spiegeleffekt mit dem Copper <- * /* Compil tek Compiler V. 3.6. * /* Übersetzungsanweisungen: "
/* ce Copperdemo.c -s +1 In Copperdemo.o -1c32
ude <intuition/intuition.h> \clude <graphics/gfxbase.h> #include <graphics/gfxmacros.h> #include <graphics/rastport.h> #include <graphics/view.h> #include <hardware/custom.h> include <exec/memory.h> include «exec/types.h> #include <functions.h>
struct IntuitionBase *IntuitionBase; struct GfxBase *GfxBase; struct RastPort *RastPort;
struct Window *UCo; *ViewPort;
/* Screen- und Windowstrul struct NewScreen NewScreei "COPPERDEMO (C) 1991 struct NewwWindow Newilindo WINDOWCLOSE| SMAR 0,0,"<-- Close fü /* Requester-Struktu: tuiText anzeigen_text={0,0,J2 CHTUNG PROGRAMNFE
VOID main()
{ i£((IntuitionBase = (struct IntuitionBase *) OpenLibrary ("intu: ibrary",0)) == NULL) Ende ("Intuitionlibrary");
if((GfxBase = (struct GfxBase *) OpenLibrary ("graph ‚brary*,0)) == NULL) Ende ("Graphicslibrary");
i£((Screen = OpenScreen (&NewScreen)) ==
Ende ("Bildschirm");
NewWindow.Screen = Screen;
i£( (Window = Openkindow (&NewWindow)) == NULI
WCopList = (struct UCopList*) AllocMem(sizeof (struct UCopList) ‚MEMF_CHIP|MEMF_CLEA
* Speicher für die UserCopperListe */
i£(Woplist ) Ende(" ODE
L) Ende("!
Rand(0, 50,320,100,2,14); Rand(0,150,320,200,2,14); SetAPen (RastPort,1); SetBPen(RastPort,15);
/* Aufbau einer kleinen Grafik *
Move (Rast Port, 80,78);
Text (RastPort, " Copper-Spiegelung" 22); Move (RästPort, 80,178);
Text (RastPort, "Ohne Copper-Spiegelu Copper (100, Copper (200,25
/* Cop.liste i
port neu berechnen, Start neue Co
Mit Copper-Spieg 0,178); Mit Copper-Spiegelung" 22);
40
Ende (info) char *info;
"Ende("Fehlerstring")* */
/* Aufruf:
i£(*infot=0) {
anzeigen_textII.IText=info;
zeigen_text .NextText=kanzeigen_textIl; AutoRequest (0, &anzeigen_text, 0, &okay_text,0,0,640,80);
CloseWindow (Window) ; CloseScreen (Screen) ;
i£(GfxBase) CloseLibrary (GfxBase) ; if(IntuitionBase) CloseLibrary (IntuitionBase) ; e&xit(0);
h3) /* Aufruf: "Copper(yl,y2,Bildschimbreite)" */ /* Angaben in Pixel. yl,y2 vertikale Positionen */
‚h1,0); /* Start des Spiegelbereiches */
tom. bplimod, (-h4));
chirmzeile zurück */
„custom.bpl2mod, (-h4)); /* Bildschirmbreite/8*2 */ 12,0); /* Ende des Spiegelbereiches */ „custom.bplimod,h5); /*Spiegelbereich überspringen*/ ist, custom.bpl2nod, h5); /*(y2-y1) *Bildschirmbreite/B*2*/
[AI RE ıT RE
Spiegeleffekte programmiert man am besten mit Hilfe des Coppers
m a
Damit der Spiegeleffekt deutlicher wird, zeichnet die Routine »RAND« eine kleine Grafik. Bei einem Fehler (z.B.: kein Speicher für den Bildschirm oder für das Fenster vorhanden), wird die Routine »ENDE« aufgerufen, die einen Fehlertext in einem »AutoRequester« anzeigt und geöffnete Bildschirme, Windows und Libraries schließt.
Routinenbeschreibung:
« RAND(x1,y1,x2,y2,Farbe,Anzahl): zeichnet Rechtecke mit (x1,y1) als oberer linken und (x2,y2) als unterer rechten Ecke. Der Parame- ter »Anzahl« gibt die Zahl der Rechtecke an, die gezeichnet werden sollen. »Farbe« bestimmt die Farbe des ersten Rechtecks; bei allen anderen Rechtecken, die um einen Pixel kleiner als das vorherge- hende gezeichnet werden, erhöht sich die Farbnummer um eins.
« ENDE("Fehlertext"): beendet das Demo-Programm und gibt mittels eines Auto-Requesters einen Fehlertext aus. ENDE gibt auch alle benötigten Bildschirme und Libraries ans System zurück.
« COPPER(y1,y2,Bildschirmbreite): die wichtigste Routine des Pro- grammes. Sie erstellt die Copperliste für den Spiegeleffekt. Es sind: -y1 = Beginn des Bereichs, in dem rückwerts aus den Bitplanes ge- lesen wird (Änderung der Modulo-Werte);
-y2 = Ende des Bereichs, in dem rückwerts aus den Bitplanes gele- sen wird, und Rücksetzung der Modulo-Werte, um ein normales Lesen aus den Bitplanes zu ermöglichen;
- Bildschirmbreite = Breite in Pixel des verwendeten Screens, z.B. 320 bei einem Lores-, 640 bei einem Hires-Screen.
Das Beispielprogramm zeigt, daß man auch in mehreren Berei- chen des Bildschirms den Spiegeleffekt einbauen kann, allerdings
dürfen sich die Bereiche nicht überschneiden und der Bereich mit dem kleinsten »y1«-Wert muß zuerst installiert werden. Zum Schluß muß das Programm die Copperliste mit »CEND(UCoplList)« been- den und in den ViewPort eintragen (s. Kommentare im Listing). Norbert Balk/ub
Die Berechnung von Primzahlen mit dem Computer ist ein recht interessantes Gebiet und beliebtes Thema. Hier kann jeder zeigen, daß er programmieren kann; hier geht’s darum, möglichst effektive und schnelle Routinen zu schreiben - und Speicherplatz schonende:
Meist wird zur Berechnung von Primzahlen das Sieb des Era- tosthenes benutzt — aber meist auch in einer Bit-verschwendenden Art und Weise.
Das Programm »Prim.c« nutzt jedes Bit des reservierten Bereichs für die Ermittlung von Primzahlen. Auf einem 1-MByte-Amiga kann man einen 320 000 Byte großen zusammenhängenden Speicher- block erhalten. Damit kann man mit dieser Version immerhin die Zahlen bis 5 120 001 überprüfen. Das Programm gibt zusätzlich alle im Bereich enthaltenen Primzahlen-Zwillinge aus (2 und 3 werden wohl nicht als Zwilling gerechnet).
Rüdiger Dreier/ub
/* Programm zum Berechnen von Prinzahlen */ /* © 1991 by Rüdiger Dreier & #include <exec/types.h>
#include <proto/exec.h>
#include <proto/dos.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define SIZE 320000
/* Jedes char gibt einem 8 Bits * /* Ergibt Zahlenbereich bis MAXNUMMER*2+3 * #define MAXNUMMER 8*SIZE-1
/* Enthält die Flags, ob Primzahl oder nicht 10: Primzahl
/* 1: keine Primzahl
char _far PrimFlags[SIZE]; VOID Ausgabe (VOID) ;
VOID AusgabeZwillinge (VOID) ; VOID SetFlag(ULONG Numm SHORT GetFlag (ULONG Nummer) ;
main()
t
ULONG i, /* Laufvariable */ kı /* Laufvariable */ Pzahl, /* Primzahl “ count; /* Zähler kr
/* Um den Fehler beim Löschen des globalen Speic for(i = 0;i«SIZE;i++) { PrimFlags[i] = 0; } count = 1; /* Die 2 ist schon als Primzahl bei for(i = O;i< = MAKNUMMER;i++) { if(!GetFlag(i)) { /* PZahl ist die Pzahl = i+i+3; /* Die Viel for(k = i+PZahl { SetFlag(k); } count++;
inge();
} Routine gibt die ge /* ACHTUNG : Kann sehr lange dauer: VOID Ausgabe (VOID)
PROGRAMMIEREN
c
eichern */
‚ keine Primzahl *
gesetzt war, ist Bit 1 *
Primzahlen mit dem Computer zu bnerechnen, ist eine interessante Programmieraufgabe
Nicht zu dynamisch
Bei Programmen, die intensiv dynamische Speicherverwaltung einsetzen, führen bereits kleine Programmierfehler zu zu nicht repro- duzierbaren Speicherverluste. Besonders bei dynamischer String- verwaltung mit berechneten Speichergrößen kann ein kleiner Tipp- fehler oder eine Unachtsamkeit katastrophale Folgen haben. Der Grund liegt in der Speicherverwaltung des Amiga. Jede angeforderte Menge Speicher wird auf ein Vielfaches von 8 aufgerundet. Desglei- chen gilt bei der Freigabe von Speicher. Wird nun ein z.B. 9 Byte langer Bereich reserviert, aber (warum auch immer) nur ein 8 Byte
41
PROGRAMMIEREN
c
langer Bereich freigegeben, fehlen einem am Ende gleich 7 Byte. Wenn dann die Länge der angeforderten Speicherbereiche auch noch von Benutzereingaben abhängt, kann man sehr lange nach einem solchen Fehler suchen.
Abhilfe schaffen Programme wie MemTrace (Fish 163, Author: Jojo Wesener). Es protokoliert jeden Aufruf von »AllocMem()« und »FreeMem()«, und lenkt sie in eine eigene Routine um. So können Programmierer feststellen, ob der gesamte Speicher freigegeben wurde und ob Speicher freigegeben wurde, der gar nicht (mehr) be- legt war.
Benutzung: In JEDEM Teil des Programms #include "mem.h" einfügen. Außerdem immer MEMTRACE definieren, z.B. Lattice kompilieren mit:
-GMEMTRACE
Außerdem muß man vor dem Ende des Programms »freeall()« aufrufen und schließlich noch mit »mem.o« linken. Dann werden einem alle Fehler gemeldet - fast. Der oben beschriebene Fehler war dem Autor wohl zu unwahrscheinlich. Aber es ist nicht schwer, eine solche Abfrage mit einzubauen, alles nötige ist bereits vorberei- tet:
Man braucht nur ein paar Zeilen in mem.c einfügen:
VOID freetrack(char *addr,LONG amt,char *file,char *line { . membkt_t * bkt; if( (bkt =
t printf("freetrack: error >%s<, %d, 0xtx -- Oxtx\n",file,line, addr, amt);
find_bkt( addr )) = = NULL)
printf("freetrack: error >ts<, %d, Oxtx -- Oxkx <-> 0x3x\n", £ile, line, addr,ant,bkt->ant) ; } /* Einfügen ENDE */ /* Die folgende Zeile ändern */ (void) FreeMen (addr,bkt->ant) ; /* Ändern ENDE */ put_bkt (bkt); }
Mit ein paar zusätzlichen Zeichen noch sicherer
So werden einem auch diese Fehler noch berichtet. Bei der Be- nutzung von MemTrace treten keine FreeTwice-Errors mehr auf und es geht kein Speicher mehr verloren. Die Programmentwicklung macht so viel mehr Spaß.
Rüdiger Dreier/ub
MutualExclude-Gadget
Die Gadget-Struktur enthält neben bekannten und vielbenutzten Einträgen auch eine Long-Variable namens »MutualExclude«, die eine ähnliche Funktion wie eine Variable gleichen Namens in der »Menultem«-Struktur besitzt.
Das könnte man bei TOGGLESELECT-Gadgets dazu verwenden, bei Aktivierung eines Gadgets ein oder mehrere andere (maximal 32) Gadgets gleichzeitig zu deaktivieren, wäre da nicht ein kleiner Haken: Die Variable wird von den derzeitigen Betriebssystemversio- nen 1.2 und 1.3 noch nicht unterstützt. Folglich bleibt dem von allen Göttern verlassenen User nur übrig, sich selbst eine solche Routine zu schreiben, die diese Variable verwendet und den oben beschrie- benen Zweck erfüllt.
Die Routine ist dabei auf die Nummerierung der Gadgets durch den Programmierer in der eh schon vorhandenen USHORT-Varia-
42
blen »Gadget.GadgetID« und auf eine geöffnete »intuition.library« angewiesen und kann bei der Gadgetabfrage gleich nach dem Be- fehl »ReplyMsg()« aufgerufen werden. Die Nummern der Gadgets, die deaktiviert werden sollen, stellt man nun wie in der »Menultem«- Strukur ein: Soll also das Gadget mit der GadgetID 1 beim Anklicken deaktiviert werden, wird das erste Bit der »MutualExclude«-Variable gesetzt, d.h. die Variable erhält den Wert 1. Will man das zweite Gadget ansprechen, wird das zweite Bit gesetzt, usw. Beispiele zeigt die Tabelle:
zu deaktiverende Gadgets
MutualExclude (binär)
1 1
2 10 1
MutualExclude (dezimal)
und 2 11 3 100 3und 1 101
Die Funktion in der Grundform ermöglicht nicht, daß alle Gadgets gleichzeitig deaktiviert sein können, was im Anwendungsfall seltener vorkommen dürfte. Wollen Sie diese Möglichkeit offenhalten, entfer- nen Sie einfach die entsprechende Abfrage.
Das Listing »GadgetDemo.c« zeigt ein Beispiel für den Einsatz unserer Gadget-Funktion. Verwendet wurde der Aztec-C-Compiler, Compiler- und Linkeraufruf lauten:
CC Demo LN Demo -Ic
Steffen Nebel/ub
void mexelude(struct Gadget *actgadget, struct Gadget *selected) d ein Pointer, der auf eine Gadget-Struktur zeigt, die Funktion durch alle folgenden durchhangelt nter auf das gerade aufgerufene Gadget */
== NULL) schon aktiviert war, */
* Schleifenbeginn. ... */
ion & TOGGLESELECT) les Gadget vom TOGGLESELECT-Typ ist, */
tuel
GadgetID) < 32) 2, Nummern > 32 können durch
actgadget
mehr angesprochen werden, */
clude & (1L « (gadgetid - 1L))) lich das Bit gemäß der GadgetIl also deaktiviert werden muß */
ist, */
dget deaktiv 1 15
en *
MutualExclude.c
Ein MutualExclude-Bit für Gadgets wird von OS1.3 nicht unterstützt — aber selbst ist der Programmierer
Warnungen
»Beep.c« läßt den Bildschirm ein- bis neunmal aufblitzen, was man sehr sinnvoll einsetzen kann, z.B. so:
Stellen Sie sich vor, Sie schreiben gerade an einem Text, und las- sen im Hintergrund eine Batch-Datei ablaufen. Wie stellen Sie fest, ob alles normal läuft oder ob es irgendwelche Fehler gibt, die viel- leicht gar zum Abbruch führen?
Sie können zwar über IF..WARN..ERROR Fehler abfragen, und über den ECHO-Befehl Fehlermeldungen ausgeben, aber wenn Sie im aktuellen Fenster gerade die Ausgabe ins >NIL: umleiten, ist alles umsonst. Auch ein Bildschirmblinken, das mit dem Befehl ECHO »<Ctrl G>« ausgegeben werden kann, bietet keine optimale Lösung.
Mit dem folgenden Utility erfahren Sie sofort, wann ein Fehler auf- tritt und wenn, wie schwer er ist. Ein leichter Fehler (Errorcode WARN) läßt z.B. zweimal blinken, ein schwerer Fehler (Errorcode FAIL) viermal.
ub
blinik beep.o
main(char*);
Wenn Sie wirklich sehen wollen, ob irgendwo etwas nicht in Ordnung ist
SAS/C Fehler behoben |
Mit diesem Tip können Sie ein Programm aus dem SAS/C (V 5.1) Compilerpaket korrigieren, indem Sie es patchen.
Bekanntlicherweise hat der Compiler jetzt ein praktisches Work- bench-Interface, von dem aus man die Compilieroptionen komforta- bel anwählt. Das Programm, mit dem man die Einstellungen vor-
PROGRAMMIEREN
c
nimmt, heißt »SASCOptions«. Es befindet sich normalerweise im Verzeichnis »SYS:Prefs«.
In diesem neuen Feature steckt natürlich, wie könnte es anders sein, ein Fehler oder, genaugenommen, eine Verwechslung. Wenn man nämlich unter »Advanced Options« die Einstellung »Nested Comments« (verschachtelte Kommentare) einstellt, meldet der Com- piler beim nächsten Durchlauf einen »unrecognized Option«-Fehler.
Ein Blick in die Umgebungsvariable »SASCOPTS« klärt das Rät- sel auf: Dort wurde die Compileroption »-cn« selektiert, die aber gar nicht existiert — hier hat der Programmierer wohl an »n« für »n«ested gedacht und nicht an »C« wie »C«omments, denn die richtige Opti- on wäre »-Cc«.
Ein wirklich ärgerlicher Fehler, aber die Lösung ist erfreulich ein- fach. Man nehme einfach einen Filemonitor (z.B. »NewZap«) oder einen guten Editor (z.B. »CygnusEd«) und suche nach der Zeichen- folge »-en«. Sie wird nur einmal gefunden (etwa bei Byte 17400) und kann nun gefahrlos gegen »-cc« vertauscht werden. Genauso ver- fahren Sie mit der Zeichenkette »suwndei« (bei Byte 18200), die durch »suwcdei« ersetzt werden muß.
Wer es noch einfacher haben möchte, benutzt »RepString« (ein Utility von Fish 180). Die Aufrufe lauten:
ns en -cc
SASCOptions suwndei suwedei
Nachdem das Programm zweimal gemeldet hat: Changes 000001 *** Finished *** haben Sie eine verbesserte Version der »SASCOptions« mit dem Namen »NewSASCOptions«. Sie sollten das alte Programm löschen oder umbenennen und dem neuen Programm den Namen »SASC- Options« geben. ub
Herein, Heraus
Sicherlich haben Sie schon folgende oder ähnliche Befehlszeilen direkt in der Shell oder in Batch-Dateien eingegeben, um etwas auf
| dem Drucker auszugeben:
Hierbei wird bekannterweise die (Standard-) Ausgabe umgelenkt, in diesem Fall zum Drucker. Allerdings kann es schon mal passie- ren, daß ein Befehl aus irgendeinem Grund nicht korrekt abläuft und stattdessen eine Fehlermeldung ausgibt. Und klar, was schiefgehen kann, wird auch schiefgehen — laut Murphys Law -, und so landet die Fehlermeldung auf dem Drucker, wodurch mal wieder ein fast sauberes weißes DIN-A-4-Blatt in den Papierkorb wandern darf. Aber es könnte noch schlimmer kommen: Wird eine Fehlermeldung nach »nil:« umgeleitet, bekommt man sie wohl nie zu Gesicht und das artet zu einer zeitraubenden Fehlersuche aus.
Um die Ausgabe von Fehlermeldungen mit absoluter Sicherheit auf den Bildschirm zu leiten, gibt es in der Programmiersprache C den durch den »Startup-Code« vorinitialisierten Filezeiger »stderr«, der immer auf das aktuelle Fenster des aufgerufenen Programms
| verweist. »stderr« wird folgendermaßen verwendet:
Mit der »fprintf«-Funktion geben wir hier an, wohin die Daten ge- schickt werden sollen: - stdin: steht für die Standard-Eingabe; - stdout: für die Standard-Ausgabe; - stderr: für das aktuelle Fenster als Ausgabe
43
PROGRAMMIEREN
c
Auch in anderen Programmiersprachen stehen solche oder ähnliche Möglichkeiten offen, die Sie man auch nutzen sollten, um bedie- nungsfreundlichere Software zu entwickeln.
Thomas Becker/ik
Highspeed-Amiga: Bildschirm aus
Bei einigen Anwendungen erweist es sich als sinnvoll, die Re- chengeschwindigkeit des Amiga heraufzusetzen. Das ist ohne weite- res realisierbar, kennt man erst einmal die Bedeutung der einzelnen Bits des DMACON-Registers. Zuerst einmal eine Lösung für C-Pro-
grammierer. In der Include-Datei »graphics/gfxmacros.h« findet man |
die Macros »OFF_DISPLAY« und »ON_DISPLAY«: « OFF_DISPLAY sperrt die DMA-Kanäle (Direkt Memory Acess = di- rekter Zugriff auf den Sppeicher), die für die Bildschirmdarstellung erforderlich sind. Damit erhält der Prozesor mehr Buszyklen. Seine Operationen werden beschleunigt.
Eine Lösung in Assembler zeigt das folgende Beispiel:
rts
Das Programm sperrt alle für die Darstellung eines Bildes erfor-
derlichen DMA-Kanäle. Man kann das Register nicht einfach be- schreiben, sondern muß den Aufbau des Registers berücksichtigen.
Anhand der Liste fällt es leicht, die verschiedenen DMA-Kanäle zu sperren und wieder freizugeben. Die entsprechende Lösung in BASIC ist denkbar einfach, zum Beispiel für den Copper:
ei;
Cop frei : Durch diese Maßnahme wird die Rechemngeschwindigkeit des
Amiga um etwa 10% erhöht. Das lohnt sich auf jeden Fall bei re- |
chenintensiven Programmen. Thomas Gehling, Stefan Klümpers/ub
DMACON : Adresse $DFF096
Bit-Nummer Name Funktion
0-3 AUDXxEN Audio-DMA für die Tonkanäle einschalten
4 DSKLEN Disk-DMA einschalten
5 SPREN Sprites-DMA zulassen
6 BLTEN Blitter-DMA
7 COPEN Copper-DMA
8 BPLEN Bitplane-DMA
9 DMAEN Kontroli-Bit für alle Kanäle Bit = 0: DMA gesperrt Bit = 1 : DMA erlaubt
10-14 unwichtig für diese Anwendung
15 Set/Cir Bits setzen/löschen
Bit =0 : adressierte Bits löschen Bit =1: adressierte Bits setzen
Macro in voller Aktion
Schauen wir uns die Verwendung des oben beschriebenen Macros in einem Beispielprogramm in C an:
Das Programm»Display_aus.c« schaltet den Bildschirm für kurze Zeit aus. Verwenden Sie die Makros z.B., wenn Sie eine Grafik auf dem Bildschirm aufbauen. Erstens läuft ein Programm bei ausge- schaltetem BitPlane_DMA schneller, zweitens wird das Bild erst ge- zeigt, wenn es komplett ist.
Lars Schrix/ub
44
Display_aus.c DISPLAY-Makros in voller Aktion
| Ist irgendwo ein Fenster auf?
Sie wollen einen Überblick der zur Zeit geöffneten Screens und | Fenster? Ganz einfach, nehmen Sie das Programm »Screen.c«:
Zeigt alle Fenster und Screens
Das C-Programm listet alle vorhandenen Screens und Windows auf, indem es deren Namen und die Adressen der Kontrollstrukturen
, ausgibt. Peter Worofka/ub
Anmeldeliste für Geräte
Ein nützliches Tool für alle Programmierer ist das C-Programm | »Device.c«. Es gibt die Namen und Adressen der Message-Ports aller dem Amiga angemeldeten Geräte aus.
\ Die Aufrufe zum Übersetzen und Linken mit dem Aztec-C-Compi- | ler lauten: a
Wenn Sie das C-Programm übersetzt haben, kopieren Sie den neuen Befehl »device« am besten in den C-Ordner Ihrer Work- bench.
Peter Worofka/ub
Ein praktisches Tool: Es zeigt auch Message-Ports an
Vollbremsung |
Es war einmal... In Zeiten des C 64 brauchte man sich über War- teschleifen keine Gedanken zu machen. In BASIC ging das so:
Wie realisiert man Warteschleifen auf dem Amiga? Die korrekte Antwort lautet: »gar nicht«. Warteschleifen sind verpönt; sie vergeu- den nur Rechenzeit. Ein Multitasking-Computer sollte nicht warten.
Das Mittel der Stunde ist »Delay()« aus der »DOS.library«. Der | Aufruf in C:
Time );
Delay Der Effekt: Der Aufruf hält das ablaufende Programm um die in »Time« angegebene Anzahl von 1/50 Sekunden an. Die gesamte
Rechenzeit steht anderen Tasks zur Verfügung. Claudio Pitrella/ub
; ST Sie C? |
Das folgende C-Programm »Speak.c« zeigt, wie Sie in C Sprache ausgeben:
PROGRAMMIEREN
c
Sprachausgabe in C programmiert
Sie müssen als erstes die »translator.library« zum Übersetzen und das »narrator.device« zur Ausgabe öffnen. Die Struktur »narrator_rb« ist mit den nötigen Werten zu füllten. »Translate()« übersetzt einen String in Phonem-Code, der ans »narrator.device« übergeben wird.
Über »DolO()« startet das Programm die Sprachausgabe. Sie können mit der gezeigten Methode Ihre Programme leicht mit
| Sprachausgaben ausstatten, doch beachten Sie, daß die »transla-
tor.library« (LIBS:) und das »narrator.device« (DEVS:) in den ange- gebenen Verzeichnissen stehen müssen. Sascha Wilkens/ik
»C«alender
»Cal.c« erstellt einen Monatskalender, wie Sie ihn von Wandka- lendern her kennen. »Cal« demonstriert anschaulich die Mächtigkeit der Zeit- und Datumfunktionen unter ANSI-C.
Bitte beachten Sie jedoch den Gültigkeitsbereich: Sie können sich jeden Monat im Bereich von 1970 bis 2037 anzeigen lassen. »Cal.c« wird im CL! nach folgendem Schema aufgerufen:
\ Dabei kann »monat« die Werte eins bis 12 annehmen. »jahr« gibt
das Jahr (1970 - 2037) an, für das der Amiga den Monatskalender zeigen soll. Geben Sie »jahr« nicht an, setzt »Cal« das laufende Jahr ein. Beispiel:
cal 10
45
PROGRAMMIEREN
Ohne Parameter gibt das Programm den laufenden Monat aus. Um eine korrekte Anzeige zu erhalten, muß die Systemuhr natürlich rich- tig eingestellt sein.
Gerd Wienand/ik
/* Gebrauchsanweisu:
print£(*Print caleı “Usage: %s [month
else
te
print: else {
Ein sog. »C«alender-Programm
Icons automatisch öffnen
Sie wollen direkt nach dem Start der Workbench einige Schubla- den Ihrer Startdiskette geöffnet auf dem Bildschirm vorfinden? »IconOpen.c« erledigt genau diese Aufgabe. Es simuliert einen doppelten Mausklick über dem gewünschten Icon. Um seine Arbeit ordentlich zu verrichten, benötigt »Icon Open.c« al- lerdings genaue Angaben darüber, welches Icon es auswählen soll. Der Aufruf (aus der »Startup-Sequence«): IconOpen Fenstername IconPfad Dabei sind: « Fenstername: der Name, des Fensters, in dem das Icon enthalten ist. Wenn Sie den Fensternamen nicht wissen, sehen Sie einfach auf der Workbench in der Titelleiste des entsprechenden Fensters
46
nach. Der Fenstername entspricht immer dem Namen des Verzeich- nisses, in dem sich das Icon befindet (ohne Pfadangabe). Achten Sie auf Groß-/Kleinschreibung. Für Disk-Icons heißt der Fensterna- me »Workbench«. | * IconPfad: Geben Sie hier den vollständigen Pfadnamen des Icons an (allerdings ohne die Erweiterung ».icon«).
Einige Beispiele
;k simuliert einen Doppelklick auf das Icon des Laufwerks »dfO:«. Hier wird ein Doppelklick auf das Icon »dh0:Beckertext« vor- getäuscht; der Fenstername lautet »AMIGA-HD«.
»IconOpen« eignet sich, bereits nach dem Start des Amiga die gewohnte Arbeitsumgebung einzurichten. Dazu bietet es sich an, das Programm in der »Startup-Sequence« aufzurufen. Selbstver- ständlich funktioniert »IconOpen.c« nur, wenn die Workbench mit LOADWB bereits aktiviert ist.
Gerd Weinand/ik
. 0u)
FreeDiskObject (dob) ; } break;
* cleanup *
= win->N
eStdIO(reg) ;
Port Import);
ary (Ic
(Hl LO] 1 RM Direkt nach dem Start: Icons auf der Workbench
Vom String zur Zahl
C-Programmierer haben manchmal Schwierigkeiten, einen (einge-
Compiler stellt keinen Befehl dafür zur Verfügung. Das Listing
»Hex.c« enthält eine Funktion namens »atoh()«, die einen ASCII- |
String in eine hexadezimale Zahl umwandelt.
*atoh (String)
return (hex);
zeigt die Umwandlung einer Zeichenkette in eine Zahl
Übergeben Sie der Funktion einfach (einen Zeiger auf) einen String und die Funktion liefert als Rückgabewert eine im String enthaltene Hex-Zahl zurück.
Sascha Wilkens/ik
Kürzerer C-Code
Obwohl der Startup-Code des Manx- und Lattice-C-Compilers schon sehr kompakt ist, stört er doch manchmal. Besonders, wenn ein Programm nicht all seine Funktionen benutzt. Durch das Über- schreiben einiger C-Library-Funktionen kann der Code erheblich ver- kürzt werden. Hierzu wird die Funktion mit »{ }« definiert und über- schreibt dabei die lange Library-Funktion. Folgende Funktionen eig- nen sich zu diesem Vorgehen:
PROGRAMMIEREN
— _main: Es werden keine Standardausgabekanäle mehr geöffnet; printf() und puts() dürfen nicht angwendet werden (sofern sie die Kanäle nicht selbst öffnen).
\ - _cli_parse: Die Parameter, die beim Programmaufruf übergeben
wurden, werden nicht aufbereitet. — _wb_parse: Die Funktion kann überschrieben werden, wenn ein
Programm nicht von der Workbench gestartet wird. Beispiel:
| Untersuchen Sie den Startup-Code darauf, ob Funktionen nicht
benötigt werden, indem sie ein Programm kompilieren, mit der Opti- on »-W« linken und dann mit einem (symbolischen) Debugger den Code »durchforsten«.
Sascha Wilkens/ik
beep, beep
Manchmal ist es notwendig, den Computerbenutzer mit einem akustischen Signal auf etwas aufmerksam zu machen, z.B. auf einen Fehler oder das Ende einer langen Berechnung.
Der hier vorgestellte Beep-Befehl ist ein Beispiel dafür, wie man den Amiga zur Ausgabe eines Tons variabler Höhe und Dauer über- redet.Die Funktion läßt sich leicht in eigene Programme einbauen, wenn Sie darauf geachten, daß das Feld Sound Data[] im Chip-Me- mory zu liegen kommt (Linker-Optionen beachten).
\ »Beep« (als CLI-Befehl) erwartet zwei Parameter: geben) String in eine Hex-Zahl zu verwandeln. Die C-Library einiger |
- die Tonhöhe (period), die im Bereich von 120 bis 3000 liegen sollte - die Tondauer (cycles) Der Aufruf vom CLI sieht so aus:
Das folgende Listing wurde mit dem Aztec-C-Compiler V. verfaßt. Compiler- und Linker-Aufrufe stehen im Kopf des Programms. Gerd Weinand/ik
eycles
* no ub_args welcome +
beep_beep.c Der erste Schritt zum Synthesizer
47
WORKBENCH UND CLI
BEDIENUNG
miga im Griff
Workbench, CLI und Shell
Es gibt zwei verschieden Arten, den Amiga zu be- dienen, d.h. Programme zu starten, Dateien zu ko- pieren etc.: Der komforta- ble Weg geht über die Workbench, vorwiegend durch Maus und Menüs gesteuert; oder aber der etwas technischere Weg über die Shell bzw. das CLI, in dem man dem Amiga die Kommandos über die Tastatur gibt. Beide Verfahren haben ’ Vor- und Nachteile; und für beide gibt's eine - Menge Ratschläge.
lles Geschmackssache — der eine bevorzugt die Work- bench, der andere startet Programme lieber über's CLI; der eine findet Bildsymbole (Icons) übersichtlicher, der an- dere möchte Verzeichnisse lieber in Listenform betrachten. Am besten, man schaut sich beide Bedieneroberflächen des Amiga | an und nutzt immer von Fall zu Fall die günstigere.
Shell-Speicher
Die Shell legt alle eingegebenen Kommandos in einem Puffer ab. Das ist praktisch, wenn man einen Befehl mehrmals ausführen las- sen möchte, da man ihn nicht erneut eintippen muß. Man kann mit den Cursor-Tasten <Cursorl_hoch> und <Cursor_runter> immer die | letzte oder nächste Befehlszeile anzeigen lassen, diese ggf. editie- ren und mit <Return> auch ausführen lassen. Sie löschen den Puffer mit <Crtl S>.
Andreas Schulz/ub
Mäuse sichern |
Wenn man einen selbsterstellten Mauszeiger auf einer anderen Dis- | kette haben möchte, gibt es zwei Wege: Die kompliziertere ist die,
48
sein Kunstwerk noch einmal mit Preferences zu malen und schließ- lich zu speichern. Allerdings ist das zeitraubend. Schneller dagegen ist es, nur die Konfigurationsdatei zu kopieren. Sie befindet sich im Verzeichnis »devs« jeder Start-Diskette bzw. der Workbench-Disket- te und heißt »system-configuration«.
Kopieren Sie einfach diese Datei von Ihrer Diskette, auf der die
| fertige Maus steht, ins »devs«-Verzeichnis der Diskette, mit der Sie
den Mauszeiger einsetzen möchten. Wenn Sie die präparierte Dis- kette booten, wird Sie Ihr kleines Kunstwerk begrüßen. Mit der »sy- stem-configuration« übernehmen Sie gleichzeitig auch die Farben, die Auflösung, den Druckertreiber und die Mausgeschwindigkeit.
ub
UNIX & AMIGA (feelings...)
Einige Amiga-User haben sicherlich häufig mit dem Unix-Betriebs- system zu tun, sei es im Beruf, auf der Universität oder sonstwo. Trotz vieler Gemeinsamkeiten von Unix und AmigaDOS gibt es klei- ne, aber oft sehr ärgerliche Unterschiede - beispielsweise bei den Shell-Umgebungen.
Da kann man leicht »list« mit »Is« verwechseln, wodurch auf dem Amiga eine unschöne »Unknown command«-Meldung auftaucht.
Um solche Peinlichkeiten zu vermeiden, sollte man die gebräuchlich- sten Unix-Kommandos auf dem Amiga simulieren, was sich sehr gut mit ALIAS bewerkstelligen läßt. Darüberhinaus ermöglicht die Benut- zung der ARP-Kommandos mit der dazugehörenden Shell ASH, besser noch die -WShell, volle Musterunterstützung, Piping, Varia- blen etc., also Shell-Features, wie man sie von Unix her gewohnt ist. Aus diesem Grunde ist hier eine Batch-Datei angefügt, welche die
gebräuchlichsten Unix-Kommandos simuliert. Die Batch-Datei sollte |
idealerweise während des Bootvorgangs abgearbeitet werden, damit die »neuen« Kommandos sofort zur Verfügung stehen. Packen Sie die ALIAS-Definitionen am besten in die Datei »shell-startup« im Verzeichnis »s«. Unsere ALIAS-Befehle können ein echtes Unix auf dem Amiga natürlich nicht ersetzen.
Thomas Becker/ik
s kill break []
arun
iore ähl:doc,
s insta
chmod []
Unix-feeling auf dem Amiga
Beschleunigte Batch-Dateien
Batch-Dateien sind ein wichtiges und hilfreiches Instrument im täglichen Umgang mit dem Amiga. Ein Nachteil von Batch-Dateien besteht allerdings in ihrer relativ langsamen Abarbeitung, da jeder einzelne Befehl erst zu seiner Ausführung gesucht, gefunden und dann geladen werden muß. Selbst wenn die Batch-Befehle von Festplatte oder aus der RAM-Disk geladen werden, wird der Zeitauf- wand — besonders bei längeren Batch-Dateien — spürbar.
Muß ein Befehl einer Batch-Datei geladen werden, durchsucht die Shell zuerst die ALIAS-Definitionsliste, dann die Shell-internen Be- fehle, daraufhin die Liste der residenten Programme, das aktuelle Verzeichnis, das logische Verzeichnis »c:« und, wenn das auch nicht zu einem positiven Ergebnis führt, noch die Pfadliste, die durch den PATH-Befehl bestimmt wird, schließlich wird die Fehlermeldung »Unknown Command« ausgegeben, wenn alle Suchvorgänge er- folglos waren.
Da auch die Pfadliste des PATH-Befehls mitunter viele Einträge |
umfaßt, wird schnell deutlich, daß während der Abarbeitung einer Batch-Datei viel Zeit zur Suche des auszuführenden Befehls ver- schwendet wird. Man vermeidet das, indem man den Ort der Befehle (den vollständigen Pfad- und Dateinamen) angibt, z.B.:
: speak: null
nur em/noclick snil: Ebenso beschleunigend wirkt die Maßnahme bei den beliebten ALIAS-Definitionen in Verbindung mit der Shell:
Aber Achtung: So eine Vorgehensweise lohnt sich natürlich nicht bei residenten Dateien oder bei Dateien im aktuellen Verzeichnis, denn sie werden ja ohnehin schnell gefunden. Deshalb sollte man sich schon im klaren sein, welche Kommandos erst vom langsamen, externen Datenträger geladen werden müssen und welche nicht! Durch diesen kleinen, aber wirkungsvollen Trick wird ein Großteil der
WORKBENCH UND CLI
BEDIENUNG
| Suchvorgänge durch die Shell bei Batch-Dateien vermieden. Mes-
sungen ergeben eine Performance-Steigerung von bis zu 30 Pro- zent, was den größeren Tippaufwand bei Batch-Dateien rechtfertigt. Thomas Becker/ik Unabhängig Mit dem CLI kann man viel machen, die von der Workbench nicht unterstützt werden. Beispielsweise besteht nur im CLI Zugriff auf alle Dateien und Verzeichnisse einer Diskette. Jeder CLI-Befehl ist ein eigenständiges Programm und muß vor der Ausführung geladen werden. Der Amiga erwartet, daß sich die Befehle im C-Ordner der Startdiskette befinden. Gibt man einen Befehl ein, nachdem die Dis- kette gewechselt wurde, »schreit« der Amiga sofort nach der Start- diskette. Der Trick, alle benötigten Befehle in die RAM-Disk zu ko- pieren, hat einen Nachteil: Die Befehle belegen Speicherplatz. | Wenn Sie mit mehreren Disketten arbeiten, besitzen diese meist alle einen eigenen C-Ordner. Der Amiga nimmt davon jedoch keine Notiz und fordert weiterhin die Startdiskette. Er läßt sich überlisten, TIPS ZU CLI, SHELL ORKBENCH Tip Thema Seite Shell-Speicher Shell-Bedienung 48 Mäuse sichern »system-configuration« 48 Unix & Amiga Unix-Simulation (ALIAS-Befehl) 48 Beschleunigte Batch-Dateien Befehlsabarbeitung 49 Unabhängig Nochmal ASSIGN-Befehl 49 Go Directory MAKEDIR und CD kombiniert 50 Device-Abfrage Shell-Skript zumTest von Devices 50 Lamer Exterminator Viren killen 50 | Unterschiedliche ECHOs Schriftstile und ECHO 50 | Die Maus stoppt alles Bedienungshinweis 51 Entscheidender Schreibschutz Shell-Script testet Schreibschutz 51 RAM Disk RELABEL-Befehl 51 Tastatur statt Maus Requesterantwort mit der Tastatur 51 | Kommandopfade PATH-Befehl 51 | Alles halt <Ctrl C> im Einsatz 52 Weg mit dem Laufwerk ASSIGN REMOVE 52 CLI und nur ein Laufwerk Namen von Disketten 52 RUN beim Start Multitasking 52 | Rekursion mit AmigaDOS »Programmierung« im CLI 52 | | Shell schlägt CLI Shell öffnen 53 Schnellere Disketten Ordnung auf Disketten 53 Disketten einfach formatieren Batch-Datei 53 LIST ohne Tücken Optionen von LIST 53 | Laden von der Werkbank Default-Tool 54 Alternative zu RUNBACK RUN >NIL: Programm 54 LoadWB mit Optionen Zusatzmenü 54 Verzeichnisse von PD-Disks Trick 17 zum Multitasking 54 Schnellstart von Workbench schnelle »Startup-Sequence« 54 Zu wenig Speicher? Speicherplatz sparen 54 | Unerklärlicher Absturz STACK 54 Alles auf einen Schlag Mehrfachauswahl mit der Maus 55 Übersichtliche Kommentare FILENOTE-Befehl 55 Ohne Uhr die richtige Zeit DATE 55 | CLI-Fenster ohne Rahmen Escape-Sequenzen 55 Editieren RUN 56 | Read Error, halb so wild Disk-Validator 56 CLI unter Kontrolle <Ctri>-Kombinationen 56 Schnelle Verzeichniswechsel CD-Befehl 56 Schaufel für die Shell Joker-Kombination »#?« 56 ‚Arbeiten mit LIST Optionen von LIST 56 Workbench oder CLI? ASK-Befehl 56 Kürzere Bootzeiten mit TYPE TYPE statt ECHO 57. | Tolles Tool mit Anleitung MicroEmacs 57 ] Es geht auch ohne EXECUTE Skript-Bit 57 Spiel mit der Maus kostet Zeit 571
WORKBENCH UND CLI
BEDIENUNG
wenn man zusätzlich zum Namen den Suchpfad des Befehls angibt. Statt DIR schreibt man: d£0:c/DIR
Auf die Dauer ist es jedoch umständlich, immer den Suchpfad an- zugeben. Abhilfe schafft der Befehl ASSIGN. Er dient dazu, einem logischen Gerät einen Ordner einer bestimmten Diskette zuzuwei- sen. Dieser Ordner läßt sich sowohl über seinen eigenen Namen, als auch über den des logischen Gerätes ansprechen. Einige logi- sche Geräte werden bereits beim Start zugewiesen. So zeigt c: auf den C-Ordner der Startdiskette. Mit ASSIGN lenkt man man die Zu- weisung um, beispielsweise auf den C-Ordner der Diskette, die sich augenblicklich im internen Laufwerk befindet. df£0:c/ASSIGN c: d£0:c Nun sucht das CLI seine Befeh.. auf der aktuellen Diskette. Einziger Nachteil der Methode: Nach einem Diskettenwechsel muß der AS- SIGN-Befehl erneut eingegeben werden. Wenn Sie wissen wollen, welche logischen Geräte dem Amiga bekannt sind, verwenden Sie den ASSIGN-Befehl ohne Parameter.
Christoph Kögler/ub
Go Directory
Wenn man ein neues Verzeichnis anlegt, ernennt man es ansch- ießend oft mit CD direkt zum aktuellen Directory, um dort zu arbei- ten. MAKEDIR und CD sind — zwei - Befehle, die diese Aufgabe er-
Namen »GD.bat« (Go Directory), das Sie wie CD einsetzen.
else
endif cd {dir} endif
CD und DIR in einem Abwasch
Das Verzeichnis, in das man wechseln möchte, wird natürlich nur dann mit MAKEDIR angelegt, wenn es vor dem Aufruf von »GD.bat« noch nicht existiert. Am besten kopieren Sie GD ins Verzeichnis »s:« und setzen das Skript-Flag mit:
s add
_ Sie können dann zum Aufruf von GD (ab Kickstart 1.3) das lästige EXECUTE weglassen und einfach nur tippen: GD verzeichnis Der Amiga erkennt automatisch, daß es sich um ein Script handelt und führt die Befehle aus. ub
Device-Abfrage mit Shell-Befehlen
Oft möchte man abfragen, z.B. in Batch-Dateien, ob ein Gerät exi- stiert, also auch angemeldet (geMOUNTEed) ist. Man würde z.B. ein- geben, um zu prüfen, ob Laufwerk df1: existiert:
Fehlt das Laufwerk, bekommt man allerdings die recht störende Aufforderung zu sehen: »PLEASE INSERT VOLUME DF1:«
Wie man besser nach einem »Device« fragt, zeigt das folgende Beispiel anhand der resetfesten RAM-Disk. Damit dürfte der Reque- ster »PLEASE INSERT VOLUME xxx:« in einer Batch-Datei für immer verbannt sein. Sie können die Routine in eigene Programme einbauen und so anwenderfreundlicher gestalten.
Felix Farago/ub
50
ledigen... doch reicht nicht einer? Hier das passende Shell-Skript mit |
Devicetest.bat
Device-Abfrage mit CLI-Befehlen ohne lästige Systemmeldungen (Requester)
Lamer Exterminator
Daß man im CLI bzw. in der Shell mit
unliebsamme Bootblockviren entfernt, ist wahrscheinlich vielen Amiga-Benutzern bekannt. Aber nicht nur Bootblockviren kann man mit dem CL! vernichten, sondern auch den Lamer-Virus! Man muß nur im CLI den Befehl
type DFO:s/star:
-sequence opt h +
eingeben und <Return> drücken. Ist das Laufwerk zur Ruhe gekom- men, nimmt man die Startdiskette aus dem internen Laufwerk und
| legt die Diskette ein, die man testen will. Nun drückt man nochmals | <Return> und schon wird die »Startup-Sequence« im Hex-Code | ausgegeben. Wenn in der ersten Zeile nach »0000« steht:
ist der Lamer-Virus am Werk.
Nun muß man das infizierte Programm löschen. Hierzu legen Sie die Startdiskette ins interne Laufwerk und tippen den Befehl ein:
0:X" + e
»X« steht hier für das fünfmalige Drücken der Tastenkombination <Alt Shift Space> (<Alt> und <Shift> gedrückt halten und fünfmal <Space> drücken). Wieder läßt man das Laufwerk zur Ruhe kom- men, legt die infizierte Diskette ein und drückt nochmals <Return>. Nun muß man nur noch mit einem beliebigen Editor (z.B. ED oder MEmacs) die erste Zeile der »Startup-Sequence« löschen.
ub
Unterschiedliche ECHOs
Mit der ECHO-Anweisung im CLI bzw. in der Shell kann man Texte in verschiedenen Schriftstilen und Farben anzeigen. Das ge- schieht nach folgendem Muster:
Für »XX« muß man nun verschiedene Zahlen einsetzen, die fol- gender Tabelle zu entnehmen sind:
»X%K« Schriftart/Farbe
0 normal
3 kursiv an
23 kursiv aus
4 unterstreichen an
24 unterstreichen aus
1 fett an
22 fett aus
30-33 Vordergrundfarbe
40-49 Hintergrundfarbe Man kann natürlich auch verschiedene Einstellungen auf einmal
wählen. Hierzu muß man nur hinter den Zahlen »;« eingeben. Für kursiv und unterstrichen also: Der Buchstabe »m« beendet die Schriftstileinstellung. ub
WORKBENCH UND CLI
BEDIENUNG
-+
Die Maus stoppt alles
Wenn man die Ausgabe im CL! anhalten möchte, reicht es, wenn
man die rechte Maustaste gedrückt hält. Sobald man sie losläßt, |
fährt der Amiga mit der Ausgabe fort. Stefan Kessner/ub
Entscheidender Schreibschutz
Wollen Sie den Schreibschutz einer Diskette beim Starten einer Diskette prüfen. Nichts einfacher als das. Hierzu müssen Sie mit dem Editor ED die »Startup-Sequence« verändern:
tartup-sequence
j Ergänzen Sie die Startsequenz um folgende Befehle:
nicht. Eine Voraussetzung ist, daß die Datei »Hilfsdatei« auf der Disk steht. Sie können Sie ebenfalls mit dem ED leicht erzeugen. Tippen Sie in die Datei einfach ein paar Zeichen und speichern den Text mit <Esc X>. Mit der Schreibschutzabfrage lassen sich auch zwei verschiedene Programme ausführen. Welches Programm aufgerufen wird, bestimmt letztendlich der Schreibschutz. Stephan Wolff/ub
RAM Disk
Die RAM-Disk heißt seit der Workbench 1.3 »RAM DISK«. Dieser neue Volume-Name ist problematisch, da einige Programme einen
So können Sie feststellen, ob Ihre Disk schreibgeschützt ist oder |
Leerschritt im Volume-Namen nicht verkraften und sich dann fehler- haft verhalten. Wer mit solchen Problemen zu kämpfen hat, dem soll nun geholfen sein:
Mit dem Kommando RELABEL ist es möglich, jeden Volume- Namen zu ändern. Zu achten ist dabei auch auf die Eindeutigkeit des gewählten Namens, beispielweise sollte das Drive »ram:« nicht den Namen »sys:« erhalten, da »sys:« bereits den Namen des Boot- Geräts symbolisiert.
Es empfiehlt sich, folgende Lösung am besten in der »Startup-Se- quence« unterzubringen:
j;el drive ram:
Thomas Becker/ik
| Tastatur statt Maus
System-Requester wie »"Please insert volume XXXX"« beantwor- tet man auf zwei Arten: — Entweder man klickt eines der Gadgets an, — oder man benutzt die Tastatur
Um das linke Gadget anzuwählen (»RETRY«), drückt man <Amiga V>. Zum Anwählen des rechten Gadgets (»CANCEL«) drückt man <Amiga B>. Das funktioniert übrigens auch mit allen an- deren System-Requestern, die zwei Gadgets haben.
ub
Kommandopfade
Wer kennt es nicht? Man hat wieder einen neuen Befehl für's CLI bzw. die Shell ausfindig gemacht, den man gut gebrauchen kann. Also schnell ins »c«-Verzeichnis der Workbench-Diskette damit. Al- lerdings hat das den Nachteil, daß man nach einer Zeitlang nicht mehr weiß, was zur Original-Workbench Diskette gehört und was nicht. Außerdem schwillt das Verzeichnis immer mehr an und die Anzeige des Verzeichnisses dauert recht lange. Abhilfe schafft hier ein eigenes Verzeichnis, z.B. »C2«. Man erstellt es mit:
51
WORKBENCH UND CLI
BEDIENUNG
Anschließend können Sie all Ihre Sonderbefehle in dieses Ver- zeichnis packen.
Allerdings findet der Amiga die Befehle in diesem Verzeichnis nicht auf Anhieb. Hier hilft der Befehl PATH: path df0:c2 add
Von nun an behandelt der Amiga das C2-Verzeichnis so, als wäre es das C-Verzeichnis, und die Befehle im C-Verzeichnis sind weiter- hin verfügbar.
Am besten Sie fügen den Befehl mit einem Editor in die »Startup- Sequence« ein, dann sucht der Amiga immer automatisch auch in »c2« nach Kommandos.
ub Alles halt!
Man kann die Textausgabe des CLI- bzw. Shell-Befehls TYPE durch <Ctrl C> stoppen. Das gilt aber nicht nur für TYPE. Auch viele andere Programme, die etwas im CLI ausgeben, lassen sich mit <Ctrl C> beenden, z.B. Disksalve, A68k etc.
Sean Durkin/ub
Weg mit dem Laufwerk
Jedem Festplattenbesitzer ist es ein Dorn im Auge, daß eine er- hebliche Anzahl von Programmen (hauptsächlich Spiele) nur deswe- gen nicht auf der Platte läuft, weil ein Programm immer stur auf die Floppy zugreift. Mit einem kleinen Kniff läßt sich dieser Mißstand bei vielen Programmen beheben. Geben Sie im CLi oder der Shell ein:
as: en
Der Trick funktioniert natürlich nur dann, wenn das jeweilige Pro- gramm nicht direkt unter Umgehung des Betriebsystems auf ein Dis- ketten-Laufwerk zugreift.
Helmut Kirchweger/ub
CLI und nur ein Laufwerk |
Jeder, der nur ein Laufwerk besitzt, kennt das Problem: Es ist nicht möglich, ein Verzeichnis (Directory) einer anderen Diskette als der Workbench-Diskette aufzulisten. Zumindest nicht, wenn Sie es mit folgendem Befehl versuchen:
Der Computer greift nach Lesen des DIR-Befehls auf der Work- bench-Diskette gleich auf deren Inhaltverzeichnis zu. Es ist also nicht machbar, die Diskette zu wechseln. Für diesen Fall gibt es eine einfache Lösung: Setzen Sie statt »df0:« den Namen der Namen der Diskette ein, z.B.:
Nun fordert der Amiga Sie nach Lesen des DIR-Befehls auf, die Diskette »Basic« einzulegen und listet deren Verzeichnis auf.
Die Namen Ihrer Disketten erfahren Sie übers CL! oder die Shell mit INFO. Der Befehl RENAME dient zum Ändern des Namens. Auf der Workbench zeigt der Amiga die Namen unter den Diskettensym- bolen. Auch hier gibt es ein Kommando, um den Titel zu ändern, den Menüpunkt »Rename«.
Jens Thorwarth/ik
RUN in der »Startup-Sequence«
Nehmen wir an, Sie starten den Amiga (ein Laufwerk) und wollen in der »Startup-Sequence« ein Programm im Hintergrund ablaufen lassen, das ein wenig Zeit braucht. Damit am Ende das CLI-Fenster schließt, starten Sie das betreffende Programm mit RUN oder RUN- BACK. Die »Startup-Sequence« könnte also so aussehen:
52
cker einzuschalten
Was passiert mit dieser Version der »Startup-Sequence«?
Kaum führt der Amiga RUN bzw. RUNBACK aus, geht das große Rattern auf der Startdiskette los. Der RUN-Befehl will das Programm »InitPrinter« laden und gleichzeitig versucht der Amiga, die nächsten Befehle der »Startup-Sequence« zu laden und auszuführen. Das Betriebssystem teilt die Zugriffsberechtigung für das Laufwerk nach \ folgendem Prinzip zu: Einmal liest RUN (ein eigener Task); einmal liest der Task, der für die Ausführung der Startsequenz verantwort- lich ist. Dabei kommt es häufig zu großen Zeitverzögerungen, da die Laufwerksköpfe ständig umpositioniert werden: dadurch rattert’s.
Abhilfe schafft hier, das zu startende Programm in die RAM-Disk zu kopieren und es von dort zu initialisieren. Wird der RUN/RUN- BACK-Befehl mehrmals benutzt, sollte man auch ihn in die RAM- Disk packen:
Sie können natürlich auch das Kopieren des C-Verzeichnisses vor den RUN-Befehl setzen, wenn dies sowieso beim Start im RAM ab- gelegt werden soll — und gerade, wenn man nur ein Laufwerk be- sitzt, ist das ja sinnvoll:
Der durch Umsicht bei der Wahl der Befehle in der »Startup-Se- quence« zu erzielende Geschwindigkeitsgewinn ist beträchtlich; prü- fen Sie, ob Ihr Amiga optimal startet.
Thomas Blenkers/ik
Rekursion mit AmigaDOS
Wer nur gelegentlich mit dem Programm »CLIMate« arbeitet, wird sich schon oft über die ».fastdir«-Dateien geärgert haben, die das CLI-Werkzeug in allen Verzeichnissen und Unterverzeichnissen hin- terläßt, die es jemals besucht hat. Die ».fastdir«-Einträge helfen zwar Climate, ein Directory schneller einzulesen, für andere Pro- gramme, insbesondere AmigaDOS, sind sie aber wertlos.
Es liegt also nahe, alle ».fastdir«-Dateien wieder zu löschen. Doch das ist aufwendig, zumal man dazu natürlich CLIMate nicht verwenden kann. Hier hilft ein kleines Batch-Programm (»ExFast«), das, angesetzt auf ein Directory, die ».fastdirs« in allen Unterver- zeichnissen löscht. ExFast sollte am besten im »S«-Verzeichnis ste-
hen. Der Aufruf der Befehls-Datei vom CLI aus, erfolgt dann mit dem Kommando: execute
Das kurze Programm liefert ein Beispiel für eine recht nützliche Fähigkeit des LIST-Befehls, die es gestattet, auch Batch-Dateien quasi rekursiv zu schreiben. LIST erzeugt wieder ein Batch-File na- mens »ram:x«, das die Aufrufe für alle Subdirectories umfaßt. Der EXECUTE-Befehl schließlich führt diese aus, wobei ggf. wieder neue Verzweigungen entstehen, bis keine untergeordneten Directo- ries mehr vorhanden sind. Diese Technik ist natürlich auch für ande- re Aufgaben einsetzbar. Wie wäre es beispielsweise, alle ».info«-Da- teien in allen Unterverzeichnissen zu löschen? Dazu müssen Sie nur den DELETE-Befehl etwas ändern:
delete >NI. 1fo
Statt eines simplen DELETE-Aufrufs könnte der Amiga auch kom- plexere Aufgaben ausführen, z.B. nach Linkviren suchen, etc. Die Rekursion spart in fast allen Fällen eine Menge Arbeit.
Directory
Rolf Beck/ik
Rekursive Programmierung per Batch-Datei
Shell schlägt CLI
Die Shell der Workbench 1.3. ist schon eine praktische Sache, die dem CLI bei weitem überlegen ist. Sie gelangen in diese Benutzer- oberfläche, indem Sie das Shell-Symbol auf der Workbench an- klicken.
Doch was ist zu tun, wenn man mit der Shell arbeiten möchte, ohne zuvor die Workbench zu starten? Ganz einfach, verwenden Sie folgende Befehle in der »Startup-Sequence« (Verzeichnis »s:«)
x und y sind die Koordinaten der linken oberen Ecke des Shell- Fensters; Breite und Höhe legen die Größe des Windows fest, und Titel bestimmt den Text, der in der Titelleiste erscheint. Ersetzt man das Zauberwort »NEWCON« durch »CON«, erhält man ein norma- les CLI-Fenster.
Der Befehl:
öffnet also ein Shell-Window, das den gesamten Bildschirm ein- nimmt. Achten Sie darauf, daß sich im Verzeichnis »I« der Newcon- Handler und in der »Mountlist« (Verzeichnis »devs«) ein Eintrag für »Newcon:« befinden. Soll beim Start nur die Shell geöffnet werden, löschen Sie den Befehl LOADWB aus der »Startup-Sequence«.
Martin Regensburger/ub
Schnellere Disketten
Das Amiga-Betriebssystem hat die Eigenart, Dateien oder Pro- gramme nach dem Motto auf Disketten zu schreiben: Wo Platz ist, wird was reingequetscht, und wenn es auch nur ein Bruchteil einer
WORKBENCH UND CLI
BEDIENUNG
Datei ist; der Rest kommt auf eine andere Spur. Das bedeutet im Klartext: Wenn man häufig Dateien auf Disketten löscht und wieder darauf speichert, treten beim Arbeiten mit der Diskette extreme Ge- schwindigkeitsverluste auf, da einzelne Programme auf der Diskette verteilt sind und der Lesekopf beim Lesen oft auf andere Spuren wechseln muß. Falls man ein zweites Laufwerk besitzt, besteht nun die Möglichkeit, im CL! die Files komplett auf eine leere, formatierte Diskette zu kopieren:
Dadurch werden die Dateien geordnet die leere Diskette kopiert und die Diskette wird schneller.
Wenn man kein zweites Laufwerk besitzt, aber mindestens 1 MByte Speicher, kann man dieselbe Prozedur ausführen, indem man die RAM-Disk als Zwischenspeicher einsetzt. Sollten Ihnen le- diglich 512 KByte bei einem Laufwerk zu Verfügung stehen, müssen Sie die Dateien portionsweise über die RAM-Disk auf die neue Dis- kette kopieren.
Wenn Sie nun auf der aufgeräumten Diskette abermals häufig Da- teien löschen und wieder andere draufschreiben, entsteht mit der Zeit natürlich wieder das alte Durcheinander. Wie im Haushalt: Un- ordnung entsteht immer.
Ingo Gotsch/ub
Disketten einfach formatieren
Dieser Tip eignet sich für alle, die öfter Disketten formatieren bzw. löschen. Eine einfache Batch-Datei (Listing) erleichtert diesen Vor- gang. Nach Aufruf der Batch-Datei (über EXECUTE, oder die Datei steht im Verzeichnis »S:« und das S-Bit ist gesetzt, dann reicht die Eingabe des Namens) führt der Amiga den dort angegebenen FOR- MAT-Befehl so oft aus, bis Sie mit <Ctrl c> oder <Otrl d> stoppen.
Rodja Adolph/ik
zum einfachen Formatieren mehrerer Disketten
LIST ohne Tücken
Der LIST-Befehl des CLI ist ein leistungsstarker Befehl. Er dient zum Auflisten ganzer Directories oder einzelner Dateien. Dabei zeigt LIST u.a. die Größe jeder Datei und wann sie auf der Diskette ge- speichert wurde. LIST besitzt eine Menge zusätzlicher Funktionen und Optionen. Diese Optionen benutzen jedoch Buchstaben als Schlüsselworte. Nun gibt es Konflikte, wenn man sich Verzeichnisse anschauen möchte, deren Name aus einem dieser Buchstaben be- steht. Ein Beispiel ist das Direktory »s« auf der Workbench-Diskette. Wer »LIST s« eingibt, bekommt eine Fehlermeldung. Für den Buch- staben »S« ist die Funktion »Subname« reserviert. Es wird also nichts mit dem Auflisten des Verzeichnisses S, oder?
Umgehen sie die Einschränkung einfach, indem Sie den Befehl so eingeben:
Durch die Anführungszeichen um den Buchstaben verwechselt der Amiga »s« nicht mehr mit einer Option. Arne Zimmermann/ub
53
WORKBENCH UND CLI
BEDIENUNG
Laden von der Werkbank
Es dauert manchmal recht lange, bis der Amiga auf der Work- a bench ein Inhaltsverzeichnis geladen hat. Und erst wenn ein kom- plettes Directory geladen wurde, kann man ein Programm aus einem Fenster mit Doppelklick aktivieren. Hat man nun aber auf der jeweili- gen Diskette nur ein Programm, das man immer braucht, geht man folgendermaßen vor:
1. Durch einmaliges Anklicken die betreffende Diskette aktivieren. 2. Aus dem Workbench-Menü INFO wählen.
3. Das zu startende Programm z.B. das Notepad mit vollem Pfad ins Feld »DefaultTool« eintragen.
4. Das INFO-Fenster mit SAVE verlassen.
Jetzt kann man das eingetragene Programm einfach starten, indem man das Icon der Diskette auf ein anderes legt oder im Work- bench-Menü »DUPLICATE« aufruft. Im Feld DefaultTool steht nor- malerweise »DiskCopy«. Es dient zum Kopieren von Disketten. Hier können Sie beliebige andere Programme eintragen. Der Fantasie sind keine Grenzen gesetzt. Sie können ein anderes besseres Ko- pierprogramm, einen Editor oder eines Ihrer Lieblingsspiele eintra- gen. Es steht Ihnen von nun an immer zur Verfügung, ohne daß Sie- lange suchen und warten müssen.
Ralf Kaiser/ub
Alternative zu RUNBACK |
Um das CLi-Fenster nach einem Programmstart wieder zu schließen, ohne das gestartete Programm zu beenden, kann man (statt RUNBACK) auch RUN verwenden. Sie brauchen nur direkt hinter RUN die —n »>NIL:« einzufügen. Also beispielsweise:
"Durch das SEN: « werden alle Ausgaben des gestarteten Pro- gramms in eine Art »schwarzes Loch« (logisches Gerät NIL:) ge- schickt, d.h. sie erscheinen nicht im CLI-Fenster. Das ermöglicht auch das Schließen des CLI-Fensters nach einem Programmstart.
Sven Kreutz/ik
LoadWB mit Optionen |
Vielen Amiga-Anwendern wird der Parameter »-delay« für den CLI-Befehl LOADWB bekannt sein. Weit weniger bekannt ist die Op- tion »-debug«. Wird »loadwb« mit diesem Parameter aufgerufen, er- hält das Workbench-Fenster ein neues Menü, das zwei Funktionen besitzt:
- »flushlibs« und | - »debug«
»Flushlibs« löscht alle nicht mehr benötigten Libraries aus dem Speicher, um Platz zu sparen. »Debug« sollten Sie nicht aufrufen, da der Amiga dann einen internen Debugger startet, der nur von einem zweiten Terminal aus bedient werden kann, das mit dem Amiga über die serielle Schnittstelle verbunden sein muß. Das Menü hat keinen Titel und ist daher unsichtbar. Es befindet sich neben dem »Special«-Menü.
Sean Durkin/ik
Verzeichnisse von PD-Disketten
Wenn Sie öfter PD-Disketten, die keine Icons besitzen, mit dem CLI erforschen, kennen Sie vielleicht dieses Problem: Man läßt sich das Directory der PD-Disk anzeigen und probiert einige Programme aus. Da inzwischen der angezeigte Directory-Inhalt nach oben ver- schwunden ist, muß man das Directory nochmals einlesen, drei Pro-
gramme später noch einmal etc. Das kann mitunter lange dauern. |
Folgende Tricks helfen:
- Sie öffnen ein zweites CLI (mit NEWCLI) und lassen dort das Ver- |
zeichnis ausgeben. Danach arbeiten Sie mit dem ersten CLI weiter. Sie brauchen sich dann nur das zweite CLI ansehen, um zu wissen, was sich auf der PD-Disk befindet.
54
- Sie lenken die Ausgabe des Verzeichnisses auf den Drucker um.
ı Das Snelcnen ‚sie mit dem Befehl
- Sie Ionken cie Ausgabe von DIR mit dem Befehl
in die Datei »ram:file« um. Zum Ansehen des Verzeichnisses geben Sie dann ein:
Sean Durkin/ik
Schnellstart der Workbench
Werden die Befehle der (Standard-) »Startup-Sequence« etwas umgestellt, kann bereits vor der vollständigen Abarbeitung dieser Datei mit der Workbench gearbeitet werden.
Ihre »Startup-sequence« (Ausschnitt) sollte nach der Umstellung etwa folgendermaßen aussehen:
Die Befehle PATH und LOADWB werden also sehr früh aufgerufen. Vergessen Sie nicht, die beiden Befehle an den ursprünglichen Stel- len zu entfernen. Besonders eignet sich dieser Tip für Besitzer eines zweiten Diskettenlaufwerks. Sie können darauf über die Workbench bereits während des Bootens zugreifen. Ein Zugriff auf die Startdis- kette vor vollständiger Abarbeitung der »Startup-Sequence« emp- fiehlt sich aufgrund der Geschwindigkeitsminderung nicht.
Andi Egloff/ik
Zu wenig Speicher?
Jedes geöffnete Fenster braucht Speicherplatz. Wenn Ihr Compu- ter nur 512 KByte hat, können geöffnete Fenster soviel Speicher be- legen, daß der verbleibende Anteil für das gewünschte Programm nicht reicht. Oft hilft ein Trick:
Schieben Sie’das Piktogramm des gewünschten Programms aus dem Fenster auf den Workbench-Screen. Schließen Sie danach alle Fenster. Auf der Workbench sollten sich jetzt nur das Piktogramm der RAM-Disk, das der Diskette und das Ihres Programms befinden. Wenn Sie Glück haben, hat der Amiga nun genug Speicher zur Ver- fügung. Wenn nicht, können Sie aus der »Startup-Sequence« die Befehle LOADWB und ENDCLI löschen (nur beide zusammen), denn die Workbench braucht eine Menge Speicher. Programme können jetzt allerdings nur noch vom CLI oder der Shell gestartet werden.
ub
Unerklärlicher Programmabsturz
Von der Workbench aus aufgerufen funktioniert das Programm einwandfrei, bei Aufruf vom CLI stürzt es ab. Woran liegt's? In so einem Fall klicken Sie das Programm-Icon an und danach INFO aus dem Workbench-Menü. Wenn im Feld »STACK« des Dialogfensters mehr als 4000 Byte eingetragen sind, könnte das die Ursache des Absturzes sein.
Der Stack ist ein besonderer Speicherbereich. Dort hinterlegt der Mikroprozessor u.a. die Rückkehradressen der Unterprogrammauf- rufe. Öffnet man ein CLI- oder Shell-Fenster, reserviert AmigaDOS für davon gestartete Programme einen Stack mit 4000 Byte. Braucht ein Programm einen größeren Stack, muß man ihn vor dem Start er- höhen. Das erfolgt mit dem gleichnamigen Systembefehl STACK (siehe AmigaDOS-Handbuch).
ub
Alles auf einen Schlag
Immer wenn die <Shift>-Taste gedrückt wird, können Sie mit der Maus mehrere Objekte auf der Workbench gleichzeitig anwählen. Ein Beispiel wäre es, mehrere Programme gleichzeitig zu aktivieren oder auf der Workbench zu verschieben bzw. in andere Fenster zu kopieren.
Ein besonderer Trick ist die gleichzeitge Auswahl von Prokekten und Werkzeugen. Jedes Icon eines Projekts erhält in seiner Info- Datei den Namen eines Programms, das beim Aktivieren des Pro- gramms automatisch geladen werden soll.
Ein Beispiel: Jedes AmigaBASIC-Programm erhält als »Default- Tool« den Namen »AmigaBASIC«. Häufig steht in diesem Namen aber gleichzeitig der Name eines bestimmten Verzeichnisses. Was nun, wenn AmigaBASIC sich in einem anderen Verzeichnis befindet. Dann erscheint nach dem Aktivieren des Programms die Meldung:
« Der Weg das zu umgehen, ı wäre den Namen in der Info-Datei zu |
ändern. Das geht über das Menü »Info« der Workbench.
« Eine andere Möglichkeit ist, erst AmigaBASIC zu starten. Über »OPEN« kann der Programmierer dann sein Programm laden.
« Der dritte Weg ist praktischer. Klicken Sie bei gehaltener Shift- Taste erst das Icon des Programms und dann das Piktogramm des AmigaBASIC-Interpreters an. Dabei spielt es keine Rolle, ob es sich im selben Ordner oder irgendeinem anderen Fenster befindet.
Dieter Bendrich/ub |
Life starts at ‘030 fun at ‘040 impotence at ‘86!
Übersichtliche Kommentare
Mit dem CLI-Befehl FILENOTE kann jeder Anwender eine Notiz zu einer Datei schreiben, die in einer Kommentarzeile steht. Diese Kommentarzeile erscheint nur beim LIST-Befehl im Anschluß an die übrigen Daten. Allerdings erscheint der Kommentar zu einer Datei in einer gesonderten Zeile und verschiebt die gesamte Dateiauflistung:
Mit Hilfe von Steuerzeichen im Text können Sie Kommentare auch direkt hinter der Uhrzeit erscheinen lassen. Geben Sie, um eine Be- je zu einer Date) zu schreiben, den Berenli in dieser Form ein: est "[<CTRL,k>,TXeCTRL,i>,3 Die Trick artalibi es Ihnen, "zumindest kurze Kommantare direkt hinter dem Datum einzufügen. Bei Eingabe von weniger als sieben <CTRL,i> (=TAB) können Sie auch längere Bemerkungen einfügen, ohne die Zeilenlänge zu überschreiten. Sie überschreiben dann al- lerdings das Datum bzw. die anderen Anzeigen.
Bernd Zimmermann/ub
WORKBENCH UND CLI
BEDIENUNG
KLETT ER];
Ein Tip für jeden, der keine eingebaute Uhr besitzt und dennoch immer das genaue Datum benötigt. Dieser Tip erspart Ihnen nicht, das Datum beim Starten des Amiga einzugeben, aber Sie brauchen di e Arbeit nicht nach jedem Reset zu wiederholen.
Ergänzen Sie die »Startup-Sequence« um die folgenden Befehle:
Zunächst gibt der Amiga das gespeicherte Datum aus. Das zweite DATE zeigt die Optionen des DATE-Befehls und wartet auf die Ein- gabe eines Datums. Sie können nun das aktuelle Datum eingeben. Stimmt das angegebene Datum bereits, drücken Sie <Return>. Ihre Eingabe wird vom dritten DATE gelesen und mit dem letzten Befehl auf der Diskette gespeichert. Damit ist »datefile« die zu letzt gespei- cherte Datei auf der Diskette. Bei jedem Start wird deren Datum au- tomatisch als aktuelles Datum verwendet. So brauchen Sie immer nur einmal pro Tag das Datum eintippen, auch wenn Sie den Amiga zwischenzeitlich ausschalten.
Ist das Datum aktualisiert, können Sie am folgenden Tag die Kor- rektur des Datums mit der Eingabe »tomorrow« abkürzen.
Rainer Klier/ub
CLI-Fenster ohne Rahmen
Wenn ein CLI-Fenster keinen Rahmen hätte, könnte man mit dem normalen Zeichensatz 80 statt 77 Zeichen pro Zeile nutzen. Hierfür gibt es eine einfache Lösung.
Der Rahmen läßt sich mit Escape-Befehlen (<Esc>) ausschalten. <Esc>-Befehle werden normalerweise zur Druckersteuerung ver- wendet. Beim Amiga werden sie vor der Ausgabe an den in den Pre- ferences eingestellten Drucker angepaßt. Diese Anpassung wird
| aber auch bei der Ausgabe im CLI-Fenster durchgeführt. Wird bei-
SPIIENOES von einem Programm in einem CLI-Fenster die Sequenz
"ausgegeben, erscheinen danach alle Texte unterstrichen. Das ist
| auch über die Tastatur möglich. Drücken Sie nacheinander die Ta-
sten <Esc>, <[>, <4> und <m>. Jetzt ist Unterstreichen eingeschal- tet. Es gibt aber nicht nur Befehle für die Einstellung der verschiede- nen Darstellungsarten, sondern auch für die Formatsteuerung:
Offsets: Bitplanes im ViewPort
Tastenkombination Bedeutung von n
Esc[nu Breite in Zeichen
Esce[nx Linker Rand in Pixeln
Esc[ny Abstand zur Oberkante des Fensters Esc[nt Anzahl der Zeilen
Escc normales Format
Wie Sie aus der Tabelle sehen, kann der gesamte Bildschirm durch wenige Eingaben genutzt werden. Bringen Sie zunächst das CLI-Fenster mit der Maus auf die Größe des Bildschirms. Mit dem Befehl »Esc [80u« wird die Zeilenbreite auf 80 Zeichen gestellt und der linke Rand mit »Esc [0x auf die äußerste linke Position gesetzt. Um in dem großen CLI-Fenster aufzuräumen, kann der Inhalt mit <Ctrl L> gelöscht werden. Sofort verschwindet auch der Rand des Fensters. Schließlich sollten Sie noch einmal auf <Return> drücken, damit die Formatbefehle nicht als Teil des nächsten CLI-Befehls in- terpretiert werden.
Ab jetzt wird bei der Textausgabe das gesamte Fenster benutzt. Wünschen Sie wieder das alte Format, genügen die Tasten <Esc>,
55
WORKBENCH UND CLI
BEDIENUNG
<c> und <Return>. Jeder, der seinen Bildschirm häufig auf diese Art vergrößern will, kann die benötigten <Esc>-Sequenzen auch in zwei Textdateien »Rahmen-Aus« beziehungsweise »Rahmen-Ein« zu- sammenfassen. Dann genügt der einfache Aufruf
type Rahmen-Aus
Winfried Stappert/ub
Wenn Sie mit dem CLI arbeiten und den Editor mit »ed« aufrufen, können Sie zwar editieren, aber sonst keine weitere Arbeit mit dem CLI ausführen. Wer beispielsweise während des Editierens einmal den Namen einer Datei benötigt, steht vor dem Problem, daß das CLI auf keine Kommandos reagiert. Der folgende Befehl hilft:
RUN ED name
Nun arbeitet der Editor als eigenständiger Task. Im CLI-Fenter kann normal weitergearbeitet werden. Durch diesen Trick sparen Sie sich das Speichern und erneute Laden der zu editierenden Datei, falls Sie kurzfristig mit dem CL arbeiten wollen.
Norbert Cohen/ub
Read Error, halb so wild
Kennen Sie die Systemmeldung:
R rror Can't Validate Disk?
Sie kommen dann nicht mehr an die Daten auf der Diskette. Aber nicht verzagen, es gibt eventuell eine Rettung: Kopieren Sie das ge- samt Dateiverzeichnis »I« von einer Workbench-Diskette in die
RAM-Disk.
Mit Hilfe der Zuweisung durch den ASSIGN-Befehl sucht der Amiga den Disk-Validator nicht mehr auf der eingelegten Diskette, sondern in der RAM-Disk. Legen Sie nun Ihre defekte Diskette er- neut ein. Sollte der Amiga diesmal die Diskette ohne Fehlermeldung annehmen, kopieren Sie schnell alle benötigten Dateien auf eine an- dere Diskette.
Henning Müller/ub
CLI unter Kontrolle |
Im CLI lassen sich viele Funktionen mit <Ctri>-Kombinationen auslösen, d.h. durch Drücken von <Ctrl> und einer anderen Taste gleichzeitig. Die folgende Tabelle zeigt eine Übersicht aller Kombina- tionen. Ein kleiner Hinweis: Sie können die Tabelle kopieren oder ausschneiden und an Ihrem Arbeitsplatz aufhängen. So haben Sie immer Gelegenheit, sich schnell über die Tastaturbefehle zu infor- mieren, meist ist das Handbuch ja gerade dann verschwunden, wenn man es am meisten braucht.
C. Krieg/ub |
<Ctri>-Kombinationen im CLI
Tastenkombination Funktion
Orr! löscht Bildschirm
Otri d bricht Ausführung einer Befehlsdatei ab
Chric bricht laufenden Befehl ab (z.B. DIR)
Ctrin schaltet zweiten Zeichensatz ein
Ctrlo schaltet amerikanischen Zeichensatz ein
Otrix löscht aktuelle Zeile
Etrli =TAB
Ctrig läßt den Bildschirm aufblitzen
Ctrih = Backspace
Otrlj Zeile nach unten; Eingabe mehrerer CLI-Befehle auf einmal möglich
Otrik Zeile nach oben
56
Schnelle Verzeichniswechsel
Wenn man mit Hilfe des Befehls CD im Dateibaum sehr weit auf- gestiegen ist und ins Hauptverzeichnis zurück möchte, braucht man nur eintippen:
Hinter dem Doppelpunkt kann auch jeder beliebige Pfad angege- ben werden. Beispielsweise gelangt man mit
ins Unterverzeichnis »s«, unabhängig vom Verzeichnis, in dem man vorher gearbeitet hat. Maik Jablonski/ub
Schaufel für die Shell
Arbeiten Sie gerne mit der Shell? Dann ist die Kombination »#?« sicherlich interessant für Sie. Wenn Sie mit dieser Zeichenfolge ar- beiten, können Sie viel schneller Dateien kopieren, löschen und durchsehen. Hier einige Beispiele, wie man »#?« einsetzt:
» Falls Sie alle Dateien mit dem Ende ».info« (aus dem aktuellen Verzeichnis) löschen wollen, geben Sie nur ein:
« Tippen Sie ein:
Der Befehl kopiert alle Programme, die mit der Zeichenfolge »Pro- gramm« beginnen, nach »dfl:«.
Sie können »#?« natürlich auch mit DIR bzw. LIST anwenden.: « Das Kommando gibt alle Dateien und Verzeichnisse (komplett) aus, deren Name mit »TXT« enden.
Genauso funktioniert LIST: zeigt alle Dateien und Verzeichnisse, die mit der Zeichenfolge »Datei« beginnen.
Alexander Koch/ub
Arbeiten mit LIST
Wie würden Sie vorgehen, wenn Sie bei vielen Dateien in einem Verzeichnis das Datum ändern möchten? Wählen sie den mühsa- men Weg, alle Dateien mit SETDATE zu bearbeiten? Einfacher und eleganter läßt sich das mit dem LIST-Befehl bewerkstelligen (gültig für Workbench 1.3):
Die Befehlszeile erzeugt in der RAM-Disk die Datei »EXEDATEI«. In ihr sind alle Einträge des aktuellen Verzeichnisses aufgelistet —
versehen mit dem Befehl SETDATE und dem Schalter TODAY, so daß die Datei folgendermaßen aussieht:
Die Datei läßt sich mit EXECUTE abarbeiten. Anstelle von SET- DATE können Sie z.B. auch PROTECT oder DELETE verwenden. Christian Benner/ub
Workbench oder CLI?
Ins CLI gelangt man nach dem Laden der Workbench durch Anklicken des CLI-Symbols in der Schublade »Systems«. Wer häu- fig im CLI arbeitet, kann auch die »Startup-Sequence« im Verzeich- nis »s« der Workbench-Diskette ändern und dort den Aufruf LOAD- WB und ENDCLI löschen, um nach dem Start des Amiga gleich im CLI zu bleiben. Wer mal mit dem CLI und mal mit der Workbench ar- beiten möchte, sollte eine »Startup-Sequence« ähnlich der im fol- genden Listing gezeigten verwenden. Die Sequenz bedient sich des Befehls ASK, um die Abfrage zu realisieren.
Marek Duda/ub
|
Mit einer solchen »Startup-Sequence« haben Sie beim Booten die Wahl: Workbench oder CLI
Kürzere Bootzeiten mit TYPE |
Viele Programmierer verändern die »Startup-Sequence« auf der | Startdiskette, um beim Booten des Amiga mit ECHO Texte auszuge- ben. Bei längeren Texten hat das den Nachteil, daß für jede Zeile der ECHO-Befehl erneut von Diskette geladen werden muß, wo- | durch die Zeit beim Starten unnötig verlängert wird. Schneller geht es, wenn man den gewünschten Text in einer Datei speichert und ihn in der »Startup-Sequence« mit TYPE ausgibt.
Lutz Beyert/ub
Iit’s impossible to make things | foolproof because fools are so ingenious
Tolles Tool mit Anleitung |
Der Editor »MicroEmacs« schlägt den ED um Längen. Allerdings nur wenige wissen, daß sich dieses hervorragende Werkzeug auf der ExtrasD-Diskette von Commodore befindet. Schauen Sie nach. | Das Programm hat seinen Platz in der Schublade »Tools«. Und auch eine Anleitung ist auf der Diskette gespeichert. Sie verbirgt sich hinter dem Piktogramm »MicroEmacs.doc«. Es existieren drei Wege, die Anleitung zu lesen: | - Klicken Sie das Piktogramm »MicroEMACS.doc« zweimal an. Mit einem System-Requester fordert der Amiga Sie nun auf, das Origi- nal der ExtrasD-Diskette einzulegen. Sofern Sie nur ein Laufwerk besitzen, gelangen Sie nach zwei weiteren Diskettenwechseln ans erste Bild der Anleitung.
- Wer die Anleitung schneller lesen möchte, lädt das Utility »More«. Es dient dazu, ASCII-Dateien auf dem Bildschirm auszugeben. Nach der Frage »Filename?«, tippen Sie »MicroEMACS.doc« und drücken | <Return>.
- Der elegante Weg ist, eine <Shift>-Taste zu drücken und mit der Maus die Piktogramme 2MicroEMACS.doc< und »More« an-
WORKBENCH UND CLI
BEDIENUNG
zuklicken. Danach wählen Sie in der Menüzeile der Workbench »Open«. Wer es noch einfacher möchte, klickt bei gehaltener Shift- Taste »MicroEMACS.doc« an und aktiviert dann MORE mit einem Doppelklick.
Nach dem Laden sehen Sie auf dem Bildschirm die erste Seite der Anleitung. Durch Drücken von <h> gelangen Sie in einen Screen mit Hilfsanweisungen zu More. Mit <Space> blättern Sie in der Anlei- tung weiter. Sie umfaßt 70 Seiten und ist in Englisch geschrieben. Am Ende befindet sich eine alphabetische Liste aller »Shortcuts« ( abgekürzte Befehle) von MicroEmacs. Sie verlassen die Anleitung mit <q>. Wer den gesamten Text intensiv studieren möchte, kann ihn auch mit »PrintFiles« ausdrucken lassen.
Nick Seggelke/ub
Es geht auch ohne Execute
Wir nehmen an, Sie wissen, wie nervig es ist, wenn man zum Aus- führen von Batch-Dateien jedesmal schreiben muß:
Doch den EXECUTE-Befehl vor dem Dateinamen kann man mit einer Workbench ab Version 1.3 auch weglassen. Erstellen Sie eine Textdatei mit z.B. folgendem Inhalt:
Speichern Sie die Folge unter dem Namen »Test« und geben Sie anschließend ein:
Nun können Sie einfach den Dateinamen eingeben und die Datei wird ausgeführt. Wenn das s-Bit gesetzt ist, kann man sich also EXECUTE sparen, denn bevor AmigaDOS die Datei. ausführt, über- prüft der Amiga, ob dieses Bit gesetzt ist. Wenn ja, erkennt das Sy- stem, daß es sich um eine Befehlsdatei handelt und führt sie aus. Damit ist auch klar, daß das s-Bit wirklich nur bei Batch-Dateien ge-
| setzt werden darf. Andernfalls ist eine Fehlermeldung die Folge.
Jürgen Reis/ub
Spiel mit der Maus kostet Zeit
Vor allem bei zeitaufwendigen Programmen kommt es oft vor, daß man aus Langeweile die Maus bewegt. Geht es Ihnen auch oft so? Das führt jedoch zu einer Verlangsamung des Programms. Als Bei- spiel dient eine FOR-NEXT-Schleife in BASIC:
Im Normalfall benötigt die Schleife etwa 4 Sekunden. Wenn Sie nun ungeduldig mit der Maus spielen, kann sich die Ablaufzeit um bis zu 0,6 Sekunden erhöhen.
Torsten Kerschat/ub
MACHEN SIE MIT
Wollen Sie sich an der Rubrik »Tips & Tricks« im AMIGA-Magazin beteiligen? Schicken Sie uns Ihre Tips. Am besten, Sie senden uns Ihre Programme und Texte auf Diskette (ASCII-Format). Für Bastel- anleitungen fügen Sie bitte einen Bauplan bei. Die Adresse:
AMIGA-Redaktion Kennwort: Tips & Tricks Markt & Technik Verlag AG Hans-Pinsel-Str.2 8013
“ Haar bei München
Alle Einsendungen werden von uns geprüft. Wenn Ihr Beitrag in die engere Wahl für eine Veröffentlichung kommt, werden Sie benach- richtigt. Haben Sie auf jeden Fall ein wenig Geduld: Vom Zeitpunkt, an dem Ihr Beitrag die Redaktion erreicht, können bis zum Abdruck im AMIGA-Magazin oder Sonderheft zwei bis drei Monate vergehen.
57
TIPS & TRICKS
AMIGA VON ABISZ
Rund um Amiga
Die Schatzkiste
Und jetzt was ganz Besonderes: Eine bunte Mischung von Tricks rund um den Amiga, bei der wirklich jeder auf seine Kosten kommen sollte: von Tips zu Festplatten, Public Domain etc., bis zu MS-DOS oder zur ARP-Library. Alles was für Ihre tägliche Arbeit mit dem Amiga nützlich ist. Schauen Sie in Ruhe durch, was wir hier alles aus dem Amiga herauszaubern - es sollte für jeden etwas dabei sein.
o tummeln sich die meisten Kunden im Winterschlußver-
kauf? An den Wühltischen, denn hier findet jeder etwas
Brauchbares. Wühlen Sie auch mal auf den nächsten
Seiten, hier gibt es jede Menge guter Ideen zum Amiga. Der Unterschied zum Winterschlußverkauf? Die Schatzkiste ist voller Tips, die Sie ganz bestimmt auch im Sommer ganz gut brauchen können. Und Sie brauchen auch nicht an der Kasse Schlange zu stehen - hier ist alles umsonst.
Whats the best way to catch a rabbit??? Hide in a bush and mimic the voice ofa carrot
DIE AMIGA-SCHATZKISTE
Tip/Thema Seite | Platte mit PC-Karte zu langsam 58 Alles anders unter ARP 58 ‚Amiga-Blackslash und MS-DOS 59 Gucklöcher / Fenster ganz klein 59 Langsam, schnell, schneller / Textscrolling 60 Safer Hard-Disk / Festplattenschutz 60 Pipes / ARP-Shell 60 Das sichere RESIDENT / noch mal ARP 61 Ruckzuck entpackt / Batch-Dateien zum Entpacken 61 Disketten unter Amiga-DOS / Diskettenformate 62 Rohrleger im CLI - Pipes 65 ‚Gut gepatcht ist halb gewonnen 65 Laufwerke im Griff / Requester anpassen 66 Externe Programme starten / Execute() 66 BASIC mit nur einem Laufwerk / BASIC-Diskette 66 Ceitansage / Uhr stellen in C 67 Schnelle Platte / Puffer für Festplattenzugriffe 67 Speicheraufteilung / Speicher unter BASIC 67
58
Platte mit PC-Karte zu langsam
Dank der Janus-Software, die mit der PC-Karte von Commodore geliefert wird, besteht u.a. die Möglichkeit, Festplatten von der PC- Seite aus zu nutzen. Beispielsweise läßt sich eine Autoboot-Partition mit dem Befehl »MakeAB« erstellen. Je größer jedoch die Partition wird, desto langsamer wird, von der PC-Seite aus, der Festplatten- zugriff auf sie.
Die Lösung des Problems ist ein größerer Puffer (»Buffer«), in dem die Daten im RAM zwischengespeichert werden. Der Buffer für eine Partition läßt sich mit dem CLI-Befehl ADDBUFFERS erhöhen. Der Aufruf lautet:
Ein Beispiel:
Dabei ist »Partition« der Name der Festplattenpartition, auf der sich das PC-File befindet. »Größe« stellt die Anzahl der Blocks dar, um welche die Größe des Puffers erhöht werden soll. Der optimale Wert hängt von der Größe der PC-Partition ab. Bei 10 MByte hat sich eine Größe von 200 Blocks bewährt. Allerdings sollten Sie ruhig ein wenig experimentieren, um eine optimale Einstellung für Ihr System zu finden.
Christof Brühann/ik
| Alles anders unter ARP
Wer sich mit ARP beschäftigt, wird schnell auf Probleme mit dem »*«-Zeichen stoßen. Das »*«-Zeichen wird unter ARP als Joker ver- wendet, wie unter MS-DOS und Unix üblich. Doch was passiert mit bei eingefleischten Amiga-Usern so beliebten Konstruktionen wie der folgenden?
Die Befehlszeile dient normalerweise dazu, einen kurzen Text zu verfassen, ohne gleich einen Editor zu starten; »*« steht hier für das
\ aktuelle CLI-Fenster, dessen Ausgaben umgelenkt werden. Aber
Achtung: Unter ARP hat die Befehlssequenz eine mächtige Wirkung: Ab sofort versucht der Amiga nämlich, alle Dateien des aktuellen Verzeichnisses ins Unterverzeichnis »text« der RAM-Disk zu kopie- ren, falls es existiert. Durch solche Mißverständnisse kann man recht schnell großen Schaden anrichten. Doch was kann man dage- gen tun?
Einmal kann man mit
erreichen, daß der Stern (»*«) wieder seine herkömmliche Bestim- mung als Identifikation des aktuellen Fensters erlangt. Übrigens kön- nen mit dem Kommando
wichtige Systemeinstellungen nachgesehen werden. Im Zweifelsfalle also gleich selber ausprobieren.
Doch diese Lösung ist nüchtern betrachtet eher ein Verlust als ein Gewinn, da man so auf die Wirkung des beliebten Sterns als Joker verzichtet muß. Doch glücklicherweise gibt es auch eine bessere Lö- sung, da die Arp-Befehle eine direkte Eingabe von Tastatur aus er- lauben. Man kann beispielsweise mit
type ohne weitere Parameter, Text von Tastatur aus eingeben, der dann sogleich wieder auf dem Standardausgabegerät (hier unser aktuel- les Fenster) ausgeben wird. Somit löst sich auch unser ursprüngli- ches Problem: Die Anweisung
xt
typeto r speichert unsere Eingaben von der Tastatur in der Datei »text« der RAM-Disk. Wichtig ist dabei, das Schlüsselwort »to« nicht wegzulas- sen, sonst sucht der TYPE-Befehl die Datei »text«, die dann als Ein- gabe fungiert und nicht wie vorgesehen als Ausgabe.
Passen Sie auch darauf auf, daß ohne Arp das »*«-Symbol als
Escape-Zeichen innerhalb von Namen interpretiert wird. Deswegen sollte man, vorausgesetzt ARP wird benutzt, mit
das »\«-Zeichen zum Escape-Zeichen umbenennen, damit keine Komplikationen auftreten. Zu guter letzt noch ein kleines Beispiel einer ALIAS-Definition, die als Prompt immer die zwei aktuellen CLI/Shell-Variablen ausgibt:
Nach der Eingabe von »prom« werden sofort das neue Prompt angezeigt und zugleich die Variablenwerte ständig aktualisiert. Thomas Becker/ik
TIPS & TRICKS
AMIGA VON ABISZ
Amiga-Blackslash unter MS-DOS
Viele Amiga-Anwender, die mit einer XT/AT-Emulation arbeiten, kennen das Problem: Der Blackslash ist auf der Amiga-Tastatur
| nicht an seiner gewohnten Stelle. Es ist zwar recht einfach, durch
Eingabe des ASCII-Codes (hier <Alt> drücken und »92« eingeben) das gewünschte Zeichen auf den Bildschirm zu bringen, doch wer durch Eingabe des Verzeichnisnamens in die einzelnen Verzeichnis- se der Diskette oder Festplatte wechseln möchte, dem nutzt die Ein- gabe des ASCIl-Codes wenig. Hier hilft der DOS-Befehl PROMT, den man u.a. verwendet, um die Tastatur umzuprogrammieren. Mittels des Befehls läßt sich der Backslash auf eine nicht benutzte Funktionstaste legen. Hier bietet sich die Taste <F 10> an, da sie er- fahrungsgemäß von wenigen Programmen benutzt wird. Folgender PROMT-Befehl belegt die <F 10> Taste mit dem Backslash.
Noch einfacher wird es, wenn man den Befehl in die Datei »auto- exec.bat« einbindet, so etwas wie die »Startup-Sequence« für MS- DOS. So wird bei jedem Start des Betriebssystems automatisch die Taste <F 10> mit dem Backslash belegt.
Jürgen Porcher/ub
Gucklöcher
Fenster (z.B. CLI-Windows o.ä.) kann man normalerweise nur bis zu einer bestimmten Größe verkleinern. Ist einem ein Fenster noch
59
TIPS & TRICKS
AMIGA VON ABISZ
zu groß, läßt es sich durch gleichzeitiges Drücken von <Amiga_links N> und Verkleinern mit der Maus noch weiter schrumpfen. Damit sollte man aber vorsichtig sein, da man das Vergrößerungssymbol bei einem zu kleinen Fenster nicht mehr findet.
Sean Durkin/ub
Langsam, schnell, schneller
Immer, wenn ein Fenster teilweise vor einem anderen liegt,