diff options
Diffstat (limited to 'src/devices/machine/wd1000.cpp')
-rw-r--r-- | src/devices/machine/wd1000.cpp | 110 |
1 files changed, 51 insertions, 59 deletions
diff --git a/src/devices/machine/wd1000.cpp b/src/devices/machine/wd1000.cpp index f8c879ef20e..109a3776df4 100644 --- a/src/devices/machine/wd1000.cpp +++ b/src/devices/machine/wd1000.cpp @@ -7,7 +7,7 @@ ***************************************************************************/ #include "emu.h" -#include "machine/wd1000.h" +#include "wd1000.h" //************************************************************************** // DEVICE DEFINITIONS @@ -57,13 +57,9 @@ void wd1000_device::set_sector_base(uint32_t base) void wd1000_device::device_start() { - // Resolve callbacks - m_intrq_cb.resolve(); - m_drq_cb.resolve(); - // Allocate timers - m_seek_timer = timer_alloc(TIMER_SEEK); - m_drq_timer = timer_alloc(TIMER_DRQ); + m_seek_timer = timer_alloc(FUNC(wd1000_device::update_seek), this); + m_drq_timer = timer_alloc(FUNC(wd1000_device::delayed_drq), this); // Empty buffer. m_buffer_index = 0; @@ -111,49 +107,47 @@ void wd1000_device::device_reset() } //------------------------------------------------- -// device_timer - device-specific timer +// update_seek - //------------------------------------------------- -void wd1000_device::device_timer(emu_timer &timer, device_timer_id tid, int param, void *ptr) +TIMER_CALLBACK_MEMBER(wd1000_device::update_seek) { - switch (tid) - { - case TIMER_SEEK: - - m_drive_cylinder[drive()] = param; - m_status |= S_SC; - - switch (m_command >> 4) - { - case CMD_RESTORE: - cmd_restore(); - break; - - case CMD_SEEK: - cmd_seek(); - break; + m_drive_cylinder[drive()] = param; + m_status |= S_SC; - case CMD_READ_SECTOR: - cmd_read_sector(); - break; + switch (m_command >> 4) + { + case CMD_RESTORE: + cmd_restore(); + break; - case CMD_WRITE_SECTOR: - cmd_write_sector(); - break; + case CMD_SEEK: + cmd_seek(); + break; - case CMD_WRITE_FORMAT: - cmd_format_sector(); - break; - } + case CMD_READ_SECTOR: + cmd_read_sector(); + break; + case CMD_WRITE_SECTOR: + cmd_write_sector(); break; - case TIMER_DRQ: - set_drq(); + case CMD_WRITE_FORMAT: + cmd_format_sector(); break; } } +//------------------------------------------------- +// delayed_drq - set DRQ after a necessary delay +//------------------------------------------------- + +TIMER_CALLBACK_MEMBER(wd1000_device::delayed_drq) +{ + set_drq(); +} + void wd1000_device::set_error(int error) { if (error) @@ -187,8 +181,7 @@ void wd1000_device::set_drq() if ((m_status & S_DRQ) == 0) { m_status |= S_DRQ; - if (!m_drq_cb.isnull()) - m_drq_cb(true); + m_drq_cb(true); } } @@ -197,8 +190,7 @@ void wd1000_device::drop_drq() if (m_status & S_DRQ) { m_status &= ~S_DRQ; - if (!m_drq_cb.isnull()) - m_drq_cb(false); + m_drq_cb(false); } } @@ -240,36 +232,36 @@ void wd1000_device::end_command() int wd1000_device::get_lbasector() { - hard_disk_file *file = m_drives[drive()]->get_hard_disk_file(); - hard_disk_info *info = hard_disk_get_info(file); + harddisk_image_device *file = m_drives[drive()]; + const auto &info = file->get_info(); int lbasector; - if (m_cylinder > info->cylinders) + if (m_cylinder > info.cylinders) { - logerror("%s: Unexpected cylinder %d for range 0 to %d\n", machine().describe_context(), m_cylinder, info->cylinders - 1); + logerror("%s: Unexpected cylinder %d for range 0 to %d\n", machine().describe_context(), m_cylinder, info.cylinders - 1); } - if (head() >= info->heads) + if (head() >= info.heads) { - logerror("%s: Unexpected head %d for range 0 to %d\n", machine().describe_context(), head(), info->heads - 1); + logerror("%s: Unexpected head %d for range 0 to %d\n", machine().describe_context(), head(), info.heads - 1); } int16_t sector = m_sector_number - m_sector_base; - if (sector < 0 || sector >= info->sectors) + if (sector < 0 || sector >= info.sectors) { - logerror("%s: Unexpected sector number %d for range %d to %d\n", machine().describe_context(), m_sector_number, m_sector_base, info->sectors + m_sector_base); + logerror("%s: Unexpected sector number %d for range %d to %d\n", machine().describe_context(), m_sector_number, m_sector_base, info.sectors + m_sector_base); } - if (sector_bytes() != info->sectorbytes) + if (sector_bytes() != info.sectorbytes) { - logerror("%s: Unexpected sector bytes %d, expected %d\n", machine().describe_context(), sector_bytes(), info->sectorbytes); + logerror("%s: Unexpected sector bytes %d, expected %d\n", machine().describe_context(), sector_bytes(), info.sectorbytes); } lbasector = m_cylinder; - lbasector *= info->heads; + lbasector *= info.heads; lbasector += head(); - lbasector *= info->sectors; + lbasector *= info.sectors; lbasector += sector; return lbasector; @@ -575,10 +567,10 @@ void wd1000_device::cmd_restore() // so it is not necessary to guard that case in these functions. void wd1000_device::cmd_read_sector() { - hard_disk_file *file = m_drives[drive()]->get_hard_disk_file(); + harddisk_image_device *file = m_drives[drive()]; uint8_t dma = BIT(m_command, 3); - hard_disk_read(file, get_lbasector(), m_buffer); + file->read(get_lbasector(), m_buffer); m_buffer_index = 0; m_buffer_end = 512; @@ -596,21 +588,21 @@ void wd1000_device::cmd_read_sector() void wd1000_device::cmd_write_sector() { - hard_disk_file *file = m_drives[drive()]->get_hard_disk_file(); + harddisk_image_device *file = m_drives[drive()]; if (m_buffer_index != sector_bytes()) { logerror("%s: Unexpected unfilled buffer on write, only %d or %d bytes filled\n", machine().describe_context(), m_buffer_index, sector_bytes()); } - hard_disk_write(file, get_lbasector(), m_buffer); + file->write(get_lbasector(), m_buffer); end_command(); } void wd1000_device::cmd_format_sector() { - hard_disk_file *file = m_drives[drive()]->get_hard_disk_file(); + harddisk_image_device *file = m_drives[drive()]; uint8_t buffer[512]; // The m_buffer appears to be loaded with an interleave table which is @@ -619,7 +611,7 @@ void wd1000_device::cmd_format_sector() for (int i = 0; i < m_sector_count; i++) { std::fill(std::begin(buffer), std::end(buffer), 0); - hard_disk_write(file, get_lbasector(), buffer); + file->write(get_lbasector(), buffer); } m_sector_count = 0; |