Tips & Tricks

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.

Tabelle 1. Liste der Zeilen, die Sprungbefehle enthalten
Tabelle 2. Liste der angesprungenen Zeilen

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:

  1. Typ: Real, integer, Strings, Felder
  2. Name alphabetisch
  3. Zeilennummern in aufsteigender Reihenfolge.
Tabelle 3. Alle im Beispiel-Programm verwendeten Variablen
Tabelle 4. Alle Variablen des Beispiel-Programms in sortierter 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:

  1. Steife: P — Ausgabe auf Drucker
  2. Stelle: S — Ausgabe der Zeilen mit Sprungbefehlen (Tabelle 1)
  3. Stelle: J — Ausgabe der angesprungenen Zeilen (nur zusammen mit »S« an zweiter Stelle möglich (Tabelle 2)
  4. Stelle: V — Ausgabe der benutzten Variablen in der Reihen-
    folge des Auftretens (Tabelle 3)
  5. 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
Listing 1. Dieses, für sich unsinnige, Basic-Programm soll die Leistungsfähigkeit der Dokumentationshilfe »Cross-Reference-Liste« veranschaulichen
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
Listing 2. »Cross-Ref 64«. Das Programm sollte mit dem MSE eingegeben werden. Beachten Sie dazu bitte die Eingabehinweise auf Seite 8.
        * = $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
Listing 3. Der Source-Code von »Cross-Ref 64«.
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →