Skip to main content

peeker 1987 01

  • PublicationApple Periodicals
  • Date1987-01-01
  • Pages72
  • Sourcepeeker-1987-01.pdf
← Magazines peeker 1987 01
/ 72
Source: Internet Archive — Aggregated Apple-era periodicals, 1981–2012.
Page 1
Loading…
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.

mp.ls