floppy dont works on vmware
Posted: Wed Jun 01, 2005 12:10 pm
Hello, i have written a simple floppy driver to read data from floppy. It works properly with Qemu but on Vmware it doesnt work.
Code: Select all
//
// Initialize DMA for write / read access
//
BOOLEAN DmaInitialize(DWORD Address,
BYTE Channel,
DWORD Mode,
WORD Size)
{
_asm cli
if (Channel == DMA_CHANNEL_FLOPPY)
{
WRITE_PORT_UCHAR(0x0A, 0x06);
}
else
{
_asm sti
return FALSE;
}
//
// Reset Flip-Flop
//
WRITE_PORT_UCHAR(0x0c, 0);
//
// Transfer memory to device
//
if (Mode == DMA_MODE_READ)
{
if (Channel == DMA_CHANNEL_FLOPPY)
{
WRITE_PORT_UCHAR(0x0b, 0x5a);
}
}
//
// Transfer device to memory
//
else if(Mode == DMA_MODE_WRITE)
{
if (Channel == DMA_CHANNEL_FLOPPY)
{
WRITE_PORT_UCHAR(0x0b, 0x56);
}
}
//
// Set the memory page
//
WRITE_PORT_UCHAR(0x81, Address >> 16);
//
// Set low byte of the offset
//
WRITE_PORT_UCHAR(0x04, (Address & 0xffff) & 0xFF);
//
// Set high byte of the offset
//
WRITE_PORT_UCHAR(0x04, (Address & 0xffff) >> 8);
//
// Set low byte of the size
//
WRITE_PORT_UCHAR(0x05, Size & 0xff);
//
// Set high byte of the offset
//
WRITE_PORT_UCHAR(0x05, Size >> 8);
//
// Clear channel mask
//
if (Channel == DMA_CHANNEL_FLOPPY)
{
WRITE_PORT_UCHAR(0x0a, 2);
}
_asm sti
return TRUE;
}
BOOLEAN FdcIsReady()
{
//
// read from main status register
//
BYTE State = READ_PORT_UCHAR(FDC_MSR);
//
// if data register ready
//
if ( (State & 0xc0) == 0x80 )
return TRUE;
else
return FALSE;
}
//
// Stops the system till floppy is ready
//
VOID FdcWaitForReady()
{
while (TRUE)
{
if (FdcIsReady())
break;
}
}
VOID FdcReadSector(BYTE Sector, BYTE Track, BYTE Head)
{
BYTE Command[9];
WRITE_PORT_UCHAR(FDC_DOR, 0x1c);
Command[0] = 0x46;
Command[1] = 0;
Command[2] = Track;
Command[3] = Head;
Command[4] = Sector;
Command[5] = 0x02;
Command[6] = 0x12;
Command[7] = 0x18;
Command[8] = 0x00;
for (ULONG i = 0; i < 9; i++)
FdcWriteByte(Command[i]);
WRITE_PORT_UCHAR(FDC_DOR, 0);
}