From 103bdacfaab77bba8b033ea6b6bd14d624bc4c4e Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 23 Mar 2020 09:00:44 +0100 Subject: [PATCH] IDE changes and ported the IDE commit from PCem. --- src/disk/hdc_ide.c | 32 +++++++++++++++++++++++++++++++- src/disk/hdc_ide_sff8038i.c | 13 +++++++++++-- src/disk/hdc_st506_at.c | 2 +- 3 files changed, 43 insertions(+), 4 deletions(-) diff --git a/src/disk/hdc_ide.c b/src/disk/hdc_ide.c index 5ec684bc7..78f612460 100644 --- a/src/disk/hdc_ide.c +++ b/src/disk/hdc_ide.c @@ -278,6 +278,8 @@ ide_irq_raise(ide_t *ide) /* ide_log("Raising IRQ %i (board %i)\n", ide_boards[ide->board]->irq, ide->board); */ + ide_log("IDE %i: IRQ raise\n", ide->board); + if (!(ide->fdisk & 2)) { if (ide_bm[ide->board] && ide_bm[ide->board]->set_irq) ide_bm[ide->board]->set_irq(ide->board | 0x40, ide_bm[ide->board]->priv); @@ -298,6 +300,8 @@ ide_irq_lower(ide_t *ide) /* ide_log("Lowering IRQ %i (board %i)\n", ide_boards[ide->board]->irq, ide->board); */ + ide_log("IDE %i: IRQ lower\n", ide->board); + if (ide->irqstat) { if (ide_bm[ide->board] && ide_bm[ide->board]->set_irq) ide_bm[ide->board]->set_irq(ide->board, ide_bm[ide->board]->priv); @@ -318,6 +322,7 @@ ide_irq_update(ide_t *ide) /* ide_log("Raising IRQ %i (board %i)\n", ide_boards[ide->board]->irq, ide->board); */ if (!(ide->fdisk & 2) && ide->irqstat) { + ide_log("IDE %i: IRQ update raise\n", ide->board); if (ide_bm[ide->board] && ide_bm[ide->board]->set_irq) { ide_bm[ide->board]->set_irq(ide->board, ide_bm[ide->board]->priv); ide_bm[ide->board]->set_irq(ide->board | 0x40, ide_bm[ide->board]->priv); @@ -326,6 +331,7 @@ ide_irq_update(ide_t *ide) picint(1 << ide_boards[ide->board]->irq); } } else if (ide->fdisk & 2) { + ide_log("IDE %i: IRQ update lower\n", ide->board); if (ide_bm[ide->board] && ide_bm[ide->board]->set_irq) ide_bm[ide->board]->set_irq(ide->board, ide_bm[ide->board]->priv); else if (ide_boards[ide->board]->irq != -1) @@ -877,11 +883,17 @@ ide_atapi_callback(ide_t *ide) switch(ide->sc->packet_status) { case PHASE_IDLE: +#ifdef ENABLE_IDE_LOG + ide_log("PHASE_IDLE\n"); +#endif ide->sc->pos = 0; ide->sc->phase = 1; ide->sc->status = READY_STAT | DRQ_STAT | (ide->sc->status & ERR_STAT); return; case PHASE_COMMAND: +#ifdef ENABLE_IDE_LOG + ide_log("PHASE_COMMAND\n"); +#endif ide->sc->status = BUSY_STAT | (ide->sc->status & ERR_STAT); if (ide->packet_command) { ide->packet_command(ide->sc, ide->sc->atapi_cdb); @@ -890,6 +902,9 @@ ide_atapi_callback(ide_t *ide) } return; case PHASE_COMPLETE: +#ifdef ENABLE_IDE_LOG + ide_log("PHASE_COMPLETE\n"); +#endif ide->sc->status = READY_STAT; ide->sc->phase = 3; ide->sc->packet_status = PHASE_NONE; @@ -897,12 +912,18 @@ ide_atapi_callback(ide_t *ide) return; case PHASE_DATA_IN: case PHASE_DATA_OUT: +#ifdef ENABLE_IDE_LOG + ide_log("PHASE_DATA_IN or PHASE_DATA_OUT\n"); +#endif ide->sc->status = READY_STAT | DRQ_STAT | (ide->sc->status & ERR_STAT); ide->sc->phase = !(ide->sc->packet_status & 0x01) << 1; ide_irq_raise(ide); return; case PHASE_DATA_IN_DMA: case PHASE_DATA_OUT_DMA: +#ifdef ENABLE_IDE_LOG + ide_log("PHASE_DATA_IN_DMA or PHASE_DATA_OUT_DMA\n"); +#endif out = (ide->sc->packet_status & 0x01); if (ide_bm[ide->board] && ide_bm[ide->board]->dma) { @@ -932,11 +953,17 @@ ide_atapi_callback(ide_t *ide) return; case PHASE_ERROR: +#ifdef ENABLE_IDE_LOG + ide_log("PHASE_ERROR\n"); +#endif ide->sc->status = READY_STAT | ERR_STAT; ide->sc->phase = 3; ide->sc->packet_status = PHASE_NONE; ide_irq_raise(ide); return; + default: + ide_log("PHASE_UNKNOWN %02X\n", ide->sc->packet_status); + return; } } @@ -1001,6 +1028,9 @@ ide_atapi_packet_read(ide_t *ide, int length) if (!dev || !dev->temp_buffer || (dev->packet_status != PHASE_DATA_IN)) return 0; + if (dev->packet_status == PHASE_DATA_IN) + ide_log("PHASE_DATA_IN read: %i, %i< %i, %i\n", dev->request_pos, dev->max_transfer_len, dev->pos, dev->packet_len); + bufferw = (uint16_t *) dev->temp_buffer; bufferl = (uint32_t *) dev->temp_buffer; @@ -1689,7 +1719,7 @@ ide_read_data(ide_t *ide, int length) ide->secount = (ide->secount - 1) & 0xff; if (ide->secount) { ide_next_sector(ide); - ide->atastat = BSY_STAT; + ide->atastat = BSY_STAT | READY_STAT | DSC_STAT; if (ide->command == WIN_READ_MULTIPLE) ide_callback(ide_boards[ide->board]); else diff --git a/src/disk/hdc_ide_sff8038i.c b/src/disk/hdc_ide_sff8038i.c index 2c58042ae..5e2b19e8d 100644 --- a/src/disk/hdc_ide_sff8038i.c +++ b/src/disk/hdc_ide_sff8038i.c @@ -373,14 +373,16 @@ sff_bus_master_set_irq(int channel, void *priv) channel &= 0x01; if (dev->status & 0x04) { - if ((dev->irq_mode == 2) && (channel & 1) && pci_use_mirq(0)) + sff_log("SFF8038i: Channel %i IRQ raise\n", channel); + if ((dev->irq_mode == 2) && channel && pci_use_mirq(0)) pci_set_mirq(0, 0); else if (dev->irq_mode == 1) pci_set_irq(dev->slot, dev->irq_pin); else picint(1 << (14 + channel)); } else { - if ((dev->irq_mode == 2) && (channel & 1) && pci_use_mirq(0)) + sff_log("SFF8038i: Channel %i IRQ lower\n", channel); + if ((dev->irq_mode == 2) && channel && pci_use_mirq(0)) pci_clear_mirq(0, 0); else if (dev->irq_mode == 1) pci_clear_irq(dev->slot, dev->irq_pin); @@ -419,6 +421,10 @@ sff_reset(void *p) { int i = 0; +#ifdef ENABLE_SFF_LOG + sff_log("SFF8038i: Reset\n"); +#endif + for (i = 0; i < CDROM_NUM; i++) { if ((cdrom[i].bus_type == CDROM_BUS_ATAPI) && (cdrom[i].ide_channel < 4) && cdrom[i].priv) @@ -429,6 +435,9 @@ sff_reset(void *p) (zip_drives[i].ide_channel < 4) && zip_drives[i].priv) zip_reset((scsi_common_t *) zip_drives[i].priv); } + + sff_bus_master_set_irq(0x00, p); + sff_bus_master_set_irq(0x01, p); } diff --git a/src/disk/hdc_st506_at.c b/src/disk/hdc_st506_at.c index a6da77d30..8f29d4fa4 100644 --- a/src/disk/hdc_st506_at.c +++ b/src/disk/hdc_st506_at.c @@ -463,7 +463,7 @@ mfm_readw(uint16_t port, void *priv) mfm->secount = (mfm->secount - 1) & 0xff; if (mfm->secount) { next_sector(mfm); - mfm->status = STAT_BUSY; + mfm->status = STAT_BUSY | STAT_READY | STAT_DSC; timer_set_delay_u64(&mfm->callback_timer, SECTOR_TIME); } else ui_sb_update_icon(SB_HDD|HDD_BUS_MFM, 0);