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.
cu,
stefan2005
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.
Code: [Auswählen]
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

Übersicht
Wiki
Hilfe
Suche
Einloggen
Registrieren
Drucken

Gespeichert

