Change & Boot

Mittlerweile ist die professionelle Software an den TT angepaßt. Leider gibt es im Public Domain und im Spiele-Sektor noch immer genügend Programme, die dies nicht sind. Daher wurden bereits einige Utilities geschrieben, die den TT hinsichtlich der Kompatibilität verbessern. Dabei wurde allerdings ein Aspekt vergessen…

In der ST-COMPUTER wurden einige Programme vorgestellt, die den TT so beeinflussen, daß er bestimmte Richtlinienverletzungen akzeptiert. Ist beispielsweise ein Programm nicht an die 32-Bit-Adressierung angepaßt, so läßt es sich nach einer entsprechenden PMMU-Programmierung trotzdem einsetzen (siehe hierzu die Ausgaben 4 und 5/91).

In einigen Anleitungen liest man zum Thema „Starten des Programms“ aber folgenden Satz:

„Schalten Sie den Computer aus und trennen sie überflüssige Hardware vom System. Schalten Sie dann den Computer wieder ein. Das Programm lädt und startet automatisch.“ Welche Bedeutung hat dieser Satz für den Anwender, der seine altbewährte Software nun am neuen TT einsetzen will? Wurde die Software gemäß den Richtlinien programmiert, ergeben sich für ihn keine Nachteile. Tritt jedoch ein Problem auf, das den Einsatz der oben angesprochenen Adaptionsprogramme nötig macht, kommt es zu Komplikationen, da die Software gleich nach dem Einschalten geladen wird und somit vorher keine Möglichkeit zum Aufruf der Utilities gegeben ist. Auch der Versuch, den TT erst normal einzuschalten, die Veränderungen vorzunehmen und dann den Resetknopf zu drücken, ist zum Scheitern verurteilt, da ein Warmstart „alles“ wieder in den Ausgangszustand zurückversetzt.

Allgemeine Erklärung

Die gängigen Methoden, größere Programme nach der System(re)initialisierung automatisch zu starten, werden in der Praxis folgendermaßen verwirklicht:

a) durch ein Ladeprogramm im Auto-Ordner der Diskette/ Festplatte

b) durch ein Ladeprogramm im Boot-Sektor der Diskette

Loader im Boot- oder gar Root-Sektor der Festplatte sind ausschließlich Festplattentreiber und stellen für uns kein Thema dar.

Im Auto-Ordner

Befindet sich lediglich ein Programm im Auto-Ordner des verwendeten Mediums, ist das Problem recht schnell beseitigt. Man muß nur dafür sorgen, daß die nötigen Utilities physikalisch vor dem Loader im Auto-Ordner untergebracht sind. Dies läßt sich leicht mit einem Diskettenmonitor erledigen. Im übrigen braucht man meistens Adaptionsprogramme für die Änderung folgender Grundeinstellungen:

Für die letzten beiden Punkte stellt das in den oben genannten Ausgaben veröffentlichte Programm eine gute Lösung dar. Das Auflösungsproblem ist mit einem C-Programm schnell gelöst, wobei für den dritten Parameter Werte von 0 (ST-LOW) bis 6 (TT-HIGH) in Frage kommen:

#include<tos.h 
void main()
{
	Setscreen( Logbase(), Physbase(), 0 );
}

Im Boot-Sektor

Befindet sich allerdings ein Programm im Boot-Sektor der Diskette, wird die Sachlage drastisch verkompliziert. Es ist nämlich nicht ohne weiteres möglich, Programme vor dem Ausführen dieses Sektors laden zu lassen, denn er wird direkt nach den eventuell vorhandenen resetfesten bzw. residenten Programmen ausgeführt. Daher muß ein völlig anderer Weg eingeschlagen werden. Der Grundgedanke ist, auf den Reset völlig zu verzichten und den Loader „manuell“ zu aktivieren. Bei dieser Vorgehensweise wird zunächst normal gebootet und anschließend die gewünschte Veränderung vorgenommen. Erst dann wird ohne vorherigen Warmstart das Boot-Programm „per Fland“ gestartet, wobei natürlich die Veränderung erhalten bleibt.

Praktische Vorüberlegungen

Der Satz aus der Anleitung hat natürlich einen Sinn: Durch das „Entfernen überflüssiger Hardware“ und den Kaltstart soll der Software ein spezifischer Ausgangszustand garantiert werden. Das Entfernen der „überflüssigen“ Hardware übernimmt ja bereits das Adaptionsprogramm. Es fehlt also nur noch ein Programm, das den Loader startet und vorher eventuell noch etwas aufräumt. Letzteres ist nur bedingt nötig, da die meisten Autostartprogramme ohnehin sofort den gesamten Rechner annektieren, d.h. alle Interrupts sperren oder übernehmen und den ganzen freien Speicher reservieren.

Programmbesprechung

Der erste Schritt ist die Freigabe des nicht benötigten Speichers, womit ausschließlich der dem Programm übergebene Speicher gemeint ist. Danach muß die Möglichkeit zum Diskettenwechsel gegeben sein, da der Start des Assemblerprogramms von einer Diskette erfolgt sein könnte, deren Boot-Sektor nicht der richtige ist. Hat der Anwender den Wechsel vollzogen und bestätigt, wird der Loader eingelesen. Da „errare“ bekanntlich „humanum est“, ist an dieser Stelle eine weitere passive Sicherheitsmaßnahme sinnvoll. Es werden beim Booten normalerweise nur Boot-Sektoren ausgeführt, die eine bestimmte Prüfsumme enthalten: Die Word-Summe aller 256 Words des Sektors muß dezimal 4660 ergeben. Sollte dieser Wert in unserem Fall abweichen, ist in Betracht zu ziehen, daß die Diskette verwechselt worden ist. Dementsprechend wird eine Warnmeldung ausgegeben, die auch dann erscheint, wenn keine (formatierte) Diskette eingelegt wurde, da die Prüfsumme von nicht vorhandenen Daten ebenfalls vom obigen Wert abweicht.

Schließlich wird der Supervisor-Modus aktiviert und dann der Boot-Code angesprungen. Letzteres führt zu dem offenen (Programm)Schluß, weil der Loader nicht mehr zurückkehrt, sondern die restliche Diskette lädt.

; Ersatzloader für BootSektoren
; by Frank Müller (c) 1992 MAXON Computer
TEXT

move.l	4{sp),a0
move.l	$0c(A0),a1
add.l	$14(A0),a1
add.l	$1C(A0),a1
add.l	#4256,a1	; Stack	+ Basepagelänge
move.l	a0,sp		; Stack...
adda.l	a1,sp		; ... ans Programmende
move.l	a1,-(sp)	; Größe
move.l	a0,-(sp)	; Adresse
clr.w	-(sp)		; Dummy-Null
move.w	#$4A,-(sp)	; Gemdos 74
trap	#1
add.l	#12,sp

pea	info			; Aufforderung zum
move.w	#9,-(sp)	; Diskettenwechsel
trap	#1			; ausgeben
addq.l	#6,sp

move.w	#1,-(sp)	; Auf Tastendruck
trap	#1			; warten
addq.l	#2,sp

move.w	#1,-(sp)	; 1 Sektor
move.w	#0,-(sp)	; Seite 0
move.w	#0,-(sp)	; Track 0
move.w	#1,-(sp)	; Sektor 1	(Bootsektor)
move.w	#0,-(sp)	; Laufwerk	a
clr.l	-(sp)
move.l	#DISK,-(sp)
move.w	#8,-(sp)
trap	#14			; lesen
add.w	#20,sp

clr.w	D0
move.w	#256,D1		; siehe	Artikel
lea	DISK,A0
mark:
add.w	(A0)+,D0
subq.w	#1,D1
cmpi.w	#0,D1
bne mark

cmpi.w #4660,D0 ; 4660 = $1234 
beq do_it
pea	warn			; WARNMELDUNG
move.w	#9,-(sp)	; (NO MAGIC)
trap	#1			; ausgeben
addq.l	#6,sp

move.w	#1,-(sp)	; Taste einlesen
trap	#1
addq.1	#2, sp
cmpi	#'j',D0
beq do_it

move.w #0,-(sp)
trap	#1			; ENDE

do_it:
move.l #0,-(SP) 
move.w #$20,-(SP) 
trap	#1
addq.l #6,SP 
jmp DISK
;Rückkehr gibt's keine.

.data

info: dc.b 27,'E',"Bitte Bootdiskette einlegen" 
	dc.b "(RETURN)",0 
warn: dc.b 27,'E',"BOOTSEKTOR NICHT AUSFÜHRBAR." 
	dc.b "TROTZDEM WEITER (j/n)?",0
even
DISK: ds 514	; Platz	für	Bootsektor
.end

Frank Müller
Aus: ST-Computer 10 / 1992, Seite 82

Links

Copyright-Bestimmungen: siehe Über diese Seite