← TOS 01 / 1991

Was Entwickler wissen mĂŒssen: Die Programmierung des TT (Teil 2)

Programmieren

Im ersten Teil des Streifzugs durch die neuen Funktionen des TOS 3.0 haben wir uns mit der Speicheraufteilung des TT und den Grafikfunktionen des XBIOS beschÀftigt. Diesmal gehen wir auf die neuen und erweiterten Schnittstellen-Funktionen des BIOS und XBIOS ein.

Auf dem ST sprechen »Bcon«-Funktionsaufrufe fĂŒr GerĂ€t 1 stets die serielle Schnittstelle (»AUX«) an. Der TT besitzt allerdings drei neue serielle Schnittstellen. Um diese einerseits ST-Programmen zugĂ€nglich zu machen und andererseits den Anpassungsaufwand von Kommunikationssoftware an die neuen Schnittstellen möglichst gering zu halten, gibt es eine neue XBIOS-Funktion namens »Bconmap« (siehe auch Textkasten »neue XBIOS-Funktionen«). Dadurch lĂ€ĂŸt sich das GerĂ€t 1 beliebig auswechseln. Sie können es einerseits einem der neu hinzugekommenen Schnittstellen oderauch einem selbstdefinierten GerĂ€t zuordnen.

Mit »Bconmap« tauschen Sie außerdem das von der »Rsconf«-Funktion benutzte GerĂ€t, sowie GerĂ€t 0 der »lorec«-Funktion aus. Desweiteren sind den drei neuen Schnittstellen in den BIOS-Funktionen »Bconin«, »Bconout«, »Bconstat« und »Bconostat« eigene GerĂ€tenummern zugeordnet (siehe Tabelle 1).

Die dritte neue Schnittstelle (GerĂ€t 9) liefert der SCC-Kanal A. Dieser ist entweder mit der DB9-(»Serial Port 2«) oder der LAN-Schnittstelle (Local Area Network) des TT verbunden. Um DB9 zu selektieren, mĂŒssen Sie das Bit 7 von Port A des Soundchips löschen (»Offgi-bit(0x7f);«). Die LAN-Schnittstelle ist ausgewĂ€hlt, wenn das Bit gesetzt ist (»Ongibit(0x80);«).

Eigene BIOS-GerÀtetreiber

Die TOS-Entwickler haben lobenswerterweise das Einbinden neuer, selbstdefinierter GerĂ€te in die BIOS-Funktionen vorgesehen. Um einen eigenen GerĂ€tetreiber zu verwenden, mĂŒssen Sie lediglich Ihre Treiberfunktionen dem BIOS mitteilen. Dazu holen Sie sich zunĂ€chst ĂŒber »Bconmap(-2)« den Zeiger auf die GerĂ€te-Struktur. Diese ist wie folgt aufgebaut:

struct bconmap { long *maptab; /* ptr to map table */ word maptabsize; /* # of lines in the table */ };

Die GerĂ€te-Struktur enthĂ€lt fĂŒr jedes GerĂ€t einen Eintrag. Jeder Eintrag enthĂ€lt einen Zeiger auf seine »Bconstat«-, »Bconin«-, »Bcostat«- und »Bconout«-Funktionen, sowie einen Zeiger auf seine »Rsconf«-und »lorec«-Funktionen. Die Anzahl der vorhandenen GerĂ€te ergibt sich ĂŒber »maptabsize«. Die höchste erlaubte GerĂ€tenummer fĂŒr die »Bcon«-Funktionen errechnet sich aus »maptabsize« plus 5 und ist normalerweise 9.

Kopieren Sie nun die GerĂ€te-Struktur in einen um einen Eintrag erweiterten neuen Speicherbereich und aktualisieren Sie »maptab« und »maptabsize« in der GerĂ€te-Struktur. FĂŒllen Sie den neuen Eintrag aus, indem Sie die Zeiger auf Ihre eigenen Funktionen eintragen. In diesem Zusammenhang sollten Sie wissen, daß die »Rsconf«-Funktion leider lange Zeit falsch dokumentiert wurde. Sie liefert in Wirklichkeit einen Langwort-Wert zurĂŒck. Dieses Langwort besteht aus vier zusammengefĂŒgten Bytes: die Inhalte der UCR-,

RSR- und TSR-Register der MFP, sowie ein unbenutzes Byte. Das UCR-Register ist dabei das oberste Byte des Langworts, darauf folgen die anderen Register in obiger Reihenfolge. Seit Rainbow-TOS gilt: »Rsconf(-2,...)« liefert die zuletzt eingestellte Baudrate zurĂŒck -unabhĂ€ngig von den nach -2 folgenden Parametern. Da im TT durch »Bconmap« nicht jede Schnittstelle von der 68901-MFP stammen muß, sollten Sie beim Einstellen der Konfiguration besondere Vorsicht walten lassen: Erfragen Sie mittels »Rsconf(-1,-1,-1 ,-1,-1, -1)« zunĂ€chst die aktuellen Einstellungen, Ă€ndern lediglich die benötigten Bits und rufen »Rsconf« mit den neuen Werten auf. In Tabelle 2 finden Sie eine Übersicht aller zu beachtenden Bits in den »Rsconf«-Argumenten. Jedes selbstdefinierte GerĂ€t muß diese wenigstens emulieren können. Auf der TOS-Diskette zu dieser Ausgabe finden Sie im Archiv »TT_Kurs« die nötigen Routinen zum Einbinden von selbstdefinierten BIOS-GerĂ€ten. (ah)

Die neuen XBIOS-Funktionen

XBIOS 0x2a: DMAread
XBIOS 0x2b: DMAwrite

long DMAread(sector(count,buffer(devno) long sector; word count; void *buffer; word devno;

Funktionsweise
»DMAread« liest Sektoren des angegebenen GerĂ€tes (devno) in den Speicher. »DMAwrite« schreibt Sektoren vom Speicher auf das GerĂ€t devno. Die Funktionen arbeiten mit ACSI- und SCSI-GerĂ€ten. Die GerĂ€tenummern sind folgendermaßen verteilt:

devno Bedeutung
$0-$7 ASCI-GerÀte (0-7)
$8-$f SCSI-GerÀte (8-15)
... reserviert

Ergebnis
Die Funktion gibt einen BIOS-Fehlercode zurĂŒck

Anmerkungen
Beide Funktionen gehen davon aus, daß das angegebene GerĂ€t den Puffer ansprechen kann. Beachten Sie, daß dies beispielsweise bei einem »DMAread«-Transfer ins alternative RAM nicht der Fall ist.


XBIOS 0x2c: Bconmap

long Bconmap(devno) word devno;

Funktionsweise
Diese Funktion installiert das als »devno« angegebene GerĂ€t als GerĂ€t 1 in allen »Bcon«-Funktionen. FĂŒr »devno« sind die Werte -1 (keine VerĂ€nderung), -2 (Zeiger auf Struktur zurĂŒck), 6 und höher erlaubt.

Ergebnis
Erhalten Sie den Wert 44 zurĂŒck, so unterstĂŒtzt das aktive TOS diese Funktion noch nicht. Ansonsten hĂ€ngt der RĂŒckgabewert von »devno« ab.

devno RĂŒckgabe
-2 Zeiger auf »device mapping structure«
-1 das aktuelle GerÀt
6... das bisher aktuelle GerÀt bzw. 44 auf einem ST

XBIOS 0x2e: NVMaccess

word NVMaccess(op,start,count,buffer) word op,start,count; byte *buffer;

Funktionsweise
Diese Funktion verwaltet den löschbaren Speicher (NVM = Non-volatile Memory) der TT-eigenen Real-Time-Clock. Der NVM umfaßt 50 Byte, von denen die letzten beiden als PrĂŒfsumme dienen. »NVMaccess« ĂŒberprĂŒft sie bei Lesezugriffen, berechnet sie bei Schreibzugriffen neu und initialisiert sie auf Wunsch.

Opcode Bedeutung
0 Lesezugriff: kopiert Daten vom NVM in den Puffer
1 Schreibzugriff:
2 Initialisierung: löscht

»start« gibt das erste anzusprechende Byte im NVM an, »count« entspricht der Anzahl der zu ĂŒbertragenden Byte.

Ergebnis
Die Funktion liefert 0 bei erfolgreicher DurchfĂŒhrung, EBADRQ (-5) bei einem Bereichsfehler oder EGENRL (-12) bei einem NVM-PrĂŒfsummenfehler.

Anmerkung
Die Benutzung des NVM wird in Zukunft von Atari vorgeschrieben. Entwickler sollten ihre spezielle Verwendung von NVM-Bytes Atari mitteilen.

Die Bcon-GerÀte

GerÀtenummer Bedeutung
0 PRN 1 (austauschbar, normalerweise 6)
2 CON
3 MIDI
4 IKBD
5 RAW
6 ST-kompatibler serieller Port (Modem 1)
7 SCC Channel B (Modem 2)
8 TTMFP serieller Port (Serial 1)
9 SCC Channel A (volles Handshake, Serial 2)

Tabelle 1. Die »Bcon«-Funktionen sprechen nun insgesamt acht GerĂ€te an. GerĂ€t 1 ist ĂŒber die neue Funktion »Bconmap« austauschbar und entspricht einem GerĂ€t ab Nummer 6. Normalerweise ist ihm GerĂ€t 6 zugeordnet - der ST-kompatible serielle Port.

Die Belegung Bcon-kompatibler Portregister

UCR
Bit 6-5: WortlĂ€nge (00„8, 01 „7, 10„6, 11 „5)
Bit 4-3: Stopbits (01 „1, 10J.5, 11 „2)
Bit 2: ParitĂ€t (0„nein, 1 „ja)
Bit 1: ParitĂ€t (0„ungerade, 1,.gerade)

RSR
-

TSR
Bit 3: Unterbrechungssignal (solange gesetzt)

SCR
-

Tabelle 2. Wollen Sie ein selbstdefiniertes GerĂ€t in die »Bcon«-GerĂ€tetabelle einfĂŒgen, so mĂŒssen Sie sicherstellen, daß Ihre »Rsconf«-Funktion die obigen Einstellungen wenigstens emuliert.

Martin Backschat