Tips & Tricks für Einsteiger
Wir bringen Ihnen diesmal einen kurzen Beitrag über eins der wichtigsten Themen, die Computer-Neulinge beschäftigen: Wie man fehlerfrei Programme abtippt! Daneben viele kurze Programmiertips und nützliche Hinweise im Umgang mit dem C 64.
Egentlich sollten wir an dieser Stelle keine Eigenwerbung betreiben, aber wir tun’s trotzdem. Für Einsteiger auf dem C 64 haben wir nämlich einen ganz heißen Tip: Unser Sonderheft 5/86. Titel: »Grundlagen«. Von der Grafik- bis zur Musik-Programmierung, vom gekonnten Umgang mit der Datasette bis hin zum sinnvollen Einsatz des Diskettenlaufwerks bietet Ihnen dieses Sonderheft Antwort auf alle grundlegende Programmierfragen. Viele ausführliche und leicht verständliche Artikel helfen Ihnen, ein C 64-Profi zu werden.
(tr)Programme fehlerfrei abtippen
Jeder C 64-Fan, egal ob blutiger Anfänger oder ausgefuchster Profi, macht beim Abtippen von Programmen Fehler. Der Profi ist jedoch meist in der Lage, den Fehler schnell zu erkennen und zu beheben. Wir geben Ihnen ein paar Tips, wie auch Sie zum Tipp-Profi werden.
Der wichtigste Punkt, den man sich unbedingt merken sollte, ist folgender: Der C 64 »versteht« nur Eingaben, die nicht länger sind als 80 Zeichen (zwei Bildschirmzeilen)! Egal, ob man sich im Direktmodus befindet (also ohne Zeilennummer) oder gerade eine Basic-Zeile eingibt. Alles, was über die zweite Bildschirmzeile hinausgeht, wird vom Computer als neues Kommando verstanden, und der Rest »vergessen«.
Was tut man aber, wenn eine Zeile, die in der 64’er abgedruckt ist, doch über zwei Bildschirmzeilen hinausreicht? Zuerst einmal muß man sagen, daß bis auf drei Ausnahmen alle Leerzeichen vor und nach Basic-Befehlen ersatzlos weggelassen werden können. Für den C 64 ist es also völlig egal, ob Sie
100 FOR I = 1 TO 100 : NEXT I
oder
100FORI=1TO100:NEXTI
eintippen! Unsere Listings enthalten diese Leerzeichen nur, um die Lesbarkeit des Programms zu erhöhen. Außerdem können Sie sich eine Menge Zeit sparen, wenn Sie beim Abtippen die Leerzeichen weglassen. Lediglich vor den Befehlen »AND«, »OR« und »NOT« sollte ein Zeichen Zwischenraum gelassen werden. Der C 64 könnte sonst einen »syntax error« melden, wo keiner ist. Ein weiterer Punkt, um beim Abtippen Platz und Zeit zu sparen, ist, alle Basic-Befehle abgekürzt einzugeben. Generell kann man sagen, daß die Abkürzung eines Befehls sein erster Buchstabe plus der zweite Buchstabe zusammen mit der Shift-Taste ist. Es gibt aber einige Ausnahmen. Dies alles können Sie im Anhang D der Bedienungsanleitung zu Ihrem C 64 entnehmen. Dieser Anhang ist überhaupt einer der nützlichsten des gesamten Handbuchs. Am besten, man kopiert sich diese Seite und hängt sie über seinen C 64.
In unseren Listings sind des öfteren Zeichen enthalten, die Sie auf der Tastatur vergeblich suchen werden. Da wären zum Beispiel die geschweiften Klammern. Alles, was innerhalb der geschweiften Klammern steht, dürfen Sie nicht eintippen, sondern müssen die darin angegebene Taste drücken. Auf dem Bildschirm erscheint dann ein reverses Zeichen (also dunkles Zeichen auf hellem Grund). Dies hat folgenden Grund: Geben Sie auf Ihrem C 64 einmal ein Anführungszeichen ein und drücken dann zum Beispiel die »Bildschirm löschen«-Taste (also <SHIFT> und <CLR>). Was passiert? Der Bildschirm wird nicht, wie man es vermutet hätte, gelöscht, sondern es erscheint ein reverses Herzchen. Dies ist der Steuer-Code für »Bildschirm löschen«. Immer, wenn der C 64 auf ein solches Zeichen innerhalb von PRINT-Anweisungen im Programmablauf stößt, wird das Zeichen nicht auf dem Bildschirm ausgegeben, sondern die entsprechende Funktion (hier: Bildschirm löschen) ausgeführt. Dies gilt für alle Farbtasten, sämtliche Cursor-Steuer-Funktionen und die Funktions-Tasten.
Weiterhin werden Sie in unseren Listings unter- beziehungsweise überstrichene Buchstaben und Zeichen finden. Die Erklärung ist ganz einfach: Unterstrichen bedeutet: Buchstabe/Zeichen zusammen mit der <Shift>-Taste drücken. Überstrichen bedeutet: Buchstabe/Zeichen zusammen mit der »Commodore-Taste« (ganz links unten auf der Tastatur) drücken.
Warum haben wir unsere Listings mit diesen Zeichen versehen? Die Grafik-, beziehungsweise (Cursor-) Steuerzeichen sind auf dem Drucker, also auch in der 64’er, nur sehr schwer zu unterscheiden. Wenn Sie schon einmal ein Basic-Programm aus einer anderen Computerzeitschrift abgetippt haben, werden Sie die Vorteile unserer »übersetzten« Zeichen erkennen. Um Ihnen das Gesagte noch einmal zu verdeutlichen, zeigen wir Ihnen ein kleines Beispiel: Wenn Sie dies in der 64’er lesen,

und Sie es korrekt eintippen, sollte auf Ihrem Bildschirm dies zu sehen sein:

Zum Schluß soll noch ein seltener Spezialfall erklärt werden. Wenn Sie in einem unserer Listings ein [DEL] sehen, so müssen Sie folgendermaßen vorgehen (gilt nur innerhalb von Anführungszeichen) :
SHIFT-2, DEL, SHIFT-DEL, DEL, SHIFT-2, DEL
Auf Ihrem Bildschirm sollte nun ein reverses T erscheinen.
Noch ein Wort zu den Zahlen innerhalb der eckigen Klammern, die in allen unseren Basic-Listings auftauchen: Um unseren Lesern eine maximale Sicherheit beim Abtippen zu gewähren, haben wir ein Programm namens »Checksummer« entwickelt. Der Checksummer ist auf jeder Programmservice-Diskette enthalten. Die Anleitung wurde zuletzt in der 64’er, Ausgabe 3/85 auf Seite 55 veröffentlicht. Beim Eingeben von Listings bringt der Checksummer eine sogenannte Prüfsumme für jede Basic-Zeile auf den Bildschirm. Diese Prüfsumme muß mit der Zahl, die im Heft abgedruckt ist, übereinstimmen. Das bedeutet für Sie, daß Sie diese Zahlen nicht mit abtippen dürfen! Sie dienen lediglich der Kontrolle. Übrigens: Auch dem Checksummer ist es »egal«, ob Sie die Leerzeichen vor und nach den einzelnen Basic-Befehlen mit abtippen oder nicht. Die Prüfsumme bleibt in jedem Fall gleich.
(tr)»Pseudo-Scroll« unsichtbar?
Einige Leser werden wahrscheinlich das Programm Pseudo-Scroll von N. Bergerhoff aus der 64’er, Ausgabe 3/86, abgetippt haben und auf ein Problem gestoßen sein: Denn wenn Sie einen älteren C 64 besitzen, funktioniert das Programm einwandfrei, bis auf den Aufruf, der den ganzen Bildschirm mit Shift-X vollschreibt (zum Beispiel SYS 49232,1,0,0). Dies geschieht zwar auch, aber die Zeichen sind nicht zu sehen, da sie die Hintergrundfarbe annehmen. Bei neueren C 64 nehmen die Zeichen die aktuelle Zeichenfarbe an. Dies liegt an der Routine, die die Hintergrundfarbe setzt, die es in zwei Versionen gibt. Erläutert wurde dies schon in der 64’er, Ausgabe 1/86, Seite 76.
Für alle diejenigen, die nun ein älteres Modell des C 64 besitzen und die in den Genuß von »Pseudo-Scroll« kommen wollen, zeigt Listing 1 ein Programm, das diesen Fehler aufhebt.
Dabei lädt man »PSEUDO-SCROLL« gefolgt von dem Befehl »NEW«. Daraufhin wird Listing 1 wieder geladen und gestartet. Das Programm nimmt dann die notwendigen Änderungen vor. Nun gibt man den Filenamen an, unter dem das geänderte Programm gespeichert werden soll, und fertig ist die Version von Pseudo-Scroll für alle älteren C 64.
0 rem *******************************
1 rem * *
2 rem * ergaenzung zu pseudo-scroll *
3 rem * fuer c-64 mit alten rom's *
4 rem * *
5 rem * a.lazarevic' *
6 rem * im geyberg 19 *
7 rem * 5165 huertgenwald-gey *
8 rem * tele.: (02429) 7171 *
9 rem *******************************
10 :
11 poke49315,76:poke49316,96:poke49317,193:poke49318,96
12 fort=49504to49534:read da:poket,da:nextt
13 input"{clr}filenamen ";n$
14 open 1,8,1,n$
15 print#1,chr$(0);chr$(192);
16 for i=49152to49534
17 print#1,chr$(peek(i));
18 next i
19 close1
20 data157,232,6,232,208,250,160,0,162,216,132,248,134,249,173,134,2,145
21 data248,200,208,251,230,249,166,249,224,220,208,243,96
Pfeifender C 64
Warum denn immer vor dem Bildschirm warten, bis der C 64 ein Programm von Datasette geladen hat? Mit einem kleinen Trick gibt der C 64 einen lauten Pfeifton von sich, wenn das Programm im Speicher steht.
- Bildschirm löschen
- Folgende POKEs eingeben:
S=54272: POKES+24,15: POKES+6,240: POKES+1,50: POKES+4,33
dann aber nicht <RETURN>, sondern - \<SHIFT-RETURN> drücken!
- LOAD "gewünschtes Programm" eingeben und <RETURN> drücken.
- Dann zuerst die <HOME>- und dann die <RETURN>-Taste drücken. Auf dem Bildschirm hat das zunächst keine Wirkung.
- Erst jetzt die <PLAY>-Taste an der Datasette drücken.
Sobald der Ladevorgang beendet ist, werden die unter 5. genannten Tasten ausgeführt und dadurch der Pfeifton (Punkt 2.) gestartet. Abschalten mit \<RUN/STOP-RESTO-RE > oder POKES + 4,32.
(Markus Beinlich/tr)Zahlen eingeben mit dem Joystick
Mit diesem Programm (Listing 2) ist es möglich, über den Joystick (Port 1) eine beliebige 6stellige Zahl einzugeben und auszuwerten. Auf dem Bildschirm erscheinen sechs Nullen, nachdem der Joystick nach oben bewegt wurde. Unter einer Ziffer erscheint ein Pfeil. Durch die Bewegung des Joysticks nach oben, wird die durch den Pfeil angezeigte Ziffer um eins erhöht. Bei Bewegung des Joysticks nach rechts oder links erscheint der Pfeil unter der nächsten Ziffer. Es ist immer die Ziffer zu verstellen, auf die der Pfeil zeigt! Auf Knopfdruck wird der Bildschirm gelöscht und die Zahl wird dargestellt. An diese Stelle (Zeile 60100) können Sie nun in Ihrem eigenen Programm die eingegebene Zahl weiter verarbeiten. Sie steht in der Variablen AZ.
60000 print"{clr}{blk}":z1=48:z2=48:z3=48:z4=48:z5=48:z6=48:az=0
60005 if peek(56321)<>254 then60005
60010 ba=1520:zc=48:pokeba,zc:pokeba+1,zc:pokeba+2,zc:pokeba+3,zc:pokeba+4,zc
60011 pokeba+5,zc:fors=1to100:next
60020 if peek(56321)<>255 then 60025:
60021 goto 60020
60025 pokeba+40,32:if peek(56321)=254 thenpokeba,z1:z1=z1+1:if z1>57thenz1=48
60026 goto 60032
60032 if peek(56321)=247 then60037
60033 goto 60039
60037 if peek(56321)=254 thenpokeba+1,z2:z2=z2+1:if z2>57 then z2=48
60038 ba=ba+1:if ba>1525thenba=1520
60039 if peek(56321)=251 then 60041
60040 goto60045
60041 if peek(56321)=254 then pokeba-1,z2:z2=z2+1:if z2>57thenz2=48:
60042 ba=ba-1:if ba<1520 thenba=1525
60045 if peek(56321)=247 then60050
60047 goto60055
60050 if peek(56321)=254 then pokeba+2,z3:z3=z3+1:if z3>57 then z3=48
60051 ba=ba+1:if ba>1525 then ba=1520
60055 if peek(56321)=247 then 60060
60057 goto60065
60060 if peek(56321)=254 then pokeba+3,z4:z4=z4+1:if z4>57 thenz4=48
60061 ba=ba+3:if ba>1525 then ba=1520
60065 ifpeek(56321)=247 then 60070
60067 goto60075
60070 if peek(56321)=254 thenpokeba+4,z5:z5=z5+1:if z5>57 then z4=48
60071 ba=ba+4:if ba>1525 then ba=1520
60075 if peek(56321)=247 then60080
60077 goto 60085
60080 if peek(56321)=254 then pokeba+5,z6:z6=z6+1
60081 ba=ba+5:if ba>1525 then ba=1520
60085 pokeba+40,30
60089 if peek(56321)=239 then 60091
60090 goto 60020
60091 if peek(56321)<>239 then goto 60020
60092 fors=1to45:next:if peek(56321)<>239 then 60020
60097 z1=peek(1520)-48:z2=peek(1521)-48:z3=peek(1522)-48:z4=peek(1523)-48
60098 z5=peek(1524)-48:z6=peek(1525)-48
60099 az=(z1*100000)+(z2*10000)+(z3*1000)+(z4*100)+(z5*10)+z6
60100 print"{clr}{lblu}{down}{down}{rght}{rght}{rght}{rght}die zahl heisst: ";az
60110 geta$:if a$=""then60110
60120 if peek(56321)<>255 then60110
Zahlen rechtsbündig
10 f$= "{6 space}" : rem fuellstring
20 inputx:gosub1000:printx$:end
1000 x=int(x*100+.5)/100
1010 x$=f$+str$(x)
1020 ifx=int(x)thenx$=x$+ ".00"
1030 ifmid$(x$,len(x$)-1,1)="."thenx$=x$+"0"
1040 x$=right$(x$,9)
1050 return
Zu Beginn des Programms wird ein Füllstring definiert. Zur Aufbereitung der Variablen X wird ins Unterprogramm verzweigt. Zeile 1000 rundet X auf die Anzahl der Nachkommastellen (hier 2). Zeile 1010 wandelt X in eine Stringvariable und stellt ihr den Füllstring voran. In den Zeilen 1020 und 1030 werden bei Bedarf die Nachkommastellen auf zwei aufgefüllt. Zeile 1040 schneidet den String der passenden Länge heraus, hier sechs Vor- und zwei Nachkommastellen plus Dezimalpunkt.
(H. G. Sander/tr)GET-Befehl sinnvoll angewendet
Hier ist ein sehr praktisches Unterprogramm, wenn in einem Programm eine Taste an verschiedenen Stellen gedrückt werden soll (in einem Menü wählen — eine Frage mit ’J/N’ beantworten — und so weiter).
Bevor man die Routine durch ein »GOSUB« aufruft, werden die zugelassenen Tasten in der Variable ZT$ definiert (zum Beispiel: ZT$ = "1234", oder ZT$ = "JN" oder ZT$ = CHR$(…)).
In der Zeile 10000 wird zuerst der Zähler »OK« auf Null gestellt; in Zeile 10010 folgt der übliche »GET«-Befehl mit der Stringvariablen OK$.
In der Zeile 10020 wird überprüft, ob die gedrückte Taste einer der in ZT$ definierten entspricht, bis eventuell der ganze String überprüft worden ist (Zeile 10030). Ist nichts gefunden worden, wird auf einen neuen Tastendruck gewartet (Zeile 10040).
Ist der Test in Zeile 10020 positiv, wird ins Hauptprogramm zurückgesprungen — mit folgenden Informationen:
- OK$ enthält die gedrückte Taste
- OK enthält den Rang von OK$ im String ZT$ (für ein »ON OK GOTO/GOSUB«)
- AW enthält den ASCII-Wert von OK$ (kann natürlich weggelassen werden).
10000 OK=0
10010 GET OK$:IF OK$=""THEN 10010
10020 OK=OK+1:IF MID$(ZT$,OK,1)=OK$ THEN AW=ASC(OK$) :RETURN
10030 IF OK\<LEN(ZT$) THEN 10020
10040 GOTO 10000