Text content (OCR)
Nr. 1/87 Januar
DM 6.50, sfr. 6.50, 6S 50, Lit 5900, hfl. 7.50
DES
Shape-Entwicklungspaket
Ampersand-uUtilities
Kyan-Luxus-Catalog
GFABASIC-Kompaktkurs
Speedloader
Chess 7.0
FE
Hiithig
PUBLIKATION
(Cy
Hiithig
Sie erhalten Ihren »peeker«
% bei Ihrem Zeitschriftenhandler
am Bahnhof
3% bei allen Apple-Handlern
3 und natiirlich beim Verlag.
Denn der sicherste Weg, keine Ausgabe
des »peeker« zu versaumen, ist noch
immer das Abonnement zum Jahresvor-
zugspreis. Dabei sparen Sie bares Geld.
Beachten Sie in diesem Zusammenhang
unsere Anzeige auf Seite 9, oder rufen
Sie uns an:
Telefon 0 62 21/489-281 (Peeker-Leser-
service).
Dr. Alfred Hiithig Verlag, Im Weiher 10, 6900 Heidelberg
PUBLIKATION BTX #51851#
Vorschau
Neben den normalen Programmen sind fur die
nachsten Monate einige spezielle Leckerbissen
in Vorbereitung, die wir an dieser Stelle bereits
ankiindigen méchten. Nachdem wir im letzten
Jahr an die Fortsetzungsbezieher unserer Sam-
meldisketten einen ausgewachsenen Apple-
soft-Editor kostenlos verteilt haben, steht fir
eine der nachsten Disketten ein vollstandiger
ProDOS-Assembler fiir 6502/65C02 auf dem
Programm, der hinsichtlich des Redigierkom-
forts, der Verarbeitungsgeschwindigkeit und der
sonstigen Leistungen den herkémmlichen
Assembler (Big Mac usw.) keineswegs nach-
steht, sondern sie sogar in vielen Features
Ubertrifft. AuBerdem kénnen Sie Big-Mac-
Quelltexte von den friiheren Peeker-Sammel-
disketten normalerweise fast unverandert as-
semblieren.
Darliber hinaus werden wir unseren treuen
Fortsetzungsbeziehern das Dateiverwaltungs-
programm DB-Meister als kostenlose Zugabe
zur Verfiigung stellen, und zwar teilweise sogar
in Quelltextform. Aus Platzgriinden missen die-
se Programme jedoch leider aut mehrere Dis-
ketten (ab Disk +25) verteilt werden.
Beachten Sie bitte, daB der Assembler und der
DB-Meister nicht auf den normalen Sammeldis-
ketten fur Einzelbezieher enthalten sein wer-
den, denn diese Programme sind nur als Treue-
prémien fir Fortsetzungsbezieher gedacht.
Wenn Sie also ohnehin einen Assembler oder
ein Dateiverwaltungsprogramm kaufen wollten,
konnen Sie als Fortsetzungsbezieher viel Geld
sparen, Beispielsweise wiirden sich 6 Sammel-
disketten ab Disk #25 auf nur DM 120,— belau-
fen, wahrend der DB-Meister allein DM 290,—
kostet.
In unserer Kompaktkurs-Reihe sind zwei GroB-
beitrage in Arbeit. Der Kurs zu dem beliebten
GFABASIC beginnt mit diesem Heft. Ubrigens
hat der Firma GFA Systemtechnik unsere Auf-
stellung des Befehlssatzes aus Heft 11/86 so
gut gefallen, daB sie dort als Referenzkarte er-
scheinen wird. GFABASIC ist auch ber unse-
ren Hithig Software Service erhaltlich, wobei
wir an unsere GFABASIC-Kaufer nach Ab-
schluB des Kurses eine Atari-Sonderdiskette
mit allen im Peeker veréffentlichen GFABASIC-
Programmen sowie weiteren Utilities kostenlos
verschicken werden.
Als zweiter Kompaktkurs ist ein umfangreicher
Zweiteiler Uber den 65816/65802-Prozessor
unter besonderer Berlicksichtigung des Apple
lIgs vorgesehen, der auf die Februar- und Marz-
ausgaben des Peekers verteilt werden wird.
Damit Applesoft-Programmierer nicht zu kurz
kommen, haben wir einige lupenreine BASIC-
Programme eingeplant, beispielsweise in die-
sem Heft das Shape-Entwicklungspaket. Im ii
tigen stehen wie bisher niitzliche Assembler-
und Pascal-Utilities auf dem Programm.
Apple-il-Besitzer, die sich mit dem Gedanken
tragen, den neuen Apple Ilgs zu erwerben,
miissen wir im Hinblick auf llgs-Programme
einstweilen vertrésten. So war auf der jlingsten
COMDEX-Messe — Bericht folgt im Februar-
Heft — nicht einmal die Endversion von ProDOS.
16 zu sehen. Geriichten zufolge soll die Platine
wegen des 4-MHz-65816 noch einmal geandert
werden. Deshalb werden sich die Erschei-
nungstermine fiir viele der angekiindigten App-
le-Ilgs-Programme um mehrere Monate ver-
schieben.
We nnn rs bh
Ulrich Stiehl
Impressum Telefonnummern:
Zontralo: 06221/4 89-0
Magazin fur Mikrocomputer Redaidion: 062217480252,
4. Jahrgang 1987 Anzeligen: 06221/489-206
ISSN 0176-9200 ‘Abonnement: 06221/489-283
Software: 06221/489-231
Bucher: 06221/489-353,
(Bestellungen bitte nur schrifich)
Pooker
© fr den gesamten Inhalt
einschlieBlich der Programme
Dr, Alfred Hathig Verlag,
Heidelberg 1987
Verleger und Herausgeber:
DipL-kfm. Holger Huthig
Geschaitsfahrung Zeitschriften:
Hoinz Melcher
Chefredakteur: Ulrich Stiehl (us)
Redaktion: Dagmar Borberich
Anzoigenleitung: Karl M. Dietzow
Anzeigendisposition: Diana Walter
‘Abonnement:
Der Abonnent kann seine Bestellung innerhalb von 7 Tagen
schriftich durch Mitteilung an den Dr, Alfred Hithig Verlag
GmbH, Postlach 10 28 69, 6900 Heidelberg 1, widerrufen. Zur
Fristwahrung gendgt die rechtzeltige Absendung des Wider
tuls (Datum des Poststempels). Das Abonnement verlangert
sich zu den jeweils giltigen Bedingungen um ein Jahr, wenn
es nicht zwei Monate vor Jahresende schrifich gekiindigt
wird. Die Abonnementsgelder werden jahrlich im voraus in
Rechnung gestellt, wobei bei Tellnahme am Lastschviltabbu-
chungsverfahren Uber die Postscheckamter und Bankinstitute
eine vierteliahrliche Abbuchung moglich ist
Nichterscheinen infolge hdherer Gewalt berechtigt nicht 2u
‘Anspriichen gegen den Verlag,
Grafik
Ein Shape-Entwicklungspaket
fiir Grafik-Anfanger
pecker
Atari
Heft 1/1987
GFABASIC-Kompaktkurs
Teil 1: Grundlagen und Mathematik
Table-Editor, Shape-Editor und von Ulrich Stiehl 42
Shape-Creator a .
Binarmathematische Rundungsfehler
von Wolfgang Landgraf 6 Programm-Listings 5A
ProDOS
Biicher 56
Der Trace-Fehler im BASIC.SYSTEM
oder wie man Katastrophen vermeidet Produkte
von Arne Schapers 2
Z L Schach dem Apple
Applesoft Schachprogramm CHESS 7.0
getestet von Dr. Peter Abel 60
Programmverwaltung i
Ein Ubungsprogramm fiir Applesoft- Der elektronische Buchhalter
Anfanger Test des Buchhaltungsprogramms BUCH
von Nils Arndt 24 von Dagmar Berberich 62
ABU — Ampersand-BASIC-Utility Der Speedioader 2.0/R
von Jérg Bettray 30 fur Apple Il-+-/e/c
Ein Erfahrungsbericht
Kyan von Willfried Wienholt 64
Luxus-Catalog in Kyan-Pascal Wo sind meine Files?
von Matthias Meyer 36 Test des Programms Multi-Disk-Catalog III
von Franz-Josef Hiskens 65
ee LISPAS II ST
Ist ,, Sprache“ ein Metapher? Ein LISP-Interpreter fur den Atari ST
Kritische Betrachtungen getestet von Kai Oliver Tiffany 66
zum Begriff der Programmiersprache
von Ulrich Stiehl 42 Leserbriefe 68
Anschrift: Vertrieb: Bankverbindungen: Herstellung:
Dr, Alfred Huthig Verlag GmbH
Im Weiner 10, Postfach 102869
6900 Heidelberg
Telefon (06221) 489-0
Telex 4-617 27 hued 4.
Telefax (06221) 489279
Erscheinungsweise: 12 Hette jahrlich,
Erscheinungstag jeweils 1 Woche vor Monatsbeginn,
vahresabonnement Inland DM 75,-, einschl. MwSt
und Versandkosten,
Jahresabonnement Ausland DM 75,- plus DM 20,~
‘Versandkosten,
BIX* 51851 4 Einzelheft DM 6,50,
Vertriob Handel:
‘Auslieferung fir die Schweiz: MZV — Modemer Zeitschriften Vertrieb GmbH
Delta-Vertag Breslauer Str. 5, Postfach 1123,
Herr R, de Forest
GugelmattstraBe 31
8967 Widen
Telefon 057 /3386 86
‘8057 Eching b. Manche,
Tel, 089/31 9006 13, Telex 0522656
Vertriebsieitung:
Walter Menzel, Tel, (06221) 489280
Zahlungen: an den Dr. Alfred Huthig Veriag
GmbH, D-6900 Hetdelberg 1 : Postgiro-
konten: Ludwigshafen 4799-673,
BLZ 54510067; Osterreich: Wien 7555888;
Schweiz: Basol 40-24417-4; Niederlande:
Den Haag 1 45726; Italien: Mailand 59689208;
Belgien: Brissel 07 230 26-85;
Danemark: Kopenhagen 603 4969;
Norwegen: Osto 1994243;
Schweden: Stockholm 5477 76-5
Bankkonten: Landeszentralbank Heidel-
berg 67207 341; BLZ 67200000; Deutsche
Bank Heidelberg 0265041; BLZ
672 70003; Bezitkssparkasse Heidelberg
20451, BLZ 67250020,
Produktionsleitung: Gunter Sokollek
Gestaltung: Rainer Schmitt
Titelbild: Werner Hable
Satz und Druck:
Heidelberger Verlagsanstalt
Printed in Germany
»Peekor" ist eine unabhingige Zeitschrift
Sie ist nicht verbunden mit der Firma Apple
Computer, Inc. oder der Apple Computer GmbH.
APPLE, das Apple-Zeichen und MAC sind
Warenzeichen der Firma Apple Computer, Inc
und MACINTOSH ist in Warenzeichen, in
Lizenz vergeben von der Firma Mcintosh
Laboratory an die Firma Apple Computer, Inc.
Ein Shape-
Entwicklungspaket
fiir Grafik-Anfanger
von Wolfgang Landgraf
In Erganzung zu dem Memory-Spiel mit
der Apple-Maus (,,Mousory“) aus Peeker,
7/86, S. 12ff., das insbesondere unter den
jingeren Peeker-Lesern viel Beachtung
gefunden hat, wird nachfolgend ein leicht-
verstandliches }Shape-Entwicklungspaket
vorgestellt, das aus drei lupenreinen Ap-
plesoft-Programm-Modulen besteht und
beispielsweise fiir die Entwicklung eigener
Mousory-Shapes verwendet werden kann.
Besonderer Wert wird dabei auf die Doku-
mentation der Programme durch kommen-
tierte Variablenlisten gelegt. Die drei Mo-
dule heiBen
TABLE.EDITOR — Table-Editor
SHAPE.EDITOR — Shape-Editor
SHAPE.CREATE — Shape-Creator
|. Der Table-Editor
Programm zur Bearbeitung von Shapetabellen
Dieses Programm hilft einem aus man-
chen Schwierigkeiten heraus, vor denen
man bisher bei der Erstellung von
Shapetabellen steht. Bendtigt man zum
Beispiel nur je ein einziges Shape aus
verschiedenen Tabellen, so ist man ge-
zwungen, alle Tabellen an verschiedene
Stellen zu laden, um dann umstandlich
durch Poken der unterschiedlichen An-
fangsadressen an Speicherstelle 232 und
233 den Zeiger auf den jeweiligen Tabel-
lenbeginn einzustellen. Oder aber ein be-
stimmtes Shape hat es einem so angetan,
daB man es in eine seiner Tabellen ein-
bauen will. Bisher muBte man sich eine
Skizze erstellen und das Shape neu ein-
geben — alles in allem ein groBer Aufwand.
Nachdem man dann endlich mit allem fer-
tig war, stellte sich heraus, daB die Tabelle
hatte gréBer sein konnen. Oder aber das
erste Shape hatte besser an die letzte
6
Stelle gepaBt. Man miiBte nun die Tabelle
komplett neu definieren und mit allem von
vorn beginnen, was unndtig zeitraubend
ist. Mit dem Table-Editor kennt man diese
Probleme nicht mehr. Dieses Programm
bietet im einzeinen:
1. Shapetabelle aus Einzelshapes er-
stellen
2. Shapetabelle bearbeiten
3. Shapes aus ihrer Tabelle herausiésen
Dariiber hinaus ruft der Table-Editor das
Programm Shape-Editor auf, mit dessen
Hilfe Shapes punktweise geandert werden
kénnen, oder aber das Programm Shape-
Creator — ein Tabelleneditor, mit dem
Shapes erst dann abgespeichert werden,
wenn man damit zufrieden ist.
Der Table-Editor ist gréBtenteils menige-
steuert. Erklarungen sind auf dem Bild-
schirm zu sehen. Eventuell auftretende
Fehler beim Zugriff auf Disketten werden
in einem Teil des Programms abgefangen.
Sollte man ein Unterprogramm aus Verse-
hen angewahit haben, so kann man mit
dem Ausrufezeichen <!> zum vorherge-
henden Programmteil zuruickspringen.
In den folgenden Abschnitten werden die
einzelnen Programmpunkte ausfiihrlicher
besprochen.
1. Shapetabelle aus Einzelshapes
Zwei Méglichkeiten stehen zur Auswahl:
Zum einen kann eine Tabelle komplett neu
erstellt werden, zum anderen kann man an
eine schon existierende Tabelle weitere
Shapes anhangen. Sollte in dieser Tabelle
kein Platz mehr sein, muB zuvor der Pro-
grammpunkt ,,Shapetabelle editieren“ ge-
wahit werden.
Peeker 1/87
1.1. Alte Tabelle editieren
Zuerst wird nach dem Namen der zu bear-
beitenden Tabelle gefragt und diese dann
ab $6000 in den Speicher geladen. Sollte
die gewahlte Tabelle voll sein, kehrt das
Programm automatisch zum Hauptmenii
zurlick. Ansonsten wird angezeigt, wievie-
le Shapes noch Platz finden, und nun wird
die Eingabe des Dateinamens des
Shapes, welches an die Tabelle angehangt
werden soll, erwartet. Das Shape wird ab
$4000 geladen, auf dem Bildschirm ge-
zeigt und dann eine Bestatigung der Wahl
verlangt. Hat man die Frage bejaht, wird
das Shape an die alte Tabelle angehangt.
Danach kann man die erweiterte Tabelle
auf Diskette abspeichern oder ein weiteres
Shape anhangen. Der vergréBerten Tabel-
le kann ein neuer Name gegeben werden,
durch Betatigung der <Return>-Taste
wird die Tabelle unter ihrem alten Namen
auf Diskette geschrieben.
1.2, Neue Tabelle erstellen
Dieser Programmteil ist mit dem vorher
besprochenen identisch, nur da8_ nicht
nach einer alten Tabelle gefragt wird, son-
dern nach der Anzahl von Shapes, die in
der neuen Tabelle Platz finden sollen. Die
Tabelle kann dann unter einem beliebigen
Namen gespeichert werden. Dem gewahl-
ten Namen wird zur Kenntlichmachung als
Shapetabelle das Kiirzel ,,ST.“ vorange-
stellt; man kann also auch gefahrios Zah-
len als Namen wahlen.
1.3. Aufruf des Shape-Creator
siehe unten
2. Shapetabelle editieren
Hier gibt es wiederum zwei Méglichkeiten:
Zum einen kann eine beliebige Tabelle
verlangert werden, zum anderen kénnen
Shapes in der Tabelle vertauscht werden.
2.1. Tabelle verlangern
Bedingt durch die Anatomie“ der
Shapetabellen (Abb. 1), kann eine volle
Tabelle nicht ohne weiteres verlangert
werden. Wie man es trotzdem schafft, wird
darunter gezeigt. Der Ablauf ist Punkt 1.1
zu entnehmen. Es wird nur gefragt, wie-
viele Shapes angehangt werden sollen.
Dann wird kontrolliert, ob die neue Anzahl
grdBer als 255 ist. Nach erfolgter Manipu-
lation kann die Tabelle auf Diskette ge-
schrieben werden. Der Trick ist folgender:
Fur jedes neue Shape wird der Tabellen-
beginn um 2 Bytes nach unten verscho-
ben, die Abstande der einzelnen Shapes
vom Tabellenanfang werden um die Zahl
»Neue Shapes * 2“ erhdht und abschlie-
Bend der Entfernungwert ,,Ende letztes
Shape + 1“ als Anfangswert fiir das fol-
Peeker 1/87
gende Shape an seinen Platz in der Tabel-
le geschrieben.
2.2. Shape-Folge andern
Eigentlich wird die Reihenfolge der
Shapes innerhalb der Tabelle nicht richtig
verandert, denn der Zeitaufwand dafuir wa-
re viel zu groB, Der Trick besteht vielmehr
darin, die Shapezeiger am Anfang der Ta-
belle miteinander zu vertauschen. Man
sucht sich lediglich zwei Shapes heraus.
Das Programm besorgt dann den Rest. Mit
den Pfeiltasten wahit man die zu tauschen-
den Shapes an, mit <Return> wird ange-
nommen. Die Shapes werden zur Kontrol-
le auf dem Bildschirm nebeneinander ge-
zeigt. Sollte die gewahlte Tabelle nur ein
einziges Shape besitzen, so wird das Pro-
gramm automatisch abgebrochen. Vor-
sicht ist geboten, wenn dieser Programm-
teil bei einer noch nicht volistandigen Ta-
belle angewandt wird. Die meisten Shape-
Programme, so auch das hier beschriebe-
he, nutzen die Abstandszeiger des ersten
Shapes vom Tabellenanfang zur Feststel-
lung der Tabellenkapazitét nach der
Formel:
(Low-Byte + High-Byte * 256)/2-2
= Tabellenkapazitat.
Ist nun das erste Shape vertauscht wor-
den, bevor die Tabelle fertiggestellt wurde,
kommt es zu Schwierigkeiten bei der wei-
-teren Bearbeitung, die zum Verlust der
Tabellendaten fiihren kénnen. Deshalb
solite man sich merken, diesen Pro-
aqralik gg
grammpunkt nur dann anzuwenden, wenn
die Tabelle fertig ist und die Umstellung
von Shapes den letzten Arbeitsgang dar-
stellt.
3. Einzelshapes erstellen
Wer sich eine Bibliothek aus Einzelshapes
zusammenstellen méchte, aus der er nach
Lust und Laune neue Tabellen bauen
kann, der wahle diesen Programmpunkt.
Es spielt keine Rolle, wie groB das Shape
ist und womit es erstellt wurde, denn das
Programm tut seine Pflicht und trennt das
auserwahlte Shape sauberlich aus dem
Tabellenverbund.
Wie schon oben beschrieben, wird eine
Tabelle in den Speicher geladen. Nun
kann man durch Betatigung der Pfeiltasten
(< und -) in der Tabelle blattern, bis man
das Lieblings-Shape erspaht. Mit der
<Return>-Taste wird das Shape sepa-
tiert. Es erscheint rechts neben dem Origi-
nal zur Kontrolle und kann, unter Namens-
gebung versteht sich, auf Diskette gesi-
chert werden. Hier stellt das Programm
automatisch ,,SH.“ fiir Shape voran, damit
man es von einer Tabelle leicht unter-
scheiden kann.
Anderungsvorschlage
Das Programm |auft unter DOS 3.3 und
ProDOS. Wenn es unter ProDOS betrie-
ben wird, sollte man den ProDOS-spezifi-
schen Befehl ,,PREFIX/“ an den Pro-
At Uerschiabung des Tabellenanfangs
Original Tabelle
$4080 -| 62/68/06 @8/895 86/20 2D B@/3F 3F 40
tt t- t. t
Adressel [Sh. zshl | | |Shape 1] [Shape 2
Roresseljjentfernung 1.Shape<—> Tabellenanfang
Bd I
$ SFFE j/Entfernung 2.Shape<-> Tabellenanfang |
I Verlangerte Tabelle rails
63/66/98 BG/GB 66/GE 86/20 20 O6\SF 3F oa xx
£ £
Sh. zahl | [Berecrnete Entf. 3 Shape
Neve Entfernung 1.Sh. <-> Tabellenanf. ||Platz fur
I haves
Neve Entfernung 2.Sh. <-> Tabellenanf. || Shape
Abb. 1: Aufbau der Shapetabelle
z
grammbeginn setzen, um gefahrlos Dis-
ketten wechseln zu k6nnen, ohne die Feh-
lermeldung ,,PATH NOT FOUND“ zu ris-
kieren. Der CATALOG-Befeh! muB in CAT
geandert werden.
Wer méchte, kann das Programm leicht so
modifizieren, daB es zwei Laufwerke un-
terstiitzt. Um Konflikte mit der ersten Gra-
fikseite zu vermeiden, sollten die REMs
weggelassen werden.
Tastenfunktionen
<Return> = Annahme der Wahl, Ende eines
Programmteils
<-> > = Shapetabelle hinaut
<<—> = Shapetabelle hinunter
<I> Abbruch eines Progranmteils
bei Irrtum
<> = Catalog der Diskette
Kommentar zum Programm
199-115 Zeige “Haupneni”
i16ep Verteilen auf einzelne Pro-
graumteile
1179-1278 Unterprogramm zur Auswahl der
Programmtoile
1289 Unterprogramn "Shapetabelle
erstellen
1299-1350 Zeige Memi "Shapetabelle
erstellen"
1349-1369 Verteiler fir Untermenit
1379-1459 Eingabe des Namens der zu
erstellenden Tabelle
146-1599 Eingabe der Shapezahl bei
neuer Tabelle , Vorbereitung
des Tabellenanfangs
1519 Bestimmung des Anfangspunktes
Shape Nummer 1
1529-1560 Eingabe des anzuhingenden
Einzelshapes
1570-1619 Einlesen der Shapebytes,
Poken an neue Adresse
1620 Abfrage "Weitermachen 7"
1639-1709 Speichern der Tabelle
"ST."xxxx auf Diskette
ime Unterprogramm "Shapetabelle
editieren"
1729-1759 Zeige Meni "Shapetabelle
editieren"
1769-1780 Verteiler fur Unterment
1799-1820 Eingabe des Namens der zu
editierenden Tabelle
1839-1869 Auswertung der Shapezah in
der Tabelle
Bestimmung der Tabellenlange
1870-1890 Abfrage "Wieviel Shapes
hinzu?", Kontrolle, ob
Shapezahl dann gréfer als 255
1999-194 Verlagerung des Tabellen-
anfangs, Aktualisierung der
Abstandswerte der einzelnen
Shapes von Tabellenanfang
1959-1989 Bestimmung Endpunkt des
letzten Shapes baw
Anfangspunkt fiir das neue,
darauffolgende Shape
1999-2009 Unterprogramm “Shapes
‘tauschen"
Kontrolle, ob nur ein Shape
2930-2080 Auswahl der zu tauschenden
Shapes
2999-2119 Tauschen der Anfangsbytes
2120 Abfrage "Nochmal?”
2139-2200 Speichern der Tabelle
"ST, "xxx auf Diskette
2210 Unterprogramm "Einzelshape
erstellen"
2229-227 Eingabe des Namens der zu
ladenden Tabelle
2280 Zeiger auf Tabellenanfang,
Vorbereitung des Einzel~
shapeanfangs
2299-2309 Auswahl des Einzelshapes im
Tabellenverbund
2499-2470 Einlesen der Shapebytes,
Poken an noue Adresse
2489-2509 Abfrage, ob das Shape auf
Diskette geschrieben
werden 5011
2510-2539 Speichern des Shapes
"SH. "xxx auf Diskette
2549-2570 Abfrage "Weitermachen?"
2580 Unterprogramm "Einzelshapes
editieren"
2590-2600 Hier gohdrt der Aufruf fir
Shape-Editor hin
2619 Unterprogramm "Shape.Creator"
2629-2630 Hier gehért der Aufruf fir
Shape-Creator hin
2649-2680 Catalog Unterprogranm
2699-2710 Programmende
2729-2749 Subroutine "Bildschirm
1éschen"
2750-2810 Subroutine "Fehlerbehandlung"
Variableniibersicht
Ds
5s
FF
Ctrl-D (DOS-Kommando)
Eingabevariable
Errorflag, sorgt fir Verteilung
nach Fehlerroutine
FH = Flag zur Unterscheidung Haupt
Untermeni
FM = Flag fir Verteilung nach Catalog~
routine
HH = Hilfsflag im Unterprogramm Tabelle
editieren
H? = Horizontalposition Auswahlcursor
I = Schleifenvariable
J = Wert des aktuellen Shapebytes
N = Shapezahivariable
N1_ = Aktuelle Shapenumner
N(I)= 1, und 2. Shape beim Tausch
NS = Eingabestring, Name Tabelle
oder Shape
M1$ = Aktueller Tabellenname
Q$ = "!" Variable fir Programmteil—
abbruch
SB = Boginn des aktuellen Shapes in
der Tabelle
SE = Ende des aktuellen Shapes in der
‘Tabelle
SL = Lange der zu editierenden Tabelle
Momentane Zahl der Shapes in
der Tabelle
Sl = High-Byte Shape-Anfang
S2 = Low- Byte Shape-Anfang
S3_ = High-Byte Shape-Ende
S4 = Low- Byte Shape-Ende + 1
TA = Tabellenanfang
TB = Beginn des ersten Shapes in
der Tabelle
W1 = Low- Byte 1.Tauschshape
W2 = High-Byte 1.Tauschshape
WS = Low- Byte 2.Tauschshape
W4 = High-Byte 2,Tauschshape
ll. Der Shape-Editor
Programm zur punktweisen Anderung von
Wer schon einmal ein Shape oder gar eine
ganze Tabelle nur mit Hilfe von Bieistift,
Papier und dem BASIC-Handbuch von
Apple in seinen Computer eingegeben
hat, weiB diverse auf dem Markt befindli-
che Shapetable-Editierprogramme zu
schatzen. Leider haben alle mir bekannten
Programme einen gravierenden Nachteii
Ein einmal definiertes Shape kann nicht
beliebig verandert werden, weil die Pro-
gramme die eingebenen Cursorbewegun-
gen und das Setzen von Punkten direkt in
Zeichenvektoren umwandein. Maximal der
letzte gesetzte Punkt kann eventuell wie-
der zurlickgenommen werden. Es kann
also passieren, daB ein oder mehrere aus
Versehen doppelt definierte Punkte das
Aussehen eines Shapes ruinieren, wenn
man den XDRAW-Befeh! anwendet.
8
Der Startpunkt, von dem aus sich das
Shape aufbaut, ist unveranderbar.
Soll ein Shape spiegelbildlich dargestellt
werden, bleibt einem nichts anderes Ubrig,
als es neu zu definieren.
Diese leidigen Probleme gehdren mit
Shape-Editor der Vergangenheit an.
1. Vorbemerkung
Das Programm lauft unter ProDOS und
DOS 3.3. Anderungen des Programmes
sind mit Vorsicht zu genieBen. Da es nam-
lich mit seinen Variablen so groB Ist, daB
es nicht mehr in den Bereich zwischen der
normalen Startadresse $0800 und der er-
sten Grafikseite als Arbeitsseite paBt, wird
es in den Bereich zwischen $4000 und
$5FFF geladen. Die Shapetabelle, aus der
Shapes
die zu bearbeitenden Shapes stammen,
wird ab $6000 plaziert. Bei Anderungen im
Programm, die zu einer Verlangerung fuih-
ren, kann es zu Konflikten mit dem Anfang
der Shapetabelle kommen, d.h. die spater
eingeladene Tabelle léscht eventuell Teile
des BASIC-Programms. Nun k6nnte man
die Anfangsadresse der Shapetabelle wei-
ter nach oben in den Speicher legen, aber
dann gibt es bei sehr langen Tabellen
Schwierigkeiten mit dem jeweils verwen-
deten Betriebssystem.
Unter ProDOS kann man Tabellen mit ei-
ner Lange von maximal 13824 Bytes einla-
den. Normales DOS 3.3 bietet denselben
Platz. Ideal ware es, den Shape-Editor un-
ter einem in die Language-Card ,,gemov-
ten“ DOS zu betreiben (s. Peeker, Heft 2/
Peeker 1/87
npeeker« schenkt Ihnen...
Ich habe den neuen Abonnenten geworben und er-
halte kostenlos den Disk-Locher.
Name, Vorname
StraBe, Postfach
PLZ, Ort
...den praktischen Disk-Locher mit dem Sie
die Speicherkapazitat Ihrer Disketten im Nu
verdoppeln k6énnen!
zur Post!
‘ch bin der neue Abonennt. Bitte liefern Sie mir bis
auf Widerruf, zumindest aber fir 1 Jahr, »peeker«
zum Jahresbezugspreis von DM 75,- (Ausland
plus DM 20,- Porto) an folgende Anschrift:
Name, Vorname
Straiie, Postfach
PLZ, Ort
Datum, Unterschrift
Gewinschte Zahlungsweise
C gegen Rechnung
1 bargeldios durch Bankeinzug
Konto-Nr. Bankleitzahi
jis es Det Ve WE ee
Geldinstitut
Vertrauensgarantie:
Diese Bestellung kann ich innerhalb einer Woche
bei Or. Alfred Hithig Veriag GmbH, Im Weiher 10,
6900 Heidelberg 1 widerrufen. Zur Wahrung der
Frist gendgt die rechtzeltige Absendung. Ich be-
statige die Kenntnisnahme mit meiner Unterschritt
Datum, Unterschrift
>CGmerachit
Uberzeugen Sie jetzt einfach Ihre Freunde
und Bekannten von den Vorziigen eines »peeker-
Abonnements«. Sie bekommen als Dank fiir
einen neuen Abonnenten diesen
superpraktischen Disk-Locher!
Fiillen Sie den Bestellcoupon aus und ab
Peeker 1/87
Coupon ausschneiden und
einsenden an:
»peeker«
Abonnementservice
Im Weiher 10
6900 Heidelberg 1
PUBLIKATION
1.| Beispiel Ubersicht
HL HA
+ +
HO>(_ [aia
Ei
a|
=
HU+(_[o ao
& = Startpunkt @ = Punkt
Baispieltabelle beginnt
dresse $300 mit den
Herten $308:61 64 84 oa
@1 = Shapezahl Tabelle
88 = nicht benutzt
4 = Abstand 1Shape +1
Ga = Abstand 1.Sh. * 256
Abb. 2: Beispiel-Shape
86), da nun die Tabellen 25545 Bytes lang
sein dirfen.
Wer sich fiir ProDOS entscheidet, sollte
den ProDOS-spezifischen Befehl ,,PRE-
FIX/* zur Abschaltung des Prafixes an den
Anfang des Programmes setzen, damit die
Disketten gewechselt werden k6nnen.
Ebenso muB der ,CATALOG"-Befehl in
»CAT“ geandert werden.
Der Shape-Editor lat sich sehr gut flr
Animationen mit Shapes einsetzen, etwa
um Bewegungen zu simulieren, wenn man
das ,,Vorganger-Shape“ einladt, es veran-
dert, abspeichert und dann die Einzelsha-
pes in einer Tabelle zusammenfigt. Dies
kann mit dem Table-Editor realisiert
werden.
Der Shape-Editor ist fiir Shapes in der
Gr6éBe von 21 * 21 Bildpunkten konzi-
piert. Der Startpunkt kann innerhalb dieser
Matrix frei gewahlt werden.
Normalerweise wird das Programm vom
Table-Editor aufgerufen; es ist aber auch
allein lauffahig. Dann muB Zeile 2360 fol-
gendermaBen geandert werden:
2360 POKE 216,0 : END
2. Programmablauf
Zuerst wird nach dem Namen einer
Shapetabelle gefragt, aus der das zu edi-
tierende Shape stammt. Man kann aber
ebensogut ein Einzelshape aufrufen. Mit
den Pfeiltasten wahit man das Shape aus,
mit <Return> wird das Shape tibernom-
men. Nach dem Aufbau des Bildschirms
(kleiner Rahmen und groBer Rahmen mit
10
Skala), kann das ausgewahlte Shape mit
den <I-J-K-M>-Tasten im kleinen Rah-
men hin und her bewegt werden. Die Be-
tatigung der <S>-Taste spiegelt das
Shape, nochmaliger Druck auf <S> stellt
den normalen Zustand wieder her. Das
Shape im kleinen Rahmen andert sich da-
durch aber nicht, die Spiegeltung kommt
nur bei der Ubernahme in den groBen
Rahmen zum Tragen. Zur Kontrolle wird
die Bedeutung der jeweiligen Tasten im
Textfenster wiedergeben. Die <P>- und
<L>-Tasten haben noch keine Funktion.
Die <Return>-Taste beendet den Pro-
grammteil, d.h. alle Punkte, die sich inner-
halb des kleinen Rahmens befinden, wer-
den in den groBen Rahmen Ubertragen.
Nun baut sich vor den staunenden Augen
die vergr6Berte Version des Urshapes im
Editierrahmen auf, je nach ausgewahlter
<S>-Funktion gespiegelt oder seiten-
gleich. Ebenso wird ein Shape im Ma8stab
1:1 im kteinen Rahmen unten rechts ge-
zeigt. Die Bewegungen des Editiercursors
werden, wie oben schon erwahnt, mit <I-
J-K-M> gesteuert. Ein Punkt wird mit
<L> geléscht und mit <P> gesetzt. Soll-
te man einen nicht vorhandenen Punkt
erneut léschen wollen, ignoriert das Pro-
gramm den Tastendruck. Das gleiche gilt
fiir das Setzen eines schon gezeichneten
Punktes. Im kleinen Rahmen rechts kann
man die Auswirkung auf das Shape direkt
mitverfolgen. Mit <S> laBt sich der Start-
punkt bestimmen.* Das kann man so oft
machen, wie man will, denn nur der zuletzt
bestimmte Startpunkt ist gtiltig. Wird kein
Startpunkt definiert, nimmt das Programm
automatisch die Mitte des Editierrahmens
(Koordinate 11,11) als Anfangspunkt fir
* Bei dem Programm auf der Sammeldiskette wurde
zusatzlich der Befehl <W> zum Invertieren des
Shapes eingefligt.
4
das neue Shape an. Nach <Return> wird
das Shape berechnet und zur Kontrolle
unterhalb des alten Shapes gezeigt. Ein
blinkendes Kreuz bezeichnet die Position
des Startpunktes. Das Shape kann nun
unter irgendeinem Namen auf Diskette ab-
gespeichert werden. Das Programm stellt
dem Namen automatisch ,,SH.“ fur Shape
voran. Es kénnen also auch Zahlen als
Namen eingegeben werden. Danach wird
gefragt, ob man mit einer neuen Tabelle
oder einem neuen Shape weitermachen
oder das Programm beenden will.
Jeder Programmabschnitt kann durch Be-
tatigung von <Esc> abgebrochen wer-
den, um zum vorhergehenden Teil des
Programms zu kommen.
3. Technisches
Der kleine Rahmen umschlieBt einen Be-
reich, der in den Zeilen 1270-1410
byteweise ausgelesen wird. Diese Daten
werden in der Subroutine von Zeile 2690-
2950 in das 21 * 21 Punkt groBes Feld
B%(x,y) tibertragen. Nun kann im nach-
sten Programmschritt leicht jede Stelle
des Feldes mit dem Cursor angefahren
werden, um dort Punkte zu l6schen oder
zu setzen. Auch der neue Startpunkt wird
im Feld markiert. Nun berechnet das Pro-
gramm die Grenzen des Shapes, damit
nicht zuviel Speicherplatz verbraucht wird.
Dann werden zuerst Vektoren vom Start-
punkt bis in die obere linke Ecke des neu-
en Shapes in den Speicher geschrieben.
Das Shape wird nun Zeile fur Zeile inner-
halb der Shapegrenzen ,,abgetastet", und
die entsprechenden Vektoren werden an
ihre Adresse gepokt. Eine Tabelle der ent-
sprechenden Werte stellt Abb. 3 dar. Ein
so erzeugtes Shape bendtigt natiirlich mehr
2.|Bedeutung der Wektoren, C= 1 C=2 C=3
Wektor |Punkt| Bewegung | Hert | Wert | Wert
ii nein hoch g Ey x
=D nein: rechts 1 8 64
dh nein tunter 2 16 128
= nein links 3 et ig2
é ja hoch 4 2a x
* Ja rechts 5 4a x
£ ja punter 6 45 x
EI ja links fa 56 x
An Position C = 3, keine Bewequng nach oben, es
darf auch kein Punkt gesetzt werden t X 1).
Abb. 3: Bedeutung der Vektoren
Peeker 1/87
Platz als sein Vorbild. Deshalb kann es
nicht an seinen alten Platz in der Tabelle
zuriickgeschrieben werden, denn die er-
forderlichen Berechnungen der Abstande
der nachfolgenden Shapes sowie deren
Verschiebung wide zuviel Zeit in An-
spruch nehmen und ware dartiber hinaus
recht kompliziert.
Jedes neue Shape wird im Bereich ab
$0800 erzeugt und auch mit den entspre-
chenden Werten auf Diskette geschrie-
ben. Vorsicht also, ein solches Shape oh-
ne A-Parameter einfach mit dem Befehl
»BLOAD SH.xxxx" von Diskette zu laden.
Ein schon im Speicher befindliches BA-
SIC-Programm wurde sonst zerstdrt. Bitte
also z.B. , BLOAD SH.xxxx, A$6000" ein-
geben und die Speicherstellen 232 und
233 dezimal entsprechend auf den Anfang
der Tabelle einstellen. Wer es nicht weiB:
Diese beiden Speicherstellen auf der Ze-
ro-Page (auch $00E8 und $00E9 hexade-
zimal) sind die Zeiger fur den Beginn einer
Shapetabelle, wobei 232 das Low-Byte
beherbergt und 233 fur das High-Byte zu-
standig ist.
tzung in Wl.
Rei rie
[Sole
a
hs sh
4
Mee Ende 5
Abb. 4: Beispiel-Shape in Vektoren
Tastenfunktionen
Shapeauswabl Tabelle hinunter
(> ) = Shapeauswahl Tabelle hinauf
(sc) = Abbruch eines Programmteils
(Return) = Annahme
{L) = Punkt 1éschon
(P) = Punkt setzen
(8) = Spiegelung, Startpunkt setzen
(?} = Catalog der Diskette
(41h =
Progranmabbruch
Kommentar zum Programm
1999-1940 Programm tiber 1, Grafikseite
laden, Editier-Shapes laden,
evtl. Préfix abstellen
Auswahl der Tabelle und
des Shapes
Aufruf Subroutine
“Bildschirmaufbau"
Aufruf Subroutine
"Shape~ und Cursor-Steuerung"
Einlesen der Daten aus
kleine Rahmen und
Aufruf Subroutine
"Feld erstellen"
Aufruf Subroutine “Shape und
Cursor-Steuerung"
1439-1599 Berechnung der Shapegrenzen
1950-1230
1249
1259-1269
1279-1410
1420
Peeker 1/87
1699-1859 Vektoren bis zur oberen
linken Ecke poken
Shapeanfangswerte eingeben,
Bildanfang berechnen
Zeichenvektoren des Shapes
berechnen und poken
Abfrage “Shape auf Diskette,
Progranmende" und
Speicherung "SH, xxxx"
auf Diskette
Subroutine "Shape~ und Cursor—
Steuerung"
Subroutine "Feld erstellen"
Gelesene Shapebytes in
Feld B%(X1,X1) eintragen
2969-3120 Subroutine "Bildschirmaufbau”
3159-3200 Fehlerbehandlung
1869-1909
1919-2249
2259-2360
2370-2689
2699-2958
Variableniibersicht
Um Speicherplatz zu sparen, da das Pro-
gramm und seine Variablen in den Bereich
zwischen $4000 und $5FFF passen miis-
sen, haben einige Variablen in unter-
schiedlichen Programmteilen verschiede-
ne Aufgaben. Der giiltige Bereich wird in
Klammern hinter der jeweiligen Funktion
angegeben. Sollten keine Klammern vor-
handen sein, gilt die Funktion flr das gan-
ze Programm.
Gelesener Shapebyte-Wert
Shapenunmer aus Daten
(2969-3120)
Hilfsfeld zur Umrechnung der
gelesenen Werte "A"
in das Feld BZ(x,y)
Indikator fir Shapegrenzen
x-Koordinate aus Daten
(2969-3120)
Feld der einzelnen Shapepunkte
(21 * 21)
Schleifenzdhler bei der
Berechnung der
Einzelshapebytes
y-Koordinate aus Daten
(2960-3120)
x-Koordinate des Startpunktes
auf dem Bildschirn
BRIx.y) =
C 5
ox =
HL
HR
Ho
HU
AS
xN
x
x2
Ya
ya
v2
Grafik
= y-Koordinate des Startpunktes
auf dem Bildschirm
Ctr1-D (DOS-Kommando)
Eingabevariable
rrorflag zur Verteilung
nach aufgetretenem Fohler
= Hilfsflag (1 = Shapezeichnung,
® = Cursor)
= Hilfsvariable Spiegelung.
rettet "I" bei Spiegelung
= Linke Grenze des Shapes in
Feld B3(x.y)
= Rechte Grenze des Shapes in
Feld BE(x.y)
= Obere Grenze des Shapes in
Feld BZ(x,y)
= Untere Grenze des Shapes in
Feld B&(x,y}
= Flag Spiegelung (1 = spiegein,
9 = nicht spiegeln)
chleifenzdhler
Indikator fir Shapeanfang
(1869-1999)
chlei fenzdhler
chlei fenzhler
= Berechnungswert fir die
x-Koordinate "xX"
shapenummer in der Tabelle
ktuelle Shapenumner
lame der Shapetabelle
(1959-1119)
Name des neuen Shapes
Abbruch-Variable "|"
= x-Koordinate des Startpunktes
im Feld BZ(x.y)
= y-Koordinate des Startpunktes
im Feld BE(x,y)
Shapetabellenanfang
Aktuelle Adresse im neuen Shape
wahrend der Berechnung
x-Koordinate fiir Editier—Cursor
Alte x-Koordinate zur Zeichnung
von Shape oder Cursor
Neue x-Koordinate zur Zeichnung
von Shape oder Cursor
= x-Koordinate im Feld B%(x,y)
= x-Koordinate im Feld BZ(x,y),
rechte Grenze
Alte y-Koordinate zur
von Shape oder Cursor
Neue y-Koordinate zur
von Shape oder Cursor
y-Koordinate im Feld BZ(x.y)
y-Koordinate im Feld BZ(x,y),
untere Grenze
Zeichnung
Zeichnung
mal
Beispiel zur Berechnun
der Shape - utes
jC) Hert] Ade. |Betrag|VejC|Hert| Ade. |Betrag
5 | $384 5 $209 a
46 [$3G4) 45 aS
pd ueet) 0 5
G S305 — 13 38
125 [#305] i441
3 [F306] 3
96 | #305] 53
ni is 4
na] na Men |S] cn
$307) 7
16
$307| 63
5
$303) 2
4a
copra at ar
#205| 16
&
Wi jalalal ti lelelele
a) Pap Pop a a fh a et
ey [sa0e) 74
bal ea ld bad odd he ER
Tap Pap ho Po oe
G@ |#36F
Ergebnis dez.:45,141,59 62, 74,459,386, 62, 23,45, 95,60
Ergebnis hex.
+20 80 3B 3F 4A 20 1E 2F 1? 20 65 68
Abb. 5: Endgtiltig berechnetes Beispiel-Si
hape
lll. Der Shape-Creator
Shapetable-Editor fir Shapes mit 21 * 21 Bildpunkten
Viele werden jetzt sagen, ,,Schon wieder
ein Shapetable-Programm!". Doch halt,
erst lesen, dann kritisieren. Der Shape-
Creator ist anders konzipiert als seine Vor-
ganger. Shapes auf dem Bildschirm erstel-
len, das kénnen alle Programme, doch wie
gehen sie dabei vor?
Der Benutzer gibt Uber Tastatur die Bewe-
gungen und Punkte ein, das Programm
rechnet diese sofort in Shapedaten um,
und am Ende ist die Tabelle fertig. Was
aber, wenn man sich bei der Eingabe ver-
tan hat, wenn das Shape nun doch nicht so
aussieht, wie man es sich vorgestellt hat?
Anderungen sind nicht mehr méglich, da
jedes Shape wahrend seines Entstehens
im Speicher abgelegt wurde.
Hier setzt der Shape-Creator ein. Man
kann jedes Shape so lange bearbeiten, bis
es die Form hat, die der Programmierer
sich wiinscht, erst dann werden die Daten
im Speicher abgelegt.
Der zweite Vorteii des Shape-Creators
liegt darin, daB man sich eines zuvor er-
stellten Shapes bedienen kann, um ein
neues Shape zusammenzubastein, indem
man das Editierfeld nicht léscht. So biei-
ben alle gesetzten Punkte erhalten, wenn
ein neues Shape gezeichnet wird. Anima-
tion mit Shapes wird dadurch wesentlich
erleichtert.
1. Programmablauf
Zuerst wird gefragt, ob man eine neue
Tabelle erstellen oder eine vorhandene
Tabelle bearbeiten will. Solite man sich
daflir entscheiden, eine Tabelle zu bear-
beiten, muB man den Namen eingeben.
Nun wird iiberpriift, ob die Tabelle noch
Platz fur weitere Shapes bietet. Ist dies
nicht der Fall, fragt das Programm automa-
tisch nach einer neuen Tabelle.
Hat man sich fir eine neue Tabelle ent-
schieden oder die zu bearbeitende Tabelle
ist noch nicht komplett gefillt, wird der
Bildschirm aufgebaut.
Zu sehen ist der groBe Editierrahmen so-
wie rechts davon zwei kleinere Rahmen,
einer in WeiB, der andere in Schwarz. In
ihnen kann man sehen, wie das Shape in
der normalen GréBe aussehen wird, das
heiBt SCALE = 1. Unterhalb des Grafik-
fensters ist die Bedeutung der einzelnen
Tasten zu sehen. Man kann nun damit
beginnen, sein Shape zu konstruleren.
Der Startpunkt, von dem aus sich das
Shape spater aufbaut, ist in der Mitte des
12
21 * 21 Punkte groBen Feldes. Er kann
aber willklirlich verandert werden. Hieran
zeigt sich, daB der Shape-Creator ur-
springlich zur Zeichnung der MOUSORY.
SETs (aus Peeker, Heft 7/86) geplant war.
Durch Betatigung der <Return>-Taste
wird das Shape berechnet, und zwar in
folgender Reihenfolge
1. Berechnung der Shapegrenzen
2. Vom Startpunkt bis zur berechneten
linken oberen Ecke des Shapes
3. Ab dort zeilenweise im Wechsel (von
links nach rechts, dann von rechts nach
links) bis zur untersten Shapezeile
Zur Kontrolle erfoigt die erneute Abfrage,
ob das Shape an die aktuelle Tabelle an-
gehangt werden soll. Wer mit seinem
Shape nicht ganz zufrieden ist, kann hier
seine letzte Chance nutzen. Selbst wenn
er die Frage verneint, ist seine vorherige
Arbeit nicht umsonst gewesen, da er den
Editierrahmen unverandert fiir den nach-
sten Versuch Ubernehmen kann. Die von
mir bisher benutzten Shape-Editoren
kannten diese Moglichkeit nicht.
Wer sein Shape an die Tabelle anhangt,
kann dies selbstverstandlich auch nutzen,
ansonsten ist der Rahmen natiirlich zu |6-
schen.
Jedes schon definierte Shape kann durch
Betatigung der <Z>-Taste auf dem Bild-
schirm gezeigt werden. Mit den Pfeiltasten
(—, <—) wird in der Tabelle ,geblattert",
mit <Return> geht es zurlick zum Haupt-
programm.
Mit <T> kann die aktuelle Tabelle nun
auch auf Diskette geschrieben werden
Wer eine Tabelle neu eingegeben hat,
muB ihr einen Namen geben. Das Pro-
gramm_ stellt automatisch ST." fur
Shapetabelle voran. Sollte es sich um eine
bearbeitete alte Tabelle handeln, mu8 nur
die <Return>-Taste betatigt werden, um
die Tabelle unter ihrem alten Namen abzu-
speichern. Der Shape-Creator kann nur
tiber diesen Programmteil verlassen wer-
den, um Datenverluste durch versehentli-
ches Verlassen ohne Abspeicherung der
aktuellen Tabelle zu vermeiden.
Anderungsvorschlage
Das Programm ist in der vorliegenden Ver-
sion sowohl unter DOS 3.3 als auch unter
ProDOS lauffahig. Wer mit ProDOS arbei-
tet, sollte fr das gefahriose Wechseln von
Disketten an den Anfang des Programms
den Befehl ,PREFIX/“ zur Abschaltung
der aktuellen Prafixes stellen. Auch der
» CATALOG “-Befehl in Zeile 3000 sollte in
»CAT“ umgeandert werden.
Shape-Creator flillt die Liicke, die die Pro-
gramme Shape-Editor und Table-Editor
hinterlassen haben. Versierte Program-
mierer kénnen diese drei Teile eventuell
zu einem einzigen Programm kombinie-
ren. Dann hatte man einen Super-Shape-
Editor zur Verfiigung, der keine Wiinsche
mehr offen lieBe.
Das Programm ist eigenstandig, das heiBt,
es muB nicht vom Table-Editor aus aufge-
rufen werden.
Zum Abschlu8 muB ich leider einen klei-
nen Wermutstropfen auf die aufkeimenden
Hoffnungen vom komfortablen Shape-Edi-
tieren gieBen. Der Shape-Creator eignet
sich nur zur Erstellung von Shapes, die mit
dem SCALE-Faktor von 1 wiedergegeben
werden sollen. Da die Berechnung der
Shapewerte zeilenweise erfolgt, kommt es
zu Verzerrungen bei der VergréBerung
Kommentar zum Programm
1900-1190 Programmbeginn an $4690
verschieben
1119-1519 Auswahl der Shapetabelle,
Bestimmung der Shapezahl
1529-1399 Startbedingungen, Ausruf
Subroutine "Bildschirmaufbau"
1499-1680 Tastaturabfrage, Auswertung,
1599-1769 Shapogrenzen festlegen
1779-2050 Werte bis zur linken oberen
Ecke des Shapes poken
2969-2589 Werte Zeile fir Zeile bestinmen
2399-2469 Zeigen des Shapes mit
Startpunkt, Anhangen Ja/Nein
2479-2559 Hauptmenti
2569-2660 Zeigen der bisher definierten
Shapes
2670-276) Tabelle auf Diskette speichern
2779-2910 Subroutine Bildschirmaufbau
2920-2980 Fehlerbehandlung
2990-3000 Catalog der Diskette
Variableniibersicht
A = Zeilenflag Rechts-Links-Wechsel
bei Shapeberechnung
Plot-Noplot Flag bei Shape~
berechnung
B
B&(x.y) = Feld von 21 * 21 Punkten
ce = Sohleifenwert bei Shape~
berechnung
cx = x-Wert Startpunkt-Cursor
cy Wert Startpunkt—Cursor
Ds tr1-D (Dos-Kommando)
cy ‘ingabevariable
FF = Fehlerflag, ubernimmt Verteilung
nach aufgetretenem Fehler
HL = Linke Shapegrenze
bere Shapegrenze
jechte Shapegrenze
Intere Shapegrenze
chlei fenvariable
Peeker 1/87
MS BASIC ist eine héchst moderne und leicht erlernbare
Programmiersprache!
210 reservierte Beariffe.. Programmsynthese aus Modulen (lokale
Variablen, Wertiibergaben mit COMMON)..Nachladen von Segmen-
ten (CHAIN, mit Parametertibergabe)..Einbinden von MAC-Funktio-
nen (Graphik, Maus, Fenster, Knépfe usw)...Fremddateizugriff (von
MS‘BASIC auf Dateien von z.B. MULTIPLAN, MACPAINT,
WORD)..Programmablaufsteuerung (Ereigniserfassung wie ON
TIMER, ON MOUSE)...Peripheriebefehle (wie COMI fiir DFU)...struk-
turierte BASIC-Programmierung ohne Zeilennummern...Gleit-
kommaarithmetik.
MACINTOSH und MS BASIC bilden eine komfortable Pro-
grammierumgebung!
Mehrfachfenster fiir Simultanbeobachtung (z.B. Fenster 1: Haupt-
programm, Fenster 2: Unterprogramm; oder Fenster 1: Listing, Fen-
ster 2: Ergebnisse)...Mausedition wie in Textprogrammen...Collage:
technik (Programmabschnitte ausschneiden und versetzen)...
HIER DER KURSTEXT einer lebendigen und systematischen
BASIC -Einfiihrung yon dem US-Professor David Lien. Ein Text
fir das Selbststudium, das in anspruchsvolle BASIC-Program-
mierungen mit den Funktionen des MACINTOSH miindet. Ideal
als Schultext.
450 Seiten, Softcover, DM 59.-
M68000 FAMILIE, 2 Bd
Hil/Nausch, ges. 968 Seiten
Einzige Motorola-authentische Darstellung
von CPU-68000-Architelttur, Programmie:
Systemaufbauten. Behandelt alle
austeine sowie 68020, 68881
Grundlagen + Architektur, 568 Set
ten, DM 79,-
Bd 2, Anwendung und Bausteine
Seiten, DM 69,
Das
APPLE II/tl+ /Mle/Ilc-Handbuch
L Poole
Erst mit Hilfe dieses Leitfadens werden Sie
Ihren Apple Il erfolgreich einsetzen, denn
Text und Bildmaterial gehen weit dber das
hinaus, was herstellerseitig an Literatur
angeboten wird.
Neu tiberarbeitet und jetzt um die spezifi
schen Eigenheiten der Modelle He und Ie
erweitert. 472 Seiten, Softcover, DM 66,
APPLE ||
PASCA
APPLEWORKS integriert in
APPLE Il, Ile, He die Funktionen eines
modermen Schreibtisches: Textverarbei-
tung, Datenbank, Rechenblatt, Daten:
ferniibertragung. Samtliche System/
Anwendungsfragen in 2 Banden.
Von Botta/Lange/Zimmermann, je 264
Seiten und je DM 49,-
DAS C-BUCH. NEU
Textbuch (dr CKurse und C-Anwendungen
auf PCs, Beschreibt samtliche Kanstrukle der
Sprache unter den Betriebssystemen MS
DOS, CP/M, ISIS, UNIX und fur die C:;Com
piler von MS, DR, LATTICE, INTEL. Didak:
tisch und typographisch auf
Mit ber 100 igen Bei
men fir PCs. t Realisierungen neuester
Softwarestrategien in .C
Von Herold/Unger. Herbst 86.
Etwa 500 Seiten. Softcover, DM 79,
UMWELTDYNAMIK
30 Programme flr kybernetische
Umwelterfahrungen auf allen
BASIC-Rechnern. Das Buch enthalt
beides: Ein Programmsystem zur
Simulation eigener Problemformu:
fierungen und 29 kommentierte
Modelibeispiele wie Baumsterben,
Heizungsbedarf, Nahrungsketten
usw. Prospekt anfordem.
Von Hartmut Bossel, 480 Seiten,
Softcover, DM 59.—
Erstes deutsches Referenzwerk
sdmtlicher Befehle und Systemroutinen
von Apple Il, Iiplus, lle
APPLE Ii PASCAL
Betriebssystem, 272 S.,DM 49.-
Sprache, 216 S., DM 39,
Pascal 12 Addendum, 112 S., DM 36,-
Grundlagenbuch, Bestseller
APPLE Il PASCAL
Eine praktische Anieitung,
5, DM 59,
mn
x2
XA
x
aL
¥2
= Sotes converses A YA = Alter y-Wert des eaereeeers Zum Editieren kénnen sie u.a. die Mouso-
= Variable beim Anzeigen von YN = Neuer y-Wert des Editiercursors
Shapes ym = Maximale y-Position bei ry-Shapes von Sammeldisk #19 ver-
‘Tabellenkapazitat Bildschirmaufbau wenden.
Aktuelles Shape beim Anzeigen
= Name Shapetabelle
= Aktueller Name Shapetabelle
= Aktuelle Zahl der Shapes
in der Tabelle
= x-Wert Startpunkt im Feld Kurzhinweise STD
BE (x.y) i
= y-Wert Startpunkt im Feld 1. Zweck: (Tabelle mit 10 Shapes)
BB(x.y) Eingeben, Andern und Zusammenfiigen
= Tabellenanfang ($609 oder
24576 dezimal)
Startadresse des aktuellen
2. Konfiguration:
von Shapetabellen
$0390: 9A 99 16 BO 1D OO 24 OO
$0598: 2C OM 2F OO 36 09 SF 90
$0319: 45 99 4c 09 62 90 24 17
$9318: 56 3E OD 94 09 1¢ 28 15,
spent Apple II+/e/c; DOS 3.3 oder ProDOS Sasobs 96 SF 1 OB os 20 36.56
= Aktuelle Adresse innerhalb
der Shapetabelle 3. Test:
x-Hert innerhalb BZ(x.y)
= xWert bei Berechnung der
Shapegrenzen 4, Sammeldisk:
Alter x-Wert des Editieroursors TABLE.EDITOR
see Ra My mNiearens © SHAPEEDITOR
Bildschirmaufbau SHAPE.CREATE
y-Wert innerhalb BZ(x.y) ST.EDIT
y-Wert bei Berechnung der
Shapegrenzen
5. Sonstiges:
RUN SHAPE.CREATE usw.
$0328: SE 27 94 99 27 25 99 25,
$9330: 2C BS AB 1E 27 09 35 3F
$0338: 27 25 27 2D 2E 24 $9 CO
$0349: 6B Bl FA 23 09 03 68 1E
$9348: 1E OD 94 9 24 24 2D 2D.
$0350: 56 SF GF 11 GE 24 24 96
$0358: MA 2D 6D 21 24 3c 6F 29
$0360: 04 OO 24 24 15 15 15 15
$0368: 24 24 OD 2D 2D DF 15 2E
$0370: FD 32 2D 2D OD 24 24 4D
$9378: 51 36 3E SF 04 09 90 90
TABLE.EDITOR
1900 REM #« Table.Editor ##
1910 REM *x Wolfgang Landgraf 19.04.86 +*
192) DS = CHRS (4):Q6 = "1"
1939 IF PEEK (194) <> 8 THEN POKE 193,1: POKE 14,8: POKE
2048,0: PRINT : PRINT DS"RUN TABLE. EDITOR"
1949 TEXT : i Ve oW=1
150 FOR I = 6 TO 3 : NEXT
1969 PRINT TAB( 15)"Shape~Table-Plus"
1970 FOR I = 9 70 39: PRINT NEXT
1980 POKE 34,4
1990 VTAB 6: HTAB 19: PRINT "Shapetabelle erstellen"
1109 VTAB 8: HTAB 10: PRINT "Shapetabelle editieren”
1119 VTAB 19: HTAB 10: PRINT "Einzelshapes erstellen"
1126 VTAB 12: HTAB 19: PRINT "Binzelshapes editieren"
1139 VTAB 14: HTAB 10: PRINT "Catalog Disklaufwerk 1"
1149 VTAB 16: HTAB 10: PRINT "Shape—Table-Plus->Snde"
1159 GOSUB 1176:FM = 1
1169 ON (VT — 4) / 2 GOTO 1299,1720.2220, 2590. 2650. 2799
1170 VTAB 19: FOR I : NEXT
1180 VTAB 21: FOR T
1199 VTAB 6: HTAB 7: PRINT
1299 VTAB 20: HTAB 10: PRINT "<- Wah] —>,dann <RET>"
1219 VTAB 20: HTAB 31: GET ES
1220 IF ES < > CHR$ (8) AND ES < > CHR$ (21) AND ES < >
CHRS (13) THEN 1219
1239 IF BS = CHR§ (15) THEN RETURN
1249 VN = VI + (2 © (ES = CHRS (21))) - (2 # (BS = CHRS
(8)))
1269 IF VN <6 THEN N= 19 +2eV+6eW
1260 IF VN > 10+ 2« V+6 + W THEN WN =6
1270 VTAB VT: HTAB HT: PRINT " ": VTAB VN: HTAB HT: PRINT
N5",VT = VN: GOTO 1219
128 REM ¢« Shapetabelle erstellen «+
1299 TA = 24576:VT = G:HT = 7:N = 0:SZ = 9:SB = O:V = 1:6
= 0: POKE - 16303,0
1300 HOME ; VTAB 6: HTAB 19: PRINT "Alte Tabelle
editiere
1319 VIAB 8: HTAB 19: PRINT "Neue Tabelle erstellen"
1329 VTAB 16: HTAB 10: PRINT "Shape.Creator aufrufen"
1339 VTAB 12: HTAB 10: PRINT "Hauptprogramm und Ende"
1349 GOSUB 1176:FM = 2
1359 ON (VT - 4) / 2 GOTO 136,1459, 2620. 1040
1360 GOSUB 2730
1370 FF = 1: ONERR GOTO 2760
1389 HOME ; VTAB 22: INPUT “Tabelle ('?'=CATALOG) :
iNS:N1S = NS
1399 ON ( LEFT$ (N$,1)
= Q$) GoTo 1299
NEXT
') GOTO 2650: ON ( LEFT$ (NS.1)
1499 PRINT : PRINT DS"BLOAD"NS", AS6OOD"
1410 N= ( PEEK (TA + 2) + 256 # PEEK (TA + 5) - 2) / 2:SZ
= PEBK (TA)
1420 IF N = SZ THEN HOME : VTAB 22: PRINT “Die Tabelle ist
voll !": FOR I = 1 70 2599: NEXT : GOTO 1949
1430 HOME : VTAB 22: PRINT N - SZ" Shape(s) haben noch
Platz 1”
1449 FOR I = 1 70 2599: NEXT : GOTO 1519
1459 GOSUB 2739
1469 FF = 2: ONERR GOTO 2760
1470 HOME : VTAB 22: INPUT "Anzahl der Shapes: ";NS:N =
VAL (NS): ON (NS = Q$) GOTO 1299: ON (N <1 OR N >
255) GOTO 1476
1489 TR = 2a N+2
1499 FOR I = TA TO TA + TB: POKE 1.9: NEXT
1890 POKE TA + 2,78 — 256 * INT (TB / 256): POKE TA + 3,
INT (1B / 256)
1519 SB = PEEK (TA + SZ * 2 + 2) + 256 ® PEEK (TA + SZ # 2
+3) 4+
1529 FM = 5: HOME : VTAB 22; INPUT "Shape ('?'=CATALOG)
SNS: ON ( LEPT$ (NS,1) = "?") GOTO 2650: ON ( LEFTS
(N$,1) = QS) GoTo 1290
1539 FF = 3: ONERR GOTO 2769
1849 PRINT : PRINT DS"BLOAD"NS". AS4090"
1550 POKE 252,0: POKE 255,64: XDRAW 1 AT 93,96
1569 HOME : VTAB 22: PRINT "Dieses Shape ? (J/N): ";: GET
BS: IF ES <> "J" THEN HGR : GOTO 1526
1579 I = 16387
ised I = 1 + 1:J = PERK (I): POKE SB +I - 16388,J:: IF J
= 9 THEN 1696
1899 GOTO 1589
169) SZ = SZ + 1:SE = SB + I - 16387 - TA: POKE TA,SZ: IF
s ‘THEN HOME : VTAB 22: PRINT "Die Tabelle ist
voll !": FOR I = 1 70 2509: NEXT : GOTO 1649
1619 POKE TA + 2 # SZ + 2,SE ~ 256 * INT (SE / 256): POKE
TA +2 © SZ +3, INT (SE / 256)
1620 HOME : VTAB 22: PRINT "Weiter ? (J/N): ":: GET ES: IF
ES <> "N" THEN HGR : GOTO 1510
1630 FF = 4; ONERR GOTO 2760
1649 HOME : VTAB 21: PRINT "Name: ( "N1$" ) = <RETURN>"
1650 VTAB 22: INPUT " "SNS: IF NS = "™" THEN NS = N1S
GoTo 1699
166 PRINT “Wird als ST."N$" abgespeichert.""
1670 PRINT : PRINT DS"BSAVE ST. "NS", ASGOOO, L"SE
1689 GOTO 1709
1699 PRINT : PRINT D$"BSAVE"NS" , AS6OOD, L"SE
1799 GOTO 1949
171 REM ¥## Shapetabelle editieren #«
14
Peeker 1/87
22ap
2250
2290
2300
2310
2320
2330
2340
2720 TA = 16384:VT = 6:HT = 7:FM = 3:HH = O:V = 0:
POKE - 16395,9
1739 HOME : VTAB 6: HTAB 19: PRINT "Die Tabelle
verlangern"
1749 VTAB 8: HTAB 19: PRIN “Shape~ Folge verandern”
1750 VTAB 19: HTAB 10: PRINT "Hauptprogramm und Ende"
1760 GOSUB 1170
1779 ON (VT = 4) / 2 GOTO 1799,1789, 1049
17ep 1: HGR
1796 5: ONERR GOTO 2760
1890 HOME : VTAB 22: INPUT "
MiNS:NIS = NS
1819 ON ( LEFT$ (NS,1) = "2") GOTO 2659: ON ( LEFTS (NS, 1)
= Q$) GoTo 1729
1626 PRINT : PRINT D$"BLOAD"NS", AS49909"
1830 SZ = PEEK (TA):I = TA + PEEK (TA + SZ * 2) + 256 «
PEEK (TA + SZ * 2+ 1)
1849 L = I + 1:J = PEEK (I): IF J <> 9 THEN 1849
1859 SL=1T- TA+2
1860 IF HH THEN 1990
1879 FF = 6: ONERR GOTO 2760
1880 HOME : VTAB 22: INPUT "Wieviel Shapes hinzu: "
1899 IF SZ +N > 255 THEN HOME : VTAB 22: PRINT "Insgesamt
nicht mehr als 255 Shapes |": FOR I = 1 70 2509: NEXT
GOTO 1886
1909 POKE TA - 2 » N,SZ: POKE TA - 2 * N+ 1,0: POKE TA,O
1919 FOR I= TA +2 70 TA + 2 # SZ STEP 2
1929 J = PEEK (I) + 256 + PEEK (I +1) +2«N
1939 POKE I - 2 # N,J - 256 * INT (J / 256): POKE 1.0
194 POKE I + 1-24 N, INT (J / 256): POKE IT + 1,0
1969 NEXT
1960 TA = TA - 2 * N:I = TA + PEEK (TA + SZ # 2) + 256 #
PEEK (TA + SZ 2+ 1)
197) I = 1 + 1:J = PEEK (I): IF J <> 9 THEN 1979
1989 I = I~ TA + 1: POKE TA + SZ # 2 + 2,1 ~ 256 + INT (I
/ 286): POKE TA + SZ * 2 +3, INT (I / 286): GOTO
2130
1999 POKE 253,64: POKE 232,0: FOR I= 1 10 2
2000 XDRAW 1 AT 93 * I,96:N1 = 1; IF PEBK (TA) = 1 THEN
VTAB 22: PRINT “Die Tabelle hat nur ein Shape!": FOR
= 1 70 1599: NEXT ; GOTO 1720
2029 HOME ; VTAB 21: PRINT "<- Wahl ->, <RETURN> =
Annahme":N = 1
VTAB 22: HTAB 1: PRINT “Shape-Nr.: "Nl" ";: GET BG
IF BS < > CHR (8) AND ES < > CHRS (21) AND Pe >
CHRS (13) THEN 2020
IF E$ = CHR (13) THEN N(I) = N: NEXT : GOTO 2999
N= N+ (ES = CHR$ (21)) - (ES = CHRS (8))
IF N <1 THEN N = PEEK (TA)
IF N > PEEK (TA) THEN N= 1
XDRAW N1 AT 93 # 1,96: XDRAWN AT 93 I,96:N1
GoTo 2020
= PEEK (TA + 2 + N(1)):W2 = PEEK (TA +2 * N(1) +
1):WS = PEEK (TA + 2m N(2)):W4 = PEEK (TA + 2» N(2)
+1)
2190 POKE TA + 2 « N(1),WS: POKE TA + 2 « N(1) + 1,84
2119 POKE TA + 2 * N(2),W1: POKE TA +2 * N(2) + 1.W2
2129 HOME : VTAB 22: PRINT "Nochmal ? (J/N): GET E$
IF ES <> "N" THEN HGR : GOTO 1999
2139 FF = 7: ONERR GOTO 2760
2149 HOME : VTAB 21: PRINT "Name: ( "N1$" ) = <RETURN>"
2159 VTAB 22: INPUT ” NS: IF NS =“ THEN NS = Ng
GoTo 2199
2169 PRINT “Wird als ST."NS" abgespeichert.""
2170 PRINT : PRINT D$"BSAVE ST."NS",A"TA" LYSL + 2 # N#
(HH = 0)
218 GoTo 2209
2199 PRINT : PRINT D$"BSAVE"NS", A"TA".LYSL + 2 * N # (HH =
9)
2200 HH = @: GOTO 1p49
2210 REM ** Einzelshapes erstellen +
2220 GOSUB 2730
2239 TA = 24876:N = 1:FM= 4
HOME ; VTAB 22: INPUT "Tabelle ('?'=CATALOG)
"SNS :NIS = NS
ON ( LEFTS (NS,2)
= Q$) GOTO 1949
2") GOTO 2659: ON ( LEFTS (NS, 1)
2260 FF = 8: ONERR GOTO 2760
2270 PRINT : PRINT D$"BLOAD"NS" , AS69990"
2280 POKE 232,90: POKE 233,96: POKE 16384,1: POKE 16385,0:
POKE 16386,4: POKE 16387,
XDRAW 1 AT 93,96:N1 = 1: IF PEEK (TA) < > 1 THEN 2320
HOME : VTAB 22: PRINT "Dieses Shape ? (J/N): ";: GET
ES: IF ES = "J" THEN 2499
GoTo 2249
HOME : VTAB 21: PRINT "<~ Wahi <RETURN> =
Annahme":N = 1
VTAB 22: HTAB 1: PRINT "Shape-Nr.: "Nl" ";: GET ES
IF E$ < > CHR$ (8) AND ES < > CHR$ (21) AND ES < >
CHRS (13) THEN 2330
2359 IF E$ = CHRS (13) THEN 2499
2360 N= N+ (ES = CHRS (21)) - (E$ = CHRS (8))
237) IF N <1 THEN N = PEEK (TA)
2389 IF N > PEEK (TA) THEN N= 1
2390 XDRAW N1 AT 93,96: XDRAW N AT 93,96:N1 coro 2339
2499 Sl = TA +N # 2:82 = Sl + 1:83 = S2 + 1:84 = S341
2419 SB = TA + PERK (S1} + 266 * PEEK (S2):I = SB - 1
2420 IF N < > PEEK (TA) THEN 2469
2439 T= 141
2449 J = PEEK (I): IF J = 9 THEN SE = I + 1: GOTO 2470
2459 GOTO 2439
2460 SE = TA + PEEK (SS) + 256 #PEEK (S4)
2470 FOR I = SB TO SE - 1: POKE 16388 + I ~ SB, PEEK (1)
NEXT
2489 POKE 233,64
2490 XDRAW 1 AT 186,96
2500
2519
2520
2530
2540
HOME : VTAB 22: PRINT "Shape auf Diskette schreiben 7
(J/M): ";: GET EG: IF E$ <> "J" THEN 2549
HOME : VTAB 22: INPUT “Name: “;NS: PRINT “Wird als
‘SH."N$" abgespeichert ."
FF = 9: ONERR GOTO 2769
PRINT : PRINT D$"BSAVE SH."NS",AS4900,L"SE — SB + 4
HOME : VTAB 22: PRINT "Nochmal ? (J/N): ";: GET ES:
IF BS < > "J" THEN 1940
2550 HOME : VTAB 22: HGR : PRINT "Neue Tabelle ? (J/N)
"“;: GET ES: IF E$ < > "J" AND ES < > "N" THEN 2550
256 IF ES = "J" THEN HGR : GOTO 2226
2570 I = 0: HGR : GOTO 2289
258 REM #* Einzelshapes editieren +#
2599 FF = 10: ONERR GOTO 2760
2600 PRINT : PRINT D$"RUN SHAPE. EDITOR"
2610 REM ¥» Shape.creator aufrufen ++
2620 FF = 19: ONERR GOTO 2769
2630 PRINT : PRINT D$"RUN SHAPE. CREATE"
2640 REM ¥* Catalog Drive 1 ##
2659 HOME : POKE - 16303,0
2660 PRINT ; PRINT D$"CATALOG"
2670 GET E$: PRINT E$: HGR
2680 ON FM GOTO 1949, 1379, 1770,2240, 1529
2690 REM +* Progranmende w«
2700 POKE 216,0: TEXT : HOME
2716 PRINT : END : REM Oder: PRINT D$"RUN HELLO"
2720 REM ** Bildschirm loeschen ##
2730
2740
2750
2760
HOME : VTAB 22: HGR2 : HGR
SCALE= 1:1 = O:J =
RETURN
REM #* Fehlerbehandlung ++
HOME ; VTAB 22: IF PEEK (222) = 6 THEN PRINT “Diese
Tabelle ist nicht auf der Disk !": GOTO 2810
HCOLOR= 3: ROT 9:
2770 IF PEEK (222) = 9 THEN PRINT "Die Diskette ist voll
i": GOTO 2819
2789 IF PEEK (222) = 8 THEN PRINT "Diskette defekt oder
Laufwerk offen !": GOTO 2816
2790 IF PEEK (222) = 4 OR PEEK (222) = 19 THEN PRINT
“Disketten,- File-Sohreibsohutz !": GOTO 2810
2899 PRINT "Eingabefehler |"
2819 FOR I = 1 TO 2000: NEXT : POKE 216,9: ON FF GOTO
1389, 1460, 1520, 1649, 1800, 1880, 2149, 2240, 2510, 1949
SHAPE.EDITOR
1909 REM ## Shape.Editor #+
1919 REM #*# Wolfgang Landgraf 20.94.86 +*
1920 D$ = CHRS (4):Q$ = "1"
1039
1949
1950
1960 TA =
1970
1989
gop
1199
1g
1120
1139
nag
1156
iiep
1179
IF PEEK (104) < > 64 THEN POKE 103,1: POKE 104,64
POKE 16384,0: PRINT : PRINT CHR$ (4)"RUN SHAPE, EDITOR"
IF PEEK (768) < > 19 THEN PRINT : PRINT CHRS
(4)"BLOAD ST.EDIT, A$309"
REM #* Auswahl des Shapes ++
24576: DIM BZ(21,21)
HOME ; VTAB 22: HGR ; HCOLOR= 3: ROT= §: SCALE= 1:N =
a
INPUT "Tabelle ('?' = Catalog): ";N$: ON ( LEFT$
(NS.1) = "?") GOTO S298: ON ( LEFTS (N$,1) = Q§) Gor
2360
FF = 1: ONERR GOTO 3149
PRINT : PRINT CHR$ rege ASepoN"
POKE 233,96: POKE 232,0:HS =
XDRAW 1 AT 149,96:N1 = 1: IF esx (TA) <> 1 THEN
1159
HOME : VTAB 22: PRINT “Dieses Shape ? (J/N): ":: GET
ES: IF ES = "J" THEN 1249
GOTO 1970
HOME : VTAB 21: PRINT "<- Wahl —>,<RET>=
Annahme, <ESC>=Abbruch":N = 1
VTAB 22: HTAB 1: PRINT "Shape-Nr.: "NI" ";: GET ES
IF E$ < > CHRS (8) AND E$ < > CHRS (21) AND ES < >
CHR (27) AND E$ < > CHRS (13) THEN 1169
Peeker 1/87
LALDERMYERBBL ALM EM
1189 IF BS = CHR$ (15) THEN N1 = N: GOTO 1249
1199 IF ES = CHR$ (27) THEN 19706
120 N= N + (E$ = CHRS (21}) - (E$ = CHRS (8))
1219 IF N < 1 THEN N = PEEK (TA)
122) IF N > PEEK (TA) THEN N= 1
123 XDRAW N1 AT 149,96: XDRAW N AT 140,96:N1 = N: GOTO
1160
1249 GOSUB 2970: RESTORE
1259 GOSUB 2386
1269 POKE 233,35
1270 REM ¥* Einlesen der Daten aus gezeichnetem Shape +
1289 Y = 3:¥)
1299 FOR J = 8863 TO 16931 STEP 192 Ye UY) = YL +
L:M= 7: FORT = 9 +2 HS T0 2-2 « HS STEP ( - HS
#2) 41
1300 A = PEEK (J + I)
1319 GosUB 2700
1320 NEXT : NEXT
1339 FOR J = 8991 TO 16159 STEP 1p24:¥ = Y + 7:¥1 = Yl +
L:M= 7: FOR I= 0 +2 HS TO 2~ 2% HS STEP ( - HS
#2) 41
1349 A = PEEK (J + I)
1350 GOSUB 2790
1360 NEXT : NEXT
137 FOR J = 9119 TO 15215 STEP 1p24:¥ = ¥ + 7:¥1 = v1 +
L:M= 7: FORT =9 +2 * HS 70 2-2» HS STEP ( - HS
* 2) 42
1380 A = PEEK (J + I)
1399 GOSUB 2790
1499 NEXT : NEXT
141g GosuB 2589
142 REM ex Grenzen des Shapes berechnen x
1439 HOME : VTAB 22: PRINT "Shape wird berechnet, bitte
warten ...":X1 = $:¥1 = 9:B = 9
144g YL = YL +1
1459 FOR X1 = 1 70 21:8 = B + BE(X1,¥1): NEXT
1460 IF B= 0 THEN 1440
1479 HO = Y1:Y1 =~ 1:3 =
1489 Yl = ¥1 + 1:¥2 = 21 - v1
1499 FOR X1 = 1 TO 21:B = B + BE(X1,¥2): NEXT
1690 IF B= 9 THEN 1489
1519 HU = Y2:x1 9
1529 X1 = XL +1
1530 FOR Yl = 1 TO 21:B = B + BG(X1,Y1): NEXT
1549 IF B = 9 THEN 1529
1550 HL = X1:X2 =~ 1:B = 9
156 X1 = Xl + 1: 21 - x1
1579 = B+ BB(X2,Y1): NEXT
1589
1590 A
1609 REM #e Voktoren bis zur oberen linken Ecke poken #s
1619 IF SY > HO THEN 1690
1620 IF SY = HO THEN 1739
1639 ¢ = HO ~ SY
164g I= I +1: IF C= 9 THENI=1
1650 IF C > = 3 THEN POKE U + I,146 — 3: GoTo 1649
166 IF C > = 2 THEN POKE U + I, 144 = 2: GOTO 1649
1679 IF C >= 1 THEN POKE U + 1,130
1689 GOTO 1730
1699 c = SY — HO
1709 T= 141: IF C= THENI=1-~21
1719 IF C > = 2 THEN POKE U + 1,216: POKE U +I + 1,72:1 =
I+ 1:C =~ 2: GOTO 1709
1720 IF C > = 1 THEN POKE U + 1,216: POKE U + I + 1,73
POKE UT 1 2.2051 = T+ 2
1739 IF HL > SX THEN 1819
1749 IF HL = SX THEN 1870
1789
1766
1rT) HEN POKE U + 1,219:¢ = C ~ 3: GOTO 1769
1780 ‘THEN POKE U + 1,219: POKE U + I + 1,201:1
= C ~ 2: GOTO 1769
1799 IF C > = 1 THEN POKE U + 1,91
1809 GOTO 1870
181d ¢ = HL ~ Sx
1820
1830 3 THEN POKE U + I,73:C = C ~ 3: GOTO 1829
1840 2 THEN POKE U + 1,73: POKE U +1 + 1,91:1 =
c- 2: GoTo 1820
1850 1 THEN POKE U + 1,75
1869 REM #* Startbytes des Shapes poken, dann Anfang des
Bildes bestimmen x«
1870 POKE 2048,1: POKE 2049,0: POKE 2050.4: POKE 2051,9
1889 J= J +1
1899 I = PEEK (2051 + J): IF I <> 0 THEN 1880
1999 U= 2051 + JJ = 0:0 = 9
1919 REM 4 Vektoren des Bildes poken *#
1929 FOR I = HO TO HU:A = (A = 9)
1939 IF I = 22 THEN 2230
1949 IF A = 0 THEN 2059
1950 FOR J = HL TO HR
1960
1979
1980
1999
2090
2019
2929
2030
2049
2950
2960
2070
2980
2998
2100
2119
2120
2130
2149
2159
2160
2170
2180
2199
2200
2219
2220
2230
2249
2250
2260
2270
2280
2290
2300 FF =
2310
2320
2330
2340
2350
2360
2370
2380
2590
2490 XA
24d
2420
2430
2440
2450
2468
2470
2480
2490
2500
2510
2520
2530
2540
2550
2560
2570
2580
2598
2690
2610
2620
2639
B= BAW, 1):¢ = C +1
IF J = HR THEN 2150
IF NOT B THEN 2920
IF C = 3 THEN U = U + 1:C = 1: GOTO 2919
IF C = 2 THEN POKE U, PEEK (U) + 40: NEXT
IF C = 1 THEN POKE U, PEEK (U) + 5: NEXT
IP C = 3 THEN POKE U, PEEK (U) + 64:U=U+1:¢=9
NEXT
IF C = 2 THEN POKE U, PEEK (U) + 8: NEXT
IF C = 1 THEN POKE U, PEEK (U) + 1: NEXT
FOR J = HR TO HL STEP - 1
B= BR(J,I):¢ = C+
IF J = HL THEN 2159
IF NOT B THEN 2129
IF C = 3 THEN U=U + 1:0 = 1: GOTO 2119
IF C = 2 THEN POKE U, PEEK (U) + 56: NEXT
IF C= 1 THEN POKE U, PEEK (U) +7: NEXT
IF C = 3 THEN POKE U, PEEK (U) + 192:U=U+41:0=9
NEXT
IF C = 2 THEN POKE U, PREK (U) + 24: NEXT
IF C = 1 THEN POKE U, PEEK (U) + 3: NEXT
IF NOT B THEN 2199
IF C = 3 THEN U=U+1:C = 1: GoTo 2180
IF C = 2 THEN POKE U, PEEK (U) + 48: GOTO 2220
IF C = 1 THEN POKE U, PEEK (U) + 6: GOTO 2220
IF C = 3 THEN POKE U, PEEK (U) + 128:U=U+1:0=9
IF C = 2 THEN POKE U, PEEK (U) + 16
IF C = 1 THEN POKE U, PEEK (U) +2
NEXT I
IF C > 9 THENU=U+1
POKE U,@
REM #¢ Shape auf Diskette, Neustart 7 +#
HCOLOR= 9: FOR I = 216 70 238: HPLOT I,89 TO I,111:
NEXT : HCOLOR= 3
POKE 233,8: XDRAW 1 AT 227,100: POKE 23,3: FOR I
TO 16: XDRAW 8 AT 227,199: FOR J = 1 TO 25: NEXT
NEXT
HOME : VTAB 22: PRINT “Shape auf Diskette schreiben ?
(3/i) GET ES: IF ES < > "J" THEN 2320
HOME : VTAB 22: INPUT “Name: SH.";N$: PRINT "Wird als
SH. "NS" abgespeichert."
2: ONERR GOTO 3149
PRINT ; PRINT CHR$ (4)"BSAVE SH. "NS", A2948,L"U — 2047
HOME : VTAB 22: PRINT "Nochmal ? (J/N): ";: GET BS
IF ES <> "J" THEN HOME : TEXT : GOTO 2360
HOME : VTAB 22: HGR : PRINT "Neue Tabelle ? (J/N):
"5: GED ES: IF E$ <> "J" AND E$ < > "N" THEN 2339
IF EG = "J" THEN 1070
N= 1:HS = 1: GOTO 1119
POKE 216,0: PRINT : PRINT CHR$ (4)"RUN TABLE, EDITOR"
REM #* Bowogungon Cursor und Shape +#
FH = (FH = 9): IF NOT FH THEN VTAB 21: HTAB 4: PRINT
"tartpunkt setzen"
IF PH THEN XA = 227:YA = aa POKE 233,96: GOTO 2419
= 87:YA = 8O:N = 72 a
XDRAW N AT TAYA XDRAW 4 AT XA, YA:
Yl: POKE 233,
X= XA:CY = YA
VTAB 22: HTAB 36: GET ES
IF ES < > "J" AND ES < > "K" AND EG < > "I" AND ES <
> "WAND ES <> "'S" AND E§ <> "PY AND BS < > "L"
AND ES < > CHR (27) AND ES < > CHRS (13) THEN 2419
XN = XA + ((E$ = "K") + 6 # (FH = 9 AND ES = "K")) —
J") + 6 * (FH = 9 AND BS = "J"))
YA + ((E$ = "M") + 6 * (FH = AND E$ = "M")) ~
({ES = "I") + 6 * (FH = @ AND EG = "I"))
IF NOT PH THEN X1 = X1 + (ES = "K") ~ (ES = "J")
IF NOT FH THEN Yl = Yl + (ES = "M") — (ES n}
IF FH AND XN > 260 THEN XN = 269; GOTO 2419
IF FH AND XN < 199 THEN XN = 199: GOTO 2410
IF FH AND YN > 169 THEN YN = 109: GOTO 2419
IF FH AND YN < 20 THEN YN = 20: GOTO 2410
IF FH AND ES = "S" THEN HS = (HS = 9): IF HS THEN
VTAB 21: HTAB 4: PRINT Normal": GOTO 2419
IF FH AND NOT HS AND E$ = "S" THEN VTAB 21: HTAB 4
PRINT "piegeln ": GOTO 2419
IF FH THEN 2599
IP ES = CHRS (27) THEN N= NL:HS = 9: POKE 233,96
GOTO 1240
IP XN > 187 THEN XN = 187:X1 = 21: GoTO 2410
IP XN < 17 THEN XN = 17:X1 = 1: GOTO 2419
IF YN > 189 THEN YN = 189:¥1 = 21: GOTO 2410
IF YN < 10 THEN YN = 19:¥1 = 1: GOTO 2419
IF FH AND E$ = CHR$ (27) THEN FH = 9: HGR : GOTO 1110
IF ES = CHRS (13) THEN 2689
IF NOT FH AND E$ = "P" OR ES = "LY OR ES = "S" THEN
2630
XDRAW NAT XA,YA: XDRAW NAT XN, YN:XA = XN:YA = YW
Goro 2419
XDRAW NAT XA, YA
Peeker 1/87
|
Das Buch zum
Apple-Writer II/Ile
»Das Buch zum Apple Writer II /Ile" Dienstprogrammen zur Pflege der
Das Buch eam wendet sich an alle, die dieses Textver- Daten und zu ihrem Einsatz in Einzel-
Apple-Writer fH /Ile arbeitungssystem schon einsetzen oder und Serienbriefen befindet sich eben-
einsetzen wollen. falls auf Diskette,
Hans Gabriel In einzeinen, in sich geschlossenen Ka- Das Buch zum Apple Writer II /Ile" be-
piteln erlernt der Leser alle Funktionen handelt sowoh! die alte Programmver-
1986, 155 S., kart., DM 36,— und erzielt schnelle Erfolgserlebnisse sion fiir den Apple Ilplus als auch die
ISBN 3-7785-1234-X Im ersten Kapitel werden typische Ar- neue Ausgabe, die 128-kByte auf dem
beitsstellungen der Textverarbeitung Apple Ile oder Apple llc unterstiltzt
und Ihre systematische Bearbeltung
vorgestellt. Das zweite Kapitel stellt in
logischen Funktionsgruppen die Befeh-
le vor, mit denen der Applewriter wah-
rend der Textarbeit direkt gesteuert
werden kann, Kapitel 3 zeigt die Pro-
grammierung des Appiewriters in der
Text-Kommando-Sprache TKS (WPL).
Dazu werden Beispiele analysiert. Auf
der Begleitdiskette zum Buch, die sepa-
rat bezogen werden kann, sind dariiber
hinaus umfangreiche Schwerpunkt-
erklérungen enthalten, die uber die
Help-Funktion vom Benutzer abgerufen
werden k6nnen, Eine kleine AdreB-
datenbank mit den dazugehérigen
Peeker 1/87 17
G4IFIFIFIFIIAIAAIAGS
2649
2650
2900
2919
2920
2930
2948
2959
2960
29798
2980
2990
3090
3019
3020
30308
3040
3050
3068
3070
3980
3990
3199
ESB)
3120
3130
3149
3150
3169
3178
3180
3199
3200
IF ES = "P" AND BZ(X1,¥1) = 9 THEN XDRAW N AT XA, YA:
XDRAW G AT XA,YA:KN = XA:YN = YA:BZ(X1,¥1) = 1:
HCOLOR= 3: HPLOT XN / 7 + 215,YN / 7 + 89: GOTO 2419
IF ES = "L" AND BZ(X1,Y1) = 1 THEN XDRAW N AT XA, YA:
XDRAW 6 AT XA,YA:XN = XA:YN = YA:BR(X1,Y1) = 0:
HCOLOR= 9: HPLOT XN / 7 + 215,YN / 7 + 89: HCOLOR= 3:
GOTO 2419
IF E$ = "S" THEN XDRAW 4 AT XA,YA:SX = X1:SY = Yl:
XDRAW 4 AT CX,CY: XDRAW N AT XA,YA:XN = KA:YN = YA:CX
= XA:CY = YA: GOTO 2410
XDRAW NAT XA,YA: GOTO 2410
RETURN
REM +* Golesene Bytes in Feld B(X1,Y1) eintragen +
IF A= 9 THEN FOR K = 1 TO 7:A(K) = 0: NEXT : GOTO
2850
IF A > = 64 THEN A(7 - 6 « HS) = 1:A = A ~ 64: GOTO
2730
A(T -— 6 # HS) = 6
IP A > = $2 THEN A(6 ~ 4 * HS) = 1:A = A ~ 32: GOTO
2750
A(6 — 44 HS) =o
IF A> = 16 THEN A(5 ~ 2 * HS) = 1:A= A ~ 16: GOTO
2770
A(S - 2% HS) = 0
8 THEN A(4) = 1:A = A ~ 8: GOTO 2790
4 THEN A(3 + 2 # HS) = 1:A= A 4: GoTo
A(3 +2 # HS) =o
IF A> = 2 THEN A(2 +4 * HS) = 1:4 = A— 2: GOTO
2830
A(2 +4 HS) = 0
IF A> = 1 THEN A(1 + 6 # HS) = 1:A= A - 1: GOTO
2850
A(1 + 6 # HS)
IF I : GOTO 2889
IF I=
FOR K
X=MaeK+ 12 494 10:K1=K+1 47
If A(K) = 1 THEN XDRAW 6 AT X,Y: HCOLOR= 3: HPLOT X /
7 + 215,¥ / 7 + 89: GOTO 2929
HCOLOR= 9: HPLOT X / 7 + 215,Y / 7 + 89: HCOLOR= 3
B&(X1,¥1) = A(K)
NEXT
leu
RETURN
REN #* Bildaufbau s+
HOME ; HGR : FOR I = 2048 TO 2350: POKE 1,0: NEXT :
POKE 233,3
FOR I = 13 70 160 STEP 7: HPLOT I,6 TO 1,153: NEXT
FOR I = 6 TO 153 STEP 7: HPLOT 13,1 TO 16,1: NEXT
HPLOT 216,39 TO 238,39 TO 238,61 TO 216,61 TO 216,39
DRAW 9 AT 220,37
HPLOT 216,89 TO 238,89 TO 238,111 TO 216,111 TO
216,89
DRAW 19 AT 226,87
FOR I = 1 TO 32: READ A,B,C: DRAW A AT B,C: NEXT
DATA 1,8,19,5,8,38,1,5,73,5,10,73,1,5,108,5,19,108,2,5,
143,3,10,143
DATA 1,17,2,8,45,2,1,77,2,8,82,2,1,112,2,5,117,2,2,147,
2,8, 152,2
DATA 1, 166,19,5,166,38,1, 163,78,3, 168,75, 1,163, 198.5,
168, 198,2, 163, 143,5, 168, 143 :
DATA 1,17,157.5,45, 187, 1,77, 157,8,82, 187, 1,112, 187.5,
117, 157, 2,147, 187,3, 162, 157
POKE 233,96; XDRAW N AT 227,50: POKE 233,3
VTAB 21: HTAB 1: PRINT "<S>piogoln": VTAB 21: HTAB
36: PRINT "I"
VTAB 22: HTAB 1: PRINT "<P>unkt, <L>oeschen
Cursor ->": VTAB 22: HTAB 35: PRINT "J": VTAB 22
HTAB 37: PRINT "K"
VTAB 23: HTAB 1: PRINT "<RET> Editier-Endi
HTAB 36: PRINT "W": RETURN
REM ## Fohlerbehandlung +
HOME : VTAB 22: IF PEEK (222) = 6 THEN PRINT "Diese
Tabelle ist nicht auf der Disk !": GOTO 3199
IF PEEK (222) = 9 THEN PRINT "Die Diskette ist voll
1": GOTO 3198
IF PEEK (222)
Laufwerk offen |
IF PEEK (222)
"Disketten,~ File-Schreibschutz !
PRINT "Eingebefehler |"
FOR I = 1 70 2690: NEXT
VTAB 23
8 THEN PRINT "Diskette defekt oder
: GOTO 3199
4°OR PEK (222) = 19 THEN PRINT
GOTO 3199
POKE 216,0: ON FF GOTO
1078, 2290
TEXT ; HOME : PRINT : PRINT CHRS (4)"CATALOG": GET
ES: PRINT : GOTO 1979
SHAPE.CREATE
1909 REM ## Shape.Create ##
1919 REM ** Wolfgang Landgraf, Juni 86 ++
192 REM ex Start des Programmes bei $400) #«
1936 D§ = CHR$ (4):9$ ="!
1949 IF PEEK (194) < > 64 THEN POKE 103,1: POKE 194,64
POKE 16384,9: PRINT D$"RUN SHAPE. CREATE"
1969 TEXT; HOME
196 IF PEEK (768) < > 19 THEN PRINT D$"BLOAD ST.EDIT"
1970 FOR I = 9 TO 39: PRINT "-";: NEXT
1980 PRINT " SHAPE, CREATOR"
1999 FOR I = 9 TO 39: PRINT "-";: NEXT
1199 POKE 34.4
1119 REM #* Wahl der Tabelle #*
1126 POKE 22,9: POKE 235,5:TA = 24576
1139 VTAB 7: PRINT "<N>eue Tabelle": PRINT "<L>ade
1149
1159
leo
1179
1180
iio
1200
1219
1229
1230
1240
1259
1260
1279
1280
1290
1309
1319
1329
1330
1349
1389
1369
1370
1380
1399
1499
1419
1426
1439
1449
1459
1460
1470
1480
1499
1590
1519
1520
1530
1549
1559
1560
1870
1589
1599
1600
1619
1626
Tabelle”
VTAB 19: HTAB 1: PRINT “Wahl .., ";: GET ES
IF E$ <> "L" AND ES <> “N" THEN 1149
IF E$ = "N" THEN 1270
VTAB 12: HTAB 1
INPUT "Tabelle (*?' = Catalog): ";NS: ON ( LEFTS
(NS,1) ") GOTO 3090: ON ( LEFTS (NS,1) = Q$) GOTO
1130
FF = 1: ONERR GOTO 293
PRINT CHR$ (4)"BLOAD"NS" , ASGOOO":N1$ = NS
N= ( PEEK (TA + 2) + 256 # PEEK (TA +3) - 2) /2
SN = PEEK (TA): PRINT : IF SN = N THEN PRINT "Tabelle
voll": FOR I = 1 TO 1999: NEXT : GOTO 105
PRINT "Die Tabelle kann ";N;" Shapes haben !": PRINT
PRINT “Jetzt hat sie ";SN;" Shape(s) !": PRINT
FOR I = 1 70 2000: NEXT
GOTO 1339
VTAB 12: HTAB 1: INPUT “Anzahl der Shapes in der
Tabelle :";E$:N = VAL (E$): IF N <1 OR N > 255 THEN
1279
N= 24 N42
FOR I = TA T0 TA + TN: POKE I,: NEXT I
POKE TA + 2,TN ~ 256 * INT (TN / 256)
POKE TA + 3, INT (TN / 256)
REM #* Startbedingungen bestinmen +#
XM = 169:YM = 153
DIM BE(21.21)
GOsuB 2780
FF = 3: ONERR GOTO 2930
U= TA + PEEK (TA + SN * 2+ 2) + 256 # PEEK (TA + SN
#243)
FOR I = U TO U + 392: POKE 1,0: NEXT
XA = 87:YA = 89:X1 = 11:¥1 = 11:8X
XDRAW 7 AT XA,YA: XDRAW 4 AT KA,YA:CX
REM #* Tastatureingabe +
VIAB 22: HTAB 36: GET BS
IF E$ <> "J" AND BS < > "K" AND ES <> "I" AND ES <
> "M" AND E$ < > "S" AND BS < > "P" AND BS < > "L"
AND ES < > CHRS (27) AND BS < > CHR$ (15) THEN 1416
x1:SY = YL
XA:CY = YA
XN = XA + (ES = "K") #7 - (EG = "J") #7
YN = YA + (E§ = "M") © 7 - (E$ = "I") #7
XL = X1 + (ES = "K") - (ES ="
YL = ¥1 + (ES = "M") - (ES = "I")
IF XN > XM — 3 THEN XN = XM - 3:X1 = 21: GOTO 1419
IF XN < 17 THEN XN = 17:X1 = 1: GOTO 1419
IF YN > YM - 3 THEN YN = YM - 3:¥1 = 21: GOTO 1419
IF YN < 19 THEN YN = 10:¥1 = 1: GOTO 1419
IF ES = CHRS (13) THEN XDRAW 7 AT XA,YA: XDRAW 4 AT
CX,CY: GOTO 1609
IF E$ = "P" OR B$ = "L" OR EG = "S" THEN 1549
XDRAW 7 AT XA,YA: XDRAW 7 AT XN,YN:KA = XN:YA = YN:
Goro 1419
XDRAW 7 AT XA,YA
IF E$ = "P" AND BR(X1,Y1) = 0 THEN XDRAW 7 AT XA, YA’
XDRAW 6 AT XA,YA:XN = XA:YN = YA:BB(X1,¥1) = 1: FOR T
= 9 10 3 STEP 3: HCOLOR= I: HPLOT XM + 15 + X1,7 + Yl
+ 34 (I = 3): NEXT : GOTO 1419
IF ES = "L" AND BZ(X1,Y1) = 1 THEN XDRAW 7 AT XA, YA:
XDRAW 6 AT XA,YA:XN = XA:YN = YA:BZ(X1,¥1) = 0: FOR I
= 3 10 0 STEP - 3: HCOLOR= I: HPLOT XM + 15 + X1,7 +
Yl + 34% (I = 9): NEXT : GOTO 1410
IF ES = "'S" THEN XDRAW 4 AT XA,YA:SX = X1:SY = YL
XDRAW 4 AT CX,CY: XDRAW 7 AT XA,YA:XN = XA:YN = YA: CX
= XA:CY = YA: GOTO 1419
XDRAW 7 AT XA,YA: GOTO 1419
REM #* Eckpunkte festlegen ++
HOME : VTAB 22: PRINT "Shape wird berechnet, bitte
warten ...":X1 = §:¥1 = 9:B=9
y= Yl+1
FOR X1 = 1 TO 21:B = B + BE(x1,Y1): NEXT
Peeker 1/87
u | ; qralik gg
1639 IF B = 9 THEN 1619 2420 HCOLOR= 0: FOR I = XM +13 70 XM + 43: HPLOT I,65 70
1649 HO = YI:Yl =~ 1:B=9 1,199: NEXT : HCOLOR= 0:A = 0
165 Y1 = Y1 + 1:¥2 = 21 ~ YI 2430 IF ES < > "J" AND ES <> "N" THEN 2419
1669 FOR X1 = 1 70 21:B = B + BE(X1,Y2): NEXT 2449 U=U+1
1670 IF B = 9 THEN 1650 2450 IF ES = "J" THEN SN = SN + 1: IF SN <N THEN TN =U ~
1680 HU = Y2:X1 = 0:B = 9 TA: POKE TA + 2 * SN + 2,7N - 256 * INT (TN / 256)
1699 X1 = X1 41 POKE TA + 2 ® SN+ 3, INT (TN / 256)
1700 FOR Y1 = 1 70 21:B = B + BE(X1,Y1): NEXT 2469 POKE TA,SN
@ THEN 1698 2470 REM #* Anzeige Auswahlmenu #*
XLxXl =- 1:B=9 2480 HONE : VTAB 21: PRINT "(N)eues Shape zeichnen"
Xi + 1:x2 = 21 - x1 2490 VTAB 22: PRINT "(Z)eigen der Shapes"
2749 FOR Y1 = 1 70 21:B = B + BZ(X2,¥1): NEXT 2500 VTAB 23: PRINT "(T)able auf Diskette ";: GET ES
1759 IF B = 9 THEN 1739 2519 ON (ES = "T") GOTO 2680: ON (E$ = "2") GOTO 2570
1760 HR = X2:C = O:1 = OJ = p:U=U-1 2520 IF SN = N THEN HOME : VTAB 22: PRINT "Die Tabelle ist
177 REM *# Vektoren bis zur oberen linken Ecke poken #* + voll 1": FOR I = 1 TO 2900: NEXT : GOTO 2480
1789 IF SY > HO THEN 1860 2530 HOME ; VTAB 22: PRINT “Rahmen léschen (J/N): ";: GET
1799 IF SY = HO THEN 1999 ES
1899 C = HO - SY 2549 IF ES = "N" THEN GOSUB 2899: GOTO 1370
1810 T= 141: IF C= 0 THEN I =1- 2550 IF ES = "J" THEN HOME : VTAB 22: PRINT "Raster wird
1820 IF C > = 3 THEN POKE U + 1,146: = ¢ - 3: GOTO 1810 geldscht 1"; FOR I= 170 21: FOR J = 1 70 21:BZ(I,J)
1830 IF C >= 2 THEN POKE U + 1,144:¢ = C - 2: GOTO 1810 = 0: NEXT : NEXT : GOTO 1350
1840 IF C > = 1 THEN POKE U + 1,130 2560 REM #* Zeigen der bisher definierten Shapes +#
1850 GoTo 1909 2570 IF PEEK (TA) = @ THEN HOME : VTAB 22: PRINT "Es ist
1869 C = SY - HO kein Shape definiert |": FOR I = 1 T0 2000: NEXT
1870 T= 1 +1: IF C=O THENI= 1-1 coro 2489
188) IF C > = 2 THEN POKE U + 1,216: POKE U +I + 1,72:1 = 2589 HOME : VTAB 22: PRINT "<~ , -> <RET> = Ende":N1 = 1:M
I+ 1:C= 6 - 2: GOTO 1879 = 1: POKE 233,96: XDRAW N1 AT XM + SX + 15,SY + 190
1899 IF C >= 1 THEN POKE U + 1,216: POKE U +I + 1,73: 2590 VTAB 23: HTAB 1: PRINT "Shape-Nr.: "NI" ";: GET &$
POKE U + I + 2,203:1 = 1 +2 2600 IF E$ < > CHRS (8) AND ES < > CHR$ (21) AND ES < >
1999 IF HL > SX THEN 1989 CHRS (13) THEN 2599
1919 IF HL = SX THEN 2030 2610 IF ES = CHRS (13) THEN XDRAW NI AT XM + SX + 15,SY +
1920 ¢ = Sx - HL 190: POKE 235.3: GOTO 2489
1939 T= 141 2620 M = M + (ES = CHRS (21)) - (ES = CHRS (8))
1949 IF C > = 3 THEN POKE U + 1,219:¢ = C - 3: GOTO 1939 2630 IF M <1 THEN M = SN
1959 IF ¢ >= 2 THEN POKE U + 1,219: POKE U + I + 1,201:1 2640 IF M > SN THEN M = 1
= I+ 1:¢ = ¢ ~ 2: GOTO 1930 2650 XDRAW N1 AT XM + SX + 15,SY + 109: XORAW M AT XM + SK
1969 IF C > = 1 THEN POKE U + 1,91 + 15,SY + 190:N1 =
1978 GOTO 2030 2660 GOTO 2599
198) C = HL - Sx 2670 REM *% Tabelle auf Diskette «+
1999 I 2680 FF = 2: ONERR GOTO 2930
2000 1 3 THEN POKE U + I,73:0 = G - 3: GOTO 1999 2690 HOME : VTAB 22: PRINT "Name: ( "NIS" ) = <RETURN>"
2010 1 = 2 THEN POKE U + 1,75: POKE U + 1 + 1,91:1 = 2700 VTAB 23: INPUT " "NS: IF NS = "" THEN NS = N1S
I c — 2: coro 1999 Goro 2748
2020 1 1 THEN POKE U + 1,75 2719 PRINT "Wird als ST."N§" abgespeichert."
2030 I ) 2720 PRINT D§"BSAVE ST. "NS", AS6O9O,L"U - TA + 1
2049 J T= PEEK (U + J): IF 1 <> THEN 2049 2730 NIS = "ST." + NS: GOTO 2759
2050 U J = 0:6 = 0 2740 PRINT DS"BSAVE"NS", ASGOOO.L"U - TA + 1
2960 FO 0 T0 HU:A = (A= 9) 2750 HOME : VTAB 22: PRINT "Weiter (J/N): ";: GET ES: ON
2070 IF THEN 2370 (ES = "J") GOTO 2489: ON (ES = "N") GOTO 2769: GOTO
2080 IF THEN 2199 2780
2999 FOR J = HL TO HR 2760 POKE 216.9: TEXT : HOME : PRINT DS"RUN TABLE. EDITOR"
2199 B = BRJ.T):c=C +1 2770 REM ¥® Bildschirmautbau #*
2119 IF J = HR THEN 2299 2789 HGR : HCOLOR= 3: ROT= 0: SCALE= 1
2120 IF THEN 2160 2799 FOR I = 15 TO XM STEP 7: HPLOT I,6 TO I,YM: NEXT
2130 IF ‘THEN U = U + 1:0 = 1: GOTO 2150 2800 FOR I = 6 70 YM STEP 7: HPLOT 13,1 TO XM,I: NEXT
2149 IF ‘THEN POKE U, PEEK (U) + 40: NEXT 2819 FOR 1 = 1 70 32: READ A,B,C: DRAW A AT B,C: NEXT
2160 IF C = 1 THEN POKE U, PEEK (U) + 5: NEXT 282 DATA 1,8,19.5,8,38,1,5,73,3,19.75,1,5,198,5,19, 108.2,
2160 IF C = 3 THEN POKE U, PEEK (U) + 64: = U + 1: 5,143,3, 19,143
NEXT 2830 DATA 1,17,2,5,45,2,1,77,2,3,82,2,1,112,2,5,117,2,2,147,
2170 IF C = 2 THEN POKE U, PEEK (U) + 8: NEXT 2,3, 152,2
218) IF C = 1 THEN POKE U, PEEK (U) + 1: NEXT 2849 DATA 1,166, 19,5, 166,38, 1, 163,73,3, 168,73, 1,163, 198,5,
2199 FOR J = HR 70 HL STEP - 1 168, 108,2, 163, 143,5, 168, 143
2200 B = BE(J,1):0=c +1 2859 DATA 1,17,157,5,45, 157, 1,77, 187,3,82, 157,1,112,157,5,
2219 IF J = HL THEN 2290 117, 187,2, 147, 187,3, 152, 187
2220 IF NOT B THEN 2260 2860 RESTORE :A = 9
2230 IF C = 3 THEN U =U +1:C = 1: GOTO 2250 2870 FOR I = 6 TO 30: HPLOT XM + 14,1 TO XM + 38,1: NEXT
2249 IF C= 2 THEN POKE U, PEEK (U) + 56: NEXT 2880 HPLOT XM + 14,49 TO XM + 38,40 TO XM + 38,64 TO XM +
2250 IF C= 1 THEN POKE U, PEEK (U) +7: NEXT 14,64 TO XM + 14,49
2260 IF C = 3 THEN POKE U, PEEK (U) + 192:U =U + 1:C 2899 HOME : VTAB 21: HTAB 1: PRINT "<S>tartpunkt setzen"
NEXT VTAB 21: HTAB 36: PRINT "I"
2270 IF C = 2 THEN POKE U, PERK (U) + 24: NEXT 2900 VTAB 22: HTAB 1: PRINT “<P>unkt, <L>oeschen
2280 IF C = 1 THEN POKE U, PEEK (U) + 3: NEXT Cursor —>": VTAB 22: HTAB 35: PRINT "J": VTAB 22
2299 IF NOT B THEN 2339 HTAB 37: PRINT "Kk"
2309 IF C= 3 THEN U = U+1:¢ = 1: GOTO 2320 2910 VTAB 23: HTAB 1: PRINT "<RET> Editicr—Ende": VTAB
251 IF C = 2 THEN POKE U, PEEK (U) + 48: GOTO 2560 HTAB 36: PRINT "M": RETURN
2320 IF C = 1 THEN POKE U, PEEK (U) + 6: GOTO 2360 2920 REM #x Feblerbehandlung +x
2330 IF C = 3 THEN POKE U, PEEK (U) + 128:U-U+1:0=9 2930 HOME : VTAB 22: IF PEEK (222) = 6 THEN PRINT "Diese
2340 IF C = 2 THEN POKE U, PEEK (U) + 16 Tabelle ist nicht auf der Disk !": GOTO 2970
2350 IF C= 1 THEN POKE U, PERK (U) +2 2949 IF PEEK (222) = 9 THEN PRINT "Die Diskette ist voll
2360 NEXT T I": GoTo 2970
2370 IF C > 0 THEN U'= U +1 2950 IF PEEK (222) = 4 OR PEEK (222) = 19 THEN PRINT
2389 POKE U.0 "Disketten,— File-Schreibschutz 1": GOTO 2970
2399 REM sx Anzeigen des Shapes; Frage, ob anhdngen «+ 2960 PRINT "Eingabefehler !"
2409 POKE TA,SN + 1: POKE 233,96: XDRAW SN +1 AT XM + 15 2970 FOR I = 1 TO 2000: NEXT : POKE 216,0: ON FF GOTO
+ SX,75 + SY: POKE 233,3: POKE TA,SN: FOR I~ 1 70 1179, 2689, 2989
16: XDRAW 8 AT XM + 16 + SX,75 + SY: FOR J = 1 70 59 2980 HOME : VTAB 22: PRINT "Wenigstens ein Pankt muss
NEXT : NEXT gesetzt sein !": FOR I = 1 TO 2000: NEXT : GOSUB
2419 HOME : VTAB 22: PRINT "Save Shape-Nr.";SN + 1;" 2899: GOTO 1360
(J/N)"5: GET BS 2990 REM #* Catalog der Diskette *#
3990 PRINT : PRINT DS"CATALOG": GET E$: HOME : GOTO 1176
Peeker 1/87 19
Der Trace-Fehler im
BASIC.SYSTEM
oder wie man Katastrophen vermeidet
Cogito ergo erro
Ich denke, also irre ich mich
(frei nach R.Descartes)
Nachdem sich das BASIC.SYSTEM seit
nunmehr rund zwei Jahren auf dem Markt
befindet und damit von Tausenden im
praktischen Einsatz getestet wurde, hat
nun ein Autor der amerikanischen Zeit-
schrift Call A.p.p.l.e." einen Program-
mierfehler ans Tageslicht gebracht, der
dort jedoch nur angedeutet, aber nicht be-
hoben wird. Das Erstaunliche an diesem
Fehler: Es handelt sich nicht um eine exo-
tische Kleinigkeit wie z.B. die CATALOG-
und $48-Bugs von DOS 3.3, Uber die sei-
tenlange Artikel geschrieben worden sind,
sondern um einen kompletten Systemab-
sturz, der bei der Arbeit mit Applesoft je-
derzeit auftreten kann und unter Umstan-
den das Programm zerstort. Die in diesem
Beitrag vorgeschlagene Korrektur ist des-
halb fiir jeden Applesoft-Programmierer
eine unbedingte Notwendigkeit.
1. Auftreten und Auswirkungen
Das BASIC.SYSTEM benutzt die TRACE-
Funktion von Applesoft zur standigen
Uberpriifung des Programmablaufs:
@ Beim Start des BASIC.SYSTEMs wird
das TRACE-Flag von Applesoft gesetzt
und bleibt von da an standig aktiv. Der
Befehl NOTRACE wird vom BASIC.SY-
STEM unwirksam gemacht.
®@ Applesoft gibt bei der Ausfiihrung eines
Programms jeweils ein TRACE-Zeichen
aus, wenn eine der beiden folgenden Be-
dingungen erfiillt ist:
20
von Arne Schapers
~ Der nachste Befehl befindet sich am
Anfang einer Programmzeile.
~ Innerhalb einer Programmzeile wurde
ein Doppelpunkt (,.:“) als Trennzeichen
zwischen zwei Befehlen erkannt.
@ Die Ausgabe des TRACE-Zeichens
fuhrt zu einem Sprung in das BASIC.SY-
STEM, wo dieser ,nachste Befehl" Uber-
prift wird. FLASH schaltet z.B. die interne
TRACE-Erkennung um. PRINT bewirkt,
daB die nachste Ausgabe auf ,,Control-D“
geprtuft wird usw.
@ Die Uberwachungsroutine arbeitet nur
dann korrekt, wenn der ,nachste Befehi"
am Anfang einer Zeile bzw. nach einem
Doppelpunkt zulassig ist.
Unter ,unzulassig" ist jeder Befehl als
Applesoft-Token zu verstehen, der nur in
Kombination mit anderen Befehlen ausge-
fulhrt werden kann und nicht am Anfang
einer Zeile stehen darf, also:
— TAB(, SPC( < nur nach einem PRINT-
Befehl erlaubt;
— TO, STEP < nur nach einem FOR-
Befehl erlaubt;
— FN, AT —nur nach DEF bzw. HLIN/VLIN
erlaubt;
— AND, NOT, OR < logische Operatoren;
-+,-,%,/, tT, >, <, = <arithmetische
und relationale Operatoren;
— SGN, INT, ABS, ... <— samtliche Funk-
tionen
Wird eines dieser reservierten Worter in
einem Variablennamen verwendet, rea-
giert Applesoft normalerweise mit einem
»?SYNTAX ERROR" und bricht die Pro-
grammausfiihrung ab. Unter dem BASIC.
SYSTEM fihrt derselbe Fehler nicht zu
einer Meldung, sondern zu einem Sy-
stemabsturz. Beispiele:
10 NOTENWERT = 4
Diese Zeile wird von Applesoft als 10 NOT
ENWERT = 4 gelistet. thre Ausfihrung
erzeugt unter der Version 1.1 des BASIC.
SYSTEMs die Ausgabe von #10, danach
hilft nur noch ein RESET weiter. Unter der
Version 1.0 hat eine Zeile wie
10 POSITION = 100
dieselbe Wirkung.
10 ORDNUNG = X
Diese Zeile wird von Applesoft als 10 OR
DNUNG = X gelistet. Unter der Version
1.1 bewirkt ihre Ausfiihrung, daB das Volu-
me-Directory der zuletzt benutzten Dis-
kette in einer Endlosschleife immer wieder
gelesen wird. Unter der Version 1.0 wird
410 ausgegeben, danach hangt das Sy-
stem
Unter der Version 1.1 fuhrt eine Zeile, die
mit einem Pluszeichen beginnt, bei drei
von fiinf Versuchen zum Verlust des kom-
pletten Programms. Dasselbe ist unter der
Version 1.0 flr den Befehl USR der Fall
Abhangig davon, ob das System mit einem
6502 oder 65C02 ausgeriistet ist, ergeben
sich unterschiedliche Auswirkungen man-
cher Befehle. Der 65C02 fihrt nicht-defi-
nierte Opcodes als NOPs aus, der 6502
kommt dabei villig durcheinander.
2. Detaillierte Herleitung
Um den Ablauf eines Applesoft-Pro-
gramms nicht mehr als unbedingt nétig zu
verlangsamen, ist die Uberwachungsrouti-
ne des BASIC.SYSTEMs auf maximale
Geschwindigkeit optimiert worden und ar-
beitet_ mit einem selbstmodifizierenden
Sprung. Disassembler-Listing 1 gibt die
relevanten Stellen der Version 1.1 wieder,
Peeker 1/87
Disassembler-Listing 2 die Sprungtabel-
le. Der Ablauf fiir die Version 1.0 ist exakt
derselbe, nur daB die absoluten Adressen
unterschiedlich sind:
~ Auslesen des ,nachsten Befehis“ von
Applesoft. Dieser Befehl ist als ,, Token“
kodiert, wird also durch ein Byte darge-
stellt, dessen Wert zwischen $80 und $FF
liegt.
— Der Wert des Tokens wird zur direkten
Adressierung einer Tabelle verwendet.
Wenn das dort gelesene Byte einen Wert
gréBer/gleich $80 hat, folgt ein direkter
Sprung zu Applesoft, ansonsten wird es
als , Sprungoffset“ eingesetzt.
— Ausfiihrung des soeben modifizierten
Sprungs. Flir PRINT und IF ergibt sich ein
»Sprungoffset* von $00 und damit die
Fortsetzung des Programms auf der
Adresse $9EFE, fiir LIST ein Sprung zu
$9F11 usw.
— Je nach Art des Befehis werden ver-
schiedene Flags des BASIC.SYSTEMs
gesetzt. Die TRACE-Kontrollroutine endet
in jedem Fall mit einem Sprung in den
Applesoft-Interpreter hinein, wo der Be-
fehl schlieBlich ausgefiihrt wird.
Samiliche ,zulassigen“ Befehle von Ap-
plesoft haben Tokens im Wertebereich
von $80..$BF. Die Sprungtabelle hat des-
halb eine Lange von $40 Bytes. Da eine
Begrenzung des Token-Wertes auf den
Bereich $80..$BF fehit, fuhren ,unzulassi-
ge" Befehle Uber das Tabellenende hin-
aus und lesen Werte aus der nachfolgen-
den Tabelle, die die Startindexe fir den
Vergleich mit der internen Kommando-
tabelle (CMDTAB) enthalt. Die Version 1.1
des BASIC.SYSTEM kennt das Komman-
do BYE, das in der Version 1.0 nicht ent-
halten ist. Aus diesem Grund sind die
Startindexe unterschiedlich — und damit
auch die Wirkung ,,unzulassiger“ Befehle.
Der modifizierte Sprung flhrt also _,,wild“
in den folgenden Code der TRACE-Uber-
wachung hinein — in den meisten Fallen
zwischen Opcodes und die dazugehdri:
gen Operanden. So ergibt sich z.B. fiir
»OR" in der Version 1.1 ein Sprungoffset
von $04 und die Befehisfolge LDX
$03AD,Y/CLV/STA $BE88.., jede nachfol-
gende Ausgabe flhrt zu einem Sprung in
die CATALOG-Routine hinein.
3. TRACE.KORREKTUR
Da eine Verlangerung der Sprungtabelle
um $40 Bytes aus naheliegenden Griin-
den ausscheidet, muB die TRACE-Kon-
trolle um einen Tesi auf ,Token gréBer
$BF" und eine entsprechende Verzwei-
gung erweitert werden. Zwei Méglichkei-
ten bieten sich dazu an:
Peeker 1/87
prodos
Disassembler-Listing 1
9ECE- Ap 90 LY #899
9ECa- 61 BB LDA ($88), ; Ist das nachste Statement
QECA- 39 25 BMI $9EF1 ein Token? Sprung wenn ja
9BCC- FO 20 BEQ S9EEE ; <P>: Zeilenende in Applesoft
; (automatisches" FRE bzw. Test)
OBEe- Ad Loy #$99 weiter in Applesoft
9BEA- 81 BB LDA ($B8),¥ } Simulation von CHRGOT
SEBC- C9 3A CMP 483A bomgng
9BEE- 4¢ 20 D8 © JMP_— $0820 Applesoft: GOCMD, NEWSTT (vel. $9F2F)
Nachstes Byte im Applesoft—Programmtext ist Token
SEFI- 85 33 STA $33 ) —> "Prompt"
QBR3- AB TAY } Vergleich mit Tabelle, Adressierung
9EP4- 8999 B7 LDA $8799, ber das Token ($89. ,$BF)
QEF7- 30 FS BNI $9BEE } ok ~ keine Aktion
9EF9- 8D FD 9E STA $9EFD } Tabellenwert => Sprungoffset
SEFC- DD +x BNE $Qee« } dieser Sprung wird modifiziert!
SEFE- 85 33 STA $33 } PRINT und IF-Konmando: $33 = 99
9FO0- 8D 4¢ BE STA CHRLAST } <- kein Abfangen doppelter <CR>s
9FP3- AD 93 BB LDA $8803 } VSYSOUP auf STATE 4/8 ($9DA3)
9F96- 8038 BE STA VSYSOUT Wenn als nachstes ein Ctrl-D aus-
OFS AD 94 BB LDA $B804 gedruckt wird —> State 8, ansonsten
9F9C- 8D 39 BE STA VSYSOUT#1 zuriiok 2u State 4
oFpF- Dp 1D BNE $9F2E ) Malways": NEXT STATEMENT
9FL1- 9 91 LDA #891 ; LIST-Befenl: $33 = #1 - nur relevant
9FI3- 85 33 STA $33 fiir Ausgabe in eine OUT-Datei
SFIS DB 17 BNE $9F2E Ausfihrung Applesoft-Statement
eF17- a9 92 LDA #802 j CALL-Befehl: $35 = 92 - nur relevant
9FIS- 85 33 STA $33 fir Ausgabe in eine OUT-Datei
9F1B- Dg 11 BNE $9F2E : Ausfiihrung Applesoft-Statement
9FID- 98 TA } LET-Befenl: Test Stringspeicherplatz,
QFIE~ 40 CE 9B JMP S9BCB danach Ausfihrung des Statements
9F2l- 8C 41 BE STY TRACE ; TRACE-Befeh1: Setzt DYRACE ON
9F24- DO 94 BNE S9FZA und Applesoft TRACE-Flag ON
9F26- 8D 41 BE STA DTRACE NOTRACE: DTRACE aus (Acc < $7F)
9F29- 88 DEY : "NOTRACE": $9C, "TRACE": $9B
QF2A- AG 4A LDA #844 } Applesoft TRACE aus und danach
9F2c- 85 F2 STA SF2 } Ausfihrung des Befehis "TRACE"(!)
-Ausfihrung des Applesoft-Stateme
Sprung
9F39-
9rsc~
OF3E-
9F41-
9r43—
9r4s~
9r4s—
OF4A—
9r4D~
9F59-
OF51-
9F54—
9F56-
orse~
OF5A-
OFSD-
9FSE-
ents
Token-Nummer bzw. "TRACE"
AS-Routinen GOCMD, danach NEWSTT
Kein Return! (Stack v, $9EBE gesetzt)
RESUME-Konmando: setzt (222) auf 00
Das diirfte ein Bug Fix fur
Applesoft sein
Ausféhrung RESUME
(LINNUM): Zei2ennummer
"PRINT A-X dezimal”
; und ein Leerzeichen danach
} erst danach wird das nachste
Statement getestet
Applesoft druckt
danach $E3 (FLASHING "#") bei TRACE!
; NORMAL und INVERSE: Applesoft druckt
wieder "" bei TRACE
98 TYA
4c 20.D8 IMP «$820
49 90 LDA +890
85 DE STA $DE
98 TYA
DO BS BNE $9EEC “always"
hiecher, wenn Applesoft TRACE an
20 09 9A JSR SOADD ; SET REALIO
Ag AS LDA 4843, hee
20 ED FD JSR SFDED 2 Me" drucken
AG 75 LDx 875 ; 875/76:
45 76 LDA $76 in Applesoft
20 24 ED JSR $ED24 : Applesoft
AS AD LDA 38a
20 ED FD JSR $FDED
20 8D 9A JSR $9A8D : SET DOSTO
38 SEC
4C 06 9E INP $9EC6
a9 ES LDA #8E3, } FLASH-Befeh1
Dp 92 BNE $9F5A
Ag AS LDA #843
8p 61 9F STA $9F62
98 TYA
Dd 8c BNE $9EEC
: EXEC STATEMENT
21
4444949444444 4944F4
@ Ein echter ,,Patch" durch Ersetzen von
drei Bytes durch einen ,JMP“ zu einer
Routine, die sich in einem noch unbenutz-
ten Speicherbereich des BASIC.SYSTEM
befindet. Diese Routine holt die durch den
»JMP“ ersetzten Befehle nach, nimmt die
Priifung auf ,,gréBer $BF“ vor und springt
sodann wieder zur TRACE-Kontrolle zu-
riick. Obwohl innerhalb des Variablenbe-
reichs des BASIC.SYSTEMs geniigend
Platz vorhanden ware und die entspre-
chenden Bereiche fir die Versionen 1.0
und 1.1 dieselbe AdreBlage haben, wurde
diese Lésung aus zwei Grlinden ver-
worfen:
- Das Startprogramm des BASIC.SY-
STEM kopiert keine Daten in diesen Be-
reich hinein, Es ware also eine Zusatzrou-
tine erforderlich, die fir die Verschiebung
der TRACE-Erweiterung an ihren richtigen
Platz sorgt. Die Startprogramme der Ver-
sionen 1.0 und 1.1 unterscheiden sich
stark voneinander, die Zusatzroutine mUiB-
te also versionsabhangig geschrieben
werden,
~ Der Zeitbedarf der TRACE-Kontrolle
wirde durch die Sprlinge fur jeden Ap-
plesoft-Befehl um rund 15 Mikrosekunden
erhdht, die Ausflihrungsgeschwindigkeit
eines Applesoft-Programms damit um
rund 1% gesenkt.
@ Optimierung des Codes der TRACE-
Kontrolle in einer Form, die vier Bytes
freien Speicherplatz innerhalb der Routine
selbst schafft und so den Einbau des Tests
erméglicht. Dieser Losungsweg ist zwar
im Ansatz erheblich komplizierter, hat aber
abgesehen von einer minimalen Ge-
schwindigkeitseinbuBe (vier Mikrosekun-
den) den Vorteil, daB er versionsunabhan-
gig geschrieben werden kann. Erfreuli-
cherweise sind die TRACE-Kontrollen bei-
der Versionen des BASIC.SYSTEMs bis
auf eine verschobene AdreBlage absolut
identisch.
Zur Ausfiihrung
Das Applesoft-Programm TRACE.KOR-
REKTUR nimmt die Korrektur in vier von-
einander getrennten Schritten vor. Die an-
gegebenen Adressen gelten fur die Ver-
sion 1.1 des BASIC.SYSTEMs:
1) Der Programmcode im Bereich $9EF4
bis $9F31 wird um 2 bzw. 4 Bytes in
Richtung héherer Adressen verschoben.
Die im Disassembler-Listing 1 durch
Trennstriche markierten Befehle werden
dadurch Uberschrieben, der Bereich
$9EF3..$9EF6 wird frei.
2) Die Prifung auf ,,gré8er $BF“ wird in
den freigewordenen Bereich geschrieben,
die Behandlung fiir LIST/CALL und TRA-
CE/NOTRACE wird speicherplatzmaBig
22
Disassembler-Listing 2
BB19- 8 81 82 85 B4 85 86 BT
B821- 88 89 BA BB 19 8D E BF
BB2S- 99 91 92 93 94 95 96 OT
B8S1- 98 99 9A 23 28 SA 5A 56
BB3S- AO Al AZ AB Ad AS 34 AT
B841- AB AS IF AB AC 00 AE AF
B849- BO Bl B2 BS B4 BS BE BT
Ba51- BB BO 99 BB 13 BD BE BF
BB59- 47 SF 18 30 15 BD 3D 28
B8E1- OD 41 29 50 84 OD 94 46
BS6S- 6A 4C 5C 35 AS 70 2D 12
B871- 65 39 41 88 1 BS DB
-CNDTAB - Tabelle mit den einzelnen Kommandoworten
BS7B- 42 53 41 56 45 52 49 46 59 42 4C 4F 4i 44 45 4c
BABB- 45 54 45 42 59 45 43 41 54 41 4C 4F 47 AF 59 45
; Applesoft—Tokens fiir die TRACE-
Routine. Indiziert ber das Token
selber, MSB gesetzt: keine Aktion
NSB geléscht: Sprung-offset
innerhalb von VSYSOUT State 4
"Spezielle” Tokens:
CALL/TRACE/NOTRACE/NORMAL/TNVERSE
FLASH/RESUME/LET/1F/PRINT/LIST
; Indexe fiir den Vergleich mit CMDTAB
Tabellen-Absuche von hinten, d-h
Start mit B950. Wenn MSB gesetzt,
dann Konmandowort-Lange minus 1
BSAVERIFYBLOADEL,
ETEBYECATALOGOPE,
optimiert. Die Ausfulhrung dieser vier Be-
fehle bendtigt danach eine Mikrosekunde
mehr an Zeit und vier Bytes weniger Spei-
cherplatz.
3) Samtliche relativen Spriinge, die sich
auf die verschobenen Programmteile be-
ziehen, werden entsprechend angepabt.
4) Die zur Ausfihrung von LET, CALL,
TRACE und NOTRACE gehdérigen Pro-
grammteile haben sich relativ zu dem
selbstmodifizierenden Sprung um jeweils
zwei Bytes verschoben. Fir NORMAL, !N-
VERSE, FLASH und RESUME ergibt sich
eine Verschiebung um vier Bytes. Die
Sprungtabelle wird fur diese Befehle an-
gepaBt.
Literatur
A.Schapers, Das BASIC.SYSTEM. Lese-
buch, Analyse, Tips und Tricks
Heidelberg 1986
Kurzhinweise
1. Zweck:
Korrektur des Trace-Fehlers im BASIC.
SYSTEM
2. Konfiguration:
ll+/e/c; ProDOS-BASIC.SYSTEM 1.0
oder 1.1
3. Test:
a) ProDOS und BASIC.SYSTEM starten
b) LOAD TRACE.KORREKTUR
c) Fur BASIC.SYSTEM Version 1.1: keine
Anderung
d) Fur BASIC.SYSTEM Version 1.0: Zeilen
330 und 340 anpassen
e) RUN
f) Diskette mit BASIC.SYSTEM einlegen
g) <Return> driicken. Nach rund 10 Se-
kunden wird die korrigierte Version des
BASIC.SYSTEM wieder auf die Diskette
zuruickgeschrieben und automatisch ge-
startet.
4, Sammeldisk:
TRACE.KORREKTUR
5. Sonstiges:
Programm TRACE.KORREKTUR muB zu-
nachst mit CONVERT auf Ihre ProDOS-
Arbeitsdiskette konvertiert werden.
Peekor 1/87
prodos 4.4
TRACE.KORREKTUR
190 REM ORDNUNG = ORDNUNG (nicht KATASTROPHE)
119 REM Beseitigung eines fatalen Fehlers im
120 REM BASIC.SYSTEM (Versionen 1.9 und 1.1)
130
140 REM AS, September '86
150:
160 HIMEM: 384¢¢
170:
18) TEXT : HOME : PRINT “TRACE-FEHLERKORREKTUR"
199 VTAB 4: PRINT "Diskette mit BASIC.SYSTEM": PRINT
200 PRINT "einlegen und:"; PRINT
219 INPUT "<RETURN>=Woiter, <CONTROL-C>=Ende ";Xx$
22 PRINT
230 PRINT CHR (4) ;"UNLOCK BASIC. SYSTEM"
249 PRINT CHRS (4);"BLOAD BASIC. SYSTEM, TSYS, AS20909"
250 BYTES = PERK (48857) + 256 » PEEK (48858): REM
“ENDFILE"
260
270 REM #keeeeeetenneereeaveneensnneansane
280
290 REM Basisadressen fiir die Verdinderungen, die
gegebenen
309 REM Werte gelten fiir die Version 1.1
319 REM Die Variable ADDR onthdlt immer einen relativen
Wert!
329
330 BP = 19489: REM ** VERSION 1.1 «* (V1.0: 10527)
540 TAB = 16921: REM *x VERSION 1.1 e# (V1.9: 17911)
350
369 IF PERK (BP) < > 216 THEN PRINT "Falsche
Version!"; STOP
370 IF PEEK (BP + 3) = 21 THEN PRINT "bereits
korrigiert.": STOP
389 Z = 0; FOR X= 1 TO 49: READ Y:2=Z
390 RESTORE : IF Z< > 1899 THEN PRINT
STOP
490
419 REM Durch Verschiebung werden vor dem veranderlichen
429 REM Sprung vier Byte Freiraum far den Test auf
439 REM "grofer SBF" geschaffen
Y: NEXT
ATA~Fenler!"
449
450 FOR Y = 1 TO 2: READ AD,ED, OFFSET
460 : FOR X = ED TO AD STEP - 1
410 ::Z = PEEK (BP + X)
480 :: POKE BP + X + OFFSET,Z
499 : NEXT
500 NEXT
51g
520
DATA 37,61,2,04,34,4
530:
540
559
560
870
580
599
600
619
620
630
64
650
6p
REM E:
Speicherplatz-Optimierung,
REM di
FOR Y
FOR
+ REI
NEXT
NEXT
DATA 93,5: REM "CMP #SC9/TYA/BCS, .
DATA
DATA 49, 1,02: REM LIST/CALL
DATA
670:
689
699
700
no
720
730
749
TD
760
170
780
798
REM Ke
REM i
FOR X
Ze
IF Z
Pol
POKE
NEXT
Dara
800:
Bt)
82
830
Bap
a5p
2860
870
889
B99
REM Ke
REM
REM s
FOR Y
FOR
2 PO!
NEXT
NEXT
900:
919
92p
930
949
950
960
979
980
999
DATA
DATA
REM
PRINT
PRINT
BASIC
PRINT
PRINT
(4)3"
inbau des Tests sowie der
ler Behandlung von LIST/CALL und TRACE/NOTRACE
= 1 70 3: READ ADDR, ANZAHL
X= TO ANZAHL - 1
AD CODE: POKE BP + ADDR + X, CODE
201,192,168, 176,246
64,2, 208,04: REM TRACE/NOTRACE
correktur der relativen und absoluten Referenzen
nnerhalb der verschobenen Progranmteile
= 170 4: READ ADDR, KWERT
PEEK (BP + ADDR) + KWERT
< 256 THEN 760
Z ~ 256: REM danach Ubertrag
KE BP + ADDR + 1, PEEK (BP + ADDR + 1) +1
E BP + ADDR,Z
12,-6,14,44,36,44,46,+6
‘orrektur der Werte in der "Token-Tabelle" filr
ie Befehle CALL, LET, TRACE und NOTRACE
jowie NORMAL, FLASH, INVERSE und RESUME
= 1 70 2: READ ANZAHL, KNERT
170 ANZAHL: READ ADDR
KE TAB + ADDR, PEEK (TAB + ADDR) + KWERT
4,-2,12,27,28,42: REM CALL/LET
4,-4,29,30,31,38: REM NORMAL/FLASH
eee eerie?
“OK, wird zuriickgeschrioben. .."
CHRS (4) ;"BSAVE
SYSTEM, TSYS, AS2099, L" ; BYTES
CHRS (4); "LOCK BASIC. SYSTEM"
PRINT "'Booting'.,.": PRINT CHRS
BASIC, SYSTEM"
GFABASIC
Interpreter (Diskette und Handbuch
Compiler (Diskette und Anleitung)
Nach AbschluB des GFABASIC-Kurses erhalten Sie zusatzlich eine Diskette mit
allen Ubungsprogrammen und weiteren nutzlichen Programmen kostenlos nach-
geliefert, wenn Sie den Interpreter und/oder Compiler Uber uns bestellen.
Hithig Software Service - Postfach 10 2869 - 6900 Heidelberg
2
mit Ordner)
0
DM 169,—
DM 169,—
Peeker 1/87
23
Programmverwaltung
Ein Ubungsprogramm fiir Applesoft-Anfanger
von Nils Arndt
Dieses aus zwei Modulen bestehende
Programm soll lhnen helfen, eine Uber-
sichtliche Liste Uber Ihre Programme an-
zufertigen. Sie ersparen sich so langes
Suchen nach einer bestimmten Datei, be-
sonders wenn Sie viele Disketten besit-
zen. Ein kurzer Blick auf die mit dem Druk-
ker erstellte und méglicherweise mit dem
Modul ,,Alphasort“ alphabetisch sortierte
Liste geniigt in Zukunft, um die Diskette
herauszufinden, auf der sich das Pro-
gramm befindet. Aber auch Uber die Pro-
grammart, die Programmlange und die Be-
dienungsart gibt sie Auskunft. Die Daten
von bis zu 324 Programmen werden als
Textfile auf Diskette geschrieben.
Das Verwaltungsprogramm soll professio-
nellen Dateiprogrammen keine Konkur-
renz machen, sondern ist als nutzbringen-
des Ubungsprogramm flr Applesoft-An-
fanger gedacht, die eigene Erweiterungen,
z.B. BASIC.MASKE aus Peeker, Heft 12/
86, einbauen k6nnen.
1. PROGRAMMVERWALT
1.1. Dateieingabe
Nach dem Start der Programmverwaltung
mit RUN PROGRAMMVERWALT (von
DOS 3.3 oder ProDOS) wahlen Sie fir die
Eingabe die entsprechende Option im Me-
nu. Geben Sie dann nacheinander den
Programmnamen, die Programmart, die
Programmlange, die Nummer der Disket-
te, auf der das Programm gespeichert ist,
und schlieBlich die Bedienungsart ein.
Diese flinf Angaben halte ich persénlich
flr geeignet, um schnell Uber ein Pro-
gramm zu informieren. Sie konnen jedoch
von Ihnen geandert werden. Dazu miissen
Sie in den Zeilen 455 (Listentberschrift),
565-595 (Eingabe) und 640-660 (Ausgabe
24
auf dem Bildschirm) Veranderungen vor-
nehmen. Gegebenenfalls ist es auch er-
forderlich, die Zwischenraume zwischen
den einzelnen Angaben in den Zeilen 270-
305 neu berechnen zu lassen.
Die Punkte hinter dem Cursor geben das
Maximum der Zeichen an, die Sie bei der
Eingabe verwenden kénnen. Sie sollten es
nicht Uberschreiten, da dies sonst Ursache
fur eine untibersichtliche Liste ware. So
darf der Programmname lediglich 23 Zei-
chen umfassen. Da er oft zu abstrakt ist,
um tiber das Programm Auskunft zu ge-
ben, kénnen Sie mit einem Schlagwort
(hdchstens 17 Zeichen) die Programmart
definieren (z.B. Kopierprogramm, Grafik-
Utility, Adventure, Compiler).
Die Bedienungsart, die bis zu drei Zeichen
lang sein darf, ist abgeklirzt anzugeben.
Sie sparen so Zeit und Speicherplatz. ,,J“
k6nnte zum Beispiel flr Joystick, ,K" flr
Keyboard, ,P“ fiir Paddle und ,M“ fur
Mouse stehen. Falls mehrere Bedie-
nungsarten fur ein Programm zutreffen, ist
es zweckmafig, sie nebeneinander (ohne
Kommata), etwa in der Form ,JPK“, dar-
zustellen.
Wenn Sie noch wahrend der Eingabe eine
Korrektur durchfiihren méchten, schrei-
ben Sie bitte anstelle des Programmna-
mens &V. Sie werden daraufhin feststel-
len, daB die Programmnummer um eins
abgenommen hat. Geben Sie nun die
Daten nochmals ein
Die Eingabe wird entweder nach 324 Pro-
grammen automatisch beendet oder da-
durch, daB Sie anstelle des Programmna-
mens &E schreiben. Nachdem Sie den
Dateinamen bestimmt haben, werden die
Daten auf Diskette gespeichert.
Falls Sie eine bereits angelegte Datei spa-
ter fortsetzen méchten, wahlen Sie bitte im
Meni die entsprechende Option.
1.2. Korrektur
Die Korrektur von bereits auf die Diskette
geschriebenen Daten erfolgt durch die
Meni-Option 3. Geben Sie die laufende
Nummer des Datensatzes ein, die Sie z.B.
der mit dem Drucker erstellten Liste ent-
nehmen kénnen. Sie haben nun Gelegen-
heit, Daten zu korrigieren oder zu léschen.
1.3. Bildschirm- und Druckerausgabe
Die Ausgabe der Daten auf dem Bild-
schirm erfolgt in derseloen Form wie die
Eingabe, namlich untereinander, wobei
immer die Daten von zwei Programmen
gleichzeitig erscheinen.
Die Ausgabe der Daten mit dem Drucker
geschieht der Ubersichtlichkeit halber ne-
beneinander. Eine Zeile besteht aus 80
Zeichen. Der Programmname und die Pro-
grammart werden linksbindig, die laufen-
de Programmnummer, die Programmlan-
ge, die Diskettenummer und die Bedie-
nungsart dagegen rechtsbiinaig ausgege-
ben. Eine in zwei Packchen aufgeteilte
DIN-A4-Seite besteht aus Daten von 54
Programmen. Insgesamt werden auf eine
Seite 59 Zeilen gedruckt (2 * 27 Zeilen
Programmdaten, eine Leerzeile und 2 * 2
Zeilen fur die Uberschrift der Packchen).
Wenn Sie mehr bzw. weniger Zeilen auf
eine Seite gedruckt haben méchten, mis-
sen Sie die Programmzeilen 260 und 265
andern.
2. ALPHASORT
Nach dem Start des Sortierprogramms mit
RUN ALPHASORT wird die gewiinschte
Datei von Diskette eingelesen, wenn sie
mit dem Programm _ ,,Programmverwal-
tung" erstellt worden ist. AnschlieBend
ordnet es die Programmnamen alphabe-
tisch, was bei 324 Namen etwa zweiein-
halo Minuten in Anspruch nimmt. Danach
werden die Daten unter dem gleichen
Peeker 1/87
Dateinamen wieder auf Diskette geschrie-
ben. Das Sortieren geschieht folgender-
maBen: ,,Alphasort" prtift nacheinander
die Anfangsbuchstaben der Programmna-
men und zwar zuerst auf den ersten, dann
auf den zweiten, dritten ... Buchstaben des
4) spplesoft 4.4
des Anfangsbuchstabens des Dateina-
mens im Alphabet ist, desto eher erhalten
die betreffenden Programmdaten neue
Variablen, so da8 die Programmnamen
letztendlich alphabetisch geordnet sind.
2. Konfiguration:
\l+/e/c in 40 Z/Z; DOS 3.3, Diversi-DOS
oder ProDOS.
3. Test:
RUN PROGRAMMVERWALT
4. Sammeldisk:
Alphabets. Den Programmnamen, die mit PROGRAMMVERWALT __ (Ein/Ausgabe-
dem ersten, zweiten, dritten... Buchsta~ Kurzhinweise Modul)
ben beginnen, und den zugehérigen an- ALPHASORT (Sortier-Modul)
deren Programmdaten werden neue Feld- 1. Zweck: PROGRAMMDATEI (5 Ubungseintrage)
variablen zugewiesen. Je kleiner die Stelle Programmverwaltung
ALPHASORT 249 HOME : PRINT : GOSUB 459: IF AS = "J" THEN 259
245 PRINT : PRINT : GOSUB 449: GOSUB 465: GOSUB 515
ioe Rew ose SALPAASORT.aee 259 HOME : PRINT : PRINT "MACHEN SIE BITTS DEN DRUCKER
9p DIM B$(324).F8 (324) G8 (824) H$(324) ,A$(224), STARTKLAR, UND DRUECKEN SIB EINE TASTE. .":: GBT AS
18 (324) , K$(324) , L8(324) ,E(324),J8(324) ee MOM PARTS Gs (4) ee PRIM ce COU
199 PUT “oanezvaws: 86: PRT 265 FOR T = 1-70 x
209 DS = CHRS (4) 269 A = (I - 55) / 54: IF I > 1 AND A=_INT (A) THEN
BIB Ren’ ‘ese Lise DER-DATEL VERE PRINT
Showing the first 100000 of 350129 characters.