Also: Das ganze ist nichts für ein Multitasking-OS, da ich kein DMA verwende:
Einen Sektor lesen:
BOOL hdddrv_read_sector(unsigned int sector, unsigned short *buffer, unsigned int drive) {
int i;
while((inport(0x1f7) & 0x80) == 0x80); /* Solange warten bis Laufwerk bereit ist */
/* Beinhaltet das Laufwerk, die Upperbits des Sektors und versetzt das Laufwerk in den LBA Mode */
outport(0x1f6, 0x40 | (drive << 4) | ((sector >> 24) & 0x0F));
outport(0x1f2, 1); /* Anzahl der zu lesenden Sektoren (erstmal nur einer) */
outport(0x1f3, sector & 0xFF); /* Sektor Nummer, Lower Byte */
outport(0x1f4, (sector >> 8) & 0xFF); /* Sektor Nummer, Middle Byte */
outport(0x1f5, (sector >> 16) & 0xFF); /* Sektor Nummer, N�hstes Byte*/
outport(0x1f7, 0x20); /* Befehl: Lesen!!! */
while((inport(0x1f7) & 0x80) == 0x80); /* Warten bis der Befehl ausgefhrt wurde */
while((inport(0x1f7) & 0x0F) != 8); /* Warten bis das Laufwerk bereit ist Bytes zu senden */
/* Byte fr Byte holen */
for(i=0;i<=256;i++)
buffer[i] = inportw(0x1f0);
/* Fehler aufgetreten? */
if(inport(0x1f1)){
return FALSE;
}
/* Alles ok */
return TRUE;
}
Einen Sektor schreiben:
BOOL hdddrv_write_sector(unsigned int sector, unsigned short *buffer, unsigned int drive) {
int i;
while((inport(0x1f7) & 0x80) == 0x80); /* Solange warten bis Laufwerk bereit ist */
/* Beinhaltet das Laufwerk, die Upperbits des Sektors und versetzt das Laufwerk in den LBA Mode */
outport(0x1f6, 0x40 | (drive << 4) | ((sector >> 24) & 0x0F));
outport(0x1f2, 1); /* Anzahl der zu lesenden Sektoren (erstmal nur einer) */
outport(0x1f3, sector & 0xFF); /* Sektor Nummer, Lower Byte */
outport(0x1f4, (sector >> 8) & 0xFF); /* Sektor Nummer, Middle Byte */
outport(0x1f5, (sector >> 16) & 0xFF); /* Sektor Nummer, N�hstes Byte*/
outport(0x1f7, 0x30); /* Befehl: Schreiben!!! */
while((inport(0x1f7) & 0x80) == 0x80); /* Warten bis der Befehl ausgefhrt wurde */
while((inport(0x1f7) & 0x0F) != 8); /* Warten bis das Laufwerk bereit ist Bytes zu senden */
/* Byte fr Byte senden */
for(i=0;i<=256;i++)
outportw(0x1f0, buffer[i]);
/* Alles ok */
return TRUE;
}