Das ST-Betriebssystem Teil 4

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



Aus: ST-Computer 07 / 1986, Seite 30

Links

Copyright-Bestimmungen: siehe Über diese Seite