	$20 SUPER



	long Super( void *stack );



Diese Funktion ist besonders fr die Programmierer interessant, die 
whrend eines im User-Modus laufenden Programms auf die nur im 
Supervisor-Modus zugnglichen Peripherie-Bausteine oder die 
Systemvariablen zugreifen wollen. Nach Aufruf dieser Funktion aus dem 
User-Modus heraus befindet sich der MC68000 im Supervisor-Mode. Im 
Gegensatz zur XBIOS-Routine zum Einschalten des Supervisor-Modus 
knnen nach erfolgtem SUPER-Aufruf weitere GEMDOS-, BIOS- und 
XBIOS-Aufrufe erfolgen.



Wird die Super-Funktion mit einem Wert von -1L ($FFFFFFFF) 
aufgerufen, dann wird uns mitgeteilt, in welcher Betriebsart sich der 
Prozessor befindet. Ist das Ergebnis in D0 nach dem Aufruf eine 0, so 
luft der Prozessor im User-Mode. Ein Wert von $0001 dagegen zeigt 
an, da der Prozessor im Supervisor-Mode luft. Eine Umschaltung wird 
mit diesem Parameter jedoch nicht vorgenommen.



Darum wollen wir jetzt den Fall betrachten, da sich ein Programm im 
User-Mode befindet und die SUPER-Funktion mit einem Wert von Null auf 
dem Stack aufruft. In diesem Fall wird durch den Aufruf der 
Supervisor-Mode eingeschaltet. Der Supervisor-Stackpointer wird auf 
den derzeitigen Wert des User-Stacks gebracht und in D0 erhlt man 
den ursprnglichen Wert des Supervisor-Stacks zurck. Diesen Wert mu 
man sich im Programm unbedingt merken, um spter wieder in den 
User-Modus zu gelangen. Unterlt man dies vor dem Beenden des 
Programms, so stehen die Chancen fr einen Systemabsturz sehr gut.



Wird jedoch als Parameter beim erstmaligen Aufruf ein von Null 
unterschiedlicher Wert der SUPER-Funktion bergeben, so wird dieser 
Wert als gewnschter neuer Supervisor-Stack interpretiert. Auch in 
diesem Fall erhalten Sie in D0 den alten Supervisor-Stackpointer 
zurck, dessen Wert das Programm auf jeden Fall speichern sollte.



Wie bereits erwhnt, mu sptestens vor der Beendigung des Programms 
der User-Mode wieder eingeschaltet werden. Dieser erneute Wechsel der 
Betriebsart bentigt die beim ersten Aufruf erhaltene Adresse, um den 
Supervisor-Stack auf seinen ursprnglichen Wert zu setzen. Die 
Superfunktion unterscheidet sich in einem ganz wesentlichen Punkt von 
den bisherigen und allen anderen GEMDOS-Funktionen. Dieser Aufruf 
kann unter Umstnden auch die Inhalte von A1 und D1 verndern. Wenn 
Sie also wichtige Werte in diesen Registern halten, so mssen Sie die 
Werte vor einem Aufruf der SUPER-Funktion irgendwo ablegen.



----------------------------------------------------------------------
			* der 68000 Befindet sich im User-Modus

CLR.L	-(SP)		* User-Stack soll Supervisor-Stack werden

MOVE.W	#$20,-(SP)	* SUPER aufrufen

TRAP	#1		* nach dem Trap ist Supervisor-Modus aktiv

ADD.L	#6,SP		* D0 = alter Supervisor-Stack

MOVE.L	D0,_SAVE_SSP	* Wert merken

...

...  hier kann im Supervisor-Mode gearbeitet werden

...

MOVE.L	_SAVE_SSP,-(SP) * alten Supervisor-Stackpointer

MOVE.W	#$20,-(SP)	* SUPER aufrufen

TRAP	#1		* jetzt sind wir wieder im User-Mode

ADD.L	#6,SP

----------------------------------------------------------------------
