BOOT

Aus C64-Wiki
Zur Navigation springenZur Suche springen
BOOT
Syntax: BOOT [<Dateiname>] [,D<Laufwerk>] [,U<Geräteadresse>] [,P<Startadresse>] [,B<Bank>]
Parameter
<Dateiname> : Zeichenkettenausdruck
<Laufwerk> : numerischer Ausdruck mit Wert 0 oder 1
<Geräteadresse>: numerischer Ausdruck im Wertebereich von 4 bis 30
<Startadresse>: numerischer Ausdruck im Wertebereich von 0 bis 65535
<Bank>: numerischer Ausdruck im Wertebereich von 0 bis 15
Einordnung
Typ: Anweisung
Kontext: Diskettenbefehl
Aufgabe: Maschinenspracheprogramm von einer Diskette laden und starten oder Boot-Disk starten
Abkürzung: bO
Token: $fe $1b (254 27)
Verwandte Befehle
BLOAD, BSAVE, LOAD, RUN

Anmerkung: Dieser Artikel beschreibt den BASIC-Befehl BOOT ab Commodore BASIC 7.0 oder höher.

Der Befehl BOOT lädt das in Dateiname angegebene Programm von einem Diskettenlaufwerk in den Speicher des Computers

  • entweder gemäß der in der Datei vorgegebenen Startadresse
  • oder laut Parameter <Startadresse> in Speicherbank <Bank>

und startet es als Maschinenspracheprogramm an der Startadresse (vergleiche SYS). Innerhalb von BASIC-Programmen können mit BOOT weitere Maschinenspracheprogramme nachgeladen werden. Dabei bleibt das BASIC-Programm und alle Variablen des aufzurufenden Programms erhalten, sofern dessen Speicherorte nicht direkt betroffen sind.
Wenn der Dateiname des Programms nicht existiert, wird die BASIC-Fehlermeldung ?FILE NOT FOUND ERROR ausgegeben. Ein Fehler beim Laden der Datei führt zu einem Abbruch mit der Meldung ?LOAD ERROR. Nach der Ausführung sind DS$ und DS entsprechend dem Status des Fehlerkanals gesetzt.

Ein BOOT-Aufruf ohne <Dateiname> bewirkt den Versuch eines Boot-Block-Starts, wie er auch bei einem Systemneustart oder einem Reset des C128 automatisch passiert.

Zulässige Werte (stets als Ganzzahl aufgefasst) für Parameter

  • Geräteadresse (Gerät 8, falls nicht angegeben) sind von 4 bis 30,
  • Laufwerk sind 0 oder 1 (Laufwerk 0, falls nicht gegeben).

Andere Werte ergeben eine ?ILLEGAL QUANTITY ERROR-Fehlermeldung, außer im Falle der Geräteadresse, wo bei Werten im Bereich 0 bis 255 außerhalb des zuvor genannten Bereichs der Fehler ?ILLEGAL DEVICE NUMBER ERROR gemeldet wird.
Ist ein Gerät zu einer angegebenen Geräteadresse nicht vorhanden meldet Basic ?DEVICE NOT PRESENT ERROR.
Mit dem Zeichenketten-Parameter Dateiname kann die zu ladende Datei auch unter Verwendung von Jokerzeichen angegeben werden. Der Dateiname kann entweder als Zeichenkettenkonstante (in Anführungszeichen) oder als Ausdruck, z.B. eine Zeichenkettenvariable, (dann in runden Klammern) angegeben sein. Eine leere Zeichenkette führt zur Fehlermeldung ?MISSING FILENAME ERROR, sonst zu ?ILLEGAL QUANTITY ERROR. Die Zeichenkette darf allerdings nicht mehr als 16 Zeichen enthalten, da dies sonst zur Fehlermeldung ?STRING TOO LONG ERROR führt.

Wird der Parameter B<Bank> nicht angegeben, so wird die zuletzt durch den Befehl BANK bestimmte Konfiguration verwendet.

Besonderheiten bei Diskbefehlen[Quelltext bearbeiten]

  • Die Parameter mit einem führenden Buchstaben, die logische Dateinummer beginnend mit # und Dateinamensangaben sind positionsunabhängige Parameter und dürfen beliebig gereiht sein. Abweichend davon sind jene Befehle, die einen Quell- und Zielteil aufweisen, wie etwa COPY, wo dies nur für den jeweiligen Bereich vor bzw. nach dem trennenden TO gilt.
  • Der Buchstabe eines positionsunabhängigen Parameters steht für:
    • B: bank (Banknummer)
    • D: drive (Laufwerksnummer)
    • I: identification (ID-Kennung eines Mediums)
    • L: record length
    • P: position (Position bzw. Adresse)
    • R: read (lesende Operation)
    • W: write (schreibende Operation)
    • U: unit (Gerätenummer)
  • Variablen oder allgemeine Ausdrücke bei positionsunabhängigen Parametern sind möglich, müssen aber in Klammern gesetzt werden (außer bei "I<Id>", wo immer nur eine 2-Zeichen-Konstante erwartet wird).
  • Die Angabe der Geräteadresse oder Bank (bei BASIC 7.0) kann entweder mit "," oder mit "ON" oder kombiniert mit ",ON" eingeleitet werden, wobei im Falle eines Kommas bereits ein anderer Parameter voran gegangen sein muss.
  • Der optionale Parameter "I<Kennung>" für die Angabe der Identifikation wird immer akzeptiert. Dem "I" müssen 2 Zeichen folgen, wobei beliebige Leerzeichen dazwischen vorkommen dürfen. Der Wert kann nicht durch einen geklammerten Ausdruck ersetzt werden. Gewisse Werte, die BASIC-Befehle wie IF, ON, FN, TO oder BASIC-Abkürzungen wie jO, hE enthalten, werden fälschlicherweise als das entsprechende Schlüsselwort und nicht als der beabsichtigte Text interpretiert. Alle nichtkonformen Fälle führen dann zur Fehlermeldung ?SYNTAX ERROR.
  • Ein Parameter "R" (ohne weitere Wertangabe, bei DOPEN zur expliziten Angabe des vorgegebenen Read-only-Modus gedacht) wird bei allen Diskbefehlen immer akzeptiert, hat aber keinerlei zusätzliche Bedeutung. Im Falle von BASIC 3.5 wird hingegen ?SYNTAX ERROR gemeldet.

Boot-Block-Start[Bearbeiten | Quelltext bearbeiten]

Es wird der Datenblock auf Sektor 0 der Spur 1 vom angegebenen Gerät und Laufwerk in den Kassettenpuffer ab $0B00 (dez. 2816) geladen und nach einer Boot-Kennung gesucht (die ersten 3 Bytes "CBM" in PETSCII). Liegt ein derartiger Boot-Block (Aufbau im folgenden Abschnitt) vor, wird

  1. eine Boot-Meldung am Bildschirm (mit optionalem Boot-Text aus dem Boot-Block) ausgegeben.
  2. entsprechend der in diesem Boot-Block enthaltenen Daten eventuell weitere Blöcke an eine vorgegebene Stelle in den Speicher (ähnlich LOAD) geladen,
  3. nach dem letzten Block eine Laufwerksinitialisierung ausgeführt,
  4. optional eine Datei in eine entsprechende Speicherbank geladen und
  5. der Boot-Code aus dem Boot-Block (ähnlich einem SYS-Aufruf) ausgeführt.

Die Ausgabe am Bildschirm sieht dabei in etwa so aus:

 
BOOTING optionaler Boot-Text...

Aufbau eines Bootblocks[Bearbeiten | Quelltext bearbeiten]

Position Inhalt Bemerkung
0, 1, 2 "CBM" Kennung für Bootblock
3, 4 Ladeadresse für weitere Blöcke (niederwertiges, höherwertiges Byte)
5 Speicherbank für die zu ladenden Blöcke 0 bis 15
6 Anzahl weiterer Blöcke beginnend bei Sektor 1, Spur 1; dabei Spurwechsel nach Erreichen des Sektors 20;
0 bedeutet kein Nachladen weiterer Blöcke
7 bis zum ersten Null-Byte Boot-Text ($00 am Ende) wird auf dem Bildschirm angezeigt (kann auch leer sein)
Anschließend bis nächstes Null-Byte Name der zu ladenden Programmdatei ($00 am Ende) wird immer in Bank 0 geladen (kann auch leer sein)
Anschließend bis 255 Maschinenspracheprogramm und Daten Der Beginn dieses Blocks ist der Einstiegspunkt, welcher als Unterprogramm (mittels JSR) ausgeführt wird.

Erstellung eines Bootsektors[Bearbeiten | Quelltext bearbeiten]

Das folgende Programm erzeugt einen Bootblock auf der Diskette in Laufwerk 8, durch den ein bestimmtes BASIC-Programm automatisch geladen und gestartet wird:

10 READ BM$: REM BOOTMESSAGE
20 READ DN$: REM DATEINAME
30 IF LEN(DN$)>16 THEN PRINT "PROGRAMMNAME DARF HOECHSTENS 16 ZEICHEN LANG SEIN!": END
40 BZ$="RUN"+CHR$(34)+DN$+CHR$(34)+CHR$(0): REM BASIC-BEFEHLSZEILE
50 A$=HEX$(DEC("0B00")+LEN(BM$)+LEN(BZ$)+5):AH=DEC(LEFT$(A$,2)):AL=DEC(RIGHT$(A$,2))
60 CD$=""
70 DO
80 READ B$
90 IF LEN(B$)>2 THEN BEGIN
100 IF B$="CLL" THEN CD$=CD$+CHR$(AL): REM STARTADRESSE LOW-BYTE
110 IF B$="CLH" THEN CD$=CD$+CHR$(AH): REM STARTADRESSE HIGH-BYTE
120 BEND:ELSE CD$=CD$+CHR$(DEC(B$))
130 LOOP UNTIL B$="EOT"
140 BB$="CBM"+CHR$(0)+CHR$(0)+CHR$(0)+CHR$(0)+BM$+CHR$(0)+CHR$(0)+CD$+BZ$: REM GESAMTER BOOTBLOCK
150 OPEN 15,8,15: REM BEFEHLSKANAL OEFFNEN
160 OPEN 2,8,2,"#": REM DATENKANAL OEFFNEN
170 PRINT "BOOTSEKTOR ALS BELEGT MARKIEREN..."
180 PRINT#15,"B-A";0;1;0: REM BOOTBLOCK ALS BELEGT MARKIEREN
190 GOSUB 800:IF F=65 THEN PRINT "FEHLER: BOOTSEKTOR SCHON BELEGT!"
200 IF F=0 THEN BEGIN : REM WENN KEIN FEHLER, DANN BLOCK SCHREIBEN
210 PRINT#15,"B-P";2;0: REM PUFFERZEIGER INITIALISIEREN
220 PRINT#2,BB$: REM BOOTBLOCK IN PUFFER SCHREIBEN
230 PRINT "BOOTSEKTOR AUF DISK SCHREIBEN..."
240 PRINT#15,"U2";2;0;1;0: REM PUFFER AUF DISK SCHREIBEN
250 GOSUB 800
260 IF F=0 THEN PRINT "BOOTSEKTOR ERFOLGREICH GESCHRIEBEN!"
270 BEND
280 DCLOSE: REM ALLE DISKETTENKANAELE SCHLIESSEN
290 END
800 INPUT#15,F,FB$,SP$,SE$
810 IF F<>0 THEN ? F","FB$","SP$","SE$
820 RETURN
1000 DATA "BASIC-PROGRAMM": REM BOOT-MESSAGE
1010 DATA "AUTO": REM PROGRAMMNAME
1020 DATA A2,CLL,A0,CLH,4C,A5,AF,EOT

Das Programm prüft, ob der Bootsektor noch frei ist (und markiert ihn dabei gleichzeitig als belegt). Anschließend wird der Sektor auf die Diskette geschrieben.

Beim Booten von der Diskette wird die Meldung


BOOTING BASIC-PROGRAMM...

SEARCHING FOR 0:AUTO
LOADING

ausgegeben und das BASIC-programm "AUTO" geladen und gestartet (natürlich nur, wenn sich auch ein entsprechendes Programm auf der Disk befindet). Bootmessage und zu ladendes Programm können in den DATA-Zeilen 1000 bzw. 1010 festgelegt werden. Statt eines RUN "<Programmname>" kann auch beliebiger anderer BASIC-Code ausgeführt werden, dazu einfach Zeile 40 entsprechend ändern. Die Ausführung der BASIC-Zeile wird durch folgendes kleines Maschinenspracheprogramm (enthalten in der DATA-Zeile 1020) initiiert:

LDX #CLL  
LDY #CLH 
JMP $AFA5

CLL ist das Low-Byte der Startadresse-1 der BASIC-Zeile, CLH entsprechend das High-Byte.

Beispiele[Bearbeiten | Quelltext bearbeiten]

Typische Verwendung[Bearbeiten | Quelltext bearbeiten]

BOOT

Manuell den Boot-Automatismus auslösen (weil etwa die Boot-Diskette beim Einschalten noch nicht eingelegt war).

BOOT "LIBRARY"

lädt die Datei "LIBRARY" von der Diskette, die sich im Diskettenlaufwerk 0 mit der Geräteadresse 8 befindet und startet es als Maschinenspracheprogramm.

BOOT "LIB-6?",D1

lädt die erste Datei, deren Dateinamen 6 Zeichen lang ist und mit "LIB-6" beginnt von Laufwerk 1 eines Doppellaufwerks mit der Geräteadresse 8.

BOOT (DATEI$),D(LW),U(G),B(SB),P(ADR)

Als allgemeine Variante BOOT mit Variablen parametrisiert

BLOAD (DATEI$),D(LW),U(G),B(SB),P(ADR)
BANK SB
SYS ADR

entspricht im Einzelnen der obigen Befehlsabfolge, die dann explizit via SYS an die Ladeadresse ADR in Speicherbank SB verzweigt.

Maschinenprogramm laden und ausführen[Bearbeiten | Quelltext bearbeiten]

BANK 0
POKE DEC("6000"),DEC("60")
BSAVE "RTS-6000", P(DEC("6000") TO P(DEC("6001")) ON B0

Erzeugt eine boot-fähiges Programm, an dessen Startadresse (hex.) $6000 in Speicherbank 0 mit einem "leeren" Maschinenspracheprogramm bestehend lediglich aus einem RTS-Opcode.

100 A$="BOOT"+" "+"LOAD"
110 PRINT "FREIER VARIABLEN SPEICHER";FRE(0)
120 BOOT "RTS-6000",P(DEC("8000")),B0
130 PRINT "NACH BOOT:";FRE(0)
140 PRINT A$

Diese Programm lädt das zuvor erstellte Programm, an eine andere Adresse ($8000) der Speicherbank 0, das an dieser Stelle gestartet wird und nach der Rückkehr im BASIC-Programm fortfährt. Das BASIC-Programm samt Variablen bleiben unberührt.