Das größere Diskettenformat

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 *)


Dietmar Rabich


Links

Copyright-Bestimmungen: siehe Über diese Seite
Classic Computer Magazines
[ Join Now | Ring Hub | Random | << Prev | Next >> ]