Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

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

(c) Mikhail Krivyy
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;

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 

Комментарии

1.
37K
24 февраля 2008 года
teaseme
0 / / 24.02.2008
+2 / -1
Мне нравитсяМне не нравится
24 февраля 2008, 22:21:11
А зачем один и тот же код писать два раза???
Да, в конце end. не помешал бы:)
2.
22K
14 октября 2006 года
OTO_777
0 / / 14.10.2006
+1 / -0
Мне нравитсяМне не нравится
28 октября 2006, 19:09:00
end.
3.
22K
14 октября 2006 года
OTO_777
0 / / 14.10.2006
+0 / -1
Мне нравитсяМне не нравится
28 октября 2006, 19:08:26
to the end need end;
4.
Аноним
+1 / -0
Мне нравитсяМне не нравится
3 декабря 2005, 22:19:38
Поставь в конце End.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог