summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine/diablo_hd.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/machine/diablo_hd.cpp')
-rw-r--r--src/devices/machine/diablo_hd.cpp48
1 files changed, 19 insertions, 29 deletions
diff --git a/src/devices/machine/diablo_hd.cpp b/src/devices/machine/diablo_hd.cpp
index 36c57cbd0d7..2ce1707058c 100644
--- a/src/devices/machine/diablo_hd.cpp
+++ b/src/devices/machine/diablo_hd.cpp
@@ -93,7 +93,7 @@ diablo_hd_device::diablo_hd_device(const machine_config &mconfig, const char *ta
m_head(-1),
m_sector(-1),
m_page(-1),
- m_bits(nullptr),
+ m_bits(),
m_rdfirst(-1),
m_rdlast(-1),
m_wrfirst(-1),
@@ -102,7 +102,6 @@ diablo_hd_device::diablo_hd_device(const machine_config &mconfig, const char *ta
m_sector_callback(nullptr),
m_timer(nullptr),
m_image(nullptr),
- m_handle(nullptr),
m_disk(nullptr)
{
memset(m_description, 0x00, sizeof(m_description));
@@ -312,7 +311,7 @@ void diablo_hd_device::read_sector()
// allocate a buffer for this page
m_cache[m_page] = std::make_unique<uint8_t[]>(sizeof(diablo_sector_t));
// and read the page from the hard_disk image
- if (hard_disk_read(m_disk, m_page, m_cache[m_page].get())) {
+ if (m_disk->read(m_page, m_cache[m_page].get())) {
LOG_DRIVE(2,"[DHD%u] CHS:%03d/%d/%02d => page:%d loaded\n", m_unit, m_cylinder, m_head, m_sector, m_page);
} else {
LOG_DRIVE(0,"[DHD%u] CHS:%03d/%d/%02d => page:%d read failed\n", m_unit, m_cylinder, m_head, m_sector, m_page);
@@ -434,7 +433,7 @@ uint32_t* diablo_hd_device::expand_sector()
return nullptr;
/* already expanded this sector? */
if (m_bits[m_page])
- return m_bits[m_page];
+ return m_bits[m_page].get();
/* allocate a sector buffer */
if (!m_cache[m_page]) {
@@ -444,7 +443,8 @@ uint32_t* diablo_hd_device::expand_sector()
diablo_sector_t *s = reinterpret_cast<diablo_sector_t *>(m_cache[m_page].get());
/* allocate a bits image */
- uint32_t *bits = auto_alloc_array_clear(machine(), uint32_t, 400);
+ m_bits[m_page] = make_unique_clear<uint32_t[]>(400);
+ uint32_t* bits = m_bits[m_page].get();
if (m_diablo31) {
/* write sync bit after (MFROBL-MRPAL) words - 1 bit */
@@ -483,7 +483,6 @@ uint32_t* diablo_hd_device::expand_sector()
/* fill MWPAL words of clock and 0 data bits */
dst = expand_zeroes(bits, dst, MWPAL);
}
- m_bits[m_page] = bits;
LOG_DRIVE(0,"[DHD%u] CHS:%03d/%d/%02d #%5d bits\n", m_unit, m_cylinder, m_head, m_sector, dst);
if (DIABLO_DEBUG)
@@ -722,7 +721,7 @@ void diablo_hd_device::squeeze_sector()
LOG_DRIVE(0,"[DHD%u] no bits\n", m_unit);
return;
}
- uint32_t *bits = m_bits[m_page];
+ uint32_t *bits = m_bits[m_page].get();
// pointer to sector buffer
s = reinterpret_cast<diablo_sector_t *>(m_cache[m_page].get());
@@ -767,11 +766,10 @@ void diablo_hd_device::squeeze_sector()
if (cksum_header || cksum_label || cksum_data) {
LOG_DRIVE(0,"[DHD%u] cksum check - header:%06o label:%06o data:%06o\n", m_unit, cksum_header, cksum_label, cksum_data);
}
- auto_free(machine(), m_bits[m_page]);
- m_bits[m_page] = nullptr;
+ m_bits[m_page].reset();
if (m_disk) {
- if (!hard_disk_write(m_disk, m_page, m_cache[m_page].get())) {
+ if (!m_disk->write(m_page, m_cache[m_page].get())) {
LOG_DRIVE(0,"[DHD%u] write failed for page #%d\n", m_unit, m_page);
}
} else {
@@ -1318,7 +1316,7 @@ void diablo_hd_device::device_start()
m_packs = 1; // FIXME: get from configuration?
m_unit = strstr(m_image->tag(), "diablo0") ? 0 : 1;
- m_timer = timer_alloc(1, nullptr);
+ m_timer = timer_alloc(FUNC(diablo_hd_device::sector_mark_tick), this);
}
void diablo_hd_device::device_reset()
@@ -1328,15 +1326,8 @@ void diablo_hd_device::device_reset()
if (m_cache[page])
m_cache[page] = nullptr;
// free previous bits cache
- if (m_bits) {
- for (int page = 0; page < m_pages; page++)
- if (m_bits[page])
- auto_free(machine(), m_bits[page]);
- auto_free(machine(), m_bits);
- m_bits = nullptr;
- }
- m_handle = m_image->get_chd_file();
- m_diablo31 = true; // FIXME: get from m_handle meta data?
+ m_bits.reset();
+ m_diablo31 = true; // FIXME: get from disk meta data?
m_disk = m_image->get_hard_disk_file();
if (m_diablo31) {
snprintf(m_description, sizeof(m_description), "DIABLO31");
@@ -1357,7 +1348,6 @@ void diablo_hd_device::device_reset()
m_cylinders = 2 * DIABLO_CYLINDERS;
m_pages = 2 * DIABLO_PAGES;
}
- LOG_DRIVE(0,"[DHD%u] m_handle : %p\n", m_unit, reinterpret_cast<void const *>(m_handle));
LOG_DRIVE(0,"[DHD%u] m_disk : %p\n", m_unit, reinterpret_cast<void const *>(m_disk));
LOG_DRIVE(0,"[DHD%u] rotation time : %.0fns\n", m_unit, m_rotation_time.as_double() * ATTOSECONDS_PER_NANOSECOND);
LOG_DRIVE(0,"[DHD%u] sector time : %.0fns\n", m_unit, m_sector_time.as_double() * ATTOSECONDS_PER_NANOSECOND);
@@ -1392,11 +1382,11 @@ void diablo_hd_device::device_reset()
m_rdfirst = -1;
m_rdlast = -1;
- if (!m_handle)
+ if (!m_image)
return;
// for units with a CHD assigned to them start the timer
- m_bits = auto_alloc_array_clear(machine(), uint32_t*, m_pages);
- timer_set(m_sector_time - m_sector_mark_0_time, 1, 0);
+ m_bits = std::make_unique<std::unique_ptr<uint32_t[]>[]>(m_pages);
+ m_timer->adjust(m_sector_time - m_sector_mark_0_time);
read_sector();
}
@@ -1411,9 +1401,9 @@ void diablo_hd_device::device_reset()
* @param id timer id
* @param arg argument supplied to timer_insert (unused)
*/
-void diablo_hd_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
+TIMER_CALLBACK_MEMBER(diablo_hd_device::sector_mark_tick)
{
- LOG_DRIVE(9,"[DHD%u] TIMER id=%d param=%d ptr=%p @%.0fns\n", m_unit, id, param, ptr, timer.elapsed().as_double() * ATTOSECONDS_PER_NANOSECOND);
+ LOG_DRIVE(9, "[DHD%u] TIMER param=%d @%.0fns\n", m_unit, param, m_timer->elapsed().as_double() * ATTOSECONDS_PER_NANOSECOND);
if (!m_disk)
return;
@@ -1422,20 +1412,20 @@ void diablo_hd_device::device_timer(emu_timer &timer, device_timer_id id, int pa
// assert sector mark
sector_mark_0();
// next sector timer event is in the middle between sector_mark going 0 and back to 1
- timer.adjust(m_sector_mark_0_time, 1);
+ m_timer->adjust(m_sector_mark_0_time, 1);
break;
case 1:
/* call the sector_callback, if any */
if (m_sector_callback)
(void)(*m_sector_callback)(m_sector_callback_cookie, m_unit);
// next sector timer event is deassert of sector_mark_0 (set to 1)
- timer.adjust(m_sector_mark_1_time, 2);
+ m_timer->adjust(m_sector_mark_1_time, 2);
break;
case 2:
// deassert sector mark
sector_mark_1();
// next sector timer event is sector_mark_0 for next sector
- timer.adjust(m_sector_time - m_sector_mark_0_time, 0);
+ m_timer->adjust(m_sector_time - m_sector_mark_0_time, 0);
break;
}
}