diff options
author | 2018-10-13 15:50:25 -0400 | |
---|---|---|
committer | 2018-10-13 15:50:25 -0400 | |
commit | 151629a2cec06dc0899dfd261d452c3c2620d5cf (patch) | |
tree | 5eb216fc5285c2e195a40303ed2f159598c77a1c | |
parent | efb15dc59ee984e737f3adb419a26d0c71726b76 (diff) |
tms9980a: Internalize clock divider
-rw-r--r-- | src/devices/cpu/tms9900/tms9980a.cpp | 4 | ||||
-rw-r--r-- | src/devices/cpu/tms9900/tms9980a.h | 3 | ||||
-rw-r--r-- | src/mame/drivers/cosmic.cpp | 7 | ||||
-rw-r--r-- | src/mame/drivers/jvh.cpp | 2 | ||||
-rw-r--r-- | src/mame/drivers/looping.cpp | 2 | ||||
-rw-r--r-- | src/mame/drivers/tm990189.cpp | 18 |
6 files changed, 20 insertions, 16 deletions
diff --git a/src/devices/cpu/tms9900/tms9980a.cpp b/src/devices/cpu/tms9900/tms9980a.cpp index ff450ccfd22..a2ad92feda7 100644 --- a/src/devices/cpu/tms9900/tms9980a.cpp +++ b/src/devices/cpu/tms9900/tms9980a.cpp @@ -39,6 +39,10 @@ - Memory accesses are always 2 bytes (even address byte, odd address byte) even for byte operations. Thus the 9980A, like the TMS9900, needs to pre-fetch the word at the destination before overwriting it. + - Whereas the TMS9900 relies on the TMS9904 to generate its four phase + clocks, the TMS9980A takes a single 6 MHz to 10 MHz clock input and + divides it by four internally. Only the phase 3 clock is provided as an + output for peripherals. - On the cycle level both TMS9900 and TMS9980A are equal, except for the additional cycles needed for memory read and write access. Accordingly, the emulation shares the core and the microprograms and redefines the diff --git a/src/devices/cpu/tms9900/tms9980a.h b/src/devices/cpu/tms9900/tms9980a.h index 963d2e7d2fb..23abc082eb1 100644 --- a/src/devices/cpu/tms9900/tms9980a.h +++ b/src/devices/cpu/tms9900/tms9980a.h @@ -46,6 +46,9 @@ protected: uint32_t execute_input_lines() const override; void execute_set_input(int irqline, int state) override; + virtual uint64_t execute_clocks_to_cycles(uint64_t clocks) const override { return (clocks + 4 - 1) / 4; } + virtual uint64_t execute_cycles_to_clocks(uint64_t cycles) const override { return (cycles * 4); } + virtual std::unique_ptr<util::disasm_interface> create_disassembler() override; address_space_config m_program_config80; diff --git a/src/mame/drivers/cosmic.cpp b/src/mame/drivers/cosmic.cpp index 2f4d164f65b..f9bce981824 100644 --- a/src/mame/drivers/cosmic.cpp +++ b/src/mame/drivers/cosmic.cpp @@ -1092,15 +1092,10 @@ MACHINE_CONFIG_END MACHINE_CONFIG_START(cosmic_state::cosmicg) /* basic machine hardware */ - TMS9980A(config, m_maincpu, COSMICG_MASTER_CLOCK/8); + TMS9980A(config, m_maincpu, COSMICG_MASTER_CLOCK); // 9.828 MHz Crystal m_maincpu->set_addrmap(AS_PROGRAM, &cosmic_state::cosmicg_map); m_maincpu->set_addrmap(AS_IO, &cosmic_state::cosmicg_io_map); - /* 9.828 MHz Crystal */ - /* R Nabet : huh ? This would imply the crystal frequency is somehow divided by 2 before being - fed to the tms9904 or tms9980. Also, I have never heard of a tms9900/9980 operating under - 1.5MHz. So, if someone can check this... */ - MCFG_MACHINE_START_OVERRIDE(cosmic_state,cosmic) MCFG_MACHINE_RESET_OVERRIDE(cosmic_state,cosmicg) diff --git a/src/mame/drivers/jvh.cpp b/src/mame/drivers/jvh.cpp index 9c7ec1a908c..0a2c546f366 100644 --- a/src/mame/drivers/jvh.cpp +++ b/src/mame/drivers/jvh.cpp @@ -123,7 +123,7 @@ void jvh_state::init_jvh() void jvh_state::common(machine_config &config) { // CPU TMS9980A; no line connections - TMS9980A(config, m_maincpu, 1000000); + TMS9980A(config, m_maincpu, 10000000); m_maincpu->set_addrmap(AS_PROGRAM, &jvh_state::jvh_map); m6802_cpu_device &soundcpu(M6802(config, "soundcpu", XTAL(4'000'000))); diff --git a/src/mame/drivers/looping.cpp b/src/mame/drivers/looping.cpp index ac1db512b37..71691121b4f 100644 --- a/src/mame/drivers/looping.cpp +++ b/src/mame/drivers/looping.cpp @@ -630,7 +630,7 @@ MACHINE_CONFIG_START(looping_state::looping) m_maincpu->set_vblank_int("screen", FUNC(looping_state::looping_interrupt)); // CPU TMS9980A for audio subsystem; no line connections - TMS9980A(config, m_audiocpu, SOUND_CLOCK/4); + TMS9980A(config, m_audiocpu, SOUND_CLOCK); m_audiocpu->set_addrmap(AS_PROGRAM, &looping_state::looping_sound_map); m_audiocpu->set_addrmap(AS_IO, &looping_state::looping_sound_io_map); diff --git a/src/mame/drivers/tm990189.cpp b/src/mame/drivers/tm990189.cpp index 8f5e56fa064..9be9ae43432 100644 --- a/src/mame/drivers/tm990189.cpp +++ b/src/mame/drivers/tm990189.cpp @@ -823,7 +823,7 @@ void tm990189_state::tm990_189_cru_map(address_map &map) MACHINE_CONFIG_START(tm990189_state::tm990_189) /* basic machine hardware */ - TMS9980A(config, m_tms9980a, 2000000); + TMS9980A(config, m_tms9980a, 8_MHz_XTAL); // clock divided by 4 internally m_tms9980a->set_addrmap(AS_PROGRAM, &tm990189_state::tm990_189_memmap); m_tms9980a->set_addrmap(AS_IO, &tm990189_state::tm990_189_cru_map); m_tms9980a->extop_cb().set(FUNC(tm990189_state::external_operation)); @@ -841,14 +841,14 @@ MACHINE_CONFIG_START(tm990189_state::tm990_189) /* Devices */ CASSETTE(config, "cassette", 0).add_route(ALL_OUTPUTS, "mono", 0.25); - TMS9901(config, m_tms9901_usr, 2000000); + TMS9901(config, m_tms9901_usr, 8_MHz_XTAL / 4); m_tms9901_usr->p_out_cb(0).set(FUNC(tm990189_state::usr9901_led0_w)); m_tms9901_usr->p_out_cb(1).set(FUNC(tm990189_state::usr9901_led1_w)); m_tms9901_usr->p_out_cb(2).set(FUNC(tm990189_state::usr9901_led2_w)); m_tms9901_usr->p_out_cb(3).set(FUNC(tm990189_state::usr9901_led3_w)); m_tms9901_usr->intlevel_cb().set(FUNC(tm990189_state::usr9901_interrupt_callback)); - TMS9901(config, m_tms9901_sys, 2000000); + TMS9901(config, m_tms9901_sys, 8_MHz_XTAL / 4); m_tms9901_sys->read_cb().set(FUNC(tm990189_state::sys9901_r)); m_tms9901_sys->p_out_cb(0).set(FUNC(tm990189_state::sys9901_digitsel0_w)); m_tms9901_sys->p_out_cb(1).set(FUNC(tm990189_state::sys9901_digitsel1_w)); @@ -868,7 +868,8 @@ MACHINE_CONFIG_START(tm990189_state::tm990_189) m_tms9901_sys->p_out_cb(15).set(FUNC(tm990189_state::sys9901_tapewdata_w)); m_tms9901_sys->intlevel_cb().set(FUNC(tm990189_state::sys9901_interrupt_callback)); - TMS9902(config, m_tms9902, 2000000).xmit_cb().set(FUNC(tm990189_state::xmit_callback)); // called when a character is transmitted + TMS9902(config, m_tms9902, 8_MHz_XTAL / 4); + m_tms9902->xmit_cb().set(FUNC(tm990189_state::xmit_callback)); // called when a character is transmitted TM990_189_RS232(config, "rs232", 0, m_tms9902); MCFG_TIMER_DRIVER_ADD_PERIODIC("display_timer", tm990189_state, display_callback, attotime::from_hz(30)) @@ -879,7 +880,7 @@ MACHINE_CONFIG_END MACHINE_CONFIG_START(tm990189_state::tm990_189_v) /* basic machine hardware */ - TMS9980A(config, m_tms9980a, 2000000); + TMS9980A(config, m_tms9980a, 8_MHz_XTAL); m_tms9980a->set_addrmap(AS_PROGRAM, &tm990189_state::tm990_189_v_memmap); m_tms9980a->set_addrmap(AS_IO, &tm990189_state::tm990_189_cru_map); m_tms9980a->extop_cb().set(FUNC(tm990189_state::external_operation)); @@ -902,14 +903,14 @@ MACHINE_CONFIG_START(tm990189_state::tm990_189_v) /* Devices */ CASSETTE(config, "cassette", 0).add_route(ALL_OUTPUTS, "mono", 0.25); - TMS9901(config, m_tms9901_usr, 2000000); + TMS9901(config, m_tms9901_usr, 8_MHz_XTAL / 4); m_tms9901_usr->p_out_cb(0).set(FUNC(tm990189_state::usr9901_led0_w)); m_tms9901_usr->p_out_cb(1).set(FUNC(tm990189_state::usr9901_led1_w)); m_tms9901_usr->p_out_cb(2).set(FUNC(tm990189_state::usr9901_led2_w)); m_tms9901_usr->p_out_cb(3).set(FUNC(tm990189_state::usr9901_led3_w)); m_tms9901_usr->intlevel_cb().set(FUNC(tm990189_state::usr9901_interrupt_callback)); - TMS9901(config, m_tms9901_sys, 2000000); + TMS9901(config, m_tms9901_sys, 8_MHz_XTAL / 4); m_tms9901_sys->read_cb().set(FUNC(tm990189_state::sys9901_r)); m_tms9901_sys->p_out_cb(0).set(FUNC(tm990189_state::sys9901_digitsel0_w)); m_tms9901_sys->p_out_cb(1).set(FUNC(tm990189_state::sys9901_digitsel1_w)); @@ -929,7 +930,8 @@ MACHINE_CONFIG_START(tm990189_state::tm990_189_v) m_tms9901_sys->p_out_cb(15).set(FUNC(tm990189_state::sys9901_tapewdata_w)); m_tms9901_sys->intlevel_cb().set(FUNC(tm990189_state::sys9901_interrupt_callback)); - TMS9902(config, m_tms9902, 2000000).xmit_cb().set(FUNC(tm990189_state::xmit_callback)); // called when a character is transmitted; + TMS9902(config, m_tms9902, 8_MHz_XTAL / 4); + m_tms9902->xmit_cb().set(FUNC(tm990189_state::xmit_callback)); // called when a character is transmitted; TM990_189_RS232(config, "rs232", 0, m_tms9902); MCFG_TIMER_DRIVER_ADD_PERIODIC("display_timer", tm990189_state, display_callback, attotime::from_hz(30)) |