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



Links

Copyright-Bestimmungen: siehe Über diese Seite
Classic Computer Magazines
[ Join Now | Ring Hub | Random | << Prev | Next >> ]