From d890319806a9ed64215a55f2e52d077c0a56a33b Mon Sep 17 00:00:00 2001 From: Ted Green Date: Sat, 6 Apr 2019 12:13:48 -0600 Subject: Add ability to throttle HDD DMA transfer speed. Fixes MT07242 --- src/devices/machine/atahle.cpp | 4 ++-- src/devices/machine/idectrl.cpp | 22 +++++++++++++--------- src/devices/machine/idehd.cpp | 30 +++++++++++++++++------------- src/devices/machine/idehd.h | 3 +++ src/mame/drivers/vegas.cpp | 8 ++++++++ 5 files changed, 43 insertions(+), 24 deletions(-) diff --git a/src/devices/machine/atahle.cpp b/src/devices/machine/atahle.cpp index 03868b78c10..de38c9dd71e 100644 --- a/src/devices/machine/atahle.cpp +++ b/src/devices/machine/atahle.cpp @@ -588,7 +588,7 @@ 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=%d\n", machine().describe_context(), offset, mem_mask)); + LOG(("%s:IDE cs0 read at %X, mem_mask=%X\n", machine().describe_context(), offset, mem_mask)); uint16_t result = 0xffff; @@ -692,7 +692,7 @@ uint16_t ata_hle_device::read_cs0(offs_t offset, uint16_t mem_mask) /* log anything else */ default: - logerror("%s:unknown IDE cs0 read at %03X, mem_mask=%d\n", machine().describe_context(), offset, mem_mask); + logerror("%s:unknown IDE cs0 read at %03X, mem_mask=%X\n", machine().describe_context(), offset, mem_mask); break; } } diff --git a/src/devices/machine/idectrl.cpp b/src/devices/machine/idectrl.cpp index 45f6ab6f703..b8157820ab4 100644 --- a/src/devices/machine/idectrl.cpp +++ b/src/devices/machine/idectrl.cpp @@ -284,20 +284,25 @@ void bus_master_ide_controller_device::set_dmarq(int state) READ32_MEMBER( bus_master_ide_controller_device::bmdma_r ) { - LOG("%s:ide_bus_master32_r(%d, %08x)\n", machine().describe_context(), offset, mem_mask); - + uint32_t result = 0; switch( offset ) { case 0: /* command register/status register */ - return m_bus_master_command | (m_bus_master_status << 16); - + result = m_bus_master_command | (m_bus_master_status << 16); + break; case 1: /* descriptor table register */ - return m_bus_master_descriptor; + result = m_bus_master_descriptor; + break; + default: + result = 0xffffffff; + break; } - return 0xffffffff; + LOG("%s:ide_bus_master32_r(%d, %08x, %08x)\n", machine().describe_context(), offset, mem_mask, result); + + return result; } @@ -396,8 +401,7 @@ void bus_master_ide_controller_device::execute_dma() m_dma_bytes_left &= 0xfffe; if (m_dma_bytes_left == 0) m_dma_bytes_left = 0x10000; - -// LOG("New DMA descriptor: address = %08X bytes = %04X last = %d\n", m_dma_address, m_dma_bytes_left, m_dma_last_buffer); + LOG("New DMA descriptor: address = %08X bytes = %04X last = %d time: %s\n", m_dma_address, m_dma_bytes_left, m_dma_last_buffer, machine().time().as_string()); } if (m_bus_master_command & 8) @@ -424,7 +428,7 @@ void bus_master_ide_controller_device::execute_dma() if (m_dma_bytes_left == 0 && m_dma_last_buffer) { m_bus_master_status &= ~IDE_BUSMASTER_STATUS_ACTIVE; - + LOG("DMA Complete time: %s\n", machine().time().as_string()); if (m_dmarq) { LOG("DMA Out of buffer space!\n"); diff --git a/src/devices/machine/idehd.cpp b/src/devices/machine/idehd.cpp index 1f4be38d491..e0ce5098e9a 100644 --- a/src/devices/machine/idehd.cpp +++ b/src/devices/machine/idehd.cpp @@ -27,7 +27,8 @@ ata_mass_storage_device::ata_mass_storage_device(const machine_config &mconfig, m_num_sectors(0), m_num_heads(0), m_cur_lba(0), m_block_count(0), m_sectors_until_int(0), m_master_password_enable(0), m_user_password_enable(0), m_master_password(nullptr), - m_user_password(nullptr) + m_user_password(nullptr), + m_dma_transfer_time(attotime::zero) { } @@ -426,7 +427,10 @@ void ata_mass_storage_device::fill_buffer() if (m_sector_count > 0) { set_dasp(ASSERT_LINE); - start_busy(TIME_BETWEEN_SECTORS, PARAM_COMMAND); + if (m_command == IDE_COMMAND_READ_DMA) + start_busy(TIME_BETWEEN_SECTORS + m_dma_transfer_time, PARAM_COMMAND); + else + start_busy(TIME_BETWEEN_SECTORS, PARAM_COMMAND); } break; } @@ -632,7 +636,7 @@ void ata_mass_storage_device::process_command() { case IDE_COMMAND_READ_SECTORS: case IDE_COMMAND_READ_SECTORS_NORETRY: - LOGPRINT(("IDE Read multiple: C=%d H=%d S=%d LBA=%d count=%d\n", + LOGPRINT(("IDE Read multiple: C=%u H=%d S=%u LBA=%u count=%u\n", (m_cylinder_high << 8) | m_cylinder_low, m_device_head & IDE_DEVICE_HEAD_HS, m_sector_number, lba_address(), m_sector_count)); m_sectors_until_int = 1; @@ -642,7 +646,7 @@ void ata_mass_storage_device::process_command() break; case IDE_COMMAND_READ_MULTIPLE: - LOGPRINT(("IDE Read multiple block: C=%d H=%d S=%d LBA=%d count=%d\n", + LOGPRINT(("IDE Read multiple block: C=%u H=%u S=%u LBA=%u count=%u\n", (m_cylinder_high << 8) | m_cylinder_low, m_device_head & IDE_DEVICE_HEAD_HS, m_sector_number, lba_address(), m_sector_count)); m_sectors_until_int = 1; @@ -653,7 +657,7 @@ void ata_mass_storage_device::process_command() case IDE_COMMAND_VERIFY_SECTORS: case IDE_COMMAND_VERIFY_SECTORS_NORETRY: - LOGPRINT(("IDE Read verify multiple with/without retries: C=%d H=%d S=%d LBA=%d count=%d\n", + LOGPRINT(("IDE Read verify multiple with/without retries: C=%u H=%u S=%u LBA=%u count=%u\n", (m_cylinder_high << 8) | m_cylinder_low, m_device_head & IDE_DEVICE_HEAD_HS, m_sector_number, lba_address(), m_sector_count)); /* reset the buffer */ @@ -664,7 +668,7 @@ void ata_mass_storage_device::process_command() break; case IDE_COMMAND_READ_DMA: - LOGPRINT(("IDE Read multiple DMA: C=%d H=%d S=%d LBA=%d count=%d\n", + LOGPRINT(("IDE Read multiple DMA: C=%u H=%u S=%u LBA=%u count=%u\n", (m_cylinder_high << 8) | m_cylinder_low, m_device_head & IDE_DEVICE_HEAD_HS, m_sector_number, lba_address(), m_sector_count)); /* reset the buffer */ @@ -676,7 +680,7 @@ void ata_mass_storage_device::process_command() case IDE_COMMAND_WRITE_SECTORS: case IDE_COMMAND_WRITE_SECTORS_NORETRY: - LOGPRINT(("IDE Write multiple: C=%d H=%d S=%d LBA=%d count=%d\n", + LOGPRINT(("IDE Write multiple: C=%u H=%u S=%u LBA=%u count=%u\n", (m_cylinder_high << 8) | m_cylinder_low, m_device_head & IDE_DEVICE_HEAD_HS, m_sector_number, lba_address(), m_sector_count)); /* reset the buffer */ @@ -687,7 +691,7 @@ void ata_mass_storage_device::process_command() break; case IDE_COMMAND_WRITE_MULTIPLE: - LOGPRINT(("IDE Write multiple block: C=%d H=%d S=%d LBA=%d count=%d\n", + LOGPRINT(("IDE Write multiple block: C=%u H=%u S=%u LBA=%u count=%u\n", (m_cylinder_high << 8) | m_cylinder_low, m_device_head & IDE_DEVICE_HEAD_HS, m_sector_number, lba_address(), m_sector_count)); /* reset the buffer */ @@ -698,7 +702,7 @@ void ata_mass_storage_device::process_command() break; case IDE_COMMAND_WRITE_DMA: - LOGPRINT(("IDE Write multiple DMA: C=%d H=%d S=%d LBA=%d count=%d\n", + LOGPRINT(("IDE Write multiple DMA: C=%u H=%u S=%u LBA=%u count=%u\n", (m_cylinder_high << 8) | m_cylinder_low, m_device_head & IDE_DEVICE_HEAD_HS, m_sector_number, lba_address(), m_sector_count)); /* reset the buffer */ @@ -745,7 +749,7 @@ void ata_mass_storage_device::process_command() break; case IDE_COMMAND_SET_CONFIG: - LOGPRINT(("IDE Set configuration (%d heads, %d sectors)\n", (m_device_head & IDE_DEVICE_HEAD_HS) + 1, m_sector_count)); + LOGPRINT(("IDE Set configuration (%u heads, %u sectors)\n", (m_device_head & IDE_DEVICE_HEAD_HS) + 1, m_sector_count)); start_busy(MINIMUM_COMMAND_TIME, PARAM_COMMAND); break; @@ -758,7 +762,7 @@ void ata_mass_storage_device::process_command() break; case IDE_COMMAND_SET_BLOCK_COUNT: - LOGPRINT(("IDE Set block count (%d)\n", m_sector_count)); + LOGPRINT(("IDE Set block count (%u)\n", m_sector_count)); m_block_count = m_sector_count; @@ -828,8 +832,8 @@ void ide_hdd_device::device_reset() m_num_cylinders = hdinfo->cylinders; m_num_sectors = hdinfo->sectors; m_num_heads = hdinfo->heads; - if (PRINTF_IDE_COMMANDS) osd_printf_debug("CHS: %d %d %d\n", m_num_cylinders, m_num_heads, m_num_sectors); - osd_printf_debug("CHS: %d %d %d\n", m_num_cylinders, m_num_heads, m_num_sectors); + if (PRINTF_IDE_COMMANDS) osd_printf_debug("CHS: %u %u %u\n", m_num_cylinders, m_num_heads, m_num_sectors); + osd_printf_debug("CHS: %u %u %u\n", m_num_cylinders, m_num_heads, m_num_sectors); } // build the features page diff --git a/src/devices/machine/idehd.h b/src/devices/machine/idehd.h index ff6acbc985a..205e04500e1 100644 --- a/src/devices/machine/idehd.h +++ b/src/devices/machine/idehd.h @@ -34,6 +34,7 @@ public: m_user_password_enable = (password != nullptr); } + void set_dma_transfer_time(const attotime time) { m_dma_transfer_time = time; }; protected: ata_mass_storage_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); @@ -79,6 +80,8 @@ private: uint8_t m_user_password_enable; const uint8_t * m_master_password; const uint8_t * m_user_password; + // DMA data transfer time for 1 sector + attotime m_dma_transfer_time; }; // ======================> ide_hdd_device diff --git a/src/mame/drivers/vegas.cpp b/src/mame/drivers/vegas.cpp index 24055d8d194..9748b4b7ea0 100644 --- a/src/mame/drivers/vegas.cpp +++ b/src/mame/drivers/vegas.cpp @@ -281,6 +281,7 @@ #include "cpu/adsp2100/adsp2100.h" #include "cpu/mips/mips3.h" #include "machine/idectrl.h" +#include "machine/idehd.h" #include "machine/midwayic.h" #include "machine/smc91c9x.h" #include "machine/timekpr.h" @@ -527,6 +528,13 @@ void vegas_state::machine_reset() m_wheel_force = 0; m_wheel_offset = 0; m_wheel_calibrated = false; + + // Set the disk dma transfer speed + auto *hdd = subdevice(PCI_ID_IDE":ide:0:hdd"); + hdd->set_dma_transfer_time(attotime::from_usec(15)); + // Allow ultra dma + //uint16_t *identify_device = hdd->identify_device_buffer(); + //identify_device[88] = 0x7f; } /************************************* -- cgit v1.2.3