Skip to main content

Full text of "Programmieren mit TRS-80"

See other formats


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