program XFormat;    { 1987 by M. Anton }

{ 'DISCKIT3' fuer JOYCE, DATA ONLY und
  SYSTEM-Format; auch bis Track 42/43.
  Fuer COM-File Compilerendadresse auf
  $DF00 oder kleiner setzen!!!         }


type Track_Id = array[0..35] of byte;

var  Track    : byte absolute $DF90;
     Table    : Track_Id absolute $DFA0;
     Von, Bis : integer;
     Taste    : char;


const             { Tracktabellen }

Data:Track_Id   = ($00,$00,$C1,$02,
                   $00,$00,$C6,$02,
                   $00,$00,$C2,$02,
                   $00,$00,$C7,$02,
                   $00,$00,$C3,$02,
                   $00,$00,$C8,$02,
                   $00,$00,$C4,$02,
                   $00,$00,$C9,$02,
                   $00,$00,$C5,$02);

System:Track_Id = ($00,$00,$41,$02,
                   $00,$00,$46,$02,
                   $00,$00,$42,$02,
                   $00,$00,$47,$02,
                   $00,$00,$43,$02,
                   $00,$00,$48,$02,
                   $00,$00,$44,$02,
                   $00,$00,$49,$02,
                   $00,$00,$45,$02);

 Joyce:Track_Id = ($28,$00,$01,$02,
                   $28,$00,$06,$02,
                   $28,$00,$02,$02,
                   $28,$00,$07,$02,
                   $28,$00,$03,$02,
                   $28,$00,$08,$02,
                   $28,$00,$04,$02,
                   $28,$00,$09,$02,
                   $28,$00,$05,$02);



procedure Message;
begin
  writeln; writeln;
  writeln ('- Disk einlegen und Taste dr}cken -');
  while not keypressed do;
end;


procedure Scan_Key;
begin
  repeat until keypressed;
  read(kbd,Taste);
end;


procedure Menu;
begin
  clrscr;
  writeln ('************************************');
  writeln ('* XFormat v 1.0    1986 by M.Anton *');
  writeln ('************************************');
  writeln; writeln;
  writeln ('1 = DATA ONLY (178 KB) Track  0-39');
  writeln ('2 = DATA ONLY (178 KB) Track  0-42');
  writeln ('3 = DATA ONLY (178 KB) Track 40-42');
  writeln;
  writeln ('4 = SYSTEM    (169 KB) Track  0-39');
  writeln ('5 = SYSTEM    (169 KB) Track  0-42');
  writeln ('6 = SYSTEM    (169 KB) Track 40-42');
  writeln;
  writeln ('7 = JOYCE     (173 KB) Track 40-42');
  writeln ('0 = Verlassen - keine Aktion      '); writeln;
  write   ('           Wahl: ');
  repeat
    Scan_Key;
  until Taste in ['0'..'7'];
  writeln (Taste);
end;


procedure Select_A;
{ A: als Bezugslaufwerk (BDOS#14) }
begin
  inline($1E/$00/$0E/$0E/$CD/$05/$00)
end;


{ XDPBs bei $F000 initialisieren (XBIOS#7): }

procedure Make_Data_XDPB;
begin
  inline($3E/$02/$DD/$21/$00/$F0/$CD/$5A/$FC/$95/$00)
end;

procedure Make_System_XDPB;
begin
  inline($3E/$01/$DD/$21/$00/$F0/$CD/$5A/$FC/$95/$00)
end;

procedure Make_Joyce_XDPB;
begin
  inline($3E/$00/$DD/$21/$00/$F0/$CD/$5A/$FC/$95/$00)
end;


procedure Increment_Tracks;
{ erhoeht Tracknummern in Tracktabelle ab $DFA0 }
begin
  inline($21/$A0/$DF/$11/$04/$00/$06/$09/$34/$19/$10/$FC)
end;


procedure Format_Track;
{ formatiert Track mit XDPB und Tracktabelle (XBIOS#5) }
begin
  inline($06/$01/$0E/$00/$3A/$90/$DF/$57/$1E/$E5/$21/
         $A0/$DF/$DD/$21/$00/$F0/$CD/$5A/$FC/$8F/$00)
end;



begin     { Hauptprogramm }
  Menu;
  Select_A;
  case Taste of
   '0' : exit;

   '1' : begin
           Von:=0; Bis:=39;
           Make_Data_XDPB;
           Table:=Data;
         end;
   '2' : begin
           Von:=0; Bis:=42;
           Make_Data_XDPB;
           Table:=Data;
         end;
   '3' : begin
           Von:=40; Bis:=42;
           Make_Data_XDPB;
           Table:=Data;
           for Track:=0 to 40 do Increment_Tracks;
         end;
   '4' : begin
           Von:=0; Bis:=39;
           Make_System_XDPB;
           Table:=System;
         end;
   '5' : begin
           Von:=0; Bis:=42;
           Make_System_XDPB;
           Table:=System;
         end;
   '6' : begin
           Von:=40; Bis:=42;
           Make_System_XDPB;
           Table:=System;
           for Track:=0 to 40 do Increment_Tracks;
         end;
   '7' : begin
           Von:=40; Bis:=42;
           Make_Joyce_XDPB;
           Table:=Joyce;
         end;
    end;
  Message;
  for Track:=Von to Bis do
    begin
      Format_Track;
      Increment_Tracks;
      gotoxy(0,22);
      write ('Formatiere Track Nr.: ',Track);
    end;
  writeln; writeln;
  writeln ('Diskette wurde formatiert');
  writeln ('von Track ',Von,' bis Track ',Track);
  writeln
end.
