#include <stdio.h>
#include <conio.h>
#include <bios.h>
#include <dos.h>
#include <stdlib.h>
#include <time.h>

char _far diskbuf[1024];

void main(void);

void main(void) {

	 unsigned status = 0, i, j;
	 struct diskinfo_t di;
	 time_t start, end;
	 float t1, t2;

// Читаем первый сектор дорожки для синхронизации таймера

	 di.drive    = 0;
	 di.head     = 0;
	 di.track    = 20;
	 di.sector   = 1;
	 di.nsectors = 1;
	 di.buffer   = diskbuf;

	 for(i = 0; i < 3; i++) {
		  status = _bios_disk(_DISK_READ, &di) >> 8;
		  if( !status ) break;
	 }

// Отсчет времени начинаем сразу после чтения сектора,
// это позволит компенсировать время, необходимое на разгон
// мотора дисковода.

	 start = clock();

// Повторяем 50 раз чтение секторов с номерами 1 и 2

	 for(j=0; j<50; j++) {
		di.drive    = 0;
		di.head     = 0;
		di.track    = 20;
		di.sector   = 1;
		di.nsectors = 2;
		di.buffer   = diskbuf;

		for(i = 0; i < 3; i++) {
			status = _bios_disk(_DISK_READ, &di) >> 8;
			if( !status ) break;
		}

	 }

	 end = clock();
	 t1 = ((float)end - start) / CLK_TCK;

	 printf("Время для головки 0: %5.1f\n",t1);

// Выполняем аналогичную процедуру для дорожки,
// которая была отформатирована обычным способом.

	 di.drive    = 0;
	 di.head     = 1;
	 di.track    = 20;
	 di.sector   = 1;
	 di.nsectors = 1;
	 di.buffer   = diskbuf;

	 for(i = 0; i < 3; i++) {
		  status = _bios_disk(_DISK_READ, &di) >> 8;
		  if( !status ) break;
	 }

	 start = clock();

	 for(j=0; j<50; j++) {
		di.drive    = 0;
		di.head     = 1;
		di.track    = 20;
		di.sector   = 1;
		di.nsectors = 2;
		di.buffer   = diskbuf;

		for(i = 0; i < 3; i++) {
			status = _bios_disk(_DISK_READ, &di) >> 8;
			if( !status ) break;
		}

	 }
	 end = clock();

	 t2 = ((float)end - start) / CLK_TCK;

	 printf("Время для головки 1: %5.1f\n",t2);

	 printf("\nОтношение времен чтения для головок 0 и 1: %5.1f",
			t1/t2);


}

