Grundlagen: Programmieren unter MiNT/MultiTOS, Teil 1

»MiNT is Not TOS« - diese Formel hat sich schon vor längerer Zeit in »MiNT is Now TOS« gewandelt. Das von Eric Smith geschriebene Programm dient im neuen MultiTOS als Betriebssystemkern. Aus diesem Grund wird MiNT für Programmierer interessant, will man doch für MultiTOS gerüstet sein.

MiNT für sich gesehen ist eine Betriebssystemerweiterung für TOS. Es bietet ein nach dem Zeitscheibenverfahren gesteuertes Multitasking für TOS-Programme. Die Betonung liegt auf TOS. GEM-Programme (die mit den hübschen Fenstern) bleiben außen vor. Es läuft immer nur eine GEM-Applikation - begleitet von mehreren TOSAnwendungen. Erst wenn Atari mit dem Falcon030 das neue MultiTOS mit einem auf Multitasking ausgerichteten AES auf den Markt bringt, nehmen auch GEM-Applikationen am Multitasking teil. Doch die Vorzüge von MiNT gehen ein ganzes Stück weiter:

  1. Nachladen neuer Dateisysteme. Damit lassen sich etwa Disketten im MINIX-Format auch unter TOS lesen.
  2. Über das Pseudolaufwerk »U:« sprechen Sie alle angeschlossenen Laufwerke an.
  3. Alle BIOS-Geräte sind als Dateinamen über das Pseudolaufwerk »U:« zu erreichen. Kopieren Sie zum Beispiel eine Datei nach »U:\DEV\PRN«, wird automatisch Ihr Drucker aktiv.
  4. Einbindung neuer Gerätetreiber
  5. Symbolische Links wie Alias für Dateien oder Verzeichnisse.

Um diese Vielfalt zu steuern sind für Programmierer eine ganze Menge neuer Betriebssystemfunktion, die sich sehr an UNIX anlehnen, hinzugekommen.

Einige dieser Neulinge werden wir in unserem Programm »PS-Control«, das Sie auf der TOS-Diskette inklusive aller Quellcodes finden, kennenlernen. PS-Control läuft als Accessory oder Programm, vorausgesetzt MiNT ist installiert. Es zeigt bis zu 17 Prozesse (laufende Programme) sowie deren Parameter in einem Fenster an. Ein Doppelklick auf einen Prozeßnamen öffnet ein zusätzliches Informations-Fenster mit genaueren Auskünften.

Durch einfaches Anklicken wird ein Prozeß markiert. Bei gedrückter Shift-Taste wählen Sie mehrere Prozesse. Die Buttons »+« und »-« erhöhen bzw. erniedrigen die Priorität des markierten Prozesses. »Min« und »Max« stehen für die Maximal- bzw. Minimalwerte -20 und +20.

Diese Vorgaben sichern Sie über »Liste« in der Datei »PS_CONTR.INF«. Wurde ein Prozeß in diese Liste aufgenommen, steht vor seinem Namen ein Uhrensymbol. Einmal pro Sekunde stellt PS-Control die Prioritäten der aktiven Prozesse anhand der Liste bei Bedarf ein.

Eine Auswahl der von MiNT unterstützten Signale, steht Ihnen im Menü »Signal« zur Verfügung: STOP, TSTP, CONT, KILL und TERM.

Grundsätzliches

Wenn ein Programm speziell für MiNT geschrieben ist, muß es feststellen können, ob MiNT überhaupt aktiv ist, da sonst bei der Verwendung von MiNT-spezifischen Funktionen eine Bomben-Stimmung herrscht. Der sicherste Weg die MiNT-Aktivität festzustellen ist die Abfrage des MiNT-Cookies. Ist dieses vorhanden, ist auch MiNT nicht fern. TOS-Programme, die ohne Probleme in eine Multitasking-Umgebung passen sollen, müssen unbedingt sauber geschrieben werden. Alle Ein- und Ausgaben müssen über Betriebssystemfunktionen laufen. Am besten nur die höchstgelegenen Routinen der GEMDOS-Funktionen verwenden und BIOS oder XBIOS meiden. Für GEM-Programme gilt dieses ebenso, schließlich ist MultiTOS im Anmarsch. Zusätzlich kommt bei GEM-Applikationen noch zum Tragen, daß die normale Ausgabe in einer Dialogbox den Bildschirm für alle anderen Programme blockiert. Dialog- und Alert-Boxen daher am besten nur für Fehlermeldungen und ähnliches verwenden. Für sonstige Ausgaben sollten Sie in einem Multitaskingsystem Fenster verwenden.

Die Programmierung

PS-Control besteht aus drei Modulen:

  1. »PS_C_GEM.C«, die GEM-Routinen mit einem Kern zur Verwaltung von Fenster-Dialogen,
  2. »PS_CONTR.C«, der eigentliche Hauptteil und
  3. »PS_PRIO.C« mit der Verwaltung der Liste.

Die Datei »MINTBIND.H« enthält die Definitionen der MiNT-Aufrufe und diverser anderer MiNT-Spezifika. Im Grunde ist sie eine Zusammenfassung der MiNT-Dateien »FILESYS.H«, »SIGNAL.H« und »MINTBIND.H«. Da die Originaldateien nicht sonderlich gut mit PURE C zusammenarbeiten, wurden die benötigten Dinge überarbeitet und in einer Datei zusammengefaßt. Solange noch kein Compiler mit vollständiger MiNT-Unterstützung zu haben ist, abgesehen von GNU C, empfiehlt sich diese Vorgehensweise.

PS-Control startet im Modul »PS_C_GEM.C« mit main(). Die Funktion »get_cookie()« sucht nach dem MiNT-Keks. War das Krümelmonster schneller, wird das Programm mit einem Hinweis beendet. Läuft PS-Control als Accessory, darf es nicht beendet werden, da die aktuellen TOS-Versionen diesen Fall nicht vorsehen. Um den Bomben zu entgehen, landet PS-Control in diesem Falle in einer kleinen Schleife die jeden Aufruf mit einer Fehlermeldung quittiert.

Die erste Häufung von MiNT-Befehlen treffen wir in »get_proz()« (»PS_CONTR.C«). Unter MiNT gibt es eine neue Art der Verwaltung von Verzeichnissen, die stark an UNIX angelehnt ist. Unter UNIX verhält sich ein Verzeichnis wie eine Datei, die geöffnet und gelesen werden kann. Dieses Verhalten simuliert MiNT über die Funktionen Dopendir(), Dreaddir() und Dclosedir(). Die C-Prototypen sehen folgendermaßen aus:

long Dopendir(char *name, int flag) ;
long Dreaddir(int len, long dirhandle, char *buf);
long Drewinddir(long dirhandle);
long Dclosedir(long dirhandle);

Dopendir0 öffnet das Verzeichnis »name« zum Lesen. Der Parameter »flag« gibt an, ob im Kompatibilitäts-Modus oder im MiNT-Modus gearbeitet werden soll. Im kompatiblen Modus erfolgen alle Ausgaben von Dreaddir() über »Fsfirst()« und »Fsnext()«. Der Dateiname ist auf acht Zeichen plus drei Zeichen Erweiterung beschränkt. Im MiNT-Modus entfallen diese Beschränkungen. Dreaddir() liefert zusätzlich in den ersten vier Bytes von »buf« die unter UNIX bekannte Inode-Nummer. Neue Programme sollte diesen Modus wählen, um die Arbeit mit den nachladbaren Dateisystemen zu gewährleisten. Hat das Öffnen des Verzeichnisses geklappt, liefert »Dopendir()« ein 32 Bit langes Handle zurück. Da auch negative Handles erlaubt sind, setzt die Funktion im Fehlerfall die obersten 8 Bit.

Dreaddir() liest einen Eintrag des Inhaltsverzeichnis mit dem Handle »dirhandle« in den »len« Byte langen Puffer »buf«. Solange noch Einträge im Verzeichnis sind, liefert die Funktion den Wert Null, ansonsten eine Fehlermeldung. Um das geöffnete Verzeichnis »dirhandle« nochmals zu lesen, springt »Drewinddir()« an den Anfang zurück und liefert im Erfolgsfall den Wert Null.

»Dclosedir()« schließt das Verzeichnis »dirhandle«. Auch hier kennzeichnet der Rückgabewert Null den Erfolg der Aktion. Das Schließen des Verzeichnisses darf man auf gar keinen Fall vergessen, da MiNT sonst unter Umständen sehr seltsam reagiert.

Im nächsten Teil beschäftigen wir uns genauer mit Dateisystemen sowie der Prozeßkontrolle unter MiNT.


Richard Kurz ah
Aus: TOS 11 / 1992, Seite

Links

Copyright-Bestimmungen: siehe Über diese Seite