Info
Sammeln
Dokumentation
Anleitungen
Schnittstellen
Prozessoren
Videochips
Soundchips
Computer
Videospiele


Sinclair Spectrum Basic, Teil 2
4. Ein- / Ausgabe

4.1 Textausgabe auf dem Bildschirm


PRINT
PRINT [<Ausdruck>[;|,[<Ausdruck>]][...]]

Der PRINT-Befehl ermöglicht die Ausgabe beliebiger Informationen auf den Bildschirm Als <Ausdruck> können Sie entweder Strings, Stringvariablen oder numerische Ausdrücke angeben, wobei letztere vor der Ausgabe ausgerechnet werden. Werden zwei Ausdrücke durch Semikolon getrennt, hängt sie der Printbefehl direkt aneinander. Ein Komma als Trennzeichen lässt eine Lücke. Komma oder Semikolon können auch am Ende des Printbefehls stehen, sie wirken sich darauf aus, wie die Ausgabe des nächsten Printbefehls angefügt wird.
Ein PRINT-Befehl alleine bewirkt einen Zeilenvorschub, d.h. der darauf folgende PRINT-Befehl beginnt mit der Ausgabe eine Zeile tiefer.
Es gibt noch einige weitere Möglichkeiten, die den PRINT-Befehl noch universeller machen:
Die Funktion TAB ermöglicht eine tabularische Ausgabe, indem sie die nächste horizontale Ausgabeposition auf die als Argument angegebene Spaltennummer setzt. Natürlich kann das nur funktionieren, wenn die nächste Ausgabeposition vor dem Aufruf von TAB noch links der angegebenen Spalte gewesen wäre. Andernfalls erfolgt die Ausgabe in der nächsten Zeile.
100 PRINT "NAME";TAB 8;"PUNKTE"
110 PRINT "KLAUS";TAB 8;"15"
120 PRINT "SANDRA";TAB 8;"18"
130 PRINT "PAUL";TAB 8;"9"
140 PRINT "MARGARETHE";TAB 8;"10"

Das Beispielprogramm produziert folgende Ausgabe:
NAME PUNKTE
KLAUS 15
SANDRA 18
PAUL 9
MARGARETHE
10

Die letzte Zeile zeigt, daß durch den langen Namen die Punktzahl bei Margarethe nicht mehr auf die Tabulatorposition 8 geschrieben werden kann.
Eine weitere Ergänzung ermöglicht die exakte Positionierung einer PRINT-Ausgabe auf dem Bildschirm: AT <y-pos>,<x-pos>.
PRINT AT 2,10; "TEST"
schreibt das Wort "TEST" ab der 10. Spalte in die zweite Bildschirmzeile.

CLS

Der Befehl CLS löscht den gesamten Bildschirm.

SCROLL

Der Befehl SCROLL schiebt den gesamten Bildschirminhalt um eine Zeile nach oben. Die erste Zeile verschwindet dabei und die letzte Bildschirmzeile ist leer.

ATTR
ATTR( <x-pos>, <y-pos> )

Die ATTR-Funktion ermittelt die Darstellungsattribute des Zeichens an der angegebenen Bildschirmposition. Der Rückgabewert ist binär codiert. Bits 0 bis 2 enthalten die Vordergrund, Bits 3-5 die Hintergrundfarbe des Zeichens. Bit 6 signalisiert helle und Bit 7 blinkende Wiedergabe des Zeichens.

SCREEN$
SCREEN$( <x-pos>, <y-pos> )

Die SCREEN$-Funktion versucht das Zeichen an der angegebenen Bildschirmposition im Zeichensatzspeicher zu finden und gibt bei Erfolg dieses Zeichen zurück, andernfalls einen Leerstring.

INK
INK <farbnummer>

INK definiert die Vordergrundfarbe der nachfolgend ausgegebenen Zeichen. Werte von 0 bis 7 stehen dabei für eine der oberhalb der Tasten 0 bis 7 aufgedruckten Farben, 8 bedeutet Transparenz, 9 Kontrast.

BORDER
BORDER <farbnummer>

BORDER legt die Rahmenfarbe sowie die Hintergrundfarbe des unteren Bildschirmbereichs fest. Der Wert muß zwischen 0 und 7 liegen.

BRIGHT
BRIGHT <helligkeit>

BRIGHT definiert die Helligkeit der nachfolgend ausgegebenen Zeichen. Dabei steht 0 für normal, 1 für hell und 8 für transparent. Andere Werte sind nicht zulässig.

INVERSE
INVERSE <status>

INVERSE 1 veranlaßt die inverse Ausgabe nachfolgender Zeichen. INVERSE 0 schaltet auf den Normalbetrieb zurück.

FLASH
FLASH <status>

FLASH definiert, wie der Blinkstatus der nachfolgend ausgegebenen Zeichen festgelegt wird: 0 sorgt für nicht blinkende, 1 für blinkende Zeichen und 8 beläßt den Blinkstatus der zuvor an den überschriebenen Bildschirmpositionen befindlichen Zeichen.

OVER
OVER <status>

Ein weiterer Befehl, der die Ausgabe folgender Zeichen beeinflusst. OVER 1 schaltet die Exklusiv-Oder-Verknüpfung der ausgegebenen Zeichen ein.

4.2 Eingaben über die Tastatur


INPUT
INPUT ["<Ausgabetext>",]<Variablenname>[,<Variablenname>][...]

Falls angegeben, schreibt der INPUT-Befehl zuerst den Ausgabetext auf den Bildschirm, gefolgt von einem Fragezeichen und dem Eingabecursor. Ohne Ausgabetext produziert INPUT nur ein Fragezeichen und den Cursor. Der Programmbenutzer muß nun die Werte für die angegebenen Variablen in der richtigen Reihenfolge eingeben.
Es ist eine gute Idee, mit jedem INPUT-Befehl nur eine Variable eingeben zu lassen. Das reduziert die Fehleranfälligkeit und gibt Ihnen die Möglichkeit, die Plausibilität jeder einzelnen Eingabe zu prüfen bevor die nächste erfolgt.

INKEY$

INKEY$ prüft, ob über die Tastatur ein Zeichen eingegeben wurde. Wenn ja, liefert INKEY$ dieses Zeichen, andernfalls einen Leerstring. Im Gegensatz zum INPUT-Befehl wartet INKEY$ nicht auf eine Tastatureingabe.

4.3 Grafik

Der Spectrum beherrscht eine echte Pixelgrafik, die zudem problemlos mit der Textdarstellung mischbar ist.

POINT
POINT( <x-pos>, <y-pos> )

Die POINT-Funktion ermittelt, ob der Bildpunkt an den angegegebenen Koordinaten gesetzt ist (Rückgabewert 1) oder nicht (0).

CIRCLE
CIRCLE <x-pos>,<y-pos>,<radius>

CIRCLE zeichnet einen Kreis mit dem angegebenen Radius, dessen Mittelpunkt auf den angegebenen Koordinaten liegt.

DRAW
DRAW <x>,<y>[,<winkel>]

Zeichnet eine Linie von der aktuellen Position des Grafikcursors zu der relativ angegebenen Position und führt dabei eine Drehung um den Winkel durch.

PLOT
PLOT <x-pos>,<y-pos>

PLOT zeichnet einen schwarzen Punkt an der angegebenen Position. Die Koordinaten entsprechen dabei den mathematischen Konventionen, der Ursprung liegt also in der linken unteren Ecke.

UNPLOT
UNPLOT <x-pos>,<y-pos>

UNPLOT zeichnet einen weißen Punkt an der angegebenen Position. Sie können damit also mit PLOT gezeichnete Punkte wieder löschen.

4.4 Tonwiedergabe

Arg viel hat der Spectrum in Sachen Tonerzeugung nicht zu bieten. Dafür ist die Ansteuerung aber auch konkurrenzlos einfach:

BEEP
BEEP <dauer>, <tonhöhe>

"BEEP" trifft die Qualität der Tonausgabe, die dieser Befehl verursacht ganz gut. Die Dauer wird in Sekunden, die Tonhöhe in Halbtönen über (bzw. unter bei negativem Wert) dem eingestrichenen C angegeben.

4.5 Ansteuerung von Peripheriegeräten


4.5.1 Dateioperationen

Dateioperationen basieren darauf, daß zunächst ein Kanal auf einem bestimmten Gerät geöffnet wird, aus dem dann gelesen oder in den geschrieben werden kann. Ist die Operation abgeschlossen, wird der Kanal wieder geschlossen.
Beim Einsatz von Microdrives stehen Dateioperationen auch auf dem Spectrum zur Verfügung.
Für Variablenfelder und Binärdaten kennt der Spectrum spezielle Lade- und Speicherbefehle, die ohne das Öffnen eines Kanals auskommen.

LOAD DATA
LOAD <dateiname> DATA <variablenname>()

Diese Variante des LOAD-Befehls lädt ein Variablenfeld in eine passend Dimensionierte Feldvariable. Das funktioniert auch mit Stringfeldern.

LOAD CODE
LOAD <dateiname> CODE [<startadresse>[,<max länge>]]

Mit diesem Befehl laden Sie eine Binärdatei an die angegebene Startadresse. Ist die Maximallänge vorgegeben, endet der Ladevorgang spätestens bei dieser Länge, andernfalls erst am Ende der Datei. Fehlt auch die Angabe der Startadresse, wird die Datei dorthin geladen, von wo sie auch gespeichert wurde.

4.5.2 Drucker

Zu einem minimalen Computer gehört auch ein ebensolcher Drucker. Sinclair ist dabei ein besonderes Meisterstück gelungen. An dem metallisierten Papierstreifen rast mit mehr als einem Kilometer pro Stunde ein Draht vorbei, der eine elektrisierbare Spitze trägt. Wo immer diese unter Strom gesetzt wird, entsteht auf dem Papier ein geschwärzter Punkt.
Für die Ansteuerung dieses Druckers kennt das Basic des ZX81 drei Befehle:

LPRINT

LPRINT funktioniert grundsätzlich genauso, wie der normale PRINT-Befehl. Die Ausgabe landet aber nicht auf dem Bildschirm sondern auf dem Drucker.

LLIST

LLIST ist eine Variante des LIST-Befehls, die das Programmlisting auf dem Drucker ausgibt.

COPY

COPY erzeugt auf dem Drucker ein exaktes Abbild des aktuellen Bildschirminhalts.
5. Fortgeschrittene Programmierung


5.1 Langsame und schnelle Abarbeitung, Pausen

Beim ZX81 muß der Prozessor beim Bildschirmaufbau mithelfen, was ihn ganz schön auf Trab hält und ihm nur wenig Zeit läßt, sich um seine übrigen Aufgaben zu kümmern. Deswegen kann ein Basicprogramm glatt vier mal so schnell abalufen, wenn der Prozessor von der Aufgabe der Bilderzeugung entbunden wird. Leider verschwindet dabei aber auch die Bildschirmanzeige. Trotzdem kann dieser Verzicht bei manchen Programmen das kleinere Übel sein:

SLOW, FAST

Sie können es sich vermutlich schon denken: FAST schaltet die Bildschirmanzeige ab und führt dazu, daß das Programm etwa vier mal so schnell läuft. Mit SLOW beenden Sie den Spuk wieder.

PAUSE
PAUSE <dauer>

PAUSE hält das Programm für die angegebene Dauer an. Die Einheit der Dauer ist eine fünfzigstel Sekunde. Die können die Warterei durch Druck auf eine beliebige Taste beenden. Die Leertaste bricht dabei das Programm ganz ab, jede andere Taste läßt es weiterlaufen.

5.2 Manipulation von Speicherstellen

Die meisten Basicdialekte ermöglichen die Manipulation beliebiger Speicherstellen des Arbeitsspeichers. So auch das Basic des ZX81. Während das Auslesen des Speicherinhalts noch recht ungefährlich ist, müssen Sie bei der Veränderung schon sehr genau wissen, was Sie tun.

POKE
POKE <adresse>,<wert>

POKE schreibt an der angegebenen Adresse den Wert (1 Byte) in den Arbeitsspeicher. Die Adresse muß im Bereich von 0 bis 65535 liegen.

PEEK
PEEK( <adresse> )

Die Funktion PEEK liefert den Inhalt der angegebenen Speicherstelle.

IN
IN( <adresse> )

Die Funktion IN liest den I/O-Port der angegebenen Adresse aus. Im Gegensatz zu PEEK() können Sie so auf Register der Peripheriechips zugreifen.

OUT
OUT <adresse>, <wert>

OUT gibt ein Byte an einem I/O-Port aus.

USR
USR( <startadresse> )
USR( <zeichen> )

Die USR-Funktion mit Adresse ruft ein Maschinenprogramm ab dieser Adresse im Hauptspeicher auf. Endet das Maschinenprogramm, so liefert USR den Inhalt des Registerpaares bc an das Basicprogramm zurück.
Wird ein benutzerdefinierbares Zeichen übergeben, liefert USR() die Startadresse des Bitmusters, das das Zeichenaussehen festlegt.