Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
IN_P_W(a,HD_DATA);
buff[i++] = a;
} while(hd_data_request());
Считываем последние 4 байта и выходим из функции:
IN_P_W(a,HD_DATA);
buff[i++] = a;
IN_P_W(a,HD_DATA);
buff[i] = a;
return;
}
Функция чтения сектора в режиме адресации LBA.
void read_hd_sector_lba(unsigned short N, unsigned int lba, unsigned short *buff)
{
int i = 0;
unsigned short a;
if(!N) return;
Аргументы функции:
n N – число секторов для чтения;
n lba – номер блока;
n buff – буфер, куда все помещается.
Ожидаем освобождения устройства:
hd_busy();
Спецификацией АТА-2 в режиме LBA предусмотрен 28-битный адрес сектора размером 512 байт, при этом максимальный объем ограничивается значением 0,5 терабайт.
В регистре номера устройства и головки бит 6 устанавливаем в 1, а биты 3-0 будут содержать старшие биты логического адреса (27-24):
OUT_P_B(0xE0|((lba & 0x0F000000) >> 24),HD_CURRENT);
Ожидаем готовность устройства к приему команд:
hd_ready();
В блок командных регистров заносим требуемые параметры:
OUT_P_B(N,HD_NSECTOR);
В регистр номера сектора заносим биты 7-0 логического адреса:
OUT_P_B((lba & 0x000000FF),HD_SECTOR);
В регистр младшего байта номера цилиндра – биты 15-8 логического адреса:
OUT_P_B(((lba & 0x0000FF00) >> 8),HD_LCYL);
В регистр старшего байта номера цилиндра – биты 23-16 логического адреса:
OUT_P_B(((lba & 0x00FF0000) >> 16),HD_HCYL);
В регистр команд – команду чтения секторов с повторами:
OUT_P_B(0x20,HD_STATUS);
Получаем результат:
do {
hd_busy();