summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/ata/atahle.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/ata/atahle.cpp')
-rw-r--r--src/devices/bus/ata/atahle.cpp971
1 files changed, 0 insertions, 971 deletions
diff --git a/src/devices/bus/ata/atahle.cpp b/src/devices/bus/ata/atahle.cpp
deleted file mode 100644
index de38c9dd71e..00000000000
--- a/src/devices/bus/ata/atahle.cpp
+++ /dev/null
@@ -1,971 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:smf
-#include "emu.h"
-#include "atahle.h"
-
-#define VERBOSE 0
-#define PRINTF_IDE_COMMANDS 0
-
-#define LOG(x) do { if (VERBOSE) logerror x; } while (0)
-#define LOGPRINT(x) do { if (VERBOSE) logerror x; if (PRINTF_IDE_COMMANDS) osd_printf_debug x; } while (0)
-
-enum
-{
- IDE_CS0_DATA_RW = 0,
- IDE_CS0_ERROR_R = 1,
- IDE_CS0_FEATURE_W = 1,
- IDE_CS0_SECTOR_COUNT_RW = 2,
- IDE_CS0_SECTOR_NUMBER_RW = 3,
- IDE_CS0_CYLINDER_LOW_RW = 4,
- IDE_CS0_CYLINDER_HIGH_RW = 5,
- IDE_CS0_DEVICE_HEAD_RW = 6,
- IDE_CS0_STATUS_R = 7,
- IDE_CS0_COMMAND_W = 7
-};
-
-enum
-{
- IDE_CS1_ALTERNATE_STATUS_R = 6,
- IDE_CS1_DEVICE_CONTROL_W = 6,
- IDE_CS1_ACTIVE_STATUS = 7
-};
-
-enum
-{
- IDE_DEVICE_CONTROL_NIEN = 0x02,
- IDE_DEVICE_CONTROL_SRST = 0x04
-};
-
-#define DETECT_DEVICE1_TIME (attotime::from_msec(2))
-#define DEVICE1_PDIAG_TIME (attotime::from_msec(2))
-#define DIAGNOSTIC_TIME (attotime::from_msec(2))
-
-ata_hle_device::ata_hle_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
- : device_t(mconfig, type, tag, owner, clock),
- device_ata_interface(mconfig, *this),
- m_buffer_offset(0),
- m_buffer_size(0),
- m_error(0),
- m_feature(0),
- m_sector_count(0),
- m_sector_number(0),
- m_cylinder_low(0),
- m_cylinder_high(0),
- m_device_head(0),
- m_status(0),
- m_command(0),
- m_device_control(0),
- m_revert_to_defaults(true),
- m_8bit_data_transfers(false),
- m_csel(0),
- m_daspin(0),
- m_daspout(0),
- m_dmack(0),
- m_dmarq(0),
- m_irq(0),
- m_pdiagin(0),
- m_pdiagout(0),
- m_single_device(0),
- m_resetting(0), m_busy_timer(nullptr), m_buffer_empty_timer(nullptr)
-{
-}
-
-void ata_hle_device::device_start()
-{
- MINIMUM_COMMAND_TIME = attotime::from_usec(10);
-
- m_irq_handler.resolve_safe();
- m_dmarq_handler.resolve_safe();
- m_dasp_handler.resolve_safe();
- m_pdiag_handler.resolve_safe();
-
- m_buffer.resize(sector_length());
- save_item(NAME(m_buffer));
- save_item(NAME(m_buffer_offset));
- save_item(NAME(m_buffer_size));
- save_item(NAME(m_error));
- save_item(NAME(m_feature));
- save_item(NAME(m_sector_count));
- save_item(NAME(m_sector_number));
- save_item(NAME(m_cylinder_low));
- save_item(NAME(m_cylinder_high));
- save_item(NAME(m_device_head));
- save_item(NAME(m_status));
- save_item(NAME(m_command));
- save_item(NAME(m_device_control));
- save_item(NAME(m_revert_to_defaults));
-
- save_item(NAME(m_single_device));
- save_item(NAME(m_resetting));
-
- save_item(NAME(m_csel));
- save_item(NAME(m_daspin));
- save_item(NAME(m_daspout));
- save_item(NAME(m_dmack));
- save_item(NAME(m_dmarq));
- save_item(NAME(m_irq));
- save_item(NAME(m_pdiagin));
- save_item(NAME(m_pdiagout));
-
- save_item(NAME(m_identify_buffer));
-
- m_busy_timer = timer_alloc(TID_BUSY);
- m_buffer_empty_timer = timer_alloc(TID_BUFFER_EMPTY);
-}
-
-void ata_hle_device::device_reset()
-{
- /* reset the drive state */
- set_dasp(CLEAR_LINE);
- set_dmarq(CLEAR_LINE);
- set_irq(CLEAR_LINE);
- set_pdiag(CLEAR_LINE);
-
- m_status = 0;
- m_device_control = 0;
- m_resetting = true;
-
- if (m_csel == 0)
- {
- start_busy(DETECT_DEVICE1_TIME, PARAM_DETECT_DEVICE1);
- }
- else
- {
- set_dasp(ASSERT_LINE);
- soft_reset();
- }
-}
-
-void ata_hle_device::soft_reset()
-{
- m_buffer_offset = 0;
- m_buffer_size = 0;
- m_status = 0;
-
- if (is_ready())
- {
- m_status |= IDE_STATUS_DRDY;
- }
-
- start_busy(DIAGNOSTIC_TIME, PARAM_DIAGNOSTIC);
-}
-
-void ata_hle_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
-{
- switch(id)
- {
- case TID_BUSY:
- m_status &= ~IDE_STATUS_BSY;
-
- finished_busy(param);
- break;
- case TID_BUFFER_EMPTY:
- m_buffer_empty_timer->enable(false);
- fill_buffer();
- break;
- }
-}
-
-void ata_hle_device::finished_busy(int param)
-{
- switch (param)
- {
- case PARAM_DETECT_DEVICE1:
- m_single_device = (m_daspin == CLEAR_LINE);
- soft_reset();
- break;
-
- case PARAM_DIAGNOSTIC:
- start_diagnostic();
- break;
-
- case PARAM_WAIT_FOR_PDIAG:
- m_error |= IDE_ERROR_DIAGNOSTIC_DEVICE1_FAILED;
- finished_diagnostic();
- break;
-
- case PARAM_COMMAND:
- finished_command();
- break;
- }
-}
-
-void ata_hle_device::process_command()
-{
- switch (m_command)
- {
- case IDE_COMMAND_DIAGNOSTIC:
- start_busy(DIAGNOSTIC_TIME, PARAM_COMMAND);
- break;
-
- case IDE_COMMAND_SET_FEATURES:
- start_busy(MINIMUM_COMMAND_TIME, PARAM_COMMAND);
- break;
-
- case IDE_COMMAND_CACHE_FLUSH:
- start_busy(MINIMUM_COMMAND_TIME, PARAM_COMMAND);
- break;
-
- default:
- LOGPRINT(("IDE unknown command (%02X)\n", m_command));
- m_status |= IDE_STATUS_ERR;
- m_error = IDE_ERROR_ABRT;
- set_irq(ASSERT_LINE);
- //machine().debug_break();
- break;
- }
-}
-
-void ata_hle_device::finished_command()
-{
- switch (m_command)
- {
- case IDE_COMMAND_DIAGNOSTIC:
- start_diagnostic();
-
- if (m_csel == 0)
- set_irq(ASSERT_LINE);
- break;
-
- case IDE_COMMAND_SET_FEATURES:
- if (!set_features())
- {
- LOGPRINT(("IDE Set features failed (%02X %02X %02X %02X %02X)\n", m_feature, m_sector_count & 0xff, m_sector_number, m_cylinder_low, m_cylinder_high));
-
- m_status |= IDE_STATUS_ERR;
- m_error = IDE_ERROR_ABRT;
- }
- set_irq(ASSERT_LINE);
- break;
-
- case IDE_COMMAND_CACHE_FLUSH:
- m_status |= IDE_STATUS_DRDY;
- break;
-
- default:
- logerror( "finished_command() unhandled command %02x\n", m_command );
- break;
- }
-}
-
-bool ata_hle_device::set_dma_mode(int word)
-{
- if ((m_identify_buffer[word] >> (m_sector_count & 7)) & 1)
- {
- m_identify_buffer[62] &= 0xff;
- m_identify_buffer[63] &= 0xff;
- m_identify_buffer[88] &= 0xff;
-
- m_identify_buffer[word] |= 0x100 << (m_sector_count & 7);
- return true;
- }
-
- return false;
-}
-
-bool ata_hle_device::set_features()
-{
- switch (m_feature)
- {
- case IDE_SET_FEATURES_ENABLE_8BIT_DATA_TRANSFERS:
- m_8bit_data_transfers = true;
- return true;
-
- case IDE_SET_FEATURES_TRANSFER_MODE:
- switch (m_sector_count & IDE_TRANSFER_TYPE_MASK)
- {
- case IDE_TRANSFER_TYPE_PIO_DEFAULT:
- switch (m_sector_count & 7)
- {
- case 0:
- case 1:
- return true;
- }
- break;
-
- case IDE_TRANSFER_TYPE_PIO_FLOW_CONTROL:
- switch (m_sector_count & 7)
- {
- case 0:
- case 1:
- case 2:
- return true;
-
- default:
- if ((m_identify_buffer[64] >> ((m_sector_count & 7) - 3)) & 1)
- {
- return true;
- }
- }
- break;
-
- case IDE_TRANSFER_TYPE_SINGLE_WORD_DMA:
- return set_dma_mode(62);
-
- case IDE_TRANSFER_TYPE_MULTI_WORD_DMA:
- return set_dma_mode(63);
-
- case IDE_TRANSFER_TYPE_ULTRA_DMA:
- return set_dma_mode(88);
- }
- break;
-
- case IDE_SET_FEATURES_DISABLE_REVERTING_TO_POWER_ON_DEFAULTS:
- m_revert_to_defaults = false;
- return true;
-
- case IDE_SET_FEATURES_DISABLE_8BIT_DATA_TRANSFERS:
- m_8bit_data_transfers = false;
- return true;
-
- case IDE_SET_FEATURES_ENABLE_REVERTING_TO_POWER_ON_DEFAULTS:
- m_revert_to_defaults = true;
- return true;
- }
-
- return false;
-}
-
-int ata_hle_device::bit_to_mode(uint16_t word)
-{
- switch (word>>8)
- {
- case 0x01:
- return 0;
- case 0x02:
- return 1;
- case 0x04:
- return 2;
- case 0x08:
- return 3;
- case 0x10:
- return 4;
- case 0x20:
- return 5;
- case 0x40:
- return 6;
- case 0x080:
- return 7;
- }
-
- return -1;
-}
-
-// Return the currently selected single word dma mode, -1 if none selected
-int ata_hle_device::single_word_dma_mode()
-{
- return bit_to_mode(m_identify_buffer[62]);
-}
-
-// Return the currently selected multi word dma mode, -1 if none selected
-int ata_hle_device::multi_word_dma_mode()
-{
- return bit_to_mode(m_identify_buffer[63]);
-}
-
-// Return the currently selected ultra dma mode, -1 if none selected
-int ata_hle_device::ultra_dma_mode()
-{
- return bit_to_mode(m_identify_buffer[88]);
-}
-
-uint16_t ata_hle_device::read_data()
-{
- /* fetch the correct amount of data */
- uint16_t result = m_buffer[m_buffer_offset++];
- if (!m_8bit_data_transfers)
- result |= m_buffer[m_buffer_offset++] << 8;
-
- /* if we're at the end of the buffer, handle it */
- if (m_buffer_offset >= m_buffer_size)
- {
- LOG(("%s:IDE completed PIO read\n", machine().describe_context()));
- read_buffer_empty();
- }
-
- return result;
-}
-
-void ata_hle_device::write_data(uint16_t data)
-{
- /* store the correct amount of data */
- m_buffer[m_buffer_offset++] = data;
- if (!m_8bit_data_transfers)
- m_buffer[m_buffer_offset++] = data >> 8;
-
- /* if we're at the end of the buffer, handle it */
- if (m_buffer_offset >= m_buffer_size)
- {
- LOG(("%s:IDE completed PIO write\n", machine().describe_context()));
- write_buffer_full();
- }
-}
-
-void ata_hle_device::update_irq()
-{
- if (device_selected() && (m_device_control & IDE_DEVICE_CONTROL_NIEN) == 0)
- m_irq_handler(m_irq);
- else
- m_irq_handler(CLEAR_LINE);
-}
-
-void ata_hle_device::set_irq(int state)
-{
- if (m_irq != state)
- {
- m_irq = state;
-
- update_irq();
- }
-}
-
-void ata_hle_device::set_dmarq(int state)
-{
- if (m_dmarq != state)
- {
- m_dmarq = state;
-
- m_dmarq_handler(state);
- }
-}
-
-void ata_hle_device::set_dasp(int state)
-{
- if (m_daspout != state)
- {
- m_daspout = state;
-
- m_dasp_handler(state);
- }
-}
-
-void ata_hle_device::set_pdiag(int state)
-{
- if (m_pdiagout != state)
- {
- m_pdiagout = state;
-
- m_pdiag_handler(state);
- }
-}
-
-void ata_hle_device::start_busy(const attotime &time, int param)
-{
- m_status |= IDE_STATUS_BSY;
- m_busy_timer->adjust(time, param);
-}
-
-void ata_hle_device::stop_busy()
-{
- m_status &= ~IDE_STATUS_BSY;
- m_busy_timer->adjust(attotime::never);
-}
-
-void ata_hle_device::read_buffer_empty()
-{
- m_buffer_offset = 0;
-
- m_status &= ~IDE_STATUS_DRQ;
-
- if ((multi_word_dma_mode() >= 0) || (ultra_dma_mode() >= 0))
- set_dmarq(CLEAR_LINE);
-
- if (ultra_dma_mode() >= 0) {
- m_buffer_empty_timer->enable(true);
- m_buffer_empty_timer->adjust(attotime::zero);
- }
- else
- fill_buffer();
-}
-
-void ata_hle_device::write_buffer_full()
-{
- m_buffer_offset = 0;
-
- m_status &= ~IDE_STATUS_DRQ;
-
- if ((multi_word_dma_mode() >= 0) || (ultra_dma_mode() >= 0))
- set_dmarq(CLEAR_LINE);
-
- process_buffer();
-}
-
-void ata_hle_device::start_diagnostic()
-{
- m_error = IDE_ERROR_DIAGNOSTIC_FAILED;
-
- perform_diagnostic();
-
- if (m_csel == 1 && m_error == IDE_ERROR_DIAGNOSTIC_PASSED)
- set_pdiag(ASSERT_LINE);
-
- if (m_csel == 0 && !m_single_device && m_pdiagin == CLEAR_LINE)
- start_busy(DEVICE1_PDIAG_TIME, PARAM_WAIT_FOR_PDIAG);
- else
- finished_diagnostic();
-}
-
-void ata_hle_device::finished_diagnostic()
-{
- m_resetting = false;
-
- signature();
-}
-
-
-WRITE_LINE_MEMBER( ata_hle_device::write_csel )
-{
- m_csel = state;
-}
-
-WRITE_LINE_MEMBER( ata_hle_device::write_dasp )
-{
- m_daspin = state;
-}
-
-WRITE_LINE_MEMBER( ata_hle_device::write_dmack )
-{
- if (state && !m_dmack && single_word_dma_mode() >= 0)
- set_dmarq(CLEAR_LINE);
-
- m_dmack = state;
-}
-
-WRITE_LINE_MEMBER( ata_hle_device::write_pdiag )
-{
- m_pdiagin = state;
-
- if (m_pdiagin == ASSERT_LINE && m_busy_timer->param() == PARAM_WAIT_FOR_PDIAG)
- {
- stop_busy();
- finished_diagnostic();
- }
-}
-
-uint16_t ata_hle_device::read_dma()
-{
- uint16_t result = 0xffff;
-
- if (device_selected())
- {
- if (!m_dmack)
- {
- logerror( "%s: %s dev %d read_dma ignored (!DMACK)\n", machine().describe_context(), tag(), dev() );
- }
- else if (m_dmarq && single_word_dma_mode() >= 0)
- {
- logerror( "%s: %s dev %d read_dma ignored (DMARQ)\n", machine().describe_context(), tag(), dev() );
- }
- else if (!m_dmarq && multi_word_dma_mode() >= 0)
- {
- logerror( "%s: %s dev %d read_dma ignored (!DMARQ)\n", machine().describe_context(), tag(), dev() );
- }
- else if (!m_dmarq && ultra_dma_mode() >= 0)
- {
- logerror("%s: %s dev %d read_dma ignored (!DMARQ)\n", machine().describe_context(), tag(), dev());
- }
- else if (m_status & IDE_STATUS_BSY)
- {
- logerror( "%s: %s dev %d read_dma ignored (BSY)\n", machine().describe_context(), tag(), dev() );
- }
- else if (!(m_status & IDE_STATUS_DRQ))
- {
- logerror( "%s: %s dev %d read_dma ignored (!DRQ)\n", machine().describe_context(), tag(), dev() );
- }
- else
- {
- result = read_data();
-
- if ((m_status & IDE_STATUS_DRQ) && single_word_dma_mode() >= 0)
- set_dmarq(ASSERT_LINE);
- }
- }
-
- return result;
-}
-
-uint16_t ata_hle_device::read_cs0(offs_t offset, uint16_t mem_mask)
-{
- /* logit */
-// if (offset != IDE_CS0_DATA_RW && offset != IDE_CS0_STATUS_R)
- LOG(("%s:IDE cs0 read at %X, mem_mask=%X\n", machine().describe_context(), offset, mem_mask));
-
- uint16_t result = 0xffff;
-
- if (device_selected() || m_single_device)
- {
- if (m_dmack)
- {
- logerror( "%s: %s dev %d read_cs0 %04x %04x ignored (DMACK)\n", machine().describe_context(), tag(), dev(), offset, mem_mask );
- }
- else if ((m_status & IDE_STATUS_BSY) && offset != IDE_CS0_STATUS_R)
- {
- // ATA5 spec says status reads should also go through here, but this breaks Primal Rage 2.
- // Real hardware might work due to read ahead in the vt83c461.
- if (device_selected())
- {
- switch (offset)
- {
- case IDE_CS0_DATA_RW:
- logerror( "%s: %s dev %d read_cs0 %04x %04x ignored (BSY)\n", machine().describe_context(), tag(), dev(), offset, mem_mask );
- break;
-
- default:
- result = calculate_status();
- break;
- }
- }
- else
- {
- result = 0;
- }
- }
- else
- {
- switch (offset)
- {
- /* read data if there's data to be read */
- case IDE_CS0_DATA_RW:
- if (device_selected())
- {
- if (!(m_status & IDE_STATUS_DRQ))
- {
- logerror( "%s: %s dev %d read_cs0 ignored (!DRQ)\n", machine().describe_context(), tag(), dev() );
- }
- else
- {
- result = read_data();
- }
- }
- else
- {
- result = 0;
- }
- break;
-
- /* return the current error */
- case IDE_CS0_ERROR_R:
- result = m_error;
- break;
-
- /* return the current sector count */
- case IDE_CS0_SECTOR_COUNT_RW:
- result = m_sector_count;
- break;
-
- /* return the current sector */
- case IDE_CS0_SECTOR_NUMBER_RW:
- result = m_sector_number;
- break;
-
- /* return the current cylinder LSB */
- case IDE_CS0_CYLINDER_LOW_RW:
- result = m_cylinder_low;
- break;
-
- /* return the current cylinder MSB */
- case IDE_CS0_CYLINDER_HIGH_RW:
- result = m_cylinder_high;
- break;
-
- /* return the current head */
- case IDE_CS0_DEVICE_HEAD_RW:
- result = m_device_head;
- break;
-
- /* return the current status and clear any pending interrupts */
- case IDE_CS0_STATUS_R:
- if (device_selected())
- {
- result = calculate_status();
-
- if (!(m_status & IDE_STATUS_DRDY) && is_ready())
- m_status |= IDE_STATUS_DRDY;
-
- set_irq(CLEAR_LINE);
- }
- else
- {
- result = 0;
- }
- break;
-
- /* log anything else */
- default:
- logerror("%s:unknown IDE cs0 read at %03X, mem_mask=%X\n", machine().describe_context(), offset, mem_mask);
- break;
- }
- }
- }
-
- /* return the result */
- return result;
-}
-
-
-uint16_t ata_hle_device::read_cs1(offs_t offset, uint16_t mem_mask)
-{
- /* logit */
-// if (offset != IDE_CS1_ALTERNATE_STATUS_R)
- LOG(("%s:IDE cs1 read at %X, mem_mask=%d\n", machine().describe_context(), offset, mem_mask));
-
- uint16_t result = 0xffff;
-
- if (device_selected() || m_single_device)
- {
- if (m_dmack)
- {
- logerror( "%s: %s dev %d read_cs1 %04x %04x ignored (DMACK)\n", machine().describe_context(), tag(), dev(), offset, mem_mask );
- }
- else
- {
- switch (offset)
- {
- case IDE_CS1_ALTERNATE_STATUS_R:
- if (device_selected())
- {
- result = calculate_status();
- }
- else
- {
- result = 0;
- }
- break;
-
- case IDE_CS1_ACTIVE_STATUS:
- /*
-
- bit description
-
- 0 master active
- 1 slave active
- 2 complement of active disk head bit 0
- 3 complement of active disk head bit 1
- 4 complement of active disk head bit 2
- 5 complement of active disk head bit 3
- 6 write in progress
- 7 floppy present (unused)
-
- */
- if (device_selected())
- {
- result = 0x01;
- }
- else
- {
- result = 0;
- }
- break;
-
- /* log anything else */
- default:
- logerror("%s:unknown IDE cs1 read at %03X, mem_mask=%d\n", machine().describe_context(), offset, mem_mask);
- break;
- }
- }
- }
-
- /* return the result */
- return result;
-}
-
-void ata_hle_device::write_dma( uint16_t data )
-{
- if (device_selected())
- {
- if (!m_dmack)
- {
- logerror( "%s: %s dev %d write_dma %04x ignored (!DMACK)\n", machine().describe_context(), tag(), dev(), data );
- }
- else if (m_dmarq && single_word_dma_mode() >= 0)
- {
- logerror( "%s: %s dev %d write_dma %04x ignored (DMARQ)\n", machine().describe_context(), tag(), dev(), data );
- }
- else if (!m_dmarq && multi_word_dma_mode() >= 0)
- {
- logerror( "%s: %s dev %d write_dma %04x ignored (!DMARQ)\n", machine().describe_context(), tag(), dev(), data );
- }
- else if (!m_dmarq && ultra_dma_mode() >= 0)
- {
- logerror("%s: %s dev %d write_dma %04x ignored (!DMARQ)\n", machine().describe_context(), tag(), dev(), data);
- }
- else if (m_status & IDE_STATUS_BSY)
- {
- logerror( "%s: %s dev %d write_dma %04x ignored (BSY)\n", machine().describe_context(), tag(), dev(), data );
- }
- else if (!(m_status & IDE_STATUS_DRQ))
- {
- logerror( "%s: %s dev %d write_dma %04x ignored (!DRQ)\n", machine().describe_context(), tag(), dev(), data );
- }
- else
- {
- write_data(data);
-
- if ((m_status & IDE_STATUS_DRQ) && single_word_dma_mode() >= 0)
- set_dmarq(ASSERT_LINE);
- }
- }
-}
-
-void ata_hle_device::write_cs0(offs_t offset, uint16_t data, uint16_t mem_mask)
-{
- /* logit */
- if (offset != IDE_CS0_DATA_RW)
- LOG(("%s:IDE cs0 write to %X = %08X, mem_mask=%d\n", machine().describe_context(), offset, data, mem_mask));
-
- if (m_dmack)
- {
- logerror( "%s: %s dev %d write_cs0 %04x %04x %04x ignored (DMACK)\n", machine().describe_context(), tag(), dev(), offset, data, mem_mask );
- }
- else if ((m_status & IDE_STATUS_BSY) && offset != IDE_CS0_COMMAND_W)
- {
- logerror( "%s: %s dev %d write_cs0 %04x %04x %04x ignored (BSY) command %02x\n", machine().describe_context(), tag(), dev(), offset, data, mem_mask, m_command );
- }
- else if ((m_status & IDE_STATUS_DRQ) && offset != IDE_CS0_DATA_RW && offset != IDE_CS0_COMMAND_W)
- {
- logerror( "%s: %s dev %d write_cs0 %04x %04x %04x ignored (DRQ) command %02x\n", machine().describe_context(), tag(), dev(), offset, data, mem_mask, m_command );
- }
- else
- {
- uint8_t old;
-
- switch (offset)
- {
- /* write data */
- case IDE_CS0_DATA_RW:
- if (device_selected())
- {
- if (!(m_status & IDE_STATUS_DRQ))
- {
- logerror( "%s: %s dev %d write_cs0 %04x %04x %04x ignored (!DRQ)\n", machine().describe_context(), tag(), dev(), offset, data, mem_mask );
- }
- else
- {
- write_data(data);
- }
- }
- break;
-
- case IDE_CS0_FEATURE_W:
- m_feature = data;
- break;
-
- /* sector count */
- case IDE_CS0_SECTOR_COUNT_RW:
- m_sector_count = (data & 0xff) ? (data & 0xff) : 0x100;
- break;
-
- /* current sector */
- case IDE_CS0_SECTOR_NUMBER_RW:
- m_sector_number = data;
- break;
-
- /* current cylinder LSB */
- case IDE_CS0_CYLINDER_LOW_RW:
- m_cylinder_low = data;
- break;
-
- /* current cylinder MSB */
- case IDE_CS0_CYLINDER_HIGH_RW:
- m_cylinder_high = data;
- break;
-
- /* current head */
- case IDE_CS0_DEVICE_HEAD_RW:
- old = m_device_head;
- m_device_head = data;
-
- if ((m_device_head ^ old) & IDE_DEVICE_HEAD_DRV)
- update_irq();
- break;
-
- /* command */
- case IDE_CS0_COMMAND_W:
- // Packet devices can accept DEVICE RESET when BSY or DRQ is set.
- if (m_status & IDE_STATUS_BSY)
- {
- logerror( "%s: %s dev %d write_cs0 %04x %04x %04x ignored (BSY) command %02x\n", machine().describe_context(), tag(), dev(), offset, data, mem_mask, m_command );
- }
- else if (m_status & IDE_STATUS_DRQ)
- {
- logerror( "%s: %s dev %d write_cs0 %04x %04x %04x ignored (DRQ) command %02x\n", machine().describe_context(), tag(), dev(), offset, data, mem_mask, m_command );
- }
- else if (device_selected() || m_command == IDE_COMMAND_DIAGNOSTIC)
- {
- m_command = data;
-
- /* implicitly clear interrupts & dmarq here */
- set_irq(CLEAR_LINE);
- set_dmarq(CLEAR_LINE);
-
- m_buffer_offset = 0;
-
- set_dasp(CLEAR_LINE);
- m_status &= ~IDE_STATUS_DRQ;
- m_status &= ~IDE_STATUS_ERR;
-
- process_command();
- }
- break;
-
- default:
- logerror("%s:unknown IDE cs0 write at %03X = %04x, mem_mask=%d\n", machine().describe_context(), offset, data, mem_mask);
- break;
- }
- }
-}
-
-void ata_hle_device::write_cs1(offs_t offset, uint16_t data, uint16_t mem_mask)
-{
- /* logit */
- LOG(("%s:IDE cs1 write to %X = %08X, mem_mask=%d\n", machine().describe_context(), offset, data, mem_mask));
-
- if (m_dmack)
- {
- logerror( "%s: %s dev %d write_cs1 %04x %04x %04x ignored (DMACK)\n", machine().describe_context(), tag(), dev(), offset, data, mem_mask );
- }
- else
- {
- uint8_t old;
-
- switch (offset)
- {
- /* adapter control */
- case IDE_CS1_DEVICE_CONTROL_W:
- old = m_device_control;
- m_device_control = data;
-
- if ((m_device_control ^ old) & IDE_DEVICE_CONTROL_NIEN)
- update_irq();
-
- if ((m_device_control ^ old) & IDE_DEVICE_CONTROL_SRST)
- {
- if (m_device_control & IDE_DEVICE_CONTROL_SRST)
- {
- if (m_resetting)
- {
- logerror( "%s: %s dev %d write_cs1 %04x %04x %04x ignored (RESET)\n", machine().describe_context(), tag(), dev(), offset, data, mem_mask );
- }
- else
- {
- set_dasp(CLEAR_LINE);
- set_dmarq(CLEAR_LINE);
- set_irq(CLEAR_LINE);
- set_pdiag(CLEAR_LINE);
-
- start_busy(attotime::never, PARAM_RESET);
- }
- }
- else if (m_busy_timer->param() == PARAM_RESET)
- {
- soft_reset();
- }
- }
- break;
-
- default:
- logerror("%s:unknown IDE cs1 write at %03X = %04x, mem_mask=%d\n", machine().describe_context(), offset, data, mem_mask);
- break;
- }
- }
-}