iiliJaLJ
09 «
WmV0£Q6
ISBN 3-921682-45-2
Es kann keine Gewähr dafür übernommen werden, daß die in diesem
Buche verwendeten Angaben, Schaltungen, Warenbezeichnungen und
Warenzeichen, sowie Programmlistings frei von Schutzrechten Dritter
sind. Alle Angaben werden nur für Amateurzwecke mitgeteilt. Alle
Daten und Vergleichsangaben sind als unverbindliche Hinweise zu ver¬
stehen. Sie geben auch keinen Aufschluß über eventuelle Verfügbar¬
keit oder Liefermöglichkeit. In jedem Falle sind die Unterlagen der
Hersteller zur Information heranzuziehen.
Nachdruck und öffentliche Wiedergabe, besonders die Übersetzung
in andere Sprachen verboten. Programmlistings dürfen weiterhin nicht
in irgendeiner Form vervielfältigt oder verbreitet werden. Alle Pro¬
grammlistings sind Copyright der Fa. Ing. W. Hofacker GmbH. Verbo¬
ten ist weiterhin die öffentliche Vorführung und Benutzung dieser Pro¬
gramme in Seminaren und Ausstellungen. Irrtum, sowie alle Rechte
Vorbehalten.
COPYRIGHT BY ING. W. HOF ACKER © 1979, Postfach 75 437,
8000 München 75
1. Auflage 1979
Gedruckt in der Bundesrepublik Deutschland — Printed in West-Ger-
many — Imprime' en RFA.
PROGRAMMIEREN
MIT
Dieses Buch ist eine Produktion des Ing. W. Hofacker GmbH Verlages. Die Pro¬
duktion erfolgte unabhängig von TANDY Radio Shack und ihren weltweiten Nie¬
derlassungen.
Die Fa. Radio Shack ist eine Division der Fa. TANDY Corporation mit über 7000
Geschäften in 9 Ländern. Zentralbüro in Deutschland, Düsseldorf, Immermannstr.
Literatur* und Quellenverzeichnis
Library 100, eine Software-Bibliothek auf Cassette mit Beschreibung
Hersteller: The Botton Shelf Inc.
P.O.Box 94104
Atlanta, Georgia 30359
Vertrieb in Deutschland: Hofacker Verlag
Technical Manual RadioShack
80 US, A Journal for the TRS-80 von 80-NW Publishing, Tacoma USA
Deutscher Exklusivvertrieb: Hofacker Verlag
TRS-80 ist ein Warenzeichen der Fa. TANDY Corporation in Forth
Worth, Texas.
Deutsche Zentrale:
TANDY Corporation
Immermannstr. 57
4000 Düsseldorf
Tel.: 0211/353617/18
Level II BASIC Reference Manual, Radio Shack
Autorenprofil
Martin Stübs, 1946 als Sohn deutsch/englischer Eltern in London ge¬
boren, studierte in Hamburg einige Semester Physik, bis er seine eigent¬
liche Neigung entdeckte, die literarische Beschäftigung mit Technik
und Wissenschaft. Seit 1974 gehört Stübs als Technik-Redakteur der
Redaktion einer Wirtschaftszeitung mit kommunaler Zielsetzung an.
Daneben liefert er technisch orientierte Beiträge für andere Publika¬
tionen. Seit kurzem gehört sein Interesse auch dem Heimcomputer,
der sich nach dem Verständnis des Autors zu einem alltäglichen, ohne
zuviele Kenntnisse vom technischen Innenleben verwendbaren Haus¬
haltsgegenstand entwickeln sollte.
Inhaltsverzeichnis
Einleitung.01
„Der äußere Anschein".02
Die Benutzung des Cassettenrecorders.06
Signalfilter.09
Dastechnische Innenleben desTRS-80.13
Das Betriebssystem des TRS-80.18
Das RADIO SHACK Level II BASIC.22
Numerische Variable.29
Zeichenreihen (Strings)..31
Variablen-Namen.32
Bestimmung der Variablen-Typen. 33
Ein- und Ausgabe.39
INKEY$.40
ON ERROR GOTO.45
Die Graphik des TRS-80.48
Mathematik und Logik.50
Besonderes.53
Nachahmen der INPUT-Anweisung mit INKEY$.60
Ein Fehler im Level II BASIC.62
Ungenauigkeiten bei der Addition.63
Name.66
Abkürzungen im Radio Shack Level II BASIC.67
Platzsparendes Programmieren von Graphik-Zeichenketten.69
Programmieren in Maschinensprache und Assembler.72
Das TRS-80 Floppy Disk-System.80
Der Erweiterungs-Ausgang des TRS-80 (Expansion Port).83
Verbindungen zur Außenwelt.88
Erweiterung des RAM-Bereichs im TRS-80.90
Modifizierung des READ-Vorgangs.93
Programme.96
Programmauswahl.98
Die Türme von Hanoi. 99
Dateneingabe mit DATA.102
Ballistik.104
Labyrinth.106
Wissenschaftliche Notation.111
Biorhythmen.115
Raumjäger.122
Buchstaben hochschießen.125
Pferderennen.127
Reaktionstest.130
Die Springer-Tour.133
Stingray.137
Zahlen Ordnen.140
Geräusche und Musik. 142
Geräusche.145
Musik.148
Byte-Zerlegung von Zahlen.152
Geräuschprogramm ohne Maschinenprogramm-Speicherbereich ... 154
Abgezinste Geldmengen.158
Rückzahlung eines Darlehens in gleichen Raten.160
Effektivzins.163
Tilgungsdauer.166
Kreuz und Quer.168
Rechtecke.169
Umwandlung Dezimalzahlen — Hexadezimalzahlen.171
Ein- und zweidimensionale Matrix.173
Geburtstage am gleichen Tag.175
Snoopy.176
Autorennen.180
Balkengraphik.184
Startrek.189
Vorwort
„Vom Standpunkt der Kybernetik betrachtet, ist die Welt ein Ort des
Werdens, in der Wissen seinem Wesen nach der Vorgang des Erkennens
ist“. Diese Worte stammen sinngemäß von Professor Norbert Wiener,
dem 1964 verstorbenen Begründer der Kybernetik als Lehre der In¬
formation und Steuerung und damit einer der Urväter der elektroni¬
schen Datenverarbeitung.
Der Gedanke steht im Zusammenhang mit einer um die Jahrhundert¬
wende eingeleiteten, auch philosophischen Abkehr von einem star¬
ren, festgefügten Weltbild, wie es sich auch in dem streng determini¬
stischen Physikmodell Newtons manifestierte. Für die damals neue Vor¬
stellung von der inhärenten Unbestimmtheit aller Vorgänge in der Welt
ist vielleicht die Heisenbergsche Unschärfe-Relation das deutlichste
Sinnbild. Wieners Verdienst ist es, die zuvor als lästige Unzulänglich¬
keiten verstandenen Meßungenauigkeiten in der Praxis der Ingenieure
als unlösbar mit dem jeweils betrachteten System verbunden erkannt,
und bewußt in den beabsichtigten Steuerungsprozeß einbezogen zu
haben.
Norbert Wieners wissenschaftliche Arbeit bildet auch eine der Wurzeln
für eine heute allen geläufige Vorstellung — nämlich von der überra¬
genden Bedeutung der Information bei allen irgendwie geordneten Sy¬
stemen. Für unser tägliches Leben bedeutet dies: Im Mittelpunkt unse¬
rer Gesellschaft steht der Informationsaustausch, die Kommunikation.
Alles spricht heute von „der Energiekrise“, — als ob es in der mensch¬
lichen Geschichte noch nie Energiekrisen gegeben hätte! Das Gegenteil
ist der Fall. Doch „unsere" Energiekrise unterscheidet sich in einem
wesentlichen Aspekt von allen vorherigen. Frühere Verknappungen
wurden jeweils durch Entdeckung und Ausbeutung eines neuen Ener¬
gieträgers überwunden — so zum Beispiel zu Anfang der ersten indu¬
striellen Revolution in England die Kohle, die das immer knapper wer¬
dende Holz ablöste. Dies will uns, die wir erstmals die Begrenztheit der
Weltvorräte erfahren, nicht mehr so einfach gelingen
Einen wesentlichen zukunftsträchtigeren Weg als alle Energiesparpläne
und Kernkraftwerk-Bauprogramme könnte uns die Mikroelektronik
bereits gezeigt haben, ohne daß wir dies schon erkannt hätten: Die
schier unglaubliche, noch keineswegs abgeschlossene Verbilligung der
Halbleiterfunktionen läßt sich auch verstehen als Abkehr von Energie
und Materie überhaupt. Information läßt sich — mit menschlicher
Mühe — beliebig vermehren und, wenn erst einmal erzeugt, fast unend¬
lich oft kopieren. Auf diesem Gebiet wird man bis ans Ende der
Menschheit nicht auf Grenzen stoßen.
Nun ist die Erforschung der Informationslehre beileibe nichts Neues.
Vom großen Mathematiker und Philosoph Leibnitz haben wir ein mit
dem 15. März 1679 datiertes, also gerade 300 Jahre altes Manuskript,
in dem die Theorie der binären Zahlen entwickelt wird. Vielleicht
könnte man es aber als Fügung des Schicksals deuten, daß elektronische
Informationsverarbeitung gerade in dem Augenblick wirklich verfügbar,
das heißt in großer Breite anwendbar wird, in dem die Lösung der Pro¬
bleme unserer Zivilisation nicht mehr einfach noch größerem Einsatz
von Energie und Rohstoffen überlassen werden kann.
In großer Breite anwendbar sein heißt natürlich auch, im täglichen Le¬
ben jedes Einzelnen eine Rolle spielen. Und was kann da nützlicher
sein, als sich aktiv mit der neuen Technik zu beschäftigen, anstatt zu
warten, bis sie von selbst auch in das eigene Leben eindringt? Ganz
abgesehen von dem praktischen Nutzen oder auch einfach dem Ver¬
gnügen, das sich mit der Arbeit mit einem Microcomputer erzielen
läßt — diese Maschinen könnten jedem Privatmann die Möglichkeit
geben, eine Vorstellung der Mittel und Wege zu gewinnen, auf denen
künftige Probleme der Menschheit gelöst werden müssen.
Was Computerfachleuten bereits geläufig ist, könnten, ja sollten Micro¬
computer jedem vermitteln: Die Denkweise, die zur maschinellen In¬
formationsverarbeitung gehört. Logisches, zielorientiertes Denken ist
beim Menschen eng mit der Sprache verknüpft. Dies ist auch ein Grund
dafür, daß die einzelnen Bereiche menschlicher Betätigung mit eigenen
Fachsprachen verbunden sind. Sie stärken nicht nur das Zusammenge¬
hörigkeitsbewußtsein der mit dem Fachgebiet beschäftigten, sondern
bilden vielfach auch erst das „Handwerkszeug" zur Formulierung der
Gedankengänge, die für das jeweilige Fachgebiet typisch sind.
Gleiches gilt auch für die Computertechnik: Mit dem Lernen einer Pro¬
grammiersprache erwirbt man mehr als nur die Fertigkeit zur Bedienung
einer Maschine. Man macht sich die Denkweisezu eigen, die es erlaubt,
Informationsprobleme von Maschinen lösen zu lassen. Und eines ist
sicher: Immer mehr solcher Aufgaben werden künftig Maschinen über¬
nehmen — auch im privaten Bereich jedes Einzelnen.
Einleitung
Immer neue Bereiche unseres täglichen Lebens werden von der Micro-
prozessor-Technik beeinflußt, die durch die immer dichtere Packung
elektronischer Schaltkreise zu höchstintegrierten Schaltungen möglich
wurde. Eines der faszinierendsten Produkte dieser neuen Technik sind
die Microcomputer, die als Heimcomputer der elektronischen Daten¬
verarbeitung Anwendungen im häuslichen Bereich erschlossen und
sogar die Beschäftigung mit Computern als Hobby ermöglicht haben.
Gegenstand dieses Buches ist der Microcomputer TRS-80 von RADIO
SHACK, der in geradezu idealer Weise kostengünstigen Einstig in die
aufregende Welt des Elektronenrechners mit der Ausbaufähigkeit zu
einem kommerziell einsetzbaren System in sich vereinigt. Angesprochen
werden soll der Leser, den weniger das technische Innenleben der Ma¬
schine als seine - nicht geringen - Möglichkeiten im häuslichen Be¬
reich, für Schule, Studium, private Finanzen und zum Zeitvertreib in¬
teressieren. Um das Feld des echten Heimcomputers nicht zu verlassen,
soll dabei im wesentlichen eine Beschränkung auf die bis zu der Preis-
Schallgrenze" DM 3.000,- erhältliche Geräte-Konfiguration gelten:
Die Computereinheit, ausgerüstet mit dem bereits recht kommerziel¬
len BASIC Level II, 4 oder 16K freie Speicherkapazität sowie Sicht¬
gerät, Cassettenrecorder als Massenspeicher und Stromversorgung.
Daneben liegt bei der Beschreibung der anschließbaren Peripheriege¬
räte das Gewicht auf den für private Anwender interessanten Möglich¬
keiten. Beim Leser vorausgesetzt werden Grundkenntnisse in der Pro¬
grammiersprache BASIC. Im übrigen bemüht sich das Buch um mög¬
lichst einfache, verständliche Darstellungsweise. Das „Computer-
Fachchinesisch" soll nur dort verwendet werden, wo es auch beim
besten Willen nicht zu vermeiden ist.
Anders als manch anderes Microcomputer-System kann sich der TRS-80
einer ungewöhnlich ausführlichen und gut geschriebenen Betriebsan¬
leitung rühmen. Schon aus Platzgründen wird es sich dieses Buch er¬
sparen, die dort zu findenden Informationen zu wiederholen, wo sich
das vermeiden läßt. Allerdings soll auf einige Fehler aufmerksam ge¬
macht werden, die sich in das Werk eingeschlichen haben und dem An¬
wender im einen oder anderen Fall Kummer bereiten könnten.
1
„Der äußere Anschein“
Gleich zu Anfang, wenn man stolzer Besitzer eines TRS-80 geworden
ist, wird man mit den wichtigsten Eigenheiten des Microcomputer-Sy-
stems konfrontiert: Erwartungsvoll öffnet man die Wellpappe-Kiste und
findet - für die lange Reise aus den USA nach Deutschland sorgfältig
verpackt — nicht ein Gerät wie bei vergleichbaren anderen Fabrikaten,
sondern ein wahres Sammelsurium von verschiedenen Dingen. Da ist
zunächst einmal der Computer selbst: Ein flaches, 42 cm langes und
21 cm breites Gehäuse, in der eine einzelne Platine untergebracht ist.
Auf der Oberseite befindet sich die Tastatur und zwar eine echte
Schreibmaschinentastatur mit griffigen Tasten, die einen guten Druck¬
punkt haben. Wenn man mit deutschen Schreibmaschinen vertraut ist,
wird hier allerdings etwas Umgewöhnung fällig . Wie bei großen und
kleinen Computern üblich, hat der TRS-80 eine Tastatur nach englisch¬
amerikanischer Norm. Das heiß, Z und Y sind vertauscht und die Um¬
laute Ä, Ö und Ü fehlen. Dafür gibt es neben vier nach oben, unten
rechts und links weisenden Pfeilen auch noch die üblichen Sonder¬
zeichen #, * und @, die im BASIC (und in einem Fall gerade im RADIO
SHACK-BASIC) besondere Funktionen haben. Doch davon später
mehr. Eine Anmerkung: # ist im Amerikanischen die Abkürzung
für „Nummer", entspricht also unserem „Nr.". In Programmbeschrei¬
bungen, Texten u. s. w. taucht dies nicht selten auf.
Neben der normalen Tastatur ist bei neueren TRS-80 Computern ein
zusätzliches Zahlen-Tastenfeld angeordnet. Besitzer eines älteren Mo¬
dells, das darüber noch nicht verfügt, können ihr Gerät zu einem ei¬
nigermaßen günstigen Preis nachrüsten.
Die einzelnen Tasten arbeiten mit mechanischen Kontakten - lei¬
der eine deutliche Schwachstelle des Systems, denn sie neigen sehr
stark zum Prellen: Statt des gewünschten Buchstabens bzw. der Zahl
stehen plötzlich zwei davon auf dem Bildschirm oder ganz andere.
Am schlimmsten ist es, wenn, was nicht selten passiert, irgendwelche
über die Tasten ausführbare Funktionen ungewollt eingegeben wer¬
den. Gerade beim Programmieren kann sich dies als äußerst lästig
erweisen. Als Abhilfe bietet TANDY ein kurzes Maschinenprogramm
an, das Prellen unterdrücken soll. (Man hat also zumindest das Pro¬
blem erkannt). Doch müßte es jedesmal vor Beginn der eigentlichen
Tätigkeit eingelesen werden, was ja ebenfalls einen Zeitverlust bedeu¬
tet.
2
Die gleiche Wirkung dürfte zu erzielen sein, wenn man die Kontakte mit
Kontaktöl einsprüht. Allerdings muß das Gehäuse dazu geöffnet wer¬
den, was sich während der Garantiezeit nicht unbedingt empfiehlt.
An der Rückseite des Computergehäuses findet man (von hinten ge¬
sehen) links drei Diodenbuchsen (fünfpolig, nach DIN) und den Schal¬
ter für die Stromzufuhr. Rechts ist unter einer abnehmbaren Klappe der
40-polige Bus-Anschluß zur Verbindung mit dem Zusatzteil (expansion
interface) sowie der RESET-Knopf angeordnet, den man betätigen
kann, wenn ein Programm oder eine andere Tätigkeit des Computers
aus irgendeinem Grund steckengeblieben ist. (Häufigster Fall ist hier
das mißglückte Laden eines Programms von dem Cassettengerät). Mit
den drei DIN-Buchsen wird die Verbindung zur Stromversorgung,
zum Bildschirmmonitor und zum Cassettengerät hergestellt, und man
kann dem Hersteller nur danken, daß er diese Anschlußssysteme ge¬
wählt hat. So werden gewisse einfache Anwendungen bzw. Erweite¬
rungen des Computers für die Anwender zu einer außerordentlich
simplen, preisgünstigen Angelegenheit. Davon soll später noch die
Rede sein.
TRS-80 mit Drucker
3
Obwohl der Hersteller sich das wohl nicht so gedacht hat, lassen sich
Zusatzgeräte mit Hilfe eines 40-poligen Platinensteckers auch direkt
an den Computer anschließen, also unter Umgehung des Zusatzteils,
der viele, über den Bedarf des privaten Computerbesitzers meist hinaus¬
gehende Funktionen in sich vereinigt und daher auch nicht gerade
billig ist. Beispiele dafür sind auch in diesem Buch zu finden. Etwas
unglücklich ist die Anordnung der beiden Schalter für Stromversor¬
gung und RESET. Ihr versteckter Platz erklärt sich daher, daß sie eben¬
falls direkt auf der Platine montiert sind. Dies entsprang sicherlich dem
Wunsch nach möglichst kostensparender Herstellung des Computers.
Dies ist zwar auch ganz im Sinne des Käufers, doch hätte man sich doch
lieber zwei günstiger plazierte Schalter gewünscht.
Ähnliche Gedankengänge drängen sich auf, wenn man den Video-Mo¬
nitor (29 cm Diagonale) betrachtet, der als zweiter größerer Bestand¬
teil des Computersystems geliefert wird. Zwar entspricht das Gehäuse-
Design ganz der TRS-80-Linie, doch ist die Verwandschaft mit einem
tragbaren Fernseher deutlich zu sehen. Sogar der Platz für die Te¬
leskopantenne an der Gehäuserückwand ist noch vorhanden. Und bei
der Anpassung an die neue Aufgabe scheint man ebenfalls recht sparsam
vorgegangen zu sein:
Bei ungünstiger Aufstellung neigt die Bildschirmeinheit nach einiger
Betriebszeit zu recht störendem Brummen.
Die Verbindung zwischen Computereinheit und Bildschirm einerseits
und Cassettenrecorder andererseits stellen wie schon erwähnt verschie¬
dene Kabel her. Dazu kommt noch der Anschluß des Computers an
sein — getrenntes — Netzgerät. Bildschirm und Rekorder haben außer¬
dem je einen eigenen Netzanschluß — alles in allem ein ziemlicher Ka¬
belsalat, dessen Bändigung anfangs einige Mühe macht. Gerade die
drei (I) Netzstecker bereiten einige Probleme: Zum Schutz vor unge¬
wollten Stromunterbrechungen sollten sie so sicher wie nur möglich
angeordnet werden, doch ging die Sparsamkeit des Herstellers so
weit, daß für die Computereinheit kein Netzschalter vorhanden ist.
Nach Gebrauch müssen also vorsichtshalber alle Stecker gezogen wer¬
den, und das geht natürlich nicht, wenn sie allzu weit aus dem Wege
sind. Gute Dienste leistet hier sicher eine Mehrfachsteckdose mit ein¬
gebautem Schalter, die man aus Platzgründen wohl am besten an der
Seite des Tisches anbringt, auf dem der Computer seinen Platz hat.
4
Einen großen Vorteil hat die Bauart des TRS-80 mit getrennten Ein¬
heiten übrigens: Sie ermöglicht die freie Anordnung von Tastatur und
Bildschirm zueinander — ganz nach den jeweiligen Platzverhältnissen
und dem Geschmack des Benutzers. Grenzen setzen hier allerdings
die geringe Länge der Verbindungskabel, doch läßt sich dieses Hinder¬
nis sehr leicht überwinden: Dazu sind nichts weiter nötig als Ver¬
längerungskabel mit fünfpoligen Steckern und Buchsen nach DIN.
Die Wahl dieser in Deutschland so gebräuchlichen Verbindungsart durch
TANDY zahlt sich also schon hier für den TRS-80 Besitzer aus.
In gleicher Weise kann man den Cassettenrecorder und die Stromver¬
sorgung für den Computer zum Beispiel bequem in einer Schreib¬
tischschublade verstauen. Die Kabel werden dabei am besten unauf¬
fällig durch entsprechende Bohrungen in der Rückwand des Schreib¬
tisches geführt. Doch sollte man dies mit dem Cassettengerät erst dann
tun, wenn man mit dem Datenaufzeichnen und -überspielen einige
Übung gewonnen hat. In einem Schubfach ist das Gerät eben nicht
ganz so leicht zu bedienen. Vermeiden sollte es der TRS-80-Freund,
Rekorder und Computer-Stromversorgung in unmittelbarer Nähe zu¬
einander anzuordnen: Es ist nicht auszuschließen, daß magnetische
Streufelder vom Transformator der Stromversorgung den Recorder
stören.
In das Innenleben des Microcomputers scheinen sich die eben be¬
schriebenen, eher äußerlichen Unzulänglichkeiten nicht forzusetzen,
und das ist für den ernsthaften Benutzer wohl am wichtigsten. Man
kann ziemlich fest auf die einwandfreie Funktion des Gerätes ver¬
trauen. Eine Ausnahme bildet vielleicht die Benutzung des Cassetten-
recorders. Davon soll noch die Rede sein - außerdem ist das Cassetten¬
gerät streng genommen auch kein Bestandteil des Computers. Auch
hinter scheinbar unerklärlichen Fehlern steckt jedenfalls erfahrungsge¬
mäß kein Schaden am Gerät, sondern ein Programmier- oder Bedie¬
nungsfehler. Wie noch zu erläutern sein wird, finden sich in der Pro¬
grammiersprache Radio Shack Level II BASIC, die hier verwendet
wird, einige recht versteckte Fußangeln. Ist man allerdings erst einmal
mit den Einzelheiten des TRS-80 vertraut, wird man bald seine Quali¬
täten schätzen lernen, die ihn in manchen Feldern der Anwendung
deutlich über andere vergleichbare Systeme hinausragen lassen.
5
Die Benutzung des Cassettenrecorders
Wie man weiß, ist der Einsatz eines handelsüblichen Cassettenrecorders
zur Speicherung größerer Datenmengen der schwächste Punkt aller für
den privaten Gebrauch ausgelegten Microcomputersysteme. Erst diese
Technik läßt ja die erschwinglichen Preise zu, mit deren Hilfe dieser
Anwenderkreis erreichbar wird. Leider macht der TRS-80 dabei keine
Ausnahme; im Gegenteil, möchte man fast sagen. Deshalb sollen an
dieser Stelle einige Tips folgen, die dem Leser (hoffentlich) einen Teil
der zermürbenden, stundenlangen Probiererei ersparen, über die nicht
wenige TRS-80-Anwender klagen, wenn es darum geht, mit der Über¬
tragung von Programmen und Daten zwischen Computer und Bandge¬
rät zurande zu kommen.
Zunächst eine Anmerkung: Als dieses Buch entstand, wurde der
TRS-80 mit dem Recorder „REALISTIC CTR-80" ausgeliefert. Deshalb
beziehen sich die Angaben in diesem Kapitel auf dieses Gerät. Sollte
der Leser einen anderen Recordertyp bekommen haben oder aus einem
anderen Grund einen anderen verwenden, gelten die genannten Werte
natürlich nur sinngemäß.
Am problemlosesten ist naturgemäß das Überspielen von Daten oder
Programmen vom Computer auf das Band. Man braucht weiter nichts
zu tun, als nach der angegebenen Vorgehensweise eine leere Cassette
einzulegen, auf „Aufnahme" zu schalten und den Befehl CSAVE
"(Programmname)" einzugeben. Der Programmname (den man jeweils
frei wählen kann) muß immer dabei stehen, braucht aber nicht länger
zu sein als ein Zeichen (Buchstabe oder Zahl), da der Computer nur das
erste Zeichen zur Unterscheidung verschiedener Programme auf einem
Band heranzieht. Wie die Anführungszeichen (z. B. bei CSAVE"A")
schon vermuten lassen, handelt es sich bei dem Programmnamen um
eine Zeichenkettenvariable ("string"-Variable).
Man kann den Befehl also auch so formulieren: A$=X: CSAVE A$.
Das hat hier kaum eine Bedeutung, eher schon beim Laden von der
Cassette in den Computer, wie im Programm-Anhang des Buches er¬
läutert wird. Achten muß man beim Überspielen auf Band eigent¬
lich nur darauf, daß die Cassetten normalerweise ein Vorlaufbandohne
magnetisierbare Schicht haben, so daß man nicht unmittelbar am Band¬
anfang beginnen kann. Bei der Speicherung von Daten mit dem Be¬
fehl PRINT #-1, ... innerhalb eines Programms kann man den nötigen
6
Vorlauf bis zum Beginn des eigentlichen Tonbandes gleich mit berück¬
sichtigen. Wie in dem entsprechenden Kapitel des Buches erläutert wird,
dient dazu der Befehl OUT x,y.
Dringend zu empfehlen ist die Prüfung jedes abgespeicherten Pro¬
gramms mit der Anweisung „CLOAD?", bei der der Computer das
gespeicherte Programm mit seinem eigenen Speicherinhalt vergleicht.
Allzu leicht kann ein mit viel Mühe geschriebenes Programm durch
das unzulängliche Speicherverfahren verlorengehen. Die mit dem Cas-
settenrecorder arbeitende Methode erreicht als Zugeständnis an die
Erschwinglichkeit des Computersystems eben nun mal nicht die Sicher¬
heit üblicher Techniken elektronischer Datenverarbeitung. Man sollte
deshalb auch die Empfehlung des Herstellers beherzigen und insbe¬
sondere wertvolle Programme mehrmals — vorzugsweise auf verschie¬
dene Bänder — überspielen. Nicht nur kann ein Band verlorengehen
oder anderweitig Schaden nehmen und damit auch sein Inhalt. Es
geschieht zuweilen auch, daß sich ein ordentlich mit anschließender
Prüfung gespeichertes Programm aus unerklärlichen Gründen später
nicht mehr laden läßt.
Und damit kommen wir zum eigentlichen Problem der Speicherung von
Informationen auf Cassettentonbändern, dem Laden in den Computer.
Eine entscheidende Schwierigkeit dabei ist zunächst die richtige Wahl
der Wiedergabe-Lautstärke am Cassettengerät. Bei dem Recorder vom
Typ CRT-80 klappt das Laden zumeist mit einer Einstellung des Laut¬
stärkereglers (dessen Skala beim Ablesen übrigens einige Mühe macht)
in der Nähe der Zahl 4 — vorzugsweise etwas oberhalb davon. So las¬
sen sich auf jeden Fall die Bänder laden, die der Benutzer selbst be¬
spielt hat. Aber auch bei fremden Bändern ist die Einstellung in der
Regel richtig — die Empfehlung von RADIO SHACK, die Lautstärke
bei fremden Cassetten etwas hochzustellen, kann man außer Acht las¬
sen. Allerdings wird die richtige Lautstärkeeinstellung kritischer ; man
darf nicht mehr von der Stellung etwas oberhalb 4 abweichen. Was
kann man nun tun, wenn das Laden eines Programms mißlingt? Wenn es
sich um ein vom TRS-80-Besitzer selbst gespeichertes Programm han¬
delt, sollte die Lautstärke überprüft und gegebenenfalls richtig einge¬
stellt werden (s. oben). Mißlingt dann ein weiterer Ladeversuch, ist im
allgemeinen nichts mehr zu machen - man kann nur noch auf die zweite
Aufnahme ausweichen, die man (hoffentlich!) gemacht hat, um solchen
Fällen vorzubeugen.
Bei fremden Programmen hilft es oft, die Lautstärke um einen ganz
kleinen Betrag zu verstellen. Manchmal sind derartige Bänder allerdings
auch mit ganz anderer Lautstärke aufgenommen, und man muß die
richtige Einstellung in eventuell wiederholten Versuchen finden. Im
Handel bezogene Programmcassetten sind in der Regel elektroakustisch
vervielfältigt und zwar manchmal ohne besondere Sorgfalt. Daher dann
die Schwierigkeiten beim Laden, die von Störspannungen verursacht
werden. (Der Hofacker Verlag liefert ab Herbst 1979 Cassetten mit
Ladegarantie) Es empfiehlt sich übrigens aus dem gleichen Grund auch
für den Anwender nicht, seine Programme auf diese Weise zu kopieren,
zumal der Zeitgewinn gering ist. Für die unverzichtbare Kontrolle der
Kopie müßte sowohl das Original als auch die Zweitanfertigung in den
Computer gelesen werden (mit CLOAD bzw. CLOAD?).
Ein ganz düsteres Kapitel waren bisher leider die für den TRS-80 auf
Bändern erhältlichen Maschinenprogramme. Abgesehen von den mit
dem Computer in der BASIC-Level Il-Version mitgelieferten beiden
Bändern für die Übertragung von Daten und Programmen von Level I
auf Level II ließen sich in Maschinensprache geschriebene Programme
in allzuvielen Fällen absolut nicht laden, und zwar aus demselben
Grund: Störungen durch mangelhafte Vervielfältigung. Wie die (leid¬
volle) Erfahrung zeigt, helfen auch keine Überspielversuche mit ver¬
schiedenen Lautstärken. Wenn es bei der normalen Einstellung nicht
geht, sollte man sich weitere fruchtlose Bemühungen sparen.
Gibt es nun gar kein Mittel, diese Schwierigkeiten zu überwinden, die
den Austausch von Programmen zwischen TRS-80-Besitzern erschweren
und im Handel bezogene Cassetten wertlos machen? Doch, das gibt es
— in Form eines einfachen, kleinen Gerätes, das man sich notfalls
leicht selbst bauen kann und das es erlaubt, den Ladevorgang kontrol¬
liert ablaufen zu lassen und die vom Band abgespielten Signale auf ein¬
fache, aber wirksame Weise vor der Einspeisung in den Computer zu
filtern.
8
Signalfilter
Mit diesem kleinen Filter sollte es gelingen, auch Programme zu laden,
die sonst als hoffnungslose Fälle gelten müssen:
Teileliste
2 Germanium-Signaldioden
2 Widerstände 10kS2 5 %
1 Widerstand 1k£2
1 Widerstand 82 £2
1 Miniaturschalter 2Xum
1 Einbaumeßgerät, Meßbereich ca. 50 juA
je 1 Stecker und Buchse, passend zum Ohrhörer-Anschluß des Rekor¬
ders
ca. 50 cm einadriges abgeschirmtes Kabel
9
Die Schaltung läßt sich gut in einem kleinen Gehäuse unterbringen,
wobei die Anschlüsse des Schalters auch gleich als Lötstützpunkte
dienen können.
Das fertige Gerät wird zwischen den Ohrhörer-Ausgang des Rekorders
und dem entsprechenden Stecker des Verbindungskabels (schwarz)
eingeschaltet. Zum Laden eines Programms läßt man das Band zunächst
einmal laufen und stellt fest, bei welcher Stellung des Schalters das
Amperemeter am weitesten ausschlägt. In dieser Stellung läßt man
den Schalter und regelt dann den Pegel der Signale mit dem Lautstärke¬
regler des Cassettengerätes auf 15 pA ein. Dann sollte es keine Probleme
mehr mit dem Laden des betreffenden Programms (in BASIC oder
Maschinensprache) geben.
Es gibt allerdings Fälle, in denen sich die 15 /jA auch bei voll aufge¬
drehter Lautstärke nicht erreichen lassen. Dies liegt häufig daran, daß
die Justierung des Tonkopfes bei dem Tonbandgerät, das für die Auf¬
nahme verwendet wurde, nicht mit der in dem Gerät des Anwenders
übereinstimmt.
10
Auch dieses Problem läßt sich mit Hilfe des kleinen Hilfsgeräts über¬
winden: Zuerst probiert man wie gewohnt die Schalterstellung mit der
größten Signalstärke aus. Dann läßt man jedoch zunächst die Lautstärke
in einer mittleren Stellung und nimmt einen schlanken Schraubenzieher
zur Hand (normale Form oder Kreuzkopf). Durch eine kleine Bohrung
im Gehäuse des Recorders CTR-80 läßt sich nämlich (bei laufendem Ge¬
rät) die Justierschraube des Tonkopfes erreichen, und eine kleine
Drehung bringt den Pegel des Signals auf eine brauchbare Höhe. An¬
schließend kann dann die Einregulierung mit dem Lautstärkeregler er¬
folgen.
Natürlich ist eine Schwierigkeit mit diesem Vorgang verbunden — nach
Neujustierung stimmt die Einstellung des Tonkopfes für die eigenen
Programme des Anwenders nicht mehr. Dies kann man vermeiden, in¬
dem man sich die Richtung und das Ausmaß der Verdrehung der Ju¬
stierschraube merkt und den ursprünglichen Zustand nach dem Laden
des Programms wieder herstellt. Eine zweite Möglichkeit besteht darin,
mit einem eigenen Programm eine Neujustierung vorzunehmen. Auf
jeden Fall sollte man ein problembehaftetes Programm möglichst bald
selbst auf ein anderes Band abspeichern, um Pegel-Regulierungen,
Tonkopfjustierungen u. s. w. für die Zukunft überflüssig zu machen.
Noch einige Ratschläge am Ende dieses Kapitels: Der TRS-80-Besitzer
wird in der Regel eine größere Anzahl Programme (oder auch größere
Datenmengen) auf einer Cassette speichern und dafür handelsübliche
Cassetten verwenden wollen, die pro Bandseite bis 60 Minuten Spiel¬
zeit zulassen. Dies ist auch ohne weiteres möglich, doch sollte man un¬
bedingt nur hochwertige Cassetten (mindestens Chromdioxid, besser
noch Ferro- oder Ferrochrombänder) verwenden.
Das ist nicht unbedingt eine Frage des vom Band verkrafteten Fre¬
quenzumfangs. Die Aufzeichnung erfolgt beim TRS-80 Level II be¬
kanntlich mit 500 Baud, und da kommen schon bei bescheidenen
5kHz, die jedes noch so minderwertige Erzeugnis leicht verkraftet,
brauchbare Rechteckimpulse zustande.
Doch ist das Bandrauschen bei besseren Cassetten geringer, und vor
allem haben sie keine oder zumindest weniger Unterbrechungen in der
magnetisierbaren Schicht (sogenannte dropouts), die natürlich jeden
Versuch einer Daten- oder Programmaufzeichnung vereiteln.
11
Und noch etwas: Da anders als bei Musikaufnahmen schon ein ein¬
ziger fehlender Impuls die gespeicherte Information wertlos machen
kann, sollte man sich bei der Handhabung von Recorder und Cassetten
um möglichst weitgehende Sauberkeit bemühen. Cassetten gehören in
ihre Boxen und sind am besten in einer Schublade oder an einem ähn¬
lichen Ort aufgehoben.
Es kann auch nicht schaden, sich eine Reinigungscassette zuzulegen
und den Tonkopf des Recorders von Zeit zu Zeit damit zu säubern.
Zu dem Cassettengerät liefert Radio Shack auch einen Kurzschlu߬
stecker, dessen Aufgabe es sein soll (so wurde jedenfalls bis vor kurzem
ausgeführt), das eingebaute Mikrophon des Geräts für Überspielungen
dadurch stillzulegen, daß man ihn in den Mikrophoneingang steckte.
Wer das mit dem CTR-80 versucht hat, wird sich sicher gewundert
haben, daß anschließend auf dem Band überhaupt nichts zu finden war.
Bei diesem Rekorder schaltet der im Mikrophoneingang steckende
Kurzschlußstecker nämlich sämtliche Eingänge aus, nicht nur das Ein¬
baumikrophon. Daher kann man den Stecker zwar nicht für den ange¬
gebenen Zweck verwenden, dafür aber zum Löschen von Bändern, in¬
dem man sie mit eingestecktem Kurzschlußstecker in Aufnahme-
Stellung des Recorders durchlaufen läßt. Andererseits ist die beab¬
sichtigte Funktion des Steckers zumindest beim CTR-80 auch nicht
erforderlich, da schon die Benutzung des Signaleingangs ("AUX")
das Einbaumikrophon sperrt.
12
Das technische Innenleben des TRS-80
Es ist eigentlich nicht die Absicht dieses Buches, den TRS-80 Freund
allzu weit in die technischen Geheimnisse seines Computers einzufüh¬
ren - schließlich ist es ja gerade einer der großen Vorzüge dieses Sy¬
stems, unmittelbar für den Benutzer bereitzustehen, der sich nicht
auch noch mit dem Innenleben der Anlage beschäftigen will. Doch soll
an dieser Stelle wenigstens ein grober Überblick über die Arbeitsweise
der einzelnen Komponenten folgen. Solches Wissen kann auch beim
praktischen Einsatz des Computers - nicht zuletzt, wenn Zusatzgeräte
angeschlossen werden sollen — ganz praktisch sein.
Bekanntlich ist der TRS-80 mit dem Microprocessor Z-80 von ZI LOG
ausgerüstet - eine Zentraleinheit (CPU = Central Processing Unit) der
einen oder anderen Art bildet das Herzstück jedes Microcomputers.
Die Z-80-CPU ist wohl noch immer die leistungsfähigste ihrer Art. Im
Prinzip verarbeitet sie Informationen mit 8 Bit Breite, ist damit also ein
sogenannter 8-Bit-Microprocessor. Doch lassen sich ihre Register zum
Teil paarweise zusammenschalten, so daß sie in manchen Aspekten be¬
reits die Leistungsfähigkeit der 16-Bit-Microprocessoren erreicht, die
seit kurzem auf dem Markt erscheinen (allerdings nicht mit deren Ge¬
schwindigkeit). Die Z-80-CPU ist eine Weiterentwicklung des bereits
legendären 8080 von INTEL (inzwischen auch ein SIEMENS-Produkt)
und, was die Maschinenprogrammierung betrifft, auch fast vollständig
mit ihm „aufwärtskompatibel", d. h., für den 8080 geschriebene Ma¬
schinenprogramme laufen auch auf Z-80-Geräten. Doch wurde die Ma¬
schinensprache für die Z-80-CPU erheblich erweitert — unter anderem
um Anweisungen zum Bewegen ganzer Datenblöcke von einem Spei¬
cherort zum anderen, was gerade bei einer Anwendung wie für den hier
interessierenden TRS-80 Vorteile bringt.
Gewissermaßen das Rückgrad des Systems bilden ein Adressen- und ein
Datenbus (mit "Bus" werden in der Computertechnik die Haupt-Lei¬
tungsstränge oder Sammelschienen bezeichnet). Der Datenbus ist 8 Bit
breit, d. h. er besteht aus 8 Leitungen, die jeweils auf hohem oder
niedrigen Spannungspotential sein können (logisch "1" oder "0").
Auf dem Datenbus laufen Informationen zwischen Zentraleinheit, Spei¬
cherregionen und gegebenenfalls den angeschlossenen Zusatzgeräten
(im einfachsten Fall ist das nur der Cassettenrecorder) hin und her.
13
Die Informationen auf dem 16 Bit breiten Adressenbus stammen (nor¬
malerweise) stets von der CPU und bezeichnen den Ort, an den Daten
auf dem Datenbus geschickt werden oder von dem sie geholt werden.
Daneben gibt es noch eine Anzahl von Steuerleitungen, mit denen die
einzelnen Funktionen innerhalb des internen Computerbetriebs kon¬
trolliert werden bzw. die eine Zusammenarbeit des Computers mit
Zusatzgeräten ermöglichen.
Die Organisation des TRS-80 ist speicherplatzbezogen (memory
mapped). Daher werden die einzelnen Komponenten nicht über Ein-
und Ausgänge erreicht, sondern sie bilden Teile des Computer-Speicher¬
raums und werden einfach durch Angabe geeigneter Adressen ange¬
sprochen. So bilden Tastatur und Videomonitor computer-intern nichts
weiter als bestimmte Speicherbereiche. Zum Abrufen bzw. Ausgeben
von Informationen werden diese Regionen über den Adressenbus auf-
gerufen.
Prinzipiell gibt es zwei Speichersorten im TRS-80: Festwertspeicher
(ROM - Read Only Memory) und Speicher mit wahlfreiem Zugriff
(RAM - Random Access Memory). In 12 K ROM ist das Level II
BASIC sowie das Betriebssystem des Computers untergebracht. Ca.
4,7 K vom RAM-Bereich braucht der Computer für eigene Zwecke bzw.
sind noch ungenutzt. Der Rest steht schließlich für Programme zur
Verfügung. Rund 3,3K bei der „4K"-Version, 15,3K beim Speicheraus¬
bau auf "16K".
Der allergrößte Teil des RAM-Speichers besteht aus sogenannten dy¬
namischen RAMs. Sie sind besonders einfach im Aufbau, erfordern aber
in regelmäßigen Abständen eine „Auffrischung" ihres Inhalts durch
eine Adressierungsansprache. Da die Z-80-CPU Adressen selbst erzeugt
(was ja zur speicherplatzbezogenen Organisation des Computers führt)
geschieht das RAM-Auffrischen somit automatisch mit, und zwar durch
das zur Adressierung gehörige Steuersignal RAS'. Es erfolgt etwa alle
2 Microsekunden. Nur der Bildschirmspeicher (1K) ist statisches RAM,
benötigt also keine Auffrischung.
Auch das Tastenfeld wird wie ein RAM behandelt. Hier sind aber keine
Halbleiter-Speicherelemente im Spiel, sondern die Tastenkontakte
selbst dienen dieser Aufgabe. Beim TRS-80 liefert die Tastatur nämlich
14
keine fertigen, ASCIl-codierten Zeichen- bzw. Funktionssymbole, wie
sie vom Computer intern gebraucht werden (ASCII = American Stan
dard Code for Information Interchange). Vielmehr werden die Tasten
wie bei einem Taschenrechner über den Adressenbus abgefragt. Die
Tastenkontakte stellen direkte Verbindungen zwischen Adressen-
und Datenleitungen her, und die resultierenden Daten auf dem Daten¬
bus werden durch Software des ROM-Bereiches in ASCI I -Zeichen umge¬
wandelt.
Entsprechend den 1024 Schreibpositionen des Bildschirms ist der zu¬
gehörige RAM-Bereich 1K groß. Er wird ständig mit Hilfe eines eigenen
Video-Adressengenerators abgefragt und liefert Zeile für Zeile ASCI I-
codierte Zeichen an den Zeichengenerator. Bei den 7 Bildschirmzeilen
pro Zeichen (+5 Zeilen Zwischenraum) auf dem Monitor muß jede
Zeile des Speichers 7mal abgefragt werden, um auf dem Bildschirm die
volle Schriftzeile zu ergeben: Jedesmal wird nur eine Spur des Elektro¬
nenstrahls durch den Zeichengenerator in eine Reihe von Punkten und
Strichen aufgelöst. In gleicher Weise werden auch die Lichtpunkte der
TRS-80-Bildschirmgraphik erzeugt, nur sind hier alle 12 Bildschirm¬
zeilen einer Schriftzeile im Spiel. Ein Prioritätsbit entscheidet dabei
zwischen Zeichen und Graphik.
Immer wenn der Computer (bei Ausführung eines PRINT-Befehls etwa)
Zeichen für die Ausgabe auf dem Bildschirm in den Bildschirmspeicher
schreiben will, wird die Abfrage-Routine kurz unterbrochen. Dies kann
man auf einem beschriebenen Bildschirm in Form kurzer schwarzer
Striche erkennen. An der Kürze dieser Striche zeigt sich übrigens die
Schnelligkeit, in der dieser Einschreibvorgang vor sich geht.
Den Herzschlag des Computers stellt gewissermaßen der Taktgenerator
dar. Er ist mit einem Quarz-Schwingkreis ausgerüstet, der mit einer
Frequenz von 10,6445 MHz schwingt. Die Z-80-CPU, die eine Taktfre¬
quenz von maximal 2,5 MHz verkraftet (in der Version Z-80 A sogar
4MHz), läuft im TRS-80 mit rd. 1,774 MHz. Dazu wird die Schwingung
des Schwingkreises durch 6 geteilt. Für die Bildung der Video-Ausgabe
muß der Schwingkreis zusätzlich eine ganze Reihe verschiedener Takt¬
frequenzen liefern.
Da sind (unter anderem) erst einmal die zwei Takte, von denen einer
oder der andere zur Erzeugung der einzelnen Bildpunkte in den Zei-
chengenerator gespeist wird, je nachdem, ob der Computer pro Zeile
64 oder 32 Zeichen schreibt. Die erste Frequenz ist die Oszillatorfre¬
quenz selbst, die zweite die Hälfte davon, 5,32 MHz. Gewonnen wird
sie durch Halbierung der Oszillator-Frequenz. In eine Kette von Fre¬
quenzteilern zur Gewinnung der Zeilen- und Bildfrequenz wird ein
durch 12-Teilung der Oszillatorfrequenz gebildeter Takt von 887,04
KHz eingespeist. Daraus entsteht zunächst die Zeilenfrequenz von
15,84 KHz (entsprechend 264 Zeilen, davon je 36 am oberen und un¬
teren Bildrand und deshalb nicht sichtbar) und schließlich die Bild¬
frequenz von 60 Hz.
Wie schon erwähnt, arbeitet der TRS-80 speicherbezogen, die einzelnen
Funktionen werden also durch Ansprache der betreffenden Speicher¬
stelle über den Adressenbus aktiviert. Doch kann die CPU auch 256
verschiedene Aus- und Eingänge ansprechen. Was dies für den Anschluß
von Zusatzgeräten bedeutet, soll an anderer Stelle erläutert werden.
Aber auch intern wird ein Ausgang verwendet, nämlich der mit der
Nummer 255. Er dient zwei verschiedenen Zwecken: Zum Datenver¬
kehr mit dem Cassettenrecorder und zum Wechsel in der Bildschirmaus¬
gabe zwischen schmaler und breiter Schrift. Letzteres ist wohl deshalb
auf diese im ersten Augenblick überraschende Weise gelöst, weil die
Erzeugung des Monitorbildes wie bereits angedeutet, ganz unabhängig
vom sonstigen Computerbetrieb arbeitet und nur über den gemeinsamen
Zugriff auf den Videospeicher mit ihm verbunden ist. Jedenfalls erge¬
ben sich über den BASIC-Befehl OUT und die Funktion INP gewisse
Einflußmöglichkeiten, die an anderer Stelle näher erläutert werden.
Die Datenspeicherung auf Cassettentonband geschieht binär, mit einem
Impuls für 0 und einem Impulspaar für 1. Der Taktabstand beträgt
(bei Level 11)2 Microsekunden, so daß sich eine Übertragungsrate von
500 Baud ergibt. Beim Einlesen werden die auf dem Tonband vorhan¬
denen Impulse zunächst gefiltert, jedoch leider nicht sorgfältig genug,
wie manch leidvolle Erfahrung mit vergeblichen Ladeversuchen be¬
weist (darüber ebenfalls an anderer Stelle mehr). Anschließend folgt
Gleichrichtung, Verstärkung und Umwandlung in Rechteckimpulse.
Zur Energieversorgung benötigt der TRS-80 drei verschiedene Span¬
nungen: +5V, —5 V und +12Volt. Die zugehörigen Stromstärken be¬
tragen 1,2 A, 1 mA und 0,35 A. Die —5V- und +12V-Versorgungen
sind dabei speziell für die dynamischen RAMs vorhanden. Die Regelung
der einzelnen Spannungen erfolgt auf der Computer-Platine. Bei +5V
und +12V ist eine Kurzschluß-Strombegrenzung eingebaut. Der externe
Transformator liefert eine Wechselspannung von 14V, die in der Mitte
geerdet ist und zur Gewinnung der +5V- und —5V-Versorgungen
dient. Für die 12V*Versorgung wird eine Gleichspannung von 19,8V
bereitgestellt.
17
Das Betriebssystem des TRS-80
Wenn man das Betriebssystem in wenigen Worten charakterisieren
wollte, das der TRS-80 Microcomputer in seiner Grundausstattung und
mit Level II BASIC zur Verfügung hat, müßte man sagen: Knapp be¬
messen, aber ausreichend. Zwar ist alles vorhanden, was man für einen
einigermaßen komfortablen Betrieb benötigt, um absolute Idiotensi¬
cherheit hat man sich dagegen nicht bemüht. Daß eben „nur" 12K
ROM-Bereich zur Verfügung stehen, mag dabei einiges erklären. Schlie߬
lich ist es ja durchaus im Sinne des ernsthaften Computerfreunds, wenn
— wie es hier der Fall ist — zugunsten des BASICs auf allzu ausführliche
Statusmeldungen, Fehleranzeigen usw. verzichtet wird. Dement¬
sprechend kann man den TRS-80 im Vergleich zu ähnlichen Systemen
durchaus als recht „wortkarg" bezeichnen, wenn er in irgendeiner Weise
auch alles erforderliche zum Ausdruck bringt.
Die erste Lebensäußerung des Computers nach dem Anschalten besteht
aus der lapidaren Frage: MEMORY SIZE? (Speichergröße?) Jetzt
kann man bei Bedarf eine Zahl eingeben, die niedriger ist als die Spei¬
chergröße des Rechners (20479 byte bei 4K, 32767 bei 14K) und so¬
mit den Rest für Maschinenprogramme reservieren. Danach rafft sich
der TRS-80 zu seiner längsten Meldung auf: Mit RADIO SHACK
LEVEL II BASIC meldet sich das Betriebssystem. Dann folgt ein
READY und in der nächsten Zeile ein >, Kennzeichen für die direkte
Betriebsart.
In dieser Betriebsart, einer von den vier vorhandenen, erfolgt in der
Regel die Kontrolle der verschiedenen Computer-Aktivitäten: Laden
von BASIC-Programmen vom Cassettengerät und Speichern der Pro¬
gramme auf Band, Starten und unterbrechen von BASIC-Programmen
usw. Auch führt der Computer in dieser Betriebsform fast alle BASIC-
Befehle direkt aus und erledigt auch Rechenaufgaben. Vor allem aber
dient diese Betriebsart auch zum Programmieren. Für Programmzeilen,
Kalkulationen, Befehlsfolgen stehen jeweils 241 Stellen (!) zur Ver¬
fügung, allerdings nicht 255, wie manchenorts zu lesen ist.
Mit dem Befehl RUN startet man im allgemeinen ein Programm. Soll
der Ablauf an einer bestimmten Zeile beginnen, fügt man die Zeilen¬
nummer hinzu. Auch mit dem Sprungbefehl GOTO xxx kann man ein
18
Programm an einer beliebigen Stelle in Gang setzen. Dabei bleiben an¬
ders als bei RUN alle zuvor definierten Variablen, Matrizen usw. erhal¬
ten, was für manche Zwecke ganz nützlich ist. Drücken der BREAK-
Taste unterbricht ein BASIC-Programm. Mit CONT kann man es an
derselben Stelle wieder in Gang setzen, sofern nichts daran verändert
wurde. (Variablen-Werte lassen sich wohl ändern!)
Die dritte Betriebsart stellt der sogenannte Edit-Mode dar, in dem man
Programmtexte mit einem sehr praktischen Satz von Spezialbefehlen
ändern kann. Diese Möglichkeit, durch die der TRS-80 unter seines¬
gleichen ziemlich hervorsticht, erreicht man durch die Anweisung
EDIT, gefolgt von einer Zeilennummer (oder einem Punkt stellvertre¬
tend für die gerade vorliegende Zeile, wie später erläutert werden soll).
Auch bei einem Syntax-Fehler innerhalb eines Programms schaltet
der Computer automatisch auf Edit um.
Schließlich existiert noch eine vierte Betriebsart, der „Monitor"-Be-
trieb. Dies ist entgegen der Bezeichnung kein Monitor, das heißt ein
Hilfssystem zum Programmieren von Maschinenprogrammen, sondern
erlaubt nur das Laden von Maschinenprogrammen und ihren Start.
Durch den Befehl SYSTEM wird diese Betriebsart erreicht; sie zeigt
sich durch ein *? am Anfang der Zeile. Radio Shack bietet übrigens
sowohl ein eigentliches Monitor- als auch ein Assembler-Programm
auf Band an. Letzteres hat auch einen, dem BASIC-Edit-Betrieb ähn¬
liches Edit-Teil, so daß auch Programme in Assemblersprache leicht
bearbeitet werden können.
An dieser Stelle soll schon einmal erwähnt werden, daß sich die ein¬
zelnen Kontrollanweisungen wie RUN, CLOAD, EDIT usw. auch in
BASIC-Programme einbauen lassen. Davon soll später noch die Rede
sein. Aufgrund dieser Möglichkeit lassen sich nämlich einige praktische,
kleine Hilfsprogramme bilden.
Keine eigene Betriebsart ist der Datenverkehr mit dem Cassettenre-
corder, obwohl manches daran erinnert. Hat man die Anweisung
CLOAD, CLOAD? oder CSAVE gegeben bzw. wird INPUT #— 1 oder
PRINT#—1 in einem Programm ausgeführt, schaltet der Computer
jede Kontrollmöglichkeit über die Tastatur ab und konzentriert sich
19
ganz auf die jeweilige Tätigkeit. Dabei wird der Lauf des Bandantriebs¬
motors mit einem eingebauten Relais gesteuert. Diese Funktion kann
man in einem Programm auch getrennt auslösen, was einerseits in¬
teressante Gebrauchsmöglichkeiten für den Cassettenrecorder ermög¬
licht (z. B. Programme mit auf Band gesprochenem Kommentar),
andererseits auch eine einfache Steuermöglichkeit für andere Anschlu߬
geräte bildet. Doch davon später mehr.
Für die Kontrolle des Datenverkehrs mit dem Cassettengerät stehen nur
sehr karge Hilfsmittel bereit: Beim Programmladen erscheinen an der
rechten oberen Ecke des Bildschirms zwei Sterne, von denen einer blin¬
ken muß, wenn alles klappt. Daß etwas nicht in Ordnung ist, kann man
daran erkennen, daß keine Sterne erscheinen oder daß sie erscheinen,
aber nicht blinken. Aber auch wenn sie blinken, kann etwas mit dem
Laden schiefgegangen sein. Mit einiger Übung kann man das erkennen:
Das Blinken wird auffallend langsam.
Unterbrochen wird der Ladevorgang deshalb aber leider nicht von
selbst.
Demgegenüber erscheint bei einem Ladefehler, der bei einem Maschi¬
nenprogramm passiert, ein C an der Stelle des ersten Sterns: D. h.
„check sum error" und bedeutet, daß ein Paritätsfehler aufgetreten ist,
das Laden also mißlungen ist. Danach bleibt auch der Cassettenrecorder
stehen. Bei BASIC-Programmen geschieht etwas ähnliches nur beim Be¬
fehl CLOAD?, der zur Überprüfung eines gespeicherten Programmes
dient. Die Reaktion auf einen Fehler ist hier fast ebenso knapp: Der
Computer zeigt das Wort BAD (schlecht) und stoppt den Recorder.
Ein Fehler bei der Übernahme von Daten (Zahlen oder Zeichenketten)
vom Band wird mit der Fehlermeldung FD ERROR (bad file data,
schlechte Speicherdaten) beantwortet. Allerdings gilt sie für verschie¬
dene Fehler, die bei der Datenübernahme aus beliebigen externen Quel¬
len auftreten können.
Absichtlich unterbrechen kann man den Cassettengerät-Betrieb nur
durch Drücken der RESET-Taste links hinten am Computergehäuse
unter der Klappe.
20
Noch eine nützliche Einzelheit: Sofern der Computer unter der Kon¬
trolle der Tastatur ist (also nicht während eines laufenden Maschinen¬
programms, Datenübertragung vom und zum Recorder etc.) kann seine
Arbeit durch Drücken von „SHIFT"% unterbrochen werden. Zum Bei¬
spiel auch beim Listen von Programmen auf dem Bildschirm, was sehr
praktisch ist, wenn man sich den Programmtext Stück für Stück an¬
schauen will. Bei einem Druck auf eine beliebige Taste setzt der Com¬
puter seinen Betrieb dann wieder fort.
Ein wesentlicher Vorteil der BASIC-Interpreter, mit deren Hilfe BASIC-
Programme intern Zeile für Zeile in Maschinensprache übersetzt und
ausgeführt werden, ist die Möglichkeit zur sofortigen Fehlererkennung
und -anzeige. Die Anzeigen fallen beim TRS-80 wiederum sehr knapp
aus: Je nachdem, ob der Fehler innerhalb eines Programms auftritt
oder nicht, werden vor die Meldung ERROR IN (Zeilennummer) bzw.
nur ERROR lediglich zwei Buchstaben als Abkürzung gestellt. Was
sie bedeuten, muß man eben lernen (oder jeweils im Handbuch nach¬
schauen). Abgesehen davon wird die Fehlererkennung aber sehr weit
getrieben: Es gibt 23 verschiedene Meldungen. Und die Fehlerroutinen
sind darüber hinaus zu einem wirkungsvollen Instrument bei der BASIC-
Programmierung ausgebaut! Ein ganzer Satz von Befehlen und Funk¬
tionen -ON ERROR GOTO, ERR, ERL, ERROR, RESUME - steht
zur Verfügung, um „Fehler" als Teil des jeweiligen Programms zu ver¬
arbeiten, ja, sie absichtlich ins Programm einzubauen.
21
Das RADIO SHACK Level II BASIC
Ein weiteres wesentliches — wenn nicht das wesentlichste — Merkmal
für die Leistungsfähigkeit eines Microcomputer-Systems von der Art
des hier behandelten ist die Qualität des in Form von Festwertspeichern
(ROMs) eingebauten BASIC. Nachdem diese Sprache ja im Gegensatz
zu den übrigen bekannten höheren Programmiersprachen leider nicht
genormt ist, hat ziemlich jeder Anbieter auf dem Markt auch sein ei¬
genes BASIC, und so auch Radio Shack. Im wesentlichen unterscheiden
sich die verschiedenen Spielarten zwar nur in den Abkürzungen für
sonst gleiche Befehle. Doch muß jeder Microcomputer-Hersteller
aus der Gesamtheit der zur vollständigen BASIC-Sprache gehörenden
Befehle auswählen, um mit dem immer beschränkten Speicherraum aus¬
zukommen. Nach Möglichkeit sollten dazu noch einige, auf die spe¬
ziellen Eigenheiten und Vorzüge des jeweiligen Systems zugeschnittenen
Anweisungen kommen.
Wie schon erwähnt, sind im TRS-80 12K für das Level-Il-BASIC re¬
serviert. Nachdem das Level I eine einfache, auf den Anfänger zuge¬
schnittene, aber für den Speicherraum von (nur) 4K doch schon recht
leistungsfähige BASIC-Version darstellt, ist die höhere Stufe dem drei¬
fachen Speichervolumen entsprechend ungleich leistungsfähiger und
komfortabler. Geboten werden ganz ungewöhnlich weitgehende Pro¬
grammierhilfen. Darüber hinaus ist die Zielrichtung über das Hobby-
und Heimgerät hinaus auf den ernsthaften, kommerziellen Einsatz des
erweiterten Systems nicht zu verkennen. Neben den Funktionen, die
(leider erst) mit dem Geräteanschluß-Zusatzbauteil „Expansion In¬
terface" zugänglich werden, fehlen eigentlich nur noch die Befehle zur
Matrix-Behandlung, wie MAT ZER, MAT INV u. s. w. Vom Expan¬
sion Interface soll weiter hinten noch die Rede sein.
Programmieren mit dem TRS-80
Wie bereits ausgeführt, muß für Maschinenprogramme, die neben BA-
SIC-Programmen im Speicher untergebracht werden sollen (etwa um
sie vom BAS IC-Programm aus anzusprechen) entsprechender Speicher¬
platz reserviert werden. Dazu hat der Programmierer jeweils einmal
nach Anschalten des Computers die Möglichkeit.
Auf dem Bildschirm erscheint in diesem Augenblick nämlich die Frage
„MEMORY SIZE?".
22
Will man Speicherraum freihalten, muß man die gewünschte Anzahl
Speicherstellen (Bytes) von der höchsten Adresse des jeweiligen Compu¬
ters abziehen (20479 bei der 4K-Version, 32767 bei der 16K-Version)
und diese Zahl eingeben. Ansonsten einfach „Enter" drücken.
Es gibt eine recht einfache Methode, an diesen Punkt zurückzukommen,
ohne den Computer aus- und nach entsprechender Wartezeit wieder
anschalten zu müssen: Dazu muß man „SYSTEM" eingeben, um in die
„Monitor-Betriebsart" zu kommen und danach einfach und
"Enter" drücken. Der Computer versucht dann einen Sprung zu einem
nicht vorhandenen Maschinenprogramm und landet in der Anschalt-
Routine, die mit „MEMORY SIZE?" endet. Im Normalfall wird man
jedoch keinen Speicherraum reservieren wollen. Also drückt man nur
"Enter", und der Computer meldet sich mit "RADIOSHACK LEVEL
II BASIC" sowie "READY" und einem "> " als Bereitschaftszeichen.
Nun kann das Programmieren beginnen.
Und hier bietet der TRS-80 bereits die erste praktische Hilfe an: Mit
dem Befehl "AUTO" kann man automatische Zeilennumerierung
auslösen. Zwei nachgestellte, durch ein Komma getrennte Zahlen geben
dabei Anfangs-Zeilennummer und Schrittweite an, z. B. AUTO 10,20
führt zu den Zeilennummern 10, 30, 50,.... Fehlende Zahlenangaben
ersetzt der Computer durch die Zahl 10, d. h. er fängt bei 10 an bzw.
zählt in Zehnerschritten oder beides, je nachdem, ob die erste Zahl die
zweite Zahl oder beide fehlen.
Da wir gerade bei den Programmzeilen sind: Der TRS-80, Level II
läßt Programmzeilennummern zwischen 0 und 65629 zu, also insge¬
samt 65530 Zeilen. Das sind sicher mehr als genug für jedes denkbare
Programm, und man hat in jedem Fall die Möglichkeit, über die übli¬
chen Zehner-Schritte hinauszugehen und sein Programm durch ge¬
schickte Wahl der Zeilenzahlen zu gliedern. So lassen sich einzelne, zu¬
sammenhängende Programmteile mit einer „runden" Anfangszeilen-
Nummer kennzeichnen (z. B. 1000, 2000, 3000 u. s. w.). Auch sollte
man das Programmieren mit einer nicht zu kleinen Zeilenzahl begin¬
nen und auch größere Abstände zwischen einzelnen Programmteilen
lassen. Erfahrungsgemäß gibt es besonders an solchen Stellen oft
nachträglich etwas zwischenzuschieben, bzw. voranzustellen, und dabei
kann man leicht in Schwierigkeiten kommen.
23
Die Folge ungenügender Zeilenzahl-Abstände wäre dann umständliches
Neuschreiben bereits vorhandener Zeilen oder ein Programm, das durch
unnötige Sprungbefehle ("GOTO ...") an Übersichtlichkeit verliert.*
Wie auch in der Programmieranleitung des Computers ausgeführt, kann
man Speicherplatz sparen und die Programmausführung durch den
Computer beschleunigen, wenn man möglichst viele Anweisungen je¬
weils zu einer Zeile zusammenfaßt. Mit einer größten Zeilenlänge von
255 Stellen eröffnet der Computer hier auch ungewöhnlich große
Möglichkeiten. Allerdings empfiehlt es sich nicht, beim Programmieren
gleich von Anfang an in jede Zeile soviel wie nur möglich hineinzu¬
packen. Erst später stellt man dann nämlich fest, daß eine Anweisung,
zu der mit einem "GOTO"-Befehl gesprungen werden soll, irgendwo in
der Mitte einer Zeile steht und damit mit einem Sprung nicht erreich¬
bar ist. Zudem leidet die Übersichtlichkeit des Programms, was recht
lästig werden kann, wenn man später irgendwelche Änderungen vorneh¬
men will. Und bedingte Anweisungen ("IF ... THEN") müssen im all¬
gemeinen sowieso am Ende einer Zeile stehen, wenn man scheinbar
unerklärliche Fehler vermeiden will. Am besten ist es, wenn man beim
Schreiben des Programms zunächst nur inhaltlich zusammengehörige
Befehle in jeweils einer Zeile zusammenfaßt — z. B. zusammenhängende
"PRINT"-Anweisungen oder Variablen-Bestimmungen (A=3, B=0
u. s. w.). Wenn man sicher ist, daß das Programm vollständig ist und
keine Fehler mehr enthält, kann man damit beginnen, benachbarte Zei¬
len zusammenzufassen. Dabei muß darauf geachtet werden, daß Anwei¬
sungen, die mit einem Sprung erreicht werden sollen, am Anfang ste¬
hen und bedingte Anweisungen die Zeile beschließen. Diese beiden
Bedingungen beschränken meist die erreichbare Zeilenlänge, doch man
sollte die Zusammenfassungen auch sonst nur soweit treiben, wie es
sich im Interesse der Übersichtlichkeit noch vertreten läßt.
Weitergehen sollte man nur, wenn bei einem • sehr langen oder mit
vielen Zahlen bzw. Ziffernreihen (Strings) operierenden Programm der
Speicherplatz kanpp wird. Deutliche Einsparungen an Ausführungszeit
ergeben sich außerdem nur, wenn Zeilen innerhalb von Programmschlei¬
fen zusammengefaßt werden, wo dieselben Anweisungen viele Male
hintereinander ausgeführt werden.
* Seit kurzem bietet TANDY dazu auch ein Maschinenprogramm zur Umnume¬
rierung von Zeilen an. Die Verwendung kostet aber wiederum zusätzliche, ver¬
meidbare Mühe.
24
An weiteren Befehlen, die zu diesem Thema gehören, kennt das Level-
ll-BASIC außer dem üblichen "LIST" mit seinen Variationen und dem
bereits erwähnten "EDIT", das die Bearbeitung einzelner Zeilen mit
einem Satz eigener Unteranweisungen erlaubt, noch drei weitere Be¬
fehle: "DELETE", "TRON" und "TROFF".
DELETE dient zum Entfernen von Zeilen aus einem Programm und hat
ähnlich dem LIST-Befehl drei Versionen: Mit einer nachgestellten Zei¬
lenzahl oder einem PUNKT (.) entfernt es die angegebene bzw. die ge¬
rade vorliegende Zeile aus dem Programm, mit einem Zeilenbereich
(z. B. 20 — 80 oder auch — 80, d. h. alle Zeilen bis Zeile 80) die darin
vorhandenen Zeilen. Allerdings müssen die genannten Zeilen (bei dem
Zeilenbereich die letzte, in unserem Beispiel also Zeile 80) auch tat¬
sächlich im Programm enthalten sein, sonst erfolgt eine Fehlermeldung
- eine Einschränkung, die für den LIST-Befehl nicht gilt. Echten
Nutzen bringt DELETE eigentlich nur, wenn man es mit einem Zei¬
lenbereich anwendet, weil es einem dann das sonst erforderliche Ein¬
tippen sämtlicher infrage kommender Zeilennummern erspart. Sonst
ist man für das Zeilenlöschen mit dem üblichen Zeilenzahl-Eintippen
ebensogut bedient, wie mit DELETE.
25
TRON und TROFF gehören zusammen und stellen eine recht wirksame
Hilfe für die Fehlersuche in Programmen dar. TRON veranlaßt den
Computer, bei der Abarbeitung jeder Programmzeile die Zeilenzahl in
eckigen Klammern auf dem Bildschirm zu schreiben. TROFF hebt die
Anweisung TRON wieder auf. Man kann vor dem Start eines Pro¬
gramms TRON eingeben und damit die Anzeige aller Zeilenzahlen im
Ablauf der Programmverarbeitung erreichen. Besonders wenn im Pro¬
gramm Schleifen enthalten sind, hat dies jedoch meist zur Folge, daß
der ganze Bildschirm mit Zahlen vollgemalt wird und die im Programm
vorgesehenen Anzeigen so durcheinandergebracht werden, daß eine
Fehlersuche garnicht mehr möglich ist. Die Anzeige der Zeilenzahl er¬
folgt nämlich da, wo sich der Läufer (Cursor) gerade befindet, d. h.
in der Regel nach der zuletzt angezeigten Zeilenzahl, wenn auf dem
Bildschirm gerade nichts neues geschrieben wurde. Als Abhilfe kann
man an jeder Programmzeile die Anweisung PRINT CHR$(28) anfü¬
gen, was den Läufer immer wieder in die linke obere Bildschirmecke
befördert. Dann werden die Zeilennummern nur dort angezeigt, doch
ist dies ein recht mühsames Verfahren und kann das eigentliche Pro¬
gramm leicht durcheinanderbringen. Besser ist es, der TRS-80-Anlei-
tung zu folgen und TRON sowie TROFF als Anweisungen im Pro¬
gramm zu verwenden. Vor und nach einer zu überprüfenden Zeile
eingesetzt, zeigen die beiden Befehle nur deren Nummer und die Num¬
mer der TROFF-Befehlszeile an, was das übrige Bild auf dem Bildschirm
nicht allzusehr stören dürfte.
Unverzichtbarer Bestandteil jeder Programmierarbeit am TRS-80
ist natürlich die "EDIT"-Betriebsart mit ihrem Satz von 14 eigenen Be¬
fehlen. Allerdings erfordert die nutzbringende Anwendung der viel¬
fältigen Möglichkeiten zur Veränderung vorhandener Programmzeilen
einige Übung, und auch wer BASIC bereits beherrscht, muß hier noch
einmal etwas Mühe zum Erlernen der Anweisungen aufbringen. Doch
der Aufwand lohnt sich, und mit wachsender Erfahrung wird man die
Vor- und Nachteile der einzelnen Befehle für die verschiedenen Anwen¬
dungszwecke bald abschätzen lernen und immer kompliziertere Ein¬
griffe vornehmen, ohne die betreffende Programmzeile neu schreiben
zu müssen.
Während sich der Computer in der EDIT-Betriebsart befindet, ist aller¬
dings erhöhte Aufmerksamkeit bei der Bedienung dringend zu empfeh-
26
len. Fehler, die durch Unachtsamkeit oder durch das ärgerliche Tasten¬
prellen entstehen, werden nicht verziehen, und als Folge davon kann
die in Bearbeitung befindliche Zeile verstümmelt werden oder manch¬
mal sogar einfach verschwinden. Am schwerwiegendsten ist es, wenn
als Folge einer mißglückten Redigier-Arbeit die Zeile zwar äußerlich
intakt aussieht, im zugehörigen Befehlscode aber Fehler zurückgeblie¬
ben sind. Dann reagiert der Computer mit einer unerklärlichen Fehler¬
meldung und es hilft nur vollständiges Neuschreiben der Zeile — genau
das, was man mit dem Einsatz der EDIT-Möglichkeit verhindern wollte.
Deshalb sollte man den EDIT-Vorgang am besten sofort abbrechen,
sobald sich ein Fehler zeigt, und von vorne beginnen.
Über die Fehlererkennung und -anzeige durch den TRS-80 ist im Ka¬
pitel über das Betriebssystem schon ausführlicher gesprochen worden.
An dieser Stelle bleibt vielleicht noch zu sagen, daß für den ungeübten
Programmierer die Anzeige von Art und Programmzeile eines Fehlers
zunächst das wichtigste Hilfsmittel beim Erstellen von Programmen
überhaupt ist. Wenn man die schlichten Tippfehler außer Acht läßt,
werden derartige Pannen mit wachsender Erfahrung jedoch seltener,
so daß die Anzeigen für die Programmierarbeit an Bedeutung verlie¬
ren. Eine Ausnahme machen vielleicht die Meldungen OM (out of
memory) und OS (out of string space), die anzeigen, daß die gesamte
Speicherkapazität bzw. der für Zeichenreihen reservierte Platz belegt
ist. Diese beiden Anzeigen kann man dazu verwenden, ein umfangrei¬
ches Programm auf den vorhandenen Speicherraum zuzuschneiden und
für die Zeichenreihen den kleinsten, gerade noch ausreichenden Platz
zu reservieren.
Als einigermaßen mühsam stellt sich heraus, den Sinn der 23 verschie¬
denen Fehlerabkürzungen zu erlernen, so daß man nicht ständig in der
Anleitung nachschauen muß. Allerdings treten besonders einige wenige
Fehler immer wieder auf, deren Abkürzungen man schnell gelernt
hat.
Ganz praktisch ist die Tatsache, daß der Computer bei einem „Recht¬
schreibefehler" (SN = syntax error) gleich von selbst mit der fehlerhaf¬
ten Zeile in die ED IT-Betriebsart geht. In diesem Fall muß der Fehler
ja durch Änderungen an derselben Zeile behoben werden, in der er auf¬
trat. Für andere Fehlertypen gilt dies nicht unbedingt.
Als weitere Programmierhilfe wäre schließlich auch noch die Anweisung
"ERROR" zu nennen. Mit einer Zahl zwischen 1 und 23 versehen,
simuliert der Befehl einen der 23 erfaßten Fehlerarten, die außer der
Abkürzung als Kennzeichen auch eine laufende Nummer haben. Der
ganze Vorgang dient in erster Linie zum Testen von ON ERROR
GOTO-Routinen, die weiter hinten im Buch behandelt werden. Große
Bedeutung hat ERROR nicht, da sich die Fehlerroutinen auch ganz gut
ohne besondere Hilfsmittel überprüfen lassen.
28
Numerische Variable
Im Gegensatz zu den anderen vergleichbaren Microcomputern wartet
der mit BASIC Level II ausgerüstete TRS-80 mit vier verschiedenen
Variablen-Typen auf, davon drei unterschiedliche numerische Variable.
Die für andere Systeme typische neunstellige Genauigkeit der nicht
ganzzahligen Variablen ist dabei gewissermaßen aufgespalten in eine
sechsstellige und eine 16-stellige ( !) Version. Die in den verschiedenen
BASIC-Versionen ziemlich einheitlich vorhandenen Funktionen, die es
hier auch gibt, lassen sich aber nur mit den sechsstelligen und den ganz¬
zahligen Variablen anwenden. Bei den 16-stelligen Zahlen sind nur die
vier Grundrechenarten +, —, x und / möglich.* Von diesen Besonder¬
heiten abgesehen, unterscheidet sich das Radio Shack Level II BASIC
nicht von anderen Versionen der Computersprache. Die ganzzahligen
Variablen umfassen den Bereich von —32768 bis + 32767, die beiden
anderen Typen den Bereich von ca. — 1,7 x 10^8 bis + 1,7x10^8.
Ohne Zweifel steckt hinter dieser Aufteilung der Variablen-Genauig-
keit in zwei Stufen auch die Absicht des Herstellers, das Rechnersystem
für weitreichendere, kommerzielle Einsatzgebiete geeignet zu machen,
wo z. B. für Buchhaltung oder ähnliches 16-stellige Genauigkeit, aber
keine höhere Mathematik gebraucht wird. Für die komplizierteren
Rechenvorgänge ließ die gegebene Leistungsfähigkeit desBASICs dann
wohl nur noch die sechs Stellen der „einfachen" Variablen zu. Der
Schnelligkeit des Rechners kommtdiese geringere Genauigkeit jedenfalls
zugute, und für die meisten Anwendungsfälle dürften die sechs Stellen
sicher auch mehr als genügen.
Wie schon erwähnt, verfügt der TRS-80 über die üblichen Funktionen,
die aber auf sechs Stellen Genauigkeit beschränkt sind. Als Besonder¬
heit gibt es hier zwei verschiedene Funktionen, die den ganzzahligen
Anteil einer nicht ganzzahligen Nummer liefern: INT(x) und FIX(x).
INT(x) rundet immer ab, FIX(x) schneidet einfach die Stellen hinter
dem Komma ab. Bei negativen Zahlen gibt das einen Unterschied:
INT(—3.4)=—4, aber FIX(-3.4)=-3.
Allerdings sind von Tandy Unterprogramme in Maschinensprache
erhältlich, die Wurzelziehen u. s. w. mit 16-stelliger Genauigkeit
erlauben.
Obwohl der Rechner intern sieben Stellen verwendet und dann eine
auf sechs Stellen gerundete Zahl anzeigt, hapert es ein wenig mit der
Genauigkeit der kalkulierten Funktionswerte. Beim Potenzieren ist das
noch am leichtesten zu erkennen: 3 t 4 ergibt z. B. 81,0001 statt
richtig 81, 3 t 6 729,001 statt 729. Auf die Richtigkeit der letzten
Stelle sollte man sich also zumindest bei solchen Werten nicht allzu¬
sehr verlassen.
30
Zeichenreihen (Strings)
Einen weiteren Beweis für seine Leistungsfähigkeit gibt der TRS80
mit den Möglichkeiten zur Behandlung von Zeichenreihen, „Strings".
Die größte Länge eines Strings beträgt stattliche 255 Zeichen. Außer
den in anderen Microcomputern auch vorhandenen Funktionen zum
Manipulieren von Zeichenreihen gibt es noch die Funktion STRING$
(n, x). Sie bildet eine Reihe gleicher Zeichen, wobei n die Anzahl der
Zeichen ist (bis zu 255) und x das Zeichen angibt, entweder das Zei¬
chen selbst in Anführungszeichen, oder die entsprechende Zahl des
ASCII Codes. Dies ist vor allem für graphische Zwecke sehr praktisch.
Die Zahlen 0 bis 31 des Codes sind, wie bereits erwähnt, zum Teil mit
Funktionen für die graphische Ausgabe belegt, die Zahlen ab 128 mit
den 64 graphischen Zeichen und bis zu 63 Leerstellen. So lassen sich
mit Hilfe der beiden Funktionen CHR^ (n), STRING£(n,x) und sämt¬
lichen Buchstaben, Zahlen, Zeichen und Funktionen beliebige Figu¬
ren, Schriftbilder u. s. w. als Zeichenreihen zusammenstellen und durch
Aufruf eines Zeichens auf dem Bildschirm darstellen. Der Phantasie
des Programmierers sind hier kaum noch Grenzen gesetzt.
Da der zum Speichern von Strings reservierte Raum durch den Befehl
CLEAR n vor dem Start eines Programms oder im Programm selbst
angegeben werden muß (sofern er 50 Byte Speicherstellen übersteigt),
gibt es auch die Anweisung FRE(A^), die ähnlich dem MEM für den
gesamten Speicherraum den für Zeichenreihen noch zur Verfügung ste
henden Platz aufruft.
Das "A$" ist dabei nur eine Pseudovariable ohne praktische Bedeu
tung. Es muß allerdings eine String-Variable oder ein String sein. Mit
einer Zahl oder einer numerischen Variablen liefert FRE wie MEM
den gesamten Speicherraum.
Zahlen- und Zeichenfelder (Matrizen)
Mit der Anweisung DIM(....) lassen sich in der BASIC-Sprache bekannt¬
lich Zahlenfelder und Zeichen definieren, die auch mehrdimensional
sein können, das heißt, durch mehr als eine Kennzahl bestimmte Ele¬
mente enthalten. Beim Radio Shack Level II BASIC ist die Zahl der
Dimensionen nicht begrenzt, doch auch mit 16K freier Speicherkapa¬
zität ist es kaum sinnvoll, über die Dimension 3 hinauszugehen. Allzu-
31
schnell verbraucht sich der Speicherraum, und man kann weniger Zah¬
len (oder Programmlänge) unterbringen, als mit mehreren, kleiner di¬
mensionierten Feldern. Die vier-dimensionale Matrix X(7,7,7,7) aus
Zahlen einfacher Genauigkeit (sechs Stellen) läßt sich nicht einmal
mehr im sonst leeren 16-K-Speicher unterbringen, wohl aber sieben
dreidimensionale Matrizen A(7,7,7) bis G(7,7,7), die zusammen eben
soviele Zahlen enthalten, nämlich 2401. Außerdem bürden hochdi¬
mensionierte Matrizen dem Computer viel zusätzliche Arbeit auf, und
er wird entsprechend langsamer.
Die bei Microcomputern allgemein nicht verfügbaren Matrix-Befehle
findet man beim TRS-80 auch nicht — das wäre bei dem Preis der
Anlage wohl auch etwas viel verlangt. Immerhin wird man wenigstens
die Anweisung MAT X = ZER, die alle Elemente der Matrix X gleich
Null setzt, nicht allzusehr vermissen. Dies steht nicht selten am An¬
fang eines Programms und das Level II BASIC setzt bereits mit dem
Startbefehl RUN (oder mit CLEAR) alle Variablen auf Null.
Automatisch werden übringens allen im Programm auftauchenden Fel¬
dern je Dimension elf Elemente zugeordnet (Nummern 0 bis 10). Falls
man nicht mehr Elemente braucht oder aus Platzgründen die betreffen¬
de Matrix kleiner dimensionieren will, kann man sich die DIM-Anwei-
sung ganz sparen.
Variablen-Namen
Bezeichnen kann man die Variablen mit einem oder zwei Buchstaben
oder mit einem Buchstaben und einer Zahl. Man kann auch längere Be¬
zeichnungen verwenden, sie müssen jedoch immer mit einem Buchsta¬
ben beginnen. Sinn hat das nur als Orientierungshilfe beim Programmie¬
ren, denn der Computer hält verschiedene Variable allein an den ersten
beiden Stellen auseinander. Ansonsten macht es bloß mehr Mühe und
kostet zusätzlichen Speicherraum. Insgesamt ergeben sich um die 900
verschiedene Namen für jeden Variablen-Typ und zusätzlich ebensoviel
für jeden Matrix-Typ,- sicher mehr, als man selbst im kompliziertesten
Programm brauchen wird. Die sich rechnerisch aus den obigen Anga¬
ben ergebende Zahl von 962 Namen pro Variablen-Typ verringert sich
dadurch etwas, daß Namen nicht verwendet werden können, die BA-
SlC-Wörter enthalten.
32
Bestimmung der Variablen-Typen
Entsprechend der größeren Zahl verschiedener Arten von Variablen gibt
es schon theoretisch auch eine größere Menge von Möglichkeiten, sie
festzulegen, zwischen ihnen zu wechseln u. s. w. Und hier hat der Her¬
steller eine Menge getan, um dem Programmierer die Mittel zum Er¬
stellen leistungsfähiger und dabei platzsparender Programme in die
Hand zu geben. Auf vielfältige Art kann man dementsprechend insbe¬
sondere mit den Zahlenwerten verschiedener Genauigkeit umgehen.
Es gibt aber auch ebensoviele Möglichkeiten, Fehler zu machen, die
dann in der Regel unbemerkt zu falschen Ergebnissen einer Computer¬
berechnung führen. Es gehört schon einige Übung dazu, unter den ge¬
gebenen Möglichkeiten die für den speziellen Fall günstigste herauszu¬
suchen, wenn man mit Zahlen verschiedener Genauigkeit arbeiten
will, und dabei die Fallen umgehen, die sich in den manchmal recht
verzwickten Regeln verbergen.
Es gibt im Ganzen vier verschiedene Wege, um auf den Typ eines Wer¬
tes oder einer Variablen Einfluß zu nehmen: Zunächst ist da einmal das
Aussehen der Zahlen selbst, wenn sie in einem Programm oder in der
direkten Betriebsweise des Computers als „Taschenrechner" verwendet
werden und nicht etwa einer Variablen einen Wert zuweisen.
Dann faßt der Computer ganze Zahlen im bekannten Intervall zwischen
—32768 und +32767 als ganzzahlig auf, bis siebenstellige Werte als
Zahlen mit einfacher Genauigkeit und längere als 16-stellig und verar¬
beitet sie auch so. Ein weiteres Unterscheidungsmerkmal zwischen den
6- und 16-stelligen Zahlen ist bei der wissenschaftlichen Schreibwei¬
se der Buchstabe zwischen Grundzahl und Exponent: E für einfache,
D für "doppelte" Genauigkeit — z. B. 2,5 E+09, 7D— 03.
Sind Variable mit im Spiel, bestimmen sie in den meisten Fällen auch
den Variablen-Typ. Dafür gibt es drei verschiedene Zeichen: % für ganze
Zahlen, ! für kleinere und # für die größere Genauigkeit. Mit den bei¬
den letzteren läßt sich auch die Behandlungsweise von Zahlen beein¬
flussen. Wie das bekannte $ für Zeichenreihen werden auch %, ! und
#dem Variablennamen (bzw. der Zahl) nachgestellt.
Zusätzlich kann man aber auch bestimmte Variable von vornherein als
ganzzahlig, einfach oder doppelt genau definieren. Dazu dienen die
Anweisungen DEFINT, DEFSNG und DEFDBL. Mit einer Liste von
33
Buchstaben oder einem Bereich des Alphabets oder beidem versehen
(z. B. DEFDBL A,C,F,V-Z), bestimmen sie die mit den jeweiligen Buch¬
staben beginnenden Variablen als dem betreffenden Typ zugehörig.
Die kann dann ein nachgestelltes, einem anderen Typ zugehöriges Zei¬
chen im Einzelfall ändern. Natürlich sollten diese Anweisungen, wenn
man sie verwendet, tunlichst am Anfang des Programms stehen. Wird
nämlich irgendeine Variable mitten im Programmablauf plötzlich auf
diese Weise neu definiert, verliert sie ihren augenblicklichen Wert, und
anders als einer neu definierten Matrix erfolgt keine Fehlermeldung, die
auf den Fehler aufmerksam machen könnte. Für Zeichenreihen gibt
es übrigens auch die entsprechende Anweisung — DEFSTR.
Die "Funktionen"(eigentlich nur funktionsähnliche Anweisungen)
CINT(x), CSNG(x) und CDBL(x) liefern schließlich ganzzahlige, 6-
bzw. 16-stellige Darstellungen irgendwelcher numerischer Ausdrücke.
CINT(x) unterscheidet sich dabei äußerlich von der Funktion INT(x)
nur dadurch, daß es auf den Intervall der ganzzahligen Variablen be¬
schränkt ist und scheint damit wenig Sinn zu haben. Doch ist der
Zweck von CINT(x) nicht nur die Umwandlung in eine ganze Zahl
allein, sondern die Nutzung der speziellen Eigenschaft der ganzzahli¬
gen Darstellungsweise, nämlich hohe Rechengeschwindigkeit, für
eine bestimmte, einzelne Rechenoperation.
Entsprechendes gilt auch für CSNG(x) und CDBL(x). Anders als bei
festen Zahlen läßt sich das bei Variablen mit Hilfe der Typ-Zeichen
nicht machen, da ja verschiedene Zeichen dieser Art in Zusammenhang
mit dem sonst gleichen Variablen-Namen verschiedene Variablen
bedeuten. A% ist eben nicht die ganzzahlige Version von AI, sondern
ein ganz anderer Wert.
Wenn man ganz auf die Typdefinitionen, Variablenzeichen u. s. w. ver¬
zichtet (bei den Strings geht das natürlich nicht), arbeitet der Compu¬
ter selbsttätig mit einfacher Zahlengenauigkeit. Dies ist wie gesagt er¬
fahrungsgemäß in den allermeisten Fällen auch ausreichend, und man
wird weder die Anweisungen und das Zeichen für die einfache noch
für die doppelte Genauigkeit viel verwenden. Andererseits sollte man
sich auf jeden Fall für bestimmte Aufgaben die größere Schnelligkeit
der ganzzahligen Größen zunutze machen. Am besten und einfachsten
läßt sich das machen, indem man einige Buchstaben am Anfang des
34
Programms mit dem DEFINT-Befehl reserviert. Damit werden dann
die Zählaufgaben in Programmschleifen sowie ähnliche Funktionen
ausgeführt, was merklich beschleunigend auf die Programmausführung
wirkt und nebenbei auch Speicherraum spart.
Auf die Definition von String-Variablen kann man natürlich nur
verzichten, wenn man in dem betreffenden Programm ganz ohne Zei¬
chenreihen auskommt. Damit bedient man sich allerdings der äußerst
eleganten Programmiertechniken, die gerade das Radio Shack Level
II BASIC auf diesem Gebiet bietet. Das DEFSTR hat zwar keine funk¬
tioneilen Vorteile gegenüber dem String-Zeichen $. In manchen Pro¬
grammen, die besonders auf den geschickten Einsatz von Zeichenreihen
abzielen, kann man sich aber das Schreiben einer ganzen Menge von
^-Zeichen ersparen.
Die bei der gemischten Anwendung der verschiedenen numerischen
Variablen-Typen gegebenen Fehlermöglichkeiten beruhen vor allem da¬
rauf, daß Variablen mit einfacher Genauigkeit nicht in Größen mit 16
Stellen umgewandelt werden dürfen. Dabei kommen nämlich Zahlen
heraus, die in den Stellen, die die ursprüngliche Zahl hatte, zwar mit
ihr übereinstimmt oder fast übereinstimmt. Die restlichen Stellen bis
zur Gesamtanzahl von 16 werden aber nicht mit Nullen ausgefüllt
(die dann bei der Anzeige unterdrückt würden), sondern mit irgendwel¬
chen zufälligen Ziffern. Damit sieht die Zahl natürlich anders aus als
vorher und ein Fehler entsteht. Daß dies so leicht geschehen kann,
liegt wiederum daran, daß der Computer Werte ohne besondere Vor¬
schriften als einfache Variable behandelt, und dies kann an Stellen der
Fall sein, wo man fest überzeugt ist, es nur mit 16-stelligen Werten zu
tun zu haben. Wer würde zum Beispiel so ohne weiteres darauf kom¬
men, daß es bei dem Ausdruck A#=2/3 der Fall ist? Dennoch ist es
so, weil zuerst die Rechnung "2 durch 3" durchgeführt wird, und zwar
ohne besondere Vorschrift und daher in einfacher Genauigkeit. Dann
erhält das doppelt genaue A# den in einfacher Genauigkeit gebildeten
Wert zugewiesen, und das Unglück ist geschehen.
Selbst ein so unschuldig aussehender Ausdruck wie A#=3.2 führt
(fast immer) zu einem Fehler! Der Grund dafür ist: Zuerst wandelt der
Computer den Wert 3.2, der für sich allein ja keine besondere Ge¬
nauigkeitsanweisung hat, in den entsprechenden Binärwert um, und
zwar in sechsstelliger Genauigkeit. Dann folgt die — jetzt fehlerhafte
35
— Zuweisung zur doppelt genauen Variablen A#. Richtig ist diese
Schreibweise: A# = 3.2#. Andererseits führt eine Zahleneingabe im Pro¬
grammablauf in der Form INPUT A# natürlich auch dann zum rich¬
tigen Ergebnis, wenn man beim Eintippen das # wegläßt. Mit dem #
Zeichen ist es ebenfalls in Ordnung. Wenn man allerdings das ! für die
einfache Genauigkeit der eingegebenen Zahl anfügt, gibt es wieder den
Fehler. So wird nämlich die interne Bildung des einfach genauen Wer¬
tes erzwungen, ehe die doppelte Genauigkeit zum Zuge kommt. Anders
herum, das heißt bei Eingabe einer doppelten genauen Zahl auf Anfor¬
derung einer "normalen", (etwa indem man eine mehr als 7-stellige
Zahl eingibt, das # verwendet oder die Form "xxx D xx" wählt), gibt
es wiederum keinen Fehler.
Zu den ganzen Zahlen an dieser Stelle noch zwei Bemerkungen: Ein
Ausdruck dieser Art: 45.3%, also ein Dezimalbruch mit angehängtem
% für ganzzahlige Variable führt immer zu einem Syntax-Fehler, selbst
wenn man es als Reaktion auf eine INPUT-Anweisung im Programm
eintippt. Wenn man auf INPUT A% eine mehr als siebenstellige Zahl
eingibt (im zugelassenen Bereich —32768 bis 32767) können manchmal
seltsame Dinge geschehen, obwohl eigentlich immer automatisch ab¬
gerundet werden soll. 1.9999999 wird richtig zu 1, aber 1.99999999
zu 2. 32767.999 ergibt noch die größtmögliche Zahl 32767,32767.
9999 erzeugt aber bereits die Fehlermeldung OV ERROR für den
Überlauf.
Etwas umständlich wird es, wenn eine 16-stellige Variable einen Wert
in der Form eines Rechenausdrucks zugewiesen bekommen soll — in
der Art wie oben ausgeführt. Dann muß nämlich jeder Dezimalbruch
(d. h. jede Zahl mit "etwas hinter dem Komma") ein #-Zeichen bekom¬
men, wenn die Zahl als Ganzes keine 16 Stellen hat. Bei manchen
Brüchen kann es auch so gut gehen, aber man sollte sich darauf nicht
verlassen. Ganze Zahlen innerhalb eines Rechenausdrucks werden auch
ohne # richtig verarbeitet, aber nur, wenn man sich an bestimmte
Regeln hält: Man muß dafür sorgen, daß die Berechnung mit doppelter
Genauigkeit beginnt und nicht irgendwo von einfacher Genauigkeit
zur doppelten überspringt.
Einerseits rechnet der Computer von links nach rechts. Daher muß
eine der ersten beiden Zahlen einer Kette von Multiplikationen und
36
Werkbild von Fa. TANDY: TRS-80 mit Floppy-Disk und Drucker
37
Divisionen das # erhalten. Es sei denn, die erste Berechnung von links
hat als Ergebnis eine ganze Zahl. Dann funktioniert die Sache auch
mit dem # hinter der dritten Zahl, und so fort. Andererseits werden
bei gemischten Ausdrücken ("Punkt " und "Strichrechnung") die
Multiplikationen/Divisionen enthaltenden Teile jeweils in der angeführ¬
ten Weise mit dem # versehen. Der Computer führt sie nämlich jeweils
getrennt als erstes aus (wie es ja auch den bekannten Rechenregeln
entspricht), und dies muß natürlich jedesmal in der richtigen Weise,
nämlich mit 16-stelliger Genauigkeit geschehen.
All dies muß auch beachtet werden, wenn man den TRS-80 als „Ta¬
schenrechner gebraucht und dabei ohne Programm mit der größeren
Genauigkeit rechnen will.
Man sieht also, die Anwendung der 16-stelligen Werte ist nicht ganz
problemlos, und es kann sicherlich nicht schaden, sich die Verfahrens¬
regeln mit ein wenig Geduld gründlich zu eigen zu machen, ehe man
sich an entsprechende Programme wagt. Eventuell auf diese Weise in
ein Programm eingebaute Fehler sind ja nicht ohne weiteres festzu¬
stellen und erzeugen auch keine Fehlermeldung.
Bei den anderen Möglichkeiten zum Übergang zwischen numerischen
Größen unterschiedlicher Art gibt es glücklicherweise keine solchen
Fußangeln. Bei einer Übertragung von einem 6- oder 16-stelligen Wert
auf eine ganzzahlige Größe wird wie in anderen BASIC-Versionen eben¬
falls üblich immer abgerundet. Übrigens haben alle Funktionen, die
eigentlich nur mit ganzen Zahlen arbeiten, diese Eigenschaft gewisser¬
maßen zum Teil mit eingebaut, so daß sie auch mit 6-stelligen Werten
arbeiten können (nicht aber mit 16-stelligen). Die übliche „kaufmänni¬
sche" 4/5-Rundung erreicht man übringens, indem man zu der jeweili¬
gen Zahl 0.5 hinzuaddiert. Dadurch werden alle Werte über ...,5 über
die nächsthöhere ganze Zahl hinausgeschoben und deshalb zu dieser
abgewertet. So kommt dann die erwünschte Aufrundung heraus.
(Ein Beispiel: A=3,9: INT(A)=3 aber INT(A+.5)=4, weil A+.5=4.4 ist)
Beim Übergang von 16- auf sechsstellige Zahlen soll eigentlich korrekt
nach 4/5 gerundet werden. Doch ist hier auch ein wenig Vorsicht ge¬
boten: Ganz richtig funktioniert die Sache nicht. Aus der genaueren
Zahl 0,44444444 wird zum Beispiel nicht etwa 0,444444, was richtig
38
wäre, sondern der Computer rundet falsch zu 0,444445 auf. Sicher
lassen sich noch mehr solche Beispiele finden, wenn man sich an der
Grenze zwischen Auf- und Abrundung bewegt. Wenn es in einem spe¬
ziellen Fall darauf ankommt, sollte man dies vielleicht ausprobieren,
ehe die entsprechende Befehlszeile in ein Programm eingebaut wird.
Ein- und Ausgabe
Bei der Eingabe von Daten im laufenden Programm bewegt sich der
TRS-80 so ziemlich auf der Linie der übrigen Microcomputer. Mit dem
INPUT-Befehl lassen sich Daten von der Tastatur übernehmen. Dabei
ist wieder zwischen den verschiedenen Variablen-Typen zu unterschei¬
den. Da INPUT sich auch mit einer Liste von Zahlen und/oder Strings
ausstatten läßt, berücksichtigt das Betriebssystem des Computers, ob
die korrekte Datenmenge in der richtigen Reihenfolge eingegeben wur¬
de — allerdings in seiner recht kargen Art, von der schon vorher die Re¬
de war:
Wenn noch etwas fehlt, erscheinen zwei Fragezeichen. Fehler bei der
Zahleneingabe beantwortet er mit einem simplen "REDO", was auf
Deutsch "mach' es noch einmal" heißt. Wird zuviel eingegeben, d. h.,
ist die durch Kommas getrennte Datenliste zu lang, rafft er sich zu
einem "EXTRA IGNORED" ("Restliches nicht beachtet") auf und
übernimmt nur das, was er braucht.
Dies kann relativ leicht passieren, da an einem Komma für den Compu¬
ter eine Zahl oder eine Zeichenkette zuende ist - im letzteren Fall,
wenn sie nicht in Anführungszeichen steht. Setzt man also versehent¬
lich nach deutscher Art ein Komma statt eines Dezimalpunktes, oder
vergißt ein String, die Kommas (oder Doppelpunkte) enthalten, die
Anführungszeichen, bekommt man das EXTRA IGNORED als Ant¬
wort. Am Ende einer Eingabeliste, oder wenn man die Zeichenreihen
einzeln eintastet und dazwischen immer wieder ENTER drückt, kann
man sich das zweite Anführungszeichen wie beim PRINT-Befehl schen¬
ken.
Recht praktisch ist es, daß man bei der Eingabe längerer Zahlen belie¬
bige Zwischenräume zwischen den einzelnen Ziffern machen kann.
So kann man sie zur besseren Übersichtlichkeit zum Beispiel in Dreier¬
gruppen gliedern. Vorsicht ist wieder bei der Eingabe von Daten in der
16-Stellen-Form geboten. Wählt man dabei die wissenschaftliche
39
Notierung, muß unbedingt das die 16 Stellen kennzeichnende D zwi¬
schen Grundzahl und Exponent stehen (nicht das El). Sonst kommt
es zu der unzulässigen, fehlerbehafteten Übertragung eines Wertes von
der sechs- zur 16-stelligen Form. Ansonsten ist diese Form der Eingabe
besonders bei sehr großen sowie sehr kleinen Zahlen mit vielen Nullen
vor oder hinter dem Komma zeitsparend und daher empfehlenswert.
Den Computer stört es auch nicht, wenn man dabei von der Standard¬
schreibweise (z. B. 4.57834E+02) abweicht und das Komma beliebig
setzt, sowie das Vorzeichen und die Null des Exponenten fortläßt.
Auch kann man bei einfachen Variablen ruhig das D statt dem E ver¬
wenden — der Computer wandelt dann eben einen 16-stelligen Wert
in eine 6-Stellen-Größe um. Aber wie gesagt, anders herum entstehen
Fehler.
INKEY$
Die Anweisung, mit der sich Daten ohne die ENTER-Taste (und damit
auch ohne Programm-Unterbrechung) vom Tastenfeld holen lassen,
heißt beim Radio Shack-BASIC INKEY$. Wie das $ am Ende schon an¬
deutet, ist es der Form nach keine Anweisung, sondern eine String-
Funktion. Entsprechend muß INKEY$ auch im Programm verwendet
werden: Der Befehl, oder besser die Wertzuweisung, die man verwenden
muß, heißt A$=INKEY$, und damit übernimmt das Programm ein
Zeichen von der Tastatur und keinen Zahlenwert. So muß nicht zwi¬
schen Buchstaben und Zahlen unterschieden werden, aber zur Über¬
nahme von Ziffern ist dafür noch die Funktion VAL(A$) einzusetzen
(in der Form A=VAL(A^)).
Die Art, in der Information vom Tastenfeld in den Computer gelangt,
hat für den INKEY$-Vorgang charakteristische Folgen, die man in
manchen Fällen nicht außer Acht lassen kann: Zunächst erzeugt jedes
Drücken einer Taste nur ein einmaliges Signal, so daß wiederholtes
Abfragen mit INKEYS erst beim jeweils nächsten Tastendruck zu ei¬
nem Resultat führt. Durch einfaches Niederhalten einer Taste kann
man keinen dauernden Vorgang auslösen. Doch außerdem übernimmt
INKEY$ immer das zuletzt durch Tastendruck erzeugte Signal, auch
wenn dies schon länger zurückliegt. Das kann zu Schwierigkeiten
führen, wenn nach Auftauchen des INKEY^ erst ein Tastendruck ab¬
gewartet werden soll. Abhilfe schafft in diesem Fall ein zweites, kurz
vorher im Programm (aber nicht in der Warteschleife des eigentli-
chen INKEY$) angeordnetes INKEY$, das die Tastatur gewissermaßen
zunächst abräumt (und keine weitere Funktion im Programm hat).
Eine der besten Prüfsteine für die wahren Qualitäten eines Computers
— und nicht nur eines Microcomputers, wohlgemerkt — sind die Mög¬
lichkeiten der Datenausgabe. Und hier kann der TRS-80 wahrhaft
glänzen. Wenn sich dies alles auch bei der normalen Geräte-Konfigu-
ration nur auf dem Bildschirm abspielt — was Radio Shack hier in
Verbindung mit der 16-stelligen Genauigkeit mit seinem Level ll-BA-
SIC bietet, weist geradewegs zur ernsthaften kommerziellen Anwen¬
dung, die mit den Ausbaumöglichkeiten des Systems ins Auge gefaßt
wird. Wenn dies die Möglichkeiten des privaten Anwenders im allge¬
meinen wohl auch übersteigen wird. Doch auch ihm stehen die vielfäl¬
tigen Spielarten der Datenausgabe bereits für seinen Bildschirm zur
Verfügung.
Die Standardausstattung der Microcomputer — PRINT mit dem Tabu¬
lator TAB(x) und eventuell auch der Funktion POS(x), die die momen¬
tane Position des Cursors auf der Zeile angibt — sind hier natürlich
auch vorhanden, zusammen mit den üblichen Formatzeichen ; und ,
mit denen man anschließen läßt bzw. vier Spalten auf dem Bildschirm
erzeugt . Wenn es dabei keine Unklarheiten gibt, kann man das Semi¬
kolon auch weglassen und die verschiedenen, zu druckenden Werte
und Zeichenreihen im Programm unmittelbar zusammenschreiben.
Aber schon ungewöhnlicher ist das PRINT @, über das der TRS-80
verfügt. Mit einer Zahl zwischen 0 und 1023 versehen, läßt diese An¬
weisung das zu Druckende an dem betreffenden der 1024 Druckpo¬
sitionen des Bildschirmes erscheinen (16 Zeilen zu je 64 Stellen).
Damit kann man jeden Punkt des Schirms also direkt erreichen. Laut
Anleitung gibt es bei dieser Anweisung anschließend den üblichen
"Wagenrücklauf", d. h., der Cursor, der während der Programmaus¬
führung allerdings normalerweise nicht sichtbar ist, rückt auch in der
letzten Zeile zum Anfang der nächsten Zeile vor und hebt dabei das
ganze Bild um eine Zeile. Dies soll sich mit dem bekannten ; unter¬
drücken lassen. Leider gilt dies für die letzte Stelle jeder Zeile nicht,
da der Cursor ja auf jeden Fall zur nächsten Stelle vorrückt, die in die¬
sem Fall eben auf der nächsten Zeile liegt. Für die letzte Zeile bedeutet
das aber, daß sich deren letzte Stelle mit PRINT@ nicht nutzen läßt,
ohne das Bild hochrücken zu lassen.
41
Vollends ungewöhnlich für einen Microcomputer dieser Art ist schlie߬
lich die mit PRINT zusammen verwendbare Formatanweisung USING.
Mit ihrer Hilfe lassen sich Zahlen mit beliebiger Stellenzahl vor und
hinter dem Komma, mit vorangehender oder nachfolgender Bezeich¬
nung, mit Vorzeichen vorne und hinten u. s. w. ausdrucken. Möglich
ist es auch, die wissenschaftliche Schreibweise stets zu erzwingen, doch
in der Praxis wird man wohl genau den umgekehrten Weg gehen und die
Ausgabe von Zahlen mit Grundzahl und Exponent mit PRINT USING
unterdrücken. Das gewünschte Format wird jeweils in einer Zeichenrei¬
he angegeben, die sich praktischerweise auch als String-Variable im Pro¬
gramm verwenden läßt. Am besten wird man wohl daran tun, sich die
Regeln für die Bildung dieser Zahlenreihen einmal vorzunehmen und
selbst auszuprobieren, was hier alles möglich ist.
Dazu noch ein paar Hinweise, die vielleicht nicht mit genügender
Deutlichkeit aus der Anleitung für den Computer hervorgehen: Zu¬
nächst zeigt sich gerade auch mit dem PRINT USING die amerikani¬
sche Herkunft der Maschine recht deutlich. Eine der Möglichkeiten
besteht nämlich darin, ein Dollarzeichen vor der Zahl „schwimmen"
zu lassen. Für uns wäre "DM" hier sicher angebrachter, damit geht es
aber leider nicht. Durch ein irgendwo im Zahlenfeld vor dem Dezimal¬
punkt angeordnetes Komma läßt sich dieser Teil der Zahl in Dreier¬
gruppen einteilen, die jedoch ebenfalls in englisch-amerikanischer
Manier durch Kommas getrennt sind.
Verschiedene Formathinweise lassen sich in der Zeichenreihe kombi¬
nieren, doch muß das Vorzeichen dabei am Anfang oder Ende des Zah¬
lenfeldes stehen. Wohlgemerkt: des Zahlenfeldes. Außerhalb können
dann noch beliebige Namen, Bezeichnungen u. s. w. stehen, die dann
entsprechend mit abgedruckt werden. Wird das Vorzeichen nicht extra
spezifiziert, muß dafür gegebenenfalls (wenn negative Zahlen zu erwar¬
ten sind) eine Stelle im Zahlenfeld reserviert werden.
Das Zahlenfeld darf einschließlich Vorzeichen, Dezimalpunkt u. s. w.
höchstens 24 Stellen lang sein, sonst erfolgt eine Fehlermeldung. Aller¬
dings hat diese Einschränkung wenig praktische Bedeutung, da sich
auch mit PRINT USING nur höchstens 16-stellige Zahlen in die nor¬
male Schreibweise bringen lassen. Längere werden in jedem Fall in
wissenschaftlicher Notation gedruckt.
42
An dieser Stelle ist vielleicht auch eine Bemerkung zu den Möglichkei¬
ten von Interesse, die beim TRS-80 zur schriftlichen Datenausgabe be¬
stehen: Wie bekannt, läßt das Interface-Bauteil, mit dem sich der Com¬
puter erweitern läßt, auch den Anschluß eines Druckers zu. Dabei er¬
gibt sich eine Erweiterung des BASICs um die beiden Befehle LLIST
und LPRINT, die mit (fast) allen Spielarten der entsprechenden Anwei¬
sungen PRINT und LIST die Tätigkeit des Druckers kontrollieren. Nun
sind die beiden Druckerbefehle in Wahrheit schon im normalen Level
ll-BASIC enthalten. Sofern sich also Drucker oder auch elektronisch
gesteuerte Schreibmaschinen direkt an den Computer anschließen
lassen — und dies ist im Prinzip tatsächlich möglich — kann er die Ge¬
räte ebenso gut auch ohne Erweiterungsbauteil steuern. Davon soll
später noch die Rede sein.
Auch als Speicher für größere Datenmengen verwendet der TRS-80
bekanntlich einen ganz gewöhnlichen Cassettenrecorder. Und das ge¬
schieht in diesem Fall mit zwei ganz simplen Befehlen, nämlich
PRINT# -1 und INPUT#-1. Formatierung in sogenannten Files,
die gezieltes Ablegen und wieder Aufsuchen von Daten zulassen, ist in
diesem System nicht vorgesehen. Es liegt nahe, daß man sich diesen
Aufwand gespart hat, weil das Speichern und Zurückholen der Daten
mit dem dafür nicht konstruierten Tonbandgerät eine derart zeitrau¬
bende Angelegenheit ist, daß der Benutzer zumindest bei größeren Da¬
tenmengen gezieltes Suchen und Ablegen bald aufgeben und sich auf
das Bewegen zusammenhängender Datenblöcke beschränken wird.
Dazu noch zwei Anmerkungen, die man im Auge behalten sollte, um
keine Enttäuschungen zu erleben: Zahlen und Zeichen werden durch
den Computer in unabhängigen Abschnitten jeweils mit einem
PRINT#—1-Befehl auf das Band geschrieben. Diese Blöcke dürfen nicht,
wie in der Anleitung angegeben, bis 255 sondern nur 249 Stellen lang
sein.
Was darüber hinausgeht, wird kurzerhand abgeschnitten und man
wundert sich beim Wiedereinlesen, wo sie wohl geblieben sein können.
Auch werden Zahlen so, wie sie auf dem Bildschirm erscheinen, Ziffer
für Ziffer auf das Band geschrieben. Das bedeutet, die siebte bzw. 17.
Ziffer, die ja intern vorhanden ist, aber aus Genauigkeitsgründen nicht
43
angezeigt wird, geht dabei verloren. Wenn man also eine Zahlenreihe
addiert, dann speichert, wieder auf ruft und wieder addiert, ergibt
sich eine Differenz zur ersten Summe. Dieser Unterschied bleibt aller¬
dings im allgemeinen auch bei der Summe auf die unsichtbare letzte
Stelle beschränkt. Tests auf richtiges Speichern und Lesen von Daten,
die mit einem Vergleich nach diesem Muster durchgeführt werden,
scheitern also, und es sieht dabei so aus, als ob der Computer geheim¬
nisvollerweise an völlig gleichen Zahlen Unterschiede entdeckt. Im
Prinzip ist ein solcher Test allerdings auch nicht notwendig, denn
der Computer kontrolliert bereits selbst richtiges Einlesen und meldet
sich bei einem Fehler mit einer Fehleranzeige.
Um Bedienungsfehler zu vermeiden, empfiehlt sich allerdings eine an¬
dere Art Sicherung in den Speicher- und Lesevorgang einzubauen:
Man kann beim Speichern an den Anfang jedes Datenpakets einen
Buchstaben oder eine Ziffer setzen, mit dessen Hilfe der Computer
die Daten dann beim Lesen wieder erkennt und gleich bemerkt, wenn
man zum Beispiel an der falschen Bandstelle begonnen hat.
Schließlich gibt es auch beim TRS-80 die Anweisung READ, die in
speziellen DATA-Zeilen abgelegte Daten ins eigentliche Programm
übernimmt, und auch das RESTORE, das die Wiederholung dieses
Vorganges ermöglicht, fehlt nicht. Viele Programmierer verwenden
diesen Mechanismus übrigens, um das zeitaufwendige Speichern der
Informationen mit dem doch recht umständlich arbeitenden PRINT#
-1/INPUT#-1-Verfahren zu umgehen. Nachteilig ist dabei, daß das
Programm bei der Datenübernahme keine Hilfe leisten kann, da sie ja
in diesem Fall außerhalb des Programmlaufs durch Schreiben von Pro¬
grammzeilen mit der Anweisung DATA... und einer simplen Liste von
Zahlen und Zeichenreihen geschieht. Doch man kommt in den Genuß
des Vorteils, daß die Daten gleich mit dem Programm zusammen ge¬
speichert und ausgelesen werden. Eine erheblich schnellere Prozedur.
Als zusätzliche Fehlerquelle ergibt sich dabei allerdings, daß bei jeder
Veränderung der Daten auch das Programm neu gespeichert werden
muß. Und dabei empfiehlt sich, wie erwähnt, schließlich auch der Ver¬
gleich des gespeicherten mit dem noch im Computer befindlichen
Programm , was ja ebenfalls Zeit kostet.
44
ON ERROR GOTO
Außer den unbedingten und bedingten Sprungbefehlen, die allen ver¬
gleichbaren BASIC-Versionen gemeinsam sind, bietet das Radio Shack
Level II BASIC eine weitere Art des Sprungs, ON ERROR GOTO. Be¬
dingung, daß ein solcher Sprung ausgeführt wird, ist das Auftreten
irgendeines Fehlers, den der Computer entdecken kann. Auf den ersten
Blick mag das wie eine Programmierhilfe aussehen, in Wirklichkeit ist
es jedoch ein äußerst elegantes und wirkungsvolles Mittel zum Organi¬
sieren eines Programmablaufes, das man mit wachsender Programmier¬
erfahrung immer mehr schätzen lernt. An den Anfang eines Program¬
mes gestellt, hält die Anweisung gewissermaßen ständig Wacht, ob
irgendwo ein Fehler passiert, und veranlaßt daraufhin den Sprung zu
der für diesen Fall vorgesehenen Zeile. Hier sind Anweisungen zu
finden, die den Fehler in passender Weise korrigieren, und mit dem Be¬
fehl RESUME kann der normale Programmablauf mit einem Rück¬
sprung wieder aufgenommen werden. Um die verschiedenen, mög¬
licherweise auftauchenden Fehler für die jeweils angemessene Behand¬
lung auseinanderhalten zu können, gibt es zusätzlich noch zwei Funk¬
tionen: ERL liefert die Nummer der Zeile, in der die Panne passierte,
ERR die Art des Fehlers. Merkwürdigerweise muß man jedoch den Aus¬
druck ERR/2+1 bilden, um zu den bereits erwähnten Fehler-Codezah¬
len zu kommen. Beim RESUME gibt es mehrere Möglichkeiten —
Rücksprung zur selben, zur jeweils nächsten oder zu einer eigens zu
bestimmenden Zeile.
Die Möglichkeiten, diesen Mechanismus zur Gestaltung eines Pro¬
grammes zu verwenden, sind fast unerschöpflich. Wie bereits in der
Anleitung für den Computer ausgeführt, lassen sich zum Beispiel Feh¬
ler ausbügeln, die bei der Dateneingabe passieren können. In der Fehler¬
behandlungsroutine wäre dann auch eine Anweisung zum Drucken
einer Erklärung für den Benutzer enthalten, die auf den Fehler hinweist.
Weiterhin braucht man sich bei der Anwendung um so manche Vor¬
kehrung nicht mehr kümmern, die normalerweise für den Fall erforder¬
lich sind, daß einer Funktion ein Zahlenwert außerhalb seines Defini¬
tionsbereichs zugeordnet wird. Einfachstes Beispiel hierfür sind die
Graphik-Funktionen des TRS-80, nämlich SET(x,y), RESET(x,Y) und
POINT(x,y). Von ihnen soll noch zu sprechen sein, doch hier mag ge¬
nügen, daß die Koordinaten x und y Werte zwischen 0 und 127 bzw.
zwischen 0 und 47 annehmen können. Soll etwa eine geometrische
Figur gezeichnet werden, von der sich absehen läßt, daß sie über den
45
Rand des Bildschirms reicht, braucht man nichts weiter zu tun, als eine
ON ERROR GOTO-Routine vorzusehen, die in der Zeile zur Fehler¬
behandlung lediglich RESUME NEXT enthält. Dann überspringt der
Computer die Zeile mit der graphischen Anweisung so lange, bis der
Bildschirm wieder erreicht und der Graphik-Befehl wieder sinnvoll ist.
In dieser einfachen Form gilt die Anweisung natürlich für alle Fehler,
nicht nur den, den man gerade im Auge hat. Sind noch andere Fehler
zu erwarten, muß innerhalb der ON ERROR GOTO-Routine mit Hil¬
fe von ERL und ERR spezifiziert werden.
Über das mehr oder weniger zwangsläufige Auftreten von derartigen
Problemen hinaus, für die ja auch ohne ON ERROR GOTO irgendwie
Vorsorge getroffen werden muß, läßt die Prozedur aber auch zum
Durchorganisieren von Programmen einsetzen, in dem man von Fall
zu Fall bewußt Fehler einbaut, um den ON ERROR GOTO-Sprung
auszulösen. Dieses Vorgehen ist vor allem dann vorteilhaft, wenn die
ON ERROR GOTO-Zeile sowie die zugehörige Fehlerberichtigung
bereits aus anderen Gründen im Programm erforderlich ist.
Ist beispielsweise ein Programm in mehrere Teile gegliedert, die sich
von einem Auswahl-Programmteil (sogenanntes Menü) aufrufen lassen
und jeweils zur Eingabe von Daten unterschiedlicher Art dienen,
läßt sich in einfachster Weise der Rücksprung zum Menü bewerkstelli¬
gen, das man ja immer wieder aufrufen muß, um zu einem anderen
Teil des Programms zu gelangen. Man läßt jeden dieser
Programmteile mit folgender Zeile beginnen:
xxxx 1=0: INPUT I: J=1/l
Dies erzeugt einen /O-Fehler, wenn kein Wert für I eingegeben, sondern
nur ENTER gedrückt wird. Steht dann in der von dem ON ERROR GO-
TO-Befehl angegebenen Zeile folgendes:
xxxx IF ERR/2+1=11 RESUME yyyy
dann landet man immer wieder beim Menü, das mit der Zeile yyyy be¬
ginnen muß. Sinnvoll ist diese Methode natürlich nur, wenn das INPUT
I auf jeden Fall gebraucht wird, sonst wäre der Aufwand dafür unnötig
groß.
46
Zur Fehlersuche beim Programmieren läßt sich das Verfahren offenbar
nicht verwenden, denn es verhindert ja sogar die Anzeige von Fehlern.
Entsprechend gibt es auch die Anweisung ON ERROR GOTO 0, die,
innerhalb der Routine (vorübergehend) eingefügt, die Fehlermeldungen
wie gewohnt arbeiten läßt, die Prozedur also außer Kraft setzt.
Den zur Fehlerbehandlung dienenden Programmteil, der mit dem ON
ERROR GOTO-Befehl erreicht wird, stellt man günstigerweise an das
Ende des Programms. Im Zuge des normalen Programmablaufs soll er
ja nicht erreicht werden, und dazu müßte man sonst immer Sprünge
über die entsprechenden Zeilen hinweg vorsehen. Wichtig ist auch, daß
eine eventuell für das Programm erforderliche CLEAR-Anweisung
immer vor dem ON ERROR GOTO steht. Ebenso wie zum Beispiel
die Matrix-Dimensionierung mit DIM hebt CLEAR das ON ERROR
GOTO wieder auf, so daß es, vorangestellt, wirkungslos bleibt.
47
Die Graphik des TRS-80
Auf dem Gebiet der graphischen Darstellungen auf dem Bildschirm
hat sich Radio Shack, wie man wohl sagen muß, große Mühe gegeben,
einen möglichst günstigen Kompromiß zwischen drei widerstrebenden
Elementen zustande zu bringen. Private Benutzer legen Wert auf mög¬
lichst reizvolle Gestaltungsmöglichkeiten, doch dem setzt gerade der
Kaufpreis des Systems, der auf diesen Personenkreis zugeschnitten wer¬
den soll, Grenzen. Schließlich bringen erwünschte kommerzielle Ein¬
satzmöglichkeiten andere Anforderungen an Betriebssystem und BASIC
mit sich, als gerade besonders gute Graphik auf dem Bildschirm.
Allerdings kann sich durchaus sehen lassen, was bei diesem Kompromiß
herausgekommen ist. Jede der 1024 Druckpositionen des Bildschirms
ist für graphische Zwecke in sechs Felder eingeteilt, und man erhält
einen echten graphischen Bildschirm mit dem allerdings etwas groben
Raster von insgesamt 6144 Bildpunkten. Diese lassen sich — und das
ist der Hauptvorteil dieses Systems — nun mit den drei Befehlen
SET(x,y), RESET(x,y) und POINT (x,y) direkt ansprechen und abfra-
gen. Das Resultat sind außerordentlich einfache Programme zur Dar¬
stellung beliebiger Bilder — in dem wie gesagt etwas groben Punkt¬
raster. Das Zeichnen von Kurven mathematischer Funktionen wird
auf diese Weise eigentlich überhaupt erst möglich, daher kann man in
den Grenzen eines solchen Microcomputer-Systems von einer echten
Bildschirmgraphik sprechen.
Der Nachteil dieser Methode ist seine vergleichsweise langsame Aus¬
führung. Auch erfordern komplizierte Bilder, die nicht gerade mathe¬
matische Funktion oder etwas ähnliches repräsentieren, doch einen
recht hohen Programmieraufwand. Doch gibt es für solche Fälle, oder
wenn es schneller gehen soll (zum Beispiel bei einem Computerspiel),
noch zwei weitere Möglichkeiten, zu graphischen Darstellungen zu
kommen. Am schnellsten geht es mit den Zahlen des graphischen
Codes (129 bis 191) die man, wie bereits ausgeführt, mit den beiden
Funktionen CHR$(x) und STRINGlj>(n,x) zu Zeichenketten zusammen¬
stellen kann. Da jedoch immer die sechs Felder einer Druckposition
auf einmal erfaßt werden, ist das Zusammenfügen der richtigen Zeichen
zusammen mit den Codezahlen für die unter Umständen auch erforder¬
lichen Cursor-Kontrollfunktionen (Cursor nach rechts, nach links
u. s. w.) wahrlich keine ganz einfache Sache. Empfehlenswert ist es,
beim Programmieren erst einmal folgende Zeile einzutippen, die man
dann wieder löschen kann, wenn das Programm fertig ist:
30000 N=128: FOR X=1 TO 7: FOR Y=1 TO 9: N=N+1: PRINT N
CHR$(N) " " ; :NEXT Y: PRINT: PRINT: NEXT X
Durch ein GOTO 30000 kann man diese Zeile dann immer wieder
aufrufen, wenn man unter den 63 verschiedenen graphischen Figuren
die für den jeweiligen Zweck geeigneten heraussuchen will. Die mög¬
lichen Punktkombinationen werden schön ordentlich auf dem Bild¬
schirm zusammen mit den zugehörigen Codezahlen abgebildet.
Ein Mittelding zwischen diesen beiden Methoden zur Programmierung
von Graphiken stellt das dritte Verfahren dar, das mit dem Befehl
POKE m,n arbeitet. Damit kann man bekanntlich eine Speicherstelle
des Computers direkt mit einem Byte Information belegen, und zwar
in Form einer Dezimalzahl zwischen 0 und 255. Nimmt man sich den
Bildschirmspeicher des TRS-80 vor (Adressen 15360 — 16383) und
verwendet die Zahlen des Graphik-Codes, kann man jedes Zeichen
direkt an jede Stelle des Bildschirms bringen. Das geht schneller als
mit SET(x,y), da immer sechs Bildpunkte zugleich erfaßt werden, aber
nicht so schnell wie das Verfahren mit den Zeichenketten, da für jede
Druckposition ein neuer POKE-Befeh! erforderlich ist. Dafür muß
man sich aber auch nicht mit dem Zusammenstellen und richtigen Aus¬
drucken der Zeichenketten herumschlagen.
Es wird wohl immer auf den Einzelfall ankommen, zu welcher der drei
Methoden man greift, um Graphik zu programmieren. Mit wachsender
Erfahrung lernt man auch immer besser unterscheiden, welches Ver¬
fahren der jeweiligen Aufgabe am besten angepaßt ist.
49
Mathematik und Logik
Auch auf diesem Gebiet wartet das Radio Shack Level II BASIC mit
einigen Besonderheiten auf, über die durchaus nicht alle Microcompu-
ter verfügen. Wie bereits ausgeführt, führt die Tatsache, daß es Variable
mit sechs- und 16-stelliger Genauigkeit gibt, zu zusätzlichen Bestim-
mungs- und Umwandlungsanweisungen. Daneben sind die üblichen Re¬
chenzeichen und Funktionen vorhanden, wobei wie gesagt zu beachten
ist, daß (ohne die erwähnten Unterprogramme in Maschinensprache)
die Funktionen nur in sechsstelliger Genauigkeit ausgeführt werden.
16-stellige Zahlen wandelt der Computer vorher entsprechend
um. Klammern können in praktisch unbegrenzter Zahl ineinander ver¬
schachtelt werden — auch eine Eigenschaft, die nicht jeder Microcom-
puter bietet (der Autor hat seine Versuche bei 40 ineinandergeschach¬
telten Klammern aufgegeben!).
Bei den Rechen- und Logikzeichen wird folgende Reihenfolge der Be¬
arbeitung durch den Computer angegeben:
t (potenzieren)
— (Vorzeichen wechseln)
* und / (multiplizieren und dividieren)
+ und — (addieren und subtrahieren)
=, >, <, )=,<=,<> (Relationen)
NOT (logische Negation)
AND (logisches UND)
OR (logisches ODER)
Gleichrangige Operationen werden von links nach rechts durchge¬
führt. Bekanntlich sind ja die Klammern dazu da, eine andere Reihen¬
folge der Erledigung zu erzwingen. Wie die Erfahrung zeigt, machen
diese Regeln beim Aufbau komplizierterer Ausdrücke manchmal mehr
Schwierigkeiten als erwartet. Besonders bei längeren logischen Aus¬
drücken, die mit den Größenrelationen sowie AND, OR und NOT
aufgebaut werden und in der Regel in bedingten Anweisungen (IF...
TH EN) stehen, muß man sich vorsehen. Ganz verzwickt kann es dann
werden, wenn man die Möglichkeiten nutzt, IF-THEN-Klauseln auch
noch ineinander zu verschachteln.
50
Zum Glück kann man hier jedoch mit Hilfe einer besonderen Eigen¬
schaft des Level 11-BASICs eine wesentliche Vereinfachung vorneh¬
men. Eine zutreffende Bedingung drückt sich hier nämlich als die Zahl
—1 aus, eine nicht zutreffende als 0, d. h., statt IF A = B THEN GOTO
100 kann man auch schreiben: IF (A = B) = —1 THEN GOTO 100.
In diesem Fall wäre das natürlich umständlicher, aber das muß nicht
immer so sein. Der Ausdruck A=3 AND B=2 AND C=1 wird zum Bei¬
spiel zu (A=3) +(B=2) +(C=1) =-3.Und wenn man schreibt IF (A=3)
+(B=2)+(C=1 )=—2, bedeutet das, jeweils zwei der drei Relationen müs¬
sen stimmen, damit die Bedingung erfüllt ist. Auf normale Weise ließe
sich das nur so ausdrücken: IF A=3 AND B=2 AND C < > 1 OR A O 3
AND B=2 AND C=1 OR A=3 AND B < > 2 AND C=1 - also wesentlich
umständlicher. Und mit der Zahl der einzelnen Teilbedingungen wächst
der Unterschied steil an.
Andererseits ist es aber auch möglich, folgenden Ausdruck zu bilden:
IF (A=3)+(B=2) THEN GOTO 100. Man muß sich dabei wieder vor¬
stellen, daß der Computer für jede wahre Aussage ein "—1" bildet und
für jede falsche eine "0". Kommt dann bei einem derartigen Ausdruck,
der natürlich auch aus noch mehr Gliedern bestehen kann, insgesamt
nicht eine Null heraus, ist der ganze Ausdruck für den Computer
„wahr“, und er führt den an die Bedingung geknüpften Befehl aus,
in diesem Fall also den Sprung nach Zeile 100. Man sieht also: (A=3)
+(B=2) ist gleichbedeutend mit A=3 OR B=2. Entsprechendes gilt auch
für das Rechenzeichen " * “. Auch hier prüft der Computer, ob bei
einem zusammengesetzten Ausdruck eine Null herauskommt oder nicht
und handelt dementsprechend — etwa bei dem Ausdruck (A=3)*(B=2).
Da aber beim Multiplizieren immer Null herauskommt, wenn ein Fak¬
tor Null ist, müssen alle Teilbedingungen stimmen, damit der Computer
die Bedingung als Ganzes als wahr einstuft. So entspricht das Zeichen
*, logisch angewandt, dem AND.
Wohlgemerkt: Bei der Kalkulation ist in beiden Fällen nur maßgeblich,
ob das Resultat Null ist oder nicht. Speziell —1 für das logische „wahr“
wird für eine richtige Gesamtbedingung hier nicht verlangt. Wenn man
auf diese Bedingung Wert legt, die bei der "+“-Operation einem „aus¬
schließenden ODER" (exclusive OR) entspricht (nur eine einzige Teil-
51
bedingung darf richtig sein und nicht etwa mehrere oder alle), muß
man zu der Konstruktion ... +(...)= —1 greifen.
Man kann natürlich auch noch ganz andere logische Ausdrücke bilden,
wenn man weitere Rechenzeichen einsetzt, z. B. ODER /, aber dann
wird es wirklich schwierig, sämtliche möglichen Fälle zu durchdenken,
so daß es zu unerwarteten Ergebnissen kommt. Mit den genannten Mög¬
lichkeiten sind andererseits aber auch alle normalerweise vorkommen¬
den Fälle zu lösen.
Eine Anmerkung: Zwar läßt es das Radio Shack Level II BASIC zu, das
THEN wegzulassen (bzw. das GOTO nach THEN oder ELSE), wenn
dies zu keinen Unklarheiten führt. In den Beispielen steht es der Deut¬
lichkeit wegen trotzdem da.
Überhaupt ist es eine ganz gute Übung, zumindest in der ersten Zeit,
beim Programmieren erst einmal alle THENs mitzuschreiben und erst
nach Fertigstellung des Programms die überflüssigen THENs und GO-
TOs wieder herauszunehmen, wenn man sicher ist, daß das Programm
läuft. Manche Programmierer lassen auch absichtlich THENs und GO-
TOs im Programm stehen, die nicht erforderlich sind. Dies erleichtert
die Lesbarkeit des Programms für eventuelle spätere Veränderungen.
Auch der umgekehrte Weg ist übrigens möglich: Man kann die logischen
Operationen an Zahlen ausführen (ganze Zahlen von —32768 bis
+ 32767). Dieser auf den ersten Anblick verblüffende Vorgang beruht
darauf, daß aus jeweils zwei Zahlen in ihrer binären Darstellung Bit für
Bit unter Zugrundelegung der jeweiligen logischen Vorschrift eine drit¬
te gebildet wird. Wie die Anleitung für den TRS-80 ganz richtig an¬
merkt, gibt es in der Geräte-Konfiguration des Computers ohne den
Interface-Bauteil keine rechte Verwendung für diesen Vorgang. Den
einen oder anderen speziellen Anwendungsfall wird man aber sicher
finden.
52
Besonderes
Eine Besonderheit des TRS-80 ist zunächst vor allem auch die schon
erwähnte breitere Schreibweise, bei der statt 64 nur 32 alphanumeri¬
sche oder graphische Zeichen eine Zeile des Bildschirms ausfüllen. Die¬
ser im Programmablauf (normalerweise) durch CHR$(23), in der di¬
rekten Betriebsart durch "SHIFT ausgelöste Vorgang läßt bei der
Bildschirmausgabe eine recht reizvolle und für manche Zwecke nütz¬
liche Alternative zu. Bei der Programmierung sind aber spezielle Regeln
zu beachten, deren Ursache in der Arbeitsweise des Computers liegen.
Schreibt man irgendetwas auf den Bildschirm und schaltet dann mit
„SHIFT-*-" auf die breite Anzeige um, werden die Wörter und Zahlen
verstümmelt. Was danach geschrieben wird, erscheint richtig und
doppelt so breit. Wie kommt das zustande? Bei der breiten Schreib¬
weise fragt der Computer nur jede zweite Speicherstelle des Bildschirm¬
speichers ab und bringt ihren Inhalt auf den Schirm. Was in den anderen
Stellen gespeichert ist, geht also verloren, und die Wörter, Zahlen usw.
erscheinen verstümmelt. Gleichzeitig wird aber durch den PRINT-
Vorgang auch nur in diese kleinere Zahl von Speicherstellen hineinge¬
schrieben, so daß damit alles wieder seine Ordnung hat.
Zurückschalten auf normale Schrift ist nur durch die CLS-Anweisung
bzw. durch die CLEAR-Taste möglich. Dadurch wird die Anzeige
gleichzeitig gelöscht, und Hin- und Herschalten zwischen den beiden
Schrifttypen ist deshalb nicht möglich, zumindest nicht mit diesem
Verfahren.
Nun gibt es ja noch zwei weitere Methoden, etwas auf den Bildschirm
zu bringen, nämlich mit POKE m,n und SET(x,y) zusammen mit RE¬
SET und POINT. Da diese Befehle Speicherstellen des Bildschirm¬
speichers direkt ansprechen, nimmt der Computer beim Umschalten
der Typengröße keine Rücksicht darauf. Bei POKE darf man also nur
noch die verwendeten Stellen (sie haben gerade Adressennummern)
ansprechen.
Das gilt übrigens auch für PRINT @, das ja auch an jede Druckposition
einzeln zu richten ist. Bei SET, RESET und POINT ist es ähnlich, nur
sind die Druckpositionen in diesem Fall in der waagerechten Richtung,
auf die es hier ankommt, zweigeteilt. Folglich sehen die „erlaubten"
waagerechten Koordinatenzahlen jetzt so aus: 0,1, 4,5, 8,9, ....
124,125. Bei den senkrechten Koordinaten ändert sich nichts.
Mit INP(n) und OUT m,n verfügt der TRS-80 auch über die Möglich¬
keit, Signale von der „Außenwelt" in Form von beliebigen angeschlos¬
senen Geräten zum Empfangen und auch dorthin zu senden. Kaum
interessant, könnte man meinen, da sich ohne die Zusatz-Einheit Ex¬
pansion Interface keine Geräte anschließen lassen. Doch ganz so ist es
nicht. Zunächst gibt es auch einige wenige, aber dafür sehr interessan¬
te interne Vorgänge, die sich mit OUT steuern lassen. Und dann
existieren auch bereits Zusatzgeräte, die sich direkt an den Grundbau¬
stein anschließen lassen, und von denen später noch die Rede sein
soll.
Doch zunächst zu den internen Funktionssteuerungen: Von den 256
Adressen, die man theoretisch mit dem Ausgabebefehl OUT ansprechen
kann (0 bis 255) und die mit der ersten Zahl des der Anweisung ange¬
fügten Zahlenpaares genannt wird, ist die letzte für interne Vorgänge
reserviert. Die Anweisungen OUT 255,8 bis OUT 255,11, OUT 255,24
bis OUT 255,27, OUT 255,40 bis OUT 255,43 u. s. w. schalten eben¬
falls den Bildschirm auf breitere Anzeige um! Rückschalten kann mit
OUT 255,0 bis OUT 255,3, OUT 255,16 bis OUT 255,19 u. s. w. ge¬
schehen. In diesem Fall paßt sich der PRINT-Vorgang nicht an, so daß
es immer verstümmelte Wörter und Zahlen gibt. Aber beim Rückschal¬
ten wird der Bildschirm nicht gelöscht, so daß man zum Beispiel einen
Schriftzug immer zwischen schmaler und breiter Schreibweise hin- und
herspringen lassen kann, etwa folgendermaßen:
10 CLS
20 PRINT @ 530, "ACHTUNG!!!"
30 OUT 255, 8
40 FOR X=1 TO 200: NEXT
50 OUT 255,0
60 FOR X=1 TO 200: NEXT
70 GOTO 30
Wichtig sind dabei die gerade Zahl beim PRINT @ sowie die Zwischen¬
räume in dem Wort "ACHTUNG!! !". Die „eigentlichen" Um-
schalt-Anweisungen setzen die OUT-Befehle außer Kraft, und sie
funktionieren auch nur innerhalb eines Programms, im Gegensatz zu
CHR$(23), dessen Wirkung auch nach einer Programmunterbrechung
anhält.
54
Eine zweite überaus wertvolle Funktion des OUT 255,n ist die Kon¬
trolle des Bandlaufs des Cassettenrecorders. OUT 255,4 bis OUT 255,7
schaltet ihn an, OUT 255,12 bis OUT 255,15 wieder aus. Wie oben
gibt es auch hier wieder größere Zahlen, die denselben Effekt haben.
Eine naheliegende Anwendung dieses Vorgangs ist zunächst einmal in
Verbindung mit dem Speichern von Daten auf einer Tonbandcassette
denkbar: Wenn man handelsübliche Bänder verwendet, muß man darauf
achten, daß das Band bis an das Ende des Vorlaufbandes vorgelaufen
ist, ehe der Speicherbefehl kommt, da sonst Daten verloren gehen.
Dies kann der Befehl OUT 255,4 (Band anschalten) in Verbindung mit
einer Warteschleife übernehmen:
100 OUT 255,4: FOR X=1 TO 5000: NEXT
Wenn X eine sechsstellige Variable ist (keine ganzzahlige), müßte die
Wartezeit auf jeden Fall ausreichen, um das Band vom Anfang bis zum
Beginn der Magnetschicht vorlaufen zu lassen. Wohlgemerkt — an¬
schließend muß gleich PRINT# —1 kommen, da das Band nach OUT
255,4 immer weiter läuft. Soll das Band zunächst wieder anhalten, ist
nach der Warteschleife ein zusätzliches OUT 255,12 erforderlich.
Mit diesem Mechanismus ist es darüberhinaus auch möglich, Program¬
me aufzubauen, die Bildschirmanzeigen mit gesprochenen Kommenta¬
ren verbinden. Dazu braucht man nichts weiter zu tun, als die Kommen¬
tare (oder natürlich auch Musik, wenn man dies wünscht) auf eine Cas-
sette aufzunehmen. Wenn das Programm startbereit ist, legt man die
Cassette in das Cassettengerät des Computers, schaltet auf „Wieder¬
gabe" und zieht den schwarzen, zur Ohrhörer-Buchse des Recorders
führenden Stecker heraus. An passender Stelle im Programm muß je¬
weils ein OUT 255,4, eine Warteschleife und anschließend ein OUT
255,12 stehen. Dann wird der Recorder in Gang gesetzt und angehal¬
ten, und man hört nacheinander die einzelnen Kommentare, die der
Recorder nun hörbar abspielt.
Die Länge der einzelnen Warteschleifen zwischen den beiden OUT-
Befehlen muß man dabei natürlich dem jeweiligen Kommentar an¬
passen.
Im Grunde ist es nur ein kleines Relais, welches im Computer an- und
ausgeschaltet wird, um das Tonbandgerät zu starten und zu stoppen.
Diese Tatsache kann man ausnutzen, um den TRS-80 auch ein belie¬
biges anderes Gerät steuern zu lassen. Für das Relais gibt der Herstel¬
ler ein maximales Schaltvermögen von 0,5 A bei 6 V = (Gleichstrom )
an. Um ein mit Netzspannung betriebenes Gerät vom Computer an- und
ausschalten zu lassen, könnte man ein zweites Relais vom Relais des
Computers steuern lassen. Diese Schaltung (Skizze) ließe sich, in ei¬
nem geeigneten Gehäuse untergebracht, dazu verwenden. Vorgesehen
sind zwei Netzsteckdosen, die, vom Computer kontrolliert, ab¬
wechselnd unter Strom stehen. Der Anschluß an den TRS-80 erfolgt
über eine Buchse, die für den kleineren grauen Stecker des Verbin¬
dungskabels des Computer-Cassettengerät passend sein muß. Zum
Steuern beliebiger Geräte muß dann nur noch dieser Stecker aus dem
Recorder in das Kontrollgerät umgesteckt werden.
Und noch eine weitere Möglichkeit bietet das OUT 255,n: Bei jeder
neuen Zahl n, die sich von der des letzten Befehls OUT 255,n unter¬
scheidet, schickt der Computer auch einen Impuls in die Datenüber¬
tragungsleitung zum Cassettenrecorder. Günstigerweise sind nun, wie
erwähnt, die Anschlüsse des Computers ganz gewöhnliche fünfpolige
Diodenbuchsen nach DIN.
Und darüber hinaus stimmt auch noch die Lage des Ausgangsanschlus¬
ses mit dem entsprechenden Anschluß zwischen einem Tonbandgerät
und einem Radio überein. (Ein Kanal eines Stereoanschlusses; der an¬
dere ist — allerdings erdfrei — mit der Fernsteuerung für den Cassetten¬
recorder belegt). Man braucht also nur ein fünfpoliges Verbindungs¬
kabel zu nehmen und den Computer an einen Radio oder einen Ver¬
stärker anzuschließen — und schon kann der TRS-80 selbst Töne her¬
vorbringen. Folgendes kleines Programm genügt bereits dazu:
10 OUT 255,1
20 OUT 255,0
30 GOTO 10
Was man dann hört, wenn das Radio angeschlossen ist und das Pro¬
gramm läuft, ist ein ziemlich tiefer Ton — der Computer kann wegen
56
Bandsteuerstecker
Netzschalter
Schaltplan für die Steuerung mit dem OUT-Befehl
des vergleichsweise langsam arbeitenden BASICs die endlose Schleife,
die das Programm darstellt, eben nicht allzuschnell durchlaufen. Und
jeder weitere Zusatz, etwa um verschiedene Töne zu erzeugen, macht
die Sache noch langsamer. Melodien wird man also kaum erzeugen kön¬
nen, eher verschiedene Geräusche. Ein Beispiel:
10 FOR X=1 TO 30: FOR Y=1 TO X
20 OUT 255,0: OUT 255,1
30 NEXT Y,X: GOTO 10
Statt gerade 0 und 1 kann man im Prinzip auch zwei beliebige andere
Zahlen zwischen 0 und 255 an das Ende der beiden OUT-Anweisungen
stellen. Sie sollten aber keine unerwünschten, anderen Wirkungen ha¬
ben. Die Zahlen 0 bis 4 bedeuten hier ja „breite Schrift zurückschal¬
ten", was ja in diesem Zusammenhang nicht weiter stört.
Der TRS-80 könnte mit dieser Methode tatsächlich Musik erzeugen,
wenn es gelingt, die Schleife so schnell zu machen, daß auch hohe
Töne dabei herauskommen. Dies ist in der BASIC-Sprache zwar nicht
möglich, wohl aber, wenn man den Computer mit der Maschinen¬
sprache dasselbe tun läßt.
Ein solches Programm ist weiter hinten im Buch vorhanden — im Ka¬
pitel über das Programmieren in Maschinensprache.
Mit den Befehlen PEEK und POKE, mit denen sich einzeln Informa¬
tionseinheiten (Bytes) in individuellen Speicherstellen abfragen und un¬
terbringen lassen ist, wie bereits bekannt, auch der TRS-80 ausge¬
rüstet. Darüber hinaus gibt es aber noch eine ungewöhnliche Anweisung,
nämlich VARPTR(x). Sie gibt an, an welcher Stelle im Speicher des
Computers sich die Variable x befindet. Man mag vielleicht meinen, dies
habe wenig Sinn — Zweck einer höheren Programmiersprache wie BA¬
SIC ist es ja eigentlich, gerade den Benutzer von derartigen Informatio¬
nen unabhängig zu machen. Doch es gibt Fälle, in denen mit Hilfe des
Speicherorts von Variablen spezielle Programmieraufgaben leichter
zu lösen sind. Über VARPTR kommt man nämlich unmittelbar an
die binäre Form der Zahlen heran, in der sie vom Computer gespei-
58
chert sind. Das kann zum Beispiel praktisch sein, wenn man den Wert
einer Variablen an irgendein angeschlossenes Zusatzgerät schicken will.
Dies muß ja mit dem Befehl OUT Byte für Byte geschehen, und mit
VARPTR hat man diese Informationsabschnitte gleich richtig zur Hand
und muß sie nicht erst aus der Dezimalzahl zurückrechnen, die der
Computer beim Aufrufen einer Variablen normalerweise automatisch
herstellt. Andersherum gilt natürlich das Gleiche: Eine in Byte-Dar¬
stellung übernommene Zahl kann direkt und ohne Umwege an seinen
Speicherplatz befördert werden. Folgendes Programm zeigt mit Hilfe
von VARPTR die (in der Anleitung erläuterte) Byte-Darstellung von
eingegebenen 16-stelligen Zahlen:
10 INPUT A#
20 PRINT: FOR 1=0 TO 7
30 PRINT PEEK (VARPTR(A#)+7-l)
40 NEXT: GOTO 10
Die größtmögliche positive Zahl sollte dabei so aussehen: 255 127
255 255 255 255 255 255, die größte negative Zahl 255 255 255 255
255 255 255 255. In der Praxis stimmt das nicht, da die letzte (sieb¬
zehnte) Ziffer der Zahlen ja nicht angezeigt wird, aber intern doch vor¬
handen ist und sich in der Byte-Darstellung niederschlägt. Man stellt
aber fest, daß die in der Anleitung genannten größtmöglichen Zahlen
nicht richtig sind: Nicht ± 1.701411834544556D+38 stimmt, sondern
± 1.701411834604692D+38.
Will man sich sechsstellige oder ganzzahlige Werte in Byte-Darstel¬
lung anschauen, muß man das Programm so verändern, daß nicht je¬
weils 8, sondern 4 bzw. 2 Byte angezeigt werden, und die Schreibweise
der Variablen A# in A oder A% umändern.
59
Nachahmen der INPUT-Anweisung mit INKEY$
Die INPUT-Anweisung im Radio Shack Level II BASIC ist, wie über¬
haupt in der BAS IC-Sprache, ein sehr praktisches Instrument für die
Dateneingabe bei laufendem Programm, Doch gerade ihre wichtigste
Funktion, nämlich das Programm anzuhalten, bis eine Zahl oder ein
String oder mehrere davon eingegeben sind, möchte man manchmal
vermeiden. Bekanntlich gibt es dafür beim TRS-80 die Funktion
INKEY$, die im BAS IC-Programm wie eine String-Variable gehandhabt
werden muß. Sie übernimmt ein Zeichen direkt von der Tastatur, aber
eben nur eins. Wenn man längere Zahlen auf diese Weise eingeben will,
muß man folgendermaßen vorgehen:
90 W$=""
100 FOR 1=1 TON
110 A$=INKEY$: IF A$=""THEN 110
120 PRINT A$;: W$=W$+A$
130 NEXT: W=VAL(W$)
Als Ergebnis erhält man, wenn man beim Eintippen keinen Fehler ge¬
macht hat, eine Zahl mit N Stellen (einschließlich Komma) als Variab¬
le W. Benötigt man eine Zeichenkette, kann das W=VAL(W$) natür¬
lich entfallen. Aber wie gesagt, Tippfehler (oder prellende Tasten!)
werden nicht verziehen — man bekommt unweigerlich etwas Falsches
in den Computer, weil die anderen Schreibfunktionen —ENTER, Rück¬
taste usw. — nicht funktionieren und man daher nichts korrigieren
kann.
Folgendes Programm ahmt nun einige wichtige Funktionen nach, die
beim INPUT zusätzlich gegeben sind. Nicht realisiert sind Sprung um
16 Stellen nach vorne (-► ), Übergang zu Breitschrift (SHIFT -*■) und
Bildschirm Löschen (Clear-Taste). Auch kann man nur eine Zahl und
nicht mehrere durch Komma getrennt eingeben. Dies zu bewerkstelli¬
gen wäre übrigens für den Leser einmal eine reizvolle Aufgabe! Doch
nun das Programm. Es ist als Subroutine ausgeführt, die durch GOSUB
20000 erreicht werden kann und wieder die Variable W liefert.
20000 \N&=" PRINT CHR$ (14).
20010 A$=INKEY$: IF A$=" " THEN 20010
20020 IF ASC(A$)=13 W=VAL(W$): PRINT CHR$ (15):RETURN
20030 IF ASC(A$)=24 TH EN IF LEN(W$)=0 TH EN 20010 ELSE
FOR 1=1 TO LEN(W$): PRINT CHR$(8);: NEXT GOTO
20000
20040 IF ASC(A$)=8 THEN IF LEN(W$)=0 THEN 20010 ELSE
PRINT A$ W$=LEFT$(W$,LEN(W$)-1): GOTO 20010
20050 PRINT A$;: W$=W$+A$ GOTO 20010
Das PRINT CHR$(14) läßt am Anfang der Eingabeprozedur den Cursor
erscheinen. Hier kann man eventuell auch die Anforderung zur Daten¬
eingabe einfügen, die auch mit dem INPUT-Befehl auf den Bildschirm
gebracht würde. Zeile 20020 gibt dem ENTER seine Funktion zurück,
Zeilen 20030 und 20040 verhelfen SHIFT +- und «- zu ihrer normalen
Funktion.
Als Resultat kann man (im Rahmen der Fähigkeiten des Computers)
beliebig lange Zahlen eingeben, während der Computer zwischendurch
etwas anderes macht. Diese anderen Tätigkeiten müßten in Zeile 20010
eingefügt werden, am besten mit GOTO- oder GOSUB-Anweisungen.
61
Ein Fehler im Level II BASIC
Bei einem so komplexen Maschinenprogramm, wie es das BASIC Le¬
vel II des TRS-80 darstellt (immerhin nicht weniger als 12K ROM-
Bereichl), bleibt auch bei noch so sorgfältiger Entwicklung die Gefahr,
daß irgendwelche Fehler irgendwo versteckt Zurückbleiben. Bei ande¬
ren Microcomputersystemen ist das so und es liegt nahe, auch bei die¬
sem Fabrikat ähnliches zu vermuten. Und tatsächlich, es gibt auch
hier einen solchen Fehler, der jedoch nicht von Radio Shack zu er¬
fahren war, sondern vom Autor selbst entdeckt wurde. Dazu möge man
folgendes kleines Programm eingeben:
10 X=4
20 IF X=4 D=2
30 PRINT D
Startet man das Programm, sollte der Computer eigentlich "2" auf
dem Bildschirm erscheinen lassen. Statt dessen erscheint "0". Die be¬
dingte Anweisung D=2 wurde also nicht ausgeführt, obwohl die Be¬
dingung X=4 infolge von Zeile 10 erfüllt ist. Wie weitere Tests erge¬
ben, tritt dieser Fehler nur mit den in der obigen Weise verwendeten
Variablen D und E auf (sowie mit Variablen, die mit D und E begin¬
nen). Mit A, B, C, F, G usw. arbeitet der Computer korrekt. Auch
verschwindet der Fehler, wenn man zwischen X=4 und D=2 ein (an
dieser Stelle eigentlich überflüssiges) THEN einfügt.
Aus dem Fehler ergeben sich natürlich eine Menge Folgen - je nach
den Einzelheiten des jeweiligen Programmes. Eine Konsequenz ist
zum Beispiel, daß in derselben Zeile hinter der fälschlicherweise nicht
ausgeführten bedingten Anweisung stehende Befehle ebenfalls unbe¬
achtet bleiben bzw. Anweisungen hinter einem ELSE ausgeführt wer¬
den, wenn dies nicht sein soll. Jedenfalls sollte man mit den Variablen
D und E vorsichtig sein: THEN verwenden oder vielleicht auch ganz
auf diese beiden Buchstaben verzichten.
Und noch eine weitere Lehre ergibt sich hieraus: Auch das Radio Shack
Level II BASIC ist nicht ganz ohne Fehler, und wenn ein Programm
partout nicht laufen will, obwohl man alles nur denkbare probiert hat,
könnte unter Umständen ein weiterer unentdeckter Fehler im Spiel
sein. Aber man sollte sich schon sehr sicher sein, alles richtig gemacht
zu haben: Fußangeln gibt es in dieser Computersprache einige!
Ungenauigkeiten bei der Addition
Eine der Fußangeln, die beim Radio Shack Level II BASIC leicht zu
scheinbar unerklärlichen Fehlern führt, liegt in der begrenzten Ge¬
nauigkeit, mit der Rechenvorgänge mit Dezimalbrüchenablaufen. Dies
hat zwei Gründe: Einmal natürlich die gegebene Anzahl der Stellen
(7 bzw. 17) , dann aber auch die Tatsache, daß der Computer intern
Binärzahlen verwendet und dazu jeweils Umwandlungen vornehmen
muß. Besonders bei oft wiederholten Rechengängen summieren sich
die einzelnen kleinen Fehler zu Abweichungen, die erkennbar wer¬
den, obwohl die letzte Stelle der Zahlen jeweils bei der Anzeige wegge¬
lassen wird. Aber auch bei bedingten Anweisungen werden die Aus¬
wirkungen deutlich: Der Computer vergleicht in solchen Fällen in¬
frage kommende Werte nämlich Bit (Binärziffer) für Bit. Und als Er¬
gebnis unterschiedlicher Rechenvorgänge vorliegende Werte können
sich durchaus intern unterscheiden und trotzdem auf dem Bildschirm
gleich aussehen. Ein Beispiel: Folgendes Programm —
10 FOR X=1 TO 5 STEP .1
20 IF X=3.5 PRINT X
30 NEXT
sollte eigentlich als Ergebnis die Zahl 3.5 auf dem Bildschirm erschei¬
nen lassen. Doch das ist nicht der Fall: Es erscheint nichts. Woran liegt
das? Das läßt sich an diesem Programm verdeutlichen:
10 A=3.5
20 FOR X=1 TO 35: B=B+.1: NEXT
30 FOR X=1 TO 350: C=C+.01: NEXT
40 PRINT "A"," B","C", ,A, B,C
50 PRINT
60 FOR X=0 TO 3
70 PRINT PEEK (VARPTR(A)+X), PEEK (VARPTR(B)+X), PEEK
(VARPTR(C)+X)
80 NEXT
63
Wenn man das Programm laufen läßt, entsteht folgendes Bild auf dem
Monitor:
A
B
C
3.5
3.5
3.5
0
251
244
0
255
255
96
95
95
130
130
130
A, B und C erhalten alle denselben Wert, nämlich 3.5, aber auf jeweils
unterschiedliche Weise: Einmal direkt, dann durch 35malige Addition
von 0,1 und schließlich, indem 0,01 350 mal zusammengezählt wird.
Die internen Darstellungen der drei Werte unterscheiden sich jedoch,
wie man erkennt: Durch Zeile 70 wird der Inhalt der vier Speicher¬
stellen auf den Bildschirm gebracht, die jeweils den Wert A, B und C
enthalten.
Jetzt ist auch verständlich, warum der Vergleich in dem ersten Pro¬
gramm versagen mußte. Wie kann man es nun zum Laufen bringen?
Doppelt genaue Variable helfen in diesem Fall nicht weiter: Zunächst
funktionieren Schleifen mit ihnen überhaupt nicht; auf den Versuch
reagiert der Computer mit einer Fehlermeldung (TM ERROR, d. h.
ungeeigneter Variablentyp). Außerdem wäre die notwendige Bedingung
- Übereinstimmung sämtlicher Binärziffern - auch bei ihnen nicht
gegeben. Was man dagegen tun kann, ist die Zahl, auf die es bei dem
Vergleich ankommt, vorher in die „genaue" umzuwandeln. Das geht
im vorliegenden Fall mit folgendem Ausdruck: Y=INT(X*10+.2)/10.
Hat der Wert mehr als eine Stelle hinter dem Komma, muß man mit
entsprechend höheren Zehnerpotenzen mainehmen und teilen. Wenn X
den Wert 3,45 hat zum Beispiel: Y=INT(X*100+.2)/ 100. Anderer¬
seits reicht bei ganzen Zahlen Y=INT(X+.2).
Das " . 2" hat dabei jeweils die Aufgabe, den internen Wert von X si¬
cher über den Wert hinaus anzuheben, der durch die INT-Funktion er¬
reicht werden soll. Bekanntlich wertet sie immer auf die nächste ganze
Zahl ab, und wenn der ungenaue Wert geringfügig unter dem genauen
liegt, kommt ohne das zusätzliche " . 2 " eine zu niedrige Zahl heraus.
Wie man sich überzeugen kann, wird der Wert der Variablen B in unse¬
rem Beispiel zu 3,4 statt richtig 3,5.
64
Ein Bild von dem Fehler, der sich durch wiederholte Addition ergibt,
vermittelt am einfachsten dieses Programm:
10 FOR X=1 TO 50 STEP .1
20 PRINT X,
30 NEXT
Da erscheinen durchaus nicht nur die Zahlen 1, 1.1, 1.2 usw. bis 50,
sondern reihenweise auch Werte wie 40.9999,41.0999,41.1999 ...
Glücklicherweise ergibt sich vergleichsweise selten die Notwendigkeit
für solche Konstruktionen. Abzählen wird man üblicherweise mit gan¬
zen Zahlen und da gibt es diese Probleme nicht.
65
Name
Es gibt im Radio Shack BASIC auch ein Befehlswort, das nicht ge¬
braucht wird: NAME (auf Deutsch: "Name"). Tippt man es ohne wei¬
tere Vorkehrungen ein, erscheint die Fehlermeldung, die darauf hin¬
weist, daß es sich um ein Wort des zum Floppy-Disc-System gehöriger^
sogenannten Disc-BASIC handelt, nämlich L3 ERROR. Doch auch das
stimmt nicht! In Wahrheit ist Name völlig ungebraucht, hat bisher
jedenfalls in keinem Radio Shack BASIC eine Funktion. Dies eröffnet
nun die Möglichkeit, eine Funktion für NAME selbst zu bestimmen.
Doch wie kann das geschehen?
Dazu muß man zunächst wissen, wie die Befehlsausführung im TRS-80
organisiert ist. Das funktioniert jeweils so: Jeder BASIC-Befehl veran¬
laßt die CPU, sich eine bestimmte, jeweils andere Adresse im Speicher
anzuschauen, nämlich die sogenannte Driver-Adresse des Befehls. An
diesen Adressen sind wiederum die Anfangsadressen der zu den Be¬
fehlen gehörigen Routinen gespeichert, die sich im Festwertspeicher
(ROM) des Level II BASICs befinden. Die Driver-Adressen sind dagegen
im RAM-Bereich, lassen sich also beliebig mit neuem Inhalt füllen!
Theoretisch könnte man jedem BASIC-Befehl eine andere Bedeutung
geben, indem man in seine Driver-Adresse einen anderen Wert lädt.
Für die Anweisung USR(x) ist dies ja zum Beispiel auch speziell vor¬
gesehen: In seine Driver-Adresse 16526, 16527 muß man die Anfangs¬
adresse einer Maschinenprogrammsubroutine laden, die aufgerufen wer¬
den soll - im Prinzip nichts anderes als die Durchführung eines BASIC-
Befehls, dessen Inhalt man aber selbst bestimmt. Dasselbe ist nun auch
mit NAME möglich. Seine Driver-Adresse lautet: 16783. 16784 (dezi¬
mal). In die erste Position muß wie gewohnt mit POKE das niederwer¬
tige Byte der Subroutinen-Anfangsadresse geladen werden, in die zwei¬
te das höherwertige Byte. Wie bei den zum Disc-BASIC gehörigen Be¬
fehlen enthält die Adresse in Level II normalerweise 301 dezimal, d.h.,
die Bytes 1 und 45 (dezimal). Dies ist die Anfangsadresse der L3
ERROR-Routine. Diese wird also aufgerufen, wenn man den Spei¬
cherinhalt nicht verändert. Der Nachteil von NAME gegenüber USR(x)
besteht darin, daß keine Variable im selben Arbeitsgang auf die Sub¬
routine übertragen werden kann. Andererseits läßt sich NAME unver¬
ändert auch in DISC-BASIC verwenden. USR(x)-Anweisungen müßten
verändert werden, wenn man sich das Floppy-Disc-System dazu kauft
und die entsprechenden Programme weiterverwenden will, denn dann
gibt es den Befehl in dieser Form nicht mehr.
66
Abkürzungen in Radio Shack Level II BASIC
Im Gegensatz zum Level I BASIC (und auch im Unterschied zu anderen
BASIC-Versionen) gibt es beim Level II nur zwei Abkürzungen: Für
PRINT kann man ein Fragezeichen schreiben, für REM einen Apo¬
stroph ('). PRINT und ? sind dabei im computerinternen Befehlscode
gleich repräsentiert, d. h. wenn man beim Programmschreiben das
Fragezeichen benutzt, erscheint dafür nach dem LIST-Befehl in der
betreffenden Programmzeile das Befehlswort PRINT. Das ist vor allem
wichtig, wenn man eine Zeile geschrieben hat und sie unmittelbar da¬
nach in der EDIT-Betriebsweise des Computers verändern will. Weil
der Ersatz des ? durch das PRINT eine Stellenverschiebung innerhalb
der Zeile zur Folge hat, die schon bei der Übernahme der Zeile in den
EDIT-Betrieb wirksam wird, kann man leicht durcheinandergeraten
— die Zeile ist ja in der veränderten Form zunächst nicht zu sehen.
Unbedingt empfehlenswert ist daher in diesem Fall der nochmalige Ab¬
druck der Zeile auf dem Bildschirm, ehe man mit dem Verändern be¬
ginnt. Dies kann durch LIST (Zeilenzahl) oder, wenn man schon im
EDIT-Betrieb ist, durch den den EDIT-Befehl L geschehen.
Im Unterschied zu PRINT und ? bleiben REM und ' als Bezeichnung
für Texte, die der Computer nicht beachten soll, auch intern getrennt.
REM wird als REM gelistet, ' als '. Wahrscheinlich hat der Hersteller
REM nur deshalb in die BASIC-Sprache aufgenommen, weil es gewisser¬
maßen ein Standard-BASIC-Wort ist, daß sich in praktisch allen anderen
Versionen wiederfindet (genau wie das LET für die Wertzuweisung, das
ja beim TRS-80 überflüssig, aber trotzdem vorhanden ist). In der Praxis
wird man wohl nur das kürzere ' verwenden.
An dieser Stelle ist es vielleicht ganz passend, einige Bemerkungen
über das ' als Programmierhilfe zu machen. Abgesehen von seinem
eigentlichen Zweck, nämlich erklärende Bemerkungen in einem Pro¬
gramm unterzubringen, die der Computer nicht beachten soll, läßt sich
der Apostroph auch noch beim Programmschreiben verwenden und
zwar auf zweierlei Weise:
Soll zum ersten eine bestimmte Programmzeile bei einem Testlauf des
Programms übersprungen werden, kann man einfach ein ' am Anfang
einfügen. Das ist wesentlich einfacher als einen Sprungbefehl an die
vorherige Zeile anzufügen bzw. einen vorhandenen zu ändern — oder
67
gar mehrere an verschiedenen Steilen des Programms, wenn die be¬
treffende Zeile von verschiedenen Stellen aus über Sprunganweisungen
auf gerufen wird. Auch läßt sich nur mit dem ' ein Teil einer Zeile
(nämlich der darauffolgende) auf einfache Weise ausschalten, ohne daß
er dazu gelöscht werden muß.
Die andere Anwendung besteht darin, durch den Apostroph als ein¬
zigen Inhalt einer Zeile die Zeilennummer im Programm zu halten,
auch wenn der ursprüngliche Zeileninhalt nicht mehr gebraucht und
darum gelöscht wurde. Dies kann von großem Wert sein, wenn die Zei¬
le mit einem Sprungbefehl angesprochen wird. Dieser Sprung funktio¬
niert dann nämlich immer noch, wenn die betreffende Zeile eigentlich
schon aus dem Programm entfernt wurde. Man vermeidet damit, daß
das Programm solange nicht läuft, bis man auch die Sprungadresse in
geeigneter Weise geändert hat.
68
Platzsparendes
Programmieren
von Graphik-
Zeichenketten
Platzsparendes Programmieren von Graphik-Zeichenketten
Daß mit Zeichenketten (Strings) elegantes Programmieren kompli¬
zierter Bildschirmgraphik-Darstellungen möglich ist, wenn man graphi¬
sche Code-Zahlen (128—191) Zwischenraum-Codezahlen (192-255),
Steuer-Codezahlen (8-31) in CHR$- und STRING$-Funktionen an¬
wendet, ist bereits dargestellt worden. Da dies verhältnismäßig viel
Speicherraum in Anspruch nimmt—erforderlich ist neben dem Pro¬
grammtext selbst auch noch Platz im String-Bereich des RAM-Spei¬
chers -, kann man selbst bei 16-K-Maschinen mit längeren Program¬
men in Platznot kommen. Doch gibt es noch eine andere Methode, die
entsprechenden Zeichenketten zusammenzustellen, so daß sie im Pro¬
grammtext selbst stehen und dort nur ihrer tatsächlichen Länge gemäß
Platz beanspruchen. Allerdings kostet das Programmieren dabei ein
wenig zusätzliche Mühe.
Das Problem besteht darin, daß man Steuer- und Graphik-Codeszahlen
nicht von der Tastatur aus erreichen kann, so daß es nicht ohne weiteres
möglich ist, entsprechende Strings wie mit Buchstaben oder Zahlen ein¬
fach in der Form A$="OTTO MUELLER" zu definieren. Um denselben
Effekt zu erzielen, kann man jedoch folgendermaßen Vorgehen:
Zunächst legt man innerhalb des vorgesehenen Programms die für
Graphik-Darstellungen bestimmten Zeichenketten in ihrer geplanten
Länge fest, indem man sie mit beliebigen Buchstaben oder einfach mit
Leerstellen füllt, zum Beispiel A$=" .", B$="." usw.
Wenn das Programm in dieser Weise fertiggestellt wurde, schreibt man
zusätzlich folgendes Hilfsprogramm:
50000 K=PEEK(VARPTR(A$)+1)+256*PEEK(VARPTR(A$)+2)
50010 FOR 1=0 TO 10: READ C: POKE K+I,C: NEXT
50020 DATA.
Damit kann man dann nacheinander die einzelnen Strings mit den ent¬
sprechenden Codezahlen füllen — sie werden durch die POKE-Anwei-
sung direkt in den Speicherplatz des Strings gebracht, der ja durch die
vorherige Definition der Strings im eigentlichen Programmtext offenge¬
halten wurde. Für jede Zeichenkette muß dabei der entsprechende Va-
riablen-Name in die beiden VARPTR-Funktionen in Zeile 50000 ein¬
gefügt werden, und die Lese- und POKE-Schleife in Zeile 50010 muß
an die Länge des jeweiligen Strings angepaßt werden (Endzahl um 1
kleiner als die Anzahl der Stellen, da die Schleife mit 0 beginnt).
In der DATA-Zeile schließlich müssen die gewünschten Code-Zahlen
stehen. Am Ende muß nur noch das Hilfsprogramm wieder gelöscht
werden und man hat ein Programm mit äußerst rationell gespeicherten
Graphik-Strings.
Ein etwas merkwürdiges Aussehen nimmt allerdings der Programmtext
als Ergebnis dieser Manipulation an: Graphik- und Zwischenraum-Code-
zahlen sind in der computer-internen Organisation BASIC-Befehls-
Codezahlen und so werden die beim Listen dann auch auf den Bild¬
schirm gebracht.
Hat man zum Beispiel die ersten fünf Graphik-Codezahlen verwendet,
nämlich 129, 130, 131, 132 und 133, sieht die entsprechende String-
Definition nach der Anwendung des Hilfsprogrammes nicht mehr so
aus: A$=".", sondern so: A$="FORRESETSETCLSCMD". A$ be¬
steht jetzt also aus den fünf BASIC-Wörtern FOR,RESET,SET,CLS und
CMD (der letzte gehört allerdings zum sogenannten Disc-BASIC, das
man mit dem Erweiterungsteil und dem Floppy-Disc-System verwenden
kann). Wichtig ist dabei, daß man durch einfaches Schreiben der Buch¬
stabenfolge nicht die Graphik-Zeichenkette erhält, sondern eben nur
die Reihe von Buchstaben.
70
Die Aneinanderreihung von BAS IC-Wörtern, die man bei dem Listen
des Programmtextes erhält, ist natürlich viel länger als das ursprüngli¬
che String und kann im Grenzfall sogar die größtmögliche Länge einer
Programmzeile, nämlich 255 Stellen sprengen, so daß die Zeile über¬
haupt nicht vollständig auf dem Bildschirm erscheint. Für das Pro¬
gramm ist das jedoch ohne Belang, und man muß sich vor Augen hal¬
ten, daß intern sehr viel weniger Speicherplatz benötigt wird, als würde
man die Zeichenkette in herkömmlicher Weise bilden.
Noch seltsamer wird das Listen des Programms, wenn man Strings mit
Kontroll-Codezahlen gefüllt hat. Diese Funktionen werden beim Listen
nämlich schlicht ausgeführt, so daß das Bild des Programmtextes völlig
durcheinandergeraten kann. Da es keine Worte oder andere Zeichen für
diese Codezahlen gibt, werden sie andererseits auch nicht als Inhalt des
jeweiligen Strings sichtbar und es erscheint A$=" ", wenn nur Kontroll-
Codezahlen verwendet wurden. Natürlich kann das für jemanden, der
nicht weiß, wie das Programm zustande gekommen ist, sehr verwirrend
sein.
Noch ein wichtiger Hinweis: Programmzeilen, die die mit dem Hilfspro¬
gramm gebildeten Zeichenketten enthalten, dürfen anschließend nicht
mehr in der Edit-Betriebsart abgeändert werden. Dabei geht nämlich
stets — auch wenn man nur "ENTER" drückt, ohne tatsächlich etwas
verändert zu haben — der spezielle Charakter des oder der Strings ver¬
loren. Man müßte dann den Bildungsvorgang wiederholen.
71
„Programmieren
in Maschinensprache
und Assembler”
Programmieren in Maschinensprache und Assembler
Dieses Kapitel ist eigentlich garkein Kapitel über den TRS-80, sondern
über sein Herz, der Zentraleinheit (CPU) Z-80 von Zilog. Denn mit Ma¬
schinenprogrammen erreicht man sie direkt, ohne den „Umweg" des
BASIC-Interpreters, der im Grunde nichts weiter ist, als ein (Maschi¬
nenprogramm zur Übersetzung der BASIC-Programmsprache in Ma¬
schinensprache. Wie schon erwähnt, ersparen Maschinenprogramme
diese Übersetzung und werden deshalb wesentlich schneller verarbei¬
tet. Als Preis für diesen Vorteil muß man allerdings erhebliche Mehr¬
arbeit beim Erstellen der Programme in Kauf nehmen. Während BASIC
als „höhere" Programmiersprache nämlich problemorientiert ist —
was man den Computer tun lassen will, kann man mehr oder weniger
direkt formulieren —, richtet sich der Aufbau eines Programms in Ma¬
schinensprache nach der Arbeitsweise des jeweiligen Computers: Je¬
de Einzelheit einer Aufgabe muß dem Rechner einzeln vorgegeben wer¬
den. Im Prinzip besteht also die Maschinenprogrammierung darin, Ma¬
schinenbefehl an Maschinenbefehl zu reihen, die jeweils nur einen
Schritt in der Arbeit der CPU bewirken.
Normalerweise kann dies nach zwei verschiedenen Methoden gesche¬
hen: Als direkte Maschinenprogrammierung oder in einer sogenannten
Assemblersprache. Im ersten Fall verwendet man gewöhnlich als Hilfs¬
mittel einen sogenannten Monitor. Das ist ein Hilfsprogramm, das es
erlaubt, sozusagen in das Innenleben des Computers hineinzuschauen:
Der Inhalt von CPU-Registern sowie Speicher-Abschnitten wird auf dem
Bildschirm abgebildet, man kann Maschinenbefehle eingeben und in be¬
stimmte Speicherbereiche befördern lassen. Die geschriebenen Maschi¬
nenprogramme kann man für Testzwecke Schritt für Schritt oder bis
zu einem vorgewählten Punkt laufen lassen und noch einiges mehr. Da-
72
bei werden durchweg Hexadezimalzahlen verwendet, deren Ziffern von
0 bis 9 sowie die ersten 6 Buchstaben des Alphabets umfassen. Der
TRS-80 enthält im Gegensatz zu anderen Microcomputern keinen fest
installierten Monitor — nur die Möglichkeit, vorhandene Maschinen¬
programme vom Cassettengerät zu laden und zu starten. Doch bietet
Radio Shack einen Monitor zu günstigen Bedingungen als Maschinen-
programm-Cassette an — das „T-Bug"-Programm. Auch das Disc-Be-
triebssystem enthält einen Monitor.
Die andere, in vieler Hinsicht komfortablere Möglichkeit besteht darin,
ein Assembler-Programm zu verwenden. Die Assembler-Sprache ist (im
Gegensatz zum BASIC) ebenfalls jeweils typisch für die CPU eines
Computers, und so auch für den Z-80, den der TRS-80 verwendet.
Wesentlichstes Merkmal aller Assemblersprachen ist jedoch, daß die
Maschinenbefehle als leichter merkbare (allerdings englische) Abkür¬
zungen dargestellt werden. Nach wie vor entspricht ein Programmbefehl
einem Ausführungsschritt der CPU; jeder etwas komplexere Vorgang,
der im BASIC-Programm vielleicht nur einen Befehl oder eine Funktion
erfordert, muß auch beim Assembler-Programmieren aus unter Um¬
ständen zahlreichen dieser Schritte zusammengesetzt werden.
Abgesehen davon bieten Assemblersysteme, die das in der Assembler¬
sprache geschriebene Programm in Maschinensprache umwandeln, im
allgemeinen eine Reihe nützlicher Eigenschaften.
In Assembler geschriebene Programme haben (wie beim BASIC) Zei¬
lennummern. Die einzelnen Zeilen bestehen immer aus Zeilennummer,
Befehlscode und ein oder zwei Operanden, an dem bzw. denen die An¬
weisungen ausgeführt werden sollen. Daran kann sich bei Bedarf, durch
ein Semikolon abgetrennt, eine Erläuterung anschließen, die für das
Programm keine Bedeutung hat. Um tatsächliche Speicheradressen
bzw. Programmstellen für Verzweigungen, bedingte Anweisungen usw.
braucht man sich nicht zu kümmern: Dafür gibt es frei wählbare Mar¬
kierungswörter (sogenannte Labels), die man vor den Befehlscode
in die jeweilige Zeile einfügen kann. Für Teile, die in einem Programm
mehrmals Vorkommen, lassen Assemblersysteme meist sogenannte
Makros zu. Sie werden jeweils nur einmal programmiert und dann bei
der Umwandlung des Assemblerprogramms in das Maschinenprogramm
an den gewünschten Stellen eingefügt. Damit sind Makros keine Unter-
73
Programme, da sie im Maschinenprogramm tatsächlich jedesmal im Ver¬
lauf des Programmes vorhanden sind, wenn sie ausgeführt werden sol¬
len.
Die von Zilog für ihre CPU geschaffene Assemblersprache bzw. das
zugehörige Assemblersystem erlaubt unter anderem Verwendung von
Binär-, Oktal-, Dezimal- und Hexadezimalzahlen. Möglich sind Pro¬
gramm-Testläufe; es gibt ein Editsystem zur Programmbearbeitung und
es werden beim Übersetzen in den Maschinen-Code 17 verschiedene
Fehler erkannt und angezeigt. Auch ist die Möglichkeit gegeben, ein¬
fache Rechenvorgänge mit ganzen Zahlen direkt zu programmieren.
Für den TRS-80 mit 16K Speicherplatz und Level I oder Level II BA¬
SIC bietet Radio Shack eine etwas abgemagerte Version des Z-80-As-
semblers als Maschinenprogramm-Cassette an. Makros werden nicht be¬
arbeitet, die direkten Rechenvorgänge sind eingeschränkt, man kann
nicht alle Arten von Zahlen verwenden usw. Dafür gibt es eine Bearbei¬
tungsmöglichkeit für Programmtexte, die stark an Betriebssystem und
Edit-Betriebsart des Computers angelehnt ist und nur wenig Umlernen
erfordert. Hat man seinen TRS-80 bis zu den Floppy-Disc-Geräten er¬
weitert, kann man auch das vollständige Assembler-System von Zilog
einsetzen, das es auf einer Diskette zu kaufen gibt.
Es sollte an dieser Stelle vielleicht noch einmal erwähnt werden, daß die
Z-80-CPU als Weiterentwicklung der bekannten 8080-CPU bis auf unbe¬
deutende Kleinigkeiten vollständig „aufwärtskompatibel" mit ihr sowie
mit ihrer späteren Version 8085 ist. Das heißt, alle für Microcomputer-
Systeme mit 8080-CPU geschriebenen Maschinenprogramme laufen
auch auf dem TRS-80, vorausgesetzt, die übrigen Voraussetzungen wie
Speicherplatz-Belegung, Ein- und Ausgabewege usw. stimmen ebenfalls
überein.
In der Praxis beweisen Maschinenprogramme in Verbindung mit BASIC-
Programmen ihren Wert, wenn es darum geht, eine Aufgabe auszufüh¬
ren, die für das BASIC zu langsam oder in anderer Hinsicht schlecht ge¬
eignet ist. Dazu dient die Möglichkeit, ein Maschinenprogramm als Sub¬
routine vom BAS IC-Programm aus mit der Funktion USR aufzurufen.
Dafür gibt es in diesem Buch auch ein Beispiel, nämlich die Erzeugung
von Geräuscheffekten und ganzen Melodien mit dem TRS-80. Die ein-
74
fachste, aber umständlichste Prozedur, ein BASIC-Programm mit einer
zugehörigen Subroutine in den Computer zu bringen, besteht darin,
zuerst das Maschinenprogramm von der Cassette in einen reservierten
Speicherbereich zu laden und dann das BASIC-Programm zu laden.
Rationeller ist es jedoch, das Laden des Maschinenprogramms vom
BASIC-Programm selbst vornehmen zu lassen. Wenn man das Maschi¬
nenprogramm in irgend einer Weise in den Computer hineinbekommen
hat — entweder selbst geschrieben oder von der Cassette geladen — kann
man sich den belegten Speicherbereich mit entsprechenden PEEK-An-
weisungen anschauen und die Reihe von Zahlen die das Programm bil¬
det, als DATA-Zeilen in das BASIC-Programm aufnehmen. POKE-Be-
fehle können es dann nach dem Start des BASIC-Programms in seine
Position bringen. Der entsprechende Speicherbereich muß dazu natür¬
lich beim Anschalten des Computers reserviert worden sein.
Nimmt man gewisse Nachteile beim Computerbetrieb in Kauf, kann
man Maschinenprogramm-Subroutinen sogar in Bereichen des BASIC-
Programmtextes unterbringen, die mit Zeichenketten entsprechender
Länge freigehalten werden. Dafür gibt es in diesem Buch ebenfalls
ein Beispiel. Dieser Trick erübrigt sogar das Reservieren eines gesonder¬
ten Speicherbereichs für das Maschinenprogramm.
In diesem Zusammenhang ist Folgendes sehr wichtig: Es gibt grund¬
sätzlich zwei Arten von Maschinenprogrammen: Die einen enthalten
Sprunganweisungen zu fest vorgegebenen Adressen innerhalb des
Programms. Sie heißen „nicht relokierbar", denn es ist offensichtlich
nicht gleichgültig, an welcher Stelle im Speicher sie sich befinden.
Die andere Art enthält innerhalb des Programmbereichs nur relative
Sprünge, d. h. Sprünge, um eine bestimmte Anzahl von Adressen vor¬
wärts oder rückwärts vom jeweiligen Inhalt des Befehlszählers, der Spei¬
cheradressen beim Programmablauf zählt, entsprechend den Zeilenzah¬
len bei BASIC-Programmen. Solche Programme sind relokierbar, bei
ihnen ist es gleichgültig, wo sie im Computerspeicher untergebracht
sind. Man sollte meinen, daß wegen dieses offensichtlichen Vorteils nur
die zweite Programmart Bedeutung hat. Doch leider sind die Möglich¬
keiten für relative Sprünge begrenzt. Sie können nur bis zu 126 Spei¬
cherstellen weit rückwärts und 129 Speicherstellen nach vorne ausge¬
führt werden.
75
Auch hat die Unterscheidung nicht sehr große Bedeutung, wenn man
ein Maschinenprogramm von einer Cassette lädt. Dabei wird die An¬
fangsadresse immer mitgeliefert, liegt also fest. In diesem Fall und auch,
wenn man eine Subroutine mit Hilfe eines BASIC-Programmes einrich¬
tet, muß die Anfangsadresse bekannt sein, damit sie in den Platz für die
Sprungadresse der USR-Funktion geladen werden kann. Wenn sie infol¬
ge der Nicht-Relokierbarkeit des Maschinenprogramms nicht frei ge¬
wählt werden kann, ist dies keine allzugroße Erschwernis. Allerdings
muß man sich bei der Bemessung des reservierten Speicherbereichs nach
der (festen) Anfangsadresse richten und kann, falls sie nicht ganz ideal
gewählt wurde, nicht den kleinsten, gerade noch erforderlichen Spei¬
cherplatz freihalten.
Das Maschinenprogramm innerhalb des BASIC-Programmtextes unter¬
zubringen wird natürlich ziemlich schwierig, wenn es an eine feste An¬
fangsadresse gebunden ist. Ehe das BASIC-Programm fertig ist, weiß
man ja nicht, wo die Zeichenkette im Speicher dann später abgelegt
wird, welche das Maschinenprogramm aufnehmen soll. Man müßte
nach Fertigstellung des BASIC-Textes das Maschinenprogramm so ab¬
ändern, daß alle Sprunganweisungen an ihr vorgesehenes Ziel führen,
und dürfte das BASIC-Programm anschließend (zumindest im Bereich
vor der Zeichenkette) keinesfalls mehr verändern.
Einen interessanten Trick, wie man ein eigentlich nicht relokierbares
Maschinenprogramm dennoch für jeden beliebigen Speicherort geeig¬
net machen kann, zeigt übrigens das Unterprogramm zum Laden der
Tonerzeugungs-Subroutine in den Geräuscheffekt- und Musikprogram¬
men dieses Buches: Wenn man sich die DATA-Zeilen ansieht, bemerkt
man eine Reihe negativer Zahlen. Das sind nun tatsächlich relative
Sprungweiten, allerdings stets auf die Anfangsadresse der Subroutine
bezogen. Die Programmschleife zum Übertragen der einzelnen Zahlen
in den vorgesehenen Speicherbereich erkennt dies an dem Minuszei¬
chen (Zeile 50080), rechnet die Relativwerte mit Hilfe der Anfangs¬
adresse in Absolutwerte um (Zeile 50120) und bringt sie nach der Zer¬
legung in zwei Bytes (Zeile 50130) an ihren Platz (Zeile 50140). So
befindet sich schließlich ein Maschinenprogramm mit lauter absoluten
Sprunganweisungen an irgendeiner beliebigen Stelle im Speicher und
funktioniert trotzdem. Bei der Programmversion mit der Subroutine
in einem geschützten Speicherbereich kann dieser beliebig, zum Bei¬
spiel auch so klein wie nur irgend möglich, gewählt werden — die Po¬
sition der Subroutine orientiert sich stets an dem Beginn des geschütz¬
ten Bereichs, mit entsprechend angepaßten Sprungbefehlen.
ORG
7FC4H
START
IJ)
HL,SOUND
LD
(16526), 1IL
JP
1A19H
SOUND
LD
HL.(SDUFF)
A,(HL)
LD
OR
A
PUSH
AF
INC
HL
JJ
E, (HL)
INC
HL
LD
D,(HL)
EX
DE.HL
NEXT
POP
AF
RET
Z
DEC
A
RET
Z
DEC
A
PUSH
AF
LD
d,(hl)
LD
E,d
INC
HL
LD
c,( hl)
INC
m,
TONE
LD
A, 1
CALL
HOLD
JR
Z,NEXT
LD
A .3
CALL
HOLD
JR
NZ,TONE
JR
NEXT
HOLD
OUT
(0FF H),A
LD
B.C
LOOPB
DEC
DF
LD
A,D
OR
E
RET
Z
DJNZ
RET
LOOPB
SBUFE
DEFS
2
END
START
NEAll END OK 16K NIEM.
SETUP USR( 0) TO
POINT TO SOUND
JUMP TO BASIC
GET STRING DOPE VCTR
GET LEN
IS IT ZERO?
SAVE LEN AND TST RSLT
NEXT ITEM
LSB OE STR ADDR.
NEXT ITEM
MSB OF STR ADDR.
STR ADDR IN HL
NO. CHRS REMAINING
NO MORE
MUST BE 2 OR MORE
IT'S NOT
COUNT 2ND IN PAIR
SAVE REMAINING CNT.
GET DURAHON CHR.
(*256)
POINT TO PITCH CHR.
GET IT
NEXT CHR. IF ANY
SQUARE WAVE PLUS
SUSTAIN IT
ALL DONE
SQUARE WAVE MINUS
SUSTA1N IT
MORE OSCILLATIONS
ALL DONE
TO CASSETTE PORT
PITCH PER 101)
DECREMENT Dl’RATlON
TEST FOR ZERO
DONK IF SO
CNT DOWN PERIOD & LOOP
DONE COUNTING
THIS IS LOC. 32766
FOR AUTOSTART
Ei eure 2: The tone-generat i n*i pioeiam SOUND.
Beispiel Assemblerprogramm (ohne Zeilennummern)
Dieses Programm erzeugt Töne auf dem TRS-80. Ausgang ist der AUX-
Stecker vom Cassetteninterface.
Ein kleiner Versuch soll den Geschwindigkeitsunterschied zwischen
BASIC- und Maschinenprogrammen zeigen. Dazu wollen wir eine ein¬
fache „Tätigkeit“ für den Computer wählen, das Weißmalen des Bild¬
schirms in möglichst kurzer Zeit.
Die mehr oder weniger schnellste Methode, dies mit BASIC zu bewerk¬
stelligen, dürfte dieses Programm darstellen:
10 CLEAR 255: PRINT CHR$(23) STRING^ (255,191 )STRINGiJ>
(255,191) CHR$ (191) ;: POKE 16382, 191
20 GOTO 20
Nachdem man dies ausprobiert hat und sich ein Bild von der Schnellig¬
keit gemacht hat, mit der der Bildschirm weiß färbt, kann man mit
dem Maschinenprogramm fortfahren. Es wird, um die Sache möglichst
einfach zu machen, ebenfalls mit einem kleinen BAS IC-Programm in
den Computerspeicher geschrieben. Zuerst ist allerdings eine kleine
Vorbereitung nötig: Man muß den TRS-80 (der 16K Speicherkapazi¬
tät haben muß) kurz aus- und dann wieder einschalten (oder SYSTEM
gefolgt von / und ENTER eingeben). Auf die Frage MEMORY SIZE?
ist die Zahl 20479 einzugeben. Dann kann man folgendes Programm
einschreiben oder, falls bereits vorhanden, vom Cassettengerät ein¬
iesen:
10 FOR X=20480 TO 20507
20 READ A: POKE X,A
30 NEXT
40 DATA 33,0,60,17,1,60, 1,0,4,54,191,237,176,6,5,33,255,255,
43,124,181,194,18,80,16,245,195,0
Läßt man dieses Programm laufen, wird das aus den Zahlen in der
DATA-Zeile bestehende Maschinenprogramm in die Speicherpositio¬
nen 20480 bis 20507 übertragen. Gestartet wird es anschließend durch
SYSTEM und /20480. Als Ergebnis wird der Bildschirm schlagartig
weiß.
Er bleibt einige Sekunden so, dann ist das Programm abgearbeitet, und
der Computer fällt in die Anschaltroutine zurück. Dadurch wird zwar
das BASIC-Programm gelöscht, nicht aber das Maschinenprogramm, so
daß man es noch beliebig oft starten kann. Da kein BAS IC-Programm
mehr in den Speicher soll, braucht man den Bereich des Maschinenpro¬
gramms auch nicht mehr zu schützen und kann die Einschaltroutine
jetzt durch einfaches Drücken von ENTER beenden.
Die in der Speicherposition 20490 stehende Zahl 191 stellt übrigens
genau wie in entsprechenden BASIC-Programmen ein Graphik-Zeichen
dar, nämlich das weiße Feld, das 1024 mal geschrieben den weißen Bild¬
schirm ergibt. Durch Ändern dieser Zahl mit einem entsprechenden
POKE-Befehl kann man das Maschinenprogramm den Bildschirm auch
mit beliebigen Zahlen, Buchstaben usw. füllen lassen.
79
Das TRS-80 Floppy Disc-System
Es war bereits davon die Rede, daß das Erweiterungsbauteil „expansion
interface" des TRS-80 dem Computer eine neue Dimension von Anwen¬
dungen in Richtung auf ein schon echt kommerzielles System er¬
schließt. Zum einen läßt es sich mit bis zu 32K weiterem freien Spei¬
cherraum ausstatten. Dann ermöglicht es den Anschluß eines zweiten
Cassettenrecorders. Doch vor allem enthält das Gerät die Steuerschal¬
tung für das Floppy Disc-System des Computers. Und dieses kann —
von einigen weiteren Einzelheiten abgesehen — als die eigentliche
Funktion des Apparates angesehen werden, nachdem bereits der Er¬
weiterungsanschluß der Computer-Grundeinheit sich als Ausgang für
Drucker und andere Zusatzgeräte eignet.
An das Expansion Interface lassen sich bis zu vier Laufwerke an¬
schließen, die als Datenspeicher-Vorrichtungen dünne, biegsame, runde
Scheiben aus magnetisierbarem Material (sog. Disketten) mit ca. 13 cm
TRS-80 mit Expansion-Interface und 4 Floppy-Disk-Laufwerken
80
Durchmesser aufnehmen — sogenannte Mini-Floppy Discs. Die Schei¬
ben können 89 K Byte Informationen auf nehmen, und die ist ganz
wesentlich schneller erreichbar, als auf den Tonbandcassetten. Eine
der Scheiben — wenn man nur ein Laufwerk hat, die einzige verwende¬
te - enthält auch das TRS-80-Disc BASIC sowie das Floppy Disc-
Betriebssystem, ein Maschinenprogramm (Name: TRSDOS). Das Disc
BASIC bietet, außer den besonderen Anweisungen für den Floppy-
Disc-Betrieb, einige zusätzliche Möglichkeiten, die der Computer ohne
Erweiterungsteil nicht hat, das TRSDOS, unter anderem eine Uhr, die
rechts oben auf dem Bildschirm eingeblendet werden kann. Die zuge¬
hörigen Schaltungen sind im Expansion Interface eingebaut und inzwi¬
schen gibt es auch ein kleines Maschinenprogramm, mit dessen Hilfe
man die Uhr auch ohne Floppy Disc-System erscheinen lassen kann.
Zum Gebrauch werden Disc BASIC und auch das TRSDOS stets von
der Magnetscheibe in den Speicher des Computers geladen und nehmen
dort knapp 10K Raum ein. Wenn man die Floppy Discs verwenden will,
empfiehlt es sich daher, den Erweiterungsteil zumindest mit 16K Spei¬
cherraum auszustatten. Sonst bleiben (von den knapp 16K des Compu¬
ter-Hauptteils) nur noch vergleichsweise magere 6K für Programme
übrig.
Selbstverständlich kann man Daten geordnet oder ungeordnet auf die
Mini-Floppies schreiben und wieder lesen. Dazu werden sogenannte
Files auf den Scheiben verwendet, gewissermaßen Ablageplätze für
gewisse Datenmengen. Das Betriebssystem TRSDOS tritt mehr oder
weniger an die Stelle des normalen Computer-Betriebssystems, was
das Floppy Disc-System angeht. Damit kann man zum Beispiel BASIC-
oder Maschinenprogramme auf Disketten speichern und wieder laden,
Scheiben kopieren usw. Eine interessante Möglichkeit besteht darin,
einzelne Files oder auch ganze Disketten mit einem Codewort zu
schützen. Je nach Umfang des Schutzes lassen sich dann nur bestimmte
Funktionen ausführen, ohne daß man dazu das Codewort angeben muß.
Mit dem voll ausgebauten Floppy Disc-System verfügt der TRS-80
über mehr als 350 K verhältnismäßig schnell zugänglicher Speicherkapa¬
zität. An große Computersysteme — z. B. Minicomputer — reicht dies
natürlich noch nicht heran. Ernsthaften kommerziellen Einsatz erlaubt
es jedoch allemal. Darüber hinaus bietet sich jetzt auch die Gelegenheit,
Komplettes Computersystem für den Geschäftsbereich
die gewissermaßen fest in den Computer eingebauten Wege zu verlassen
und beispielsweise andere Programmiersprachen zu verwenden, als das
vorhandene BASIC. Tatsächlich ist unter anderem ein Maschinenpro¬
gramm auf Disketten erhältlich, mit dessen Hilfe man eine FORTRAN-
Version auf dem TRS-80 einsetzen kann.
Allerdings dürfte dies alles doch wohl ein wenig über den Rahmen
hinausgehen, den man vernünftigerweise für ; den privaten Einsatz
eines Microcomputers als gegeben voraussetzen kann.
82
Der Erweiterungs-Ausgang des TRS-80 (Expansion Port)
Rechts (von hinten gesehen) an der Rückseite des Computergehäuses
befindet sich unter einer abnehmbaren Klappe der Erweiterungs-Bus¬
anschluß des TRS-80. Er ist als 40-poliger Platinenanschluß ausgeführt
und läßt sich mit einem entsprechenden Platinenstecker (AMP P/N
88103-1 oder ähnliches) abgreifen. Vom Hersteller ist der Busanschluß
für den Erweiterungsbauteil gedacht. Doch kann der TRS-80-Freund
auch seine eigenen Erweiterungen (Steuerungen, Zusatzgeräte) hier an¬
schließen. Dazu sollen an anderer Stelle noch einige Erklärungen fol¬
gen. Hier zunächst die Lage und Bezeichnungen der einzelnen An¬
schlüsse:
Der Bus-Ausgang des TRS-80
Anschlußnummer
Signalname
1
RAS'
2
SYS RES'
3
CAS'
4
410
5
A12
6
A13
7
AI 5
8
GND
9
All
10
A14
11
A8
12
OUT'
13
WR'
14
INTAK'
15
RD'
16
MUX
17
A9
18
D4
19
IN'
20
D7
21
INT'
22
Dl
23
TEST'
Beschreibung
Taktausgang Adressenzeile
RESET-Ausgang
Taktausgang Adressenspalte
Adressenausgang
Adressenausgang
Adressenausgang
Adressenausgang
Erde
Adressenausgang
Adressenausgang
Adressenausgang
Peripherie-Schreib-Taktsignal
Speicher-Schreib-Taktsignal
Interrupt-Bestätigung
Speicher-Lese-Taktsignal
Kontrollsignal Adressmultiplexer
Adressenausgang
Datenleitung
Peripherie-Lese-Takt signal
Datenleitung
Interrupt-Eingang (maskierbar)
Datenleitung
Testeingang
83
24
D6
25
A0
26
D3
27
AI
28
D5
29
GND
30
DO
31
A4
32
D2
33
WAIT'
34
A3
35
A5
36
A7
37
GND
38
A6
39
+5V
40
A2
Datenleitung
Adressenausgang
Datenleitung
Adressenausgang
Datenleitung
Erde
Datenleitung
Adressenausgang
Datenleitung
Warte-Eingang
Adressenausgang
Adressenausgang
Adressenausgang
Erde
Adressenausgang
5-V-Anschluß, bei Level Il-Gerä-
ten auf Erdpotential
Adressenausgang
Anmerkung: Die mit Apostroph versehenen Signale haben als logisches
„Wahr“ niedriges Potential.
1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39
nnnnnnnnnnnnnnnnnnrm
UUUUUUUU U'UJ uuuuuuuu QU
2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40
84
Nummerierung der Bus-Anschlußleitungen (von der Rückseite des Com¬
putergehäuses aus gesehen).
Die Erklärungen zu den einzelnen Anschlüssen:
Adressenausgänge
Von diesen Ausgängen gibt es insgesamt 16: AO bis einschließlich A15.
Auf AO befindet sich das geringstwertige Adressenbit, auf AI5 das
höchstwertige. Diese Leitungen benutzt (im Normalfall) nur die zen¬
trale Recheneinheit (CPU), die damit Speicherstellen anspricht, um In¬
formation zu lesen oder zu schreiben. Insgesamt sind 65 536 (2 16
oder 16K) verschiedene Adressen möglich. WICHTIG! Jede Adressen¬
leitung darf höchstens mit einem Logikanschluß (Transistor-Transistor-
Logik-TTL) belastet werden!
Datenausgänge
Es gibt 8 Datenausgänge, die mit DO bis D7 bezeichnet sind. DO trägt
das geringstwertige, D7 das höchstwertige Datenbit. Die Datenausgänge
sind bidirektional, d. h. auf ihnen bewegen sich Informationen von der
Zentraleinheit (CPU) zu Speicher, Ausgängen, Anschlußgeräten usw.
sowie auch umgekehrt. Das bedeutet für Anschlußgeräte, daß diese
stets für jede Datenrichtung mit einem Tri-State-Buffer ausgerüstet
sein sollten, also mit einem Datenpuffer, dessen Anschlüsse jeweils
niedrige und hohe Spannung (logisch "0" und "1") sowie zusätzlich
einen hochohmigen, „abgeschalteten" Zustand einnehmen können.
Taktausgang für Adressenzeile
Diese Steuerleitung (Bezeichnung: RAS') ist ebenso wie der Taktaus¬
gang für die Adressenspalte (siehe unten) erforderlich, weil die CPU
eigentlich nur Adressen mit 8 Bit Länge ausgeben kann und die 16 Bit
lange Adressen dieses Computersystems deshalb gewissermaßen in zwei
8-Bit-Portionen unterteilt. RAS' liegt normalerweise auf logisch*1*(hohe
Spannung) und wird von der CPU während der ersten Hälfte einer
Adressenausgabe auf logisch "0" geschaltet. Für die dynamischen RAMs
des TRS-80 dient dieses Signal gleichzeitig zur (bei dieser RAM-Bauart
notwendigen) Auffrischung des Speicherinhalts.
Taktausgang für Adressenspalte
Dieser Ausgang (CAS') wird während der zweiten Hälfte einer Adressen¬
ausgabe durch die Zentraleinheit auf logisch "0" geschaltet, so daß die
Speichereinheiten diesen Adressenteil vom ersten unterscheiden können
(siehe oben).
85
Kontrollsignal für den Adressmultiplexer
Dieses Signal (MUX) schaltet den Multiplexer um, der die erste und
zweite Adressenhälften zu je 8 Bit getrennt zu den Speichereinheiten
führt. Dieses Signal arbeitet mit RAS' und CAS' zusammen (s. oben).
RESET-Ausgang
Das Signal auf dieser Leitung (SYSRES'-System RESET) liegt nur
dann auf niedriger Spannung, wenn der Computer angeschaltet oder
der RESET-Knopf gedrückt wird. SYSRES' kann man verwenden, um
externe Geräte zugleich mit dem Computer betriebsbereit zu schalten.
Test-Eingang
Wenn man diesen Anschluß erdet, nehmen alle Adressen-, Daten- und
Kontrollsignal-Puffer einen hochohmigen Zustand ein, so daß die zu¬
gehörigen Leitungen gewissermaßen abgeschaltet sind. Betroffen sind
neben den Anschlüssen AO — AI 5 und DO — D7 die Signale WR',
RD', IN', OUT', RAS', CAS' und MUX'. Dies dient normalerweise nur
zu Testzwecken.
Warte-Eingang
Wenn man diesen Anschluß (Signal: WAIT') auf Erdpotential legt,
wird die Funktion der Zentraleinheit unterbrochen. Dies ist sehr nütz¬
lich, wenn man ein Gerät mit dem Computer betreiben will, das lang¬
samer arbeitet als der Rechner. Durch Schalten des WAIT'-Signals kann
man das Gerät dann jeweils gegenüber dem Computer aufholen lassen.
Speicher-Schreib-Taktsignal
Dieses Signal (WR') kennzeichnet einen Einschreibvorgang der Com¬
puter-Zentraleinheit in den Speicher.
Speicher-Lese-Taktsignal
Dieses Signal (RD') zeigt an, daß die CPU gerade Information aus dem
Speicher liest.
Peripherie-Schreib-Taktsignal
Wenn dieses Signal (OUT') auf niedrige Spannung schaltet (logisch
"0“), soll die auf den Datenbus vorhandene Information von einem ex¬
ternen Empfänger (Anschlußgerät) übernommen werden, dessen Adres¬
se auf den unteren 8 Adressenleitungen AO bis A7 zu finden ist. (Die
Anzahl der möglichen Adressen für Anschlußgeräte — d. h. Ausgänge —
beträgt damit 2 8 = 256).
86
Peripherie- Lese-T aktsignal
Wenn dieses Signal (IN') einen niedrigen Spannungszustand einnimmt,
erwartet der Computer von einem Anschlußgerät über den Datenbus In¬
formationen, daß er mit einer Adresse auf den ersten 8 Leitungen des
Adreßbusses (AO — A7) anspricht.
Interrupt-Eingang
Wenn dieser Eingang (INT') auf 0 gelegt wird, springt die Zentralein¬
heit in ihrer Befehlsverarbeitung zu einer vorbestimmten Adresse im
Festwertspeicher (ROM). Dabei gibt es drei verschiedene Möglichkei¬
ten: Bei den ersten führt die CPU diesen Sprung nicht aus, bei der zwei¬
ten geht der Sprung zur Adresse 0038 Hex. Die dritte Möglichkeit be¬
steht darin, den Sprung zu einer beliebigen, vorher angegebenen Ziel¬
adresse durchführen zu lassen. Doch läßt sich dies beim TRS-80 infolge
interner Schaltungen nicht verwirklichen.
Interrupt-Bestätigung
Dieses Signal (INTAK') geht in den niedrigen Zustand, wenn die CPU
den Interrupt-Zustand einnimmt. Für externe Schaltungen kann IN¬
TAK' zur Bestätigung eines eingeleiteten Interrupt-Vorganges dienen.
5 Volt-Ausgang
Dieser Anschluß ist mit der 5-V-Stromversorgung des Computers ver¬
bunden. Allerdings empfiehlt es sich nicht, Zusatzgeräte damit zu be¬
treiben, da die Leistung der Stromversorgung ziemlich genau auf den
Bedarf des TRS-80 zugeschnitten ist. Außerdem liegt dieser Anschluß
bei den mit Level II BASIC ausgerüsteten Computern auf Erdpotential.
87
Verbindungen zur Außenwelt
Der Busanschluß unter der Klappe links hinten am Computergehäuse
ist zwar vom Hersteller für die Verbindung mit dem Erweiterungs-
Bauteil vorgesehen. Es bietet dem TRS-80-Freund aber auch die Mög¬
lichkeit, selbst Zusatzgeräte mit dem Computer zu steuern. Dies kön¬
nen, wie bereits erwähnt, Drucker und ähnliches sein, aber auch Steue¬
rungen für beliebige Maschinen, Elektrogeräte, Lampen usw. Wie sich
diese Möglichkeit grundsätzlich nutzen läßt, soll hier kurz dargestellt
werden:
Prinzipiell gibt es zwei Wege, Informationen aus dem Computer nach
außen (und von draußen herein) zu tragen. Man kann externe Schal¬
tungen wie Speicherbereiche behandeln und sie gewissermaßen zu
einem Teil des Computers machen, oder man kann die beim Micropro-
cessor Z-80 gegebene Möglichkeit nutzen, Signale an Ausgänge zu
senden und von Eingängen zu empfangen. Im ersten Fall gibt es auch
bei einem TRS-80 mit 16K freiem Speicherraum noch 32768 verschie¬
dene Adressen, die man extern nutzen kann, da die CPU insgesamt 64K
Speicherkapazität oder 65536 Speicherstellen ansprechen kann. Und
in jede Speicherstelle läßt sich ein Byte einschreiben — das sind die
Zahlen von 0 bis 255. Insgesamt also fast unerschöpfliche Möglichkei¬
ten zur Steuerung oder zum Informationsaustausch mit der Außenwelt!
Allerdings müssen Zusatzgeräte, die auf dieser Basis funktionieren,
neben den acht Datenleitungen an 16 Adressenleitungen angeschlossen
sein und deren Signale verarbeiten — unter Umständen ein nicht klei¬
ner Aufwand.
Etwas einfacher geht es mit der anderen Variante, den (sogenannten)
Ein- und Ausgängen: Hier sind außer den Datenleitungen nur acht
Adressenleitungen zu berücksichtigen, und zwar die Leitungen AO bis
A7. Damit gibt es aber auch nur 255 verschiedene Ein- und Ausgänge
(den 256. braucht der Computer, wie schon erläutert, selber). Aller¬
dings wird das für die meisten Zwecke mehr als genug sein.
Für jede der beiden Methoden, Informationen auszutauschen, gibt es
zwei Steuerleitungen: Für die Speicheransprache WR' und RD', für
die Ein- und Ausgänge OUT' und INT' (wie bereits dargelegt).
88
Alle vier Signale werden vom Computer kontrolliert! Er entscheidet
also, wann er Speicherplätze bzw. Anschlüsse ansprechen will und wann
nicht. Darauf müssen etwaige Zusatzschaltungen reagieren und dürfen
nicht von sich aus Signale in die Datenleitungen einspeisen.
Bei allen Zusatzschaltungen sollten zwei Regeln unbedingt beachtet
werden: Immer eine eigene Stromversorgung vorsehen. Die Versorgung
des TRS-80 reicht nur für den Computer selbst und kaum für weitere
Geräte. Und was noch wichtiger ist: Daten-, Steuer- und Adressenlei¬
tungen sind nur für eine TTL-Last ausgelegt. In der Regel ist also stets
zusätzliche Pufferung erforderlich.
An dieser Stelle soll auch noch auf eine weitere Möglichkeit hinge¬
wiesen werden, den Computer mit der Außenwelt zu verbinden und
zwar mit Hilfe der Steuerleitung TEST'. Legt man dieses Signal, das
sich am Anschluß Nr. 23 des Busanschlusses befindet, auf Nullpotential,
gehen unter anderem alle Daten- und Adressenleitungen sowie alle
Speicher-Steuerleitungen in den hochohmigen Zustand über. Damit ist
die CPU von ihrem Speicher vollständig abgeschnitten. Man könnte also
einen zweiten Computer Zugang zu dem Speicherraum verschaffen.
Nun wird sich vielleicht kaum jemand zwei Computer hinstellen und
betreiben. Doch die Möglichkeit dazu wäre gegeben: Mit vergleichs¬
weise einfachen Zusatzschaltungen könnten zwei (oder vielleicht noch
mehr?) TRS-80 Zusammenarbeiten und gemeinsam ein wesentlich
leistungsfähigeres Datenverarbeitungssystem bilden, bei dem zum Bei¬
spiel eine Seite zeitraubende Berechnungen übernimmt, während die
andere für die interaktive Zusammenarbeit mit dem Menschen bereit¬
steht.
Nachzutragen bleiben noch die Verbindungen zum BASIC: Speicher¬
plätze, ob im Computer oder außerhalb, werden in bekannter Weise
mit PEEK und POKE angesprochen. Ein- und Ausgänge mit INP und
OUT. Und noch eine Bemerkung: Es könnte sich, wählt man die Spei¬
cher-Variante für Anschlußgeräte, notwendig erweisen, diesen Bereich
vor dem unkontrollierten Zugriff des Computers zu schützen. Dazu
müßte man beim Anschalten auf die Frage MEMORY SIZE? mit der
höchsten, im Computer vorhandenen Speicherstelle antworten (20479
bei 4K, 32767 bei 16K).
89
Erweiterung des RAM-Bereichs im TRS-80
Nicht wenige TRS-80-Freunde werden sich ihren Computer zunächst
in der Version mit 4K freier Speicherkapazität gekauft haben bzw.
kaufen wollen — mit der Absicht, zu einem späteren Zeitpunkt die
Erweiterung auf 16K vorzunehmen, die ja nicht teurer ist, als den Com¬
puter gleich mit dem größeren Arbeitsspeicher (RAM) zu kaufen.
Hier soll nun gezeigt werden, wie man die Speichererweiterung selbst
vornehmen kann. So läßt sich unter günstigen Umständen einiges Geld
sparen, und man behält die kleineren Speicherchips, die sonst beim
Händler bleiben.
Gebraucht werden zunächst acht dynamische RAM-Chips vom Typ
D416 oder 4116. Ferner ist etwas Schaltdraht für Brückenverbindungen
erforderlich sowie ein Kreuzkopf-Schraubenzieher und ein Abzieher
für integrierte Schaltungen.
Zunächst müssen alle Kabelverbindungen vom Computergehäuse
entfernt werden. Dann legt man es mit der Tastatur nach unten auf
eine weiche Unterlage (Handtuch, Kissen oder etwas ähnliches) und
öffnet es, indem man alle sechs sichtbaren Schrauben entfernt. (Ach¬
tung: Es gibt drei Schraubengrößen!)
Dann sucht man sich aus den auf der Platine vorhandenen integrierten
Schaltungen die acht RAMS ZI3 bis einschließlich Z20 heraus (siehe
Skizze). Sehr wichtig ist die Position der Kerben an den Gehäusen der
Chips. Die Kerben in den neuen Chip-Gehäusen müssen unbedingt nach
der Montage in die jeweils gleiche Richtung zeigen!
Die MOS-Chips, mit denen man es hier zu tun hat, können durch stati¬
sche Entladungen, die vom menschlichen Körper ausgeht, leicht Scha¬
den nehmen. Deshalb sollte man Schuhe und Strümpfe ausziehen,
ehe man mit ihnen umgeht. Günstig ist es auch, sich vorher kurz an
einem Heizkörper oder etwas ähnlichem zu erden. Anschließend sollte
man unnötige Bewegungen vermeiden, um erneute statische Aufladung
zu vermeiden.
Jetzt kann man die alten integrierten Schaltungen mit dem Abzieh¬
werkzeug oder (wenn es sich nicht vermeiden läßt) einem kleinen
Schraubenzieher entfernen. Sie stecken alle in Sockeln. Dazu lockert
90
man sie vorsichtig an beiden Enden und legt sie zum Schutz gegen sta¬
tische Elektrizität auf Aluminiumfolie oder leitendem Schaumstoff
ab. An ihre Stelle kommen jetzt die neuen RAMs, wobei man besonders
Acht geben muß, die Kontakte nicht zu verbiegen.
Jetzt muß man noch die Sockel Z3 und Z71 heraussuchen ($. Skizze)
und die Drahtbrücken entfernen. Dann werden neue Drahtbrücken ge¬
mäß der Skizze eingesetzt (wenn man sich den Luxus leisten will,
kann man auch DIP-Schalter verwenden). Ein wichtiger Hinweis: Es
gibt zwei verschiedene Platinen-Typen mit den Bezeichnungen
170069A und 170069D. Die erste Version verwendet Brückensockel
mit 14 Kontakten, die zweite mit 16 Kontakten (Skizze).
Man sollte sich genau vergewissern, mit welcher Platinenversion man es
zu tun hat, und die Brücken entsprechend anordnen.
Nach einer sorgfältigen Überprüfung der Positionen von RAMs und
Brückenverbindungen kann man jetzt die Gehäuse wieder zusammen¬
bauen. Dabei sollte auf korrekten Sitz der Tastatur geachtet werden.
Nach Anschluß der verschiedenen Kabel bleibt noch das Gerät anzu¬
schalten und PRINT NEM einzutippen. Nach dem ENTER sollte die
Zahl 15572 erscheinen. Und nun viel Vergnügen mit dem 16K Spei¬
cherraum! RESET-
RAM- und Brückenpositionen
91
Modifizierung des READ-Vorgangs
Es gibt beim TRS-80 einen sehr praktischen Trick, die READ-Anwei-
sung abzuwandeln, die bekanntlich Daten ins eigentliche Programm
übernimmt, die unter dem Begriff DATA zusammengefaßt stehen. Und
zwar geht das durch Veränderung des Inhalts der Adresse 16553 des
Computerspeichers. Wie aus dem Handbuch hervorgeht, befindet sich
die Adresse in einem Speicherbereich, der zwar frei zum Einlesen von
Informationen ist (RAM-Speicherbereich), aber für interne Zwecke Vor¬
behalten bleibt. Normalerweise befindet sich in der Position 16553,
die Zahl 255. Ersetzt man sie durch den Befehl POKE 16553,0, wird
der Mechanismus ausgeschaltet, der normalerweise dafür sorgt, daß
bei aufeinanderfolgenden READ-Befehlen jeweils auch aufeinander¬
folgende Daten bzw. Strings in den DATA-Zeilen angesprochen wer¬
den. Folgendes kleine Programm soll dies verdeutlichen:
10 FOR 1=1 TO 5
20 READ A
30 PRINT A;
40 NEXT
50 POKE 16553,0
60 FOR 1=1 TO 5
70 READA
80 PRINT A;
90 NEXT
100 DATA 1,2, 3, 4, 5,6, 7,8, 9,10
Läßt man das Programm laufen, erhält man folgende Bildschirmanzei¬
ge:
1234566666
Nach Lesen und Ausgeben der ersten fünf Zahlen wurde das Weiter¬
schalten auf die jeweils nächste Zahl unterbrochen und in der zweiten
Programmschleife (Zeilen 60 bis 90) las der Computer immer wieder
dieselbe Zahl. Beim zweiten und allen folgenden Läufen ergibt sich das
folgende Bild:
1111111111
Das kommt daher, daß die Wirkung des POKE-Befehls unabhängig von
irgendwelchen Programmen immer bestehen bleibt. In diesem Falle
ist der Weiterschalt-Mechanismus ausgeschaltet, und es wird immer
93
nur die erste Zahl, nämlich die 1 gelesen und auf den Bildschirm ge¬
bracht. Das zeigt auch, wie wichtig es ist, die Veränderung am Betriebs¬
system des Computers, die mit POKE 16553,0 geschah, nach Gebrauch
wieder rückgängig zu machen — durch POKE 16553,255.
Zusammen sind die beiden Befehle POKE 16553,0 und POKE
16553,255 also ein recht praktisches Mittel, um die READ-Routine
nach Bedarf abzuändern: Man kann durch die erste Anweisung das
Weiterschalten anhalten und eine bestimmte Zahl (oder String) be¬
liebig oft lesen, ehe man durch die zweite Anweisung zu den folgenden
Zahlen weitergeht. Wenn man also eine Zahl oftmals benötigt, muß
man nur die entsprechenden READ-Befehle zwischen den POKE-An-
weisungen anordnen und braucht die Zahl in der DATA-Zeile nur ein¬
mal hinzuschreiben. Übrigens: Da das Weiterschalten (naturgemäß)
jeweils nach dem READ-Vorgang geschieht, wird die Zahl, die mehr¬
mals gelesen werden soll, auch nach Wiederinkraftsetzen der Weiter¬
schaltung durch POKE 16553,255 noch einmal gelesen. Man muß
also zwischen die beiden POKE-Befehle immer ein READ weniger
anordnen, als man die betreffende Zahl tatsächlich braucht. Ein Bei¬
spiel:
10 READA(O)
20 READA(I)
30 POKE 16553,0
40 FOR 1=2 TO 8
50 READA(I)
60 NEXT
70 POKE 16553,255
80 READ A(9)
90 READA(IO)
100 FOR 1=0 TO 10: PRINT A(l); : NEXT: END
110 DATA 2,3,999,3
Ein Programmlauf gibt dann folgendes Bild:
2 3 999 999 999 999 999 999 999 999 3
Die Zahl 999 wird innerhalb der Schleife siebenmal gelesen und an¬
schließend nach dem POKE 16553,255 noch einmal.
94
Ein kleiner Trick, der das Schreiben von Programmen erleichtert:
Man kann an das Ende eines noch nicht fertigen Programms oder an
einer vorübergehend gewählten Unterbrechungsstelle den Befehl LIST
einfügen (eventuell auch mit Angabe der gewünschten Zeilen). Dann
wird der Programmtext nach jedem Versuchslauf automatisch gelistet
und man hat ihn gleich für Änderungen vor Augen. Achtung: LIST
stoppt neben seiner eigentlichen Aufgabe die Programmausführung
endgültig. Man kann ein Programm also nicht einfach mit CONT fort¬
setzen, wie bei STOP oder END.
95
Programme
Nichts geht über die Praxis. Diese Regel gilt natürlich auch für die Be¬
schäftigung mit Microcomputern und hier insbesondere mit dem
TRS-80. Deshalb ist auch ein guter Teil dieses Buches der Praxis ge¬
widmet, nämlich den Programmen selbst. Davon finden sich hier, auf
diesen Text folgend, eine ganze Anzahl und zwar mit ganz unterschied¬
lichen Längen und Schwierigkeitsgraden. Dem Zweck dieses Buches
entsprechend sind sie für Level II BASIC geschrieben. Eine Reihe von
Programmen läßt sich in 4K Speicherplatz unterbringen, der Rest er¬
fordert 16K. In der Mehrzahl handelt es sich um Spiele, doch es sind
auch einige praktische, für persönliche Finanzangelegenheiten darun¬
ter. Andere stellen Hilfen für den Computerbetrieb dar, auch ein paar
nützliche Routinen zum Einbau in eigene Programme des TRS-80-
Freundes sind darunter.
Und damit ist auch gleich ein ganz wichtiges Thema angesprochen:
Die Arbeit mit den hier abgedruckten Programmen: Empfehlenswert
ist es, zunächst mit einfachen, kurzen Programmtexten zu beginnen
und sich jede Zeile nach dem Eintippen genau anzusehen, ehe man mit
der nächsten beginnt. Wenn man dann etwas Routine gewonnen hat,
kann man sich an längere Programme heranwagen.
Bekanntlich kann man auf Leerstellen zwischen den einzelnen Aus¬
drücken des BAS IC-Textes verzichten. Trotzdem empfiehlt es sich, sie
wie in den meisten Programmen dieses Buches geschehen, einzufügen.
Dadurch gewinnt der Text sehr an Lesbarkeit und erfahrungsgemäß
ist dies gerade bei Programmen, die man nicht selbst geschrieben hat,
besonders wichtig. Bei ihnen sind Fehler beim Eintippen ungleich
schwerer zu finden.
Die einzelnen Programme des Buches stammen von unterschiedlichen
Quellen. Dementsprechend unterscheiden sie sich zunächst in einzel¬
nen Schreibweisen. Darüber an anderer Stelle noch näheres. Darüber-
hinaus erkennt man aber auch, daß bestimmte Aufgaben auf verschie¬
dene Weise gelöst sind. Dies sollte nicht als Nachteil gesehen werden
— im Gegenteil: Für den Leser bietet dies die Möglichkeit, die unter¬
schiedlichen Methoden zum Programmieren einzelner Aufgaben ken¬
nenzulernen. Ihre Anwendung hängt von den Umständen ab, ist aber
in manchen Fällen auch einfach Geschmackssache.
96
Überhaupt sollten die hier abgedruckten Programme nicht als „Heilig¬
tümer“ angesehen werden. Immer sind sie auch als Anregung gedacht
— für Veränderungen nach dem Geschmack und den Bedürfnissen des
Lesers. Sicher werden dem einen oder anderen auch einige Verbesse¬
rungen einfallen. Allerdings soll in diesem Zusammenhang darauf hin¬
gewiesen werden, daß manche der Programme mit Absicht nicht den
höchstmöglichen Stand an Eleganz und Raffinesse darstellen. Dies er¬
gibt sich zwangsläufig aus dem Bestreben, einigermaßen durchschau¬
bare Programme zu schreiben und den Leser mit möglichst vielen Mög¬
lichkeiten bekanntzumachen, die im BASIC — insbesondere dem Level
11 BASIC von Radio Shack — stecken.
Noch eine Bemerkung zu den praktischen Programmen für persön¬
liche Finanzen: Hier geht es „um Geld“, das heißt, Fehler können sehr
viel schwerwiegendere Folgen haben, als bei den Spielprogrammen.
Daher empfiehlt es sich, die Ergebnisse von Berechnungen, die man
mit ihnen macht, am Anfang sorgfältig zu prüfen. Erst wenn man ganz
sicher ist, daß die richtigen Zahlen herauskommen, sollte man be¬
ginnen, sich auf sie zu verlassen.
97
Programmauswahl
Programmauswah I
Mit diesem kleinen Programm kann man vorteilhaft eine Programm-
cassette beginnen lassen. Es macht sich die Tatsache zunutze, daß als
Programmbezeichnung in der Ladeanweisung auch eine String-Variable
zulässig ist - CLOAD A$ statt wie üblich CLOAD "X". Auch kann
man ja das CLOAD auch innerhalb eines Programms benutzen. Wenn
also die Cassette mit diesem Programm beginnt, braucht man sich um
den Inhalt des Bandes weiter keine Gedanken zu machen. Man legt
es einfach ein und lädt das erste Programm - nämlich dieses. Dann
kann man unter den gezeigten Möglichkeiten wählen, indem man den
betreffenden Buchstaben eingibt. Den Rest - Suche und Laden des
gewünschten Programms - besorgt der Computer dann von selbst.
10 CLS
20 PRINT "AUF DIESEM BAND SIND FOLGENDE PROGRAMME:
30 PRINT:PRINT
40 PRINT "a - (ERSTES PROGRAMM)
30 PRINT
40 PRINT M B - (ZUEITES PROGRAMM)
70 PRINT
80 PRINT "C - (DRITTES PROGRAMM)
90 PRINT
100 PRINT "D - (VIERTES PROGRAMM)
110 PRINT
120 PRINT "UM DAS GEUUENSCHTE PROGRAMM ZU LADEN,
DEN ZUGEHOERIGEN
130 INPUT "BUCHSTABEN EINTIPPEN UND •'ENTER - '
DRUECKEN - "; Xi
140 CLOAD X$
98
Die Türme von
Hanoi
Die Türme von Hanoi
Dieses Spiel werden viele in ihrer Jugend gespielt haben, wenn auch
nicht mit einem Computer. Auch unter dem Namen „Türme von Ha¬
noi" ist es hierzulande wohl nicht unbedingt bekannt. Worum es geht,
ist wieder in den Erläuterungen erklärt: Man hat drei Stangen, auf de¬
nen sieben runde Scheiben mit einem Loch in der Mitte stecken. Die
Scheiben haben alle eine unterschiedliche Größe und das Spiel besteht
darin, sie alle einzeln von einer Stange auf eine der beiden anderen
zu heben, ohne daß jemals eine größere auf einer kleineren liegt. Der
Computer prüft die einzelnen Bewegungen der Scheiben und weist
unerlaubte Züge zurück. Auch zählt er die Züge und teilt ihre Gesamt¬
zahl mit, wenn es dem Spieler gelungen ist, alle Scheiben von einer
Stange auf eine andere zu bringen. Anschließend kann man weiter¬
spielen oder neu beginnen.
Interessant übrigens die Art der Dateneingabe zum Bewegen der Schei¬
ben: Die Stangen sind nummeriert und für eine Bewegung gibt man
nur Nummern der Stange, von der abgehoben wird und der Zielstange
ein, ohne ENTER drücken zu müssen. Dazu wird eine INKEY$-Routine
zweimal hintereinander durchlaufen, die in den Zeilen 1010 bis 1030
steht und die eingetippten Zahlen werden auch auf dem Bildschirm an¬
gezeigt, als ob sie durch ENTER eingegeben worden wären. Das USING
„ # #" in Zeile 1030 dient dabei nur dazu, die beiden Ziffern auf dem
Bildschirm ein wenig näher aneinander rücken zu lassen. Insgesamt er¬
spart diese Eingabe-Routine das Komma zwischen den Zahlen und das
ENTER-Drücken und beschleunigt so das Spiel nicht unerheblich.
Zur Verdeutlichung sind die einzelnen Abschnitte des Programms mit
entsprechenden Bemerkungen gekennzeichnet.
99
1 ' COPYRIGHT 1978, THE BOTTOH SHELF, INC.
2 ■' ALL RIGHTS RESERVED. DO NOT COPY
3 ' P.O. BOX 49104 ATLANTA GA 30359
40 CLS: PRINT“ *** D I E TUERHE VON HAN
0 I ♦ ♦♦
50 PRINT: PRINT: PRINT" ZIEL DIESES SPIELS IST ES, ALLE SIE
BEN SCHEIBEN VON EINER
60 PRINT"STANGE ZU EINER ANDEREN ZU VERSETZEN. DIE SCHEIBEN
DUERFEN
70 PRINT”DABEI NUR EINZELN BEUEGT HERDEN, UND ES DARF NIEHAL
S EINE
80 PRINT"GROESSERE AUF EINER KLEINEREN LIEGEN. EINEN ZUG HAC
HT MAN,
90 PRINT"INDEN HAN NACHEINANDER DIE NUHHERN DER BEIDEN BETRE
FFENDEN
92 PRINT"STANGEN EINTIPPT.
94 PRINT: INPUT"ZUH STARTEN 'ENTER' DRUECKEN ";Ai
100 CLEAR 50 : DEFINT A-Z : DIH A<3,7)
104 'SPIELANFANG
110 CLS: PRINT" ♦♦♦DIE TUERHE VON HAN
0 I ♦♦♦
120 FOR X=1 TO 126: SET <X,35): NEXT
130 FOR Y=34 TO 14 STEP -1: FOR X=27 TO 99 STEP 36
140 SET (X,Y): NEXT X,Y
150 FOR Z=33 TO 15 STEP -3:F0R Y=Z+1 TO Z STEP -1
160 U=2*Z/3-8: FOR X=63-U TO 63+U: SET(X,Y) : NEXT X,Y,Z
170 FOR X=1 TO 3: PRINT0 ?62+Xi18, XJ: NEXT X
180 FOR Y=1 10 7: A(2,Y)=8-Y: NEXT Y
190 A(1,0)=0: A(2,0)=7: A(3,0>=0: N=0
200 PRINT0 896,"NAECHSTER ZUG?";
204 ' ZUG ANNEHHEN
210 GOSUB 1000: F=A: GOSUB 1000: T=A
220 IF A(F,0) > 0 AND A(F,A(F,0)) < A(T,A(T,0)> THEN 250
225 IF A(T,0)=0 THEN 250
230 PRINTe 919, "UNERLAUBTER ZUG - NOCH EINMAL, BITTE";
240 PRINTS 910, GOTO 210
250 PRINTe 910, CHR$(30);: PRINTe 910,
252 'EINE SCHEIBE BEUEGEN
255 Z=36-3*A(F,0): V=36*F-9: Ü*2*A(F,A(F,0))
260 FOR Y=Z TO Z+1: FOR X=V-U TO V+H
270 RESET (X,Y): NEXT X: SET <V,Y>: NEXT Y
280 A(T,0)=A(T,0) + 1: A(T,A<T f 0))=A<F,A(F,0))
290 A(F,A(F,0))=0: A<F,0)=A(F,0>-1: N=N+1
100
300 Z=36-3*A(T,0): V=36*T-9: U=2*A(T,A(T,0))
310 FÜR Y=Z+1 TO Z STEP -1: FOR X=V-U TO V+U
320 SET (X,Y): NEXT X,Y
330 IF A(1,0)07 AND A(3,0)07 THEN 210
334 ' SPIELENDE
340 PRINTS 896,"GRATULIERE - DU HAST" N "ZUEGE GEBRAUCHT
350 PRINT"HOECHTEST DU MEITERMACHEN (J=JA, N=NEIN)?";
360 A4=INKEY$s IF Ai<>"J" AND A«<>"N" THEN 360
365 PRINTS 960, CHR*(30);
370 IF A$ = "J" THEN PRINTS 896, CHR*(30)J: GOTO 200
380 PRINTS 960, “ NOCH EIN SPIEL (J/N)
390 A$=INKEY$: IF A$="J" THEN 110 ELSE IF A$<>"N" THEN 390
400 CLS: END
1000 'ZUG ANNEHNEN
1010 A»=INKEY$: IF A»=”" THEN 1000 ELSE A=VAL(A$)
1020 IF A<1 OR A>3 THEN 1010
1030 PRINT USING "HIT; A;: RETURN
UtlUE T U E R H E VON HANOI«»
1
£
:
HÖCHSTER ZUG''
101
Dateneingabe
mit DATA
Dateneingabe mit DATA
Nicht selten findet man BASIC-Programme, bei denen Daten nicht mit
Hilfe der INPUT-Anweisung vom Benutzer angefordert werden, sondern
als DATA-Zeilen eingegeben werden müssen und dann mit dem READ-
Befehl in den Programmablauf übernommen werden. Dieses etwas um¬
ständlichere und auf den ersten Blick wenig sinnvolle Verfahren hat je¬
doch ganz bestimmte Vorteile: Will man die Daten für spätere Verwen¬
dung speichern, kann man das tun, indem man einfach das Programm
noch einmal auf eine Cassette überspielt. Beim Wiedereinlesen zu einem
späteren Zeitpunkt sind dann die Daten auch gleich wieder da. So er¬
spart man sich sowohl Datenspeichern mit PRINT#-1, als auch das
Einlesen mit INPUT#-1, beides bekanntlich besonders bei größeren Da¬
tenmengen außerordentlich zeitraubende Prozeduren.
Zu empfehlen ist die Dateneingabe durch Schreiben neuer DATA-Zei¬
len außerdem, wenn Veränderungen am Programm absehbar sind und
man die eingegebenen Werte dabei nicht verlieren will. Auch kann der
Fall eintreten, daß bestimmte Werte bei einem CLEAR-Befehl nicht
verlorengehen sollen, aber trotzdem vor dem Start des Programmes
noch nicht festgelegt sein dürfen.
Dieses Programm soll als Beispiel dafür dienen, wie die Dateneingabe
mit DATA-Zeilen, die ja nicht während des eigentlichen Programm¬
ablaufs möglich ist, trotzdem für den BASIC-Unkundigen Computer¬
benutzer einigermaßen verständlich erfolgen kann. Selbstverständlich
sind auch andere Methoden möglich, die herauszufinden aber der Phan¬
tasie des Lesers überlassen bleiben soll.
Die Programmroutine ist geeignet zur Eingabe einer beliebigen Anzahl
von Daten zwischen 1 und 100. Festgelegt ist dies in Zeile 30, mit der
DIM-Anweisung, die sich natürlich den jeweiligen Bedürfnissen anpassen
läßt. Nur wenn noch keine DATA-Zeilen vorhanden sind, tritt die Da-
102
CD »-
— 3
<D IM
N U
- S
^ Q.
.t- E
E o
c O
£ o3
E -S
E «-
2? c
=3 *C
N Q,
O “
8 t
r- 0)
'</>
O C/>
CD
H O.
O c
O 0)
£E !®i
° 2
OC <
oc b
LU <
§1
So
4 -»
k.
o
CD
Q
0 )
X
Qi
X
CD
o"
k_
_Qi
• 4 —
o
c
Qi
C
Qi
4 -»
-C
o
’ k_
CD
C
*Qi
c
_Qi
Qi
N
"cd
Qi
X
k_
_OJ
E
N
X
C
CD
_C
X
X
c
Qi
CD
Q
k-
Qi
X
3
§
k_
k_
CO
z
>
4 -^
o
c
Qi
3
CD
E
>
Qi
X
CD
N
4 ^
_Qi
Qi
4 -»
Qi
E
q 3
"cd
C
’e
E
4 ->
CO
4 —»
4 -*
3
C
* 4 -»
CO
E
k-
Qi
4 ->
CD
CL
E
o
c
Qi
§
3
O
OC
CD
X
4 —^
CD
4 -»
CO
4 -*
Qi
Q
♦3
CO
o
II
o
Qi
k.
JD
3
CD
L_
Qi
CD
>
:<D
CD Qi
Z
e »
■*= E
E
cn JO
“cd q 5
C 2
E CL
(D oo
? «
< £
JZ
CD
o;
x
L.
CD
“O
<D
CD
u.
CD
3
O
OC
a uT
x _E
cd x:
LL CD
ll
0 )
^ E
O) .E
o ®
CD 3
JD N
(/)
Qi CD
-g Q
CD C
C 0)
1 ■?
Is
CD
Q
c
o
<
o
<
Q
<
LU
GC
t/>
CD
"ö
CD
-q t:
Ä -C
5? :3
.E LL
CD
C
CD
LT)
♦3 00
c _c
3 CD
<d Id
S °p
ÜS Q
>- <
W UJ
N ®
i- X
S -C
CD O
-C
oo C
CD CD
X X
„ C
O H-
00 ®
W -Q
* l-
• — (D
CD •-
N X
£
3
CD
L.
_Q>
X
CD
LL
C
CD
l_
0)
x
E
8
"O
c
3
X
c
!2 ^
C CD
C
E rt:
E ®
O X
c o
k- CO
cd !•
-Q Q
:3 <
c LU
S GC
-Q ^
CD ^
CD
E
E
CD £
^ Q
CD
O k -
L. CD
CL -O
oo —
g, -c
3 ) 03
N
X
Qi
"q>
X
C
’o)
0)
XI
T
to
X
C
CD
4-» Qü
£ J0
£ CD
fc Q
>
“q5 "5
x ~
ii
c O
53 m
x o,
u —
O cd
.O N
CD h^.
c *5
CD “3
4-< -U-
«3
Q 05
C ~
CD X
C ^
CD
X)
C _
2 8 *
c
c
4- C
00 Qi
— 4-»
_c ‘cd
ü -Q
- L.
C2 ^
Qi o.
LZ CD
O I
«I
o ^
O c
tn P
««
rS]!
0) O
5 S
0)
-C
CD
X
c
8
JGL)
0)
CD
in
oo
CD
10
O ®
-C
o
CD
c
0)
0)
-C
Qi
XI
i
Qi
N
3
X
</>
Qi
X
</)
o>
c
z a
LU <T
X X
Lü
CO CO
LU Z
C 0 LU
ü£ »~
O CO
3 « LU
h~
X
Lü
z
LU
CJ
z
<r
<c
CO
<r
LU
z
<1
A
CO
<r
t—
A
1
o
•»
CO
X
o
Z
A
x /
in
Lü
1-1
Z
<r
• *
Ü.
Lü
X
Lü
z
LU
LU
3
Z
•
•
n
1—4
LU
z
A
z
X
X
>—
X
LU
\
LU
Lü
CO
’Z.
X
r—
LU
L -4
■
X
LU
CC
CJ
:V
LU
z
LÜ
LH
<r
Ll!
u
X
A
h-
X
o
A
iZ
CO
«V
<T
<r
LU
A
LU
A
H
il
O
A
X
X
—1
<r
Z
\
<r
Lü
\
LÜ
z
H—
A
i-i
ec
X
z
Z
z
Lü
X
Lü
Lü
z
Lü
LU
h-
LH
X
h—
• •
Lu
X
j—
»—
Z
Lü
X
Z
LH
CO
Z
Lü
Z
<r
z
■ «
Z
s
•
Lü
CC
\
>-
LU
Lü
Lü
z
♦—
CD
CO
X
3
iZ
Z
Lü
<r
o
z
<r
-J
h-
LU
z
A
z
z
Lü
<r
Lü
-J
z
z
<r
h-
1
CD
HH
LH
CC
A
z
O
A
LU
X
Lü
A
LH
CO
<r
Lü
CO
M
Lü
UH
z
Z
LU
iXi
<r
A
X
Z
z
LU
o
X
<x
X
Cvl
Lü
<r
X
o
CO
X
X
<X
A
z
-j
X
o
• •
z
o
1 —
Z
LU
z
T—
CO
▼-
o
HH
<1
LU
z
1
LÜ
o
LU
ro
A
CJ
CO
X
Z
o
4 —
z
X
X
LU
Lü
H—
LU
(3
•
h-
X
X
-J
«—
o
in
o
o
1 —
l£
A
LH
<x
z
-J
•»
»—
ro
CD
o
H-
<c
X
lZ
X
z
A
<1
o
II
o
o
U-i
A
r
r
r
2
2
o
o
_J
cc:
4 —
V/
»-
:
:
r -4
H
Z
o
<r
ü
H*
h—
V—
H*
h-
>-
z
cc
<r
X
h-
H—
Z
z
z
Z
X
o
lL
ö
Z
Z
»-H
LH
LH
LH
Z CO
h-
z
A
z
Lü
CO
X
<1
ü:
M
LH
cz
z
CC
z
Z -J
X
o
z
LH
H-»
Lü
O
LL
iZ
LU
LU
CL
z
HH O
<r
z
Lü
z
u
Q
Lu
LU
CL
o
o
O
o
o
o
o o
o
o
o
o
o
O
in
O
o
O
o
CM
PO
in
-0
o
«—
o
in
■*-
ro
ro
<r
03
0 ^
T-
4 -
T-
4 -
T—
T—
Ul
tn
T-
103
Ballistik
Ballistik
Dieses Programm stellt ein einfaches, aber recht reizvolles Bildschirm¬
spiel dar. Von links nach rechts fliegen in unterschiedlicher Höhe Pfei¬
le über den Bildschirm. Der Spielende muß versuchen, sie mit einer
Kanone abzuschießen, die in der rechten unteren Ecke des Bildschirms
zu denken ist. Die Geschosse fliegen dabei auf echten ballistischen
Bahnen. Den Abschußwinkel kann man beim Abschuß durch Wahl der
dabei verwendeten Zifferntaste bestimmen. Den Ziffern 0 bis 9 ent¬
sprechen dabei die Winkel 0° (waagerecht) bis 90° (senkrecht).
Der Wert R in Zeile 3 ist die Anfangsgeschwindigkeit des Geschosses.
Er ist so gewählt, daß bei einem Abschußwinkel von 45° die waage¬
rechte und senkrechte Geschwindigkeitskomponenten jeweils 1 wären.
Natürlich kann man das Geschoss durch eine andere Wahl des R auch
beliebig schneller oder langsamer machen. Die Wirkung der Schwer¬
kraft auf das Geschoss spiegelt sich in dem Wert von I (Zeile 10) wieder.
Auch hier kann man nach Belieben Änderungen vornehmen. Aller¬
dings empfiehlt es sich nicht, das Geschoss wesentlich schneller zu ma¬
chen, als im Programm vorgesehen. Dann wird nämlich auf dem Bild¬
schirm häufiger eine Druckposition durch den Lichtpunkt übersprungen
und die Testroutine, die einen Treffer feststellen soll (Zeile 130),
funktioniert in manchen Fällen nicht mehr.
104
1 ON ERROR GOTO 1000
2 CLS: PRINT " ***** BALLISTIK ♦****": PRINT: P
RINT:PRINT: PRINT "ZUH SCHIESSEN UND FUER SCHUSSUINKEL ZIFFE
RN 0 - 9 DRUECKEN.": fOR Q=1 TO 1000: NEXT
3 PA=.1745329: R=SQR(2)
5 CLS: FOR P=1 TO 500: NEXT
10 X=125: Y=47: 1=.02: NZ=0: AM""
12 Z=64*(RND(15)-1)
15 FOR K=0 TO 60
40 IF AIO"" THEN 100
60 AMINKEYM IF A$="" FOR J=1 TO 10: NEXT J: GOTO 140
80 A=VAL(A$): H=R*SIN(PA*A): U=R*COS(PA+A)
100 RESET(X,Y): X=X-2*U: Y=Y-H+NZ*I: SET(X,Y)
120 NZ=N2+1
130 IF PEEK(15363+K+Z)<>32 AND PEEK(15363+K+ZK>128 THEN 600
140 PRINT 0 K+Z, " —
200 NEXT K: PRINT 0 61+Z, " "J: GOTO 12
600 FOR T=1 TO 5: PRINT 6 K+Z, "****";» FOR U*1 TO 50: CHD U
: PRINT 0 K+Z, “ "J: FOR U=1 TO 50: NEXT U,T
620 GOTO 5
1000 AM"": X=125: Y=47: NZ=0
1010 RESUME 140
105
Labyrinth
Labyrinth
Dies ist ein Spiel, das der Computer im wesentlichen mit sich selbst
spielt. Dem TRS*80-Freund bleibt die Rolle eines Zuschauers, was in
diesem Falle aber faszinierend genug ist. Das Programm läuft in zwei
Phasen ab: Als ersten Schritt zeichnet es einen Irrgarten auf den Bild¬
schirm und zwar in einem Raster von 4x4 Bildpunkten. Es handelt
sich um ein völlig zufälliges Labyrinth, das jedesmal neu und anders
gezeichnet wird. Links und rechts hat es eine Öffnung im begrenzenden
Rand, und vom Eingang zum Ausgang gibt es immer nur einen einzi¬
gen Weg. Aber es gibt ihn auch immer.
Während der Irrgarten entsteht, und auch nachdem er fertig ist, hat der
Bediener eine Eingriffsmöglichkeit. Durch Drücken entsprechender
Tasten kann wahlweise die zweite Programmphase eingeleitet oder das
Irrgarten-Zeichnen neu gestartet werden.
Die zweite Programmphase besteht darin, daß sich ein Lichtpunkt
selbständig den Weg von links nach rechts durch das Labyrinth sucht.
Dabei findet er stets den richtigen Weg und probiert jede Möglichkeit
garantiert nur einmal.
Die Tatsache, daß ein Irrgarten immer mit einem, aber nur einem
Durchgangsweg gezeichnet wird, ist das Resultat der Programmzeilen
1050 und 1230 bis 1260. Die erste sorgt dafür, daß eine neu zu zeich¬
nende Irrgarten-Mauer immer an einer bereits bestehenden beginnt,
die anderen bewirken, daß eine Mauer stets ohne weitere Berührung
mit einer anderen endet. Beim Zeichnen beginnen die neuen Mauern
also irgendwo an einer bestehenden und pflanzen sich dann zufällig
fort, bis es nicht mehr weitergeht, ohne wieder auf eine Mauer zu
stoßen. Dann wiederholt sich der Vorgang. Siebenmal wird in zufälli¬
ger Weise eine neue Richtung getestet, wenn es in einer bestimmten
106
nicht mehr weitergeht. Dann geht das Programm dazu über, einen An¬
satzpunkt für eine neue Mauer zu suchen. Dies spiegelt sich in Zeile
1100 wieder (IF U=7 ... ). Durch Ändern dieser Zahl kann man wahl¬
weise Labyrinthe mit durchschnittlich kürzeren oder längeren Mauern
erzielen.
Gleichzeitig ergibt sich ein Einfluß auf die Zeit, die das Irrgarten-Zeich¬
nen braucht: Die letzten Ansatzpunkte für Mauern, die noch bestehen¬
de Lücken füllen, findet der Computer meist erst nach längerem Su¬
chen, weil er dabei auch nach dem Zufallsprinzip vorgeht. Daher also:
Je kürzere Mauern, desto mehr Ansatzpunkte und damit auch desto
längere Labyrinth-Zeichenzeit. Andererseits kostet es natürlich auch
Zeit, den Computer unnötig lange nach nicht vorhandenen Möglich¬
keiten zur Verlängerung der Mauern suchen zu lassen, an denen er ge¬
rade baut.
Die Tatsache, daß der Computer oft recht lange braucht, um die letzten
Lücken im Irrgarten zu füllen, ist auch der Grund dafür, daß das Zeich¬
nen abgebrochen werden kann, um zur zweiten Programmphase über¬
zugehen. Die letzten, noch fehlenden kurzen Mauern verändern das
Labyrinth nicht mehr wesentlich und der Bediener soll nicht die Ge¬
duld verlieren.
Im zweiten Programmteil werden zunächst alle offenen und versperrten
Durchgänge auf zwei zweidimensionale Matrizen übertragen (S(30,11)
und W(31,10) — Zeilen 2020 und 2070). Dann wird der Punkt am
linken Eingang des Irrgartens auf die Reise geschickt. Der Lichtfleck
bewegt sich schrittweise und kontrolliert nach jedem Schritt, in welche
Richtungen er weitergehen kann. Erste Priorität genießt dabei eine
Bewegung nach rechts, in Richtung Ausgang. Ist dies nicht möglich,
oder kommt der Punkt gerade aus dieser Richtung, geht es nach oben
oder unten weiter (wenn beides möglich ist, ist die Auswahl hier zu¬
fällig). Notfalls bewegt sich der Punkt auch rückwärts, d. h. nach links.
107
Mit Hilfe der Matrix P(30,10), die gerade soviel Elemente hat, wie es
Positionen für den Punkt im Labyrinth gibt, wird festgelegt, wo der
Punkt auf seiner Suche nach dem Weg durch den Irrgarten jeweils
schon gewesen ist. Bei jedem Durchgang des Punktes durch eine Po¬
sition erhöht sich der Wert des zugehörigen Elements der Matrix auf
eine Kennzahl, die im Verlauf des Weges des Punktes immer weiter
ansteigt. Durch Überprüfung dieser Zahl wird erreicht, daß jede Sack¬
gasse nur einmal aufgesucht wird.
Hat der Lichtfleck den Ausgang erreicht, kann wieder ein neuer Durch¬
gang gewählt werden. Da eine Auswahl der Richtungen „nach oben"
und „nach unten" zufällig erfolgt, kann der zweite Weg durch den¬
selben Irrgarten durchaus etwas anders aussehen als der erste, wenn der
richtige Weg auch immer gleich bleibt. Oder es ist auch wieder der Neu¬
start des Programmes möglich. Auf jeden Fall ist der Computer zu¬
nächst wieder in der Zeichenphase, so daß man ihn auch etwaige Lük-
ken im Labyrinth füllen lassen kann.
Etwas durcheinanderbringen kann man die Suche des Lichtfleckes nach
dem Ausgang, wenn man den Punkt schon kurz nach Beginn des Irr¬
garten-Zeichnens losschickt. Auf den dann vorhandenen, großen freien
Flächen kann er sich zwar beliebig bewegen, kann aber zunächst nicht
dahin, wo er schon einmal war. Das Resultat sind verwirrte, kreisende
Bewegungen, ehe dann schließlich doch der Ausgang gefunden wird.
10 CLS: PRINT? 516, CHR$<23)"D AS LABYRINTH
20 BEFINT A-Z: RANDOM
30 FQR 1=0 TO 2000: NEXT
100 CLS: FOR X=0 TO 124: SET(X,0>: SET(X,44): NEXT
110 FOR Y = 1 TO 43: SET(0.Y): SET(124,Y): NEXT
120 FOR Y=21 TO 23: RESET(0,Y): RESET(124,Y): NEXT
900 PRINT? 960, "n = NOCHMAL ANFANGEN, U = WEITER IM PROGRAM
N M ;
950 ON ERROR GOTO 10000: DIM P(30,10), U(31,10), S<30,11), Z
(3)
1000 U=0: A$=INKEY$: IF A$="N" RUN ELSE IF A$="U" THEN 2000
1020 X=RND(32)+4-4: Y=RND(12)*4-4
108
1050 IF NOT POINT(X,Y) THEN 1020
1100 IF U=? THEN 1000 ELSE T=RNO<4)-1
1200 FOR Z=0 TO 4
1220 ON T GOTO 1240, 1250, 1260
1230 IF POINT(X+4,Y) U«U*1: GOTO 1100 ELSE U=0: 3ET(X+Z,Y):
GOTO 1300
1240 IF POINT(X-4,Y) U=U+1: GOTO 1100 ELSE U=0: SET(X-Z,Y):
GOTO 1300
1250 IF POINT(X,Y + 4) U=U+1: GOTO 1100 ELSE U=0: SETIX,Y+Z):
GOTO 1300
1260 IF POINT(X,Y-4) U=U+1: GOTO 1100 ELSE U=0: SET(X,Y-Z)
1300 NEXT
1400 IF T=0 X=X+4 ELSE IF T=1 X=X-4 ELSE IF T=2 Y=Y+4 ELSE I
F T = 3 Y=Y-4
1500 GOTO 1100
2000 PRINT? 960. "LOS GEHT 'S_”TAB(45);
2020 FOR A=0 TO 31: FOR B=0 TO 10: U(A,B)=P0INT(4♦= A,4♦ B+2):
NEXTB,A
2070 FOR A=0 TO 30: FOR B=0 TO 11s S(A,B)=POINT(4+A+2,4*B):
NEXTB,A
2500 X=2: Y=22: SET(X,Y): A=0: B=5: W(0,5)=-1: P(A,B)=1
3000 H=P(A,B): A=(X-2)/4: B=(Y-2)/4: FOR N=0 TO 3: Z(N)=255
3050 NEXT: IF A=30 AND B=5 K=0: GOTO 5000
3100 P(A,B)=H
3500 IF U(A+1,B) GOTO 3600
3550 Z(0)=P(A+1,B)
3600 IF S(A,B) GOTO 3700
3650 Z(1)=P(A,B-1)
3700 IF S(A,B+1) GOTO 3800
3750 Z(2)=P(A,B+1)
3800 IF U(A,B) GOTO 4000
3850 Z(3)=P(A-1,B)
4000 L=K:Q=255: FOR N=3 TO 0 STEP-1:IF Z(NX=Q THEN Q=Z(N):
K=N
4050 NEXT: IF K=3-L THEN P(A,B)=P(A,B)+1
4100 IF K=1 AND Z(1)=Z(2) K=RND(2)
5000 FOR N=0 TO 3: RESET(X,Y): ON K GOTO 5100, 5200, 5300
5050 X=X + 1 : GOTO 5500
5100 Y=Y-1: GOTO 5500
5200 Y=Y + 1: GOTO 5500
5300 X=X-1
5500 SET<X,Y): NEXT
109
"DURCHGEKGMMEN! ' ! "TASEK 45);: FOI
RESET(126,22): GOTO 90tf
6000 IF X = 126 F'RINTP 960 ,
N=0 TO 2000: NEXT: CLEAR:
7000 GOTO 3000
10000 RESUME 1000
110
Wissenschaftliche
Notation
Wissenschaftliche Notation
Dieses Programm macht mit der sogenannten „wissenschaftlichen"
oder exponentiellen Schreibweise von Zahlen bekannt, die auch der
Nichttechniker heutzutage oft vorgesetzt bekommt, etwa bei Taschen¬
rechnern. Auch der private Computerfreund sollte mit solchen Zahlen
umgehen können, da ja das BASIC (auch das vom TRS-80, natürlich)
mit ihnen operiert. Es kann also nicht schaden, wenn man mit den Wer¬
ten von der Form a • 10* 3 etwas anfangen kann, und dazu ist Übung in
der Potenzrechnung nötig. Mit diesem Programm kann man die Übung
erwerben: Es stellt dem Anwender immer neue, mit Hilfe von Zufalls¬
zahlen gebildete Rechenaufgaben, zählt die richtigen und falschen
Antworten und bildet daraus einen Leistungsdurchschnitt. Dabei wird
bei der Beurteilung der Grundzahl einigermaßen großzügig vorgegangen;
meist genügt es, sie im Kopf überschlägig zu schätzen, um —zusammen
mit dem korrekten Exponenten — zu einer richtigen Antwort zu kom¬
men. Für die Anwendung ist wichtig, daß man Grundzahl und Expo¬
nent ohne weitere Zeichen getrennt eingeben muß. Um den Rest küm¬
mert sich der Computer.
111
1 RE« "SCIENTIFIC NOTATION PRACTICE"
2 RE« (C) 1978 CLOAD MAGAZINE
3 CLS: CLEAR 60: Y=1:N=0:INPUT"BRAUCHST DU ERLAEUTERUNGEN (U
ENN JA. 'JA' EINGEBEN)";A*
4 IF A*<>"JA" THEN 20
5 CLS: PRINT-UM SEHR GROSSE ODER KLEINE ZAHLEN AUSZUPRUECKEN
, VERWENDET HAN
6 PRINT"DIE 'WISSENSCHAFTLICHE" ODER "EXPONENTIELLE SCHREIBW
EISE.
7 PRINT"DIE ZAHLEN SEHEN DANN FOLGENDERMASSEN AUS:
8 PRINT" P
? PRINT" A X 10
10 PRINT"ZWEI SO GESCHRIEBENE ZAHLEN MULTIPLIZIERT MAN IN HI
ESER WEISE:
11 PRINT"
(P + Q)
12 PRINT" A
10
13 PRINT"UND
14 PRINT"
<P - Q)
15 PRINT" A
10
16 PR INT"DAS
ONENTEN,
17 PRINT"
ONENTEN.
18 PRINT"DAS
DANN DRUECK
19 W=0:R=0
20 CLS:S=RND(2)
30 ON S G0SUB1000,1200
35 IF S=1 G0T055
40 S=RNP(2)
50 IF S=1 D=1 : G=0 : GOTO80
55 PRINTS 133, STRINGK50.45)
60 S=RND(2)
70 ON S GOSUB2000.2200
80 N=N/D
82 F=F-G
100 PRINT8516,"DEINE LOESUNG”;
120 INPUTX
130 PRINT0538," X 10"
P Q
X 10 X B X 10 = (A X B) X
SO DIVIDIERT MAN SIE:
P Q
x 10 / B X 10 = <ft / B) X
HEISST, BEIM MULTIPLIZIEREN ADDIERT MAN DIE EXP
BEIM DIVIDIEREN SUBTRAHIERT MAN DIE EXP
WOLLEN WIR JETZT UEBEN.": INPUT"BIST DU BEREIT?
'ENTER'-";At
140 PRINT0416,"";
150 INPUTK
155 IFN-0 K=F
160 PRINT8635,"";
200 IF (ABS<X-N)'.126)♦(F~K) GOTO300
210 U=U+1:PRIMT@ 641,"PAS IST LEIDER FALSCH.";
220 GOTO400
300 R=R+1rPRINTP 641,"PAS IST RICHTIG 1 !
400 PR IN TP 769,"DIE GENAUE LOESUNG LAUTET:";
410 PRINTP865.F;
420 PRINTP911,N;" X 10";
430 IF F>0 F=F-1:N=N*10:GOTO430
440 IF F<0 F=F + 1:N=N/10:GCTO440
450 PRINTP940,"OPER "N;
500 PRINTP960,"";
505 PR INTU"FALSCH "R"RICHTIG = "?
515 PRINT USING "###2" ;R* 1 00/(U+R );: INPUT" WEITER {•'ENTER
•' prueci!EN) h :ai
520 GOTO20
1000 A-RND(20)-5
1010 E=RND(20)-10
1020 L=80:GOSUB5000
1040 N~A:F=E:RETURN
1200 A r RND(10)-2
1210 E=RND<10)—5
1220 L=70:GOSUB5000
1240 PRINT!? L+23,"X";
1250 N=A:F=E
1270 A-RND(12)-4
1280 E=RND(10) -5
1290 L=98:GOSUB5000
1300 N=N+A:F-F+E:RETURN
2000 A=RND(12)-4
2005 IFA=0GOTO2000
2010 E=RND(14)-7
2020 L=272:GOSUB5000
2040 D=A:G=E:RETUHN
2200 A=RND(10 )-2
2205 IFA=0GGTO2200
2210 E=RNIK 12)-6
2220 L=262:GOSUB5000
2240 PRINT!? L+23."X";
2250 P=A:G=E
113
2270 A=RND<3>
2232 E = PND‘;-4
2290 L = 290:GOSU»50i30
2303 D-D+A :G=G+E:RETURN
5003 PRINT? L.’T'JA;" X 10
5033 PRINT? 1-52,EI
5010 RETURN
114
Biorhythmen
Biorhythmen
Wer sich für Biorhythmen interessiert, die es ermöglichen sollen, den
körperlichen, geistigen und seelischen Zustand eines Menschen für je¬
den Tag seines Lebens festzustellen, für den wird dieses Programm si¬
cher sehr nützlich sein. An einzugebenden Daten verlangt es zuerst
Geburtsdatum der Person, dessen Biorhythmen man wünscht.
Dann folgt die Frage nach dem Monat, für den die drei Rhythmus-
Kurven errechnet werden sollen. Unter geschickter Ausnutzung der
graphischen Fähigkeiten des TRS-80 werden dann drei sinus-ähnliche
Kurven auf den Bildschirm gemalt - für den angegebenen Berechnungs¬
monat.
Anschließend kann man entweder Geburtsdatum oder Berechnungsmo¬
nat für einen neuen Durchlauf ändern (oder beides), worauf der Compu¬
ter drei neue Kurven mit den geänderten Daten zeichnet. Kurze Erläu¬
terungen finden sich als Bemerkungen am Anfang des Programmes, so
daß man sie sich durch Auflisten (LIST) auf den Bildschirm holen kann.
Wem diese Lösung nicht gefällt, kann selbstverständlich auch etwas
anderes einbauen, zum Beispiel ein Ausdrucken des Textes vor dem
eigentlichen Programmstart.
Auf falsche Eingaben reagiert das Programm mit der Antwort „unzu¬
lässiges Datum!", und dabei werden alle Schaltjahr-Möglichkeiten ge¬
nau beachtet. Nur einen Fehler verkraftet es nicht, nämlich solche, bei
nachträglichen Änderungen des Geburtstages (also, wenn bereits ein-
oder mehrmals die Kurven gezeichnet wurden), die zur Folge haben,
daß das Geburtsdatum später liegt als der Berechnungsmonat. Dann
kommt der Computer aus der Programmroutine zur Zurückweisung
falscher Eingaben nicht mehr heraus, und man muß neu beginnen.
Vielleicht wäre es für den Leser eine reizvolle Aufgabe, das Programm
so zu verändern, daß auch dieser Fehler richtig berücksichtigt wird.
Auf bemerkenswerte Weise wird übrigens erreicht, daß links und rechts
neben der Graphik mit den Biorhythmen-Kurven senkrechte Schrift¬
züge stehen. Dafür werden am Anfang des Programms zwei String-Va¬
riable definiert, die nichts weiter enthalten als die Anweisungen "eine
Stelle rückwärts" und "neue Zeile und eine Stelle rückwärts". Die be¬
treffenden Wörter werden dann so auf den Bildschirm gebracht, daß
zwischen jedem Buchstaben eine solche Anweisung steht. Auf der
rechten Seite muß man dabei "eine Stelle rückwärts" verwenden,
weil das "neue Zeile" ja am Ende jeder Zeile auf dem Bildschirm be¬
reits automatisch erfolgt.
3 ' * BIQRHYTHJ1EN *
4 ' 2. KURVE IST EMOTIONAL, 3. KURVE INTELLEKTUELL
5 ' ZUM NEUSTART DES PROGRAMMS 1 EINSEBEN, ZUR AENDERUNG DES
6 ' BERECHNUNGSMONATS 2 UND ZUR AENDERUNG DES
7 ' GEBURTSDATUMS 3 EINGEBEN.
3 X = 1
9 At=CHR$(24): Bt=CHR*(26)+CHR*(24)
10 CLS
20 PRINT0279,"BIORHYTHMEN
24 PRINT6464,"DEIN GEBURTSTAG:
28 PRINTÖ527,"
30 INPUT"TAG, MONAT, JAMR";K,J,L
70 E=J:F=K:G=L
90 Z=t
100 6OSUB220
103 IFZ>1503THEN10
105 GOSUB350
110 D=A
111 QNXÜ0T0112,112,120,112
112 CLS
113 PRINT6278,"BIORMYTHMEN";
114 PRINT0396,"
115 PRINT"ZAHL DES MONATS UND DES JAHRES FUER";
116 PRINT0459," ";
117 PRINT"DIE GEUUENSCHTEN BIORHYTHMEN EINGEHEN";
113 PRINT0530,"
119 INPUT"MONAT, JAHR ";M,0
120 E=M:F=1:G=0
140 Z = 1
150 GOSUB220
116
153 IFZ>1500THEN114
155 6OSUB350
1ö0 D=A-U
165 IFü>-KTHEN1?0
166 GQSUB240
167 GOTQ70
170 GOTO1000
220 IF(G<«)*(G>4000)THEn240
225 IF(E<1)+(E>12)THEN240
230 ONEGCTO260,230,260,340,260,3-40,260,260,340,260,340,260
240 CLS
244 PRINT0470,"UNZULAESSIGES DATUrt!
246 FCRZ=1TOI500:NEXT
250 RETURN
260 IFF>31THEN240
270 RETURN
280 IFG/400=INT(ü/400)THEM320
290 1FG/100=1NT(G/l00)THEN310
300 IFG/4=INT(G/4)THEN320
310 IFF>28THEN240ELGE330
320 IFF729THEN240
330 RETURN
340 IFF>30THEN240
350 DATA2,31,59,90,120,151,181,212,243,273,304,334
355 IlATA-1
360 RE3T0RE
365 FÜRZ=1TOE
370 REAHA
375 NEXTZ
376 6OSUB1500
377 Z=1
380 A=A+G*365+INT(G/4)+F+1 INT(G/100)+INT(G/400 >
390 IFINT(G/4)=G/4THEN410
400 GOT0452
410 IFG/400=INT(6/400)THEN430
420 IF6/100=INT(G/100)THEN440
•430 IFE/2THEN450
440 A-A-1
150 RETURN
1000 P=D-lNT(Ü/23)*23
1010 I=B-INT(B/28)*28
1020 E=B-INT(0/33)*33
1030 CLS
ü' J u U 0 b 0 B ! i J 0 Ü
1313 i=23
1050 FÜRX=oJ 0122STEP4
1063 SET<X,Y-2)
1070 MEXTX
*075 IFEK0THEM1115
1030 IFF=0THEN1123
1090 FORA=1TOP
113Ö REAP2
*110 NEXTA
1115 Q-»
11 20 FüRX-'JT0123ST£f4
1122 IFQ7=3THEW1133
1121 Ö=Ü+1
1126 MEXTX
1130 REAH2
Miß l-"ÜRi=ZlC43
1150 SETiX.Y-2)
1160 r:EXT 1
1170 MEXTX
1180 iiüSUißl 530
1185 IFD- 0 THENI225
119« 1FI=0THEN1233
1200 F0RA=1TOI
1210 REAl'Z
1220 NEXTA
1225 Ö-D
1230 FÜRX=4TUl24STEP4
1232 IFQ>=»THEH;243
1234 Q-Q+1
1236 MEXTX
1240 READ2
1250 FORT =3)044
1255 SET<X.Y-vJ)
1260 HEXTr
1270 RESETiX.Z 2;
1283 HEXT X
1293 GOSUB1500
1295 IFIK0THEN1333
1300 IFE=0TKEN1340
1310 FOfiA-ITOE
1320 REfiDZ
1330 NEXTA
1335 fl-b
1340 FORX=5T0125STEP4
1342 IF0.: =0THEN1 JÜ0
1344 Q=GH1
1346 NEX7X
1353 READZ
!373 SET< X,2—2 >
I393 NEXTX
1403 00101700
1533 REhI'2
1513 IFZ--1 THENRETUFiH
1523 GOTO 1530
1703 IfiPUTX
1710 OriXGüTü;3,1723,1 0. 10
1720 CLS:GGT0?3
180# IF(M-1) + (<1=3) + (il =5)♦ (h-7) + (11=3) + (f1= 10) + (rt -12)THEW2000
1813 IFtt=2THE«1825
1820 PRINT0897," 1 3 5 ? 9 11 13 IS 17 15 21
23";
1821 PK'INI " 25 27 2 V I";:GOT02020
1825 If0/400=INT(G/430)IHEMI850
! 230 IFö/ ! Ö0--INT ( 0; 1 00) THEill 340
S 8 ob
1FC/4 r iMT (Ü,
4j THEN1850
1840
PRIN7BB97,"
1 3
er 1
9 11
13 15 1
7 19 21
23“ ;
184]
PRINT" 25
27 1
7 1» •
^ f
1842
PR INI 896 i, "
2 4
6
8 10
12 14 16
13 210 22
l» ■
•
CO
(.•J
PRINI" 24
■1 2 0 L
*. u *. w
1 «« «
- *
1841
GÖTQ2340
1850
PRINT 8897."
1 3
c 7
9 11
13 iS 1
7 19 21
23";
1851
PRINT" 25
“* -■) p
'• ii •
*• 9
1852
14 •
PRIN18961,"
2 4
6
8 10
! 2 14 16
18 20 22
«
1853
PRINT" 24
26 28
i
(854
6ÜTO2040
.2000
PRINTÖ397,'
1 3
j 7
? 11
13 13 1
7 IV 21
23";
2010
PRINT" 25
.7 2i
7 i H •
\J • «
2020
li •
PRINTtfVil,"
2 4
u
o i a
U t U
12 14 16
18 20 22
*
o ,3 7 x
uv
PRINT" 2n
26 28
3ß";
119
Ci
2040 Y = 43
2050 F0RX=8T0121 STEF‘8
2055 SET(X,Y-1)
2060 SET(X,Y):SET<X,Y +1 )
2070 NEXTX
2075 PRINT863, "*"A$”B"AI"I"AI"Q"A$"R ,, A$"H"A$ ,, Y"A$"T‘ , A$"H"A$"
il" A $ " E " AI" N " A $ 11 * " J
2100 QNNG0TQ2102,2112,2122,2132,2142,2152
2101 0Nrt-6G0T02162,2172,2182,2192,2202,2210
2102 PRINT664,"J"BI“A”ßl"N"B$"U”BI"A"B$"R";:GGTQ2250
2112 PRIN T 6 6 4,"F"BI"E"BI"B"BI"R"BI"U"B $“A”BI"R " J :GOTQ2250
2122 PRINT6192,"M"BI"A"B$"E“B$"R"B$"Z";:GOTO22S0
2132 PRINT8192, "A"BI , 'P"BI"R"B$"r , BI"L";:GGTQ2250
2142 PRINT6256,"M“BI“A"B$"I";:GOT02250
2152 PRINT8192,"J"Bi"U"B$"N"BI"I"J:GüT02253
2162 PRINT6192,"J"BI"U"BI"L"BI"I";:GOTO2250
2172 PRINT8128, , ‘A"BI‘ , U"B$"G"BI"U"B$"S"B$"T"; :GÜTÜ2250
2182 PRINT064,"S“BI"E"BI"P‘ , BI"T"ß$"E“BI”M"B$"B"BI"E"B$"R";:G
ÜTO2250
2192 PRINT 86 4,"0”BI"K"B $"T"B $"0"B $"B"Bi"E"BI"R";:G 0 T 02250
2202 PRINT864,"N"B$' , 0"Bi ,, V"B$“E"B$"n"BI"B"B$"E"B»"R"; :GOT022
50
2210 P RIN T ß 6 4," D" BI" E" BI" Z" B $" E" B $" M" B $" B" B S ” £" 6 $" R";
2250 V=INT(O/10):U=INT(V/10):R=INT(U/10)
2255 U=O-V*10:T=V-U*10:S=U-R : » : 10
2260 U=R:V=640:GCSUB2600
2270 U=S:V=704:GOSUB2600
2280 U=T:V=768:GOSUB2600
2290 U=U:V=832:GOSUB2600
2300 PRINT8895,“
2310 RESET(0,44)
2500 RETURN
2600 QNUHGOTQ2605,2615,2625,2635,2645,2655,2665,2675,2685,2
690
2605 PRINT6V,"0";:RETURN
2615 PRINT6V,"1:RETURN
2625 PRINT?'. 1 ,"2"; :RETURN
2635 PRINTSV,"3“;:RETURN
2645 PRINT0V,"4";:RETURN
2655 PRINT8V,“5";:RETURN
2665 PRINT6V,“6";:RETURN
2675 PRINT8V,"7";:RETURN
2665 PRINT8V,"8";:RETURN
120
2690 PRIHTBV,"9 M ;:RETURN
9000 DATA 23,17,13,9,6,4,3,5,7,11,15,21,25,31,35,39,41,43,42
,40,37,33,29
9001 DATA 23,17,13,9,6,4,3,5,7,1i,15,21,25,31,35,39,41,43,42
.40,37,33,29
9002 DATA 23,17,13,9,6,4,3,5,7,11,15,21,25,31,35,39,41,43,42
,40,37,33,29
9003 DATA -1
9010 DATA 23,19,15,11,7,5,4,3,4,5,7,11,15,19,23,27,31,35,39,
41,42,43,42
9011 DATA 41,39,35,31,27,23,19,15,11,7,5,4,3,4,5,7,11,15,19,
23,27,31,35
9012 DATA 39,41,42,43,42,41,39,35,31,27,23,19,15,11,7,5,4,3,
4,5,7,11,15
9013 DATA -1
9020 DATA 23,19,15,12,9,7,5,4,3,3,4,6,8,11,14,17,21,25,28,32
,35,38,40,42
9021 DATA 43,43,42,41,39,37,34,30,27,23,19,15,12,9,7,5,4,3,3
.4,6,8,11,14
9022 DATA 17,21,25,28,32,35,38,40,42,43,43,42,41,39,37,34,30
Ol
I fc«
9023 DATA -1
121
Raumjäger
Raumjäger
Dies ist ein weiteres Programm, das ein Bildschirmspiel erzeugt, bei
dem der Computerfreund sich vorstellen soll, ein Kampfraumschiff
zu steuern und feindliche Raumschiffe abzuschießen. Im Gegensatz
zu dem Programm Stingray ist hier allerdings noch zusätzlich das ge¬
zielte Abfeuern der Strahlenwaffe möglich. Abgesehen davon ist dieses
Programm dem Stingray sehr ähnlich.
1 COPYRIGHT 1978 THE B07T0.1 SHELF INC. / 1979 SILOS
2 -ALL RIGHTS RESERVLD DO NOT COPY
3 'P.O. BOX 49104 ATLANTA 6A 3035?
4 CLS:GOSUB500
10 CN ERROR GOTO 2000
20 TX=RNDl180)+9:TY -RHÜ(30)+3
25 CLS:Q1=RND(I28):NI=0
30 PRINT60,NR"FEINDLICHE RAUMSCHIFFE ZERSTÜEKT, ’W’ENTKUNJill
H
48 IFNU+NR=>20GQTQ1500
103 FR INT 6530, "<««"; :PRINT0539,"+"; SPRINT 0544," ».»>":
185 IFAtO“ “TKEN27S
110 PRIMT0980,:PRIHriJV5 a .J
120 PRINT091*PRINTS929, N - B ;
130 PRINT8B54,; :F‘RINT3äo4,"=";
140 PRINT8791,PR INT079?
150 PRINT072S,PRINT8734
U0 PRINT8&65,"=";SPRINT6669,"=“;
170 PRINT0602,” = ";SPRINT06(34,;
1S0 PRINT6539,"="
122
190 PRINTe?S0,“ ";:PRINT0??4,"
200 PRINT0917," ”;:PRINT6929, ’’
210 PRINT8854," M ;:PRINT0864,"
220 PRINT8791," "; :F'RINT0799."
225 PRINT8728," ";:PRINTß734," "J
230 FRINT0667," ";:PRINT06i5," ";:PRINT8669,”
24« PRINT8503," * ;SPRINT8602, " ";:PRINTe634,*’
250 F'RINT@539,“
255 IF TX>51 AND TX<59 AND TY>22 AND TY<27 TUEN 403
275 PRINT0530," ";:PRINTI?544,"
300 N1=N1+1:IFNI=>Q1THENNU=NUM:GOTO2!0
305 X=0:Y-0
307 A$=INKEYt
310 IF Af-"J" X=-RND(15)
315 IF A$“"K" X=RND(15)
320 IF AI="U" Y--RNIU5)
325 IF A$ ="i M ." Y = RMD<5)
330 IF A$="Z" GOSUB500:GOTO20
332 SX=RNB(7)-4:5Y“RND(5)-3
335 RESET < TX,TY):RESET(TX-1,TY+1):RESET(TX+1,TY+1)
340 TX=TX+SX+X:TY=TY+SY+Y
345 SET(TX,TY):3ET(TX-1,TY+1)sSET(TX+1,TY+1)
360 IF A$=" "THEN110ELSE100
400 FORXX'1 TOI 0:PRINT0538,"*t : *":GOSUB1005:PRINT0533,” ":O0
SUB1005:NEXTXX:NR=NR+1
105 PRINT0473,"* * *":PRINT0537,"t * *":PRINT86«1, H * * *
410 PRINT8408,"* * *":PRINT0534,"t * *":PRINTl»664,"*
* *
415 PRINT0341 ,"t * *"sPRINT0530,"* t ■»-
:PRINT:PRINT0725,"* * *
420 FORX=0TO500:NEXT:GOTO20
500 PRINT020,"RAUMJAEGER”
510 F'RINT"DU SITZT AN STEUER EINES RAUMJAEGERS UND HAST DIE
AUFGABE,
520 PRINT"FEINDLICHE RAUMSCHIFFE ABZUSCHIESSEW. SIE FUEHREN
530 PRINT"AUSUEICHMANOEVER AUS UND VERSUCHEN, IHREN RAKETENH
□TOR
540 PRINT"ZU ZUENDEN UND ZU ENTKOMMEN.
560 PRINT:PRINT"DEIN JAEGER LAESST SICH DIE FOLGT STEUERN:
570 PRINT” J - NACH LINKS K - NACH RECHTS
580 PRINT" U - AUFUAERTS M - ABUAERTS
590 PRINT" LEERTASTE: STRAHLENKANÜNE ABFEUERN"
603 PRINT0896,"ZUM SPIELBEGINN IRGENDEINE TASTE BRUECKEN
604 PRINT" ('Z- RUFT DIE ERLAEUTERUNGEN DIEDER AUF)";
606 ED$=INKEY$:IF EH$=""GOTC606
610 CLS:RETURN
1005 F0RX=1TQ25:NEXTX:RETURN
1020 NU=ND+1:GOTO20
1500 IFNR<10PRINT:PRINT"DU MUSST NOCH UEBEN - "NU"SCHIFFE SI
NH ENTKOMMEN!":G0T01520
1505 IFNR>=10 AND NR<15PRINT:PRINT"NICHT SCHLECHT. ABER"NÜ"S
CHIFFE SIND ENTKOMMENG0T01520
1510 IFNR>=1 SPRINT: PR INT "GUTER SCHUETZE! DU HAST"NR"ERUISCHT
1520 FORX'1TO1020:NEXTX:ED$=INKEYI:RUN
2000 RESUME 20
124
Buchstaben
hochschießen
Buchstaben hochschießen
Bei diesem Programm kann man eine beliebige Wortfolge (bis 150
Wörter bzw. 250 Buchstaben oder andere Zeichen) eingeben. Die durch
Leerstellen getrennten Zeichengruppen (im allgemeinen Wörter) wer¬
den dann einzeln am unteren Rand des Bildschirms in Breitschrift ab¬
gebildet und die einzelnen Zeichen der Reihe nach aufwärts über den
Bildschirm „geschossen". Eigentlich ist das Programm damit nicht be¬
sonders interessant — es eignet sich vielleicht für Werbezwecke oder
ähnliches. Immerhin kann man daran aber einiges über die Verwendung
der String-Funktion MID$ (A$,x,x) lernen. Zunächst muß die gesamte
Wortfolge, die eingegeben wurde, in einzelne Wörter zerlegt werden.
Das geschieht in den Zeilen 14170, 14200 und 14205. NI ist am Ende
dieses Vorgangs die Zahl der durch Leerstellen getrennten Zeichengrup¬
pen. Weiterhin muß jedes einzelne Wort wiederum in seine Buchstaben
bzw. Zeichen zerlegt werden, damit diese einzeln „hochgeschossen"
werden können. Das leistet die Zeile 14310 innerhalb der Schleife FOR
W4=1 TO W1 ... NEXT W4. In beiden Fällen wird die genannte String-
Funktion verwendet.
125
14000 'COPYRIGHT 1973 THE BOTTOH SHELF INC.
14010 'ALL RIGHTS RESERVED DO NOT COPY
1 4020 ' p. o. BOX 49104 ATLANTA, GA. 20359
14025 CLS
1 4030 PR INT"DIESES PROGRAMM NIMMT EINE WORTFOLGE AN, BILDET
DIE EINZELNEN":PRINT"UOERTER AB UND SCHIESST DIE BUCHSTABEN
NACHEINANDER NACK OBEN.
14080 CLEAR1500:DIMB$(150)
14150 PRINT"DEINE NACHRICHT IBIS 150 ÜOERTER BZU. 250 STELLE
N):
14160 INPUTAisCLS
14165 NI=1
14170 F0RX = 1 TOLEN(AI) :A1 $=MIDt (A$ ,X, 1): A2$=i'1ID$( AT,X+1,1)
14200 GOSUB14800
14205 IFA2$ = " "THENN 1=N1+1
14210 NEXTX
14300 FORX=1TONI
1 4309 UI-LEN(BKX))
14310 F0RU4-1T0U1 sCLSsF0RY=15T01STEP-1 :U2f -HIOS(BKX) ,U4,1)
14319 IFY<14THENPRINT0(Y*64) + 80+(U4+2;,CHRf 123)”
14320 FRINT0980,CHRf (23)B$(X) J
14321 PRINT(?( Y+64) + (U4*2) + 18,CHR$ (23) ;U2$;
14325 NEXTY:NEXTU4
14330 NEXTX
14340 CLS:FORX=1TO300:NEXTX:GOTO 14300
14300 BS<N1)=B$(N1)+A1$
14810 RETURN
126
Pferderennen
Pferderennen
Dieses Programm ist ein Wettspiel, an dem bis zu 10 Personen teilneh¬
men können. Es finden 10 Rennen statt, zu denen jeweils fünf Pferde
antreten. Vor jedem Rennen kann jeder Teilnehmer auf eines der Pferde
Geld setzen und erhält, falls sein Pferd gewinnt, die fünffache Summe
gutgeschrieben. Andernfalls ist das Geld verloren. Jeder Spieler gibt zu
Anfang des Spiels an, wieviel Geld er zum Verwetten hat, und der Com¬
puter rechnet gewonnene und verlorene Summen von diesem Betrag
aus zu bzw. ab. Er überprüft auch, ob man mehr setzen will, als man
hat oder man sein ganzes Geld verwettet hat. In diesem Fall scheidet
der betreffende Spieler aus. Nach zehn Rennen, oder wenn alle Spieler
ausgeschieden sind, ist das Spiel zu Ende. Gegen versehentlichesSetzen
auf ein nicht vorhandenes Pferd (z. B. ein Pferd Nr. 7) schützt das
Programm nicht: Es soll keiner daran gehindert werden, Dummheiten
zu begehen!
127
10000 -'COPYRIGHT 1978 THE BOTTOM SHEI.F INC. / 197? STUEBS
10010 'ALL RIGHTS RESERVEB DO NOT COF’Y
10020 'F'.O. BOX 49104 ATLANTA GA 3035?
10025 CLEAR750: DIM H( 1 0),F'L$ (1 0),MN< 1 0) f HR (1 0) ,BT(10) ,F'0<10)
10323 Z$=STRING$(50,45)
10030 CLS:F'RINT?20, "PFERDERENNEN
10040 PRINT;PRINT" UILLKQHHEN AUF BEH RENNPLATZ. SIE UERDE
N JETZT AH SPORT
10050 PRINT"DER KOENIGE TEILNEHNEN. DIE PFERDE STEHEN BEREI
T.
10060 PRINTsPRINT" AUF ALLE PFERDE STEHEN DIE CHANCEN 5 ZU
1.
10070 INPUT"ZUN FORTFAHREN 'ENTER' BRUECKEN - "JAL
10080 CLS:PRINT0512,:INF’UT "UIEVIELE SPIELER";PL
10085 IFPL< 10RPL>1 0PRINT:F'RINT"NUR 1 BIS 10 SPIELER, BITTE!"
:FQRX=1TO750:NEXTX:GOTO10080
10090 F0RX=1 TOF'L
10100 CLS:PRINT0512,"";SPRINT"NAHE DES SPIELERS NR. "X;:INPUT
PL«(X)
10110 CLS:PRINT0512,PL$(X)", UIEVIEL GELD HAST DU ZUN UETTEN
: INPUTHN(X): IFNN(XX=0THEN10110
10120 NEXTX
10130 F0RN3-= 1 TOI0
10135 FORX=1 TOF'L: IFHN(X)=0THEN10160
10140 CLS:PRINTP512,PL$(X)", UIEVIEL HOECHTEST DU IM RENNEN
NP.." N3 "SETZEN"; 5 INPUT BT (X)
10145 IFBT(XX0THEN10140ELSEIFBT( X X0THEN10160
10148 IFBT(X)>HN(XIPRINT"SOVIEL HAST HU DOCH GAR NICHTPsFOR
Z=1TO500:NEXTZ:GOTO10140
10150 CLS:PRINT0512,PL$(XI", AUF UELCHES PFERD HOECHTEST DU
SETZEN (NR. 1 BIS 5)";:INPUTHR(X)
10160 NEXTX
10170 CLS
10900 F'RINT"RENNEN NR."N3
10910 PRINT025,"R E N N P L A T Z
10920 FORX=0TO10:PRINT?(X*641+124,"!"sNEXT
10930 FORX=0TO10STEP2SPRINT?(X*641+74,Z$;sNEXT
10950 N5=0
11000 A2$="=="+CHR$(156)+CHRI ( 156)+CHR4 (140)+CHR$(1 56)+CHR$ (
174)+CHR«(131 )
11010 N5=N5+1:IFN5>5THENUN=RND(5)
11015 IFN5\=5THENUN=UN+1
11020 IFH(UN)<10THENH(UN) = 10sGOTO1102?EL3EH(UN) : *H(UN)+RND(3)
128
1122? D2=(UN*128)+(H(UN))
11230 PRINT@UN*128 f STRINGI<H(UN)">; :PRINTM2-4,UN;:FRINT0
D2,A2t;
11040 IFH(UN)=>55THEN11502
11050 G0T011010
11055 IFH(1)-10FQRY=1TO300:NEXTY
11062 G0T011010
11500 PRINT8896,"PFERD NR."UN"GEUINNT .
11510 PRINVPIE GEUINNGUOTE BE TR AEG! 5 ZU 1.":
11520 FORX=1TO600 :NEXTX
11530 CLS
1 1 540 FORX=1TOPLsIFP<X) = 1THEM11534
11550 IFHR1X)=UNTHENMN(X)-MN(X)♦(5 *BT(X))
1 1 560 IFHR (X) OUNTHENMN (X)=MN(X)-B7(X)
11570 IFHR(X) =UN PRINTPL$(X)" HAT"5'*BT (X)"DM GEWONNEN UND BE
SITZT JETZT"t1N(X)"Dt1.
11580 IFHR(X)OUN F'RINTPLKX)" HAT"BT(X)"DM VERLOREN UND BES
ITZT JETZT"MN(X)"DM.
11584 NEXTX
1 1585 PRINT:INPUT"ZUM UEITER3PIELEN 'ENTER' DRUECKEN - "JOP:
CLS
11600 F0RX=1TOPL
11605 PI=P1+1:IFP1<=P2THEN11620
11610 IFP(X) =0ANDMN(X) =0PRINTF'L$ (X)" IST PLEITE UND SCHEIDET
FUER DIESEN RENNTAG AUS.":F'(X) = 1 :P0=1 :PX=PX + 1
11620 NEXTX
1 1 630 IFP0=1FQRX=1TOI 000:NEXTX:P0=0
11970 UN=0:N5-0
11980 F0RX=1T05:H(X)=0:NEXTX
1 1985 IFF'X=PLRUN
11990 NEXTN3
12000 RUN
129
Reaktionstest
Reaktionstest
Dieses kleine Programm ist ganz reizvoll als Zeitvertreib unter Freun¬
den, auf Parties usw. Vielleicht läßt sich auch der eine oder andere da¬
von überzeugen, daß er zuviel getrunken hat und besser nicht den ei¬
genen Wagen für die Heimfahrt nimmt, wenn er bei dem Test versagt.
Interessant wird es auch dadurch, daß die Zeit, während das „Ach¬
tung“, „Fertig“ und „Los" vor dem Loslaufen des Pfeils erscheint, je¬
weils zufällig gewählt wird (Zeile 17200). Das PRINT@512," “; in
Zeile 17060 soll nur die Schrift der INPUT-Anweisung an die ge¬
wünschte Stelle des Bildschirms bringen. Dabei sind die beiden Anfüh¬
rungszeichen eigentlich überflüssig und können weggelassen werden.
Hierzu einige grundsätzliche Bemerkungen: Wenn man sich die Pro¬
gramme ansieht, die für den TRS-80 erhältlich sind und aus den ver¬
schiedensten Quellen stammen können, wird man häufig feststellen, daß
einiges Überflüssiges vorhanden ist oder gewisse Aufgaben umständli¬
cher gelöst sind als insbesondere im Radio Shack Level II BASIC mög¬
lich. Dies kann (außer schlichten Fehlern) verschiedene Gründe haben.
Zum einen gibt es Programme, die mit geringfügigen Änderungen so¬
wohl für Level I als auch für Level II BASIC funktionieren sollen. Na¬
türlich müssen sie sich dann nach den beschränkteren Möglichkeiten
des Level I richten. Weiterhin sind manche — vor allem einfache — Pro¬
gramme so geschrieben, daß sie auf (fast) jedem Microcomputer laufen,
enthalten also z. B. keine Ausdrücke, die für den TRS-80 charakteri¬
stisch sind. Schließlich wurde auch das Radio Shack Level II BASIC
weiter entwickelt, so daß manche Dinge heute einfacher zu machen
sind als früher.
130
Auch in diesem Buch ist nicht jedes Programm bis zum letzten I-Tüpfelchen auf dem neuesten Stand der Ent¬
wicklung. Doch steht es dem Leser ja frei, für seinen persönlichen Gebrauch nach Belieben Änderungen vor¬
zunehmen, wenn er sich daran stört. Außerdem wird jeweils auch deutlich, welche unterschiedlichen Aus¬
drucksformen im Programm möglich sind, ohne daß sich am Ende etwas ändert.
m
Kl
£ E
r-j
cn
o
YX to
• »
co
:3
I
^h *Ö)
r-j
3
O cl
:-x»
_Q CO
:=5 CD
r-.
D
= CD
r%«
LJ
(/)
-0
DD
LI- CD
r-4
X
E c
üO
fi
CD CD
c ■<
CO —
<r
X
.E CD
r^
j—
-o £
<9*
ro
cn
c ^
<1
r-4
<r
r-4
CD -
. CO
Q £
2
u
.
. <D
—i
3
9
H -H
C CD
Ht
o
►—»
•
-C 5
a—
X
9
:CD >
*—
CK
Hi
CD
5 C
cn
a—
3
3
<D LU
cn
CD
X
X
CO
r-H
CD
u—
C
jjJ
Tx
X
X
CD CD
•
-T“
UH
ÜJ
Q)
f 1
-0
<r
-Q .E
2 :
uJ
r
c
Ht
>—
Hi
►—
/X
s s
CK
cn
3
o
3
O
JU CD
n r*
Ll
LD
Lü
2
o
00
M
CN
u E
_i
X
m
r—
H*
^r
CD
a—
X
x^-
.2 E
nj
o
O
CO
b
w
ro
X
A
5 2
X
o
m
3
*1
M
a—
CJ
<L
* O)
cn
cd
3:
X
cn
r-4
CO
H-
E 2
H-
Hl
Hl
X
Ui
a—
X
tH
p ü-
3
O
<X
r—
■■
li
-r-
X
<r
m /—
c
X
CD
V/
a •»
m
H-
*
~ CD
h-
<1
:
X
X
o
X
r-4
2> 2-
1—
o
<E
ÜJ
z
• •
Lü
UH
a—
CD
n
o
UH
i—
X
»■
CD
o
X
ÜD
c
Ä
3:
s
r-<-
o
X
Ü
c 03
<r
»—
o
X
CD
X
h“
O) c
iii
Hi
-j
m
LO
ÜJ
3
öS
X
X
H-
r-4
H4
rx
X
UH
-- -C
>—
<C
H*
M
LÜ
X
X
“O o
X
U-
3:
3 :
-J
>0
Hl
X
c ^
•
LÜ
X
X
Hl
X
CD
F—
aa
C
CD
CD
cn
<r
X
X
X
ii
:
in
3
X
H*
-C £
4-»
jv
Lii
o
cj
3:
X
r-4
•
3
X
X
u
CD
CK
X
T—
Sk
■■
aa
X
r-4
^r
X
3
X
co E
-C
T—
CK
rx
o
o
aa
ro
3
aa
3
£ "ö
c
U“i
<r
T-
o
o
uo
^-x
m
z
o
aa
■o
CD
H-
h-
iü
o
r^4
o
iü
o
».
o
a—
c §
5
X
X
♦—
r~
X
o
H*
ro
= r4
O
in
X
M— _
CD
CD
X
3
o
<r
3
x^»
•»
o
o
o
w E
CD
k_
r-i
UH
o
UH
►—
Lü
UH
O a-
er
H-
H-
«M
i
iX
X
A
X
o
-J
Hl
X
X
C2J r
Ü
O
a-
^5 .o
CD
>-
•
X
il
CJ
3 :
X
X
h- i—
>—
il
II
“O cd
(/)
Cu
X
O
■ ■
X
a«
X
aa
CJ
3 3
3
X
X
CD
-J
■
cn
X
cn
il
cn
il
Hl UH
Hl
X
X
.3> O)
r~
cj
<r
X
o
a—
-j
**
X X
X
o
o
8- §
E
\
CJ
X
üj
X
üj
<r
X X
X
X
X
E
CD
o
o
o
o
ÜO
o
o
o
o
o o
o
o
o
:3
o>
o
a—
r-4
in
IT)
vQ
o
a—
r-4
>0 rx
00
CK
o
,E c
o
o
o
o
o
O
o
ra
r-4
r-4
r-4 r -4
r-4
r-4
KO
LU <
qI
r-v
rv»
rx
rx
rx
rs.
rx
rx
rx rx
rx
rx
Kx
T—
T—
T—
T“
*4—
T—
T—
T—
7—
7— T“
7—
T—
131
17310 F0RX«1T0R2:NEXT«PRINT6512,AfTAB(20)"FERTIG.
1 7 320 F0RX=1TOR 3:NEXT:PRINTe512,A*TAB( 20 ) "LOS !":A1*=INKEY*
1 7330 IFN>1PRINTßl28 + N, " C";
1 7 335 N=N+2:E*=INKEY*:IFE*<>""THEN1 7500
9 • “
«=? -i
O ••
c c
O TI
-H O
c o
C 3?
1 > o
- X
^ o
NI ii
CO
o —■
-1 2
^ — i
m
O O
M x
mm*
C -H
O
1«
r~ -n
T|
1> o
O
2 3?
3?
O X
-<
cn ü
ii
i> —
— *
2 -1
— i
C
132
17340 FRINT(?1 28 + N
Die Springer-Tour
Die Springer-Tour
Dieses Programm bringt ein Spiel auf den TRS-80-Bildschirm, das
einen amüsanten Zeitvertreib darstellt. Worum es sich dabei handelt,
ist schon durch den erklärenden Text im Programm gesagt: Ein Problem
mit einer Schachfigur — nämlich dem Springer — und dem Schach¬
brett. Bleibt eigentlich nur zu erwähnen, daß der Computer die Bewe¬
gungen der Figur verfolgt, falsche Züge nicht ausführt, die bereits be¬
suchten Felder markiert und die Züge zählt. Für die, die es nicht wissen:
Ein Springer darf bei einem Zug immer nur zwei Felder voran und eins
zur Seite gehen.
10 DI HA <128 )
100 GOSUB 5050s GQSUB 1500: GOSUB 2000: GOTO 3000
200 DEN SPRINGER ZEICHNEN
250 F0RI=1T05
260 Z=V+I-1
270 IFI=1J=U:K=U+2
280 IFI=2J=U-1:K=U+3
290 IFI=3J=U+1:K=W+4
300 IFI=4J=U:K=U+3
310 IFI=5J=U-1:K=U+4
400 F0RX=JTOK
410 IFS=1SET(X,Z):G0T045O
420 RESET(X,Z)
450 NEXTX,I
470 IFS=1SET(U-2,0+2):SET(U-1,0+2)
480 IFS01 RESET(U-2,0 + 2)sRESET(U-1,0 + 2)
500 RETURN
133
1500 'SPIEL-ANFANG
1515 S=2:0=2
1520 CLS:PRINT"LOS GEHT'S”;
1530 F0RI=1T0128:A(I)=0:NEXTI
1990 RETURN
2000 'SCHACHBRETT
2010 CLS:FORI=0TO3
2030 FORJ=0 fQ60STEP20
2040 FORV=6TQ10
2050 FORK=0TO9
2060 SET(K+J,V+I*10)
2070 SET(K+J+10,V+5+I*10 )
2080 NEXTK, V, J, I
2150 FORI=1T04
2155 J=43+128*1
2160 PRINT0J,I;
2165 PRINTI? J*448, 1+4;
2170 NEXTI
2200 IFO=0GOTO2300
2210 F0RI=65TQ128
2220 IFA (I) = 0ü()TO2500
2230 J=A(I)/8
2240 K=8 : M J-INT(J))
2245 J=INT(J)H
2250 IFK~0K~8:J=J-1
2255 A=1
2256 IF(INT<U+K)/2)-<J+K)/2)=0RESET(10*K-9,5*J+5):RESET(10*
K~8,5* J+5)s A = 0
2260 IFA=1SET(10*K-?,5*J+5):SET<10*K-8 # 5*J+5)
2280 A=1
2300 GOSUB7000
2500 NEXTI
2800 PRINT866,"A B C D E F G H";
2900 RETURN
3000 'ZIEHEN
3100 PRINT01, ;: INPU T "STARTPOS IT ION l.$ ,H
3101 L=ASC(L«):L=L-64
3102 GOSUB2303
3105 P-L+2:Q=N+1:GOSUB9000:IFI=0GOTÜ32j0
3110 GOTO3100
3130 PRINT840,"UNERLAUBTER ZUG";
3140 FORI=1TC1500:NEXTI
3145 GOSUB2800
134
3150 PRINT055," :PRINT640,"";:INPUT"NAECHTER ZUG";L*,M
3151 L=ASC(L$)-64
3155 GOSUB2800
3158 FORI=0TO1:FORJ=6TO8:SET(I,J):NEXTJ,I
3160 IFL=0GOSUB2000:GOTO3350
3210 GOSUB9000:ONI+1GOTO3250,3130
3220 PRINTB40,"DA UAREN SIE SCHON";:G0T03140
3250 REH ERASE
3255 IF S=2THEN3300
3260 S=ABS(S-1)
3270 GOSUB200
3290 IFS=1RESET(U-4,V+4):RESET(U-3,V+ 4)
3295 IFS<>1SET(U-4,V+4):SET(U-3,V+4)
3300 P=L:Q=H:S=1
3310 IF INT((P+Q)/2)=(P+Q)/2S=0
3320 0=0+1:I=O+64:J=Q:K=P:GOSUB7000
3330 I=P+8*(Q-1)
3340 A(I) = 1:A(0+64)=I
3350 V=5*Q +1
3360 U=10*(P-1)+5
3370 GOSUB200
3390 J=0:PRINT040,"":GOSUB2800
3395 PRINT89,""J
3400 FORL=P-2TOP+2:FORrt=Q-2TOQ+2:GOSUB9000: IFI=0J'=J+1
3410 NEXTh:NEXTL
3450 PRINT80,"SIE HABEN"J"ERLAUBTE ZUEGE";:IFJ=0THEN3450
4800 GOT03150
5050 CLS:PRINT8520,CHR$(23)"DIE SPRINGER-TOUR":FORI=0TO1000:
NEXTjCLS
5060 PRINT"DIES IST EIN KLASSISCHES SCHACHPROBLEM. DIE AUFGA
BE BESTEHT
5070 PRINT"DARIN r EINEN EINZELNEN SPRINGER UEBER SAENTLICHE
FELDER EINES
5080 PRINT"SCHACHBRETTS ZU BEUEGEN, OHNE EIN FELD ZUEIHAL AU
FZUSUCHEN.
5090 PRINT"MAN KANN AUF EINEM BELIEBIGEN FELD BEGINNEN.
6020 PRINT:PRINT"BER COMPUTER UIRD DIE ZUEGE VERFOLGEN UND K
EINEN UNERLAUBTEN
6030 PRINT"ZUG ZULASSEN. DAS SPIEL ENDET, UENN KEIN UNBESUCH
TES FELD MEHR
6040 PRINT"ERREICHBAR IST. dIE EINZELNEN FELDER UERDEN DURCH
6050 PRINT"BUCHSTABEN (A-H) UND ZAHLEN (1-8) DARGESTELLT. DI
E ZUEGE GIBT
6060 FRINT**MAN EIN, INDEM MAN DEN BUCHSTABEN UND DIE ZAHL DF
53 ZIELFELDES
6070 PRINT"DURCH EIN KOMMA GETRENNT EINTIPPT UND eNTER ' DRU
ECKT.
6080 PRINT:INPUT"UENN SIE BEGINNEN UOLLEN, 'ENTER-' DREIECKEN
-•*; A$
6530 RETURN
7000 R=I:1=1-64
7020 PRINT8178,I;"FELDER";
7040 1=1/5
7050 1=240+15*(I-INT(I))+64+INT(I)
7063 IFIOINT(I) I = INT (I )+1
7070 PRINT0I,CHR$ <64+K) J ;
7300 I=R
7500 RETURN
9000 I"=0■ IF<L< 1 ) + (L>8) + (M<1 ) + («>8)I”l :GOTO9500
9100 IFABS( (P-L) + (Q-M)) 021 = 1 :GOTO95'00
9200 IFA(L-8 + 8+M)O0I = 2
9500 RETURN
136
Stingray
Stingray
Mit diesem Programm wird ein Bildschirmspiel erzeugt, wie man es von
einer bestimmten Art Spielautomaten kennt. Ein „feindliches Raum¬
schiff" muß dadurch abgeschossen werden, daß man es in den Bereich
einer „Strahlwaffe" bringt. Zur Steuerung des eigenen Raumschiffs
dienen vier eng beieinander liegende Tasten der Tastatur: J, K. U und
M. Am besten geht es, wenn man J und K mit dem Zeige- und Mittel¬
finger der rechten Hand bedient, U und M mit den entsprechenden
Fingern der linken Hand. Das Raumschiff, das man abschießen soll,
bewegt sich in zufälligen kleinen Sprüngen hin- und her (Zeilen 260 bis
306) und verschwindet jeweils nach einer Zeitdauer von ebenfalls zu¬
fälliger Länge, worauf ein neues erscheint. Erschwerend wirkt, daß die
Steuerbewegungen auch nicht gleichmäßig ausgeführt werden, sondern
in Schritten von zufälliger Größe, wie man in den Zeilen 310 bis 340
erkennt. Der Computer zählt getroffene und entkommene Raumschiffe
und gibt nach insgesamt 20 dieser Vorgänge eine Beurteilung über den
Schützen ab. Die Erläuterungen erscheinen am Anfang des Programmes,
können aber auch zwischendurch mit einem Druck auf die Leertaste
aufgerufen werden. Deshalb stehen sie in einem GOSUB-Teil des Pro¬
grammes.
1 'COPYRIGHT 1978 THE B0TT0M SHELF INC.
2 'ALL RIGHTS RESERVED DO NOT COPY
3 'P.O. BOX 49104 ATLANTA GA 30359
4 CLS:G0SUB500
5 CLEAR
10 CLS
20 TX = RND(100)+9:TY-RND<30)+3
25 CLS:Q1-RND(60):N1-0
30 PRINT0O,NR" FEINDLICHE RAUMSCHIFFE ZERSTOERT
"NU- ENTKOHMEN
137
40 IFNU+NR=>20GOTO1500
100 PRINT@534,"(-";:PRINTB544,”-)";
105 N=992
110 PRINT0980,"+";:PRINT0994,"+";
120 PRINT0917 f "+ , ';:PRINT0929,"+";
130 PRINT0854,"+";:PR INT0864,;
140 PRINT0791,"+";:PR INT0799,j
150 PRINT0728," + ";:PRINT6734,
160 PRINT0665 f "+";:PRINT@669,
170 PRINT0602, ; :PRINT8604,‘ , + ";
180 PRINT0539, M +";
190 PRINT0980," H ;:PRINT6994,"
200 PRINT0917," ";:PRINT0929,"
210 PRINT0854," ";:PRINT0864,"
220 PRINT0791," ";:PRINT0799,"
225 PRINT0728," ";:PRINT0734,"
230 PRINT0667," ";:PRINT0665 r " :PRINT0669 f " “J
240 PRINT0603," ";:PRINT0602 f " :PRINT0604, M
250 PRINT0539,"
260 S=RND(2):IFS=1THENX=RND(3)ELSEX=-1+RND<3)
270 IFS=1THENY=RND(2)ELSEY=-1*RND(2)
300 NI=N1+1:IFN1=>Q1THENNU=NU+1:GOT010
305 RESET(TX,TY):RESET(TX-1,TY+1):RESET(TX+1,TY+1)
306 TX=TX+X:TY=TY+Y:X=0:Y=0
307 A«=INKEY$
310 IFA$="J“THENX=-1*RND(15)
320 IFA$="K"THENX=RND(15)
330 IFA$="U“THENY=-1*RND<5)
340 IFA$="N“THENY=RND(5)
345 IFA$=" "THEN GOSUB500
346 IFTX+X-1<1ORTX+X+1>126THENGOT010
347 IFTY+Y<1ORTY + Y + 1>4&G0T010
350 SET(TX+X,TY+Y):SET(TX-1+X,TY+1+Y):SET(TX+1+X,TY+1+Y)
355 IFA$<>"”THENRESET(TX f TY):RESET(,TX-1,TY+1): RESET (TX+1 f TY+
1):TX=TX+X:TY=TY+Y:Y=0:X=0
360 IFTX<52ORTX>58THEN380
370 IFTY=23ORTY=24ORTY=25ORTY=26THEN400
380 GOT0100
400 F0RXX=1T010: PRINT 8538 ,"**'**" :GOSUB 1005: PRINT6538,“
GOSUB1005:NEXTXX:NR=NR+1
410 60T010
500 PRINT088,"* STINGRAY *
510 PRINT“BU BIST DER KONHANDANT DES TAKTISCHEN RAUMJAEGERS
138
'STINGRAY'.
520 PRINT"DIE STINGRAY IST HIT EINER STRAHLENKANONE BEUAFFNE
T, DIE AUF
530 PRINT”EINEN PUNKT 50 KH VOR DEH RAUHSCHIFF GERICHTET IST
. UENN ES DIR
540 PRINT"GELINGT, EIN FEINDLICHES RAUHSCHIFF IN DIESE POSIT
ION ZU BRIN-
550 PRINT"GEN, UIRD ES ZERSTOERT.
560 PRINT:PRINT"DU BIST AUF EINER KAHPFHISSION IN FEINDLICHE
M RAUHGEBIET.
570 PRINTLINE AUFGABE IST ES, SOVIELE GEGNERISCHE RAUMSCHI
FFE UIE
5B0 PRINT"HOEGLICH ZU ZERSTOEREN. UENN EINEN FEINDSCHIFF EIN
RAUHSPRUNG
590 PRINT"GELINGT, VERSCHUINDET ES UND ENTKOHHT.
<400 PRINT:PRINT"DEIN SCHIFF LAESST SICH UIE FOLGT STEUERN:":
PRINT" J = LINKS K = RECHTS":PRINT" U = AUFUAERTS H =
ABUAERTS ERKLAERUNGEN AUFRUFEN: LEERTASTE
604 PRINT"ZUM SPIELSTART EINE BELIEBIGE TASTE DRUECKEN";
606 ED$ = INKEY$:IF ED$=""GOTO606
607 CLS
610 RETURN
1000 PRINTB0,""
1005 FORX=1T025:NEXT:RETURN
1020 NU=NU+1;GOTOI0
1500 IFNR<16PRINT:PRINT"NICHT SCHLECHT, ABER "NU" SIND ENTKÜ
MHEN.
1510 IFNR>15PRINT:PRINT"DU BIST EIN GUTER SCHUETZE, DU HAST
"NR" ERUISCHT!
1520 FORX=1TO2000:NEXT:CLS:GOTO4
139
Zahlen Ordnen
Zahlen Ordnen
Dieses Programm soll eine Routine zum Ordnen von Zahlen demon¬
strieren, die man sicher in vielen Programmen gut gebrauchen kann.
Sie besteht vor allem aus zwei ineinander geschachtelten Schleifen,
die so oft durchlaufen werden müssen, wieviele Zahlen man der Größe
nach ordnen will.
Die Routine arbeitet mit einer Variablen (V), die zunächst auf einen
Wert gesetzt wird, der kleiner ist als die niedrigste der zu ordnenden
Zahlen. (Der Deutlichkeit halber hier: — 10^8 _ Zeile 60). Beim Durch¬
lauf durch die innere Schleife (Zeilen 70 - 90) wird er dann bis auf den
Wert der höchsten Zahl angehoben. Dann wird diese Zahl aus der wei¬
teren Bearbeitung herausgenommen, indem man in einer Hilfsmatrix
(M(15)) das entsprechende Element gleich 1 setzt (Zeile 100). In der
Zeile 80 wird nämlich auch immer überprüft, ob das entsprechende
M(x) noch nicht auf 1 gesetzt wurde, ehe die Angleichung des V er¬
folgt. Dies kann man sooft wiederholen, bis alle Zahlen geordnet sind.
Wenn es weniger oft geschieht, werden eben nur die entsprechende An¬
zahl der höchsten Nummern herausgesucht.
Der Rest des Programmes, u. a. zufällige Wahl der zu ordnenden Zahlen
(Zeile 30) und Ausgabe der ungeordneten und geordneten Zahlen auf
dem Bildschirm (Zeile 110) ist nur zur Verdeutlichung des Prinzips
gedacht und kann den Erfordernissen eines größeren Programmes, das
mit der Routine arbeitet, natürlich angepaßt werden.
140
20 RIM X(15), M(15 )
30 FÜR 1=1 TO 15: X(I)=RNH(100)
40 PRINT "PLATZ", "UNGEORDNET",
50 FOR L=1 TO 15
60 V=-1E+38
70 FOR 1=1 TO 15
80 IF M(I)=0 AND X<I)>=V THEN V
90 NEXT I
100 M( 0)=1
110 PRINT L, X(L ) , VJ
120 IF L<15 PRINT
130 NEXT L
140 GOTO 140
NEXT
"GEORDNET
X(I): 0=1
Geräusche
und Musik
Geräusche und Musik
Daß man mit dem TRS-80 auch ohne Hilfsmittel Geräusche und Mu¬
sik machen kann, wurde bereits an anderer Stelle dieses Buches er¬
wähnt. Um zu vernünftigen Resultaten zu kommen, ist dabei Maschi¬
nenprogrammierung erforderlich. Der Zeitaufwand für die Verarbei¬
tung von BASIC-Programmen, die zur Ausführung ja zeilenweise in Ma¬
schinensprache umgesetzt werden müssen, ist zu groß, als daß so mehr
als nur sehr tiefe Töne Zustandekommen. Nun, hier sind zwei Pro¬
gramme, wie man sieht in BASIC, aber doch zum Teil Maschinenpro¬
gramme. Beiden gemeinsam ist der letzte Teil mit den Zeilen 50000
bis 50260. Hierbei handelt es sich um ein Unterprogramm zum Laden
einer Subroutine in den Speicher, die anschließend in bekannter Weise
mit der Funktion USR(x) von einem anderen Programm aus aufgeru¬
fen werden kann. Die Idee dabei ist es, einem Programm, das man mit
Geräuschen oder Musik ausstatten will, dieses Unterprogramm anzu¬
hängen (daher auch die hohen Zeilennummern). Am Anfang des Haupt¬
programms muß es dann mit der Anweisung GOSUB 50000 aufgerufen
werden und lädt ein Maschinenprogramm, das sich als Zahlenreihe in
den DATA-Zeilen 50200 bis 50260 befindet in einen Speicherbereich,
den man natürlich vor dem Überspielen des gesamten Programms vom
Cassettengerät reserviert haben muß (mindestesn 125 Byte).
Die Speicherplätze 16561 und 16562 im vom Computer selbst bean¬
spruchten Speicherbereich enthalten (als Zwei-Byte-Zahl) einen Wert,
der um 2 kleiner ist als die erste Adresse des reservierten Speicherbe¬
reichs. In Zeile 50002 wird diese Zahl ermittelt und dient dann als An¬
fangspunkt für das Einschreiben des Maschinenprogramms. In Zeile
50004 wird geprüft, ob das Maschinenprogramm schon bei einem frü¬
heren Lauf des Hauptprogrammes geladen wurde. Ist das der Fall,
kehrt der Computer mittels RETURN sofort aus dem Unterprogramm
zurück, da das Maschinenprogramm ja nur beim erstenmal geladen
werden muß. Schließlich wird auch noch die Sprungadresse des Ma-
schinenprogramms in die entsprechende Stelle für die Funktion
USR(x) geladen (Zeilen 50006 und 50008). Die liegt um 7 höher als
Jie Anfangsadresse des Maschinenprogramms; die ersten sieben Bytes
enthalten nämlich Zahlen, mit denen man durch entsprechende POKE-
Befehle die Art der Töne bestimmen kann, die erzeugt werden: Die
ersten beiden Adressen enthalten das niederwertige und höherwertige
Byte der Tonhöhe, die nächsten beiden die niederwertigen und höher¬
wertigen Byte der Tondauer. Mit der fünften Zahl können bis zu 255
Stufen einer Tonreihe d. h. bis 256 Töne gewählt werden, und die
letzten beiden Adressen vor der Sprungadresse (dem eigentlichen Be¬
ginn des Maschinenprogramms) bestimmen abwechselnd den Tonhöhen¬
unterschied zwischen zwei Tönen einer Reihe, so daß man durch ge¬
schickte Wahl der Zahlenwerte Sirenen, Martinshörner u. ä. nachahmen
kann.
Hier einige Hinweise zum besseren Verständnis der verwendeten Kon-
trollzahlen: Die Töne werden durch Programmschleifen erzeugt, deren
Anzahl und Länge durch die Zahlen bestimmt werden. Dementspre¬
chend hängen Höhe und Dauer eines Tones zusammen: Je höher, desto
kürzer bei gleicher Längenangabe. Durch die Stufenangaben werden der
jeweiligen Tonhöhenzahl die entsprechenden Werte hinzuaddiert oder
von ihnen abgezogen, und zwar folgendermaßen: Die Werte 1 bis 127
werden zugezählt, so daß sich ein niedrigerer Ton ergibt. Bei den Zah¬
len 129 bis 255 wird das Komplement zu 256 abgezogen (also 127 —1),
so daß sich ein entsprechend höherer Ton ergibt — am wenigsten bei
255, am meisten bei 129. Bei 128 passiert wie bei 0 garnichts. Am
besten probiert man die Sache selbst ein wenig aus, allerdings sind eini¬
ge Einschränkungen zu beachten, wenn man nicht unkontrollierbare
Ergebnisse erhalten will:
Bei den Tonstufen sollte man vorsichtig sein, wenn man mit den Ab¬
stufungen über die Grenzen der vorhandenen Tonhöhen hinausgeht
(also z. B. von der Tonhöhe 100, niedriges Byte, 120 als Tonstufe ab-
ziehen). Es kommen zwar auch dann noch Töne heraus, aber die lie¬
gen dann irgendwo auf der Tonskala, wo man sie nicht erwartet.
Bei Verwendung des höherwertigen Byte für die Tonhöhe funktioniert
die Stufung nicht richtig - man bekommt z. B. keine glatt auf- oder
absteigenden Tonreihen heraus.
143
Die Zahl 10 als höherwertiges Byte für die Tonhöhe stellt in etwa den
tiefsten, noch brauchbaren Ton dar; darunter hört man mehr oder weni¬
ger nur noch einzelne Impulse.
Auch ist Vorsicht geboten, wenn man bei stufenweise aufsteigender
Tonhöhe an die Grenze der Tonhöhe überhaupt gelangt (1 im niederwer-
tigenTonhöhen-Byte). Dann verfällt der Computer unter Umständen für
kürzere oder längere Zeit in langsame Knack-Geräusche und kann nur
noch mit dem RESET-Knopf wieder gestoppt werden. Ein Beispiel:
Bei der Anfangstonhöhe 100 darf man höhchstens 99 Stufen mit der
kleinsten Schrittweite aufwärts, nämlich 255 in einer der beiden Ton¬
stufenadressen vorsehen. Bei größeren Tonschritten ist es allerdings
anders.
Und noch eine wichtige Einzelheit: Am Anfang enthält die erste Kon-
trolladresse (niederwertiges Tonhöhen-Byte) 50 und Position Nr. 3
(niederwertiges Tonlängen-Byte) 15.
Alle anderen Zahlen sind Null. Das ergibt einen kurzen Piep-Ton, den
man also erhält, wenn man die Subroutine durch die USR-Funktion
aufruft, ohne die Kontrollzahlen irgendwie zu verändern. Diese Zahlen¬
kombination wird nach jedem Maschinenprogramm-Aufruf wieder in
die entsprechenden Speicherpositionen geladen, man muß also jede
andere Zusammenstellung vor jedem USR erneut in die sieben Speicher¬
plätze bringen. Aber das wäre in jedem Fall nötig, da die Zahlen im
Zuge der Abarbeitung des Maschinenprogramms alle auf Null herunter¬
gezählt werden.
Bleibt noch zu ergänzen, wie man die Töne hörbar machen kann: Ein¬
fach durch Anschluß des Cassettengerät-Ausgangs mit einem 5-poligen
Diodenkabel an den Tonband- oder Plattenspielereingang eines Radios,
Verstärkers oder etwas ähnlichem.
144
Geräusche
Geräusche
Zum Ausprobieren der Möglichkeiten der Geräusch-Subroutine dient
das erste der beiden Programme. Darin kommt als erstes das GOSUB
zum Unterprogramm. Dann werden die sieben Kontrollzahlen samt
ihren Speicherplätzen auf dem Bildschirm gezeigt. Nacheinander kann
man beliebige Zahlen (zwischen 0 und 255, natürlich) wählen, die in
die entsprechenden Speicherplätze gebracht werden (Zeile 230). Gleich¬
zeitig werden die gewählten Zahlen auch noch als Variable bereitgehal¬
ten (P(0) bis P(6) ). Läßt man die Maschinen-Subroutine ablaufen
(Zeile 220), werden die Kontrollzahlen anschließend wieder in ihre
Speicher-Positionen gebracht, weil das Maschinenprogramm sie ja bei
jedem Durchgang löscht. So kann man jede gewählte Kombination be¬
liebig oft auslösen. Zeile 15 dient übrigens dazu, die Anfangsinhalte
der Speicherstellen für die Kontrollzahlen auch richtig auf dem Bild¬
schirm abzubilden.
Will man ein bestimmtes Programm mit Geräuschen ausstatten, kann
man nun folgendermaßen verfahren: Zuerst lädt man dieses Probierpro¬
gramm. Dann findet man durch Versuche heraus, durch welche POKE-
Anweisungen die gewünschten Effekte hervorgerufen werden und no¬
tiert sie sich. Wichtig ist dabei, daß man mit Hilfe der Variablen TM,
die von dem jeweils reservierten Speicherbereich und damit auch von
der Anfangsadresse des Maschinenprogrogramms abhängt, unabhängig
von festen Speicheradressen für die Kontrollzahlen wird.
Schließlich kann man das geplante Programm schreiben und die Zeilen
bis 240 des Probierprogramms löschen. Dabei muß das neue Programm
nur an geeigneter Stelle wieder ein GOSUB 50000 enthalten. Mit pas¬
senden POKE-Anweisungen und dem USR(x) lassen sich die gewünsch¬
ten Geräuscheffekte dann im Programm auslösen.
145
Das Unterprogramm zum Laden des Maschinenprogramms bildet da¬
durch einen Teil des neuen Programms. Beim ersten Lauf nach Anschal¬
ten des Computers wird es aktiviert und lädt das Maschinenprogramm
in den vorgesehenen Speicherbereich. Das bleibt dort, bis der Compu¬
ter wieder ausgeschaltet wird.
r t 7. s U ■' „
. ■ f *
1« GOSUD 50000
15 P(0)=50: P<2)=15
20 CLS: PR INT"STARTADRESSE: "TM+2" (BEREITS GELADEN)
30 PRINT: PRINT"SPEICHERPLAETZE FUER K0NTR0LL2AHLEN:
INHALT:
100 GOSUB 120: GOTO 200
120 PRINT?192,"HOEHE (NIEDRIGES BYTE): "TM+2.,PEEK(TM+2)"
II
130 PRINT"HOEHE (HOHES BYTE): "TM+3,,PEEK(TM+3)
140 PRINT"DAUER (NIEDRIGES BYTE): "TN+4,,PEEK(TH+4)
150 PRINT"DAUER (HOHES BYTE): "TM+5,,PEEK(TM+5)
160 PRINT"STUFENZAHL: "TM+6,,PEEK(TM+6)
170 PRINT"TONSTUFE 1: "TM+7,.PEEK(TM+7)
180 PRINT"TONSTUFE 2: "TM+8..PEEK(TM+S)
190 RETURN
200 PRINT: PRINT"SUBROUTINE AENDERN: 1, AKTIVIEREN: 2
210 Af-INKEYi: IF A$ = "" THEN 210
220 IF At ="2" Z=USR(0): FOR 1 = 0 TO 6: POKE TM+2+I,P(I): NEXT
: GOTO 210
230 IF A$ ="1" THEN FOR 1 = 0 TO 6: PRINT? 245+64*1,J:INPUT P(I
): POKE TN+2+I,P(I): GOSUB 120: NEXT
240 GOTO 210
50000 'GERAEUSCH-SUBROUT INE - LADEPROGRAMM
50002 TM=PEEK(16561)+256+PEEK(16562)
50004 IF PEEK(TH+9)=219 THEN RETURN
50010 CLS: PRINT""MEMORY SIZE' MUSS MINDESTENS 125 BYTE NIED
RIGER ALS DAS
50015 PRINT"MAXIMUM DES COMPUTERS - D. H. HOECHSTENS 32642 F
EI 16 K
50016 PRINT"BZU. 20324 BEI 4 K SPEICHERGROESSE - EINGESTELLT
SEIN!
50020 PRINT"IST DAS NICHT GESCHEHEN, COMPUTER AUSSCHALTEN UN
D NEU BEGINNEN!
50027 INPUT"ALLES KLAR? DANN "ENTER DRUECKEN'
50030 PRINT: PRINT"EINEN MOMENT...
50040 N=16526: ML=TM+9: GOSUB 50130
50050 READ A$: IF A$C"HL$" THEN 50050
50060 FOR N=TH+2 TO TH+200
50070 READ HL: IF HL>255 THEN 50110
50080 IF HL<0 THEN GOSUB 50120: GOTO 50100
50090 F'OKE N,HL
50100 NEXT
50110 RESTORE: RETURN
50120 HL=TH-HL+1
50130 ZI=INT(HL/256): Z2=ML-Z1*256
50140 POKE N,Z2: N=N+1: POKE N,Z1 : RETURN
50200 DATA HL»,50,0,15,0,0,0,0,219,255,230,64,238,64.15,15,1
5, 246,1,95,243,58,-6,87,58,-7,254,0,194,-37,122,50,-7
50220 DATA 42,-1,34,-53,42,-3,34,-50,33,15,0,1,50,0,11,120,1
77, 194,-55.123,238,3,211,255,95,43,124,181,194,-52,58
50240 DATA -5,254,0,202,-104,61.50,-5.58,-53,130,50,-53,53,-
7, 103,122,50,-7,84,195,-49,50,-7,50,-4,50,-2,62,15
50260 DATA 50,-3,62,50,50,-1,251,201,300
147
Musik
Daß sich recht reizvolle Effekte erzielen lassen, ohne daß man dazu alle
der vorhandenen Beeinflussungsmöglichkeiten des Musik-Maschinenpro¬
gramms nutzt, zeigt dieses zweite Programm, das mit dem Unterpro¬
gramm arbeitet. Hier werden nur Tonhöhe und -länge verwendet, und
damit kann man ganze Melodien komponieren und abspielen.
In Zeile 20 ist die Zahl der Noten festgelegt: Zwei Matrizen mit je
zweimal 10 Elementen können die jeweils zwei Tonhöhen- und Ton-
längen-Bytewerte von 100 Noten bzw. die Längen von Pausen aufneh¬
men (nur hundert Elemente werden verwendet). Nacheinander werden
diese Werte in die entsprechenden Speicherplätze gepoked und die
USR(x)-Funktion aufgerufen, um die eingegebene Melodie abzuspie¬
len (Zeile 90). Für Pausen wird einfach eine passend dimensionierte
Warteschleife aktiviert (Zeile 85). Beim „Komponieren" nimmt der
Computer die bekannten Tonbezeichnungen entgegen (C, Cis, Des, D
usw.) und wählt die entsprechenden Tonhöhen aus einer Liste, die in
den DATA-Zeilen 3000 bis 3008 vorgegeben wird. Übrigens enthält
jede der DATA-Zeilen genau eine Oktave von C bis H. Diese Zahlen
lassen sich auch hernehmen, wenn man irgendein anderes Programm im
Sinn hat, das eine Melodie enthalten soll.
Da Tonhöhen und -längen voneinander abhängen, können eingegebene
Längen nicht einfach übernommen werden, sondern müssen anhand der
jeweils angegebenen Höhe zuerst umgerechnet werden. Dies geschieht
unter Verwendung der Referenzzahl RZ, die in Zeile 10 definiert wird,
in Zeile 400 und zwar so, daß das Produkt aus der Multiplikation von
Tonhöhen und -längen für eine bestimmte Tonlänge immer eine Kon¬
stante ergibt. In Zeile 330 und in dem zweiten und dritten Teil von Zei¬
le 400 finden sich übrigens die bekannten Umrechnungen von Größen
in ihre Darstellungen durch zwei Byte.
Vielleicht wird sich mancher wundern, warum die Zeile 30 mit einem
RESTORE abschließt, obwohl das Übernehmen von Zahlen aus DATA-
Zeilen in dem anschließenden, durch GOSUB 50000 angesprochenen
Unterprogramm zumindest bei erstmaligem Programmlauf weitergeht.
Nun, es ist grundsätzlich empfehlenswert, verschiedene Teile eines Pro¬
gramms, die jeder für sich DATA-Zeilen und READ-Befehle haben,
sinngemäß so auseinanderzuhalten, daß jederzeit neue Teile hinzuge¬
fügt oder herausgenommen werden können, ohne daß man sich Sorgen
machen muß, ob die einzelnen READ-Anweisungen auch jeweils die
richtigen DATA-Zeilen erreichen. Dazu muß am Ende jedes READ-Vor-
gangs ein RESTORE stehen, und am Anfang sollte eine „Sicherung"
eingebaut sein, die den Zugriff von READ-Befehlen auf falsche Daten
verhindert. Letzteres geschieht beim Unterprogramm in Zeile 50050, in
Verbindung mit dem ersten Begriff in den zugehörigen Data-Zeilen,
dem String ML$. Etwaige DATA-Zeilen im Gesamtprogramm werden
so lange abgesucht, bis das ML$ gefunden ist; erst dann beginnt das
Übertragen des Maschinenprogramms in seinen Speicherbereich.
Eine erwähnenswerte Besonderheit haben übrigens die beiden hier ab¬
gedruckten Programme: In bedingten Befehlen steht bei ihnen vor
Sprungbefehlen weder TH EN noch GOTO, sondern einfach ein Komma
— im Musikprogramm zum Beispiel unter anderem in den Zeilen 70, 75
und 80. Wo dies ohne Widersprüche möglich ist, kann sogar das Komma
entfallen. Daß dies funktioniert, beweisen die Programme. Es handelt
sich dabei um eine angenehme Arbeitserleichterung beim Programmie¬
ren, die noch garnicht so lange bekannt ist!
10 HEFINT \i RZ=Ti3?6
20 DIU TP(100,1). TL(100,1), TZ(5.11 )
25 TL(1,0)=500
30 FÜR K=1 TO 5: FOF: J=£J lü 11: READ TZ(K,J>: NEXT J.K: REST
(3 RE
40 GOSUB 5i?00ö: ST = T«*2
50 CL3: PRIMT-ttUSIK ! • ! ! !
6t PRINT: PRINT"1 - KOMPONIEREN 2 - AEHDERN 3 - SPIE
LEN
70 A$=INKET$: IF Ai= M \ 70
75 IF Ai<>"3", 95
30 FÜR K=t TO 100: IF TLtX,0)>255. 70
82 PRINTeSS, K
85 IF TP(K,0)-0 AND TP(K,1)-0 FOR J-1 TO TL(K,0)*23: NEXT J,
!<
149
90 POKE ST,TP(K,0>: POKE ST+1,TP(K, 1): POKE ST+2,TL(K,0): PO
KE ST+3,TL(K,1): M=USR(M): NEXT K: GOTO 70
95 IF A*="2" CLS: INPUT"AENDERUNGEN - BEI UELCHER POSITION B
EGINNEN";K0: GOTO 165
100 IF A$<>"P, 70
110 CLS: PRINT"ALSO LOS, DU MEISTERKOflF'ONIST!
120 PRINT: PRINT"DI£ NOTEN WERDEN NACHEINANDER EINGEGEBEN -
130 PRINT"IN DER FORM: NOTE 'ENTER' OKTAVE (1-5), LAENGE <1-
50) "ENTER'.
135 PRINT"ES GIBT NOCH EINEN TON VON DER 6. OKTAVE: DAS HOHE
C.
140 PRINT"Z. b.: G "ENTER" 2,8 "ENTER" CIS "ENTER" 3,12 "ENT
ER" USU.
150 PRINT’TAUSEN LEGT MAN MIT "P" UND DER DAUER (1-50) FEST.
152 PRINT"FUER DAS ENDE DER MELODIE X EINGEBEN.
153 FRINT“EIN "Q" BRICHT KOMPOSITIONS- UND AENDERUNGSROUTINE
N AB.
155 PRINT: INPUT"ALLES KLAR? DANN "ENTER" DRUECKEN";:CLS
160 PRINT"UND NUN FRISCH ANS WERK!
163 K0=1
165 FOR K=K0 TO 100: 1$="": 11=0: 12=0
190 PRINT0256, CHR*(31) "NOTE/PAUSE NR."K;: INPUT 1$
191 IF 1$="" AND AI="2" NEXT: GOTO 50
192 IF I»="0", 50
193 IF I$="X" TL(K,0)=500: GOTO 50
195 IF I$="p" INPUT"LAENGE"; 12: TP(K,0>=0: TP(K,1)=0: TL(K,
0>= 12: NEXT ELSE INPUT"OKTAVE, LAENGE"; 11,12
210 IF 11=6 PG=16: GOTO 330
240 Y=12
250 IF I$="C“ Y=0
255 IF I*="CIS" OR It="DES" Y=1
260 IF I$ = "D" Y=2
265 IF I$ ="DIS" OR I$="ES" Y=3
270 IF I$ = "E" Y = 4
275 IF I$ = "F" Y=5
280 IF I$="FIS" OR I$="GES" Y=6
285 IF I$ = "G" Y=7
290 IF I$ = "GIS" OR H = "AS" Y=8
295 IF I$ = "A" Y=9
300 IF I$ = "AIS" OR I$ = "B" Y=10
305 IF I$="H" Y=11
310 IF Y=12, 190
320 PG=TZ(I1,Y)
150
330 PH=INT(F'G/256): F'L=PG-PH*256
340 TP(K,0)=PL: TF'(K.1)=PH
400 RL=I2+ftZ/PG: LH-INT(RL/256): LL=RL-256*LH
410 TL(K,0)=LL: TL(K.1)=LH
<400 NEXT K: GOTO 70
999 END
3000 DATA 560,524,50:3,476.442.423.396.376.352,334,316,298
3002 DATA 2S0,262,250,238,221.210.198,188.176,163.153,149
3004 DATA 140,131,125,119,111,105,99,94.88,83,79,74
3006 DATA 70,66.62,59,55,52,49.46,44,41,39,36
3008 DATA 34,32,30,28,26,25,24,22,21,19,13,17
50000 'GERAEUSCH-SUBROUTINE - LABEPROGRANil
50002 TK=PEEK( 1 6561 )+ 256+PEEK(1 c>5u2)
50004 IF PEEK(TH+9)=219 THEN RETURN
50010 CLS: PRINT"'NEMCRY SIZE" MUSS MINDESTENS 125 BYTE NIED
RIGER ALS DAS
50015 F'RlNT"MAXIflÜM DES COMPUTERS - D. H. HOECHSTENS 32642 B
EI 16 K
50016 PRINT"BZU. 20324 BEI 4 K SPEICHERGROESSE - EINGESTELLT
SEIN!
50020 PRINT"IST DAS NICHT GESCHEHEN, COMPUTER AUSSCHALTEN UN
D NEU BEGINNEN!
50027 INPUT"ALLES KLAR? DANN 'ENTER DRUECKEN"
50030 PRINT: PRINT"EINEN MOMENT...
50040 N = 1 6526: ML = TM + 9: GOSüB 53130
50050 READ AI: IF A$<> M NLI" THEN 53050
50060 FÜR N = TM-» 2 TO TM + 230
50070 READ ML: IF ML>255 THEN 53110
500S0 IF ML ,0 THEN GOS'JB 50123: GOTO 50130
50090 POLE N.ML
50100 NEXT
50110 RESTÜRE: RETURN
50120 ML=TM-ML+1
50130 Z1 • -1NT(ML/256): Z2=ML-ZU256
50140
50200
KT
J,
POKE N,Z2: N=N+1: POKE N.Z1: RETURN
DATA HLI,50,0.15,0,0.0.0,219,255 ,233.64.238.64.15,15.1
246,1.95.242.53,-6,87.58.-7,254,0,194.-37,122,50,-7
50220 DATA 42.-1,34,-53,42,-3,34,-50,33,15,0,1,53,3,11,123,1
77. 194,-55,123.238,3,211,255,95,43,124,181,194,-52,58
50240 DATA -5,254,0,202.-104.01,50.-5,58,-53.130.50.-53,53.--
1 03,122,50,-7,84,1 95,-49,50.-7,50,-4,50,-2,62,15
50260 DATA 50,-3.62,50,50.-1,251,201,300
151
Byte - Zerlegung
von Zahlen
Byte-Zerlegung von Zahlen
Nicht selten muß man Speicheradressen in zwei Byte zerlegen, um sie
direkt in entsprechende Speicherpositionen des Computers zu bringen.
Ein Beispiel dafür bildet die Funktion USR(x), die eine Maschinenpro¬
gramm-Subroutine aufruft und dazu die Angabe einer Sprungadresse
erfordert, die man mit POKE-Befehlen in die Speicherstellen 16526 und
16527 befördern muß. Um zeitraubendes Ausrechnen der beiden Byte-
Werte zu ersparen, ist dieses kleine Programm gedacht. Bei Eingabe von
entsprechenden Dezimalzahlen ermittelt es die entsprechende Byte-Dar¬
stellung. Die dazu erforderliche Kalkulation findet in Zeile 110 statt.
Das restliche Programm ist größtenteils nicht unbedingt erforder¬
liche, aber recht praktische „Ausschmückung". Zunächst wird die um¬
zurechnende Zahl in Zeile 30 als ganze Zahl definiert. Das hilft Fehler
vermeiden, da dadurch nur Zahlen bis 32767 — der höchsten Adresse
des TRS-80 mit 16 K Speicher — verarbeitet werden. Dann sorgt die
Formationsdefinition in Zeile 40 in Verbindung zu den entsprechenden
USING-Angaben für die korrekte Ausrichtung der auf dem Bildschirm
erscheinenden Zahlen. Schließlich wird mit der ON ERROR GOTO-
Routine und dem 7REDO der Zeile 200 die Eingabe-Fehlermeldung des
Computer-Betriebsystems nachgeahmt. Mit dem CHR$ (27) CHR$(30)
erreicht man, daß nach Eingabe der zu zerlegenden Zahl sie zur Kon¬
trolle auf der gleichen Zeile des Bildschirms wieder sichtbar wird.
10 CLS
20 ON ERROR GOTO 200
:.J0 BEFINT X
-10 F$ = "#HtMH»"
100 PRINT: INPUT ''DEZIMALZAHL" X
113 H=INT(X/256): l=X-H*256
120 PRINT CHR*(27)CHR*(30> "DEZIMALZAHL: USING
140 PRINT "HOEHERUERTIGES BYTE: ", USING Fi; H
150 PRINT "NIEUERUERTIGES BYTE: ", USINÜ F*; L
160 GOTO 100
200 PRINT "?REB0
210 RESUflE
Geräuschprogramm
ohne
Maschinenprogramm
Speicherbereich
Geräuschprogramm ohne Maschinenprogramm-Speicherbereich
Dieses Programm ist eine Variante des Probierprogramms, mit dem Un¬
terschied, daß man keinen Speicherplatz für ein Maschinenprogramm
reservieren muß. Das wird dadurch erreicht, daß eine Zeichenkette zur
Aufnahme des Maschinen-Unterprogramms vorgesehen wird. Diese
Zeichenkette wird in Zeile 50001 definiert — sie ist 125 Stellen lang
und kann damit gerade das Maschinenprogramm aufnehmen. In diesen
Platz wird in bekannter Weise mit einer Programmschleife, in der je¬
weils READ- und POKE-Anweisungen aufeinander folgen, das Maschi¬
nenprogramm eingetragen. In den Speicherplatz für die Sprungadresse
der USR-Funktion (16526 und 16527) wird in Zeile 50008 die An¬
fangsadresse des String geladen, die in Zeile 50002 gewonnen wurde.
Dadurch wird das Maschinenprogramm aktiviert, wenn das Programm
USR(x) verarbeitet (Zeile 220).
154
Als Nachteil gegenüber der Variante mit in eigenem Speicherbereich
untergebrachten Maschinenprogramm läßt sich dieses Programm we¬
der korrekt listen noch wieder starten, wenn es erst einmal gelaufen
ist; der Inhalt des String T$ bringt die Computer-Funktion durchein¬
ander. Als Abhilfe kann man nach einem BREAK mit folgender Be¬
fehlszeile für Programmlistungen sowie neue Starts wieder geordnete
Verhältnisse schaffen: FORI=17919 TO 18043: POKE I, 50: NEXT.
Die Anfangsadresse gilt natürlich nur für den Fall, daß das Programm
exakt wie in der Vorlage eingegeben wurde. Ansonsten wird die An¬
fangsadresse ja auf dem Bildschirm sichtbar gemacht. Die Zahl 50 in
dem POKE-Befehl ist eine zufällige Wahl; selbstverständlich ist auch ei¬
ne beliebige andere Zahl geeignet, die im Bereich 1—255 liegt und
irgendein Zeichen repräsentiert.
Die bei Zeile 50000 beginnende Subroutine zum Laden des Maschi¬
nenprogramms in eine freie Zeichenkette legt wieder den Gedanken
nahe, das Unterprogramm wiederum in anderen BAS IC-Programmen
einzusetzen. Dafür ist es auch gedacht. Es muß am Anfang des überge¬
ordneten Programmes nur einmal aufgerufen werden (mit einem GO-
SUB 50000), damit das Maschinenprogramm in den DATA-Zeilen
in die Zeichenkette T$ in Zeile 50001 übertragen wird.
Dann kann ,wie bereits ausgeführt, die Art des Tones bzw. der Töne
durch entsprechende POKE-Anweisungen gewählt werden, wobei die
Variable ST als Bezugspunkt fungiert. Sie wird in Zeile 50002 mit Hilfe
der VARPTR-Funktion aus der Anfangsadresse von T$ gewonnen und
dient auch zum Laden der Sprungadresse der USR-Funktion (Zeile
50008). Daher kann die Subroutine in gewohnter Weise durch X=
USR(X) aufgerufen werden.
155
5 CLS: PRINT "EINEN MOMENT, BITTE...
1? GOSUB 50000
15 P (0 > = 5 0: P(2)-15
2f CLS: PRINT"STARTADRESSE: "ST" (BEREITS GELADEN)
PRINT: PRINrSF'EICHERPLAETZE FUER KONTROLLZAHLFN:
INHALT:
100 GOSUB 120: GOTO 200
120 PRINT0192,"HOEHE (NIEDRIGES BYTE): "ST.,PEEK(ST)"
130 PRINT"HOEHE (HOHES BYTE): "ST+1,,PEEK(ST+1>
110 PPINT"DAUER (NIEDRIGES BYTE): "ST+2,,PEEK(ST+2)
150 F'RINT"DAUER (HOHES BYTE): "ST+3, ,PEEK(ST+3)
US PRINT"STUFENZAHL: "ST+4,,FEEK(5T+4)
170 PRINT"TONSTl'F£ 1: "ST+5,,PEEK(ST+5)
180 PRINT"TONSTUFE 2: "ST + 6, ,PEEI«ST+6)
190 RETURN
200 PRINT: PRINT"SUBROUTINE AENBERN: 1. AKTIVIEREN: 2
2’0 A*=INKEY$: IF A$ = "" THEN 210
22? IF At="2" Z-USFM0): FOR 1=0 TO 6: POKE ST+I,P<I): NEXT:
(30 TO 210
230 IF At = " 1" THEN FCR 1 = 0 TO 6: PRINT© 245+64*1,:: INF'U T PCI
): POKE ST + I.Pd): GOSUB 120: NEXT
240 GOTO 210
'30000 GEF: AE USCH-SUBROUT INE - LAPEPROGRAMM
'3003 1 T$ = ".
ti
50002 3T=PEEK(VARPTR(T$)+1)+256*PEEK(VARPTR(T$)+2)
50004 BB=ST+7: BH=INT(BB/256): PL=BB-BH*256
50003 POKE 16526.BL: POKE 16527.BH
50053 READ At: IF AID"ML$" TUEN 50852
50060 FOR N=ST TO ST+200
50070 F’EAD KL: IF ML; 255 THEN 50113
50080 IF ML..0 THEN 50120
50090 POKE N,ML
50100 NEXT
50110 RESTORE: RETURN
50)20 ML=ST-ML-1
50130 ZI = INT(ML/256): Z2=KL-Z1+256
50140 POKE N.Z2: N=N+1: POKE N.Z1: GOTO 52120
50200 DATA MLT ,50,0,15,0,0,0.0,219.255,230.64,238,64,15.15.1
5. 246,1,95,243.58,-6.87,58,-7.254.0,1 94 .-37,122.50,-7
50220 DATA 42,-1,34,-53.42.-3,34,-50,33.15.0,1,52,8,11,128,1
156
77, 194,-55,123,238,3,211,255,95,43,124.181.194.-52,53
'.50240 DATA -5.254,0,202,-104.61 .50,-5,58,-53,130.30.-53.58,-
7. 103.122.50.-7,84,195.-49,50.-7,50.-4,50,-2.62,15
50260 DATA 50,-3,62,50.50,-1,251.201,300
157
Abgezinste
Geldmengen
Abgezinste Geldmengen
Dieses Programm ermittelt, wie man auch an dem Anfangstext erken¬
nen kann, den auf die Gegenwart abgezinsten Betrag einer Geldmenge
in der Zukunft. Das heißt, wenn man weiß, wie hoch die Zinsen sind,
die man bekommen kann, wenn man eine Geldsumme anlegt, kann
dieses Programm ermitteln, wieviel Geld man heute anlegen muß, um
zu einem bestimmten Zeitpunkt in der Zukunft eine gewünschte Geld¬
menge in Händen zu haben.
Zu dem Programm selbst ist nicht viel zu sagen: Die Angabe dererrech-
neten Lösung erfolgt mit einer Format-Anweisung (Zeile 1160), so daß
in korrekter Weise Mark und Pfennig herauskommen. Auch ist eine
Fehlerbehandlungsroutine vorhanden, die u. a. bei Eingabefehlern
eingreifen soll. Die für einen Rechengang eingegebenen Anfangswerte
werden bei Ausgabe der Lösung noch einmal sichtbar gemacht. So hat
man alles auf dem Bildschirm beieinander und kann zum Beispiel für
einen neuen Durchlauf im Vergleich damit andere Anfangswerte wäh¬
len.
1 'COPYRIGHT 1978 THE 80TT0M SHFLF INC
2 ALL RIGHTS RESERVED. DO NOT COPY.
3 'P.O. BOX 49104 ATLANTA GA 30359
100 •'
1000 F=0:R=0:M=0:N=0
158
1 'COPYRIGHT 1979 THE BOTTOM SHELF INC.
2 'ALL RIGHTS RESERVE!*. HO NOT COF'Y.
3 'P.O. BOX 49104 ATLANTA GA 30359
100 '
1000 F=0:R‘0:M=0:N=0
1010 CLS:PR INT:PRINT"DIESES PROGRAMM BERECHNET DEN AUF DIE g
EGENWART ABGEZINSTEN
1020 PRINT"UERT EINER KUENFTIGEN gELDSUNME. UND ZUAR FUER EI
NEN BESTIMMTEN
1030 PRINrZINSFUSS.
1 040 CLEAR:PR INT:INPUT"DER KUENFTIGE BETRAG. IN d - MARK" ;F
1050 INPUT"DER JAEHRLICHE ZINSSATZ, IN Z";R
1060 INPUT"ANZAHL DER ZINSPERIODEN PRO JAHR (GEUOEHNLICH 12)
”:m
1070 INPUT"ANZAHL DER ZINSPERIODEN DES BERECHNUNGSZEIT RAUMS"
:n
1075 ONERRORGOTOI3000
1080 I-R/M:I“I/1M
1090 T-1 + 1:A=T
1095 IFN-1G0T01110
1100 FORX=1TOIN-I):S=A*T:A=S:NEXTX
1120 P-F/A: CLS: PR INT:PRINT:PRINT
1130 F'RINT"EIN BETRAG VON"F"D«. ABGEZINST UEBER"N"ZINSF‘ERIOD
EN,
1140 PRINT"BEI"M"JAEHRLICHEN ZINSPERIODEN UND EINEM JAHRES-2
INSSATZ
1150 PRINT"VQN"R"Z. ENTSPRICHT DEM ANFANGSUERT VON
1160 PRINT:PRINTTAB(30)USING"fl«IMUIII««.»H DM":P
1170 PRINT:INPUT"FUER EINE NEUE BERECHNUNG 'ENTER' DREIECKEN
~";A$
1180 CLS:G0T01040
1190 END
13000 CLS:IFERR/2+1=11THENPRINT"ES IST EIN FEHLER AUFGRUND E
INES VERSUCHS AUFGETRETEN,"ELSE13050
13010 PRINT"DURCH NULL ZU TEILEN. NORMALERWEISE LIEGT DAS AN
EINER
13020 PR1NT"FEHLERHAFTEN dATENEINGABE.
13030 PRINT"UIR WOLLEN NOCH EINMAL BEGINNEN. uENN sIPI SOUEIT
SIND,
1 3040 INFUT”FITTE 'ENTER' DRUECKEN - ”:At:GOT0100
13050 PRINT"EIN FEHLER IST PASSIERT. FANGEN ÜIR NOCH EINMAL
VON VORN AN.
13060 INPUT"BITTE 'ENTER' DRUECKEN - ":A$:GOTO100
159
Rückzahlung eines
Darlehens in
gleichen Raten
Rückzahlung eines Darlehens in gleichen Raten
Dieses zweite Programm für persönliche Finanzen gibt für einen in glei¬
chen Monatsraten rückzahlbaren Kredit in Abhängigkeit vom Jahres¬
zins die Höhe der einzelnen Raten an und teilt jede einzelne Rate in
Zins- und Tilgungsanteil auf. So kann man sich vom Computer ausrech¬
nen lassen, wie hoch die monatliche Belastung sein wird, wenn man eine
bestimmte Geldsumme als Darlehen aufnimmt und innerhalb einer be¬
stimmten Zeitspanne abzahlen will. Die Aufteilung der Raten in Zins
und Tilgung kann wichtig sein, wenn man zum Beispiel — was meist
möglich ist — die Zinsen von der Steuer absetzen will. Allerdings hat
dies für normale Konsumkredite keine Bedeutung, da für diese Dar¬
lehensart feste monatliche Nominalzinswerte angegeben werden, die
dann beim Finanzamt geltend gemacht werden können.
Das Programm selbst weist wie das vorherige formatierte Ausgabe der
Lösungen auf. In diesem Fall wird die dazu dienende Anweisung in Zei¬
le 4000 als String definiert, da sie mehrmals gebraucht wird (Zeilen
4140 und 41450).
1 COPYRIGHT 1978 THE HOTT0M SHELF INC.
2 ALL RIGHTS RESERVE!«. DO NOT COPY.
3 -R.0. BOX 49104 ATLANTA GA 30359
100 •'
160
4000 CLEAR: ;C=0:P=0:L=0:R=0:M-f :F*="#mS1Hf .SIPjCIS
1002 F'RINT"DIESE5 PROGRAMM ERMITTELT DIE RATEN EINES IN GI.EI
CHEN
1001 PRINT"MONATSRATEN RUECKZAHLBAREN DARLEHENS UND GIBT FUE
R
1006 PRINT"JEDE RATE DEN JEUEILIGEN ZINS- UND TILGUNGSANTEIL
SOUIE
1008 PRINT"Di: VERBLEIBENDE DARLEHENSSUMME AN. UAHLUEISE KAN
N AUCH
400? PP INT"EINE TILGUNGSRATE EINGEGEBEN WERDEN.
1010 PRINT:INPUT"DARLEHENSSUMME";F
4020 INPUT"ANZAHL DER MONATSRATEN":!.
1030 INPUT"JAHRES-ZINSSATZ (X)":R
4035 INPUT"TILGUNGSRATE (FALLS GEUUENSCHT. SONST NUR 'ENTER-
)";m
4040 I=R/1200
4050 T=1-1/(1 + 1)CL:K=P
4070 IFNO0THENGOTO4990
1075 ONERRORGOTOI3000
1030 M=P*I/T
1090 GOSUB4200
1100 FORZ-1TOL
1110 IFC<12G0T04117
4113 PRINT"DARIEHENSJAHR:"INT(Z-1)/12;
1114 PRINT" - "K"PM FÜER"L"M0NATE ZU"R”%
1115 INPUT"UEITER: ENTER - NEUE BERECHNUNG: 1 + ENTER'";C
H:IFCH=1THEN100
4116 C=0:GOSUF4200
4117 A=P+I
4130 B=H-A:P=P-B
4140 PRINTZTAB(8)USINGF$;P;:F'F; INTTAEU 20) USINGF T:M:
4150 PRINTTAB(30)l)SINGF$:B::F'RINTTAB(40)USINGFI:A
1160 C~C +1:NEXTZ
4170 PRINT:INPUT'TUER EINEN NEUEN RECHENGANG ENTER DRUECKE
N -”;A$:GOTO100
4180 END
4200 CIS
4250 F’RINT"RATE RESTLICHE MONATL. TILGUNGS- ZINS-
161
•1260 PRIHT”NUMMER PARI 'SUMME ZAHLUNG ANTEIL ANTEI
L
■1270 RETURN
13000 CLS: IFERR72 + 1 =11 THENF'RINT"INFOLGE EINES VERSUCHS, DURC
H NULL ZU TEILEN, IST EIN FEHLER"ELSE13050
13010 F'RINT"AUFGETRETEN. DAS DEUTET AUF EINE FEHLERHAFTE DAT
ENEINGABE.
13020 PRINT“DIR WOLLEN NOCH EINMAL VON VORN BEGINNEN.
13030 INPUT"UENN SIE SOUEIT SIND. BITTE 'ENTER-' DREIECKEN - "
;A$: GOTD100
13050 PRINT"ES IST EIN FEHLER AUFGETRETEN. uIR UOLLEN NOCH E
INMAL
13060 INPUT"ANFANGEN. BITTE 'ENTER"' DRUECKEN“;A$: GOTO 100
162
Effektivzins
Effektivzins
Dies ist ein sehr praktisches Programm, das aus der Höhe eines Dar¬
lehens sowie seinen Rückzahlungsbedingungen (gleiche Raten voraus¬
gesetzt) den tatsächlich geforderten Zins ermittelt, der ja bekanntlich
erheblich von dem Normalzinssatz abweichen kann. Banken sind zwar
heutzutage verpflichtet, den Effektivzinssatz anzugeben, zu dem sie
Geld an ihre Kunden verleihen. Bei anderen Stellen kann man das aber
nicht immer voraussetzen.
Als Besonderheit gewährt das Programm die Möglichkeit, nach einem
Rechengang einzelne Angaben zu verändern und damit eine neue Rech¬
nung durchzuführen. Dazu dienen die Zeilen 8150 bis 8260. Ansonsten
ähnelt es den vorherigen. Die Rechnung wird wieder nach den bekann¬
ten Zinsformeln durchgeführt.
6000 CLEAR:F=0:CLS:A$*"N5M».U# %"
6010 ONERRORGOTOt3000
6012 PRINT"DIESES PROGRAMM ERRECHNET AUS ÜAPLEHENSSUMilE SOUI
E ANZAHL,
6014 F'RINT"HOEHE UND ZEITLICHEM ABSTAND GLEICHER RUECKZAHLUN
GEN
6016 PRINT"DEN JAEHRLICHEN EFFEKTIVZINS EINES DARLEHENS. NEU
E
6018 PRINT"RECHENGAENGE LASSEN SICH NACH AENDERUNG EINZELNER
601? PRINT"ANGADEN DURCHFUEHREN.
6020 PRINT:INPUT"DARLEHENSSUMrtE (D-MARK)";PV
6025 IFF = 1GÖTO6070
6020 INPUT"ANZAHL DER JAEHRLICHEN ZAHLUNGEN";NY
6035 IFF=3GQTO6070
6040 INPUT"ANZAHL DER INSGESAMT ZU LEISTENDEN ZAHLUNGEN"IN
6045 IFF=2GOTO60?0
6050 INF'UT"HOEHE DER EINZELNEN RATEN (D-«ARK)";P
6055 IFF=4GOTQ6070
6060 CLS:PR1NT"EINEN MOMENT...
6070 I=.009
6080 I1*P/PV*<(1+1)£N-t)/(1+1 JEN
6090 1FADS(I -11)<.00020!THEN6140
6100 1=11
6110 GOT06020
6140 I=11+NY*100
6150 CLSjPRINT
6160 PRINT-EIN DARLEHEN UEBER"PV"DM f
6170 PRINT"DAS IN"N"RATEN VON JE"P"DM
6180 PR INT" BEI "NY "JAEHRLICHEN ZAHLUNGEN RÜCKZAHLBAR IST.
6190 PRINT"HAT EINEN EFFEKTIVEN JAHRESZINSSATZ VON
6200 PRINTTAB!28)USINGAi;I
6210 F=0:PRINT
6220 PRINT"UAS UOLLEN SIE FUER EINEN NEUEN RECHENGANG AENDER
N?
6230 PRINT" DARLEHENSSUMME","1
6240 PRINT" ANZAHL DER ZAHLUNGEN"."2
6250 PRINT" ANZAHL DER JAEHRLICHEN RATEN","3
6260 PRINT" HOEHE DER RATEN","4
6270 PRINT" ALLE ANGABEN",,"5
6290 PRINT:INPUT"nUHMER DER GEUl'ENSCHTEN AENDERUNG EINGEBEN"
;f
6300 IFF<1ORF>5THEN62?0
6310 ONFGOTO6020,6040,6030,6050,6000
6320 F=INT(F) :GOrC100
6999 END
13000 CLS: PRINT"EIN FEHLER IST AUFGETRETEN, VERHÜTLI CH BURC
H
13010 PRINT"FALSCHE DATENEINGABE. UIR MESSEN NOCH EINMAL
1 3020 INPUT"VON VORN BEGINNEN. BITTE ENTER ' BRUECKErP JAIsRU
N
165
Tilgungsdauer
Tilgungsdauer
Das letzte Programm dieser Gruppe ermittelt die Dauer, die man
braucht, um bei gegebener Darlehens- und Ratenhöhe sowie bekanntem
Zahlungsrhythmus und Zins (Effektivzinssatz!) ein Darlehen zurück¬
zuzahlen. Damit hat man ein weiteres Hilfsmittel zur Kalkulation einer
tragbaren Belastung durch einen aufgenommenen Kredit in der Hand.
Auch hier lassen sich für aufeinanderfolgende Rechengänge einzelne
Vorgaben ändern. Errechnet wird die Laufzeit in Bruchteilen von Jah¬
ren. Um daraus eine Angabe in Jahren und Monaten zu machen, ist eine
gesonderte Umrechnung erforderlich. Sie geschieht in den Zeilen 8139,
8140 und 8145.
166
3000 CLS:PRINT“DIESES PROGRAMM ERMITTELD DEN ZEITRAUM, DEN D
IE
8020 PR INT"RÜCKZAHLUNG EINES RATENDARLEHENS BEANSPRUCHT.
3030 PRINT'TOLGENDE ANGABEN SIND DAZU ERFORDERLICH:
8035 ONERRORGOTOI3000
8050 PRINT:INPUT"HQEHE DES DARLEHENS";OA
3055 IFF=1GOTO8090
8060 INPUT"HOEHE DER RATEN IN DM"JPT
8065 IFF=2GOTO8090
3070 INPUT"UIEVIELE ZAHLUNGEN SINH JAEHRLICH ZU LEISTEN",*PY
8075 IFF=3GOTO8090
3080 INPUT"UIE HOCH IST DER JAEHRLICHE EFFEKTIVZINSSATZ (Z)"
;IR
3090 CLS:IO=OA+IR/100/PY
8095 IFPT<=IOTHENPRINT"UNMOEGLICH! DIESE RATE DECKT NICHT EI
NMAL DIE ZINSEN. DER ZINS FUER EINE ZAHLUNGSPERIODE BETRAEG
T BEREITS"IO"DM.":GOTO8050
8100 Y=-(LOG(1-(OA*(IR/100))/(PY*PT))/<LOG(1 + (IR/100)/PY)*F’Y
))
3105 NP=Y*PY
8110 PRINT"EIN DARLEHEN UEBER"OA"DM,
8120 PRINT"RUECKZAHLBAR MIT"PY"JAEHRLICHEN RATEN UND
8130 PRINT"MIT EINEM JAEHRLICHEN EFFEKTIVZINSSATZ VON"IR"%
8135 PRINT"ERFQRDERT"INT(NP)"RATEN ZU"PT"DM";
3137 IF NPOINT(NP)PRINT:PRINT"UND EINE RESTZAHLUNG VON";:PR
INTUSING"»###.#« DH.PT*(NP-INT(NP))ELSEPRINT".
8139 YP=INT(12*(Y-INT(Y)))+1:IFYP=12YQ=INT(Y) HELSEYQ-INT(Y)
8140 PRINT"DIE LAUFZEIT BETRAEGT DAMIT"YQ"JAHRE";
8145 IF YQ=INT(Y) PRINT" UND"YP"MONATE."ELSEPRINT".
8150 PRINT:PRINT"UAS (JOLLEN SIE FUER DEN NAECHSTEN RECHENGAN
G AENDERN?
8160 PRINT'M
3170 PRINT"2
3180 PRINT"3
8190 F’RINT"4
8200 PRINT"5
dARLEHENSSUMME
HOEHE DER RATEN
ANZAHL JAEHRLICHER ZAHLUNGEN
JÄHRLICHER EFFEKTIVZINS
ALLE ANGABEN
8230 PRINT:INPUT"IHRE UAHL";F
8250 IFFOABS( INT (F ) )ORF>5THEN8230
8260 ONFGOTO8050,8060,8070,8080,8000
13000 CLS:PRINT"EIN FEHLER IST AUFGETRETEN, VERMUTLICH INFOL
GE
13010 PRINT"FALSCHER DATENEINGABE. wIR MUESSEN NEU BEGINNEN.
13020 INPUT"BITTE 'ENTER' DRUECKEN";A$:RUN
167
Kreuz und Quer
Kreuz und Quer
Dieses kleine Programm verwendet die graphische Funktion SET(x,y)
und zeichnet ohne Unterbrechung immer neue, zufällige Kreuz- und
Quer-Muster auf den Bildschirm. Ganz reizvoll zum Zuschauen, zeigt
das Programm in einfacher Weise die Einsatzmöglichkeit der Zufalls¬
funktion RND(x) im Zusammenhang mit der TRS-80-Graphik: Vom
Zufall beeinflußt werden Programmschleifen, in denen die SET-Funk-
tionen ausgeführt werden.
3 CLS: DEFINT X,Y
20 FOR X = 0 TO 127 STEP RND(10)
30 FOR Y = 0 TO 4? STEP RND(5)
40 SET (X,Y >
50 NEXT Y,X
51 GOTO 500
60 FOR X = 1 27 T0 0 STEP --RND<10>
65 FOR Y=47 T0 0 STEP -RND(5)
70 SET (X,Y )
ÖO NEXT Y,X
85 GOTO 500
90 FOR Y=0 TO 47 STEP RND(IO)
1 00
FOR X=0 TO 1
27 STEP
RND(5)
1 1 0
SET <X,Y>
1 20
NEXT X , Y
1 25
GOTO 500
1 3 0
FOR Y = 47 TO
0 STEP -
RND(10)
140
FOR X= 1 27 TO
0 STEP
-RND(5)
1 50
SET (X,Y)
1 60
NEXT X r Y
500
P = R N D ( 6 )
510
IF F'= 1 THEN
20
520
IF P = 2 THEN
60
530
IF P=3 THEN
90
540
IF P=4 THEN
1 30
550
CLS: GOTO 500
168
Rechtecke
Rechtecke
In vielen Einzelheiten ähnelt dieses Programm dem vorherigen. Auch
hier werden SET-Funktionen und RND(x) kombiniert, um zufällige
Bilder auf den Bildschirm zu malen. Nur handelt es sich dabei nicht um
irreguläre Muster, sondern Rechtecke, die gezeichnet werden. Erst wird
die Anzahl der zu zeichnenden Rechtecke festgelegt — durch den Zu¬
fallswert Q in Zeile 6. Dann folgen für jedes Rechteck Lage (A und D)
sowie die beiden Kantenlängen (B und E). In Zeile 50 erfolgt eine Über¬
prüfung, ob ein Rechteck beim Zeichnen über den Bildschirmrand
hinausragen würde — wenn ja, wird einfach ein neuer Versuch gestar¬
tet. In den beiden Schleifen Zeile 60 bis 80 und 90 bis 120 werden
dann zuerst die waagerechten, dann die senkrechten Linien des Recht¬
ecks gezeichnet. Indem in Zeile 130 P solange um 1 erhöht wird, bis
es die Größe von Q erreicht, werden soviele Rechtecke gezeichnet, wie
der Wert von Q ausmacht. Schließlich sorgt eine Warteschleife in Zeile
140 dafür, daß man sich das entstandene Bild einen Moment lang an¬
schauen kann, und das Spiel beginnt von neuem.
Insgesamt ist es ein recht einfaches Programm. Und doch werden immer
neue, optisch reizvolle Bilder auf den Bildschirm gemalt, denen man
beim Zuschauen viel Freude abgewinnen kann. Zeile 4 sorgt übrigens
für schnelleren Programmablauf, indem das DEFINT A-Z alle verwen¬
deten Zahlen zu ganzen Zahlen erklärt. Die Wirkung dieser Anweisung
erkennt man, wenn man das Programm mit RUN 6 startet (anstatt
einfach mit RUN). Dann ist Zeile 4 ausgeschaltet, und alles läuft deut¬
lich langsamer ab.
169
4 BEFINT A-Z
6 CLS: Q=RND(20)
8 RANDOM
10 A=RND(128)-1
20 B=RND(60 )
35 D=RND(48)-1
36 E=RND(20)
50 IF A+B>12? OR B+E>4? THEN 8
60 FOR X=A TO A+B
70 SET(X,D)
75 SET(X,D+E)
80 NEXT
90 FOR Y=D TO D+E
100 SET(A,Y)
110 SET(A+B,Y)
120 NEXT
130 P=P+1
140 IF P>=Q FOR 1=0 TO 2000: NEXT: CLS: P=0: O=RND<20)
150 GOTO 8
Umwandlung
Dezimalzahlen -
Hexadezimalzahlen
Umwandlung Dezimalzahlen — Hexadezimalzahlen
Dieses kleine Programm wandelt wahlweise ganze Dezimal- in Hexadezi¬
malzahlen um oder umgekehrt. Die dazu notwendigen Potenzen von 16
werden am Anfang des Programms ermittelt und dann als Variable ge¬
speichert, damit die Berechnungen schneller laufen. Dies geschieht mit
Rücksicht auf die für BASIC typische Methode, Zahlen zu verarbeiten,
besonders sorgfältig. Andernfalls könnten sich bei den wiederholten
Subtraktionen bzw. Multiplikationen kleine Fehler summieren. Berech¬
net werden bis fünfstellige Hexadezimalzahlen. Dabei werden die Nul¬
len am Anfang der Zahlen nicht unterdrückt, was eigentlich möglich
wäre: Diese Zahlen werden oft mit den Nullen geschrieben, besonders
bei der Maschinenprogrammierung, bei der diese Nullen ja auch nicht
einfach weggelassen werden können. Dezimalzahlen berechnet das Pro¬
gramm bis zur selben Höhe, also bis 16 S —1 = 1048575. Allgemein wur¬
de auch bei diesem Programm auf eine „ordentliche" Bildschirmanzei¬
ge geachtet. Durch Eingabefehler kann es nicht so leicht aus dem Kon¬
zept gebracht werden. Beides erleichtert die Arbeit mit dem Programm.
171
5 DEFINT P: DEFDBL X,Y: IHM Z$(15): FOR 1=0 TO 15: READ 2$(I
): NEXT
7 FOR 1=0 TO 4: S< I ) = INT( 1ÄCI + .2): NEXT: T = 16t5: F$="##H#tM»#
H
10 CLS: PRINT "UMRECHNUNGEN: DEZ -"CHR*(?4)" HEX 1 H
EX -"CHR$<?4)" DEZ 2
20 A$=INKEY$: IF A»="2" 480 ELSE IF A$<>"P 20
80 CLS
100 PRINTS 0,;: INPUT "DEZIMALZAHL"; X: IF X=0, 10
110 PRINTS 0, CHRS(30)
115 IF X>=T, 100
120 PRINTS 320, "DEZIMALZAHL:",,USING F*; X
130 PRINT "HEXADEZIMALZAHL:" TAB(34)
200 FOR 1=4 TO 0 STEP -1
210 P=0
220 X=X-S(I)
230 IF X<0 X=X+S(I): PRINT Z$(P)J: NEXT: GOTO 100
240 P=P + 1: GOTO 220
480 CLS
500 H$="": PRINTS 0,J: INPUT "HEXADEZIMALZAHL"; H*
510 IF H$="" 10
520 PL=LEN(H$): PRINTS 0, CHR*(30)
530 IF PL>5, 500
540 PRINTS 320, "HEXADEZIMALZAHL:" TAB<3?~PL)H$
600 Y=0: FOR 1=0 TO PL-1
630 FOR J=0 TO 15
650 IF MID$(H$,PL-I,1)“Z$(J) Y=Y+J*S(I): NEXT I: GOTO 700
670 NEXT J: GOTO 480
700 PRINT "DEZIMALZAHL:",,USING F$; Y: GOTO 500
1000 DATA 0,1,2,3,4,5,6,7,8.?,A,B,C,D,E,F
\
172
Ein-und
zweidimensionale
Matrix
Ein- und zweidimensionale Matrix
Wenn man diese beiden kleinen Programme laufen läßt, kommt jeweils
das gleiche dabei heraus: 35 verschiedene Zahlen, schön ordentlich
in fünf Reihen zu je sieben Zahlen auf den Bildschirm gebracht. Zweck
dieser Übung ist zu zeigen, daß man mit einem kleinen Kunstgriff auch
in einer eindimensionalen Matrix enthaltene Zahlen zweidimensional
ausgeben kann, d. h., in Form eines Rechtecks mit passender Zeilen-
und Spaltenzahl. Das Geheimnis liegt in der Zeile 50 des ersten Pro¬
gramms. Sie teilt die 35 Elemente der Matrix A(35) in fünf Gruppen
zu je sieben Zahlen auf, die dann jeweils in einer Zeile ausgedruckt
werden. Im zweiten Programm, das mit der zweidimensionalen Ma¬
trix A(5,7) arbeitet, ist das nicht notwendig.
Gebrauchen kann man diesen Programmiertrick zum Beispiel in Pro¬
grammen, in denen aus anderen Gründen Zahlen in Form einer eindi¬
mensionalen Matrix vorliegen und man sie ohne große Umstände als
rechteckigen Block auf den Bildschirm bringen will.
Übrigens: Die Anweisung DIM A(35) des ersten Programms ist im
zweiten nicht erforderlich und fehlt deshalb. Der Computer ordnet ja
jeder Matrix automatisch 11 Elemente pro Dimension zu (0 bis 10),
und das A(x,y) geht ja nur bis A(5,7).
10 'EINDIMENSIONALE MATRIX
20 DIM A(35)
30 FOR 1=1 TO 5
40 FOR J=1 TO 7
50 N=7*(1-1 )+J
60 A(N) = 1 +J/10
70 PRINT A(N);
80 NEXT J
90 PRINT
100 NEXT I
110 END
210 'ZWEIDIMENSIONALE MATRIX
220 FOR 1=1 TO 5
230 FOR J=1 TO 7
240 A(I f J)=I+J/10
250 PRINT A(I,J);
260 NEXT J
270 PRINT
280 NEXT I
290 END
174
Geburtstage am
gleichen Tag
Geburtstage am gleichen Tag
Wer hätte gedacht, daß von 40 zufällig ausgewählten Personen mit fast
90 %iger Wahrscheinlichkeit zwei am gleichen Tag Geburtstag haben?
Nun, dieses kurze Programm erstellt eine Liste dieser Wahrscheinlich¬
keiten für Personengruppen von 2 bis 40 Personen. Eine Möglichkeit
der Überprüfung der Angaben ergibt sich zum Beispiel auf einer Party,
wo eine mehr oder weniger bunt zusammengewürfelte Personengruppe
beisamen ist.
In Zeile 470 findet sich eine PRINT USING "...“-Anweisung, die sehr
schön die vorteilhafte Anwendungsmöglichkeit dieses Formatierungs¬
befehls zeigt. Die einzelnen Zahlen werden automatisch auf zwei Stel¬
len hinter dem Komma gerundet, und ein Prozentzeichen wird mit
einer Stelle Zwischenraum nachgestellt. Zusätzlich sind die Zahlen auf
den Dezimalpunkt ausgerichtet. Man sieht auch, daß vor dem USING
in derselben PRINT-Anweisung ruhig noch andere, zu druckende Aus¬
drücke stehen dürfen, auch Dinge wie TAB(x). Dagegen muß man mit
der Ausdehnung der PRINT-Anweisung nach dem USING Vorsicht
walten lassen — hier sind nur wenige Möglichkeiten gegeben.
410 PRINf'ANZAHL DER WAHRSCHEINLICHKEIT, DASS HINDEST
ENS
420 PRINT"PERSONEN ZUEI AH GLEICHEN TAG GEBOREN SIN
D
430 PRINT"—- --
440 0=364/365
450 FOR N=2 TO 40
460 P=100*(1-Q)
470 PRINT" "NTAB(25)USING "»».1111 X";P
480 Q=Q*(365-N)/365
490 NEXT
Snoopy
Snoopy
Die meisten Leser werden sicher von Snoopy gehört haben, dem merk¬
würdigen Hund aus den Comic Strips des amerikanischen Zeichners
Charles M. Schulz. Snoopy hat eine sehr lebendige Phantasie und
träumt davon, ein berühmtes Flieger-As im ersten Weltkrieg zu sein,
der sich mit dem deutschen Flieger-As Baron von Richthofen — bekannt
als der "Rote Baron" — aufregende Luftkämpfe liefert. Davon handelt
auch dieses Programm: Es wird die Figur des Snoppy schwarz auf weiß
gezeichnet, der mit einer Fliegermontur bekleidet sein soll, sowie seine
Hundehütte, die in seiner Phantasie sein Flugzeug darstellt. Die Hunde¬
hütte wird getroffen, worauf Snoopy ausruft: „Verdammter Roter Ba¬
ron!" Dies wiederholt sich zehnmal, dann erscheint die ganze Zeich¬
nung noch einmal als Negativ, Snoopy verwünscht noch einmal seinen
Gegner und das Programm beginnt von vorn.
Allzu faszinierend ist das ganze wohl nicht gerade, doch wurde dieses
Programm eigentlich auch aus einem anderen Grund in dieses Buch auf¬
genommen: Hier kann man sehr schön sehen, wie sich Daten mit Hilfe
der READ-Anweisung und DATA-Zeilen in einem Programm raumspa¬
rend unterbringen und auch gliedern lassen. Aufgabe ist es ja, eine
Zeichnung auf den Bildschirm des Computers zu bringen. Die einfachste
Lösung wäre es, für jeden Bildpunkt die jeweiligen waagerechten und
senkrechten Koordinaten, die für die SET- bzw. RESET-Anweisung
nötig sind, in den DATA-Zeilen zu speichern, so daß sie durch READ-
Befehle übernommen und in das gewünschte Bild umgewandelt wer¬
den können. Dazu wären pro Bildpunkt also zwei Zahlen erforderlich
— ein ziemlicher Aufwand. Dieses Programm kommt mit wesentlich
weniger Daten aus, indem es das Bild zunächst zeilenweise aufbaut,
d. h. jeweils alle Punkte mit derselben senkrechten Koordinate zusam¬
menfaßt und diese Koordinate nur einmal angibt. Darüberhinaus wer-
176
den von waagerechten Linien nicht alle Punkte, sondern nur Anfangs¬
und Endpunkte angegeben. Um aus diesen Angaben das Bild aufzu¬
bauen, muß der Computer bei den Zahlen der DATA-Zeilen waage¬
rechte und senkrechte Koordinaten unterscheiden können und außer¬
dem normale Bildpunkte von den Anfangs- und Endpunkten der
waagerechten Linien trennen. Dieses Problem ist folgendermaßen ge¬
löst:
Die senkrechte Koordinate aller auf einer Höhe liegenden Bildpunkte,
die gleichbedeutend ist mit der jeweiligen Zeilennummer, wird nicht
in ihrer eigentlichen Form im Bereich 0 bis 47 angegeben, sondern als
negative Zahl. Auch die Anfangs- und Endpunkte der waagerechten
Linien erscheinen nicht in ihrer wahren Gestalt, sondern durch 1000
dividiert als Dezimalbrüche. Daran kann der Computer diese verschie¬
denen Zahlen erkennen — das geschieht in den beiden Zeilen 16220
und 16230 — und nach entsprechender Umformung in richtiger Wei¬
se einsetzen. In den Zeilen 16430 und 16440 wird der Vorgang für das
Negativbild wiederholt.
177
Auch das Ende des READ-Vorgangs muß signalisiert werden, da sich
die Anweisungen dafür in einer endlosen Schleife befinden. Dazu
dient die Kennzahl 3500, die das Ende der unter DATA zusammenge¬
faßten Daten bildet. Trifft der Computer auf diese Zahl, bricht er den
Lese- und RESET- bzw. SET-Kreislauf ab und fährt mit dem Pro¬
gramm fort (Zeile 16210 bzw. 16420).
Man sieht also, auch in den DATA-Zeilen lassen sich außer den eigent¬
lichen Zahlen auch noch weitere, für das Programm wichtige Informa¬
tionen unterbringen, die in diesem Fall dazu dienen, die Menge der
nötigen Punktkoordinaten zum Zeichnen eines Bildes zu verringern.
Selbstverständlich lassen sich auch noch viele andere Anwendungen der¬
artiger Datenorganisation denken — auch bei der Speicherung von
Strings in DATA-Zeilen.
16000 'COPYRIGHT 1978 THE BOTTOM SHELF INC.
16010 ■'ALL RIGHTS RESERVED BO NOT COPY
16020 -'P.O. BOX 49104 ATLANTA GA 30359
16200 CLS:CLEAR500:A$=STRING$(63,CHR$(191)):F0RX=1T015:PRINT
A$:NEXTX:PRINTA$;
16210 READA:IFA=3500THENGOTO16300
16220 IFA<0THENY=-A:GOTO16210
16230 IFA<1THENB=A*1000:READA:C=A*1000:F0RX=BT0C:RESET(X,Y)!
NEXTX:G0T016210
16240 X=A:RESET(X,Y):GOTO16210
16300 FORX=1TO10:RESET<111,25):RESET(106,28):RESET(100,31):R
ESET(94,24):F0RS = 1TO300:NEXTS:PRINT0276," * * VERBANNTER ROT
ER BARON! * * "::F0RS=1TO300:NEXTS:T»=STRING*(33,CHR$(191)):
PRINT0276,T$;:SET(111,25):SET(106,28):SETH 00,31):SET(94,24)
16350 FORS=1TO300:NEXTS,X
16400 FORX=1TO1000:NEXTX:CLS
16410 RESTORE
16420 READA:IFA=3500THENFORX-1TOI000:NEXTX:GOTO16500
16430 IFA<0THENY=A*-1:GOTO16420
16440 IFA<1THENB=A*1000:REABA:C=A*1000:FORX=BTOC:SET(X,Y):NE
XTX:G0T016420
16450 X=A:SET(X,Y):GOTO16420
16500 PRINT8275," * * VERBANNTER ROTER BARON' * * ”;:F0RX=1T
178
02000:NEXTX:GOT016000
16900 DATA-1,.032,.034,-2,.026,.031,35,-3,.023,.025,32,36,-4
,.021,.023,31,33,35,37,38,-5,18,19,29,30,34,.039,.050,-6,18,
27,28,35,36,37,51,52,-7,17,.023,.027,32,33,34,53
16910 DATA-8,17,23,27,30,31,36,37,.054,.057,-9,17,.023,.027,
29.. 055..057,-10,18,27,28,54,-1 1 ,19,27,.037,.053,-12,20,21 ,2
7,36,37,-13,22,23,27,36,-14,24,25,27,36,37,-15,.026,.049
16920 DATA-16,24,25,26,27,33,-17,22,23,.028,.033,44,45,47,49
,-18,21,22,26,27,34,42,43,46,48,50,51,-19,19,20,24,25,26,35,
40,41 ,50,51 ,-20,17,18,22,23,25,26,36,42,49,50,-21,15,16,21 ,2
4.25.25.37.41.45.46.47.. 091..113
16930 DATA-22,12,13,19,20,22,23,24,38,39,40,44,45,90,113,-23
,11,17,18,21,23,38,39,42,43,89,114,-24,9,10,16,17,19,20,22,3
4,35,37,40,41,88,115
16940 DATA-25,7,8,14,15,18,21,38,39,41,87,1 16,-26,7,12,13,17
,20,.034,.037,42,86,117,-27,6,10,12,16,19,42,.085,.118,-28,5
,8,11,15,19,42,88,115
16950 DATA-29,4,6,14,9,19,41,88,115,-30,4,5,8,12,18,19,41,88
,115,-31,8,9,10,11,.017,.021,41,88,115,-32,17,18,19,21,40,88
,115,122,-33,15,17,16,18,22,39,84,88,115,117,122
16960 DATA-34,14,15,16,17,22,36,37,80,84,88,115,117,120,122,
»35,1 4,15,22,28,29,35,80,82,84,.088,. 1 15,1 1 7,1 20,122,124,-36
,12,13,14,21,27,29,34,-37,12,.014,.017,20,21,25,26,29,35
16970 DATA-38,12. 17, 18.19,24,29,36,.040,.044,-39,13,21,22,23
,30,.036,.039,44,-40,14,15,21,22,23,31,43
16980 DATA-41,16,17,24,30,41,42,-42,.018,.024,29,39,40,-43,.
030,-037,3500
179
Autorennen
Dieses Programm erzeugt auf dem Bildschirm des TRS-80 ein Renn¬
wagenspiel ähnlich denen, die man von den TV-Spielgeräten her kennt.
Ein Rennwagen fährt auf einer Straße und in regelmäßigen Abständen
tauchen Hindernisse auf, denen das Auto ausweichen muß. Gelingen
diese Ausweichmanöver, ohne daß man auf die Fahrbahnbegrenzungen
gerät, erhöht sich die Fahrtgeschwindigkeit in zwei Stufen. Bei jeder
Karambolage wird wieder auf das langsamste Tempo zurückgeschaltet.
Am Anfang werden auch noch die Steuerbefehle für den Rennwagen
gezeigt: "Z" für "nach links", "/" für "nach rechts" und die Leertaste
für „geradeaus".
Auf anschauliche Art und Weise zeigt dieses Programm die graphischen
Möglichkeiten, die der TRS-80 zusammen mit den Zeichenketten
bietet. Wie bei einem Zeichentrickfilm sind zum Beispiel von den
Fahrbahnbegrenzungen jeweils sechs Bewegungsphasen durch Zusam¬
menfügen von graphischen Zeichen und Cursor-Kontrollfunktionen
zu einzelnen Strings vorhanden (Z(0) bis Z(5) ). Sie werden nach¬
einander durch einfache PRINT-Befehle gezeigt und vermitteln dadurch
den Eindruck der Bewegung. Für die Hindernisse gibt es insgesamt 48
verschiedene Zeichenketten, die in ansteigender Länge nacheinander
erscheinen und ein sich nach unten auf dem Bildschirm bewegendes
Hindernis ergeben, obwohl sie immer an derselben Stelle am oberen
Bildschirmrand anfangen: Vor den eigentlichen, sichtbaren graphi¬
schen Zeichen werden immer mehr „neue Zeilen-Anweisungen" (Code¬
zahl: 26) geschaltet. Schließlich ist auch der Rennwagen selbst eine
einzelne Zeichenkette, zusammengesetzt aus acht String-Komponenten
(Zeile 100).
Das ganze, aufwendige und auch speicherraumzehrende Zeichenketten-
Zusammenfügen hat den Sinn, beim tatsächlichen Spielablauf mit so-
180
wenig PRINT-Anweisungen wie nur möglich auszukommen und die¬
sen Teil des Programms auch sonst möglichst einfach zu gestalten, da¬
mit eine einigermaßen attraktive Fahrgeschwindigkeit des Autos dabei
herauskommt. Leider zeigen sich hier aber trotzdem deutlich die Gren¬
zen eines Computers mit BASIC-Interpreter, der ja das Programm Zeile
für Zeile erst übersetzt und dann ausführt.
1
1
1
1
1
1
1
1
1
mmm\
i
i
i ;
Besser geeignet wäre eigentlich ein entsprechendes Maschinenpro¬
gramm — wie bei allen Vorgängen, bei denen es in erster Linie auf
Schnelligkeit ankommt. Immerhin gibt das Programm einen guten Ein¬
druck von den eleganten Programmiertechniken, die mit dem Level
I l-BASIC auf graphischem Gebiet möglich sind.
Noch zwei Anmerkungen: Will man das Spiel etwas schwieriger ma¬
chen, kann man die Breite des Hindernisses vergrößern ; sie verbirgt
sich hinter der Zahl 16 in den Zeichenketten ZH(0,0) bis ZH(5,0).
Dann muß man allerdings auch entsprechend den Spielraum der mög¬
lichen Positionen des Hindernisses verändern (RND10) in Zeile 500)
sowie auch die Bedingungen für einen "Unfall" des Rennautos, die
sich in der Zeile 540 befinden.
Die erste dieser Bedingungen (von links) bedeutet „Anstoß links",
die zweite „Anstoß rechts" und die drei übrigen zusammen „Zusam¬
menstoß mit dem Hindernis". Die in dem Programm gewählte Schreib¬
weise ist dabei wie schon an anderer Stelle ausgeführt, nicht die einzig
mögliche. Es geht auch so: IF (P< =658)+(P>=682)+(J=5)*(P>=PR+638)
*(P< = PR+655) THEN 1000.
Dabei ist zu beachten, daß wie bei gewöhnlichen Rechenausdrücken
auch bei solchen logischen Ausdrücken Punktrechnung vor Strich¬
rechnung geht, also "*" vor"+".
1 'COPYRIGHT 197? STUEBS
3 CLS: CLEAR 5000
5 PRINT015, ”* * * AUTORENNEN * * *
7 PRINT:PRINT: PR INT"'Z' = NACH LINKS":PRINT:PRINT"'/' = NACH
RECHTS":PR INT:PRINT"LEERTASTE = GERADEAUS
10 DEFSTR Z: DEFINT I,J,H,P,S
15 ZS=CHR$(136)+STRING$(2 f 153)+CHR$(26)+STRING$(3,8)+CHR*(13
6) +STRING4(2,153)
20 D$=CHR$(26): C$=CHR$(27): Bt=CHR$<8): BB$=STRINGi(16,8)
25 ZA=CHR*(131 )+D$ + B$: ZB=CHR$(143)+D$+B$: ZC=CHR$(188)+D$+B
$: ZD=CHR$(176)+D$+B$: ZE=CHR$(191)+D$+B$+CHR$(128)+D$+B$
30 Z(0)=ZA+ZC+ZA+ZC+ZA+ZC+ZA+ZC+ZA+ZC+ZA+ZC+ZA+ZC+ZA+CHR$(18
8 )
35 Z(1)=ZB+ZD+ZB+ZD+ZB+ZD+ZB+ZD+ZB+ZD+ZB+ZD+ZB+ZD+ZB+CHR$(17
6 )
40 Z(2)=ZE+ZE+ZE+ZE+ZE+ZE+ZE+CHR$(191)+D$+B$
45 Z(3)=ZC+ZA+ZC+ZA+ZC+ZA+ZC+ZA+ZC+ZA+ZC+ZA+ZC+ZA+ZC+CHR$(13
1)
50 Z(4)=ZD+ZB+ZD+ZB+ZD+ZB+ZD+ZB+ZD+ZB+ZD+ZB+ZD+ZB+2H+CHR$(14
3)
55 Z(5)=CHR$(128)+D$+B4+ZE+ZE+ZE+ZE+ZE+ZE+ZE+CHR$< 191)
90 P=670: S=1
100 ZZ="N"+CHR$(191)+"#"+CHRf(26)+STRING$(3 r 8)+"#"+CHR$(191)
rr
110 Z0=" "+CHR$(26)+STRING$(3,8)
200 ZH(0 f 0)=STRING$(16,129)+C$+BB$+STRING$(16,152)+C$+BB$
205 ZH<1,0)=STRING$(16,137)+C$+BB*+STRING$(16,144)+C$+BB$
210 ZH(2,0)=STRING*(16,153)+Ct+BB$+STRING$(16,128)+C$+BB$
215 ZH(3,0)=STRINGf(16,152)+D$+BB$+STRING$(16,129)+C$+C$+BB$
220 ZH(4,0)=STRING$(16,144)+H$+BB$+STRING$(16,137)+C$+C$+B&$
225 ZH(5,0)=STRINGi(16,128)+D$+BB$+STRING$(16,153)+C*+C$+BB$
300 FOR 1=0 TO 5
310 FOR J=1 TO 7
320 ZH(I,J)=STRINGi(J*2,26)+ZH(I,0)
330 NEXT J,I
350 CLS
500 PR=18+RND(10): FOR J=0 TO 7: PRINT0 979, “
FOR I=S-1 TO 5 STEP S: PRINT0 18, Z<I);: PRIN
re 44, ZU);: PRINT0 PR, ZH(I,J);
520 ZI=INKEY$: IF ZI="Z n M=-S ELSE IF Zl="/" rt=S ELSE IF ZI=
" " N=0
540 PRINT0 P, ZO;: P=P+h: PRINT0 P, ZZ;: IF P<=658 OR P>=682
OR (J=5)+(P>=PR+638)+(P<=PR+655)=-3 THEN 1000
550 11=11+1: IF 11=100 S=2 ELSE IF 11=200 S=3
600 NEXT I,J: GOTO 500
1000 FOR 12=1 TO 50: PRINT0 P, ZS;: PRINT0 P, ZZ;: NEXT
1010 M=0: 11=0: S=1: IF P<=658 P = 65? ELSE IF P>=682 F'=681
1020 CLS: GOTO 600
183
Balkengraphik
Balkengraphik
Dieses Programm zeichnet eine graphische Darstellung von eingegebe¬
nen Werten alsBalkengraphik auf den Bildschirm des Computers. Dabei
können Anzahl der Balken, Bezeichnungen und Skala der senkrechten
y-Achse innerhalb gewisser Grenzen frei gewählt werden. Richtige An¬
ordnung der gewünschten Wörter, Skaleneinteilung und Verteilung der
Balken auf den zur Verfügung stehenden Raum besorgt das Programm
automatisch. Für die y-Achse gibt es vier mögliche Einteilungen: 3,
4, 6 und 13 Teilstriche - entsprechend der 16-zeiligen Bildschirmauf¬
teilung. Für die zugehörigen Zahlen stehen 2 Stellen (und eine Stelle
für eventuelle Minuszeichen) zur Verfügung. Für Dezimalbrüche ist
damit im allgemeinen kein Platz, was man bei der Festlegung des Werte¬
bereichs berücksichtigen muß.
184
IMS UILLST DU AEWERN?
| - EIHCIT X-ACHSE
2 - Einen Y-ACHSE
3-KUDBH.
4 - BALKEHEZEICrtUCEN
5 - UNTERE GRENZE SR Y-WTE
i - OBERE GRENZE SR Y-tfRTE
7 - EINTEILUNG SR Y-ACHSE
8 - BALKEJIERTE
9 - PLUS KLAR
BITTE GEUENSCHTE ZML EINGESN? .
Ein wenig mehr Platz hat man sich für die Zahlen an der senkrechten
Achse geschaffen, indem man in den Zeilen 230 und 310 jeweils den
Ausdruck USING " # # # in die PRINT-Anweisung einfügte. Dann
sind zwar Brüche ausgeschlossen, aber man kriegt auch 3-stellige Zahlen
unter, allerdings ohne Minuszeichen. Darüberhinaus sind Zahlen mit ver¬
schiedener Stellenzahl dann richtig ausgerichtet. Und man braucht sich
auch nicht mehr darum zu kümmern, ob die Achseinteilung ganze Zah¬
len ergibt — die USING-Funktion sorgt ja gleichzeitig für die Rundung
der Zahlen auf das angegebene Format.
Die Zahl der Balken ist auf 12 begrenzt. Theoretisch wären auch noch
mehr möglich, aber die Aufteilung der Balken auf dem Bildschirm
würde bei entsprechend geändertem Programm nicht mehr so schön
klappen. Das Programm fragt am Anfang auch nach Bezeichnungen
für x- und y-Achse (waagerecht und senkrecht). Auf den Namen für die
x-Achse muß man bei mehr als 3—4 Balken im allgemeinen verzich¬
ten (durch einfaches ,,ENTER"-Drücken), weil er neben den Balken¬
namen keinen Platz mehr hat. Überhaupt müssen diese Bezeichnungen
185
natürlich um so kürzer werden, je mehr Balken man verwendet. Da die
verschiedenen Wörter in der Graphik außerdem Zeichenketten (Strings)
darstellen, kann einem bei vielen und langen Bezeichnungen der vom
Computer automatisch reservierte String-Speicherraum ausgeben, und
er reagiert mit der Fehlermeldung ?OS ERROR IN (Zeilennummer).
Dem kann ein CLEAR 100, irgendwo am Anfang des Programms ein¬
gefügt, abhelfen.
Das Programm läßt sich gut einsetzen, wenn man irgendwelche gra¬
phischen Darstellungen benötigt. Dafür kann man dann den Bildschirm
abfotographieren. Auch läßt sich das Programm vorteilhaft in andere
Programme einbauen, wenn man eine solche Darstellung darin auftre¬
tender Werte wünscht. Dazu müssen allerdings die Programmzeilen ent¬
sprechend abgeändert werden, in denen Angaben vom Benutzer ver¬
langt werden. Diese Werte soll ja nun das übergeordnete Programm lie¬
fern.
10 CLS
15 DIN HU(12), BN$<12>
20 PRINT"BALKENGRAFIK
25 PRINT".—
30 PRINT: INPUT"EINHEIT X-ACHSE H ;X$
40 INPUT"EINHEIT Y-ACHSE“;Y»
50 INPUT"ANZAHL DER BALKEN";BZ
60 PRINT"BEZEICHNUNG DER EINZELNEN BALKEN:
70 FOR 1=1 TO BZ
80 PRINT"BALKEN NR."IJ: INPUT BN*(I)
90 NEXT
100 INPUT"UNTERE GRENZE DER Y-UERTE"JYU
110 INPUT"OBERE GRENZE DER Y-UERTE ";Y0
120 INPUT"EINTEILUNG DER Y-ACHSE (ANZAHL DER tEILSTRICHE)"JYT
125 GOSUB 4000
130 PRINT"UERTE FUER DIE EINZELNEN BALKEN:
140 FOR 1=1 TO BZ
150 PRINT"BALKEN NR."I;: INPUT BU(I)
160 NEXT
190 CLS
200 YB=Y0-YU
210 PRINT01023-LEN(X$)»X$ J
220 PRINT00,Y$
230 PRINT0896, USING "MIT; YU;
250 IF YT=13 H=1 ELSE N=12/YT
300 FOR 1=1 TO YT
310 PRINT? 896-I*64*H, USING "#««"; YU+I*YD/YT;
320 NEXT
500 FOR Y=3 TO 42: SET(8,Y): SET(9,Y): NEXT
530 FOR X=7 TO 127: SET(X,43): NEXT
560 FOR 1=1 TO YT: SET(7,43-3*1»N): NEXT
600 XD=60/BZ
610 FOR 1=1 TO BZ
620 PRINT0965+XD/2+11-1)*XB-LEN<BN$(I))/2,BN$(I)J
630 NEXT
700 FOR 1=1 TO BZ
710 FOR X=10 + XD/2+2*(I-1)*XD TO 10+3*XD/2+2*<1-1)*XD
720 IF HOI GOTO 740
730 FOR Y=43-39*(BU(I)-YU)/YD TO 43: GOTO 750
740 FOR Y=43-36*(BU(I)-YU)/YD TO 43
750 SET(X, Y)
760 NEXT Y,X,I
1000 S$=INKEY$: IF S$= H " THEN 1000
1100 CLS: PRINT"UAS WILLST DU AENBERN?
1110 PRINT: PRINT"1 - EINHEIT X-ACHSE
1120 PRINT"2 - EINHEIT Y-ACHSE
1130 PRINT"3 - BALKENZAHL
1140 PRINT"4 - BALKENBEZEICHNUNGEN
1150 PRINT"5 - UNTERE GRENZE DER Y-UERTE
1160 PRINT"6 - OBERE gRENZE DER Y-UERTE
1170 PRINT"? - EINTEILUNG DER Y-ACHSE
1180 PRINT"8 - BALKENUERTE
1190 PRINT"9 - ALLES KLAR
1200 PRINT: INPUT"BITTE GEUUENSCHTE ZAHL EINGEBEN";U
1210 CLS: ON U-1 GOTO 1400,1500,1600,1700,1800,1900,2000,190
1300 PRINT"EINHEIT X-ACHSE: "X$;:INPUT" - NEU";X$: GOTO 1100
1400 PRINT"EINHEIT Y-ACHSE: "Y$;:INPUT" - NEU";Y$: GOTO 1100
1500 PR INT"BALKENZAHL:"BZ;:INPUT" - NEU";BZ: GOTO 1100
1600 FOR 1=1 TO BZ
1610 PRINT"BALKENNAHE NR."I":"BN$(I);:INPUT" - NEU";BN$(I)
1620 NEXT: GOTO 1100
1700 PRINT"UNTERE GRENZE DER Y-UERTE:"YU;:INPUT" - NEU"JYU: G
OTO 1100
1800 PRINT"OBERE GRENZE DER Y-UERTE:"YO;:INPUT" - NEU";YO: GO
TO 1100
1900 PRINT"EINTEILUNG DER Y-ACHSE:"YT;:INPUT" - NEU";YT: GOSU
187
B 4000: GOTO 1100
2000 FOR 1=1 TO BZ
2010 PRINT"BALKENUERT NR.“I":"BU(I);:INPUT" - NEU";BU<I)
2020 NEXT: GOTO 1100
4000 IF (YT=3)+(YT=4)+(YT=6)+(YT=13)=0 INPUT"NUR 3, 4, 6 OBER
13 TEILSTRICHE, BITTE! - NOCHMAL";YT: GOTO 4000
4010 RETURN
188
Startrek
xj« xxx m xxx xxx x« xxx m mm mm m, m « **
'^mmmmmmm mmmmmm,m.m
XXXXXXXXXXXXXXX500 500 500 mm mmmmmm
»« »ex»«»w»« 388 100100 mmmmmmm,m
KURS XXX
ÖUAIftAHT 7 - 4
SEKTOR 7-3
SCHAENSBERICHT
I SPRUNG . ft
IlfULS ft
PHASER ft
ANTRIEB
2744.91 STDNTftG
GPUEJ1 ZUSTfND
9992.11 OCPGIE
»0« SCHM
15 TORPOOS
43 KLINGOrOI
93 PEST-ZEIT
27.87 ST REST
CdfUTER*. ERUPfni MC1SUHG
JEFEH:.
189
Startrek
Dieses Programm ist unter Computerfachleuten eines der beliebtesten
Spiele. Es existiert in vielen Varianten und wird vielfach auch vom Be¬
dienungspersonal großer, kommerzieller Computer gespielt. Diese
Version ist auf den TRS-80 zugeschnitten und weist einige reizvolle
Besonderheiten auf, die man nicht oft findet. Als ungewöhnlich um¬
fangreiches Programm füllt es den freien Speicherraum eines TRS-80
mit 16-K-RAM fast vollständig aus.
„Startrek" ist der amerikanische Name für die Science-Fiction-Fernseh-
serie, die in der Bundesrepublik unter dem Namen „Raumschiff Enter¬
prise" bekannt ist und in der Commander Kirk, Mr. Spock und all
die anderen Helden vielfältige Weltraumabenteuer zu bestehen haben.
Dies ist auch das Thema des Spiels — als Commander der Enterprise
fliegt man durch den Weltraum und muß die Raumschiffe der feind¬
lichen Klingonen aufspüren und vernichten. Wenn einem das gelingt,
hat man die Galaxie gerettet und wird (hoffentlich!) zum Admiral
befördert. Andernfalls geht die Enterprise verloren — und damit auch
das Spiel.
Nach Start des Programms erscheint für kurze Zeit die Mitteilung
„Instrumente angeschaltet — Kommando-Übernahme in 4 Sek." und
dann — als eigentliches Objekt des Spiels — der Kommandostand des
Raumschiffs.
Das Monitorbild enthält zunächst einmal Informationen über die
nähere und weitere Umgebung der Enterprise: Der Weltraum, in dem
das Raumschiff operiert, ist in 64 Quadranten zu je 64 Rektoren ein¬
geteilt. Im Zentrum des Bildschirms ist der Quadrant abgebildet, in
dem sich die Enterprise gerade befindet. Die 64 Sektoren dieses Qua¬
dranten bilden eine 8 x 8-Matrix; darin erscheint die Enterprise als
E, Sterne als * und feindliche Klingonen-Schiffe, kurz Klingonen ge¬
nannt, als K. Es gibt auch einige wenige Raumstationen, die die Enter¬
prise aufsuchen kann, um Energie nachzutanken und Reparaturen aus¬
führen zu lassen. Sie werden als ! dargestellt. Leere Sektoren erschei¬
nen als —.
Sämtliche 64 Quadranten des Operationsgebietes finden sich im obe¬
ren Teil des Bildschirms — zunächst jeweils als XXX. Für beide An-
190
Ordnungen, Quadranten sowie Sektoren des einen Quadranten, der
in der Bildschirmmitte dargestellt ist, gilt ein 8 x 8 - Koordinatensy¬
stem, das in der linken oberen Ecke beginnt, dort also die Position
1,1 hat. Dabei sind die oberen 16 Quadranten links auf dem Bild¬
schirm zu finden, die unteren 16 rechts.
Des weiteren finden sich Informationen über den Zustand des Raum¬
schiffes auf dem Monitor: Links oben neben dem zentralen Quadran¬
tenbild zunächst der Kurs, den das Raumschiff gerade fliegt oder zu¬
letzt geflogen ist, als dreistellige Zahl in der üblichen Gradeinteilung,
nämlich 000 für senkrecht nach oben, 090 für nach rechts, 180 für
abwärts und 270 für nach links (sowie natürlich auch alle Zwischenwer¬
te). Darunter die Position der Enterprise in Quadranten- und Sektoren-
Koordinaten. Dann folgt der sogenannte Schadensbericht — Angaben
über Schäden, die die beiden Antriebe „Sprung" und „Impuls" sowie
die „Phaser"-Strahlwaffe im Kampf mit den Klingonen davongetragen
haben (ausgedrückt in %). Schließlich als letzte Angabe auf der linken
Seite des Bildschirms die Antriebsart, die gerade verwendet wird, bzw.
wurde. Rechts oben das Datum, als Sterntag angegeben (ohne Bedeu¬
tung für das Spiel), dann der Zustand des Schiffes: Hier gibt es drei
Möglichkeiten — ROT, wenn sich Klingonen im selben Quadranten
mit der Enterprise befinden, GRÜN, wenn keine Klingonen in der
Nähe sind und DOCK, wenn die Enterprise an einer Raumstation ange¬
legt hat. Darunter folgen nacheinander die noch verfügbare Energie¬
menge, die Ladung der Abwehrschirme, die noch vorhandenen Tor¬
pedos, die im Operationsgebiet der Enterprise insgesamt vorhandenen
Klingonen, die zur Eingabe eines Befehls noch verfügbare Zeit und
schließlich die Zeit in Sterntagen, die zur Vernichtung der Klingonen-
Streitmacht insgesamt verbleibt.
Am unteren Bildschirmrand meldet sich der Bordcomputer der Enter¬
prise mit Informationen über Vorgänge im Raumschiff, Fortgang des
Kampfes usw. Rechts unten werden die Befehle des Kommandanten
vor Eingabe angezeigt.
191
Im Verlauf des Spiels hat man verschiedene Möglichkeiten, auf die
Aktionen des Raumschiffs Einfluß zu nehmen. Dazu nimmt der Bord¬
computer entsprechende Befehle entgegen: Um die Enterprise zu be¬
wegen, gibt man den Befehl FLUG ein und drückt ENTER (das muß
man nach jeder Anweisung). Darauf fragt der Computer nach einem
Kurs (dreistellige Zahl zwischen 000 und 359), der Flugweite (Anzahl
der Sektoren) und der Antriebsart. Hier gibt es „Sprung" oder „Im¬
puls", was man durch S oder I wählen muß. Die beiden Möglichkei¬
ten unterscheiden sich dadurch, daß der Sprung mehr Energie ver¬
braucht, der Impuls dafür mehr Zeit (Sterntag-Anteile). Außerdem
muß ein Sprung mindestens über 8 Sektoren gehen (womit man immer
in den nächsten Quadranten kommt). Gerät die Enterprise auf ihrer
Fahrt über den Rand ihres Operationsgebiets, erfolgt entweder ein
Sprung in eine zufällige Position, oder man landet im Hyperraum. Dann
kann man einen Rücksprung durch Wahl einer Zahl zwischen 1 und 9
versuchen — mit etwas Glück kommt man daraufhin in den bekannten
Weltraum zurück.
Die zweite Anweisung heißt SUCH und veranlaßt den Bordcomputer,
die umliegenden Raumquadranten nach Sternen, Klingonen und gege¬
benenfalls einer Raumstation abzusuchen. Als dreistellige Zahlen wird
das Ergebnis im Quadrantenfeld anstelle der XXXe oben am Bildschirm
angezeigt. Dabei bedeutet die erste Ziffer die Anzahl der Sterne in
einem Quadrant, die zweite die Anzahl der Raumstationen (nur 0
oder 1), die dritte die Klingonenzahl. Nach dem SUCH-Befehl kann
man auf dem Quadrantenfeld auch die Enterprise-Position erkennen,
weil das Raumschiff im Zentrum der abgesuchten Region steht. Um die
Klingonen zu bekämpfen, was jeweils innerhalb eines Quadranten
möglich ist, hat die Enterprise zwei Waffensysteme, Raumtorpedosund
die Phaser-Strahlen. Diese Waffen aktiviert man mit den Befehlen TORP
bzw. PHASER. Bei den Torpedos wird anschließend nach den Ziel¬
koordinaten gefragt, die Phaser muß man mit einem Teil der vorhande¬
nen Energiemenge laden. Der Abschuß erfolgt dann automatisch. Wäh¬
rend die Torpedos das Ziel immer vernichten, können Klingonen ei¬
nen Phaserangriff bei ungenügender Energiemenge überstehen und zu¬
rückschießen. Hier spielt die Entfernung zu dem Ziel bzw. den Zielen
eine Rolle. Dann werden die Antriebe oder das Phasersystem teilweise
192
oder ganz außer Gefecht gesetzt, was dann im Schadensbericht (links
auf dem Bildschirm) erscheint.
Davor kann man sich aber durch Laden der Abwehrschirme schützen,
was durch die Anweisung SCHIRM und ebenfalls Angabe einer Ener¬
giemenge geschieht.
Schließlich kann man noch an eine Raumstation anlegen, wenn man das
Raumschiff in einen benachbarten Raumsektor manövriert hat. Das
geschieht durch den Befehl DOCK, allerdings nur, wenn zuvor die Schir¬
me entladen wurden — durch SCHIRM und die Energieangabe 0. Im
gedockten Zustand wird das Schiff mit Energie und Torpedos geladen
und beschädigte Einrichtungen werden instand gesetzt.
Der Start des Raumschiffs zum Spielanfang geschieht durch den Befehl
XX. Man hat dann insgesamt 30 Sterntage zur Verfügung sowie 10000
Einheiten Energie und 15 Torpedos. (Letztere lassen sich ja an den
Raumstationen nachladen, doch die Zeit läuft unaufhaltsam weiter.)
Auch muß jeder Befehl innerhalb einer bestimmten Zeitspanne erteilt
werden. Jede Handlung des Spielers kostet Zeit und Energie, Bedie¬
nungsfehler werden meistens mit Zeitabzug bestraft. Wenn Zeit oder
Energievorräte zu Ende sind, ehe alle Klingonen vernichtet werden
konnten, gilt das Spiel als verloren.
Das Programm Startrek ist eines der längsten und kompliziertesten,
die überhaupt in einem TRS-80 mit 16-K-Speicher Platz finden. Deshalb
dürfte das Programmieren über die Tastatur des Computers sehr viel
Ausdauer und Sorgfalt erfordern. In diesem Extremfall ist es vielleicht
sogar ganz gut, wenn man nicht versucht, das ganze Programm auf ein¬
mal einzutippen, sondern etappenweise vorgeht und das Erreichte im¬
mer wieder auf eine Cassette überspielt. Zu leicht schleichen sich bei
nachlassender Konzentration Flüchtigkeitsfehler ein, die später sehr
schwer zu finden sind.
Bemerkenswert an diesem Programm ist die Routine zur Übernahme
von Eingaben durch den Spieler: Um die Zeit für eine Eingabe begren¬
zen zu können, aber trotzdem mit dem üblichen System mit der
ENTER-Taste zu arbeiten, hat man die direkte Datenübernahme mit
INKEY$ herangezogen, aber in einer Form, die das System mit ENTER
nachahmt (Zeilen 4010 und 4015).
Eine letzte Bemerkung: Ursprünglich wurde das Programm in einer ge¬
ringfügig anderen BASIC-Version geschrieben, als die Radio Shack-
Computer jetzt verwenden. Deshalb findet man darin verschiedentlich
den Ausdruck von der Art STRING$(30, CHR$(131)). Er ist gleichbe¬
deutend mit STRING$(30,131) und kann beim Programmieren natür¬
lich auch jeweils ersetzt werden. Daneben sind in Zeile 100 auch Ma¬
trizen mit kleinen Elementmengen definiert, was bekanntlich nicht
erforderlich ist. Grundsätzlich soll allerdings an dieser Stelle ausdrück¬
lich vor Änderungen gewarnt werden, die beim Einprogrammieren von
Programmen vorgenommen werden, die als Listen vorliegen (wie in
diesem Fall). Nur allzu oft stellt sich ein vermeintlich umständlicher
oder unlogischer Programmteil hinterher als doch erforderlich heraus,
und das „verbesserte" Programm läuft nicht. Wenn das Programm in
der Originalform erst einmal funktioniert, bleibt noch genügend Gele¬
genheit zu Verbesserungen — bestimmt kann kein Programmierer von
sich sagen, daß er immer Programme schreibt, an denen sich nichts
mehr verbessern läßt und manche Dinge sind ja auch einfach eine Ge¬
schmacksfrage.
1 •' COPYRIGHT 1978 THE BOTTOM SHELF, INC.
2 ' ALL RIGHTS RESERVED DO NOT C0PY
3 " P.O. BOX 49104 ATLANTA GA 30359
10 ' STAR TREK PHASE iii MARK I (RAUMSCHIFF
ENTERPRISE)
20 CLEAR?50.'<' Z*#, W : c ■ +
i'Z 'Jr \ • 1 , ~ Jco .'7;t tfc '• fe'':' ■
>1 T*y - 7 V1 _ ; r '
194
30 CLS:PRINT(?512,CHRI(23)" INSTRUMENTE ANGESCHALTET":PRINT064
"KOMMANDO-UEBERNAHME IN 4 SEK.
100 DIMG(3,8),Gl(8,8),KL(3,1,1),SA1(8,8),ZI(20) f ü(2),SR(2),S
El(10,10):R L = 851:RLI=CHRI(131) +CHRI(131)+CHRI(131)+CHR1(17?)
110 S1 $="###».»r•:S2»-= J HHM•":S3$= , '4HMMH^ ,, :S4*^^MHM»":S5$= ,, l^i^ ,, :
S6l="ttttt)WX":PS=0:IM-0:UA = 0
120 BLI=STRINGI(35," ")
130—0NERRORGOTU18000
1000 SD=RND(900)+RND(01+2050:SE=SD:CN$="DOCK ":EN=10002.31:
SH=0:TP=0:SU$=STRINGI(24,CHRI(191)):SSI=STRINGI(24,CHRI(1 70 )
)
1998 GOTQ2900
2000 FORX=0TO?:PR INT6340+X*44,SCI!:NEXTX:PR INT@394,OLK 1);:PR
INT6398,QU(2);
2005 FORX=1 TOB:FORY=1T08:SEI(X,Y) = NEXTY,X
2010 FORX=1TOVAL(LEFTI(Gl(QU(1),QU(2)), 1 ))
2020 T1=RND(3):T2 t RND(8):IFSEI(T1,T2)-"-"THENSEI(T1,T2>="♦"£
LSE2320
2030 NEXTX
2040 IFMIDKGKQUd ),QU(2)),2,1 )="0"THEN2060
2050 T1=RNB(8):T2=RND(8):IFSEt(T1,T2)="-"THENSE$(T1 t T2)="!"E
LSE2050
2060 IFRIGHTI(£i(GU(1),0U(2)),1)=“0"THENPRINT6432,"GRUEN
GOTO 2030
2065 PRINT6432, "ROT ". >i C “j
2070 FORX = 1TCVAL(RIGHTI(Gl(QU(1),QU(2)), 1))
2075 TI=RNB(8):T2=RNB(8):IFSEI(TI,T2)="-"THENSEI(TI f T2)="K"E
LSE2075
2076 NEXTX
2080 FORX=0TO7:FORY=0TO?:PRINT6341+X*3+Y*64 f SE*(X+1 t Y+1);:NE
XTY,X:IFSR(1)=0GOTO2090
2085 IFSEKSRt 1) f SR(2) ) = "-"THENSEI (SR( 1) ,SR(2) ) = "E":GOTO2095
2090 TI=RND(8)sT2=RND(8): IFSEKT1 f T2)="-"THENSEI(T1 ,T2)~"E"E
LSE2090:SR(1)=T1:SR(2)=T2
2093 SR(1)=T1:SR(2)-T2
2095 PRINT6341+(SR(1)-1)*3+(SR(2)-1)+64,"E";
2098 PRINT0458,SR( 1) J :F'RINT0462, SR(2);
2100 RETURN
2900 FQRX=1TQ5:Z4(X) r "30":ZI(X+10)="3":NEXTX:Z$(6)="10":ZI(7
)="20":ZI(8)="30“:Z$(9)="40":ZI(10)="50":ZI(15)="1":ZI(1A)="
2":Z*(17)="3":ZI(18)="0":ZI(19)="0":ZI(20)="0"
2901 GOTO 11000
3000 FORX=1TQ8:FQRY=1TO8:T=RNB(10):T1=RND<10)+10:G$<X,Y)-Z$(
1 QK
T)+Z$(T1):K=VAL(RIGHT$(G$(X,Y),1))+K:PRINT068?,K;:NEXTY,X
3100 F0RZ=1TQ2:T1=RND(8):T2=RND(8):G$(T1,T2)=LEFT$(G4<T1,T2)
,1)+"1"+RIGHT$(G$(T1,T2),1):NEXTZ
3605 QU(1)=RND(8):QU(2)=RND(8)
360? FORX=0TO2:PRINT058?+64*X,"";:PRINTUSINGS6$;0;:NEX TX:TP=
15:PRINT0623,TP;
3610 GOSUB2000:GOTO5000 • '
4000 V=949:TC=HP0-:QA$=CHR$(13)- 6
4005 N=0:A$=INKEY$:Ai="":A1$=""
4010 PRINT0751,TC;" ";:TC=TC-1:IFTC=-1THEN4500ELSEA4=INKEY$:
PRINT0V+N," ";:GOSUB4200:PRINT0V+N,CHR$(95);:IFA$=""GOTO4010
4015 IFA$=CHR$(8)THENA$="":IFN>0THENN=N-1:AI$=LEFT$(AI$,N):P
RINT0V+N," ":GOTO4010
4020 IFA$=QA$THENGOTO4500
4025 PRINTBV+N,Ai;:N=N+1:IFN=>9THENPRINT0y,STRINGi(10," ")EL
SE4030
4027 GOTO4005
4030 A1$=A1$+Ai:A$="":GOTO4010
4200 PRINT0RL,RLi;:PRINT0875,CHRi(131);:RL=RL+3:IFRL=>875THE
n^t=85i <.
420t- -RffWW VV C ■
4500 PRINT0948,": ”;:PRINTe?52," :PRINT0851,STR
INGi(25,CHRi(131));:EN=EN-2.31:G0SUB1 0500:F'RINT0?52,"XXX"; :R
ETÜRN
4600 PRINT0906,BLi;:F'RINT0960,STRINGi(60," ");:RETURN
4900 PRINT0906,BLi;:PRINT0960,STRINGi(60," ");:IFA1$=""THENP
RINT0906,"REAKTIONSZEIT ZAEHLT, KAPITAEN!";:PRINT0960,"IHR Z
OEGERN KOSTET EINEN STERNTAGG0SUB19010:SD=SD-1:GOSUB4950
: RETURN
4910 PRINT0906,- BEDIENUNGSFEHLER - :PRINT0960,"DAS KO
STET EINEN STERNTAG.:GOSUB19010:SD=SD-1:GOSUB4950:RETURN
4950 IFSE=>SD+30GOTO20000
4955 PRINT0368,"";:PR INTUS INGS1$;SE + (SE-SD);
4960 PRINT0814,"";:PRINTUSINGS1$;30-(SE-SD); I -
4999 RETURN
5000 GOSUB4600:PRINT0906," ERUARTE ANUEISUNG";:GOSUB4000
5002 IFUA>=100THENUA=100
5004 IFIH>=100THENIH=100
5006 IFPS>=100THENPS=100
5010 PRINT0587,;:PRINTUSINGS6$;UA;:PRINT0651;sPRINTUSIN
GS6$;IM;:PRINT0?15, ,, ";:PRINTUSINGS6$;PS;
5020 IFA1$="FLUG"GOT06000
5030 IFA1i="TORP"GOT07000 \
5040 IFA1$="PHASER"GOTO10000
5050 IFA1$="SCHIRM"GOTO8000
5060 IFA1$="SUCH"GOTO9000
5080 IFA1$="DQCK"G0T013000
5200 PRINT0587,;:PRINTUSINGS6$;UA;:PRINTG651,;:PRINTU3IN
GS6S; IM;:PRINT0715,; :F'RINTUSINGS6$ ;PS;
5980 QP(1)=0:QP(2)=0:KF=0
5990 GOSUB4900:GOTO5000
6000 1 = 0:U=0:HF = 0:GOSUB4600:PRINT09i36, “'DREISTELLIGE KURSZAHL
?";:GOSUB4000:IFLEN(Al $)<>3THENGOSUB4900:GOTO6000
6010 CS=VAL( AI $):IFCS>360THENPRINT0960,BL$;:PRINT<?960,"KLEIN
ER ALS 360, BITTE!";:GOSUB19000:GOTO6000
6040 F'RINT0333,A1$;:GOSUB4600:PRINT@906,"FLUGSTRECKE (SEKTOR
EN)?"|:GOSUB4000:BS=VAL(A1$):IJFDS>64PRINT0960,"DAMIT VERLASS
EN SIE DIE GALAXIE."J:GOSUB190#0:GOSUB4600:PRINT0906,"COMPUT
ER UEIST BEFEHL ZURUECK.";:GOSUB1 9000
6041 IFDS<1THENA1$="":GOSUB4900:GOT06040
6044 IFDS>64GOTO6047’6 '
6045 PFMNT0960,"SPOGK AN-KIM+fUEHLEN SIE SICH IN ORDNUNG?"
; :G0SUB1 9000:GOTO5000
6047 IFMF = 1 THEN6050ELSEGQSUB4600:PRINT0906,"SPRUNG ODER INPU
LS (S/I)?";:GOSUB4000:IFLEFT$(A1»,1)="S"THENU=1ELSEIFLEFT$(A
1$,1)="I"THENI=1ELSEPRINT0960,"DENN SIE NICHT UAEHLEN, FLIEG
EN UIR EBEN NICHT!";:G0SUB19010:GOTO5000
6048 IFLEFT$(A$,1)="S"THENBS=DS*(100-UA)/100
6049 IFLEFT$(A$,1)="I"THENDS=DS*(t00-UA)/100
6050 GOSUB4600:PRINT0960,"MOTOREN GESTARTET“;:G0SUB19000:DS=
DS/8:X1=QU(1)+<SR(1)-1)/8:Y1=QU(2)+(SR(2)-1)/8:Q0(1)=QU(1):Q
O(2)=QU(2):S0(1)=SR(1):S0(2)=SR(2):C0=CS
6055 IFU=1ANDDS>=1THENEN=EN-DS*400:GOSUB10500:SD~SD-DS/8:GOS
IJB4950:PRINT(?777," SPRUNG";
6056 IFI=1THENSB=SD-DS/2:GOSUB4950:EN=EN-DS*80:GOSUB10500:PR
INT(?777,STRING$(6," ")STRINGS(6,CHR$(8))" IMPULS";
6057 IFU=1ANDDS<1THENSD=SD~1:EN=EN-100:G0SUB10500:GOSUB4600:
PRINT0906,"UAHL FEHLERHAFT";:G0SUB19000:GOTO5000
6065 CS=CS*.01?45329:X2=SIN(CS)+DS:Y2=-COS(CS)*DS
6067 X2=X1+X2:Y2=Y1+Y2
6068 IFX2>=9THENX2=RND(7)+RND(0):Y2=RNB(7)+RND(0):GOSUB4600:
PRINT0960,"****** RAUMSPRUNG *♦****";:G0SUB19000
6069 IFY2>=9THENY2=RND(7)+RND(0):X2=RND(7)+RND(0):GOSUB4600:
PRINT0960,"*♦♦*** RAUMSPRUNG . ***♦**";:G0SUB19000
6070 QU(1)=INT(X2):SR(1)=INT((X2-QU(1))*8+1):QU(2)=INT(Y2):S
R(2)=INT((Y2-QU<2))*8+1)
6071 IFQU(1 ) <=0ÜRQU(2)<=0THENPRINT0960,"SCHIFF Irl HYPERRAUM"
; :GCSUB19000:F'RINT0906, "WEITE DES RUECKSF'RUNGS?"; :GOSUB4000:
ÜU(1)=QU(1) H'AL(AI $):QU< 2)=VAL(Al $)+QU(2):IFQU(1K=0ORQU(2 > =
(0THEN20000
6075 IFQLK 1K =9ORQU(2)>=9THEN20030
6080 PRINT0394,QU(1);:PRINTB393,QUv2);:PRIN16458,SR(1);sPRIN
re4ö2, SR ■: 2 >;
6090 IFQU(1)<>Q0(1)ORQU(2)OQO(2)THENGOSU82000:GOTO5000
6092 IFSEt(SR(t),SR(2))O"-"0RSEI(SR(1),SR(2))~”+"THENQU(1)=
QO(t)jQU(2)=QO(2)sSR(l)=SO(1):SR(2)=SO(2)sDS=BS*8-1:CS=COsrtF
=1:GQTO6047
6100 SEI(SR(1),SR(2))“"E":SEI(SO(1) ,S0(2)) = "-":PRIN T027 4+SR(
I >*3+SR(2)*64,"E";:PRINT0274+SO<1) *3+SO(2)*64,**- n ;
6999 GOTO5000
7000 G0SUB4600:PR1NT0906,"POSITION DES ZIELS (X,Y)?"J:G0SUB4
030:K3(1)=VAL(LEFT$(A11,1)) :KS(2)=VAL(RIGHTKAI 1,1)) sIFSEKK
S<1),KS(2))="K"THEN:GO3UB4600:GQTC7005
7001 IFSRd i=KS(1)ANDER(2 ? ~KS(2)TKENCL5:R)R.4*4101 4»PfrlifT^Ucj
(4Sf (-6-3-,MK.W-1 «H- :NU2H PRINTB522, CHR$ (23) I" AUF ü ICDERSEHEN !
!";:G0SUB19010:CLSiFQRX=1TO100:PRINTSTRING»(63,CHRK150 )):N
EXTX:GOTQT
7004 GOSUB7?00:GQTQ70?5
7005 GQ3UB4600:PRINT0906,"ZIEL REGISTRIERT"JjÜQSUBI 9013:SD*S
D-.1:GOSUB4950:PRINT0960,"TORPEDOS FERTIG ZUM FEUERN";:GOSUB
1901 0: IFTF' tl THENGOSUB4600:PRINT0906, "UEBERF'RUEFUNG LhEUFT"; :
iJOSUBI9010:PRINT0?60, "KEINE TORPEDOS VORHANDEN";:G0SUB19000:
ÜOTO5000
7090 IFTP>=1 THENTP=TP-1 :PF(INT0623, TP;
7095 G0SUB4600:PRINT0960,"TORPEDOS ABGEFEUERT!“;:GQSUB7500
7096 IF5EI(KS(1),KS(2))<>"K"THENGQSUB7O00:GOSUB7200:GQSUB730
ö:GQSUB7110:GOTO7820
7097 GOSUB7230:GOSUB7300:GOSUB7100:G0SUB7120:GOT0788:0
7130 G$(CU(1),QU(2))=LEFTI(Gl(QU(1),QU<2)),2) «-RIGHT! (STRMVA
LIRIGHTI(Gl(QU(1),0U(2)), 1) )-1 ),1)
7110 IFGU(2>=<4THENPRINT0(QU(1)-1)*4 + (QU(2>-1)♦64,G*(QU<1),Q
U(2));:RETURN
7115 IFQU<2)=<8THENPRINTP33+(QUU)-1)*4+(QU(2)-5 >*64,Gl(QU(1
),QU(2));:R£TURN
7120 GCSUB4600:PRINT0960,"KLINGON VERNICHTET'';:G0SU61 ?Mä :K=
K-l :PRINT0688,STRING!(3," ")STRING!(4,CHRKS))K;
7125 IFRIGHTl(Gl(QU(1),QU(2)),1)="0"THENPRINT2422,"GRUEM
7130 RETURN
7200 SEHKSU ),KS(2)) = "+":RETURN
7300 FORX=1TO8:FORY=1TO8:PRINT02?4+X*3+Y*64,SES(X,Y);:NEXTY,
X:RETURN
7500 FORX=1TO5:FQRY=?TO0STEP-1:PRINT8340+Y*64,SSS;:NEXTY:FOR
2=7TO0STEP-1:PR1NT0340+Z*64,SCS;:NEXTZ,X:RETURN
7700 IFSEf(KS(1),KS(2))="!"THENGOSUB4600:PRINT0960,"AUTOMATI
SCHER TORPEDO-ABSCHUSS LAEUFT";:GOSUB19000:GOSUB4600rPRINTG?
60,"DAS UAR EIN STUETZPUNKT ! ! !:GOSUB19010:RETURN
7710 IFSES(KSi1),KS(2))="*"THENGOSUB4600:PRINT0960,"AUTOMATI
SCHER TORPEDO-ABSCHUSS LAEUFT";:GOSUB19010:GOSUB4600:PRINT09
60,"DAS UAR EIN STERN:GOSUB19010:RETURN
7720 RETURN
7800 IFSES(KS(1),KS<2)) = " ! "OR'SES (KS( 1 ) ,KS(2) )=”*"THENQ$=GS (Q
U(1),QU(2)): IFSES(KS(1) ,KS(2) ) = "!"THENQS=LEFTS(QS,1) + "0"+RIG
HTS(QS,1):GS(QU(1),QUi2))=QS
7810 IFSES(KSU),KS(2)) = "*“THENÜ=VAL(LEFTS(GS,1)):Q=Q-1:QS -R
IGHTS(STRS(Q>,1)+NIDS(QS,2,2):GS(QU(1),QU(2))=QS
7815 IFSES(KS(1),KS(2))="-"0RSES(KS(1),KS(2))="*"THENGOSUB46
00:PRINT8960,"DAS UAR UOHL NICHTS!"J:GOSUB19010
7816 G0SUB7110:RETURN
7820 GOSUB4600:X=RND(5):ONXGOTO7830,7840,7850,7860,200130
7830 PRINT8960,"DAS UAR NICHT SEHR SCHLAU!";:GOTO7870
7840 PRINT8960,"DAS UAR SEHR SCHLAU ! !";:GOTO7B70
7850 PRINT8960,"KL INGONEN SOLLST DU ABSCHIESSEN!";:GOTO7870
7860 PRINT8960,"LASS / DIR DEIN LEHRGELD UIEDERGEBEN!";
7870 GOSUB19010:GOSUB!0500:R=RND(25):SD=SD-1:GOSUB4950:TF‘=TP
-1:PRINT0623,STRING»(3," "){STRINGS(3,CHRS<8));TP;
7880 R=RND(25):IFR=10THENUA=UA+RND(10)+10
7890 IFR=20THEN1fl=IN+RND(10)+10
7900 SD=SD-.21:G0SUB495Ö
7999 GOTO5000
G000 EiN=£N+SH:F'RINT8496,S7RINGS(7," •*);:PRINT6495,EN; :SH=0;P
RINT8560,STRINGS(7," ");:GOSUB4600:PRINT8906,"SCHIRME LADEN"
;:GO5UB4000:IFEN>VAL(A1S)THENSH=VAL(A1S)ELSEGOSUB4600:PRINT8
960,"VORRAT ZUR ZEIT UNZUREICHEND"GOSUB19000:GOTO8000
Ö005 EN=EN-SH: PR INTIM 96, STRINGS (7," "); :PRINT(?495,EN;
8010 PRINT8560,STRINGS(7," "); :PRINT8559,SH{
8020 GOTO5000
9000 GOSUB4600;PRINT8906,"SUCHE LAEUFT";:FORX =QU<1)-2T0QU<1)
:F0RY S QU(2)-2T0QU(2):IFX=>80RX=<-1THENGOTO9020
9005 IFY=<3ANBY*>0THENPRINTSX*4+Y*64,GS(X+1,Y+1){:GGTÜ9023
9010 IFY=>4ANDY=<7PRINT833+X*4+(Y-4)*64,GS(X+1,Y+1);
9020 NEXTY ,X
9030 IFY = 2ORY = 9ORX=2ORX=9THENGOSUB4600:I : 'RINT(?960,"hN DER GRE
NZE DES BEKANNTEN UELTRAUNS";sGOSUBI9000sX=RND(15)sIFX=3THEN
PRINT“ UO NOCH NIEMAND DAR";sGOSUBI90$0
9040 SD=SD-.13sGOSUB4950sEN=EN-.96sGOSUB10500
9100 GOTO5000
10000 KF = 0sGOSUB4600 s PRINT0960,“PHASER FEUERBEREIT";:IFQP(1)
=OU(1)ANDQP(2)=QU(2)THENKF=1
10005 IFPS=>100THENGOSUB4600sPRlNTe?60,"PHASER AUSGEFALLEN";
sGOSUBI9010sGOTQ5000
10010 PRINT0906,"PHASER LADEN";:GOSUB4000:IFVAL(AI\»ENTHENG
ÜSUB4600sPRINT8960,"VORRAT ZUR ZEIT UNZUREICHEND";:PRINT6906
,"NUR NOCH"EN"EINHEITEN H ;sGOSUBI9000:GOTO5000
10015 IFA1$ = ""THENGOSUB4600SPRINT0960,"SPQCK AN KAPITAENs SC
HNELL!":sGOSUBI9000sGOTO5000
10020 IFVAL( AI $ XI 00THENGOSUB4600 sPR INT6906,"FEHLENDE AN FttüR
T-OHNE. FQUit^ , ;sGOSUB190.j0{pRINT6960, u SPOCK AN KIRKs SOLL
ICH SIE ABLOESEN?“; sGOSUBI 904yt GOT05000 -, - .
10025 EN=EN-VAL(A1$)sPRINT0495,STRING$(7," ")STRING*(7,CHR*(
ö))en;spp=vauai$)*(i-ps/i00)
10030 Z=0sKP=0sFORX=1TO3sKP(X)=0sNEXTX
10035 GOSUB4600sPRINT0960,"KLINGON-BERICHTs NUMNER
= "J sPRINT6996," 0";
10040 F0RX=1T08sF0RY=1T08s IFSEStX, YK>"K"THEN10100
10050 KP=KP+1sKP(KP)=SQR((SR(1)-X)C2+(8R(2)-Y)C2)
10060 KL(KP,1,1) = Y sKL(KP,0,0)=X
10070 KP(KP)=1/(KP(KP)C2)
10080 KL(KP,0,1)=KP(KP)
10090 KL(KP,1,0)=200
10095 PRINT0998," "KP;sGOSUBI?«10
10100 NEXTY,X
10110 QP( 1 )-QU( 1) :QP(2) :: QU(2)
10190 GOSUB4600SPRINT6963,"PHASER FEUERN";
10195 Y=0
10200 Y = Y +1 sFORX=?TO0STEP~1:PRINT0340+<S4*X ,SU*; :PRINT8340+6
4*X,SC$;sNEXTX
10201 IFYO5G0T01 0200
10202 Y=0sIFKP=0THEN10335
10310 FQRX=1TQKPsKL(X,1,0) =KL(X,1,0)-PP*KP(X)
10320 IFKL(X, 1,0)<=0THENPRINT0274+3*KL(X,0,0H64*KL(X, 1,1),"
+" ;sG0SUB7100sSEI (KUX, 0,0),KL (X, 1,1 )) = " + " sGO3UB7120:KP=KF'-1
10330 NEXTX
10332 SH-SH-(KPC2)+2001 (KP(1)+KP(2) H!P(3)):PRIHTG559,STRING $
(7," ")STRING$(7,CHRS(8))SHJ sIFSH<0THENPS=100-PS+ABS(5H/200)
:PRINT07l5,;sPRINTUSING36$;PS;sPRINT056»,STRING!(7," ")STR
ING*(7,CHR*(8))"0000“;:SH=0
10335 GOSUB7300
10340 R=RND(25):IFR=10THENUA=UA+RND<10)+10
10350 IFR=20THENIM=IM+RND(10)+10
104?? GOT05000
10500 EG=21
10510 IFEN=<0THENCLS:PRINTCHR*(23):EG*="ENERGIE VERBRAUCHT..
PRINT0512,RIGHTS(EG*,EG):EG=EG-1sGOSUBI?010:IFEG>0THEN105
I0EL5E20000
10520 PRINT0496,STRING*(7," ");:PRINT04?5,EN;:IFEN<500 ,GOSUB
4600:PRINTB?60,"ENERGIEVORRAT GEFAEHRLICH NIEDRIG - SCHIRME
ENTLADEN?";:GOSUB1?000
10525 RETURN
11000 GAt="XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX
XXX XXX XXX XXX":CO*="KURS XXX":QU*="QUADRANT X -
X":SE*="SEKTOR X - X":BR*="SCHADENSBERICHT":UA*=CHR*(14?
)+"SPRUNG > XXX"
11010 IM*=CHRt(149)+"IMPULS XXX":PHt=CHR$(133)♦"PHASER
XXX":ST*="XXXX.XX STERNTAG":CN$="XXXXXX ZUSTAND":EN* : -
"XXXXX ENERGIE":SHS="XXXX SCHIRME":TP*="XX TORPE
DOS":KL*="XX KLINGONEN"
11020 SC* = ".":FT* r STRING*(25,CHR*(140
)):FB$-STRING$(26,CHR$(131)):CC$="COMPUTER:
BEFEHL:":TC*=" REST-ZEIT":DV*="ANTRIEB"
11030 CLS:FORX = 0TO3:PRINT032+64*X,CHR*(149);:NEXTX:PEINTl»275
,FT*;:SET(64,12):PRINT0851,FB*;:PRINTe275,CHR*(188);:PRINT03
00,CHR*(188);:FORX=0TO7:PRINT033?+64*X,CHRt(1?1);:PRINTI?364+
64*X,CHR*(1?1)J:NEXTX
11040 FORX=0TO3sPRINTB0+64*X,GA$;:PRINT064*X*32,CHR$<H9);:N
EXTXsSET(64,12):PRINTB320,CO*;:PRINT0384,QU*;:PRINTB448,SEI;
:PRINTB512,DRt;:PRINTB576,UA*;:PRINT?640,IM*;:PRINTB704,PH$;
:PRINTI?768,PV*; «f
11050 PRINTB368,STt;:PRINTB432,CN*;:PRINTB4?6,EN*;:PRINT(?560
,SH*;:PRINT0624,TP*;:PRINT0688,KL*;:PRINTI?758,TC*;:FORX=0TO7
:PRINT0340+64*X,SC*;:NEXTX:PRINT08H,"XX.XX ST REST";:F'RI
NT(?896,CC$;
11060 PRINTB906,BL*; :PRINTI??06,"STARTBEFEHL: 'xx'";:PRINTB96
0,BL$;:F'RINTP968,"ENTERPRISE STARTBEREIT";:GOSUB4000:IFAI$<>
”XX"THENGQSUB4?00:GOTO11060
11070 F'RINTI??06,BL*J: PR INT0906," COMPUTER IN BETRIEB";sPRINTB
965,BL*;:PRINT0965,"UARTEN - UEBERPRUEFUNG LAEUFT";
11100 PRINT0369,""; :F'RINTUSINGS1 * ;SD; :F'RINT0432,"DOCK ";:PR
INT04?5,EN;:GOTO3000
12000 PRINT@58?,"";sPRINTUSIN3S6$;UA;sPRINT0651,""; sPRINTUSI
NGS6$;IM;sPRINT0?15,"";sF'RINTUSINGS6$;PS;
12100 GOTO5000
13000 FORX-SR<1>-1TOSR<1) + 1:FORY=SR(2)-1TOSR(2>+1:D$=SE$(X,Y
) sIFB$="!"THEND1$ = "DOCK "
13005 NEXTY,X:IFD1$="DOCK "GOTO13020
13010 GOSUB4600sF*RINT0960,"MANOEVER MISSLUNGEN, POSITION FAL
SCH";sGOSUB19000sGOSUB4600sPRINT0960,"DADURCH GEHT EIN STERN
TAG VERLOREN.";sGOSUBI9000sSD=SD-1sGOSUB4950sGOTO5000
13020 GOSU84600: IFSHO0THENPRINT0960,"MANOEVER MISSLUNGEN, S
CHIRME NOCH GELADEN";sGOSUBI9000sPRINTP960,“FEHLERHAFTES VOR
GEHEN KOSTET EINEN STERNTAG.";sGOSUBI9000sSD=SD-1sGOSUB4950:
(3OTO5000
13025 IF K<=0 THEN 21000 _<j
13030 PRINT0432,D1$;sD1$=""sEN=10000:TP=15:UA=0:IM=0sPS~0:GO
SUB4600:PRINT0960,"RAUMSCHIFF EINGEDOCKT, INSTANDSETZUNG LAE
UFT";sGOSUBI9000sPRINTP495,EN;" ";sPRINT0624,"";sPRINTUSING
S5 $;tp;
1 3040 PRINT058?,"“;SPRINTUSINGS6i;UA;:PRINT0651,"";:PR INTUS I
NGS6$;IM;sPRINT8?15,"";sPRINTUSINGS6<;PS;sSIi^SD-.5sGOSUB4950
:PRINT0560," ";s PR I NT0559,SH;
13100 GOTO5000
1^#M-tS^ r tf7T!72+1:EE=ERLH 1 RINTES^ :PRINT" "; fF'RINTEE; rONERRÖ
RGHXOISAM: Sl#P~ -
19000 FORXT=1TOI000:NEXTXTsRETURN
19010 FORXT = 1TO500sNEXTXTsRETURN
19030 F0RXT = 1TO2000:NEXTXT:R€TWWI
20000 CLS:PRINTCHR$(23)sPRINT0334,"DIE GALAXIE IST VERLOREN!
":GOSUB19000s6ÖAWf9fM:CLS:PRINT0512,".UND DU UIRST NIC
HT ZUM ADMIRAL BEFOERDERT!"sGOSUB19030sGOTO* je
21000 CLS:F’F;INTCHR$(23) :PRINTP512, "DU HAST DIE GALAXIE GERET
TET ! ! !";sGOSUBI9030
21010 CLSSPRINT0512,"DE INE BEFOERDERUNG ZUM ADMIRAL IST AUFG
ESCHOBEN WORDEN, BIS DU
21020 PRINT"VON ARCTURUS IV ZURUECKKEHRST, DEREN GALAXIE DU
RETTEN MUST.
21030 PRINT"DEIN RAUMSCHIFF IST REPARIERT, UND DU STARTEST..
6-MD •
-2L040- GOSUB19030sC LS fr PRIWC H Fi t(-53TrF'J\'INT-051 2," JDI*
MERGELISTMERGE0B@B0BDvu "br~~4ib
tkO
202
i iHihliMilliili.il
Übersicht lieferbarer Bücher
ISBN
Verfasser
18
3-921682 01 0
3-921682-02-9
3-921682 03-7
3-921682-04-5
3-921682-05-3
3 921682 06 1
3-921682-33 9
3-921682*08-8
3-921682-09-6
3-921682 34-7
3 921682 11-7
3-921682 12-6
3-921682 13-4
3-921682-14-2
3 ^21682-15-0
3 921682 16*9
3-921682 17-7
3-921682 18 5
3.921682-19-3
3*921682 20-7
392168221-5
3-921682-22-3
3-921682 23 1
3-921682-35-5
3-921682 25-8
3-921682-26-8
3-921682-27-4
3-921682 28-2
3-921682-29-0
3-921682-30-4
3-921682 31-2
3-921682 32-0
3-921682 36-6
Hofacker
Hofacker
Hans Peter
Blomeyer-Bartenstein
C. Loren?
H. Bernstein
C. Lorenz
C. Lorenz
C. Lorenz
C. Lorenz
C. Lorenz
C. Lorenz
Dr. Hat/enbichler
3-921682 43-6 j P. I
3-921682-49 5 C. Lorenz
3-92168248-7 C. Lorenz
Transistor Berechnungs- und Bauanleitungshand¬
buch, Band 1
Transistor Berechnungs- und Bauanleitungshand--
buch, Band 2
Elektronik im Auto
IC-Handbuch. TTL, CMOS, Linear
IC-Datenbuch, TTL, CMOS, Linear
IC-Schaltungen, TTL, CMOS, Linear
Elektronik Schaltungen
IC-Bauanleitungs-Handb
Feldeffekttransistoren
Elektronik und Radio, 4. Auflage
IC-NF Verstärker
Beispiele Integrierter Schaltungen (BIS)
HEH, Hobby Elektronik Handbuch
IC-Vergleichsliste
Optoelektronik Handbuch
CMOS Teil 1
Einführung Entwurf, Schaltbeispiele
CMOS Teil 2
Entwurf und Schaltbeispiele
CMOS Teil 3
Entwurf und Schaltbeispiele
IC-Experimentier Handbuch
Operationsverstärker
Digitaltechnik Grundkurs
Mikroprozessoren, Eigenschaften und Aufbau 2. Aufl.
Elektronik Grundkrus
Kurzlehrgang Elektronik
Mikrocomputer Technik
Hobby Computer Handbuch
Mikroprozessor Teil 2
Mikrocomputer Software Handbuch
Lexikon + Wörterbuch für Elektronik und
Mikroprozessortechnik LEM
Mikrocomputer Datenbuch
Aktivtraining-Mikrocomputer (Ordner)
57 Programme in BASIC (Cames)
Circuits Digital Et Pratique
Mierocomputer Programmierbeispiele
Experimentierp.Vtme für 14,16, 24, 28 und
40 polige DILIC's
TT L-Experimentierbuch
CMOS-Experimentierbuch
6502 Mierocomputer Aufbau und Programmierung
Programmierhandbuch für PET
BASIC Programmierhandbuch
Preis
DM
19,80
19,80
9,80
19,80
9,80
9,80
5. -
19,80
5. -
19,80
9,80
19.80
9,80
29.80
19.80
19,80
19,80
19,80
19,80
19,80
19,80
19.80
9,80
29.80
29.80
19.80
29.80
tq.VIL HofackerGmbH Verlag
8 München 75
Inhaltsverzeichnis
Cover.1
Autorenprofil.6
Inhaltsverzeichnis.8
Vorwort.11
Einleitung.13
Der äußere Anschein.13
Die Benutzung des
Cassettenrecorders.18
Signalfilter.21
Das technische Innenleben
des TRS-80.25
Das Betriebssystem des TRS-
80.29
Das RADIO SHACK Level II
BASIC.34
Programmieren mit dem TRS-
80.34
Numerische Variable.41
Zeichenreihen (Strings.43
Zahlen- und Zeichenfelder
(Matrizen).43
Variablen-Namen.44
Bestimmung der Variabien-
Typen .45
Ein- und Ausgab.51
INKEY $.52
ON ERROR GOTO.57
Die Graphik des TRS-80.60
Mathematik und Logic.61
Besonderes.65
Nachahmen der INPUT-
Anweisung mit INKEY$.72
Ein Fehler im Level II BASIC...73
Ungenauigkeiten bei der
Addition.75
Name.77
Abkürzungen im Radio Shack
Level II BASIC.79
Platzsparendes
Programmieren von Graphik-
Zeichenketten .81
Programmieren in
Maschinensprache und
Assemble.84
Das TRS-80 Floppy Disk-
System.92
Der Erweiterungs-Ausgang
des TRS-80 (Expansion Port) .95
Verbindungen zur
Außenwelt.100
Erweiterung des RAM-
Bereichs im TRS-80.102
Modifizierung des READ-
Vorgang.105
Programme.108
Programmauswahl.110
Die Türme von Hanoi.111
Dateneingabe mit DATA.113
Ballistik.116
Labyrinth.118
Wissenschaftliche Notation ....123
Biorhythmen.127
Raumjäger.134
Buchstaben hochschießen.136
Pferderennen.139
Reaktionstest.142
Die Springer-Tour.144
Stingray.149
Zahlen Ordnen.152
Geräusche und Musik.154
Geräusche.157
Musik.160
Byte-Zerlegung von Zahlen....164
Geräuschprogramm ohne
Maschinenprogramm-
Speicherbereich .166
Abgezinste Geldmenge.170
Rückzahlung eines Darlehens
in gleichen Raten.172
Effektivzins.175
Tilgungsdauer.178
Kreuz und Quer.180
Rechtecke.181
Umwandlung Dezimalzahlen
— Hexadezimalzahlen.183
Ein- und zweidimensionale
Matrix.185
Geburtstage am gleichen Tag 187
Snoopy.188
Autorennen.192
Balkengraphik.196
Startrek.201