# GW-BASIC

GW-BASIC ist ein Interpreter für die Programmiersprache BASIC des Unternehmens Microsoft. Es wurde für die ersten IBM-kompatiblen, aber nicht direkt von IBM hergestellten PC entwickelt. Zwischen 1983 und 1991 wurde es als Bestandteil des Betriebssystems MS-DOS bis Version 4.02 vertrieben, danach von QBasic und dem aufwendigeren Programmpaket QuickBASIC ersetzt.
Die Assembler-Quelltexte der 8088-Portierung für MS-DOS von 1983 wurden am 22. Mai 2020 unter der MIT-Lizenz veröffentlicht. Gedacht ist der auf GitHub einsehbare Quelltext für Ausbildungszwecke und um historische Einsichten zu ermöglichen.

## Geschichte

BASIC war die erste Programmiersprache für den 1981 erschienenen IBM PC. Dieser verfügte (wie viele Heimcomputer jener Zeit) über einen BASIC-Interpreter im ROM namens Cassette BASIC. Dieses ROM-BASIC wurde gestartet, wenn beim Booten des Rechners kein Betriebssystem gefunden wurde. Es war jedoch nicht möglich, von einem auf dem PC gestarteten Betriebssystem aus auf das BASIC zuzugreifen. Daher entwickelte Microsoft mit BASICA (für „Advanded BASIC“) einen Interpreter für DOS, der auf IBM PCs das BASIC im ROM nutzbar macht und um einige fehlende Funktionen für den Diskettenzugriff erweitert. IBM integrierte den Befehl BASICA anschließend in PC DOS. Cassette BASIC war exklusiv für die Firma IBM lizenziert, sodass Advanced BASIC auf IBM-PC-kompatiblen Computern, die kein ROM-BASIC besitzen, nicht funktioniert.
Im Laufe der 1980er Jahre kamen IBM-PC-kompatible Computer anderer Hersteller auf den Markt, die oft MS-DOS (großteils identisch mit PC DOS) als Betriebssystem nutzten. Für diese Klone lizenzierte Microsoft MS-DOS und verkaufte an interessierte Anwender direkt GW-BASIC, welches nicht auf dem ROM-BASIC-Interpreter angewiesen ist, auf Diskette. Bald darauf lizenzierten auch einige Erstausrüster von „IBM-PC-Kompatiblen“ GW-BASIC, sodass deren Systeme mit bereits vorinstalliertem zum IBM PC kompatiblem BASIC ausgeliefert werden konnten, denn BASICA und GW-BASIC sind vollständig kompatible BASIC-Dialekte, wobei GW-BASIC auf jedem PC-kompatiblen Rechner unter DOS läuft. Dabei handelt es sich im Wesentlichen um eine direkte Portierung von Microsofts MBASIC (auch bekannt als BASIC-80) auf den IBM PC – MBASIC war für 8080/Z80-Rechner geschrieben worden und lag seinerseits bereits den meisten Erstausrüster-Systemen mit CP/M bei.
Die Verfügbarkeit als Teil von MS-DOS, die oft per Vorinstallation einer OEM-Version von DOS ohne Zusatzkosten gegeben war, förderte in kleinen Unternehmen die Entstehung vielfältiger Programme in GW-BASIC – bis hin zu „ausgewachsenen“ Datenbanksystemen, ähnlich wie später kleinere Applikationen in Visual Basic for Applications geschrieben wurden. Ab ca. 1985 wurde Microsoft BASIC (MBASIC, BASICA, GW-BASIC) in seiner Bedeutung von Turbo Pascal der Firma Borland verdrängt.
Am 21. Mai 2020 hat Microsoft GW-BASIC Version 1.0, wegen seiner historischen Relevanz und zu Bildungszwecken, als Open Source freigegeben, womit es nunmehr unter der MIT-Lizenz frei zur Verfügung steht.

## Namensgebung

Der Ursprung des Namens „GW-BASIC“ ist unklar. Die Initialen „GW“ könnten nach Greg Whitten, einem frühen Microsoft-Angestellten, der auch für Standards bei Microsoft-BASIC-Compilern zuständig war, gewählt sein. Whitten schreibt die Namenswahl Microsoft-Gründer Bill Gates zu und gibt als Ursprung den englischen Ausruf gee whiz! (zu deutsch etwa „Potz Blitz!“) an. Diese Erläuterung taucht angeblich auch im Microsoft User Manual der Microsoft Press auf. Eine weitere verbreitete Erklärung geht davon aus, dass es sich bei den Initialen GW um Abkürzung für Graphics and Windows handelt, da GW-BASIC neue Befehle für Grafikroutinen und grundlegende Fensterunterstützung mitbrachte. Andere vermuten, dass der Name GW-Basic von den (vertauschten) Initialen von Bill Gates’ vollständigem Namen William „Bill“ Gates stammen, der Microsofts ersten BASIC-Interpreter selbst programmiert hatte.

## Entwicklungsumgebung

GW-BASIC hat wie das originale BASIC aus dem Dartmouth College eine kommandobasierte Entwicklungsumgebung. Programmzeilen müssen mit Zeilennummern beginnen. Eingaben ohne Zeilennummer werden direkt ausgeführt. Mittels LOAD und SAVE können BASIC-Programme geladen und gespeichert werden. Als Dateiformate können ein Bytecode- als auch das ASCII-Format verwendet werden. LIST zeigt das aktuelle Programm an, NEW löscht den aktuellen Programmspeicher. RENUM erlaubt die Neuzuweisung von Programmzeilen. Zur Fehlersuche kann man mittels STOP im Programm Haltepunkte setzen, wobei die Ausführung mit CONT fortgesetzt werden kann. Zur Ablaufverfolgung können die Befehle TRON und TROFF verwendet werden. SYSTEM beendet den Interpreter und kehrt zum Betriebssystem zurück. Viele dieser Anweisungen zur Programmerstellung und Fehlersuche können über die Funktionstasten F1 bis F10 aufgerufen werden. Eine Neubelegung dieser Tasten ist mit der Anweisung KEY möglich.
Als Interpreter erzeugt GW-BASIC keine unabhängig ausführbaren Programmdateien. In dieser Sprache geschriebene Programme sind zusammen mit dem Interpreter zu starten. Von Microsoft wurde daher später der BASIC-Compiler BASCOM angeboten.

## Sprachaufbau

Der Datentyp von Variablen wird in GW-BASIC wie in vielen BASIC-Dialekten durch Typenzeichen festgelegt, die an den Variablennamen angehängt werden. A$ ist eine Zeichenkette, A% ist eine ganze Zahl, A! und A# sind Gleitkommazahlen mit einfacher bzw. doppelter Genauigkeit. Fehlt das Typenzeichen, so wird eine Gleitkommazahl einfacher Genauigkeit angenommen. Durch Anweisungen DEFINT, DEFSTR usw. kann festgelegt werden, dass alle Variablen, deren Name mit einem bestimmten Zeichen beginnt, einen bestimmten Variablentyp haben, so dass auf das Typenzeichen verzichtet werden kann.
GW-BASIC erzwingt keine Strukturierte Programmierung. Der Programmablauf kann mittels der Sprunganweisung GOTO bestimmt werden. Unterprogramme können mittels GOSUB/RETURN aufgerufen werden. Die bedingten Anweisungen IF/THEN/ELSE müssen in einer Zeile geschrieben werden. Die Anweisungen WHILE/WEND und FOR/NEXT können über mehrere Programmzeilen gehen. Funktionen können mit der Anweisung DEF FN definiert werden, wobei die Definition jeweils in eine einzige Zeile passen muss, z. B. DEF FNLOG(basis,nummer)=LOG(nummer)/LOG(basis).

## Merkmale

GW-BASIC kann Dateien, parallele Schnittstellen und serielle Schnittstellen lesen und schreiben. Als Eingabegeräte werden neben der Tastatur auch analoge Joysticks und Lichtgriffel unterstützt, nicht aber Mäuse, da diese zur Zeit der Entwicklung von GW-BASIC auf IBM-kompatiblen PCs noch wenig verbreitet waren und häufig zueinander inkompatible Treiber verwendeten. Zur maschinennahen Programmierung können in Maschinencode geschriebene Unterprogramme eingebunden werden, die durch CALL aufgerufen werden. Der gesamte unter MS-DOS verfügbare Adressraum kann sowohl gelesen als auch geschrieben werden; der Zugriff kann dabei sowohl byte-weise (mittels PEEK und POKE) als auch seitenweise (mittels BLOAD und BSAVE) erfolgen. Portzugriffe auf interne Schnittstellen erfolgen mittels INP und OUT.
Mittels der Konstruktion ON ... GOTO/GOSUB bietet GW-BASIC eine Möglichkeit zum Interrupt-gesteuerten Programmablauf. Unterbrechungen können hierbei z. B. durch einen Tastendruck, ein Signal der seriellen Schnittstelle oder den Ablauf einer festgelegten Zeitspanne ausgelöst werden.
Die Programmiersprache unterstützt CGA- als auch EGA-Grafik. VGA Grafikmodi werden in GW-Basic noch nicht unterstützt. Auch höhere Grafikanweisungen wie LINE, PAINT oder CIRCLE stehen zur Verfügung. Einzelne Punkte können mit PSET eingefärbt und der Farbwert mit POINT wieder ausgelesen werden. Bitmaps können mittels GET und PUT gelesen und geschrieben werden.
Mit der PLAY-Anweisung kann der PC-Lautsprecher einstimmige Melodien abspielen, wobei Noten als Zeichenkette angegeben werden (z. B. PLAY "edcdeee2dfedc4"). Ein Zugriff auf niedrigerer Ebene ist mit der SOUND-Anweisung möglich. Dabei wird die Frequenz in Hertz und die Länge in 'clock ticks' für den Systemlautsprecher angegeben.

## Grenzen

Eine Hürde für die Verwendung von GW-BASIC für größere Anwendungen besteht darin, dass der verfügbare Speicher auf 64 KB begrenzt ist. In diesen Speicherraum müssen Daten als auch Programmcode untergebracht werden. Diese Einschränkung kann nur bedingt durch die Overlay-Technik ausgeglichen werden, die mittels der Anweisungen CHAIN und MERGE zur Verfügung gestellt wird. Auch die nur rudimentäre Unterstützung strukturierter Programmierung erschwert die Wartung größerer Programme, weswegen die Sprache für größere Anwendungen nur wenig geeignet ist. Da weder Mausunterstützung vorliegt noch moderne Grafik- oder Soundkarten unterstützt werden, ist die Programmierung optisch zeitgemäßer Anwendungen kaum möglich.