Создание образа дискеты
Эта, небольшая, программка на паскале читает содержимое дискеты в файл. После этого файл можно переименовать, скажем, в *.ima или *.flp и подсунуть в WinImage или в FAT12.
Программа написана на Паскале и использует 25h прерывание. Скачать EXE’шник можно здесь.
Скриншот приведен ниже. Запускается программа следующим образом: dimage.exe disk.flp
dimage.pas
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.
Download this code: dimage.pas
Комментарии