********* Welcome to iDOC= - the international CBM documentation project! The goal of iDOC= is to preserve (non-English) Commodore related documents in electronic text format that might otherwise cease to exist with the rapid advancement of computer technology and declining interest in 8-bit computers on the part of the general population. If you would like to help by converting Commodore related hardcopy documents to electronic texts please contact the manager of iDOC=, Peter Karlsson, at pk@abc.se. Extensive efforts were made to preserve the contents of the original document. However, certain portions, such as diagrams, program listings, and indexes may have been either altered or sacrificed due to the limitations of plain vanilla text. Diagrams may have been eliminated where ASCII-art was not feasible. Program listings may be missing display codes where substitutions were not possible. Tables of contents and indexes may have been changed from page number references to section number references. Please accept our apologies for these limitations, alterations, and possible omissions. Document names consists of a reasonably short unique title, followed by the document language. Two optional fields follow; first the document version (0 for incomplete texts, version 1 is usually unnumbered), and then the document source, if there are more than one. Finally, the document is given a .txt extension. The author(s) of the original document and members of iDOC= make no representations about the accuracy or suitability of this material for any purpose. This etext is provided "as-is". Please refer to the warranty of the original document, if any, that may included in this etext. No other warranties, express or implied, are made to you as to the etext or any medium it may be on. Neither the author(s) nor the members of iDOC= will assume liability for damages either from the direct or indirect use of this etext or from the distribution of or modification to this etext. Therefore if you read this document or use the information herein you do so at your own risk. ********* The iDOC= etext of the German edition of the Commodore 64 user's guide, converted to text by Fabian Meyer C64_DE1.TXT, May 1997, etext #4. Updated in c64_de2.txt, July 2001. Updated in c64_de3.txt, November 2002. Note from the etexter (in German, in case you didn't notice): Nach einigen Wochen scannen und formatieren ist es vollbracht: Das deutsche COMMODORE 64 Bedienungshandbuch. Vermutlich das erste grosse Dokument für das International Project 64. Das Original-Handbuch welches mir und jetzt auch Dir vorliegt, macht den Eindruck einer Version 1.0. Commodore schreibt schon in der Einleitung, dass Programme in Entwicklung sind. Aber wen wunderts, zu diesem Zeitpunkt war der Commodore 64 brandneu und es gab noch keine Software dazu. Das Handbuch hat einige Fehler drin, welche ich soweit wie möglich korrigiert habe. Falls es doch noch irgendwelche Fehler enthalten sollte, teile mir diese bitte mit, damit sie umgehend korrigiert werden können. Ich wollte das Layout des Handbuches nicht durcheinander bringen, und habe deshalb jede Seite direkt übernommen. Die Seitennummer ist jeweils zu Beginn der Seite mit *x* gekennzeichnet. Wenn Du also nach der Seite 50 suchst, suche mit Deinem Text-Viewer einfach nach '*50*'. Noch ein Hinweis: Sämtliche Commodore 64 spezifischen Grafikzeichen konnten in dieser Text-Version nicht berücksichtigt werden. Dies betrifft folgende Kapitel: - Farbgebung mit Print-Befehlen, Seite 57 - Anhang D, Abkürzungen der BASIC Schlüsselwörter, Seite 130 - Anhang E, Bildschirm Codes, Seite 132 - Anhang F, ASCII und CHR$ Codes, Seite 135 - Anhang R, Bildschirm-Steuerzeichen, Seite 166 Als Alternative kannst Du dazu meine PDF-Version dieses Handbuches von meiner Homepage herunterladen, welche sämtliche Grafiken und Bilder enthält! Ansonsten kannst Du mit diesem kleinen BASIC-Programm alle Bildschirm-Codes auf den Bildschirm holen: 10 FOR X = 0 TO 255 20 POKE 1024+X,X 30 NEXT Mit schaltest Du darauf zwischen dem ersten und dem zweiten Zeichensatz um. Um den ASCII-Code eines Zeichens herauszufinden: PRINT ASC("X") wobei X dem gesuchten Zeichen entspricht. OK, nun wünsche ich Viel Spass mit der Lektüre! Fabian Meyer EMAIL: fmeyer@datacomm.ch Homepage: http://home.datacomm.ch/fmeyer/c64/ ********* COMMODORE 64 Bedienungshandbuch _____ / ___|___ | / |__/ | \___|__\ \_____| C o m m o d o r e INHALTSVERZEICHNIS Kapitel Seite Einleitung VII 1 Anschluß und Inbetriebnahme 1 2 Jetzt geht es endlich los 13 Die Tastatur 14 Laden und Speichern von Programmen 18 Der PRINT-Befehl und das Rechnen mit dem COMMODORE 64 22 3 Grundlagen des Programmierens in BASIC 31 GOTO 32 Tips zum Edieren eines Programms 34 Variable 35 IF ... THEN 38 FOR ... NEXT Schleifen 39 4 Weitere BASIC-Befehle 41 Einleitung 42 Bewegung auf dem Bildschirm 43 INPUT 45 GET 47 Die Random-Funktion 48 Zahlenratespiel 51 Würfeln 52 Zufallsgrafiken: Die CHR$- und die ASC-Funktion 53 5 Fortgeschrittene Grafik- und Farbprogrammierung 55 Farbe und Grafik 56 Farbgebung mit PRINT-Befehlen 56 Farb-CHR$-Codes 58 PEEK und POKE 60 Der Bildschirmspeicher 63 Weitere Ballspiele 65 6 Sprite-Grafik 67 Was sind SPRITES 68 Die Konstruktion von Sprites 69 Binärarithmetik 77 7 Musik mit dem COMMODORE 64 81 Die Struktur eines Musikprogramms 82 Beispielprogramm 84 Wichtige Klangeinstellungen 86 Klangeffekte 90 8 Fortgeschrittenes Programmieren 93 READ und DATA 94 Mittelwerte 96 Indizierte Variable; Eindimensionale Felder 98 Dimensionierung 100 Würfelspiel 101 Zweidimensionale Felder 102 Anhang Seite A: COMMODORE 64 Zubehör und Software 107 B: Fortgeschrittene Kassettenoperation 109 C: COMMODORE 64 BASIC 111 D: Abkürzungen der BASIC-Schlüsselwörter 130 E: Bildschirm Codes 132 F: ASCII- und CHR$Codes 135 G: Adreßbereiche von Bildschirm- und Farbspeicher 138 H: Abgeleitete mathematische Funktionen 140 I: Steckerbelegung der Ein- und Ausgabeanschlüsse 141 J: Programme, die Sie ausprobieren sollten 144 K: Übertragung von fremden BASIC-Programmen auf COMMODORE 64 BASIC 148 L: Fehlermeldungen 150 M: Bibliographie 152 N: Sprite Register Zuordnung (VIC) 153 O: COMMODORE 64 Klang Kontrollen (SID) 155 P: Werte für Musik Noten 158 Q: Speicherbelegung des COMMODORE 64 160 R: Bildschirm-Steuerzeichen 166 S: Hochauflösende Grafik auf COMMODORE 64 167 T: PRINT FRE(0) 168 U: Belegung der Funktionstasten 169 V: Laden eines C-64 Programmes in ein CBM-Gerät (3, 4, 8000er) 169 W: Abfrage der Drehregler und Steuerknüppel 170 Stichwortverzeichnis 171 X: COMMODORE 64 BASIC Kurzbeschreibung 176 *VII* EINLEITUNG: Wir möchten Sie hiermit beglückwünschen, daß Sie nun Besitzer eines COMMODORE 64 sind, einem der besten Mikrocomputer der Welt. Commodore ist bekannt als die Firma, die "Freundliche Computer" herstellt; die von Commodore herausgegebenen Handbücher zeichnen sich dadurch aus, daß sie leicht zu lesen, leicht zu verstehen und demzufolge leicht anzuwenden sind. Das COMMODORE 64 HANDBUCH vermittelt alle Informationen, um Ihre Anlage sachgemäß aufzubauen und mit dem Computer vertraut zu werden. Weiterhin lernen Sie auf einfache, abwechslungsreiche Weise, eigene Programme zu schreiben. Für alle Besitzer eines COMMODORE 64, die sich nicht gleich ins Programmieren stürzen wollen, haben wir diejenigen Informationen gleich zu Anfang zusammengefaßt, die Sie brauchen, um fertige Programme zu benutzen. Wenn Sie wollen können Sie also gleich anfangen; Sie brauchen nicht vorher das ganze Buch durchzulesen. Nun wollen wir kurz beschreiben, was Ihr COMMODORE 64 alles kann. Wenn es um Grafik geht - Sie besitzen einen der höchstentwickelten Mikrocomputer der Welt. Die Konstrukteure des COMMODORE 64 haben die Methode der SPRITES erfunden, mit der Sie dreifarbige Figuren erstellen können, wie Sie sie aus professionellen Videospielen kennen. Nicht nur, daß Sie bis zu 8 verschiedene SPRITES erstellen können, Sie können die selbst entworfenen Figuren auf einfache Weise auf dem Bildschirm bewegen und können ein SPRITE vor dem anderen vorbeiziehen lassen. Sie können Ihren COMMODORE 64 auch damit beauftragen, das Zusammenstoßen zweier SPRITES zu registrieren, um (z.B. im Rahmen eines Bildschirmspiels) bestimmte vorprogrammierte Aktionen damit zu verknüpfen. So können Sie z.B. beim Zusammenstoß zweier "Raumschiffe" eine Explosion auslösen. Weiterhin hat der COMMODORE 64 eingebaute Musik- und Toneffekte, die aus ihm einen vollwertigen Synthesizer machen. Dieser Teil Ihres Computers bietet Ihnen nämlich 3 voneinander unabhängige "Stimmen", von denen jede volle 8 Oktaven Umfang hat. Außerdem stehen Ihnen 4 verschiedene Wellenformen (Rechteck, Sägezahn, Dreieck, Rauschen), ein programmierbarer Hüllkurven-Generator, programmierbare Hoch-, Tief- und Bandpaßfilter, sowie Lautstärke- und "Resonanz"-Regler zur Verfügung. Wenn Sie Ihre Musik in professioneller Qualität wiedergeben wollen, so können Sie Ihren COMMODORE 64 an jede Hi-Fi- Anlage anschließen. Wenn wir schon beim Anschließen des COMMODORE 64 an andere Geräte sind... Ihr Computer kann durch Hinzufügen von Peripheriegeräten zum System erweitert werden. Sie können einen Kassettenrekorder oder bis zu 5 Diskettenlaufwerke vom Typ VC 1541 anschließen, um Programme zu speichern oder in den Computer zu laden (wenn Sie schon ein Laufwerk vom Typ VC 1540 besitzen, so können Sie es durch Ihren Händler "modernisieren" lassen). Sie können mit dem VC-Drucker Ihre Programme, Briefe usw. ausdrucken und - wenn sie an CP/M-Software interessiert sind - der COMMODORE 64 kann mit einer CP/M-Karte ausgerüstet werden, die einen Z 80-Mikroprozessor enthält. Ebenso wichtig wie die zur Verfügung stehenden Geräte, die sogenannte Hardware, ist dieses Handbuch, das zum Verständnis Ihres Computers beitragen soll. Es enthält nicht alles, was man über Computer und über das Programmieren wissen sollte, aber es wird Sie in die Lage versetzen, an Hand weiterführender Literatur tiefer in die Materie einzudringen. Commodore möchte, das Sie Spaß an Ihrem COMMODORE 64 haben und wir haben auch versucht alles zu tun, um Ihnen dabei zu helfen. Aber denken Sie daran: Programmieren ist keine Fähigkeit, die man an einem Tag erlernt; fassen Sie sich in Geduld und gehen Sie Ihr Handbuch Punkt für Punkt sorgfältig durch. Noch eins - nehmen Sie sich ein paar Minuten Zeit, füllen Sie die Garantiekarte aus und schicken Sie sie ab, damit Ihr Gerät ordnungsgemäß registriert werden kann. Und nun: Viel Spaß mit Ihrem COMMODORE 64. Ein Hinweis: Während dieses Handbuch produziert wird, werden weltweit Programme für den COMMODORE 64 entwickelt. Fragen Sie ab und zu mal bei Ihrem Händler nach, was es Neues gibt. *1* KAPITEL 1 ANSCHLUSS UND INBETRIEBNAHME *2* DER ANSCHLUSS DES COMMODORE 64 Im folgenden wird beschrieben, wie Sie den COMMODORE 64 an ein Fernsehgerät, einen Verstärker oder einen Monitor anschließen können. Überprüfen Sie zuerst den Inhalt der Verpackung, in der der COMMODORE 64 geliefert wurde. Außer dieser Betriebsanleitung sollte die Packung folgendes enthalten: 1. COMMODORE 64 2. Netzgerät (Kästchen mit Netz- und Gerätekabel) 3. Antennenkabel Vermissen Sie einen der aufgeführten Gegenstände, so fordern Sie bei Ihrem COMMODORE-Fachhändler Ersatz an. Wir wollen uns nun als erstes anschauen, wo die verschiedenen Anschlüsse des Rechners sind und welche Funktion sie haben. ANSCHLÜSSE AN DER RECHTEN SEITE DES GEHÄUSES 1. Spannungsversorgung. Hier wird der Gerätestecker des Kabels angeschlossen, das den Rechner mit dem Netzgerät verbindet. 2. Ein/Aus-Schalter 3. Steuereingänge für Spiele. An jeden der beiden Eingänge kann ein Joystick, ein Paddle oder ein Lichtgriffel angeschlossen werden. ANSCHLÜSSE AUF DER RÜCKSEITE DES GEHÄUSES 4. MODUL-STECKPLATZ. Rechteckige Aussparung zum Einstecken der Programm- oder Spielmodule. 5. TV-Anschluß. Anschlußmöglichkeit an ein Fernsehgerät über den Antennenanschluß (75 Ohm). Das Signal enthält sowohl die Bild- wie auch die Toninformation. 6. Audio & Video-Ausgang. Hier kann das isolierte Tonsignal abgenommen und einer Hl-Fl-Anlage zugeführt werden. Außerdem steht ein Videosignal zur Verfügung, mit dem ein Monitor angesteuert werden kann. *3* /####\--------^--\ /#### | /#### | ____/#### | / | | ---- ---- __ /-\ | | \--/ \--/ == \_/ | \________________\___/______/____|__/ \/ / | 3 2 1 ___/###\__/##_##_##_##_##_##_##_##_##_##_##_##_##_##_##_##\__ |-------------------------------------------------------------| | | | | | | | +--------------+ /-\ /-\ +------+ +----------+ | | |==============| [=] O \_/ \_/ |======| |==========| | +-----/------------------/-----\-----\--------\---------\-----+ / / \ \ \ \ 4 5 6 7 8 9 7. Serieller Ausgang. Zum Anschluß eines Druckers oder eines Disketten-Einzellaufwerks. 8. Recorder-Anschluß. Anschlußmöglichkeit für die Datasette zur Speicherung von Programmen oder Daten. 9. User Port. Frei programmierbarer Ein/Ausgang und Anschlußmöglichkeit für Steckmodule wie z. B.: RS-232- Schnittstelle. *4* ANSCHLUSS UND INBETRIEBNAHME DER ANSCHLUSS AN DAS FERNSEHGERÄT Das Schema für den Anschluß an das Fernsehgerät können Sie der Abbildung unten entnehmen. 1. Verwendung des UHF-Antenneneingangs Verbinden Sie mit Hilfe des beiliegenden Fernsehkabels den TV- Anschluß (Nr. 5) auf der Rückseite des COMMODORE 64 mit dem UHF-Antenneneingang Ihres Fernsehgerätes. Antenne vorher entfernen. Stellen Sie Ihr Gerät auf Kanal 36 ein. +--+-----------------+--+ UHF | | /-------------\#| | /-----------------------#= | | | |#| | | | | | |#| | | | | | | | | | | | | | | | | | | \-------------/ | | # +==+=================+==+ | 5 /------------------------\ | |=---\ | #################### ## | | | #################### ## | | | ################## ## | | | ############## ## | | \________________________/ | | | | +---+ | \ Netzgerät +-----+ | | Netzstecker ]---/ *5* 2. Video-Ausgang Das beste Bild erzielen Sie über einen Farb-Monitor. Verwenden Sie hierzu ein Videokabel, das an der einen Seite einen 5-poligen Diodenstecker (DIN 41524) für die Buchse 6 Ihres COMMODORE 64 hat, auf der anderen Seite einen Videostecker (DIN 45322) für Ihren Monitor. Falls Ihr Fernseher eine Video-Buchse hat, können Sie ihn ebenfalls als Monitor verwenden, Sie müssen nur dafür sorgen, daß der Video-Anschluß Ihres Fernsehers als Eingang geschaltet wird. Dies geschieht bei Verwendung eines Video-Recorders in der Regel durch eine Hilfsspannung von 12 V, die an Pin 1 der Video-Buchse des Fernsehers gelegt wird. Ihr COMMODORE 64 gibt eine solche Hilfsspannung nicht ab. Lassen Sie sich daher von Ihrem Fernseh-Fachmann eine geeignete Umschaltung einbauen. Bei manchen Fernsehern genügt dazu schon eine Drahtbrücke im Video-Stecker, da bei manchen Fernsehern an Pin 5 der Video-Buchse die benötigte Hilfsspannung von 12 V bereitgestellt wird. Benutzen Sie daher diesen Eingang mit äußerster Vorsicht! Die Hilfsspannung darf auf keinen Fall an die Ausgänge Ihres COMMODORE 64 gelangen. Der Rechner würde dadurch sofort zerstört. Lassen Sie die Verbindung nur durch einen Fachmann herstellen! +--+-----------------+--+ Video-Eingang | | /-------------\#| | /-----------------------#= | | | |#| | | | | | |#| | | | | | | | | | | | | | | | | | | \-------------/ | | # +==+=================+==+ | 6 /------------------------\ | |=---\ | #################### ## | | | #################### ## | | | ################## ## | | | ############## ## | | \________________________/ | | | | +---+ | \ Netzgerät +-----+ | | Netzstecker ]---/ *6* Zum Empfang normaler Fernseh-Sendungen müssen Sie das Video- Kabel in der Regel entfernen. 3. Netzanschluß Verbinden Sie Ihr Netzgerät mit dem Commodore 64 (Buchse 1) und mit einem 220 V / 50 Hz-Netzanschluß. 4. Weitere Anschlüsse Da der COMMODORE 64 das Tonsignal in Hi-Fi-Qualität liefert, bietet es sich an, dieses Signal durch einen hochwertigen Verstärker zu verarbeiten. Das Tonsignal wird ebenfalls an Buchse 6 abgenommen (Belegung) der Steckerkontakte siehe Anhang I). __###__################################__ / \ | Audio/Video | | Ausgang | |-----------------_---_-------------------| | ========= = o | | | | ===== ========= | +-----------------------------------------+ ^ | /-\ | | | | # | | | | ____________ | / \ / \ +----++------------++----+ <-#-/ \-#-> +------------+---+ | || ### ====== || | | /--------\ | O | | || === OoooO || | || || = | | ||------------|| | || || o | | || | | | || | | \________/ | | | || | | | || | +------------+---+ +----++============++----+ *7* Wie Sie vielleicht wissen, können Sie als Peripherie z. B. noch das Diskettenlaufwerk ("Floppy Disk") VC 1541 oder den Drucker VC 1525 anschließen. Ein solches komplettes System kann etwa wie folgt aussehen. [Bild einer C64-Anlage mit C64, VC 1541, VC 1525, Datasette, Joystick und einem Paddle] *8* INBETRIEBNAHME 1. Schalten Sie den Rechner mit Hilfe des Kippschalters auf der rechten Seite ein. 2. Nach einigen Sekunden muß der Bildschirm folgendes zeigen. **** COMMODORE 64 BASIC V2 **** 64K RAM SYSTEM 38911 BASIC BYTES FREE READY. _ <-- Der blinkende Cursor zeigt, daß der COMMODORE 64 auf Ihre Eingabe wartet. 3. Wenn die Senderfeineinstellung Ihres Fernsehgeräts von Hand erfolgt, so müssen Sie selbst eine Einstellung suchen, die ein optimal scharfes Bild ergibt. Wenn Ihr Gerät eine Automatik besitzt, nimmt es Ihnen diese Arbeit ab. 4. Die Einstellung der Farben und der Helligkeit des Bildschirms ist im nächsten Abschnitt beschrieben. Ein erster Anhaltspunkt für die richtige Einstellung Ihres Fernsehgerätes besteht darin, daß Sie einen dunkelblauen Bildschirmhintergrund mit hellblauem Rand und hellblauen Zeichen erhalten sollten. Wenn sich ihr COMMODORE 64 nicht wie beschrieben auf dem Bildschirm Ihres Fernsehgerätes oder Monitors meldet, überprüfen Sie Ihren Aufbau noch einmal anhand der folgenden Liste. *9* FEHLERSUCHE ---------------------------------------------------------------------- SYMPTOM URSACHE MASSNAHME ---------------------------------------------------------------------- Rote Indikatorlampe am Computer nicht Schalter auf der Computer brennt nicht eingeschaltet rechten Seite des Computers muß in der Stellung "ON" sein Keine Verbindung zum Überprüfen Sie Netz Netzstecker, Gerätestecker und gegebenenfalls auch die Steckdose Sicherung defekt Bitten Sie Ihren Fachhändler die Sicherung auszutauschen ---------------------------------------------------------------------- Keine Falscher Kanal am Überprüfen Sie den Bildschirmanzeige Fernsehapparat Kanalwählschalter am gewählt Fernsehapparat Antennen - bzw. Betreffendes Kabel Videokabel nicht überprüfen eingesteckt oder defekt ---------------------------------------------------------------------- Zeichenwirrwarr auf Modul nicht korrekt Gerät ausschalten und dem Bildschirm bei eingesteckt Sitz des Moduls im eingestecktem Modul Steckplatz überprüfen ---------------------------------------------------------------------- Schlechte Farben Fernsehgerät nicht Farb- und korrekt eingestellt Kanaleinstellung am Fernsehgerät überprüfen ---------------------------------------------------------------------- Starkes Rauschen Lautstärke am Fernseh- gerät zu hoch eingestellt ---------------------------------------------------------------------- Bild o. k., aber kein Lautstärke am Ton Fernsehgerät zu niedrig eingestellt Audioausgang nicht Verbinden Sie den mit dem Eingang des Audioausgang des Verstärkers verbunden Computers mit dem AUX- Eingang Ihres Verstärkers und stellen Sie den Input- Wählknopf auf AUX ---------------------------------------------------------------------- *10* DER "CURSOR" Das helle blinkende Quadrat unter der READY-Meldung wird als CURSOR bezeichnet. Es zeigt die Position an, in der ein von der Tastatur eingegebener Buchstabe auf dem Bildschirm erscheint. Geben Sie einen Text ein und beobachten Sie, wie der Cursor sich über den Bildschirm bewegt und jeweils durch die von Ihnen eingegebenen Zeichen ersetzt wird. EINSTELLUNG DER BILDSCHIRMFARBEN Die Einstellung der Farben geschieht anhand eines Musters, das sich mit einfachen Mitteln auf dem Bildschirm Ihres Fernsehgerätes oder Monitors erzeugen läßt. Sie benutzen dazu die -Taste auf der linken Seite der Tastatur; der Name ist abgeleitet von ConTRoL - kontrollieren. Die -Taste wird stets zusammen mit einer anderen Taste angewendet, wobei stets beide Tasten zugleich gedrückt werden müssen. Sie schalten hierbei den Computer in einen bestimmten Modus um, in dem er in der Regel bleibt, bis Sie ihn wieder umschalten. Drücken Sie nun die -Taste zusammen mit der <9>-Taste. Sie werden nach dem Loslassen zuerst keine Wirkung feststellen. Wenn Sie jetzt jedoch ein Zeichen eintippen, so werden Sie feststellen, daß es auf dem Bildschirm in Revers-Darstellung erscheint, d. h. Bildschirm- und Zeichenfarbe sind vertauscht. Drücken Sie nun auf die -Taste. Wenn Sie alles richtig gemacht haben, so erscheint ein heller Balken auf dem Bildschirm, der solange wächst, wie Sie die -Taste niedergedrückt lassen. *11* [Bild einer C64-Tastatur] Wenn Sie die -Taste zusammen mit einer anderen Ziffern-Taste drücken, schalten Sie die Zeichenfarbe um. Schalten Sie nun mit Hilfe der <8>-Taste die Zeichenfarbe gelb ein. Drücken Sie nun wieder auf die -Taste! Was passiert? Sie können einen beliebig langen Balken von gelber Farbe erzeugen. Erzeugen Sie auf diese Weise ein Farbmuster auf dem Bildschirm und regeln Sie die Farb- und Helligkeitskontrollen Ihres Fernsehgerätes oder Monitors so ein, daß Sie möglichst kräftige reine Farben erhalten, die mit den Bezeichnungen auf den Farbtasten Ihres COMMODORE 64 übereinstimmen. **** COMMODORE 64 BASIC V2 **** 64K RAM SYSTEM 38911 BASIC BYTES FREE READY. ___________________________ ________________ *12* Ihr Bildschirm sollte etwa wie folgt aussehen: **** COMMODORE 64 BASIC V2 **** 64K RAM SYSTEM 38911 BASIC BYTES FREE READY. _________________________ <------ <3> Roter Balken _______ ____________ ____ <------ <6> Grüner Balken __________ ______________ <------ <7> Blauer Balken ____________ <------ <8> Gelber Balken Ihr System ist nun korrekt eingestellt. Die folgenden Kapitel geben Ihnen nun eine Einführung in die Programmiersprache BASIC. Sie können aber auch fertige Programme verwenden, für deren Betrieb Sie keine Programmierkenntnisse benötigen. Diesen Programmpaketen sind ausführliche Anleitungen beigefügt, die Ihnen die Anwendung erleichtern; es empfiehlt sich jedoch, die ersten Kapitel dieses Handbuches durchzuarbeiten, um mit den grundlegenden Eigenschaften Ihres neuen Systems vertraut zu werden. *13* KAPITEL 2 JETZT GEHT ES ENDLICH LOS ·Die Tastatur ·Laden und Speichern von Programmen ·Der Befehl PRINT ·Rechenoperationen *14* DIE TASTATUR Nehmen Sie sich nun ein paar Minuten Zeit, um mit der Tastatur vertraut zu werden, da sie das wichtigste Instrument zur Eingabe von Informationen in den COMMODORE 64 darstellt. Im großen und ganzen stimmt die Tastatur mit der einer Schreibmaschine überein. Es gibt jedoch einige zusätzliche Tastenfunktionen, die im folgenden kurz beschrieben werden. Eine genaue Beschreibung folgt in den späteren Kapiteln. [Bild eines C64] Die -Taste veranlaßt den Computer, die von Ihnen eingetippte und auf dem Bildschirm sichtbare Information in seinen Speicher einzulesen. Die -Taste entspricht in etwa der Groß/Kleinschrift- Umschalttaste bei der Schreibmaschine. Im "Groß/Kleinschrift-Modus", der weiter unten erklärt wird, erreicht man mit der -Taste die Großbuchstaben; im "Gro8schrift/Grafik-Modus" erhält man die Grafik-Symbole auf der rechten Seite der Tasten. Bei mehrfach belegten Funktionstasten (z. B. ), wird die oben auf der Taste stehende Funktion angesprochen (im angegebenen Fall die Funktion CLR). *15* Edieren Jeder macht mal einen Fehler, und der COMMODORE 64 berücksichtigt das. Er hat eine Reihe von Tastenfunktionen die Ihnen das Korrigieren sehr erleichtern. Sie erinnern sich noch, wir haben das blinkende Rechteck, das angibt, wo wir uns gerade auf dem Bildschirm befinden, CURSOR genannt. Die -Tasten (abgeleitet von CuRSoR) geben uns die Möglichkeit, den Cursor in jede gewünschte Bildschirmposition zu bringen. Mit der linken der beiden -Tasten, der <|CRSR|>-Taste läßt sich der Cursor nach unten und (zusammen mit der -Taste) nach oben bewegen. Die rechte Cursor-Steuertaste, die <=CRSR=>-Taste erlaubt Bewegungen des Cursors nach rechts und (mit ) nach links. Die -Tasten sind mit der sogenannten "Repeat"-Funktion versehen, d. h., der Cursor bewegt sich solange, wie Sie die Taste gedrückt halten. (Die Bezeichnungen sind abgeleitet von DELete = löschen und INSerT = einfügen) Drücken Sie beim Schreiben eines Wortes die -Taste, so wird das zuletzt geschriebene Zeichen gelöscht. Löschen Sie ein Zeichen aus einer bereits bestehenden Zeile heraus, so wird das vor dem Cursor stehende Zeichen gelöscht, und der rechts vom Cursor befindliche Teil der Zeile um eine Position nach links verschoben. Die -Taste zusammen mit der -Taste erlaubt das Ein- fügen von Zeichen in bereits geschriebene Zeilen. Bewegen Sie den Cursor mit Hilfe der -Tasten an die Stelle, an der ein Zeichen fehlt. Drücken Sie nun und ; das Zeichen auf dem sich der Cursor befindet und damit der gesamte rechts vom Cursor stehende Zeilenabschnitt werden um eine Position nach rechts verschoben. Jetzt brauchen Sie nur noch das fehlende Zeichen einzutippen. Durch Drücken der -Taste bringen Sie den Cursor in die sog. "HOME-POSITION", das ist die linke obere Ecke des Bildschirms. Die -Taste zusammen mit der -Taste löscht den Bildschirm und bringt den Cursor in die Home-Position. *16* (Abgeleitet von RESTORE = wiederherstellen) Drücken Sie die -Taste zusammen mit der -Taste, so können Sie Ihren Computer in den "Ausgangszustand" zurückbringen. Was damit gemeint ist, wird später näher erläutert. Die Funktionstasten Die Funktionstasten auf der rechten Seite der Tastatur können im Rahmen eines Programms frei mit Bedeutungen belegt werden. Dabei benutzt man die Tatsache, daß den 4 Funktionstasten die ASCII-Codes 133-136 (mit der -Taste zusammen die ASCII-Codes 137-140) entsprechen. (Siehe in diesem Zusammenhang S.135 ff.) [Nahaufnahme des C64 und seinen Funktionstasten] Die -Taste (abgeleitet von ConTRoL), dient etwa zum Einschalten verschiedener Farben, oder dem Ein- und Ausschalten des Revers- Modus. Die -Taste muß stets zusammen mit der entsprechenden Taste (z. B. der Farbtaste) gedrückt werden. *17* Die -Taste dient dazu, den Ablauf eines Basic-Programms zu unterbrechen. Der Computer erhält den Befehl, einen Vorgang zu STOPpen. Zusammen mit der -Taste wird ein Programm vom Band geladen (und gestartet). Die "COMMODORE"-Taste Die Taste mit dem COMMODORE-Symbol hat eine ganze Reihe von Funktionen. Als erstes können Sie mit ihrer Hilfe die linksstehenden Zeichen auf den Vorderseiten der Tasten erreichen (die rechtsstehenden mit der -Taste). Wenn Sie den Computer einschalten, so ist er automatisch im Großschrift/Grafik-Modus, d. h. Sie können in Großbuchstaben schreiben und alle Grafikzeichen benutzen. Drücken Sie gleichzeitig die -Taste und die -Taste, so wird eine andere Kombination von Zeichensätzen eingeschaltet, Sie kommen in den Groß/Kleinschrift-Modus. Die Bezeichnung ist eigentlich nicht ganz korrekt, da Sie auch in diesem Modus noch einige Grafikzeichen zur Verfügung haben; Sie können mit Hilfe der -Taste die links auf der Tastenvorderseite stehenden Grafikzeichen erreichen. Die Buchstabentasten sind jetzt mit Kleinbuchstaben belegt, die Großbuchstaben erreichen Sie mit Hilfe der -Taste. Eine weitere Funktion der -Taste besteht darin, daß Sie mit ihr (in Kombination mit den Zifferntasten) weitere 8 Zeichenfarben einschalten können. Die Zuordnung der Farben zu den Tasten ist im Kapitel 5 aufgelistet. WIE VERSETZE ICH DEN COMPUTER WIEDER IN DEN "NORMALZUSTAND"? Wenn Sie noch etwas auf dem Bildschirm haben, z. B. die Farbbalken, so drücken Sie die - und die -Taste, Sie erhalten einen "sauberen" Bildschirm mit dem Cursor in der linken oberen Ecke. Drücken Sie nun die -Taste zusammen mit der <7>-Taste; hiermit schalten Sie die "normale" hellblaue Zeichenfarbe wieder ein. Falls Sie sich noch im Revers-Modus befinden (den brauchen Sie ja zur Herstellung der Farbbalken), so müssen Sie diesen noch durch <0> ausschalten. *18* Wir benutzen im folgenden die Abkürzung für: Die Tasten und werden gleichzeitig gedrückt). -------------------------------------------------------------------- TIP: Sie haben sich bei der Einstellung der "Normalwerte" viel Arbeit gemacht. Es gibt einen wesentlich einfacheren Weg. Drücken Sie nur die Kombination: Dieser Befehl setzt viele wichtige Register wieder auf Ihre Anfangswerte zurück, läßt jedoch ein Programm, das sich im Speicher befindet, unberührt. Wenn Sie den Computer wieder in den Zustand versetzen wollen, in dem er direkt nach dem Einschalten war, so müssen Sie die Zeile SYS 64738 eintippen und die -Taste drücken. Gehen Sie jedoch vorsichtig mit diesem Befehl um; das Programm und alle sonstigen Speicherinhalte werden gelöscht. -------------------------------------------------------------------- LADEN UND ABSPEICHERN VON PROGRAMMEN Eine der wichtigsten Eigenschaften Ihres COMMODORE 64 besteht darin, daß Sie Programme auf Band oder Diskette abspeichern können um sie bei späterem Bedarf wieder in den Speicher des Computers einzulesen. Stellen Sie sicher, daß die Datasette bzw. das Diskettenlaufwerk korrekt an den Computer angeschlossen sind. Das Laden von gekauften Programmen 1. MODULE: Es gibt eine ganze Reihe von Spielen und anderen Programmen auf sogenannten Steckmodulen. Wenn Sie diese Module in die vorgesehene Position einstecken, vergessen Sie nicht: VOR DEM EINSTECKEN DER MODULE STETS COMPUTER AUSSCHALTEN!!! Wenn Sie diesen Ratschlag nicht befolgen, können Ihre Module beschädigt werden. Schalten Sie nun Ihren COMMODORE 64 ein und starten Sie das Programm mit dem in der Anleitung angegebenen Befehl oder der jeweiligen Starttaste. 2. KASSETTEN: Legen Sie die Kassette in die Datasette (den zugehörigen Kassettenrecorder) ein und spulen Sie gegebenenfalls *19* bis zum Anfang zurück. Tippen Sie dann in den Computer LOAD (-Taste nicht vergessen!) ein; er wird Ihnen mit der Anweisung antworten PRESS PLAY ON TAPE. Folgen Sie nun dieser Anweisung und drücken die mit PLAY bezeichnete Taste an der Datasette. Die Schrift auf dem Bildschirm und auch der Cursor verschwinden nun, das Band beginnt zu laufen und schließlich meldet sich der Computer wieder mit: FOUND (PROGRAMMNAME). Auf Drücken der -Taste hin wird das Programm in den Speicher des COMMODORE 64 geladen. Sie können den Ladevorgang jedoch jederzeit durch Drücken der -Taste unterbrechen. 3. DISKETTE: Öffnen Sie das Laufwerk, orientieren Sie die Diskette so, daß das Etikett nach oben und zu Ihnen hin weist und schieben Sie sie dann vorsichtig in den Schlitz. Achten Sie auf die kleine Einkerbung an der Seite der Diskette; wenn Sie alles richtig gemacht haben, muß sich diese Einkerbung (die auch mit einem Stück Klebeband zugeklebt sein kann), auf der linken Seite befinden. Wenn sich die Diskette im Laufwerk befindet, schließen Sie vorsichtig die Klappe und tippen in den Computer ein LOAD"PROGRAMMNAME",8 und drücken . Sie werden hören, daß das Laufwerk arbeitet und auf dem Bildschirm erscheint: SEARCHING FOR PROGRAMMNAME LOADING READY. _ Wenn READY und der Cursor auf dem Bildschirm erschienen sind, können Sie durch Eintippen von RUN und Drücken der -Taste das Programm starten. Das Laden von Programmen von Band Wenn Sie ein Programm von Band laden wollen, das Sie vorher unter dem Namen PROGRAMMNAME abgespeichert haben, so spulen Sie das Band zurück und tippen ein: *20* LOAD "PROGRAMMNAME" Wenn Sie sich nicht mehr an den Namen des Programms erinnern können, so tippen Sie nur LOAD ein und drücken die -Taste. In diesem Fall wird einfach das erste Programm auf dem Band geladen. Der Computer meldet sich dann mit: PRESS PLAY ON TAPE Wenn Sie nun dieser Aufforderung folgen und die PLAY-Taste der Datasette drücken, so verschwinden Schrift und Cursor vom Bildschirm und der Computer sucht das von Ihnen gewählte Programm. Wenn er es auf dem Band gefunden hat, meldet er sich mit: FOUND PROGRAMMNAME Um das Programm in den Rechnerspeicher zu laden, müssen Sie jetzt die -Taste drücken. Wenn der Ladevorgang beendet ist, erscheinen dann die READY-Meldung und der Cursor wieder auf dem Bildschirm. Das Laden von Programmen von Diskette Wenn Sie Programme von der Diskette laden wollen, müssen Sie ähnlich wie bei der Kassette vorgehen. Tippen Sie ein: LOAD "PROGRAMMNAME",8 Nach dem Drücken der -Taste erhalten Sie folgenden Kommentar auf dem Bildschirm: *21* SEARCHING FOR PROGRAMMNAME LOADING READY. _ Bem.: Wenn Sie ein Programm in den Speicher des Computers laden, so wird die gesamte Information, die vorher darin enthalten war, gelöscht. Überprüfen Sie daher, ob Sie das Programm, an dem Sie gearbeitet haben, abgespeichert haben, bevor Sie das neue laden. DAS SPEICHERN VON PROGRAMMEN AUF BAND Wenn Sie ein Programm geschrieben haben und Sie wollen es auf Kassette abspeichern, so tippen Sie ein (wobei PROGRAMMNAME für einen von Ihnen frei wählbaren Programmnamen steht): SAVE "PROGRAMMNAME" Der Programmname kann bis zu 16 Zeichen lang sein. Nach dem Drücken der -Taste meldet sich der Computer mit: PRESS PLAY AND RECORD ON TAPE Drücken Sie daraufhin gleichzeitig die PLAY- und die RECORD-Taste an Ihrem Kassettenrecorder. Die Schrift und der Cursor verschwinden vom Bildschirm bis das Programm vollständig abgespeichert ist, worauf der Computer wieder "ansprechbar" ist. Das Abspeichern von Programmen auf Diskette Fast noch einfacher ist das Speichern von Programmen auf Disketten. Tippen Sie ein: *22* SAVE "PROGRAMMNAME",8 Die "8" ist die Gerätenummer des Diskettenlaufwerks und informiert den Computer darüber, daß Sie Ihr Programm auf Diskette abspeichern wollen. Nach dem Drücken der -Taste meldet sich der COMMODORE 64 wieder mit: SAVING PROGRAMMNAME READY. _ DER PRINT-BEFEHL UND DAS RECHNEN MIT DEM COMMODORE 64 Da Sie nun wissen, wie man ein Programm abspeichert, wollen wir darangehen eins zu schreiben. Tippen Sie folgendes ein und beachten Sie die Kommentare in der Abbildung. PRINT "COMMODORE 64" <--- Tippen Sie diese Zeile und drücken Sie COMMODORE 64 <--- Das schreibt der Computer READY. _ Wenn Sie beim Eintippen einen Fehler gemacht haben, so benutzen Sie die -Taste um das Zeichen, das links vom Cursor steht zu löschen. Sie können auf diese Weise beliebig große Abschnitte löschen. *23* Wir wollen uns nun einmal näher anschauen, was Sie eingetippt haben. Als erstes haben Sie einen Befehl formuliert, der den Computer anweist, den Text, der zwischen den Anführungszeichen steht, auf den Bildschirm zu schreiben. Der COMMODORE 64 erkennt den Befehl als solchen aber erst nach dem Drücken der -Taste, und er führt ihn dann auch erst aus, d. h. er schreibt COMMODORE 64 auf den Bildschirm. Wenn der Computer sich mit ?SYNTAX ERROR meldet, so haben Sie etwas falsch gemacht; vielleicht haben Sie sich vertippt, oder ein Anführungszeichen vergessen. Der Rechner ist sehr "pingelig" und erkennt die Befehle nur, wenn sie genau dem vorgegebenen Schema entsprechen. Aber haben Sie keine Angst vor dem Experimentieren; Sie können den Computer durch Eintippen falscher Befehle nicht beschädigen, und die beste Methode, BASIC zu lernen, besteht darin, alles auszuprobieren und zu beobachten was passiert. Der PRINT-Befehl ist einer der wichtigsten und nützlichsten Befehle. Sie können mit seiner Hilfe alles was Sie wollen auf den Bildschirm bringen; eingeschlossen die Grafikzeichen oder die Resultate von Rechnungen. Probieren Sie doch einmal das folgende Beispiel aus. Löschen Sie dazu zuerst mit Bildschirm und tippen dann folgendes ein (denken Sie daran, daß Sie eine "1" und kein "l" tippen). PRINT 12 + 12 <-- Geben Sie diese Zeile ein und drücken Sie 24 <----------- Hier gibt der Computer die Antwort READY. _ Was Sie hier ausgenutzt haben, ist die Tatsache, daß Sie den COMMODORE 64 als Rechenmaschine benutzen können. Sie müssen nur daran denken, daß Sie vor die von Ihnen gewünschte Rechnung einen PRINT-Befehl setzen. Sie können alle Rechenarten einsetzen, die auf Ihrem Computer verfügbar sind, so z. B. neben der Addition auch Subtraktion, Multiplikation, Division, das Rechnen mit Exponenten, Wurzeln, trigonometrischen Funktionen etc. Vergleichen Sie was passiert, wenn Sie 12+12 in Anführungszeichen setzen! *24* Addition: Die Addition wird mit Hilfe des (+)-Zeichens ausgeführt. In unserem Beispiel wurde die Rechnung 12 + 12 ausgeführt. Denken Sie daran, daß der Computer erst nach dem Drücken der -Taste Ihren Befehl ausführen kann. Subtraktion Zum Subtrahieren verwendet man das normale (-)-Zeichen. PRINT 12 - 9 <--- 3 Multiplikation Die Multiplikation wird durch das "Sternchen" (*) durchgeführt. PRINT 12 * 12 <--- 144 Division Zur Division benutzt man den Schrägstrich (/). PRINT 144/12 <--- 12 *25* Exponentiation In ähnlicher Weise wie die anderen Rechenoperatoren benutzen Sie das Zeichen (^), um eine Zahl in eine bestimmte Potenz zu erheben. PRINT 12 ^ 5 248832 Das ist die abgekürzte Schreibweise für: PRINT 12 * 12 * 12 * 12 * 12 248832 -------------------------------------------------------------------- TIP: Es gibt eine ganze Anzahl von Abkürzungen für BASIC-Befehle, die im Anhang D systematisch zusammengestellt sind. Eine wichtige Abkürzung ist das ? für den Befehl PRINT -------------------------------------------------------------------- Probieren Sie diese Abkürzung doch gleich einmal im nächsten Beispiel aus, in dem verschiedene Rechenoperationen im Zusammenhang mit einem PRINT-Befehl ausgeführt werden. ? 3 + 5 - 7 + 2 (Dieses ? ersetzt das Wort PRINT) 3 Bis jetzt haben wir nur kleine Zahlen und einfache Beispiele verwendet; aber der COMMODORE 64 kann wesentlich mehr. Nehmen Sie die nächste Aufgabe als Beispiel und addieren Sie eine Reihe großer *26* Dezimalbrüche. Vergessen Sie aber nicht, statt der manchmal gebräuchlichen Kommas Punkte zu verwenden. ? 123.45 + 345.78 + 7895.687 8364.917 Das sieht ja schon ganz gut aus, aber schauen Sie sich erst die nächste Aufgabe an: ? 12123123.45 + 345.78 + 7895.687 12131364.9 Wenn Sie sich die Zeit nehmen und das Beispiel von Hand durchrechnen, kommen Sie zu einem anderen Ergebnis. Woher kommt das? Die Rechengenauigkeit Ihres COMMODORE 64 ist zwar groß, aber dennoch begrenzt. Er rechnet mit zehn Stellen, von denen er jedoch nur neun anzeigt. In unserem Beispiel hat der Computer deshalb "gerundet", um in seinem Genauigkeitsbereich zu bleiben. Wie in der Mathematik üblich, rundet er von der 1 bis zur 4 ab, von der 5 bis zur 9 auf. Zahlen zwischen 0.01 und 999999999 werden im Standardformat ausgegeben. Zahlen, die außerhalb dieses Bereiches liegen, werden in der wissenschaftlichen Notation angezeigt. Die wissenschaftliche Notation ist eine Methode, sehr große bzw. sehr kleine Zahlen als Potenzen von 10 darzustellen. Tippen Sie folgendes Beispiel ein: ? 123000000000000000 1.23E+17 Wie Sie sehen kann die sehr große Zahl, die von Ihnen hinter den PRINT-Befehl geschrieben wurde, in knapper Form als 1.23*10^17 dargestellt werden. *27* Es gibt jedoch selbst in dieser Darstellung Grenzen, zwischen denen die Zahlen liegen müssen, wenn sie vom Computer verarbeitet werden sollen. Diese Grenzen sind: Größte Zahl: 1.70141183 E+38 Kleinste Zahl: 2.93873588 E-39 (was darunter liegt, wird als 0 behandelt) KOMBINATION VERSCHIEDENER RECHENOPERATIONEN Vielleicht haben Sie einige Beispiele eingegeben, die verschiedene Arten von Rechenoperationen enthielten und haben nicht das erwartete Ergebnis enthalten. Sie müssen deshalb die Systematik kennenlernen, nach der der Computer bei Auswerten von Rechenausdrücken vorgeht. Überlegen Sie sich einmal, welches Ergebnis die folgende Rechnung hat: 20 + 8 / 2 Je nach Vorgehensweise kommt man auf 14 oder 24. Ihr COMMODORE 64 bekommt 24 heraus. Der Grund dafür ist, daß er die Division vor der Addition durchführt. Hier ist eine Rangfolge der Rechenoperation; die weiter obenstehenden Operationen werden vor den weiter untenstehenden ausgeführt. 1. Rang - Das Minuszeichen als Vorzeichen einer Zahl 2. Rang ^ Die Exponentiation (Erheben in eine Potenz) 3. Rang * / Multiplikation und Division 4. Rang + - Addition und Subtraktion Überprüfen Sie das angegebene Ergebnis von 24 an Hand dieser Regeln. Sie können die Reihenfolge der Rechenoperationen dadurch beeinflussen, daß Sie Klammern setzen. Die Auswirkungen, die das Setzen von Klammern hat, können Sie am nächsten Beispiel studieren. Geben Sie an Ihrem Computer das folgende Rechenbeispiel ein: ? 35 / 5 + 2 9 *28* D. h. der Computer dividiert 35 durch 5 (= 7) und addiert zum Ergebnis 2 dazu (= 9). Setzen Sie nun die Summe 5 + 2 in Klammern: ? 35 / (5 + 2) 5 Nun hat der COMMODORE 64 als erstes die Rechenoperation in der Klammer ausgeführt (= 7) und 35 durch das Ergebnis dividiert (= 5). Im nächsten Beispiel berechnet der Computer als erstes die beiden Klammern und multipliziert die Ergebnisse. ? (12 + 9) * (6 + 1) 147 DER PRINT-BEFEHL MIT UND OHNE VERWENDUNG VON ANFÜHRUNGSZEICHEN Bis jetzt hat der Computer immer nur das Ergebnis einer Rechnung auf dem Bildschirm ausgegeben. Durch den Einsatz von Anführungszeichen können Sie erreichen, daß die Aufgabenstellung und das Ergebnis auf dem Bildschirm erscheinen. Denken Sie daran, das alles was in Anführungszeichen gesetzt wird, genauso auf dem Bildschirm wiedergegeben wird, während von einer Rechnung, die nicht in Anführungszeichen gesetzt wurde, nur das Ergebnis erscheint. Diese Eigenschaften des COMMODORE 64 werden im nächsten Beispiel ausgenutzt. Das Semikolon hinter dem zweiten Anführungszeichen bewirkt, daß das Ergebnis der Rechnung unmittelbar hinter die Rechnung geschrieben wird. *29* ? "5 * 9 = "; 5 * 9 (Semikolon bedeutet ohne Zwischenraum) 5 * 9 = 45 Was wir da eingetippt haben, sieht auf den ersten Blick ein bißchen umständlich aus, wird Ihnen aber nach kurzem Nachdenken einleuchten. Der erste Teil: "5 * 9 =" druckt die Aufgabenstellung auf dem Bildschirm aus und der Teil hinter dem Semikolon (;) bildet die eigentliche Rechenvorschrift, deren Ergebnis der Computer ausdruckt. Es ist nicht unwichtig, mit welchem Zeichen Sie die beiden Teile des PRINT-Befehls trennen. Probieren Sie doch einmal aus, was passiert, wenn Sie ein Komma an die Stelle des Semikolons setzen... Während bei Benutzung des Semikolons das Ergebnis direkt hinter der Aufgabenstellung ausgedruckt wird, entsteht bei Setzen eines Kommas ein Zwischenraum. Um genauer zu untersuchen, was das Komma verursacht, tippen Sie bitte folgendes Beispiel ein: ? 2,3,4,5,6 <--- 2 3 4 5 6 Ihr Commodore 64 verteilt also offensichtlich jeweils vier Zeichen gleichmäßig über eine Zeile. Überzählige Zeichen "schiebt" er in die nächste Zeile. Der Grund liegt darin, daß der Bildschirm des COMMODORE 64 so organisiert ist, daß jede Zeile aus 4 Abschnitten à 10 Zeichen besteht. Das Komma entspricht einem Tabulator, der jeweils an den Anfang des nächsten Abschnittes springt, auch wenn dieser sich in der nächsten Zeile befindet. Es ist wichtig, sich den Unterschied zwischen Komma und Semikolon zu merken, da er bei der Ausgabe von Ergebnissen auf dem Bildschirm nützlich angewendet werden kann. *30* *31* KAPITEL 3 GRUNDLAGEN DES PROGRAMMIERENS IN BASIC · GOTO · Tips zum Edieren · IF ... THEN · FOR ... NEXT Schleifen *32* DIE NÄCHSTEN SCHRITTE Bis jetzt haben wir uns damit begnügt, einfache Operationen auszuführen, indem wir einzelne Befehlszeilen in den Rechner eingegeben haben. Nach dem Drücken der -Taste wurden die in dieser Zeile enthaltenen Befehle dann vom Computer ausgeführt. Diese Art mit dem COMMODORE 64 zu rechnen nennt man den DIREKT-Modus. Aber unser Computer kann mehr! Er kann eine große Zahl von Befehlszeilen nacheinander ausführen; d. h., er kann ein PROGRAMM abarbeiten. Um Ihnen zu zeigen, wie einfach es ist, ein Programm für Ihren COMMODORE 64 zu schreiben, hier ein Beispiel: Löschen Sie erst den Bildschirm mit . Tippen Sie dann NEW ein und drücken die -Taste; damit wird der Programmspeicher Ihres Computers von allem geleert, was Sie im Verlauf Ihrer Experimente eventuell hineingeschrieben haben. Tippen Sie nun genau den folgenden Text ab, und vergessen Sie nicht, nach Eingabe jeder Zeile zu drücken. 10 ?"COMMODORE 64" 20 GOTO 10 Tippen Sie nun RUN ein und drücken die -Taste. Was passiert? Der Bildschirm wird lebendig. Wenn Sie genug haben, unterbrechen Sie das Programm durch Drücken der -Taste. Wir haben in diesem kurzen Beispiel schon einige Dinge benutzt, die für das Programmieren von allgemeiner Wichtigkeit sind. Beachten Sie, daß wir vor jeden Befehl eine Zeilennummer geschrieben haben. Diese Zahlen geben dem Computer an, in welcher Reihenfolge er Ihre Befehle abarbeiten soll. Soll während des Programmablaufs zu einem bestimmten Punkt zurückgesprungen werden (das macht im vorliegenden Beispiel der Befehl GOTO 10), so dienen die Zeilennummern als Markierungspunkte, auf die man sich bezieht. Als Zeilennummern können alle ganzen Zahlen zwischen 0 und 63999 gewählt werden. 10 PRINT"COMMODORE 64" | | | +---- Befehl +--------- Zeilennummer *33* COMMODORE 64 COMMODORE 64 COMMODORE 64 COMMODORE 64 COMMODORE 64 COMMODORE 64 COMMODORE 64 COMMODORE 64 COMMODORE 64 COMMODORE 64 COMMODORE 64 COMMODORE 64 BREAK IN 10 READY. _ Es entspricht guter Programmierpraxis, die Zeilen in Zehnerabständen zu numerieren - das vereinfacht das nachträgliche Einfügen von Programmzeilen. Neben PRINT kam in unserem Programm noch ein anderer BASIC-Befehl vor, nämlich GOTO. Damit geben Sie dem Computer die Anweisung, in die hinter GOTO angegebene Zeile zu springen und dort mit der Programmausführung fortzufahren. +--> 10 PRINT "COMMODORE 64" | +--- 20 GOTO 10 Unser Programm läuft also folgendermaßen ab: In Zeile 10 wird Befehl zum Ausdrucken des Textes auf dem Bildschirm gegeben; das Programm geht dann in die Zeile 20 und erhält dort den Befehl, in die Zeile10 zurückzugehen. Damit fängt das Spiel von vorne an, und Ihr COMMODORE 64 wird nicht aufhören, seinen Namen auf den Bildschirm zu drucken, bis Sie ihn mit der -Taste unterbrechen. Tippen Sie nach der Programmunterbrechung LIST ein und drücken die -Taste. Sie sehen, ihr Programm befindet sich noch unverändert im Speicher des Computers. Beachten Sie, daß er das "?" in ein "PRINT" übersetzt hat. Das Programm kann nun geändert, abgespeichert oder wieder gestartet werden. Beim Direkt-Modus (ohne Zeilennummern) ist das anders: wenn die Befehlszeile nicht mehr auf dem Bildschirm steht, ist sie verloren, und kann auch nicht mehr mit LIST zurückgeholt werden. *34* TIPS ZUM EDIEREN EINES PROGRAMMS Wenn Sie in einer Programmzeile einen Fehler machen, gibt es einige Methoden, diesen zu korrigieren. 1. Sie können die Zeile noch einmal schreiben; die alte Zeile wird dann automatisch durch die neue, fehlerfreie ersetzt. 2. Wenn Sie nur die Nummer der fehlerhaften Zeile eintippen und drücken, so wird diese Zeile gelöscht. 3. Sie können die Zeile unter Benutzung der Cursor-Steuertasten und der Ediertasten beliebig verändern. Nach dem Drücken der -Taste wird dann die korrigierte Zeile übernommen. Nehmen wir einmal an, Sie hätten sich in einer Programmzeile vertippt. Bewegen Sie nun den Cursor mit Hilfe der <|CRSR|>-Taste und der - Taste in die fehlerhafte Zeile. Bringen Sie nun den Cursor unter Benutzung der <=CRSR=>-Taste und der -Taste an die Stelle, wo das fehlerhafte Zeichen steht. Tippen Sie nun das richtige Zeichen ein, und drücken die -Taste; damit wird die richtige Zeile in den Programmspeicher übernommen, wovon Sie sich durch das Auslisten des Programms überzeugen können. Müssen Sie ein Zeichen an einer Stelle einflicken, so fahren Sie wieder mit den Cursor-Steuertasten an die Stelle, wo Sie Platz für das zusätzliche Zeichen brauchen und tippen Sie ein. Dadurch erzeugen Sie die benötigte Leerstelle. Nach dem Drücken der -Taste allein wird das vor dem Cursor stehende Zeichen gelöscht, ohne daß eine Lücke zurückbleibt. Sie können die Zeilen in beliebiger Reihenfolge ändern; an den Zeilennummern erkennt Ihr Computer, wo er die korrigierten Zeilen einzuordnen hat. Ändern Sie nun die Zeile 10 Ihres Programms so ab, daß sie der nachstehenden Zeile entspricht. Beachten Sie, daß am Ende der Zeile ein Semikolon (;) steht. 10 PRINT"COMMODORE "; Starten Sie nun das Programm; nach dem Unterbrechen des Programms mit der -Taste muß der Bildschirm etwa so aussehen, wie die Abbildung auf S. 35 wiedergibt. *35* VARIABLE Einer der wichtigsten Begriffe in allen Programmiersprachen ist der der Variablen. Er ist deshalb wichtig, ihre Eigenschaften und Möglichkeiten kennenzulernen. COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE COMMODORE BREAK IN 10 READY. _ Stellen Sie sich vor, daß Ihr Computer eine Reihe von Schachteln enthält, die Zahlen oder Worte enthalten. Diese Schachteln tragen Namen, die Sie frei wählen können. Diese Namen nennen wir Variable; sie repräsentieren die Information, die zu einem bestimmten Zeitpunkt in der betreffenden Schachtel enthalten ist. Nehmen wir folgendes Beispiel: 10 X% = 15 20 X = 23.5 30 X$ = "DIE SUMME VON X% + X = " Der Computer ordnet die Variablen dann wie folgt zu: X% 15 X 23.5 X$ DIE SUMME VON X% + X = Eine Variable steht für einen Speicherplatz, der jedoch während eines Programmablaufs seinen Inhalt verändern kann. Wie Sie sehen *36* kann man einer Variablen eine ganze Zahl, einen Dezimalbruch oder auch einen Satz zuordnen. Steht hinter dem Namen der Variablen ein %, so handelt es sich um einen Variablentyp, der nur ganze Zahlen repräsentieren kann (auch Integer-Variable genannt). Zulässige Integer-Variablennamen sind etwa die folgenden: A% X% A1% NM% Steht hinter einem Variablennamen ein $, so handelt es sich um eine sogenannte "Stringvariable". Eine solche Variable kann für eine beliebige Aneinanderreihung von Zeichen (auch "Strings" genannt) stehen. Diese Strings können Buchstaben, Zahlen und auch Sonderzeichen enthalten. Beispiele gültiger Variablennamen für Strings sind z. B. A$ X$ MI$ Dezimalbrüche (auch Fließkommazahlen oder "Floating-Point-Variablen" genannt), werden z. B. durch folgende Variablennamen repräsentiert: A1 X Y MI Beachten Sie, daß eine Variable aus mehr als zwei Zeichen bestehen kann; der Computer identifiziert die Variable jedoch anhand der ersten beiden Zeichen. Er kann also die beiden Variablen KOLLEGE und KONZERT nicht unterscheiden. Das erste Zeichen muß alphanumerisch (d. h., ein Buchstabe zwischen A und Z) und das zweite Zeichen ein Buchstabe oder eine Ziffer sein. Das letzte Zeichen kann dazu dienen, die Variable (wie oben beschrieben) näher zu charakterisieren (% = ganze Zahl; $ = String). Weiterhin dürfen Variablennamen keine Worte enthalten, die im Basic feste Bedeutungen haben. So ist z. B. der Variablenname ROTOR nicht erlaubt, weil er den Basic-Begriff TO enthält. Eine Übersicht über diese reservierten Begriffe wird im Anhang D gegeben. Tippen Sie nun das untenstehende Programm ein und starten Sie es mit RUN. (Vergessen Sie nicht, nach jeder Programmzeile zu drücken.) *37* NEW 10 X% = 15 20 X = 23.5 30 X$ = "DIE SUMME VON X% + X = " 40 PRINT "X% = "; X%, "X = ";X 50 PRINT X$; X% + X Wenn Sie alles richtig gemacht haben, so sollte nach Beendigung des Programms folgendes auf dem Bildschirm stehen: RUN X% = 15 X = 23.5 DIE SUMME VON X% + X = 38.5 READY. _ In den Zeilen 10 und 20 haben wir der Variablen X% die (ganze) Zahl 15 und der Variablen X den Dezimalbruch 23.5 zugeordnet. Der String X$ wurde in Zeile 30 definiert. In Zeile 40 haben wir verschiedene Formen der PRINT-Anweisung kombiniert, um die Namen und Werte der Variablen X und X% auszudrucken. Die Zeile 50 bewirkt, daß der String X$ und die Summe von X und X% auf den Bildschirm ausgegeben werden. Obwohl X Bestandteil aller verwendeten Variablennamen ist, kann der Computer auf Grund der Zusatzzeichen % und $ alle drei Variablen unterscheiden und sie mit verschiedenen Inhalten versehen. Aber Sie können mit Variablen noch mehr anfangen; wenn Sie sie ändern, so wird der alte Inhalt der Variablen-"Schachtel" gegen den neuen ausgetauscht. Auf diese Weise können Sie Zuweisungen der folgenden Art benutzen: X = X + 1 Als normaler algebraischer Ausdruck wäre diese "Gleichung" sinnlos, sie wird jedoch in Programmen außerordentlich häufig benutzt. Die Wirkung läßt sich so beschreiben: Nimm den Inhalt der Schachtel X, erhöhe den Inhalt um 1 und lege den neuen Inhalt wieder in die Schachtel mit der Aufschrift X. *38* IF ... THEN Nachdem Sie nun wissen, wie man mit Variablen umgeht, wollen wir diese neuen Erkenntnisse gleich im nächsten Programm anwenden: NEW 10 ZR = 0 20 ?"COMMODORE 64" 30 ZR = ZR + 1 40 IF ZR < 5 THEN 20 50 END RUN COMMODORE 64 COMMODORE 64 COMMODORE 64 COMMODORE 64 COMMODORE 64 Wie Sie sehen, hat unser neuer Befehl IF ... THEN dazu geführt, daß nur noch eine begrenzte Anzahl von Zeilen ausgedruckt wird. Stößt der Computer während der Programmausführung auf einen solchen Befehl, so prüft er, ob die hinter IF stehende Bedingung wahr ist. Wenn dies zutrifft, so wird der hinter THEN stehende Befehl ausgeführt. Sollte die hinter IF stehende Bedingung nicht mehr wahr sein, so führt der COMMODORE 64 den Befehl in der nächsten Zeile aus. Eine ganze Reihe von Bedingungen können im Zusammenhang mit IF ... THEN verwendet werden: SYMBOL BEDEUTUNG < kleiner als > größer als = gleich <> ungleich >= größer oder gleich <= kleiner oder gleich Sie können mit Hilfe dieser Bedingungen auf einfache aber wirkungsvolle Weise den Programmablauf kontrollieren. *39* 10 ZR = 0 +--> 20 ?"COMMODORE 64" | 30 ZR = ZR + 1 +-<- 40 IF ZR < 5 THEN 20 | 50 END Wir haben in unserem Beispielprogramm eine sogenannte "Schleife" konstruiert, die jedoch nur so lange durchlaufen wird, wie die Bedingung, die zwischen IF und THEN steht, erfüllt ist. In Zeile 10 wird ZR (ZähleR) 0 gesetzt. Zeile 20 druckt unseren Text aus. In Zeile 30 wird der Wert von ZR bei jedem Durchlauf der Schleife um 1 erhöht. Der aktuelle Wert von ZR gibt also an, wie oft die Schleife abgearbeitet wurde. In der Zeile 40 findet die Kontrolle statt. Wenn ZR kleiner als 5 ist, d. h., unser Text wurde bis dahin weniger als 5 mal ausgedruckt, dann geht das Programm zurück in die Zeile 20 und führt den PRINT-Befehl noch einmal aus. Nach dem 5. Durchlauf ist die Bedingung nicht mehr erfüllt, und das Programm geht weiter zur Zeile 50, wo der END-Befehl steht (der im vorliegenden Fall auch weggelassen werden könnte). Durch Änderung der oberen Grenze von ZR in der Zeile 40 können Sie jede beliebige Anzahl von Textzeilen erzeugen. Wie wir noch sehen werden, hat der IF ... THEN-Befehl eine sehr große Zahl von Anwendungen. FOR ... NEXT SCHLEIFEN Der Effekt, den wir im vorigen Kapitel mit dem IF ... THEN Befehl erzielt haben, läßt sich auf leichtere Art mit der FOR ... NEXT Schleife realisieren. Tippen Sie bitte folgendes Programm ein und starten es mit RUN: NEW 10 FOR ZR = 1 TO 5 20 PRINT "COMMODORE 64" 30 NEXT ZR RUN COMMODORE 64 COMMODORE 64 COMMODORE 64 COMMODORE 64 COMMODORE 64 *40* Sie erhalten den gleichen Bildschirmausdruck wie im letzten Kapitel, aber das Programm ist kürzer geworden. In Zeile 10 wird ZR = 1 gesetzt. Zeile 20 bewirkt wieder das Ausdrucken unseres Textes, und in Zeile 30 wird der Wert von ZR um 1 erhöht. Der Ausdruck "NEXT" in Zeile 30 führt dazu, daß das Programm in die Zeile springt, wo das zugehörige "FOR" steht, nämlich in die Zeile 10. Die FOR ... NEXT Schleife wird so oft durchlaufen, bis der in Zeile 10 hinter TO stehende Wert erreicht ist. Wenn Sie Ihrem Computer nichts anderes angeben, addiert er bei jedem Durchlauf den Wert 1; sie können jedoch auch jede andere Schritt- weite (auch Inkrement genannt) wählen. Tippen Sie dazu folgendes Beispiel ein: NEW 10 FOR NB = 1 TO 10 STEP .5 20 PRINT NB, 30 NEXT NB RUN 1 1.5 2 2.5 3 3.5 4 4.5 5 5.5 6 6.5 7 7.5 8 8.5 9 9.5 10 Durch die Angabe STEP .5 (die 0 im Dezimalbruch 0.5 kann weggelassen werden) wird bei jedem Durchlauf der Wert von NB um 0.5 erhöht, so daß die Zahlen 1, 1.5, 2, 2.5 etc. auf dem Bildschirm ausgegeben werden. Sie können die Zahl hinter dem Ausdruck "STEP" sogar negativ wählen. Probieren Sie doch einmal aus, was passiert, wenn Sie die Zeile 10 wie folgt ändern: 10 FOR NB = 10 TO 1 STEP -.5 *41* KAPITEL 4 WEITERE BASIC-BEFEHLE ·Einleitung ·Bewegung auf dem Bildschirm - geschachtelte Schleifen ·INPUT ·GET ·Die Random-Funktion ·Zahlenratespiel ·Würfeln ·Zufallsmuster - die CHR$ - und die ASC-Funktion *42* EINLEITUNG Die folgenden Kapitel richten sich an diejenigen Computerbenutzer, die bereits Erfahrung mit der Programmsprache BASIC haben. Es werden einige Methoden vorgestellt, die man zum Schreiben fortgeschrittener Programme benötigt. Diejenigen, die erst mit dem Programmieren angefangen haben, werden einige Abschnitte vielleicht nicht sofort verstehen. Aber - nur Mut; für die beiden besonders unterhaltsamen Kapitel "SPRITE-GRAFIK" und "TONERZEUGUNG" haben wir uns auch ein paar Beispiele für den Anfänger einfallen lassen. Diese Beispiele werden Ihnen einen Eindruck davon vermitteln, welche faszinierenden Grafik- und Tonmöglichkeiten in Ihrem COMMODORE 64 stecken. Für diejenigen, die gar nicht genug kriegen können, haben wir im Anhang M noch eine Liste von BASIC- Lehrbüchern zusammengestellt. Detaillierte Informationen speziell für den COMMODORE 64 können Sie dem PROGRAMMIERHANDBUCH zum COMMODORE 64 entnehmen, das in Kürze bei Ihrem Fachhändler erhältlich sein wird. *43* BEWEGUNG AUF DEM BILDSCHIRM Wir wollen nun noch einmal das üben, was wir bis jetzt gelernt haben, und noch einige neue Methoden dazu lernen. Nehmen Sie sich Mut und tippen Sie das nachstehende Programm ein. Das Bemerkenswerte an diesem Programm ist, daß der PRINT-Befehl zur Steuerung des Cursors benutzt wird. Wenn Sie im Programm z. b. den Cursor nach links bewegen wollen, so drücken Sie beim Eintippen die - und die -Taste. Im Programmausdruck (auch "Listing" genannt) wird dies durch zwei senkrechte Streifen markiert. Das programmgesteuerte Löschen des Bildschirms mit wird durch ein revers (negativ) dargestelltes Herz repräsentiert. 10 REM SPRINGENDER BALL 20 PRINT "{CLEAR}" 25 FOR X = 1 TO 10 : PRINT "{DOWN}" : NEXT 30 FOR BL = 1 TO 40 40 PRINT" O{LEFT}";: REM O = SHIFT Q 50 FOR TM = 1 TO 5 60 NEXT TM 70 NEXT BL 75 REM BEWEGT DEN BALL NACH LINKS 80 FOR BL = 40 TO 1 STEP -1 90 PRINT " {LEFT}{LEFT}O{LEFT}"; 100 FOR TM = 1 TO 5 110 NEXT TM 120 NEXT BL 130 GOTO 20 Wenn Sie das Programm richtig abgetippt haben, so erscheint nach dem Start ein Ball, der zwischen dem linken und dem rechten Rand hin- und her reflektiert wird. Auf Seite 44 haben wir das Programm noch einmal abgedruckt und mit Verbindungslinien versehen, die den Ablauf klarer machen sollen. In Zeile 10 steht hinter dem REM (von REMark = Anmerkung) ein Kommentar, der den Programmtitel enthält; er hat keinerlei Auswirkung auf den Programmablauf. In Zeile 20 wird der Bildschirm gelöscht. Zeile 25 enthält 10 mal den Befehl Cursor abwärts; hierdurch wird die Ballbewegung in die Bildschirmmitte verlagert. Wenn Sie die Zeile 25 weglassen, wird sich der Ball am oberen Bildschirmrand hin- und herbewegen. Beachten Sie, daß bei einer FOR ... NEXT-Schleife *44* 10 REM SPRINGENDER BALL +----> 20 PRINT "{CLEAR}" | 25 FOR X = 1 TO 10 : PRINT "{DOWN}" : NEXT | +--> 30 FOR BL = 1 TO 40 | | 40 PRINT" O{LEFT}";: REM O = SHIFT Q | | +> 50 FOR TM = 1 TO 5 | | +- 60 NEXT TM | +--- 70 NEXT BL | 75 REM BEWEGT DEN BALL NACH LINKS | +--> 80 FOR BL = 40 TO 1 STEP -1 | | 90 PRINT " {LEFT}{LEFT}O{LEFT}"; | | +> 100 FOR TM = 1 TO 5 | | +- 110 NEXT TM | +--- 120 NEXT BL +----- 130 GOTO 20 FOR- und NEXT-Anweisung in einer Zeile stehen können. Mehrere BASIC-Befehle in einer Zeile müssen jedoch durch Doppelpunkte getrennt werden. In Zeile 30 befindet sich der erste Teil einer Schleife, die dafür sorgt, daß sich der Ball horizontal (von links nach rechts) über den gesamten, 40 Spalten breiten, Bildschirm bewegt. In Zeile 40 wird eine Menge Arbeit geleistet. Als erstes wird ein leeres Feld (auch "Space" genannt) gedruckt, dann wird der Ball gedruckt und schließlich wird der Cursor nach links bewegt, um die Vorbedingung für ein erneutes Löschen des Balls zu schaffen. Die Schleife in den Zeilen 50 und 60 dient nur dazu, die Bewegung des Balls zu verlangsamen. Ohne diese Schleife wäre der Ball kaum sichtbar. In Zeile 70 befindet sich die zweite Hälfte der Schleife, deren erste Hälfte sich in Zeile 30 befindet. Jedesmal, wenn diese Schleife durchlaufen wird, bewegt sich der Ball um eine Cursorposition auf dem Bildschirm nach rechts. Wie aus den verbindenden Pfeilen im obigen Programmausdruck deutlich hervorgeht, haben wir eine Schleife in einer Schleife (sog. geschachtelte Schleifen) konstruiert. Wenn Sie diese Methode, Schleifen innerhalb anderer Schleifen laufen zu lassen, anwenden, so müssen Sie darauf achten, daß die zuerst geöffnete Schleife als letzte geschlossen wird. Überkreuzungen, die Sie z. B. durch Vertauschen der Zeilen 60 und 70 herbeiführen können, führen zu Fehlermeldungen. In den Zeilen 80 bis 120 wird der umgekehrte Bewegungsablauf auf dem Bildschirm erzeugt. Da die beiden Bewegungsrichtungen auf dem Bildschirm jedoch nicht völlig gleichberechtigt sind, sehen die einander entsprechenden Zeilen 40 und 90 etwas unterschiedlich aus. Zum Schluß geht das Programm zurück zur Zeile 20 und alles fängt wieder von vorn an. *45* Zum besseren Verständnis des Programms bringen wir noch eine kleine Änderung in Zeile 40 an: 40 PRINT "O"; Starten Sie das Programm noch einmal und schauen Sie was passiert. Da wir die Cursorsteuerung weggelassen haben, bleibt der Ball auf dem Bildschirm, bis er durch den "reflektierten" von rechts kommenden Ball gelöscht wird. INPUT In den bis jetzt besprochenen Programmen bestand keine Möglichkeit, den Ablauf zu beeinflussen, ohne das Programm selbst zu ändern. Benutzt man die INPUT-Anweisung (INPUT = Eingabe), so hat man die Möglichkeit, während des Programmablaufs Informationen an das Programm zu übergeben. Das folgende Programm soll Ihnen eine Vorstellung davon geben, wie man mit der INPUT-Anweisung arbeitet: 10 INPUT A$ 20 PRINT "SIE GABEN EIN: ";A$ 30 PRINT 40 GOTO 10 RUN ? COMMODORE 64 <---------------- Ihre Eingabe SIE GABEN EIN: COMMODORE 64 <----- Antwort des Computers An der Stelle, wo Sie einen INPUT programmiert haben, hält das Programm an, und ein Fragezeichen signalisiert, daß der Computer eine Eingabe von der Tastatur erwartet. Geben Sie nun irgend eine Folge von Zeichen ein und drücken die -Taste, so druckt der Computer aus: SIE GABEN EIN und dahinter den von Ihnen eingegebenen Text. Um ein Programm komfortabler zu gestalten, kann man zusammen mit dem INPUT einen Kommentar auf den Bildschirm bringen, der z. B. angibt, welche Eingabe erwartet wird. Dieser Kommentar darf allerdings *46* nicht länger als 38 Zeichen sein. Das Format (d. h. soviel wie Schreibweise) der INPUT-Anweisung ist: INPUT "KOMMENTAR"; Variable Dabei kann die Variable eine Stringvariable oder eine numerische Variable sein. Wenn Sie auf den Kommentar verzichten wollen, brauchen Sie nur einzugeben: INPUT VARIABLE Bem.: Um aus diesem Programm "auszusteigen", müssen Sie drücken. Das folgende Programm, das Temperaturangaben in FAHRENHEIT und CELSIUS ineinander umrechnet, benutzt vieles von dem, was Sie bis jetzt gelernt haben: 5 PRINT"{CLEAR}" 10 PRINT"AUSGABE IN FAHRENHEIT ODER CELSIUS (F/C)":INPUT A$ 20 IF A$="" THEN 10 30 IF A$="C" THEN 100 40 IF A$="F" THEN 50 45 GOTO 10 50 INPUT"EINGABE VON CELSIUS: ";C 60 F = (C*9)/5+32 70 PRINT C;"GRAD CELSIUS = ";F;"GRAD FAHRENHEIT" 80 PRINT 90 GOTO 10 100 INPUT "EINGABE VON FAHRENHEIT: ";F 110 C = (F-32)*5/9 120 PRINT F;"GRAD FAHRENHEIT = ";C;"GRAD CELSIUS" 130 PRINT 140 GOTO 10 Zusammen mit dem INPUT in Zeile 10 wird ein Text auf dem Bildschirm ausgegeben. In den Zeilen 20, 30 und 40 wird die Eingabe überprüft. Wenn "nichts" eingegeben wird, d. h. nur die -Taste gedrückt wurde, so wird das in Zeile 20 festgestellt; das Programm geht nach Zeile 10 zurück und wartet auf eine neue Eingabe. Wurde "C" eingegeben, so bewirkt die Zeile 30 einen Sprung in die Zeile 100, dort beginnt der Programmteil, der Fahrenheit in Celsius umrechnet. Nach Eingabe von "F" springt das Programm nach 50. Jede andere Eingabe führt (wegen Zeile 45) zu einem Sprung nach 10 und damit zu einer erneuten Abfrage. *47* Wenn das Programm richtig eingetippt wurde, so fragt es ab, welche Umrechnung gewünscht wird, verlangt dann die Eingabe des entsprechenden Temperaturwertes und rechnet um. Die Umrechnungsformeln können in jedem Grundlehrbuch der Physik nachgelesen werden; ihre Umsetzung in ein BASIC-Programm ist sehr einfach. Nachdem die Umrechnung erfolgt ist und der entsprechende Wert ausgedruckt wurde, kehrt das Programm wieder in die Zeile 10 zurück und wartet auf ein neue Eingabe. Der Bildschirm könnte zu diesem Zeitpunkt etwa so aussehen. AUSGABE IN FAHRENHEIT ODER CELSIUS (F/C) ? C EINGABE VON FAHRENHEIT: ? 32 32 GRAD FAHRENHEIT = 0 GRAD CELSIUS AUSGABE IN FAHRENHEIT ODER CELSIUS (F/C) ? Wenn das Programm zufriedenstellend gelaufen ist, sollten Sie es zur späteren Verwendung auf Band oder Diskette abspeichern. GET Mit Hilfe der GET-Anweisung können Sie jeweils ein Zeichen von der Tastatur in den Rechnerspeicher einlesen ohne die -Taste zu betätigen. Die Eingabe von Daten läßt sich dadurch in vielen Fällen erheblich beschleunigen. Das eingegebene Zeichen wird der Variablen zugeordnet, die hinter der GET-Anweisung steht. Die folgende Routine illustriert, wie GET arbeitet: PRINT "{CLEAR}" 10 GET A$: IF A$="" THEN 10 20 PRINT A$; ^ 30 GOTO 10 |_____ Keine Leertaste! *48* Wenn Sie das Programm starten, so wird als erstes der Bildschirm gelöscht. Drücken Sie eine Taste, so bewirkt Zeile 20, daß das zugehörige Zeichen auf dem Bildschirm ausgedruckt wird. Dann wartet die GET-Anweisung auf eine neue Eingabe. Beachten Sie, daß das Zeichen erst durch den PRINT-Befehl auf dem Bildschirm erscheint. Der zweite Befehl in Zeile 10 ist sehr wichtig. Da GET ununterbrochen arbeitet (im Gegensatz zu INPUT, wo ja die Eingabe durch bestätigt wird), wird geprüft, ob eine Taste gedrückt wurde. Solange das nicht der Fall ist (d. h. solange A$ = ""), bleibt das Programm in Zeile 10. Überprüfen Sie doch mal, was passiert, wenn Sie den zweiten Teil der Zeile weglassen. Um das Programm anzuhalten müssen Sie drücken. Das Temperatur-Umrechnungs-Programm können Sie leicht mit GET- Anweisungen ausstatten, wenn Sie die Zeilen 10, 20 und 40 in folgender Weise umschreiben und Zeile 45 löschen: 10 PRINT"AUSGABE IN FAHRENHEIT ODER CELSIUS (F/C)" 20 GET A$:IF A$="" THEN 20 40 IF A$<>"F" THEN 20 45 : DIE ERZEUGUNG VON ZUFALLSZAHLEN Ihr COMMODORE 64 enthält eine große Zahl eingebauter Funktionen. Sie können diese Funktionen im Rahmen von BASIC-Programmen wie Unterprogramme benutzen. Dazu brauchen Sie nur die gewünschte Funktion mit ihrem Namen aufzurufen. Sowohl beim Schreiben von Lernprogrammen wie auch von Spielprogrammen ist es oft von Vorteil, Zufallszahlen zu verwenden; so z.B. wenn Sie ein Würfelspiel simulieren wollen. Für diese Zwecke benützt man sinnvollerweise die RND-Funktion (abgeleitet von RaNDom = zufällig). Tippen Sie das folgende Programm ein, um zu sehen, wie die RND-Funktion arbeitet: 10 FOR X = 1 TO 10 20 PRINT RND(1), 30 NEXT *49* Nach Beendigung des Programms sollte der Bildschirm etwa wie folgt aussehen: .125879587 .258874559 .598762589 .145587988 .598526982 .225698774 .369854725 .158798789 .587412365 .265879589 Sie haben andere Zahlen? Nun, kein Wunder, die Zahlen sollen ja auch zufällig sein. Lassen Sie das Programm ein paar mal laufen und vergewissern Sie sich, daß stets andere Zahlen ausgedruckt werden. Allen Zahlen gemeinsam ist nur die Eigenschaft, daß sie zwischen 0 und 1 liegen (jedoch nie die Werte 0 und 1 selbst annehmen). Außerdem erhalten wir 9-stellige Dezimalbrüche, oder sogar Zahlen in wissenschaftlicher Notation. Was machen wir nun, wenn wir ein Würfelspiel darstellen wollen und dafür Zahlen im Bereich von 0 bis 6 und dazu noch ganzzahlig brauchen? Gehen wir erst einmal das erste Problem an, nämlich die Änderung des Bereichs, in dem die Zufallszahlen liegen. Ändern Sie zu diesem Zweck die Zeile 20 Ihres Programms wie folgt ab: 20 PRINT 6*RND(1), RUN 4.65860249 2.50799065 5.97566542 4.85598756 5.08027654 2.88939395 2.18540619 4.62204427 5.53725942 3.95162546 *50* Nun liegen die Zahlen etwa für ein Würfelspiel im richtigen Bereich, aber die Nachkommastellen stören noch. Aber auch für diesen Fall haben wir eine eingebaute Funktion in unserem COMMODORE 64: 20 PRINT INT(6*RND(1)), RUN 1 5 5 3 0 1 4 2 3 1 Die INT-Funktion (abgeleitet von INTeger = ganze Zahl) schneidet die Nachkommastellen einer Dezimalzahl ab. Ändern Sie die Zeile 20 noch einmal wie folgt ab und starten Sie das Programm: 20 PRINT INT(6*RND(1)) Nun stört nur noch eine Tatsache; statt der Zahlen zwischen 1 und 6 erhalten wir welche zwischen 0 und 5. Wir ändern deshalb die Zeile 20 ein letztes Mal: 20 PRINT INT(6*RND(1))+1 Jetzt liefert uns das Programm die gewünschten Zahlen. Sie können auf diese Weise Zufallszahlen in jedem gewünschten Bereich der Zahlenskala erzeugen. Die Größe des Bereichs wird vorgegeben durch die Zahl mit der Sie die RND-Funktion multiplizieren. Durch Hinzuaddieren einer Zahl können Sie diesen Bereich beliebig verschieben. Wenn Sie nur ganze Zahlen erhalten wollen, wenden Sie noch die INT-Funktion an. Schematisch ausgedrückt sieht das etwa so aus: ZAHL = INT(BEREICH*RND(1))+VERSCHIEBUNG *51* ZAHLENRATESPIEL Nachdem wir uns so lange mit dem Erklären der Zufallszahlen aufgehalten haben, wollen wir endlich auch eine Anwendung bringen. Das folgende Programm zeigt nicht nur eine sinnvolle Anwendung der RND-Funktion, sondern bringt auch einige neue Programmiertricks. Die Zufallszahl, die in diesem Programm verwendet wird, wurde der Variablen NM zugeordnet. 1 REM ZAHLENRATESPIEL 2 PRINT "{CLEAR}" 5 INPUT "ZAHLEN OBERGRENZE ";LI 10 NM = INT(LI*RND(1))+1 15 CN = 0 20 PRINT "ES KANN LOSGEHEN" 30 INPUT "IHR TIP";GU 35 CN = CN + 1 40 IF GU > NM THEN PRINT "MEINE ZAHL IST KLEINER":PRINT:GOTO 30 50 IF GU < NM THEN PRINT "MEINE ZAHL IST GROESSER":PRINT:GOTO 30 60 IF GU = NM THEN PRINT "TOLL SIE HABEN DIE ZAHL ERRATEN" 65 PRINT "MIT NUR ";CN;"VERSUCHEN.":PRINT 70 PRINT "WOLLEN SIE NOCH EINMAL (J/N)?"; 80 GET AN$:IF AN$="" THEN 80 90 IF AN$ = "J" THEN 2 100 IF AN$ <> "N" THEN 80 Sie können zu Beginn des Programms festlegen, welche maximale Größe die Zahl, die Sie erraten sollen, annehmen kann. Dann können Sie mit dem Raten beginnen. Das Programm kommentiert Ihre Eingaben und gibt Ihnen Hinweise darauf, wie groß die zu erratende Zahl ist. Dies wird ZAHLEN OBERGRENZE ? 25 ES KANN LOSGEHEN IHR TIP? 15 MEINE ZAHL IST KLEINER IHR TIP? 10 MEINE ZAHL IST KLEINER IHR TIP? 5 TOLL SIE HABEN DIE ZAHL ERRATEN MIT NUR 3 VERSUCHEN. WOLLEN SIE NOCH EINMAL (J/N)? *52* programmtechnisch mit Hilfe von IF ... THEN-Anweisungen realisiert, in denen die vom Computer ausgewählte Zahl mit Ihrer Eingabe verglichen wird. Versuchen Sie nun einmal das Programm so abzuändern, daß der Benutzer auch die untere Grenze der vom Rechner vorgegebenen Zufallszahlen eingeben kann. Bei jedem Rateversuch, den Sie machen, wird die Variable CN um 1 erhöht, um die Anzahl der Fehlversuche zu ermitteln, die ja nach Auffinden der "richtigen" Zahl vom Computer zusammen mit dem Text "TOLL SIE HABEN DIE ZAHL ERRATEN" ausgegeben wird. Nun können Sie mit einem neuen Spiel beginnen, in dem der COMMODORE 64 natürlich eine neue Zufallszahl vorgibt. -------------------------------------------------------------------- PROGRAMMIERTIPS: In den Zeilen 40 und 50 wurden mehrere Befehle durch Doppelpunkte getrennt. Das erspart Ihnen nicht nur überflüssiges Tippen, sondern spart auch Speicherplatz. In denselben Zeilen wurden auch zusätzliche PRINT-Befehle untergebracht, die beim Ausdruck auf dem Bildschirm Leerzeilen erzeugen und dadurch den Bildschirm übersichtlicher gestalten. Da wir von vornherein die Zeilennummern in 10er-Abständen gewählt haben, konnten wir auf einfache Weise nachträglich die Routine zum Zählen der Fehlversuche (Zeilen 15, 35 und 65) einbauen. -------------------------------------------------------------------- WÜRFELSPIEL Das folgende Programm simuliert ein Würfelspiel mit zwei Würfeln. Viel Glück! 5 PRINT "VERSUCHE DEIN GLUECK?" 10 PRINT "ROTER WUERFEL = ";INT(6*RND(1))+1 20 PRINT "WEISSER WUERFEL = ";INT(6*RND(1))+1 30 PRINT "DRUECKE SPACE FUER WEITERE WUERFE":PRINT 40 GET A$: IF A$ = "" THEN 40 50 IF A$ = CHR$(32) THEN 10 Überprüfen Sie Ihr Wissen über das Programmieren in BASIC und versuchen Sie zu verstehen, wie das Programm aufgebaut ist. *53* ZUFALLSGRAFIKEN Daß man auch Grafiken auf Zufallszahlen aufbauen kann, sehen Sie an folgendem kleinen Programm: 10 PRINT "{CLEAR}" 20 PRINT CHR$(205.5 + RND(1)); 30 GOTO 20 Das Wichtigste in diesem Programm steht in der Zeile 20, die die CHR$-Funktion enthält. Je nachdem welche Zahl zwischen 0 und 255 Sie in Klammern hinter den Funktionsnamen setzen, erhalten Sie jeweils ein anderes Zeichen. Die Codetabelle, aus der hervorgeht, wie die Zahlen und Zeichen einander zugeordnet sind, ist im Anhang F dieses Handbuchs abgedruckt. Sie können den Zahlenwert, der einem Zeichen zugeordnet ist, aber auch selbst ermitteln, wenn Sie die ASC-Funktion benutzen. Sie tippen nur ein: PRINT ASC ("X") Wobei X für das Zeichen steht, dessen Zahlencode Sie wissen wollen. Es kann sich hierbei um jedes druckbare Zeichen, einschließlich der Grafikzeichen, handeln. Der Code, um den es hier geht, wird im allgemeinen als ASCII-Code bezeichnet. Die ASC-Funktion ist die Umkehrfunktion der CHR$-Funktion. D. h., wenn Sie die mit ASC ermittelte Zahl (z. B. Y) in die CHR$-Funktion einsetzen, so erhalten Sie nach Eingabe von PRINT CHR$(Y) das Zeichen X ausgedruckt. Tippen Sie nun ein PRINT CHR$(205); CHR$(206) so erhalten Sie die Grafikzeichen ausgedruckt, die sich vorn rechts auf der M- und der N-Taste befinden, und aus denen sich ein Irrgarten von der Art aufbauen läßt, wie ihn unser kleines Programm erzeugt hat. *54* Wenden wir nun die Formel 205.5 + RND(1) an, so werden Zahlen zwischen 205.5 und 206.5 erzeugt. Die Wahrscheinlichkeiten dafür, daß eine Zahl größer oder kleiner als 206 ist, sind gleich groß. Da die CHR$-Funktion die Nachkommastellen ignoriert, werden also die Zeichen mit den Codes 205 und 206 mit gleicher Häufigkeit ausgedruckt. Sie können diese Wahrscheinlichkeit und damit das Aussehen der Grafik dadurch verändern, daß Sie den Ausgangswert 205.5 um einige Zehntel vergrößern oder vermindern. *55* KAPITEL 5 FORTGESCHRITTENE GRAFIK- UND FARB- PROGRAMMIERUNG ·Farbe und Grafik ·Farbgebung mit PRINT-Befehlen ·Farb-CHR$-Codes ·PEEK und POKE ·Weitere Ballspiele *56* FARBE UND GRAFIK Wir haben nun schon einige der hochentwickelten Programmiermöglichkeiten des COMMODORE 64 kennengelernt. Eine der faszinierendsten Eigenschaften dieses Computers besteht jedoch in der Möglichkeit, Farbgrafiken zu erstellen. Einfache Beispiele waren das "Springball"-Programm und der Irrgarten. Aber die Möglichkeiten Ihres Computers sind unvergleichlich größer. In diesem Abschnitt werden wir Ihnen zeigen, wie Sie Farbgrafiken erstellen und in eigenen Spielen einsetzen können. Da wir uns bis jetzt auf die Rechenmöglichkeiten unseres Computers konzentriert haben, haben wir uns auf die Standardfarben des Bildschirms (hellblaue Schrift auf dunkelblauem Hintergrund mit hellblauem Rand) beschränkt. Nun wollen wir Ihnen zeigen, wie Sie diese Farben ändern können und wie Sie die vielen Grafiksymbole Ihres COMMODORE 64 einsetzen können. FARBGEBUNG MIT PRINT-BEFEHLEN Wenn Sie den Farbjustagetest in Kapitel 1 gemacht haben, so können Sie sich sicher daran erinnern, daß man die Zeichenfarbe einfach dadurch ändern kann, daß man die -Taste und eine der Zifferntasten drückt. Aber wie kann man die Farben im Rahmen eines Programms ändern? Wie wir im "Springball"-Programm gesehen haben, kann man Befehle, die von der Tastatur eingegeben werden können, durch Verwendung zusammen mit PRINT-Befehlen auch im Programm einsetzen. Sie haben eine Skala von 16 Zeichenfarben zur Verfügung. Durch Benutzung der -Taste und der Zifferntasten können Sie folgende erzeugen: 1 2 3 4 5 6 7 8 schwarz weiß rot türkis violett grün blau gelb Durch Verwendung der -Taste zusammen mit den Zifferntasten erhalten Sie zusätzlich folgende Farben: 1 2 3 4 5 6 7 8 orange braun hell- grau 1 grau 2 hell- hell- grau 3 rot grün blau *57* Tippen Sie nun NEW ein und machen folgendes Experiment: Nach dem Zeilenanfang 10 PRINT" drücken Sie zusammen die - und die <1>-Taste. Lassen Sie dann die Tasten los und drücken die - Taste. Nun drücken Sie die -Taste zusammen mit der <2>-Taste und dann die

-Taste allein. Wählen Sie auf diese Weise eine Farbe nach der anderen an und geben dazwischen die Buchstaben des Wortes SPEKTRUM ein. 10 PRINT" S P E K T R U M" ^ ^ ^ ^ ^ ^ ^ ^ | | | | | | | | <1 2 3 4 5 6 7 8> RUN SPEKTRUM Wie bei der Cursorsteuerung werden auch die Farbsteuerzeichen als graphische Zeichen dargestellt. Bei gleichzeitigem Drücken von und <3> (natürlich nur nachdem Sie vorher auf <"> gedrückt haben) erscheint das Pfundzeichen und <7> ergibt den Pfeil nach links. Die nachfolgende Tabelle gibt eine Zusammenstellung dieser Farbcodes. TASTE FARBE AUSGABE TASTE FARBE AUSGABE <1> SCHWARZ <1> ORANGE <2> WEISS <2> BRAUN <3> ROT <3> HELLROT <4> TÜRKIS <4> GRAU 1 <5> VIOLETT <5> GRAU 2 <6> GRÜN <6> HELLGRÜN <7> BLAU <7> HELLBLAU <8> GELB <8> GRAU 3 Wie Sie schon bemerkt haben, werden die Steuerzeichen nur beim Listen des Programms sichtbar, bei der Programmausführung, d. h., beim Drucken des Wortes SPEKTRUM tauchen Sie nicht mehr auf, nur der TEXT wird (mit den entsprechenden Farbvariationen) ausgegeben. Spielen Sie nun einige Möglichkeiten durch, um mit der Farbsteuerung vertraut zu werden, und vergessen Sie nicht, daß Sie noch weitere Farbmöglichkeiten im Zusammenhang mit der -Taste haben. *58* -------------------------------------------------------------------- Bem.: Nach Beendigung eines Programms, in dem Sie die Farbsteuerung angewandt haben, bleibt der Computer in dem Modus, den Sie als letztes eingeschaltet hatten. Sie kommen in den Normalmodus (hellblau, dunkelblau) zurück, wenn Sie drücken. -------------------------------------------------------------------- FARB-CHR$-CODES Wie Sie dem Anhang F (Liste der CHR$-Codes) entnehmen können, haben die Farben (aber auch z. B. die Cursor-Steuerbefehle) Zahlencodes. Diese Codes können zusammen mit dem PRINT-Befehl direkt benutzt werden, sie haben dieselbe Wirkung wie das Drücken der und der entsprechenden Zifferntaste. Probieren Sie z. B. folgendes Beispiel aus: NEW 10 PRINT CHR$(147) : REM CLR/HOME 20 PRINT CHR$(30);"CHR$(30) FAERBT MICH?" RUN CHR$(30) FAERBT MICH? Die Schrift sollte nun grün sein. In vielen Fällen ist die Verwendung der CHR$-Funktion zur Farbsteuerung wesentlich einfacher, als die Verwendung der Farbtasten. Das nachfolgende Programm erzeugt farbige Balken auf dem Bildschirm. Beachten Sie, daß sich die Zeilen 40-190 nur in den Zeilennummern und den Argumenten der CHR$-Funktion unterscheiden. Sie brauchen also nur einmal den vollen BASIC-Text einzutippen und können dann durch Ändern der Zeilennummer und der CHR$-Funktion die anderen Zeilen erzeugen (Siehe weiter unten: Edierhinweise). 1 REM AUTOMATISCHE FARBBALKEN 5 PRINTCHR$(147) : REM CHR$(147) = CLR/HOME 10 PRINT CHR$(18); " "; : REM REVERSER BALKEN 20 CL = INT (16*RND(1))+1 30 ON CL GOTO 40,50,60,70,80,90,100,110,120,130,140,150,160,170,180,190 40 PRINTCHR$(5);: GOTO 10 50 PRINTCHR$(28);: GOTO 10 60 PRINTCHR$(30);: GOTO 10 70 PRINTCHR$(31);: GOTO 10 *59* 80 PRINTCHR$(144);: GOTO 10 90 PRINTCHR$(156);: GOTO 10 100 PRINTCHR$(158);: GOTO 10 110 PRINTCHR$(159);: GOTO 10 120 PRINTCHR$(129);: GOTO 10 130 PRINTCHR$(149);: GOTO 10 140 PRINTCHR$(150);: GOTO 10 150 PRINTCHR$(151);: GOTO 10 160 PRINTCHR$(152);: GOTO 10 170 PRINTCHR$(153);: GOTO 10 180 PRINTCHR$(154);: GOTO 10 190 PRINTCHR$(155);: GOTO 10 Nach dem Eintippen der Zeilen 1 bis 40 sollte Ihr Bildschirm wie folgt aussehen: 1 REM AUTOMATISCHE FARBBALKEN 5 PRINTCHR$(147) : REM CHR$(147) = CLR/HOME 10 PRINT CHR$(18); " "; : REM REVERSER BALKEN 20 CL = INT (16*RND(1))+1 30 ON CL GOTO 40,50,60,70,80,90,100,110,120,130,140,150,160,170,180,190 40 PRINTCHR$(5);: GOTO 10 EDIERHINWEISE Bewegen Sie zuerst den Cursor mit Hilfe der Cursor-Steuertasten auf die "4" der Zeilennummer 40. Tippen Sie nun eine "5", so daß die Zeilennummer 50 entsteht. Steuern Sie nun den Cursor zwischen die Klammern der CHR$-Funktion. Durch Drücken von schaffen Sie dort Platz für eine zweistellige Zahl und tippen dann die "28" ein. Nach dem Drücken der -Taste sollte der Bildschirm wie folgt aussehen. 1 REM AUTOMATISCHE FARBBALKEN 5 PRINTCHR$(147) : REM CHR$(147) = CLR/HOME 10 PRINT CHR$(18); " "; : REM REVERSER BALKEN 20 CL = INT (16*RND(1))+1 30 ON CL GOTO 40,50,60,70,80,90,100,110,120,130,140,150,160,170,180,190 50 PRINTCHR$(28);: GOTO 10 Wenn Sie sich das Programm neu auflisten lassen, werden Sie feststellen, daß die Zeile 40 weiterhin existiert. Wenn Sie jetzt in der neuen Zeile 50 in gleicher Weise Zeilennummer und CHR$-Code verändern, können Sie eine weitere Zeile erzeugen, und auf diese Weise das Programm mit geringem Aufwand fertigstellen. Vergleichen Sie zum Schluß noch einmal den gesamten Programmtext und starten Sie es dann. *60* Hier eine kurze Beschreibung, wie das Programm funktioniert: Wahrscheinlich ist Ihnen die Wirkung der meisten Befehle klar, bis auf den Befehl in Zeile 30. Aber lassen Sie uns trotzdem noch einmal kurz den Programmverlauf verfolgen. In Zeile 10 wird der CHR$-Code für ausgedruckt, was das Löschen des Bildschirms bewirkt. In Zeile 10 wird der REVERS-Modus eingeschaltet und 6 Leerstellen werden ausgedruckt, die als Balken in der Zeichenfarbe erscheinen. Beim ersten Durchlauf wird als Farbe die Standardfarbe hellblau auftauchen. Zeile 20 ist unser "Arbeitspferd", hier werden die Zufallszahlen für die Farbwahl erzeugt. Zeile 30 enthält eine Variation der IF ... THEN Anweisung. Die ON ... GOTO Anweisung läßt das Programm verzweigen, wobei die Wahl einer der hinter GOTO aufgeführten Sprungadressen von der Zahl CL abhängt, die zwischen ON und GOTO steht. Hat CL den Wert 1, so wird die erste Sprungadresse gewählt (in unserem Beispiel Zeile 40), hat CL den Wert 4, so wird die vierte Sprungadresse gewählt etc. Die Zeilen 40-190 wandeln nun die Zufallszahlen zwischen 1 und 8 in CHR$-Codes für die Farbwahl um und lassen dann das Programm in die Zeile 10 zurückspringen, wo das Spiel von neuem beginnt. PEEK UND POKE Nun werden wir eine Methode kennenlernen, wie wir uns im Computer "umschauen" können und Informationen an von uns ausgewählte Stellen bringen, um den Computer zu steuern. In derselben Weise, wie man sich die Variablen als "Schachteln" vorstellen kann, in die Information "eingefüllt" werden kann, so kann man sich auch vorstellen, daß die Speicherplätze des COMMODORE 64 solchen "Schachteln" entsprechen. Der Inhalt einiger Speicherplätze hat nun ganz bestimmte Bedeutungen. So gibt es Speicher, wo der Computer "nachschaut", welche Bildschirm- oder Rahmenfarbe eingeschaltet ist, welches Zeichen auf dem Bildschirm angezeigt werden soll, welche Farbe es haben soll, wo es stehen soll usw. Wenn man den Inhalt dieser Speicherplätze ändert, so kann man also auch die oben angeführten Parameter bestimmen. Man kann Farben *61* ändern, Objekte auf dem Bildschirm erscheinen und sich bewegen lassen und sogar Töne erzeugen und zu Musikstücken zusammensetzen. Schreibt man Werte direkt in den Computerspeicher, so geschieht das mit Hilfe des POKE-Befehls. Man sagt deshalb auch, man "poked" einen Wert in eine Speicherstelle. Man kann Speicherstellen etwa auf folgende Art darstellen +-----------+ +-----------+ +-----------+ +-----------+ | 53280 | | 53281 | | 53282 | | 53283 | | X | | Y | | | | | +-----------+ +-----------+ +-----------+ +-----------+ RAHMEN- HINTERGRUND- FARBE FARBE Hier haben wir 4 Speicherplätze dargestellt, von denen zwei die Bildschirm- und Hintergrundfarbe bestimmen. Tippen Sie bitte folgendes ein: POKE 53281,7 Nach dem Drücken der -Taste erhalten wir einen gelben Bildschirm, da wir den Wert "7" - diese Zahl steht für die Farbe "gelb" -, in die Speicherstelle "gepoked" haben, die die Bildschirmfarbe bestimmt. Versuchen Sie dasselbe mit anderen Zahlenwerten. Sie können jede Zahl zwischen 0 und 255 verwenden; sinnvoll sind jedoch nur die Zahlen von 0 bis 15. Der nachstehenden Tabelle können Sie entnehmen, wie die verschiedenen Zahlenwerte den Farben zugeordnet sind. 0 Schwarz 8 orange 1 weiß 9 braun 2 rot 10 hellrot 3 türkis 11 grau 1 4 violett 12 grau 2 5 grün 13 hellgrün 6 blau 14 hellblau 7 gelb 15 grau 3 Nun wollen wir uns verschiedene Kombinationen von Hintergrund- und Rahmenfarben anschauen. Dabei hilft uns folgendes Programm: *62* NEW 10 FOR BA = 0 TO 15 20 FOR BO = 0 TO 15 30 POKE 53280,BA 40 POKE 53281,BO 50 FOR X = 1 TO 500 : NEXT X 60 NEXT BO: NEXT BA RUN Zwei Schleifen werden ineinander geschachtelt, um alle Kombinationen zu erfassen. Die zusätzliche Schleife in Zeile 50 verzögert den ganzen Vorgang nur ein bißchen. Wenn das Programm abgelaufen ist, tippen Sie ein: ? PEEK (53280) AND 15 Als Antwort sollte eine "15" auf dem Bildschirm stehen. Dies ist sinnvoll, da als letzter Wert eine "15" in das RAHMEN-Farbregister geschrieben wurde. Durch die logische Verknüpfung "AND" blenden Sie die Zahlen, die größer als 15 sind, aus. Was das genau bedeutet, läßt sich nur im Rahmen der Arithmetik der binären Zahlen beschreiben. Darauf wird im Kapitel über die "SPRITES" näher eingegangen. Wenn wir nun die Werte, die in den entsprechenden Registern stehen, während des "Farbwechselprogramms" auf dem Bildschirm ausdrucken lassen wollen, müssen wir die folgende Programmzeile hinzufügen: 25 PRINT CHR$(147); "RAHMEN = ";PEEK(53288) AND 15, "HINTERGRUND = "; PEEK (53281) AND 15 BILDSCHIRMGRAFIK Bis jetzt haben wir die Zeichen "sequentiell" auf dem Bildschirm gedruckt, d. h. eins nach dem anderen, es sei denn wir hätten eine neue Zeile eingeschaltet, oder mit "," den Ausdruck formatiert. Den Cursor haben wir bisher durch PRINT-Befehle gesteuert. Damit läßt sich jeder Punkt des Bildschirms erreichen; die Methode ist jedoch im allgemeinen langsam und verbraucht wertvollen Programmspeicherplatz. *63* Aber wie es Speicherplätze im COMMODORE 64 gibt, die die Bildschirmfarben bestimmen, so gibt es auch Speicherplätze, die den verschiedenen Bildschirmpositionen zugeordnet sind. DER BILDSCHIRMSPEICHER Da der Bildschirm unseres Computers aus 25 Zeilen a 40 Zeichen besteht, können wir 1000 Zeichen auf ihm unterbringen und brauchen natürlich genauso viele Speicherplätze, die Informationen darüber enthalten, welche Zeichen sich in den einzelnen Bildschirmpositionen befinden. Wir können uns den Bildschirm als rechtwinkliges Gitter vorstellen (siehe unten), und jeder "Masche" in diesem Gitter entspricht eine SpeicherzelIe. Sie können in diese Speicherzellen Werte zwischen 0 und 255 hineinschreiben ("poken"); welche Zeichen Sie dann an der entsprechenden Stelle auf dem Bildschirm ausgedruckt erhalten, können Sie der Tabelle im Anhang E entnehmen. SPALTE 0 10 20 30 39 1063 | +--------------------------------------------------------+ 1024 | | 0 1064 | | 1104 | | 1144 | | 1184 | | 1224 | | 1264 | | 1304 | | 1344 | | Z 1384 | | E 1424 | | 10 I 1464 | | L 1504 | | E 1544 | | 1584 | | 1624 | | 1664 | | 1704 | | 1744 | | 1784 | | 1824 | | 20 1864 | | 1904 | | 1944 | | 1984 | | 24 +--------------------------------------------------------+ | 2023 Der Bildschirmspeicher des COMMODORE 64 beginnt bei 1024 und geht bis zur Speicherstelle 2023. Die Speicherstelle 1024 entspricht dabei der linken oberen Ecke des Bildschirms und die Adressen nehmen *64* jeweils von links nach rechts zu. Zur weiteren Orientierung betrachten Sie bitte das Schema auf Seite 63. Nehmen wir nun an, Sie wollen einen Ball auf dem Bildschirm hin- und herspringen lassen. Der Ball soll sich zu Beginn etwa in der Mitte des Bildschirms befinden: Spalte 20, Zeile 12. Die zugehörige Speicheradresse wird dann wie folgt berechnet: BILDSCHIRMADRESSE = 1024 + SPALTE + 40 * ZEILE Die Bildschirmadresse unseres Balls hat also den Wert 1024 + 20 + 40 * 12 = 1524 Löschen Sie nun den Bildschirm mit und tippen Sie ein: POKE 1524,81 | | | +--- ZEICHENCODE +------- BILDSCHIRMADRESSE DER FARBSPEICHER Sie haben nun einen Ball in der Mitte des Bildschirms erzeugt. Sie haben dies erreicht, ohne einen PRINT-Befehl zu benutzen; Sie haben direkt einen Wert in den Bildschirmspeicher geschrieben. Der Ball der erschien war hellblau. Es gibt jedoch einen Speicher in Ihrem COMMODORE 64, wo Sie durch Ändern der Speicherinhalte die Farben von einzelnen Zeichen auf dem Bildschirm bestimmen können. Tippen Sie nun folgendes ein: POKE 55796,2 | | | +-- FARBE +------ BILDSCHIRMADRESSE Der Ball wird daraufhin rot. Da Sie außer der Information über das Zeichen in einer bestimmten Bildschirmposition auch eine Farbinformation brauchen, entsprechen jeder Position auf dem Bildschirm zwei Speicherstellen; eine im Bildschirmspeicher und eine im Farbspeicher. Der Farbspeicher beginnt bei 55296 (linke obere Ecke) und hat natürlich, wie der Bildschirmspeicher, 1000 Speicherstellen. *65* SPALTE 0 10 20 30 39 55335 | +--------------------------------------------------------+ 55296| | 0 55336| | 55376| | 55416| | 55456| | 55496| | 55536| | 55576| | 55616| | Z 55656| | E 55696| | 10 I 55736| | L 55776| | E 55816| | 55856| | 55896| | 55936| | 55976| | 56016| | 56056| | 56096| | 20 56136| | 56176| | 56216| | 56256| | 24 +--------------------------------------------------------+ ^ 56295 Die Farbcodes liegen zwischen 0 und 15 und entsprechen denen, die wir benutzt haben, um die Farbe von Hintergrund und Rahmen zu ändern (siehe S. 61). Die Formel zur Berechnung der Farbspeicheradresse ist bis auf den Startwert dieselbe wie bei der Bildschirmadresse: FARBSPEICHERADRESSE = 55296 + SPALTE + 40 * ZEILE EIN WEITERES SPRINGBALLSPIEL Auf dieser Seite ist das Programm eines Ballspiels abgedruckt, das eine entscheidende Verbesserung gegenüber dem früheren Beispiel bedeutet. Es arbeitet nicht mehr mit PRINT-, sondern mit POKE- Befehlen. POKE-Anweisungen lassen sich wesentlich flexibler handhaben und erlauben die Darstellung komplizierter Bewegungsvorgänge auf dem Bildschirm. 10 PRINT"{CLEAR}" : REM CLR/HOME 20 POKE 53280,7 : POKE 53281,0 30 X=1:Y=1 40 DX=1:DY=1 50 POKE 55296+X+40*Y,1 55 POKE 1024+X+40*Y,81 60 FOR T = 1 TO 10 : NEXT *66* 70 POKE 1024+X+40*Y,32 80 X = X+DX 90 IF X = 0 OR X = 39 THEN DX = -DX 100 Y = Y+DY 110 IF Y = 0 OR Y = 24 THEN DY = -DY 120 GOTO 50 In Zeile 10 wird der Bildschirm gelöscht; in Zeile 20 wird als Hintergrundfarbe schwarz und als Rahmenfarbe gelb gewählt. Die Variablen X und Y in Zeile 30 stehen für die Zeile und die Spalte, in der sich der Ball momentan befindet. Die Variablen DX und DY in Zeile 40 geben die horizontale und vertikale Bewegungsrichtung des Balls an. DX = + 1 entspricht einer Bewegung nach rechts, DX = - 1 einer Bewegung nach links, analog entsprechen DY = + 1 bzw. DY = - 1 Bewegungen nach unten bzw. oben. In den Zeilen 50 und 55 wird der Ball in der durch Zeilen- und Spaltennummer bestimmten Position ausgedruckt und in Zeile 60 taucht wieder die bekannte Verzögerungsschleife auf; schließlich wollen wir den Ball auf dem Bildschirm ja auch sehen. In Zeile 70 wird der Ball durch Überschreiben mit einem Leerzeichen ("Space") gelöscht. In Zeile 80 wird durch Addition von DX der Ball in der richtigen Richtung bewegt; das Vorzeichen von DX wird umgedreht, wenn in Zeile 90 festgestellt wird, daß der Ball den linken oder rechten Rand berührt. In den Zeilen 100 und 110 geschieht dasselbe für den oberen und unteren Rand. Die Zeile 120 bewirkt einen Sprung in die Zeile 50, wo der Ball in der neu berechneten Position auf dem Bildschirm ausgegeben wird. Wenn Sie in Zeile 55 die 81 gegen eine andere Zahl austauschen, so können Sie den Ball durch ein beliebiges Zeichen ersetzen. Durch folgende Ergänzung können wir das Programm noch ein bißchen intelligenter machen: 21 FOR L = 1 TO 10 25 POKE 1024+INT(RND(1)*1000),166 27 NEXT L 85 IF PEEK(1024+X+40*Y)=166 THEN DX= -DX:GOTO 80 105 IF PEEK(1024+X+40*Y)=166 THEN DY= -DY:GOTO 100 Die Zeilen 21 bis 27 besetzen zufällig gewählte Bildschirmpositionen mit Hindernissen. In den Zeilen 85 und 105 wird mit Hilfe der PEEK- Funktion geprüft, ob der Ball gegen ein Hindernis stößt; ist dies der Fall, so wird die Bewegungsrichtung geändert. *67* KAPITEL 6 SPRITE GRAFIK ·Was sind SPRITES ·Die Konstruktion von SPRITES ·Binäre Arithmetik *68* EINLEITUNG In den vorhergehenden Kapiteln haben wir gesehen, wie wir mit dem PRINT-Befehl den Bildschirm als Tabelle formatieren können und wie wir mit Hilfe des POKE-Befehls an beliebigen Stellen des Bildschirms Zeichen ausdrucken können. Die Konstruktion von bewegten Darstellungen verursacht mit beiden Methoden einige Schwierigkeiten, da die Objekte aus vorgefertigten grafischen Symbolen zusammengesetzt werden müssen. Weiterhin bringt das Bewegen und Kontrollieren dieser Objekte einen großen Aufwand an Programmierbefehlen mit sich. Durch die begrenzte Zahl von Grafiksymbolen ist man schließlich in der Formgebung der Objekte stark eingeschränkt. Durch die Verwendung von SPRITES fallen die meisten der aufgeführten Probleme weg. Ein SPRITE stellt ein frei programmiertes Objekt in hochauflösender Grafik dar, dem durch BASIC-Befehle jede beliebige Form gegeben werden kann. Durch einfache Angabe der Position kann das SPRITE auf dem Bildschirm verschoben werden. Die nötigen Berechnungen werden vom COMMODORE 64 automatisch intern erledigt. Aber die SPRITES haben noch mehr Vorteile. Ihre Farbe kann geändert werden; der Zusammenstoß zweier SPRITES kann auf einfache Weise registriert werden; ein SPRITE kann sich vor oder hinter einem anderen vorbeibewegen und man kann mit einem Befehl seine Größe verändern. All diesen Vorteilen stehen nur relativ geringe Schwierigkeiten beim Programmieren gegenüber. Zugegeben, Sie müssen noch einiges darüber lernen, wie der COMMODORE 64 arbeitet und wie er Zahlen intern verarbeitet. Aber schließlich ist das doch ganz interessant und auch gar nicht so schwierig; und wenn Sie alle Beispiele sorgfältig durcharbeiten, so werden Sie bald mit selbstkonstruierten SPRITES die verblüffendsten Kunststücke anstellen. *69* DIE KONSTRUKTION VON SPRITES Die Sprites werden von einem speziellen Grafik-Baustein im COMMODORE 64, dem VIC (Video Interface Chip), unterstützt. Die Arbeit, die das Konstruieren der Sprites, das Kontrollieren ihrer Bewegungen und Positionen und die Farbgebung macht, wird zum größten Teil von diesem Chip übernommen. Der Bereich, in dem die Sprites generiert werden, besteht aus 46 Speicherstellen von der Art, wie wir Sie schon bei der Behandlung des Bildschirm- und Farbspeichers kennengelernt haben. Diese Speicherstellen kann man sich in 8 Zellen, sogenannte Bits, unterteilt denken, die einzeln an- und ausgeschaltet werden können und auf diese Weise die Form der Sprites bestimmen. In welchem Zustand (an oder aus) die einzelnen Bits sind, wird durch die Zahl bestimmt, die in das betreffende Register geschrieben wird - doch davon später mehr. Zusätzlich zu diesen speziellen Registern werden wir auch den Hauptspeicher des COMMODORE 64 benutzen, um Informationen über die Form der Sprites zu speichern. In 8 Speicherstellen (direkt hinter dem Bildschirmspeicher) werden Daten abgelegt, die den Computer darüber informieren, in welchem Speicherbereich die Daten für die Sprites gespeichert sind. Wie sind die Sprites nun aufgebaut? Wie Sie wissen, besteht der Bildschirm aus 25 Zeilen zu je 40 Zeichen. Jede der sich daraus ergebenden 1000 Bildschirmpositionen können Sie durch POKE mit einem Zeichen belegen. Diese Zeichen sind jedoch ihrerseits aus einer 8 x 8-Matrix zusammengesetzt. Beim Konstruieren eines Sprites können Sie nun jeden Punkt dieser Matrix einzeln ansprechen und erhalten dadurch eine Auflösung von 320 x 200 (horizontal x vertikal) Punkten für den gesamten Bildschirm. Ein Objekt, daß Sie auf diese Weise zusammensetzen, darf maximal 24 Punkte breit und 21 Punkte hoch sein. Als Beispiel haben wir aus diesem 24 x 21-Punkte-Feld einen Ballon konstruiert, der auf Seite 70 abgebildet ist. Am besten entwerfen Sie das Objekt auf fein gerastertem Papier, auf dem Sie ein 24 Kästchen breites und 21 Kästchen hohes Feld markieren. Zeichnen Sie zuerst die Form so ein, wie Sie Ihnen vorschwebt, und füllen Sie dann die Felder aus, die von den von Ihnen gezogenen Linien geschnitten werden. Nachdem Sie auf diese Weise die Form des Sprites festgelegt haben, müssen Sie diese noch in Daten umwandeln, die der Computer verarbeiten kann. Schreiben Sie zu diesem Zweck (wie in der Abbildung auf Seite 70) an den oberen Rand des 24 x 21-Punkte-Feldes *70* 3 mal hintereinander die Zahlenreihe 128, 64, 32, 16, 8, 4, 2, 1. Die Zeilen des Feldes numerieren Sie von 1 bis 21 durch. Legen Sie sich nun für jede Zeile drei Wertetabellen an, wie sie auf der Seite 71 dargestellt sind. Tabelle 1 entspricht den ersten 8 Positionen einer Zeile in Ihrer Sprite-Darstellung, und die Tabellen 2 und 3 entsprechen den Positionen 9-16 bzw. 17-24. Über die einzelnen Felder Ihrer Wertetabellen schreiben Sie nun wieder die oben angeführte Zahlenreihe von 128 bis 1 (Sie haben sicher schon gemerkt, daß es sich hier um Potenzen von 2 handelt). Wir ordnen nun in unserer Sprite-Zeichnung jedem ausgefüllten Feld die Zahl 1 und jedem leeren Feld die Zahl 0 zu. Dann legen wir für jede Zeile 3 Tabellen an und schreiben die entsprechenden Werte in die einzelnen Felder. GRUPPE |GRUPPE |GRUPPE 1 | 2 | 3 | | 1 1 1 2631 2631 2631 842684218426842184268421 +------------------------+ 1 |.........#######........| 2 |.......###########......| 3 |......#############.....| 4 |......#####...#####.....| 5 |.....#####.###..####....| 6 |.....#####.###.#####....| 7 |.....#####.###..####....| 8 |......#####...#####.....| Z 9 |......#############.....| E 10 |......#############.....| I 11 |......#.#########.#.....| L 12 |.......#.#######.#......| E 13 |.......#..#####..#......| 14 |........#..###..#.......| 15 |........#..###..#.......| 16 |.........#..#..#........| 17 |.........#..#..#........| 18 |..........#####.........| 19 |..........#####.........| 20 |..........#####.........| 21 |...........###..........| +------------------------+ 1 1 2 2 1 5 0 5 0 4 SPALTE Nehmen wir als Beispiel die Zeile 1 des oben dargestellten Sprites. Die ersten 8 Felder sind leer, d. h. unsere Tabelle 1 enthält lauter Nullen. Um daraus eine Zahl zu errechnen, die der Computer verarbeiten kann, müssen wir den Inhalt jedes Feldes der Tabelle mit dem Wert multiplizieren, der über diesem Feld steht und die Produkte addieren. Da alle Felder 0 enthalten, erhalten wir als erstes Datum (Singular von Daten) als Summe eine 0. Die zweite Tabelle der ersten Reihe haben wir auf der nächsten Seite abgebildet: *71* 128 64 32 16 8 4 2 1 +-----+-----+-----+-----+-----+-----+-----+-----+ | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | +-----+-----+-----+-----+-----+-----+-----+-----+ ^ ^ ^ ^ ^ ^ ^ ^ | | | | | | | | 0 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 127 Die dritte Tabelle der ersten Reihe enthält wieder lauter Nullen, die Summe ist also auch 0. Die 1. Reihe unseres Sprites wird also durch die Zahlen 0, 127, 0 beschrieben. Um sie leicht in einem Programm verwerten zu können, schreiben wir sie als sogenannte DATA- Zeile: DATA 0, 127, 0 Als weiteres Beispiel die Daten der zweiten Reihe unseres Sprites: +-----+-----+-----+-----+-----+-----+-----+-----+ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | +-----+-----+-----+-----+-----+-----+-----+-----+ 1 = 1 +-----+-----+-----+-----+-----+-----+-----+-----+ | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | +-----+-----+-----+-----+-----+-----+-----+-----+ ^ ^ ^ ^ ^ ^ ^ ^ | | | | | | | | 128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255 +-----+-----+-----+-----+-----+-----+-----+-----+ | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | +-----+-----+-----+-----+-----+-----+-----+-----+ ^ ^ | | 128 + 64 = 192 Für die Reihe zwei erhalten wir also die DATA-Zeile: DATA 1, 255, 192 Um mit der beschriebenen Methode vertraut zu werden, sollten Sie nun die restlichen 19 DATA-Zeilen selbst berechnen... Nun haben wir die DATA-Zeilen, aber wie kann man sie einsetzen? Tippen Sie das folgende Programm ein und starten Sie es: (Wenn Sie näheres über den DATA- und den dazugehörigen READ-Befehl wissen wollen, schauen Sie bitte in Kapitel 8 nach.) 1 REM UP, UP, AND AWAY! 5 PRINT "{CLEAR}" 10 V = 53248 : REM BASISADRESSE DES VIC 11 POKE V+21,4 : REM SPRITE 2 AKTIVIEREN 12 POKE 2042,13 : REM DATEN FUER SPRITE 2 AUS BLK 13 20 FOR N = 0 TO 62 : READ Q : POKE 832+N,Q : NEXT | +-- holt die Informationen aus den DATA-Zeilen 30 FOR X = 0 TO 200 40 POKE V+4,X : REM NEUE X-KOORDINATE 50 POKE V+5,X : REM NEUE Y-KOORDINATE 60 NEXT X 70 GOTO 30 *72* +--- Hier stehen die Informationen für Q | 200 DATA 0,127,0,1,255,192,3,255,224,3,231,224 210 DATA 7,217,240,7,223,240,7,217,240,3,231,224 220 DATA 3,255,224,3,255,224,2,255,160,1,127,64 230 DATA 1,62,64,0,156,128,0,156,128,0,73,0,0,73,0 240 DATA 0,62,0,0,62,0,0,62,0,0,28,0 Wenn Sie alles richtig eingetippt haben, fliegt ein Ballon ruhig über den Himmel. Um das Programm zu verstehen, müssen Sie wissen, welche Speicher- stellen (auch Register genannt) welche Funktionen kontrollieren. Sie können das der folgenden Tabelle entnehmen: Register Beschreibung 0 X-Koordinate von Sprite 0 1 Y-Koordinate von Sprite 0 2-15 Bedeutung paarweise wie 0 und 1 für die Sprites 1 bis 7 16 Höchstes Bit - X-Koordinate 21 1 = Sprite erscheint; 0 = Sprite verschwindet 29 Sprite wird in X-Richtung vergrößert 23 Sprite wird in Y-Richtung vergrößert 39-46 Farben der Sprites 0-7 [Bild des Ballon auf dem Bildschirm] *73* Sie müssen außerdem wissen, in welchem 64er Block die Daten eines bestimmten Sprites abgespeichert sind. Diese Daten stehen in den 8 Registern direkt hinter dem Bildschirmspeicher. +------+------+------+------+------+------+------+------+ | 2040 | 2041 | 2042 | 2043 | 2044 | 2045 | 2046 | 2047 | +------+------+------+------+------+------+------+------+ ^ ^ ^ ^ ^ ^ ^ ^ | | | | | | | | SPRITE 0 1 2 3 4 5 6 7 Nun wollen wir Schritt für Schritt durchgehen, wie wir unsere Sprites auf den Bildschirm bringen und verschieben können. 1. Poken Sie in die Speicherstelle 21 den "richtigen Wert" (siehe nächste Seite) damit das von Ihnen gewählte Sprite auf dem Bildschirm erscheint. 2. Lassen Sie den Sprite-Pointer (auch "Zeiger") auf die Speicherstelle zeigen, von der ab die Daten des Sprites gelesen werden sollen. 3. Schreiben Sie mit POKE die Daten in diese Speicherstellen. 4. Konstruieren Sie mit einer Schleife die X- und Y-Koordinaten für die Bewegung des Sprites. 5. Sie können zusätzlich die Farben des Sprites oder seine Größe (in X-oder/und Y-Richtung) ändern. Die Parameter für die Größenänderung stehen in den Speicherstellen 29 und 23. Einige Punkte des Programms könnten trotz der vorangegangenen Erläuterungen noch unklar sein. Zeile 10: V = 53248 Die erste Speicheradresse des Video-Chips wird unter V abgespeichert. Zu diesem Wert braucht nur noch die Nummer des Registers addiert zu werden, um die absolute Speicheradresse zu erreichen. Zeile 11: POKE V+21,4 Dieser Befehl läßt Sprite Nr. 2 auf dem Bildschirm erscheinen. Der Grund dafür ist, daß im Feld 2 der zugehörigen Tabelle eine 1 steht, wenn in das zugehörige Register eine 4 geschrieben wird. 128 64 32 16 8 4 2 1 <--- zugehörige Werte 7 6 5 4 3 2 1 0 <--- Sprite-Nummern +---+---+---+---+---+---+---+---+ 21 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | = 4 +---+---+---+---+---+---+---+---+ ^ |____ Eine 1 für den gewünschten Sprite *74* Jedes Sprite ist im Register 21 repräsentiert, und der Wert 4 im Register entspricht dem Sprite 2. Sprite 3 würde einer 8 entsprechen, beide Sprites zusammen dem Registerinhalt 12 (= 8 + 4). Wenn Sie also die Sprites 2 und 3 "einschalten" wollten, müßten Sie den Befehl POKE V + 21, 12 in Ihr Programm aufnehmen. Zeile 12: POKE 2042,13 Der Computer wird angewiesen, die Daten für Sprite Nr. 2 (entspricht Speicherstelle 2042) aus Block 13 des Speichers auszulesen. Ein Sprite "verbraucht" den Inhalt von 63 Speicherstellen oder 63 Bytes. Der Inhalt einer Tabelle, wie wir sie zur Ermittlung der DATA-Zeilen zusammengestellt haben, entspricht einem Byte. Da wir 63 solcher Einheiten brauchen (in jeder der 21 Zeilen 3 Tabellen) müssen wir zur Konstruktion eines Sprites 63 Speicherstellen auslesen. Dies geschieht auf folgende Weise: 28 FOR N = 8 TO 62: READ Q: POKE 832+N,Q: NEXT Durch diese Schleife werden 63 Bytes Daten in den 13. Block (1 Block = 64 Bytes) des Speichers eingelesen, der bei der Adresse 832 (= 13*64) beginnt. 30 FOR X = 0 TO 200 40 POKE V+4,X <---- X-Koordinate von Sprite 2 50 POKE V+5,X <---- Y-Koordinate von Sprite 2 Da die Register 4 und 5 die X- und Y-Koordinaten des Sprites 2 enthalten, bewirkt dieser Programmteil (natürlich nur zusammen mit einem NEXT), daß sich das Sprite 2 diagonal über den Bildschirm bewegt. Da der Koordinatenursprung in der linken oberen Ecke liegt, verläuft die Bewegung von links oben nach rechts unten. Der Computer liest die Daten schnell genug, um die Bewegung kontinuierlich erscheinen zu lassen. Näheres zu diesem Thema steht im Anhang 0. Wenn sich mehrere Sprites über den Bildschirm bewegen sollen, wird jedem Objekt ein eigener Speicherbereich zugeordnet. Die Zeile 70 bewirkt einen Rücksprung nach 30, wodurch der ganze Vorgang wiederholt wird. Der Rest des Programms besteht aus DATA- Zeilen, die die Information über die Form des Ballons enthalten. Fügen Sie nun folgende Zeile zu dem Programm hinzu und starten Sie es erneut: 25 POKE V+23,4: POKE V+29,4: REM EXPAND *75* Der Ballon ist jetzt in X- und Y-Richtung doppelt so groß wie vorher. Der Grund dafür ist, daß die Zahl 4 (für Sprite Nr. 2) in die Register 23 und 29 geschrieben wurde. Es ist wichtig zu berücksichtigen, daß die linke obere Ecke des Sprites beim Vergrößerungsvorgang an ihrem Platz bleibt. Um unser Programm noch interessanter zu machen, fügen wir folgende Zeilen hinzu: 11 POKE V+21,12 12 POKE 2042,13: POKE 2043,13 30 FOR X = 1 TO 190 45 POKE V+6,X 55 POKE V+7,190-X Ein weiteres Sprite (Nummer 3) ist auf dem Bildschirm erschienen, da wir in das Register 21 eine 12 gepoked haben. Die 12 schaltet die 2 und die 3 ein, da 12 = 00001100 ist. Durch die Zeilen 45 und 55 wird Sprite 3 auf dem Bildschirm bewegt. Die Speicherstellen V+6 und V+7 enthalten die X- und Y-Koordinaten des Objekts. Wenn Sie wollen, daß am Himmel noch ein bißchen mehr los ist, dann bringen Sie an Ihrem Programm die folgenden Ergänzungen an. 11 POKE V+21,28 12 POKE 2042,13: POKE 2043,13: POKE 2044,13 25 POKE V+23,12: POKE V+29,12 48 POKE V+8,X 58 POKE V+9,100 Durch den POKE-Befehl in Zeile 11 wurde ein weiteres Sprite auf den Bildschirm gebracht, da in die Position 4 des Registers 21 eine 1 geschrieben wurde. Dieser Position entspricht die Dezimalzahl 16, zusammen mit der 12, die schon im Register stand, ergibt das 28. Nun sind Sprite 2-4 eingeschaltet (00011100 = 28). In Zeile 12 wird festgelegt, daß alle drei Sprites ihre Daten dem 13. Speicherblock entnehmen. In Zeile 25 werden die Sprites 2 und 3 (daraus ergibt sich die Zahl 12) in X- (V+29) und Y-Richtung (V+23) auf das Doppelte vergrößert. Zeile 48 bewirkt, daß sich Sprite 3 in Richtung der X-Achse bewegt. Da in Zeile 58 für die Y-Koordinate der konstante Wert 100 vorgegeben wird, bewegt sich Sprite 3 nur horizontal. *76* NOCH EINIGE BEMERKUNGEN ZU SPRITES Mit Hilfe derselben Kodierungen (0-15) wie bei den Zeichenfarben (siehe Kapitel 5 oder Anhang G) können Sie die Sprites in 16 verschiedenen Farben darstellen. Wenn Sie z. B. dem Sprite Nr. 1 die Farbe grün geben wollen, so müssen Sie folgenden Befehl eintippen: POKE V+40,13 (mit V = 53248). Sie werden vielleicht beim Ausprobieren des Beispielprogramms bemerkt haben, daß die Sprites nie den rechten Bildschirmrand erreichen. Der Grund dafür ist, daß die Bildschirmbreite 320 Punkten entspricht, das X-Register jedoch nur Werte zwischen 0 und 255 enthalten kann. Wie kann man nun ein Objekt dazu bringen, sich über den gesamten Bildschirm zu bewegen? Man benutzt zu diesem Zweck das Register Nr. 16, über dessen Funktion Sie der Tabelle im Anhang N entnehmen können, daß darin das "höchste Bit", auch MSB = Most Significant Bit genannt, gespeichert ist. Das ist folgendermaßen zu verstehen: Ist das n-te Bit in diesem Register gesetzt, so befindet sich das n-te Sprite in einer Bildschirmposition, die einem X-Wert > 255 entspricht. Der aktuelle X-Wert ergibt sich dann, wenn man zu dem Wert, der im X-Register steht, 256 hinzuzählt. Soll z. B. das Sprite Nr. 2 eine X-Position zwischen 256 und 320 einnehmen, so muß im Register Nr. 16 das zweite Bit gesetzt werden. Da 22=4, müssen wir in dieses Register eine 4 poken: POKE V+16,4 Nun zählen wir den Inhalt des X-Registers, das zum Sprite Nr. 2 gehört (das ist Register Nr. 4) von 0 bis 63 hoch. Auf diese Weise erreichen Sie die restlichen X-Werte von 256-319. Sie begreifen das ganze Konzept am besten, wenn Sie das folgende Programm analysieren, das eine leicht abgeänderte Version unseres bisherigen Sprite-Programms darstellt: 10 V = 53248 : POKE V+21, 4 : POKE 2042, 13 20 FOR N = 0 TO 62 : READ Q : POKE 832+N, Q : NEXT 25 POKE V+5, 100 30 FOR X = 0 TO 255 40 POKE V+4, X 50 NEXT 60 POKE V+16, 4 70 FOR X = 0 TO 63 *77* 80 POKE V+4, X 90 NEXT 100 POKE V+16, 0 110 GOTO 30 200 DATA 0,127,0,1,255,192,3,255,224,3,231,224 210 DATA 7,217,240,7,223,240,7,217,240,3,231,224 220 DATA 3,255,224,3,255,224,2,255,160,1,127,64 230 DATA 1,62,64,0,156,128,0,156,128,0,73,0,0,73,0 240 DATA 0,62,0,0,62,0,0,62,0,0,28,0 In Zeile 60 wird das MSB für Sprite Nr. 2 gesetzt. In Zeile 70 beginnt die Schleife, die das Sprite zum rechten Bildschirmrand wandern läßt. Die Zeile 100 ist ebenfalls wichtig, da hier das MSB wieder "abgeschaltet" wird, so daß die Bewegung wieder am linken Bildrand starte