GW-BASIC Emulator

Aus C64-Wiki
Zur Navigation springenZur Suche springen
GW-BASIC Emulator
Startbildschirm v2
Entwickler G. Mariani & F. Sorgato
Verleger Systems Editoriale
Release 1987
Plattform(en) C64
Genre Programmiersprache
Steuerung Icon tastatur.png
Medien Icon disk525 1.png Icon kassette.png
Sprache(n) Sprache:englisch
Information Diskmag Commodore Computer Club Spezialausgabe 28,80 DM Sprache:deutsch Sprache:italienisch
In verschiedenen Versionen erschienen


Beschreibung[Bearbeiten | Quelltext bearbeiten]

GW-BASIC war in den 1980er Jahren eine beliebte Programmiersprache für PC, Atari und viele weitere Computersysteme. GW-BASIC wurde seit 1981 von Microsoft zunächst für den IBM-PC herausgegeben. Ab Mitte der 1980er wurde es kostenlos mit MS-DOS vertrieben (den damaligen Commodore-PCs lag es auch bei). Ab 1991 wurde das kostenlose GW-BASIC durch eine "abgespeckte" Version der Programmierentwicklungsumgebung QuickBASIC namens QBASIC ersetzt. Die Programmiersprache GW-BASIC war für die Adressierung von max. 64 KByte RAM ausgelegt, und es musste noch mit Zeilennummern programmiert werden.

Startbildschirm V1

Im Jahr 1987 erschien eine Umsetzung für den C64/C128 unter der Bezeichnung GW-BASIC Emulator (im Folgenden kurz GW-BASIC '64) Version 1.0 vom 13.09.1986 . Dieser wurde auf einer Spezialausgabe des Commodore Computer Club des italienischen Publishers Systems Editoriale in Form eines Diskmag zusammen mit dem MS-DOS Simulator veröffentlicht. Ebenfalls gibt es seit Ausgabe No. 37 Tipps zu GW-BASIC '64. Es erschienen ebenfalls noch zwei Nachfolgeversionen, die letzte ist die Version 2.0 vom 03.08.1987.

Nachdem Laden der BASIC-Erweiterung bzw. GW-BASIC-Programmierumgebung stehen für die Eingabe eines GW-BASIC-Programms 26111 (Version 1) bzw. 23295 (Version 2) Bytes frei zur Verfügung.

Der GW-BASIC-Dialekt ist sehr umfangreich und erweiterte das vorhandene BASIC V2 u.a. um Funktionstastenbelegung, Programmiertools, Datei-Utilities, sowie Grafik- und Sound-Befehle. Insgesamt werden 85 BASIC-Befehle erweitert oder hinzugefügt. Auf den ersten Blick sind viele Funktionen 1:1 aus der PC-Version übernommen worden. Eine gute Übersicht über GW-BASIC bietet der HTML-Guide Sprache:englisch, der sich an der Urversion von Microsoft hält.

Für den C128 ist GW-BASIC weniger geeignet, da BASIC 7.0 viele GW-BASIC-Befehle in ähnlicher Form bzw. Funktion schon beinhaltet, es sei denn, bestehende Listings und Quellen erfordern die GW-BASIC-Syntax bzw. machen den Umgang damit einfacher.

Änderungen zu BASIC V2[Bearbeiten | Quelltext bearbeiten]

Damit Sie unter GW-BASIC '64 das echte Feeling zur originalen GW-BASIC PC-Version bekommen, wurden bestimmte Tasten wie RUN/STOP  gesperrt. Als Ersatz für RUN/STOP  dient nun die Tastenkombination CTRL +C .
Falls sich GW-BASIC aufhängt, kann durch die RESTORE  in vielen Fällen Abhilfe geschaffen werden.
Weiterhin wurde die direkte Farbänderung mittels Tastenkombination CTRL  und C=  plus Zifferntaste ebenfalls gesperrt.
Zu dem ist die 16 Farben umfassende Farbpalette ebenfalls anders belegt verglichen mit jener von BASIC V2.

Funktionstastenbelegung[Bearbeiten | Quelltext bearbeiten]

GW-BASIC bringt ebenfalls eine Funktionstastenbelegung mit. Eine Besonderheit ist, dass die vier ungeraden Funktionstasten am unteren Bildschirmrand mittels Sprites angezeigt werden. Da dies etwas störend ist bei der Programmierung in den unteren drei Bildschirmzeilen, kann man die Sprites mit KEYOFF ausschalten, wobei die Funktionstasten weiterhin aktiv bleiben. Die Anzeige wird bei einer Änderung der Belegung aktualisiert. Die vorgegebene Belegung der Funktionen ist wie folgt:

  • F1  LIST Anzeige eines GW-BASIC-Listings.
  • F2  RUN Ausführen eines GW-BASIC-Programms.
  • F3  LOAD" Laden eines GW-BASIC-Programms von Diskette, Angabe des Dateinamens erforderlich!
  • F4  SAVE" Speichern eines GW-BASIC-Programms auf Diskette, Angabe des Dateinamens erforderlich!
  • F5  CONT Fortführen eines unterbrochenes GW-BASIC-Programms.
  • F6  TRON← Fehlerverfolgung ein, Programmabarbeitung kontrolliert durch Tastendruck mit Anzeige der aktuellen Zeilennummer.
  • F7  TROFF← Fehlerverfolgung aus.
  • F8  KEY Funktionstastenbelegung anzeigen bzw. ändern
Das Symbol "" entspricht dem Drücken der Taste RETURN  bzw. der Ausgabe des Zeichens CHR$(13).
  • KEYON - Einblendung der Anzeige der Funktionstastenbelegung am unteren Bildschirmrand (nur im Textmodus).
  • KEYOFF - Ausblendung der Funktionstasten-Anzeige.
  • KEY1,"FILES"+CHR$(13) - Belegt F1  mit der verlustfreien Directory-Anzeige. Der Funktionstasten-String darf max. 10 Zeichen lang sein! Diese Beschränkung ist nötig, damit die Anzeige auf die Sprites passt: 8 Sprites = 8*24 Bit = 24 Bytes geben Platz für 2 F-Tasten-Texte mit je 10 Zeichen plus einem Abstand von 4.
KEY1,CHR$(0) löscht die Belegung von F1. Aber Vorsicht: KEY1,"" führt bei der Anzeige mit KEY zum Absturz.

Kurzübersicht GW-BASIC[Bearbeiten | Quelltext bearbeiten]

Die folgenden Befehlsbeschreibungen beziehen sich auf die Version 2 des GW-BASIC Emulators.

Grundlegende Befehle[Bearbeiten | Quelltext bearbeiten]

  • GWBASIC - GW-BASIC Programmieroberfläche über Reset starten, Arbeitsspeicher ist danach wieder leer!
  • VERSION - GW-BASIC Programmierversion anzeigen.
  • QUIT - GW-BASIC mit Reset beenden.

Programmiertools/-hilfen[Bearbeiten | Quelltext bearbeiten]

  • AUTO [<Zeilennummeranfang>][,[<Zeilennummerschrittweite>]] Automatische Zeilennummervorgabe (0 bis 65535) bei Befehlseingabe, Schrittweite optional 10.
  • DELETE <Zeilennummer> Einzelne Zeilennummern löschen.
  • DELETE <Zeilennummerstart>-[<Zeilennummerende>] Zeilennummernbereich löschen.
  • EDIT <Zeilennummer> Einzelne Programmzeile bearbeiten.
  • EL Systemvariable, die sich die aktuelle Fehlerzeilennummer enthält, wenn eine ON ERROR GOTO ...-Konstruktion aktiv ist.
    Im Gegensatz zum Original-GW-BASIC, wo die Variable ERL heißt, ist diese wegen des 2-Stellenlimits bei Variablennamen umbenannt.
  • ER Systemvariable, die sich die aktuelle Fehlernummer enthält, wenn eine ON ERROR GOTO ...-Konstruktion aktiv ist.
    Im Gegensatz zum Original-GW-BASIC, wo die Variable ERR heißt, ist diese wegen des 2-Stellenlimits bei Variablennamen umbenannt.
  • ERROR [<Fehlernr>] Simulation eines Fehlers bzw. Anzeige der zur Fehlernummer gehörenden Fehlermeldung. Bei der Nutzung in Programmen wird nach der Bildschirmausgabe der Fehlermeldung das Programm abgebrochen! Verwendung zum Testen einer ON ERROR GOTO ...-Konstruktion. Beispiel:
10 ON ERROR GOTO 500
20 FOR I=1 TO 5
30 ERROR I
40 ERROR I+10
50 NEXT
60 END
70 :
500 PRINT"FEHLER ";
510 PRINT USING "## ",ER;"IN";EL
520 RESUME NEXT
Innerhalb eines ON-ERROR-GOTO-Bereichs sollte man ERROR nicht benutzen!
  • ON ERROR GOTO <Zeilennummer> Verzweigt zur Zeile Zeilennummer, sobald ein Fehler auftritt. Mit den Variablen EL, ER und dem Befehl RESUME lassen sich Fehlersituationen entsprechend behandeln.
  • RENUM [Zeilennummeranfang>][,[<Zeilennummerschrittweite>]] GW-BASIC-Programm neu durchnummerieren, Schrittweite optional 10.
  • RESUME [NEXT|<Zeilennummer>] führt das Programm nach dem fehlerauslösenden Befehl oder bei angegebener Zeilennummer fort (in Verbindung mit ON ERROR GOTO ...).

Dateibefehle[Bearbeiten | Quelltext bearbeiten]

  • BLOAD "Dateiname"[,<Startadresse>] Binärdaten in den Arbeitsspeicher an Speicheradresse (0 bis 65535) laden.
  • BSAVE "Dateiname",<Startadresse>,<Endadresse> Binärdaten aus dem Arbeitsspeicher von Speicheradresse Startadresse bis Endadresse (0 bis 65535) abspeichern.
  • LOAD "Dateiname" Je nach Vorwahl durch die Befehle DISK oder TAPE wird ein GW-BASIC-Programm von Laufwerk 8 oder Laufwerk 1 geladen ohne Angabe von Gerätenummern! Die Benutzung eines Jokerzeichens wie * oder ? im Dateinamen ist nicht erlaubt. Die beim Speichern angehängte Erweiterung muss entweder weggelassen (default: "BAS") oder in der Form ".XXX" angegeben werden.
  • SAVE "Dateiname"[,A] Je nach Vorwahl durch Anwenden der Befehle DISK oder TAPE wird auf Laufwerk 8 oder Laufwerk 1 gespeichert und zwar ohne die Angabe der Gerätenummer. Die Erweiterung gewährleistet die Kompatibilität zum MS-DOS Simulator, indem sie den Dateinamen im Commodore Format (Anzeige mit DIRALL) wie folgt abspeichert: "     WIKITESTBAS" (der Dateiname beinhaltet 5 Leerzeichen zu Beginn, gefolgt von einem 8 Zeichen langen Dateinamen (ist er länger, wird er auf 8 Zeichen gekürzt) und der zusätzlichen Dateiendung von 3 Zeichen (ist sie länger angegeben, wird sie gekürzt) mit Default BAS. Im MS-DOS-Format wird diese Datei als WIKKITEST.BAS (Anzeige mit FILES) angezeigt. Ist der optionale Parameter ",A" mit angegeben, wird die Datei im ASCII-Format - ohne Token, aber als PRG-Datei - gespeichert.
  • CLOSE <log.Dateinr.> - Schließt die geöffnete Datei. Es können auch mehrere Dateien gleichzeitig geschlossen werden; z.B. CLOSE 1, 2, 3
  • DIRALL - Verlustfrei aktuelles Directory im Commodore-Standardformat anzeigen.
  • CHDIR "s" - Wechselt in das Unterverzeichnis "s", das zuvor mit dem MS-DOS Emulator (Befehl MKDIR) angelegt worden ist. Das Subdirectory wird mit FILES angezeigt. Zurück kommt man mit CHDIR "..". Es ist auch möglich, in ein Unterverzeichnis zu springen, das nicht genau eine Ebene tiefer liegt: CHDIR "b/s" wechselt ins Unterverzeichnis 2. Ordnung "s" vom Unterverzeichnis "b".
  • DISK - Umschalten auf Diskettenmodus, Laufwerk 8 (Standard).
  • EOF(<log.Dateinr.>) Gibt den Wert 1 zurück, wenn das Ende einer Datei (End Of File) erreicht ist, ansonsten 0. Kann nur in Programmen verwendet werden!
  • ERDEV Numerische Systemvariable, die den aktuellen Fehlercode im Falle einer Gerätefehlers des aktuellen Geräts enthält.
  • ERDEV$ String-Systemvariable, die den aktuelle Fehlermeldungstext im Falle eines Gerätefehlers des aktuellen Geräts enthält.
  • FIELD #<log.Dateinr.>, <Länge> AS <String-Variable>[, <Länge> AS <String-Variable>, ...] Legt die Aufteilung des sogenannten Record-Puffers für den Zugriff auf relative Dateien fest, wobei die Komponenten bzw. Felder mit String-Variablen verbunden werden, über die auf den Record-Puffer zugegriffen werden kann. Siehe OPEN, LSET, RSET, GET, PUT.
  • FILES - Verlustfrei aktuelles Directory im MS-DOS-Format (V2) oder im C64-Format (V1) anzeigen.
  • GET #<log.Dateinr.>,<RN> Liest aus einer relativen Datei den Record mit Nummer RN und füllt damit den Record-Puffer (siehe FIELD).
  • KILL "Dateiname" - Datei im Verzeichnis löschen. Die Angabe des Dateinamens muss im MS-DOS-Format z.B. mit WIKITEST.BAS erfolgen!
  • LSET <String-Variable>=<Ausdruck> Belegt die Feldvariable String-Variable mit dem Wert von Ausdruck (muss einen String ergeben) linksbündig (mit Leerzeichen aufgefüllt auf die in FIELD definierte Feldgröße).
  • MERGE "Weiterer Dateiname" - Eine weitere GW-BASIC-Datei in den Speicher laden und mit der bisherigen zusammenfügen. Die Meldung "WORKING..." wird ausgegeben. Existierende Zeilennummern werden von der nachgeladenen Datei überschrieben. Passt diese nicht in den vorhandenen BASIC-Speicher, bricht der Befehl mit der Fehlermeldung "MERGE ERROR" ab. MERGE sollte nur im Direktmodus benutzt werden.
  • NAME "Alter Dateiname" AS "Neuer Dateiname" - Datei umbenennen. Die Angabe der Dateinamen muss im MS-DOS-Format z.B. mit WIKITEST.BAS erfolgen!
  • OPEN "Dateiname" FOR [APPEND|INPUT|OUTPUT] AS #<log.Dateinr.> Datei (immer vom Typ PRG) zum Schreiben/Lesen/Anhängen öffnen (die OPEN-Syntax aus BASIC V2 ist weiter gültig).
  • OPEN "<mode>", #(log.Dateinr.), "<Dateiname>" [,Recordlänge] Datei (PRG o. REL) öffnen mit <mode> I für INPUT (Lesen), O für OUTPUT (Schreiben), A für APPEND (Anhängen), R öffnet eine RELative Datei hierbei muss zusätzliche die Standard-Record-Länge von 1 bis 254 Bytes angegeben werden. Die logische Dateinr. darf Werte zwischen 1 bis 13 annehmen.
Ein Problem mit OPEN ist im Abschnitt Tipps erwähnt.
  • PUT #<log.Dateinr.>,<RN> Schreibt einen zuvor gefüllten Record-Puffer in die relative Datei in den Record mit Nummer RN (siehe FIELD).
  • RESET - Schließen aller geöffneten Dateien und Aktualisierung des Directorys bzw. Schreiben der BAM vor Diskettenwechsel.
  • RSET <String-Variable>=<Ausdruck> Belegt die Feldvariable String-Variable mit dem Wert von Ausdruck (muss einen String ergeben) rechtsbündig (mit Leerzeichen aufgefüllt auf die in FIELD definierte Feldgröße).
  • RUN "Dateiname" - Laden und Ausführen der angegebenen GW-BASIC-Datei.
  • TAPE - Umschalten auf Kassettenmodus, Laufwerk 1 (einige Datei-Befehle funktionieren in diesem Modus nicht!).

Siehe auch Beispiele.

Grafikbefehle[Bearbeiten | Quelltext bearbeiten]

  • CLS <Parameter> Aktueller Bildschirm löschen, Grafik und Text mit 0 (Standard), nur Grafik mit 1.
  • COLOR <Farbe1>,<Farbe2>[,<Rahmenfarbe>] Farben ändern mit Werten 0 bis 15, wobei laut Dokumentation folgende Farbpalette gilt: 0 schwarz, 1 blau, 2 grün, 3 cyan, 4 rot, 5 violett, 6 braun, 7 hellgrau, 8 mittelgrau, 9 blau, 10 hellgrün, 11 hellblau, 12 hellrot, 13 orange , 14 gelb, 15 weiß. Im Handbuch ist eine andere Zuordnung angegeben - siehe Abschnitt Farbtabelle.
    Die Parameter Farbe1 und Farbe2 haben je nach Bildschirmmodus eine unterschiedliche Bedeutung:
    • Im Textmodus (SCREEN 0): COLOR <Hintergrundfarbe>,<Zeichenfarbe>,<Rahmenfarbe> Die Farbeinstellung von vor dem GW-BASIC-Start wird übernommen, entspricht üblicherweise COLOR 1,11,11.
    • Im Grafikmodus (SCREEN 1): COLOR <Zeichenfarbe>,<Hintergrundfarbe>,<Rahmenfarbe> Die Farbeinstellung von vor dem GW-BASIC-Start wird übernommen, entspricht üblicherweise COLOR 11,1,11.
  • CIRCLE (<x>,<y>),<r> [,<c> [,<Anfang>, <Ende> [,<Radiusverhältnis>]]] Kreis oder Ellipse zeichnen mit Kreismittelpunkt an Position x,y und angegebenen Radius r mit den optionalen Parametern: c 0 (löschen) oder 1 (zeichnen; Standard), den Beginnwinkel Anfang und Endewinkel Ende des Bogens in Radiant (0 bis 2*π entspr. dem Winkelbereich 0 bis 360 Grad) und mit Radiusverhältnis als Verhältnis zwischen Y- und X-Ausdehnung - bestimmt, ob Kreis (=1) oder Ellipse gezeichnet wird (<1 liegend, >1 stehend).
    Beispiele:
    • CIRCLE (30,30),10,1 - Kreis mit Radius 10 px zeichnen
    • CIRCLE (200,55),21,1,1,0,2*π,3 - Ellipse mit Radius 21 px im Verhältnis 3 zeichnen (stehende Ellipse)
    • CIRCLE (30,30),40,1,π,2*π,0.5 - liegende Ellipse, nur den Unterteil zeichnen ("Schüssel")
    • CIRCLE (30,30),20,1,-1,1 - Kreisbogen mit einem Winkelbereich ca. -60 bis +60 Grad
    • CIRCLE (30,30),20,1,0,5,3 - offene Ellipse (stehend) zeichnen (etwas mehr als 60 Grad Öffnungswinkel)
  • DRAW <String-Parameter> Beliebigen Linienzug zeichnen, wobei die Befehle im String-Parameter aneinandergereiht sind (optionales Trennzeichen im String können alle Zeichen außer Buchstaben, Ziffern und Vorzeichen dienen). Mit folgenden Parametern:
    Beispielzeichnungen im SCREEN 1-Modus
    • U[Zahl] - Up, Linie nach oben zeichnen
    • D[Zahl] - Down, Linie nach unten zeichnen
    • L[Zahl] - Left, Linie nach links zeichnen
    • R[Zahl] - Right, Linie nach links zeichnen
    • I[Zahl] - Diagonale rechts/oben
    • G[Zahl] - Diagonale rechts/unten
    • F[Zahl] - Diagonale links/unten
    • H[Zahl] - Diagonale links/oben
    • Mx,y - Bewegt sich zeichnend zu den absoluten Zielkoordinaten x,y (entgegen Original-GW-BASIC gibt es keinen relativen Modus durch Voranstellen von "+" oder "-")
    • C - 0 Linie löschen, 1 Linie zeichnen (default)
    • B - Verschiebung ohne Zeichnen vor einem Zeichenkommando
    • N - Verschiebung mit Rücksprung zu den Ausgangskoordianten vor einem Zeichenkommando
    • P - Ausfüllen einer geschlossen geometrischen Figur
Die Zahlwerte dürfen zwischen -32768 und 32767 liegen, Standardwert 1 Pixel
Beispiele:
  • DRAW "D30 R30 U30 L30 BD5 BR5 P" zeichnet ein Quadrat mit 30 Pixel Seitenlänge von der letzten Zeichenposition, positioniert sich ins Quadrat und füllt es von dort ausgehend aus.
  • DRAW "I9 F9 L18" Dreieck
  • DRAW "G50;F50;I50;H50" Raute
  • DRAW "R22,I22,U22,H22,L22,G22,D22,F22" Achteck
  • DRAW "NI11, NH11, NG11, NF11" 45° gedrehtes Kreuz
  • LINE (<x1>,<y1>)-(<x2>,<y2>)[,c [,B [F]]] (x: Spalte, y: Zeile) Linie oder Rechteck zeichnen, dabei ist c 0 (löschen) oder 1 (zeichnen; Standard), B zeichnet ein Rechteck und mir F wird das Rechteck ausgefüllt. LINE -(<x3>,<y3>)[,c] zeichnet vom Endpunkt des letzten LINE-Befehls aus weiter. Beispiele:
    • LINE (10,10)-(50,50) Schräge Linie
    • LINE (0,100)-(160,100): LINE -(319,100) Waggrechte Linie in zwei Teilen
    • LINE (10,10)-(30,50),1,B Unausgefülltes Rechteck
    • LINE (100,10)-(110,50),1,BF Ausgefülltes Rechteck
  • PAINT (<x>,<y>) Bereich mit Farbe füllen. Wenn der Bereich keine geschlossene geometrische Figur ist, wird ggf. der gesamte Bildschirm ausgefüllt!
  • POINT (0|1) Gibt die aktuelle X- oder Y-Koordinate zurück
  • POINT (<x>,<y>) Gibt 1 zurück, wenn an den angegebenen Koordinaten ein Punkt gesetzt ist, sonst 0.
  • PSET (<x>,<y>) Punkt an Koordinate x,y setzen mit x (0 bis 319) und y (0 bis 199).
  • PRESET (<x>,<y>) Punkt an Koordinate x,y löschen.
  • SCREEN <mode> Monitormodus (0|1) auswählen mit nur Text 0 (Standard), Text mit Grafik 1 (HiRes mit 320×200 px, sichtbarer Bereich 319×199 px). Unter SCREEN 1 sind nur die Grafikbefehle zur Bildschirmausgabe nutzbar. Werden z.B. Befehle, die Zeichen auf dem Bildschirm ausgeben, im Grafikmodus genutzt, führt dies zu einen SYNTAX ERROR.
  • PRINT <"Text"|String> Im Grafikmodus (SCREEN 1) kann nur mittels PRINT zusätzlich Schrift gezeichnet werden. Die Positionierung des Textes erfolgt durch LOCATE, das allerdings nur Textkoordinaten akzeptiert.

Sound-Befehle[Bearbeiten | Quelltext bearbeiten]

  • BEEP Ausgabe eines Tons mit 800 Hz.
  • PLAY "<Noten>" Angaben aller Noten als Zeichen (A-G), in Kombination mit < oder > hinter der Note eine Oktave tiefer oder niedriger, mit # und + oder - hinter der Note ein halbe Note höher oder niedriger. Weitere Parameter vor Noten:
    • P<Zahl> - Pausenlänge von 0 bis 9, ansonsten optionale gleichlange Pause.
    • L<Zahl> - Notendauer in 0 bis 9, optional 1.
    • T<Zahl> - Tempo des Liedes von 0 bis 9.
    • O<Zahl> - Oktave 1, 2 oder 3 nutzen.
Beispiel: PLAY "T3,L2,C,D,E,P4,O2,L9,T6,E,F,D-,D>,d#,D<,D+" - Anmerkung: Die Kommas können weggelassen werden!
  • SOUND <Frequenz>,<Dauer> Erzeugen eines Sounds bei der angegebenen Frequenz (0 bis 65535) mit der Taktlänge von 0 bis 255.
    Beispiel: SOUND 5555, 222

Eingabebefehle[Bearbeiten | Quelltext bearbeiten]

  • LINEINPUT["<Kommentar>";]<String-Variable> Eingabe einer logischen Bildschirmzeile (80 Zeichen) mit Übergabe an eine String-Variable, inklusive verbotene Zeichen wie ; : " ,
  • LINEINPUT#(<log.Dateinr.>),<String-Variable> Einlesen einer Zeile mit maximal 254 Zeichen aus einer Datei mit Übergabe an eine String-Variable, inklusive verbotene Zeichen wie ; : " ,
  • INPUT$(<max.Länge>[,#<log.Dateinr.>]) Dient zur Tasteneingabe oder zum Einlesen von sonstigen Peripheriegeräten. Die Zeichen (1 bis 80 für den Bildschirm, 1 bis 255 für Dateien) werden auf angegebene maximale Länge gekürzt an eine String-Variable übergeben. Beispiel: A$ = INPUT$(20). Siehe dazu INP$ in Unterschiede in Version 1.
  • INKEY$ Eine String-Systemvariable, die die zuletzt gedrückte Taste liefert.
    Beispiel: A$ = INKEY$ - ähnlich einem GET A$ in BASIC V2.

Ausgabebefehle[Bearbeiten | Quelltext bearbeiten]

  • LCOPY ["Dateiname"|0|1] Ausgabe einer Datei oder des Bildschirms Textmodus (0) bzw. Grafik (1) auf dem Drucker
  • LLIST [<Zeilennummerstart>]-[<Zeilennummerende>] Listing anzeigen und auf Drucker ausgeben
  • LPOS(<Zahl>) Abfrage der Position des Druckkopfes
  • LPRINT <Ausdruck> Ausgabe des ausgewerteten Ausdrucks auf dem Drucker
  • LPRINT USING "<Muster>",<Ausdruck>,... Formatierte Ausgabe auf dem Drucker gemäß Muster der Werte der folgenden Ausdruckliste.
  • PRINT USING "<Muster>",<Ausdruck>,... Formatierte Ausgabe auf dem Bildschirm gemäß Muster der Werte der folgenden Ausdruckliste.
    Beispiel: PRINT USING"##.##",123.4567 gibt 23.45 aus.

Variablenbefehle und Funktionen[Bearbeiten | Quelltext bearbeiten]

  • CLEAR <Parameter> Löscht alle Variablendefinitionen und den Stack, schließt alle geöffneten Dateien und setzt Musik (Soundausgabe wird beendet), Grafik, STRIG, ON ERROR zurück. Mit dem Parameter kann ein Speicherbereich von 0 bis 65535 angegeben werden. Der Speicherbereich für Variablen beginnt dann an dieser Adresse. Ist dieser zu stark begrenzt, kann dies zu einem OUT OF MEMORY führen!
  • EL Systemvariable, die sich die aktuelle Fehlerzeilennummer enthält, wenn eine ON ERROR GOTO ...-Konstruktion aktiv ist.
  • ER Systemvariable, die sich die aktuelle Fehlernummer enthält, wenn eine ON ERROR GOTO ...-Konstruktion aktiv ist.
  • FIX(<Zahl>) Die Funktion liefert den jenen Teil einer Fließkommazahl vor dem Dezimalpunkt (Komma). Im Gegensatz zur Funktion INT() erfolgt keine Rundung auf die nächstniedrige Ganzzahl!
  • HEX$(<Dezimale Zahl>) Umrechnen einer dezimalen Zahl von 0 bis 65535 in Hexadezimal $0000 bis $FFFF.
  • &H[<Hexadezimale Zahl>] Umrechnen einer hexadezimalen Zahl $0000 bis $FFFF in Dezimal 0 bis 65535. Die Angabe muss mit 4 Ziffern erfolgen!
  • INSTR([<Startposition>,]<Daten-String>,<Such-String>) Funktion, die die Postition von Such-String innerhalb von Daten-String (sofern gefunden) retourniert. Optional kann die Startposition (1 bis 255) vorgegeben werden.
  • OCT$(<Dezimale Zahl>) Umrechnen einer dezimalen Zahl von 0 bis 65535 in Oktalzahl #000000 bis #177777.
  • RANDOMIZE [<Ausdruck>] Zufallszahlengenerator mit einem Wert des Ausdrucks (muss im Bereich von 0 bis 65535 bleiben) initialisieren, um wirklich zufällige Zahlen mittels RND-Funktion zu generieren. Fehlt der Parameter <Ausdruck>, folgt die Eingabeaufforderung "RANDOM NUMBER SEED (0-65535)?".
  • STRING$(<Anzahl Zeichen>,<Zeichencode o. Zeichenkette>) Generieren einer Zeichenkette mit einem definierten Zeichen.
  • SPACE$(<Anzahl Zeichen>) Erzeugt eine Zeichenkette mit Anzahl Zeichen Leerzeichen.
  • SWAP <Variable1>, <Variable2> Den Inhalt zweier Variablen vertauschen.
  • XOR(<Zahl1>,<Zahl2>) Exklusiv-Oder-Funktion für 2 Werte von 0 bis 65535.

Weitere Befehle[Bearbeiten | Quelltext bearbeiten]

  • LOCATE <Zeile>, <Spalte> Positionierung des Cursors an Zeile 1 bis 25 und Spalte 1 bis 40
  • CSRLIN Liefert die Zeilenposition des Cursors als Ausdruck, der einer Zahlenvariable zugewiesen werden kann. Die Spaltenposition ist hingegen weiterhin mit der Funktion POS(Zahl) abzufragen.
  • CALL <Speicheradresse>(Variablen) Aufruf eines Maschinenspracheprogramms an einer Speicherstelle von 0 bis 65535 liegend mit Übergabe von durch Komma getrennte Zahlen- oder Variablenwerte an das Maschinenspracheprogramm.
  • RESTORE [<Zeilennummer>] Setzt DATA-Zeilen für den READ-Befehl zurück. Mit der Angabe der entsprechenden Zeilennummer kann gezielt für das nächste READ auf die entsprechende DATA-Zeile positioniert werden.
  • IF ... THEN ... :ELSE ... Die Wenn-Dann-Bedingung wurde durch einen Sonst-Zweig ergänzt. Er muss allerdings in der IF-THEN-Zeile stehen und mit einem Doppelpunkt getrennt werden.
    Beispiel: 10 X=X+1: IF X<10 THEN 1PRINT X: GOTO 10 :ELSE PRINT "FERTIG"
  • WHILE <Ausdruck> : ... (zu wiederholende Befehle) ... : WEND Die WHILE-WEND-Schleife erweitert die Möglichkeiten von Schleifenbildung erheblich, allerdings darf diese nicht über mehrere Zeilen erstrecken. Solange der Ausdruck wahr (ungleich 0) ist, wird die Schleife bzw. werden die Befehle zwischen WHILE und WEND ausgeführt.
    Beispiel: 10 CLS: WHILE A<39: A = A+1: LOCATE 10,A: PRINT A: WEND
  • WRITE <Variablen> Ausgabe von Argumenten wie Variablen und Text auf dem Monitor. Ähnlich dem PRINT-Befehl aber mit dem Unterschied, dass die Ausgabewerte der Variablen mit Kommas (,) abgetrennt werden und Text in Anführungszeichen ("") angezeigt werden. Das Semikolon (;) kann nicht verwendet werden!
  • WRITE#,(<log.Dateinr>) <Parameter> Ähnlich dem PRINT#-Befehl für das Schreiben in geöffneten Dateien mit o.g. Abweichungen. Nur nutzbar innerhalb von Programmen.

Nicht (mehr) benutzte Schlüsselwörter[Bearbeiten | Quelltext bearbeiten]

Dieser Abschnitt bezieht sich auf Version 1 und Version 2.

BUFFER und RGET$ sind Befehle zur Verarbeitung relativer Dateien, die in Version 1, aber nicht mehr in Version 2 vorhanden sind. In der Dokumentation vom Commodore Computer Club findet man dazu (aus dem italienischen übersetzt):

  • BUFFER #fn,rn - Lädt den Inhalt des angegebenen Dateisatzes in den relativen Dateipuffer:
fn: Nummer der Datei (0<fn<13); rn: Datensatznummer (0<n<65535)
  • RGET$ (#fn,recnum,feld) - Lädt den Inhalt des Feldes des angegebenen relativen Dateisatzes:
fn: Dateinummer ((1<fn<13); recnum: Datensatznummer (1<recnum<65535); feld: Feldnummer (siehe FIELD)
Beispiel: A$=RGET$(#5,100,3), RGET$(#2,10,6)

Statt dieser beiden Befehle gibt es in der Version 2 des GW-BASIC Emulators GET #fn,recnum, das - im Gegensatz zu den beiden alten Befehlen - auch im MS-DOS GW-BASIC enthalten ist. Allerdings wird damit der Standard-BASIC-Befehl GET# unbrauchbar und muss durch INPUT$(1,#fn) ersetzt werden.

Die Schlüsselwörter FUNC1+, FUNC2+ und FUNC3+*2) haben ebenso wie COM1+, COM2+*1), COM3+*1), COM4+ und COM7+*2) keine Funktion und dienen als Platzhalter für geplante weitere Befehle oder Funktionen.
*1) nur in Version 1, *2) nur in Version 2

Unterschiede in Version 1[Bearbeiten | Quelltext bearbeiten]

Die Unterschiede bei den Schlüsselwörtern sieht man in Token, Befehle, Adressen.

Einige Befehle sind anders, vor allem weil die MS-DOS-Verzeichnisstruktur erst mit der Version 2 vom MS-DOS-Simulator (und GW-BASIC Emulator) unterstützt wird:

  • LOAD "Dateiname" - In Version 1 wird das übliche C64-Format (16 Zeichen) benutzt, die Benutzung eines Jokerzeichens wie * oder ? im Dateinamen ist also erlaubt.
  • SAVE "Dateiname" - Da in Version 1 das übliche C64-Format benutzt wird, gibt es keine Unterstützung für das MS-DOS-Format des MS-DOS Simulators.
  • DIRALL - ist nicht in Version 1 enthalten. Die Anzeige des Inhaltsverzeichnisses übernimmt hier der Befehl FILES.
  • CHDIR "s" - ist nicht in Version 1 enthalten.
  • FILES - das Directory wird in Version 1 im C64-Format angezeigt. Dateifilter sind hier möglich. Beispiel:FILES"B*" listet alle Dateien mit "B" am Anfang.
  • NAME "Alter Dateiname" AS "Neuer Dateiname" - Datei umbenennen. Die Angabe der Dateinamen erfolgt im C64-Format (16 Zeichen).
  • INP$(<max.Länge>[,#<log.Dateinr.>]) - in Version 1 an Stelle von INPUT$, aber mit derselben Funktion.
  • LOCATE(<x>,<y>) mit Grafikkoordinaten x,y (0 bis 319, 0 bis 199); die Ausgabe mit PRINT erfolgt allerdings nur am Kachelanfang, also z.B. nach LOCATE(165,100) bei (160,96), was man auch mit den Text-Koordinaten von LOCATE <zeile>,<spalte> erreichen kann. Daher ist diese Option in Version 2 nicht mehr enthalten.

Beispiele[Bearbeiten | Quelltext bearbeiten]

Cover der deutschsprachigen Ausgabe

Beispiel 1: Relative Datei anlegen, schreiben und lesen mit Dateibefehlen:

 50 RN=33 : REM RECORD-NUMMER
 60 RS=20 : REM RECORD-LAENGE

100 REM DATENSATZ SCHREIBEN
110 OPEN "R",#1,"DATEN.DB",RS   (legt relative Datei autom. an)
120 FIELD #1, 15 AS I$, 5 AS N$ (Record Felder festlegen)
130 RSET I$=STR$(SIN(2))        (Felder füllen)
140 LSET N$=STR$(2)
150 PUT #1,RN                   (Record schreiben)
160 CLOSE 1
170 END

200 REM DATENSATZ LESEN
210 OPEN "R",#1,"DATEN.DB",RS   (relative Datei öffnen, wird ggf. angelegt)
220 FIELD #1, 15 AS I$, 5 AS N$ (Feldzusammensetzung eines Records festlegen)
230 GET #1,RN                   (Record einlesen)
240 PRINT "("$I","$N")"         (und anzeigen)
250 CLOSE 1

Beispiel 2: Das folgende Programm wird zunächst mit SAVE"SEQ-TEST.TXT",A als ASCII-Datei gesichert. Führt man es nun aus, wird der Inhalt mit INPUT$ sequentiell gelesen und Byte für Byte hexadezimal, dezimal und als Zeichen ausgegeben. Ein CR=CHR$(13) wird dabei überlesen, so dass in diesem Fall der Eingabestring leer ist - siehe Zeile 30.

10 OPEN "I",#2,"SEQ-TEST.TXT"
20 WHILE EOF(2)=0
30 A$=INPUT$(1,#2):IF A$="" THEN 30
40 H$=HEX$(ASC(A$))
50 PRINT "  $"+RIGHT$(H$,2),
60 PRINT ASC(A$),A$
70 POKE 198,0:WAIT 198,255
80 WEND
90 CLOSE #2

Beispiel 3: Token, Schlüsselwörter und Adressen ausgeben (für V2):

100 N=0: A=&H8327
110 B=&H8058: O=1: GOSUB 150: REM TEIL 1
120 B=&H8153: O=1: GOSUB 150: REM TEIL 2
130 B=&H8194: O=0: GOSUB 150: REM TEIL 3 Funkt.
140 END
150 I=B
160 C=PEEK(I): IF C=0 GOTO 280
170 D=(C AND 127)
180 C$=C$+CHR$(D): I=I+1
190 IF C=D GOTO 160: REM NEXT CHAR
200 PRINT USING "###",N+1;
210 LPRINT USING "###",N+1;SPC(2);
220 PRINT TAB(5);C$;
230 K=PEEK(A+M)+256*PEEK(A+M+1)+O
240 PRINT TAB(20);"$";HEX$(K)
245 CP$=LEFT$(C$+SPACE$(20),15)+"$"+HEX$(K)
250 LPRINT CP$
260 N=N+1:M=2*N:C$=""
270 GOTO 160: REM NEXT COMMAND
280 RETURN

Für V1:

100 N=0: A=&H82B5
110 B=&H804D: O=1: GOSUB 150: REM TEIL 1
120 B=&H8147: O=1: GOSUB 150: REM TEIL 2
130 B=&H8189: O=0: GOSUB 150: REM TEIL 3
...


Unterverzeichnisse[Bearbeiten | Quelltext bearbeiten]

Mit dem Befehl CHDIR kann man in GW-BASIC '64 das Verzeichnis wechseln. Einen Befehl zum Erstellen gibt es aber nur im MS-DOS Simulator: MKDIR oder kurz MD. Dabei wird pro Verzeichnis ein Block auf der Diskette belegt. Diese Unterverzeichnisse sind nicht echt (wie z.B. beim Laufwerk 1581), sondern werden über die Gestaltung des Dateinamens simuliert.

Die 16 Zeichen des Dateinamens im Commodore-DOS werden dabei in zwei Bereiche aufgeteilt:

  • 5 Zeichen für das Unterverzeichnis der Datei; je ein Buchstabe pro Verzeichnis, bis zu 5 Ebenen; Buchstaben, Ziffern oder Leerzeichen am Ende.
  • Maximal 11 Zeichen für den Dateinamen, davon werden die letzten 3 für die Dateierweiterung benutzt.

Bei einem Unterverzeichnis-Eintrag folgt auf die 5 Zeichen zu Beginn ein "#". Zur Kennzeichnung ist der Rest des Directory-Eintrags aufgefüllt mit " <DIR>". Der Verzeichnis-Block wird vom MS-DOS-Simulator mit einem Standard-Text gefüllt. Beispiele im Disk-Monitor:

  • Directory-Eintrag von Unterverzeichnis "B/S" und der Datei "TEST.BAS" darin:
...
a0  00 00 82 18 07 42 53 20 20 20 23 a0 20 20 20 3c  @@Bxgbs   #    <
b0  44 49 52 3e a0 00 00 00 00 00 00 00 00 00 01 00  dir> @@@@@@@@@a@
c0  00 00 82 18 12 42 53 20 20 20 54 45 53 54 42 41  @@‚xrbs   testba
d0  53 a0 a0 a0 a0 00 00 00 00 00 00 00 00 00 01 00  s    @@@@@@@@@a@@
...
  • Unterverzeichnis-Block:
00  00 26 28 c3 29 20 ca 55 4c 2e 31 39 38 37 20 cd  @&(C) Jul.1987 M 
10  41 52 49 41 4e 49 20 c7 2e 20 26 20 d3 4f 52 47  ariani G. & Sorg 
20  41 54 4f 20 c6 2e 0d 00 00 00 00 00 00 00 00 00  ato F.M@@@@@@@@@@
30  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  @@@@@@@@@@@@@@@@@
...
f0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  @@@@@@@@@@@@@@@@@

Anzeigen von Dateien in Unterverzeichnissen[Bearbeiten | Quelltext bearbeiten]

Mit FILES kann man das jeweilige Verzeichnis im MS-DOS-Format anzeigen während DIRALL das Directory im C64-Format ausgibt. Ein Wechsel mit CHDIR erfolgt immer relativ zum aktuellen Verzeichnis.

Beispiel: Mit dem MS-DOS Simulator wurden die Unterverzeichnisse "B" (1. Ebene) und "B/S" (2. Ebene) erstellt. Die BASIC-Programmdatei "TEST.BAS" wurde in "B/S" gespeichert.

  • Anzeige von Unterverzeichnis "B/S" im MS-DOS-Format:

CHDIR "B/S"

READY.
FILES
A:/B/S
.            <DIR>   ..          <DIR>
TEST    .BAS
 97282 BYTES FREE

READY.

  • Anzeige des Hauptverzeichnisses im MS-DOS-Format:

CHDIR"../.."

READY.
FILES
A:/
B           <DIR>   F           <DIR>
COMMAND .COM        AUTOEXEC.BAT
DISKCOPY.COM        INTRO   .TXT
CREADIR .BAT        DIRALL  .EXE
PRINT1  .EXE        CHKDSK  .EXE
GWBASIC .EXE        README  .TXT
 97282 BYTES FREE

READY.

Man erkennt hier einen Fehler im Befehl FILES: 5 Zeichen lange Dateinamen, welche die ersten Zeichen belegen, wie hier "FCONV" oder "MSDOS", werden als <DIR> angezeigt, falls direkt davor ein Unterverzeichnis (wie "B" oder "BS") liegt. CHDIR "F" führt allerdings nur zur Fehlermeldung "ILLEGAL PATH".

Dateien mit Namen, welche die ersten 5 Zeichen belegen, werden von FILE nicht angezeigt - wie hier "FCONV", "MSDOS" und "GWBASIC".

  • Directory-Anzeige mit DIRALL:

DIRALL
0 "MSDOS-TEST      "    2A
2    "MSDOS"            PRG
1    "B    #"   <DIR>   PRG 
35   "FCONV"            PRG
96   "     COMMANDCOM"  PRG
1    "     AUTOEXECBAT" PRG
50   "     DISKCOPYCOM" PRG 
2    "     INTROTXT"    PRG
4    "     CREADIRBAT"  PRG
1    "     DIRALLEXE"   PRG
2    "     MOREEXE"     PRG
1    "     CHKDSKEXE"   PRG
2    "     PRINT1EXE"   PRG
3    "     READMETXT"   PRG
2    "GWBASIC"          PRG
77   "     GWBASICEXE"  PRG
1    "BS   #"   <DIR>   PRG 
1    "BS   TESTBAS"     PRG
383 BLOCKS FREE.

READY.

Die Unterverzeichnisse "B" bzw. "B/S" sind durch die Dateinamen "B #" bzw. "BS #" definiert und durch das im Directory hinzugefügte <DIR> gekennzeichnet. Die Datei "TEST.BAS" im Unterverzeichnis "B/S" wird durch den C64-Dateinamen "BS TESTBAS" definiert.

Erstellen und Löschen von Unterverzeichnissen mit BASIC V2[Bearbeiten | Quelltext bearbeiten]

Die Befehle MKDIR und RMDIR sind nur im MS-DOS Simulator aber nicht im GW-BASIC '64 enthalten. Sie lassen sich jedoch ziemlich einfach in BASIC V2 simulieren. Beispiel für Unterverzeichnis "X/Y" vom Hauptverzeichnis:

MKDIR "X/Y":
 10 REM GW-BASIC SUBDIRECTORY
 30 SYS57686 "XY   #"+CHR$(160)+"   <DIR>"+CHR$(160),8
 SAVE "MKDIR"

Die REM-Zeile dient dazu, im Datei-Block eine Kennung als Unterverzeichnis einzutragen. In Zeile 30 ersetzt SYS 57686 den Befehl SAVE, der hier nicht benutzt werden darf, da er in GW-BASIC '64 umgeleitet ist. Das Format des Unterverzeichnisses entnimmt man dem Directory-Eintrag zu Beginn des Kapitels.

RMDIR "X/Y"
 10 OPEN 1,8,15,"S:XY*": CLOSE 1
 SAVE "RMDIR"

Der "Scratch"-Befehl löscht das Unterverzeichnis "X/Y" mit allen darin enthaltenen Dateien.

Die Programme "MKDIR" bzw. "RMDIR" kann man nun bei Bedarf laden und ausführen, nachdem das Unterverzeichnis angepasst worden ist. Auf eine sinnvolle Struktur (z.B. "X" über "X/Y" anlegen) muss man hier allerdings selbst achten, denn "X/Y" kann angelegt werden, ohne dass "X" existiert und CHDIR"X/Y" funktoniert dann sogar.

GW-BASIC Emulator Intern[Bearbeiten | Quelltext bearbeiten]

Dieses Kapitel bietet Informationen über die Speicherverwaltung, Farbwerte, Schlüsselwörter (mit Token, Adressen und Unterschieden der beiden Versionen V1 und V2), erweiterte Befehle sowie Fehlermeldungen. Dazu gibt es einige Tipps.

Geänderte Vektoren[Bearbeiten | Quelltext bearbeiten]

Adresse Bedeutung Version 2 Version 1
$0300-$0301 BASIC-Warmstart $863E $857E
$0304-$0305 Umwandlung in Interpretercode $863E $857E
$0306-$0307 Umwandlung in Klartext (LIST) $84DA $8442
$0308-$0309 BASIC-Befehlsadresse holen $8559 $84C1
$030A-$030B Ausdruck auswerten $870C $8615
$0318-$0319 NMI $87C4 $86CF
$0328-$0329 STOP-Routine $9138 $91A5

Speicherbelegung[Bearbeiten | Quelltext bearbeiten]

Bereich V2 V1
Textschirm $0400  dto.
F-Tasten Sprites $0800  dto.
Basic $0A01 - $64FF $0A01 - $6FFF
Code+Daten $6500 - $9FFF $7000 - $9FFF
Schlüsselwörter $8058 - $8151
$8153 - $8192
$8194 - $81F1
$804D - $8146
$8147 - $8188
$8189 - $81E4
Adressen $8327 - $83C8 $82B5 - $8356
Code+Daten ab $C000  dto.
Grafik Farbe $CC00  dto.
Grafik Bitmap $E000  dto.

Farbtabelle[Bearbeiten | Quelltext bearbeiten]

Die Tabelle der 16 Farbwerte für die Farbpalette liegt bei $95D0:
>C:95d0 00 06 05 03 02 04 09 0f 0c 06 0d 0e 0a 08 07 01

Daraus ergibt sich die folgende Farbzuordnung für die Verwendung in den Parametern des Befehls COLOR, die von der im Handbuch angegebenen abweicht:

Farbpalette des GW-BASIC Emulators
Farben des MS-DOS GW-BASIC
GW C64 Farbe nach Handbuch GW-B. DOS
0 0 Schwarz 0 Schwarz   dto.
1 6 Blau 6 Blau   dto.
2 5 Grün 5 Grün   dto.
3 3 Cyan 3 Cyan   dto.
4 2 Rot 2 Rot   dto.
5 4 Purpur/Violett 4 Purpur/Violett   dto.
6 9 Braun 9 Braun   dto.
7 15 Hellgrau 15 Weiß (Hellgrau)   dto.
8 12 Mittelgrau 12 Grau (Mittelgrau)   dto.
9 6 Blau 8 Orange Hellblau
10 13 Hellgrün 13 Hellgrün   dto.
11 14 Hellblau 14 Helles Cyan (Hellblau) Hellcyan
12 10 Hellrot 10 Hellrot   dto.
13 8 Orange 11 Dunkelgrau Hellpurpur
14 7 Gelb 7 Gelb   dto.
15 1 Weiß 1 Helles Weiß (Weiß)   dto.

Blau ist also doppelt vorhanden, während Dunkelgrau (C64: 11) fehlt. Damit wird versucht, den Farben des MS-DOS GW-BASIC möglichst nahe zu kommen, was aber schwierig ist, da beim C64 "Hellcyan" und "Hellpurpur" nicht vorhanden sind.

Wer mit der neuen Farbzuordnung von GW-BASIC '64 garnicht einverstanden ist, kann sie auf die normalen Werte ändern mit
FOR I=0 TO 15: POKE &H95D0+I,I: NEXT.

Für das POKEN in die Farbregister 53280, 53281 und 646 gelten aber nach wie vor die Werte der C64-Farben und die Änderung der Zeichenfarbe mit PRINT CHR$(farbcode) ist ebenfalls möglich.

Token, Befehle, Adressen[Bearbeiten | Quelltext bearbeiten]

Nr. Token Schlüsselwort V2 Kurz Adresse Schlüsselwort V1 Adresse
1 $CC ERROR eR $88AC ERROR $87A9
2 $CD RESUME resU $8887 RESUME $8784
3 $CE ELSE eL $A93B ELSE $A93B
4 $CF WHILE wH $92C1 WHILE $932E
5 $D0 WEND wE $9339 WEND $93A6
6 $D1 BLOAD bL $C408 BLOAD $8955
7 $D2 BSAVE bS $C411 BSAVE $898F
8 $D3 DRAW dR $75A4 DRAW $78C4
9 $D4 OUTPUT oU $AF08 OUTPUT $AF08
10 $D5 APPEND aP $AF08 APPEND $AF08
11 $D6 CLEAR clE $8CB8 CLEAR $8CB8
12 $D7 CLS $759B CLS $78BB
13 $D8 COLOR coL $7598 COLOR $78B8
14 $D9 PAINT pA $75B3 PAINT $78D3
15 $DA LLIST lL $8C87 LLIST $8C55
16 $DB FIELD fI $C420 FIELD $C5EA
17 $DC DIRALL diR $8BCA FILES $8B98
18 $DD KILL kI $C41A KILL $89FD
19 $DE LINEINPUT# liN $93DD LINEINPUT# $7003
20 $DF MERGE mE $C435 MERGE $7006
21 $E0 PLAY pL $93E0 PLAY $7009
22 $E1 COM1+ coM $AF08 COM1+ $AF08
23 $E2 PRESET prE $75A1 PRESET $78C1
24 $E3 PSET pS $759E PSET $78BE
25 $E4 PUT pU $C429 PUT $C5F3
26 $E5 DELETE deL $9232 DELETE $929F
27 $E6 RANDOMIZE rA $8F1A RANDOMIZE $8F24
28 $E7 KEYOFF kE $9104 KEYOFF $9171
29 $E8 KEYON $9052 KEYON $90BF
30 $E9 LOCATE loC $75A7 LOCATE $78C7
31 $EA RENUM reN $93EC RENUM $7015
32 $EB TROFF tR $87EF TROFF $86EC
33 $EC TRON $87E4 TRON $86E1
34 $ED KEY $8DAE KEY $8DB8
35 $EE SCREEN sC $75AD SCREEN $78CD
36 $EF SWAP sW $8B65 SWAP $8B33
37 $F0 FILES fiL $C405 COM2+ $AF08
38 $F1 CHDIR chD $C402 COM3+ $AF08
39 $F2 BEEP bE $89B8 BEEP $88B5
40 $F3 AUTO aU $93EF AUTO $7018
41 $F4 LSET lS $C423 LSET $C5ED
42 $F5 WRITE# wR $93E3 WRITE# $700C
43 $F6 WRITE $93E6 WRITE $700F
44 $F7 RESET resE $93E9 RESET $7012
45 $F8 COM4+ $AF08 COM4+ $AF08
46 $F9 EDIT eD $89E6 EDIT $88E3
47 $FA LINEINPUT $93DA LINEINPUT $7000
48 $FB LINE $75AA LINE $78CA
49 $FC LPRINT lP $8C74 LPRINT $8C42
50 $FD NAME nA $C417 NAME $8F87
51 $FE $80 VERSION verS $C42F VERSION $C5FC
52 $FE $81 BLOAD bL $89A8 BLOAD $88A5
53 $FE $82 TAPE taP $8A4C TAPE $8949
54 $FE $83 DISK diS $8A52 DISK $894F
55 $FE $84 LCOPY lC $75B6 LCOPY $78D6
56 $FE $85 CALL cA $89E3 CALL $88E0
57 $FE $86 CIRCLE cI $7595 CIRCLE $78B5
58 $FE $87 RSET rS $C426 RSET $C5F0
59 $FE $88 GWBASIC gW $8000 GWBASIC $8000
60 $FE $89 COM7+ $AF08 BUFFER $C5F9
61 $FE $8A SOUND sO $93F2 SOUND $701E
62 $FE $8B QUIT qU $FCE2 QUIT $FCE2
63 $FE $8C FUNC1+ fU $AF08 FUNC1+ $AF08
64 $FE $8D CSRLIN cS $8ADB CSRLIN $8AA9
65 $FE $8E EOF eO $8CC9 EOF $8CC9
66 $FE $8F ERDEV$ erD $8D32 ERDEV$ $8D37
67 $FE $90 ERDEV $8D0E ERDEV $8D0E
68 $FE $91 POINT poI $75B0 POINT $78D0
69 $FE $92 FIX $89A8 FIX $88A5
70 $FE $93 HEX$ hE $88BB HEX$ $87B8
71 $FE $94 INPUT$ iN $C432 INP$ $701B
72 $FE $95 INSTR inS $9185 INSTR $91F2
73 $FE $96 OCT$ oC $8D7B OCT$ $8D85
74 $FE $97 SPACE$ spaC $8B13 SPACE$ $8AE1
75 $FE $98 STRING$ strI $8B38 STRING$ $8B06
76 $FE $99 USING usI $8902 USING $87FF
77 $FE $9A XOR xO $8AE4 XOR $8AB2
78 $FE $9B INKEY$ inK $8A58 INKEY$ $8A28
79 $FE $9C &H $8A66 &H $8A34
80 $FE $9D FUNC3+ $AF08 RGET$ $C5F6
81 $FE $9E FUNC2+ $AF08 FUNC2+ $AF08
  • Der Befehl BLOAD ist doppelt vorhanden: als Nr. 6 mit dem Token $D1 und als Nr. 52 mit dem Token $FE $81. Gültig ist nur Token $D1, das bei der Eingabe erzeugt wird. Ein mit dem Monitor künstlich generiertes $FE $81 wird zwar als BLOAD gelistet, die Ausführung ergibt aber nur eine Fehlermeldung "Command not present".
  • Die Schlüsselwörter COM1+, COM2+, COM3+, COM4+, COM7+ sowie FUNC1+, FUNC2+ und FUNC3+ führen zur Routine $AF08, die Fehler 11=SYNTAX ERROR ausgibt.

Erweiterte Befehle[Bearbeiten | Quelltext bearbeiten]

Befehl Token Benutzung
OPEN $9F *1)
PRINT $99 *2)
CLOSE $A0 *1)
LOAD $93 *1)
SAVE $94 *1)
GET $A1 GET #lfn,recnum
RUN $8A RUN "dateiname"
ON $91 ON ERROR GOTO
IF $8B IF...THEN...ELSE
RESTORE $8C RESTORE zeilennummer
  • 1) Benutzt das DOS-Dateiformat und das mit DISK bzw. TAPE ausgewählte Laufwerk.
  • 2) Kann auch im Grafikmodus eingesetzt werden.

Fehlermeldungen[Bearbeiten | Quelltext bearbeiten]

Fehlermeldungen des GW-BASIC Emulators - zusätzlich zu denen des BASIC 2.0:

  • 31 COMMAND NOT PRESENT
  • 32 UNPRINTABLE ERROR
  • 33 ONLY DIRECT MODE
  • 34 ONLY DISK MODE
  • 35 ARRAY NOT ALLOWED
  • 36 WHILE WITHOUT WEND
  • 37 WEND WITHOUT WHILE
  • 38 RESUME WITHOUT ERROR
  • 39 ILLEGAL FILE NUMBER
  • 40 FILE TYPE MISMATCH
  • 41 FIELD OVERFLOW
  • 42 ILLEGAL PATH
  • 43 FILE EXISTS
  • 44 MISSING PARAMETER
  • 45 BAD NAME
  • 46 DRIVE NOT READY
  • 47 BAD FILE MODE

Die Fehlermeldungen 42 bis 47 sind nicht in Version 1 enthalten.

Tipps[Bearbeiten | Quelltext bearbeiten]

  • Nach dem Beenden oder einem Absturz kann der GW-BASIC Emulator in der Regel mit SYS 8*4096 wieder neu gestartet werden.
  • Die Farbzuordnung im Programm stimmt nicht mit der Dokumentation überein. Die dort angegebene Zuordnung kann man wie folgt herstellen: POKE &H95D0+9,8: POKE &H95D0+13,11. Siehe dazu die Anmerkung im Abschnitt Farbtabelle.
  • Die beiden ersten Parameter von COLOR haben für den Textmodus (1. Hintergrund-, 2. Zeichen-Farbe) und den Grafikmodus (genau anders herum) verschiedene Bedeutung, was verwirrend ist. Mit einem Patch kann man die Reihenfolge im Textmodus auf Zeichenfarbe, Hintergrundfarbe ändern:
POKE &H76A4,&H0086: POKE &H76A5,&H0002: POKE &H76B4,&H0021: POKE &H76B5,&H00D0
Die Parameter-Reihenfolge in GW-BASIC '64 ergibt eigentlich keinen Sinn. Im MS-DOS GW-BASIC gibt es zwar eine unterschliedliche Reihenfolge je nach SCREEN-Modus, die ist aber gerade anders herum: Für den Textmodus SCREEN 0 (und ebenso für die Grafikmodi > 1) gilt 1. Vordergrund- 2. Hintergrund-Farbe, nur der vierfarbige MidRes-Grafikmodus 1 weicht davon ab mit 1. Hintergundfarbe 2. Palette. Siehe dazu COLOR im GW-BASIC Manual.
  • Der Befehl OPEN hat ein Problem: Ist das erste Zeichen hinter "OPEN" keine Ziffer, so nimmt GW-BASIC '64 an, dass es sich nicht um ein BASIC-OPEN handelt und verzweigt zu seiner eigenen Routine. Die folgenden Anweisungen - in BASIC V2 akzeptiert - führen daher zum Fehler ?TYPE MISMATCH ERROR:
10 K=1: G=8: S=2
20 OPEN K,G,S,"TEST"
Ohne Variablen - also mit OPEN 1,8,2,"TEST" - geht es aber.
  • Da der Bereich von $6500 bis $654F nicht genutzt wird, kann man das Ende des BASIC-RAMs auf $6550 hochsetzen, z.B. mit einem Patch und anschließendem Neustart der Initialisierungs-Routine: POKE &H8779,&H0050 (POKE 34681,80): GWBASIC. Danach meldet sich GW-BASIC 2.0 mit 23375 BASIC BYTES FREE.
  • Zum Ein-/Ausschalten der 8 Sprites für die Funktionstastenanzeige am unteren Bildschirmrand benutzt GW-BASIC '64 die Speicherstelle &H03FF=1023. Mit einer Auswahl der Summanden in POKE 1023,1+2+4+8+16+32+64+128 lassen sich die Sprites einzeln anzeigen. Damit Sprites 3 (8) und 7 (128) sichtbar werden, gibt man hinter KEY1 und KEY3 eine Belegung mit mehr als 7 Zeichen ein.
  • Nach Änderung der Funktionstastenbelegung kann man den originalen Text auch ohne Neustart wiederherstellen mit SYS 36555. Diese Routine kopiert die Default-Belegung von $8EEB-$8F19 in den veränderbaren Bereich ($C000-$C0A0, $C010-$C01A, ... $C070-$C07A).


Medien[Bearbeiten | Quelltext bearbeiten]

Weblinks[Bearbeiten | Quelltext bearbeiten]

WP-W11.png Wikipedia: GW-BASIC
ist bis auf die Einschaltmeldung identisch mit der Version 2.0, was auch der Befehl VERSION zeigt.