Per Anhalter durch das Betriebssystem: Einblick in die System - Variablen, Teil 2

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«.

Hardware- und Betriebssystem-Informationen

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.

Die conterm-Attribute

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

Der Sondertastenstatus »kbshift()«

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

Standardeinträge der Cookie-Jar

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 ();
}

Martin Backschat
Aus: TOS 04 / 1991, Seite 88

Links

Copyright-Bestimmungen: siehe Über diese Seite