Tips & Tricks

Übersichtliches Listing

Diese kleine Erweiterung spaltet beim Listen eine Programmzeile in mehrere Zeilen auf. Dadurch wird die Analyse auch komplizierter Programmteile zum Kinderspiel.

Die Idee zu dieser Erweiterung kam durch den Einzeiler-Wettbewerb im 64’er-Magazin, bei dem die abgedruckten Programme durch ihre gedrängte Darstellung schlecht lesbar waren. Damit ist nun Schluß. Wenn in einer Programmzeile ein Doppelpunkt vorkommt, so wird der darauf folgende Befehl in die nächste Zeile geschrieben.
Beispiel:
Aus
10 A=53280:POKE A,I:POKE A+1,I+1:I=PEEK(53248+ 18):GOTO 10
wird
10A= 53280
POKE A,I
POKEA+1,I+1
I=PEEK(53248+18)
GOTO 10

Die Erweiterung liegt in dem Bereich von 49152 bis 49239, nimmt also keinen Basic-Speicherplatz in Anspruch. Sie läßt sich aber beliebig verschieben, damit sie auch bei Basic-Erweiterungen funktioniert, die den Bereich ab 49152 benutzen (man muß nur den Wert der Variablen ADRESSE in Zeile 0 ändern). Die 87 Byte lange Erweiterung läßtsich mit POKE 2,0 einschalten und mit POKE 2,1 wieder ausschalten.

So arbeitet die Routine

Das Maschinenprogramm liegt als Basic-Lader (Listing 1) und als Source-Code (Listing 2) vor. Zuerst wird der LIST-Vektor auf die neue Routine gePOKEt, dann erfolgt ein Rücksprung zum Basic. In der neuen LIST-Routine wird abgefragt, ob es sich bei dem zu listenden Zeichen um einen Befehl handelt. Ist dies der Fall, so wird zu der Routine gesprungen, die den Befehl ausgibt.

Anschließend erfolgt eine Überprüfung auf einen Doppelpunkt. Handelt es sich nicht um dieses Zeichen, so wird normal weitergelistet. Andernfalls findet eine Überprüfung der Speicherstelle 2 statt. Ist sie nicht 0, so wird der Doppelpunkt ausgegeben und mit dem normalen Listing weitergemacht. Steht in der Speicherstelle 2 eine 0, so wird ein CHR$(13) ausgegeben.

Im darauffolgenden Teil werden die untereinanderstehenden Teilprogrammzeilen linksbündig gemacht und ausgegeben. Danach wird wieder zum »normalen« Listing gesprungen.

Die Routine »Übersichtliches Listing« ist in erster Linie natürlich für das Arbeiten mit einem Drucker gedacht, denn eine Bildschirmausgabe mit einem Basic-Befehl pro Zeile würde den Vorteil der erhöhten Übersicht wohl bald zunichte machen, jedenfalls bei längeren Programmen. Der Einsatzschwerpunkt dieser Routine liegt damit bei der Analyse fremder, unübersichtlicher Programme mittels eines Druckers.

(Frank Barcikowski/ev)
0 adresse = 49152:rem beliebig
1 rem *******************
2 rem *    written by   *
3 rem *frank barcikowski*
4 rem *  moraenenweg 33 *
5 rem *3320 salzgitter-1*
6 rem *******************
10 fori=adresse to adresse+87
20 read a:s=s+a:poke i,a
30 next
31 if s<>10407thenprint"data error!":end
35 rem dem jeweiligen berreich anpassen
36 hi=int((adresse+11)/256)
37 lo=adresse+11-int((adresse+11)/256)*256
38 poke adresse+6,hi
39 poke adresse+1,lo
40 sys adresse:poke 2,0:end
50 rem ------------------------
60 rem einschalten der erweiterung :
70 rem poke 2,0
80 rem ------------------------
90 rem ausschalten der erweiterung :
99 rem poke 2,<>0
100 rem------------------------
101 data169,11,141,6,3,169,48,141,7,3,96,16,3,76,28,167,201,58,240,3,76,243
102 data166,166,2,240,3,76,243,166,169,13,32,210,255,152,72,160,2,177,95
103 data170,200,177,95,133,98,134,99,162,144,56,32,73,188,32,223,189,162
104 data0,189,0,1,240,3,232,208,248,169,32,32,210,255,202,208,250,104,168
105 data169,32,76,243,166,48,141,7,7,96
Listing 1. »Übersichtliches Listing« als Basic-Lader. Beachten Sie die Eingabehinweise auf Seite 6.
2
20:    3000                   .opt p1
25:    3000          list     =    $0306
26:    3000          altlist  =    $a71c
30:    3000                   *=   $3000
40:    3000 a9 0b             lda  #<nlist
50:    3002 8d 06 03          sta  list    ;listvektor verbiegen
60:    3005 a9 30             lda  #>nlist
70:    3007 8d 07 03          sta  list +1
80:    300a 60                rts          ;wieder zu basic
                      ;--------- neue listroutine -------
90:    300b 10 03    nlist    bpl  nint    ;pruefung auf inter—
100:   300d 4c 1c a7          jmp  altlist ;pretercode (>$80)
110:   3010 c9 3a    nint     cmp  #$3a    ;code fuer
110:   3012
120:   3012 f0 03             beq  doppelp ;code gefunden
130:   3014 4c f3 a6          jmp  $a6f3   ;weiterlisten
                      ;------- doppelpunkt gefunden —---
137:   3017 a6 02    doppelp  ldx  2       ;2 laden
138:   3019 f0 03             beq  ok      ;wenn 0 dann newlist
139:   301b 4c f3 a6          jmp  $a6f3   ;sonst altlist
140:   301e a9 0d    ok       lda  #13     ;return
150:   3020 20 d2 ff          jsr  $ffd2   ;printen
160:   3023 98                tya          ;y zwischenspeichern
170:   3024 48                pha          ;fuer spaeter
                      ;
                      ;----- berechnung der zu ---------
                      ;----- printenden spaces  ---------
210:   3025 a0 02             ldy  #2
220:   3027 b1 5f             lda  ($5f),y ;zeilennr. lo
230:   3029 aa                tax          ;merken
240:   302a c8                iny          ;zeiger erhoehen
250:   302b b1 5f             lda  ($5f),y ;zeilennr. hi
260:   302d 85 62             sta  $62
270:   302f 86 63             stx  $63
280:   3031 a2 90             ldx  #$90
290:   3033 38                sec
300:   3034 20 49 bc          jsr  $bc49   ;zeilennr. in fac
310:   3037 20 df bd          jsr  $bddf   ;fac nach ascii und $0100
                      ;              ;nach $0100
330:   303a a2 00             ldx  #0
340:   303c bd 00 01 loop     lda  $100,x
350:   303f f0 03             beq  endloop ;0 = stringende
360:   3041 e8                inx          ;zaehler fur space
370:   3042 d0 f8             bne  loop
                      ;----- space x mal printen-------
380:   3044 a9 20    endloop  lda  #32     ;space laden
400:   3046 20 d2 ff prin     jsr  $ffd2   ;printen
410:   3049 ca                dex
420:   304a d0 fa             bne  prin    ;schon fertig
430:   304c 68                pla          ;y wiederholen
435:   304d a8                tay
440:   304e a9 20             lda  #32     ;space in accu
450:   3050 4c f3 a6          jmp  $a6f3   ;accu printen
                      ;und weiterlisten
Listing 2. Assembler-Listing zu »Übersichtliches Listing«. Es dient nur zur Dokumentation, braucht also nicht eingegeben zu werden.
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →