Wenn ich mehrere Sektoren nacheinander einlesen will, geht das nicht. Einer allein geht.
Bochs meldet, dass ein Befehl noch Pending ist, obwohl ich vor dem Schreiben ins Datenregister immer überprüfe, ob es bereit ist.
In anderen Treibern habe ich gesehen, dass nach vielen Befehlen (Motor an, Motor aus) ein Delay kommt. Muss man dieses unelegantes Zeugs auch einbauen?
Hier der Code:
volatile BYTE operationDone = 0;
BYTE ReadSectors(WORD startSector, WORD count, void* target)
{
BYTE cylinder, head, sector;
WORD i;
for(i = 0; i < count; i++, target += 512)
{
while(InByte(0x03F4) & 0x80 == 0);
OutByte(0x1C, 0x03F2); /* Motor starten */
LBAToCHS(startSector + i, &cylinder, &head, §or);
PrepareDMAWrite(2, target, 512);
/*
while(InByte(0x03F4) & 0x80 == 0);
OutByte(0x0F, 0x03F5);
while(InByte(0x03F4) & 0x80 == 0);
OutByte(head, 0x03F5);
while(InByte(0x03F4) & 0x80 == 0);
OutByte(cylinder, 0x03F5);
*/
while(InByte(0x03F4) & 0x80 == 0);
OutByte(0x46, 0x03F5); /* Sektor lesen */
while(InByte(0x03F4) & 0x80 == 0);
OutByte(head << 2, 0x03F5); /* Head */
while(InByte(0x03F4) & 0x80 == 0);
OutByte(cylinder, 0x03F5); /* Cylinder */
while(InByte(0x03F4) & 0x80 == 0);
OutByte(head, 0x03F5); /* Head */
while(InByte(0x03F4) & 0x80 == 0);
OutByte(sector, 0x03F5); /* Sector */
while(InByte(0x03F4) & 0x80 == 0);
OutByte(2, 0x03F5); /* Sektorengrösse */
while(InByte(0x03F4) & 0x80 == 0);
OutByte(18, 0x03F5); /* Sektoren pro Spur */
while(InByte(0x03F4) & 0x80 == 0);
OutByte(0x1B, 0x03F5);
while(InByte(0x03F4) & 0x80 == 0);
OutByte(0xFF, 0x03F5);
WaitForFloppy();
while(InByte(0x03F4) & 0x80 == 0);
OutByte(0x00, 0x03F2);
PrintChar('!');
}
return ERROR_NO;
}
void WaitForFloppy()
{
while(operationDone == 0);
operationDone = 0;
}