BIOS
BIOS
Die Ein-/Ausgabekanäle des BIOS
Die BIOS-Funktionen stellen die unterste Schnittstelle des
Betriebssystems zur Hardware des Atari dar, und werden über den
680X0-Trap#13 aufgerufen. Diese Funktionen sollten möglichst nicht
von Applikationsprogrammen verwendet werden, da wesentlich
leistungsfähigere Funktionen auf höherer Ebene als bessere
Alternative verfügbar sind. Insgesamt sind die folgenden Funktionen
verfügbar:
• Bconin |
Zeichen von Eingabegerät einlesen.
|
• Bconout |
Zeichen auf Ausgabegerät ausgeben.
|
• Bconstat |
Status eines Eingabegeräts ermitteln.
|
• Bcostat |
Status eines Ausgabegeräts ermitteln.
|
• Drvmap |
Angeschlossene Laufwerke ermitteln.
|
• Getbpb |
BIOS-Parameterblock eines Geräts ermitteln.
|
• Getmpb |
Speicherparameterblock ermitteln.
|
• Kbshift |
Tastaturstatus ermitteln.
|
• Mediach |
Ermitteln, ob die Diskette gewechselt wurde.
|
• Rwabs |
Sektoren auf Laufwerken lesen und schreiben.
|
• Setexc |
Exceptionvektoren ermitteln und festlegen.
|
• Tickcal |
Timer-Konstante ermitteln.
|
Das BIOS ist in MagiC reentrant. Das heißt, diese Funktionen
können (solange der jeweilge Supervisorstack nicht überläuft...)
auch aus Interrupts mehrfach aufgerufen werden.
Hinweis:
Die <saveptr_area> des BIOS ist (aus
Kompatiblitätsgründen) noch vorhanden, wird jedoch vom System nicht
benutzt.
Die Stacküberprüfung von Turbo C/Pure-C wird bei Routinen
versagen, die im Supervisor-Modus ausgeführt werden (unter TOS konnte
das bisher nur bei USERDEF-Routinen im AES, die ebenfalls im
Supervisor-Modus ausgeführt werden, passieren).
Falls Sie eigene Routinen ins BIOS hängen, dann achten Sie
darauf, diese voll reentrant zu gestalten. Machen Sie keine Annahmen
über den Inhalt der <saveptr_area> !
Das BIOS nimmt seine Parameter auf dem Stack entgegen; dabei
wird das letzte Argument aus der Parameterliste als erstes auf dem
Stack abgelegt. Funktionsergebnisse werden im Prozessorregister d0
zurückgeliefert. Nur die Register d3-d7 und a3-a7 werden gerettet,
alle anderen können durch den Aufruf verändert werden.
Querverweis: GEMDOS XBIOS Reset-Vektor VT-52-Terminal
Name: |
»bios« - Bios-Trap ausführen.
|
Deklaration: |
LONG bios ( VOID, ... );
|
Beschreibung: |
Die Routine bios führt einen TRAP #13 durch. Die übergebenen
Parameter hängen von der jeweiligen BIOS- Funktion ab.
|
Ergebnis: |
Die Funktion liefert als Ergebnis einen Wert vom Datentyp LONG.
|
Querverweis: |
gemdos xbios BIOS Dispatcher
|
Name: |
»Bios console input« - Zeichen einlesen.
|
Biosnummer: |
2
|
Deklaration: |
int32_t Bconin ( int16_t dev );
|
Beschreibung: |
Die BIOS-Routine Bconin liest ein Zeichen von einem
Peripheriegerät ein. Für dev können folgende Geräte
angegeben werden:
dev |
Bedeutung |
0 |
prn: (Drucker) |
1 |
aux: (serielle Schnittstelle) |
2 |
con: (Console) |
3 |
MIDI-Schnittstelle |
4 |
intelligente Tastatur |
5 |
Bildschirm |
6 |
ST kompatible RS232-Port (Modem 1) |
7 |
SCC Kanal B (Modem 2) |
8 |
TTMFP serial Port (Modem 3) |
9 |
SCC Kanal A (Modem 4) |
Dabei sind Gerätenummern ab 6 erst ab dem TOS030 des Atari-TT
verfügbar. Eine falsche Angabe für dev kann zum Absturz des
Systems führen.
|
Ergebnis: |
Die Funktion liefert als Ergebnis das eingelesene Zeichen in
den Bits 0..7 zurück. Beim Lesen von der Console enthalten die Bits
16 bis 23 den Scancode der betreffenden Taste. Ist zusätzlich das
entsprechende Bit der Systemvariablen conterm gesetzt, so befindet
sich in den Bits 24 bis 31 der aktuelle Wert von Kbshift.
|
Verfügbar: |
In allen TOS Versionen.
|
Querverweis: |
Binding Bconout Keytbl Bconmap
|
C: |
int32_t Bconin ( int16_t dev );
|
Assembler: |
move.w dev,-(sp) ; Offset 2
move.w #2,-(sp) ; Offset 0
trap #13 ; BIOS aufrufen
addq.l #4,sp ; Stack korrigieren
|
Name: |
»Bios console output« - Zeichen ausgeben.
|
Biosnummer: |
3
|
Deklaration: |
VOID Bconout ( int16_t dev, int16_t c );
|
Beschreibung: |
Die BIOS-Routine Bconout schreibt das Zeichen c auf das
Peripheriegerät dev. Als dev können folgende Geräte
angegeben werden:
dev |
Bedeutung |
0 |
prn: (Drucker) |
1 |
aux: (serielle Schnittstelle) |
2 |
con: (Console, VT-52-Terminal) |
3 |
MIDI-Schnittstelle |
4 |
intelligente Tastatur |
5 |
Bildschirm |
6 |
ST kompatible RS232-Port (Modem 1) |
7 |
SCC Kanal B (Modem 2) |
8 |
TTMFP serial Port (Modem 3) |
9 |
SCC Kanal A (Modem 4) |
Dabei sind Gerätenummern ab 6 erst ab dem TOS030 des Atari-TT
verfügbar.
Hinweis: Die Funktion kehrt erst dann zurück, wenn das
Zeichen tatsächlich auf dem jeweiligen Gerät ausgegeben wurde. Eine
falsche Angabe für dev kann zum Absturz des Systems führen.
Sämtliche Codes von 0x00 bis 0xFF werden beim Zeichen c als
druckbare Zeichen interpretiert. Die Ausgabe über (5) ist übrigens
schneller als die über (2), da die VT-52 Sequenzen nicht ausgewertet
werden müssen.
|
Ergebnis: |
Die Funktion liefert kein Ergebnis.
|
Verfügbar: |
In allen TOS Versionen.
|
Querverweis: |
Binding Bconin Bconstat Bconmap
|
C: |
VOID Bconout ( int16_t dev, int16_t c );
|
Assembler: |
move.w c,-(sp) ; Offset 4
move.w dev,-(sp) ; Offset 2
move.w #3,-(sp) ; Offset 0
trap #13 ; BIOS aufrufen
addq.l #6,sp ; Stack korrigieren
|
Name: |
»Bios console status« - Eingabestatus eines
Peripheriegerätes ermitteln.
|
Biosnummer: |
1
|
Deklaration: |
int16_t Bconstat ( int16_t dev );
|
Beschreibung: |
Die BIOS-Routine Bconstat ermittelt den Eingabestatus eines
Standardperipheriegerätes dev. Als dev können folgende
Geräte angegeben werden:
dev |
Bedeutung |
0 |
prn: (Drucker) |
1 |
aux: (serielle Schnittstelle) |
2 |
con: (Console) |
3 |
MIDI-Schnittstelle |
4 |
intelligente Tastatur |
5 |
Bildschirm |
6 |
ST kompatible RS232-Port (Modem 1) |
7 |
SCC Kanal B (Modem 2) |
8 |
TTMFP serial Port (Modem 3) |
9 |
SCC Kanal A (Modem 4) |
Dabei sind Gerätenummern ab 6 erst ab dem TOS030 des Atari-TT
verfügbar. Eine falsche Angabe für dev kann zum Absturz des
Systems führen.
|
Ergebnis: |
Die Funktion liefert als Ergebnis -1, wenn Zeichen im Puffer
liegen und 0, wenn dies nicht der Fall ist.
|
Verfügbar: |
In allen TOS Versionen.
|
Querverweis: |
Binding Bconin Bconout Bconmap
|
C: |
int16_t Bconstat ( int16_t dev );
|
Assembler: |
move.w dev,-(sp) ; Offset 2
move.w #1,-(sp) ; Offset 0
trap #13 ; BIOS aufrufen
addq.l #4,sp ; Stack korrigieren
|
Name: |
»Bios output status« - Status eines Standardausgabegerätes
ermitteln.
|
Biosnummer: |
8
|
Deklaration: |
int32_t Bcostat ( int16_t dev );
|
Beschreibung: |
Die BIOS-Routine Bcostat ermittelt den Status eines
Standardausgabegerätes dev. Als dev können am Atari folgende
Geräte angegeben werden.
dev |
Bedeutung |
0 |
prn: (Drucker) |
1 |
aux: (serielle Schnittstelle) |
2 |
con: (Console) |
3 |
intelligente Tastatur |
4 |
MIDI-Schnittstelle |
5 |
Bildschirm |
6 |
ST kompatible RS232-Port (Modem 1) |
7 |
SCC Kanal B (Modem 2) |
8 |
TTMFP serial Port (Modem 3) |
9 |
SCC Kanal A (Modem 4) |
Dabei sind Gerätenummern ab 6 erst ab dem TOS030 des Atari-TT
verfügbar.
Hinweis: Die Vertauschung der MIDI-Schnittstelle und der
intelligenten Tastatur gegenüber den anderen BIOS-Funktionen wird
lt. Atari aus Kompatibilitätsgründen beibehalten.
|
Ergebnis: |
Die Funktion liefert als Ergebnis den Status des
Ausgabegeräts, nämlich -1, wenn Zeichen geschrieben werden können,
und 0, wenn der Puffer voll ist.
|
Verfügbar: |
In allen TOS Versionen.
|
Querverweis: |
Binding Bconout Bconmap
|
C: |
int32_t Bcostat ( int16_t dev );
|
Assembler: |
move.w dev,-(sp) ; Offset 2
move.w #8,-(sp) ; Offset 0
trap #13 ; BIOS aufrufen
addq.l #4,sp ; Stack korrigieren
|
Name: |
»drive map« - ermittelt die angeschlossenen Laufwerke.
|
Biosnummer: |
10
|
Deklaration: |
int32_t Drvmap ( VOID );
|
Beschreibung: |
Die BIOS-Routine Drvmap ermittelt die angeschlossenen
Laufwerke. Für jedes angeschlossene Laufwerk wird ein Bit gesetzt. Es
gilt:
Bit 0: |
Laufwerk A
|
Bit 1: |
Laufwerk B usw. (maximal 32 Geräte möglich)
|
Hinweis: Die Funktion liefert den Inhalt der
Systemvariablen _drvbits zurück. Um festzustellen, welche Laufwerke
dem GEMDOS bekannt sind, muß die Funktion Dsetdrv benutzt werden.
|
Ergebnis: |
Die Funktion liefert als Ergebnis einen Bitvektor für die
angeschlossenen Laufwerke.
|
Verfügbar: |
In allen TOS Versionen.
|
Querverweis: |
Binding Dsetdrv
|
C: |
int32_t Drvmap ( VOID );
|
Assembler: |
move.w #$A,-(sp) ; Offset 0
trap #13 ; BIOS aufrufen
addq.l #2,sp ; Stack korrigieren
|
GFA-Basic: |
Fehler%=Bios(10)
|
Name: |
»Get Bios parameter block« - Bios-Parameterblock eines
Gerätes ermitteln.
|
Biosnummer: |
7
|
Deklaration: |
BPB *Getbpb ( int16_t dev );
|
Beschreibung: |
Die BIOS-Routine Getbpb ermittelt den BIOS-Parameterblock des
Geräts dev, das wie folgt codiert wird:
dev |
Bedeutung |
0 |
Laufwerk A |
1 |
Laufwerk B |
2 |
Laufwerk C |
Die weiteren Laufwerke ergeben sich analog. Durch den Aufruf
dieser Funktion wird der Mediachange-Status im BIOS zurückgesetzt.
|
Ergebnis: |
Die Funktion liefert als Ergebnis die Adresse des
BIOS-Parameterblocks.
|
Verfügbar: |
In allen TOS Versionen.
|
Querverweis: |
Binding Getmpb
|
C: |
BPB *Getbpb ( int16_t dev );
|
Assembler: |
move.w dev,-(sp) ; Offset 2
move.w #7,-(sp) ; Offset 0
trap #13 ; BIOS aufrufen
addq.l #4,sp ; Stack korrigieren
|
GFA-Basic: |
Fehler%=Bios(7,W:dev%)
|
Name: |
»Get memory parameter block« - Speicherparameter-Block
kopieren.
|
Biosnummer: |
0
|
Binding: |
VOID Getmpb ( MPB *ptr );
|
Beschreibung: |
Die BIOS-Routine Getmpb dient zur Initialisierung der
Speicherverwaltung und wird beim Systemstart vom GEMDOS aufgerufen, um
die Ursprungs-TPA zu erzeugen. Danach darf Getmbp nicht mehr
benutzt werden.
|
Ergebnis: |
Die Funktion liefert kein Ergebnis.
|
Verfügbar: |
In allen TOS Versionen.
|
Querverweis: |
Binding Getbpb Programmstart und TPA
|
C: |
VOID Getmpb ( MPB *ptr );
|
Assembler: |
pea ptr ; Offset 2
move.w #0,-(sp) ; Offset 0
trap #13 ; BIOS aufrufen
addq.l #6,sp ; Stack korrigieren
|
Name: |
»keyboard shift status« - ermittelt oder ändert den Status
der Spezial-Tasten.
|
Biosnummer: |
11
|
Deklaration: |
int32_t Kbshift ( int16_t mode );
|
Description: |
Die BIOS-Routine Kbshift ermittelt oder ändert den aktuellen
Tastatur-Status. Wenn mode negativ ist, wird der Status
lediglich ermittelt. Wenn mode 0 oder größer 0 ist, dann
wird der entsprechende Status neu gesetzt. Die einzelnen Bits sind wie
folgt definiert:
Bit |
Bedeutung |
0 |
Shift-Taste rechts |
1 |
Shift-Taste links |
2 |
Control-Taste |
3 |
Alternate-Taste |
4 |
Caps Lock |
5 |
Maustaste rechts |
6 |
Maustaste links |
7 |
Alt Gr ab TOS 4.06 im Milan |
Hinweis: Die Funktion fragt lediglich eine interne
Systemvariable des BIOS ab, deren Adresse ggfs. per _sysbase
berechnet werden kann.
Bei TOS 1.0 befindet sich diese Systemvaribale an der Adresse
0xE1B.
|
Ergebnis: |
Die Funktion liefert als Ergebnis den gesetzten
Tastatur-Status.
|
Verfügbar: |
In allen TOS Versionen.
|
Querverweis: |
Binding
|
C: |
int32_t Kbshift ( int16_t mode );
|
Assembler: |
move.w mode,-(sp) ; Offset 2
move.w #$B,-(sp) ; Offset 0
trap #13 ; BIOS aufrufen
addq.l #4,sp ; Stack korrigieren
|
Name: |
»media change« - stellt fest ob der Datenträger gewechselt
wurde.
|
Biosnummer: |
9
|
Deklaration: |
int32_t Mediach ( int16_t dev );
|
Beschreibung: |
Die BIOS-Routine Mediach stellt fest, ob der Datenträger auf
dem Gerät dev gewechselt wurde. Es gilt:
dev |
= 0 |
(Laufwerk-A) |
|
= 1 |
(Laufwerk-B) |
|
= 2 |
(Laufwerk-C, weitere Laufwerke analog) |
Hinweis: Man sollte niemals davon ausgehen, daß ein
Gerät nicht gewechselt werden kann (Wechselplatte, CD-ROM,
Diskettenlaufwerk, ...). Die Erkennung eines Diskettenwechsels
funktioniert i.a. nur dann zuverlässig, wenn die Diskette nicht
schreibgeschützt ist. Außerdem sollte darauf geachtet werden, daß
beim Formatieren einer Diskette unterschiedliche Seriennummern
vergeben werden.
|
Ergebnis: |
Die Funktion liefert als Ergebnis einen Integer-Wert mit
folgender Bedeutung:
Wert |
Bedeutung |
0 |
Diskette wurde nicht gewechselt. |
1 |
Diskette wurde vielleicht gewechselt. |
2 |
Diskette wurde gewechselt. |
|
Verfügbar: |
In allen TOS Versionen.
|
Querverweis: |
Binding Flopfmt Protobt
|
C: |
int32_t Mediach ( int16_t dev );
|
Assembler: |
move.w dev,-(sp) ; Offset 2
move.w #9,-(sp) ; Offset 0
trap #13 ; BIOS aufrufen
addq.l #4,sp ; Stack korrigieren
|
GFA-Basic: |
Fehler%=Bios(9,W:dev%)
|
Name: |
»read write absolute« - direkter Lese-/Schreibzugriff auf ein
Laufwerk.
|
Biosnummer: |
4
|
Deklaration: |
int32_t Rwabs ( int16_t rwflag, VOID *buff, int16_t cnt,
int16_t recnr, int16_t dev, int32_t lrecno );
|
Beschreibung: |
Die BIOS-Routine Rwabs liest oder schreibt Daten direkt vom
bzw. auf das Laufwerk, das mit dev angegeben wurde. Der
Parameter rwflag ist ein Bitvektor, der die Art der Operation
festlegt. Es gilt:
rwflag-Bit |
Bedeutung
|
0 |
0 = Lesen
1 = Schreiben
|
1 |
0 = Medienwechsel beachten
1 = Medienwechsel ignorieren
|
2 |
0 = Im Fehlerfall eine Wiederholung starten
1 = keine Wiederholung starten.
Hierzu ist ein Festplattentreiber notwendig, der zu AHDI 3.0
kompatibel ist.
|
3 |
0 = Normalmodus
1 = physikalischer Modus (1)
Hierzu ist ein Festplattentreiber notwendig, der zu AHDI 3.0
kompatibel ist.
|
Es werden cnt Sektoren vom Puffer buff
übertragen. In recnr wird der Startsektor auf dem Laufwerk angegeben.
lrecno wird nur benutzt, wenn recnr den Wert -1
besitzt, und ein AHDI3.0 kompatibler Festplattentreiber zur Verfügung steht.
|
Ergebnis: |
Die Funktion liefert als Ergebnis eine 0, wenn der Zugriff
erfolgreich war, ansonsten eine negative Zahl.
|
Verfügbar: |
In allen TOS Versionen.
|
Querverweis: |
Binding
|
C: |
int32_t Rwabs ( int16_t rwflag, VOID *buff, int16_t cnt,
int16_t recnr, int16_t dev, int32_t lrecno );
|
Assembler: |
move.l lrecno,-(sp) ; Offset 14
move.w dev,-(sp) ; Offset 12
move.w recnr,-(sp) ; Offset 10
move.w cnt,-(sp) ; Offset 8
pea buff ; Offset 4
move.w rwflag,-(sp) ; Offset 2
move.w #4,-(sp) ; Offset 0
trap #13 ; BIOS aufrufen
lea $12(sp),sp ; Stack korrigieren
|
GFA-Basic: |
Fehler%=Bios(4,W:rwflag%,L:buff%,W:cnt%,W:recnr%,W:dev%,L:lrecno%)
|
Name: |
»set exception vector« - Interrupt-Vektoren setzen.
|
Biosnummer: |
5
|
Deklaration: |
int32_t Setexc ( int16_t number, VOID (*vec)() );
|
Beschreibung: |
Die BIOS-Routine Setexc setzt oder liest die Inhalte von
Exception-Vektoren. Es gilt:
Parameter |
Bedeutung |
number |
Nummer des Exception-Vektors |
vec |
neue Adresse (oder -1) |
Hinweis: Besitzt der Parameter vec den Wert -1
so wird kein neuer Vektor gesetzt, sondern lediglich die alte
Vektoradresse ausgelesen.
Die Nummer des zu setzenden Exception-Vektors ist übrigens
identisch mit der zu setzenden Adresse, dividiert durch den Wert 4.
|
Ergebnis: |
Die Funktion liefert den bisherigen (bzw. aktuellen) Wert des
Vektors zurück.
|
Verfügbar: |
In allen TOS Versionen.
|
Querverweis: |
Binding Systemvariablen Systemvektoren
|
C: |
int32_t Setexc ( int16_t number, VOID (*vec)() );
|
Assembler: |
pea exchdlr ; Offset 4
move.w number,-(sp) ; Offset 2
move.w #5,-(sp) ; Offset 0
trap #13 ; BIOS aufrufen
addq.l #8,sp ; Stack korrigieren
|
Name: |
»tick calculation« - Zeitdifferenz zwischen zwei
Timeraufrufen ermitteln.
|
Biosnummer: |
6
|
Deklaration: |
int32_t Tickcal ( void );
|
Beschreibung: |
Die BIOS-Routine Tickcal liefert die Anzahl an Millisekunden,
die zwischen zwei Aufrufen des Systemtimers verstreichen.
Hinweis: Die Funktion greift dazu auf die _timr_ms
Systemvariable zurück.
|
Ergebnis: |
Anzahl der entsprechenden Millisekunden.
|
Verfügbar: |
In allen TOS Versionen.
|
Querverweis: |
Binding Systemvariablen
|
C: |
LONG Tickcal ( VOID );
|
Assembler: |
move.w #6,-(sp) ; Offset 0
trap #13 ; BIOS aufrufen
addq.l #2,sp ; Stack korrigieren
|
BIOS
BIOS
Die Ein-/Ausgabekanäle des BIOS