summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author AJR <ajrhacker@users.noreply.github.com>2018-10-13 15:50:25 -0400
committer AJR <ajrhacker@users.noreply.github.com>2018-10-13 15:50:25 -0400
commit151629a2cec06dc0899dfd261d452c3c2620d5cf (patch)
tree5eb216fc5285c2e195a40303ed2f159598c77a1c
parentefb15dc59ee984e737f3adb419a26d0c71726b76 (diff)
tms9980a: Internalize clock divider
-rw-r--r--src/devices/cpu/tms9900/tms9980a.cpp4
-rw-r--r--src/devices/cpu/tms9900/tms9980a.h3
-rw-r--r--src/mame/drivers/cosmic.cpp7
-rw-r--r--src/mame/drivers/jvh.cpp2
-rw-r--r--src/mame/drivers/looping.cpp2
-rw-r--r--src/mame/drivers/tm990189.cpp18
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))