R: registers;
begin
t:=MemL[0:$046C];
while t=MemL[0:$046C] do;
for k:=1 to 10 do with R do
begin
ah:=2;
al:=9;
ch:=TRK;
cl:=1;
dh:=0;
dl:=DSK;
es:=seg(E);
bx:=ofs(E);
Intr13(R, 'Error')
end;
AccessTime:=(MemL[0:$046C]-t-1)*0.055
end;
{--------------}
var
B: array [1..18] of F_Buf; {Буфердляформатирования}
k,N:Integer; {Счетчикцикла}
R:registers; {Регистры}
DBT:PDBT_Type; {УказательнановуюТПД}
C, D: array[1..1024] of Byte; {Буферчтения/записи}
Size: Word; {Длинасектора}
Info: TDisk;
begin {Главная программа}
{Проверяем доступ к диску и настраиваем драйвер}
GetDiskInfo(DSK, Info);
if Disk_Error then
begin
WriteLn('Ошибка доступа к диску');
Halt
end;
{Получаем длину сектора в байтах}
case SIZ of
0: Size:=128;
1: Size:=256;
2: Size:=512;
3: Size:=1024
else
WriteLn('Недопустимыйкоддлинысектора')
end;
{Корректируем таблицу параметров дискеты. Поскольку исходная ТПД может быть
в ПЗУ, делаем ее копию в ОЗУ и изменяем нужные элементы}
Old:=ptr(MemW[0:$1E*4+2],MemW[0:$1E*4]);
New(DBT);
DBT^:=Old^; {ПолучаемкопиюТПДвОЗУ}
SetIntVec($1E,DBT); {ИзменяемссылкунаТПД}
with DBT^ do
begin
SizeCode:=SIZ;
LastSect:=18;
FillChar:='+'
end;
with R do
begin
{Сбрасываемдисковод}
ax:=0;
dl:=DSK;
Intr13(R,'Ошибка доступа к диску');
{Готовим буфер форматирования с обратным фактором чередования секторов}
for k:=1 to 18 do {Для каждого из 18 секторов:}
with B[k] do
begin
Track:=TRK; {указываемномердорожки}
Head:=0; {номер головки}
Sect:=19-k; {номер сектора в обратной последовательности}
Size:=SIZ {и код размера}
end;
{Форматируем дорожку}
ah:=$05; {Код операции форматирования}
al:=18; {Создаем 18 секторов}
ch:=TRK; {на дорожке TRK}
cl:=1; {начиная с сектора 1}
dh:=0; {на поверхности 0}
dl:=DSK; {диска DSK}
es:=seg(B); {ES:BX - адрес буфера}
bx:=ofs(B);
Intr13(R,'Ошибка форматирования');
{Заполняем сектор случайными числами}
Randomize;
for k:=2 to 255 do
C[k]:=Random(256);
{Запрашиваем количество инсталяций на ЖД}
Write('Кол-во установок на ЖД: ');
ReadLn(C[200]);
C[17]:=0;
{Cчитываем контрольную сумму}
N:=0;
for k:=2 to 255 do
N:=N+C[k];
C[256]:=N mod 256;
{Шифруем сектор}
C[1]:=Random(255)+1;
for k:=2 to 256 do
C[k]:=C[k] xor C[1];
{Записываем сектор}
ah:=$03; {Код операции записи}
al:=1; {Записать 1 сектор}
ch:=TRK; {На дорожке TRK}
cl:=1; {Начиная с сектора 1}
dh:=0; {На поверхности 0}
dl:=DSK; {Диск DSK}
es:=seg(C);{Адрес буфера С для записи}
bx:=ofs(C);
Intr13(R,'Ошибка записи');
{Читаем сектор}
ah:=$02;
al:=1;
ch:=TRK;
cl:=1;
dh:=0;
dl:=DSK;
es:=seg(D); {Адрес буфера D для чтения}
bx:=ofs(D);
Intr13(R,'Ошибка чтения')
end;
{Проверяемсовпадение}
for k:=1 to Size do
if c[k]<>d[k] then
begin
WriteLn('Несовпадениеданных');
SetIntVec($1E,Old);
Halt
end;
WriteLn('Создана и проверена ',TRK+1,
'-я дорожка с секторами по ',Size,' байт');
{измеряем время доступа к новой дорожке}
Write('Время доступа к скрытой дорожке: ');
WriteLn(AccessTime(DSK,TRK):6:2,' c');
{измеряем время доступа к стандартной дорожке}
DBT^.SizeCode:=2; {Указываем стандартную длину сектора в ТПД}
Write('Доступ к обычной дорожке: ');
WriteLn(AccessTime(DSK,20):6:2,' c');
{Восстанавливаем старую ТПД}
SetIntVec($1E,Old)
end.
2 ТЕКСТ ПРОГРАММЫ TEXT.EXE
uses F_Prot,F_Disk;
procedure Alarm;Far;
begin
writeln('Нелегальнаякопия')
end;
procedure Norma;Far;
begin
writeln('Легальнаякопия')
end;
function ParStr:String;
var
S:string;
k:Byte;
begin
S:=ParamStr(1);
for k:=1 to Length(S) do S[k]:=UpCase(S[k]);
ParStr:=S
end;
var
p1,p2:Pointer;
d:Integer;
dsk:Byte;
begin
p1:=@Norma;
p2:=@Alarm;
if ParStr='/SET' then
Writeln('Установка на ЖД: ',SetOnHD)
else
if ParStr='/REMOVE' then
writeln('Удаление с ЖД: ',RemoveFromHD)
else
begin
ProtCheck(p1,p2,d);
Writeln('Результат проверки ',d);
readln
end
end.