Форматирование отдельных дорожек с размером сектора, отличным от стандартного для MS-DOS, например с размером 128 байт или 1024 байт.
Самое простое, что можно сделать, - изменить размер секторов на дорожке. Приведем простую программу, которая форматирует двадцатую дорожку диска, создавая на ней сектора размером 256 байт. После форматирования программа записывает в первый сектор нестандартной дорожки строку, введенную с клавиатуры. Затем для контроля содержимое этого сектора считывается и отображается на экране. Обратите внимание на изменения в таблице параметров дискеты - они необходимы для использования нестандартного размера сектора.
Program Sector256;
Uses crt, sysp;
Const
TRK = 20; { Номер форматируемой дорожки }
sec_size = 1; { Размер сектора 1 - 256 байт }
var
dpt_ptr:^DPT absolute $0000:$0078;
{ $0000:$0078 - адрес таблицы параметров дискеты }
c : char;
kod : byte;
old_sec_size, old_fill_char, old_eot : byte;
i,j : byte;
diskbuf, diskbuf1 : array [1..512] of byte;
buf : string [80];
ol : byte;
BEGIN
clrscr;
writeln ('Программа уничтожит содержимое 20-й дорожки диска А:.');
writeln ('Хотите продолжить?(Y/N)');
{ Ожидаем ответ от оператора и анализируем его }
c := readkey;
if (c<>'y') and (c<>'Y') then halt (1);
{ сохраняем старые значения из таблицы параметров дискеты }
old_sec_size := dpt_ptr^.sec_size;
old_fill_char := dpt_ptr^.fill_char;
old_eot := dpt_ptr^.eot;
{ Устанавливаем в таблице параметров дискеты
код размера сектора, символ заполнения при
форматировании, количество секторов на дорожке }
dpt_ptr^.sec_size := sec_size;
dpt_ptr^.fill_char:= $77;
dpt_ptr^.eot := 15;
ol := dpt_ptr^.eot;
asm
{ Устанавливаем тип диска }
mov ah,017H
mov al,3
mov dl,0
int 13h
{ Устанавливаем среду для форматирования }
mov ah,18h
mov ch,trk
mov cl,ol
mov dl,0
int 13h
end;
{ Подготавливаем буфеp фоpматиpования для 15 сектоpов }
i := 1;
for j:=1 to 15 do
begin
diskbuf[i] :=trk;
diskbuf[i+1]:=0;
diskbuf[i+2]:=j;
diskbuf[i+3]:=sec_size;
i:=i+4;
end;
{ Подготавливаем паpаметpы для функции фоpматиpования
Вызываем функцию фоpматиpования доpожки }
asm
mov ax,seg diskbuf
mov es,ax
mov ah,05h
mov al,15
mov ch,trk
mov cl,1
mov dh,0
mov dl,0
lea bx,diskbuf
int 13h
mov kod,ah
end;
writeln ('Форматирование завершилось с кодом:',kod);
writeln ('Введите строку для записи в нестандартный сектор,’,
‘длина строки недолжна превышать 80 байт:');
readln (buf);
move (buf,diskbuf1,81);
{ Записываем инфоpмацию в нестандаpтный сектоp }
asm
mov ax,seg diskbuf1
mov es,ax
mov ah,03
mov al,01
lea bx,diskbuf1
mov ch,trk
mov cl,1
mov dh,00
mov dl,00
int 13h
mov kod,ah
end;
if kod <> 0 then
begin
writeln ('Ошибка ',kod,' при записи в нестандартный сектор');
halt (1);
end;
{ Считываем инфоpмацию из нестандаpтного сектоpа }
while (kod<>0) and (i<3) do
begin
asm
mov ah,02
mov al,01
lea bx,diskbuf
mov ch,trk
mov cl,01
mov dh,00
mov dl,00
int 13h
mov kod,ah
end;
inc (i);
end;
move (diskbuf1,buf,81);
writeln ('Прочитано из нестандартного сектора:');
writeln (buf);
{ Востанавливаем стаpые значения в
таблице паpаметpов дискеты }
dpt_ptr^.sec_size := old_sec_size;
dpt_ptr^.fill_char:= old_fill_char;
dpt_ptr^.eot := old_eot;
END.
Сформатированную таким образом дорожку можно прочитать только при знании параметров таблицы базы диска.
Интересным методом является создание на дорожке дискеты сектора большой длины. В этом случае последовательно выполняются 2 шага:
- форматирование дорожки с большим числом секторов малой длины, но в таблице форматирования указывается, что будет сформатирован один или несколько секторов большой длины;.
- производится запись в сектор с большой длиной. При этом, разумеется, Вам понадобятся 2 таблицы базы диска.