C 64
Tips & Tricks

Tips & Tricks für Einsteiger

Diesmal zeigen wir Ihnen, wie man Programme nachlädt, das C 64-Basic schneller macht, Listings einfärbt und außerdem natürlich viele weitere nützliche Programmiertips zum C 64.

Es ist allgemein bekannt, daß das C 64-Basic nicht gerade das schnellste ist. Durch einen kleinen Trick läßt es sich aber um zirka 6 Prozent beschleunigen. Durch »POKE 53265,PEEK(53265) AND 239« wird der Bildschirm und damit auch der Video-Prozessor abgeschaltet. Dieser hat nämlich die unangenehme Eigenschaft, bei jedem Speicherzugriff (»welche Zeichen müssen nun auf dem Bildschirm dargestellt werden?«) den Prozessor kurzerhand anzuhalten. Mit dem oben genannten POKE wird nun der Video-Prozessor an dieser unliebsamen Angewohnheit gehindert. Ab jetzt werden PRINT-Anweisungen zwar ausgeführt, sind aber auf dem Monitor oder Fernseher nicht mehr sichtbar. Erst durch »POKE 53265, PEEK(53265) OR 16« ist der Bildschirminhalt wieder sichtbar. Sinnvoll ist dieses Verfahren zum Beispiel bei komplizierten mathematischen Berechnungen. Achtung: Wenn das Programm mit einer Fehlermeldung aussteigt, ist diese natürlich auch nicht mehr sichtbar. Man sollte also während der Aus-Phase zum Beispiel alle fünf Sekunden einen Signalton geben oder die Bildschirmfarbe (»POKE 53280,Farbe«) ändern. So hat man immer die Gewähr, daß das Programm noch läuft.

(Michael Rauh/tr)

Farbenspiel

Ich habe eine kleine Routine geschrieben, die sich sehr gut in eigene Programme einbauen läßt. Diese Routine läßt den Rahmen in allen Farben aufblinken:

10 s=49152
20 fora=stos+10:readx:pokea,x:next
30 data238,32,208,173,141,2,201,1,208,246,96
40 sys49152
Basic-Lader »Farbenspiel«

Mit der < CTRL > -Taste wird die Routine abgebrochen und im Basic-Programm fortgefahren. Zum Basic-Lader: Mit der Variable S kann man den Start der Routine verändern, Aufruf geschieht über SYS S. Wenn man den zweiten DATA-Wert (32) in 33 ändert, blinkt der Bildschirm. Durch Änderung der 1 (viertletzte Zahl) in 2 oder 4 wird eine andere Taste zum Abbruch ausgewählt. (Stefan Pohl/tr)

Der Mini-Autostart

Wer zu faul ist, jedesmal »RUN« einzutippen, wenn ein Programm von der Floppy geladen wurde, kann jetzt aufatmen: Ein kleiner Trick macht dies automatisch.

Wie Sie vielleicht wissen, bewirkt ein <SHIFT-RUN/ STOP >-Tastendruck ein Laden des nächsten Programms von Datasette mit automatischem RUN danach. Diesen Umstand können sich die Floppy-Besitzer zunutze machen.

Wenn Sie ein Programm laden möchten, tippen Sie ganz normal »LOAD"Programmname",8« ein und setzen dahinter noch einen Doppelpunkt. Drücken Sie nun <SHIFT-RUN/ STOP>. Auf dem Bildschirm erscheint hinter dem Doppelpunkt noch ein LOAD-Befehl (dieser wird vom C 64 jedoch ignoriert). Wenn das Programm fertig geladen ist, führt der Computer ein RUN aus.

(Bernd Roggendorf/tr)

Schablonen-Trick

Jeder, der einen Drucker besitzt, kennt folgendes Problem: Ein Druckprogramm für zum Beispiel ein Formular oder für Etiketten soll geschrieben werden. Zuweilen ist es recht mühsam, die richtige Druckposition zu finden. Mit folgendem Trick geht es etwas leichter:

Auf einem Bogen Transparent-Papier druckt man zunächst eine Seite voll Zeichen oder Ziffern. Anschließend legt man diese »Schablone« über das zu bearbeitende Formular und markiert sich die relevanten Ausschnitte, also die eigentlichen Druckpositionen. Durch Abzählen kann man nun auf der Schablone relativ leicht die Druckspalte und -zeile herausfinden. Kopiert man sich diese Schablone auf Overhead-Folie (im Schreibwarengeschäft erhältlich), so läßt sich diese, mit Hilfe eines wasserlöslichen Stiftes, beliebig oft wieder verwenden.

(Norbert J. Peter/tr)

SAVE — mal etwas anders

Vor einigen Monaten las ich in einer Computerzeitschrift den verzweifelten Brief eines Lesers, der aus Basic-Programmen unbedingt gewisse Teile herausspeichern wollte. Nach einigen Stunden Arbeit entstand das Programm CLIP (Listing 1), das diese Aufgabe löst.

PROGRAMM : CLIP           033C 03CB
-----------------------------------
033C : 20 FD AE 20 57 E2 A9 08   4E
0344 : 85 B8 20 FD AE F0 7D 90   77
034C : 4B C9 AB D0 77 20 73 00   C7
0354 : 20 C2 03 A5 2B A6 2C 85   EE
035C : C1 86 C2 A0 05 B1 5F F0   62
0364 : 08 E6 5F D0 F8 E6 60 D0   BB
036C : F4 A6 60 A5 5F 69 07 90   FF
0374 : 01 E8 85 AE 86 AF A0 06   95
037C : A2 00 B1 5F 48 8A 91 5F   54
0384 : C8 B1 5F 48 8A 91 5F 20   F9
038C : FA F5 A0 07 68 91 5F 88   2B
0394 : 68 91 5F 60 20 C2 03 A5   18
039C : 5F A6 60 85 C1 86 C2 20   B3
03A4 : 79 00 F0 B7 C9 AB D0 1C   C6
03AC : 20 73 00 F0 06 20 C2 03   16
03B4 : 4C 5F 03 A5 2D A6 2E 85   F1
03BC : AE 86 AF 4C FA F5 20 6B   D9
03C4 : A9 4C 13 A6 4C 08 AF      F9
Listing 1. Mit »CLIP« können Sie einzelne Teile eines Programmes speichern

Das Programm »CLIP« mit LOAD"CLIP",8,1 laden und danach »NEW« eingeben. Von nun an können Teile aus Basic-Programmen auf Diskette herausgespeichert werden. Es gibt vier Varianten, um den Befehl anzuwenden:

  1. SYS 828,»NAME«,AZ
  2. SYS 828,»NAME«,AZ -
  3. SYS 828, »NAME«, AZ - EZ
  4. SYS 828,»NAME«, - EZ

AZ = Anfangszeile, EZ = Endzeile

Die Parameterverarbeitung entspricht dem List-Befehl. Der Programmteil wird unter »NAME« auf Diskette gespeichert. Dieser Befehl erspart das zeitaufwendige und unkomfortable Löschen von Programmzeilen, um am Ende dieser Prozedur nur die gewünschten Zeilen zu erhalten, die man speichern will.

Zur Funktionsweise wäre lediglich zu sagen, daß aufgrund der angegebenen Zeilennummern die Adressen der Zeilen im Speicher berechnet werden und danach dieser Speicherbereich auf Diskette gespeichert wird.

Die Geräteadresse kann durch POKE 186, (gewünschte Geräteadresse) geändert werden.

(Hermann Schinagl/tr)

Unterdrückte Fehlermeldung

Manchmal ist es in einem Programm sinnvoll, eine Fehlermeldung zu unterdrücken. Ein Beispiel: Sie möchten eine mathematische Funktion darstellen und benötigen dazu eine Zahlenreihe von —10 bis 10. Die Funktion selbst lautet: y = l/x. An der Stelle x = 0 ist die Funktion nicht definiert, was sich durch einen »DIVISION BY ZERO ERROR« zeigt. Probieren Sie einmal aus: »10 FOR X = -10 TO 10 : PRINT X;: NEXT«. Die genannte Fehlermeldung erscheint beix = 0. Geben Sie nun ein: »POKE 768,61« und die FOR-NEXT-Schleife. Die Fehlermeldung bleibt aus. Sie sparen sich in Ihren Programmen so eine IF-Abfrage aufx = 0. Mit »POKE 768,139« lassen Sie Fehlermeldungen wieder zu. Achtung: Die POKEs funktionieren nur innerhalb eines Programms.

(Kai Vorhauser/tr)

Reset-Schutz für Basic-Programme

Dieses Programm (Listing 2) schützt Ihre Basic-Programme vor unerlaubtem Zugriff. Einmal aktiviert, verhindert es a) Abbruch des Programmlaufs mit RUN/STOP-RESTORE, b) Listen des Programms und c) Auslösen eines Resets.

Wird ein Reset-Taster betätigt, führt das Programm automatisch einen »RUN 0«-Befehl aus. Das zu schützende Basic-Listing muß daher eine Zeile 0 besitzen (zum Beispiel »0 REM«). Wird nach Aktivieren der Routine ein Programm gelistet, so erscheinen nur wirre Zeichen auf dem Bildschirm. Trotzdem funktioniert es nach einem »RUN« einwandfrei. Um einen automatischen Basic-Programm-Start auch bei Drückenvon <RUN/STOP-RESTORE> auszulösen, müssen Sie noch folgende POKEs eingeben: »POKE 792,226 : POKE 793,252« (diese POKEs bewirken, daß bei der genannten Tastenkombination ein Reset und damit ein Programmstart ausgelöst wird). Wenn Sie das Listing mit dem MSE abgetippt haben, können Sie es bei Bedarf absolut (also mit »,8,1«) laden und mit »SYS 49152« starten (danach »NEW« eingeben!). Der Reset-Schutz ist so lange aktiv, bis Sie Ihren C 64 ausschalten.

PROGRAMM : RESET          C000 C04E
-----------------------------------
C000 : A9 31 A2 C0 8D 00 80 8E   FA
C008 : 01 80 8E 03 80 A9 45 8D   D3
C010 : 02 80 A9 C3 A2 C2 A0 CD   93
C018 : 8D 04 80 8E 05 80 8C 06   2C
C020 : 80 A9 38 A2 30 8D 07 80   64
C028 : 8E 08 80 A9 EA 8D 28 03   D1
C030 : 60 A9 00 8D 03 08 8D 04   C5
C038 : 08 20 A3 FD 20 8E A6 20   4A
C040 : 5E A6 4C 71 A8 68 A8 68   74
C048 : AA 68 40 AA 68 40         45
Listing 2. Ein neunzigprozentiger Reset-Schutz
(Martin Legarth/tr)

Buntes Listing

Wenn Sie ein Basic-Listing vor sich haben, werden Sie bemerken, wie schwierig es seinkann, zusammengehörende Unterprogramme zu erkennen. Die Idee ist es nun, diese Unterprogramme einfach mit der gleichen Farbe aufzulisten. Dies können Sie mit Hilfe von »künstlichen Steuerzeichen« (siehe Serie in früheren 64'er-Ausgaben) umständlich oder auch mit List COLOR einfach erreichen.

10 data 72,201,143,208,11,200,177,95,201,32,240,3,141,134,2,136,104,76,26,167
20 fori=49152to49171:reada:pokei,a:next
30 poke774,0:poke775,192

Starten Sie hierzu das kleine Programm. Geben Sie hinter einem REM-Befehl direkt ein Zeichen ein, so wird dieses als Farbcode interpretiert. Wenn kein Zeichen hinter dem REM folgt, so wird das folgende Listing schwarz gefärbt. Wenn Sie zwischen REM und dem nächsten Zeichen ein Leerzeichen eingeben, wird in der bisherigen Farbe weitergelistet.

(Arno Gölzer/tr)

ASCII-Code in Bildschirmcode umwandeln

Wie wandelt man am einfachsten ein Zeichen vom ASCII-Code (PRINT CHR$(…)) in den Bildschirmcode (POKE…) um? Die wirklich einfachste und genialste Lösung besteht darin, das entsprechende Zeichen auf den Bildschirm zu bringen und dann mit PEEK den Code direkt aus dem Bildschirmspeicher auszulesen. Also:
10 PRINT" (HOME) "CHR$(ASCII-Code) :PRINT PEEK(1024)

Umgekehrt geht es natürlich ebenso einfach:
10 POKE 1024,Bildschirmcode:PRINT"(HOME)":OPEN1,3:INPUT# 1,A$:PRINTASC(A$+CHR$(0)):CLOSE1

Und weil wir gerade bei der Bildschirmverwaltung sind: Um in einem Programm die nächste PRINT-Anweisung zu positionieren, gibt es zwei Möglichkeiten:

  1. Man verwendet eine Kolonne von Cursor-Steuerzeichen, oder
  2. zwei POKEs und einen SYS-Befehl:

POKE211,Spalte: POKE214,Spalte:SYS58640

(Hans Ippisch/tr)

Das geheimnisvolle »READY.«

Bestimmt ist Ihnen das auch schon passiert: Sie waren mit dem Cursor in der Zeile, in der gerade eine »READY.«-Meldung stand und haben <RETURN> gedrückt — und sich über den daraufhin ausgegebenen »OUT OF DATA ERROR« gewundert. Warum ist das so?

Schalten Sie Ihren C 64 einmal aus und wieder ein. Fahren Sie mit dem Cursor eine Zeile nach oben, so daß er auf der »READY.«-Meldung steht, und drücken RETURN. Es erscheint die beschriebene Fehlermeldung. Geben Sie nun einmal eine Basic-DATA-Zeile ein, zum Beispiel »10 DATA 123«. Fahren Sie jetzt mit dem Cursor wieder auf das Wort »READY« und drücken RETURN. Was passiert? Richtig, die Fehlermeldung bleibt aus. Tippen Sie jetzt »PRINT Y.« (plus (RETURN)-Taste natürlich). Sie werden erstaunt sein, die Zahl 123 auf dem Bildschirm zu finden. Ahnen Sie, warum manchmal ein »OUT OF DATA ERROR« erscheint, wenn Sie »READY.« eingeben?

Der Computer interpretiert Ihre »READY.«-Eingabe nämlich als den Basic-Befehl READ. Er versucht, in die Variable »Y.« eine Zahl aus einer DATA-Zeile einzulesen. Da aber keine DATA-Zeile vorhanden war, meldet er einen »OUT OF DATA ERROR«. Erstaunlich, nicht?

(tr)

Programme nachladen

Wenn man von einem Basic-Programm aus ein zweites Programm (meist eine Maschinenroutine) nachladen möchte, so ist dies gar nicht einmal so schwierig. Man muß nur ein paar Punkte beachten.

Der wichtigste wäre, daß der C 64 nach Beenden des Ladevorgangs einen »GOTO erste Programmzeile« ausführt. Wenn Sie zu Beginn eines Basic-Programms also eine Maschinenroutine (zum Beispiel Listing 2) durch »10 LOAD "XYZ",8« nachladen möchten, würde sich der C 64 in einer Endlosschleife »aufhängen«. Wir müssen uns beim ersten Durchlauf der Zeile 10 merken, daß das Programm jetzt schon geladen ist. Am einfachsten geschieht dies durch »10 IFA = OTHENA = 1: LOAD "XYZ",8«. Beim ersten Programmstart mit »RUN« werden alle Variablen, also auch A, auf Null gesetzt. Die IF-Bedingung ist daher erfüllt; der LOAD-Befehl wird ausgeführt. Danach beginnt der C 64 wieder bei Zeile 10, die Variable A hat jetzt jedoch den Wert 1 — der LOAD-Befehl wird übersprungen und im Programm fortgefahren. Möchte man mehrere Programme nachladen, geschieht dies auf dieselbe Weise:

10 IF A=0 THEN A=1 : LOAD"P1",8
20 IF A=1 THEN A=2 : LOAD"P2",8
30 IF A=2 THEN A=3 : LOAD"P3",8

und so weiter.

Dies alles giltjedoch nur für Maschinenprogramme! Möchte man ein Basic-Programm nachladen, so ist dies schon etwas komplizierter. Solange das nachgeladene Programm kürzer ist als das erste, genügt es, einen einfachen LOAD-Befehl einzusetzen (die IF-Abfrage kann entfallen, da das zweite Programmja gleich gestartet wird). Wenn das nachgeladene Programm jedoch länger ist, werden sämtliche Variablen überschrieben.

Die allgemein günstigste Lösung soll hier kurz vorgestellt werden. Sie kann sowohl für Maschinen- als auch für Basic-Programme Verwendung finden.

Wenn Ihnen der Begriff »Tastaturpuffer« geläufig ist, können Sie diesen Absatz überspringen. Wenn nicht, geben Sie einmal folgende Zeile ein (ohne Zeilennummer), drücken < RETURN> und dann ein paar Tasten (bevor das »READY.« erscheint).

FOR I=1 T0 2000 : NEXT

Sie sehen, daß sich der C 64 Ihre Tastendrücke (bis zu zehn Stück) gemerkt hat. Er speichert sie in seinem »Tastaturpuffer«. Das Gute daran ist, daß wir durch ein paar gezielte POKE-Anweisungen in einem Basic-Programm diese Tastendrücke simulieren können. Das ist auch das Prinzip unserer Laderoutine:

Wir schreiben den LOAD-Befehl, der unser zweites Programm nachladen soll, auf den Bildschirm und machen dem C 64 vor, daß wir die < RETURN > -Taste gedrückt hätten. Dadurch wird der LOAD-Befehl dann ausgeführt. Also:

10 PRINT "[CLR,2DOWN]LOAD"CHR$(34) "XYZ"CHR$(j4) ",8
20 PRINT " [4DOWN] RUN[HOME]";

(Zur Erinnerung: Buchstaben innerhalb geschweifter Klammern dürfen Sie nicht ausschreiben, sondern müssen die entsprechenden Cursor-Tasten drücken.)

Was bedeuten die »CHR$(34)« in der Zeile 10? Wie Sie vielleicht wissen, ist es nicht möglich, ein Anführungszeichen innerhalb von Anführungszeichen zu schreiben (mit »PRINT " " "«?). Dieses benötigen wir aber für den LOAD-Befehl. Das CHR$(34) bewirkt nun, daß an der entsprechenden Bildschirmposition ein Anführungszeichen ausgegeben wird.

Wenn Sie das Programm mit RUN starten, erscheint in der dritten Zeile der LOAD-Befehl und etwas weiter unten ein »RUN«. Wenn Sie jetzt zweimal <RETURN> drücken würden und ein Programm mit dem Namen »XYZ« auf Diskette hätten, würde dieses geladen und gestartet. Da wir das Ganze aber programmgesteuert machen wollen, müssen wir die beiden RETURNs von Basic aus simulieren, also in den Tastaturpuffer schreiben. Dies geschieht über:

30 POKE 631,13 : POKE 632,13

Der Tastaturpuffer hat nämlich die Adressen 631 bis 640. »13« ist der ASCII-Code der <RETURN>-Taste (siehe auch entsprechenden Anhang im Commodore-Handbuch zu Ihrem C 64). Jetzt müssen wir dem C 64 nur noch mitteilen, daß im Tastaturpuffer noch zwei unbearbeitete Tastendrücke vorliegen: 40 POKE 198,2

Und damit die Tastendrücke auch ausgeführt werden, muß noch eine END-Anweisung folgen: 50 END

Natürlich können Sie über diesen Trick nach dem Ladevorgang auch erst eine Variable definieren oder einen POKE ausführen. Dazu müßten Sie einfach die PRINT-Anweisung in Zeile 20 ändern.

Der Tastaturpuffer bietet eine Fülle von Möglichkeiten. Wer sich erst einmal mit ihm angefreundet hat, wird ihn nicht mehr missen wollen. Beim Ausprobieren von Programmen, die mit dem Tastaturpuffer arbeiten, ist es ratsam, den Tastenzähler bei Adresse 198 so lange auf Null stehen zu lassen, bis auf dem Bildschirm die Positionierung der auszuführenden Befehle stimmt. Zu beachten wäre noch, daß Sie in den Tastaturpuffer nur ASCII-Werte POKEn dürfen (über PRINT ASC("Taste") oder Anhang im Handbuch herauszufinden).

(tr)
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →