Создание образа дискеты
16 апреля 1998 года
Эта, небольшая, программка на паскале читает содержимое дискеты в файл. После этого файл можно переименовать, скажем, в *.ima или *.flp и подсунуть в WinImage или в FAT12.
Программа написана на Паскале и использует 25h прерывание. Скачать EXE'шник можно здесь.
Скриншот приведен ниже. Запускается программа следующим образом:dimage.exe disk.flp
Код:
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;
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;
Оставить комментарий
Комментарии
1.
+2 / -1
24 февраля 2008, 22:21:11
А зачем один и тот же код писать два раза???
Да, в конце end. не помешал бы:)
Да, в конце end. не помешал бы:)
2.
+1 / -0
28 октября 2006, 19:09:00
end.
3.
+0 / -1
28 октября 2006, 19:08:26
to the end need end;
4.
+1 / -0
3 декабря 2005, 22:19:38
Поставь в конце End.