Buffer IDE multiple-sector read commands.
This commit is contained in:
parent
69f0f7b01c
commit
59b5cf50dd
1 changed files with 44 additions and 12 deletions
56
src/ide.c
56
src/ide.c
|
|
@ -261,6 +261,9 @@ typedef struct IDE
|
||||||
uint32_t lba_addr;
|
uint32_t lba_addr;
|
||||||
int skip512;
|
int skip512;
|
||||||
int blocksize, blockcount;
|
int blocksize, blockcount;
|
||||||
|
uint8_t sector_buffer[256*512];
|
||||||
|
int do_initial_read;
|
||||||
|
int sector_pos;
|
||||||
} IDE;
|
} IDE;
|
||||||
|
|
||||||
IDE ide_drives[4];
|
IDE ide_drives[4];
|
||||||
|
|
@ -978,6 +981,7 @@ void writeide(int ide_board, uint16_t addr, uint8_t val)
|
||||||
timer_process();
|
timer_process();
|
||||||
idecallback[ide_board]=200*IDE_TIME;
|
idecallback[ide_board]=200*IDE_TIME;
|
||||||
timer_update_outstanding();
|
timer_update_outstanding();
|
||||||
|
ide->do_initial_read = 1;
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case WIN_WRITE_MULTIPLE:
|
case WIN_WRITE_MULTIPLE:
|
||||||
|
|
@ -1365,14 +1369,24 @@ void callbackide(int ide_board)
|
||||||
ide_set_signature(ide);
|
ide_set_signature(ide);
|
||||||
goto abort_cmd;
|
goto abort_cmd;
|
||||||
}
|
}
|
||||||
addr = ide_get_sector(ide) * 512;
|
if (ide->do_initial_read)
|
||||||
|
{
|
||||||
|
ide->do_initial_read = 0;
|
||||||
|
ide->sector_pos = 0;
|
||||||
|
addr = ide_get_sector(ide) * 512;
|
||||||
|
fseeko64(ide->hdfile, addr, SEEK_SET);
|
||||||
|
if (ide->secount)
|
||||||
|
fread(ide->sector_buffer, ide->secount*512, 1, ide->hdfile);
|
||||||
|
else
|
||||||
|
fread(ide->sector_buffer, 256*512, 1, ide->hdfile);
|
||||||
|
}
|
||||||
|
memcpy(ide->buffer, &ide->sector_buffer[ide->sector_pos*512], 512);
|
||||||
|
ide->sector_pos++;
|
||||||
// pclog("Read %i %i %i %08X\n",ide.cylinder,ide.head,ide.sector,addr);
|
// pclog("Read %i %i %i %08X\n",ide.cylinder,ide.head,ide.sector,addr);
|
||||||
/* if (ide.cylinder || ide.head)
|
/* if (ide.cylinder || ide.head)
|
||||||
{
|
{
|
||||||
fatal("Read from other cylinder/head");
|
fatal("Read from other cylinder/head");
|
||||||
}*/
|
}*/
|
||||||
fseeko64(ide->hdfile, addr, SEEK_SET);
|
|
||||||
fread(ide->buffer, 512, 1, ide->hdfile);
|
|
||||||
ide->pos=0;
|
ide->pos=0;
|
||||||
ide->atastat = DRQ_STAT | READY_STAT | DSC_STAT;
|
ide->atastat = DRQ_STAT | READY_STAT | DSC_STAT;
|
||||||
// pclog("Read sector callback %i %i %i offset %08X %i left %i %02X\n",ide.sector,ide.cylinder,ide.head,addr,ide.secount,ide.spt,ide.atastat[ide.board]);
|
// pclog("Read sector callback %i %i %i offset %08X %i left %i %02X\n",ide.sector,ide.cylinder,ide.head,addr,ide.secount,ide.spt,ide.atastat[ide.board]);
|
||||||
|
|
@ -1387,18 +1401,27 @@ void callbackide(int ide_board)
|
||||||
if (IDE_DRIVE_IS_CDROM(ide)) {
|
if (IDE_DRIVE_IS_CDROM(ide)) {
|
||||||
goto abort_cmd;
|
goto abort_cmd;
|
||||||
}
|
}
|
||||||
addr = ide_get_sector(ide) * 512;
|
if (ide->do_initial_read)
|
||||||
fseeko64(ide->hdfile, addr, SEEK_SET);
|
{
|
||||||
fread(ide->buffer, 512, 1, ide->hdfile);
|
ide->do_initial_read = 0;
|
||||||
|
ide->sector_pos = 0;
|
||||||
|
addr = ide_get_sector(ide) * 512;
|
||||||
|
fseeko64(ide->hdfile, addr, SEEK_SET);
|
||||||
|
if (ide->secount)
|
||||||
|
fread(ide->sector_buffer, ide->secount*512, 1, ide->hdfile);
|
||||||
|
else
|
||||||
|
fread(ide->sector_buffer, 256*512, 1, ide->hdfile);
|
||||||
|
}
|
||||||
ide->pos=0;
|
ide->pos=0;
|
||||||
|
|
||||||
if (ide_bus_master_read_sector)
|
if (ide_bus_master_read_sector)
|
||||||
{
|
{
|
||||||
if (ide_bus_master_read_sector(ide_board, (uint8_t *)ide->buffer))
|
if (ide_bus_master_read_sector(ide_board, &ide->sector_buffer[ide->sector_pos*512]))
|
||||||
idecallback[ide_board]=6*IDE_TIME; /*DMA not performed, try again later*/
|
idecallback[ide_board]=6*IDE_TIME; /*DMA not performed, try again later*/
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/*DMA successful*/
|
/*DMA successful*/
|
||||||
|
ide->sector_pos++;
|
||||||
ide->atastat = DRQ_STAT | READY_STAT | DSC_STAT;
|
ide->atastat = DRQ_STAT | READY_STAT | DSC_STAT;
|
||||||
|
|
||||||
ide->secount = (ide->secount - 1) & 0xff;
|
ide->secount = (ide->secount - 1) & 0xff;
|
||||||
|
|
@ -1423,10 +1446,19 @@ void callbackide(int ide_board)
|
||||||
if (IDE_DRIVE_IS_CDROM(ide)) {
|
if (IDE_DRIVE_IS_CDROM(ide)) {
|
||||||
goto abort_cmd;
|
goto abort_cmd;
|
||||||
}
|
}
|
||||||
addr = ide_get_sector(ide) * 512;
|
if (ide->do_initial_read)
|
||||||
// pclog("Read multiple from %08X %i (%i) %i\n", addr, ide->blockcount, ide->blocksize, ide->secount);
|
{
|
||||||
fseeko64(ide->hdfile, addr, SEEK_SET);
|
ide->do_initial_read = 0;
|
||||||
fread(ide->buffer, 512, 1, ide->hdfile);
|
ide->sector_pos = 0;
|
||||||
|
addr = ide_get_sector(ide) * 512;
|
||||||
|
fseeko64(ide->hdfile, addr, SEEK_SET);
|
||||||
|
if (ide->secount)
|
||||||
|
fread(ide->sector_buffer, ide->secount*512, 1, ide->hdfile);
|
||||||
|
else
|
||||||
|
fread(ide->sector_buffer, 256*512, 1, ide->hdfile);
|
||||||
|
}
|
||||||
|
memcpy(ide->buffer, &ide->sector_buffer[ide->sector_pos*512], 512);
|
||||||
|
ide->sector_pos++;
|
||||||
ide->pos=0;
|
ide->pos=0;
|
||||||
ide->atastat = DRQ_STAT | READY_STAT | DSC_STAT;
|
ide->atastat = DRQ_STAT | READY_STAT | DSC_STAT;
|
||||||
if (!ide->blockcount)// || ide->secount == 1)
|
if (!ide->blockcount)// || ide->secount == 1)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue