Floppy

Disk-Füller

Ab und zu passiert es, daß auf einer Diskette nur ein paar Blöcke fehlen. Mit dem Disk-Füller können in Notfällen bis zu 17 zusätzliche Blöcke auf der Diskette genutzt werden.

Das Problem ist wohl jedem bekannt, der eine gut sortierte Programmsammlung hat: alle thematisch gleichen Programme bis auf eines passen auf eine Diskettenseite. Und gerade dieses letzte Programm benötigt nur einige wenige Blöcke. Aber hier kann in Notfällen Abhilfe geschaffen werden. Auf der Spur 18, auf der sich unter anderem das Directory befindet, sind meist noch ein paar Blöcke frei, die das DOS der 1541 aber nicht zur Verfügung stellt. Mit dem Programm Disk-Füller können diese freien Blöcke ausgenutzt werden. Zu diesem Zweck werden Blöcke von schon auf der Diskette befindlichen Programmen auf die freien Blöcke der Spur 18 umkopiert und die Blockzeiger angepaßt. Die ursprünglichen Programmblöcke stehen dann zur freien Verfügung.

Das Programm ist weitgehend selbsterklärend, hier aber einige wichtige Hinweise: Nach dem Laden darf das Programm erst mit »RUN« gestartet werden, wenn die zu behandelnde Diskette im Laufwerk liegt. Außerdem dürfen nur Disketten behandelt werden, deren BAM einwandfrei in Ordnung ist. Im Zweifelsfalle sollte vorher ein Validate mit »OPEN 15,8,15,”V”« durchgeführt werden.

Hier ist die genaue Funktionsweise des Programms beschrieben:

Nach einer kurzen Erläuterung für den Benutzer werden in den Zeilen 1050 und 1060 (Listing) zwei Kanäle zum Laufwerk geöffnet. Gleichzeitig wird die eingelegte Diskette initialisiert. In Zeile 2000 werden drei Variablenfelder dimensioniert. Sie dienen zum Ablegen der Zeiger auf den jeweils nächsten Directoryblock sowie der Anzahl der Einträge in diesem Block. Mit Zeile 2010 beginnt dann eine Schleife, die alle Directory-Blöcke verfolgt, ihre Lage auf der Diskette in den dimensionierten Feldern speichert und ihre Anzahl in der Variablen B festhält. Ab Zeile 2500 wird die Anzahl der freien Einträge im letzten Directory-Block bestimmt. Dazu wird jeweils das Filetyp-Byte abgefragt. Hat es den Wert Null, ist dieser Eintrag noch frei. Sollte der Benutzer die Frage, ob der angezeigte Platz genügt, negativ beantworten, wird ein Block für weitere acht Einträge freigehalten.

Als nächstes wird überprüft, welche Blöcke der Spur 18 noch frei sind. Dazu werden die entsprechenden Bytes der BAM in den Computerspeicher geholt und analysiert (Zeile 3120 bis 3230).

In Zeile 4000 beginnt das Verschieben schon belegter Blöcke in die Spur 18. Dazu werden in einer großen Schleife (bis Zeile 4680) alle Directory-Einträge abgearbeitet. Dies geschieht folgendermaßen: Der Zeiger auf den ersten Block des ersten Eintrags wird in den Variablen AS und AT zwischengespeichert, der zugehörige Block eingelesen und der Zeiger auf den Fortsetzungsblock ebenfalls gespeichert. Dann wird ein freier Block der Spur 18 gesucht und der alte Zeiger auf diesen umgelenkt. Der Computer gibt nun eine Protokollzeile aus. Dieser Block wird nun als belegt und der alte als frei gekennzeichnet. Als letztes wird endlich der Inhalt des zu verschiebenden Blocks auf den Block der Spur 18 geschrieben. Sollte nach dem ersten Eintrag immer noch Platz auf der Spur 18 sein, fährt das Programm mit dem zweiten Eintrag fort, bis die Spur 18 komplett belegt ist.

(U. Gerlach/bs)
100 rem   **************************
110 rem   *                        *
120 rem   *                        *
130 rem   *     disk   fueller     *
140 rem   *                        *
150 rem   *                        *
160 rem   *                        *
170 rem   *    von  uwe  gerlach   *
180 rem   *                        *
190 rem   *      bruehlstr. 23     *
200 rem   *                        *
210 rem   *                        *
220 rem   *      6440  bebra 1     *
230 rem   *                        *
240 rem   *                        *
250 rem   *                        *
260 rem   *                        *
270 rem   *      im april 1985     *
280 rem   *                        *
290 rem   *                        *
300 rem   **************************
400 :
500 :
1000 poke53280,0: poke53281,0: rem farbe
1010 print chr$(14);"{clr}{gry2}  VC 1541    D i s k   F u e l l e r":print:print:print
1015 print"Dieses Programm wurde geschrieben von:":print:print
1020 print,"{lblu}  Uwe Gerlach": print,"  Bruehlstr. 23": print: print,"  6440 Bebra 1{gry2}"
1025 print:print:print"Es schafft auf vollen Disketten noch"
1030 print"etwas Platz, indem es die eigentlich"
1035 print"fuer das Directory vorgesehene Spur 18"
1040 print"belegt.":print:print
1045 :
1050 open 1,8,15,"i": rem  fuer befehle
1060 open 2,8,2,"#" : rem  pufferkanal
1090 :
1100 rem  *****************************
1110 rem    directorylaenge ermitteln
1120 rem  *****************************
1130 :
2000 dim t(25): dim s(25): dim e(25)
2010 print# 1, "u1:"2;0;18;0: rem  bam
2020 get# 2,t$,s$: rem  zeiger auf dir.
2030 t(0)=asc(t$+chr$(0)): rem  track
2040 s(0)=asc(s$+chr$(0)): rem  sector
2050 t=t(0): rem  track  dir. anfang
2060 s=s(0): rem  sector dir. anfang
2070 b=1: rem  blockzaehler
2100 print# 1, "u1:"2;0;t;s
2110 get# 2,t$,s$: rem  zeiger
2120 t=asc(t$+chr$(0))
2130 s=asc(s$+chr$(0))
2140 if t=0 or t>35 or s>20 or b=25 then 2400:  rem  letzter directory-block
2150 t(b)=t: s(b)=s: rem  zeiger merken
2155 e(b-1)=8: rem  eintraege im block
2160 b=b+1: rem  zaehler erhoehen
2190 goto 2100 : rem  naechster block
2400 m=b: rem  dir. blockzahl
2500 f=0: rem  zaehler freie eintraege
2510 for i=2 to 226 step 32
2520 : print# 1, "b-p:"2,i: rem zeiger
2530 : get# 2,w$: rem  filetyp
2540 : if w$="" then f=f+1: rem  frei
2590 next i: rem  alle eintr. im block
2600 e(b-1)=8-f: rem  eintraege/block
2610 if f=8 and m=1 then 7800: rem leer
2700 print "Genuegen";f;"freie Directory-Plaetze ? ";
2750 get a$: if a$="" then 2750
2760 if a$<>"n" then a$="j"
2770 print a$: print: print: print
2790 :
3000 rem  *****************************
3010 rem    leere dir. bloecke festst.
3020 rem  *****************************
3030 :
3050 print# 1, "u1:"2;0;18;0: rem  bam
3060 print# 1, "b-p:"2,73: rem  spur 18
3100 b=0 : rem  blockzaehler
3110 l=19: rem  zahl leere dir-bloecke
3120 dim z(25): rem  zustand der blocks
3130 for i=1 to 3: rem  bytes spur 18
3140 : get# 2, w$: rem  belegungscode
3150 : w=asc(w$+chr$(0))
3160 : for j=1 to 8: rem  dualstellen
3170 :  w=w/2
3180 :  if w=int(w) then z(b)=1
3190 :  if z(b)=0 and a$="n" then a$="": z(b)=1: rem  einen block freihalten
3195 :  if z(b)=1 and b<19 then l=l-1
3200 :  b=b+1
3085 :  w=int(w)
3220 : next j
3230 next i
3310 if l<1 then 8000
3390 print: print: print "Es werden nun";l;" Bloecke freigestellt !": print
3990 :
4000 rem  *****************************
4010 rem    fuellen der dir.- bloecke
4020 rem  *****************************
4021 :
4025 b=0: rem  blockzaehler, siehe oben
4027 for e=0 to e(b)-1: rem eintr/block
4030 at=t(b): rem  alter dir-track
4035 as=s(b): ns=as: rem  alter sector
4040 if at=0 and as=0 then 7050
4050 i=0
4060 z=e*32+3: rem  stelle des zeigers
4100 r=0: rem  marke dir.-block aendern
4150 print# 1, "u1:"2;0;at;as: rem  alt
4160 print# 1, "b-p:"2,z: rem  zeiger
4170 get# 2, t$,s$: rem  zeiger forts.
4180 t=asc(t$+chr$(0))
4190 s=asc(s$+chr$(0))
4191 if t=18 then 4670: rem  bearbeitet
4192 if t=0 or t>35 or s>20 then z=1: goto 4520: rem  fileende
4200 for i=0 to 18 step 10: rem  suche nach freiem sector im sectorabstand
4210 : if z(i)=0 then 4500: rem  leer
4212 : if i=9 then goto 4230
4215 : if i>8 then i=i-9: goto 4210
4220 next i
4230 z=-1: rem  marke: spur 18 voll
4300 goto 4520: rem  rueck ohne aender.
4500 print# 1, "b-p:"2,z: rem  zeiger
4510 print# 2, chr$(18);chr$(i);: rem   zeiger verbiegen
4515 if at=18 and as=ns then r=1: rem   in den block, aus dem gelesen wurde
4520 print "      Block";right$("  "+str$(at),3);","right$("  "+str$(as),3);
4525 if r=1 then print"  Zeiger";e+1;"geaendert": goto 4570
4530 print "  -->  18,";right$("  "+str$(ns),3)
4550 print# 1, "b-a:"0,18,ns:rem in bam
4560 print# 1, "b-f:"0,at,as: rem  alten block freigeben
4570 z(i)=1: rem block in liste belegen
4580 print# 1, "u2:"2;0;18;ns:rem ruec{rvon}
4650 at=t: as=s: ns=i: rem  norm. block
4655 if z=-1 then goto 9000: rem  ok
4660 if z<>1 then z=0: goto 4100
4670 next e: rem  neuer dir.-eintrag
4680 b=b+1: goto 4027: rem  weiter mit naechstem directoryblock
6990 :
7000 rem  *****************************
7010 rem         fehlermeldungen
7020 rem  *****************************
7030 :
7050 print: print "Es waren nicht genug belegte Blocks da."
7060 print " Spur 18 ist immernoch teilweise frei!"
7090 goto 9000
7800 print:print:print"Die Diskette ist leer!"
7810 goto 9000
8000 print "Tut mir leid, da ist nichts zu machen."
8010 print "Die gesamte Spur 18 ist voll belegt !"
9000 print
9010 close 1: close 2: end
Listing »Disk Füller«. Bitte beachten Sie die Eingabehinweise auf Seite 6.
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →