void hd_read(
lba_t lba,
size_t secs,
void *buf)
{
size_t cyln = lba / (HD0_HEADS * HD0_SECTS);
size_t mo_val = (lba % (HD0_HEADS * HD0_SECTS));
size_t head = mo_val / HD0_SECTS;
size_t sect = mo_val % HD0_SECTS + 1;
//pdebug("Hello?");
/*S_SHOW_VALUE(secs, d);
S_SHOW_VALUE(cyln, d);
S_SHOW_VALUE(head, d);
S_SHOW_VALUE(sect, d);*/
//S_SHOW_VALUE(io_inb_p(0x1F7), 02X);
while ((io_inb_p(0x1F7) & 0xC0) != 0x40);
io_outb_p(secs, 0x1F2);
io_outb_p(sect, 0x1F3);
io_outb_p(cyln, 0x1F4);
io_outb_p(cyln >> 8, 0x1F5);
io_outb_p(head | 0xA0, 0x1F6);
io_outb_p(0x20, 0x1F7);
while (!(io_inb_p(0x1F7) & 0x08));
io_insl(0x1F0, buf, secs << 7);
//io_insb(0x1F0, buf, secs << 9);
//__asm__ ("cld;rep;insb" :: "d" (0x1F0), "S" (buf), "c"(secs << 9));
/*u32 eip;
__asm__ ("call .14;.14:popl %%eax" : "=a" (eip));
S_SHOW_VALUE(eip, p);*/
//__asm__ __volatile__ (".0:insb;loop .0" :: "d" (0x1F0), "D" (buf), "c" (secs << 9));
}
void hd_write(
lba_t lba,
size_t secs,
void *buf)
{
size_t cyln = lba / (HD0_HEADS * HD0_SECTS);
size_t mo_val = (lba % (HD0_HEADS * HD0_SECTS));
size_t head = mo_val / HD0_SECTS;
size_t sect = mo_val % HD0_SECTS + 1;
printk(PRK_MESG "Writing %d sectors from %p to HD0 LBA = %d");
//S_SHOW_VALUE(io_inb_p(0x1F7), 02X);
//pdebug("Hello...!");
/*S_SHOW_VALUE(secs, d);
S_SHOW_VALUE(cyln, d);
S_SHOW_VALUE(head, d);
S_SHOW_VALUE(sect, d);*/
while ((io_inb_p(0x1F7) & 0xC0) != 0x40);
//pdebug("Hello!");
io_outb_p(secs, 0x1F2);
io_outb_p(sect, 0x1F3);
io_outb_p(cyln, 0x1F4);
io_outb_p(cyln << 8, 0x1F5);
io_outb_p(head | 0xA0, 0x1F6);
io_outb_p(0x30, 0x1F7);
while (!io_inb_p(0x1F7) & 0x08);
io_outsl(buf, 0x1F0, secs << 7);
//io_outsb(buf, 0x1F0, secs << 9);
/*u32 eip;
__asm__ ("call .48;.48:popl %%eax" : "=a" (eip));
S_SHOW_VALUE(eip, p);*/
//__asm__ __volatile__ (".1:outsb;loop .1" :: "d" (0x1F0), "S" (buf), "c" (secs << 9));
}