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

dimage.pas
type TSector0 = RecordJump : 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;BeginOffs:=Word(A);Error:=0;asmmov al,[Disk] {Номер диска 0-A}mov cx,[Count] {Счетчик считываемых символов}mov dx,[Sector] {Начальный сектор}mov bx,[Offs]int 25hpop dxje @nErrormov ax,1mov [Error],ax@nError:end;if Error=0 then ReadSector:=Trueelse ReadSector:=False;End;Function WriteSector(A:Pointer;Disk:Byte;Count:Word;Sector:Word):Boolean;var Error :Word;Offs :Word;BeginOffs:=Word(A);Error:=0;asmmov al,[Disk] {Номер диска 0-A}mov cx,[Count] {Счетчик считываемых символов}mov dx,[Sector] {Начальный сектор}mov bx,[Offs]int 26hpop dxje @nErrormov ax,1mov [Error],ax@nError:end;if Error=0 then WriteSector:=Trueelse WriteSector:=False;End;BeginAssign(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') thenBeginReset(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 doBeginWrite(round(I/s0.TotSecs*100),'%',#13);BlockRead(F,b,512,c);If c<>512 then Exit;WriteSector(@b,0,1,I);End;EndelseBeginReWrite(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 doBeginWrite(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