In zweiten Teil unserer Rundreise durch das Betriebssystem wenden wir uns noch einmal den Systemvariablen zu. So erfahren Sie, wie Sie den STs und TTs Multitasking beibringen und wie Sie wichtige Informationen über die Konfiguration erhalten.
Im ersten Teil lernten wir bereits die Systemvariablen für die Massenspeicher- und Speicherverwaltung kennen. Doch das TOS benutzt die Systemvariablen noch für eine Reihe anderer Zwecke. So nutzt es etwa die Systemvariable »etv_term« (Adresse: $408.L) als Zeiger auf eine Routine, die es während des Beendens des aktiven Programms aufruft. Normalerweise zeigt der Vektor auf den Befehl »rts«. Legen Sie diesen Vektor jedoch auf Ihre eigene Routine, so bestimmen Sie, was während der Beendigung eines Programmes geschieht. Beispielsweise können Sie sicherstellen, daß bei der Rückkehr ins Desktop die Farbpalette stimmt (siehe auch Listing 1).
Beim Umlegen eines Vektors sollten Sie sich am besten an den XBRA-Standard halten (siehe Listing 1) - oder wenigstens sicherstellen, daß Ihre Routine auch noch die ursprüngliche Routine aufruft. Und nicht vergessen: Der Adreßbereich $0 bis $800 ist zugriffsgeschützt und deshalb nur im Supervisor-Modus ansprechbar.
Die Systemvariable »scr_dump« ($502.L) dient dem TOS ebenfalls als Zeiger auf eine Routine. Diese springt es an, sobald der Anwender < Alt-Help > drückt. Genau genommen erhöht das Betriebssystem beim Drücken dieser Tastenkombination zunächst die Systemvariable »_dumpflg« ($4ee.W) von $ffff auf 0. Dies erst veranlaßt das TOS, die »scr_dump«-Routine anzuspringen. Normalerweise zeigt der Vektor auf die Hardcopy-Routine.
Indem Sie »_dumpflg« um eins erhöhen, zwingen Sie das Betriebssystem, »scr_dump« anzuspringen. Andererseits läßt sich »scr_dump« auch für eigene Zwecke »mißbrauchen«. Eine Anwendung ist etwa das Speichern des aktuellen Bildschirms auf Diskette.
Mit einer weiteren Systemvariable »conterm« ($484.B) konfigurieren Sie die Bildschirmein- und -ausgabe. Die vier unteren Bits des Bytes (siehe Tabelle 1) legen fest, ob der Tastatur-Klick ertönen soll (Bit 0), die Tastatur-Wiederholung (Bit 1) aktiv ist und ob nach dem Steuerzeichen 7 «Ctrl-G» ein Ton kommt (Bit 2). In Bit 3 legen Sie fest, ob die BIOS-Funktion »Bconin« in Bit 24 bis 31 von D0.L den Tastaturstatus (»kbshift«, siehe Tabelle 2) zurückliefern soll. Ein gelöschtes Bit entspricht dabei stets dem Zustand »aus«.
Die zwei Systemvariablen »_sysbase« ($4f2.L) und »_cookies« ($5a0.L) sind Zeiger auf zwei äußerst informative Datenstrukturen. Wenden wir uns zunächst »_sysbase« zu: Diese Variable zeigt auf den »OS-Header«, eine Datenstruktur am Anfang des aktiven Betriebssystems (siehe auch Tabelle 3):
Der erste Eintrag »os_entry« enthält den Assembler-Befehl »BRA reset«. Springen Sie diesen Eintrag an, so führt der ST/TT einen Reset aus. Im zweiten Eintrag »os-version« finden Sie die TOS-Versionsnummer; bei TOS 1.4 steht dort etwa $104. Der dritte Eintrag »reseth« ist der Zeiger auf die Resetroutine und normalerweise dieselbe Adresse, die auch »os_entry« anspringt. Daraufhin folgt »os_beg«, ein Zeiger auf das Betriebssystem, an dessen Anfang wir wieder einen OS-Header finden. Dieser Eintrag ist nur wichtig, um z.B. von einem ins RAM verlagerten TOS die korrekte Adresse des ROM-TOS zu erhalten. Von größerem Interesse ist der achte Eintrag »os_date«, der das Erstellungsdatum des TOS im Format »$MMDDJJJJ« enthält. Das offizielle TOS 1.4 enthält etwa den Wert $04061989 - das ist der 6. April 1989.
Im neunten Eintrag »os_conf« finden Sie derzeit zwei Angaben: Im Bit 0 steht, ob das System in der NTSC-(0) oder PAL-Fernsehnorm (1) arbeitet. Die Bits 1 bis 3 enthalten die sogenannten Ländercodes, die angeben, in weicher Sprache das Betriebssystem arbeitet. Ein »ideales« Programm könnte diese Information auswerten und in der entsprechenden Sprache arbeiten. Die vorgesehenen Länder sind: USA (0), BRD (1), Frankreich (2), Großbritannien (3), Spanien (4), Italien (5), Schweden (6), französische Schweiz (7), deutsche Schweiz (8), Türkei (9), Finnland (10), Norwegen (11), Dänemark (12), Saudi Arabien (13) und Holland (14).
Die zweite Informationsquelle »_cookies« ($5a0.L) ist eine Liste von Hardware-, Betriebssystem- und Programm-Informationen (Tabelle 4). Die Liste ist nicht fest, sondern von (residenten) Programmen beliebig erweiterbar. $5a0 zeigt auf diese Liste - auch Cookie-Jar genannt -, deren Einträge jeweils zwei Langworte umfassen. Im ersten steht der Identifikator - normalerweise eine Kombination von vier Buchstaben. Die vom Betriebssystem bereitgestellten Identifikatoren beginnen beispielsweise alle mit einem Unterstrich. Im zweiten Langwort steht der zugehörige Wert. Das Ende der Liste kennzeichnen zwei Null-Langworte. Listing 2 zeigt die Einträge der aktuellen Cookie-Jar-Liste an. Beachten Sie, daß die Cookie-Jar erst ab TOS 1.6 mit vorinitialisierten Daten belegt ist - frühere TOS-Versionen enthalten lediglich einen Nullzeiger. Zum Erweitern der Liste dürfen Sie Ihren Eintrag nicht etwa direkt anhängen, sondern müssen zuvor die Liste in einen ausreichend großen Bereich kopieren. Vergessen Sie dann allerdings nicht, »_cookies« neu zu setzen. # Multitasking über den VBL
Mit VBL bezeichnet man den Vertical Blank Interrupt«. Dies ist ein Interrupt, den die Hardware in Abhängigkeit von der Videoauflösung 50, 60 oder 72 Mal pro Sekunde erzeugt. TOS nutzt den VBL, um wichtige Aufgaben zu erledigen, so unter anderem für das Cursor-Blinken und das Setzen der Farbpalette. Eine Reihe von Systemvariablen unterstützt das VBL-Konzept des TOS: »_vblqueue« ($456.L) dient als Zeiger auf eine Liste. Deren Einträge sind Zeiger auf Routinen, die TOS während des VBI aufruft. In »nvbls« ($454.W) hält TOS die Maximalzahl der gleichzeitig aktivierbaren Routinen fest. Wenn Sie eine eigene Routine in den VBI einbinden wollen, müssen Sie Ihren Eintrag ans Ende der Liste schreiben. Ist nicht ausreichend Platz vorhanden (TOS sieht in der Regel acht VBL-Routinen vor), müssen Sie die Liste in einen neuen Bereich kopieren. In diesem Fall erhöhen Sie »nvbl« entsprechend. Ein VBL-Prozess könnte etwa im Hintergrund Berechnungen durchführen (siehe [1]). Ein C-Modul zum Einfügen und Entfernen von VBI-Routinen in die »_vblqueue«-Liste finden Sie auf der Begleitdiskette unter dem Namen »vbl.c«.
Normalerweise zeigt »_vblqueue« auf die Standardliste »_vbl_list« ($4ce.8L). Darin liegen die Routinenzeiger, die das TOS nutzt. Um zu verhindern, daß TOS die VBI-Routinen aufruft, existiert ein Schalter - die Systemvariable »vblsem« ($452.W). Besitzt sie den Wert 0, so ignoriert TOS die Liste. Dies ist unter anderem nötig, wenn Sie die Liste modifizieren.
Schließlich hat das Betriebssystem noch zwei Variablen, die zählen, wie oft der VBL bereits aufgetreten ist: »_vblclock« ($462.L) und »_frclock« ($466.L). Der Unterschied zwischen beiden besteht darin, daß »_frclock« nicht durch »vblsem« gesperrt ist. (ah)
Literaturhinweise:
[1] »Vielbeschäftigt« (Multitasking auf dem ST), TOS 7/90, Seite 87f.
Bit | Bedeutung |
---|---|
0 | Tastatur-Klick ein/aus |
1 | Tastatur-Wiederholung ein/aus |
2 | Ton nach Steuerzeichen < Ctrl-G > (7) |
3 | Wenn 1, dann liefert »Bconin« zusätzlich in Bit 24 bis 31 von DO »kbshift()« zurück |
Tabelle 1: Mit der Systemvariablen»conterm« ($484.B) konfigurieren Sie die Bildschirmen- und -ausgabe
Bit | Bedeutung |
---|---|
0 | rechte < Shift >-Taste |
1 | linke < Shift >-Taste |
2 | <Control>-Taste |
3 | < Alt >-Taste |
4 | < Caps Lock > eingeschaltet |
5 | rechte Maustaste < Clr/Home > |
6 | linke Maustaste < Insert > |
Tabelle 2: Ist Bit 3 von »conterm« an, so liefert die BIOS-Funktion Bconin (#2) in den Bits 24 bis 31 »kbshift« zurück
# Die OS-Header-Datenstruktur
Offset | Name | Bedeutung |
---|---|---|
0 | os_entry | »BRA«auf Reset-Routine |
2 | os_version | TOS-Versionsnummer |
4 | reseth | Zeiger auf Reset-Routine |
8 | os_beg | Zeiger auf Beginn des Betriebssystems |
12 | os_end | Ende des vom Betriebssystem belegten RAMs |
16 | os_rsv1 | reserviert |
20 | os_magic | Speicherbelegungsparameterblock des GEM |
24 | os_date | TOS-Erstellungsdatum im Format $MMDDJJJJ |
28 | os_conf | Konfigurationsbits |
30 | os_dosdate | TOS-Erstellungsdatum im DOS-Format |
32 | p_root | Zeiger auf den »OS-Pool« (ab TOS 1.2) |
36 | pkbshift | Zeiger auf die »kbshift«-Variable (ab TOS 1.2) |
40 | p_run | Zeiger auf die PID-Struktur des aktuellen Prozesses (ab TOS 1.2) |
44 | p_rscv2 | reserviert (ab TOS 1.2) |
Tabelle 3: Die Systemvariable »_sysbase« ($4f2.L) ist ein Zeiger auf die OS-Header-Datenstruktur, die viele Informationen über das Betriebssystem enthält
Identifikator | Bedeutung |
---|---|
_CPU | aktiver Prozessor (z.B. 0 - 68000, 30 - 68030) |
_VDO | Version der Video-Hardware ($00 ST, $10 STE, $20 TT) |
_SND | Version der Sound-Hardware (Bit 0: ST-Sound, Bit 1: Stereo-DMA) |
_MCH | Computertyp ($00 ST, $10 Mega ST, $20 STE, $30 TT) |
_SWI | Werte für Konfigurationsschalter |
_FPU | aktiver Mathe-Coproz. (z.B. 0 keiner, 1=68881, 2=68881/2) |
_FRB | Zeiger auf einen 64 KByte-Puffer für DMA-Transfers |
Tabelle 4: Seit TOS 1.6 finden Sie in der Cookie-Jar (Zeiger $5a0.L) viele wichtige Informationen über das System. In der Tabelle steht etwa die Angabe »$20« für das Langwort $00020000.
Listing 1: Mit dem »evt_term«-Vektor kontrollieren Sie, was beim Terminieren der Programme geschehen soll.
start: pea supinit(PC) move.w #26, -(SP) trap #14 ; Routine im Supervisor! addq.l #6, SP clr.w -(SP) pea end_start+$0100 ; Programmlänge move.w #$31, -(SP) trap #1 ; Ptermres supinit: ; XBRA-Protokoll setzen lea oldvec, A0 move.l $0408, (A0)+ move.l A0, $0408 rts DC.B ‚XBRA‘ ; XBRA DC.B ‚__EV‘ ; XBRA-ID oldvec: DS.L 1 ; Alter Vektor pea mypalette move.w #6, -(SP) trap #14 ; Palette setzen addq.l #16, SP move.l oldvec, -(SP) ; alte Routine rts ; auch noch aufrufen mypalette: DC.W $0E7F, $0F00, $03D1, $0FF0, $0D6F, $0F0F DC.W $00FF, $0555, $0333, $0FCC, $05FD, $0FFC DC.W $0CCF, $0FCF, $0CFF, $000A end:
Listing 2: Dieses C-Programm gibt den Inhalt der Cookie-Jar-liste aus
#include#include struct Cookie { union { char name[4]; long emptyfl; } id; long setting; } *jar; int main (void) { char *ssp; ssp = (char*) Super(0L); jar = *((struct Cookie **) 0x5a0L); if (jar) / * Jar vorhanden? */ { while (jar->id.emptyfl) { printf („\n %s = $%lx“, jar->id.name, jar->setting); jar++; /* nächster Eintrag */ } } Super(ssp); Crawcin(); return (); }