HomeBIOSBIOSDie Ein-/Ausgabekanäle des BIOS

3.1 Das 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:

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 !

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

3.1.1 bios-Trap

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

3.1.2 Bconin

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

3.1.2.1 Bindings für Bconin

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

3.1.3 Bconout

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

3.1.3.1 Bindings für Bconout

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

3.1.4 Bconstat

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

3.1.4.1 Bindings für Bconstat

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

3.1.5 Bcostat

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

3.1.5.1 Bindings für Bcostat

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

3.1.6 Drvmap

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

3.1.6.1 Bindings für Drvmap

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)

3.1.7 Getbpb

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

3.1.7.1 Bindings für Getbpb

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

3.1.8 Getmpb

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

3.1.8.1 Bindings für Getmpb

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

3.1.9 Kbshift

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

3.1.10 Bindings für Kbshift

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

3.1.11 Mediach

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

3.1.11.1 Bindings für Mediach

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

3.1.12 Rwabs

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 Zeichen 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 AHDI-3.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

3.1.12.1 Bindings für Rwabs

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

3.1.13 Setexc

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

3.1.13.1 Bindings für Setexc

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

3.1.14 Tickcal

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

3.1.14.1 Bindings für Tickcal

C: LONG Tickcal ( VOID );
Assembler:
move.w    #6,-(sp)     ; Offset 0
trap      #13          ; BIOS aufrufen
addq.l    #2,sp        ; Stack korrigieren

HomeBIOSBIOSDie Ein-/Ausgabekanäle des BIOS