Programmer's Toolbox (2): Die GEMDOS-Betriebssystemfunktionen

Im Zentrum des ersten Blocks der "Programmer's Toolbox" stehen die Betriebssystemfunktionen des ST und ihre Anwendung durch die Kommandos der Shell. Da dabei "gut" die Hälfte aller GEMDOS-Funktionen Anwendung findet, erscheint es sinnvoll zunächst einen kurzen Ausflug in diesen Bereich des ST-Betriebssystem durchzuführen, um die nachfolgenden Serienteile nicht übermässig stark durch diesbezügliche Erläuterungen zu belasten.

Einen guten Einstieg in die Thematik erhält man mit Hilfe von Abb.1.4. Hier dargestellt finden sie die einzelnen Komponenten des ST-Betriebssystems. Im wesentlichen liegt eine Differenzierung zwischen TOS (Tramiel? Operating System) und GEM (Graphics Environment Manager) vor. Das GEM beschäftigt sich mit der Verwaltung der (höheren) grafischen Funktionen des ST und ist damit für uns von untergeordneter Bedeutung, da innerhalb dieser Artikelserie ausschließlich auf der Textebene gearbeitet wird. Das TOS dagegen bildet die Schnittstelle zur Hardware des ST, daher sind auch in diesem Bereich die von uns benötigten Funktionen angesiedelt und es sollen zunächst die Komponenten des TOS näher betrachtet werden.

TOS setzt sich aus drei Komponenten zusammen in denen zwischen geräteunabhängigen und geräteabhängigen Funktionen unterschieden wird. Die geräteunabhängigen und damit die höheren Funktionen des TOS sind im GEMDOS (Graphics Environment Manager Disc Operating System) untergebracht. Die geräteabhängigen Funktionen sind im BIOS (Basic Input Output System) und im XBIOS (eXtended Basic Input Output System) angesiedelt. Das BIOS enthält dabei sämtliche Funktionen, die zur Implementierung des GEMDOS benötigt werden. Das XBIOS enthält weitere Funktionen, die besondere Eigenschaften der ST-Hardware unterstützen und die nicht von GEMDOS verwendet werden.

Bei den Arbeiten zur "Programmer's Toolbox" hat sich herausgestellt, daß die im wesentlichen auf den Bereich des Dateisystems fixierten Funktionen des GEMDOS für die gewünschten Implementierungen ausreichend sind. Im folgenden findet sich daher ein knappes aber vollständiges Kurz-Reference für sämtliche GEMDOS-Funktionen. Es ist zu beachten, daß die Funktionen nicht in der relativ willkürlichen Reihenfolge aufgeführt sind, in der sie im Betriebssystem implementiert sind Stattdessen sind sie in funktionalen Gruppen zusammengefaßt. Generell gilt, daß bei Anwendung der Funktionen immer die Header-Datei "OSBIND.H" verwendet werden muß, da in ihr die entsprechenden Deklarationen vorgenommen sind. Ferner gilt, daß negative Funktionsergebnisse bei allen Funktionen ein Fehlverhalten signalisieren, das entsprechend Abb.1.5 zu interpretieren ist. In den nachfolgenden Funktionsbeschreibung wird daher auf eine separierte Dokumentation von Fehlverhalten verzichtet.

Nr. Bedeutung
-1 allgemeiner Fehler
-2 angesprochenes Gerät nicht bereit
-3 unbekannter Befehl
-4 CRC-Fehler
-5 ein gegebener Befehl ist ungültig
-6 ein angesprochener Track kann nicht gefunden werden
-7 ungültiger Bootsektor
-8 ein angesprochener Sektor kann nicht gefunden werden
-9 Drucker nicht bereit
-10 Schreibfehler
-11 Lesefehler
-12 allgemeiner Fehler
-13 Diskette schreibgeschützt
-14 Diskette wurde gewechselt
-15 unbekanntes Gerät
-16 beim Verifizieren wurden kaputte Sektoren gefunden
-17 Diskette einlegen (bei einem Laufwerk)
-32 ungültige Funktionsnummer
-33 Datei nicht gefunden
-34 Pfadname nicht gefunden
-35 zuviele offene Dateien
-36 Zugriff nicht möglich
-37 ungültige Handle-Nummer
-39 ungenügender Speicher
-40 ungültige Speicherblockadresse
-46 ungültige Laufwerksbezeichnung
-49 keine weiteren Dateien

Abb.1.5: Fehlermeldungen von GEMDOS, BIOS und XBIOS

Ein- und Ausgabe mit der Konsole

ANWENDUNG

chr = Cconin();
chr = Crawcin();
chr = Cnecin();
Cconout(chr);
chr = Crawio(wrd);
status = Cconis();
status = Cconos();
Cconws(str);
Cconrs(str);
short status, chr, wrd;
char *str;

BESCHREIBUNG

Cconin, Crawcin und Cnecin holen jeweils das nächste Zeichen von der Konsole. Cconin arbeitet dabei mit Echo. Die beiden anderen Funktionen arbeiten ohne Echo. Cconin und Cnecin interpretieren die drei Kontrollzeichen:

^S Ausgabe stoppen
^Q Ausgabe fortsetzen
^C Programm abbrechen

Crawcin interpretiert diese drei Zeichen nicht. Es liefert stattdessen ihren ASCII-Wert.

Cconout gibt das Zeichen chr auf der Konsole aus.

Crawio ist eine Mischung aus Eingabe und Ausgabe. Wenn wrd ungleich 0xFF ist, wird wrd ausgegeben, ansonsten wird chr gelesen.

Cconis gibt einen Wert ungleich Null zurück, wenn ein Zeichen an der Konsole bereitliegt.

Cconos gibt einen Wert ungleich Null zurück, wenn die Konsole bereit ist ein Zeichen zu empfangen.

Cconws schreibt einen nullterminierten String auf die Konsole.

Cconrs ließt einen nullterminierten String der Maximallänge str[0] in den Vektor ab Position str[2] ein. In str[1] wird dabei die aktuelle Länge des eingelesenen Strings abgelegt.

Ein- und Ausgabe mit der seriellen Schnittstelle

ANWENDUNG

chr = Cauxin();
Cauxout(chr);
status = Cauxis();
status = Cauxos();
short chr, status;

BESCHREIBUNG

Identisch mit Cconin, Cconout, Cconis und Cconos, mit dem Unterschied das die Ein- und Ausgaben auf der seriellen Schnittstelle anstelle der Konsole erfolgen.

Ausgabe auf die parallele Schnittstelle

ANWENDUNG

status = Cprnout(chr);
status = Cprnos();
short chr, status;

BESCHREIBUNG

Identisch mit Cconout und Cconos, mit dem Unterschied das die Ausgaben auf der parallelen Schnittstelle anstelle der Konsole erfolgen.

Bearbeitung von Geräten

ANWENDUNG

drv = Dgetdrv;
map = Dsetdrv(drv);
Dfree(buf, drv);
long map;
short drv;
long buf[4];

BESCHREIBUNG

Dgetdrv ermittelt die Nummer des aktuellen Geräts. Dabei steht der Wert 0 für Gerät A, der Wert 1 für Gerät B und so weiter.

Dsetdrv setzt das aktuelle Gerät. Der Parameter drv kodiert das Gerät dabei auf genau die gleiche Weise wie die Ergebnisse von Dgetdrv zu interpretieren sind. Als Ergebnis (map) von Dgetdrv erhält man einen Bitvektor, der alle angeschlossenen Geräte anzeigt. Ein gesetztes Bit 0 zeigt dabei ein existierendes Gerät A an, ein gesetztes Bit 1 steht für Gerät B und so weiter.

Mit Dfree können Geräteinformationen abgefragt werden. In drv ist dabei auf die oben gezeigte Weise das Gerät zu kodieren. Als Ergebnis erhält man einen Vektor von vier long-Werten mit folgender Bedeutung:

buf[0] Anzahl der freien Cluster eines Geräts.
buf[1] Gesamtzahl der Cluster.
buf[2] Anzahl der Bytes pro Sektor.
buf[3] Anzahl der Sektoren pro Cluster.

Bearbeitung von Dateien

ANWENDUNG

handle = Fcreate(name, attr);
error = Fdelete(name);
handle = Fopen(name, mode);
error = Fdup(stdhandle);
error = Fforce(stdhandle, handle);
error = Fclose(handle);
rc = Fread(handle, count, buf);
rc = Fwrite(handle, count, buf);
pos = Fseek(offset, handle, mode);
char *name, *buf;
short handle, stdhandle, error, attr, mode;
long rc, count, pos, offset;

BESCHREIBUNG

Fcreate erzeugt eine Datei mit dem Pfadnamen name und den Dateiattributen attr. Die Dateiattribute sind dabei wie folgt zu kodieren:

Bit 0 name kann nur gelesen werden.
Bit 1 name ist unsichtbar.
Bit 2 name ist eine Systemdatei.
Bit 3 name ist ein Diskettenlabel.

Nach erfolgreichem Anlegen einer Datei gibt Fcreate eine positive Kanalkennung zurück.

Fdelete löscht die Datei name.

Fopen öffnet eine bereits existierende Datei mit dem Pfadnamen name zum lesenden und/oder schreibenden Zugriff. Der Wert von mode entscheidet dabei über die Zugriffsart. Folgende Werte sind zulässig:

0 Nur lesender Zugriff.
1 Nur schreibender Zugriff.
2 Beide Zugriffsarten sind erlaubt.

Ergebnis einer erfolgreichen Ausführung von Fopen ist eine positive Kanalkennung, die für nachfolgende Zugriffe benutzt werden muß.

Fdup und Fforce dienen zur Umlenkung von Ein- und Ausgabe auf andere Geräte, als die Massenspeicher. Mit Fdup wird so etwa ein Zugriff auf eines der folgenden Geräte ermöglicht:

0 Konsoleingabe (stdin)
1 Konsolausgabe (stdout)
2 Serielle Schnittstelle (AUX:)
3 Parallele Schnittstelle (PRT:)

Unter Angabe der oben genannten Zahlenwerte für das entsprechende Gerät im stdhandle, erzeugt Fdup eine Kanalkennung (handle) die genau wie bei Fopen für nachfolgende EA-Operationen genutzt werden kann.

Fforce erlaubt Umlenkungen der mit den Standardkanalkennungen identifizierten Kanäle auf "normale" Datenkanäle. Unter Angabe der Kanalkennung des "normalen" Datenkanals (handle) und der Kennung des Standarddatenkanals (stdhandle) erfolgt die entsprechende Umlenkung.

Fclose schließt einen zuvor mit der Kanalkennung handle geöffneten Kanal.

Fread erlaubt das Lesen von count Bytes aus einer Datei mit der Kanalkennung handle. Das Ergebnis des Lesevorgangs wird im Puffer buf abgelegt. rc enthält dabei die Anzahl der tatsächlich gelesenen Bytes.

Fwrite ist gleichermassen parametriesiert wie Fread. Es erlaubt die zu Fread inverse Funktion des Schreibens von Daten.

Fseek ermöglicht beliebige Positionierungen innerhalb einer Datei. dazu wird Fseek mit offset angegeben um wieviel Bytes die Position in der mit handle identifizierten Datei geändert werden soll. Mit mode wird angegeben in welcher Art die Position geändert werden soll. mode kann folgende Werte annehmen:

0 Änderung relativ zum Dateianfang
1 Änderung relativ zur aktuellen Position
2 Änderung relativ zum Dateiende

Setzen und Abfragen von Dateimerkmalen

ANWENDUNG

error = Fdatime(buf, handle, set);
attr = Fattrib(name, set, attr);
error = Frename(zero, oldname, newname);
error = Fsfirst(name, attr);
error = Fsnext();
addr = Fgetdta();
Fsetdta(ptr);
long addr;
char *ptr, *name, *oldname, *newname;
short attr, zero, handle, set;
unsigned *buf;

BESCHREIBUNG

Die oben genannten Funktionen dienen allesamt zu Lesen oder Ändern eines oder mehrerer der folgenden Dateimerkmale:

Mit Fdatime wird die Modifikationszeit einer Datei bearbeitet. Vor Anwendung von Fdatime muß die gewünschte Datei zunächst geöffnet werden (Fopen), da Fdatime im Gegensatz zu den folgenden Funktionen eine Kanalkennung anstelle eines Pfadnamen zur Identifizierung der Datei benötigt. Unter dieser Voraussetzung wird mit set angegeben, ob die Modifikationszeit gesetzt (set hat den Wert 1) oder gelesen (set hat einen Wert ungleich 1) werden soll. buf ist dabei die Adresse eines vier Byte großen Puffers, der im ersten Wort die Modifikationszeit enthält. Im zweiten Wort steht das Modifikationsdatum. Die Kodierung der beiden Werte erfolgt dabei genau wie unter "Setzen und Abfragen der Systemzeit" beschrieben.

Fattrib ermittelt/setzt die Dateiattribute der Datei name. In Abhängigkeit von set werden die Dateiattribute entweder auf den Wert von attr gesetzt (set hat den Wert 1) oder als Funktionsergebnis von Fattrib berechnet (set hat einen Wert ungleich 1). Folgende Dateiattribute können ermittelt/gesetzt werden:

Bit 0 name kann nur gelesen werden.
Bit 1 name ist unsichtbar.
Bit 2 name ist eine Systemdatei.
Bit 3 name ist ein Diskettenlabel.
Bit 4 name ist ein Verzeichnis.
Bit 5 name wurde beschrieben und korrekt geschlossen.

Anmerkung: Beim Setzen von Dateiattributen sind nicht alle Variationen sinnvoll und möglich, beispielsweise ist es nicht möglich an eine Datei das Attribut "Verzeichnis" zu vergeben.

Das dritte Dateimerkmal, der Dateiname, kann mit Frename geändert werden. Unter Angabe des alten Dateinamen (oldname) und des neuen Dateinamen (newname), sowie eines Dummy-Wertes (zero muß auf jeden Fall 0 sein), erfolgt die gewünschte Änderung.

Vier weitere Funktionen tragen nun dafür sorge, daß man alle Dateimerkmale auch geschlossen und für mehr als eine Datei auf einmal abfragen kann:

Fsfirst ließt eine Beschreibung der ersten Datei mit dem Pfadnamen name und den Dateiattributen attr ein. Die Beschreibung wird im sogenannten DTA-Puffer (Disk Transfer Adress) abgelegt. Der Pfadname darf dabei im Bereich des Dateinamens das Zeichen '?' für einen unbekannten Buchstaben und das Zeichen '*' für einen unbekannten Teilstring enthalten. Die Dateiattribute sind wie unter Fattrib beschrieben zu spezifizieren. Die ermittelten Informationen umfassen insgesamt 44 Bytes und werden wie folgt im DTA-Puffer abgelegt:

Byte 0-20 reserviert (Typ char[21])
Byte 21 Dateiattribute (Typ char)
Byte 22-23 Modifikationszeit (Typ unsigned)
Byte 24-25 Modifikationsdatum (Typ unsigned)
Byte 26-29 Dateigröße (Typ long)
Byte 30-43 Dateiname (Typ char[14])

Die Kodierung von Modifikationszeit und Modifikationsdatum ist unter "Setzen und Abfragen der Systemzeit" beschrieben.

Mit der Verwendung der beiden Zeichen '?' und '*' im Pfad name wird die Suche nach Dateimerkmalen im Normalfall nicht eindeutig, so daß Fsfirst nur die erste mögliche Datei findet. In diesem allgemeinen Fall können weitere Dateien, mit Suchkriterien gemäß Fsfirst, mit der Funktion Fsnext abgerufen werden. Zusätzliche Parameter sind dazu nicht erforderlich, da mit Fsnext nur eine bereits begonnene Suche weitergeführt werden kann.

Mit den beiden letztgenannten Funktionen ist es kein Problem Dateimerkmale in den DTA-Puffer zu laden. Aber wo befindet sich dieser? Die Antwort liefert ein weiterer Betriebssystemaufruf: Fgetdta. Fgetdta ist parameterlos und liefert die gewünschte Adresse. Da dieser Puffer aber möglicherweise bereits von anderen Programmteilen genutzt wird, ist es sinnvoll den Betriebssystemaufruf Fsetdta zu verwenden, um einen eigenen DTA-Puffer zu verwenden. Der einzige Parameter der Funktion Fsetdta ist die Adresse des gewünschten Puffers. Das normale Vorgehen zum Umgang mit dem DTA-Puffer sieht daher auch so aus, daß man zunächst die Adresse des alten DTA-Puffers mit Fgetdta erfragt und sichert. Danach wird ein eigener DTA-Puffer mit Hilfe von Fsetdta bekanntgemacht. Es werden die gewünschten Fsfirst und Fsnext Anfragen durchgeführt. Abschließend wird die alte, zuvor gesicherte Adresse des DTA-Puffers wieder mit Fsetdta zum aktuellen Puffer.

Anmerkung: Tatsächlich liegt der DTA-Puffer nach dem Start eines Programms außerhalb des im User-Betrieb erreichbaren Bereichs. Wenn man trotzdem mit dem voreingestellten DTA-Puffer arbeiten will, ist es erforderlich zuvor in den Supervisor-Betrieb umzuschalten (siehe weiter unten).

Bearbeiten von Verzeichnissen

ANWENDUNG

error = Dcreate(path);
error = Ddelete(path);
error = Dsetpath(path);
error = Dgetpath(path, drive);
short error, drive;
char *path;

BESCHREIBUNG

Die vier obigen Funktionen dienen zur Verwaltung der Verzeichnisstruktur eines Dateisystems. Im einzelnen besitzen sie folgende Bedeutung:

Dcreate erzeugt ein neues Unterverzeichnis mit dem Pfad path.

Ddelete löscht ein vorhandenes, leeres Unterverzeichnis mit dem Pfad path.

Dsetpath macht path zum Arbeitsverzeichnis des aktuellen Geräts.

Dgetpath erfragt das Arbeitsverzeichnis des Geräts drive. Enthält drive dabei den Wert 0, dann wird das Arbeitsverzeichnis des aktuellen Geräts abgefragt. drive = 1 steht für das Gerät A, drive = 2 für das Gerät B, etc.

Setzen und Abfragen der Systemzeit

ANWENDUNG

date = Tgetdate();
Tsetdate(date);
time = Tgettime();
Tsettime(time);
unsigned date, time;

BESCHREIBUNG

Tsetdate und Tsettime setzen das Systemdatum und die Systemzeit auf die in date und time kodierten Werte. Tgetdate und Tgetdate lesen das Systemdatum und die Systemzeit in date und time ein. date ist dabei wie folgt kodiert:

Bit 0-4 Tag
Bit 5-8 Monat
Bit 9-15 Jahr (Offset 1980)

Für time gilt entsprechend:

Bit 0-4 Sekunde (in 2 Sekunden Intervallen)
Bit 5-10 Minute
Bit 11-15 Stunde

Dynamische Speicherverwaltung

Zum Verständnis der folgenden Ausführungen ist zuvor der Begriff des Programm-Heaps zu erläutern: Unter einem Programm-Heap versteht man einen beim Start des Programms ungenutzten Speicherbereich, der zusätzlichen Speicher für eine Vergabe während der Laufzeit des Programms bereit hält.

ANWENDUNG

addr = Malloc(size);
error = Mfree(addr);
error = Mshrink(zero, mem, size);
long addr, size;
short error, zero;
char *mem;

BESCHREIBUNG

Malloc fordert size Bytes freien Speicher vom Programm-Heap an. Kann der freie Speicher zur Verfügung gestellt werden, dann wird die Startadresse des reservierten Bereichs zurückgegeben. Ansonsten wird 0 zurückgegeben. Eine weitere Funktion von Malloc besteht darin, die Gesamtgröße des noch freien Speichers zu erfragen. Dies geschieht, indem Malloc mit einem Wert von -1L für size aufgerufen wird. In diesem Fall wird in addr die gewünschte Größe abgelegt.

Mit Mfree wird ein durch Malloc vergebener Speicherbereich wieder freigegeben.

Mshrink ändert die Größe des Programm-Heaps. zero muß dabei immer 0 sein. mem muß auf den Speicherbereich zeigen, der für nachladbare Programme reserviert ist. size muß die Gesamtgröße des Programms (inklusive statischer Daten und Programm-Heap) angeben. Mshrink wird normalerweise nicht direkt vom C-Programm aufgerufen. Sein Aufruf erfolgt automatisch vor Ausführung der ersten Anweisungen in main.

Prozeßverwaltung

ANWENDUNG

code = Pexec(mode, path, commandline, environment);
Pterm0();
Pterm(code);
Ptermres(keep, code);
long code, keep;
short mode;
char *path, *commandline, *environment;

BESCHREIBUNG

Mit Pexec kann ein weiteres Programm (path) nachgeladen und/oder gestartet werden. Dabei besteht die Möglichkeit sowohl eine Kommandozeile (commandline), als auch Umgebungsvariablen (environment) zu übergeben. Sollen die Umgebungsvariablen des aufrufenden Programms genutzt werden, dann ist NULL für environment zu übergeben. Mit mode wird angegeben welche Operation mit Pexec durchgeführt werden soll. Folgende Werte sind dabei möglich:

0 Laden und Starten.
3 Nur Laden.
4 Nur Starten.
5 Nur eine Basisseite erzeugen und freien Speicher zuweisen.

Bei mode = 0 ist path der Pfadname des zu ladenden Programms. Das Ergebnis von Pexec ist der exit-Status des ausgeführten Programms. Bei mode = 3 ist path ebenfalls der Pfadname des Programms. Das Ergebnis von Pexec ist jedoch die Adresse der Basisseite des geladenen (und nicht ausgeführten) Programms. Bei mode = 4 ist path die Adresse der Basisseite.

Ferner ist zu beachten, daß commandline eine Zeichenkette im Pascal-Format ist, d.h. im ersten Byte wird die Länge der Zeichenkette angegeben, die Daten für die Zeichen folgen und müssen nicht nullterminiert sein.

Die drei Funktionen Pterm0, Pterm und Ptermres sind Varianten des Programmabbruchs. Pterm0 beendet ein Programm mit dem exit-Status 0. Pterm und Ptermres dagegen beenden ein Programm mit exit-Status code. Bei Ptermres besteht zusätzlich zur Angabe eines exit-Status noch die Möglichkeit einen Teil des Programms oder das gesamte Programm nach der Programmausführung im Hauptspeicher zu behalten. Dazu ist mit keep die Größe des Speicherbereichs anzugeben, der nach der Programmausführung im Hauptspeicher gehalten werden soll. Damit ist es z.B. möglich ein Programm mehrfach zu starten, ohne es mehrfach zu laden. Zusätzlich gilt, daß alle drei Funktionen einen kontrollierten Programmabbruch durchführen, d.h. eventuell offene Kanäle werden automatisch vor dem endgültigen Exitus geschlossen.

Anmerkung: Von mir wird zum kontrollierten Programmabbruch keine dieser drei Funktionen verwendet. Stattdessen werden sie an gegebener Stelle die UNIX-kompatible Funktion exit vorfinden. Im Prinzip macht sie allerdings das gleiche wie Pterm und ihre Varianten.

Diverses

Für zwei Funktionen konnte ich keine sinnvolle Zuordnung zu einer funktionalen Gruppe finden. Sie sind hier als "Diverses" zusammengefaßt.

ANWENDUNG

oldstack = Super(newstack);
version = Sversion();
long oldstack, newstack;
short version;

BESCHREIBUNG

Der 68000-Prozessor des ST kennt zwei Betriebsmodi: den User-Modus und den Supervisor-Modus. Im User-Modus, der während eines "normalen" Programmablaufs aktiv ist, sind keine direkten Zugriffe außerhalb des Adreßraumes eines Programms erlaubt. Direkte Zugriffe auf Adressen außerhalb dieses Adreßraumes, hier liegen beispielsweise die Systemvariablen u.a., verursachen einen Fehler, der zum Programmabsturz führt. Im Supervisor-Modus existiert dieser Zugriffsschutz nicht. Die Funktion Super kann nun dazu genutzt werden zwischen den beiden Betriebsmodi hin und her zu schalten. Beim ersten Aufruf von Super (normalerweise im User-Modus) ist dazu ein Zeiger auf einen freien Speicherbereich zu übergeben (newstack), der im Supervisor-Modus als Stack benutzt werden soll. Als Ergebnis erhält man einen Zeiger auf den User-Stack zurück, den es für den Fall aufzubewahren gilt, daß wieder mit Super in den User-Modus zurückgeschaltet werden soll. Eine weitere Funktion von Super ist die Abfrage des momentan vorliegenden Modus. Erhält Super den Wert -1L als Parameter, dann gibt sein Ergebnis darüber Aufschluß, in welchem Modus sich der 68000 befindet. Ein Wert von 0 bedeutet in diesem Fall "User-Modus", ein Wert von 1 dagegen "Supervisor-Modus".

Zur Abfrage der GEMDOS-Versionsnummer existiert die Funktion Sversion. Sie liefert das Wort version, das im niederwertigen Byte die Versionsnummer und im höherwertigen Byte die Nummer der Überarbeitung enthält.

Vorausschau

So, daß war jetzt gewissermassen die Pflicht. Das GEMDOS ist nun dokumentiert und in der nächsten Folge der "Programmer's Toolbox" kann mit der Kür, der Programmierung begonnen werden. Zunächst wird dann das Modul ATOM programmiert. Es übernimmt so elementare Aufgaben, wie das Kopieren, das Bewegen und das Löschen von Dateien und bildet daher eine weitere Grundlage bei der Programmierung der Kommandos.

Bis dann,
Dirk Brockhaus



Links

Copyright-Bestimmungen: siehe Über diese Seite
Classic Computer Magazines
[ Join Now | Ring Hub | Random | << Prev | Next >> ]