From ccc03cab083c27777f615e60906c8dc3f0714610 Mon Sep 17 00:00:00 2001 From: mooglyguy Date: Mon, 17 Jun 2019 02:12:45 +0200 Subject: -tdc1008: Fixed latching of RND, TC, ACC, and SUB signals. [Ryan Holtz] -tmc208k: Added device for TRW TMC208K/TMC28KU 8x8-bit Parallel Multiplier. [Ryan Holtz] -dpb7000: Added placeholder devices for TMC multipliers on the Combiner Card, nw --- scripts/src/machine.lua | 12 +++ scripts/target/mame/arcade.lua | 1 + scripts/target/mame/mess.lua | 1 + src/devices/machine/tdc1008.cpp | 37 ++++++-- src/devices/machine/tdc1008.h | 6 ++ src/devices/machine/tmc208k.cpp | 182 ++++++++++++++++++++++++++++++++++++++++ src/devices/machine/tmc208k.h | 102 ++++++++++++++++++++++ src/mame/drivers/dpb7000.cpp | 21 ++++- 8 files changed, 354 insertions(+), 8 deletions(-) create mode 100644 src/devices/machine/tmc208k.cpp create mode 100644 src/devices/machine/tmc208k.h diff --git a/scripts/src/machine.lua b/scripts/src/machine.lua index 8ab1a7754ee..089d4b80154 100644 --- a/scripts/src/machine.lua +++ b/scripts/src/machine.lua @@ -2831,6 +2831,18 @@ if (MACHINES["TMC0430"]~=null) then } end +--------------------------------------------------- +-- +--@src/devices/machine/tmc208k.h,MACHINES["TMC208K"] = true +--------------------------------------------------- + +if (MACHINES["TMC208K"]~=null) then + files { + MAME_DIR .. "src/devices/machine/tmc208k.cpp", + MAME_DIR .. "src/devices/machine/tmc208k.h", + } +end + --------------------------------------------------- -- --@src/devices/machine/tmp68301.h,MACHINES["TMP68301"] = true diff --git a/scripts/target/mame/arcade.lua b/scripts/target/mame/arcade.lua index 5e93acfdd28..d25eaa8c899 100644 --- a/scripts/target/mame/arcade.lua +++ b/scripts/target/mame/arcade.lua @@ -598,6 +598,7 @@ MACHINES["TC0091LVC"] = true MACHINES["TE7750"] = true MACHINES["TICKET"] = true MACHINES["TIMEKPR"] = true +--MACHINES["TMC208K"] = true MACHINES["TMP68301"] = true --MACHINES["TMS5501"] = true MACHINES["TMS6100"] = true diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua index 1b85619611b..489b1d98930 100644 --- a/scripts/target/mame/mess.lua +++ b/scripts/target/mame/mess.lua @@ -608,6 +608,7 @@ MACHINES["TDC1008"] = true --MACHINES["TE7750"] = true MACHINES["TIMEKPR"] = true MACHINES["TMC0430"] = true +MACHINES["TMC208K"] = true MACHINES["TMP68301"] = true MACHINES["TMS5501"] = true MACHINES["TMS6100"] = true diff --git a/src/devices/machine/tdc1008.cpp b/src/devices/machine/tdc1008.cpp index db0762193d5..a374e1c4cbd 100644 --- a/src/devices/machine/tdc1008.cpp +++ b/src/devices/machine/tdc1008.cpp @@ -5,9 +5,6 @@ tdc1008.cpp TRW TDC1008 VLSI Multiplier - Accumulator - TODO: - - Three-State Control lines (TSX, TSM, TSL) are not yet implemented. - ***************************************************************************/ #include "emu.h" @@ -36,9 +33,13 @@ tdc1008_device::tdc1008_device(const machine_config &mconfig, const char *tag, d , m_clk_y(false) , m_clk_p(false) , m_prel(false) + , m_rnd_in(false) , m_rnd(false) + , m_tc_in(false) , m_tc(false) + , m_acc_in(false) , m_acc(false) + , m_sub_in(false) , m_sub(false) , m_xtp(*this) , m_msp(*this) @@ -63,9 +64,13 @@ void tdc1008_device::device_start() save_item(NAME(m_clk_y)); save_item(NAME(m_clk_p)); save_item(NAME(m_prel)); + save_item(NAME(m_rnd_in)); save_item(NAME(m_rnd)); + save_item(NAME(m_tc_in)); save_item(NAME(m_tc)); + save_item(NAME(m_acc_in)); save_item(NAME(m_acc)); + save_item(NAME(m_sub_in)); save_item(NAME(m_sub)); save_item(NAME(m_x.u)); save_item(NAME(m_y.u)); @@ -92,9 +97,13 @@ void tdc1008_device::device_reset() m_clk_y = false; m_clk_p = false; m_prel = false; + m_rnd_in = false; m_rnd = false; + m_tc_in = false; m_tc = false; + m_acc_in = false; m_acc = false; + m_sub_in = false; m_sub = false; m_x.u = 0; @@ -164,7 +173,10 @@ WRITE_LINE_MEMBER(tdc1008_device::clk_x_w) bool old = m_clk_x; m_clk_x = (bool)state; if (!old && m_clk_x) + { m_x.u = m_x_in; + latch_flags(); + } } WRITE_LINE_MEMBER(tdc1008_device::clk_y_w) @@ -172,7 +184,10 @@ WRITE_LINE_MEMBER(tdc1008_device::clk_y_w) bool old = m_clk_y; m_clk_y = (bool)state; if (!old && m_clk_y) + { m_y.u = m_y_in; + latch_flags(); + } } WRITE_LINE_MEMBER(tdc1008_device::clk_p_w) @@ -246,20 +261,28 @@ WRITE_LINE_MEMBER(tdc1008_device::prel_w) WRITE_LINE_MEMBER(tdc1008_device::rnd_w) { - m_rnd = (bool)state; + m_rnd_in = (bool)state; } WRITE_LINE_MEMBER(tdc1008_device::tc_w) { - m_tc = (bool)state; + m_tc_in = (bool)state; } WRITE_LINE_MEMBER(tdc1008_device::acc_w) { - m_acc = (bool)state; + m_acc_in = (bool)state; } WRITE_LINE_MEMBER(tdc1008_device::sub_w) { - m_sub = (bool)state; + m_sub_in = (bool)state; +} + +void tdc1008_device::latch_flags() +{ + m_rnd = m_rnd_in; + m_tc = m_tc_in; + m_acc = m_acc_in; + m_sub = m_sub_in; } diff --git a/src/devices/machine/tdc1008.h b/src/devices/machine/tdc1008.h index 54f60411c9c..5e42c95f7ab 100644 --- a/src/devices/machine/tdc1008.h +++ b/src/devices/machine/tdc1008.h @@ -59,6 +59,8 @@ protected: virtual void device_start() override; virtual void device_reset() override; + void latch_flags(); + union input_reg { int8_t s; @@ -84,9 +86,13 @@ protected: bool m_clk_y; bool m_clk_p; bool m_prel; + bool m_rnd_in; bool m_rnd; + bool m_tc_in; bool m_tc; + bool m_acc_in; bool m_acc; + bool m_sub_in; bool m_sub; input_reg m_x; diff --git a/src/devices/machine/tmc208k.cpp b/src/devices/machine/tmc208k.cpp new file mode 100644 index 00000000000..fe275fd693c --- /dev/null +++ b/src/devices/machine/tmc208k.cpp @@ -0,0 +1,182 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz +/*************************************************************************** + + tmc208k.cpp + TRW TMC208K/TMC28KU 8x8-bit Parallel Multiplier + + Known Equivalents: + - Logic Devices Inc. LMU08/8U + +***************************************************************************/ + +#include "emu.h" +#include "tmc208k.h" + +/*****************************************************************************/ + +DEFINE_DEVICE_TYPE(TMC208K, tmc208k_device, "tmc208k", "TRW TMC208K 8x8-bit Multiplier") +DEFINE_DEVICE_TYPE(TMC28KU, tmc28ku_device, "tmc28ku", "TRW TMC28KU 8x8-bit Multiplier") + + +//------------------------------------------------- +// tdc1008_device - constructor +//------------------------------------------------- + +template +tmc208_base_device::tmc208_base_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, type, tag, owner, clock) + , m_a_in(0) + , m_a(0) + , m_b_in(0) + , m_b(0) + , m_r_out(0) + , m_trim(false) + , m_tril(false) + , m_clk_a(false) + , m_clk_b(false) + , m_clk_r(false) + , m_rnd_in(false) + , m_rnd(false) + , m_msp(*this) + , m_lsp(*this) + , m_r(*this) +{ +} + +tmc208k_device::tmc208k_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : tmc208_base_device(mconfig, TMC208K, tag, owner, clock) +{ +} + +tmc28ku_device::tmc28ku_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : tmc208_base_device(mconfig, TMC28KU, tag, owner, clock) +{ +} + +template +void tmc208_base_device::device_start() +{ + save_item(NAME(m_a_in)); + save_item(NAME(m_a)); + save_item(NAME(m_b_in)); + save_item(NAME(m_b)); + save_item(NAME(m_r_out)); + save_item(NAME(m_trim)); + save_item(NAME(m_tril)); + save_item(NAME(m_clk_a)); + save_item(NAME(m_clk_b)); + save_item(NAME(m_clk_r)); + save_item(NAME(m_rnd_in)); + save_item(NAME(m_rnd)); + + m_msp.resolve_safe(); + m_lsp.resolve_safe(); + m_r.resolve_safe(); +} + +template +void tmc208_base_device::device_reset() +{ + m_a_in = 0; + m_a = 0; + m_b_in = 0; + m_b = 0; + m_r_out = 0; + m_trim = false; + m_tril = false; + m_clk_a = false; + m_clk_b = false; + m_clk_r = false; + m_rnd_in = false; + m_rnd = false; +} + +template +void tmc208_base_device::a_w(uint8_t data) +{ + m_a_in = (RegType)data; +} + +template +void tmc208_base_device::b_w(uint8_t data) +{ + m_b_in = (RegType)data; +} + +template +void tmc208_base_device::trim_w(int state) +{ + m_trim = (bool)state; +} + +template +void tmc208_base_device::tril_w(int state) +{ + m_tril = (bool)state; +} + +template +void tmc208_base_device::clk_a_w(int state) +{ + bool old = m_clk_a; + m_clk_a = (bool)state; + if (!old && m_clk_a) + clock_a(); +} + +template +void tmc208_base_device::clk_b_w(int state) +{ + bool old = m_clk_b; + m_clk_b = (bool)state; + if (!old && m_clk_b) + clock_b(); +} + +template +void tmc208_base_device::clk_r_w(int state) +{ + bool old = m_clk_r; + m_clk_r = (bool)state; + if (!old && m_clk_r) + multiply(); +} + +template +void tmc208_base_device::rnd_w(int state) +{ + m_rnd_in = (bool)state; +} + +template +void tmc208_base_device::multiply() +{ + m_r_out = (OutType)m_a * (OutType)m_b; + if (!m_trim) + m_msp((uint8_t)(m_r_out >> 8)); + if (!m_tril) + m_lsp((uint8_t)m_r_out); + m_r(m_r_out); +} + +template +void tmc208_base_device::clock_a() +{ + m_a = m_a_in; + m_rnd = m_rnd_in; +} + +template +void tmc208_base_device::clock_b() +{ + m_b = m_b_in; + m_rnd = m_rnd_in; +} + +// TMC208KU - Unsigned 8x8 Multiply + +void tmc28ku_device::clock_b() +{ + m_b = m_b_in; +} diff --git a/src/devices/machine/tmc208k.h b/src/devices/machine/tmc208k.h new file mode 100644 index 00000000000..eb077934eb2 --- /dev/null +++ b/src/devices/machine/tmc208k.h @@ -0,0 +1,102 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz +/*************************************************************************** + + tmc208k.h + TRW TMC208K/TMC28KU 8x8-bit Parallel Multiplier + + Known Equivalents: + - Logic Devices Inc. LMU08/8U + +***************************************************************************/ + +#ifndef MAME_MACHINE_TMC208K_TMC208K_H +#define MAME_MACHINE_TMC208K_TMC208K_H + +#pragma once + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// ======================> tmc208_base_device + +template +class tmc208_base_device : public device_t +{ +public: + // construction/destruction + tmc208_base_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock = 0); + + void a_w(uint8_t data); + void b_w(uint8_t data); + void trim_w(int state); + void tril_w(int state); + void clk_a_w(int state); + void clk_b_w(int state); + void clk_r_w(int state); + void rnd_w(int state); + + // Outputs by group + auto msp() { return m_msp.bind(); } + auto lsp() { return m_lsp.bind(); } + + // Full output + auto r() { return m_r.bind(); } + +protected: + // device-level overrides + virtual void device_start() override; + virtual void device_reset() override; + + void clock_a(); + virtual void clock_b(); + void multiply(); + + RegType m_a_in; + RegType m_a; + RegType m_b_in; + RegType m_b; + OutType m_r_out; + + bool m_trim; + bool m_tril; + bool m_clk_a; + bool m_clk_b; + bool m_clk_r; + bool m_rnd_in; + bool m_rnd; + + devcb_write8 m_msp; + devcb_write8 m_lsp; + devcb_write16 m_r; +}; + + +// ======================> tmc208k_device + +class tmc208k_device : public tmc208_base_device +{ +public: + // construction/destruction + tmc208k_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); +}; + + +// ======================> tmc28ku_device + +class tmc28ku_device : public tmc208_base_device +{ +public: + // construction/destruction + tmc28ku_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); + +protected: + virtual void clock_b() override; +}; + +// device type definition +DECLARE_DEVICE_TYPE(TMC208K, tmc208k_device) +DECLARE_DEVICE_TYPE(TMC28KU, tmc28ku_device) + +#endif // MAME_MACHINE_TMC208K_TMC208K_H diff --git a/src/mame/drivers/dpb7000.cpp b/src/mame/drivers/dpb7000.cpp index 2a4c49b3383..05b18bae9c8 100644 --- a/src/mame/drivers/dpb7000.cpp +++ b/src/mame/drivers/dpb7000.cpp @@ -17,6 +17,7 @@ #include "machine/com8116.h" #include "machine/input_merger.h" #include "machine/tdc1008.h" +#include "machine/tmc208k.h" #include "video/mc6845.h" #include "emupal.h" #include "screen.h" @@ -67,6 +68,11 @@ public: , m_filter_ce(*this, "filter_ce") , m_filter_cf(*this, "filter_cf") , m_filter_cg(*this, "filter_cg") + , m_combiner_ge(*this, "combiner_ge") // Lum I + , m_combiner_gd(*this, "combiner_gd") // Lum II + , m_combiner_gc(*this, "combiner_gc") // Chroma I + , m_combiner_gb(*this, "combiner_gb") // Chroma II + , m_combiner_ga(*this, "combiner_ga") // Ext I & II { } @@ -156,6 +162,12 @@ private: required_device m_filter_cf; required_device m_filter_cg; + required_device m_combiner_ge; + required_device m_combiner_gd; + required_device m_combiner_gc; + required_device m_combiner_gb; + required_device m_combiner_ga; + emu_timer *m_diskseq_clk; emu_timer *m_field_in_clk; emu_timer *m_field_out_clk; @@ -855,7 +867,7 @@ WRITE16_MEMBER(dpb7000_state::cpu_ctrlbus_w) } break; - case 10: // Output Timing Card, cursor registers + case 10: // Output Timing Card - cursor registers, Combiner Card { const uint8_t hi_bits = (data >> 14) & 3; if (hi_bits == 0) // Cursor Parameters @@ -1111,6 +1123,13 @@ void dpb7000_state::dpb7000(machine_config &config) TDC1008(config, m_filter_ce); TDC1008(config, m_filter_cf); TDC1008(config, m_filter_cg); + + // Combiner Card + TMC28KU(config, m_combiner_ge); + TMC28KU(config, m_combiner_gd); + TMC28KU(config, m_combiner_gc); + TMC28KU(config, m_combiner_gb); + TMC28KU(config, m_combiner_ga); } -- cgit v1.2.3