cdicdic: Explicitly configure second clock (nw)

This commit is contained in:
AJR 2019-04-17 17:49:51 -04:00
parent 185bbcad46
commit aa98eae728
3 changed files with 45 additions and 33 deletions

View File

@ -850,9 +850,10 @@ void cdi_state::cdimono1_base(machine_config &config)
config.set_default_layout(layout_cdi); config.set_default_layout(layout_cdi);
// IMS66490 CDIC input clocks are 22.5792 MHz and 19.3536 MHz (latter is generated by PLL circuit incorporating 19.3575 MHz XTAL) // IMS66490 CDIC input clocks are 22.5792 MHz and 19.3536 MHz
// DSP input clock is 7.5264 MHz // DSP input clock is 7.5264 MHz
CDI_CDIC(config, m_cdic, 45.1584_MHz_XTAL / 2); CDI_CDIC(config, m_cdic, 45.1584_MHz_XTAL / 2);
m_cdic->set_clock2(45.1584_MHz_XTAL * 3 / 7); // generated by PLL circuit incorporating 19.3575 MHz XTAL
m_cdic->intreq_callback().set(m_maincpu, FUNC(scc68070_device::in4_w)); m_cdic->intreq_callback().set(m_maincpu, FUNC(scc68070_device::in4_w));
CDI_SLAVE(config, m_slave_hle, 0); CDI_SLAVE(config, m_slave_hle, 0);

View File

@ -106,9 +106,9 @@ const int32_t cdicdic_device::s_cdic_adpcm_filter_coef[5][2] =
// INLINES // INLINES
//************************************************************************** //**************************************************************************
static inline int CDIC_IS_VALID_SAMPLE_BUF(uint16_t *cdram, uint16_t addr) int cdicdic_device::is_valid_sample_buf(uint16_t addr) const
{ {
uint8_t *cdram8 = ((uint8_t*)cdram) + addr + 8; const uint8_t *cdram8 = ((uint8_t*)m_ram.get()) + addr + 8;
if(cdram8[2] != 0xff) if(cdram8[2] != 0xff)
{ {
return 1; return 1;
@ -116,29 +116,29 @@ static inline int CDIC_IS_VALID_SAMPLE_BUF(uint16_t *cdram, uint16_t addr)
return 0; return 0;
} }
static inline double CDIC_SAMPLE_BUF_FREQ(uint16_t *cdram, uint16_t addr) double cdicdic_device::sample_buf_freq(uint16_t addr) const
{ {
uint8_t *cdram8 = ((uint8_t*)cdram) + addr + 8; const uint8_t *cdram8 = ((uint8_t*)m_ram.get()) + addr + 8;
switch(cdram8[2] & 0x3f) switch(cdram8[2] & 0x3f)
{ {
case 0: case 0:
case 1: case 1:
case 16: case 16:
case 17: case 17:
return 37800.0f; return clock2() / 512.0f;
case 4: case 4:
case 5: case 5:
return 18900.0f; return clock2() / 1024.0f;
default: default:
return 18900.0f; return clock2() / 1024.0f;
} }
} }
static inline int CDIC_SAMPLE_BUF_SIZE(uint16_t *cdram, uint16_t addr) int cdicdic_device::sample_buf_size(uint16_t addr) const
{ {
uint8_t *cdram8 = ((uint8_t*)cdram) + addr + 8; const uint8_t *cdram8 = ((uint8_t*)m_ram.get()) + addr + 8;
switch(cdram8[2] & 0x3f) switch(cdram8[2] & 0x3f)
{ {
case 0: case 0:
@ -440,44 +440,44 @@ void cdicdic_device::decode_audio_sector(const uint8_t *xa, int32_t triggered)
{ {
case 0: case 0:
channels = 1; channels = 1;
m_audio_sample_freq = 37800.0f; //18900.0f; m_audio_sample_freq = clock2() / 512.0f; // / 1024.0f;
bits = 4; bits = 4;
m_audio_sample_size = 4; m_audio_sample_size = 4;
break; break;
case 1: case 1:
channels=2; channels = 2;
m_audio_sample_freq=37800.0f; m_audio_sample_freq = clock2() / 512.0f;
bits=4; bits = 4;
m_audio_sample_size=2; m_audio_sample_size = 2;
break; break;
case 4: case 4:
channels=1; channels = 1;
m_audio_sample_freq=18900.0f; ///2.0f; m_audio_sample_freq = clock2() / 1024.0f; ///2.0f;
bits=4; bits = 4;
m_audio_sample_size=4; m_audio_sample_size = 4;
break; break;
case 5: case 5:
channels=2; channels = 2;
m_audio_sample_freq=18900.0f; //37800.0f/2.0f; m_audio_sample_freq = clock2() / 1024.0f; //37800.0f/2.0f;
bits=4; bits = 4;
m_audio_sample_size=2; m_audio_sample_size = 2;
break; break;
case 16: case 16:
channels=1; channels = 1;
m_audio_sample_freq=37800.0f; m_audio_sample_freq = clock2() / 512.0f;
bits=8; bits = 8;
m_audio_sample_size=2; m_audio_sample_size = 2;
break; break;
case 17: case 17:
channels=2; channels = 2;
m_audio_sample_freq=37800.0f; m_audio_sample_freq = clock2() / 512.0f;
bits=8; bits = 8;
m_audio_sample_size=1; m_audio_sample_size = 1;
break; break;
default: default:
@ -572,7 +572,7 @@ void cdicdic_device::sample_trigger()
m_decode_delay = 0; m_decode_delay = 0;
} }
if(CDIC_IS_VALID_SAMPLE_BUF(m_ram.get(), m_decode_addr & 0x3ffe)) if(is_valid_sample_buf(m_decode_addr & 0x3ffe))
{ {
verboselog(*this, 0, "Hit audio_sample_trigger, with m_decode_addr == %04x, calling decode_audio_sector\n", m_decode_addr ); verboselog(*this, 0, "Hit audio_sample_trigger, with m_decode_addr == %04x, calling decode_audio_sector\n", m_decode_addr );
@ -586,7 +586,7 @@ void cdicdic_device::sample_trigger()
//// Delay for Frequency * (18*28*2*size in bytes) before requesting more data //// Delay for Frequency * (18*28*2*size in bytes) before requesting more data
verboselog(*this, 0, "%s", "Data is valid, setting up a new callback\n" ); verboselog(*this, 0, "%s", "Data is valid, setting up a new callback\n" );
m_decode_period = attotime::from_hz(CDIC_SAMPLE_BUF_FREQ(m_ram.get(), m_decode_addr & 0x3ffe)) * (18*28*2*CDIC_SAMPLE_BUF_SIZE(m_ram.get(), m_decode_addr & 0x3ffe)); m_decode_period = attotime::from_hz(sample_buf_freq(m_decode_addr & 0x3ffe)) * (18*28*2*sample_buf_size(m_decode_addr & 0x3ffe));
m_audio_sample_timer->adjust(m_decode_period); m_audio_sample_timer->adjust(m_decode_period);
//dmadac_enable(&dmadac[0], 2, 0); //dmadac_enable(&dmadac[0], 2, 0);
} }
@ -1163,6 +1163,7 @@ cdicdic_device::cdicdic_device(const machine_config &mconfig, const char *tag, d
, m_scc(*this, ":maincpu") , m_scc(*this, ":maincpu")
, m_cdda(*this, ":cdda") , m_cdda(*this, ":cdda")
, m_cdrom_dev(*this, ":cdrom") , m_cdrom_dev(*this, ":cdrom")
, m_clock2(clock)
{ {
} }

View File

@ -45,6 +45,10 @@ public:
// construction/destruction // construction/destruction
cdicdic_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); cdicdic_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
void set_clock2(uint32_t clock) { m_clock2 = clock; }
void set_clock2(const XTAL &xtal) { set_clock2(xtal.value()); }
uint32_t clock2() const { return m_clock2; }
auto intreq_callback() { return m_intreq_callback.bind(); } auto intreq_callback() { return m_intreq_callback.bind(); }
// non-static internal members // non-static internal members
@ -69,6 +73,10 @@ protected:
TIMER_CALLBACK_MEMBER( trigger_readback_int ); TIMER_CALLBACK_MEMBER( trigger_readback_int );
private: private:
int is_valid_sample_buf(uint16_t addr) const;
double sample_buf_freq(uint16_t addr) const;
int sample_buf_size(uint16_t addr) const;
devcb_write_line m_intreq_callback; devcb_write_line m_intreq_callback;
required_address_space m_memory_space; required_address_space m_memory_space;
@ -77,6 +85,8 @@ private:
required_device<cdda_device> m_cdda; required_device<cdda_device> m_cdda;
optional_device<cdrom_image_device> m_cdrom_dev; optional_device<cdrom_image_device> m_cdrom_dev;
uint32_t m_clock2;
// internal state // internal state
uint16_t m_command; // CDIC Command Register (0x303c00) uint16_t m_command; // CDIC Command Register (0x303c00)
uint32_t m_time; // CDIC Time Register (0x303c02) uint32_t m_time; // CDIC Time Register (0x303c02)