Kreuzworträtsel selber machen – 1000 Mark für den Gewinner
Kreuzworträtsel sind bei jung und alt beliebt. Das beweisen die vielen Rätselzeitschriften. Aber ein Kreuzworträtselprogramm zu schreiben ist etwas ganz anderes, als ein Rätsel zu lösen. Diese Aufgabe ist eine Herausforderung für gute Programmierer. Das beste Ergebnis des Kreuzworträtsel-Wettbewerbs stellen wir Ihnen vor.
Es läßt kaum Wünsche offen. Der Bildschirmaufbau ist genauso gut gelöst wie die Druckerausgabe. Auch den Bedienungskomfort kann man sich kaum besser vorstellen.
Ein Kreuzworträtselprogramm zu schreiben ist eine knifflige Aufgabe. Nicht nur die für den Betrachter eines Rätsels selbstverständlichen Regeln, wie das Kreuzen von Worten senkrecht zueinander und die dichte Vernetzung von Wörtern, auch die Geschwindigkeit und der Komfort des Programmes spielen eine große Rolle. Damit blieb in diesem Falle nur der Einsatz von Maschinensprache übrig. Das Kreuzworträtselprogramm besteht also aus zwei Teilen. Einem Rahmenprogramm in Basic, sowie einer Maschinenroutine, die im Bereich ab $C000/49152 geladen wird und die die Schwerarbeit leistet (zirka 30 Wortvergleiche/Sekunde).
Um das Rätselprogramm nicht unnötig mit der Eingabe des Wortschatzes zu belasten, werden die Wörter vorher mit einem Editor eingegeben und bis zu 255 in einem File auf Diskette abgelegt. Das eigentliche Rätselprogramm liest diese Files dann ein und verwendet sie im Rätselfeld (Bild 1). Trotzdem ist die Eingabe von Hand möglich. Denn der große Wortschatz eines Menschen kann niemals auf Diskette gespeichert werden.

Die Programme
Bevor also die Erzeugung eines Kreuzworträtsels starten kann, muß ein Wortschatz mit dem Lexikon-Editor eingegeben werden (Bild 2). Dieses Programm hat vier Aufgaben:
- Directory lesen. Dabei werden nur die bereits auf Diskette vorhandenen Wortschatzdateien angezeigt.
- Wortdatei anlegen. Mit diesem Programmteil können Sie bis zu 255 Wörter und die zugehörigen Fragestellungen eingeben und diese dann auf Diskette als Wortdatei ablegen. Eine spezielle Eingaberoutine (Zeile 1000 — 1099) sorgt dafür, daß nur erlaubte Zeichen eingegeben werden. Es ist zum Beispiel unsinnig, ein Kreuzwort einzugeben, das aus mehreren Teilen besteht, wie etwa »Level II Basic«, oder eine Mischung aus Zahlen und Buchstaben, wie »C 64«.
So können Sie sich also im Laufe der Zeit eine ganze Bibliothek von Wortschätzen aufbauen, die beliebig während der Rätselerzeugung einzusetzen sind.
Eine Besonderheit ist die Verkettung von Dateien. Sie können Nachfolgedateien benennen, die im Rätselprogramm automatisch nachgeladen werden, sobald der Vorgängerwortschatz erschöpft ist. Beispiel: Sie wollen ein Rätsel zum Thema »Computer« basteln. Geben Sie jetzt mit Hilfe des Lexikon-Editors den ersten Teil des geplanten Wortschatzes ein und benennen ihn mit »Computer.1«. Der Folgewortschatz soll »Computer.2« sein. Nachdem Sie den 1. Teil abgespeichert haben, geben Sie den 2. Teil ein und benennen den Nachfolger mit »Computer.3« und so weiter. Wollen Sie diese Kette beenden, wird einfach ein »q« (Quit) für den Nachfolger angegeben. Das Rätselprogramm bricht dann später an dieser Stelle mit dem automatischen Nachladen ab.
Bei dieser Methode hängt die Qualität des Rätsels entscheidend von der Staffelung der Dateien ab, das heißt im ersten File sollten lange Wörter stehen und mit jedem Folgefile die durchschnittliche Wortlänge abnehmen. Die Erstellung des Rätsels gerät dadurch wesentlich flüssiger, denn mit zunehmender Dichte des Wortfeldes müssen die Wörter natürlich immer kürzer werden, damit sie noch einzubauen sind.
- Wortdatei ändern. Mit Sicherheit tauchen irgendwann falsch eingegebene Kreuzwörter auf, so daß eine Datei verbessert werden muß. Unter diesem Programmpunkt kann daher die entsprechende Wortdatei geladen und editiert werden.
- Abbrechen. Mit Verlassen des Editors kann das Rätselprogramm geladen und gestartet werden, so daß ein fließender Übergang von der Worteingabe zur Rätselerstellung möglich ist.
Nun zum Kreuzworträtselprogramm. Wie schon gesagt, besteht dieses Programm aus zwei Teilen, einer Maschinenroutine und dem Basic-Rahmenprogramm. Dieses Rahmenprogramm (Bild 3) will ich zuerst beschreiben.
Nach dem Start des Programmes beginnt zunächst eine Initialisierungsphase (Zeilen 27—39). In einem Unterprogramm (ab Zeile 970) werden die Maschinenroutine für das Kreuzworträtsel und Treibersoftware für den Drucker am User-Port geladen. Wenn Sie einen Drucker am IEC-Bus betreiben, ist dieser Programmteil (Zeile 976 + 979) natürlich nicht nötig und zu entfernen.
Im folgenden Unterprogramm zur Dimensionierung der Variablen und Definition einiger Konstanten (Zeile 915—969) erfolgt der erste Sprung in die Maschinenroutine (Zeile 937), um sie zu initialisieren.
Nach dem Bildaufbau (Unterprogramm ab Zeile 600), ist auf dem Monitor ein Kreuzwortfeld von 20x20 Zeichen zu sehen. Das Programm fragt jetzt nach dem Startwort, das als erstes Wort im Feld eingetragen werden muß, um der Maschinenroutine einen Kristallisationspunkt zu bieten (Zeile 34—35). Geben Sie ein möglichst langes Wort ein, das Sie zum Beispiel unbedingt im Rätsel verarbeiten möchten. Bei dieser Eingabe findet, wie schon beim Editor, ein Zeichencheck statt, der es unmöglich machen soll, unerlaubte Zeichen im Rätselfeld unterzubringen. Danach müssen Sie sich zwischen einer waagerechten oder senkrechten Eintragung entscheiden, und ein Cursor taucht im Wortfeld auf. Fahren Sie wie gewohnt mit den Cursortasten die gewünschte Wortposition an und drücken die RETURN-Taste. Da es das erste Wort ist und genügend Platz im Wortfeld herrscht, wird Ihr Wort ohne Protest sofort eingetragen. Jetzt noch schnell die zugehörige Fragestellung eingetippt, und das erste Wort ist korrekt eingetragen.
Sie können dieses Spiel beliebig fortsetzen und theoretisch das ganze Rätsel auf diese Weise per Hand erstellen. Alle Eingaben von Hand sind frei von dem Zwang, ein Wort mit einem anderen kreuzen zu müssen. Sie können Ihre Wörter also beliebig positionieren, sollte ein Wort allerdings nicht passen, wird es zurückgewiesen und der Handeingabe-Modus abgebrochen.
Regulär verlassen Sie die Handeingabe, indem Sie anstelle eines neuen Wortes ein »q« eintippen. Später können Sie die automatische Rätselerzeugung jederzeit unterbrechen und mit F7 wieder in den Handmodus zurückkehren.
Im Wortfeld stehen nun ein oder mehrere Wörter, die als Startpunkte für andere Wörter dienen. Senkrechte Eintragungen sind weiß und waagerechte gelb gefärbt.
Bleibt nur die Angabe, welcher auf Diskette gespeicherte Wortschatz als erstes geladen werden soll (Zeile 37). Dabei können Sie sich mit »$« auch das Inhaltsverzeichnis der Diskette ansehen, für den Fall, daß Ihnen der Name eines Wortschatzes entfallen ist.
Nach erfolgreichem Laden des ersten Wortschatzes beginnt nun die automatische Rätselerzeugung (Hauptschleife Zeile 40—99). Zunächst überraschend schnell füllt sich das Wortfeld mit zufällig plazierten und gekreuzten Wörtern. Dieser Vorgang wird von der Maschinenroutine gesteuert. Auf die genaue Arbeitsweise dieses Programmteiles gehe ich noch gesondert ein. Links oben auf dem Bildschirm erscheint die Anzahl der Wörter, die bereits eingetragen sind (maximal 255 sind möglich) und daneben die momentane prozentuale Größe des noch zur Verfügung stehenden Wortschatzes im Speicher.
Bei jeder Eintragung wird die Liste der Kreuzwörter gekürzt und das benutzte Wort aus der Liste gestrichen. Dies geschieht durch Vertauschen der Stringvektoren des zu streichenden Wortes und des letzten Wortes im Array (Zeile 300—399). Diese Methode wurde gewählt, um die Bildung von neuen Strings im Speicher zu vermeiden und der schrecklich langsamen Garbage-Collection aus dem Wege zu gehen.
Während der Rätselerzeugung können Sie sich in Ruhe überlegen, ob Sie ein automatisches Nachladen von Wortschätzen gestatten wollen oder nicht. In der rechten Bildhälfte ist inzwischen die Belegung der Funktionstasten zu sehen, und mit der F6-Taste schalten Sie die Autolader-Option ein oder aus. Erscheint »Aus« im F6-Tastenfeld, ist das Nachladen gesperrt.
Die Maschinenroutine sucht derweil ständig nach passenden Stellen im Wortfeld. Dieser Vorgang kann im Prinzip endlos sein, da irgendwann natürlich kein geeignetes Wort mehr zu finden ist. Aus diesem Grund hat das Programm eine »Geduld-Schwelle«, eine Anzahl von Suchversuchen, innerhalb derer ein passendes Wort gefunden werden muß. Ist die Versuchszahl ohne Erfolg abgelaufen, geht das Programm davon aus, daß der Wortschatz nicht mehr ausreicht. Diese »Geduld-Schwelle« können Sie in Zeile 964 selbst bestimmen.
Bevor allerdings in der obersten Bildzeile die Meldung »Wortschatz ungenügend« erscheint (Zeile 64/Unterprogramm 110—158), hebt das Programm noch die »Blausperre« auf (Zeile 66). Dieses Flag hat dem Maschinenprogramm bisher mitgeteilt, daß nur dann eine Eintragung erlaubt ist, wenn dabei auch ein blaues, unbesetztes Feld abgedeckt wird. Eine Maßnahme, um das Rätsel möglichst dicht zu packen. Ab sofort ist also auch das Einpassen eines Wortes nur auf besetzten Feldern möglich. Läßt sich auch jetzt kein Wort mehr finden, erscheint endgültig der Hinweis auf mangelnde Wortauswahl. Wenn Sie das »Autoladen« zugelassen haben, wird nun der Folgewortschatz, falls vorhanden, gelesen und das Spiel beginnt von Neuem. Selbstverständlich ist auch das Laden von Wortdateien vor Ablauf der »Geduld-Schwelle« machbar. Dazu dient die Fl-Taste. Aber Vorsicht, auf die Gefahr, daß Sie einen bereits verbrauchten Wortschatz nochmal laden, müssen Sie schon selbst achten.
Es dauert gar nicht so lange, dann ist das Wortfeld so dicht gepackt, daß der Maschinenroutine keine Eintragung mehr gelingt. Jetzt sind Sie gefordert, und mit der F7-Taste wählen Sie die Handeingabe an. Genau wie bei der Eintragung der ersten Startwörter können Sie Ihre »Lückenfüller« positionieren und die Fragestellung dazu eingeben.
Zufrieden mit Ihrer Arbeit (hoffentlich!) bleibt nur noch der Ausdruck des Rätsels. Mit F4 wird er gestartet. Das Unterprogramm für die Druckausgabe nimmt im Programm den weitaus größten Platz ein (Zeile 740—914). Ich verwende einen Epson RX-80-Drucker, der mit Hilfe einer speziellen Treibersoftware (Epson Software-Interface) auch CBM-Sonderzeichen drucken kann. Dazu muß eine unübliche Geräteadresse (6) angegeben werden (Zeile 761 und 900). Sollten Sie also einen CBM-grafikfähigen Drucker am IEC-Bus betreiben, tauschen Sie diese Adresse gegen die gewohnte »4« (im Listing schon geändert).
Auch die Druckerinitialisierung ist von Drucker zu Drucker verschieden (Zeilen 754—758). Achten Sie darauf, daß Ihr Drucker hier folgende Einstellung erhält:
- Zeilenabstand = 0
- CBM-Grafikmodus
- Startposition des Druckkopfes = lr (Linker Rand, kann in Zeile 946 geändert werden).
Für den Ausdruck der Fragestellung wird der RX80 im Engschriftmodus versetzt, um Platz zu sparen (Zeile 824—827). Auf diesen Effekt können Sie natürlich verzichten, müssen dann aber die Zeilenlänge (cz, in Zeile 948) ändern, da der Ausdruck vom Programm mit Randausgleich versehen wird (Zeile 847—889).

Nun wie versprochen zum Maschinenprogramm, kurz genannt »Such« (Bild 4 und 5). Diese Routine liegt im Bereich $C000/49152, wo sie gut gegen überschreiben durch Basic geschützt ist. Der Einsprung erfolgt über den USR-Vektor (definiert in Zeile 931 bis 932), das heißt es findet eine Parameterübergabe zwischen Basic und Maschinenroutine statt. Basic übergibt in »dl« die Anzahl der Versuche, die die Routine durchlaufen sollen (Zeile 44). Mit der Rückkehr aus der Routine wird der Variablen »u« ein Wert zwischen 1 und 4 zugewiesen. Aus dem Wert von »u« kann also auf die Ursache für den Abbruch der Routine geschlossen werden:
- u = 1; eine Taste ist betätigt worden.
- u = 2; die Suche nach einem passenden Kreuzwort war vergeblich.
- u = 3; ein Wort wurde gefunden und in das Wortfeld eingetragen.
- u = 4; die maximale Anzahl (255) von eingetragenen Kreuzwörtern ist erreicht; keine weitere Eintragung möglich.
Das Rahmenprogramm kann jetzt entsprechend reagieren und zum Beispiel im Falle u = 3 das benutzte Wort aus der Wortliste streichen. Im Falle einer Eintragung (von Hand oder automatisch) wird das Wort nicht nur in den Bildspeicher eingesetzt, sondern es werden auch einige weitere Informationen abgelegt:
- Eintragung im »Wortbeginn/ende«-Speicher (50176 bis 50575); hier wird vermerkt, ob ein Rätselfeld den Start- oder Endpunkt eines Kreuzwortes repräsentiert. Der Speicher ist, wie die folgenden auch, in 20 Zeilen mit je 20 Positionen (Speicherstellen) aufgeteilt. Das linke Halbbyte (4 Bit) einer Speicherstelle trägt die Informationen über senkrechte, das rechte Halbbyte über waagerechte Start/Endpositionen. Das 1. Bit im Halbbyte wird für Endpunkte gesetzt, das 3. Bit für Startpunkte. Diese Informationen werden später bei der Ausgabe des Rätsels auf dem Drucker benötigt, um an den richtigen Stellen die Nummer der zugehörigen Fragestellung eintragen zu können.
- Eintragungen im »Senkrecht«-Speicher (50576 bis 50975); in dieser Speichermatrix werden die Ordnungsnummern der Fragestellungen für senkrechte Rätselwörter abgelegt. Bei der Druckausgabe wird diese Matrix abgefragt (Zeile 773 bis 777), um die Nummer der Fragestellung im entsprechenden Startfeld einzusetzen.
- Eintragung im »Waagerecht«-Speicher (50976 bis 51375), wie unter b) Zeile 796 bis 800).
Um die Speicherinhalte vor dem Start des Rätselprogramms zu löschen, springt man die Routine mit »sys 50016« an (Zeile 937).
Nun zur Arbeitsweise der Routine während der automatischen Rätselerzeugung. Zunächst muß das Maschinenprogramm erst einmal wissen, ob es wegen einer Handeintragung angesprungen wurde oder zur automatischen Wortsuche. Dazu liest die Routine die Speicherstelle 26 aus. Ist das Ergebnis Null, wird in den Automodus verzweigt. Andernfalls wird in 26 die Länge des von Hand eingetragenen Wortes übergeben (siehe Zeile 662 bis 663). Die Routine braucht dann nur den Paß des Wortes zu überprüfen und bei korrekter Eintragung ins Basic zurückzukehren. Paßt das Wort allerdings nicht, verfällt die Routine in den Automodus. Das Maschinenprogramm durchläuft im Automodus eine Schleife, die zunächst durch Auslesen des Rauschgenerators im Soundchip ein Wort aus dem Wortschatz per Zufall bestimmt. Dann erfolgt auf die gleiche Weise die Auswahl eines Startpunktes im Bildspeicher. Ist dieser Punkt nicht geeignet für eine Eintragung, wird Zeile für Zeile des Wortfeldes nach einer Alternative gesucht. Im Falle eines Treffers startet der Wortvergleich. Das gewählte Wort wird mit dem Inhalt des Bildspeichers auf Übereinstimmung geprüft. Paßt es nicht, kommt das nächste Wort aus dem Wortschatz-Array an die Reihe. Bei Erfolg kehrt »Such« ins Basic zurück, wenn nicht, beginnt die Schleife von Neuem.
Damit der Zugriff auf das Array klappt, muß es nur als erstes im Basic-Programm definiert worden sein (Zeile 925). »Primitiv« werden Sie vielleicht anmerken. Richtig, aber Computer sind nun mal (sehr) schnelle Idioten.
(Gert Büttgenbach/gk)
clr | = Shift Clear/Home-Taste | rvon | = Revers on |
home | = Home-Taste | rvof | = Revers off |
cyan | = Control und 4 | crsr | = Cursor rechts |
whit | = Control und 2 | crsl | = Cursor links (crsl*28 = 28 mal Cursor links) |
red | = Control und 3 | crsd | = Cursor unten |
Ein reverses »Z« bedeutet die Farbe Hellblau = Commodore-Taste und 7.
10 print"{clr}";:t=ti+180 11 print"{CBM-A}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{CBM-S} 12 print"{SHIFT--} lexikon-editor hh,30.5.84 {SHIFT--} 18 print"{CBM-Z}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{CBM-X} 19 ifti<tthen19 20 : 22 : 24 rem" hauptprogramm 26 rem" {SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*} 28 : 30 gosub900:rem" vorbereitungen 32 : 34 gosub600:rem" menue 36 : 38 m=0 40 iff$="{f1}"then gosub3006:goto34 42 iff$="{f3}"then gosub0300:goto34 44 iff$="{f5}"thenclr:gosub0500:goto34 46 iff$="{f7}"thenprint"{clr}" 47 : 48 print " Sicher (j/n) ?" 50 wait203,64:poke198,0:wait203,63 52 getf$:iff$<>"j"then34 53 : 54 printchr$(9); 60 print"{down} Raetsel-Programm (j/n) ?" 62 wait203,64:poke198,0:wait203,63 63 : 64 getf$:iff$="n"then90 66 iff$<>"j"then62 68 print"{clr}load"+chr$(34); 70 print"raetsel";chr$(34);",8" 72 print"{down}{down}{down}":print"run" 74 poke198,3:poke631,19 76 poke632,13:poke633,13 77 goto97 88 : 90 poke792,71:rem" restore und 92 poke788,49:rem" stop reparieren 94 : 97 end 98 : 99 : 300 rem" datei aendern 302 rem" {SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*} 304 : 306 gosub700:rem" Datei einlesen 307 : 308 ef=0:print"{clr}" 309 print" Mit {rvon}RETURN{rvof} auswaehlen" 310 print" Mit {rvon}LEERTASTE{rvof} weiter" 311 print" Mit {rvon}q{rvof} abbrechen" 312 gosub2000:rem" Datei auflisten 313 : 314 print"{down} {rvon}Fertig ?{rvof} (j/n)" 316 wait203,64:poke198,0:wait203,63 318 getf$:iff$="n"then308 320 iff$<>"j"then316 322 : 323 ifef=0then397 324 gosub800:rem" Datei aufzeichnen 395 : 397 return 398 : 399 : 500 rem" datei eingeben 502 rem" {SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*} 503 : 504 print"{clr}";:gosub900 505 : 506 t$="{rvon}Wortschatz-Name:" 507 l=14:m=1:f$="":gosub1000 508 af$="{SHIFT-+}"+chr$(20)+f$ 510 : 519 print 520 t$="{rvon}Folge-Wortschatz (q=keinen):" 521 l=14:m=1:f$="":gosub1000 522 nf$="{SHIFT-+}"+chr$(20)+f$ 524 : 525 print"{clr}":nr=0:ef=0 527 : 528 rem" woerter eingeben 529 gosub650 530 : 532 iff$="q"thennr=nr-1:goto539 534 ifnr<254thennr=nr+1 536 ifpeek(210)=7thenprint"{clr}" 537 goto529 538 : 539 ifef=0then597 540 rem" datei auf diskette ablegen 541 fg=nr:gosub800 592 : 597 return 598 : 599 : 600 rem" menue 602 rem" {SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*} 604 : 606 print"{clr}";:f$="" 608 print"{down} {rvon}F1{rvof} Directory 610 print"{down} {rvon}F3{rvof} Datei aendern 612 print"{down} {rvon}F5{rvof} Datei anlegen 614 print"{down} {rvon}F7{rvof} Abbrechen 616 : 618 wait203,63:getf$ 620 iff$<chr$(133)orf$>chr$(136)then618 621 print"{clr}" 622 : 647 return 648 : 649 : 650 rem" kreuzwoerter eingeben 651 rem" {SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*} 652 : 653 n$=str$(nr):n$=right$(n$,len(n$)-1) 654 t$="{rvon}"+n$+". Kreuzwort{rvof} (q=ende)" 655 l=20:m=0:f$=kw$(nr):gosub1000 656 iff$="q"then697 657 iflen(f$)<2thenprint"{up}{up}{up}";:goto655 658 kw$(nr)=f$:print 659 : 664 t$="{rvon}Fragestellung{rvof}" 666 l=35:m=1:f$=fw$(nr):gosub1000 681 fw$(nr)=f$:print 682 : 683 ef=1 686 : 697 return 698 : 699 : 700 rem" datei einlesen 702 rem" {SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*} 703 : 705 print"{clr}" 706 t$="{rvon}Wortschatz{rvof} ($=directory)" 708 l=14:m=1:f$="":gosub1000 709 iff$="$"thenm=1:gosub3000 710 iff$=""then705 712 : 713 af$="{SHIFT-+}"+chr$(20)+f$ 714 open1,8,2,"0:"+af$+",s,r" 716 : 718 input#1,fg:rem" feldgroesse 719 : 720 rem" woerter/fragen einlesen 721 forn=0tofg 722 :input#1,kw$(n),fw$(n) 724 next 726 : 728 input#1,nf$:rem" folge-wortschatz 730 : 732 close1 796 : 797 return 798 : 799 : 800 rem" datei aufzeichnen 802 rem" {SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*} 803 : 805 print"{clr}" 807 : 812 open15,8,15,"i":close15 813 : 814 open1,8,2,"@0:"+af$+",s,w" 816 : 818 print#1,fg :rem" feldgroesse 819 : 820 forn=0tofg 822 :print#1,kw$(n):print#1,fw$(n) 824 next 826 : 828 print#1,nf$:rem" naechster file 830 : 832 close1 896 : 897 return 898 : 899 : 900 rem" vorbereitungen 902 rem" {SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*} 904 : 906 poke53280,6:rem" rahmen blau 908 poke53281,14:rem" grund hellblau 909 printchr$(14);chr$(8);chr$(144) 910 : 912 poke792,193:rem" restore und 913 poke788,52:rem" stop verriegeln 914 : 915 dimkw$(254):rem" kreuzwoerter 916 dimfw$(254):rem" fragen dazu 986 : 987 return 988 : 989 : 990 : 1000 rem" inputform routine 1001 rem" {SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*} 1002 : 1003 x$=chr$(13):y$=chr$(20) 1004 z$=chr$(34):poke198,0 1005 : 1006 print" ";t$:print"{down}{down}{up} ? ";f$;" "; 1007 x=1:iff$<>""thenx=len(f$)+1 1008 : 1009 f$="":forn=xtol+1 1010 :print"{left}";f$;"{CBM-@}"; 1011 :wait198,1:getf$:poke198,0 1012 :iff$=x$then1025 1013 :iff$=y$andn>1thenn=n-1:goto1010 1014 :ifn>lthen1011 1015 :ifm=0then1021 1016 :iff$=","orf$=z$then1011 1017 :iff$>=" "andf$<="9"then1022 1018 :iff$>="A"andf$<="Z"then1022 1021 :iff$<"a"orf$>"z"then1011 1022 next 1023 : 1025 printchr$(20);:poke211,1 1026 poke631,13:poke198,1:inputf$ 1030 iff$=x$thenprint"{up}{rght}{rght}{rght}{rght}";:goto1009 1036 : 1097 return 1098 : 1099 : 2000 rem" datei auflisten 2002 rem" {SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*} 2004 : 2010 fornr=0tofg 2012 :print"{down} ->{rvon}";kw$(nr);"{rvof}" 2014 :print" ";fw$(nr) 2016 :forw=0to60:next 2017 :wait198,1:getf$:print"{up}{up} {down}{down}" 2018 :iff$="q"then2029 2019 :iff$<>chr$(13)then2024 2021 :print"{clr}":gosub650 2022 :print"{clr}":wait203,64 2024 :ifpeek(210)=7thenprint"{clr}" 2026 next 2028 : 2029 t$="{rvon}Folge-Wortschatz" 2030 print" ";t$;":":print" ->";nf$ 2032 wait203,64:poke198,0:wait203,63 2034 : 2036 getf$:iff$<>chr$(13)then2097 2037 f$=right$(nf$,len(nf$)-2) 2038 t$=t$+" (q=keinen):" 2039 print"{clr}":gosub1000:ef=1 2040 nf$="{SHIFT-+}"+chr$(20)+f$ 2096 : 2097 return 2098 : 2099 : 3000 rem" directory listen 3002 rem" {SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*} 3003 : 3004 print"{clr}" 3005 print" Mit {rvon}RETURN{rvof} auswaehlen" 3006 print" Mit {rvon}LEERTASTE{rvof} weiter" 3007 print 3008 : 3009 open15,8,15,"io":open2,8,2,"#" 3010 : 3012 t=18:s=1:f$="" 3014 : 3016 forw=0to99 3018 : 3020 :print#15,"b-r";2;0;t;s 3022 :print#15,"b-p";2;0 3024 : 3026 :get#2,x$:t=asc(x$+chr$(0)) 3028 :get#2,x$:s=asc(x$+chr$(0)) 3030 : 3032 :forx=0to7 3034 : print#15,"b-p";2;x*32+5 3036 : get#2,x$ 3038 : ifx$<>"{SHIFT-+}"thennextx:goto3060 3040 : get#2,x$ 3042 : fory=1to14 3044 : get#2,x$:f$=f$+x$ 3046 : ifx$=chr$(160)theny=15 3048 : nexty 3050 : print" -> {rvon}";f$;"{rvof}" 3051 : ifm=0then3056 3053 : wait203,64:wait203,63:getx$ 3054 : ifx$=chr$(13)then3064 3055 : print"{up} " 3056 : f$="" 3057 :nextx 3058 : 3060 :ift=0thenw=99 3061 nextw 3062 : 3064 close2:close15 3065 ifm=0thenwait203,63 3066 : 3068 return 3070 : 3071 : 3072 : 9000 rem"{CBM-A}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{CBM-S} 9002 rem"{SHIFT--} ende lexikon-editor {SHIFT--} 9004 rem"{CBM-Z}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{CBM-X}
15 print"{clr}"; 16 print"{CBM-A}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{CBM-S} 17 print"{SHIFT--}kreuzwortraetsel version 1.a{SHIFT--} 18 print"{SHIFT--} {SHIFT--} 19 print"{SHIFT--}(c) buettgenbach 1984{SHIFT--} 20 print"{CBM-Z}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{CBM-X} 22 : 23 : 24 rem" ******** hauptprogramm ******** 25 rem" ******************************* 26 : 27 rem" {SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*} vorbereitungen {SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*} 28 clr 29 gosub970 :rem" routinen laden 30 gosub915 :rem" vorbereitungen 32 gosub600 :rem" bild aufbauen 33 : 34 t$="Startwort" :rem" 1.wort 35 nr=1:gosub654 :rem" eintragen 36 : 37 gosub700 :rem" wortschatz einlesen 38 poke53280,0:poke53281,0 39 : 40 rem" ******** hauptschleife ******** 42 : 44 poke142,bs:poke26,0:u=usr(dl) 46 : 47 on u goto 50,64,70,80 48 : 49 rem" {SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*} taste war gedrueckt {SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*} 50 getf$ 51 iff$="{f7}"thengosub650:goto59 52 iff$="{f4}"thengosub740:goto59 53 iff$="{f1}"thengosub700:goto60 54 iff$="{f6}"thengosub450:goto60 55 iff$="{f8}"thengosub092:goto59 56 iff$="{f2}"thengosub087:goto59 57 iffg>0then44 58 goto50 59 print"{home}";ll$;ll$ 60 poke53280,0:poke53281,0:gosub337 61 iffg>0then44 62 goto50 63 : 64 rem" {SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*} suche war vergeblich {SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*} 65 ifbs=0thengosub110 66 bs=0:goto44 69 : 70 rem" {SHIFT-*}{SHIFT-*}{SHIFT-*} ein wort wurde gefunden {SHIFT-*}{SHIFT-*}{SHIFT-*} 71 w=peek(25) 72 fs$(nr)=str$((peek(140)=0))+fw$(w) 73 gosub300:nr=nr+1:iffg>0then44 75 : 76 print"{home}";ll$;"{home}";tab(17); 77 print"{cyn}{rvon}Wortschatz erschoepft !" 78 gosub337:goto50 79 : 80 rem" {SHIFT-*}{SHIFT-*}{SHIFT-*} max. ordn.zahl erreicht {SHIFT-*}{SHIFT-*}{SHIFT-*} 81 print"{home}";ll$;"{home}{cyn}{rvon}Raetsel fertig:{rvof}"; 82 print" Ausdrucken mit {rvon}RETURN{rvof}" 83 wait203,64:wait203,63 84 print"{home}";ll$;ll$:gosub740 85 goto95 86 : 87 rem" {SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*} raetsel loeschen {SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*} 88 f$="Raetsel loeschen":gosub4000 89 iff$<>"j"thenreturn 90 run30 91 : 92 rem" {SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*} programm abbrechen {SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*} 93 f$="Abbrechen":gosub4000 94 iff$<>"j"thenreturn 95 gosub500:rem" programm-ende 96 : 97 end 98 : 99 : 100 rem" ******* unterprogramme ******* 102 rem" ****************************** 104 : 106 : 110 rem" autom. nachladen 112 rem" {SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*} 114 : 115 print"{home}{cyn}";ll$;"{home}";tab(18); 116 print"{rvon}Wortschatz ungenuegend" 117 gosub337 118 ifright$(nf$,1)="q"then154 120 : 122 dl=int(dm/3) 124 : 125 ifav=0thenav=1:goto154 126 ifls=0then154 127 : 128 rem" {SHIFT-*}{SHIFT-*}{SHIFT-*} folge-wortschatz laden {SHIFT-*}{SHIFT-*}{SHIFT-*} 130 poke53280,2:poke53281,2 132 print"{home}";ll$;"{home}{cyn}Wortschatz "; 133 print"{rvon}";nf$;"{rvof} wird geladen" 136 f$=nf$:gosub713 137 poke53280,0:poke53281,0 138 : 154 return 156 : 158 : 300 rem" wortliste kuerzen 302 rem" {SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*} 304 : 307 sa=peek(47)+peek(48)*256+7 308 : 315 gosub350 :rem" woerter kuerzen 316 : 320 sa=sa+772 322 gosub350 :rem" fragen kuerzen 324 : 334 fg=fg-1:poke2,fg:rem" feld kuerzen 336 : 337 print"{home}{wht}";nr;int(fg/og*100);"{left} % " 338 : 341 return 342 : 344 : 349 rem" wortvektoren vertauschen 350 x=sa+fg*3:y=sa+w*3 354 pokey,peek(x) 356 pokey+1,peek(x+1) 358 pokey+2,peek(x+2) 360 : 397 return 398 : 399 : 450 rem" autoladen ein/aus 452 rem" {SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*} 454 : 456 ifls=0thenls=1:goto461 458 ifls=1thenls=0 460 : 461 poke214,13:poke211,30:sys58732 462 : 463 print"{red}"; 464 ifls=1thenprint"{rvon}Ein{rvof}"; 466 ifls=0thenprint"Aus"; 472 : 497 return 498 : 499 : 500 rem" programm-ende 502 rem" {SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*} 504 : 505 print"{clr}{lblu}";chr$(9); 506 poke53280,14:rem" rahmen hellblau 508 poke53281,06:rem" grund blau 510 : 512 poke792,71:rem" restore und 514 poke788,49:rem" stop moeglich 594 : 596 return 598 : 599 : 600 rem" bild aufbauen 602 rem" {SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*} 604 : 606 poke53265,11 :rem" bild aus 607 : 608 rem" {SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*} kreuzwortfeld {SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*} 609 print"{clr}{down}{down}{down}";chr$(14);chr$(8); 610 print" {cyn}{CBM-A}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{CBM-S} " 612 forn=1to20 614 print" {cyn}{SHIFT--}{rvon}{lblu} {rvof}{cyn}{SHIFT--}" 616 next 618 print" {cyn}{CBM-Z}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{CBM-X} "; 619 : 620 rem" {SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*} tastenbelegung {SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*} 621 b$="{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}" 622 print"{home}{down}{down}{down}{red}"; 623 a$="Woerter einlesen" 624 f=1:gosub639 625 a$="Raetsel drucken " 626 f=4:gosub639 627 a$="Autolader Aus " 628 f=6:gosub639 629 a$="von Hand eingeben" 630 f=7:gosub639 631 printb$;"{down}{rvon}f 2{rvof}{down}{left}{left}Loeschen" 632 printb$;"{down}{rvon}f 8{rvof}{down}{left}{left}Abbrechen"; 633 : 634 poke53265,27:rem" bild an 635 : 636 return 637 : 639 printb$;"{rvon}f";f;"{rvof}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{CBM-S} 640 rem printb$;"{SHIFT--} {SHIFT--} 641 printb$;"{SHIFT--}";left$(a$,9);"{SHIFT--} 642 printb$;"{SHIFT--}";right$(a$,9);"{SHIFT--}" 643 printb$;"{CBM-Z}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{CBM-X} 645 : 646 return 648 : 649 : 650 rem" kreuzwort v. hand eingeben 651 rem" {SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*} 652 : 653 t$="Kreuzwort (Abbr=q)" 654 poke53280,2:poke53281,2 655 print"{home}";ll$;ll$ 656 l=20:m=0:gosub1000:m$=f$ 657 ifm$="q"andnr>1then685 658 l=len(m$):ifl<2then656 659 : 660 t$=m$:gosub2000 :rem" pos. eingeben 661 : 662 poke26,len(m$):m$=m$:rem" wort 663 wait203,64:u=usr(0) :rem" eintragen 664 ifu<>3then685 665 : 666 t$="Fragestellung" :rem" frage 667 l=36:m=1:gosub1000 :rem" eingeben 669 : 680 x$=str$(peek(140)=0) :rem" frage 681 fs$(nr)=x$+f$:nr=nr+1 :rem" merken 682 av=0:dl=dm 683 goto650 684 : 685 return 698 : 699 : 700 rem" kreuzwoerter einlesen 701 rem" {SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*} 702 : 703 poke53280,2:poke53281,2 704 print"{home}";ll$;ll$; 705 t$="Wortschatz (Abbr=q)" 706 l=14:m=1:gosub1000 707 iff$="q"thenprint"{home}";ll$:goto733 708 iff$="$"then710 709 f$="{SHIFT-+}"+chr$(20)+f$:goto712 710 gosub3000:iff$=""then704 711 : 712 print"{home}";ll$;ll$ 713 open15,8,15 714 open1,8,2,"0:"+f$+",s,r" 715 input#15,en,en$ 716 ifen<>0then728 717 : 718 input#1,fg :rem" feldgroesse gleich 719 poke2,fg :rem" anzahl woerter 720 forn=0tofg :rem"lese woerter/fragen 721 :input#1,kw$(n),fw$(n) 722 next 723 : 724 input#1,nf$:rem" naechster file 725 input#15,en,en$ 726 av=0:dl=dm:bs=1:og=fg 727 : 728 print"{home}";left$(ll$,40-len(en$)); 729 print"{rvon}";en$ 730 : 731 close1:close15 732 : 733 return 734 : 735 : 740 rem" raetsel drucken 741 rem" {SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*} 742 : 743 poke53280,2:poke53281,2 744 print"{home}";ll$;ll$ 745 print"{home}{cyn}{rvon}Raetsel wird ausgedruckt{rvof}" 746 : 747 gosub761:rem" wortfeld ausdrucken 748 gosub824:rem" fragen ausdrucken 749 gosub900:rem" loesung ausdrucken 750 : 751 return 752 : 753 : 754 rem" {SHIFT-*}{SHIFT-*} init epson rx-80 drucker {SHIFT-*}{SHIFT-*} 755 open1,4:print#1,chr$(27);"@"; 756 print#1,chr$(27);"3";chr$(24); 757 rem print#1,chr$(27);"l";chr$(lr); 758 print#1: close1:return 759 : 760 rem" {SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*} wortfeld ausdrucken {SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*} 761 gosub755:open1,4,10:cmd1 :print:print"{rvon}{CBM-A}"; 762 forn=0to19:print"{SHIFT-*}{SHIFT-*}{SHIFT-*}";:next 763 print"{CBM-S}{rvof}" 764 : 765 forze=0to19 766 :d=ze*20:ad=s1+d:as=s2+d:aw=s3+d 767 :ab=s4+ze*40 768 : 772 :print" "; 773 :forsp=0to19 774 : c=peek(as+sp) 775 : ifc=0thenprint" ";:goto777 776 : printmid$(str$(c)+" ",2,3); 777 :nextsp 779 :gosub820 780 :forn=1to3 781 : print"{rvon}{SHIFT--}{rvof}"; 782 : forsp=0to19 783 : a=166:b=a:c=a 784 : ifpeek(ab+sp)=160then790 785 : b=32:c=b:ifsp=19then787 786 : if(peek(ad+sp)and1)thenc=167 787 : a=165:ifsp=0thena=32 788 : if(n=1)andpeek(as+sp)thena=32 789 : if(n=3)andpeek(aw+sp)thena=32 790 : printchr$(a);chr$(b);chr$(c); 791 : nextsp 792 : print"{rvon}{SHIFT--}{rvof}";:ifn<3thenprint 793 :nextn 794 : 795 :gosub820:print" "; 796 :forsp=0to19 797 : c=peek(aw+sp) 798 : ifc=0thenprint" ";:goto800 799 : printmid$(str$(c)+" ",2,3); 800 :next 801 : 802 :ifze=19then810 803 :gosub820:print" "; 804 :forsp=0to19 805 : p=ad+sp:c=(peek(p)and16) 806 : ifcthenprint"{CBM-P}{CBM-P}{CBM-P}";:goto808 807 : print"{CBM-@}{CBM-@}{CBM-@}"; 808 :nextsp 809 : 810 print:nextze 811 : 812 print"{rvon}{CBM-Z}"; 813 :forn=0to19:print"{SHIFT-*}{SHIFT-*}{SHIFT-*}";:next 814 print"{CBM-X}{rvof}";:print#1:close1 815 : 816 return 817 : 818 : 820 printchr$(141);:return 821 rem printchr$(141);left$(ll$,lr);:return :rem fuer rx80 822 : 823 rem" {SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*} fragen ausdrucken {SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*} 824 printchr$(14):open1,4 825 print#1,chr$(27);"0"; 826 print#1,chr$(27);chr$(15); 827 print#1,chr$(27);"l";chr$(lr*1.7); 828 : 829 cmd1:printchr$(14);"Senkrecht:" 830 sw=0:gosub838:print 831 : 832 printchr$(14);"Waagerecht:" 833 sw=-1:gosub838:print#1:close1 834 : 835 return 836 : 837 : 838 mz=0:zl=0:f=0:na=1 839 forn=1tonr-1 840 :ifval(fs$(n))=swthengosub847 841 nextn 842 m=0:mr=0:bz=0:gosub881:print 843 : 844 return 845 : 846 : 847 nl=len(str$(n))+2 848 l=zl+nl+len(fs$(n)) 849 ifl<czthenzl=l:goto861 850 : 851 pa=1 852 forp=3tolen(fs$(n))-2 853 :ifmid$(fs$(n),p,1)<>" "then855 854 :l=zl+nl+p-2:ifl<czthenpa=p 855 nextp 856 : 857 ifpa=1thenmz=mz-1:l=zl 858 ifpa>1thenl=zl+nl+pa-2 859 gosub866:mz=0 860 : 861 mz=mz+1 862 : 863 return 864 : 865 : 866 bz=int((cz-l)/mz):mr=cz-(l+bz*mz) 867 m=-(mr>0):gosub881 868 : 869 na=n+1:l=len(fs$(n)):ifpa>1then873 870 w=n:print";":gosub892:zl=nl+l+3 871 printmid$(fs$(n),3,l);:goto878 872 : 873 print"; ";left$(ll$,bz); 874 w=n:gosub892:zl=l-pa+2 875 printmid$(fs$(n),3,pa-2) 876 printright$(fs$(n),l-pa); 877 : 878 return 879 : 880 : 881 forp=naton-1 882 :ifval(fs$(p))<>swthen887 883 :iffthenprint"; ";left$(ll$,bz+m); 884 :iffthenmr=mr+(mr>0):m=-(mr>0) 885 :f=1:w=p:gosub892 886 :printright$(fs$(p),len(fs$(p))-2); 887 nextp 888 : 889 return 890 : 891 : 892 nl=len(str$(w))-1:print"("; 893 printright$(str$(w),nl);") "; 894 return 895 : 899 rem" {SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*} loesung ausdrucken {SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*} 900 gosub755:printchr$(14):open1,4,10:cmd1 901 : 902 print:print:print:print"Loesung:" 903 print"{CBM-A}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{CBM-S}" 904 forn=s4tos4+760step40 905 :print"{SHIFT--}";:forp=nton+19 906 :printchr$(peek(p)); 907 :nextp:print"{SHIFT--}" 908 nextn 909 print"{CBM-Z}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{CBM-X}" 910 print#1:close1 911 : 912 return 913 : 914 : 915 rem" vorbereitungen 916 rem" {SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*} 917 : 919 poke53280,2:rem" rahmen grau 920 poke53281,2:rem" hintergrund grau 921 : 922 rem poke792,193:rem" restore und 923 rem poke788,52 :rem" stop verriegeln 924 : 925 dimkw$(254):rem" kreuzwoerter 926 dimfw$(254):rem" fragen dazu 927 dimfs$(255):rem" fragestellung 928 fg=1:og=fg :rem" feldgroesse 929 poke2,fg :rem" uebergeben 930 : 931 poke785,0 :rem" usr-vektor 932 poke786,192 :rem" setzen 933 : 934 ls=0:rem" Autolader Aus 935 bs=1:rem" Blausperre Ein 936 : 937 sys50016:rem" matrix loeschen 938 : 940 rem sys 51859 :rem" init. drucktreiber 942 : 944 rem" konstanten: 945 : 946 lr=10 :rem" linker rand druckausg. 948 cz=int(130-lr*1.7) :rem" zeillaenge 949 : 950 forn=1to40 :rem" leerstring fuer 952 :ll$=ll$+" " :rem" formatierte 954 next :rem" ausgabe 955 : 956 s1=50176 :rem" adressen der 958 s2=50576 :rem" wortfeld- 960 s3=50976 :rem" speicher 962 s4=1186 963 : 964 dm=10000:rem" max. anz. laeufe 965 : 966 return 967 : 969 : 970 rem" routinen laden 971 rem" {SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*} 972 : 975 forn=0to3:s1=s1+peek(49152+n):next 976 forn=0to3:s2=s2+peek(51857+n):next 977 : 978 ifs1<>483thenload"such.obj",8,1 979 rem ifs2<>494thenload"druck.obj",8,1 980 : 987 return 997 : 998 : 999 : 1000 rem" inputform routine 1001 rem" {SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*} 1002 : 1003 x$=chr$(13):y$=chr$(20) 1004 z$=chr$(34) 1005 : 1006 print"{home}{cyn}{rvon}";t$;"?{rvof} ";:poke198,0 1007 : 1008 f$="" 1009 forn=1tol+1 1010 :print"{left}";f$;"{CBM-@}"; 1011 :wait198,1:getf$:poke198,0 1012 :iff$=x$then1024 1013 :iff$=y$andn>1thenn=n-1:goto1010 1014 :ifn>lthen1011 1015 :ifm=0then1021 1016 :iff$=","orf$=z$then1011 1017 :iff$>=" "andf$<="9"then1022 1018 :iff$>="A"andf$<="Z"then1022 1021 :iff$<"a"orf$>"z"then1011 1022 next 1023 : 1024 print"{left} {left}{home}{rvon}";t$; 1026 poke631,13:poke198,1:inputf$ 1029 iff$=x$then1005 1030 : 1097 return 1098 : 1099 : 2000 rem" wort positionieren 2001 rem" {SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*} 2002 : 2004 print"{home}{down}{lblu}{rvon} (S) enkrecht oder"; 2005 print" (W) aagerecht ? " 2006 wait203,63:getf$ 2007 iff$<>"s"andf$<>"w"then2006 2008 : 2009 print"{home}{down}{rvof}";ll$; 2010 print"{home}{down}{rvon}Bitte Position anfahren!" 2011 print"{home}{down}{down}{down}{rght}{rght}{rght}{rvof}"; 2012 : 2013 fa=1186:p=fa:f=peek(fa) 2014 x=0:y=0:s=(f$="s"):poke140,abs(s) 2015 mx=20+l*(s=0)+(s=-1) 2016 my=20+l*(s=-1)+(s=0) 2017 : 2018 forn=0to9999 2019 pokep,f:p=fa+x+y*40 2020 f=peek(p):pokep,94:wait198,1 2021 getf$:iff$=chr$(13)then2028 2022 iff$="{down}"theny=y-1*(y<my):next 2023 iff$="{rght}"thenx=x-1*(x<mx):next 2024 iff$="{up}"theny=y+1*(y>0):next 2025 iff$="{left}"thenx=x+1*(x>0):next 2026 next 2027 : 2028 pokep,f 2029 print"{home}";ll$;ll$; 2030 : 2031 poke211,x :rem" cursor-position 2032 poke214,y :rem" setzen 2033 : 2097 return 2098 : 2099 : 3000 rem" directory listen 3001 rem" {SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*} 3003 : 3004 print"{home}";ll$;"{home}{cyn}"; 3005 print"Mit {rvon}RETURN{rvof} auswaehlen " 3006 print"{up}Mit {rvon}LEERTASTE{rvof} weiter " 3007 : 3008 open15,8,15,"io":open2,8,2,"#" 3010 : 3012 t=18:s=1:f$="" 3014 : 3016 forw=0to99 3018 : 3020 :print#15,"b-r";2;0;t;s 3022 :print#15,"b-p";2;0 3024 : 3026 :get#2,x$:t=asc(x$+chr$(0)) 3028 :get#2,x$:s=asc(x$+chr$(0)) 3030 : 3032 :forx=0to7 3034 : print#15,"b-p";2;x*32+5:get#2,f$ 3038 : iff$<>"{SHIFT-+}"thennextx:goto3060 3042 : fory=1to15 3044 : get#2,x$:f$=f$+x$ 3046 : ifx$=chr$(160)theny=15 3048 : nexty 3050 : print"{home}";tab(24);"{rvon}"; 3052 : printright$(f$,len(f$)-2);"{rvof}" 3053 : wait203,64:wait203,63:getx$ 3054 : ifx$=chr$(13)then3064 3055 : print"{home}";tab(24);left$(ll$,14) 3056 : f$="" 3057 :nextx 3058 : 3060 :ift=0thenw=99 3061 nextw 3062 : 3064 close2:close15 3065 print"{home}";ll$;ll$ 3066 : 3068 return 3070 : 3071 : 4000 rem" sicherheitsabfrage 4001 rem" {SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*} 4002 : 4003 poke53280,2:poke53281,2 4004 print"{home}";ll$ 4006 print"{home}{cyn}{rvon}";f$;":{rvof} Sicher (J/N) ?" 4008 wait203,64:wait203,63:getf$ 4010 iff$<>"j"thenprint"{home}";ll$ 4012 : 4014 return 4016 : 4018 : 4020 : 9000 rem"{CBM-A}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{CBM-S} 9002 rem"{SHIFT--} ende raetselgenerator {SHIFT--} 9004 rem"{CBM-Z}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{CBM-X}
10 rem" basic-lader fuer kreuzwort-suchroutine 11 rem" wichtig: vor dem 1.lauf abspeichern ! 12 : 13 ad=12*4096 :rem" = $c000 14 : 15 for n=0 to 906: read by: poke ad+n,by: su=su+by: next 16 if su<>105962 then print" checksum - error" :stop 17 : 20 rem" such-routine abspeichern 22 : 24 poke 43, 0 :rem" vektor auf beginn 26 poke 44,192 :rem" der routine 28 : 30 poke 45,138 :rem" vektor auf ende 32 poke 46,195 :rem" der routine 34 : 36 save"such.obj",8 38 : 40 sys 64738 42 : 44 : 45 data120,32,139,192,240,9,32,188,192,32,240,192,76,21,192,32,15,193,32 46 data100,193,176,19,169,0,133,139,141,0,220,173,1,220,201,255,240,234 47 data160,1,76,135,192,165,140,240,6,32,21,194,76,55,192,32,95,194,176 48 data45,230,25,165,2,197,25,144,17,162,1,32,56,193,32,71,193,165,98,197 49 data26,144,234,76,42,192,165,20,208,11,165,21,208,5,160,2,76,135,192 50 data198,21,198,20,76,23,192,165,139,208,12,165,141,240,228,165,142,240 51 data4,165,143,240,220,238,248,7,32,146,194,160,3,173,248,7,201,255,208 52 data2,160,4,88,76,162,179,32,247,183,165,47,166,48,133,78,134,79,160 53 data0,132,139,169,7,24,101,78,144,2,230,79,133,78,169,162,162,4,133,80 54 data134,81,162,216,133,82,134,83,165,26,201,0,240,2,133,139,96,165,211 55 data133,28,165,214,133,29,24,105,4,133,214,32,108,229,165,209,133,87 56 data165,210,133,88,230,87,230,87,32,36,234,165,243,133,91,165,244,133 57 data92,230,91,230,91,165,51,166,52,133,101,134,102,96,164,28,177,91,41 58 data15,201,14,240,17,170,165,140,208,7,138,201,1,208,9,240,5,138,201 59 data7,208,2,56,96,24,96,169,0,133,140,165,2,32,88,193,133,25,165,78,133 60 data99,165,79,133,100,166,25,240,3,32,56,193,32,71,193,169,255,32,88 61 data193,201,128,144,2,133,140,96,169,3,24,101,99,144,2,230,100,133,99 62 data202,208,242,96,160,0,177,99,133,26,200,177,99,133,101,200,177,99 63 data133,102,96,133,97,173,27,212,197,97,240,2,176,247,96,162,19,134,31 64 data134,32,232,138,56,229,26,166,140,240,6,133,32,169,7,208,4,133,31 65 data169,1,133,33,165,31,32,88,193,133,28,165,32,32,88,193,133,29,165 66 data82,166,83,133,91,134,92,164,29,240,14,169,40,24,101,91,144,2,230 67 data92,133,91,136,208,242,164,28,177,91,41,15,201,14,240,26,197,33,240 68 data22,198,28,16,238,165,31,133,28,165,29,197,32,240,6,230,29,160,1,208 69 data208,24,96,165,80,166,81,133,87,134,88,164,29,240,14,169,40,24,101 70 data87,144,2,230,88,133,87,136,208,242,169,20,166,140,240,6,56,229,29 71 data76,244,193,56,229,28,133,98,56,96,169,0,133,141,133,143,133,27,165 72 data87,166,88,133,89,134,90,165,91,166,92,133,93,134,94,165,28,133,30 73 data96,32,248,193,164,30,177,89,201,160,240,8,164,27,209,101,208,53,164 74 data30,177,93,41,15,201,14,208,4,133,143,240,6,201,7,208,35,133,141,230 75 data27,165,27,197,26,240,27,169,40,24,101,89,144,2,230,90,133,89,169 76 data40,24,101,93,144,2,230,94,133,93,24,144,189,24,96,56,96,32,248,193 77 data164,30,177,89,201,160,240,8,164,27,209,101,208,32,164,30,177,93,41 78 data15,201,14,208,4,133,143,240,6,201,1,208,14,133,141,230,30,230,27 79 data165,27,197,26,208,212,56,96,24,96,32,248,193,164,27,177,101,164,30 80 data145,89,169,5,133,33,177,93,41,15,201,14,208,12,169,7,133,33,165,140 81 data240,4,169,1,133,33,165,33,145,93,230,27,165,27,197,26,240,34,165 82 data140,240,25,169,40,24,101,89,144,2,230,90,133,89,169,40,24,101,93 83 data144,2,230,94,133,93,76,149,194,230,30,76,149,194,169,0,162,196,133 84 data87,134,88,164,29,240,14,169,20,24,101,87,144,2,230,88,133,87,136 85 data208,242,133,89,165,88,133,90,164,28,177,89,166,140,240,4,9,64,208 86 data2,9,4,145,89,224,0,240,15,24,165,89,105,144,133,89,165,90,105,1,133 87 data90,208,13,24,165,89,105,32,133,89,165,90,105,3,133,90,173,248,7,145 88 data89,224,0,240,23,166,26,24,202,240,13,169,20,101,87,144,3,230,88,24 89 data133,87,144,240,169,16,208,8,152,24,101,26,168,136,169,1,17,87,145 90 data87,96,169,0,162,196,133,89,134,90,160,0,140,248,7,152,145,89,230 91 data89,208,250,230,90,165,90,201,201,208,241,169,255,141,14,212,141,15 92 data212,169,129,141,18,212,96,0