← ST-Computer 07 / 1986

Das ST-Betriebssystem Teil 4

Grundlagen

GETMPB PUFFER: BLK 12 ; Puffer fĂŒr Parameter Block MOVE.L #PUFFER, -(SP) ; Puffer Adresse in Stack MOVE.W #O, -(SP) ; Funktionsnummer TRAP #13 ADDQ.L #6,SP ; Stack Korrektur

In unserer letzten Folge haben wir das GEMDOS abgeschlossen und werden uns diesesmal mit den BlOS-Routinen beschĂ€ftigen. Wir hatten in unserer ersten Folge erklĂ€rt, daß das Betriebssystem TOS aus drei Modulen besteht: GEMDOS, BIOS und XBIOS. Das GEMDOS bildet das Obergeschoss dieser Triade. Es stĂŒtzt sich auf das BIOS und das XBIOS.

Die Schnittstelle zwischen GEMDOS und den verschiedenen Hardware-Komponenten ist das BIOS. Das BIOS ist verantwortlich fĂŒr die Ein/Ausgabe-Funktionen. Diese Funktionen umfassen die Bildschirmausgabe, Tastatur, Drucker, die RS232 Schnittstelle und die Diskettenoperationen.

Genauso wie bei dem GEMDOS, stehen dem Anwender die verschiedenen Funktionen des BIOS zur VerfĂŒgung. Alle diese Funktionen sind durch einen TRAP-Befehl erreichbar. Wie bei den schon beschriebenen GEMDOS Funktionen werden auch hier diverse Parameter (wenn vorhanden) auf den Stack ĂŒbergeben. FĂŒr den Programmierer ist es auch von Bedeutung zu wissen, daß RĂŒckmeldungen in das Register DO geliefert werden. Genauso werden Dl, D2, AO, Al und A2 fĂŒr verschiedene Zwischenergebnisse benutzt.

Die Funktionen des BIOS sind auch in der Sprache „C“ zu erreichen. Da die genannten Funktionen als Makros vorhanden sind, ist ihre Einbindung in das Betriebssystem problemlos. Als C-Programmierer muß man nur die entsprechenden Parameterlisten richtig einsetzen und die Funktionen durch einen Include-File einbinden.

Wie schon oben erwĂ€hnt wurde, ist fĂŒr die BIOS-Funktion ein TRAP-Vektor reserviert. Der TRAP # 13 ist fĂŒr die BIOS-Funktion verantwortlich.

GETMPB

Die Funktion HOLD MEMORY PARAMETER-BLOCK dient dazu, verschiedene Informationen ĂŒber die aktuelle Speicherverwaltung zu erhalten. In einen 12 Bytes langen Puffer werden verschiedene Adress-Zeiger abgelegt.

Die drei Zeiger sind folgendermaßen aufgebaut:

Byte 0-3
: enthÀlt den Memory free list-Zeiger

Byte 4—7
: enthÀlt den Memory allocated list-Zeiger

Byte 8-12
: enthÀlt den Roving-Zeiger

Jeder dieser Zeiger ist wiederum wie folgt strukturiert:

link
: Zeiger auf nÀchsten Block

Start
: Startadresse des Blocks

length
: Anzahl der Bytes im Block

own
: Process-Descriptor

Bei dem beigelegten Beispiel erhalten wir in diesem 12 Bytes langen Block die folgenden Werte zurĂŒck:

Memory free list
: zeigt auf die Adresse $ 48E

Memory allocated list
: hat einen Wert von 0

Roving Pointer
: zeigt auch auf $ 48E

Ab Adresse $ 48E findet man bei einem ST-520+ folgende Daten:

0 link
SA100 start
SEDF00 length
0 own

BCONSTAT

Diese Funktion liefert den Status eines zeichenorientierten GerĂ€ts. Der Status ist folgendermaßen definiert:

Wert 0
kein Zeichen verfĂŒgbar
Wert -1
mindestens ein Zeichen verfĂŒgbar

Die Funktion BCONSTAT verlangt außerdem einen anderen Parameter. Dieser beinhaltet einen Wert, der den Eingabewert signalisiert.

BCONSTAT START: MOVE.W #2, -(SP) ; Tastatur und Bi dl schirm MOVE.W #1, —(SP) ; Funktionsnummer TRAP «13 ADDQ.U «4,SP ; Stack Korrektur TST dO ; PrĂŒft ob Zeichen schon vorhanden ist. BEO START

ZulÀssige Device-Nummern sind:

0 PRT
: Drucker; Centronics-Schnittstelle

1 AUX
: RS232-Schnittstelle

2 CON
: Tastatur und SichtgerÀt

3 MIDI
: MIDI-Port

4 KBD : Keyboard-Port

Das abgebildete Beispiel prĂŒft, ob ein Zeichen in dem Tastatur-Puffer vorhanden ist. Ist das der Fall, wird das Programm beendet, andernfalls wartet es solange, bis mindestens ein Zeichen bereitsteht.

BCONIN

Diese Funktion verhÀlt sich sehr Àhnlich wie die Funktion CONIN, die wir schon bei der Beschreibung der GEMDOS-Funktionen gesehen haben. Auch hier wird ein Zeichen von einem Eingabewert geholt. Man kann bei dieser Funktion ein zugelassenes GerÀt als Eingabemedium vordefinieren. ZulÀssige Device-Nummern sind die gleichen wie bei der vorherigen Funktion. Die Funktion wartet so lange, bis ein Zeichen vorhanden ist.

War der gewÀhlte Device die Tastatur (Device-Nummer 2), so erhÀlt man im niedrigstwertigen Byte des Ergebnisses den Scancode. In dem unteren Byte des höchstwertigen Wortes wird das ASCII-Zeichen geliefert.

BCONOUT

BCONOUT stellt die umgekehrte Funktion von BCONIN dar. Ein Zeichen wird ĂŒber das gewĂ€hlte GerĂ€t ausgegeben. Üie Funktion wartet so lange, bis das Zeichen ausgegeben wird.

Auch hier gelten die gleichen Device-Nummern wie bei BCONIN.

RWABS

Diese Funktion ermöglicht das Lesen oder Schreiben von logischen Sektoren auf der Diskette oder Harddisk. FĂŒnf Parameter werden hier fĂŒr die einwandfreie AusfĂŒhrung dieser Funktion benötigt.

Der erste Parameter ist eine Device-Nummer, welcher das Laufwerk bestimmt.

BCONIN MOVE.W #2, —(SP) ; Tastatur und Bildschirm MOVE.W #2, —(SP) ; Funktionsnummer TRAP #13 ADDQ.L #4,SP ; Stack Korrektur

BCONOUT

MOVE.W #$72, —(SP) ; Zeichen die ausgegeben wird MOVE.W #0, -(SP) ; Drucker MOVE.W #3, —(SP) ; Funktionsnummer TRAP #13 ADDQ.L #6,SP ; Stack Korrektur

RWABS

Lesen von Sektor:

PUFFER: ELK 512 MOVE.W #0, -(SP) ; Laufwerk A MOVE.W #12,—(SP) ; Begin bei Sektor 12 MOVE.W #1, —(SP) ; 1 Sektor lesen MOVE.L #PUFFER, -(SP) ; Puffer MOVE.W #0, -(SP) ; Lesen MOVE.W #4, —(SP) ; Funktionsnummer TRAP #13 ADD. L #14,SP ; Stack Korrektur 023860 43 4F 4E 43 4E 20 20 20 53 20 20 00 00 00 00 00 CONIN S .... 023070 00 00 00 00 00 00 07 82 F2 00 21 00 70 00 00 00 ..\r.!,z.. 023080 43 4F 4E 4F 55 54 20 20 50 52 47 00 00 00 00 00 COHOUT PRG,.,, 023030 00 00 00 00 00 00 CE 88 F2 00 22 00 25 00 00 00 ...H.r. 023000 43 4F 4E 4F 55 54 20 20 53 20 20 00 00 00 00 00 CONOUT S .... 023080 00 00 00 00 00 00 D4 8B F2 00 23 00 08 01 00 00 .T.r.B.... 0230C0 50 52 43 4E 54 45 52 20 50 52 47 00 00 00 00 00 PRINTER PRG.,., 0230D0 00 00 00 00 00 00 58 7E F2 00 24 00 55 00 00 00 .[~r.$,U.. Schreiben von Sektors PUFFER: BLK 512 MOVE.W #0, —(SP) ; Laufwerk A MOVE.W #15, —(SP) ; Bei Sektor 15 MOVE.W #1, —(SP) ; 1 Sektor schreiben MOVE.L #PUFFER, -(SP) ; Puffer MOVE.W #1, —(SP) ; Schreiben MOVE.W #4, —(SP) ; Funktionsnummer TRAP #13 ADD. L #14,SP ; Stack Korrektur

ZulÀssige Device-Nummern sind:

0 Laufwerk A
1 Laufwerk B
2 Harddisk

Ein zweiter Parameter signalisiert die Sektor-Nummer, bei der die Übertragung beginnen wird. Der nĂ€chste bestimmt die Anzahl von Sektoren, die gelesen oder geschrieben werden sollen.

PUFFER liefert die Adresse eines Puffers, in dem die gelesenen Daten abgespeichert werden bzw. wo die Daten, die auf Diskette geschrieben werden, sich befinden.

Der letzte Parameter ist ein Flag, das den Modus bestimmt. Die verschiedenen Modi haben folgende Bedeutung:

Flag Bedeutung
0 Sektoren nur lesen
1 Sektoren nur schreiben
2 Sektoren lesen, Diskettenwechsel bleibt unbeachtet
3 Sektoren schreiben, Diskettenwechsel bleibt unbeachtet

SETEXEC

Durch diese Funktion ist es möglich, einen Exception-Vektor des 68 000-Prozessors abzufangen oder zu verĂ€ndern. Zwei Parameter sind hier notwendig. Der eine ist die Nummer des Vektors und der andere ist die Adresse des Vektors, der gelesen oder verĂ€ndert werden soll. Will man den Vektor nur lesen, so ĂŒbergibt man statt einer neuen Adresse den Wert —1.

TICKCAL

Durch diese Funktion kann man die Zeit ermitteln, die zwischen zwei System-Timer-Aufrufen (in Millisekunden) vergeht.

GETBPB

Diese Funktion liefert einen Zeiger auf einen Block, wo sich die verschiedenen BlOS-Parameter des angesprochenen Laufwerks befinden. Hier gelten als Device-Nummern 0 fĂŒr Laufwerk A und 1 fĂŒr Laufwerk B.

Der BlOS-Parameter-Block ist wie folgt aufgebaut:

recsiz : Beinhaltet die SektorengrĂ¶ĂŸe in Bytes

clsiz : Beinhaltet ClustergrĂ¶ĂŸe in Sektoren

clsizb : Beinhaltet ClustergrĂ¶ĂŸe in Bytes

rdlen : Beinhaltet DirectorylÀnge in Sektoren

fsiz : Beinhaltet Sektorennummer des zweiten FAT

datrec : Beinhaltet Sektorennummer des ersten Daten-Cluster

numcl : Beinhaltet Anzahl der Daten-Cluster

BCOSTAT

Diese Funktion ermittelt, ob das angesprochene GerĂ€t bereit ist, ein Zeichen auszugeben. Die Device-Nummer des gewĂŒnschten GerĂ€tes wird als Parameter in Stack abgelegt. ZulĂ€ssige Werte fĂŒr Ausgabewerte sind die gleichen wie bei der Funktion BCONSTAT. Wird ein Wert von Null zurĂŒckgegeben, dann bedeutet dies, daß das GerĂ€t nicht in der Lage ist, das Zeichen auszugeben. Das Ergebnis — 1 signalisiert, daß das AusgabegerĂ€t bereit ist, das Zeichen weiterzugeben.

SETEXEC MOVE.L #-1, -(SP) ; Vektor lesen MOVE.W #$100,-(SP) ; Vektor nummer MOVE.W #5, -(SP) ; Funktionsnummer TRAP #13 ADDQ.L #8,SP ; Stack Korrektur Inhalt von Register A0 : A0 = 00000400 % TICKCAL MOVE.W #6, —(SP) ; Funktionsnummer TRAP #13 ADDß.L #2,SP ; Stack Korrektur Inhalt von Register DO : DO = 00000014 Enstpricht 20 mm Sek. GETBPB MOVE.W #1, -(SP) ; Laufwerk B MOVE.W #7, —(SP) ; Funktionsnummer TRAP #13 ADDß.L #4,SP ; Stack Korrektur FĂŒr Laufwerk A liefert die Funktion die Adresse *4DCE FĂŒr Laufwerk B liefert die Funktion die Adresse 44DEE Ab Adresse *4DEE finden Wir folgenden Daten: 004DEE 02 80 80 82 04 08 00 07 08 05 80 06 08 12 01 5F .... Wobei: ÂŁ200 512 SektorqĂ¶ĂŸe in Bytes $2 2 Sektore je Cluster $400 1024 Großes eines Cluster in Bytes $7 7 DirectorylĂ€nge in Sectoren $5 5 FAT GrĂ¶ĂŸe $6 6 Zweites FAT—Sektor $12 18 Erste Daten—Sektor $15F 351 Anzahl der Daten—Sektoren BCOSTAT MOVE.W #0, -(SP) ; Drucker MOVE-W #8, —(SP) ; Funktiansnummer TRAP #13 ADDQ.L #4,SP ; Stack Korrektur Inhalt von Register DO s Falls Drucker bereit ist D0 = FFFFFFFF Falls Drucker nicht bereit ist D0 = 00000000
MEDIACH MOVE.W #0, -(SP) ; Laufwerk A MOVE.W #9, -(SP) ; Funktionsnummer TRAP #13 ADDQ.L #4,SP ; Stack Korrektur DRVMAP MOV/E.W #10, —(SP) ; Funktionsnummer TRAP #13 ADDQ.L #2,SP ; Stack Korrektur KBSHIFT MQVE.W #-1, -(SP) ; Status lesen MOVE.W #11, -(SP) ; Funktionsnummer TRAP #13 ADDQ.L #4,SP ; Stack Korrektur

MEDIACH

Durch diese Funktion ist es möglich, zu erfahren, ob zwischenzeitlich eine Diskette gewechselt wurde oder nicht. Als Parameter wird die Laufwerknummer ĂŒbergeben. Auch hier gilt fĂŒr Laufwerk A die 0 und fĂŒr Laufwerk B eine 1.

Hier können als Ergebnis drei verschiedene Werte auftreten:

0 Diskette wurde nicht gewechselt
1 Diskette könnte gewechselt worden sein
2 Diskette wurde gewechselt DRVMAP

Diese Funktion liefert einen Bitvektor, in dem ein gesetztes Bit signalisiert, welches Laufwerk angeschlossen ist. Bit 0 bedeutet, daß das Laufwerk A angeschlossen ist, Bit 1, daß das Laufwerk B angeschlossen ist, etc.

KBSHIFT

Diese Funktion hilft zur Ermittlung oder VerĂ€nderung der Sondertasten der Tastatur. Bei dem Modus -1 wird der Status gelesen und als Bitvektor zurĂŒckgegeben. Die einzelnen Bitposi-tionen:

0 Rechte Shift-Taste
1 Linke Shift-Taste
2 Control-Taste
3 Alt-Taste
4 CapsLock-Taste
5 Rechter Mausknopf (CLR/HOME)
6 Linker Mausknopf (INSERT)
7 Unbenutzt