HomeXBIOSPCI-BIOSSoundroutinen

4.16 Schnittstellenprogrammierung

Bconmap Auswählen einer seriellen Schnittstelle.
Dosound Soundgenerator programmieren.
ExtRsConf Konfiguration der RS232/RS485-Schnittstelle
Giaccess Register des GI-Soundchips lesen und schreiben.
Ikbdws Programmierung des Tastatur-Chips.
Iorec Interruptpuffer für RS232, Tastatur-Chip und MIDI-Schnittstelle abfragen.
Kbdvbase Puffer und Interruptvektoren für Maus-, MIDI- und Tastaturschnittstelle abfragen.
Mfpint Programmierung des Multifunktionsperipherie-Chips.
Midiws Strings lesen und schreiben auf MIDI-Schnittstelle.
Offgibit Bit im Port A-Register des GI-Chips löschen.
Ongibit Bit im Port A-Register des GI-Chips setzen.
Rsconf Konfiguration der RS232-Schnittstelle.

Querverweis: Interruptfunktionen

4.16.1 Bconmap

Name: »Select serial port« - wählt eine Default-Schnittstelle aus.
Xbiosnummer: 44
Deklaration: int32_t Bconmap( int16_t devno );
Beschreibung: Die XBIOS-Routine Bconmap wählt eine der seriellen Schnittstellen für die Biosausgabe aus. Darüber hinaus kann ein Zeiger auf die BCONMAP-Struktur abgefragt werden, über die man die maximale BIOS Gerätenummer abfragen und außerdem neue Gerätetreiber installieren kann. devno kann die folgenden Werte annehmen:

devno Bedeutung
-402 device / RSVF-list remove (HSMODA)
-401 Eintrag anhängen (HSMODA)
-400 ausgewählten Eintrag überschreiben (HSMODA)
-2 Zeiger auf BCONMAP-Struktur liefern
-1 nur aktuellen Kanal abfragen
0 Test, ob Bconmap vorhanden ist
6 ST-kompatibler RS232-Port
7 SCC Kanal B
8 TTMFP RS232-Port
9 SCC Kanal A
>10 eigene Treiber


Die Funktion beeinflußt sowohl die BIOS-Vektortabelle in den Systemvariablen, als auch das Verhalten der Funktionen Rsconf und Iorec.

HSMODA
Diese Funktionen sind nur vorhanden falls das Paket HSMODA installiert ist.

int32_t Bconmap((int16_t)-400, (int16_t)dev_nr, (int32_t)ptr_to_6_longs)
Die Konstante MAPT_OVE wird als -400 definiert. Diese Funktion dient dem Überschreiben bereits existierender MAPTAB-Einträge. dev_nr ist eine Gerätenummer ab 6 aufwärts, die in der MAPTAB bereits existieren muá, andernfalls wird der Fehlercode -15 EUNDEV zurückgegeben. ptr_to_6_longs zeigt auf eine Struktur, die einem MAPTAB-Eintrag entspricht. Diese Struktur wird auf den entsprechenden Platz in der MAPTAB kopiert. Ist das angesprochende Gerät das aktuell per Bconmap für AUX eingestellte, so werden die eben eingehängten Routinen auch nach xco* und in die aktuellen Rsconf und Iorec-Zellen kopiert. Diese Funktion dient nur zum Einhängen MagiC-freundlicher Routinen. Als Erfolgsmeldung wird die Gerätenummer zurückgegeben, auf die der Eintrag erfolgte, also dev_nr.

Um Geräte auf den BIOS-Nummern zu installieren, die fest zu einem Computer gehören, ist immer MAPT_OVE zu benutzen. Für den ST betrifft das z.B. #6, beim MegaSTE #6 bis #8 und beim TT #6 bis #9.

int32_t Bconmap((int16_t)-401, (int32_t)ptr_to_6_longs)
Die Konstante MAPT_APP wird als -401 definiert. Diese Funktion dient dem Anfügen eines Kanals an die MAPTAB oder dem Beschreiben eines leeren Kanals. ptr_to_6_longs zeigt auf eine Struktur, die einem MAPTAB-Eintrag entspricht. Rückmeldung ist entweder die von dieser Funktion für den Eintrag gewählte Kanalnummer, oder der Fehlercode -12 EGENRL, falls kein Platz für eine MAPTAB-Vergröáerung ist. Hier kann es nicht vorkommen, das die Vektoren sofort nach xco* übertragen werden, da ein bisher nicht vorhandener oder belegter Kanal nicht als AUX eingestellt sein kann.

MAPT_APP sucht sich den ersten freien Kanal hinter den fest zum Computer gehörenden BIOS-Nummern und kann deshalb nur zum Installieren zusätzlicher Geräte benutzt werden.

int32_t Bconmap((int16_t)-402, (int16_t)dev_nr, (int32_t)ptr_to_listentry)
Die Konstante MAPT_DEL wird als -402 definiert. Diese Funktion dient zum Löschen eines Gerätes aus der MAPTAB und zum Aushängen einer RSVF-Liste aus der RSVF-Verkettung.

dev_nr ist entweder die BIOS-Kanalnummer des aus der MAPTAB zu entfernenden Gerätes oder -1 für Nichtstun. Der entsprechende MAPTAB-Eintrag wird freigeben indem spezielle Dummy-Routinenzeiger eingetragen werden, die auf den Assemblerbefehl RTS zeigen. Der Iorec-Zeiger-Eintrag wird auf 0 gesetzt. Ist der gelöschte Kanal auch als BIOS-AUX-Device eingestellt gewesen, so wird BIOS-AUX auf Nummer 6 umgestellt, auch wenn gerade Nummer 6 gelöscht wurde.

ptr_to_listentry ist entweder der Zeiger auf die auszuhängende RSVF-Liste oder 0 für Nichtstun. Der Zeiger muß auf den Anfang einer Liste verweisen, die daraufhin komplett entfernt wird, auch wenn sie mehr als ein Schnittstellenobjekt und End- oder Verkettungsobjekt enthält.

Im Erfolgsfall gibt MAPT_DEL 1 zurück, im Fehlerfall -1.
Ergebnis: Bconmap liefert die alte Einstellung. Falls devno gleich -2 ist liefert die Funktion einen Zeiger auf BCONMAP zurück.
Verfügbar: Laut Atari sollte man seine TOS-Version folgendermaßen auf das Vorhandensein von Bconmap testen:
WORD has_bconmap ( VOID )
{
   return (0L == Bconmap (0));
}
Gruppe: Schnittstellenprogrammierung
Querverweis: Binding   Bconout   Bconin   Bcostat   Bconstat   Iorec   Rsconf

4.16.1.1 Bindings für Bconmap

C: #include

int32_t Bconmap( int16_t devno );
Assembler:
move.w    devno,-(sp)  ; Offset 2
move.w    #44,-(sp)    ; Offset 0
trap      #14          ; XBIOS aufrufen
addq.l    #4,sp        ; Stack korrigieren

4.16.2 Dosound

Name: »Dosound« - programmiert den Sound-Generator.
Xbiosnummer: 32
Deklaration: void Dosound( const int8_t *buf );
Beschreibung: Die XBIOS-Routine Dosound startet einen Prozeß zur Steuerung des Soundgenerators. Der Puffer buf enthält Befehle für die Programmierung des Sound-Generators. Die folgenden Befehle werden unterstützt:
Befehl Bedeutung
   
0x0x byte Byte in Register x des Soundchips schreiben
0x80 byte Bytes in temporäres Register laden
0x81 byte1 Nummer des Soundregisters, in das der Wert des temporären Registers übertragen werden soll.
     byte2 wird zum temporären Register addiert.
     byte3 Wert des temporären Registers, bei dem die Schleife abgebrochen wird.
0x82 byte Anzahl der Jiffies (20 ms), die bis zum nächsten Kommando vergehen sollen. Enhält byte den Wert 0, so wird vollständig abgebrochen.
...  
0xff byte  
Ergebnis: Die Funktion liefert kein Ergebnis.
Verfügbar: Alle TOS Versionen.
Gruppe: Schnittstellenprogrammierung
Querverweis: Binding

4.16.2.1 Bindings für Dosound

C: #include

void Dosound( const int8_t *buf );
Assembler:
pea       buf          ; Offset 2
move.w    #32,-(sp)    ; Offset 0
trap      #14          ; XBIOS aufrufen
addq.l    #6,sp        ; Stack korrigieren

4.16.3 ExtRsConf

Name: »RS-232/RS485 configuration« - konfiguriert die RS-232/RS485-Schnittstelle.
Xbiosnummer: 162
Deklaration: int32_t Xbios( 162, int16_t command, int16_t device, int32_t param );
Beschreibung: Die XBIOS-Routine ExtRsConf konfiguriert die serielle Schnittstelle

Parameter Bedeutung
command 0x0000 - return 0 to check that ExtRsConf
           is present
  0x0001 - set port driver mode:
           param = 0 -> RS232
           param = 1 -> RS422
           param = 2 -> RS485
   
device BIOS device (6 = MFP serial, ...)
   
param s.o.


Hinweis: Die Funktion ist für die Hardware des Milans 2.1. Die Version gibt es allerdings nur als Spezialversion und ist nicht frei verfügbar.
Ergebnis: E_OK (0) - OK
EUNCMD (-3) - unknown command
ERROR (-1) - general error
EUNDEV (-15) - unknown device
Verfügbar: Die Funktion ist ab dem MilanTOS mit dem Datum 9.6.2002 vorhanden.
Gruppe: Schnittstellenprogrammierung
Querverweis: Binding

4.16.3.1 Bindings für ExtRsConf

C: #include

int32_t Xbios( 162, int16_t command, int16_t device, int32_t param );
Assembler:
move.l    param,-(sp)     ; Offset  6
move.w    device,-(sp)    ; Offset  4
move.w    command,-(sp)   ; Offset  2
move.w    #162,-(sp)      ; Offset  0
trap      #14             ; XBIOS aufrufen
lea       10(sp),sp       ; Stack korrigieren

4.16.4 Giaccess

Name: »access GI sound chip« - ermöglicht den Zugriff auf die Register des GI-Sound-Chips.
Xbiosnummer: 28
Deklaration: int8_t Giaccess( int16_t data, int16_t regno );
Beschreibung: Die XBIOS-Routine Giaccess liest bzw. setzt Register im GI-Soundchip. Es gilt:
Parameter Bedeutung
   
data wird beim Schreibzugriff in das durch regno angegebene Register geschrieben.
regno Nummer des gewünschten Registers (0..15). Beim Schreibzugriff wird zusätzlich Bit-7 gesetzt.
Ergebnis: Die Funktion liefert als Ergebnis den Inhalt des angegebenen Registers.
Verfügbar: Alle TOS Versionen.
Gruppe: Schnittstellenprogrammierung
Querverweis: Binding

4.16.4.1 Bindings für Giaccess

C: #include

int8_t Giaccess( int16_t data, int16_t regno );
Assembler:
move.w    regno,-(sp)  ; Offset 4
move.w    data,-(sp)   ; Offset 2
move.w    #28,-(sp)    ; Offset 0
trap      #14          ; XBIOS aufrufen
addq.l    #6,sp        ; Stack korrigieren

4.16.5 Ikbdws

Name: »write string to keyboard« - programmiert den Tastatur-Chip.
Xbiosnummer: 25
Deklaration: void Ikbdws( int16_t count, const int8_t *ptr );
Beschreibung: Die XBIOS-Routine Ikbdws übergibt einen String an die intelligente Tastatur. Es gilt:

Parameter Bedeutung
count Anzahl der auszugebenden Bytes - 1
ptr Zeiger auf die Bytes im Speicher
Ergebnis: Die Funktion liefert kein Ergebnis.
Verfügbar: Alle TOS Versionen.
Gruppe: Schnittstellenprogrammierung
Querverweis: Binding

4.16.5.1 Bindings für Ikbdws

C: #include

void Ikbdws( int16_t count, const int8_t *ptr );
Assembler:
pea       ptr          ; Offset 4
move.w    count,-(sp)  ; Offset 2
move.w    #25,-(sp)    ; Offset 0
trap      #14          ; XBIOS aufrufen
addq.l    #8,sp        ; Stack korrigieren

4.16.6 Iorec

Name: »input output record« - Adresse des Ein-/Ausgabepuffers ermitteln.
Xbiosnummer: 14
Deklaration: IOREC *Iorec( int16_t dev );
Beschreibung: Die XBIOS-Routine Iorec liefert die Adresse des Ein-/Ausgabe-Puffers eines seriellen Gerätes. Der Parameter dev kann folgende Werte annehmen:

dev Bedeutung
0 RS-232
1 Tastatur
2 MIDI-Port
Ergebnis: Die Funktion liefert als Ergebnis einen Zeiger auf die Struktur IOREC.
Verfügbar: Alle TOS Versionen.
Gruppe: Schnittstellenprogrammierung
Querverweis: Binding   Bconmap

4.16.6.1 Bindings für Iorec

C: #include

IOREC *Iorec( int16_t dev );
Assembler:
move.w    dev,-(sp)    ; Offset 2
move.w    #14,-(sp)    ; Offset 0
trap      #14          ; XBIOS aufrufen
addq.l    #4,sp        ; Stack korrigieren

4.16.7 Kbdvbase

Name: »keyboard vectors« - liefert einen Zeiger auf die Tastatur-Interruptvektoren.
Xbiosnummer: 34
Deklaration: KBDVBASE *Kbdvbase( void );
Beschreibung: Die XBIOS-Routine Kbdvbase liefert einen Zeiger auf eine KBDVBASE Struktur.

Hinweis: Bevor einer der in der Struktur angegebenen Vektoren verändert wird, muß sichergestellt sein, daß nicht gerade ein Paket verschickt wird (Komponente drvstat = 0). Anschließend sollten alle Interrupts gesperrt, und dann getestet werden ob wirklich kein Paket mehr unterwegs ist.
Ergebnis: Die Funktion liefert einen Zeiger auf eine KBDVBASE Struktur zurück.
Verfügbar: Alle TOS Versionen.
Gruppe: Schnittstellenprogrammierung
Querverweis: Binding

4.16.7.1 Bindings für Kbdvbase

C: #include

KBDVBASE *Kbdvbase( void );
Assembler:
move.w    #34,-(sp)    ; Offset 0
trap      #14          ; XBIOS aufrufen
addq.l    #2,sp        ; Stack korrigieren

4.16.8 Mfpint

Name: »init MFP interrupt« - Interrupt initialisieren.
Xbiosnummer: 13
Deklaration: void Mfpint( int16_t number, int16_t (*vector)() );
Beschreibung: Die XBIOS-Routine Mfpint initialisiert den Multifunktions-Interrupt für die angeschlossenen Peripherie-Geräte. Damit können Hardware-Interrupts abgefangen werden. Das Argument vector gibt die Interrupt-Service-Routine an. Im Parameter number wird die Nummer des Interrupt von 0 bis 15 angegeben:

number Beschreibung
0 I/O-Port Bit 0 Busy par. Schnittstelle
1 RS-232 DCD
2 RS-232 CTS
3 Blitter
4 Timer D, RS232-232 Baud-Generator
5 Timer C, 200-Hz System-Uhr
6 Tastatur und MIDI
7 FDC und DMA
8 Timer B Zeilenrücklauf
9 RS-232 Sendefehler
10 RS-232 Sendepuffer leer
11 RS-232 Empfangspuffer voll
12 RS-232 Puffer voll
13 Timer A
14 RS-232 RI
15 Monochrom-Monitor Detect
Ergebnis: Die Funktion liefert kein Ergebnis.
Verfügbar: Alle TOS Versionen.
Gruppe: Schnittstellenprogrammierung
Querverweis: Binding   Jdisint   Jenabint

4.16.8.1 Bindings für Mfpint

C: #include

void Mfpint( int16_t number, int16_t (*vector)() );
Assembler:
pea       vector       ; Offset 4
move.w    number,-(sp) ; Offset 2
move.w    #13,-(sp)    ; Offset 0
trap      #14          ; XBIOS aufrufen
addq.l    #8,sp        ; Stack korrigieren

4.16.9 Midiws

Name: »Midi write string« - gibt eine Zeichenfolge über die Midi-Schnittstelle aus.
Xbiosnummer: 12
Deklaration: void Midiws( int16_t cnt, void *ptr );
Beschreibung: Die XBIOS-Routine Midiws gibt einen String über die Midi-Schnittstelle aus. Es gilt:
Parameter Bedeutung
   
cnt Anzahl der auszugebenden Bytes - 1
ptr Zeiger auf Bytefolge
Ergebnis: Die Funktion liefert kein Ergebnis.
Verfügbar: Alle TOS Versionen.
Gruppe: Schnittstellenprogrammierung
Querverweis: Binding

4.16.9.1 Bindings für Midiws

C: #include

void Midiws( int16_t cnt, void *ptr );
Assembler:
pea       ptr          ; Offset 4
move.w    cnt,-(sp)    ; Offset 2
move.w    #12,-(sp)    ; Offset 0
trap      #14          ; XBIOS aufrufen
addq.l    #8,sp        ; Stack korrigieren

4.16.10 Offgibit

Name: »GI bit off« - löscht ein Bit im Register A des Soundchips.
Xbiosnummer: 29
Deklaration: void Offgibit( int16_t bitno );
Beschreibung: Die XBIOS-Routine Offgibit löscht ein Bit im Register A des Soundchips GI. bitno gibt den Wert an, mit dem das Register verUNDet werden soll. Die Bits in diesem Register haben folgende Bedeutung:
Bit Beschreibung
   
 0 Floppy Sideselect
 1 Drive Select A
 2 Drive Select B
 3 RS-232 RTS
 4 RS-232 DTR
 5 Centronics Strobe
 6 PIN 3 Monitor Buchse
 7 unbenutzt
ab TOS030 des TT jedoch Modem 4 (1) oder LAN (0)
Ergebnis: Die Funktion liefert kein Ergebnis.
Verfügbar: Alle TOS Versionen.
Gruppe: Schnittstellenprogrammierung
Querverweis: Binding   Ongibit

4.16.10.1 Bindings für Offgibit

C: #include

void Offgibit( int16_t bitno );
Assembler:
move.w    bitno,-(sp)  ; Offset 2
move.w    #29,-(sp)    ; Offset 0
trap      #14          ; XBIOS aufrufen
addq.l    #4,sp        ; Stack korrigieren

4.16.11 Ongibit

Name: »GI bit on« - setzt ein Bit im Register A des Soundchips.
Xbiosnummer: 30
Deklaration: void Ongibit( int16_t bitno );
Beschreibung: Die XBIOS-Routine Ongibit setzt ein Bit im Register A des Soundchips GI. bitno gibt den Wert an, mit dem das Register verODERt werden soll. Die Bits in diesem Register haben folgende Bedeutung:
Bit Beschreibung
   
 0 Floppy Sideselect
 1 Drive Select A
 2 Drive Select B
 3 RS-232 RTS
 4 RS-232 DTR
 5 Centronics Strobe
 6 PIN 3 Monitor Buchse
 7 unbenutzt
ab TOS030 des TT jedoch Modem 4 (1) oder LAN (0)
Ergebnis: Die Funktion liefert kein Ergebnis.
Verfügbar: Alle TOS Versionen.
Gruppe: Schnittstellenprogrammierung
Querverweis: Binding   Offgibit

4.16.11.1 Bindings für Ongibit

C: #include

void Ongibit( int16_t bitno );
Assembler:
move.w    bitno,-(sp)  ; Offset 2
move.w    #30,-(sp)    ; Offset 0
trap      #14          ; XBIOS aufrufen
addq.l    #4,sp        ; Stack korrigieren

4.16.12 Rsconf

Name: »RS-232 configuration« - konfiguriert die RS-232-Schnittstelle.
Xbiosnummer: 15
Deklaration: int32_t Rsconf( int16_t baud, int16_t ctr, int16_t ucr, int16_t rsr, int16_t tsr, int16_t scr );
Beschreibung: Die XBIOS-Routine Rsconf konfiguriert die serielle Schnittstelle. Da auf unterschiedlichen Rechnern unterschiedliche Hardwarebausteine zum Einsatz kommen können, muß die Funktion vorsichtig eingesetzt werden, d.h:
  • aktuelle Einstellungen sollten mit Hilfe von Rsconf (-1,-1,-1,-1,-1,-1) abgefragt werden
  • nur die notwendigen Bits manipulieren
  • anschließend die neuen Werte setzen


Aufgrund der Möglichkeit unterschiedliche Bausteine zum Einsatz kommen zu lassen, wurden die benutzbaren Werte folgendermaßen eingeschränkt:

Parameter Einschränkung
ucr Bit 1: Art der Parität
         0 = ungerade
         1 = gerade
   
      2: Parität
         0 = nein
         1 = ja
   
    3+4: Anzahl der Stopbits
         0 = ungültig
         1 = 1 Stopbit
         2 = 1,5 Stopbits
         3 = 2 Stopbits
   
    5+6: Wortlänge
         0 = 8 Bits
         1 = 7 Bits
         2 = 6 Bits
         3 = 5 Bits
   
rsr nicht anwendbar
tsr Bit-3: (1 = Break)
scr nicht anwendbar


Technisch nicht möglich Werte müssen daher ignoriert werden. Ansonsten gilt folgende Belegung:

Parameter Bedeutung
baud Baudrate
  -1: nicht verändern
   0: 19200 Baud
   1: 9600 Baud
   2: 4800 Baud
   3: 3600 Baud
   4: 2400 Baud
   5: 2000 Baud
   6: 1800 Baud
   7: 1200 Baud
   8: 600 Baud
   9: 300 Baud
  10: 200 Baud
  11: 150 Baud
  12: 134 Baud
  13: 110 Baud
  14: 75 Baud
  15: 50 Baud
   
ctr Art der Flußkontrolle
  -1: nicht verändern
   0: keine Flußkontrolle
   1: XON/XOFF (Control-S, Control-Q)
   2: RTS/CTS
   3: RTS/CTS und XON/XOFF
   
ucr neuer Wert für Register, oder -1
tsr neuer Wert für Register, oder -1
rsr neuer Wert für Register, oder -1
scr neuer Wert für Register, oder -1


Hinweis: Ab TOS 1.04 kann die zuletzt eingestellte Baudrate per Rsconf (-2,-1,-1,-1,-1) abgefragt werden. Man sollte sich niemals darauf verlassen, daß alle Einstellungen tatsächlich wie gewünscht vorgenommen werden konnten, und deshalb den Rückgabewert der Funktion beachten.
Ergebnis: Die Funktion liefert in gepackter Form die Werte der Register ucr, rsr, scr, tsr und zwar wie folgt:

Bits 0..7: scr-Register
Bits 8..15: tsr-Register
Bits 16..23: rsr-Register
Bits 24..31: ucr-Register
Verfügbar: Alle TOS Versionen.
Gruppe: Schnittstellenprogrammierung
Querverweis: Binding   Bconmap

4.16.12.1 Bindings für Rsconf

C: #include

int32_t Rsconf( int16_t baud, int16_t ctr, int16_t ucr, int16_t rsr, int16_t tsr, int16_t scr );
Assembler:
move.w    scr,-(sp)    ; Offset 12
move.w    tsr,-(sp)    ; Offset 10
move.w    rsr,-(sp)    ; Offset  8
move.w    ucr,-(sp)    ; Offset  6
move.w    ctr,-(sp)    ; Offset  4
move.w    baud,-(sp)   ; Offset  2
move.w    #15,-(sp)    ; Offset  0
trap      #14          ; XBIOS aufrufen
lea       $E(sp),sp    ; Stack korrigieren

HomeXBIOSPCI-BIOSSoundroutinen