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;