Cool - Warm- und Kaltstart per Accessory

Ist man nicht stolzer Besitzer eines Zweitlaufwerkes oder gar einer Festplatte, installiert man notgedrungen eine resetfeste RAM-Disk im Speicher. Damit ergibt sich zwangsläufig das Problem: Wie entfernt man sie wieder?

Für Besitzer des neuen TOS 1.4 stellt sich diese Frage dank des Tastatur-Kaltstarts nicht. Da aber nicht in jedes Gerät das TOS 1.4 eingebaut wird - die neuen Geräte enthalten es wohl nicht, bei der Nachrüstung erlischt die Garantie wird hier eine softwaremäßige Lösung des Problems dargestellt.

Die Theorie

Um die relevanten Funktionen jederzeit zur Verfügung zu haben, bietet sich eine Realisation des Programms als Accessory an, da fast alle Programme, die mit RAM-Disks Zusammenarbeiten, entweder Accessories zulassen oder eine Quit-Funktion zum Desktop aufweisen. Wichtig ist auch, daß das Accessory möglichst wenig Speicherplatz belegt, schnell und zuverlässig arbeitet und prompt zu laden ist.

Die Praxis

Ein Accessory unterscheidet sich von einem normalen Programm in zwei Aspekten:

  1. Es muß eine Initialisierung vornehmen.
  2. Ein Accessory, welches selbst keine Endlosschleife darstellt, löst sofort einen Reset aus.

Die Initiaiisierung

Als erstes müssen immer zwei Befehle erfolgen:

gl_apid = appl_nit(); 
menu_register (gl_apid,"Name");

Die Funktion appl_init meldet die Anwendung an und ordnet ihre Applikationskennnummer einer Variablen zu (hier: gl_apid). Danach trägt die Funktion menu_register den Accessory-Namen in die Menüleiste ein, wobei die Kennummer und der Eintrag übergeben werden müssen. Hinweis: Die beiden Leerzeichen vor dem Namen dienen nur der Ästhetik.

Die Schleife

In C gibt es viele Möglichkeiten, eine Endlosschleife zu erstellen, eine einfache Lösung ist “while (1)”. Sobald das Accessory geöffnet ist, übergibt die Funktion “evnt_mesag” dem Nachrichtenpuffer einen Wert, der in den Libraries als AC_OPEN-Konstante definiert ist. Letztere wird durch “switch...case” überwacht - übrigens kann man auch “if” verwenden. Wird nun der Eintrag angeklickt, ist nur noch ein Fenster zu öffnen. Will man kein Resource-File verwenden, bietet sich die form_alert-Funktion an. Diese hat das Format:

a = form_alert (b,c)

a” wird der angeklickte Button übergeben, “b” legt fest, welcher der drei Knöpfe mit der Return-Taste zu erreichen ist, und “c” ist ein Pointer auf einen String im Format:

Symbol-Nummer Text Zeile 1 | Text Zeile 2 | Text Zeile 3 Button | 1 | Button 2 | Button 3

Schließlich muß die Benutzereingabe ausgewertet werden. Falls Abbruch gedrückt wird, springt man mit continue in die Endlosschleife zurück, falls nicht, wird entweder ein Reset oder ein Kaltstart ausgelöst.

Reset oder Kaltstart?

Der Reset (Warmstart) soll die gleiche Wirkung wie das Drücken des Reset-Knopfes haben, der Kaltstart dagegen soll sogar*den Ein-/Ausschalter emulieren, wobei natürlich jede RAM-Disk und (hoffentlich) jeder Virus entfernt wird. Beide Optionen greifen - mehr oder weniger direkt - auf geschützte Bereiche zu. Deshalb muß der Supervisormodus aktiviert sein. Dies bewirkt die erste Assembler-Sequenz.

Reset

Um einen Reset auszulösen, wird einfach an die Adresse der Initialisierungsroutine des TOS gesprungen (bei TOS 1.0 und 1.2: FC0000 hexadezimal ). Anmerkung: Die Initialisierungsroutine geht davon aus, daß der SV-Modus aktiv ist!

Kaltstart

Um einen brauchbaren Kaltstart zu erhalten, reicht es aus, die Systemvariable Memvalid zu verändern und dann wie beim Reset zu verfahren. Ist diese Variable ungleich Magic, “glaubt” das TOS, daß das RAM noch nicht initialisiert ist, und füllt es bei einem Reset mit Nullen.

Das Accessory sollte man nicht von Omikron BASIC aus aufrufen (Omikron mit Quit verlassen). Ebenso sind einige Leerzeichen im Copyrightstring notwendig, da im TOS 1.0 ein Fehler in der form_alert-Funktion ist, im Extremfall erscheint bei fehlenden Leerzeichen nur ein halbes Fenster.

/***********************************************/
/* Geschrieben haben dieses Accessory:         */
/*    Frank Müller ,Kirchheim/Teck             */
/*    Heiko Eisele ,Albershausen               */
/*    (c) MAXON Computer GmbH 1990             */
/***********************************************/

#include <gemdefs.h>
#include <osbind.h>

                    /**************************/ 
int gl_apid;        /* Applikationskennziffer */
int msgbuff[8];     /* Nachrichtenpuffer für  */
                    */ GEM-Aufruf             */
int knopf;          /**************************/

char *m = "[2][COOL - ACCESSORY|V 1.0|By FRANK & HEIKO ][Kaltstart|Warmstart|Abbruch]";

main() {
                    /**************************/ 
    gl_apid = appl_init();   /* GEM Anmeldung */ 
    menu_register (gl_apid,"  Kaltstart");
                             /* Menüeintrag   */ 
    while(1) {               /* Endlosschleife*/
        evnt_mesag(msgbuff); /* Auf Nachricht warten */
            switch (msgbuff[0]) { 
                case AC_OPEN: 
                    knopf = form_alert(3,m); /* Alertbox darstellen */ 
                    if (knopf -= 3) /* Abbruch ? */
                        continue;   /* ja! */
            /* Den Supervisormodus einschalten */ 
                    asm {       clr.l -(A7) 
                                move.w #0x20,-(A7) 
                                trap #1 
                                addq.l #6,A7    }
                    if (knopf == 2)
            /* Warmstart ? */
            /* Resetroutine anspringen */
                        asm { jmp 0xFC0000 } 
                    if (knopf == 1)
            /* Kaltstart ? */
            /* Memvalid verändern und Resetroutine anspringen */ 
                        asm { move.w #0x420,A0
                            move.l #0x111,(A0) 
                            jmp 0xFC0000
                        }}
    }
}

Frank Müller
Aus: ST-Computer 04 / 1990, Seite 92

Links

Copyright-Bestimmungen: siehe Über diese Seite