BOOT
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]
- Bei einem Dateinamen ist optional ein führendes @ möglich (nur bei einer Dateinamenangabe von mehreren erlaubt), um eine bestehende Datei zu überschreiben (REPLACE-Funktion). Das Zeichen wirkt sich dann nicht auf das Längenlimit von 16 Zeichen aus. Intern wird damit immer der für den Save-Bug sichere Dateiname "@0:<Dateiname>" verwendet (in diesem Fall für Laufwerksnummer 0).
- 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 in memory (Start-/Endadresse)
- 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
- eine Boot-Meldung am Bildschirm (mit optionalem Boot-Text aus dem Boot-Block) ausgegeben.
- entsprechend der in diesem Boot-Block enthaltenen Daten eventuell weitere Blöcke an eine vorgegebene Stelle in den Speicher (ähnlich LOAD) geladen,
- nach dem letzten Block eine Laufwerksinitialisierung ausgeführt,
- optional eine Datei in eine entsprechende Speicherbank geladen und
- 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.
APPEND | BANK | BEGIN | BEND | BLOAD | BOOT | BSAVE | BUMP | CATALOG | COLLISION | COLOR | CONCAT | DCLEAR | DCLOSE | DOPEN | DVERIFY | ENVELOPE | FAST | FETCH | FILTER | GO64 | MOVSPR | (OFF) | PEN | PLAY | POINTER | POT | (QUIT) | RECORD | RREG | RSPCOLOR | RSPPOS | RSPRITE | RWINDOW | SLEEP | SLOW | SOUND | SPRCOLOR | SPRDEF | SPRITE | SPRSAV | STASH | SWAP | TEMPO | WIDTH | WINDOW | XOR