Ordnung ist das halbe Leben
Mit diesem Programm bringen Sie auf bequeme Weise Ordnung in die Directories Ihrer Disketten. Nicht nur eine verbesserte Optik des Inhaltsverzeichnisses hilft Ihnen bei der Suche nach bestimmten Programmen.
Nachdruck aus 64'er 5/85, S. 77.
Ist Ihnen das auch schon mehrmals passiert: Sie hatten auf einer Diskette ein schön geordnetes Directory und beim Speichern 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 zeigen Ihnen den Unterschied eines unsortierten zu einem sortierten Directory. Mit etwas Geschick kann man seine Disketten auch so umsortieren, daß an erster Stelle immer ein Ladeprogramm für das Hauptprogramm steht. Man kann sich dadurch viel Sucharbeit sparen, denn man lädt einfach das erste Programm.


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.
Direktory mit System
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 geänderte Directory nicht gespeichert 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 260 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 SYS 52992, 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 SYS 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 Speichern des Speicherbereichs von $CF00 bis $CFFF kann diese Routine auch in andere Basic- oder Maschinenprogramme eingebunden werden.
(Edwin Göbel/ah)100 goto200
110 input#1,f1,f$,f2,f3:iff1=0thenreturn
120 printf1;f$,f2;f3:end
130 ifno+en>=cthenreturn
131 sys53056,0,2,2,23,18:no=no+1
135 poke214,23:poke211,2:sys58732:printna$(zu(no+en-1));:return
140 ifno=0thenreturn
141 sys53056,1,2,2,23,18:no=no-1
145 poke214,2:poke211,2:sys58732:printna$(zu(no+1)):return
200 poke53280,6:poke53281,6
201 print"{clr}{yel}{rvon}"tab(9)"eplox's directory-sort"
202 printtab(8)"------------------------":ifdg=1then210
203 print" f1 eintrag markieren/einordnen"
204 print" f2 trennstrich erzeugen"
205 print" f3 auf"
206 print" f4 loeschen"
207 print" f5 ab"
208 print" f8 speichern"
209 print " {down}{down}{down}bitte diskette einlegen":dg=1:poke198,0:wait198,63:goto201
210 open1,8,15,"i":diman$(145),na$(145),re$(145),zu(146),sn(19)
215 fori=1to18:readsn(i):next
218 fori=52992to53242:readx:pokei,x:next
219 gosub110:open2,8,2,"#":gosub110
220 s=1:c=1:n$=chr$(0):nn$=n$+n$+n$
223 fori=1to10:nu$=nu$+nn$:next
225 an$(0)=chr$(128)+chr$(18)+chr$(1):na$(0)="----------------"
226 re$(0)=nn$+nn$+nn$+n$+n$
230 print#1,"u1 2 0 18"s:print"{home}{lred}"s"{left} "
235 get#2,t$:get#2,s$:s=asc(s$+n$)
240 forbp=0to7:print#1,"b-p 2";bp*32+2
270 sys52992,2,3,x$:an$(c)=x$:ifleft$(x$,1)=n$thennext:goto320
290 sys52992,2,16,x$:na$(c)=x$:sys52992,2,11,x$:re$(c)=x$
300 zu(c)=c:print"{home}{rght}{rght}{rght}{rght}"c"{left} ":c=c+1:next
320 ift$<>""then230
400 close2:poke650,128:print"{home}{down}{down}{blk}>{cyn}{up}";:cp=2:no=0:en=c:ifen>23thenen=23
410 printchr$(13)tab(2)na$(nu+1);:nu=nu+1:ifnu<en-1then410
440 getta$:ifta$=""then440
450 ifta$="{f3}"thenifcp>2thencp=cp-1:sys53056,0,2,0,23,0
455 ifta$="{f3}"thenifcp=2thengosub140
460 ifta$="{f5}"thenifcp<enthencp=cp+1:sys53056,1,2,0,23,0
465 ifta$="{f5}"thenifcp>=23thengosub130
470 ifta$="{f1}"then1000
480 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
485 ifta$="{f2}"theniff=1thenf=0:te=0:te$=na$(0):goto1010
490 ifta$="{f8}"then3000
495 ifta$="{home}"then3040
500 goto440
1000 te=zu(no+cp-1):te$=na$(te)
1005 sys53056,0,cp,2,23,18:ifc>23thenen=en+1:gosub135:en=en-1
1007 fori=no+cp-2toc-1:zu(i+1)=zu(i+2):next
1010 poke214,cp:poke211,19:sys58732
1020 print"{CBM-T}{CBM-T}"te$
1040 getta$:ifta$=""then1040
1050 ifta$="{f3}"thenifcp>2thencp=cp-1:sys53056,0,2,19,24,37:sys53056,0,2,0,23,0
1055 ifta$="{f3}"thenifcp=2thengosub140
1060 ifta$="{f5}"thenifcp<enthencp=cp+1:sys53056,1,2,19,24,37:sys53056,1,2,0,23,0
1065 ifta$="{f5}"thenifcp=23thengosub130
1070 ifta$="{f1}"then2000
1075 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
1076 ifta$="{f4}"thenprint"{home}{lred}{rght}{rght}{rght}{rght}"c-1"{left} {cyn}":goto2050
1080 goto1040
2000 sys53056,1,cp,2,23,18
2040 fori=c-1tono+cp-1step-1:zu(i+1)=zu(i):next:zu(no+cp-1)=te
2050 poke214,cp:poke211,2:sys58732
2060 printte$" "
2199 goto440
3000 open2,8,2,"#":t=18:fori=0toint((c-2)/8):if8*i+8>=c-1thent=0
3010 print#1,"b-p 2 0":print#2,chr$(t)chr$(sn(i+2))
3020 forbp=0to7:print#1,"b-p 2";bp*32+2
3023 ifbp+8*i+1>=cthenprint#2,nu$;:next:goto3030
3025 print#2,an$(zu(bp+8*i+1))na$(zu(bp+8*i+1))re$(zu(bp+8*i+1));:next
3030 print#1,"u2 2 0 18"sn(i+1):print"{lred}{home}"tab(36)sn(i+1)"{left} {cyn}":gosub110:next
3040 close1:close2:run
10000 data1,4,7,10,13,16,2,5,8,11,14,17,3,6,9,12,15,18
10001 data32,253,174,32,158,183,32,30,225,32,253,174,32,158,183,138,72,32,253
10002 data174,32,139,176,133,73,132,74,32,163,182,104,32,117,180,160,2,185
10003 data97,0,145,73,136,16,248,200,32,18,225,145,98,200,196,97,208,246,32
10004 data204,255,96,0,0,0,0,0,32,245,207,138,72,32,245,207,224,0,176,3,76
10005 data72,178,224,24,176,249,134,251,32,245,207,224,0,144,240,224,39,176
10006 data236,134,253,32,245,207,224,25,176,227,134,252,232,138,56,229,251
10007 data144,218,240,216,133,250,32,245,207,224,40,176,207,228,253,144,203
10008 data134,254,104,170,165,172,72,165,173,72,165,174,72,165,175,72,224,0
10009 data208,22,166,251,198,250,240,44,32,240,233,232,189,240,236,133,172
10010 data181,217,32,219,207,48,236,202,240,3,76,72,178,166,252,198,250,240
10011 data16,32,240,233,202,189,240,236,133,172,181,217,32,219,207,48,236,164
10012 data254,32,240,233,32,36,234,169,32,145,209,136,196,253,16,249,76,88
10013 data233,41,3,13,136,2,133,173,32,224,233,164,254,177,172,145,209,177
10014 data174,145,243,136,196,253,16,243,96,32,253,174,76,158,183