Code: Select all
struct HARDDRIVE_SECTOR
{
unsigned char sector_num;
unsigned char cylinder_low;
unsigned char cylinder_high;
unsigned char drive_head;
unsigned char sector[512];
unsigned char error;
};
#define DATA_REGISTER 0x1F0
#define ERROR_REGISTER 0x1F1
#define SECTOR_COUNT_REGISTER 0x1F2
#define SECTOR_NUMBER_REGISTER 0x1F3
#define CYLINDER_LOW_REGISTER 0x1F4
#define CYLINDER_HIGH_REGISTER 0x1F5
#define DRIVE_HEAD_REGISTER 0x1F6
#define STATUS_REGISTER 0x1F7
#define COMMAND_REGISTER 0x1F7
#define DEVICE_CONTROL_REGISTER 0x3F6
struct HARDDRIVE_SECTOR buffer;
unsigned char done;
struct HARDDRIVE_SECTOR read_sector(unsigned char device,unsigned char head,unsigned char cylinder_low,unsigned char cylinder_high,unsigned char sector_num)
{
unsigned int count;
buffer.drive_head=0;
buffer.sector_num=0;
buffer.cylinder_low=0;
buffer.cylinder_high=0;
done=0;
for(count=0;count<512;count++)
{
buffer.sector[count]=0;
}
while((inportb(STATUS_REGISTER)&0x80)==0x80);
if(device==1) buffer.drive_head=0xA0;
else buffer.drive_head=0xB0;
buffer.drive_head=buffer.drive_head|head;
buffer.sector_num=sector_num;
buffer.cylinder_low=cylinder_low;
buffer.cylinder_high=cylinder_high;
outportb(SECTOR_COUNT_REGISTER,1);
outportb(SECTOR_NUMBER_REGISTER,sector_num);
outportb(DRIVE_HEAD_REGISTER,buffer.drive_head);
outportb(CYLINDER_LOW_REGISTER,cylinder_low);
outportb(CYLINDER_HIGH_REGISTER,cylinder_high);
outportb(DEVICE_CONTROL_REGISTER,0x0A);
while((inportb(STATUS_REGISTER)&0x40)==0x40);
outportb(COMMAND_REGISTER,0x20);
while(!done);
return buffer;
}
void harddrive_handler(void)
{
unsigned int count;
Printf("\nharddrive int\n");
for(count=0;count<512;count++)
{
buffer.sector[count]=inportb(DATA_REGISTER);
}
done=1;
}