Code: Select all
void read_hdd_blocks(u8int count, u8int sector, u16int cylinder, u8int *buffer)
{
u16int i, tmpword;
outb(0x1f6, 0x0);
outb(0x1f2, count);
outb(0x1f3, sector);
outb(0x1f4, (u32int)(cylinder & 0xFF));
outb(0x1f5, cylinder >> 8);
outb(0x1f7, 0x20);
while(!(inb(0x1f7) & 0x8)) {}
for(i = 0; i < 256 * count; i++) {
tmpword = inw(0x1F0);
buffer[i * 2] = (unsigned char)tmpword;
buffer[i * 2 + 1] = (unsigned char)(tmpword >> 8);
}
}
Code: Select all
void read_hdd_blocks_lba(u8int drive, u8int count, u32int addr, u16int cylinder, u8int *buffer)
{
u16int i, tmpword;
outb(0x1F1, 0x00);
outb(0x1f2, count);
outb(0x1F3, (unsigned char)addr);
outb(0x1F4, (unsigned char)(addr >> 8));
outb(0x1F5, (unsigned char)(addr >> 16));
outb(0x1F6, 0xE0 | (drive << 4) | ((addr >> 24) & 0x0F));
outb(0x1f7, 0x20);
while(!(inb(0x1f7) & 0x8)) {}
for(i = 0; i < 256 * count; i++) {
tmpword = inw(0x1F0);
buffer[i * 2] = (unsigned char)tmpword;
buffer[i * 2 + 1] = (unsigned char)(tmpword >> 8);
}
}
[code]