summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine/wd1000.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/machine/wd1000.cpp')
-rw-r--r--src/devices/machine/wd1000.cpp110
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;