Autor Thema: FDC Treiber läuft nur unter Bochs  (Gelesen 4767 mal)

Homix

  • Beiträge: 138
    • Profil anzeigen
Gespeichert
« am: 06. May 2005, 22:16 »
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

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #1 am: 06. May 2005, 22:18 »
bei mir auch so, meinen code haste ja schon ;)
vielleicht liegt es daran, dass du kein "seek"-command ausführst!
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

 

Einloggen