ST-Ecke: Am Ende des Regenbogens - Neues zu AES und VDI


Immer wieder wurden Gerüchte laut, daß ATARI an einer neuen TOS- Version arbeite. Schon vor Monaten tauchte dann eine sogenannte BETA-Version eines TOS mit der Versionsnummer 1.4 auf, so daß man glaubte, jetzt sei es bald soweit. Weit gefehlt, denn erst Anfang Oktober kam das neue, überarbeitete TOS auf den Markt. Auch wenn es noch nicht in den neuen Rechnern zu finden ist - ATARI hat wohl noch genug alte ROMS auf Lager... -, wird es in Zukunft wohl Verbreitung finden, zumal sich wirklich viel getan hat. Dieses neue TOS hat den Namen RAINBOW-TOS erhalten, da das ATARI-Logo im Desktop farbig ist.

In der ST-Ecke möchte ich mich deshalb mit den Änderungen beschäftigen, die im AES und VDI durchgeführt wurden. Neuerungen im Desktop, im (X)BIOS und

GEMDOS finden Sie an anderer Stelle beschrieben. Da es sich um derart viele Änderungen handelt (ATARI hat tatsächlich einiges getan), sollen sie teilweise in Stichpunkten abgehandelt werden. Beginnen wir mit dem...

AES

Allgemeines: Da wir ab sofort ein TOS mit der Versionsnummer 1.4 vor uns haben, liefert auch appl_init() im global[0] diese Versionsnummer zurück, und da das AES ab sofort in der Lage ist, auch GEM-Programme beim Booten des Rechners zu starten, wird der Pfad, auf den das AES zugreift, auf den Pfad dieser gestarteten Applikation gesetzt. Dabei werden an die Accessories die gleichen Nummern vergeben, wie beim Start des Desktops. Klickt der Benutzer auf den Scroll-Bereich eines Fensters, wartet das AES mindestens die Zeit eines Doppelklicks, bevor es mit der Scroll-Wiederholung beginnt. Das einfache Klicken bewirkt auch nur das einfache Senden einer internen Botschaft.

Evnt_timer: Ein ärgerliches Problem war, daß evnt_timer() oder evnt_multi(), sofern es mit einem Timer-Aufruf verwendet wurde, in manchen Fällen dafür sorgten, daß Accessories für immer schliefen. Dieses Problem ist behoben worden.

Die Fileselectorbox: Es scheint, als habe sich ATARI mehrere Wochen nur mit der Überarbeitung der Fileselectorbox abgegeben, da sich besonders hier viele Verbesserungen finden lassen. Ab sofort kann eine Applikation der Fileselectorbox eine Überschrift (Titel) mit übergeben. Dies wurde durch einen neuen Aufruf erreicht, der Fsel_exinput() heißt und den AES-Code 91 besitzt (siehe weiter unten). Um das An wählen des Laufwerks zu vereinfachen, wurden 16 Buttons mit in die Box aufgenommen, die es ermöglichen, das Laufwerk direkt anzuwählen. Ab sofort wird die Taste RETURN innerhalb der Fileselectorbox anders verarbeitet: Gibt man zuerst den Pfad ein und drückt dann RETURN, wird die Box neu aufgebaut, und man erhält die Möglichkeit, den Dateinamen einzugeben. Da -nach kehrt die Routine zur Applikation zurück. Wird vom Anwender ein Pfad mit einem Backslash '' am Anfang übergeben, wird dieser Pfad an den intern aktuellen angehängt, und die Dateien dieses Pfades werden angezeigt. Dabei gibt es auch keine Probleme mehr mit zu langen Pfadnamen! Problematisch waren in alten TOS-Versionen Directories mit mehr als 100 Dateien, was darin begründet ist, daß statisch 100 Einträge reserviert wurden. Diesem Fehler ist dadurch Abhilfe geschaffen worden, daß vor jedem Aufruf durch Malloc() dynamisch Speicher angefordert wird, wobei bei ungenügendem Speicher Fsel input mit einem Fehler-Code zurückkehrt. Probleme gab es auch, wenn mehrfach ABBRUCH und WEITER sowie ABBRUCH bei nicht mehr vorhandener Diskette gedrückt wurde, was ab sofort behoben ist. Obwohl das Semikolon kein erlaubter Buchstabe innerhalb von Dateinamen ist, bringt es die Fileselectorbox nicht mehr durcheinander. Dateinamen, deren Hidden-Flag gesetzt ist, werden im Rainbow-TOS nicht mehr angezeigt, wobei der gesamte Aufbau der Fileselectorbox überarbeitet wurde, damit sie optisch besser erscheint.

Praktisch ist, daß der Dateiname erhalten bleibt, auch wenn durch Klicken innerhalb der Box ein neues Directory geladen wird. Besonders Ängstliche wird die Nachricht frohstimmen, daß die Box nicht mehr aussteigt, falls ein sogenannter kritischer Fehler auftritt. Weitere Informationen finden Sie weiter unten in Zusammenhang mit der neuen Routine Fsel_exinput().

Form_dial: Diese Routine läßt das oberste Fenster (TOP-Window) nur noch dann neuzeichnen, wenn es in das neuzuzeichnende Rechteck fällt.

Menu_bar: Das AES wurde manchmal durcheinandergebracht, wenn zwischen TRUE und FALSE hin- und hergeschaltet wurde, wodurch ein internes Semaphor (eine Art Verriegelungs-Flag) zerstört wurde - dies ist behoben. Von nun an wird die Menüleiste nicht mehr im XOR- sondern im REPLACE-Modus gezeichnet, wodurch verhindert wird, daß eine schon gezeichnete Menüleiste durch nochmaliges Zeichnen wieder verschwindet! Um den Hintergrund der Drop-Down-Menüs zu retten, wurde bisher ein Viertel von 32000 Bytes reserviert. Um Großbildschirme gut nutzen zu können, wird jetzt ein Viertel des Bildschirmspeichers reserviert.

Die Maus: Die Abfrage bezüglich des Drückens der Maustasten wurde dahingehend überarbeitet, daß Programme, die auf einen Einzelklick warten, besser (also schneller) reagieren können. AES zeichnet ab sofort eine vorher abgespeicherte Mausform nicht neu, sofern sie mit graf_mouse() geändert worden ist. Dieses Verhalten trug dazu bei, daß beispielsweise die Mausform eine Hummel blieb, obwohl die Applikation die Mausform zwischenzeitlich in einen Pfeil geändert hatte. Viel schlimmer aber war, daß dadurch Spuren der Maus zu unschönen Verunstaltungen der Menüzeile führten.

Objc_center: Bei der Durchführung seiner Aufgabe muß Objc_center die Positionskoordinaten der Box berechnen. Dabei wurde die Koordinate der Box bisher auf das Vielfache der Höhe und Breite eines Buchstabens gesetzt, was dazu führte, daß manche Boxen etwas unmittig ‘in der Gegend herumhingen’. Die Boxen werden jetzt nicht mehr auf Buchstaben ausgerichtet. Man sollte aber trotzdem bei der Gestaltung einer Box darauf achten, daß dies nicht vorkommt (sprich: Boxen verwenden, die auf Buchstabenkoordinaten zentriert werden können), denn das Zeichnen einer Box auf Koordinaten, die ein Vielfaches von 8 sind, können vom VDI schneller durchgeführt werden.

Objc_edit: Diese Routine, die Eingaben in Objekte des Typs GJTEXT oder G BOXTEXT zuläßt, war lange Zeit falsch dokumentiert (Originaldokumentation von ATARI), deshalb folgt hier die richtige Dokumentation:

ob_ednewidx: wurde in der ATARI-Dokumentation angegeben, wird aber nicht benutzt.

ob_edtree: ist die Adresse des Objektbaumes. der das zu edierende Objekt enthält.

Daraus ergibt sich folgender Aufruf der Routine:

ob_edreturn = objc edit (ob_edtree, ob_edobject, ob_edchar, ob_edidx, ob_edkind);

Rsrc_load: Die Routine Rsrc_load hatte die unangenehme Eigenschaft, den Puffer von Shelread/write als Zwischenpuffer zu verwenden, wodurch natürlich der Name der vom Desktop gestarteten Applikation verlorenging - er steht jetzt in seiner vollen ‘Schönheit’ zur Verfügung.

Shel_get und shel_put: Ursprünglich wurden diese beiden Routinen nur für die Benutzung des Kontrollfelds in das AES eingebunden. ATARI hat nun eine offizielle Dokumentation herausgegeben, die Ihnen nicht vorenthalten werden soll, und in Listing 1 und 2 zu finden ist.

Mit der Routine shel_get kann aus dem internen Puffer des AES gelesen werden, der aber bisher nur vom DESKTOP als Ablage des aktuellen Desktop.inf-Inhaltes verwendet wird. Der übergebene Puffer sollte 4192 Bytes lang sein, was dem internen Puffer im Rainbow-TOS entspricht.
Parameter:	Control[0] = 122		Funktionscode von shel get
			Control[1] = 1			1 Eingabevariable
			Control[2] = 1			1 Ausgabevariable
			Control[3] = 1 			Länge des INTIN-Feldes
			Control[4] = 0			Länge des INTOUT-Feldes

			Intin[0]   = sh_glen	Länge des Puffers
			Addrin[0]  = sh_gbuff	Die Adresse des Übergabepuffers

			Intout[0]  = sh_greturn	=0 - Ein Fehler ist aufgetreten.
									>0 - ordnungsgemäße Durchführung

Die Routine sollte wie folgt eingebunden und aufgerufen werden:

sh_greturn = shel_get(sh_gbuff, sh_glen);

Listing 1: Die Routine shel_get

Mit shel_put kann in den internen AES-Puffer geschrieben werden, der bisher nur vom DESKTOP als Zwischenpuffer für die aktuelle Destop.Inf-Information verwendet wird. Ein wahlloses Schreiben an diese Stelle wird die Desktop.Inf-Information zerstören und kann zu nicht voraussagbaren Effekten führen. Allerdings lassen sich mit shel_put die eventuell mit shel_get gelesenen und veränderten Daten zurückschreiben, um bewußt Veränderungen vorzunehmen.
Parameter:  Control[0] = 123		Funktionscode von shel_put
			Control[1] = 1			1 Eingabevariable
			Control[2] = 1			1 Ausgabevariable
			Control[3] = 1			Länge des INTIN-Feldes
			Control[4] = 0			Länge des INTOUT-Feldes
	
			Intin[0]   = sh_plen	Länge des Puffers
			Addrin[0]  = sh_pbuff	Die Adresse des Übergabepuffers

			Intout[0]  = sh_preturn	=0 - Ein Fehler ist aufgetreten.
									>0 - ordnungsgemäße Durchführung

Die Routine sollte wie folgt eingebunden und aufgerufen werden:

sh_preturn = shel_put (sh_pbuff, sh_plen);

Listing 2: Die Routine shel_put

Mit shel_write kann mit Beendigung eines Programms automatisch ein anderes gestartet werden. Dabei trug besonders die Namensgebung der Variablen zur Verwirrung bei: SHWPCMD enthält den Programmnamen des Programms, das aufgerufen werden soll (keine zu übergebene Kommandozeile) und SHWPTAIL einen Übergabestring, der dem String bei TTP-Programmen entsprechen sollte, oder in dem beliebige Informationen übergeben werden können, die das nachfolgende Programm interpretieren kann.
	Parameter:	Control[0] = 121	Funktionscode von shel write
				Control[1] = 3		3 Eingabevariablen
				Control[2] = 1		1 Ausgabevariable
				Control[3] = 2		Länge des INTIN-Feldes
				Control[4] = 0		Länge des INTOUT-Feldes

				Intin[0] = sh_wdoex		0: Verlassen der Applikation und
										zurück zum Desktop 
										1: Starten einer anderen Applikation 
				Intin[1] = sh_wisgr 	0: keine grafische Applikation
										1: neues Programm arbeitet grafisch 
				Intin[2] = wiscr		momentan ungenutzt (sollte 0 sein)
	
				Addrin[0] = sh_wpcmd	Adresse auf den Namen der folgenden Applikation
				Addrin[1] = sh_wptail	Adresse auf Übergabestring
										Achtung: erstes Byte ist die Länge!

				Intout[0] = sh_wreturn	=0 - Ein Fehler ist aufgetreten.
										>0 - ordnungsgemäße Durchführung

Die Routine sollte wie folgt eingebunden und aufgerufen werden:

	sh_wreturn = shel_write(sh_wdoex, sh_wisgr, sh_wiscr, sh_wpcmd, sh_wptail);

Listing 3: Die Routine shel write

Mit Shel_read kann der interne Puffer des AES gelesen und mit shel_write beschrieben werden. Dieser Puffer wurde bisher ausschließlich vom DESKTOP benutzt, um die Konfiguration festzuhalten. Diese Konfiguration entspricht dem Aufbau einer Desktop.inf-Datei. Es ist dadurch möglich, ein Programm zu schreiben, welches die aktuelle Desktop-Information einliest, manipuliert und zurückschreibt. Wird dieses Programm verlassen und dadurch das DESKTOP wieder gestartet, verwendet es den manipulierten Inhalt des AES-Puffers. Ihrer Fantasie sind keine Grenzen gesetzt, was den sinnvollen Einsatz dieser Spielerei angeht. Beachten Sie aber bitte, daß Sie in diesem Puffer keinen ‘Schrott’ hinterlassen, mit dem Sie vielleicht das Desktop zum Aussteigen bringen könnten!

Shel_envrn: Diese verwendet nun den tatsächlichen Environment-String (interner Umgebungsstring, der die gültigen Pfade enthält - für MS-DOS-Freaks: PATH=...) und nicht wie früher eine feste Kopie. Dadurch kann im AUTO-Ordner ein beliebiger Environment-String gebildet werden (“PATH=”), der dann vom AES zum Suchen verwendet wird. Die verschiedenen Pfade innerhalb des Strings können durch Semikolons und Kommas getrennt werden, wohingegen früher nur Semikolons verwendet werden konnten. Dies ist nach dem AUTO-Ordner nicht mehr möglich, da AES einen internen Zeiger auf seine Umgebungsvariable hat, an die man nicht mehr herankommt, und die somit nicht verändert werden kann.

Shel_find: Shel_find schaut zunächst im Directory nach, aus dem die Applikation gestartet wurde, dann im aktuellen. Danach wird der Environment-Pfad abgearbeitet, wodurch installierte Applikationen praktisch immer gefunden werden können!

Shel_write: Um die Parameter dieser Routine herrscht eine ziemliche Verwirrung, da sie in vielen Dokumentationen unterschiedlich angegeben worden sind. Deshalb finden Sie die offizielle, aktuelle und daher (hoffentlich) richtige Dokumentation dieser Routine, die zu dem neuen Rainbow-TOS gehört, aber in alten TOS-Versionen identisch ist, in Listing 3. Achten Sie auf die Namensgebung der Variablen und deren Erklärung, da shwpcmd kein Zeiger auf eine zu übergebende Kommandozeile ist, sondern das Kommando des zu startenden Programms, also der Programmname (inklusive Pfad) selbst ist. Erst shwptail enthält den Übergabestring, der der Konvention entsprechen sollte, wie er bei TTP-Programmen gängig ist.

Wind_get: Der Aufruf der wind_get() Routine mit dem Parameter WF -SCREEN wird ab TOS 1.4 unterstützt. Dabei werden die Länge und Adresse des internen Puffers für Drow-Down-Menüs und Alertboxen berechnet. Das Low-Word der Adresse steht in wigwl und das High-Word in wi_gw2. Die Länge ist in wi_gw3 (Low-Word) und wi_gw4 (High-Word) zu finden. Daraus ergibt sich der Aufruf wie folgt:

	wi_greturn = wind_get(wi_ghandle,
		WF_SCREEN, &wi_gw1,
		&wi_gw2, &wi_gw3, &wi_gw4);

Zwei neue Routinen des AES

Fsel_exinput: Die Funktion ist dieselbe wie die von Fselinput, mit dem Unterschied, daß zusätzlich ein Titeltext übergeben werden kann. Der dazu zu übergebende String sollte nicht länger als 30 Zeichen sein und wird den Original-Text ‘File Selector’ ersetzen. Dadurch ist es möglich, innerhalb der Fileselectorbox anzuzeigen, zu welchem Zweck eine Datei vom Benutzer angeklickt werden soll. Um unabhängig von der TOS-Version zu sein, kann man die kleine Routine benutzen, die Sie in Listing 5 finden.

Die Funktion von Fsel_exinput ist dieselbe wie die von Fsel_input, mit dem Unterschied, daß zusätzlich ein Titeltext übergeben werden kann. Der dazu zu übergebende String sollte nicht länger als 30 Zeichen sein und ersetzt dann den Originaltext ‘File Selector’. Dadurch ist es möglich, innerhalb der Fileselectorbox anzuzeigen, zu welchem Zweck eine Datei vom Benutzer angeklickt werden soll.
	Parameter:	Control[0] = 91			Funktionscode von Fsel_exinput
				Control[1] = 3			0 Eingabevariablen
				Control[2] = 1			2 Ausgabevariablen
				Control[3] = 3			Länge des INTIN-Feldes
				Control[4] = 0			Länge des INTOUT-Feldes
	
				Intin[0]   = fs_ireturn =0: Fehler bei der Durchführung
										>0: Kein Fehler ist aufgetreten.
				Intin[1]   = fs_iexbutton Rückgabe-Button: 0 - Abbruch
											1 = OK

				Addrin[0]  = fs_innpath Ein- und Ausgabepfad
				Addrin[1]  = fs_innsel	Ein- und Ausgabedateiname
				Addrin[2]  = fs_label	Titeltext

Die Routine sollte wie folgt eingebunden und aufgerufen werden:

	fs_ireturn = Fsel_exinput(fs_innpath, fs_innsel, &fs_iexbutton, fs_label);
**Listing 4: Die Routine Fsel_exinput**

Wind_new: Mit Wind_new können alle Fenster geschlossen und gelöscht werden. Außerdem setzt es die Wind_update()-Funktion zurück, läßt alle Window-Puffer ausführen und setzt auch die Maus zurück! Das Binding kann mit folgenden Angaben erstellt werden:

	control[0] = 109	/* Funktionscode   */
	control[1] = 0		/* keinerlei Ein-  */
	control[2] = 0		/* und Ausgabeparameter */
	control[3] = 0 
	control[4] = 0

Der Aufruf ist dementsprechend einfach wind_new();

Aufruf des AES im Supervisor-Modus: Probleme kann es beim Aufrufen von AES-Routinen aus dem Supervisor-Modus heraus geben, da einige AES-Routinen im USER-Modus zurückkommen und alle AES-Funktionen den USP benutzen, um die Register zu retten. Das bedeutet, daß man AES nicht starten darf, falls man mit Super(0L) in den Supervisor gewechselt hat, da nämlich User- und Supervisor-Stack überlappen. Außerdem sollte man darauf achten, daß man, wenn man Super() mit einem anderen Parameter als 0L aufruft, größeren Platz über dieser Zeigeradresse freiläßt. Einen Beispielaufruf finden Sie in Listing 6.

VDI

Entweder enthielt das VDI kaum Fehler, oder es sind kaum Fehler bekannt oder ATARI hat sich mehr mit dem AES beschäftigt. Gehen wir von ersterem aus und zählen die drei Änderungen auf:

Maus-Code: Der interne Maustreiber unterstützt nun auch Bildschirme, die größer sind als 32 kByte. Dadurch können ohne Probleme Großbildschirme verwendet werden.

vst_extent: Die Routine vst_extent arbeitet ab sofort auch dann korrekt, wenn als Rotation 270 Grad angegeben worden ist.

vq_mouse: Diese Routine arbeitet von nun an zuverlässiger, da sie praktisch neu geschrieben worden ist.

Leider sind nach der Fertigstellung des Rainbow-TOS noch zwei Fehler entdeckt worden, die durch einen mitgelieferten Patch in Form eines Programmes für den Auto-Ordner korrigiert werden: Ein Fehler taucht in rsconf() des XBIOS auf, während der andere auf Shel_find() einwirkt.

Fehler in shel_find: Wird shel_find ein String übergeben, der von einem Backslash '' oder Semikolon gefolgt ist, wird shel_find nach einem Null-String suchen und damit keinen Erfolg haben. Was passiert, hängt davon ab, was tatsächlich hinter dem String steht. Rsrc_load() kann davon abhängen, da es shel_find() benutzt, um den vollen Pfadnamen der Re-source-Datei zu erhalten.

Zum Schluß möchte ich Ihnen noch viel Spaß mit Ihrem neuen Regenbogen-TOS wünschen, auch wenn ich es persönlich nicht richtig finde, daß ATARI dieses TOS (vorerst?) nicht in die neuen Rechner einbauen läßt und stattdessen recht viel Geld verlangt (ATARI hat wohl bemerkt, daß auch Software-Entwicklung Geld kostet). Ob dadurch die Verbreitung des neuen vielversprechenden TOS gefördert wird, läßt sich bezweifeln.

SH

	/*  Dieses Programm setzt voraus, daß Fsel_exinput() in der Bibliothek
		vorhanden ist oder zuvor deklariert und eingebunden wird. */

	#include <osbind.h> 					/* für Super() */
	int fsel_newinput( pfad, datei, taste, titel) /* neuer Aufruf */
	char *pfad, *datei;						/* Pfad und Dateiname */
	int *taste;								/* Zeiger auf Variable für gedrückte Taste */
	char *titel; /* Zeiger auf den neuen Titel */
	{
		long savessp;						/* speichert aktuellen Stackpointer zwischen */
		unsigned tos_version;				/* enthält die TOS-Version in BCD */
		savessp= Super(0L);					/* in Supervisor gehen */
		tos_version = *(unsigned int*) ( * (long*) (0x4f2) +2); /* TOS auslesen */ 
		Super(savessp);						/* und zurück in den User-Modus */
	
		if (tos_version<0x0104)				/* alte TOS-Versionen vor RAINBOW-TOS */
			return(Fsel_input(pfad, datei, taste)); /* alte Box aufrufen */
		else								/* TOS-Version RAINBOW und neuer */
			return(Fsel_exinput(pfad,datei, taste, titel); /* neue BOX */
	}

Listing 5: Beispiel einer Fsel_exinput-Anwendung

	super_aes() /* Beispiel von möglichen AES-Routinen aus Supervisor */
	{
		char mystack[8192];					/* neuer Stack */
		long oldssp;						/* Zeiger auf alten Stack */
	
		oldssp = Super(&mystack[8180]);		/* rein in den Supervisor */

		/* Aufruf von diversen Routinen......... */
		Super(oldssp);						/* zurück in den User-Mode */
	}

Listing 6: Beispiel zum Aufruf des AES aus dem Supervisor



Aus: ST-Computer 12 / 1989, Seite 99

Links

Copyright-Bestimmungen: siehe Über diese Seite