|
|
 |
 |
Locomotive Basic (Schneider/Amstrad CPC), Teil 2
|
 |
|
4.1 Textausgabe auf dem Bildschirm
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.
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
MARGARETHE10
Die letzte Zeile zeigt, daß durch den langen Namen die Punktzahl bei Margarethe nicht mehr auf die Tabulatorposition 8 geschrieben werden kann.
Die SPC-Funktion fügt in der Printanweisung die angegebene Anzahl Leerzeichen ein:
100 PRINT " ----------------------------"
110 FOR I=1 TO 18
120 PRINT "|";SPC(28);"|"
130 NEXT I
140 PRINT " ----------------------------"
Dieses Beispiel zeichnet einen 30 Zeichen breiten und 20 Zeichen hohen Rahmen.
Die Anweisung "USING" nach einem Printbefehl legt das Format fest, in dem der nachfolgende Ausdruck ausgegeben wird. Die Festlegung erfolgt über eine Zeichenkette, bei der jedes Zeichen eine bestimmte Bedeutung hat:
Bei Zahlausdrücken: # steht für eine Ziffer
. steht für den Dezimalpunkt
+ vor oder nach dem Ausdruck erzeugt ein Vorzeichen an dieser Stelle
- vor dem Ausdruck erzeugt ein Minuszeichen bei negativem Wert
** vor dem Ausdruck erzeugt einen führenden Stern
$$ vor dem Ausdruck erzeugt ein Dollarzeichen links der ersten Ziffer
, im Ausdruck veranlasst die Ausgabe von Kommas alle drei Stellen
^ ?
Bei Stringausdrücken: ! nur erstes Zeichen
<leer> Leerzeichen vor oder nach dem String
& Bereich, in den der String eingefügt wird.
PRINT USING "-###,###.##"; 1288.345
erzeugt die Ausgabe:
-1,288,35
POS(#<kanalnummer>)
Die Funktion POS liefert die Spaltenposition, an der die nächste Ausgabe mit PRINT beginnen würde. Dasselbe gilt auch, wenn der angegebene Kanal zu einem Drucker gehört. Bei Ausgabe auf Datenkassette liefert POS() die Anzahl der seit dem letzten Zeilenvorschubszeichen geschriebenen Zeichen.
VPOS(#<kanalnummer>)
VPOS() ermittelt die Zeile, in der die nächste Ausgabe mit PRINT beginnen würde.
Löscht den Bildschirm
BORDER <farbnummer>[,<farbnummer>]
Mit diesem Befehl legen Sie die Rahmenfarbe fest. Die Farbnummer muß in jedem Fall zwischen 0 und 26 liegen, wobei folgende Zuordnung gilt:
0 schwarz 8 pink 16 rosa 24 mittelgelb
1 dunkelblau 9 dunkelgrün 17 hellpink 25 hellgelb
2 mittelblau 10 dunkeltürkis 18 mittelgrün 26 weiß
3 dunkelrot 11 himmelblau 19 blaugrün
4 violett 12 dunkelgelb 20 türkis
5 malve 13 hellgrau 21 gelbgrün
6 mittelrot 14 hellblau 22 hellgrün
7 purpur 15 orange 23 helltürkis
Werden bei BORDER zwei Farben angegeben, so wechselt die Rahmenfarbe immer hin und her. Die Wechselgeschwindigkeit wird dabei mit SPEED INK eingestellt.
INK <farbindex>,<farbnummer>[,<farbnummer>]
INK weist einem Farbindex eine Farbe zu. Werden zwei Farbnummern angegeben, blinken alle Zeichen, die mit diesem Farbindex ausgegeben wurden mit der mit SPEED INK eingestellten Frequenz.
SPEED INK <dauer 1>,<dauer 2>
SPEED INK legt bei INK-Definitionen mit zwei alternierenden Farbnummern fest, wie lange diese jeweils vor dem erneuten Wechsel zu sehen sind. Die EInheit der Zeitangaben sind fünfzigstel Sekunden.
PAPER <farbindex>
PEN <farbindex>
PEN legt fest, welcher Farbindex ab jetzt für neu ausgegebene Zeichen als Vordergrundfarbe verwendet wird. PAPER tut dasselbe mit der Hintergrundfarbe. Welcher Farbindex welcher Farbe entspricht, können Sie mit dem Befehl INK festlegen. Die Anzahl möglicher Farbindizes ist vom Grafikmodus abhängig. Bei 80 Zeichen pro Zeile sind nur 2 Farben möglich, bei 40 Zeichen sind es 4 und bei 20 Zeichen pro Zeile stolze 16.
WINDOW [#<kanalnummer>,]<erstespalte>, <letztespalte>, <erstezeile>, <letztezeile>
WINDOW schränkt den mit PRINT und INPUT nutzbaren Bildschirmbereich auf ein rechteckiges Fenster ein.
Der Bereich außerhalb des Fensters bleibt unverändert.
WINDOW SWAP <kanalnummer 1>,<kanalnummer 2>
WINDOW SWAP vertauscht den Inhalt zweier Fenster.
LOCATE [<kanalnummer>,]<x-pos>, <ypos>
LOCATE positioniert den Textcursor relativ zur oberen linken Fensterecke. Ist kein Fenster definiert, gilt die gesamte Bildschirmgröße als Fenster.
ZONE <wert>
Bei diesem Befehl verstehe ich das (französische) Handbuch nicht. Sorry, ich werde irgendwann mal rumprobieren...
4.2 Eingaben über die Tastatur
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( <tastenscancode> )
Die Funktion INKEY prüft, ob die Taste mit dem angegebenen Scancode gedrückt ist und wenn ja, zusammen mit welchen Qualifiertasten. Ein Ergebnis von -1 zeigt an, daß die Taste nicht gedrückt ist, 0 signalisiert, daß die Taste solo gedrückt wird. Zusammen mit Shift ergibt sich ein Rückgabewert von 32, zusammen mit CTRL von 128 und falls beide gemeinsam gedrückt werden von 160.
INKEY$ prüft, ob über die Tastatur ein Zeichen eingegeben wurde. Wenn ja, enthält INKEY$ dieses Zeichen, andernfalls einen Leerstring. Im Gegensatz zum INPUT-Befehl wartet INKEY$ nicht auf eine Tastatureingabe.
Mit INKEY$ können Sie auf auf Tastendrücke prüfen, denen kein Bildschirmzeichen zugeordnet ist - die Pfeiltasten z.B. oder ESC, DEL und die Eingabetaste. Die Abfrage erfolgt dann über den ASCII-Code:
100 IF ASC(INKEY$)<>13 THEN GOTO 100
Dieses Miniaturprogramm bewegt sich in einer Endlosschleife - Solange bis jemand die Eingabetaste (ASCII-Code 13) betätigt.
Das folgende Programm wartet auf Tastendrücke und zeigt die gedrückte Taste und ihren ASCII-Code:
100 A$=INKEY$
110 IF A$="" THEN GOTO 100
120 IF A$>=" " THEN PRINT A$; " = ";
130 PRINT ASC( A$ )
140 GOTO 100
SPEED KEY <dauer bis wiederholunsbeginn>,<dauer zwischen zwei zeichen>
SPEEK KEY legt fest, nach welcher Wartezeit bei einer gedrückten Taste die Wiederholfunktion einsetzt und mit welcher Wiederholrate die Zeichen dann auf dem Bildschirm erscheinen. Beide Angaben erfolgen in fünfzigstel Sekunden.
4.3 Grafik
MODE <0|1|2>
MODE legt den Bildschirmmodus fest. Modus 0 faßt 20 Zeichen in 25 Zeilen, hat eine Auflösung von 160 x 200 Bildpunkten und kann 16 Farben darstellen. Der Standardmodus 1 zeigt 40 Zeichen in einer Zeile, kann horizontal 320 Bildpunkte darstellen, hat dafür aber auch nur noch vier Farben. Eine weitere Verdoppelung der horizontalen Auflösung (80 Zeichen, 640 Bildpunkte) bringt Modus 2, der dabei allerdings nur noch 2 Farben darstellen kann.
CLG [<farbindex>]
Löscht den Grafikbildschirm
ORIGIN <x-pos>, <y-pos>[, <x-min>, <x-max>, <y-min>, <y-max>]
ORIGIN legt den Ursprung für alle Operationen mit absoluten Koordinaten fest. Durch die optionalen Parameter ist zudem ein Fenster für Grafikausgaben definierbar.
MOVE[R] <x-pos>,<y-pos>
MOVE plaziert den (unsichtbaren) Grafikcursor auf der angegebenen, absoluten Position. MOVER plaziert ihn relativ zur bisherigen Position. Von der per MOVE / MOVER gewählten Position aus kann z.B. mit dem Befehl DRAW eine Linie gezogen werden.
DRAW[R] <x-pos>,<y-pos>[,<farbindex>]
DRAW zieht eine Linie von der bisherigen Position des Grafikcursors aus zu den angegebenen Koordinaten. Dabei wird die dem angegebenen Farbindex zugewiesene Farbe verwendet. Fehlt die Angabe, wird als Farbindex "1" angenommen. DRAWR zieht die Linie relativ zur bisherigen Cursorposition. Beide Befehle plazieren den Grafikcursor anschließend auf den Endpunkt der Linie.
PLOT[R] <x-pos>,<y-pos>[,<farbindex>]
PLOT zeichnet einen Punkt an der angegebenen Stelle. Dabei wird die dem angegebenen Farbindex zugewiesene Farbe verwendet. Fehlt die Angabe, wird als Farbindex "1" angenommen. PLOTR setzt den Punkt relativ zur bisherigen Cursorposition. Beide Befehle plazieren den Grafikcursor anschließend auf den neu gesetzten Punkt.
TEST[R]( <x-pos>, <y-pos> )
Die TEST-Funktion ermittelt den Farbindex des Bildpunktes an der angegebenen Bildschirmposition. Ebenso TESTR, allerdings auf Basis relativer Koordinaten.
Die Systemvariablen XPOS und YPOS enthalten immer die aktuelle Position des Grafikcursors. Diesen können Sie nur mit MOVE, PLOT oder DRAW positionieren, eine Zuweisung von Werten an XPOS oder YPOS ist nicht möglich.
SYMBOL <ascii-code>,<definition zeile1>,...,<definition zeile 8>
Mit SYMBOL können Zeichen umdefiniert werden. Die acht Definitionswerte legen das Aussehen der acht Pixelzeilen des Zeichens fest. Dazu werden die Werte als Binärzahlen interpretiert: Eine 1 entspricht einem gesetzten Punkt, eine 0 einem nicht gesetzten Punkt.
SYMBOL AFTER <ascii-code>
Per Default können nur die 16 Zeichen mit den ASCII-Codes von 240 bis 255 mittels des SYMBOL-Befehls umdefiniert werden. Per SYMBOL AFTER können Sie den ASCII-Code festlegen, ab dem Zeichen umdefiniert werden können. Somit kann - wenn nötig - auch der gesamte Zeichensatz änderbar gemacht werden.
TAG [#<kanalnummer>]
TAG legt für den angegebenen Kanal (Default: Kanal 0) fest, daß PRINT-Befehle ihre Ausgaben nicht mehr am normalen Textcursor sondern am Grafikcursor ausgeben. Text und Grafik können so gemischt werden.
TAGOFF [#<kanalnummer>]
TAGOFF schaltet die PRINT-Ausgaben wieder auf den normalen Textbereich um.
4.4 Tonerzeugung
ENV <hüllkurvennummer>,<anzahl schritte>,<schritthöhe>,<schrittdauer>[...]
ENV definiert eine Lautstärkenhüllkurve, die dann in SOUND-Befehlen benutzt werden kann. Die Hüllkurve kann bis zu 5 Bereiche haben, in denen die Lautstärke jeweils linear verändert werden kann. In jedem Bereich wird die Lautstärke in der vorgegebenen Anzahl von Schritten verändert und zwar jeweils um die Schritthöhe. Zwischen zwei Schritten liegt die Schrittdauer. Somit dauert jeder Hüllkurvenbereich <schrittdauer> * <anzahl> hundertstel Sekunden an. Am Ende des Bereichs ist der Ton <schritthöhe> * <anzahl> Einheiten lauter (bzw. leiser bei negativer Schritthöhe) als zuvor.
Eine einfache Hüllkurve, bei der der Ton rasch die volle Lautstärke erreicht und dann langsam ausklingt definiert das folgende Beispiel:
ENV 1, 3, 5, 1, 1, 0, 10, 15, -1, 1
ENT <vibratonummer>,<anzahl schritte>,<schritthöhe>,<schrittdauer>[...]
Genau wie ENV eine Variation der Lautstärke über der Zeit definiert, tut ENT dies mit einer Variation der Frequenz. Damit können Vibratoeffekte erzeugt werden.
SOUND <kanalwahl>, <schwingungsdauer>[, <dauer>[, <lautstärke>[,
<hüllkurvennummer>[, <vibratonummer>[, <rauschschwingungsdauer>]]]]]
SOUND erzeugt einen Ton wählbarer Frequenz, Dauer und Lautstärke. Falls Sie mit ENV oder ENT Hüllkurven oder Vibrato definiert haben, können Sie den Ton durch diese modifizieren lassen. Zudem kann ein Rauschkanal angesprochen werden. Das Programm wartet nicht, bis der Ton zu Ende ist, es läuft sofort weiter. Werden weitere SOUND-Befehle auf den gleichen Kanal ausgeführt, so wandern diese in eine Warteschlange und werden aus dieser der Reihe nach abgearbeitet.
Die Tonfrequenz ergibt sich aus 125000 geteilt durch die Schwingungsdauer. Die folgende Tabelle gibt die Schwingungsdauern der Noten vom eingestrichenen zum zweigestrichenen C an:
C' 478 E 379 G# 301 C" 239
C# 451 F 358 A 284 .
D 426 F# 338 A# 268 .
D# 402 G 319 H 253 .
Höhere oder tiefere Oktaven erreichen Sie einfach durch halbieren bzw. verdoppeln der hier angegebenen Werte.
Die Kanalwahl ist etwas umständlich, da binär codiert: 1 - Ausgabe erfolgt auf Kanal A
2 - Ausgabe erfolgt auf Kanal B
4 - Ausgabe erfolgt auf Kanal C
8 - Ausgabe erfolgt synchron zu Kanal A
16 - Ausgabe erfolgt synchron zu Kanal B
32 - Ausgabe erfolgt synchron zu Kanal C
64 - Nach der Ausgabe des Tons nimmt der Kanal Haltestatus an.
128 - Löscht alle SOUND-Befehle, die für diesen Kanal noch anstehen.
RELEASE <kanalwahl>
Alle gewählten Kanäle, die im Haltestatus stehen, werden freigegeben. Tonausgaben, die per SOUND-Befehl in der Warteschlange abgestellt wurden, laufen jetzt weiter ab.
Die Funktion SQ() liefert den Warteschlangenstatus des angegebenen Tonkanals. Dieser ist bitweise codiert, dabei enthalten Bits 0 bis 2 die Anzahl freier Einträge in der Warteschlange, 3 bis 5 den Synchronisierungsstatus der drei Kanäl, Bit 6 die Annahmebereitschaft für Warteschlangeneinträge und Bit 7 zeigt an, ob der Kanal momentan aktiv ist.
4.5 Ansteuerung von Peripheriegeräten
4.5.1 Joystick
JOY( 0|1 )
Fragt die Richtung ab, in die der Joystick mit der angegebenen Nummer (0 oder 1) gerade gedrückt wird. Die Rückgabewerte sind folgendermaßen definiert:
5 1 9
\ | /
4--0--8
/ | \
6 2 10
Wird zudem die Feuertaste 1 gedrückt, erhöht sich der Wert um 32, bei Feuertaste 2 um 16.
Die einfachste Abfrageroutine für den Joystick funktioniert über eine bitweise Auswertung:
100 A=JOY(0)
110 IF A=0 THEN GOTO 100
120 IF (A AND 1) = 1 THEN PRINT "OBEN ";
130 IF (A AND 2) = 2 THEN PRINT "UNTEN ";
140 IF (A AND 4) = 4 THEN PRINT "LINKS ";
150 IF (A AND 8) = 8 THEN PRINT "RECHTS ";
160 IF (A AND 16) = 16 THEN PRINT "FEUER 2";
170 IF (A AND 32) = 32 THEN PRINT "FEUER 1";
180 PRINT
190 GOTO 100
4.5.2 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.
OPENIN "<dateiname>"
Öffnet einen Eingabekanal auf auf dem Datenrekorder.
OPENOUT "<dateiname>"
Öffnet einen Ausgabekanal auf auf dem Datenrekorder.
CLOSEIN
CLOSEOUT
Schließt einen mit OPENIN bzw. OPENOUT geöffneten Kanal.
Die Systemvariable EOF enthält den Wert 0, solange das Dateiende der mit OPENIN geöffneten Datei noch nicht erreicht ist, andernfalls -1.
PRINT#<kanalnummer>, <argumentliste>
PRINT# funktioniert genau wie der normale PRINT-Befehl, die Ausgabe erfolgt aber auf den angegebenen Kanal.
WRITE [#<kanalnummer>,][<argumentliste>]
Schreibt die angegebenen Ausdrücke auf den angegebeben Kanal.
INPUT#<kanalnummer>, <variablenliste>
INPUT# entspricht dem INPUT-Befehl, die Daten werden allerdings aus dem angegebenen Kanal gelesen.
GET#<kanalnummer>, <stringvariable>
GET# liest aus dem angegebenen Kanal ein einzelnes Zeichen.
4.5.3 Drucker
Drucker werden bei den Commodore-Rechnern am gleichen Bussystem wie das Diskettenlaufwerk betrieben. Die Gerätenummer ist normalerweise 4 oder 5.
Vom Programm aus erfolgt die Ausgabe ganz einfach durch Öffnen einer Datei auf der Druckergerätenummer und der Ausgabe von Text dorthin:
100 OPEN 1,4
110 PRINT#1, "DIESER TEXT ERSCHEINT AUF DEM DRUCKER"
120 CLOSE 1
Um Ausgaben des Direktmodus und vor allem Programmlistings auszudrucken, können Sie mit dem CMD-Befehl eine Umleitung der Standardausgabe erreichen:
CMD <dateinummer>
Der CMD-Befehl leitet die Standardausgabe, die normalerweise auf dem Bildschirm landet, in den Ausgabekanal um, der der Dateinummer entspricht. Die Umleitung bleibt erhalten, bis Sie mit PRINT# direkt in den Ausgabekanal schreiben und den Kanal dann mit CLOSE schließen:
OPEN 1,4
CMD 1
LIST
PRINT#1
CLOSE 1
Das obige Beispiel erzeugt ein Listing des im Arbeitsspeicher befindlichen Programms auf dem Drucker.
| 5. Fortgeschrittene Programmierung |
5.1 Ereignisgesteuerte Programmausführung
Oft steht man vor dem Problem, daß ein Programm mehrere Dinge gleichzeitig tun sollte - oder zumindest seinem Benutzer diesen Eindruck vermitteln sollte. Bei einem Spiel müssen die Spielfiguren permanent in Bewegung bleiben, sie können das Programm also nicht in einer simplen Eingabe-Warteschleife verhungern lassen. Ebenso, wenn z.B. in einem Anwendungsprogramm irgendwo auf dem Bildschirm eine Uhr angezeigt werden soll - egal was der Anwender gerade macht.
Man kann solche Probleme mit viel Programmierarbeit lösen - schöner ist es natürlich, wenn ein Basic-Dialekt unterstützende Befehle bereithält:
AFTER <zeit>[,<zeitgeber>] GOSUB <zeilennummer>
Nach Verstreichen der angegebenen Zeit wird ein Unterprogramm aufgerufen. Das aufrufende Programm wird in dieser Zeit nicht angehalten. Die Zeit wird in ganzzahligen Einheiten von 0,02 Sekunden angegeben, ein Wert von 50 bedeutet demzufolge eine Wartezeit von einer Sekunde. Durch die Auswahl eines der vier Zeitgeber (0, 1, 2 oder 3) können auch mehrere AFTER-Befehle gleichzeitig aktiv sein.
EVERY <zeit>[,<zeitgeber>] GOSUB <zeilennummer>
EVERY funktioniert grundsätzlich gleich wie AFTER. Während dieser aber nur einen einmaligen Unterprogrammaufruf erzeugt, wird nach der Ausführung des EVERY-Befehls das Unterprogramm zyklisch immer wieder nach Ablauf der angegebenen Zeit aufgerufen.
REMAIN(<zeitgeber>)
Die Funktion REMAIN liefert die Restlaufzeit des angegebenen Zeitgebers und schaltet ihn gleichzeitig ab. Falls REMAIN einen Rückgabewert von 0 ergibt, war der Zeitgeber bereits zuvor inaktiv.
Die beiden Befehle DI und EI unterbinden bzw. erlauben die Unterbrechnung des Programms z.B. durch einen Zeitgeber per AFTER- oder EVERY-Befehl. Sie sollten immer nur kleine Programmteile per DI und EI vor Unterbrechungen schützen und auch nur dann, wenn der Programmteil nicht unterbrochen werden darf.
ON ERROR GOTO <zeilennummer>
Mit dem Befehl ON ERROR installieren Sie eine eigene Fehlerbehandlungsroutine. Anstatt abzubrechen wird das Programm im Falle eines Fehlers in der angegebenen Zeile fortgesetzt. Dort kann der Fehler analysiert und geeignete Maßnahmen ergriffen werden.
RESUME [<zeilennummer>]
RESUME NEXT
Aus einer Fehlerbehandlungsroutine heraus aufgerufen, setzt RESUME das Programm an der angegebenen oder der auf die fehlerhafte Zeile folgenden Programmzeile fort.
Die beiden Systemvariablen enthalten die Nummer des zuletzt aufgetretenen Fehlers und die Zeilennummer, wo er aufgetreten ist. Nützlich sind diese Informationen insbesondere in jenem Programmteil, der durch ON ERROR GOTO angesprungen wird.
ERROR <fehlernummer>
ERROR erzeugt genau die gleiche Reaktion des Basicinterpreters, als wäre ein Fehler mit der angegebenen Nummer aufgetreten.
| ON BREAK GOSUB, ON BREAK STOP | ON BREAK GOSUB <zeilennummer>
ON BREAK STOP
Mit ON BREAK GOSUB können Sie verhindern, daß Ihr Programm durch zweimaliges Drücken von ESC beendet werden kann. Anstelle dessen wird ein Unterprogramm aufgerufen, das dieses Ereignis dann geeignet würdigen kann. ON BREAK STOP stellt den normalen Zustand wieder her.
ON SQ GOSUB <zeilennummer>
Das Unterprogramm wird aufgerufen, sobald einer der Soundkanäle die Erzeugung eines Tones abgeschlossen hat und demzufolge einen neuen aufzunehmen bereit ist.
5.2 Programme testen
Wenn ein Programm nicht so läuft, wie Sie es sich als sein Schöpfer eigentlich gedacht hatten, werden Sie sich sicher schnell etwas Unterstützung bei der Erziehung des mißratenen Sprößlings wünschen. Ein sehr wirksamer Weg ist die Verwendung von TRON und TROFF, die eine permanente Überwachung der Aktivitäten des laufenden Programms ermöglichen.
TRON schaltet die Programmverfolgung ein, TROFF schaltet sie wieder aus. Bei aktiver Programmverfolgung wird die Zeilennummer jeder abgearbeiteter Programmzeile angezeigt. So sehen Sie, welche Wege der Interpreter in Ihrem Code einschlägt und finden so auch sicherlich heraus, an welcher Stelle das Programm aus dem Ruder läuft.
Nähere Analysen können Sie dann mit Hilfe des STOP-Befehls betreiben.
5.3 Manipulation von Speicherstellen
Die meisten Basicdialekte ermöglichen die Manipulation beliebiger Speicherstellen des Arbeitsspeichers. So auch das Basic V2. 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 <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( <adresse> )
Die Funktion PEEK liefert den Inhalt der angegebenen Speicherstelle.
CALL <adresse>[,<argument>...]
CALL ruft ein Maschinenspracheprogramm ab der angegebenen Adresse auf.
USR( <parameter> )
Die USR-Funktion ist eine benutzerdefinierbare Maschinensprachefunktion. Um sie aufrufen zu können, müssen Sie jedoch zunächst festlegen, ab welcher Position im Arbeitsspeicher das aufzurufende Maschinenprogramm abgelegt ist. Dies machen Sie am besten mit zwei POKE-Befehlen, und zwar in Adresse 785 für das niederwertige Byte der Adresse und in Adresse 786 für das höherwertige..
Der Parameter kann vom Maschinenprogramm ausgewertet werden.
OUT <adresse>,<wert>
INP( <adresse> )
WAIT <adresse>,<wert1>[,<wert2>]
OUT beschreibt die angegebene I/O-Adresse mit einem bestimmten Wert. Mit INP() können Sie den Wert einer I/O-Adresse auslesen und mit WAIT auf ein Ereignis an einem I/O-Port warten.
I/O-Adressen sprechen direkt bestimmte Funktionen auf den Ein-/Ausgabechips des Computers an.
Die Systemkonstante enthält die Adresse des Basicspeicherendes.
MEMORY <adresse>
MEMORY setzt die Adresse des Basicspeicherendes neu, um z.B. Speicher für Maschinenspracheprogramme freizubekommen. |
|
|