GEM-Programme aus dem Auto-Ordner

Gelegentlich habe ich mich geärgert,daß es nicht möglich ist, ein Gem-Programm aus dem Auto-Ordner zu starten. Das AES ist zu diesem Zeitpunkt noch nicht initialisiert. Als fauler Zeitgenosse habe ich einen Trick gefunden, das Programm doch zu starten. Damit Sie verstehen, wie’s geht, muß ich etwas weiter ausholen.

Nach Einschalten und Reset wird der Programmzähler des 68000er mit $FC0020 geladen und dann passiert grob (ich weiß, auch fein) folgendes:

  1. Hardware initialisieren (Videoshifter,MFP usw.)

  2. Speichertest (wieviel haben wir denn?)

  3. Vektoren für Exceptions setzen (VBL, Traps, u.a. für die schönen Bömbchen)

  4. DOS initialisieren, Datum setzen (immer 06.02.86)

  5. Bootsektor Disk und Hard disk lesen und eventuell ausführen

  6. Auto-Ordner-Programme ausführen (nur TOS-An-wendungen mit .PRG, sehr sinnig)

  7. Desktop starten und Line-F-Emulator installieren

  8. Eventuelle Accessories laden und starten

  9. Desktop aufbauen

  10. Auf Maus-Ereignisse warten (z.B.File angeklickt ?)

Wir sehen also, daß erst nach Nummer acht Gem-Program-me gestartet werden können. Wie geht’s denn nun ?

Im Auto-Ordner müßte ein Programm stehen, das bis kurz vor Nummer 10 lauert und dann sozusagen selber ’mausklickt’.

So macht’s das Programm dann auch ungefähr. Der Schlüssel zu allen Tricks ist der Line-F-Emulator. Wie der funktioniert, kann man im Data Becker Buch ’ATARI-ST-IN-TERN’ nachlesen. So ziemlich alle AES-Aufrufe laufen über den Line-F-Vektor $2C.

Weiter in unserem Superhyper Startprogramm:

Die Abfrage der Tastatur am Anfang des Programms dient der Sicherheit von Harddisk-Besitzern (wie mir). Der ST-PD-Harddisk-Treiber, den ich benutze, bootet nämlich die Auto-Ordner-Programme von der Harddisk.

Wenn dann irgendwas nicht stimmt (Tippfehler,Denkfehler) und das Programm ab-stürzt, bootet sich die Harddisk zu Tode. Die Tastaturabfage prüft, ob die Alternate-Taste während des Startens gedrückt ist, und beendet das Programm sofort, wenn dem denn so ist. Diese Abfrage ist übrigens auch bei selbstprogrammierten Accessories Marke ’Bastlerglück’ empfehlenswert.

Offensichtlich muß erst ein Keyboard-Interrupt auftreten, damit der Tastaturprozessor initialisiert wird. An der Speicherstelle $E6l steht normalerweise der Tastaturstatus, der in Register DO von Kbdshift zurückgegeben wird. Beim Blitter-TOS steht dort erst was, wenn vorher eine Taste mit AS-CH-Code gedrückt wird.

Da auf Systemvariablen zugegriffen wird, müssen wir jetzt die Routine ’init’ im Supervisormode ausführen. Ich habe dazu den Supexec-Befehl des Xbios benutzt.

’init’ schreibt die Konstante $0BFFFFFF in den Exception-vektor der Line-F-Routine bei $2C. Eigentlich wollte ich -1($FFFFFF) schreiben, aber das Blitter-TOS nummeriert alle Vektoren frühzeitig durch, elfter Vektor ist also $0BFFFFFF. Dann wird eine Vertikal-Blank-Routine in den ersten Slot der VBL-Sprungleiste bei $4D2 eingehängt. Bei jedem Bildwechsel (Farbe 50/60 Hz, Monochrom 71 Hz), bei meinem Farbmonitor also bei 5 0 Hz alle 20 ms, wird ’neuvbl’ ausgeführt. Diese Routine tut zunächst nicht viel mehr, als auf den Line-F-Emulator zu warten. Ist die Zahl $0BFFFFFF nicht mehr im Line-F-Vektor $2C, nehmen wir mal an, der Desktop ist gestartet und der Li-ne-F-Emulator ist installiert.

Jetzt wird’s haariger. Der VBL Slot wird wieder gelöscht. Statt dessen hängen wir jetzt eine Routine ’neulf vor den Line-F-Emulator. Diese neue Line-F-Routine lauert jetzt darauf, daß alle Accessories geladen und gestartet sind. Bei jedem Line-F-Sprung des AES wird der Opco-de auf das Auftreten von $F08C getestet. Hinter $F08C versteckt sich der Multi-Event-Auf-ruf. Ist dieser Code aufgetreten, wird der Filename in die Dta $933A kopiert und die Startadresse SFE1DE2 nach A0 geladen. Dann wird einfach an diese Adresse gesprungen und die ganze Arbeit wie Laden, Relozieren, Starten dem AES bzw. dem übrigen Betriebssystem (gern) überlassen. Die Routine ’neulf wird vorher natürlich wieder ausgehängt und die alte Originaladresse in $2C eingesetzt.

Hier also der Sourcecode der ganzen Geschichte, mühevoll dokumentiert: Ohne Haftung bei Bomben oder Schlimmerem!!!

Herbert Dampel

Listing


********************************
* Kuma Seka-Assembler *
********************************

vblslot:	equ	$4d2	;erster vbl-slot
line_f:		equ	$2C		;line-f-exeptionuektor
b_evnt:		equ	$f2c8	;ab hier Blittertosadressen

b_dta:		equ	$bbae
b_starter:	equ	$fe2698

start:
	move	#-1,-(a7)
	moue	#11,-(a7)	;kbshift
	trap	#13			;bios
	addq.l	#4,sp
	btst	#3,d0		;bei alt-taste zum ende
	bne		dannich

	pea		init		;routine init im supervisor-mode ausführen
	move	#38,-(a7)	;supexec
	trap	#14			;xbios
	addq.l	#6,sp
	move	#0,-(sp)	ikein fehler
	move.l	#[ende-start+$100],-(sp) ;anzahl zu reservierende bytes 
	move	#$31,-(sp)	;ptermres
	trap	#1			;gemdos

dannich: move	#0,-(sp)	;term
	trap	#1

init:	;wird im supermode ausgeführt
	tst.b	$fC0003			;version testen: Blittertos? 
	beq		normtos			;nein
	lea		m_evnt(pc),a0	;sonst adressen patchen
	move	#b_evnt,2(a0)
	lea		dta(pc),a0
	move.l	#b_dta,2(a0)
	lea		starter(pc),a0
	move.l	#b_starter,2(a0)

normtos:	move.l #$0BFFFFFF,d0 ;blöde Zahl wegen Blittertos
			move.l d0,line_f	;nach $2c schreiben
			move.l #neuvbl,vblslot ;vbl Routine einhängen 
			rts					;schon fertig,zurück nach ptermres

neuvbl:							;wird bei jedem Vertikal-Blank ausgeführt
	move.l	line_f,d0			;inhalt $2c nach d0
	cmpi.l	#$0BFFFFFF,d0		;noch drin ?
	beq.s	nixda				;wenn line-f noch nicht da nach nixda 
	clr.l	vblslot				;sonst vbl löschen,wird nicht mehr benötigt 
	move.l	line_f,a0			;addresse line-f nach a0
	move.l	a0,savelf			;merken für rücksprung und ende nach Start 
	move.l 	#neulf,line_f 		;eigene routine in line-f einhängen

nixda:	rts						;vbl fertig

neulf:	;wird uor jedem line-f-aufruf ausgeführt
	move.l	2(a7),a0	:line-f-befehlscode nach a0

m_evnt:	cmpi.w	#$F08C,(a0)		;sprung nach $fdd3f4 (multi-euent)? 
	bne	altlf					;nein,zur alten line-f zurück
	move.l	sauelf,line_f		;sonst alten line-f wieder zurück in $2c 
	dta:	move.l	#$933a,a0	;dta nach a0
	move.l	#startfile,a1		;filenamebeginn nach a1
loop:	move.b	(a1)+,(a0)+		;nach $933a schreiben-
	bne		loop				;bis 0 nach filename
starter:	move.l	#$felde2,a0	;adresse für filestart
jump:	jmp	(a0)	;gem-programm starten
altlf:	move.l	savelf,a0		;alte line-f nach a0
		jmp	(a0)	;hüpf
savelf:	dc.l 0		;alte line-f-routinen-adresse

startfile:dc.b 'AUTOGEM\*.*',0 	;ordnername und file-ersatzname damit 
								;ein beliebig benanntes Programm gestartet 
								;werden kann
even
ende:	equ *					;hier samma fertig
********************************


Aus: ST-Computer 01 / 1988, Seite 92

Links

Copyright-Bestimmungen: siehe Über diese Seite