int IDE1=0x1F0;
unsigned int drive=0x00;
int Read_Disk(unsigned long addr, unsigned char *targetbuffer)
{
unsigned int i;
int idx;
unsigned int tmpword;
unsigned char buffer[512];
outb(0x00,IDE1+0x01);//null data
outb(0x1,IDE1+0x02);//sector count
outb((unsigned char) addr,IDE1+0x03 );
outb((unsigned char)(addr >> 8),IDE1+0x04 );
outb((unsigned char)(addr >> 16),IDE1+0x05 );
outb(0xE0 | (drive << 4) | ((addr >> 24) & 0x0F),IDE1+0x06 );
outb( 0x20,IDE1+0x07);
while (!(inb(IDE1+0x07) &0x08)) {
//printf("waiting for HD 0x%x\n",addr);
inb(IDE1+0x07);
}
for (idx = 0; idx < 512; idx++)
{
tmpword = inw(IDE1+0x0);
buffer[idx] = (unsigned char)tmpword;
buffer[idx + 1] = (unsigned char)(tmpword >> 8);
//printf("%hhx %hhx ",(unsigned char)buffer[idx],(unsigned char)buffer[idx+1]);
idx++;
}
memcpy(targetbuffer,&buffer,512);
return idx;
}
int Write_Disk(unsigned long addr, unsigned char *targetbuffer)
{
unsigned int i,drive;
int idx;
int m=0;
drive=0;
unsigned int tmpword;
unsigned char buffer[512];
memcpy(&buffer,targetbuffer,512);
outb(0x00,IDE1+0x1);//null data
outb(0x1,IDE1+0x2);//sector count
outb((unsigned char) addr,IDE1+0x3 );
outb((unsigned char)(addr >> 8),IDE1+0x4);
outb((unsigned char)(addr >> 16),IDE1+0x5 );
outb( 0xE0 | (drive << 4) | ((addr >> 24) & 0x0F),IDE1+0x6);
outb( 0x31,IDE1+0x7);//write command
while ((inb(IDE1+0x7) != 0x58)) {
//printf("Write waiting for HD\n");
}
for (idx = 0; idx < 2*512; idx++)
{
tmpword = buffer[ idx ] | (buffer[ idx + 1] << 8);
outw(tmpword,IDE1+0x0);
idx++;
}
return idx;
}
No hay comentarios:
Publicar un comentario