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