Cross-Ref 64 — Basic-Programme unter der Lupe
Wenn man zu einem Basic-Programm eine Liste aller Sprungadressen, Schleifen und Variablen hat, ist das eine sehr gute Hilfe Nicht nur während des Programmierens, sondern auch zur nachträglichen Dokumentation. Eine solche Liste erstellt dieses Maschinen-Programm.
Cross-Ref 64 durchsucht in zwei Durchgängen (Passes) ein Basic-Programm nach Sprungbefehlen und Variablen. Sämtliche Sprungziele und Variablennamen werden dann auf einem Drucker in Form einer Tabelle ausgegeben. Eine solche Tabelle nennt man Cross-Reference-List.
Das Basic-Programm kann dazu übrigens irgendwo im Basic-Speicher liegen. Es muß nicht bei Adresse $0801 beginnen. Das ist wichtig, denn häufig wird der untere Basic-Speicherteil für Sprites reserviert.
1. Durchgang
Im ersten Durchlauf (Pass) werden Sprunganweisungen und FOR-NEXT-Schleifen gesucht und alle Zeilennummern der Zeilen ausgegeben, die eine Sprunganweisung enthalten oder angesprungen werden. Dabei werden alle Sprünge berücksichtigt, die das C 64-Basic 2.0 bietet. FOR-NEXT-Schleifen werden durch die Laufvariable gekennzeichnet. Eventuell vorhandene, noch nicht zu Ende geschriebene FOR-NEXT-Schleifen werden mit einem »*« markiert.
2. Durchgang
Hier werden alle Variablen eines Basic-Programms gesucht und ausgegeben.
Die Ausgabe der Cross-Reference-Liste kann in beiden Durchgängen entweder auf Bildschirm oder Drucker erfolgen. Bei Bildschirmausgabe allerdings auch im Druckerformat mit 80 Zeichen/Zeile. Das bedeutet, daß zwei Bildschirmzeilen immer eine Druckerzeile darstellen. Doch wie sinnvoll ist überhaupt eine Dokumentation auf dem Bildschirm? Das Programm ist auf einen Epson-Drucker mit Görlitz-Interface angepaßt. Es kann aber leicht so verändert werden, daß es auch für andere Drucker geeignet ist. Es müssen nur vier Speicherzellen mit POKE-Befehlen verändert werden.
Einstellung der Geräteadresse:
POKE 50517, GA : POKE 50519, GA
Einstellung der Sekundäradresse:
POKE 50521, SA+96 : POKE 50529, SA+96
Mit einem Monitor wie dem SMON oder dem Einzeiler »Maschinenprogramme speichern« (Ausgabe 11/84) können Sie die auf Ihren Drucker angepaßte Programmversion speichern:
SYS57812a$,x:POKE193,ls:POKE194,hs:P0KE174,le:POKE 175,he:SYS62957
Dadurch ersparen Sie sich die lästigen POKE-Befehle nach jedem Laden von Cross-Ref 64. Das Programm belegt den Speicherbereich von $C000 (49152) bis $CAB6 (51894). Um Ihnen eventuelle Berechnungen zu ersparen: Das Highbyte (hs) von 49152 ist 192 das Lowbyte (ls) 0. Das Highbyte von 51894 (he) ist 202, das Lowbyte (le) 182.
Übersichtliches Ausgabeformat
Wie schon erwähnt, werden alle Zeilen, in denen ein Sprung erfolgt, ausgegeben. Die gezeigte Tabelle (Tabelle 1) bezieht sich auf das Beispielprogramm (Listing 1). Man kann sich auch eine Liste aller Sprungziele drucken lassen (Tabelle 2). Die Ausgabe erfolgt mit 80 Zeichen pro Zeile, dem üblichen Druckerformat.


Sollten offene FOR-NEXT-Schleifen (ohne NEXT) vorhanden sein, wird nach einem »*« die Anzahl der fehlenden NEXT-Befehle angezeigt. Sollte die Anzahl 255 betragen, heißt das, daß ein NEXT zuviel gefunden wurde.
Sollten in einer Basic-Zeile mehrere Sprünge auftreten, wird die mehrmalige Ausgabe der Zeilennummer unterdrückt.
Bei Sprungbefehlen der Form ON X GOSUB wird das Argument nach ON durch »—« ersetzt, da auch ganze Basic-Funktionen als Argument erlaubt sind. Um diese Funktionen zu berücksichtigen, wäre ein zu großer Programmieraufwand nötig. Treten nach einem THEN mehrere Sprünge auf, wird jedem Sprungziel ein THEN vorangestellt. Eine solche Befehlsfolge ist beispielsweise
IF X=1 THEN GOSUB 100:GOSUB 200:GOSUB 300.
Bei FOR-NEXT-Schleifen wird der ganze Variablenname angegeben.
Die Variablennamen werden in einer eigenen Tabelle ausgegeben (Tabelle 3). Hier werden die Namen allerdings auf zwei Zeichen gekürzt. In der Tabelle steht nach dem Namen der Variable der Variablentyp (Real, Integer oder String). Zwei Klammern »()« zeigen an, daß es sich um eine indizierte Variable handelt. Da eine Variable in einem Programmbereich sehr häufig benutzt werden kann, werden bei Mehrfachnennung einer Variablen nur noch die Zeilennummern angegeben; so lange, bis eine andere Variable aufgerufen wird. Wird einer Variablen ein anderer Wert zugeordnet (A=A+1), wird die Zeilennummer mit einem Stern »*« gekennzeichnet. Bei der sortierten Variablenausgabe (Tabelle 4), werden nach dem Variablennamen alle Zeilen aufgeschlüsselt, in denen die Variable vorkommt. Das Sortieren geschieht nach den folgenden Kriterien:
- Typ: Real, integer, Strings, Felder
- Name alphabetisch
- Zeilennummern in aufsteigender Reihenfolge.


Die Ausgabe kann jederzeit durch Tastendruck gestoppt werden. Eine begonnene Druckzeile wird zu Ende gedruckt. Bei einem weiteren Tastendruck fährt das Programm fort. Mit RUN/STOP kann die Ausgabe abgebrochen werden.
Tips zu Eingabe und Benutzung
Das Maschinen-Programm (Listing 2) sollten Sie mit dem MSE eingeben. Es wird durch »SYS 49152, Parameterliste, Bereich« gestartet. Die »Parameterliste« muß aus genau fünf Zeichen bestehen (Leerzeichen nicht mitgerechnet). Folgende Zeichen sind erlaubt:
- Steife: P — Ausgabe auf Drucker
- Stelle: S — Ausgabe der Zeilen mit Sprungbefehlen (Tabelle 1)
- Stelle: J — Ausgabe der angesprungenen Zeilen (nur zusammen mit »S« an zweiter Stelle möglich (Tabelle 2)
- Stelle: V — Ausgabe der benutzten Variablen in der Reihen-
folge des Auftretens (Tabelle 3) - Stelle: J — Ausgabe der benutzten Variablen in sortierter Reihenfolge (Tabelle 4)
Werden andere Zeichen an der entsprechenden Stelle angegeben, dann wird der Programmpunkt nicht ausgeführt.
Die Bereichsangabe ist optional und hat die gleiche Syntax wie beim LIST-Befehl. Falls ein Zeilenbereich angegeben wird, analysiert das Programm auch nur den entsprechenden Abschnitt. Ein Beispiel:
Es sollen alle Sprungbefehle und alle Variablen im Zeilenbereich 100-200 gesucht werden. Die Ausgabe soll auf dem Drucker erfolgen. Der entsprechende SYS-Aufruf lautet dann: SYS 49152, PS..J,100-200
Anstelle der Punkte kann dabei jedes beliebige andere Zeichen mit Ausnahme des Kommas angegeben werden.
Zum Sortieren der Variablen und für die Ausgabe der angesprungenen Zeilen wird das »Bubblesort«-Verfahren verwendet, da es besonders einfach in Assembler (Listing 3, Quellcode) programmiert werden kann. Die Variablen- und Sprungtabelle wird im Bereich $A000 bis $BFFF, also »unter« dem Basic-ROM, abgelegt. Falls also eine Basic-Erweiterung verwendet wird, darf dieser Speicherbereich dadurch nicht verändert werden.
(Peter Rüschhoff-Nadermann/hm)10 rem 20 gosub 100:goto 200 30 rem 40 run 50 50 rem 60 if a=0 then gosub 100:goto 50 70 rem 80 on a goto 10,20,30,40 90 rem 100 if a<>0 then on a gosub 100,90,70,80 110 rem 120 b=0:if b=1 then b=b+2 130 rem 140 print d;g;e;k 150 rem 160 e=g+d+k:d=k
PROGRAMM : CROSS-REF 64 C000 CAB8 ----------------------------------- C000 : 4C 03 C9 20 55 C0 20 E3 E8 C008 : C8 20 FE C5 4C FF C4 AD 8C C010 : B0 CA 4A 4A B0 03 20 55 50 C018 : C0 20 7E C7 20 8B C2 20 2B C020 : 36 C4 B0 01 60 20 9C C7 0E C028 : 20 8D C7 20 E3 C8 20 FE 08 C030 : C5 4C FF C4 20 C9 C0 20 47 C038 : FF C4 4C 7E C7 20 8B C2 AD C040 : 20 36 C4 B0 01 60 20 9C 8F C048 : C7 20 8D C7 20 AD C8 20 4E C050 : 16 C8 4C FF C4 A9 06 85 9A C058 : B6 20 B1 C3 20 BA C3 4C 83 C060 : 65 C0 20 B8 C2 A9 80 8D DB C068 : AD CA A5 BD C9 FF D0 01 7D C070 : 60 20 E5 C3 C9 20 F0 F9 27 C078 : C9 00 F0 E6 C9 22 F0 32 30 C080 : C9 8F F0 DE C9 A7 F0 22 0B C088 : C9 88 F0 1E C9 3A F0 1A FC C090 : C9 81 F0 16 20 10 C4 90 CF C098 : 09 20 96 C6 20 0F C7 20 0A C0A0 : 45 C4 A2 00 8E AD CA 4C 0A C0A8 : 71 C0 A2 80 8E AD CA 4C 4C C0B0 : 71 C0 20 E5 C3 C9 22 F0 3B C0B8 : 07 C9 00 F0 06 4C B2 C0 D1 C0C0 : 4C 71 C0 20 B8 C2 4C 71 AF C0C8 : C0 A9 05 85 B6 8D AE CA 77 C0D0 : 20 B1 C3 20 BA C3 A5 BD 9A C0D8 : C9 FF F0 15 20 C3 C8 A9 16 C0E0 : 00 8D A5 CA 4C EA C0 20 C9 C0E8 : B8 C2 A5 BD C9 FF D0 01 04 C0F0 : 60 A9 01 8D A8 CA 20 E5 44 C0F8 : C3 C9 00 F0 EA C9 22 F0 25 C100 : 3B C9 8F F0 E2 C9 89 F0 A6 C108 : 1B C9 8D F0 1A C9 A7 F0 FA C110 : 19 C9 8A F0 18 C9 91 F0 C6 C118 : 17 C9 81 F0 16 C9 82 F0 2E C120 : 15 4C F6 C0 4C 53 C1 4C 30 C128 : 5B C1 4C 52 C2 4C 63 C1 61 C130 : 4C D6 C1 4C 7C C1 4C 9D 23 C138 : C1 4C F6 C0 20 E5 C3 C9 C9 C140 : 22 F0 07 C9 00 F0 06 4C 0E C148 : 3C C1 4C F6 C0 20 B8 C2 CC C150 : 4C F6 C0 20 5D C4 A9 02 F2 C158 : 4C 76 C2 20 5D C4 A9 04 3F C160 : 4C 76 C2 20 25 C4 20 19 C7 C168 : C4 90 0E 20 5D C4 CE A4 7C C170 : CA AC A4 CA A9 10 4C 76 4C C178 : C2 4C F6 C0 20 5D C4 EE 14 C180 : A6 CA A9 40 8D A3 CA 20 5F C188 : D4 C5 20 25 C4 C9 B2 F0 33 C190 : 06 20 F7 C3 4C 8A C1 20 7D C198 : D2 C4 4C F6 C0 AD A4 CA 60 C1A0 : 48 CE A6 CA 20 E5 C3 20 D3 C1A8 : 2D C4 F0 07 C9 2C F0 F1 FA C1B0 : 4C A4 C1 68 8D A4 CA 20 35 C1B8 : 5D C4 A9 20 8D A3 CA 20 47 C1C0 : D4 C5 20 25 C4 20 2D C4 AF C1C8 : F0 06 20 F7 C3 4C C2 C1 EF C1D0 : 20 D2 C4 4C F6 C0 20 5D C5 C1D8 : C4 20 25 C4 C9 89 F0 07 49 C1E0 : C9 8D F0 08 4C D9 C1 A9 9B C1E8 : 0A 4C EE C1 A9 0C 20 0B 9E C1F0 : C8 AD A3 CA 29 FE 85 BD ED C1F8 : 8D A3 CA A2 00 20 D4 C5 3E C200 : 20 3C C5 20 25 C4 CE A4 B1 C208 : CA 20 D4 C7 A5 BD 20 3F 58 C210 : C2 20 EA C7 20 79 00 F0 46 C218 : 1D C9 2C D0 EF 20 F7 C3 A6 C220 : AD A5 CA C9 4B 90 E5 20 9D C228 : F7 C4 20 3C C5 20 3C C5 EB C230 : 20 3C C5 4C 0C C2 20 2E 1D C238 : C5 20 F7 C4 4C F6 C0 A0 64 C240 : 02 91 FB 20 A2 C4 A0 03 E7 C248 : A5 62 91 FB C8 A5 63 91 6C C250 : FB 60 20 25 C4 20 19 C4 63 C258 : 90 11 20 5D C4 A9 80 20 00 C260 : 0B C8 CE A4 CA AC A4 CA 52 C268 : 4C 76 C2 CE A4 CA A9 80 C2 C270 : 8D A8 CA 4C F6 C0 8D A3 80 C278 : CA 20 0B C8 20 D4 C5 20 2E C280 : 3C C5 20 E7 C7 20 D2 C4 F6 C288 : 4C F6 C0 20 00 C4 A9 00 50 C290 : 8D A7 CA 8D A5 CA 8D A6 89 C298 : CA 8D A3 CA 85 BD 8D AD 43 C2A0 : CA 85 57 A9 A0 85 58 A9 23 C2A8 : F9 8D A9 CA 85 FB A9 BF 8A C2B0 : 8D AA CA 85 FC 4C D2 C3 FB C2B8 : A0 00 B1 F9 D0 05 C8 B1 C0 C2C0 : F9 F0 0F A5 F9 85 F7 A5 A1 C2C8 : FA 85 F8 20 A5 C3 F0 11 25 C2D0 : 90 0F A5 FB 8D AB CA A5 7D C2D8 : FC 8D AC CA A9 FF 85 BD 4B C2E0 : 60 AD A7 CA 29 0E 8D A7 E3 C2E8 : CA A0 03 8C A4 CA A0 00 78 C2F0 : B1 F7 85 F9 C8 B1 F7 85 42 C2F8 : FA 60 A9 00 8D B0 CA 8D 31 C300 : B1 CA 8D B2 CA A9 FF 8D E5 C308 : B3 CA 8D B4 CA 20 79 00 AE C310 : C9 2C F0 05 A2 0B 4C 37 EE C318 : A4 20 73 00 C9 50 D0 03 12 C320 : 20 56 C5 20 73 00 C9 53 E6 C328 : D0 05 A9 08 20 92 C3 20 CC C330 : 73 00 C9 4A D0 05 A9 04 43 C338 : 20 92 C3 20 73 00 C9 56 A1 C340 : D0 05 A9 02 20 92 C3 20 23 C348 : 73 00 C9 4A D0 05 A9 01 55 C350 : 20 92 C3 20 73 00 C9 4B A3 C358 : D0 08 A9 10 20 92 C3 20 7F C360 : 73 00 C9 2C D0 2B C9 AB B0 C368 : F0 17 20 73 00 20 6B A9 5C C370 : A5 14 8D B1 CA A5 15 8D 02 C378 : B2 CA 20 79 00 C9 AB D0 65 C380 : 10 20 73 00 20 6B A9 A5 CD C388 : 14 8D B3 CA A5 15 8D B4 4C C390 : CA 60 0D B0 CA 8D B0 CA 55 C398 : 60 20 A2 C4 EC B2 CA D0 7B C3A0 : 03 CD B1 CA 60 20 A2 C4 6B C3A8 : EC B4 CA D0 03 CD B3 CA BE C3B0 : 60 A9 A0 85 58 A9 00 85 9B C3B8 : 57 60 20 8B C2 20 B8 C2 4E C3C0 : A5 BD C9 FF D0 06 20 6C 4D C3C8 : C5 4C AE A7 20 99 C3 90 53 C3D0 : EC 60 A5 2B 85 F9 A5 2C D2 C3D8 : 85 FA 60 CE A4 CA 20 E8 BF C3E0 : C3 EE A4 CA 60 EE A4 CA 42 C3E8 : AC A4 CA B1 F7 60 20 09 E4 C3F0 : C4 20 3E F1 4C 00 C4 EE 48 C3F8 : A5 CA 20 09 C4 20 D2 FF C4 C400 : 48 A5 01 29 FE 85 01 68 71 C408 : 60 48 A9 37 85 01 68 60 A0 C410 : 20 09 C4 20 13 B1 4C 00 DA C418 : C4 C9 3A 10 06 C9 30 30 21 C420 : 02 38 60 18 60 20 E5 C3 80 C428 : C9 20 F0 F9 60 C9 00 F0 B3 C430 : 04 C9 3A F0 00 60 AD AA D5 C438 : CA CD AC CA D0 06 AD A9 B4 C440 : CA CD AB CA 60 20 67 C7 69 C448 : B0 12 20 6C C5 A9 5A A2 EF C450 : CA 20 84 C8 AD B5 CA 85 23 C458 : 01 4C AE A7 60 20 A2 C4 3B C460 : A0 04 91 FB 88 8A 91 FB 01 C468 : A9 00 85 BD AD A7 CA 4A 02 C470 : B0 12 AD A7 CA 09 01 8D 9E C478 : A7 CA 20 AF C4 A2 27 A0 C2 C480 : 02 4C 88 C4 A2 22 A0 07 2F C488 : AD A6 CA 85 63 F0 0C 85 E5 C490 : BD 20 EE C5 A9 00 85 62 47 C498 : 20 AF C4 A9 00 85 BD 4C B2 C4A0 : 3C C5 A0 03 B1 F7 AA 88 DE C4A8 : B1 F7 86 62 85 63 60 20 78 C4B0 : 09 C4 A2 90 38 20 49 BC F9 C4B8 : 20 DF BD 20 A8 C5 4C 00 25 C4C0 : C4 49 FF 69 06 A8 F0 09 D1 C4C8 : A9 20 20 F7 C3 88 4C C6 C8 C4D0 : C4 60 AD A7 CA 4A 4A 90 6E C4D8 : 06 20 2E C5 4C F7 C4 AE 28 C4E0 : A5 CA E0 28 B0 08 A9 20 5A C4E8 : 20 F7 C3 4C DF C4 AD A7 A8 C4F0 : CA 09 02 8D A7 CA 60 AD 1F C4F8 : A7 CA 29 0D 8D A7 CA A9 85 C500 : 0D 20 F7 C3 A9 00 8D A5 B0 C508 : CA 20 EE C3 F0 1F C9 03 4C C510 : D0 12 20 6C C5 A9 6D A2 24 C518 : CA 20 84 C8 AD B5 CA 85 EB C520 : 01 4C AE A7 20 EE C3 F0 52 C528 : FB C9 03 F0 E5 60 CE AE E1 C530 : CA D0 08 A9 05 8D AE CA A7 C538 : 20 F7 C4 60 AD A5 CA 38 35 C540 : E9 0A B0 FC 49 FF 69 01 36 C548 : AA E8 CA F0 08 A9 20 20 C6 C550 : F7 C3 4C 4A C5 60 A9 04 93 C558 : A2 04 A0 68 20 BA FF 20 4A C560 : B1 FF A9 68 20 93 FF A9 7A C568 : 04 85 9A 60 AD B5 CA C9 29 C570 : 35 D0 19 A9 37 85 01 A9 80 C578 : A0 85 04 A0 00 B1 03 91 AD C580 : 03 C8 D0 F9 E6 04 A5 04 88 C588 : C9 C0 D0 F1 AD B6 CA 85 EA C590 : 7A AD B7 CA 85 7B A9 04 0B C598 : 20 AE FF 20 C3 FF A9 03 FC C5A0 : 85 9A AD B5 CA 85 01 60 32 C5A8 : 20 09 C4 20 87 B4 20 A6 6E C5B0 : B6 48 A6 BD D0 03 20 C1 15 C5B8 : C4 68 AA A0 00 E8 CA F0 C3 C5C0 : 10 B1 22 20 F7 C3 C8 C9 8A C5C8 : 0D D0 F3 20 E5 AA 4C BE A1 C5D0 : C5 4C 00 C4 A2 00 AD A8 86 C5D8 : CA 0D A3 CA 8D A3 CA 0E A8 C5E0 : A3 CA B0 08 E8 E8 E8 E8 61 C5E8 : E8 4C DF C5 A0 05 BD 7A C5 C5F0 : CA 20 F7 C3 E8 88 D0 F6 45 C5F8 : AD A3 CA D0 E2 60 AD A9 7F C600 : CA 85 FB AD AA CA 85 FC 52 C608 : AD AB CA 85 57 AD AC CA 19 C610 : 85 58 A9 05 8D AE CA 20 86 C618 : FF C4 20 67 C7 F0 6E 20 6C C620 : 90 C6 A0 01 B1 FB 20 F7 C7 C628 : C3 C8 B1 FB C9 20 F0 03 A2 C630 : 20 F7 C3 20 EA C6 20 3C 1F C638 : C5 A0 03 B1 FB 85 62 C8 4B C640 : B1 FB 85 63 A9 00 85 BD E9 C648 : 20 AF C4 A0 05 B1 FB 0A 67 C650 : 90 05 A9 2A 20 F7 C3 20 24 C658 : 3C C5 EE AF CA 20 41 C7 6B C660 : 08 20 0F C7 20 67 C7 F0 73 C668 : 23 28 F0 CD AD AF CA C9 AC C670 : 08 90 0C 20 F7 C4 20 2E 4A C678 : C5 20 90 C6 4C 86 C6 C9 F2 C680 : 04 90 03 20 EE C4 20 D2 CC C688 : C4 4C 1F C6 28 4C FF C4 81 C690 : A9 00 8D AF CA 60 A0 01 C7 C698 : 91 FB 20 E5 C3 A0 02 20 75 C6A0 : 10 C4 B0 0D 20 19 C4 B0 1F C6A8 : 08 AA A9 20 91 FB 4C B7 0D C6B0 : C6 91 FB 20 E5 C3 AA A9 BC C6B8 : 40 E0 24 F0 0A E0 25 F0 AE C6C0 : 05 4A 4A 4C CD C6 4A 48 D3 C6C8 : 20 E5 C3 AA 68 E0 28 D0 F1 C6D0 : 02 09 80 A0 00 91 FB 20 48 C6D8 : A2 C4 A0 04 91 FB 88 8A B5 C6E0 : 91 FB AD AD CA A0 05 91 79 C6E8 : FB 60 A0 00 B1 FB 4A 4A F4 C6F0 : 4A 4A 4A B0 0A A2 25 4A E7 C6F8 : B0 01 CA 8A 20 F7 C3 B1 61 C700 : FB 0A 90 0A A9 28 20 F7 B2 C708 : C3 A9 29 20 F7 C3 60 38 7E C710 : A5 FB E5 B6 85 FB B0 02 02 C718 : C6 FC 60 A5 FC 85 FE 38 91 C720 : A5 FB E5 B6 85 FD B0 02 22 C728 : C6 FE 60 A0 00 18 B1 FB 19 C730 : D1 FD F0 04 B0 0A 90 08 6A C738 : C8 C4 B6 F0 03 4C 2D C7 05 C740 : 60 20 1B C7 A9 03 85 B6 A6 C748 : 20 2B C7 08 A9 06 85 B6 3F C750 : 28 60 A0 00 C4 B6 F0 0E B2 C758 : B1 FB 48 B1 FD 91 FB 68 7C C760 : 91 FD C8 4C 54 C7 60 A5 FC C768 : FC C5 58 D0 04 A5 FB C5 60 C770 : 57 60 18 A5 57 65 B6 85 39 C778 : 57 90 02 E6 58 60 18 AD B9 C780 : AB CA 65 B6 8D AB CA 90 43 C788 : 03 EE AC CA 60 38 AD AB 5D C790 : CA E5 B6 8D AB CA B0 03 86 C798 : CE AC CA 60 AD AB CA 85 E9 C7A0 : 57 AD AC CA 85 58 AD A9 77 C7A8 : CA 85 FB C5 57 08 AD AA AE C7B0 : CA 85 FC C5 58 D0 03 28 9D C7B8 : F0 19 20 1B C7 20 2B C7 5A C7C0 : 90 03 20 52 C7 20 0F C7 6D C7C8 : 20 67 C7 D0 ED 20 72 C7 E1 C7D0 : 4C A6 C7 60 AD A4 CA 18 C9 C7D8 : 65 F7 85 7A 08 A5 F8 85 86 C7E0 : 7B 28 90 02 E6 7B 60 20 E0 C7E8 : D4 C7 20 09 C4 20 73 00 E4 C7F0 : 20 6B A9 A0 00 A5 15 91 E9 C7F8 : FB 85 62 C8 A5 14 91 FB A1 C800 : 85 63 20 0F C7 20 AF C4 E7 C808 : 4C 45 C4 A0 02 0D A8 CA FD C810 : 8D A3 CA 91 FB 60 AD AB 24 C818 : CA 85 57 AD AC CA 85 58 18 C820 : AD A9 CA 85 FB AD AA CA 72 C828 : 85 FC A9 00 8D A7 CA 8D F2 C830 : A5 CA A9 05 8D AE CA A9 12 C838 : F6 8D A6 CA 20 67 C7 F0 36 C840 : 42 A0 00 84 BD B1 FB 85 C7 C848 : 62 C8 B1 FB 85 63 20 AF 4D C850 : C4 20 3C C5 A0 02 B1 FB C5 C858 : 2C A6 CA D0 02 29 FE 8D 24 C860 : A3 CA A2 00 86 BD 20 DF A8 C868 : C5 A0 03 B1 FB 85 62 C8 7B C870 : B1 FB 85 63 20 3C C5 20 28 C878 : AF C4 20 D2 C4 20 0F C7 05 C880 : 4C 3C C8 60 8D 90 C8 8E C6 C888 : 91 C8 A2 00 8E A5 CA AD C3 C890 : FF FF F0 12 C9 FF F0 0F 8C C898 : 20 F7 C3 EE 90 C8 D0 03 1B C8A0 : EE 91 C8 4C 8F C8 60 20 13 C8A8 : 3C C5 4C 9B C8 A9 45 A2 82 C8B0 : C9 20 84 C8 A0 02 A9 EC 5E C8B8 : A2 C9 20 84 C8 88 D0 F6 D9 C8C0 : 4C D6 C8 A9 45 A2 C9 20 AF C8C8 : 84 C8 A0 02 A9 6F A2 C9 4D C8D0 : 20 84 C8 88 D0 F6 A0 02 C1 C8D8 : A9 91 A2 C9 20 84 C8 88 86 C8E0 : D0 F6 60 A9 15 A2 CA 20 4A C8E8 : 84 C8 A0 02 A9 39 A2 CA BD C8F0 : 20 84 C8 88 D0 F6 A0 08 ED C8F8 : A9 4F A2 CA 20 84 C8 88 A5 C900 : D0 F6 60 20 FA C2 A5 7A B9 C908 : 8D B6 CA A5 7B 8D B7 CA F0 C910 : A5 01 8D B5 CA 20 00 C4 87 C918 : AD B0 CA 4A 4A 4A 4A 90 5A C920 : 0E 20 34 C0 AD B0 CA 4A 84 C928 : 4A 4A 90 03 20 3D C0 AD 66 C930 : B0 CA 4A 4A 90 03 20 03 C9 C938 : C0 AD B0 CA 4A 90 03 20 CA C940 : 0F C0 4C 6C C5 0D FF FF 15 C948 : FF 20 20 20 20 53 50 52 E6 C950 : 55 4E 47 42 45 46 45 48 13 C958 : 4C 45 0D FF FF FF FF 20 CA C960 : 3D 3D 3D 3D 3D 3D 3D 3D 60 C968 : 3D 3D 3D 3D 3D 0D 00 20 B7 C970 : 49 4E 20 5A 45 49 4C 45 8E C978 : 20 20 20 20 53 50 52 55 60 C980 : 4E 47 20 44 55 52 43 48 88 C988 : FF 20 20 4E 41 43 48 FF B9 C990 : 00 2A 3D 3D 3D 3D 3D 3D CA C998 : 3D 3D 2A 3D 3D 3D 3D 3D D3 C9A0 : 3D 3D 3D 3D 3D 3D 3D 3D A0 C9A8 : 3D 3D 3D 3D 3D 3D 2A 3D 5C C9B0 : 3D 3D 3D 3D 3D 3D 3D 3D B0 C9B8 : 2A 00 FF FF FF 41 4E 47 B4 C9C0 : 45 53 50 52 55 4E 47 45 7D C9C8 : 4E 45 20 5A 45 49 4C 45 67 C9D0 : 4E 0D FF FF FF 20 3D 3D 15 C9D8 : 3D 3D 3D 3D 3D 3D 3D 3D D8 C9E0 : 3D 3D 3D 3D 3D 3D 3D 3D E0 C9E8 : 3D 3D 0D 00 2A 20 20 5A E0 C9F0 : 49 45 4C 20 20 2A 20 20 07 C9F8 : 20 53 50 52 55 4E 47 20 45 CA00 : 44 55 52 43 48 20 20 20 32 CA08 : 20 2A 20 20 20 49 4E 20 0F CA10 : 20 20 20 2A 00 0D FF FF F6 CA18 : FF 20 20 20 20 20 20 56 64 CA20 : 41 52 49 41 42 4C 45 4E 3D CA28 : 0D FF FF FF FF 20 3D 3D A5 CA30 : 3D 3D 3D 3D 3D 3D 3D 0D D0 CA38 : 00 20 56 41 52 49 41 42 FF CA40 : 4C 45 20 20 20 5A 45 49 B7 CA48 : 4C 45 4E FF FF FF 00 2A 1F CA50 : 3D 3D 3D 3D 3D 3D 3D 3D 50 CA58 : 2A 00 0D 53 50 45 49 43 0B CA60 : 48 45 52 20 56 4F 4C 4C 8D CA68 : 20 21 21 0D 00 0D 41 42 F5 CA70 : 42 52 55 43 48 20 21 21 E5 CA78 : 0D 00 54 48 45 4E 20 46 77 CA80 : 4F 52 20 20 4E 45 58 54 1E CA88 : 20 52 55 4E 20 20 4F 4E CD CA90 : 20 2D 20 47 53 55 42 20 61 CA98 : 47 4F 54 4F 20 20 20 20 4A CAA0 : 20 20 2A 00 00 00 00 00 5B CAA8 : 00 F9 BF 00 00 00 05 00 A9 CAB0 : 00 00 00 00 00 00 00 55 5B
* = $C000
AKOPADR = $F7
NKOPADR = $F9
CHRGET = $0073
CHRGOT = $0079
GETZEIL = $A96B
TABENDL = $57
TABENDH = $58
ZEI1L = $FB
ZEI1H = $FC
ZEI2L = $FD
ZEI2H = $FE
LAENGE = $B6
TEMP = $BD
;***************************************
JMP SCONTROL
VAR JSR VSTART ; SUCHT VARIABLEN
JSR DRVAR ; AUSGABE V. KOPF
JSR VAROUT ; " DER VAR.
JMP CARET2 ; ZEILENVORSCHUB
VAR2 LDA SYSTAT ; VAR. IN REIHENF.
LSR A ;
LSR A ;
BCS VAR3 ;
JSR VSTART ; NEIN: SUCHEN
VAR3 JSR INTEND ; TAB. UM 1 KUERZ.
JSR INIT ; INITIALISIEREN
JSR TESTTAB ; TABELLE LEER?
BCS LVAR2
RTS ; JA: RTS
LVAR2 JSR SORT ; TAB. SORTIEREN
JSR DECTEND
JSR DRVAR
JSR VAROUT
JMP CARET2
SPR JSR SPRUNG ; SPRUENGE SUCHEN
JSR CARET2 ; UND AUSGEBEN
JMP INTEND
AN JSR INIT ; ANGESPRUNGENE
JSR TESTTAB ; ZEILEN AUSGEBEN
BCS LAN1
RTS
LAN1 JSR SORT
JSR DECTEND
JSR DRAN
JSR ZIELE
JMP CARET2
;
VSTART LDA #$6 ; = ZNR+CODE+ZNR
STA LAENGE
JSR SETTAB
JSR SETBER
JMP VZEILE2
VZEILE JSR NEXTLINE
VZEILE2 LDA #%10000000
STA DBSTAT
LDA TEMP ; KODE FUER ENDE?
CMP #$FF ; NEIN: WEITER
BNE VARLOOP ; JA: ENDE
RTS
VARLOOP JSR NXTCHR
CMP #$20
BEQ VARLOOP
CMP #0 ; ZEILENENDE ?
BEQ VZEILE
CMP #$22 ; =" ODER = REM?
BEQ VARSUCH ; DANN BIS " O.
CMP #$8F ; NEUE ZEILE
BEQ VZEILE ; WEITER
CMP #$A7 ; THEN
BEQ SETDB
CMP #$88 ; LET
BEQ SETDB
CMP #': ; STATEMENT
BEQ SETDB
CMP #$81 ; FOR
BEQ SETDB
JSR CHKALPH
BCC LTEST1
JSR VARGET
JSR INZEI1
JSR OVFLOW
LTEST1 LDX #%00000000
STX DBSTAT
JMP VARLOOP
SETDB LDX #%10000000
STX DBSTAT
JMP VARLOOP
VARSUCH JSR NXTCHR
CMP #$22
BEQ LWS1
CMP #0
BEQ LWS2
JMP VARSUCH
LWS1 JMP VARLOOP
LWS2 JSR NEXTLINE
JMP VARLOOP
;
SPRUNG LDA #5 ; = ZNR+CODE+ZNR
STA LAENGE
STA LINES ; LF NACH 5 ZEILEN
JSR SETTAB
JSR SETBER
LDA TEMP
CMP #$FF
BEQ SZEILE2
JSR DRSPR
LDA #0
STA ZLANG
JMP SZEILE1
SZEILE JSR NEXTLINE
SZEILE1 LDA TEMP ; KODE FUER ENDE?
CMP #$FF
BNE SZEILE2
RTS
SZEILE2 LDA #%00000001 ; STATUS FUER
STA THSTAT ; 5 LEERZEICHEN
SPRLOOP JSR NXTCHR
CMP #0 ; ZEILENENDE ?
BEQ SZEILE
CMP #$22 ; =" ODER = REM?
BEQ SPRSUCH ; DANN BIS " O.
CMP #$8F ; NEUE ZEILE
BEQ SZEILE ; WEITER
CMP #$89 ; GOTO ?
BEQ CGOTO
CMP #$8D ; GOSUB ?
BEQ CGOSUB
CMP #$A7 ; THEN ?
BEQ CTHEN
CMP #$8A ; RUN ?
BEQ CRUN
CMP #$91 ; ON ?
BEQ CON
CMP #$81 ; FOR ?
BEQ CFOR
CMP #$82 ; NEXT ?
BEQ CNEXT
JMP SPRLOOP
CGOTO JMP GOTO
CGOSUB JMP GOSUB
CTHEN JMP THEN
CRUN JMP RUN
CON JMP ON
CFOR JMP FOR
CNEXT JMP NEXT
JMP SPRLOOP
SPRSUCH JSR NXTCHR
CMP #$22
BEQ LSS1
CMP #0
BEQ LSS2
JMP SPRSUCH
LSS1 JMP SPRLOOP
LSS2 JSR NEXTLINE
JMP SPRLOOP
;
GOTO JSR ZEILOUT
LDA #%00000010
JMP AUSGABE
;
GOSUB JSR ZEILOUT
LDA #%00000100
JMP AUSGABE
;
RUN JSR CHKSPC ; NAE. ZCHN NUM.?
JSR CHKNUM ; JA: AUSGABE
BCC LRUN1 ; NEIN: WEITER
JSR ZEILOUT
DEC POINTER ; DA CHKSPC AUF N.
LDY POINTER ; ZCHN STELLT
LDA #%00010000
JMP AUSGABE
LRUN1 JMP SPRLOOP
;
FOR JSR ZEILOUT
INC FANZ ; OFFENE FOR+1
LDA #%01000000
STA TSTAT
JSR TEXTAUS
LFOR1 JSR CHKSPC ; TEXT BIS '=' AUS-
CMP #$B2 ; GEBEN ('=':$B2)
BEQ LFOR2 ;
JSR CHROUT ; GEBEN
JMP LFOR1
LFOR2 JSR LINEFEED
JMP SPRLOOP
;
NEXT LDA POINTER
PHA
NEXT1 DEC FANZ
NEXT2 JSR NXTCHR
JSR TRZCHN
BEQ NEXT3
CMP #',
BEQ NEXT1
JMP NEXT2
NEXT3 PLA
STA POINTER
JSR ZEILOUT
LDA #%00100000
STA TSTAT
JSR TEXTAUS
LNEXT1 JSR CHKSPC
JSR TRZCHN ; SOLANGE ZCHN
BEQ LNEXT3 ; AUSG. BIS Z.ENDE
JSR CHROUT
JMP LNEXT1
LNEXT3 JSR LINEFEED
JMP SPRLOOP
;
ON JSR ZEILOUT
LON1 JSR CHKSPC
CMP #$89 ; GOTO ?
BEQ ONTO
CMP #$8D ; GOSUB?
BEQ ONSUB
JMP LON1
ONTO LDA #%00001010
JMP LON2
ONSUB LDA #%00001100
LON2 JSR SORCOD
LDA TSTAT
AND #%11111110
STA TEMP
STA TSTAT
LDX #0
JSR TEXTAUS
JSR TABS
JSR CHKSPC
DEC POINTER
JSR SETGET
LON3 LDA TEMP
JSR TSPRUNG ; SPR.ART, ZNR U.
JSR GETSPR2 ; ZIEL IN TABELLE
JSR CHRGOT ; ENDE STATEMENT?
BEQ LON4 ; JA: LINEFEED
CMP #', ; WEITERE ZEILENNR.
BNE LON3 ; NEIN: LINEFEED
JSR CHROUT
LDA ZLANG
CMP #75
BCC LON3
JSR CARET ; LINEFEED
JSR TABS
JSR TABS
JSR TABS
JMP LON3
LON4 JSR FUNFLIN
JSR CARET
JMP SPRLOOP
;
TSPRUNG LDY #2
STA (ZEI1L),Y
JSR ZNR ; ZNR AUS $14/$15
LDY #3 ; IN TABELLE
LDA $62
STA (ZEI1L),Y
INY
LDA $63
STA (ZEI1L),Y
RTS
;
THEN JSR CHKSPC
JSR CHKNUM ; ZIFFER?
BCC THENDE ;
JSR ZEILOUT ; THEN MIT ZEILE
LDA #%10000000
JSR SORCOD
DEC POINTER ; EIN ZCHN ZURUECK,
LDY POINTER ; DA CHKNUM ZU WEIT
JMP AUSGABE
THENDE DEC POINTER ; TH-BIT SETZEN
LDA #%10000000
STA THSTAT
JMP SPRLOOP
;
AUSGABE STA TSTAT
JSR SORCOD
JSR TEXTAUS
JSR TABS
JSR GETSPR ; ZIEL IN TABELLE
JSR LINEFEED ; UND AUSGEBEN
JMP SPRLOOP
;
;***************************************
; UNTERROUTINEN
;***************************************
INIT JSR ROMOFF
LDA #0
STA ZSTAT
STA ZLANG
STA FANZ
STA TSTAT
STA TEMP
STA DBSTAT
STA TABENDL
LDA #$A0
STA TABENDH
LDA #$F9
STA TABSTRTL
STA ZEI1L ; ANFANG DER TAB-
LDA #$BF ; BELLE AB $BFF9
STA TABSTRTH
STA ZEI1H
JMP BASTRT
;
NEXTLINE LDY #0
LDA (NKOPADR),Y
BNE LNL1
INY
LDA (NKOPADR),Y
BEQ NLENDE
LNL1 LDA NKOPADR
STA AKOPADR
LDA NKOPADR +1
STA AKOPADR +1
JSR CKBEN ; ENDE BEREICH?
BEQ LNL2 ; NEIN
BCC LNL2 ;
;
NLENDE LDA ZEI1L ; SETZT TABELLEN-
STA TENDL ; ENDE AUF ZEI1
LDA ZEI1H
STA TENDH
LDA #$FF ; KODE FUER
STA TEMP ; ENDE TESTLOOP
RTS
;
LNL2 LDA ZSTAT
AND #%1110 ; ZNR FLAG LOE.
STA ZSTAT
LDY #3 ; ZEIGT AUF 0.
STY POINTER ; BASIC-ZEICHEN
LDY #0
LDA (AKOPADR),Y ; ZEIGER AUF
STA NKOPADR ; NAECHSTE B.
INY ; ZEILE HOLEN
LDA (AKOPADR),Y
STA NKOPADR +1
RTS
;
;=======================================
; HOLT SYSTEM-PARAMETER (SYSTAT)
; SETZT DRUCKER
; HOLT BEREICH (IN BERST/EN)
;=======================================
SYSGET LDA #0
STA SYSTAT
STA BERSTL
STA BERSTH
LDA #$FF
STA BERENL
STA BERENH
JSR CHRGOT
CMP #',
BEQ LSYS0
LDX #$0B
JMP $A437 ; FEHLER: SYNTAX
LSYS0 JSR CHRGET ; DRUCKER
CMP #'P
BNE LSYS1
JSR SETPRT
LSYS1 JSR CHRGET
CMP #'S
BNE LSYS2
LDA #%01000
JSR SETSYS
LSYS2 JSR CHRGET ; ANGESPR. ZEILEN?
CMP #'J
BNE LSYS3
LDA #%00100
JSR SETSYS
LSYS3 JSR CHRGET ; VARIABLEN ?
CMP #'V
BNE LSYS4
LDA #%00010
JSR SETSYS
LSYS4 JSR CHRGET ; VARIABLEN SORT.?
CMP #'J
BNE LSYS5
LDA #%00001
JSR SETSYS
LSYS5 JSR CHRGET ; KOMMENTAR ?
CMP #'K
BNE LSYS6
LDA #%10000
JSR SETSYS
JSR CHRGET
LSYS6 CMP #', ; FOLGEN ZNRS?
BNE LSYS8 ; NEIN: RTS
CMP #$AB ; "-"
BEQ LSYS7
JSR CHRGET
JSR GETZEIL
LDA $14
STA BERSTL
LDA $15
STA BERSTH
JSR CHRGOT
CMP #$AB ; "-"
BNE LSYS8 ; NEIN: ENDE
LSYS7 JSR CHRGET
JSR GETZEIL
LDA $14
STA BERENL
LDA $15
STA BERENH
LSYS8 RTS
;
SETSYS ORA SYSTAT ; <AC> MIT SYSTAT
STA SYSTAT ; VERKNUEPFEN
RTS
;
;***************************************
CKBST JSR ZNR ; TEST, OB AKT. ZNR
CPX BERSTH ; GROESSER ODER
BNE LBST1 ; GLEICH BER. ANF
CMP BERSTL
LBST1 RTS
;
CKBEN JSR ZNR ; TEST, OB AKT. ZNR
CPX BERENH ; GROESSER ODER
BNE LBEN1 ; GLEICH BER. ENDE
CMP BERENL
LBEN1 RTS
;
SETTAB LDA #$A0
STA TABENDH
LDA #$00
STA TABENDL
RTS
;
SETBER JSR INIT
LBER1 JSR NEXTLINE
LDA TEMP
CMP #$FF
BNE LBER2
JSR SYSOFF
JMP $A7AE
LBER2 JSR CKBST
BCC LBER1
RTS
;
BASTRT LDA $2B ; ADDRESSE DER
STA NKOPADR ; ERSTEN BASIC
LDA $2C ; ZEILE HOLEN
STA NKOPADR +1
RTS
;
PREVCHR DEC POINTER ; HOLT VORIGES
JSR AKTCHR ; ZCHN, OHNE
INC POINTER ; ZEIGER ZU
RTS ; VERSTELLEN
;
NXTCHR INC POINTER ; HOLT NAECHSTES
; ; ZEICHEN
AKTCHR LDY POINTER
LDA (AKOPADR), Y
RTS
;
GET JSR ROMON
JSR $F13E
JMP ROMOFF
;
CHROUT INC ZLANG
JSR ROMON
JSR $FFD2
;
ROMOFF PHA
LDA 1
AND #%11111110
STA 1
PLA
RTS
;
ROMON PHA
LDA #$37
STA 1
PLA
RTS
;
CHKALPH JSR ROMON ; TEST, OB AKKU ALPHA
JSR $B113 ; C=1, WENN BUCHST.
JMP ROMOFF ; C=0, WENN ANDERS
;
CHKNUM CMP #$3A ; GROESSER ALS '9'?
BPL LCN1
CMP #$30 ; KLEINER ALS '0'?
BMI LCN1 ; JA: C=0
SEC ; NEIN: C=1
RTS
LCN1 CLC
RTS
;
CHKSPC JSR NXTCHR
CMP #$20
BEQ CHKSPC
RTS
;
TRZCHN CMP #0 ; TESTET AUF NULL
BEQ LTZ1 ; UND ':'
CMP #': ; JA: Z=1
BEQ LTZ1 ; NEIN: Z=0
LTZ1 RTS
;
TESTTAB LDA TABSTRTH
CMP TENDH
BNE LTETA
LDA TABSTRTL
CMP TENDL
LTETA RTS
;
OVFLOW JSR TESTEND
BCS LOVF
JSR SYSOFF
LDA #<TOVER
LDX #>TOVER
JSR MASKE
JMP $A7AE
LOVF RTS
;
ZEILOUT JSR ZNR ; ZNR NACH $62/$63
LDY #4 ; ZNR IN TAB
STA (ZEI1L),Y
DEY
TXA
STA (ZEI1L),Y
LDA #0
STA TEMP
LDA ZSTAT ; BEI 1 KEINE ZNR
LSR A
BCS LZO1
LDA ZSTAT ; ZNR-FLAG =1
ORA #%0001
STA ZSTAT
JSR ZAUSGABE
LDX #39
LDY #2
JMP LZO2
LZO1 LDX #34
LDY #7
LZO2 LDA FANZ ; FOR OFFEN?
STA $63
BEQ LZO3 ; NEIN: RTS
STA TEMP
JSR LTA2
LDA #0
STA $62
JSR ZAUSGABE
LZO3 LDA #0
STA TEMP
JMP TABS
;
ZNR LDY #3 ; HOLT NR. DER
LDA (AKOPADR), Y ; AKT. ZEILE
TAX ; NACH $62/$63
DEY ; UND A,X
LDA (AKOPADR), Y
STX $62
STA $63
RTS
;
ZAUSGABE JSR ROMON
LDX #$90 ;$62/$63 WIRD ALS
SEC ;INTEGERZAHL IM
JSR $BC49 ;16-BIT ADDRESS-
JSR $BDDF ;FORMAT AUSGEGEBEN
JSR STROUT ; $AB1E
JMP ROMOFF
;
RECBUN EOR #$FF
ADC #6
TAY
LREC1 BEQ LREC2
LDA #$20
JSR CHROUT
DEY
JMP LREC1
LREC2 RTS
;
LINEFEED LDA ZSTAT
LSR A ; BEI BIT 1=0
LSR A ; KEIN LF
BCC LLF1
JSR FUNFLIN
JMP CARET
LLF1 LDX ZLANG ; KEIN LF, DANN
CPX #40 ; BIS POS. 40
BCS LLF2 ; AUFFUELLEN
LDA #$20
JSR CHROUT
JMP LLF1
LLF2 LDA ZSTAT
ORA #%0010 ; LF-FLAG SETZEN
STA ZSTAT
RTS
;
CARET LDA ZSTAT ; LF-FLAG LOESCHEN
AND #%1101
STA ZSTAT
CARET2 LDA #$0D
JSR CHROUT
LDA #0 ; ZEILENLAENGE:=0
STA ZLANG
CARET3 JSR GET ; TASTE GEDRUECKT?
BEQ LCAR4 ; NEIN: RTS
LCAR1 CMP #3 ; RUN/STOP?
BNE LCAR3
LCAR2 JSR SYSOFF ; JA
LDA #<TBREAK
LDX #>TBREAK
JSR MASKE
JMP $A7AE
LCAR3 JSR GET ; 2. TASTE
BEQ LCAR3 ; FUER CONT.
CMP #3
BEQ LCAR2
LCAR4 RTS
;
FUNFLIN DEC LINES
BNE LFUNF1
LDA #5
STA LINES
JSR CARET
LFUNF1 RTS
;
TABS LDA ZLANG ; ZEILENLAENGE HOL.
SEC
LTAB1 SBC #10 ; SOLANGE POSITIV
BCS LTAB1 ; 10 ADDIEREN
EOR #$FF ; ERGEBNIS INVERT.
ADC #1
TAX
INX
LTAB2 DEX
BEQ LTAB3
LDA #$20
JSR CHROUT
JMP LTAB2
LTAB3 RTS
;
SETPRT LDA #4
LDX #4
LDY #$68 ; SEK 8 + $60
JSR $FFBA ; FILPAR
JSR $FFB1 ; LISTEN
LDA #$68 ; SEKADR
JSR $FF93 ; SEKLST
LDA #4
STA $9A
RTS
;
SYSOFF LDA PROPORT
CMP #$35
BNE GETRES
LDA #$37 ; ROM AN,
STA 1 ; $A000 KOPIERT WIRD
LDA #$A0
STA 4
LDY #0
LROMK LDA (3),Y
STA (3),Y
INY
BNE LROMK
INC 4
LDA 4
CMP #$C0
BNE LROMK
;
GETRES LDA GETSP
STA $7A
LDA GETSP +1
STA $7B
PRTOFF LDA #4
JSR $FFAE ; UNLIST
JSR $FFC3 ; SCHLIESSEN
LDA #3
STA $9A
LDA PROPORT
STA 1
RTS
;
STROUT JSR ROMON
JSR $B487 ; STRINGPARAM. HOL.
JSR $B6A6 ; FRESTRING
PHA
LDX TEMP
BNE LSTR0
JSR RECBUN
LSTR0 PLA
TAX ; STR.LAENGE
LDY #0
INX
LSTR1 DEX
BEQ LSTR2
LDA ($22),Y
JSR CHROUT ; DRUCKEN
INY
CMP #$0D
BNE LSTR1
JSR $AAE5
JMP LSTR1
LSTR2 JMP ROMOFF
;
TEXTAUS LDX #0
LDA THSTAT
ORA TSTAT
STA TSTAT
LTA1 ASL TSTAT
BCS FUENFAUS
INX
INX ; SETZE X AUF DEN
INX ; NAECHSTEN TEXTAB-
INX ; SCHNITT
INX
JMP LTA1
FUENFAUS LDY #5
LTA2 LDA TEXT,X
JSR CHROUT
INX
DEY
BNE LTA2
LDA TSTAT
BNE LTA1
RTS
;
;=======================================
; AUSGABE ALLER VARIABLEN IN DER TAB
;=======================================
VAROUT LDA TABSTRTL ; ZEIGER AUF
STA ZEI1L ; ANFANG DER
LDA TABSTRTH ; TABELLE SETZEN
STA ZEI1H
LDA TENDL
STA TABENDL
LDA TENDH
STA TABENDH
LDA #5 ; STARTWERT 3
STA LINES ; FUER ABSAETZ
JSR CARET2 ; ZLANG:=0 U.
LVARO1 JSR TESTEND ; TABELLE ENDE?
BEQ LVARO9 ; JA: RTS
LVARO2 JSR SETVANZ
LDY #1 ; 1. ZEICHEN
LDA (ZEI1L),Y ; AUSGEBEN
JSR CHROUT
INY ; 2. ZEICHEN
LDA (ZEI1L),Y ; AUSGEBEN,
CMP #$20 ; WENN <>LEER
BEQ LVARO3
JSR CHROUT
LVARO3 JSR STATOUT
JSR TABS
LVARO4 LDY #3 ; ZNR HOLEN
LDA (ZEI1L),Y ; UND NACH
STA $62 ; $62/$63
INY
LDA (ZEI1L),Y
STA $63
LDA #0
STA TEMP
JSR ZAUSGABE
LDY #5 ;"*" HINTER ZNR
LDA (ZEI1L),Y ;WENN DEF
ASL A ;SONST WEITER
BCC LVARO5
LDA #'*
JSR CHROUT
LVARO5 JSR TABS
INC VANZ
JSR VARVERG ;ALTVAR=NEUVAR?
PHP ; JA: NUR ZNR
JSR INZEI1 ; NEIN: UND NAM
JSR TESTEND ; ENDE DER TAB?
BEQ LVARO8 ; JA: ENDE
PLP ; AUSGEBEN
BEQ LVARO4 ; (NUR ZNR)
LDA VANZ ; MEHR ALS 7
CMP #8 ; VAR AUSGEG.?
BCC LVARO6 ; JA: LF,
JSR CARET ; VANZ:=0
JSR FUNFLIN
JSR SETVANZ
JMP LVARO7
LVARO6 CMP #4 ; 4 VAR?: LF
BCC LVARO7 ; WENIGER: WEITER
JSR LLF2
LVARO7 JSR LINEFEED
JMP LVARO2
LVARO8 PLP
LVARO9 JMP CARET2
;
SETVANZ LDA #0
STA VANZ
RTS
;
;=======================================
; HOLEN EINER VARIABLEN AUS BASIC TEXT
;=======================================
VARGET LDY #1 ;ZEICHEN IN TAB.
STA (ZEI1L),Y
JSR NXTCHR ;NAECHSTES ZCHN
LDY #2
JSR CHKALPH ;BUCHSTABE?
BCS LVARGET1 ;JA: IN TAB.
JSR CHKNUM ;ZIFFER?
BCS LVARGET1 ;JA: IN TAB
TAX ;NEIN: AC SICHERN
LDA #$20 ; LEER IN TAB.
STA (ZEI1L),Y
JMP LVARGET2
LVARGET1 STA (ZEI1L),Y
JSR NXTCHR
TAX
LVARGET2 LDA #%01000000
CPX #'$ ; STRING?
BEQ LVARGET4
CPX #'% ; INTEGER?
BEQ LVARGET3
LSR A ; REAL
LSR A
JMP LVARGET5
LVARGET3 LSR A ; INTEGER
LVARGET4 PHA ; AC SICHERN
JSR NXTCHR
TAX
PLA
LVARGET5 CPX #'( ; DIMENSIONIERT?
BNE LVARGET6 ; NEIN
ORA #%10000000 ; JA!
LVARGET6 LDY #0 ; STATUS AN 5.
STA (ZEI1L),Y ; STELLE IN TAB.
JSR ZNR ;ZNR IN TAB.
LDY #4 ;AN 4./5. STELLE
STA (ZEI1L),Y
DEY
TXA
STA (ZEI1L),Y
LDA DBSTAT ; DEF/BEN AN 5.
LDY #5 ; STELLE
STA (ZEI1L),Y
RTS
;
;=======================================
; PRUEFT STATUSBYTE DER VARIABLEN
; UND GIBT TYP - $, %, () - AUS
;=======================================
STATOUT LDY #0
LDA (ZEI1L),Y
LSR A
LSR A ; BITS 0-3
LSR A ; UEBERLESEN
LSR A
LSR A ; REAL?
BCS LSTAT2
LDX #'% ; INTEGER?
LSR A
BCS LSTAT1
DEX ;STRING!
LSTAT1 TXA
JSR CHROUT
LSTAT2 LDA (ZEI1L),Y ; FELD?
ASL A
BCC LSTAT3 ; NEIN: RTS
LDA #'(
JSR CHROUT
LDA #')
JSR CHROUT
LSTAT3 RTS
;
;=======================================
; SORTIEREN VON FELDERN NACH
; "BUBBLESORT"
; UEBERGABE:
; "LAENGE" DES FELDES
; "TABSTRT" ANFANG DES FELDES
; "TABEND" ENDE
;=======================================
;=======================================
; ERHOEHE ZEIGER1 UM LAENGE
;=======================================
INZEI1 SEC
LDA ZEI1L
SBC LAENGE
STA ZEI1L
BCS LINZ1
DEC ZEI1H
LINZ1 RTS
;
;=======================================
; ROUTINE BESTIMMT ZEIGER AUF I+1-TES
; ELEMENT; PARAMETER: LAENGE, ZEI1
;=======================================
IZEIG2 LDA ZEI1H
STA ZEI2H
SEC
LDA ZEI1L
SBC LAENGE
STA ZEI2L
BCS LADD1
DEC ZEI2H
LADD1 RTS
;
;=======================================
; VERGLEICH DER DURCH ZEI1, ZEI2 UND
; LAENGE BESTIMMTEN FELDER
; C=1, WENN A(I)>A(I+1)
; Z=1, WENN A(I)=A(I+1) (Y=LAENGE)
;=======================================
VERGL LDY #0
LV1 CLC
LDA (ZEI1L),Y
CMP (ZEI2L),Y
BEQ LV2 ; GLEICH
BCS LV3 ; GROESSER
BCC LV3 ; KLEINER
LV2 INY ; NEIN: NAECHSTES
CPY LAENGE ; X=LAENGE?
BEQ LV3 ; JA: ENDE
JMP LV1 ; ELEMENT TESTEN
LV3 RTS
;
;=======================================
; VERGLEICH ZWEIER VARIABLEN
; Z=1, WENN NAME UND STATUS GLEICH
;=======================================
VARVERG JSR IZEIG2
LDA #3 ; NUR 3 BYTE
STA LAENGE ; (STAT, NAME)
JSR VERGL ; VERGLEICHE
PHP ; LAENGE WIEDER
LDA #6 ; 6
STA LAENGE
PLP
RTS
;
;=======================================
; TAUSCHE ZWEI FELDER, DIE DURCH ZEI1L
; ZEI2L UND LAENGE BESTIMMT SIND
;=======================================
EXCHANGE LDY #0
LEXCH1 CPY LAENGE ; SOLANGE Y<LAE.
BEQ LEXCH2
LDA (ZEI1L),Y ; VERTAUSCHE
PHA ; ZWEI BYTES
LDA (ZEI2L),Y
STA (ZEI1L),Y
PLA
STA (ZEI2L),Y
INY
JMP LEXCH1
LEXCH2 RTS
;
;=======================================
; ENDE DER TABENDLLE ERREICHT?
; (ZEI1 = TABEND= ==> Z=1)
;=======================================
TESTEND LDA ZEI1H
CMP TABENDH
BNE LTEND1
LDA ZEI1L
CMP TABENDL
LTEND1 RTS
;
;=======================================
; TABEND UM EIN ELEMENT ERNIED
;=======================================
DECTAB CLC
LDA TABENDL
ADC LAENGE
STA TABENDL
BCC LDECTAB
INC TABENDH
LDECTAB RTS
;
;=======================================
; TEND UM EIN ELEMENT VERRINGERN
;=======================================
INTEND CLC
LDA TENDL
ADC LAENGE
STA TENDL
BCC LINTEN1
INC TENDH
LINTEN1 RTS
;
;=======================================
; TEND UM EIN ELEMENT ERHOEHEN
;=======================================
DECTEND SEC
LDA TENDL
SBC LAENGE
STA TENDL
BCS LDETEN1
DEC TENDH
LDETEN1 RTS
;
;=======================================
; SORTIEREN
;=======================================
SORT LDA TENDL ; TABEND SETZEN,
STA TABENDL ; GEHT BEI SORT
LDA TENDH ; VERLOREN
STA TABENDH
LSORT1 LDA TABSTRTL ; ZEIGER1 AUF
STA ZEI1L ; TABSTRT
CMP TABENDL
PHP ; UND
LDA TABSTRTH ; TEST, OB
STA ZEI1H ; ENDE DER
CMP TABENDH ; TABELLE
BNE LSORTY ; ERREICHT
PLP ; JA: ENDE
BEQ LSORTW
LSORTY JSR IZEIG2
JSR VERGL ; VERGLEICHEN
BCC LSORT3 ; GROESSER, DANN
JSR EXCHANGE ; TAUSCHEN
LSORT3 JSR INZEI1 ; NAECHSTES
JSR TESTEND ; ENDE ERREICHT?
BNE LSORTY ; NEIN: WEITER
JSR DECTAB ; JA: NAECHSTER
JMP LSORT1
LSORTW RTS
;
;=======================================
; SETZT CHRGET - ZEIGER AUF AKT. ZEICH.
;=======================================
SETGET LDA POINTER
CLC
ADC AKOPADR
STA $7A
PHP
LDA AKOPADR + 1
STA $7B
PLP
BCC LSET1
INC $7B
LSET1 RTS
;
;=======================================
; HOLT SPRUNGZIEL NACH TABELLENENDE
;=======================================
GETSPR JSR SETGET
GETSPR2 JSR ROMON
JSR CHRGET
JSR GETZEIL
LDY #0
LDA $15
STA (ZEI1L),Y
STA $62
INY
LDA $14
STA (ZEI1L),Y
STA $63
JSR INZEI1
JSR ZAUSGABE
JMP OVFLOW
;
;=======================================
; SETZT BIT FUER SPRUNG NACH ON, THEN
;=======================================
SORCOD LDY #2
ORA THSTAT
STA TSTAT
STA (ZEI1L),Y
RTS
;
;=======================================
; AUSGABE DER ANGESPRUNGENEN ZEILEN
; IN DER TABELLE: H,L DES SPRUNGZIELS,
; CODE DER SPRUNGART,
; L,H DER AUFRUF-ZEILE
;=======================================
ZIELE LDA TENDL ; ZEIGER AUF ENDE
STA TABENDL ; TEND WURDE NICHT
LDA TENDH ; GEAENDERT
STA TABENDH
LDA TABSTRTL ; ZEIGER AUF
STA ZEI1L ; ANFANG
LDA TABSTRTH
STA ZEI1H
LDA #0
STA ZSTAT
STA ZLANG
LDA #5
STA LINES
LDA #%11110110
STA FANZ
LZIEL1 JSR TESTEND ; TABELLE LEER?
BEQ STPZIEL ; JA: BEENDEN
LDY #0 ; HIGH, LOW-BYTE
STY TEMP ; F. RECBUN
LDA (ZEI1L),Y ; DES ZIELS
STA $62 ; HOLEN
INY
LDA (ZEI1L),Y
STA $63
JSR ZAUSGABE
JSR TABS
LDY #2 ; SPRUNGART HOLEN
LDA (ZEI1L),Y
BIT FANZ
BNE LZIEL2
AND #%11111110
LZIEL2 STA TSTAT
LDX #0
STX TEMP ; F. RECBUN
JSR LTA1 ; TEXTAUSGABE
LDY #3 ; LOW,HIGH-BYTE
LDA (ZEI1L),Y ; DER AUFRUFENDEN
STA $62 ; ZEILE
INY
LDA (ZEI1L),Y
STA $63
JSR TABS
JSR ZAUSGABE
JSR LINEFEED
JSR INZEI1
JMP LZIEL1
STPZIEL RTS
;
;=======================================
; AUSGEBEN VON TEXT
;=======================================
MASKE STA ADRE+1
STX ADRE+2
LDX #0
STX ZLANG
ADRE LDA $FFFF
BEQ MASKE3
CMP #255
BEQ MASKE4
JSR CHROUT
MASKE1 INC ADRE+1
BNE MASKE2
INC ADRE+2
MASKE2 JMP ADRE
MASKE3 RTS
MASKE4 JSR TABS
JMP MASKE1
;
;=======================================
; AUSGABE DER "MASKEN" FUER SPR U. VAR
;=======================================
DRAN LDA #<TSPRK
LDX #>TSPRK
JSR MASKE
LDY #2
LDRAN1 LDA #<TANR
LDX #>TANR
JSR MASKE
DEY
BNE LDRAN1
JMP DRSPR1
DRSPR LDA #<TSPRK
LDX #>TSPRK
JSR MASKE
LDY #2
LDSP1 LDA #<TSPRR
LDX #>TSPRR
JSR MASKE
DEY
BNE LDSP1
DRSPR1 LDY #2
LDSP2 LDA #<TSPRU
LDX #>TSPRU
JSR MASKE
DEY
BNE LDSP2
RTS
;
DRVAR LDA #<TVARK
LDX #>TVARK
JSR MASKE
LDY #2
DRVAR1 LDA #<TVARR
LDX #>TVARR
JSR MASKE
DEY
BNE DRVAR1
LDY #8
DRVAR2 LDA #<TVARU
LDX #>TVARU
JSR MASKE
DEY
BNE DRVAR2
RTS
;
;=======================================
;=======================================
; STEUERROUTINE
; RUFT DIE ROUTINEN ENTSPRECHEND
; DER PARAMETER AUF
;=======================================
;=======================================
SCONTROL JSR SYSGET ; PARAMETER HOLEN
LDA $7A ; GET-ZEIGER RETTEN
STA GETSP ;
LDA $7B ;
STA GETSP +1
LDA 1 ; PROZESSORPORT
STA PROPORT ; RETTEN
JSR ROMOFF ; ROM AUSSCHALTEN
LDA SYSTAT ; ABFRAGE DER
LSR A ; PARAMETER
LSR A
LSR A
LSR A
BCC LCON1
JSR SPR
LDA SYSTAT
LSR A
LSR A
LSR A
BCC LCON1
JSR AN
LCON1 LDA SYSTAT
LSR A
LSR A
BCC LCON2
JSR VAR
LCON2 LDA SYSTAT
LSR A
BCC LCON3
JSR VAR2
LCON3 JMP SYSOFF ; STARTZUSTAND
; WIEDERHERSTELLEN
;
;=======================================
; TEXTE
;=======================================
TSPRK .BYTE 13,255,255,255
.TEXT " SPRUNGBEFEHLE"
.BYTE 13,255,255,255,255
.TEXT " ============="
.BYTE 13,0
TSPRR .TEXT " IN ZEILE SPRUNG DURCH"
.BYTE 255
.TEXT " NACH"
.TEXT 255,0
TSPRU .TEXT "*========*============"
.TEXT "=======*=========*"
.BYTE 0
TANK .BYTE 255,255,255
.TEXT "ANGESPRUNGENE ZEILEN"
.BYTE 13,255,255,255
.TEXT " ===================="
.BYTE 13,0
TANR
.TEXT "* ZIEL * SPRUNG DURCH *"
.TEXT " IN *"
.BYTE 0
TVARK .BYTE 13,255,255,255
.TEXT " VARIABLEN"
.BYTE 13,255,255,255,255
.TEXT " ========="
.BYTE 13,0
TVARR .TEXT " VARIABLE ZEILEN"
.BYTE 255,255,255,0
TVARU .TEXT "*========*"
.BYTE 0
TOVER .BYTE 13
.TEXT "SPEICHER VOLL !!"
.BYTE 13,0
TBREAK .BYTE 13
.TEXT "ABBRUCH !!"
.BYTE 13,0
TEXT .TEXT "THEN FOR NEXT "
.TEXT "RUN ON - GSUB "
.TEXT "GOTO *"
TSTAT .BYTE 0
POINTER .BYTE 0
ZLANG .BYTE 0
FANZ .BYTE 0
ZSTAT .BYTE 0
THSTAT .BYTE 0
TABSTRTL .BYTE $F9
TABSTRTH .BYTE $BF
TENDL .BYTE 0
TENDH .BYTE 0
DBSTAT .BYTE 0
LINES .BYTE 5
VANZ .BYTE 0
SYSTAT .BYTE 0
BERSTL .BYTE 0
BERSTH .BYTE 0
BERENL .BYTE 0
BERENH .BYTE 0
PROPORT .BYTE 0
GETSP .BYTE 0,0
.END