
type TSector0 = Record
       Jump             : Array[1..3] of Char;   { NEAR-переход на код загрузки }
       OEMName          : Array[1..8] of Char;   { OEM-имя компании и версия системы }
       SectSize         : Word;                  { байт на сектор }
       ClustSize        : Byte;                  { секторов на единицу распределения (кластер) }
       ResSecs          : Word;                  { резервных секторов (секторов перед первой FAT) }
       FatCnt           : Byte;                  { число таблиц FAT }
       RootSiz          : Word;                  { макс.число 32-байтовых элементов корневого оглавления }
       TotSecs          : Word;                  { общее число секторов на носителе (раздел DOS) }
       Media            : Byte;                  { дескриптор носителя (то же, что 1-й байт FAT) }
       FatSize          : Word;                  { число секторов в одной FAT }
       TrkSecs          : Word;                  { секторов на дорожку (цилиндр) }
       HeadCnt          : Word;                  { число головок чтения/записи (поверхностей) }
       HidnSec          : Word;                  { спрятанных секторов (исп. в схемах разделения) }
       Ostatok          : Array[1..486] of Char; { Остаток, что-бы сюда можно было читать сектор }
     End;

var s0           : TSector0;
    b:Array[0..512] of Byte;
    F            : File;
    I            : LongInt;
    c            : Integer;

Function ReadSector(A:Pointer;Disk:Byte;Count:Word;Sector:Word):Boolean;
var Error     :Word;
    Offs      :Word;
Begin
 Offs:=Word(A);
 Error:=0;
  asm
         mov  al,[Disk]         {Номер диска 0-A}
         mov  cx,[Count]        {Счетчик считываемых символов}
         mov  dx,[Sector]       {Начальный сектор}

         mov  bx,[Offs]
         int  25h
         pop  dx
         je   @nError
         mov  ax,1
         mov  [Error],ax
@nError:
  end;
 if Error=0 then ReadSector:=True
            else ReadSector:=False;
End;

Function WriteSector(A:Pointer;Disk:Byte;Count:Word;Sector:Word):Boolean;
var Error     :Word;
    Offs      :Word;
Begin
 Offs:=Word(A);
 Error:=0;
  asm
         mov  al,[Disk]         {Номер диска 0-A}
         mov  cx,[Count]        {Счетчик считываемых символов}
         mov  dx,[Sector]       {Начальный сектор}

         mov  bx,[Offs]
         int  26h
         pop  dx
         je   @nError
         mov  ax,1
         mov  [Error],ax
@nError:
  end;
 if Error=0 then WriteSector:=True
            else WriteSector:=False;
End;

Begin
 Assign(F,ParamStr(1));If IOResult<>0 then Exit;
 If not ReadSector(@s0,0,1,0) then Begin WriteLn('Error reading 0 sector.');halt(1); End;
 If (ParamStr(2)='-s') or (ParamStr(2)='-S') or
    (ParamStr(2)='/s') or (ParamStr(2)='/S') then
     Begin
      Reset(F,1);If IOResult<>0 then Exit;
      BlockRead(F,s0,512,c);If c<>512 then Exit;
      Reset(F,1);If IOResult<>0 then Exit;
      Write('Байт на сектор                                 : ');WriteLn(s0.SectSize);
      Write('Секторов на дорожку (цилиндр)                  : ');WriteLn(s0.TrkSecs);
      Write('Число головок чтения/записи (поверхностей)     : ');WriteLn(s0.HeadCnt);
      Write('Общее число секторов на носителе (раздел DOS)  : ');WriteLn(s0.TotSecs);
      Write('Общее число дорожек на носителе                : ');WriteLn(s0.TotSecs div (s0.TrkSecs*s0.HeadCnt));
      Write('Резервных секторов (секторов перед первой FAT) : ');WriteLn(s0.ResSecs);
      Write('Размер FAT                                     : ');WriteLn(s0.FatSize);
      Write('Количество FAT                                 : ');WriteLn(s0.FatCnt);
      WriteLn('¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦');
      For I:=0 to s0.TotSecs-1 do
       Begin
        Write(round(I/s0.TotSecs*100),'%',#13);
        BlockRead(F,b,512,c);If c<>512 then Exit;
        WriteSector(@b,0,1,I);
       End;
     End
 else
  Begin
   ReWrite(F,1);If IOResult<>0 then Exit;
   Write('Байт на сектор                                 : ');WriteLn(s0.SectSize);
   Write('Секторов на дорожку (цилиндр)                  : ');WriteLn(s0.TrkSecs);
   Write('Число головок чтения/записи (поверхностей)     : ');WriteLn(s0.HeadCnt);
   Write('Общее число секторов на носителе (раздел DOS)  : ');WriteLn(s0.TotSecs);
   Write('Общее число дорожек на носителе                : ');WriteLn(s0.TotSecs div (s0.TrkSecs*s0.HeadCnt));
   Write('Резервных секторов (секторов перед первой FAT) : ');WriteLn(s0.ResSecs);
   Write('Размер FAT                                     : ');WriteLn(s0.FatSize);
   Write('Количество FAT                                 : ');WriteLn(s0.FatCnt);
   For I:=0 to s0.TotSecs-1 do
    Begin
     Write(round(I/s0.TotSecs*100),'%',#13);
     ReadSector(@b,0,1,I);
     BlockWrite(F,b,512);
    End;
  End;
 Close(F);
End.
