diff options
author | MooglyGuy <therealmogminer@gmail.com> | 2019-06-18 14:37:14 +0200 |
---|---|---|
committer | MooglyGuy <therealmogminer@gmail.com> | 2019-06-18 14:37:14 +0200 |
commit | 1af85e45ca0c5db5f2f2956d5c14f6691e1c29ee (patch) | |
tree | 37c4bbb5388210db02e0c5542abd508df97696d0 | |
parent | 56af5d0d267e9665802ef47bf9d6c918bdcc8d46 (diff) |
-74381: Added untested 74S381 ALU / Function Generator device. [Ryan Holtz]
-dpb_brushproc: Added PROM signal lookups, nw
-am25s55x: Fixed some incorrect comments, nw
-rw-r--r-- | scripts/src/machine.lua | 12 | ||||
-rw-r--r-- | scripts/target/mame/arcade.lua | 1 | ||||
-rw-r--r-- | scripts/target/mame/mess.lua | 1 | ||||
-rw-r--r-- | src/devices/machine/74381.cpp | 151 | ||||
-rw-r--r-- | src/devices/machine/74381.h | 61 | ||||
-rw-r--r-- | src/devices/machine/am25s55x.cpp | 2 | ||||
-rw-r--r-- | src/devices/machine/am25s55x.h | 2 | ||||
-rw-r--r-- | src/mame/video/dpb_brushproc.cpp | 118 | ||||
-rw-r--r-- | src/mame/video/dpb_brushproc.h | 23 |
9 files changed, 365 insertions, 6 deletions
diff --git a/scripts/src/machine.lua b/scripts/src/machine.lua index cc7119fa555..c34c317fc0e 100644 --- a/scripts/src/machine.lua +++ b/scripts/src/machine.lua @@ -480,6 +480,18 @@ end --------------------------------------------------- -- +--@src/devices/machine/74381.h,MACHINES["TTL74381"] = true +--------------------------------------------------- + +if (MACHINES["TTL74381"]~=null) then + files { + MAME_DIR .. "src/devices/machine/74381.cpp", + MAME_DIR .. "src/devices/machine/74381.h", + } +end + +--------------------------------------------------- +-- --@src/devices/machine/7474.h,MACHINES["TTL7474"] = true --------------------------------------------------- diff --git a/scripts/target/mame/arcade.lua b/scripts/target/mame/arcade.lua index d3eced5fdc1..41d04212a4b 100644 --- a/scripts/target/mame/arcade.lua +++ b/scripts/target/mame/arcade.lua @@ -398,6 +398,7 @@ MACHINES["TTL74166"] = true --MACHINES["TTL74175"] = true MACHINES["TTL74181"] = true MACHINES["TTL74259"] = true +--MACHINES["TTL74381"] = true MACHINES["TTL7474"] = true MACHINES["KBDC8042"] = true MACHINES["I8257"] = true diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua index d055213f768..642b0249446 100644 --- a/scripts/target/mame/mess.lua +++ b/scripts/target/mame/mess.lua @@ -629,6 +629,7 @@ MACHINES["TTL74164"] = true MACHINES["TTL74175"] = true MACHINES["TTL74181"] = true MACHINES["TTL74259"] = true +MACHINES["TTL74381"] = true MACHINES["TTL7474"] = true MACHINES["TUBE"] = true MACHINES["UPD1990A"] = true diff --git a/src/devices/machine/74381.cpp b/src/devices/machine/74381.cpp new file mode 100644 index 00000000000..65514a414e3 --- /dev/null +++ b/src/devices/machine/74381.cpp @@ -0,0 +1,151 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz +/*************************************************************************** + + 74381.cpp + TI SN74S381 ALU / Function Generator + +***************************************************************************/ + +#include "emu.h" +#include "74381.h" + +/*****************************************************************************/ + +DEFINE_DEVICE_TYPE(SN74S381, sn74s381_device, "sn74s381", "TI SN74S381 ALU / Function Generator") + +//------------------------------------------------- +// sn74s381_device - constructor +//------------------------------------------------- + +sn74s381_device::sn74s381_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, SN74S381, tag, owner, clock) + , m_a(0) + , m_b(0) + , m_s(0) + , m_cn(0) + , m_f(0) + , m_p(false) + , m_g(false) + , m_f_out(*this) + , m_p_out(*this) + , m_g_out(*this) +{ +} + +void sn74s381_device::device_start() +{ + save_item(NAME(m_a)); + save_item(NAME(m_b)); + save_item(NAME(m_s)); + save_item(NAME(m_cn)); + save_item(NAME(m_f)); + save_item(NAME(m_p)); + save_item(NAME(m_g)); + + m_f_out.resolve_safe(); + m_p_out.resolve_safe(); + m_g_out.resolve_safe(); +} + +void sn74s381_device::device_reset() +{ + m_a = 0; + m_b = 0; + m_s = 0; + m_cn = 0; + m_f = 0; + m_p = false; + m_g = false; + + m_f_out(0); + m_p_out(true); + m_g_out(true); +} + +void sn74s381_device::a_w(uint8_t data) +{ + m_a = data; + update(); +} + +void sn74s381_device::b_w(uint8_t data) +{ + m_b = data; + update(); +} + +void sn74s381_device::s_w(uint8_t data) +{ + m_s = data; + update(); +} + +void sn74s381_device::cn_w(int state) +{ + m_cn = state; + update(); +} + +void sn74s381_device::update() +{ + switch (m_s) + { + case 0: // Clear + m_f = 0; + m_p = true; + m_g = true; + break; + case 1: // B - A + { + const uint8_t c = 1 - m_cn; + const uint8_t d = (m_a + c) & 0xf; + m_f = (m_b - d) & 0xf; + m_p = (( m_a ^ m_b) >> 3) == 0; + m_g = ((~m_a & m_b) >> 3) != 0; + break; + } + case 2: // A - B + { + const uint8_t c = 1 - m_cn; + const uint8_t d = (m_b + c) & 0xf; + m_f = (m_a - d) & 0xf; + m_p = ((m_a ^ m_b) >> 3) == 0; + m_g = ((m_a & ~m_b) >> 3) != 0; + break; + } + case 3: // A + B + { + const uint8_t c = m_cn; + const uint8_t d = (m_b + c) & 0xf; + m_f = (m_a + d) & 0xf; + m_p = ((m_a ^ m_b) >> 3) != 0; + m_g = ((m_a & m_b) >> 3) != 0; + break; + } + case 4: // A ^ B + m_f = m_a ^ m_b; + m_p = (m_a >> 3) != (m_b >> 3); + m_g = false; + break; + case 5: // A | B + m_f = m_a | m_b; + m_p = (m_a >> 3) != 0 || (m_b >> 3) != 0; + m_g = false; + break; + case 6: // A & B + m_f = m_a & m_b; + m_p = (m_a >> 3) != 0 && (m_b >> 3) != 0; + m_g = false; + break; + case 7: // Preset + m_f = 0xf; + m_p = true; + m_g = false; + break; + } + + m_f_out(m_f); + m_p_out(m_p ? 0 : 1); + m_g_out(m_g ? 0 : 1); +} diff --git a/src/devices/machine/74381.h b/src/devices/machine/74381.h new file mode 100644 index 00000000000..2aef6456540 --- /dev/null +++ b/src/devices/machine/74381.h @@ -0,0 +1,61 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz +/*************************************************************************** + + 74381.h + SN74S381 ALU / Function Generator + +***************************************************************************/ + +#ifndef MAME_MACHINE_74381_H +#define MAME_MACHINE_74381_H + +#pragma once + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// ======================> sn74s381_device + +class sn74s381_device : public device_t +{ +public: + // construction/destruction + sn74s381_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); + + void a_w(uint8_t data); + void b_w(uint8_t data); + void s_w(uint8_t data); + void cn_w(int state); + + auto f() { return m_f_out.bind(); } + auto p() { return m_p_out.bind(); } + auto g() { return m_g_out.bind(); } + +protected: + // device-level overrides + virtual void device_start() override; + virtual void device_reset() override; + + void update(); + + uint8_t m_a; + uint8_t m_b; + uint8_t m_s; + uint8_t m_cn; + + uint8_t m_f; + bool m_p; + bool m_g; + + devcb_write8 m_f_out; + devcb_write_line m_p_out; + devcb_write_line m_g_out; +}; + + +// device type definition +DECLARE_DEVICE_TYPE(SN74S381, sn74s381_device) + +#endif // MAME_MACHINE_74381_H diff --git a/src/devices/machine/am25s55x.cpp b/src/devices/machine/am25s55x.cpp index c1b4bbd310b..b1624179463 100644 --- a/src/devices/machine/am25s55x.cpp +++ b/src/devices/machine/am25s55x.cpp @@ -2,7 +2,7 @@ // copyright-holders:Ryan Holtz /*************************************************************************** - am25s55x.h + am25s55x.cpp AMD Am25S557/Am25S558 8x8-bit Combinatorial Multiplier ***************************************************************************/ diff --git a/src/devices/machine/am25s55x.h b/src/devices/machine/am25s55x.h index 6501c6065c3..1fa3cab8102 100644 --- a/src/devices/machine/am25s55x.h +++ b/src/devices/machine/am25s55x.h @@ -16,7 +16,7 @@ // TYPE DEFINITIONS //************************************************************************** -// ======================> am25s557_base_device +// ======================> am25s55x_device class am25s55x_device : public device_t { diff --git a/src/mame/video/dpb_brushproc.cpp b/src/mame/video/dpb_brushproc.cpp index 702c7bad950..cad50dae4aa 100644 --- a/src/mame/video/dpb_brushproc.cpp +++ b/src/mame/video/dpb_brushproc.cpp @@ -34,6 +34,9 @@ dpb7000_brushproc_card_device::dpb7000_brushproc_card_device(const machine_confi , m_sel_eh(false) , m_b_bus_ah(false) , m_fcs(false) + , m_prom_addr(0) + , m_prom_base(nullptr) + , m_prom_out(0) , m_store1(*this) , m_store2(*this) , m_cbus(*this) @@ -41,6 +44,11 @@ dpb7000_brushproc_card_device::dpb7000_brushproc_card_device(const machine_confi , m_mult_fa(*this, "mult_fa") , m_mult_ga(*this, "mult_ga") , m_mult_gd(*this, "mult_gd") + , m_alu_he(*this, "alu_he") + , m_alu_ge(*this, "alu_ge") + , m_alu_fe(*this, "alu_fe") + , m_alu_ee(*this, "alu_ee") + , m_prom(*this, "prom") { } @@ -62,6 +70,9 @@ void dpb7000_brushproc_card_device::device_start() save_item(NAME(m_b_bus_ah)); save_item(NAME(m_fcs)); + save_item(NAME(m_prom_addr)); + save_item(NAME(m_prom_out)); + m_store1.resolve_safe(); m_store2.resolve_safe(); m_cbus.resolve_safe(); @@ -85,6 +96,10 @@ void dpb7000_brushproc_card_device::device_reset() m_sel_eh = 0; m_b_bus_ah = 0; m_fcs = 0; + + m_prom_addr = 0; + m_prom_base = m_prom->base(); + m_prom_out = 0; } void dpb7000_brushproc_card_device::device_add_mconfig(machine_config &config) @@ -92,10 +107,15 @@ void dpb7000_brushproc_card_device::device_add_mconfig(machine_config &config) AM25S558(config, m_mult_fa); AM25S558(config, m_mult_ga); AM25S558(config, m_mult_gd); + + SN74S381(config, m_alu_he); + SN74S381(config, m_alu_ge); + SN74S381(config, m_alu_fe); + SN74S381(config, m_alu_ee); } ROM_START( dpb7000_brushproc ) - ROM_REGION(0x200, "brushproc_prom", 0) + ROM_REGION(0x200, "prom", 0) ROM_LOAD("pb-02c-17593-baa.bin", 0x000, 0x200, CRC(a74cc1f5) SHA1(3b789d5a29c70c93dec56f44be8c14b41915bdef)) ROM_END @@ -124,7 +144,6 @@ void dpb7000_brushproc_card_device::brush_w(uint8_t data) m_brush_in = data; } - void dpb7000_brushproc_card_device::k_w(uint8_t data) { m_k_in = data; @@ -145,33 +164,126 @@ void dpb7000_brushproc_card_device::k_inv_w(int state) m_k_invert = (bool)state; } - void dpb7000_brushproc_card_device::func_w(uint8_t data) { m_func = data; + + const uint16_t old = m_prom_addr; + m_prom_addr &= 0x1f0; + m_prom_addr |= BIT(data, 3); + m_prom_addr |= BIT(data, 2) << 1; + m_prom_addr |= BIT(data, 1) << 2; + m_prom_addr |= BIT(data, 0) << 3; + if (old != m_prom_addr) + update_prom_signals(); } void dpb7000_brushproc_card_device::sel_lum1_w(int state) { m_sel_luma[0] = (bool)state; + + const uint16_t old = m_prom_addr; + m_prom_addr &= ~0x20; + m_prom_addr |= state << 5; + if (old != m_prom_addr) + update_prom_signals(); } void dpb7000_brushproc_card_device::sel_lum2_w(int state) { m_sel_luma[1] = (bool)state; + + const uint16_t old = m_prom_addr; + m_prom_addr &= ~0x10; + m_prom_addr |= state << 4; + if (old != m_prom_addr) + update_prom_signals(); } void dpb7000_brushproc_card_device::sel_eh_w(int state) { m_sel_eh = (bool)state; + + const uint16_t old = m_prom_addr; + m_prom_addr &= ~0x40; + m_prom_addr |= state << 6; + if (old != m_prom_addr) + update_prom_signals(); } void dpb7000_brushproc_card_device::b_bus_ah_w(int state) { m_b_bus_ah = (bool)state; + + const uint16_t old = m_prom_addr; + m_prom_addr &= ~0x80; + m_prom_addr |= state << 7; + if (old != m_prom_addr) + update_prom_signals(); } void dpb7000_brushproc_card_device::fixed_col_select_w(int state) { m_fcs = (bool)state; + + const uint16_t old = m_prom_addr; + m_prom_addr &= ~0x80; + m_prom_addr |= state << 8; + if (old != m_prom_addr) + update_prom_signals(); +} + +void dpb7000_brushproc_card_device::update_prom_signals() +{ + const uint8_t old = m_prom_out; + m_prom_out = m_prom_base[m_prom_addr]; + if (BIT(old, 0) != BIT(m_prom_out, 0)) + set_oe1(BIT(m_prom_out, 0)); + if (BIT(old, 1) != BIT(m_prom_out, 1)) + set_oe2(BIT(m_prom_out, 1)); + if (BIT(old, 2) != BIT(m_prom_out, 2)) + set_oe3(BIT(m_prom_out, 2)); + if (BIT(old, 3) != BIT(m_prom_out, 3)) + set_mask_sel_h(BIT(m_prom_out, 3)); + if (BIT(old, 4) != BIT(m_prom_out, 4)) + set_16bit_h(BIT(m_prom_out, 4)); + if (BIT(old, 5) != BIT(m_prom_out, 5)) + set_proc_sel_h(BIT(m_prom_out, 5)); + if (BIT(old, 6) != BIT(m_prom_out, 6)) + set_k_eq_il(BIT(m_prom_out, 6)); + if (BIT(old, 7) != BIT(m_prom_out, 7)) + set_oe4(BIT(m_prom_out, 7)); +} + +void dpb7000_brushproc_card_device::set_oe1(int state) +{ +} + +void dpb7000_brushproc_card_device::set_oe2(int state) +{ } + +void dpb7000_brushproc_card_device::set_oe3(int state) +{ +} + +void dpb7000_brushproc_card_device::set_oe4(int state) +{ +} + +void dpb7000_brushproc_card_device::set_mask_sel_h(int state) +{ +} + +void dpb7000_brushproc_card_device::set_16bit_h(int state) +{ +} + +void dpb7000_brushproc_card_device::set_proc_sel_h(int state) +{ +} + +void dpb7000_brushproc_card_device::set_k_eq_il(int state) +{ +} + diff --git a/src/mame/video/dpb_brushproc.h b/src/mame/video/dpb_brushproc.h index e5522cea817..28360032d3a 100644 --- a/src/mame/video/dpb_brushproc.h +++ b/src/mame/video/dpb_brushproc.h @@ -15,9 +15,9 @@ #pragma once +#include "machine/74381.h" #include "machine/am25s55x.h" - //************************************************************************** // TYPE DEFINITIONS //************************************************************************** @@ -59,6 +59,17 @@ protected: virtual void device_add_mconfig(machine_config &config) override; virtual const tiny_rom_entry *device_rom_region() const override; + void update_prom_signals(); + + void set_oe1(int state); + void set_oe2(int state); + void set_oe3(int state); + void set_oe4(int state); + void set_mask_sel_h(int state); + void set_16bit_h(int state); + void set_proc_sel_h(int state); + void set_k_eq_il(int state); + uint8_t m_store_in[2]; uint8_t m_ext_in; uint8_t m_brush_in; @@ -75,13 +86,23 @@ protected: bool m_b_bus_ah; bool m_fcs; + uint16_t m_prom_addr; + uint8_t *m_prom_base; + uint8_t m_prom_out; + devcb_write8 m_store1; devcb_write8 m_store2; devcb_write8 m_cbus; devcb_write_line m_pck; + required_device<am25s558_device> m_mult_fa; required_device<am25s558_device> m_mult_ga; required_device<am25s558_device> m_mult_gd; + required_device<sn74s381_device> m_alu_he; + required_device<sn74s381_device> m_alu_ge; + required_device<sn74s381_device> m_alu_fe; + required_device<sn74s381_device> m_alu_ee; + required_memory_region m_prom; }; // device type definition |