Розробити програму, яка дозволяє користувачу тестувати накопичувач на гнучкому магнітному диску

Завдання.

Розробити програму, яка дозволяє користувачу тестувати накопичувач на гнучкому магнітному диску.

Метод доступу до сектора – “Метелик”. Вимірювати час доступу до сектора.

Використовується DOS, переривання INT 13h, функція 08h та функція 04h.

Вимоги до функціональних характеристик.

Розроблена програма повинна забезпечувати виконання наступних функцій:

- достовірну інформацію;

- алгоритм програми має бути якомога оптимальнішим;

- зручний програмний інтерфейс.

 

Опис об’єкта діагностики

Кількість інформації (щільність) на одній поверхні диска залежить від числа доріжок та числа секторів на одній доріжці. Щільність може суттєво… Таким чином, мінімально-адресуємою на фізичному рівні (рівень команд… Одноіменні доріжки на різних поверхнях диска утворюють ци­ліндр. З кожною поверхнею диска пов’язана своя головка…

Опис методу діагностики та його алгоритм

Для програмної реалізації цього алгоритму організовуємо ввід початкового та кінцевого номерів діапазону перевірки секторів. Після цього у циклі по…  

Проектування тестової програми

Опис системних функцій, що використовуються у програмі

В даній програмі використовується функція 04h переривання 13h, яка дозволяє перевірити сектори. Функція перевіряє CRC для вказаних секторів на… Вхід: DL = номер диска;

Схема алгоритму

Програма тестування НГМД складається з двох процедур та головної програми.

Процедура Verif(Ngol,Ndor,Nsek:byte) виконує верифікацію дискети, використовуючи системну функцію 04h переривання 13h, яка була описана вище. Функція Verif реалізована за наступним алгоритмом:

- запис у регістри cl,ch та dh номера сектора, доріжки та голівки відповідно;

……..

reg.cl:=Nsek;

reg.ch:=Ndor;

reg.dh:=Ngol;

….

- посилання у регістр ah номера функції ($04);

reg.ah:=$04;

….

- у регістр dl – номер диска ($00 – диск А) та виклик 13 переривання;

reg.dl:=$00;

intr($13,reg);

- перевірка регістра ah: якщо 1 – то помилка.

Процедура Geom виводить на екран геометрію диска, використовуючи описану вище системну функцію 08h переривання 13h. Алгоритм функції Geom описано нижче:

- у регістр ah – номер системної функції ($08);

reg.ah:=$08;

- у регістр dl – номер диска ($00 – диск А);

reg.dl:=$00;

- виклик 13 переривання;

intr($13,reg);

- вивід на екран кількості голівок, циліндрів та секторів, для цього до значення регістрів dh та ch (які містять інформацію про кількість голівок та циліндрів) додаємо 1, оскільки циліндри та голівки починають рахуватися з 0;

Heads:=reg.dh+1;

Cyls:=reg.ch+1;

Sectors:=reg.cl;

 

- розрахунок об’єму диска шляхом знаходження добутка між кількістю секторів, доріжок, голівок та розміром сектору (512), та вивід його на екран;

V:=(Heads*Cyls*Sectors*t)/1024;

writeln('объём диска: ',V:11,'Mb');

 

У головній програмі спочатку викликається функція Geomдля отримання інормації про кількість секторів, циліндрів та голівок на диску, після чого вводяться початкові та кінцеві номери діапозону тих голівок, доріжок та секторів, які необхідно перевірити. Далі організовано три цикла: перший для голівок, другий для циліндрів і третій для секторів. Для останнього циклу підраховується кількість проходів шляхом ділення без залишку різниці між кінцевим та початковим номерами діапазону секторів. В ціх циклах викликається процедура Verif за алгоритмом “Метелика”, який був описаний вище.

Перед викликом процедури Verif та після нього викликається функція GetTime(h,m,s,s100), за допомогою якої визначаємо час доступу до сектора.

....

for i:=NgBeg to NgFin do

for j:=NdBeg to NdFin do

begin

k:=((nsfin-nsbeg) div 2)+1;

while k<>0 do

begin

GetTime(h,m,s,s100);

Verif(i,j,nsbeg);

GetTime(hk,mk,sk,s100k);

Verif(i,j,nsfin);

nsbeg:=nsbeg+1;

nsfin:=nsfin-1;

k:=k-1;

end;

end;

writeln('Time: ',sk-s,' sec ',s100k-s100,' Sec/100'); readkey;

End.

 

ТЕКСТ ПРОГРАМИ.

program testFD;

uses crt,dos;

var

reg:REGISTERS;

NgBeg,NgFin:byte;

NdBeg,NdFin:byte;

NsBeg,NsFin:byte;

i,j,k:integer;

h,m,s,s100,hk,mk,sk,s100k:word;

{процедура перевірки диска}

Procedure Verif(Ngol,Ndor,Nsek:byte);

begin

reg.cl:=Nsek; {отримання номера сектора}

reg.ch:=Ndor; {отримання номера доріжки}

reg.dh:=Ngol; {отримання номера голівки}

reg.ah:=$04; {виклик функції 04h }

reg.dl:=$00; {00 – диск А (01 – В, 80 – С )}

intr($13,reg); {виклик переривання 13h}

{перевірка на помилку}

if reg.ah=1 then writeln('Error ',' Nsek= ',Nsek)

else

writeln('Nsek= ',Nsek,' Ndor= ',Ndor,' Ngol= ',Ngol,' OK' );

end;

{Геометрія диска}

Procedure Geom;

var v,t:real;

Heads:byte;

Cyls:byte;

Sectors:byte;

begin

reg.ah:=$08; {виклик функції 08h}

reg.dl:=$00; {диск А}

intr($13,reg); {виклик переривання 13h}

Heads:=reg.dh+1; {кількість голівок}

Cyls:=reg.ch+1; {кількість циліндрів}

Sectors:=reg.cl; {кількість секторів}

writeln('Heads: ',Heads); {вивід кількості голівок}

writeln('Cyls: ',Cyls); {вивід кількості циліндрів}

writeln('Sectors: ',Sectors); {кількість циліндрів}

t:=512;

V:=(Heads*Cyls*Sectors*t)/1024; {розрахунок об’єму диска } writeln('объём диска: ',V:11,'Mb'); {вивід об’єму диска }

end;

{головна програма}

Begin

ClrScr;

Geom;

readkey;

 

{вводимо параметри діапазону}

 

writeln('Введите начальный номер головки');

readln(NgBeg);

writeln('Введите конечный номер головки');

readln(NgFin);

writeln('Введите начальный номер цилиндра');

readln(NdBeg);

writeln('Введите конечный номер цилиндра');

readln(NdFin);

writeln('Введите начальный номер сектора');

readln(NsBeg);

writeln('Введите конечный номер сектора');

readln(NsFin);

 

for i:=NgBeg to NgFin do {цикл для голівок}

for j:=NdBeg to NdFin do {цикл для доріжок}

begin

k:=((nsfin-nsbeg) div 2)+1; {кількість проходів}

for t:=0 to k-1 do {цикл для сеторів}

begin

GetTime(h,m,s,s100); {отримуємо значення часу}

Verif(i,j,nsbeg+t);

GetTime(hk,mk,sk,s100k);

Verif(i,j,NsFin-t);

end;

end;

{визначаємо час доступу до сектора}

 

writeln('Timeb: ',m,' min ',s,' sec ',s100,' Sec/100');

writeln('Timef: ',mk,' min ',sk,' sec ',s100k,' Sec/100');

readkey;

End.

 

Результати роботи програми:

Запустимо програму для визначення часу доступу до сектора на одній доріжці

Отримали результат:

 

Heads: 2

Cyls: 80

Sectors: 18

объём диска: 1.44E+0003Mb

Введите начальный номер головки

Введите конечный номер головки

Введите начальный номер цилиндра

Введите конечный номер цилиндра

Введите начальный номер сектора

Введите конечный номер сектора

Nsek= 3 Ndor= 4 Ngol= 1 OK

Nsek= 6 Ndor= 4 Ngol= 1 OK

Nsek= 4 Ndor= 4 Ngol= 1 OK

Nsek= 5 Ndor= 4 Ngol= 1 OK

Timebeg: 15 min 38 sec 12 Sec/100

Timefin: 15 min 38 sec 29 Sec/100

 

Тобто бачимо що час доступу складає 17 Sec/100

Також видно що сектори перевіряються за алгоритмом “Метелика”.

 

Визначимо час доступу до секторів різних доріжок:

Результат:

 

Введите начальный номер головки

Введите конечный номер головки

Введите начальный номер цилиндра

Введите конечный номер цилиндра

Введите начальный номер сектора

Введите конечный номер сектора

Nsek= 4 Ndor= 2 Ngol= 1 OK

Nsek= 5 Ndor= 2 Ngol= 1 OK

Nsek= 4 Ndor= 3 Ngol= 1 OK

Nsek= 5 Ndor= 3 Ngol= 1 OK

Timebeg: 22 min 59 sec 83 Sec/100

Timefin: 23 min 0 sec 5 Sec/100

 

Тобто час доступу дорівнює 22 Sec/100.

Визначимо час доступу до секторів різних доріжок

Результат:

 

Введите начальный номер головки

Введите конечный номер головки

Введите начальный номер цилиндра

Введите конечный номер цилиндра

Введите начальный номер сектора

Введите конечный номер сектора

Nsek= 7 Ndor= 2 Ngol= 0 OK

Nsek= 8 Ndor= 2 Ngol= 0 OK

Nsek= 7 Ndor= 3 Ngol= 0 OK

Nsek= 8 Ndor= 3 Ngol= 0 OK

Nsek= 7 Ndor= 2 Ngol= 1 OK

Nsek= 8 Ndor= 2 Ngol= 1 OK

Nsek= 7 Ndor= 3 Ngol= 1 OK

Nsek= 8 Ndor= 3 Ngol= 1 OK

Timebeg: 24 min 37 sec 22 Sec/100

Timefin: 24 min 37 sec 44 Sec/100

 

Бачимо, що час доступу – 22 Sec/100.

 

Одже, виходячи з отриманих результатів роботи програми, можна зробити висновок, що час доступу до сектора на одній доріжці меньший ніж час доступу до сектора на різних доріжках або голівках.