hi,
ich hab heute mal angefangen, einen kleinen Diskettentreiber zu schreiben (und so klein wie möglich zu halten).
Folgender Code funktioniert NUR mit Bochs, aber nicht auf einem Real-PC !
wieso ?
auf dem Real-PC hat es den Anschein, dass er zwar den Floppy-Motor ein und ausschalten kann, aber er keine Sektoren ließt, was unter Bochs aber prima funktioniert, aber wieso ?
Beim Real-PC hängt er sich auch nicht auf, sonder es sind einfach keine (richtigen) Daten im Buffer.
void SendCommand(unsigned char _byte)
{
while((inb(0x3F4) & 128) != 128) ; // warte, bis neue Befehle gesendet werden können
outb(0x3F5,_byte);
}
void MotorOn()
{
outb(0x3F2,28); // Enable Motor
Wait(500);
}
void MotorOff()
{
outb(0x3F2,0); // Disable Motor
}
void ReadSector(unsigned int _Sektor)
{
MotorOn();
ProgramDMA2();
SendCommand(0xE6); // ReadSector Command
SendCommand(0x00 | (FDC_LSNToHead(_Sektor) << 2)); // Head 0 , Drive 0
SendCommand(FDC_LSNToCylinder(_Sektor)); // Cylinder 0
SendCommand(FDC_LSNToHead(_Sektor)); // Head 0
SendCommand(FDC_LSNToSector(_Sektor)); // Sektor 0
SendCommand(0x02); // 512 Byte Sektor
SendCommand(0x12); // Sectors per Track
SendCommand(0x1B); // 3.5" Floppy
SendCommand(0x00);
WaitForIRQ06();
MotorOff();
}
void ProgramDMA2()
{
outb(0x08,0x14); // Disable DMA Controller
outb(0x0B,0x56); // Uses Channel 2
outb(0x0C,0x00); // Reset Flip-Flop
outb(0x04,(uint)Buffer & 0xFF); // Low Byte
outb(0x04,((uint)Buffer >> 8) & 0xFF); // High Byte
outb(0x81,((uint)Buffer >> 16) & 0xFF); // Page
outb(0x0C,0x00); // Reset Flip-Flop
outb(0x05,0xFF); // 1 Sektor (512 Byte)
outb(0x05,0x01);
outb(0x0A,0x02); // Release Channel
outb(0x08,0x10); // Enable DMA
}
cu,
stefan2005