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:
-
Hardware initialisieren (Videoshifter,MFP usw.)
-
Speichertest (wieviel haben wir denn?)
-
Vektoren fĂŒr Exceptions setzen (VBL, Traps, u.a. fĂŒr die schönen Bömbchen)
-
DOS initialisieren, Datum setzen (immer 06.02.86)
-
Bootsektor Disk und Hard disk lesen und eventuell ausfĂŒhren
-
Auto-Ordner-Programme ausfĂŒhren (nur TOS-An-wendungen mit .PRG, sehr sinnig)
-
Desktop starten und Line-F-Emulator installieren
-
Eventuelle Accessories laden und starten
-
Desktop aufbauen
-
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.
- Achtung ! Beim Blitter-TOS geht die Funktion Kbdshift beim Start aus dem Autoordner nicht!!! Abhilfe: Zuerst Spacetaste drĂŒcken, danach sofort die Alternate-Taste.
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
********************************