mirror of
https://github.com/86Box/86Box.git
synced 2026-02-21 17:15:32 -07:00
IDE: Some fixes - it now works on the Intel Monsoon.
This commit is contained in:
@@ -1603,10 +1603,12 @@ ide_writeb(uint16_t addr, uint8_t val, void *priv)
|
||||
int ch;
|
||||
int bad = 0;
|
||||
int reset = 0;
|
||||
int prev;
|
||||
|
||||
ch = dev->cur_dev;
|
||||
ide = ide_drives[ch];
|
||||
ide_other = ide_drives[ch ^ 1];
|
||||
prev = ide->command;
|
||||
|
||||
ide_log("[%04X:%08X] ide_writeb(%04X, %02X, %08X)\n", CS, cpu_state.pc, addr, val, priv);
|
||||
|
||||
@@ -1649,37 +1651,31 @@ ide_writeb(uint16_t addr, uint8_t val, void *priv)
|
||||
break;
|
||||
|
||||
case 0x4: /* Cylinder low */
|
||||
if (ide->type & IDE_SHADOW)
|
||||
break;
|
||||
|
||||
if (!(ide->tf->atastat & (BSY_STAT | DRQ_STAT))) {
|
||||
if (!(ide->type & IDE_SHADOW) && !(ide->tf->atastat & (BSY_STAT | DRQ_STAT))) {
|
||||
ide->tf->cylinder = (ide->tf->cylinder & 0xff00) | val;
|
||||
ide->lba_addr = (ide->lba_addr & 0xfff00ff) | (val << 8);
|
||||
}
|
||||
|
||||
if (!(ide_other->tf->atastat & (BSY_STAT | DRQ_STAT))) {
|
||||
if (!(ide_other->type & IDE_SHADOW) && !(ide_other->tf->atastat & (BSY_STAT | DRQ_STAT))) {
|
||||
ide_other->tf->cylinder = (ide_other->tf->cylinder & 0xff00) | val;
|
||||
ide_other->lba_addr = (ide_other->lba_addr & 0xfff00ff) | (val << 8);
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x5: /* Cylinder high */
|
||||
if (ide->type & IDE_SHADOW)
|
||||
break;
|
||||
|
||||
if (!(ide->tf->atastat & (BSY_STAT | DRQ_STAT))) {
|
||||
if (!(ide->type & IDE_SHADOW) && !(ide->tf->atastat & (BSY_STAT | DRQ_STAT))) {
|
||||
ide->tf->cylinder = (ide->tf->cylinder & 0xff) | (val << 8);
|
||||
ide->lba_addr = (ide->lba_addr & 0xf00ffff) | (val << 16);
|
||||
}
|
||||
|
||||
if (!(ide_other->tf->atastat & (BSY_STAT | DRQ_STAT))) {
|
||||
if (!(ide_other->type & IDE_SHADOW) && !(ide_other->tf->atastat & (BSY_STAT | DRQ_STAT))) {
|
||||
ide_other->tf->cylinder = (ide_other->tf->cylinder & 0xff) | (val << 8);
|
||||
ide_other->lba_addr = (ide_other->lba_addr & 0xf00ffff) | (val << 16);
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x6: /* Drive/Head */
|
||||
if (ch != ((val >> 4) & 1) + (ide->board << 1)) {
|
||||
if (ch != (((val >> 4) & 1) + (ide->board << 1))) {
|
||||
if (!ide->reset && !ide_other->reset && ide->irqstat) {
|
||||
ide_irq_lower(ide);
|
||||
ide->irqstat = 1;
|
||||
@@ -1786,7 +1782,13 @@ ide_writeb(uint16_t addr, uint8_t val, void *priv)
|
||||
ui_sb_update_icon(SB_HDD | hdd[ide->hdd_num].bus_type, 1);
|
||||
uint32_t sec_count;
|
||||
double wait_time;
|
||||
if ((val == WIN_READ_DMA) || (val == WIN_READ_DMA_ALT)) {
|
||||
if ((val == WIN_READ) && (prev == WIN_SETIDLE1)) {
|
||||
/* Do the callback instantly - this happens on the Intel Monsoon. */
|
||||
(void) hdd_timing_read(&hdd[ide->hdd_num], ide_get_sector(ide), 1);
|
||||
ide->do_initial_read = 1;
|
||||
ide_callback(ide);
|
||||
break;
|
||||
} else if ((val == WIN_READ_DMA) || (val == WIN_READ_DMA_ALT)) {
|
||||
/* TODO: Make DMA timing more accurate. */
|
||||
sec_count = ide->tf->secount ? ide->tf->secount : 256;
|
||||
double seek_time = hdd_timing_read(&hdd[ide->hdd_num],
|
||||
@@ -2346,6 +2348,7 @@ ide_callback(void *priv)
|
||||
|
||||
case WIN_READ:
|
||||
case WIN_READ_NORETRY:
|
||||
ide_log("IDE(%d) read(%d,%d,%d)\n", ide->channel, ide->tf->cylinder, ide->tf->head, ide->tf->sector);
|
||||
if (ide->type == IDE_ATAPI) {
|
||||
ide_set_signature(ide);
|
||||
err = ABRT_ERR;
|
||||
|
||||
Reference in New Issue
Block a user