Booten mit SYSTEM: Accessories aus dem Ordner booten

Mit der Hilfe von Ordnern ist eine übersichtliche Organisation von Daten und Programmen möglich. Das ermöglicht erst ein vernünftiges Arbeiten mit Festplatten. So sind z.B. alle Programme, die bei einem Systemstart automatisch ausgeführt werden sollen, in dem Auto-Ordner zusammengefaßt. Leider ist dies mit Accessories nicht möglich. Sie müssen im Wurzelverzeichnis des Boot-Laufwerks abgelegt sein. Das Programm System ermöglicht es jetzt, Accessories in einem Ordner SYSTEM.ACC zusammenzufassen. Als weitere Anwendung ermöglicht das Programm das Setzen des Environment-Strings für GEM.

System muß aus dem Auto-Ordner gestartet werden, damit es sich vor dem Laden und Starten der Accessories installieren kann. Wird es vom Desktop aus gestartet, erscheint eine Fehlermeldung. Die Installation des Programms läßt sich durch Drücken der Control-Taste beim Booten verhindern. Ist System erfolgreich installiert, werden nur Accessories aus dem Ordner SYSTEM.ACC geladen und gestartet. Die, die sich im Wurzelverzeichnis befinden, werden nicht geladen.

Environment-Strings

Das Laden aus dem "SYSTEM.ACC"-Ordner funktioniert bei Accessories mit RSC-Dateien leider nicht ohne weiteres. Das GEM sucht die RSC-Dateien nur im aktuellen Verzeichnis, was in diesem Fall dem Wurzelverzeichnis entspricht. Es sucht auch noch in jedem Ordner, der durch die Environment-Variable PATH angegeben ist. Leider setzt das GEM die Variable nur auf ,PATH=;?:‘ (? = Bootlaufwerk). Zum Laden der RSC-Dateien aus dem SYSTEM.ACC-Ordner müßte die Variable auf ,PATH=;?:;?:\SYSTEM.ACC‘ gesetzt werden. Die Variable sollte eigentlich ,PATH=?:;?:\SYSTEM.ACC‘ heißen, aber durch einen TOS-Fehler muß nach ,PATH=‘ eineingesetzt werden. Nach dem Variablennamen PATH können dann weitere Pfade folgen, jeweils durch Semikolon getrennt.

Turbo C 2.0 ermöglicht es, z.B. mit der Environment-Variablen TC einen Pfad anzugeben, in dem sich dann die Help-Dateien der Assembler und der Linker befinden müssen. Eine weitere Anwendung ist, daß Angeben eines Pfades für das Clipboard. Dies geschieht mit der Environment-Variable CLIPBRD. Jedes Programm, das das Clipboard unterstützt, muß zuerst die Environment-Variable CLIP-BRD abfragen. Sollte sie vorhanden sein, darf das Programm sich nur auf diesen Pfad beziehen. Dieser Pfad sollte auch noch mit SCRP_WRITE (AES 81) gesetzt werden. Befindet sich im angegebenen Pfad kein Clipboard-Ordner, muß man ihn noch angelegen. Nur wenn die Environment-Variable CLIPBRD nicht vorhanden ist, darf der Pfad des Clipboard mit SCRP_READ (AES 89) gelesen werden. Damit ist sichergestellt, daß sich alle Programme auf den gleichen Pfad beziehen, d.h. es würde sich nicht auf jedem Boot-Laufwerk ein Clipboard-Ordner befinden.

SYSTEM.INF

Wird System aus dem Auto-Ordner gestartet, lädt es die Datei .SYSTEM.INF1 nach, die auch im Auto-Ordner stehen muß. In dieser Datei sollten die Environment-Strings enthalten sein, wobei jeder String mit Return abgeschlossen sein muß. Die erste Variable sollte die PATH-Variable sein. Das Programm funktioniert auch ohne SYSTEM.INF; es werden dann aber nur die Pfad variablen für das Wurzelverzeichnis und den SYSTEM. ACC-Ordner gesetzt.

Das Setzen der Environment-Strings ist natürlich nur einem Programm möglich, da es nur einen Zeiger auf sie gibt. Sollte das erste Zeichen von SYSTEM.INF ein ,-‘ sein, setzt das Programm die Environment-Strings nicht. Damit ist es einem anderen Programm möglich, sie zu setzen. Die Environment-Strings dürfen höchstens eine Länge von 224 Bytes haben. Will man größere setzen, muß ENV_BUFFER auf einen größeren Wert im Listing gesetzt werden.

Programmbeschreibung

Bei einem Systemstart setzt das GEM mit Dsetpath (Gemdos 59) einen Pfad auf das Wurzelverzeichnis. Danach sucht es mit der Fsfirst (Gemdos 78) mit der Suchmaske ,*.ACC‘ nach den Accessories im Wurzelverzeichnis. Das Setzen des Pfades und das Suchen geschieht zweimal hintereinander.

System hängt sich nun nach dem XBRA-Protokoll in den Gemdos-Trap (Trap #1) Systemvariable $84 ein und wartet auf einen Fsfirst-Aufruf. Hat der Aufruf die Suchmaske ,*.ACC‘ und kommt vom Desktop, wird die Rücksprungadresse durch die Adresse von MY_PATH ersetzt.

Die Routine MY_PATH setzt nun einen neuen Pfad (VSYSTEM.ACC) und sucht in diesem Ordner mit einem Fsfirst-Aufruf (\SYSTEM.ACC*.ACC) nach Accessories. Danach springt es zu der original Routine zurück. Es reicht, wenn die ersten beiden Fsfirst-Aufrufe abgefangen werden. Deshalb wird die Variable COUNTER bei jedem Aufruf um eins erniedrigt. Elat sie einen Wert von Null, springt die Routine NEW_GEMDOS immer den alten Gemdos-Vektor an.

Der Zeiger _run enthält die Adresse eines Zeigers auf die aktuelle Basepage. Mit ihrer Hilfe wird festgestellt, ob das Desktop das aktuelle Programm ist. Der Zeiger kbshift zeigt auf ein Byte, in dem der Tastaturstatus abgelegt ist. Durch den Tastaturstatus wird ein Drücken der Control-Taste abgefragt. Beide Zeiger sind ab TOS 1.2 in der SYSHDR-Struktur abgelegt.

Fsfirst-Aufruf  
move.w  attribs,-(sp)   ;Dateityp
pea     fspec           ;Zeiger auf Dateinamen
move.w  #$4e,-(sp)      ;Gemdos-Nummer
trap    #1  
Stack-Aufbau bei einem Fsfirst-Aufruf im User-Modus Stack-Aufbau bei einem Fsfirst-Aufruf im Supervisor-Modus

User-Stack für 680xx:

Adresse Parameter
USP $4e
USP+2 fspec
USP+6 attribs

Supervisor-Stack für 68000:

Adresse Parameter
SSP Statusregister
SSP+2 Rücksprungadresse

Supervisor-Stack ab 68010:

Adresse Parameter
SSP Statusregister
SSP+2 Rücksprungadresse
SSP+6 Format-Code

Supervisor Stack für 68000:

Adresse Parameter
SSP Statusregister
SSP+2 Rücksprungadresse
SSP+6 $4e
SSP+8 fspec
SSP+12 attribs

Supervisor-Stack ab 68010:

Adresse Parameter
SSP Statusregister
SSP+2 Rücksprungadresse
SSP+6 Format-Code
SSP+8 $4e
SSP+10 fspec
SSP+14 attribs

Speicherbelegung

Der Programmteil von RESI_ANFANG bis RESI_ENDE bleibt resident im Speicher. Bei System sind das 744 Bytes, wobei die Basepage mit 256 Bytes schon eingerechnet ist. Das Programm ist so ausgelegt, daß die Installierungsroutinen sich hinter dem residenten Teil des Programms befinden. Dadurch kann der Speicherplatz der Installierungsroutinen nach erfolgreicher Installation dem Systemspeicher wieder zur Verfügung gestellt werden.

Betriebsarten

Die 680xx-CPU hat zwei Betriebsarten, zum einem den Supervisor-, und zum anderen den User-Modus. Jede der beiden Betriebsarten hat einen eigenen Stapelzeiger. Will man feststellen, welche Funktion bei einem Gemdos-Aufruf vorliegt, muß man zuerst herausfinden, in welchem Betriebsmodus der Gemdos-Aufruf gemacht wurde. Dazu muß das Statusregister vom Stack geholt werden. Nun wird Bit 13 (Supervisor-Flag) des Statusregisters überprüft. Ist dies gesetzt, wurde der Aufruf aus dem Supervisor-Modus ausgeführt. Hat man jetzt den Betriebsmodus festgestellt, lädt man den entsprechenden Stapelzeiger. Da die Parameter vor jedem Gemdos-Aufruf auf dem Stack abgelegt werden, kann man nun die Parameter verändern. Dabei muß beachten werden, daß die Parameter auf dem Stack jetzt in umgekehrter Reihenfolge vorliegen.

Bei den Nachfolgern der 68000-CPU wird ein zusätzliches Wort im Supervisor-Modus bei einem Gemdos-Aufruf auf dem Stack abgelegt, der Format Code. Damit System auch auf diesen Prozessoren läuft, wird in diesem Fall ein Offset von zwei Bytes bei einem Gemdos-Aufruf im Supervisor-Modus dazuaddiert.

PATH=;?:;?:\SYSTEM.ACC;D:\1ST_WORD;E:\RESOURCE TC=D:\TC_2\HELP 
CLIPBRD=D:\SYSTEM\CLIPBRD

Beispiel für SYSTEM.INF

    '-' -> kein Environment-String setzen  
    ,?' -> Platzhalter für Boot-Laufwerk

Sonderzeichen für SYSTEM.INF

Um den Prozessor festzustellen, sucht das Programm das Cookie ,_CPU‘. Die Systemvariable _p_cookies ($5a0) enthält den Zeiger auf die Cookies. Sollte kein Zeiger vorhanden sein, nimmt das Programm an, daß eine 68000-CPU vorhanden ist.

Environment setzen

Das AES wird wie jedes andere Programm auch vom Gemdos mit der Pexec-Funktion (Gemdos 75) gestartet. Dabei springt es durch den exec_os-Vektor (Systemvariable $4fe). System installiert sich nach dem XBRA-Protokoll in diesen Vektor und wartet darauf, daß das AES vom Gemdos gestartet wird. Sollen die Environment-Strings von System gesetzt werden, wartet das Programm solange, bis der exec_os-Vektor angesprungen wird. Dann holt es sich die Adresse der Basepage. Der Zeiger auf den Environment hat einen Offset von $2c auf die Basepage. Jetzt überschreibt System diesen Zeiger mit der Adresse von NEW_ENV. Damit sind die neuen Environment-Strings gesetzt.

System wurde auf einem ST Computer unter TOS 1.4 entwickelt, müßte aber mit jeder TOS-Version laufen die den Gemdos-Aufruf Fsfirst zum Suchen der Acc benutzt. Das Programm sollte auch mit jeder 680xx CPU arbeiten. Als Assembler wurde der Makroassembler von Turbo C 2.0 verwendet.

Ralf Stacks

Literatur:

Jan Bolt: „Environment Strings“,
ST Computer 9/91

Julian Reschke: „Environment Variablen“,
ST Magazin 6/90

Eric Böhnisch: „ Clipboard“,
ST Computer 7/8/90

Friedei van Megen: „ Trashcan ST“,
ST Computer 12/91

Jankowski/Reschke/Rabich:
„Atari ST Profibuch“, Sybex Verlag

; *_________________________*
; *    System               *
; *    by Ralf Stachs       *
; * (c) 1992 MAXON Computer *
; *-------------------------*

;###################################
;# Größe des Environment Speichers #
;###################################

ENV_BUFFER equ 200

;TRAPS 
;*****
GEMDOS equ 1 
BIOS    equ 13
XBIOS equ 14


    TEXT
;Anfang des resident gehaltenen Speicher 
RESI_ANFANG:

;zuerst System installieren 
    jmp INSTALL

;######################
;# Neue Gemdosroutine #
;######################
;XBRA Protokoll der neuen Gemdosroutine
        dc.b "XBRA" ;XBRA Protokoll
        dc.b "RS23" ;eigene Erkennung
OLD_GEMDOS: dc.l 0  ;alter Vektor

NEW_GEMDOS:
;nach zweitem Fsfirst aufruf NEW_GEMDOS ausgehängt 
    tst.b COUNTER   ;Counter gleich 0
    beq ENDE        ;ja, dann ende

;Stack bestimmen
    move.l usp,a0   ;Zeiger auf Userstack (USP) holen

;Gemdos Aufruf aus Supervisor Modus?
    move.w (sp),d0  ;Statusreg. von Stack hol
    btst #13,d0     ;Supervisormodus ?
    beq USER        ;nein User Modus

;Zeiger auf Gemdosaufruf (SSP)
    move.l a7,a0        ;Stackpointer (SSP) holen
    move.w OFFSET,d0    ;Offset ab 68010
    lea 6(a0,d0.w),a0   ;Zeiger auf Gemdosaufruf

;Gemdosnummer holen
USER: move.w (a0)+,d0   ;Gemdosnummer holen
    cmp.w #78,d0        ;Fsfirst Aufruf
    bne ENDE            ;Nein

;Suchname = '\*.ACC'
    move.l (a0),a0      ;Zeiger auf Suchnamen
    cmp.b #'\',(a0)+    ;Suchname '\'
    bne ENDE            ;nein dann ende
    cmp.b #'*',(a0)+    ;Suchname '*'
    bne ENDE            ;nein dann ende
    cmp.b #'.',(a0)+    ;Suchname
    bne ENDE            ;nein dann ende
    cmp.b #'A',(a0)+    ;Suchname 'A'
    bne ENDE            ;nein dann ende
    cmp.b #'C',(a0)+    ;Suchname ' C'
    bne ENDE            ;nein dann ende
    cmp.b #'C',(a0)+    ;Suchname 'C'
    bne ENDE            ;nein dann ende

;Gemdosaufruf Fsfirst mit richtigem Suchname liegt vor
;************************************************* 
;Desktop aktuelles PRG ?
    move.l  A_RUN,a0    ;Adresse auf Zeiger der aktuellen Basepage 
    move.l  (a0),a0     ;Zeiger auf Basepage
    tst.l $C(a0)        ;Länge des Programmcode = 0 
    bne ENDE            ;nein, nicht Desktop

;Rücksprungadresse merken
    move.l  2(a7),a0    ;Rücksprungadresse vom SSP holen
    move.l a0,RETURN    ;und sichern

;und neue Rücksprungadresse setzen
    move.l #MY_PATH,2(a7) ;Rücksprung zu eigener Routine

;Aufrufe Zählen
    sub.b #1,COUNTER    ;Counter herunterzählen

;alten Gemdosvektor anspringen
ENDE: move.l OLD_GEMDOS,a0 ;alten Gemdosvektor laden
    jmp (a0)            ;und anspringen

;Eigene Routine nach Fsfirst von GEM 
;***********************************
MY_PATH:movem.1 dl-d7/a0-a6,-(sp) ;Register retten

;neuen Pfad setzen "\SYSTEM.ACC"
    move.l #PATH,-(sp)  ;Pfad "\SYSTEM.ACC"
    move.w #59,-(sp)    ;Dsetpath aufrufen
    trap #GEMDOS 
    addq.l #6,sp

;Directory nach ACC absuchen 
;ersetzt den Original Fsfirst (GEM) Aufruf 
    move.w #0,-(sp)     ;normaler Dateityp
    pea PATH_2          ;Pfad "\SYSTEM.ACC\*.ACC"
    move.w #78,-(sp)    ;Fsfirst aufrufen
    trap #GEMDOS
    addq.l #8,sp

    movem.1 (sp)+,d1-d7/a0-a6 ;Register zurückschreiben

;zur alten Fsfirst Routine (GEM) springen
    move.l RETURN,a0    ;alte Rücksprungadresse 
    jmp (a0)            ;anspringen

;##################################
;# setzen der Environment Strings #
;##################################
;XBRA Protokoll für
    dc.b "XBRA"         ;XBRA Protokoll
    dc.b "RS23"         ;eigene Erkennung
OLD_EXEC_OS:dc.1 0      ;alter Vektor

NEW_EXEC_OS:
    move.l 4(sp),a0     ;Adresse BASEPAGE
    move.l #NEW_ENV,$2c(a0) ;neues Environment setzen

    move.l OLD_EXEC_OS,a0 ;alten Vektor 
    jmp (a0)            ;anspringen

;Variablen und Flags 
;*******************
    ;OFFSET -> ab 68010 ein offset von 2 für Formate-Code
    ;RETURN -> Rücksprungadresse der Fsfirst Routine (GEM)
    ;A_RUN -> Adresse von Zeiger auf aktueller Basepage
    ;COUNTER -> Anzahl der Aufrufe bis NEW_GEMDOS ausgehängt wird 
OFFSET: dc.w    0
RETURN: dc.l    0
A_RUN:  dc.l    0
COUNTER: dc.b 2 
        dc.b 0

    EVEN
    ;Pfad zum laden der ACC 
PATH:   dc.b "\SYSTEM.ACC",0

    EVEN
    ;Pfad für Fsfirst 
PATH_2: dc.b    "\SYSTEM.ACC\*.ACC",0

    EVEN
    ;neue Environment Strings 
NEW_ENV: dc.b "PATH=/?:/?:\SYSTEM.ACC",0,0
            ;Voreinstellung ohne SYSTEM.INF 
            ds.b ENV_BUFFER ;200 Bytes für Environment 
            dc.b -1,0       ;Ende des Buffers (-1)

;Ende des resident gehaltenen Speicher   ^

RESI_ENDE:

;#############################
;#  Installierung von System #
;#############################
    TEXT
    EVEN

;gesamt-PRG Speicher belegen 
INSTALL:
    move.l  sp,a6       ;Adresse BASEPAGE
    lea     USTACK,sp   ;neuer Stack

    move.l  4(a6),a6    ;Speicher belegen
    move.l  $c(a6),a4
    adda.l  $14(a6),a4
    adda.1  $1c(a6),a4

    pea     256(a4)
    pea     (a6)
    clr.w   -(sp)
    move.w  #74,-(sp)   ;Mshrink aufrufen

    trap    #GEMDOS 
    lea     12(sp),sp

;Start aus Autoordner ? (AES anmelden)
    lea contrl,a0       ;Adresse contrl nach aO
    move.w #10,(a0)+    ;Opcode
    clr.w (a0)+         ;einträge int_in
    move.w #1,(a0)      ;einträge int_out
    clr.w (a0)+         ;einträge addr_in
    clr.w (a0)          ;einträge addr_out

    move.l #aes_data,d1 ;Adresse AES-Array 
    move.w #$c8,d0      ;AES_Aufruf
    trap #2

    tst.w aes_global    ;starten aus AUTO-Ordner
    beq SP_20           ;ja, keine ap__version

;vom desktop aus gestartet 
;SYSTEM nur aus Auto Ordner starten 
    pea STRING_4 
    jmp ERROR

;###########################################
;# internes Setzen der Environment Strings # 
;########################################### 
;aktuelles Laufwerk für SYSTEM.INF lesen 
SP_20:  move.w #$19,-(sp) ;Dgetdrv aufrufen
    trap #GEMDOS 
    addq.l #2,sp

    add.b #"A",d0   ;Laufwerksbuchstabe berechnen
    move.b d0,FNAME ;Laufwerksbuchstabe in Pfad setzen 
    move.b d0,NEW_ENV+6 ;Voreinstellung für Environment Variable Path 
    move.b d0,NEW_ENV+10 ;Voreinstellung für Environment Variable Path

;SYSTEM.INF öffnen (?:\AUTO\SYSTEM.INF) 
    move.w #0,-(sp)     ;nur lesen
    pea FNAME           ;Pfad mit Dateinamen
    move.w #$3d,-(sp)   ;Fopen aufrufen
    trap #GEMDOS 
    addq.l #8,sp

    tst.w dO            ;SYSTEM.INF nicht vorhanden
    bmi SP_21           ;ja, Rückgabewert negativ
    move.w d0,FILE_HANDLE ;Handle merken

;SYSTEM.INF lesen
    lea NEW_ENV,a6      ;Adresse der Environment Strings

SP_23:  tst.b (a6)      ;ende des Buffer (negativ) 
    bpl SP_28           ;nein

;Fehlermeldung ausgeben wenn ende des Puffer erreicht
    pea STRING_5
    move.w #9,-(sp) 
    trap #GEMDOS 
    addq.l #6,sp

;auf Taste warten
    move.w #2,-(sp)     ;von Tastatur
    move.w #2,-(sp)     ;Bconin
    trap #BIOS 
    addq.l #4,sp
    bra SP_22           ; SYSTEM. INF schließen

SP_28:  move.1 a6,-(sp) ;Adresse des Buffers
    move.l #1,-(sp)     ;Anzahl der Bytes
    move.w FILE_HANDLE,-(sp) 
    move.w #$3f,-(sp)   ;Fread
    trap #GEMDOS 
    lea $c(sp),sp

    tst.l d0            ;Ende von SYSTEM.INF
    beq SP_22           ;ja, kein Zeichen gelesen

;Daten von SYSTEM.INF in Environment schreiben 
    move.b (a6),d0      ;Zeichen holen

    cmp.b #’?',d0       ;Bootlaufwerk ?
    bne SP_26           ;nein, dann weiter
    move.b FNAME,(a6)   ;ja, Bootlaufwerk eintragen

SP_26:  cmp.b #13,d0    ;Return
    beq SP_23           ;ja, Zeichen überschreiben

    cmp.b #10,d0        ;Line Feed
    bne SP_24           ;nein, Buffer plus 1
    move.b #0,(a6)      ;ja, dann ende des Strings

SP_24:  add.l #1,a6     ;Adresse des Buffers plus 1
    bra SP_23           ;nächstes Zeichen lesen

;Ende von SYSTEM.INF
SP_22:  move.b #0,(a6)  ;Doppel null als ende

;SYSTEM.INF schließen
    move.w FILE_HANDLE,-(sp) 
    move.w #$3E,-(sp)   ;Fclose aufrufen
    trap #GEMDOS 
    addq.l #4,sp

;zur Installierung in Supervisor-Modus 
;*************************************

SP_21:  lea INIT_GEMDOS,a0 ;Adresse von INIT_GEMDOS nach a0
    pea (a0)
    move.w #$26,-(sp)   ;Supexec aufrufen
    trap #XBIOS 
    addq.l #6,sp

;Installierung abgeschlossen und String ausgeben 
    pea STRING_2 
    move.w #9,-(sp) 
    trap #GEMDOS 
    addq.l #6,sp

;neue Gemdos-Routine resident im Speicher halten 
;von RESI_ENDE bis RESI_ANFANG 
    clr.w -(sp)
    pea RESI_ENDE-RESI_ANFANG+256
    move.w #49,-(sp)    ;Ptermres aufrufen
    trap #GEMDOS

; ################################################## 
; neue GEMDOS-Routine im Supervisor-Modus installieren
; ##################################################
;Adresse von Kbshift ermitteln
;und bei gedrückter Control Taste abbrechen
INIT_GEMDOS:
    move.l #$e1b,a1     ;vorgabe für TOS 1.0 (Kbshift)
    move.l #$602c,A_RUN ;vorgabe für TOS 1.0 (Basepage)
    move.l $4f2,a0      ;sysbase a0 = Anfangsadresse des Betriebssystem

    cmp.w #$0100,2(a0)  ;TOS 1.0
    beq SP_9            ;ja

    move.l 36(a0)/a1    ;(a1) Adresse von Kbshift
    move.l 40(a0),A_RUN ;Adresse auf Zeiger der aktuellen Basepage

SP_9:   btst.b #2,(a1)  ;Control Taste gedrückt
    beq SP_12           ;nein, dann weiter

;Installieren durch drücken der Control Taste abgebrochen
    pea STRING_3 
    jmp ERROR

;System schon installiert ?
;***************************
SP_12:  move.l $84,a0   ;Adresse des Gemdosvektor nach a0

SP_1: cmp.l #"RS23",-8(a0) ;System schon vorhanden 
    beq SP_2            ;ja, System dann ende

    cmp.l #"XBRA",-12(a0) ;XBRA Kennung 
    bne SP_4            ;nein, dann System installieren

    move.l -4(a0),a1    ;Adresse der nächsten Gemdosvektors 
    move.l a1,a0        ;von a1 nach a0
    bra SP_1            ;weiter

;System war schon installiert 
;****************************
;Meldung System schon installiert 
SP_2: pea STRING_1 
    jmp ERROR

;System installieren 
;********************
SP_4: move.l $84,OLD_GEMDOS  ;alten Gemdosvektor sichern 
    move.l #NEW_GEMDOS,$84  ;und neuen Gemdosvektor setzen

    cmp.b #'-',NEW_ENV      ;Environment setzen
    beq SP_8                ;nein, erstes Zeichen dann nicht setzen

    move.l $4fe,OLD_EXEC_OS ;alten exec_os Vektor sichern 
    move.l #NEW_EXEC_OS,$4fe ;und neuen exec_os Vektor setzen

;Prozessor feststellen
SP_8:   move.l $5a0,d0  ;_p_cookies laden Zeiger vorhanden 
    beq _68000          ;nein, dann 68000
    move.l d0,a0        ;Zeiger auf Cookies in a0

SP_31:  move.l (a0)+,d1 ;Cookie ID-Code in d1
    beq _68000          ;das war der letzte dann 68000 
    cmp.l #"_CPU",d1    ;CPU Cookie suchen
    beq SP_30           ;gefunden
    add.l #4,a0         ;Cookie Wert überspringen 
    bra SP_31           ;weiter suchen

;CPU Cookie gefunden
SP_30:  tst.l (a0)      ;Cookie Wert testen
    beq _68000          ;Cookie Wert = 0 dann 68000

    move.w #2,OFFSET    ;ab 68010 offset von 2

_68000: rts

;###############################################
;# Fehlermeldung ausgeben und auf Taste warten # 
;###############################################
ERROR:  move.w #9,-(sp)
    trap #GEMDOS 
    addq.l #6,sp

;auf Taste warten
    move.w #2,-(sp)     ;von Tastatur
    move.w #2,-(sp)     ;Bconin
    trap #BIOS 
    addq.l #4,sp

;PRG beenden
    clr.w -(sp) 
    trap #GEMDOS

;################
;# Datensegment #
;################
    DATA
    ;FILE_HANDLE -> Handle von SYSTEM.INF 
FILE_HANDLE: dc.w 0

    EVEN
    ;Pfad von SYSTEM.INF 
FNAME:  dc.b "A:\AUTO\SYSTEM.INF",0

    EVEN
STRING_1:   dc.b 13,10,"**********"
        dc.b 13,10,"*** System ist schon installiert " 
        dc.b 13,10,"*** Taste drücken" 
        dc.b 13,10,"**********",13,10,0

    EVEN
STRING_2 :  dc.b 27,"p"
        dc.b 13,10,"+****************+" 
        dc.b 13,10,"+   System 1.0   +"
        dc.b 13,10,"+                +"
        dc.b 13,10,"+   Ralf Stachs  +"
        dc.b 13,10,"+   ST Computer  +"
        dc.b 13 10,"+****************+" 
        dc.b 13,10,27,"q",0
    EVEN
STRING_3:   dc.b 27,"p"
        dc.b 13,10,"**********" 
        dc.b 13,10,"*** System wird nicht installiert " 
        dc.b 13,10,"*** Taste drücken
        dc.b 13,10,"**********",13,10 
        dc.b 27,"q",0
    EVEN
STRING_4:   dc.b 27,"E"
        dc.b 13,10,"*** SYSTEM.PRG nur aus dem Auto Ordner starten" 
        dc.b 13,10,"*** Taste drücken",13,10,0
    EVEN
STRING_5:   dc.b 27,"p"
        dc.b 13,10,"**********" 
        dc.b 13,10,"*** Environment Speicher voll max. 224 Zeichen" 
        dc.b 13,10,"*** Taste drücken
        dc.b 13,10,"**********",13,10 
        dc.b 27,"q",0

    EVEN
aes_data:   dc.1 contrl
        dc.1 aes_global 
        dc.1 init_in 
        dc.l init_out 
        dc.1 addr_in 
        dc.1 addr_out

;###############
;# BSS-Segment #
;###############
    EVEN
    BSS

aes_global: ds.w 15
contrl:     ds.w 10
init_in:    ds.w 128
init_out:   ds.w 128
addr_in:    ds.1 128
addr_out:   ds.l 128

            ds.b 256 
sUSTACK:    ds.w 0


Ralf Stacks



Links

Copyright-Bestimmungen: siehe Über diese Seite
Classic Computer Magazines
[ Join Now | Ring Hub | Random | << Prev | Next >> ]