Создание образа дискеты

Эта, небольшая, программка на паскале читает содержимое дискеты в файл. После этого файл можно переименовать, скажем, в *.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);
Теги:
дискета
Добавлено: 22 Сентября 2013 09:28:13 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...