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

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

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

Эта, небольшая, программка на паскале читает содержимое дискеты в файл. После этого файл можно переименовать, скажем, в *.ima или *.flp и подсунуть в WinImage или в FAT12.

Программа написана на Паскале и использует 25h прерывание. Скачать EXE’шник можно здесь.

Скриншот приведен ниже. Запускается программа следующим образом: dimage.exe disk.flp

dimage.gif

dimage.pas

  1.  
  2. type TSector0 = Record
  3. Jump : Array[1..3] of Char; { NEAR-переход на код загрузки }
  4. OEMName : Array[1..8] of Char; { OEM-имя компании и версия системы }
  5. SectSize : Word; { байт на сектор }
  6. ClustSize : Byte; { секторов на единицу распределения (кластер) }
  7. ResSecs : Word; { резервных секторов (секторов перед первой FAT) }
  8. FatCnt : Byte; { число таблиц FAT }
  9. RootSiz : Word; { макс.число 32-байтовых элементов корневого оглавления }
  10. TotSecs : Word; { общее число секторов на носителе (раздел DOS) }
  11. Media : Byte; { дескриптор носителя (то же, что 1-й байт FAT) }
  12. FatSize : Word; { число секторов в одной FAT }
  13. TrkSecs : Word; { секторов на дорожку (цилиндр) }
  14. HeadCnt : Word; { число головок чтения/записи (поверхностей) }
  15. HidnSec : Word; { спрятанных секторов (исп. в схемах разделения) }
  16. Ostatok : Array[1..486] of Char; { Остаток, что-бы сюда можно было читать сектор }
  17. End;
  18.  
  19. var s0 : TSector0;
  20. b:Array[0..512] of Byte;
  21. F : File;
  22. I : LongInt;
  23. c : Integer;
  24.  
  25. Function ReadSector(A:Pointer;Disk:Byte;Count:Word;Sector:Word):Boolean;
  26. var Error :Word;
  27. Offs :Word;
  28. Begin
  29. Offs:=Word(A);
  30. Error:=0;
  31. asm
  32. mov al,[Disk] {Номер диска 0-A}
  33. mov cx,[Count] {Счетчик считываемых символов}
  34. mov dx,[Sector] {Начальный сектор}
  35.  
  36. mov bx,[Offs]
  37. int 25h
  38. pop dx
  39. je @nError
  40. mov ax,1
  41. mov [Error],ax
  42. @nError:
  43. end;
  44. if Error=0 then ReadSector:=True
  45. else ReadSector:=False;
  46. End;
  47.  
  48. Function WriteSector(A:Pointer;Disk:Byte;Count:Word;Sector:Word):Boolean;
  49. var Error :Word;
  50. Offs :Word;
  51. Begin
  52. Offs:=Word(A);
  53. Error:=0;
  54. asm
  55. mov al,[Disk] {Номер диска 0-A}
  56. mov cx,[Count] {Счетчик считываемых символов}
  57. mov dx,[Sector] {Начальный сектор}
  58.  
  59. mov bx,[Offs]
  60. int 26h
  61. pop dx
  62. je @nError
  63. mov ax,1
  64. mov [Error],ax
  65. @nError:
  66. end;
  67. if Error=0 then WriteSector:=True
  68. else WriteSector:=False;
  69. End;
  70.  
  71. Begin
  72. Assign(F,ParamStr(1));If IOResult<>0 then Exit;
  73. If not ReadSector(@s0,0,1,0) then Begin WriteLn('Error reading 0 sector.');halt(1); End;
  74. If (ParamStr(2)='-s') or (ParamStr(2)='-S') or
  75. (ParamStr(2)='/s') or (ParamStr(2)='/S') then
  76. Begin
  77. Reset(F,1);If IOResult<>0 then Exit;
  78. BlockRead(F,s0,512,c);If c<>512 then Exit;
  79. Reset(F,1);If IOResult<>0 then Exit;
  80. Write('Байт на сектор : ');WriteLn(s0.SectSize);
  81. Write('Секторов на дорожку (цилиндр) : ');WriteLn(s0.TrkSecs);
  82. Write('Число головок чтения/записи (поверхностей) : ');WriteLn(s0.HeadCnt);
  83. Write('Общее число секторов на носителе (раздел DOS) : ');WriteLn(s0.TotSecs);
  84. Write('Общее число дорожек на носителе : ');WriteLn(s0.TotSecs div (s0.TrkSecs*s0.HeadCnt));
  85. Write('Резервных секторов (секторов перед первой FAT) : ');WriteLn(s0.ResSecs);
  86. Write('Размер FAT : ');WriteLn(s0.FatSize);
  87. Write('Количество FAT : ');WriteLn(s0.FatCnt);
  88. WriteLn('¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦');
  89. For I:=0 to s0.TotSecs-1 do
  90. Begin
  91. Write(round(I/s0.TotSecs*100),'%',#13);
  92. BlockRead(F,b,512,c);If c<>512 then Exit;
  93. WriteSector(@b,0,1,I);
  94. End;
  95. End
  96. else
  97. Begin
  98. ReWrite(F,1);If IOResult<>0 then Exit;
  99. Write('Байт на сектор : ');WriteLn(s0.SectSize);
  100. Write('Секторов на дорожку (цилиндр) : ');WriteLn(s0.TrkSecs);
  101. Write('Число головок чтения/записи (поверхностей) : ');WriteLn(s0.HeadCnt);
  102. Write('Общее число секторов на носителе (раздел DOS) : ');WriteLn(s0.TotSecs);
  103. Write('Общее число дорожек на носителе : ');WriteLn(s0.TotSecs div (s0.TrkSecs*s0.HeadCnt));
  104. Write('Резервных секторов (секторов перед первой FAT) : ');WriteLn(s0.ResSecs);
  105. Write('Размер FAT : ');WriteLn(s0.FatSize);
  106. Write('Количество FAT : ');WriteLn(s0.FatCnt);
  107. For I:=0 to s0.TotSecs-1 do
  108. Begin
  109. Write(round(I/s0.TotSecs*100),'%',#13);
  110. ReadSector(@b,0,1,I);
  111. BlockWrite(F,b,512);
  112. End;
  113. End;
  114. Close(F);
  115. End.

Download this code: dimage.pas

Комментарии