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.
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
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.
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 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.
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.
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 |
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.
Durch diese Funktion kann man die Zeit ermitteln, die zwischen zwei System-Timer-Aufrufen (in Millisekunden) vergeht.
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
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.
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
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.
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