summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine/spg290_cdservo.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/machine/spg290_cdservo.cpp')
-rw-r--r--src/devices/machine/spg290_cdservo.cpp69
1 files changed, 31 insertions, 38 deletions
diff --git a/src/devices/machine/spg290_cdservo.cpp b/src/devices/machine/spg290_cdservo.cpp
index 651d5e16818..02a65e5be72 100644
--- a/src/devices/machine/spg290_cdservo.cpp
+++ b/src/devices/machine/spg290_cdservo.cpp
@@ -33,10 +33,7 @@ spg290_cdservo_device::spg290_cdservo_device(const machine_config &mconfig, cons
void spg290_cdservo_device::device_start()
{
- m_irq_cb.resolve_safe();
- m_space_write_cb.resolve_safe();
-
- m_cdtimer = timer_alloc();
+ m_cdtimer = timer_alloc(FUNC(spg290_cdservo_device::cd_update), this);
m_dsp_memory = std::make_unique<uint32_t[]>(0x10000);
save_item(NAME(m_addr));
@@ -91,17 +88,13 @@ void spg290_cdservo_device::device_reset()
m_irq_cb(CLEAR_LINE);
// generate Q subchannel
- if (m_cdrom.found())
- {
- auto *cdrom = m_cdrom->get_cdrom_file();
- if (cdrom != nullptr)
- generate_qsub(cdrom);
- }
+ if (m_cdrom.found() && m_cdrom->exists())
+ generate_qsub();
change_status();
}
-void spg290_cdservo_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
+TIMER_CALLBACK_MEMBER(spg290_cdservo_device::cd_update)
{
if (!(m_control1 & 0x04) && m_cur_sector == m_seek_lba + SPG290_LEADIN_LEN)
{
@@ -109,7 +102,7 @@ void spg290_cdservo_device::device_timer(emu_timer &timer, device_timer_id id, i
if (BIT(m_control0, 15)) // CDDA
{
- cdrom_read_data(m_cdrom->get_cdrom_file(), m_cur_sector - 150 - SPG290_LEADIN_LEN, cdbuf, CD_TRACK_AUDIO);
+ m_cdrom->read_data(m_cur_sector - 150 - SPG290_LEADIN_LEN, cdbuf, cdrom_file::CD_TRACK_AUDIO);
for (int i=0; i<2352; i++)
{
@@ -120,13 +113,13 @@ void spg290_cdservo_device::device_timer(emu_timer &timer, device_timer_id id, i
}
else
{
- cdrom_read_data(m_cdrom->get_cdrom_file(), m_cur_sector - 150 - SPG290_LEADIN_LEN, cdbuf, CD_TRACK_MODE1_RAW);
+ m_cdrom->read_data(m_cur_sector - 150 - SPG290_LEADIN_LEN, cdbuf, cdrom_file::CD_TRACK_MODE1_RAW);
// FIXME: this is required for load iso images
- if (cdrom_get_track_type(m_cdrom->get_cdrom_file(), m_qsub[m_cur_sector * 12 + 1] - 1) == CD_TRACK_MODE1)
+ if (m_cdrom->get_track_type(m_qsub[m_cur_sector * 12 + 1] - 1) == cdrom_file::CD_TRACK_MODE1)
{
int lba = (bcd_2_dec(cdbuf[12]) * 60 + bcd_2_dec(cdbuf[13])) * 75 + bcd_2_dec(cdbuf[14]);
- uint32_t msf = lba_to_msf(lba + 150);
+ uint32_t msf = cdrom_file::lba_to_msf(lba + 150);
cdbuf[12] = (msf >> 16) & 0xff;
cdbuf[13] = (msf >> 8) & 0xff;
cdbuf[14] = (msf >> 0) & 0xff;
@@ -332,7 +325,7 @@ void spg290_cdservo_device::servo_cmd_w()
void spg290_cdservo_device::change_status()
{
- if (m_speed == 0 || !m_cdrom.found() || !m_cdrom->get_cdrom_file())
+ if (m_speed == 0 || !m_cdrom.found() || !m_cdrom->exists())
m_cdtimer->adjust(attotime::never);
else
m_cdtimer->adjust(attotime::from_hz(75 * m_speed), 0, attotime::from_hz(75 * m_speed));
@@ -355,11 +348,11 @@ void spg290_cdservo_device::add_qsub(int sector, uint8_t addrctrl, uint8_t track
dest[11] = crc16;
}
-void spg290_cdservo_device::generate_qsub(cdrom_file *cdrom)
+void spg290_cdservo_device::generate_qsub()
{
- const cdrom_toc *toc = cdrom_get_toc(cdrom);
- int numtracks = cdrom_get_last_track(cdrom);
- uint32_t total_sectors = cdrom_get_track_start(cdrom, numtracks - 1) + toc->tracks[numtracks - 1].frames + 150;
+ const cdrom_file::toc &toc = m_cdrom->get_toc();
+ int numtracks = m_cdrom->get_last_track();
+ uint32_t total_sectors = m_cdrom->get_track_start(numtracks - 1) + toc.tracks[numtracks - 1].frames + 150;
m_tot_sectors = SPG290_LEADIN_LEN + total_sectors + SPG290_LEADOUT_LEN;
m_qsub = std::make_unique<uint8_t[]>(m_tot_sectors * 12);
@@ -369,54 +362,54 @@ void spg290_cdservo_device::generate_qsub(cdrom_file *cdrom)
// 7500 sectors lead-in
for (int s=0; s < SPG290_LEADIN_LEN; s += numtracks + 3)
{
- if (lba < SPG290_LEADIN_LEN) add_qsub(lba++, 0x14, 0, 0xa0, lba_to_msf(s + 0), 1 << 16); // first track number
- if (lba < SPG290_LEADIN_LEN) add_qsub(lba++, 0x14, 0, 0xa1, lba_to_msf(s + 1), numtracks << 16); // last track number
- if (lba < SPG290_LEADIN_LEN) add_qsub(lba++, 0x14, 0, 0xa2, lba_to_msf(s + 2), lba_to_msf(total_sectors)); // start time of lead-out
+ if (lba < SPG290_LEADIN_LEN) add_qsub(lba++, 0x14, 0, 0xa0, cdrom_file::lba_to_msf(s + 0), 1 << 16); // first track number
+ if (lba < SPG290_LEADIN_LEN) add_qsub(lba++, 0x14, 0, 0xa1, cdrom_file::lba_to_msf(s + 1), numtracks << 16); // last track number
+ if (lba < SPG290_LEADIN_LEN) add_qsub(lba++, 0x14, 0, 0xa2, cdrom_file::lba_to_msf(s + 2), cdrom_file::lba_to_msf(total_sectors)); // start time of lead-out
for(int track = 0; track < numtracks; track++)
{
- uint32_t track_start = cdrom_get_track_start(cdrom, track) + 150;
+ uint32_t track_start = m_cdrom->get_track_start(track) + 150;
if (lba < SPG290_LEADIN_LEN)
- add_qsub(lba++, cdrom_get_adr_control(cdrom, track), 0, dec_2_bcd(track + 1), lba_to_msf(s + 3 + track), lba_to_msf(track_start));
+ add_qsub(lba++, m_cdrom->get_adr_control(track), 0, dec_2_bcd(track + 1), cdrom_file::lba_to_msf(s + 3 + track), cdrom_file::lba_to_msf(track_start));
}
}
// data tracks
for(int track = 0; track < numtracks; track++)
{
- uint32_t control = cdrom_get_adr_control(cdrom, track);
- uint32_t track_start = cdrom_get_track_start(cdrom, track);
+ uint32_t control = m_cdrom->get_adr_control(track);
+ uint32_t track_start = m_cdrom->get_track_start(track);
// pregap
- uint32_t pregap = toc->tracks[track].pregap;
+ uint32_t pregap = toc.tracks[track].pregap;
// first track should have a 150 frames pregap
- if (track == 0 && toc->tracks[0].pregap == 0)
+ if (track == 0 && toc.tracks[0].pregap == 0)
pregap = 150;
- else if (track != 0 && toc->tracks[0].pregap == 0)
+ else if (track != 0 && toc.tracks[0].pregap == 0)
track_start += 150;
for(int s = 0; s < pregap; s++)
- add_qsub(lba++, control, dec_2_bcd(track + 1), 0, lba_to_msf(s), lba_to_msf(track_start + s));
+ add_qsub(lba++, control, dec_2_bcd(track + 1), 0, cdrom_file::lba_to_msf(s), cdrom_file::lba_to_msf(track_start + s));
track_start += pregap;
- for(int s = 0; s < toc->tracks[track].frames; s++)
+ for(int s = 0; s < toc.tracks[track].frames; s++)
{
// TODO: if present use subcode from CHD
- add_qsub(lba++, control, dec_2_bcd(track + 1), 1, lba_to_msf(s), lba_to_msf(track_start + s));
+ add_qsub(lba++, control, dec_2_bcd(track + 1), 1, cdrom_file::lba_to_msf(s), cdrom_file::lba_to_msf(track_start + s));
}
- track_start += toc->tracks[track].frames;
+ track_start += toc.tracks[track].frames;
// postgap
- for(int s = 0; s < toc->tracks[track].postgap; s++)
- add_qsub(lba++, control, dec_2_bcd(track + 1), 2, lba_to_msf(s), lba_to_msf(track_start + s));
+ for(int s = 0; s < toc.tracks[track].postgap; s++)
+ add_qsub(lba++, control, dec_2_bcd(track + 1), 2, cdrom_file::lba_to_msf(s), cdrom_file::lba_to_msf(track_start + s));
- track_start += toc->tracks[track].postgap;
+ track_start += toc.tracks[track].postgap;
}
// 6750 sectors lead-out
for(int s = 0; s < SPG290_LEADOUT_LEN; s++)
- add_qsub(lba++, 0x14, 0xaa, 1, lba_to_msf(s), lba_to_msf(total_sectors + s));
+ add_qsub(lba++, 0x14, 0xaa, 1, cdrom_file::lba_to_msf(s), cdrom_file::lba_to_msf(total_sectors + s));
}