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
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