C 64
Tips & Tricks

Und er LISTet doch!

Man kann jedes Basic-Programm LISTen, auch wenn es mit einem LIST-Schutz versehen ist. Das Programm »LISTKNACKER« erledigt das für Sie – eventuelle POKEs oder Steuerzeichen hindern das Programm nicht am LISTen.

Stellen Sie sich vor, Sie haben ein Programm mit einem (fast) perfekten LIST-Schutz versehen, und wollen nach geraumer Zeit eine Verbesserung vornehmen. Doch die Version ohne Schutz ist nicht aufzufinden, und wie Sie das Programm damals geschützt haben, wissen Sie auch nicht mehr so genau. Was tun, um an ein Listing zu kommen? Ganz einfach: Sie nehmen den »LISTKNACKER« und holen sich Ihr Listing direkt von der Diskette.

Vom »LISTKNACKER« gibt es zwei Versionen: eine, um auf dem Bildschirm zu LISTen (Listing 1), und die andere, um das Listing auf den Drucker auszugeben (Listing 2). Geben Sie also die gewünschte Version mit dem Checksummer ein, speichern Sie sie und starten sie mit RUN. Dann legen Sie die Diskette mit dem zu listenden Programm ein und bestätigen dies durch Betätigen der CONTROL-Taste. Daraufhin geben Sie den Namen des Programms ein. Auf dem Bildschirm erscheinen die ASCII-Werte der Steuerzeichen mit vorangestelltem Komma in weiß (zum Beispiel »cursor down« als »,17«), die restlichen Zeichen und Befehle in hellblau. Auf einem Drucker sind die entsprechenden Zeichen revers dargestellt. Als Drucker lassen sich alle diejenigen verwenden, bei denen »OPEN 4,4:CMD4:LIST« zum korrekten LISTen des Programms führt.

(G. Engist/og)
Zeile 10 Sprung nach Zeile 220
Zeile 220–360
START
320 Programmfile öffnen
330–340 Fehlermeldung von Floppy
350 in indizierte Variable A$( ) werden Basic-Befehle eingelesen
360 2 Byte, die die Startadresse ergeben, werden überlesen
Zeile 160–210
ZEILENNUMMER berechnen und ausgeben, über Programmende entscheiden die Zeilen
160 die 2 Byte, die auf die nächste Zeile zeigen, werden überlesen
180 Statusvariable = 66 entspricht Programmfile-Ende
210 A=0 entspricht Gänsefüßchenmodus aus
Zeile 20–150
KERN
30 A$="" entspricht Zeiger auf nächste Zeilennummer
50–110 entscheiden über Gänsefüßchenmodus (A=0 aus, A=1 ein)
120–130 nachprüfen, ob Basic-Befehl oder nicht; wenn ja, wird die indizierte Variable A$( ) benützt
7 rem       von
8 rem  georg engist
9 rem 7818 achkarren
10 goto220
20 poke646,14:get#2,a$
30 ifa$=""goto160
40 b=asc(a$)
50 ifb=gthenifathena=h:goto120
60 ifb=gthena=i
70 ifa=hgoto120
80 ifb>jthenifb<kthenprinta$;:goto20
90 ifb>lthenprinta$;:goto20
100 b$=","+right$(str$(b),len(str$(b))-1)
110 poke646,i:printb$;:goto20
120 ifb>mthenifb<nthenprinta$(b-p);:goto20
130 ifb>nthenifb<qthenprinta$(b-r);:goto20
140 ifb>jthenprinta$;:goto20
150 printchr$(5)","right$(str$(b),len(str$(b))-1);:goto20
160 forz=1to3:get#2,a$:nextz
170 get#2,b$:a$=a$+chr$(.):b$=b$+chr$(.)
180 ifst=66thenclose1:close2:end
190 c=asc(a$):d=asc(b$):e=256*d+c
200 a$=str$(e):b$=right$(a$,len(a$)-1)+" "
210 print:printb$;:a=.:goto20
220 clr:printchr$(142)chr$(147)chr$(5)"{down}{down}{down}
230 print"  {CBM-R}  {CBM-R} UI {CBM-A}{CBM-R}{CBM-S} {CBM-S}UI UI{CBM-R} UI UI {CBM-S}UI {CBM-A}{CBM-S} {CBM-A}I
240 print"  {SHIFT--}  {SHIFT--} JI  {SHIFT--}  {CBM-Q}{CBM-E}I {SHIFT--}J{CBM-W} {CBM-Q}{CBM-W} {SHIFT--}  {CBM-Q}{CBM-E}I {CBM-Q}  {CBM-Q}{CBM-W}
250 print"  {CBM-Z}{CBM-X} {CBM-E}{$a0}JK  {CBM-E}  {CBM-X} J {CBM-E} {CBM-E} KJ JK {CBM-X} J {CBM-Z}{CBM-X} {CBM-E}J{down}{down}{down}
260 printtab(17)"v o n
270 printtab(9)"g e o r g  e n g i s t"chr$(154)
280 g=34:i=1:j=31:k=128:l=159:m=127:n=204:p=128:q=256:r=205
290 printtab(7)"{down}{down}{down}diskette einlegen ! (ctrl){down}":poke649,.:wait653,4:poke649,10
300 open1,8,15,"i0":printtab(4)
310 input"programmname ";na$
320 open2,8,0,"0:"+na$
330 input#1,en,en$
340 ifenthenprinttab(17)"{down}{down}"en:printtab(20-int(len(en$)/2))en$:end
350 dima$(75):forz=.to75:reada$(z):nextz:printchr$(147)
360 forz=.to1:get#2,a$:nextz:goto160
370 dataend,for,next,data,"input#"
380 datainput,dim,read,let,goto,run
390 dataif,restore,gosub,return
400 datarem,stop,on,wait,load,save
410 dataverify,def,poke,"print#",print
420 datacont,list,clr,cmd,sys,open
430 dataclose,get,new,"tab(",to,fn
440 data"spc(",then,not,step,+
450 data-,*,/,^,and,or,">"
460 data=,"<",sgn,int,abs,usr,fre
470 datapos,sqr,rnd,log,exp,cos,sin
480 datatan,atn,peek,len,"str$",val
490 dataasc,"chr$","left$","right$"
500 data"mid$",go
Listing 1. »LISTKNACKER« LISTet jedes Basic-Programm auf den Bildschirm
7 rem       von
8 rem  georg engist
9 rem 7818 achkarren
10 goto220
20 get#2,a$
30 ifa$=""goto160
40 b=asc(a$)
50 ifb=gthenifathena=h:goto120
60 ifb=gthena=i
70 ifa=hgoto120
80 ifb>jthenifb<kthenprint#4,a$;:goto20
90 ifb>lthenprint#4,a$;:goto20
100 b$=chr$(18)+","+right$(str$(b),len(str$(b))-1)+chr$(146)
110 print#4,b$;:goto20
120 ifb>mthenifb<nthenprint#4,a$(b-p);:goto20
130 ifb>nthenifb<qthenprint#4,a$(b-r);:goto20
140 ifb>jthenprint#4,a$;:goto20
150 print#4,chr$(18);",";right$(str$(b),len(str$(b))-1);chr$(146):goto20
160 forz=1to3:get#2,a$:nextz
170 get#2,b$:a$=a$+chr$(.):b$=b$+chr$(.)
180 ifst=66thenclose1:close2:close4:end
190 c=asc(a$):d=asc(b$):e=256*d+c
200 a$=str$(e):b$=right$(a$,len(a$)-1)+" "
210 print#4:print#4,b$;:a=.:goto20
220 clr:printchr$(142)chr$(147)chr$(5)"{down}{down}{down}
230 print"  {CBM-R}  {CBM-R} UI {CBM-A}{CBM-R}{CBM-S} {CBM-S}UI UI{CBM-R} UI UI {CBM-S}UI {CBM-A}{CBM-S} {CBM-A}I
240 print"  {SHIFT--}  {SHIFT--} JI  {SHIFT--}  {CBM-Q}{CBM-E}I {SHIFT--}J{CBM-W} {CBM-Q}{CBM-W} {SHIFT--}  {CBM-Q}{CBM-E}I {CBM-Q}  {CBM-Q}{CBM-W}
250 print"  {CBM-Z}{CBM-X} {CBM-E}{$a0}JK  {CBM-E}  {CBM-X} J {CBM-E} {CBM-E} KJ JK {CBM-X} J {CBM-Z}{CBM-X} {CBM-E}J{down}{down}{down}
260 printtab(17)"v o n
270 printtab(9)"g e o r g  e n g i s t"chr$(154)
280 g=34:i=1:j=31:k=128:l=159:m=127:n=204:p=128:q=256:r=205
290 printtab(7)"{down}{down}{down}diskette einlegen ! (ctrl){down}":poke649,.:wait653,4:poke649,10
300 open1,8,15,"i0":printtab(4)
310 input"programmname ";na$
320 open2,8,0,"0:"+na$
330 input#1,en,en$
340 ifenthenprinttab(17)"{down}{down}"en:printtab(20-int(len(en$)/2))en$:end
350 dima$(75):forz=.to75:reada$(z):nextz:printchr$(147):open4,4
360 forz=.to1:get#2,a$:nextz:goto160
370 dataend,for,next,data,"input#"
380 datainput,dim,read,let,goto,run
390 dataif,restore,gosub,return
400 datarem,stop,on,wait,load,save
410 dataverify,def,poke,"print#",print
420 datacont,list,clr,cmd,sys,open
430 dataclose,get,new,"tab(",to,fn
440 data"spc(",then,not,step,+
450 data-,*,/,^,and,or,">"
460 data=,"<",sgn,int,abs,usr,fre
470 datapos,sqr,rnd,log,exp,cos,sin
480 datatan,atn,peek,len,"str$",val
490 dataasc,"chr$","left$","right$"
500 data"mid$",go
Listing 2. »LISTKNACKER« für den Drucker
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →