Das ST-Betriebssystem

Mittlerweile ist schon bekannt, daß das Betriebssystem des ST-Computer mit CP/M 68k nicht viel gemeinsam hat, sondern eher mit MS-DOS zu vergleichen ist. Ohne Zweifel ist das TOS eines der wichtigsten Betriebssysteme für den 68000er-Rechner. Ob Rechner anderer Hersteller in Zukunft auf dieses System aufbauen werden, hängt nicht zuletzt von dem Erfolgt der ST-Rechner ab.

TOS steht für Tramiel Operating System, nach dem Chef von Atari genannt, und ist von Atari selbst entwickelt worden. In dem Dschungel von Betriebssystemen ist das TOS ein typischer Vertreter von Einplatzsystemen ohne eingebaute Multitaskingfähigkeiten. Das bedeutet, daß der Ablauf von mehrerern Programmen vom Betriebssystem nicht unterstützt wird. Aber bevor wir mit den Einzelheiten des TOS anfangen, werden wir erst einmal kurz allgemein über Betriebssysteme eingehen.

Ein Betriebssystem hat die Aufgabe, verschiedene Geräte eines Rechnersystems so zu organisieren, daß der Anwender von der Ansteuerung der Hardware völlig losgelöst ist. So stellt das Betriebssystem ein organisiertes Gebilde dar und erspart dem Anwender, sich mit den hochtechnischen Problemen seines Rechners auseinanderzusetzen. Die Zusammenarbeit zwischen Rechner und Peripheriegeräten, die Verwaltung des Speichers sowie die Organisation von Dateien usw., sind alles Aufgaben, die vollständig vom Betriebssystem erledigt werden. Beinahe alle Programme, wenn es sich um Textverarbeitungs-, Tabellenkalkulations- oder Buchhaltungs-Programme handelt, benötigen eine Eingabe über Tastatur und müssen die Daten zur weiteren Verarbeitung auf einem externen Massenspeicher sichern. Genauso ist die Darstellung solcher Programme über ein Sichtgerät und/oder einen Drucker notwendig. Das Betriebssystem bietet den eigentlichen - Benutzerprogrammen fertige Routinen zur Bewältigung solcher Aufgaben. So kommt der Anwender solcher Programme mit dem Betriebssystem überhaupt nicht in Berührung.

In der Regel sind moderne Betriebssysteme für Microcomputer in einen sogenannten hardware-abhängigen und einen hardware-unabhängigen Teil aufgeteilt. Das hat den Vorteil, daß, wenn das Betriebssystem auf einem anderen Rechner implementiert werden soll, nur der hardwareabhängige Teil geändert werden muß, um eine Anpassung zu erreichen.

Die GEMDOS Funktionen
$00 TERM
$01 CONIN
$02 CONOUT
$03 AUXIN
$04 AUXOUT
$05 PRINTOUT
$06 RAWCONIO
$07 CONIN WITHOUT ECHO
$08 CONIN WITHOUT ECHO
$09 PLINE
$0A READLINE
$0B CONSTAT
$0E SETDRV
$10 CONOUT STAT
$11 PRTOUT STAT
$12 AUXIN ST AT
$13 AUXOUT STAT
$19 CURRENT DISK
$1A SET DTA
$20 SUPER
$2A GET DATE
$2B SET DATE
$2C GET TIME
$2D SET TIME
$2F GET DTA
$30 GEMDOS NUMBER
$31 KEEP PROCESS
$36 GET DISK FREE SPACE
$39 MKDIR
$3A RMDIR
$3B CHDIR
$3C CREATE
$3D OPEN
$3E CLOSE
$3F READ
$40 WRITE
$41 UNLIK
$42 LSEEK
$43 CHANGE MODE
$45 DUP
$46 FORCE
$47 GETDIR
$48 MALLOC
$49 MFREE
$4A SETBLOCK
$4B EXEC
$4C TERM
$4E SFIRST
$4F SNEXT
$56 RENAME
$57 GSDTOF

Das ST-TOS

Bei den Atari ST Rechnern wurde auch von dem oben genannten Konzept Gebrauch gemacht. So ist das GEMDOS der hardware-unabhängige und das BIOS und das XBIOS der hardware-abhängige Teil. Das GEMDOS enthält wichtige Routinen zur Tastatureingabe, Ausgabe auf dem Bildschirm und Ansteuerung anderer vorhandener Schnittstellen. Das BIOS stellt, wie schon gesagt, den hardwareabhängigen Teil des TOS dar und bildet eine 'Schnittstelle' zwischen GEMDOS und Rechner. Alle Funktionen, die mit der Ein/Ausgabe zu tun haben, werden vom BIOS erledigt. Dies XBIOS ist eine Erweiterung des eigentlichen BIOS und für die Atari ST Rechner spezifisch.

Der Aufruf mittels TRAP-Befehl

Die Funktionen des TOS sind für den Programmierer einfach zu erreichen. Somit ist es möglich die Benutzeroberfläche GEM zu umgehen und Programme zu schreiben, die nur unter TOS arbeiten. Der Aufruf solcher Funktionen wird über den TRAP-Befehl durchgeführt. Dieser Befehl des 68000 Prozessors ist ein 'Softwareinterrupt' und wird, solange kein Fehler vorliegt, sofort ausgeführt. Bei dem TRAP-Befehl wird zuerst das Statusregister sowie der aktuelle Inhalt des Programmcounters in den SupervisorStack gerettet. Anschließend wird die durch den TRAP-Vektor definierte Adresse als neuer Programmcounter geladen und der Prozessor fährt an dieser Adresse mit der Verarbeitung fort.

Bei dem TOS werden erst die Parameter (falls vorhanden), dann die gewünschte Funktionsnummer der gewählten Routine und danach die entsprechende TRAP-Nummer auf dem Stack abgelegt.

Das GEMDOS

Wie schon oben erwähnt wurde, bildet das GEMDOS den hardwareunabhängigen Teil des TOS und ist für die Funktionen der Tastatureingabe, Bildschirmdarstellung sowie das File-Handling zuständig. Die Funktionen des GEMDOS werden durch die TRAP-Nummer 1 aufgerufen. Der Aufruf sieht folgendermaßen aus: Erst werden die Parameter auf den Stack (sp) abgelegt, dann die Funktionsnummer, und anschließend wird die Funktion durch den Befehl TRAP # 1 ausgeführt. Nach der Funktionsausführung muß eine sogenannte Korrektur des Stacks vorgenommen werden.

Die Funktionen des GEMDOS

Das GEMDOS hat insgesamt 51 Funktionen, und diese alle in einer Ausgabe zu beschreiben, würde zu viel Platz beanspruchen. Deswegen wird die Beschreibung der Funktionen auf mehrere Ausgaben verteilt. Wir werden uns bemühen, bei den meisten Funktionen ein kleines Beispiel anzugeben, wenn wir dies für sinnvoll halten.

$00 TERM

Bei dem Aufruf dieser Funktion wird das momentan laufende Programm beendet und kehrt an dasjenige Programm zurück, von dem aus es gestartet wurde. Ein solches Programm, das vom Desktop gestartet wurde und nach Aufruf der Term-Funktion zurück in den Desktop kehrt, ist zum Beispiel ein sogenanntes Applikations-Programm.

CLR. W - (SP)
TRAP # 1

$01 CONIN

Durch CONIN wird ein Zeichen über die Tastatur geholt. Das Programm wartet, bis ein Zeichen zur Verfügung steht. Das geholte Zeichen steht im Datenregister D0, wobei das untere Byte des Low Words den ASCII-Code und das untere Byte den High Words den sogenannten Scan-Code der gedrückten Tasten enthalten.

       CONIN
MOVE.W #1,-(SP) ;Funktionsnummer
TRAP   #1       ;GEMDOS Aufrufen
ADDQ.L #2,SP    ;Stack Korrektur
CLR    -(SP)
TRAP   #1
END.

Inhalt von Register D0 nach Betätigung von BACKSPACE:
D0 = 000E 0008

$02 CONOUT

CONOUT erlaubt, Zeichen auf dem Bildschirm darzustellen. Der ASCII-Code des darzustellenden Zeichens wird auf dem Stack abgelegt und dann die Funktion aufgerufen.

             CONOUT
      MOVE.B #9,D1     ;Anfangswert für Schleife
Loop: MOVEW  #67,-(SP) ;Zeichen 'C'
      MOVEW  #2,-(SP)  ;Funktionsnummer
      TRAP   #1        ;GEMDOS Aufrufen
      ADDQ.L #4,SP     ;Stack Korrektur
      SUBQ   #1,D1     ;Dekrementiert D1
      CMP    #0,D1     ;Ist D1 gleich 0?
      BNE    Loop
      CLR    -(SP)
      TRAP   #1
      END.

$03 AUXIN

Durch Auxiliary Input liest der Rechner ein Zeichen über die RS 232 Schnittstelle ein. Die Funktion ist beendet, wenn ein vollständiges Zeichen empfangen wurde. Auch hier steht das Zeichen anschließend in dem unteren Byte des Low Words des Datenregisters D0.

$04 AUXOUT

AUXOUT bildet das Gegenstück von AUXIN, und dadurch wird ein Zeichen über die RS 232 Schnittstelle gesendet. Man sollte die oberen Byte vor Sendung eines Zeichens löschen.

$05 PRINTER OUTPUT

Diese Funktion gibt Daten auf einen Drucker über die Centronics-Schnittstelle aus. Bei einer gelungenen Ausgabe (angeschlossener und eingeschalteter Drucker steht im Register D0 der Wert -1. Falls nach ungefähr 30 Sekunden keine Bestätigung erfolgt, daß das Zeichen angekommen ist (OFF LINE), so enthält das Register D0 eine Null.

       PRINT OUT
MOVEW  #65,-(SP) ;Zeichen das gedruckt wird
MOVEW  #5,-(SP)  ;Funktionsnummer
TRAP   #1        ;GEMDOS Aufrufen
ADDQ.L #4,SP     ;Stack Korrektur
CLR    -(SP) 
TRAP   #1
END.

$06 RAWCONIO

RAWCONIO ist eine Funktion, die das Übernehmen von Zeichen von der Tastatur und seine Darstellung auf dein Bildschirm ermöglicht. Um die Funktion überhaupt zu starten, wird der Stack zuerst mit dem Wert $FF geladen und dann die Funktion aufgerufen. Die Eingabe erfolgt wie bei der schon besprochenen CONIN-Funktion. Scansowie ASCII-Code werden ins Register D0 übergeben. Ein anderer Wert als $FF wird als Zeichen interpretiert und auf dem Bildschirm dargestellt.

              RAWCONIO
Start: MOVEW  #$FF,-(SP) ;Prüft Tastatur
       MOVE.W #6,-(SP)   ;Funktionsnummer
       TRAP   #1         ;GEMDOS Aufrufen
       ADDQ.L #4,SP      ;Stack Korrektur
       TST.W  D0         ;Zeichen eingetroffen?
       BEQ    Start      ;Wenn nicht.'Start'
       CMP.B  #13,D0     ;Wenn RETURN Eingabe beendet
       BEQ    End
       MOVE.B D0,-(SP)   ;Inhalt von D0 in Stack 
       MOVE.W #6,-(SP)   ;RAWCONIO
       TRAP   #1         ;GEMDOS
       ADDQ.L #4,SP      ;Stack Korrektur
       BRA    Start
End:   CLR    -(SP)
       TRAP   #1
       END.

$07 DIRCONIN

Diese Funktion ist der Funktion CONIN sehr ähnlich. Der Unterschied liegt nur darin, daß das eingelesene Zeichen nicht auf dem Bildschirm dargestellt wird. Hier ein Beispiel, das auf die Eingabe von RETURN wartet:

WARTE:
    MOVE.W #7,-   (SP)
    TRAP   #1
    ADDQ.L #2,     SP
    CMP    #13,    D0
    BNE    WARTE
    CLR    -       (SP)
    TRAP   #1
    END

$08 CONIN WITHOUT ECHO

Diese Funktion unterscheidet sich nicht von der oben beschriebenen $07-Funktion. Die einzige Erklärung ist, daß diese Funktion auch bei MSDOS vorhanden ist.

$09 PLINE

Wir haben schon oben bei der Funktion CONOUT die einfache Form, ein Zeichen auf den Bildschirm auszugeben, besprochen. PRINT LINE bietet eine sehr komfortable Art, Strings auszugeben. Betrachten wir das nächste Beispiel:

        PRINT LINE
DC.B    "* * * * * * * ST Computer * * * *" 
DC.B    13,10,13,10,13,10,0
MOVE.L  #Tab,-(SP)
MOVE.W  #9,-(SP)   ;Funktionsnummer
TRAP    #1         ;GEMDOS Aufrufen
ADDQ.L  #6,SP      ;Stack Korrektur
CLR     -(SP)
TRAP    #1
END.

$0A RLINE

READ LINE bildet eine sehr einfache und bequeme Eingabe von Zeichen über die Tastatur. Die Zeichen werden unmittelbar auf dem Bildschirm dargestellt. Die Zeichen werden in einen 'Eingabe-Puffer' übergeben, dessen Adresse zuerst als Parameter in Stack abgelegt sein muß. Das erste Byte enthält die maximale Länge des Puffers. In das zweite Byte wird die Anzahl der eingegebenen Zeichen nach Beendung der Eingabe geschrieben. Control Zeichen wie Control-H (BACKSPACE) oder Control-C (beendet Programm) werden erkannt. Nicht aber die Escape-Sequenzen.

$OB CONSTAT

Die über die Tastatur eingegebenen Zeichen werden zunächst in einen vom Betriebssystem reservierten Puffer untergebracht. Der Puffer ist 64 Bytes groß. Somit kann eine Prüfung der Tastatur stattfinden. Ein Wert von $FFFF in Register D0 signalisiert, daß Zeichen vorhanden sind. Ansonsten wird eine Null in das Register geschrieben.

$0E SETDRV

Mit SET DRIVE kann man das aktuelle Laufwerk mit einer bestimmten Nummer anmelden. Bei einer Null als Parameter wird das Laufwerk A und bei einer Eins das Laufwerk B zugewiesen.

            SET DRIVE
    MOVEW   #1,-(SP)  ;Funktionsparameter 
    MOVEW   #$E,-(SP) ;Funktionsnummer
    TRAP    #1        ;GEMDOS Aufrufen
    ADDQ.1  #4,SP     ;Stack Korrektur
    CLR     -(SP)
    TRAP    #1
    END.

Inhalt von Register D0
D0 = 0000 000B

$10 CONOUT STAT

Diese Funktion prüft den Console-Status. Ist nach dem Aufruf von CONOUT STAT ein Wert von $FFFF in Register D0 enthalten, kann ein Zeichen auf dem Bildschirm dargestellt werden. Ist aber eine Null im Register, so ist auf dem Sichtgerät keine Ausgabe möglich.

           CON STAT
    MOVEW  #$10,-(SP) ;Funktionsnummer
    TRAP   #1         ;GEMDOS Aufrufen
    ADDQ.L #2,SP      ;Stack Korrektur
    CLR    -(SP)
    TRAP   #1
    END.

Inhalt von Register D0:
D0 = FFFF FFFF

$11 PRTOUT STAT

PRINTER OUT STAT liefert den Status eines angeschlossenen Druckers. Ist der Drucker betriebsbereit (eingeschaltet, ON LINE), wird in Register D0 $FFFF geschrieben. Ist jedoch der Drucker nicht empfangsbereit, wird ein Wert Null zurückgegeben.

            PRTOUT STAT
    MOVEW   #$11,-(SP)   ;Funktionsnummer
    TRAP    #1           ;GEMDOS Aufrufen
    ADDQ.L  #2,SP        ;Stack Korrektur
    CLR     -(SP)
    TRAP    #1
END.

Inhalt von Register D0, bei einem angeschlossenen 
Drucker: D0 = FFFF FFFF

$12 AUXIN STAT

Nach dem Aufruf dieser Funktion wird signalisiert, ob ein Zeichen über die RS 232 Schnittstelle zur Verfügung steht. Wie bei den anderen Funktionen ist auch hier der entsprechende Wert, ob ein Zeichen vorhanden ist, in Register D0 enthalten.

$13 AUXOUT STAT

AUXOUT STAT bildet das Gegenstück der AUXIN-Funktion. Dadurch wird ermittelt, ob die RS 232 sendebereit ist oder nicht. Ein Wert gleich $FFFF in Register D0 bedeutet, daß die Schnittstelle in der Lage ist, ein Zeichen zu senden.

$19 CURRENT DISK

Diese Funktion ermittelt die Nummer des aktuellen Laufwerks. Nach dem Aufruf erhält man in Register D0 die Nummer des aktiven Laufwerks zurück. Wie bei SET DRIVE entspricht eine Null Laufwerk A und eine Eins Laufwerk B.

    CURRENT DISK

    MOVEW   #$19,-(SP) 
    TRAP    #1 
    ADDQ.L  #2,SP
    CLR     -(SP) 
    TRAP    #1
    END.

Inhalt von Register D0 wenn Laufwerk 'A' angemeldet ist: 
DO = 0000 000A

Fortsetzung folgt



Aus: ST-Computer 04 / 1986, Seite 25

Links

Copyright-Bestimmungen: siehe Über diese Seite