Program disktest;
uses disk,dos;

const HexaNum : string[16] = '0123456789ABCDEF';

Function VypisVelikost(d:dword):string;
{falesna funkce - ve vysledku nedela nic, ale podstatna je cinnost uvnitr}
{samozrejme je to hrozna prasarna}
var e:extended;
begin
e:=d;
e:=e/2048;   {velikost v MB}
if e<1 then write(e*1024:1:0,'KB') else
if e>1000 then write(e/1024:1:2,'GB')
   else write(e:1:2,'MB');
VypisVelikost:='';
end;

function HexaStr(D:Dword;L:Byte):string;
var I:Byte;
    S:string;
begin
S:='';
for I:=L-1 downto 0 do S:=S+HexaNum[(D shr (I*4) and $0F) + 1];
HexaStr:=S;
end;

Function JePrimarni(odl:TOddInfo):boolean;
begin
if odl.di^.LBA
   then JePrimarni:=odl.parentsec.lba=0
   else JePrimarni:=(odl.parentsec.cyl=0) and (odl.parentsec.hla=0) and (odl.parentsec.sek=1);
end;


var a:byte;
    b:byte;
    c:byte;
    d:char;
    ff,fff,nf,nff:byte;
    bd:TBIOSdisk;
    ft:TFAT_Driver;
    nt:TNTFS_Driver;
    v:longint;

begin
writeln('Program proscanuje tvuj pocitac a bude hledat diskety, pevne disky a'#13#10'oddily na nich.');
writeln('Pozor - jestlize je rozhrani disku nasavene na SCSI bez rezimu kompatibility,');
writeln('tak nemusi fungovat korektne.');
writeln;


bd.init;
Writeln('Pocet disketovych mechanik: ',bd.disketovek);
writeln('pocet pevnych a USB disku: ',bd.disknum-bd.disketovek);
writeln('pocet pristupnych oddilu (bez disketovek): ',bd.oddlnum-bd.disketovek);
writeln;
b:=1;
ff:=0;
nf:=0;
for a:=1 to bd.disknum do
    begin
    write('Disk c.',HexaStr(bd.disk[a].disk,2),'h',
          ' (',VypisVelikost(bd.disk[a].velikost),')',
          ' ma ',bd.disk[a].oddilu,
          ' oddilu');
    if a<=bd.disketovek
       then write(' (disketa)'#13#10#13#10)
       else begin
       writeln(':');
       for c:=b to b+bd.disk[a].oddilu-1 do
           begin
           write('oddil ',c-b+1,' o velikosti ',VypisVelikost(bd.oddl[c].velikost),' ');
           write('kod systemu: ',HexaStr(bd.oddl[c].kodFS,2),'h ');
           write('popiska: ',bd.oddl[c].PrectiPopisku,#13#10);
           if (ff=0) and (bd.oddl[c].ZjistitypFAT<>0) then begin ff:=c;fff:=c-b+1;end;
           if (nf=0) and (bd.oddl[c].NTFS_exFAT_jina=1) then begin nf:=c;nff:=c-b+1;end;
           end;
       writeln;
       b:=c;
       end;
    inc(b);
    end;
writeln('Zmackni Enter');
readln;

if ff<>0 then
   begin
   writeln('Prvni FAT oddil jsem nalezl na disku ',
            HexaStr(bd.oddl[ff].di^.disk,2),'h, na jeho ',fff,'. oddilu.');
   if JePrimarni(bd.oddl[ff]) then writeln('(jde o primarni oddil)')
                              else writeln('(jde o logicky oddil)');
   ft.Init(bd.oddl[ff]);
   writeln('Zkoumam FAT zaznam:');
   write('podtyp: ');
   case bd.oddl[ff].ZjistitypFAT of
     1:writeln('FAT12');
     2:writeln('FAT16');
     3:writeln('FAT32');
   end;{case}
   writeln('Seriove cislo oddilu: ',ft.Vrat_SerioveCislo);
   writeln('Jmenovka oddilu: ',ft.Vrat_VolumeLabel);
   end;

writeln;

if nf<>0 then
   begin
   writeln('Prvni NTFS oddil jsem nalezl na disku ',
            HexaStr(bd.oddl[nf].di^.disk,2),'h, na jeho ',nff,'. oddilu.');
   if JePrimarni(bd.oddl[nf]) then writeln('(jde o primarni oddil)')
                              else writeln('(jde o logicky oddil)');
   nt.Init(bd.oddl[nf]);
   writeln('Zkoumam NTFS zaznam:');
   writeln('Verejne seriove cislo oddilu: ',nt.Vrat_SerioveCislo);
   writeln('Uplne seriove cislo oddilu: ',nt.Vrat_UplneSerioveCislo);
   end;


readln;
end.
