Wem ist es wohl noch nicht passiert, Dateien auf eine Diskette kopieren zu wollen und dann plötzlich festzustellen, daß der Platz nicht reicht? Bisher gab’s meist nur zwei Möglichkeiten: Neuformatieren mit größerem Format oder eine zweite Diskette zur Hand zu nehmen.
Dabei handelt es sich meist nur um ein paar KiloBytes. Schöner wäre es doch, wenn die eingelegte Diskette plötzlich mehr Platz hätte! Aber, Neuformatieren hat das Löschen der Dateien zur Folge. Nicht so mit dem hier vorgestellten Diskettenformatierer. Das Programm formatiert einfach zwei unbenutzte Tracks (Nummer 80 und 81) und läßt alle anderen in Ruhe. Damit man über den Platz auch verfügen kann, wird der Bootsektor angepaßt. Das bringt pro Diskettenseite immerhin 10 kB ohne größere Umstände! Das Programm wird gestartet und untersucht ohne weitere Nachfrage die Diskette in Laufwerk A. Ist sie normal formatiert (360 oder 720 kB), werden die zusätzlichen Tracks formatiert, sofern kein Fehler auftritt. Sollte das Format nicht stimmen, wird dies mit einer Fehlermeldung zum Ausdruck gebracht. Das Programm stellt selbst fest, welches Diskettenformat vorliegt. Der Benutzer braucht also nur die passende Diskette in Laufwerk A zu legen und dann das Formatierprogramm zu starten.
In der Kürze liegt die Würze. Das war's schon mit all den Erklärungen! Zum Programm selbst steht noch etwas im (Pascal Plus-)Listing! Ich wünsche Ihnen viel Freude und immer ausreichend Platz auf allen Disketten!
(* Programm FORMAT PLUS *)
program formatplus;
(* Entwickelt mit ST Pascal Plus 2.0. *)
(* 16. Dezember 1987 / Dietmar Rabich *)
(* Literatur; Atari ST Profibuch (Sybex 1987) *)
type buffer_klein = packed array [0..511] of byte; (* 0.5 KByte *)
var bootsekt,filler_k1 : buffer_klein:
seiten : short_integer;
(* Liest Sektor *)
procedure floprd(var buf,filler : buffer_klein;
devno,sectno,trackno,sideno,count : short_integer);
XBI0S(8);
(* Schreibt Sektor *)
procedure flopwr(var buf,filler : buffer_klein;
devno,sectno,trackno,sideno,count : short_integer);
XBIOS(9):
(* Formatiert Track 80 und 81 *)
function format (side : short_integer) : boolean;
type buffer_gross = packed array 10..8191] of byte;
(* 8 KByte *)
var i,error_f : short_integer;
buf,filler : buffer_gross;
(* Formatiert einen Track *)
function flopfmt(var buf,filler : buffer_gross;
devno,spt,trackno,sideno,interlv : short_integer;
magic : long_integer:
virgin : short_integer)
:short_integer;
XBIOS(10);
begin
i:=80;
repeat
error_f: =flopfmt (buf, filler, 0,9, i, side, 1 ,$87654321, $0000);
i:= i+1;
until (error_f<>0) or (i>=82);
format:=(error_f<>0);
end;
(* Fehlerausgabe *)
procedure fehler(erg:boolean);
begin
if erg then
begin
writeln('*** Fehler bei Formatiervorgang / falsches Format ***');
repeat
until keypress;
halt
end;
end;
(* Hauptprogramm *)
begin
writeln('*** Format Plus / (c) Dietmar Rabich ***');
writeln(' (Entwickelt mit ST Pascal Plus 2.00.)'); floprd(bootsekt,filler_kl,0,1,0,0,1); (* Bootsektor lesen *)
if (bootsekt[19]=$A0) and (bootsekt[20]=$05) then
(* zweiseitig (720 kB) ? *)
seiten:=2;
if (bootsekt[19]=$D0) and (bootsekt[20]=$02) then
(* einseitig (360 kB) ? *)
seiten:=1;
if seiten in [1,2] then
begin
fehler(format(0)); (* formatiere Seite 1 *)
if seiten=2 then
fehler(format(1)); (* formatiere Seite 2 *)
if seiten=2 then (* neue Bootsektoren *)
begin
bootsekt[19]:=$C4; (* 1476 Sektoren insgesamt *) bootsekt[20]:=$05:
end
else
begin
bootsekt[19]:=$E2; (* 738 Sektoren insgesamt *)
bootsekt[20]:=$02;
end;
flopwr(bootsekt,filler_kl,0,1,0,0,1); (* Bootsektor schreiben *)
end
else
fehler(true);
end.
(* Programmende *)