C 64
Tips und Tricks

Ordnung ist das halbe Leben

Mit diesem Programm bringen Sie auf bequeme Weise Ordnung in die Directories Ihrer Disketten.

Ist Ihnen das auch schon mehrmals passiert: Sie hatten auf einer Diskette ein schön geordnetes Directory und beim Abspeichern eines weiteren Files stand dieses nicht sauber am Schluß des Directory, sondern mitten zwischen den anderen Programmen. Mit dem hier vorgestellten Directory-Sortierprogramm ist es nun möglich, diese »falsch hineingeratenen« Files herauszunehmen und an geeigneter Stelle wieder einzusetzen. Auch das Einfügen von Trennstrichen ist möglich. Bild 1 und Bild 2 zeigt Ihnen den Unterschied eines unsortierten zu einem sortierten Directory.

Nach dem Starten des Programms legt man die Diskette ein, die sortiert werden soll, und drückt eine Taste. In der linken oberen Ecke wird nun die Sektornummer des Directory-Blocks angezeigt, den der Computer gerade einliest, rechts daneben die Anzahl der in den Speicher eingelesenen Files. Nach beendetem Einlesen erscheint links vom obersten File ein schwarzer Pfeil, der sich mit den Funktionstasten F3 nach oben und F5 nach unten bewegen läßt. Mittels F1 kann nun ein mit diesem Pfeil gekennzeichnetes File nach rechts herausgeschoben und mit F3 und F5 verschoben werden. An gewünschter Stelle wird es mit F1 wieder eingefügt. Somit ist ein beliebiges Vertauschen aller Files im Directory möglich.

F8 schreibt das sortierte Directory wieder auf die Diskette zurück. Will man das gänderte Directory nicht abgespeichert haben, so kann statt dessen mit F6 noch einmal das alte oder ein anderes eingelesen werden.

Zur optischen Abgrenzung mehrerer Files dient der Trennstrich, den man mit F2 erzeugen, mit F3 und F5 verschieben und schließlich wieder mit F1 einfügen kann. Wem übrigens ein anderer Trennstrich besser gefällt, der kann in Zeile 500 für die Minuszeichen andere einsetzen, zum Beispiel SHIFT+*. SHIFT + C ist nicht zu empfehlen, da dieser Strich bei Groß-Kleinschrift-Umschaltung ein großes »C« ergibt. Der Trennstrich belegt keinen Block auf der Diskette und ist zur besseren Unterscheidung mit DEL im Directory gekennzeichnet. Ein versehentlich mit »F2« erzeugter Trennstrich kann, wenn er nach rechts gebracht wird, mit F4 wieder gelöscht werden. In gleicher Weise können auch Files aus dem Directory gelöscht werden. Dabei werden aber die von dem File belegten Blöcke nicht wieder freigegeben, so daß ein abschließendes »VALIDATE« der Diskette erforderlich ist, wenn man ein File gelöscht hat.

Nun zum Aufbau des Programms. Es ist vorwiegend in Basic geschrieben und enthält zwei kurze Maschinensprache-Routinen. Die erste dient zum Einlesen der Filenamen und Fileparameter und wird mit SYS52992, log. Filenummer, Länge, String aufgerufen. Das Lesen mit GET# in Basic wäre dafür viel zu langsam. Mit dem zweiten Maschinenprogramm werden die am Bildschirm angezeigten Files nach oben oder unten gescrollt. Aufgerufen wird es mit 8YS 53056,r,oz,ls,uz,rs.

Dabei haben die Parameter folgende Bedeutung:

r= Scrollrichtungen: 0 für nach oben und 1 für nach unten
oz= oberste Zeile,
ls= linke Spalte,
uz= unterste Zeile,
rs= rechte Spalte.

Durch Abspeichern des Speicherbereichs von $CF00 bis $CFFF kann diese Routine auch in andere Basic- oder Maschinenprogramme eingebunden werden.

(Edwin Göbel/hm)
|
100 rem ************************
110 rem *                      *
120 rem * directory-sort v1.0  *
130 rem * -------------------  *
140 rem * autor:               *
150 rem * edwin goebel         *
160 rem * schuetzstr. 1        *
170 rem * 8522 herzogenaurach  *
180 rem *                      *
190 rem ************************
200 goto430
210 rem *******************************
220 rem  unterroutinen
230 rem *******************************
240 input#1,f1,f$,f2,f3:iff1=0thenreturn
250 print"{cyn}{down}"f1;f$,f2;f3"{blk}":end:rem "{cyn}"=cyan; "{blk}"=schwarz
260 rem -------------------------------
270 ifno+en>=cthenreturn
280 sys53056,0,2,2,23,18:no=no+1
290 poke214,23:poke211,2:sys58732:printna$(zu(no+en-1));:return
300 rem -------------------------------
310 ifno=0thenreturn
320 sys53056,1,2,2,23,18:no=no-1
330 poke214,2:poke211,2:sys58732:printna$(zu(no+1)):return
340 rem -------------------------------
350 print"{clr}{blk}{rvon}"tab(13)"directory-sort"
360 printtab(12)"----------------"
370 print"{cyn}{down} diskette einlegen und taste druecken"
380 gett$:ift$=""then380
390 print"{home}{down}{down}{down}                                     ":return
400 rem *******************************
410 rem  beginn des hauptprogrammes
420 rem *******************************
430 poke53280,0:poke53281,11:gosub350
440 open1,8,15,"i":diman$(145),na$(145),re$(145),zu(146),sn(19)
450 fori=1to18:readsn(i):next
460 fori=52992to53242:reads:pokei,s:next
470 gosub240:open2,8,2,"#":gosub240
480 s=1:c=1:n$=chr$(0):nn$=n$+n$+n$+n$+n$+n$+n$+n$+n$+n$
490 nu$=nn$+nn$+nn$:re$(0)=nn$+n$
500 an$(0)=chr$(128)+chr$(18)+chr$(1):na$(0)="----------------":rem trennstrich
510 rem *******************************
520 rem  einlesen des directorys
530 rem *******************************
540 print#1,"u1 2 0 18"s:print"{home}{lred}"s"{left} ":rem "{lred}"=hellrot
550 get#2,t$:get#2,s$:s=asc(s$+n$)
560 forbp=0to7:print#1,"b-p 2";bp*32+2
570 sys52992,2,3,x$:an$(c)=x$:ifleft$(x$,1)=n$thennext:goto600
580 sys52992,2,16,x$:na$(c)=x$:sys52992,2,11,x$:re$(c)=x$
590 zu(c)=c:print"{home}{rght}{rght}{rght}{rght}"c"{left} ":c=c+1:next
600 ift$<>""then540
610 close2:poke650,128:print"{home}{down}{down}{blk}>{cyn}{up}";:cp=2:no=0:nu=0:en=c:ifen>23thenen=23
620 printchr$(13)tab(2)na$(nu+1);:nu=nu+1:ifnu<en-1then620
630 rem *******************************
640 rem  tastaturabfrage
690 rem *******************************
700 getta$:ifta$=""then700
710 ifta$="{f3}"thenifcp>2thencp=cp-1:sys53056,0,2,0,23,0
720 ifta$="{f3}"thenifcp=2thengosub310
730 ifta$="{f5}"thenifcp<enthenifno+cp<cthencp=cp+1:sys53056,1,2,0,23,0
740 ifta$="{f5}"thenifcp>=23thengosub270
750 ifta$="{f1}"then810
760 ifta$="{f2}"thenifc<145thenf=1:c=c+1:print"{lred}{home}{rght}{rght}{rght}{rght}"c-1"{left} {cyn}":en=en+1:ifen>23thenen=23
770 ifta$="{f2}"theniff=1thenf=0:te=0:te$=na$(0):goto840
780 ifta$="{f8}"then1000
790 ifta$="{f6}"then1090
800 goto700
810 te=zu(no+cp-1):te$=na$(te)
820 sys53056,0,cp,2,23,18:ifc>23thenen=en+1:gosub290:en=en-1
830 fori=no+cp-2toc-1:zu(i+1)=zu(i+2):next
840 poke214,cp:poke211,19:sys58732
850 print"{CBM-T}{CBM-T}"te$:rem "{CBM-T}"=commodore+"t"
860 getta$:ifta$=""then860
870 ifta$="{f3}"thenifcp>2thencp=cp-1:sys53056,0,2,19,24,37:sys53056,0,2,0,23,0
880 ifta$="{f3}"thenifcp=2thengosub310
890 ifta$="{f5}"thenifcp<enthencp=cp+1:sys53056,1,2,19,24,37:sys53056,1,2,0,23,0
900 ifta$="{f5}"thenifcp=23thengosub270
910 ifta$="{f1}"then950
920 ifta$="{f4}"thente$="{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}":c=c-1:en=c:ifen>23thenen=23
930 ifta$="{f4}"thenprint"{home}{lred}{rght}{rght}{rght}{rght}"c-1"{left} {cyn}":goto970
940 goto860
950 sys53056,1,cp,2,23,18
960 fori=c-1tono+cp-1step-1:zu(i+1)=zu(i):next:zu(no+cp-1)=te
970 poke214,cp:poke211,2:sys58732
980 printte$"                   "
990 goto700
1000 rem ******************************
1010 rem  schreiben des sortierten dir.
1020 rem ******************************
1030 open2,8,2,"#":t=18:fori=0toint((c-2)/8):if8*i+8>=c-1thent=0
1040 print#1,"b-p 2 0":print#2,chr$(t)chr$(sn(i+2))
1050 forbp=0to7:print#1,"b-p 2";bp*32+2
1060 ifbp+8*i+1>=cthenprint#2,nu$;:next:goto1080
1070 print#2,an$(zu(bp+8*i+1))na$(zu(bp+8*i+1))re$(zu(bp+8*i+1));:next
1080 print#1,"u2 2 0 18"sn(i+1):print"{lred}{home}"tab(36)sn(i+1)"{left} {cyn}":gosub240:next
1090 close2:gosub350:goto470
1100 rem ******************************
1110 rem  sektoren des directory tracks
1120 rem ******************************
1130 data1,4,7,10,13,16,2,5,8,11,14,17,3,6,9,12,15,18
1140 rem ******************************
1150 rem  input maschinen-routine
1160 rem ******************************
1170 data32,253,174,32,158,183,32,30,225,32,253,174,32,158,183,138,72,32,253
1180 data174,32,139,176,133,73,132,74,32,163,182,104,32,117,180,160,2,185
1190 data97,0,145,73,136,16,248,200,32,18,225,145,98,200,196,97,208,246,32
1200 data204,255,96,0,0,0,0,0
1210 rem ******************************
1220 rem  scroll maschinen-routine
1230 rem ******************************
1240 data32,245,207,138,72,32,245,207,224,0,176,3,76
1250 data72,178,224,24,176,249,134,251,32,245,207,224,0,144,240,224,39,176
1260 data236,134,253,32,245,207,224,25,176,227,134,252,232,138,56,229,251
1270 data144,218,240,216,133,250,32,245,207,224,40,176,207,228,253,144,203
1280 data134,254,104,170,165,172,72,165,173,72,165,174,72,165,175,72,224,0
1290 data208,22,166,251,198,250,240,44,32,240,233,232,189,240,236,133,172
1300 data181,217,32,219,207,48,236,202,240,3,76,72,178,166,252,198,250,240
1310 data16,32,240,233,202,189,240,236,133,172,181,217,32,219,207,48,236,164
1320 data254,32,240,233,32,36,234,169,32,145,209,136,196,253,16,249,76,88
1330 data233,41,3,13,136,2,133,173,32,224,233,164,254,177,172,145,209,177
1340 data174,145,243,136,196,253,16,243,96,32,253,174,76,158,183
 100 REM ************************ 
 110 REM *                      * 
 120 REM * DIRECTORY-SORT V1.0  * 
 130 REM * -------------------  * 
 140 REM * AUTOR:               * 
 150 REM * EDWIN GOEBEL         * 
 160 REM * SCHUETZSTR. 1        * 
 170 REM * 8522 HERZOGENAURACH  * 
 180 REM *                      * 
 190 REM ************************ 
 200 GOTO 430 
 210 REM ******************************* 
 220 REM  UNTERROUTINEN 
 230 REM ******************************* 
 240 INPUT#1,F1,F$,F2,F3:IF F1=0 THENRETURN 
 250 PRINT"{CYAN,DOWN}"F1;F$,F2;F3"{BLACK}":END :REM "{CYAN}"=CYAN; "{BLACK}"=SCHWARZ 
 260 REM ------------------------------- 
 270 IF NO+EN>=C THENRETURN 
 280 SYS 53056,0,2,2,23,18:NO=NO+1 
 290 POKE 214,23:POKE 211,2:SYS 58732:PRINTNA$(ZU(NO+EN-1));:RETURN 
 300 REM ------------------------------- 
 310 IF NO=0 THENRETURN 
 320 SYS 53056,1,2,2,23,18:NO=NO-1 
 330 POKE 214,2:POKE 211,2:SYS 58732:PRINTNA$(ZU(NO+1)):RETURN 
 340 REM ------------------------------- 
 350 PRINT"{CLR,BLACK,RVSON}"TAB( 13)"DIRECTORY-SORT" 
 360 PRINTTAB( 12)"----------------" 
 370 PRINT"{CYAN,DOWN,SPACE}DISKETTE EINLEGEN UND TASTE DRUECKEN" 
 380 GET T$:IF T$="" THEN380 
 390 PRINT"{HOME,3DOWN,37SPACE}":RETURN 
 400 REM ******************************* 
 410 REM  BEGINN DES HAUPTPROGRAMMES 
 420 REM ******************************* 
 430 POKE 53280,0:POKE 53281,11:GOSUB 350 
 440 OPEN 1,8,15,"I":DIM AN$(145),NA$(145),RE$(145),ZU(146),SN(19) 
 450 FOR I=1 TO18:READ SN(I):NEXT 
 460 FOR I=52992 TO53242:READ S:POKE I,S:NEXT 
 470 GOSUB 240:OPEN 2,8,2,"#":GOSUB 240 
 480 S=1:C=1:N$=CHR$ (0):NN$=N$+N$+N$+N$+N$+N$+N$+N$+N$+N$ 
 490 NU$=NN$+NN$+NN$:RE$(0)=NN$+N$ 
 500 AN$(0)=CHR$ (128)+CHR$ (18)+CHR$ (1):NA$(0)="----------------":REM TRENNSTRICH 
 510 REM ******************************* 
 520 REM  EINLESEN DES DIRECTORYS 
 530 REM ******************************* 
 540 PRINT#1,"U1 2 0 18"S:PRINT"{HOME,LIG.RED}"S"{LEFT,SPACE}":REM "{LIG.RED}"=HELLROT 
 550 GET #2,T$:GET #2,S$:S=ASC (S$+N$) 
 560 FOR BP=0 TO7:PRINT#1,"B-P 2";BP*32+2 
 570 SYS 52992,2,3,X$:AN$(C)=X$:IF LEFT$ (X$,1)=N$ THENNEXT :GOTO 600 
 580 SYS 52992,2,16,X$:NA$(C)=X$:SYS 52992,2,11,X$:RE$(C)=X$ 
 590 ZU(C)=C:PRINT"{HOME,4RIGHT}"C"{LEFT,SPACE}":C=C+1:NEXT 
 600 IF T$<>"" THEN540 
 610 CLOSE 2:POKE 650,128:PRINT"{HOME,2DOWN,BLACK}>{CYAN,UP}";:CP=2:NO=0:NU=0:EN=C:IF EN>23 THENEN=23 
 620 PRINTCHR$ (13)TAB( 2)NA$(NU+1);:NU=NU+1:IF NU<EN-1 THEN620 
 630 REM ******************************* 
 640 REM  TASTATURABFRAGE 
 690 REM ******************************* 
 700 GET TA$:IF TA$="" THEN700 
 710 IF TA$="{F3}" THENIF CP>2 THENCP=CP-1:SYS 53056,0,2,0,23,0 
 720 IF TA$="{F3}" THENIF CP=2 THENGOSUB 310 
 730 IF TA$="{F5}" THENIF CP<EN THENIF NO+CP<C THENCP=CP+1:SYS 53056,1,2,0,23,0 
 740 IF TA$="{F5}" THENIF CP>=23 THENGOSUB 270 
 750 IF TA$="{F1}" THEN810 
 760 IF TA$="{F2}" THENIF C<145 THENF=1:C=C+1:PRINT"{LIG.RED,HOME,4RIGHT}"C-1"{LEFT,SPACE,CYAN}":EN=EN+1:IF EN>23 THENEN=23 
 770 IF TA$="{F2}" THENIF F=1 THENF=0:TE=0:TE$=NA$(0):GOTO 840 
 780 IF TA$="{F8}" THEN1000 
 790 IF TA$="{F6}" THEN1090 
 800 GOTO 700 
 810 TE=ZU(NO+CP-1):TE$=NA$(TE) 
 820 SYS 53056,0,CP,2,23,18:IF C>23 THENEN=EN+1:GOSUB 290:EN=EN-1 
 830 FOR I=NO+CP-2 TOC-1:ZU(I+1)=ZU(I+2):NEXT 
 840 POKE 214,CP:POKE 211,19:SYS 58732 
 850 PRINT"TT"TE$:REM "T"=COMMODORE+"T" 
 860 GET TA$:IF TA$="" THEN860 
 870 IF TA$="{F3}" THENIF CP>2 THENCP=CP-1:SYS 53056,0,2,19,24,37:SYS 53056,0,2,0,23,0 
 880 IF TA$="{F3}" THENIF CP=2 THENGOSUB 310 
 890 IF TA$="{F5}" THENIF CP<EN THENCP=CP+1:SYS 53056,1,2,19,24,37:SYS 53056,1,2,0,23,0 
 900 IF TA$="{F5}" THENIF CP=23 THENGOSUB 270 
 910 IF TA$="{F1}" THEN950 
 920 IF TA$="{F4}" THENTE$="{RIGHT,15RIGHT}":C=C-1:EN=C:IF EN>23 THENEN=23 
 930 IF TA$="{F4}" THENPRINT"{HOME,LIG.RED,4RIGHT}"C-1"{LEFT,SPACE,CYAN}":GOTO 970 
 940 GOTO 860 
 950 SYS 53056,1,CP,2,23,18 
 960 FOR I=C-1 TONO+CP-1STEP -1:ZU(I+1)=ZU(I):NEXT :ZU(NO+CP-1)=TE 
 970 POKE 214,CP:POKE 211,2:SYS 58732 
 980 PRINTTE$"{19SPACE}" 
 990 GOTO 700 
 1000 REM ****************************** 
 1010 REM  SCHREIBEN DES SORTIERTEN DIR. 
 1020 REM ****************************** 
 1030 OPEN 2,8,2,"#":T=18:FOR I=0 TOINT ((C-2)/8):IF 8*I+8>=C-1 THENT=0 
 1040 PRINT#1,"B-P 2 0":PRINT#2,CHR$ (T)CHR$ (SN(I+2)) 
 1050 FOR BP=0 TO7:PRINT#1,"B-P 2";BP*32+2 
 1060 IF BP+8*I+1>=C THENPRINT#2,NU$;:NEXT :GOTO 1080 
 1070 PRINT#2,AN$(ZU(BP+8*I+1))NA$(ZU(BP+8*I+1))RE$(ZU(BP+8*I+1));:NEXT 
 1080 PRINT#1,"U2 2 0 18"SN(I+1):PRINT"{LIG.RED,HOME}"TAB( 36)SN(I+1)"{LEFT,SPACE,CYAN}":GOSUB 240:NEXT 
 1090 CLOSE 2:GOSUB 350:GOTO 470 
 1100 REM ****************************** 
 1110 REM  SEKTOREN DES DIRECTORY TRACKS 
 1120 REM ****************************** 
 1130 DATA 1,4,7,10,13,16,2,5,8,11,14,17,3,6,9,12,15,18 
 1140 REM ****************************** 
 1150 REM  INPUT MASCHINEN-ROUTINE 
 1160 REM ****************************** 
 1170 DATA 32,253,174,32,158,183,32,30,225,32,253,174,32,158,183,138,72,32,253 
 1180 DATA 174,32,139,176,133,73,132,74,32,163,182,104,32,117,180,160,2,185 
 1190 DATA 97,0,145,73,136,16,248,200,32,18,225,145,98,200,196,97,208,246,32 
 1200 DATA 204,255,96,0,0,0,0,0 
 1210 REM ****************************** 
 1220 REM  SCROLL MASCHINEN-ROUTINE 
 1230 REM ****************************** 
 1240 DATA 32,245,207,138,72,32,245,207,224,0,176,3,76 
 1250 DATA 72,178,224,24,176,249,134,251,32,245,207,224,0,144,240,224,39,176 
 1260 DATA 236,134,253,32,245,207,224,25,176,227,134,252,232,138,56,229,251 
 1270 DATA 144,218,240,216,133,250,32,245,207,224,40,176,207,228,253,144,203 
 1280 DATA 134,254,104,170,165,172,72,165,173,72,165,174,72,165,175,72,224,0 
 1290 DATA 208,22,166,251,198,250,240,44,32,240,233,232,189,240,236,133,172 
 1300 DATA 181,217,32,219,207,48,236,202,240,3,76,72,178,166,252,198,250,240 
 1310 DATA 16,32,240,233,202,189,240,236,133,172,181,217,32,219,207,48,236,164 
 1320 DATA 254,32,240,233,32,36,234,169,32,145,209,136,196,253,16,249,76,88 
 1330 DATA 233,41,3,13,136,2,133,173,32,224,233,164,254,177,172,145,209,177 
 1340 DATA 174,145,243,136,196,253,16,243,96,32,253,174,76,158,183 
Listing zum Directory-Sorter. Beachten Sie den Checksummer auf Seite 54.
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →