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