Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
:"=a"(a)
:"0"(a));
buff1[i++] = a;
} while(hd_data_request());
Дождавшись освобождения устройства, при помощи функции check_error() читаем регистр состояния. При этом мы сбрасываем прерывание от устройства и проверяем, не произошла ли ошибка. Затем считываем из регистра данных значение. Считывание производим до тех пор, пока установлен бит DRQ. Как только будет передан последний блок данных, устройство этот бит сбросит. Считанную информацию сохраним в буфере buff1.
Копируем полученную информацию из буфера buff1 в структуру struct hdreg hd:
memcpy(hd,(struct hdreg *)buff1,0x100);
Очищаем буфер и выходим:
memset(buff1,0,0x100);
return;
}
Следующая функция осуществляет чтение сектора в режиме адресации CHS.
void read_hd_sector_chs(unsigned short N, unsigned short s_sect, unsigned short s_cyl, unsigned short head, unsigned short *buff)
{
int i = 0;
unsigned short a;
if((!N) || (!s_sect)) return;
Аргументы функции:
n N – число секторов для чтения;
n s_sect – стартовый сектор;
n s_cyl – стартовый цилиндр;
n head – номер головки;
n buff – буфер, куда все помещается.
Ожидаем освобождения устройства:
hd_busy();
В регистр номера устройства и головки заносим соответствующие данные. Бит 6 сброшен, что указывает на режим адресации CHS:
OUT_P_B(0xA0|head,HD_CURRENT);
Ждем готовность устройства к приему команд:
hd_ready();
В блок командных регистров заносим требуемые параметры:
OUT_P_B(N,HD_NSECTOR);
OUT_P_B(s_sect,HD_SECTOR);
OUT_P_B(s_cyl,HD_LCYL);
OUT_P_B((s_cyl >> 8),HD_HCYL);
В регистр команд записываем код команды чтения секторов с повторами – 0x20. Данная команда выполняется в режиме PIO:
OUT_P_B(0x20,HD_STATUS);
Считываем блок данных в буфер buff:
do {
hd_busy();
check_error();