Программа, использующая механизм PIO для доступа к жесткому диску, подключенному с помощью интерфейса ATA. check_error() - постоянно устанавливает бит ошибки.
int get_ata_identity(u8 dev)
{
int i = 0;
if(hd_busy(dev) & TIMEOUT) return -1;
if((dev == 0) || (dev == 2))
OUT_P_B(0xA0,ATA_CURRENT(dev));
if((dev == 1) || (dev == 3))
OUT_P_B(0x10,ATA_CURRENT(dev));
if(hd_ready(dev) == TIMEOUT) return -1;
OUT_P_B(0xEC,ATA_STATUS(dev));
if(check_error(dev)) return -1;
for(; i < TIMEOUT; i++) if(hd_data_request(dev)) break;
if(i == TIMEOUT) return -1;
asm(
" cld \n\t"
"1: inw %%dx, %%ax \n\t"
" stosw \n\t"
" decw %%cx \n\t"
" jnz 1b \n\t"
::"D"(&DEV_ID(dev)), "d"(ATA_DATA(dev)),"c"(0x100));
return 0;
}
int check_error(u8 dev)
{
unsigned char a;
IN_P_B(a,ATA_STATUS(dev));
if (a & ERR) return 1;
return 0;
}