diff options
author | 2020-09-13 17:45:42 +0900 | |
---|---|---|
committer | 2020-09-13 18:51:53 +1000 | |
commit | 612bf6546f096b92e5bd028813c99fa54e1604e1 (patch) | |
tree | 063d7270005a4c2e6628404565066d1941e939e6 | |
parent | 59ff79f394461e37bc08a3321509d070b8e0ba4a (diff) |
Device-fied PRO-CT0
for protection, aka ALPHA-8921(in Some later 80s alpha denshi PCBs) or SNK-9201
prot_fatfury2.cpp: Convert protection into alpha_8921.cpp device
-rw-r--r-- | scripts/src/machine.lua | 11 | ||||
-rw-r--r-- | scripts/target/mame/arcade.lua | 1 | ||||
-rw-r--r-- | scripts/target/mame/mess.lua | 1 | ||||
-rw-r--r-- | src/devices/bus/neogeo/prot_fatfury2.cpp | 86 | ||||
-rw-r--r-- | src/devices/bus/neogeo/prot_fatfury2.h | 6 | ||||
-rw-r--r-- | src/devices/machine/alpha_8921.cpp | 213 | ||||
-rw-r--r-- | src/devices/machine/alpha_8921.h | 85 |
7 files changed, 340 insertions, 63 deletions
diff --git a/scripts/src/machine.lua b/scripts/src/machine.lua index a4751370c7d..600c22f2746 100644 --- a/scripts/src/machine.lua +++ b/scripts/src/machine.lua @@ -4535,3 +4535,14 @@ if (MACHINES["SWIM3"]~=null) then MAME_DIR .. "src/devices/machine/swim3.h", } end + +--------------------------------------------------- +-- +--@src/devices/machine/alpha_8921.h,MACHINES["ALPHA_8921"] = true +--------------------------------------------------- +if (MACHINES["ALPHA_8921"]~=null) then + files { + MAME_DIR .. "src/devices/machine/alpha_8921.cpp", + MAME_DIR .. "src/devices/machine/alpha_8921.h", + } +end diff --git a/scripts/target/mame/arcade.lua b/scripts/target/mame/arcade.lua index 1a295e77378..3ecc8b0f72f 100644 --- a/scripts/target/mame/arcade.lua +++ b/scripts/target/mame/arcade.lua @@ -388,6 +388,7 @@ VIDEOS["VRENDER0"] = true MACHINES["ACORN_VIDC"] = true MACHINES["AKIKO"] = true +MACHINES["ALPHA_8921"] = true --MACHINES["AM2901B"] = true MACHINES["ARM_IOMD"] = true MACHINES["AUTOCONFIG"] = true diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua index 879f722a883..e01532fb463 100644 --- a/scripts/target/mame/mess.lua +++ b/scripts/target/mame/mess.lua @@ -426,6 +426,7 @@ VIDEOS["BT431"] = true -------------------------------------------------- MACHINES["AKIKO"] = true +MACHINES["ALPHA_8921"] = true MACHINES["AM2901B"] = true MACHINES["AUTOCONFIG"] = true MACHINES["BUSMOUSE"] = true diff --git a/src/devices/bus/neogeo/prot_fatfury2.cpp b/src/devices/bus/neogeo/prot_fatfury2.cpp index bd7af9247db..c8e7151e6e8 100644 --- a/src/devices/bus/neogeo/prot_fatfury2.cpp +++ b/src/devices/bus/neogeo/prot_fatfury2.cpp @@ -11,14 +11,18 @@ DEFINE_DEVICE_TYPE(NG_FATFURY2_PROT, fatfury2_prot_device, "ng_fatfury_prot", "N fatfury2_prot_device::fatfury2_prot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, NG_FATFURY2_PROT, tag, owner, clock), - m_prot_data(0) + m_pro_ct0(*this, "pro_ct0") { } +void fatfury2_prot_device::device_add_mconfig(machine_config &config) +{ + ALPHA_8921(config, m_pro_ct0, 0); // PRO-CT0 or SNK-9201 +} + void fatfury2_prot_device::device_start() { - save_item(NAME(m_prot_data)); } void fatfury2_prot_device::device_reset() @@ -33,69 +37,27 @@ void fatfury2_prot_device::device_reset() /* 0x2xxxxx range. There are several checks all around the code. */ uint16_t fatfury2_prot_device::protection_r(offs_t offset) { - uint16_t res = m_prot_data >> 24; - - switch (offset) - { - case 0x55550/2: - case 0xffff0/2: - case 0x00000/2: - case 0xff000/2: - case 0x36000/2: - case 0x36008/2: - return res; - - case 0x36004/2: - case 0x3600c/2: - return ((res & 0xf0) >> 4) | ((res & 0x0f) << 4); - - default: - logerror("unknown protection read at %s, offset %08x\n", machine().describe_context(), offset << 1); - return 0; - } + m_pro_ct0->even_w(BIT(offset, 1)); + m_pro_ct0->h_w(BIT(offset, 2)); + u8 gad = m_pro_ct0->gad_r(); + u8 gbd = m_pro_ct0->gbd_r(); + return (BIT(gbd, 0, 2) << 6) | (BIT(gbd, 2, 2) << 4) | (BIT(gad, 0, 2) << 6) | (BIT(gad, 2, 2) << 4); } void fatfury2_prot_device::protection_w(offs_t offset, uint16_t data) { - switch (offset) - { - case 0x11112/2: /* data == 0x1111; expects 0xff000000 back */ - m_prot_data = 0xff000000; - break; - - case 0x33332/2: /* data == 0x3333; expects 0x0000ffff back */ - m_prot_data = 0x0000ffff; - break; - - case 0x44442/2: /* data == 0x4444; expects 0x00ff0000 back */ - m_prot_data = 0x00ff0000; - break; - - case 0x55552/2: /* data == 0x5555; read back from 55550, ffff0, 00000, ff000 */ - m_prot_data = 0xff00ff00; - break; - - case 0x56782/2: /* data == 0x1234; read back from 36000 *or* 36004 */ - m_prot_data = 0xf05a3601; - break; - - case 0x42812/2: /* data == 0x1824; read back from 36008 *or* 3600c */ - m_prot_data = 0x81422418; - break; - - case 0x55550/2: - case 0xffff0/2: - case 0xff000/2: - case 0x36000/2: - case 0x36004/2: - case 0x36008/2: - case 0x3600c/2: - m_prot_data <<= 8; - break; - - default: - logerror("unknown protection write at %s, offset %08x, data %02x\n", machine().describe_context(), offset, data); - break; - } + // /PORTOEL connected into PRO-CT0 CLK pin + m_pro_ct0->clk_w(true); + + m_pro_ct0->load_w(BIT(offset, 0)); // A1 + m_pro_ct0->even_w(BIT(offset, 1)); // A2 + m_pro_ct0->h_w(BIT(offset, 2)); // A3 + + // C16-31 = A4-A19, C0-C15 = D0-D15 + m_pro_ct0->c_w((u32(bitswap<16>(BIT(offset, 3, 16), 15, 13, 11, 9, 14, 12, 10, 8, 7, 5, 3, 1, 6, 4, 2, 0)) << 16) | + bitswap<16>(data, 15, 13, 11, 9, 14, 12, 10, 8, 7, 5, 3, 1, 6, 4, 2, 0)); + + // release /PORTOEL + m_pro_ct0->clk_w(false); } diff --git a/src/devices/bus/neogeo/prot_fatfury2.h b/src/devices/bus/neogeo/prot_fatfury2.h index 111b9f7388b..1cab87cb26a 100644 --- a/src/devices/bus/neogeo/prot_fatfury2.h +++ b/src/devices/bus/neogeo/prot_fatfury2.h @@ -6,6 +6,8 @@ #pragma once +#include "machine/alpha_8921.h" + DECLARE_DEVICE_TYPE(NG_FATFURY2_PROT, fatfury2_prot_device) @@ -19,10 +21,12 @@ public: void protection_w(offs_t offset, uint16_t data); protected: + virtual void device_add_mconfig(machine_config &config) override; virtual void device_start() override; virtual void device_reset() override; - uint32_t m_prot_data; +private: + required_device<alpha_8921_device> m_pro_ct0; // PRO-CT0 or SNK-9201 }; #endif // MAME_BUS_NEOGEO_PROT_FATFURY2_H diff --git a/src/devices/machine/alpha_8921.cpp b/src/devices/machine/alpha_8921.cpp new file mode 100644 index 00000000000..1157b061f28 --- /dev/null +++ b/src/devices/machine/alpha_8921.cpp @@ -0,0 +1,213 @@ +// license:BSD-3-Clause +// copyright-holders:cam900 +/*************************************************************************** + + Alpha denshi ALPHA-8921 emulation + + Also known as + SNK PRO-CT0 + SNK-9201 + + This chip is sprite ROM data serializer, or optional security device. + used in some later 80s Alpha Denshi hardware(ex: Gang Wars), + Some early Neogeo MVS motherboards, AES cartridges. + also integrated in NEO-ZMC2, NEO-CMC. + + reference: https://wiki.neogeodev.org/index.php?title=PRO-CT0 + +***************************************************************************/ + +#include "emu.h" +#include "alpha_8921.h" +#include <algorithm> + + +//************************************************************************** +// GLOBAL VARIABLES +//************************************************************************** + +// device type definition +DEFINE_DEVICE_TYPE(ALPHA_8921, alpha_8921_device, "alpha_8921", "Alpha denshi ALPHA-8921") + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// alpha_8921_device - constructor +//------------------------------------------------- + +alpha_8921_device::alpha_8921_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, ALPHA_8921, tag, owner, clock) +{ +} + + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void alpha_8921_device::device_start() +{ + // save states + save_item(NAME(m_clk)); + save_item(NAME(m_load)); + save_item(NAME(m_even)); + save_item(NAME(m_h)); + save_item(NAME(m_c)); + save_item(NAME(m_gad)); + save_item(NAME(m_gbd)); + save_item(NAME(m_dota)); + save_item(NAME(m_dotb)); + save_item(NAME(m_sr)); + save_item(NAME(m_old_sr)); + save_item(NAME(m_old_even)); + save_item(NAME(m_old_h)); +} + + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void alpha_8921_device::device_reset() +{ + // force update outputs + m_old_sr = ~m_sr; + m_old_even = !m_even; + m_old_h = !m_h; + update_output(); +} + + +//************************************************************************** +// READ/WRITE HANDLERS +//************************************************************************** + +//------------------------------------------------- +// clk_w - Change clock pin status +//------------------------------------------------- + +WRITE_LINE_MEMBER(alpha_8921_device::clk_w) +{ + if (m_clk != state) + { + m_clk = state; + if (!m_clk) // falling edge + { + if (m_load) + m_sr = m_c; + else if (m_h) + m_sr = (BIT(m_sr, 24, 6) << 26) | (BIT(m_sr, 16, 6) << 18) | (BIT(m_sr, 8, 6) << 10) | (BIT(m_sr, 0, 6) << 2); + else + m_sr = ((BIT(m_sr, 26, 6)) << 24) | ((BIT(m_sr, 18, 6)) << 16) | ((BIT(m_sr, 10, 6)) << 8) | (BIT(m_sr, 2, 6)); + } + } +} + +//------------------------------------------------- +// load_w - Change LOAD pin status +//------------------------------------------------- + +WRITE_LINE_MEMBER(alpha_8921_device::load_w) +{ + m_load = state; +} + +//------------------------------------------------- +// even_w - Change EVEN pin status +//------------------------------------------------- + +WRITE_LINE_MEMBER(alpha_8921_device::even_w) +{ + m_even = state; +} + +//------------------------------------------------- +// h_w - Change H pin status +//------------------------------------------------- + +WRITE_LINE_MEMBER(alpha_8921_device::h_w) +{ + m_h = state; +} + +//------------------------------------------------- +// c_w - Change C data +//------------------------------------------------- + +void alpha_8921_device::c_w(u32 data) +{ + m_c = data; +} + +//------------------------------------------------- +// update_output - Update output results +//------------------------------------------------- + +void alpha_8921_device::update_output() +{ + if ((m_old_sr != m_sr) || (m_old_even != m_even) || (m_old_h != m_h)) + { + switch (m_h) + { + case 1: + m_gbd = bitswap<4>(m_sr, 30, 22, 14, 6); + m_gad = bitswap<4>(m_sr, 31, 23, 15, 7); + break; + case 0: + m_gbd = bitswap<4>(m_sr, 25, 17, 9, 1); + m_gad = bitswap<4>(m_sr, 24, 16, 8, 0); + break; + } + if (m_even) + std::swap<u8>(m_gad, m_gbd); + + m_dota = m_gad ? true : false; + m_dotb = m_gbd ? true : false; + m_old_sr = m_sr; + m_old_even = m_even; + m_old_h = m_h; + } +} + +//------------------------------------------------- +// gad_r - Read GAD data +//------------------------------------------------- + +u8 alpha_8921_device::gad_r() +{ + update_output(); + return m_gad & 0xf; +} + +//------------------------------------------------- +// gbd_r - Read GBD data +//------------------------------------------------- + +u8 alpha_8921_device::gbd_r() +{ + update_output(); + return m_gbd & 0xf; +} + +//------------------------------------------------- +// dota_r - Read DOTA pin data (GAD isn't 0) +//------------------------------------------------- + +READ_LINE_MEMBER(alpha_8921_device::dota_r) +{ + update_output(); + return m_dota; +} + +//------------------------------------------------- +// dotb_r - Read DOTB pin data (GBD isn't 0) +//------------------------------------------------- + +READ_LINE_MEMBER(alpha_8921_device::dotb_r) +{ + update_output(); + return m_dotb; +} diff --git a/src/devices/machine/alpha_8921.h b/src/devices/machine/alpha_8921.h new file mode 100644 index 00000000000..1dd690581cb --- /dev/null +++ b/src/devices/machine/alpha_8921.h @@ -0,0 +1,85 @@ +// license:BSD-3-Clause +// copyright-holders:cam900 +/*************************************************************************** + + Alpha denshi ALPHA-8921 emulation + +***************************************************************************/ + +#ifndef MAME_MACHINE_ALPHA_8921_H +#define MAME_MACHINE_ALPHA_8921_H + +#pragma once + + + +//************************************************************************** +// INTERFACE CONFIGURATION MACROS +//************************************************************************** + + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// ======================> alpha_8921_device + +class alpha_8921_device : public device_t +{ +public: + // construction/destruction + alpha_8921_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + + // inputs + DECLARE_WRITE_LINE_MEMBER(clk_w); + DECLARE_WRITE_LINE_MEMBER(load_w); + DECLARE_WRITE_LINE_MEMBER(even_w); + DECLARE_WRITE_LINE_MEMBER(h_w); + void c_w(u32 data); + + // outputs + u8 gad_r(); + u8 gbd_r(); + DECLARE_READ_LINE_MEMBER(dota_r); + DECLARE_READ_LINE_MEMBER(dotb_r); + +protected: + // device-level overrides + virtual void device_start() override; + virtual void device_reset() override; + +private: + // inputs + bool m_clk = false; // CLK pin + bool m_load = false; // LOAD pin + bool m_even = false; // EVEN pin + bool m_h = false; // H pin + u32 m_c = 0; // C data (32 bit) + + // outputs + u8 m_gad = 0; // GAD data (4 bit) + u8 m_gbd = 0; // GBD data (4 bit) + bool m_dota = false; // DOTA pin + bool m_dotb = false; // DOTB pin + + // internal status + u32 m_sr = 0; + u32 m_old_sr = ~0; + bool m_old_even = true; + bool m_old_h = true; + void update_output(); +}; + + +// device type definition +DECLARE_DEVICE_TYPE(ALPHA_8921, alpha_8921_device) + + + +//************************************************************************** +// GLOBAL VARIABLES +//************************************************************************** + + +#endif // MAME_MACHINE_ALPHA_8921_H |