From ced8e963beb0bdbcccb803a63fc8a2868fb268da Mon Sep 17 00:00:00 2001 From: AJR Date: Wed, 17 Apr 2019 11:58:22 -0400 Subject: [PATCH] cdi: Further decoupling of device emulation; improve clock documentation (nw) --- src/emu/xtal.cpp | 3 ++- src/mame/drivers/cdi.cpp | 32 +++++++++++++++++++++----------- src/mame/drivers/model2.cpp | 4 ++-- src/mame/drivers/model3.cpp | 6 +++--- src/mame/includes/cdi.h | 11 ----------- src/mame/machine/cdi070.cpp | 12 ++++++++++-- src/mame/machine/cdicdic.cpp | 7 +++++++ src/mame/machine/cdislave.cpp | 8 +++++++- 8 files changed, 52 insertions(+), 31 deletions(-) diff --git a/src/emu/xtal.cpp b/src/emu/xtal.cpp index 02957f24467..68c262ee365 100644 --- a/src/emu/xtal.cpp +++ b/src/emu/xtal.cpp @@ -322,6 +322,7 @@ const double XTAL::known_xtals[] = { 29'376'000, /* 29.376_MHz_XTAL Qume QVT-103 */ 29'491'200, /* 29.4912_MHz_XTAL Xerox Alto-II system clock (tagged 29.4MHz in the schematics) */ 30'000'000, /* 30_MHz_XTAL Impera Magic Card */ + 30'209'800, /* 30.2098_MHz_XTAL Philips CD-i NTSC (1920x NTSC line rate) */ 30'476'100, /* 30.4761_MHz_XTAL Taito JC */ 30'800'000, /* 30.8_MHz_XTAL 15IE-00-013 */ 31'279'500, /* 31.2795_MHz_XTAL Wyse WY-30+ */ @@ -359,7 +360,7 @@ const double XTAL::known_xtals[] = { 44'452'800, /* 44.4528_MHz_XTAL TeleVideo 965 */ 44'900'000, /* 44.9_MHz_XTAL IBM 8514 1024x768 43.5Hz graphics */ 45'000'000, /* 45_MHz_XTAL Eolith with Hyperstone CPUs */ - 45'158'000, /* 45.158_MHz_XTAL Sega Model 2A video board, Model 3 CPU board */ + 45'158'400, /* 45.1584_MHz_XTAL Philips CD-i CDIC, Sega Model 2A video, Sega Model 3 CPU */ 45'619'200, /* 45.6192_MHz_XTAL DEC VK100 */ 45'830'400, /* 45.8304_MHz_XTAL Microterm 5510 */ 46'615'120, /* 46.61512_Mhz_XTAL Soundblaster 16 PCM base clock */ diff --git a/src/mame/drivers/cdi.cpp b/src/mame/drivers/cdi.cpp index 94baae55947..aa4483b9d65 100644 --- a/src/mame/drivers/cdi.cpp +++ b/src/mame/drivers/cdi.cpp @@ -44,8 +44,16 @@ TODO: #include "cdi.lh" -#define CLOCK_A XTAL(30'000'000) -#define CLOCK_B XTAL(19'660'800) +// TODO: NTSC system clock is 30.2098 MHz; additional 4.9152 MHz XTAL provided for UART +#define CLOCK_A 30_MHz_XTAL + +/*----------- debug defines -----------*/ + +#define VERBOSE_LEVEL (1) + +#define ENABLE_VERBOSE_LOG (0) + +#define ENABLE_UART_PRINTING (0) #if ENABLE_VERBOSE_LOG static inline void ATTR_PRINTF(3,4) verboselog(device_t& device, int n_level, const char *s_fmt, ...) @@ -827,7 +835,7 @@ void cdi_state::cdimono1_base(machine_config &config) m_maincpu->set_addrmap(AS_PROGRAM, &cdi_state::cdimono1_mem); m_maincpu->set_addrmap(m68000_base_device::AS_CPU_SPACE, &cdi_state::cdi070_cpuspace); - MCD212(config, m_mcd212, 0); + MCD212(config, m_mcd212, CLOCK_A); m_mcd212->set_screen("screen"); m_mcd212->int1_callback().set(m_scc, FUNC(cdi68070_device::int1_w)); m_mcd212->int2_callback().set(m_scc, FUNC(cdi68070_device::int2_w)); @@ -854,7 +862,9 @@ void cdi_state::cdimono1_base(machine_config &config) CDI_68070(config, m_scc, 0, "maincpu"); m_scc->iack4_callback().set_constant(0x80); - CDI_CDIC(config, m_cdic, 0); + // IMS66490 CDIC input clocks are 22.5792 MHz and 19.3536 MHz (latter is generated by PLL circuit incorporating 19.3575 MHz XTAL) + // DSP input clock is 7.5264 MHz + CDI_CDIC(config, m_cdic, 45.1584_MHz_XTAL / 2); m_cdic->int_callback().set(m_scc, FUNC(cdi68070_device::in4_w)); CDI_SLAVE(config, m_slave_hle, 0); @@ -874,7 +884,7 @@ void cdi_state::cdimono1_base(machine_config &config) m_cdda->add_route(ALL_OUTPUTS, "lspeaker", 1.0); m_cdda->add_route(ALL_OUTPUTS, "rspeaker", 1.0); - MK48T08(config, "mk48t08", 0); + MK48T08(config, "mk48t08"); } // CD-i model 220 (Mono-II, NTSC) @@ -884,7 +894,7 @@ void cdi_state::cdimono2(machine_config &config) m_maincpu->set_addrmap(AS_PROGRAM, &cdi_state::cdimono2_mem); m_maincpu->set_addrmap(m68000_base_device::AS_CPU_SPACE, &cdi_state::cdi070_cpuspace); - MCD212(config, m_mcd212, 0); + MCD212(config, m_mcd212, CLOCK_A); m_mcd212->set_screen("screen"); m_mcd212->int1_callback().set(m_scc, FUNC(cdi68070_device::int1_w)); m_mcd212->int2_callback().set(m_scc, FUNC(cdi68070_device::int2_w)); @@ -911,9 +921,9 @@ void cdi_state::cdimono2(machine_config &config) MCFG_MACHINE_RESET_OVERRIDE( cdi_state, cdimono2 ) CDI_68070(config, m_scc, 0, "maincpu"); - M68HC05EG(config, m_servo, XTAL(4'000'000)); + M68HC05EG(config, m_servo, 4_MHz_XTAL); // FIXME: actually MC68HC05C8 m_servo->set_addrmap(AS_PROGRAM, &cdi_state::cdimono2_servo_mem); - M68HC05EG(config, m_slave, XTAL(4'000'000)); + M68HC05EG(config, m_slave, 4_MHz_XTAL); // FIXME: actually MC68HC05C8 m_slave->set_addrmap(AS_PROGRAM, &cdi_state::cdimono2_slave_mem); CDROM(config, "cdrom").set_interface("cdi_cdrom"); @@ -942,7 +952,7 @@ void cdi_state::cdi910(machine_config &config) m_maincpu->set_addrmap(AS_PROGRAM, &cdi_state::cdi910_mem); m_maincpu->set_addrmap(m68000_base_device::AS_CPU_SPACE, &cdi_state::cdi070_cpuspace); - MCD212(config, m_mcd212, 0); + MCD212(config, m_mcd212, CLOCK_A); m_mcd212->set_screen("screen"); m_mcd212->int1_callback().set(m_scc, FUNC(cdi68070_device::int1_w)); m_mcd212->int2_callback().set(m_scc, FUNC(cdi68070_device::int2_w)); @@ -969,9 +979,9 @@ void cdi_state::cdi910(machine_config &config) MCFG_MACHINE_RESET_OVERRIDE( cdi_state, cdimono2 ) CDI_68070(config, m_scc, 0, "maincpu"); - M68HC05EG(config, m_servo, XTAL(4'000'000)); + M68HC05EG(config, m_servo, 4_MHz_XTAL); // FIXME: actually MC68HSC05C8 m_servo->set_addrmap(AS_PROGRAM, &cdi_state::cdimono2_servo_mem); - M68HC05EG(config, m_slave, XTAL(4'000'000)); + M68HC05EG(config, m_slave, 4_MHz_XTAL); // FIXME: actually MC68HSC05C8 m_slave->set_addrmap(AS_PROGRAM, &cdi_state::cdimono2_slave_mem); CDROM(config, "cdrom").set_interface("cdi_cdrom"); diff --git a/src/mame/drivers/model2.cpp b/src/mame/drivers/model2.cpp index 9d4dc41a80d..692c687b0ec 100644 --- a/src/mame/drivers/model2.cpp +++ b/src/mame/drivers/model2.cpp @@ -2449,13 +2449,13 @@ void model2_state::model2_screen(machine_config &config) void model2_state::model2_scsp(machine_config &config) { - M68000(config, m_audiocpu, 45158000/4); // SCSP Clock / 2 + M68000(config, m_audiocpu, 45.1584_MHz_XTAL / 4); // SCSP Clock / 2 m_audiocpu->set_addrmap(AS_PROGRAM, &model2_state::model2_snd); SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); - SCSP(config, m_scsp, 45158000/2); // 45.158MHz XTAL at Video board(Model 2A-CRX) + SCSP(config, m_scsp, 45.1584_MHz_XTAL / 2); // 45.158MHz XTAL at Video board(Model 2A-CRX) m_scsp->set_addrmap(0, &model2_state::scsp_map); m_scsp->irq_cb().set(FUNC(model2_state::scsp_irq)); m_scsp->add_route(0, "lspeaker", 1.0); diff --git a/src/mame/drivers/model3.cpp b/src/mame/drivers/model3.cpp index ac9637de63d..29ccafb90cc 100644 --- a/src/mame/drivers/model3.cpp +++ b/src/mame/drivers/model3.cpp @@ -6024,7 +6024,7 @@ void model3_state::add_cpu_166mhz(machine_config &config) void model3_state::add_base_devices(machine_config &config) { - M68000(config, m_audiocpu, 45158000/4); // SCSP Clock / 2 + M68000(config, m_audiocpu, 45.1584_MHz_XTAL / 4); // SCSP Clock / 2 m_audiocpu->set_addrmap(AS_PROGRAM, &model3_state::model3_snd); EEPROM_93C46_16BIT(config, m_eeprom); @@ -6044,13 +6044,13 @@ void model3_state::add_base_devices(machine_config &config) SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); - SCSP(config, m_scsp1, 45158000/2); // 45.158 MHz XTAL + SCSP(config, m_scsp1, 45.1584_MHz_XTAL / 2); // 45.158 MHz XTAL m_scsp1->set_addrmap(0, &model3_state::scsp1_map); m_scsp1->irq_cb().set(FUNC(model3_state::scsp_irq)); m_scsp1->add_route(0, "lspeaker", 1.0); m_scsp1->add_route(1, "rspeaker", 1.0); - scsp_device &scsp2(SCSP(config, "scsp2", 45158000/2)); + scsp_device &scsp2(SCSP(config, "scsp2", 45.1584_MHz_XTAL / 2)); scsp2.set_addrmap(0, &model3_state::scsp2_map); scsp2.add_route(0, "lspeaker", 1.0); scsp2.add_route(1, "rspeaker", 1.0); diff --git a/src/mame/includes/cdi.h b/src/mame/includes/cdi.h index d88deb73360..ef5e1b9c9cb 100644 --- a/src/mame/includes/cdi.h +++ b/src/mame/includes/cdi.h @@ -14,9 +14,6 @@ /*----------- driver state -----------*/ -#define CLOCK_A XTAL(30'000'000) -#define CLOCK_B XTAL(19'660'800) - class cdi_state : public driver_device { public: @@ -137,12 +134,4 @@ public: void cdi070_cpuspace(address_map &map); }; -/*----------- debug defines -----------*/ - -#define VERBOSE_LEVEL (1) - -#define ENABLE_VERBOSE_LOG (0) - -#define ENABLE_UART_PRINTING (0) - #endif // MAME_INCLUDES_CDI_H diff --git a/src/mame/machine/cdi070.cpp b/src/mame/machine/cdi070.cpp index 1135577c0f2..fa47abfa71d 100644 --- a/src/mame/machine/cdi070.cpp +++ b/src/mame/machine/cdi070.cpp @@ -23,10 +23,17 @@ TODO: #include "emu.h" #include "machine/cdi070.h" -#include "includes/cdi.h" #include "cpu/m68000/m68000.h" +/*----------- debug defines -----------*/ + +#define VERBOSE_LEVEL (1) + +#define ENABLE_VERBOSE_LOG (0) + +#define ENABLE_UART_PRINTING (0) + // device type definition DEFINE_DEVICE_TYPE(CDI_68070, cdi68070_device, "cdi68070", "CDI68070") @@ -409,8 +416,9 @@ void cdi68070_device::set_timer_callback(int channel) { case 0: { + // Timer clock period is 96/CLKOUT uint32_t compare = 0x10000 - m_timers.timer0; - attotime period = attotime::from_hz(CLOCK_A/192) * compare; + attotime period = m_maincpu->cycles_to_attotime(96 * compare); m_timers.timer0_timer->adjust(period); break; } diff --git a/src/mame/machine/cdicdic.cpp b/src/mame/machine/cdicdic.cpp index 648e87a09f9..781c5d412ea 100644 --- a/src/mame/machine/cdicdic.cpp +++ b/src/mame/machine/cdicdic.cpp @@ -30,6 +30,13 @@ TODO: #include "sound/cdda.h" +/*----------- debug defines -----------*/ + +#define VERBOSE_LEVEL (1) + +#define ENABLE_VERBOSE_LOG (0) + + // device type definition DEFINE_DEVICE_TYPE(CDI_CDIC, cdicdic_device, "cdicdic", "CDICDIC") diff --git a/src/mame/machine/cdislave.cpp b/src/mame/machine/cdislave.cpp index e7aee3e7d9b..dc86a98c78a 100644 --- a/src/mame/machine/cdislave.cpp +++ b/src/mame/machine/cdislave.cpp @@ -23,7 +23,13 @@ TODO: #include "emu.h" #include "machine/cdislave.h" -#include "includes/cdi.h" + + +/*----------- debug defines -----------*/ + +#define VERBOSE_LEVEL (1) + +#define ENABLE_VERBOSE_LOG (0) // device type definition