summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Vas Crabb <vas@vastheman.com>2021-09-09 04:12:45 +1000
committer Vas Crabb <vas@vastheman.com>2021-09-09 04:12:45 +1000
commit693764eb9c6848ba5f5ba1bd57bbf25d972085f8 (patch)
treef2a63fc10494058bc54b8b7b3f4b6b70b14ddc7e
parente7528a445bb0c0d8594f79c5aceabd26077001a5 (diff)
Miscellaneous cleanup.
cchasm.cpp: Combined source files, added I/O port finder, reduced audio levels to avoid hitting the limiter. redalert.cpp: Converted sound boards to devices and removed a couple of trampolines, making the driver state class considerably tidier. bus/amiga/keyboard, bus/sunkbd: Put a bunch of implementation classes in anonymous namespaces, getting implementation details out of headers and out of the global namespace.
-rw-r--r--scripts/target/mame/arcade.lua5
-rw-r--r--src/devices/bus/amiga/keyboard/a2000.cpp371
-rw-r--r--src/devices/bus/amiga/keyboard/a2000.h118
-rw-r--r--src/devices/bus/sunkbd/hlekbd.cpp467
-rw-r--r--src/devices/bus/sunkbd/hlekbd.h110
-rw-r--r--src/mame/audio/cchasm.cpp128
-rw-r--r--src/mame/audio/redalert.cpp206
-rw-r--r--src/mame/audio/redalert.h127
-rw-r--r--src/mame/drivers/cchasm.cpp350
-rw-r--r--src/mame/drivers/redalert.cpp52
-rw-r--r--src/mame/includes/cchasm.h85
-rw-r--r--src/mame/includes/redalert.h61
-rw-r--r--src/mame/machine/cchasm.cpp15
-rw-r--r--src/mame/video/cchasm.cpp136
14 files changed, 1048 insertions, 1183 deletions
diff --git a/scripts/target/mame/arcade.lua b/scripts/target/mame/arcade.lua
index 7ff86036ccb..09284ac9036 100644
--- a/scripts/target/mame/arcade.lua
+++ b/scripts/target/mame/arcade.lua
@@ -1636,10 +1636,6 @@ files {
MAME_DIR .. "src/mame/audio/nl_warrior.cpp",
MAME_DIR .. "src/mame/audio/nl_warrior.h",
MAME_DIR .. "src/mame/drivers/cchasm.cpp",
- MAME_DIR .. "src/mame/includes/cchasm.h",
- MAME_DIR .. "src/mame/machine/cchasm.cpp",
- MAME_DIR .. "src/mame/audio/cchasm.cpp",
- MAME_DIR .. "src/mame/video/cchasm.cpp",
MAME_DIR .. "src/mame/drivers/dlair.cpp",
MAME_DIR .. "src/mame/drivers/dlair2.cpp",
MAME_DIR .. "src/mame/drivers/embargo.cpp",
@@ -2247,6 +2243,7 @@ files {
MAME_DIR .. "src/mame/drivers/redalert.cpp",
MAME_DIR .. "src/mame/includes/redalert.h",
MAME_DIR .. "src/mame/audio/redalert.cpp",
+ MAME_DIR .. "src/mame/audio/redalert.h",
MAME_DIR .. "src/mame/video/redalert.cpp",
MAME_DIR .. "src/mame/drivers/shisen.cpp",
MAME_DIR .. "src/mame/includes/shisen.h",
diff --git a/src/devices/bus/amiga/keyboard/a2000.cpp b/src/devices/bus/amiga/keyboard/a2000.cpp
index eb0ab7c5058..59aac50b652 100644
--- a/src/devices/bus/amiga/keyboard/a2000.cpp
+++ b/src/devices/bus/amiga/keyboard/a2000.cpp
@@ -70,21 +70,147 @@
#define LOGSCAN(...) LOGMASKED(LOG_SCAN, __VA_ARGS__)
+namespace {
+
//**************************************************************************
-// GLOBAL VARIABLES
+// ROM DEFINITIONS
//**************************************************************************
-DEFINE_DEVICE_TYPE(A2000_KBD_G80_US, bus::amiga::keyboard::a2000_kbd_g80_us_device, "a2000kbd_g80_us", "Amiga 2000 Keyboard (Cherry - U.S./Canada)")
-DEFINE_DEVICE_TYPE(A2000_KBD_G80_DE, bus::amiga::keyboard::a2000_kbd_g80_de_device, "a2000kbd_g80_de", "Amiga 2000 Keyboard (Cherry - Germany/Austria)")
-DEFINE_DEVICE_TYPE(A2000_KBD_G80_SE, bus::amiga::keyboard::a2000_kbd_g80_se_device, "a2000kbd_g80_se", "Amiga 2000 Keyboard (Cherry - Sweden/Finland)")
-DEFINE_DEVICE_TYPE(A2000_KBD_G80_DK, bus::amiga::keyboard::a2000_kbd_g80_dk_device, "a2000kbd_g80_dk", "Amiga 2000 Keyboard (Cherry - Denmark)")
-DEFINE_DEVICE_TYPE(A2000_KBD_G80_GB, bus::amiga::keyboard::a2000_kbd_g80_gb_device, "a2000kbd_g80_gb", "Amiga 2000 Keyboard (Cherry - UK)")
+ROM_START(a2000kbd)
+ ROM_REGION(0x0800, "mcu", 0)
+ ROM_LOAD("467.u4", 0x0000, 0x0800, CRC(fb92a773) SHA1(e787dc05de227f30a47ac5b9ee7a355c2e9e693b))
+ROM_END
+//**************************************************************************
+// KEYBOARD BASE CLASSES
+//**************************************************************************
-namespace bus::amiga::keyboard {
+class a2000_kbd_g80_device : public device_t, public device_amiga_keyboard_interface
+{
+public:
+ // from host
+ virtual DECLARE_WRITE_LINE_MEMBER(kdat_w) override
+ {
+ if (bool(state) != m_host_kdat)
+ {
+ LOGCOMM("host DATA %u -> %u\n", m_host_kdat ? 1 : 0, state ? 1 : 0);
+ m_host_kdat = bool(state);
+ if (m_mcu_kdat)
+ m_mcu->set_input_line(MCS48_INPUT_IRQ, state ? CLEAR_LINE : ASSERT_LINE);
+ }
+ }
-namespace {
+protected:
+ // construction/destruction
+ a2000_kbd_g80_device(machine_config const &mconfig, device_type type, char const *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, type, tag, owner, clock)
+ , device_amiga_keyboard_interface(mconfig, *this)
+ , m_rows(*this, "ROW%u", 0U)
+ , m_mcu(*this, "u1")
+ , m_led_kbd_caps(*this, "led_kbd_caps")
+ {
+ }
+
+ // MCU I/O
+ u8 mcu_bus_r(offs_t offset)
+ {
+ // when jumpered for external ROM, offset latched by U2 is 0x60 + (row << 1)
+ uint8_t result(0U);
+ for (unsigned i = 0U; m_rows.size() > i; ++i)
+ {
+ if (BIT(m_row_drive, i))
+ result |= uint8_t(m_rows[i]->read());
+ }
+ LOGSCAN("read bus: offset = %02X, row drive = %04X\n, result = %02X", offset, m_row_drive, result);
+ return result;
+ }
+
+ void mcu_p1_w(u8 data)
+ {
+ m_row_drive = (m_row_drive & 0x1f00U) | uint16_t(data);
+ }
+
+ void mcu_p2_w(u8 data)
+ {
+ m_row_drive = (m_row_drive & 0x00ffU) | (uint16_t(data & 0x1fU) << 8);
+
+ m_led_kbd_caps = BIT(~data, 5);
+
+ if (bool(BIT(data, 6) != m_mcu_kdat))
+ {
+ m_mcu_kdat = BIT(data, 6);
+ LOGCOMM("keyboard DATA %u -> %u\n", m_mcu_kdat ? 0U : 1U, m_mcu_kdat ? 1U : 0U);
+ m_host->kdat_w(m_mcu_kdat ? 1 : 0);
+ if (m_host_kdat)
+ m_mcu->set_input_line(MCS48_INPUT_IRQ, m_mcu_kdat ? CLEAR_LINE : ASSERT_LINE);
+ }
+
+ if (bool(BIT(data, 7) != m_mcu_kclk))
+ {
+ m_mcu_kclk = BIT(data, 7);
+ LOGCOMM("keyboard CLOCK %u -> %u\n", m_mcu_kclk ? 0U : 1U, m_mcu_kclk ? 1U : 0U);
+ m_host->kclk_w(m_mcu_kclk ? 1 : 0);
+ }
+ }
+
+ virtual const tiny_rom_entry *device_rom_region() const override
+ {
+ return ROM_NAME(a2000kbd);
+ }
+
+ virtual void device_add_mconfig(machine_config &config) override
+ {
+ auto &mcu(I8039(config, "u1", 6_MHz_XTAL));
+ mcu.set_addrmap(AS_PROGRAM, &a2000_kbd_g80_device::program_map);
+ mcu.set_addrmap(AS_IO, &a2000_kbd_g80_device::ext_map);
+ mcu.p1_out_cb().set(FUNC(a2000_kbd_g80_device::mcu_p1_w));
+ mcu.p2_out_cb().set(FUNC(a2000_kbd_g80_device::mcu_p2_w));
+ mcu.bus_in_cb().set(FUNC(a2000_kbd_g80_device::mcu_bus_r));
+ mcu.t0_in_cb().set_constant(1);
+ mcu.t1_in_cb().set([this] () { return m_mcu_kclk ? 1 : 0; });
+ }
+
+ virtual void device_start() override
+ {
+ m_led_kbd_caps.resolve();
+
+ save_item(NAME(m_row_drive));
+ save_item(NAME(m_host_kdat));
+ save_item(NAME(m_mcu_kdat));
+ save_item(NAME(m_mcu_kclk));
+
+ m_row_drive = 0U;
+ m_host_kdat = true;
+ m_mcu_kdat = true;
+ m_mcu_kclk = true;
+ }
+
+ void program_map(address_map &map)
+ {
+ map.global_mask(0x07ff);
+ map(0x0000, 0x07ff).rom().region("mcu", 0);
+ }
+
+ void ext_map(address_map &map)
+ {
+ map.global_mask(0x00ff);
+ map(0x0000, 0x00ff).r(FUNC(a2000_kbd_g80_device::mcu_bus_r));
+ }
+
+private:
+ required_ioport_array<13> m_rows;
+ required_device<cpu_device> m_mcu;
+ output_finder<> m_led_kbd_caps;
+
+ uint16_t m_row_drive = 0U;
+ bool m_host_kdat = true, m_mcu_kdat = true, m_mcu_kclk = true;
+};
+
+
+//**************************************************************************
+// COMMON PORT DEFINITIONS
+//**************************************************************************
INPUT_PORTS_START(a2000_common_keyboard)
PORT_START("ROW0")
@@ -169,6 +295,11 @@ INPUT_PORTS_START(a2000_common_keyboard)
PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN))
INPUT_PORTS_END
+
+//**************************************************************************
+// SPECIFIC KEYBOARD PORT DEFINITIONS
+//**************************************************************************
+
INPUT_PORTS_START(a2000_us_keyboard)
PORT_INCLUDE(a2000_common_keyboard)
@@ -476,197 +607,107 @@ INPUT_PORTS_START(a2000_gb_keyboard)
INPUT_PORTS_END
-ROM_START(a2000kbd)
- ROM_REGION(0x0800, "mcu", 0)
- ROM_LOAD("467.u4", 0x0000, 0x0800, CRC(fb92a773) SHA1(e787dc05de227f30a47ac5b9ee7a355c2e9e693b))
-ROM_END
-
-} // anonymous namespace
-
-
-
//**************************************************************************
-// LIVE DEVICE
+// SPECIFIC KEYBOARD CLASSES
//**************************************************************************
-// ======================> a2000_kbd_g80_device
-
-a2000_kbd_g80_device::a2000_kbd_g80_device(machine_config const &mconfig, device_type type, char const *tag, device_t *owner, uint32_t clock)
- : device_t(mconfig, type, tag, owner, clock)
- , device_amiga_keyboard_interface(mconfig, *this)
- , m_rows(*this, "ROW%u", 0U)
- , m_mcu(*this, "u1")
- , m_led_kbd_caps(*this, "led_kbd_caps")
- , m_row_drive(0U)
- , m_host_kdat(true)
- , m_mcu_kdat(true)
- , m_mcu_kclk(true)
-{
-}
-
-WRITE_LINE_MEMBER(a2000_kbd_g80_device::kdat_w)
+class a2000_kbd_g80_us_device : public a2000_kbd_g80_device
{
- if (bool(state) != m_host_kdat)
+public:
+ a2000_kbd_g80_us_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock)
+ : a2000_kbd_g80_device(mconfig, A2000_KBD_G80_US, tag, owner, clock)
{
- LOGCOMM("host DATA %u -> %u\n", m_host_kdat ? 1 : 0, state ? 1 : 0);
- m_host_kdat = bool(state);
- if (m_mcu_kdat)
- m_mcu->set_input_line(MCS48_INPUT_IRQ, state ? CLEAR_LINE : ASSERT_LINE);
}
-}
-u8 a2000_kbd_g80_device::mcu_bus_r(offs_t offset)
-{
- // when jumpered for external ROM, offset latched by U2 is 0x60 + (row << 1)
- uint8_t result(0U);
- for (unsigned i = 0U; m_rows.size() > i; ++i)
+protected:
+ virtual ioport_constructor device_input_ports() const override
{
- if (BIT(m_row_drive, i))
- result |= uint8_t(m_rows[i]->read());
+ return INPUT_PORTS_NAME(a2000_us_keyboard);
}
- LOGSCAN("read bus: offset = %02X, row drive = %04X\n, result = %02X", offset, m_row_drive, result);
- return result;
-}
+};
-void a2000_kbd_g80_device::mcu_p1_w(u8 data)
-{
- m_row_drive = (m_row_drive & 0x1f00U) | uint16_t(data);
-}
-void a2000_kbd_g80_device::mcu_p2_w(u8 data)
+class a2000_kbd_g80_de_device : public a2000_kbd_g80_device
{
- m_row_drive = (m_row_drive & 0x00ffU) | (uint16_t(data & 0x1fU) << 8);
-
- m_led_kbd_caps = BIT(~data, 5);
-
- if (bool(BIT(data, 6) != m_mcu_kdat))
+public:
+ a2000_kbd_g80_de_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock)
+ : a2000_kbd_g80_device(mconfig, A2000_KBD_G80_DE, tag, owner, clock)
{
- m_mcu_kdat = BIT(data, 6);
- LOGCOMM("keyboard DATA %u -> %u\n", m_mcu_kdat ? 0U : 1U, m_mcu_kdat ? 1U : 0U);
- m_host->kdat_w(m_mcu_kdat ? 1 : 0);
- if (m_host_kdat)
- m_mcu->set_input_line(MCS48_INPUT_IRQ, m_mcu_kdat ? CLEAR_LINE : ASSERT_LINE);
}
- if (bool(BIT(data, 7) != m_mcu_kclk))
+ static auto parent_rom_device_type() { return &A2000_KBD_G80_US; }
+
+protected:
+ virtual ioport_constructor device_input_ports() const override
{
- m_mcu_kclk = BIT(data, 7);
- LOGCOMM("keyboard CLOCK %u -> %u\n", m_mcu_kclk ? 0U : 1U, m_mcu_kclk ? 1U : 0U);
- m_host->kclk_w(m_mcu_kclk ? 1 : 0);
+ return INPUT_PORTS_NAME(a2000_de_keyboard);
}
-}
-
-tiny_rom_entry const *a2000_kbd_g80_device::device_rom_region() const
-{
- return ROM_NAME(a2000kbd);
-}
-
-void a2000_kbd_g80_device::device_add_mconfig(machine_config &config)
-{
- auto &mcu(I8039(config, "u1", 6_MHz_XTAL));
- mcu.set_addrmap(AS_PROGRAM, &a2000_kbd_g80_device::program_map);
- mcu.set_addrmap(AS_IO, &a2000_kbd_g80_device::ext_map);
- mcu.p1_out_cb().set(FUNC(a2000_kbd_g80_device::mcu_p1_w));
- mcu.p2_out_cb().set(FUNC(a2000_kbd_g80_device::mcu_p2_w));
- mcu.bus_in_cb().set(FUNC(a2000_kbd_g80_device::mcu_bus_r));
- mcu.t0_in_cb().set_constant(1);
- mcu.t1_in_cb().set([this] () { return m_mcu_kclk ? 1 : 0; });
-}
-
-void a2000_kbd_g80_device::device_start()
-{
- m_led_kbd_caps.resolve();
-
- save_item(NAME(m_row_drive));
- save_item(NAME(m_host_kdat));
- save_item(NAME(m_mcu_kdat));
- save_item(NAME(m_mcu_kclk));
-
- m_row_drive = 0U;
- m_host_kdat = true;
- m_mcu_kdat = true;
- m_mcu_kclk = true;
-}
-
-void a2000_kbd_g80_device::device_reset()
-{
-}
-
-void a2000_kbd_g80_device::program_map(address_map &map)
-{
- map.global_mask(0x07ff);
- map(0x0000, 0x07ff).rom().region("mcu", 0);
-}
-
-void a2000_kbd_g80_device::ext_map(address_map &map)
-{
- map.global_mask(0x00ff);
- map(0x0000, 0x00ff).r(FUNC(a2000_kbd_g80_device::mcu_bus_r));
-}
-
+};
-// ======================> a2000_kbd_g80_us_device
-a2000_kbd_g80_us_device::a2000_kbd_g80_us_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock)
- : a2000_kbd_g80_device(mconfig, A2000_KBD_G80_US, tag, owner, clock)
+class a2000_kbd_g80_se_device : public a2000_kbd_g80_device
{
-}
-
-ioport_constructor a2000_kbd_g80_us_device::device_input_ports() const
-{
- return INPUT_PORTS_NAME(a2000_us_keyboard);
-}
+public:
+ a2000_kbd_g80_se_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock)
+ : a2000_kbd_g80_device(mconfig, A2000_KBD_G80_SE, tag, owner, clock)
+ {
+ }
+ static auto parent_rom_device_type() { return &A2000_KBD_G80_US; }
-// ======================> a2000_kbd_g80_de_device
+protected:
+ virtual ioport_constructor device_input_ports() const override
+ {
+ return INPUT_PORTS_NAME(a2000_se_keyboard);
+ }
+};
-a2000_kbd_g80_de_device::a2000_kbd_g80_de_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock)
- : a2000_kbd_g80_device(mconfig, A2000_KBD_G80_DE, tag, owner, clock)
-{
-}
-ioport_constructor a2000_kbd_g80_de_device::device_input_ports() const
+class a2000_kbd_g80_dk_device : public a2000_kbd_g80_device
{
- return INPUT_PORTS_NAME(a2000_de_keyboard);
-}
+public:
+ a2000_kbd_g80_dk_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock)
+ : a2000_kbd_g80_device(mconfig, A2000_KBD_G80_DK, tag, owner, clock)
+ {
+ }
+ static auto parent_rom_device_type() { return &A2000_KBD_G80_US; }
-// ======================> a2000_kbd_g80_se_device
+protected:
+ virtual ioport_constructor device_input_ports() const override
+ {
+ return INPUT_PORTS_NAME(a2000_dk_keyboard);
+ }
+};
-a2000_kbd_g80_se_device::a2000_kbd_g80_se_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock)
- : a2000_kbd_g80_device(mconfig, A2000_KBD_G80_SE, tag, owner, clock)
-{
-}
-ioport_constructor a2000_kbd_g80_se_device::device_input_ports() const
+class a2000_kbd_g80_gb_device : public a2000_kbd_g80_device
{
- return INPUT_PORTS_NAME(a2000_se_keyboard);
-}
-
-
-// ======================> a2000_kbd_g80_dk_device
+public:
+ a2000_kbd_g80_gb_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock)
+ : a2000_kbd_g80_device(mconfig, A2000_KBD_G80_GB, tag, owner, clock)
+ {
+ }
-a2000_kbd_g80_dk_device::a2000_kbd_g80_dk_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock)
- : a2000_kbd_g80_device(mconfig, A2000_KBD_G80_DK, tag, owner, clock)
-{
-}
+ static auto parent_rom_device_type() { return &A2000_KBD_G80_US; }
-ioport_constructor a2000_kbd_g80_dk_device::device_input_ports() const
-{
- return INPUT_PORTS_NAME(a2000_dk_keyboard);
-}
+protected:
+ virtual ioport_constructor device_input_ports() const override
+ {
+ return INPUT_PORTS_NAME(a2000_gb_keyboard);
+ }
+};
+} // anonymous namespace
-// ======================> a2000_kbd_g80_gb_device
-a2000_kbd_g80_gb_device::a2000_kbd_g80_gb_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock)
- : a2000_kbd_g80_device(mconfig, A2000_KBD_G80_GB, tag, owner, clock)
-{
-}
-ioport_constructor a2000_kbd_g80_gb_device::device_input_ports() const
-{
- return INPUT_PORTS_NAME(a2000_gb_keyboard);
-}
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
-} // namespace bus::amiga::keyboard
+DEFINE_DEVICE_TYPE_PRIVATE(A2000_KBD_G80_US, device_amiga_keyboard_interface, a2000_kbd_g80_us_device, "a2000kbd_g80_us", "Amiga 2000 Keyboard (Cherry - U.S./Canada)")
+DEFINE_DEVICE_TYPE_PRIVATE(A2000_KBD_G80_DE, device_amiga_keyboard_interface, a2000_kbd_g80_de_device, "a2000kbd_g80_de", "Amiga 2000 Keyboard (Cherry - Germany/Austria)")
+DEFINE_DEVICE_TYPE_PRIVATE(A2000_KBD_G80_SE, device_amiga_keyboard_interface, a2000_kbd_g80_se_device, "a2000kbd_g80_se", "Amiga 2000 Keyboard (Cherry - Sweden/Finland)")
+DEFINE_DEVICE_TYPE_PRIVATE(A2000_KBD_G80_DK, device_amiga_keyboard_interface, a2000_kbd_g80_dk_device, "a2000kbd_g80_dk", "Amiga 2000 Keyboard (Cherry - Denmark)")
+DEFINE_DEVICE_TYPE_PRIVATE(A2000_KBD_G80_GB, device_amiga_keyboard_interface, a2000_kbd_g80_gb_device, "a2000kbd_g80_gb", "Amiga 2000 Keyboard (Cherry - UK)")
diff --git a/src/devices/bus/amiga/keyboard/a2000.h b/src/devices/bus/amiga/keyboard/a2000.h
index 806991be949..fa698853159 100644
--- a/src/devices/bus/amiga/keyboard/a2000.h
+++ b/src/devices/bus/amiga/keyboard/a2000.h
@@ -13,122 +13,14 @@
#include "keyboard.h"
-
//**************************************************************************
// GLOBAL VARIABLES
//**************************************************************************
-DECLARE_DEVICE_TYPE_NS(A2000_KBD_G80_US, bus::amiga::keyboard, a2000_kbd_g80_us_device)
-DECLARE_DEVICE_TYPE_NS(A2000_KBD_G80_DE, bus::amiga::keyboard, a2000_kbd_g80_de_device)
-DECLARE_DEVICE_TYPE_NS(A2000_KBD_G80_SE, bus::amiga::keyboard, a2000_kbd_g80_se_device)
-DECLARE_DEVICE_TYPE_NS(A2000_KBD_G80_DK, bus::amiga::keyboard, a2000_kbd_g80_dk_device)
-DECLARE_DEVICE_TYPE_NS(A2000_KBD_G80_GB, bus::amiga::keyboard, a2000_kbd_g80_gb_device)
-
-
-namespace bus::amiga::keyboard {
-
-//**************************************************************************
-// TYPE DECLARATIONS
-//**************************************************************************
-
-// ======================> a2000_kbd_g80_device
-
-class a2000_kbd_g80_device : public device_t, public device_amiga_keyboard_interface
-{
-public:
- // from host
- virtual DECLARE_WRITE_LINE_MEMBER(kdat_w) override;
-
-protected:
- // construction/destruction
- a2000_kbd_g80_device(machine_config const &mconfig, device_type type, char const *tag, device_t *owner, uint32_t clock);
-
- // MCU I/O
- u8 mcu_bus_r(offs_t offset);
- void mcu_p1_w(u8 data);
- void mcu_p2_w(u8 data);
-
- virtual const tiny_rom_entry *device_rom_region() const override;
- virtual void device_add_mconfig(machine_config &config) override;
-
- virtual void device_start() override;
- virtual void device_reset() override;
-
- void program_map(address_map &map);
- void ext_map(address_map &map);
-
-private:
- required_ioport_array<13> m_rows;
- required_device<cpu_device> m_mcu;
- output_finder<> m_led_kbd_caps;
-
- uint16_t m_row_drive;
- bool m_host_kdat, m_mcu_kdat, m_mcu_kclk;
-};
-
-// ======================> a2000_kbd_g80_us_device
-
-class a2000_kbd_g80_us_device : public a2000_kbd_g80_device
-{
-public:
- a2000_kbd_g80_us_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock);
-
-protected:
- virtual ioport_constructor device_input_ports() const override;
-};
-
-// ======================> a2000_kbd_g80_de_device
-
-class a2000_kbd_g80_de_device : public a2000_kbd_g80_device
-{
-public:
- a2000_kbd_g80_de_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock);
-
- static auto parent_rom_device_type() { return &A2000_KBD_G80_US; }
-
-protected:
- virtual ioport_constructor device_input_ports() const override;
-};
-
-// ======================> a2000_kbd_g80_se_device
-
-class a2000_kbd_g80_se_device : public a2000_kbd_g80_device
-{
-public:
- a2000_kbd_g80_se_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock);
-
- static auto parent_rom_device_type() { return &A2000_KBD_G80_US; }
-
-protected:
- virtual ioport_constructor device_input_ports() const override;
-};
-
-// ======================> a2000_kbd_g80_dk_device
-
-class a2000_kbd_g80_dk_device : public a2000_kbd_g80_device
-{
-public:
- a2000_kbd_g80_dk_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock);
-
- static auto parent_rom_device_type() { return &A2000_KBD_G80_US; }
-
-protected:
- virtual ioport_constructor device_input_ports() const override;
-};
-
-// ======================> a2000_kbd_g80_gb_device
-
-class a2000_kbd_g80_gb_device : public a2000_kbd_g80_device
-{
-public:
- a2000_kbd_g80_gb_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock);
-
- static auto parent_rom_device_type() { return &A2000_KBD_G80_US; }
-
-protected:
- virtual ioport_constructor device_input_ports() const override;
-};
-
-} // namespace bus::amiga::keyboard
+DECLARE_DEVICE_TYPE(A2000_KBD_G80_US, device_amiga_keyboard_interface)
+DECLARE_DEVICE_TYPE(A2000_KBD_G80_DE, device_amiga_keyboard_interface)
+DECLARE_DEVICE_TYPE(A2000_KBD_G80_SE, device_amiga_keyboard_interface)
+DECLARE_DEVICE_TYPE(A2000_KBD_G80_DK, device_amiga_keyboard_interface)
+DECLARE_DEVICE_TYPE(A2000_KBD_G80_GB, device_amiga_keyboard_interface)
#endif // MAME_BUS_AMIGA_KEYBOARD_A2000_H
diff --git a/src/devices/bus/sunkbd/hlekbd.cpp b/src/devices/bus/sunkbd/hlekbd.cpp
index 593d6cb3eb2..d20c0040d5d 100644
--- a/src/devices/bus/sunkbd/hlekbd.cpp
+++ b/src/devices/bus/sunkbd/hlekbd.cpp
@@ -132,19 +132,6 @@
*/
-/***************************************************************************
- DEVICE TYPE GLOBALS
-***************************************************************************/
-
-DEFINE_DEVICE_TYPE(SUN_TYPE3_HLE_KEYBOARD, bus::sunkbd::hle_type3_device, "kbd_type3_hle", "Sun Type 3 Keyboard (HLE)")
-DEFINE_DEVICE_TYPE(SUN_TYPE4_HLE_KEYBOARD, bus::sunkbd::hle_type4_device, "kbd_type4_hle", "Sun Type 4 Keyboard (HLE)")
-DEFINE_DEVICE_TYPE(SUN_TYPE5_HLE_KEYBOARD, bus::sunkbd::hle_type5_device, "kbd_type5_hle_us", "Sun Type 5 Keyboard (U.S.A. - HLE)")
-DEFINE_DEVICE_TYPE(SUN_TYPE5_GB_HLE_KEYBOARD, bus::sunkbd::hle_type5_gb_device, "kbd_type5_hle_gb", "Sun Type 5 Keyboard (Great Britain - HLE)")
-DEFINE_DEVICE_TYPE(SUN_TYPE5_SE_HLE_KEYBOARD, bus::sunkbd::hle_type5_se_device, "kbd_type5_hle_se", "Sun Type 5 Keyboard (Sweden - HLE)")
-DEFINE_DEVICE_TYPE(SUN_TYPE5_JP_HLE_KEYBOARD, bus::sunkbd::hle_type5_jp_device, "kbd_type5_hle_jp", "Sun Type 5 Keyboard (Japan - HLE)")
-
-
-
namespace bus::sunkbd {
namespace {
@@ -728,6 +715,212 @@ INPUT_PORTS_START( hle_type5_jp_device )
PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Kana") PORT_CODE(KEYCODE_RALT) // かな
INPUT_PORTS_END
+
+
+/***************************************************************************
+ BASE TYPE 4/5/6 HLE KEYBOARD DEVICE
+***************************************************************************/
+
+class hle_type4_device_base : public hle_device_base
+{
+protected:
+ using hle_device_base::hle_device_base;
+
+private:
+ // return identification byte for self test pass response
+ virtual uint8_t ident_byte() override
+ {
+ return (m_dips->read() & 0x80U) ? 0x03U : 0x04U;
+ }
+};
+
+
+
+/***************************************************************************
+ TYPE 3 HLE KEYBOARD DEVICE
+***************************************************************************/
+
+class hle_type3_device : public hle_device_base
+{
+public:
+ hle_type3_device(
+ machine_config const &mconfig,
+ char const *tag,
+ device_t *owner,
+ uint32_t clock)
+ : hle_device_base(
+ mconfig,
+ SUN_TYPE3_HLE_KEYBOARD,
+ tag,
+ owner,
+ clock)
+ {
+ }
+
+protected:
+ virtual ioport_constructor device_input_ports() const override
+ {
+ return INPUT_PORTS_NAME(hle_type3_device);
+ }
+
+private:
+ // return identification byte for self test pass response
+ virtual uint8_t ident_byte() override
+ {
+ return 0x03U;
+ }
+};
+
+
+
+/***************************************************************************
+ TYPE 4 HLE KEYBOARD DEVICE
+***************************************************************************/
+
+class hle_type4_device : public hle_type4_device_base
+{
+public:
+ hle_type4_device(
+ machine_config const &mconfig,
+ char const *tag,
+ device_t *owner,
+ uint32_t clock)
+ : hle_type4_device_base(
+ mconfig,
+ SUN_TYPE4_HLE_KEYBOARD,
+ tag,
+ owner,
+ clock)
+ {
+ }
+
+protected:
+ virtual ioport_constructor device_input_ports() const override
+ {
+ return INPUT_PORTS_NAME(hle_type4_device);
+ }
+};
+
+
+
+/***************************************************************************
+ TYPE 5 HLE KEYBOARD DEVICE
+***************************************************************************/
+
+class hle_type5_device : public hle_type4_device_base
+{
+public:
+ hle_type5_device(
+ machine_config const &mconfig,
+ char const *tag,
+ device_t *owner,
+ uint32_t clock)
+ : hle_type4_device_base(
+ mconfig,
+ SUN_TYPE5_HLE_KEYBOARD,
+ tag,
+ owner,
+ clock)
+ {
+ }
+
+protected:
+ virtual ioport_constructor device_input_ports() const override
+ {
+ return INPUT_PORTS_NAME(hle_type5_device);
+ }
+};
+
+
+
+/***************************************************************************
+ TYPE 5 UK HLE KEYBOARD DEVICE
+***************************************************************************/
+
+class hle_type5_gb_device : public hle_type4_device_base
+{
+public:
+ hle_type5_gb_device(
+ machine_config const &mconfig,
+ char const *tag,
+ device_t *owner,
+ uint32_t clock)
+ : hle_type4_device_base(
+ mconfig,
+ SUN_TYPE5_GB_HLE_KEYBOARD,
+ tag,
+ owner,
+ clock)
+ {
+ }
+
+protected:
+ virtual ioport_constructor device_input_ports() const override
+ {
+ return INPUT_PORTS_NAME(hle_type5_gb_device);
+ }
+};
+
+
+
+/***************************************************************************
+ TYPE 5 SWEDISH HLE KEYBOARD DEVICE
+***************************************************************************/
+
+class hle_type5_se_device : public hle_type4_device_base
+{
+public:
+ hle_type5_se_device(
+ machine_config const &mconfig,
+ char const *tag,
+ device_t *owner,
+ uint32_t clock)
+ : hle_type4_device_base(
+ mconfig,
+ SUN_TYPE5_SE_HLE_KEYBOARD,
+ tag,
+ owner,
+ clock)
+ {
+ }
+
+protected:
+ virtual ioport_constructor device_input_ports() const override
+ {
+ return INPUT_PORTS_NAME(hle_type5_se_device);
+ }
+};
+
+
+
+/***************************************************************************
+ TYPE 5 JAPANESE HLE KEYBOARD DEVICE
+***************************************************************************/
+
+class hle_type5_jp_device : public hle_type4_device_base
+{
+public:
+ hle_type5_jp_device(
+ machine_config const &mconfig,
+ char const *tag,
+ device_t *owner,
+ uint32_t clock)
+ : hle_type4_device_base(
+ mconfig,
+ SUN_TYPE5_JP_HLE_KEYBOARD,
+ tag,
+ owner,
+ clock)
+ {
+ }
+
+protected:
+ virtual ioport_constructor device_input_ports() const override
+ {
+ return INPUT_PORTS_NAME(hle_type5_jp_device);
+ }
+};
+
} // anonymous namespace
@@ -1035,249 +1228,17 @@ void hle_device_base::received_byte(uint8_t byte)
}
}
-
-
-/***************************************************************************
- BASE TYPE 4/5/6 HLE KEYBOARD DEVICE
-***************************************************************************/
-
-/*--------------------------------------------------
- hle_type4_device_base::ident_byte
- return identification byte for self test pass
- response
---------------------------------------------------*/
-
-uint8_t hle_type4_device_base::ident_byte()
-{
- return (m_dips->read() & 0x80U) ? 0x03U : 0x04U;
-}
-
-
-
-/***************************************************************************
- TYPE 3 HLE KEYBOARD DEVICE
-***************************************************************************/
-
-/*--------------------------------------------------
- hle_type3_device::hle_type3_device
- abbreviated constructor
---------------------------------------------------*/
-
-hle_type3_device::hle_type3_device(
- machine_config const &mconfig,
- char const *tag,
- device_t *owner,
- uint32_t clock)
- : hle_device_base(
- mconfig,
- SUN_TYPE3_HLE_KEYBOARD,
- tag,
- owner,
- clock)
-{
-}
-
-
-/*--------------------------------------------------
- hle_type3_device::device_input_ports
- get input ports for this device
---------------------------------------------------*/
-
-ioport_constructor hle_type3_device::device_input_ports() const
-{
- return INPUT_PORTS_NAME(hle_type3_device);
-}
-
-
-/*--------------------------------------------------
- hle_type3_device::ident_byte
- return identification byte for self test pass
- response
---------------------------------------------------*/
-
-uint8_t hle_type3_device::ident_byte()
-{
- return 0x03U;
-}
-
-
-
-/***************************************************************************
- TYPE 4 HLE KEYBOARD DEVICE
-***************************************************************************/
-
-/*--------------------------------------------------
- hle_type4_device::hle_type4_device
- abbreviated constructor
---------------------------------------------------*/
-
-hle_type4_device::hle_type4_device(
- machine_config const &mconfig,
- char const *tag,
- device_t *owner,
- uint32_t clock)
- : hle_type4_device_base(
- mconfig,
- SUN_TYPE4_HLE_KEYBOARD,
- tag,
- owner,
- clock)
-{
-}
-
-
-/*--------------------------------------------------
- hle_type4_device::device_input_ports
- get input ports for this device
---------------------------------------------------*/
-
-ioport_constructor hle_type4_device::device_input_ports() const
-{
- return INPUT_PORTS_NAME(hle_type4_device);
-}
-
-
-
-/***************************************************************************
- TYPE 5 HLE KEYBOARD DEVICE
-***************************************************************************/
-
-/*--------------------------------------------------
- hle_type5_device::hle_type5_device
- abbreviated constructor
---------------------------------------------------*/
-
-hle_type5_device::hle_type5_device(
- machine_config const &mconfig,
- char const *tag,
- device_t *owner,
- uint32_t clock)
- : hle_type4_device_base(
- mconfig,
- SUN_TYPE5_HLE_KEYBOARD,
- tag,
- owner,
- clock)
-{
-}
-
-
-/*--------------------------------------------------
- hle_type5_device::device_input_ports
- get input ports for this device
---------------------------------------------------*/
-
-ioport_constructor hle_type5_device::device_input_ports() const
-{
- return INPUT_PORTS_NAME(hle_type5_device);
-}
-
-
-
-/***************************************************************************
- TYPE 5 UK HLE KEYBOARD DEVICE
-***************************************************************************/
-
-/*--------------------------------------------------
- hle_type5_gb_device::hle_type5_gb_device
- abbreviated constructor
---------------------------------------------------*/
-
-hle_type5_gb_device::hle_type5_gb_device(
- machine_config const &mconfig,
- char const *tag,
- device_t *owner,
- uint32_t clock)
- : hle_type4_device_base(
- mconfig,
- SUN_TYPE5_GB_HLE_KEYBOARD,
- tag,
- owner,
- clock)
-{
-}
-
-
-/*--------------------------------------------------
- hle_type5_gb_device::device_input_ports
- get input ports for this device
---------------------------------------------------*/
-
-ioport_constructor hle_type5_gb_device::device_input_ports() const
-{
- return INPUT_PORTS_NAME(hle_type5_gb_device);
-}
-
-
-
-/***************************************************************************
- TYPE 5 SWEDISH HLE KEYBOARD DEVICE
-***************************************************************************/
-
-/*--------------------------------------------------
- hle_type5_se_device::hle_type5_se_device
- abbreviated constructor
---------------------------------------------------*/
-
-hle_type5_se_device::hle_type5_se_device(
- machine_config const &mconfig,
- char const *tag,
- device_t *owner,
- uint32_t clock)
- : hle_type4_device_base(
- mconfig,
- SUN_TYPE5_SE_HLE_KEYBOARD,
- tag,
- owner,
- clock)
-{
-}
-
-
-/*--------------------------------------------------
- hle_type5_se_device::device_input_ports
- get input ports for this device
---------------------------------------------------*/
-
-ioport_constructor hle_type5_se_device::device_input_ports() const
-{
- return INPUT_PORTS_NAME(hle_type5_se_device);
-}
+} // namespace bus::sunkbd
/***************************************************************************
- TYPE 5 JAPANESE HLE KEYBOARD DEVICE
+ DEVICE TYPE GLOBALS
***************************************************************************/
-/*--------------------------------------------------
- hle_type5_jp_device::hle_type5_jp_device
- abbreviated constructor
---------------------------------------------------*/
-
-hle_type5_jp_device::hle_type5_jp_device(
- machine_config const &mconfig,
- char const *tag,
- device_t *owner,
- uint32_t clock)
- : hle_type4_device_base(
- mconfig,
- SUN_TYPE5_JP_HLE_KEYBOARD,
- tag,
- owner,
- clock)
-{
-}
-
-
-/*--------------------------------------------------
- hle_type5_jp_device::device_input_ports
- get input ports for this device
---------------------------------------------------*/
-
-ioport_constructor hle_type5_jp_device::device_input_ports() const
-{
- return INPUT_PORTS_NAME(hle_type5_jp_device);
-}
-
-} // namespace bus::sunkbd
+DEFINE_DEVICE_TYPE_PRIVATE(SUN_TYPE3_HLE_KEYBOARD, bus::sunkbd::hle_device_base, bus::sunkbd::hle_type3_device, "kbd_type3_hle", "Sun Type 3 Keyboard (HLE)")
+DEFINE_DEVICE_TYPE_PRIVATE(SUN_TYPE4_HLE_KEYBOARD, bus::sunkbd::hle_device_base, bus::sunkbd::hle_type4_device, "kbd_type4_hle", "Sun Type 4 Keyboard (HLE)")
+DEFINE_DEVICE_TYPE_PRIVATE(SUN_TYPE5_HLE_KEYBOARD, bus::sunkbd::hle_device_base, bus::sunkbd::hle_type5_device, "kbd_type5_hle_us", "Sun Type 5 Keyboard (U.S.A. - HLE)")
+DEFINE_DEVICE_TYPE_PRIVATE(SUN_TYPE5_GB_HLE_KEYBOARD, bus::sunkbd::hle_device_base, bus::sunkbd::hle_type5_gb_device, "kbd_type5_hle_gb", "Sun Type 5 Keyboard (Great Britain - HLE)")
+DEFINE_DEVICE_TYPE_PRIVATE(SUN_TYPE5_SE_HLE_KEYBOARD, bus::sunkbd::hle_device_base, bus::sunkbd::hle_type5_se_device, "kbd_type5_hle_se", "Sun Type 5 Keyboard (Sweden - HLE)")
+DEFINE_DEVICE_TYPE_PRIVATE(SUN_TYPE5_JP_HLE_KEYBOARD, bus::sunkbd::hle_device_base, bus::sunkbd::hle_type5_jp_device, "kbd_type5_hle_jp", "Sun Type 5 Keyboard (Japan - HLE)")
diff --git a/src/devices/bus/sunkbd/hlekbd.h b/src/devices/bus/sunkbd/hlekbd.h
index 6a3814973a2..2600175dc8c 100644
--- a/src/devices/bus/sunkbd/hlekbd.h
+++ b/src/devices/bus/sunkbd/hlekbd.h
@@ -6,6 +6,7 @@
#pragma once
#include "sunkbd.h"
+
#include "machine/keyboard.h"
#include "sound/beep.h"
#include "diserial.h"
@@ -102,111 +103,14 @@ private:
uint8_t m_beeper_state;
};
-
-class hle_type4_device_base : public hle_device_base
-{
-protected:
- using hle_device_base::hle_device_base;
-
-private:
- virtual uint8_t ident_byte() override;
-};
-
-
-class hle_type3_device : public hle_device_base
-{
-public:
- hle_type3_device(
- machine_config const &mconfig,
- char const *tag,
- device_t *owner,
- uint32_t clock);
-
-protected:
- virtual ioport_constructor device_input_ports() const override;
-
-private:
- virtual uint8_t ident_byte() override;
-};
-
-
-class hle_type4_device : public hle_type4_device_base
-{
-public:
- hle_type4_device(
- machine_config const &mconfig,
- char const *tag,
- device_t *owner,
- uint32_t clock);
-
-protected:
- virtual ioport_constructor device_input_ports() const override;
-};
-
-
-class hle_type5_device : public hle_type4_device_base
-{
-public:
- hle_type5_device(
- machine_config const &mconfig,
- char const *tag,
- device_t *owner,
- uint32_t clock);
-
-protected:
- virtual ioport_constructor device_input_ports() const override;
-};
-
-
-class hle_type5_gb_device : public hle_type4_device_base
-{
-public:
- hle_type5_gb_device(
- machine_config const &mconfig,
- char const *tag,
- device_t *owner,
- uint32_t clock);
-
-protected:
- virtual ioport_constructor device_input_ports() const override;
-};
-
-
-class hle_type5_se_device : public hle_type4_device_base
-{
-public:
- hle_type5_se_device(
- machine_config const &mconfig,
- char const *tag,
- device_t *owner,
- uint32_t clock);
-
-protected:
- virtual ioport_constructor device_input_ports() const override;
-};
-
-
-class hle_type5_jp_device : public hle_type4_device_base
-{
-public:
- hle_type5_jp_device(
- machine_config const &mconfig,
- char const *tag,
- device_t *owner,
- uint32_t clock);
-
-protected:
- virtual ioport_constructor device_input_ports() const override;
-};
-
} // namespace bus::sunkbd
-DECLARE_DEVICE_TYPE_NS(SUN_TYPE3_HLE_KEYBOARD, bus::sunkbd, hle_type3_device)
-DECLARE_DEVICE_TYPE_NS(SUN_TYPE4_HLE_KEYBOARD, bus::sunkbd, hle_type4_device)
-DECLARE_DEVICE_TYPE_NS(SUN_TYPE5_HLE_KEYBOARD, bus::sunkbd, hle_type5_device)
-DECLARE_DEVICE_TYPE_NS(SUN_TYPE5_GB_HLE_KEYBOARD, bus::sunkbd, hle_type5_gb_device)
-DECLARE_DEVICE_TYPE_NS(SUN_TYPE5_SE_HLE_KEYBOARD, bus::sunkbd, hle_type5_se_device)
-DECLARE_DEVICE_TYPE_NS(SUN_TYPE5_JP_HLE_KEYBOARD, bus::sunkbd, hle_type5_jp_device)
+DECLARE_DEVICE_TYPE_NS(SUN_TYPE3_HLE_KEYBOARD, bus::sunkbd, hle_device_base)
+DECLARE_DEVICE_TYPE_NS(SUN_TYPE4_HLE_KEYBOARD, bus::sunkbd, hle_device_base)
+DECLARE_DEVICE_TYPE_NS(SUN_TYPE5_HLE_KEYBOARD, bus::sunkbd, hle_device_base)
+DECLARE_DEVICE_TYPE_NS(SUN_TYPE5_GB_HLE_KEYBOARD, bus::sunkbd, hle_device_base)
+DECLARE_DEVICE_TYPE_NS(SUN_TYPE5_SE_HLE_KEYBOARD, bus::sunkbd, hle_device_base)
+DECLARE_DEVICE_TYPE_NS(SUN_TYPE5_JP_HLE_KEYBOARD, bus::sunkbd, hle_device_base)
#endif // MAME_DEVICES_SUNKBD_HLEKBD_H
diff --git a/src/mame/audio/cchasm.cpp b/src/mame/audio/cchasm.cpp
deleted file mode 100644
index a4549d2092b..00000000000
--- a/src/mame/audio/cchasm.cpp
+++ /dev/null
@@ -1,128 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Mathis Rosenhauer
-/***************************************************************************
-
- Cinematronics Cosmic Chasm hardware
-
-***************************************************************************/
-
-#include "emu.h"
-#include "cpu/z80/z80.h"
-#include "machine/z80ctc.h"
-#include "includes/cchasm.h"
-#include "sound/ay8910.h"
-
-
-void cchasm_state::reset_coin_flag_w(uint8_t data)
-{
- if (m_coin_flag)
- {
- m_coin_flag = 0;
- m_ctc->trg0(m_coin_flag);
- }
-}
-
-INPUT_CHANGED_MEMBER(cchasm_state::set_coin_flag )
-{
- if (!newval && !m_coin_flag)
- {
- m_coin_flag = 1;
- m_ctc->trg0(m_coin_flag);
- }
-}
-
-uint8_t cchasm_state::coin_sound_r()
-{
- uint8_t coin = (ioport("IN3")->read() >> 4) & 0x7;
- return m_sound_flags | (m_coin_flag << 3) | coin;
-}
-
-uint8_t cchasm_state::soundlatch2_r()
-{
- m_sound_flags &= ~0x80;
- m_ctc->trg2(0);
- return m_soundlatch2->read();
-}
-
-void cchasm_state::soundlatch4_w(uint8_t data)
-{
- m_sound_flags |= 0x40;
- m_soundlatch4->write(data);
- m_maincpu->set_input_line(1, HOLD_LINE);
-}
-
-void cchasm_state::io_w(offs_t offset, uint16_t data, uint16_t mem_mask)
-{
- //static int led;
-
- if (ACCESSING_BITS_8_15)
- {
- data >>= 8;
- switch (offset & 0xf)
- {
- case 0:
- m_soundlatch->write(data);
- break;
- case 1:
- m_sound_flags |= 0x80;
- m_soundlatch2->write(data);
- m_ctc->trg2(1);
- m_audiocpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);
- break;
- case 2:
- //led = data;
- break;
- }
- }
-}
-
-uint16_t cchasm_state::io_r(offs_t offset)
-{
- switch (offset & 0xf)
- {
- case 0x0:
- return m_soundlatch3->read() << 8;
- case 0x1:
- m_sound_flags &= ~0x40;
- return m_soundlatch4->read() << 8;
- case 0x2:
- return (m_sound_flags| (ioport("IN3")->read() & 0x07) | 0x08) << 8;
- case 0x5:
- return ioport("IN2")->read() << 8;
- case 0x8:
- return ioport("IN1")->read() << 8;
- default:
- return 0xff << 8;
- }
-}
-
-
-WRITE_LINE_MEMBER(cchasm_state::ctc_timer_1_w)
-{
- if (state) /* rising edge */
- {
- m_output[0] = !m_output[0];
- m_dac1->write(m_output[0]);
- }
-}
-
-WRITE_LINE_MEMBER(cchasm_state::ctc_timer_2_w)
-{
- if (state) /* rising edge */
- {
- m_output[1] = !m_output[1];
- m_dac2->write(m_output[1]);
- }
-}
-
-void cchasm_state::sound_start()
-{
- m_coin_flag = 0;
- m_sound_flags = 0;
- m_output[0] = 0;
- m_output[1] = 0;
-
- save_item(NAME(m_sound_flags));
- save_item(NAME(m_coin_flag));
- save_item(NAME(m_output));
-}
diff --git a/src/mame/audio/redalert.cpp b/src/mame/audio/redalert.cpp
index a104dc3e6e7..d1e2e9c7b70 100644
--- a/src/mame/audio/redalert.cpp
+++ b/src/mame/audio/redalert.cpp
@@ -10,11 +10,13 @@
****************************************************************************/
#include "emu.h"
-#include "includes/redalert.h"
+#include "redalert.h"
#include "cpu/m6800/m6800.h"
#include "cpu/m6502/m6502.h"
#include "machine/rescap.h"
+#include "sound/hc55516.h"
+
#include "speaker.h"
@@ -34,23 +36,73 @@
#define DEMONEYE_AY8910_CLOCK (DEMONEYE_AUDIO_PCB_CLOCK / 2) /* what's the real divisor? */
-TIMER_CALLBACK_MEMBER(redalert_state::audio_irq_on)
+DEFINE_DEVICE_TYPE(IREM_M37B_AUDIO, irem_m37b_audio_device, "irem_m37b_audio", "Irem M37B audio")
+DEFINE_DEVICE_TYPE(PANTHER_AUDIO, panther_audio_device, "panther_audio", "Irem M37B audio (Panther)")
+DEFINE_DEVICE_TYPE(IREM_M37B_UE17B_AUDIO, irem_m37b_ue17b_audio_device, "irem_m37b_ue17b_audio", "Irem M37B/UE17B audio/voice")
+DEFINE_DEVICE_TYPE(DEMONEYE_AUDIO, demoneye_audio_device, "demoneye_audio", "Irem Demoneye-X audio")
+
+
+irem_m37b_audio_device::irem_m37b_audio_device(const machine_config &config, const char *tag, device_t *owner, uint32_t clock) :
+ irem_m37b_audio_device(config, IREM_M37B_AUDIO, tag, owner, clock)
+{
+}
+
+irem_m37b_audio_device::irem_m37b_audio_device(const machine_config &config, device_type type, const char *tag, device_t *owner, uint32_t clock) :
+ device_t(config, type, tag, owner, clock),
+ m_audiocpu(*this, "audiocpu"),
+ m_ay8910(*this, "aysnd"),
+ m_soundlatch(*this, "soundlatch")
+{
+}
+
+
+panther_audio_device::panther_audio_device(const machine_config &config, const char *tag, device_t *owner, uint32_t clock) :
+ irem_m37b_audio_device(config, PANTHER_AUDIO, tag, owner, clock)
{
- if (m_sndpia.found())
- m_sndpia->cb1_w(0); // guess
- else
- m_audiocpu->set_input_line(m6502_device::IRQ_LINE, ASSERT_LINE);
+}
+
+
+irem_m37b_ue17b_audio_device::irem_m37b_ue17b_audio_device(const machine_config &config, const char *tag, device_t *owner, uint32_t clock) :
+ irem_m37b_audio_device(config, IREM_M37B_UE17B_AUDIO, tag, owner, clock),
+ m_voicecpu(*this, "voice"),
+ m_soundlatch2(*this, "soundlatch2")
+{
+}
+
+
+demoneye_audio_device::demoneye_audio_device(const machine_config &config, const char *tag, device_t *owner, uint32_t clock) :
+ device_t(config, DEMONEYE_AUDIO, tag, owner, clock),
+ m_audiocpu(*this, "audiocpu"),
+ m_ay(*this, "ay%u", 1U),
+ m_sndpia(*this, "sndpia"),
+ m_soundlatch(*this, "soundlatch")
+{
+}
+
+
+TIMER_CALLBACK_MEMBER(irem_m37b_audio_device::audio_irq_on)
+{
+ m_audiocpu->set_input_line(m6502_device::IRQ_LINE, ASSERT_LINE);
m_audio_irq_off_timer->adjust(REDALERT_AUDIO_CPU_IRQ_TIME);
}
+TIMER_CALLBACK_MEMBER(irem_m37b_audio_device::audio_irq_off)
+{
+ m_audiocpu->set_input_line(m6502_device::IRQ_LINE, CLEAR_LINE);
+}
+
-TIMER_CALLBACK_MEMBER(redalert_state::audio_irq_off)
+TIMER_CALLBACK_MEMBER(demoneye_audio_device::audio_irq_on)
{
- if (m_sndpia.found())
- m_sndpia->cb1_w(1); // guess
- else
- m_audiocpu->set_input_line(m6502_device::IRQ_LINE, CLEAR_LINE);
+ m_sndpia->cb1_w(0); // guess
+
+ m_audio_irq_off_timer->adjust(REDALERT_AUDIO_CPU_IRQ_TIME);
+}
+
+TIMER_CALLBACK_MEMBER(demoneye_audio_device::audio_irq_off)
+{
+ m_sndpia->cb1_w(1); // guess
}
@@ -60,7 +112,7 @@ TIMER_CALLBACK_MEMBER(redalert_state::audio_irq_off)
*
*************************************/
-void redalert_state::redalert_analog_w(uint8_t data)
+void irem_m37b_audio_device::analog_w(uint8_t data)
{
/* this port triggers analog sounds
D0 = Formation Aircraft?
@@ -82,7 +134,14 @@ void redalert_state::redalert_analog_w(uint8_t data)
*
*************************************/
-void redalert_state::redalert_audio_command_w(uint8_t data)
+CUSTOM_INPUT_MEMBER(irem_m37b_audio_device::sound_status_r)
+{
+ // communication handshake between host and sound CPU
+ // at least Panther uses it, unconfirmed for Red Alert and Demoneye-X
+ return m_sound_hs;
+}
+
+void irem_m37b_audio_device::audio_command_w(uint8_t data)
{
/* the byte is connected to port A of the AY8910 */
m_soundlatch->write(data);
@@ -95,7 +154,7 @@ void redalert_state::redalert_audio_command_w(uint8_t data)
}
-void redalert_state::redalert_AY8910_w(uint8_t data)
+void irem_m37b_audio_device::ay8910_w(uint8_t data)
{
/* BC2 is connected to a pull-up resistor, so BC2=1 always */
switch (data & 0x03)
@@ -121,34 +180,35 @@ void redalert_state::redalert_AY8910_w(uint8_t data)
}
-uint8_t redalert_state::redalert_ay8910_latch_1_r()
+uint8_t irem_m37b_audio_device::ay8910_latch_1_r()
{
return m_ay8910_latch_1;
}
-void redalert_state::redalert_ay8910_latch_2_w(uint8_t data)
+void irem_m37b_audio_device::ay8910_latch_2_w(uint8_t data)
{
m_ay8910_latch_2 = data;
}
-void redalert_state::redalert_audio_map(address_map &map)
+void irem_m37b_audio_device::redalert_audio_map(address_map &map)
{
map.global_mask(0x7fff);
map(0x0000, 0x03ff).mirror(0x0c00).ram();
- map(0x1000, 0x1000).mirror(0x0ffe).nopr().w(FUNC(redalert_state::redalert_AY8910_w));
- map(0x1001, 0x1001).mirror(0x0ffe).rw(FUNC(redalert_state::redalert_ay8910_latch_1_r), FUNC(redalert_state::redalert_ay8910_latch_2_w));
+ map(0x1000, 0x1000).mirror(0x0ffe).nopr().w(FUNC(irem_m37b_audio_device::ay8910_w));
+ map(0x1001, 0x1001).mirror(0x0ffe).rw(FUNC(irem_m37b_audio_device::ay8910_latch_1_r), FUNC(irem_m37b_audio_device::ay8910_latch_2_w));
map(0x2000, 0x6fff).noprw();
map(0x7000, 0x77ff).mirror(0x0800).rom();
}
-void redalert_state::panther_audio_map(address_map &map)
+void panther_audio_device::panther_audio_map(address_map &map)
{
redalert_audio_map(map);
+
// Panther maps these two to $2000 while Red Alert to $1000, different PAL addressing?
map(0x1000, 0x1fff).unmaprw();
- map(0x2000, 0x2000).mirror(0x0ffe).nopr().w(FUNC(redalert_state::redalert_AY8910_w));
- map(0x2001, 0x2001).mirror(0x0ffe).rw(FUNC(redalert_state::redalert_ay8910_latch_1_r), FUNC(redalert_state::redalert_ay8910_latch_2_w));
+ map(0x2000, 0x2000).mirror(0x0ffe).nopr().w(FUNC(panther_audio_device::ay8910_w));
+ map(0x2001, 0x2001).mirror(0x0ffe).rw(FUNC(panther_audio_device::ay8910_latch_1_r), FUNC(panther_audio_device::ay8910_latch_2_w));
}
/*************************************
@@ -157,10 +217,10 @@ void redalert_state::panther_audio_map(address_map &map)
*
*************************************/
-void redalert_state::sound_start()
+void irem_m37b_audio_device::device_start()
{
- m_audio_irq_on_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(redalert_state::audio_irq_on), this));
- m_audio_irq_off_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(redalert_state::audio_irq_off), this));
+ m_audio_irq_on_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(irem_m37b_audio_device::audio_irq_on), this));
+ m_audio_irq_off_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(irem_m37b_audio_device::audio_irq_off), this));
m_audio_irq_on_timer->adjust(REDALERT_AUDIO_CPU_IRQ_FREQ, 0, REDALERT_AUDIO_CPU_IRQ_FREQ);
@@ -176,26 +236,14 @@ void redalert_state::sound_start()
*
*************************************/
-void redalert_state::redalert_voice_command_w(uint8_t data)
+void irem_m37b_ue17b_audio_device::voice_command_w(uint8_t data)
{
m_soundlatch2->write((data & 0x78) >> 3);
m_voicecpu->set_input_line(I8085_RST75_LINE, (~data & 0x80) ? ASSERT_LINE : CLEAR_LINE);
}
-WRITE_LINE_MEMBER(redalert_state::sod_callback)
-{
- m_cvsd->digit_w(state);
-}
-
-
-READ_LINE_MEMBER(redalert_state::sid_callback)
-{
- return m_cvsd->clock_state_r();
-}
-
-
-void redalert_state::redalert_voice_map(address_map &map)
+void irem_m37b_ue17b_audio_device::redalert_voice_map(address_map &map)
{
map(0x0000, 0x3fff).rom();
map(0x4000, 0x7fff).noprw();
@@ -211,37 +259,42 @@ void redalert_state::redalert_voice_map(address_map &map)
*
*************************************/
-void redalert_state::redalert_audio_m37b(machine_config &config)
+void irem_m37b_audio_device::device_add_mconfig(machine_config &config)
{
M6502(config, m_audiocpu, REDALERT_AUDIO_CPU_CLOCK);
- m_audiocpu->set_addrmap(AS_PROGRAM, &redalert_state::redalert_audio_map);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &irem_m37b_audio_device::redalert_audio_map);
GENERIC_LATCH_8(config, m_soundlatch);
+ SPEAKER(config, "mono").front_center();
+
AY8910(config, m_ay8910, REDALERT_AY8910_CLOCK);
m_ay8910->port_a_read_callback().set(m_soundlatch, FUNC(generic_latch_8_device::read));
- m_ay8910->port_b_write_callback().set(FUNC(redalert_state::redalert_analog_w));
+ m_ay8910->port_b_write_callback().set(FUNC(irem_m37b_audio_device::analog_w));
m_ay8910->add_route(0, "mono", 0.50);
m_ay8910->add_route(1, "mono", 0.50);
/* channel C is used a noise source and is not connected to a speaker */
}
+
/*************************************
*
* Red Alert voice board (ue17b)
*
*************************************/
-void redalert_state::redalert_audio_voice(machine_config &config)
+void irem_m37b_ue17b_audio_device::device_add_mconfig(machine_config &config)
{
+ irem_m37b_audio_device::device_add_mconfig(config);
+
I8085A(config, m_voicecpu, REDALERT_VOICE_CPU_CLOCK);
- m_voicecpu->set_addrmap(AS_PROGRAM, &redalert_state::redalert_voice_map);
- m_voicecpu->in_sid_func().set(FUNC(redalert_state::sid_callback));
- m_voicecpu->out_sod_func().set(FUNC(redalert_state::sod_callback));
+ m_voicecpu->set_addrmap(AS_PROGRAM, &irem_m37b_ue17b_audio_device::redalert_voice_map);
+ m_voicecpu->in_sid_func().set("cvsd", FUNC(hc55516_device::clock_state_r));
+ m_voicecpu->out_sod_func().set("cvsd", FUNC(hc55516_device::digit_w));
GENERIC_LATCH_8(config, m_soundlatch2);
- HC55516(config, m_cvsd, REDALERT_HC55516_CLOCK).add_route(ALL_OUTPUTS, "mono", 0.50);
+ HC55516(config, "cvsd", REDALERT_HC55516_CLOCK).add_route(ALL_OUTPUTS, "mono", 0.50);
}
/*************************************
@@ -250,43 +303,32 @@ void redalert_state::redalert_audio_voice(machine_config &config)
*
*************************************/
-void redalert_state::redalert_audio(machine_config &config)
+void panther_audio_device::device_add_mconfig(machine_config &config)
{
- SPEAKER(config, "mono").front_center();
+ irem_m37b_audio_device::device_add_mconfig(config);
- redalert_audio_m37b(config);
- redalert_audio_voice(config);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &panther_audio_device::panther_audio_map);
}
/*************************************
*
- * Red Alert
+ * Demoneye-X audio board
*
*************************************/
-void redalert_state::ww3_audio(machine_config &config)
+void demoneye_audio_device::device_start()
{
- SPEAKER(config, "mono").front_center();
-
- redalert_audio_m37b(config);
-}
+ m_audio_irq_on_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(demoneye_audio_device::audio_irq_on), this));
+ m_audio_irq_off_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(demoneye_audio_device::audio_irq_off), this));
-void redalert_state::panther_audio(machine_config &config)
-{
- SPEAKER(config, "mono").front_center();
+ m_audio_irq_on_timer->adjust(REDALERT_AUDIO_CPU_IRQ_FREQ, 0, REDALERT_AUDIO_CPU_IRQ_FREQ);
- redalert_audio_m37b(config);
- m_audiocpu->set_addrmap(AS_PROGRAM, &redalert_state::panther_audio_map);
+ save_item(NAME(m_ay8910_latch_1));
+ save_item(NAME(m_ay8910_latch_2));
}
-/*************************************
- *
- * Demoneye-X audio board
- *
- *************************************/
-
-void redalert_state::demoneye_audio_command_w(uint8_t data)
+void demoneye_audio_device::audio_command_w(uint8_t data)
{
/* the byte is connected to port A of the AY8910 */
m_soundlatch->write(data);
@@ -294,57 +336,51 @@ void redalert_state::demoneye_audio_command_w(uint8_t data)
}
-void redalert_state::demoneye_ay8910_latch_1_w(uint8_t data)
+void demoneye_audio_device::ay8910_latch_1_w(uint8_t data)
{
m_ay8910_latch_1 = data;
}
-uint8_t redalert_state::demoneye_ay8910_latch_2_r()
+uint8_t demoneye_audio_device::ay8910_latch_2_r()
{
return m_ay8910_latch_2;
}
-void redalert_state::demoneye_ay8910_data_w(uint8_t data)
+void demoneye_audio_device::ay8910_data_w(uint8_t data)
{
switch (m_ay8910_latch_1 & 0x03)
{
case 0x00:
if (m_ay8910_latch_1 & 0x10)
m_ay[0]->data_w(data);
-
if (m_ay8910_latch_1 & 0x20)
m_ay[1]->data_w(data);
-
break;
case 0x01:
if (m_ay8910_latch_1 & 0x10)
m_ay8910_latch_2 = m_ay[0]->data_r();
-
if (m_ay8910_latch_1 & 0x20)
m_ay8910_latch_2 = m_ay[1]->data_r();
-
break;
case 0x03:
if (m_ay8910_latch_1 & 0x10)
m_ay[0]->address_w(data);
-
if (m_ay8910_latch_1 & 0x20)
m_ay[1]->address_w(data);
-
break;
default:
- logerror("demoneye_ay8910_data_w called with latch %02X data %02X\n", m_ay8910_latch_1, data);
+ logerror("demoneye_audio_device::ay8910_data_w called with latch %02X data %02X\n", m_ay8910_latch_1, data);
break;
}
}
-void redalert_state::demoneye_audio_map(address_map &map)
+void demoneye_audio_device::demoneye_audio_map(address_map &map)
{
map(0x0500, 0x0503).mirror(0xc000).rw(m_sndpia, FUNC(pia6821_device::read), FUNC(pia6821_device::write));
map(0x2000, 0x3fff).mirror(0xc000).rom();
@@ -358,15 +394,15 @@ void redalert_state::demoneye_audio_map(address_map &map)
*
*************************************/
-void redalert_state::demoneye_audio(machine_config &config)
+void demoneye_audio_device::device_add_mconfig(machine_config &config)
{
M6802(config, m_audiocpu, DEMONEYE_AUDIO_CPU_CLOCK);
- m_audiocpu->set_addrmap(AS_PROGRAM, &redalert_state::demoneye_audio_map);
+ m_audiocpu->set_addrmap(AS_PROGRAM, &demoneye_audio_device::demoneye_audio_map);
PIA6821(config, m_sndpia);
- m_sndpia->readpa_handler().set(FUNC(redalert_state::demoneye_ay8910_latch_2_r));
- m_sndpia->writepa_handler().set(FUNC(redalert_state::demoneye_ay8910_data_w));
- m_sndpia->writepb_handler().set(FUNC(redalert_state::demoneye_ay8910_latch_1_w));
+ m_sndpia->readpa_handler().set(FUNC(demoneye_audio_device::ay8910_latch_2_r));
+ m_sndpia->writepa_handler().set(FUNC(demoneye_audio_device::ay8910_data_w));
+ m_sndpia->writepb_handler().set(FUNC(demoneye_audio_device::ay8910_latch_1_w));
m_sndpia->irqb_handler().set_inputline(m_audiocpu, M6802_IRQ_LINE);
SPEAKER(config, "mono").front_center();
diff --git a/src/mame/audio/redalert.h b/src/mame/audio/redalert.h
new file mode 100644
index 00000000000..2a621872502
--- /dev/null
+++ b/src/mame/audio/redalert.h
@@ -0,0 +1,127 @@
+// license:BSD-3-Clause
+// copyright-holders:Mike Balfour
+#ifndef MAME_AUDIO_REDALERT_H
+#define MAME_AUDIO_REDALERT_H
+
+#pragma once
+
+#include "cpu/i8085/i8085.h"
+#include "machine/6821pia.h"
+#include "machine/gen_latch.h"
+#include "sound/ay8910.h"
+
+
+DECLARE_DEVICE_TYPE(IREM_M37B_AUDIO, irem_m37b_audio_device)
+DECLARE_DEVICE_TYPE(PANTHER_AUDIO, panther_audio_device)
+DECLARE_DEVICE_TYPE(IREM_M37B_UE17B_AUDIO, irem_m37b_ue17b_audio_device)
+DECLARE_DEVICE_TYPE(DEMONEYE_AUDIO, demoneye_audio_device)
+
+
+class irem_m37b_audio_device : public device_t
+{
+public:
+ static constexpr feature_type imperfect_features() { return feature::SOUND; } // missing analog effects
+
+ irem_m37b_audio_device(const machine_config &config, const char *tag, device_t *owner, uint32_t clock = 0U);
+
+ DECLARE_CUSTOM_INPUT_MEMBER(sound_status_r);
+
+ void audio_command_w(uint8_t data);
+
+protected:
+ irem_m37b_audio_device(const machine_config &config, device_type type, const char *tag, device_t *owner, uint32_t clock);
+
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual void device_start() override;
+
+ void analog_w(uint8_t data);
+ void ay8910_w(uint8_t data);
+ uint8_t ay8910_latch_1_r();
+ void ay8910_latch_2_w(uint8_t data);
+
+ void redalert_audio_map(address_map &map);
+
+ required_device<cpu_device> m_audiocpu;
+ required_device<ay8910_device> m_ay8910;
+ required_device<generic_latch_8_device> m_soundlatch;
+
+private:
+ TIMER_CALLBACK_MEMBER(audio_irq_on);
+ TIMER_CALLBACK_MEMBER(audio_irq_off);
+
+ emu_timer *m_audio_irq_on_timer;
+ emu_timer *m_audio_irq_off_timer;
+
+ uint8_t m_sound_hs;
+ uint8_t m_ay8910_latch_1;
+ uint8_t m_ay8910_latch_2;
+};
+
+
+class panther_audio_device : public irem_m37b_audio_device
+{
+public:
+ panther_audio_device(const machine_config &config, const char *tag, device_t *owner, uint32_t clock = 0U);
+
+protected:
+ virtual void device_add_mconfig(machine_config &config) override;
+
+private:
+ void panther_audio_map(address_map &map);
+};
+
+
+class irem_m37b_ue17b_audio_device : public irem_m37b_audio_device
+{
+public:
+ irem_m37b_ue17b_audio_device(const machine_config &config, const char *tag, device_t *owner, uint32_t clock = 0U);
+
+ void voice_command_w(uint8_t data);
+
+protected:
+ virtual void device_add_mconfig(machine_config &config) override;
+
+private:
+ void redalert_voice_map(address_map &map);
+
+ required_device<i8085a_cpu_device> m_voicecpu;
+ required_device<generic_latch_8_device> m_soundlatch2;
+};
+
+
+class demoneye_audio_device : public device_t
+{
+public:
+ static constexpr feature_type imperfect_features() { return feature::SOUND; }
+
+ demoneye_audio_device(const machine_config &config, const char *tag, device_t *owner, uint32_t clock = 0U);
+
+ void audio_command_w(uint8_t data);
+
+protected:
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual void device_start() override;
+
+private:
+ TIMER_CALLBACK_MEMBER(audio_irq_on);
+ TIMER_CALLBACK_MEMBER(audio_irq_off);
+
+ void ay8910_latch_1_w(uint8_t data);
+ uint8_t ay8910_latch_2_r();
+ void ay8910_data_w(uint8_t data);
+
+ void demoneye_audio_map(address_map &map);
+
+ required_device<cpu_device> m_audiocpu;
+ required_device_array<ay8910_device, 2> m_ay;
+ required_device<pia6821_device> m_sndpia;
+ required_device<generic_latch_8_device> m_soundlatch;
+
+ emu_timer *m_audio_irq_on_timer;
+ emu_timer *m_audio_irq_off_timer;
+
+ uint8_t m_ay8910_latch_1;
+ uint8_t m_ay8910_latch_2;
+};
+
+#endif // MAME_AUDIO_REDALERT_H
diff --git a/src/mame/drivers/cchasm.cpp b/src/mame/drivers/cchasm.cpp
index 48f8214a692..e40fa754d2e 100644
--- a/src/mame/drivers/cchasm.cpp
+++ b/src/mame/drivers/cchasm.cpp
@@ -15,17 +15,102 @@
***************************************************************************/
#include "emu.h"
-#include "includes/cchasm.h"
-#include "machine/z80daisy.h"
#include "cpu/m68000/m68000.h"
+#include "cpu/z80/z80.h"
#include "machine/6840ptm.h"
-#include "machine/z80ctc.h"
+#include "machine/gen_latch.h"
#include "machine/watchdog.h"
+#include "machine/z80ctc.h"
+#include "machine/z80ctc.h"
+#include "machine/z80daisy.h"
#include "sound/ay8910.h"
+#include "sound/dac.h"
+#include "video/vector.h"
+
+#include "screen.h"
#include "speaker.h"
-#define CCHASM_68K_CLOCK (XTAL(8'000'000))
+
+namespace {
+
+class cchasm_state : public driver_device
+{
+public:
+ cchasm_state(const machine_config &mconfig, device_type type, const char *tag) :
+ driver_device(mconfig, type, tag),
+ m_maincpu(*this, "maincpu"),
+ m_ctc(*this, "ctc"),
+ m_audiocpu(*this, "audiocpu"),
+ m_dac1(*this, "dac1"),
+ m_dac2(*this, "dac2"),
+ m_vector(*this, "vector"),
+ m_screen(*this, "screen"),
+ m_soundlatch(*this, "soundlatch"),
+ m_soundlatch2(*this, "soundlatch2"),
+ m_soundlatch3(*this, "soundlatch3"),
+ m_soundlatch4(*this, "soundlatch4"),
+ m_ram(*this, "ram"),
+ m_inputs(*this, "IN%u", 1U)
+ {
+ }
+
+ void cchasm(machine_config &config);
+
+ INPUT_CHANGED_MEMBER(set_coin_flag);
+
+protected:
+ enum
+ {
+ TIMER_REFRESH_END
+ };
+
+ virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
+
+ virtual void machine_start() override;
+
+private:
+ required_device<cpu_device> m_maincpu;
+ required_device<z80ctc_device> m_ctc;
+ required_device<z80_device> m_audiocpu;
+ required_device<dac_bit_interface> m_dac1;
+ required_device<dac_bit_interface> m_dac2;
+ required_device<vector_device> m_vector;
+ required_device<screen_device> m_screen;
+ required_device<generic_latch_8_device> m_soundlatch;
+ required_device<generic_latch_8_device> m_soundlatch2;
+ required_device<generic_latch_8_device> m_soundlatch3;
+ required_device<generic_latch_8_device> m_soundlatch4;
+
+ required_shared_ptr<uint16_t> m_ram;
+
+ required_ioport_array<3> m_inputs;
+
+ int m_sound_flags;
+ int m_coin_flag;
+ int m_output[2];
+ int m_xcenter;
+ int m_ycenter;
+ emu_timer *m_refresh_end_timer;
+
+ void led_w(offs_t offset, uint16_t data);
+ void refresh_control_w(offs_t offset, uint8_t data);
+ void reset_coin_flag_w(uint8_t data);
+ uint8_t coin_sound_r();
+ uint8_t soundlatch2_r();
+ void soundlatch4_w(uint8_t data);
+ void io_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
+ uint16_t io_r(offs_t offset);
+ DECLARE_WRITE_LINE_MEMBER(ctc_timer_1_w);
+ DECLARE_WRITE_LINE_MEMBER(ctc_timer_2_w);
+
+ void refresh();
+
+ void memmap(address_map &map);
+ void sound_memmap(address_map &map);
+ void sound_portmap(address_map &map);
+};
+
/*************************************
*
@@ -37,11 +122,11 @@ void cchasm_state::memmap(address_map &map)
{
map(0x000000, 0x00ffff).rom();
map(0x040000, 0x04000f).rw("6840ptm", FUNC(ptm6840_device::read), FUNC(ptm6840_device::write)).umask16(0x00ff);
- map(0x050000, 0x050001).w(FUNC(cchasm_state::refresh_control_w));
+ map(0x050000, 0x050000).w(FUNC(cchasm_state::refresh_control_w));
map(0x060000, 0x060001).portr("DSW").w(FUNC(cchasm_state::led_w));
map(0x070000, 0x070001).w("watchdog", FUNC(watchdog_timer_device::reset16_w));
map(0xf80000, 0xf800ff).rw(FUNC(cchasm_state::io_r), FUNC(cchasm_state::io_w));
- map(0xffb000, 0xffffff).ram().share("ram");
+ map(0xffb000, 0xffffff).ram().share(m_ram);
}
/*************************************
@@ -125,6 +210,248 @@ static INPUT_PORTS_START( cchasm )
INPUT_PORTS_END
+
+void cchasm_state::led_w(offs_t offset, uint16_t data)
+{
+ /*logerror("LED write %x to %x\n", data, offset);*/
+}
+
+
+void cchasm_state::reset_coin_flag_w(uint8_t data)
+{
+ if (m_coin_flag)
+ {
+ m_coin_flag = 0;
+ m_ctc->trg0(m_coin_flag);
+ }
+}
+
+INPUT_CHANGED_MEMBER(cchasm_state::set_coin_flag )
+{
+ if (!newval && !m_coin_flag)
+ {
+ m_coin_flag = 1;
+ m_ctc->trg0(m_coin_flag);
+ }
+}
+
+uint8_t cchasm_state::coin_sound_r()
+{
+ uint8_t coin = (m_inputs[2]->read() >> 4) & 0x7;
+ return m_sound_flags | (m_coin_flag << 3) | coin;
+}
+
+uint8_t cchasm_state::soundlatch2_r()
+{
+ m_sound_flags &= ~0x80;
+ m_ctc->trg2(0);
+ return m_soundlatch2->read();
+}
+
+void cchasm_state::soundlatch4_w(uint8_t data)
+{
+ m_sound_flags |= 0x40;
+ m_soundlatch4->write(data);
+ m_maincpu->set_input_line(1, HOLD_LINE);
+}
+
+void cchasm_state::io_w(offs_t offset, uint16_t data, uint16_t mem_mask)
+{
+ //static int led;
+
+ if (ACCESSING_BITS_8_15)
+ {
+ data >>= 8;
+ switch (offset & 0xf)
+ {
+ case 0:
+ m_soundlatch->write(data);
+ break;
+ case 1:
+ m_sound_flags |= 0x80;
+ m_soundlatch2->write(data);
+ m_ctc->trg2(1);
+ m_audiocpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);
+ break;
+ case 2:
+ //led = data;
+ break;
+ }
+ }
+}
+
+uint16_t cchasm_state::io_r(offs_t offset)
+{
+ switch (offset & 0xf)
+ {
+ case 0x0:
+ return m_soundlatch3->read() << 8;
+ case 0x1:
+ m_sound_flags &= ~0x40;
+ return m_soundlatch4->read() << 8;
+ case 0x2:
+ return (m_sound_flags| (ioport("IN3")->read() & 0x07) | 0x08) << 8;
+ case 0x5:
+ return m_inputs[1]->read() << 8;
+ case 0x8:
+ return m_inputs[0]->read() << 8;
+ default:
+ return 0xff << 8;
+ }
+}
+
+
+WRITE_LINE_MEMBER(cchasm_state::ctc_timer_1_w)
+{
+ if (state) /* rising edge */
+ {
+ m_output[0] = !m_output[0];
+ m_dac1->write(m_output[0]);
+ }
+}
+
+WRITE_LINE_MEMBER(cchasm_state::ctc_timer_2_w)
+{
+ if (state) /* rising edge */
+ {
+ m_output[1] = !m_output[1];
+ m_dac2->write(m_output[1]);
+ }
+}
+
+
+void cchasm_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
+{
+ switch (id)
+ {
+ case TIMER_REFRESH_END:
+ m_maincpu->set_input_line(2, ASSERT_LINE);
+ break;
+ default:
+ throw emu_fatalerror("Unknown id in cchasm_state::device_timer");
+ }
+}
+
+
+void cchasm_state::refresh()
+{
+ constexpr int HALT = 0;
+ constexpr int JUMP = 1;
+ constexpr int COLOR = 2;
+ constexpr int SCALEY = 3;
+ constexpr int POSY = 4;
+ constexpr int SCALEX = 5;
+ constexpr int POSX = 6;
+ constexpr int LENGTH = 7;
+
+ int pc = 0;
+ int done = 0;
+ int currentx = 0, currenty = 0;
+ int scalex = 0, scaley = 0;
+ int color = 0;
+ int total_length = 1; /* length of all lines drawn in a frame */
+ int move = 0;
+
+ m_vector->clear_list();
+
+ while (!done)
+ {
+ int data = m_ram[pc];
+ const int opcode = data >> 12;
+ data &= 0xfff;
+ if ((opcode > COLOR) && (data & 0x800))
+ data |= 0xfffff000;
+
+ pc++;
+
+ switch (opcode)
+ {
+ case HALT:
+ done=1;
+ break;
+ case JUMP:
+ pc = data - 0xb00;
+ logerror("JUMP to %x\n", data);
+ break;
+ case COLOR:
+ color = vector_device::color444(data ^ 0xfff);
+ break;
+ case SCALEY:
+ scaley = data << 5;
+ break;
+ case POSY:
+ move = 1;
+ currenty = m_ycenter + (data << 16);
+ break;
+ case SCALEX:
+ scalex = data << 5;
+ break;
+ case POSX:
+ move = 1;
+ currentx = m_xcenter - (data << 16);
+ break;
+ case LENGTH:
+ if (move)
+ {
+ m_vector->add_point (currentx, currenty, 0, 0);
+ move = 0;
+ }
+
+ currentx -= data * scalex;
+ currenty += data * scaley;
+
+ total_length += abs(data);
+
+ if (color)
+ m_vector->add_point (currentx, currenty, color, 0xff);
+ else
+ move = 1;
+ break;
+ default:
+ logerror("Unknown refresh proc opcode %x with data %x at pc = %x\n", opcode, data, pc-2);
+ done = 1;
+ break;
+ }
+ }
+ /* Refresh processor runs with 6 MHz */
+ m_refresh_end_timer->adjust(attotime::from_hz(6000000) * total_length);
+}
+
+
+void cchasm_state::refresh_control_w(offs_t offset, uint8_t data)
+{
+ switch (data)
+ {
+ case 0x37:
+ refresh();
+ break;
+ case 0xf7:
+ m_maincpu->set_input_line(2, CLEAR_LINE);
+ break;
+ }
+}
+
+void cchasm_state::machine_start()
+{
+ const rectangle &visarea = m_screen->visible_area();
+
+ m_xcenter = visarea.xcenter() << 16;
+ m_ycenter = visarea.ycenter() << 16;
+
+ m_refresh_end_timer = timer_alloc(TIMER_REFRESH_END);
+
+ m_coin_flag = 0;
+ m_sound_flags = 0;
+ m_output[0] = 0;
+ m_output[1] = 0;
+
+ save_item(NAME(m_sound_flags));
+ save_item(NAME(m_coin_flag));
+ save_item(NAME(m_output));
+}
+
+
+
/*************************************
*
* CPU config
@@ -147,6 +474,8 @@ static const z80_daisy_config daisy_chain[] =
void cchasm_state::cchasm(machine_config &config)
{
+ constexpr XTAL CCHASM_68K_CLOCK(8'000'000);
+
/* basic machine hardware */
M68000(config, m_maincpu, CCHASM_68K_CLOCK); /* 8 MHz (from schematics) */
m_maincpu->set_addrmap(AS_PROGRAM, &cchasm_state::memmap);
@@ -179,12 +508,12 @@ void cchasm_state::cchasm(machine_config &config)
GENERIC_LATCH_8(config, m_soundlatch3);
GENERIC_LATCH_8(config, m_soundlatch4);
- AY8910(config, "ay1", 1818182).add_route(ALL_OUTPUTS, "speaker", 0.2);
+ AY8910(config, "ay1", 1818182).add_route(ALL_OUTPUTS, "speaker", 0.15);
- AY8910(config, "ay2", 1818182).add_route(ALL_OUTPUTS, "speaker", 0.2);
+ AY8910(config, "ay2", 1818182).add_route(ALL_OUTPUTS, "speaker", 0.15);
- DAC_1BIT(config, m_dac1, 0).add_route(ALL_OUTPUTS, "speaker", 0.5);
- DAC_1BIT(config, m_dac2, 0).add_route(ALL_OUTPUTS, "speaker", 0.5);
+ DAC_1BIT(config, m_dac1, 0).add_route(ALL_OUTPUTS, "speaker", 0.375);
+ DAC_1BIT(config, m_dac2, 0).add_route(ALL_OUTPUTS, "speaker", 0.375);
/* 6840 PTM */
ptm6840_device &ptm(PTM6840(config, "6840ptm", CCHASM_68K_CLOCK/10));
@@ -250,6 +579,7 @@ ROM_START( cchasm1 )
ROM_LOAD( "2732.bin", 0x0000, 0x1000, CRC(715adc4a) SHA1(426be4f3334ef7f2e8eb4d533e64276c30812aa3) )
ROM_END
+} // anonymous namespace
diff --git a/src/mame/drivers/redalert.cpp b/src/mame/drivers/redalert.cpp
index 01771bcae83..249d7cb7427 100644
--- a/src/mame/drivers/redalert.cpp
+++ b/src/mame/drivers/redalert.cpp
@@ -113,8 +113,10 @@
****************************************************************************/
#include "emu.h"
-#include "cpu/m6502/m6502.h"
#include "includes/redalert.h"
+#include "audio/redalert.h"
+
+#include "cpu/m6502/m6502.h"
#define MAIN_PCB_CLOCK (XTAL(12'500'000))
@@ -180,10 +182,10 @@ void redalert_state::redalert_main_map(address_map &map)
map(0xc000, 0xc000).mirror(0x0f8f).portr("DSW").nopw();
map(0xc010, 0xc010).mirror(0x0f8f).portr("KEY1").nopw();
map(0xc020, 0xc020).mirror(0x0f8f).portr("KEY2").nopw();
- map(0xc030, 0xc030).mirror(0x0f8f).nopr().w(FUNC(redalert_state::redalert_audio_command_w));
+ map(0xc030, 0xc030).mirror(0x0f8f).nopr().w("soundboard", FUNC(irem_m37b_ue17b_audio_device::audio_command_w));
map(0xc040, 0xc040).mirror(0x0f8f).nopr().writeonly().share("video_control");
map(0xc050, 0xc050).mirror(0x0f8f).nopr().writeonly().share("bitmap_color");
- map(0xc060, 0xc060).mirror(0x0f8f).nopr().w(FUNC(redalert_state::redalert_voice_command_w));
+ map(0xc060, 0xc060).mirror(0x0f8f).nopr().w("soundboard", FUNC(irem_m37b_ue17b_audio_device::voice_command_w));
map(0xc070, 0xc070).mirror(0x0f8f).rw(FUNC(redalert_state::redalert_interrupt_clear_r), FUNC(redalert_state::redalert_interrupt_clear_w));
map(0xf000, 0xffff).rom().region("maincpu", 0x8000);
}
@@ -197,7 +199,7 @@ void redalert_state::ww3_main_map(address_map &map)
map(0xc000, 0xc000).mirror(0x0f8f).portr("DSW").nopw();
map(0xc010, 0xc010).mirror(0x0f8f).portr("KEY1").nopw();
map(0xc020, 0xc020).mirror(0x0f8f).portr("KEY2").nopw();
- map(0xc030, 0xc030).mirror(0x0f8f).nopr().w(FUNC(redalert_state::redalert_audio_command_w));
+ map(0xc030, 0xc030).mirror(0x0f8f).nopr().w("soundboard", FUNC(irem_m37b_ue17b_audio_device::audio_command_w));
map(0xc040, 0xc040).mirror(0x0f8f).nopr().writeonly().share("video_control");
map(0xc050, 0xc050).mirror(0x0f8f).nopr().writeonly().share("bitmap_color");
map(0xc070, 0xc070).mirror(0x0f8f).rw(FUNC(redalert_state::redalert_interrupt_clear_r), FUNC(redalert_state::redalert_interrupt_clear_w));
@@ -213,7 +215,7 @@ void redalert_state::panther_main_map(address_map &map)
map(0xc000, 0xc000).mirror(0x0f8f).portr("DSW").nopw();
map(0xc010, 0xc010).mirror(0x0f8f).portr("KEY1").nopw();
map(0xc020, 0xc020).mirror(0x0f8f).portr("KEY2").nopw();
- map(0xc030, 0xc030).mirror(0x0f8f).nopr().w(FUNC(redalert_state::redalert_audio_command_w));
+ map(0xc030, 0xc030).mirror(0x0f8f).nopr().w("soundboard", FUNC(panther_audio_device::audio_command_w));
map(0xc040, 0xc040).mirror(0x0f8f).nopr().writeonly().share("video_control");
map(0xc050, 0xc050).mirror(0x0f8f).nopr().writeonly().share("bitmap_color");
map(0xc070, 0xc070).mirror(0x0f8f).rw(FUNC(redalert_state::panther_interrupt_clear_r), FUNC(redalert_state::redalert_interrupt_clear_w));
@@ -229,7 +231,7 @@ void redalert_state::demoneye_main_map(address_map &map)
map(0xc000, 0xc000).mirror(0x0f8f).portr("DSW").nopw();
map(0xc010, 0xc010).mirror(0x0f8f).portr("KEY1").nopw();
map(0xc020, 0xc020).mirror(0x0f8f).portr("KEY2").nopw();
- map(0xc030, 0xc030).mirror(0x0f8f).nopr().w(FUNC(redalert_state::demoneye_audio_command_w));
+ map(0xc030, 0xc030).mirror(0x0f8f).nopr().w("soundboard", FUNC(demoneye_audio_device::audio_command_w));
map(0xc040, 0xc040).mirror(0x0f8f).nopr().writeonly().share("video_control");
map(0xc050, 0xc050).mirror(0x0f8f).nopr().writeonly().share("bitmap_color");
map(0xc060, 0xc063).mirror(0x0f80).w(FUNC(redalert_state::demoneye_bitmap_layer_w));
@@ -251,13 +253,6 @@ INPUT_CHANGED_MEMBER(redalert_state::coin_inserted)
m_maincpu->set_input_line(INPUT_LINE_NMI, newval ? CLEAR_LINE : ASSERT_LINE);
}
-CUSTOM_INPUT_MEMBER(redalert_state::sound_status_r)
-{
- // communication handshake between host and sound CPU
- // at least Panther uses it, unconfirmed for Red Alert and Demoneye-X
- return m_sound_hs;
-}
-
static INPUT_PORTS_START( m27_base )
// port names comes from Panther input test
PORT_START("COIN")
@@ -278,7 +273,7 @@ static INPUT_PORTS_START( m27_base )
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN ) /* Meter */
PORT_START("KEY2")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(redalert_state, sound_status_r)
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_DEVICE_MEMBER("soundboard", irem_m37b_audio_device, sound_status_r)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNKNOWN ) /* Meter */
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL
// TODO: 2-way/4-way ...?
@@ -358,6 +353,9 @@ INPUT_PORTS_END
static INPUT_PORTS_START( demoneye )
PORT_INCLUDE( m27_base )
+ PORT_MODIFY("KEY2")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // audio status for panther
+
PORT_START("DSW")
PORT_DIPNAME( 0x03, 0x00, DEF_STR( Lives ) )
PORT_DIPSETTING( 0x00, "3" )
@@ -402,7 +400,7 @@ void redalert_state::redalert(machine_config &config)
redalert_video(config);
/* audio hardware */
- redalert_audio(config);
+ IREM_M37B_UE17B_AUDIO(config, "soundboard");
}
void redalert_state::ww3(machine_config &config)
@@ -416,7 +414,7 @@ void redalert_state::ww3(machine_config &config)
ww3_video(config);
/* audio hardware */
- ww3_audio(config);
+ IREM_M37B_AUDIO(config, "soundboard");
}
void redalert_state::panther(machine_config &config)
@@ -430,7 +428,7 @@ void redalert_state::panther(machine_config &config)
panther_video(config);
/* audio hardware */
- panther_audio(config);
+ PANTHER_AUDIO(config, "soundboard");
}
void redalert_state::demoneye(machine_config &config)
@@ -444,7 +442,7 @@ void redalert_state::demoneye(machine_config &config)
demoneye_video(config);
/* audio hardware */
- demoneye_audio(config);
+ DEMONEYE_AUDIO(config, "soundboard");
}
@@ -467,7 +465,7 @@ ROM_START( panther )
ROM_LOAD( "qr-6.bin", 0xa800, 0x0800, BAD_DUMP CRC(02fbd9d9) SHA1(65b5875c78886b51c9bdfc75e730b9f67ce72cfc) )
ROM_LOAD( "qr-7.bin", 0xb000, 0x0800, BAD_DUMP CRC(b3e2d6cc) SHA1(7bb18f17d635196e617e8f68bf8d866134c362d1) )
- ROM_REGION( 0x10000, "audiocpu", 0 )
+ ROM_REGION( 0x10000, "soundboard:audiocpu", 0 )
ROM_LOAD( "q7a.bin", 0x7000, 0x0800, CRC(febd1674) SHA1(e122d0855ab6a352d741f9013c20ec31e0068248) )
ROM_REGION( 0x0200, "proms", 0 ) /* color PROM */
@@ -485,7 +483,7 @@ ROM_START( ww3 )
ROM_LOAD( "w3ia.3c", 0xa000, 0x1000, CRC(dccb8605) SHA1(f4c5e1a5de0828c5e39f37e2bf10f4f60bef856a) )
ROM_LOAD( "w3ib.3a", 0xb000, 0x1000, CRC(3658e465) SHA1(2c910b2e9d689cb577d8a63bc4d07d0770a6de68) )
- ROM_REGION( 0x10000, "audiocpu", 0 )
+ ROM_REGION( 0x10000, "soundboard:audiocpu", 0 )
ROM_LOAD( "w3s1", 0x7000, 0x0800, CRC(4af956a5) SHA1(25368a40d7ebc60316fd2d78ec4c686e701b96dc) )
ROM_REGION( 0x0200, "proms", 0 ) /* color PROM */
@@ -502,10 +500,10 @@ ROM_START( redalert )
ROM_LOAD( "ragab", 0xa000, 0x1000, CRC(ab99f5ed) SHA1(a93713bb03d61cce64adc89b874b67adea7c53cd) )
ROM_LOAD( "ragb", 0xb000, 0x1000, CRC(8e0d1661) SHA1(bff4ddca761ddd70113490f50777e62c66813685) )
- ROM_REGION( 0x10000, "audiocpu", 0 )
+ ROM_REGION( 0x10000, "soundboard:audiocpu", 0 )
ROM_LOAD( "w3s1", 0x7000, 0x0800, CRC(4af956a5) SHA1(25368a40d7ebc60316fd2d78ec4c686e701b96dc) )
- ROM_REGION( 0x10000, "voice", 0 )
+ ROM_REGION( 0x10000, "soundboard:voice", 0 )
ROM_LOAD( "ras1b", 0x0000, 0x1000, CRC(ec690845) SHA1(26a84738bd45ed21dac6c8383ebd9c3b9831024a) )
ROM_LOAD( "ras2", 0x1000, 0x1000, CRC(fae94cfc) SHA1(2fd798706bb3afda3fb55bc877e597cc4e5d0c15) )
ROM_LOAD( "ras3", 0x2000, 0x1000, CRC(20d56f3e) SHA1(5c32ee3365407e6d3f7ab5662e9ecbac437ed4cb) )
@@ -525,7 +523,7 @@ ROM_START( demoneye )
ROM_LOAD( "demoneye.a", 0xa000, 0x1000, CRC(a27d08aa) SHA1(659ad22778e852fc58f3951d62bc01151c973d36) )
ROM_LOAD( "demoneye.b", 0xb000, 0x1000, CRC(1fd3585b) SHA1(b1697b7b21b739499fda1e155530dbfab89f3358) )
- ROM_REGION( 0x10000, "audiocpu", 0 )
+ ROM_REGION( 0x10000, "soundboard:audiocpu", 0 )
ROM_LOAD( "demoneye.7s", 0x2000, 0x1000, CRC(8fdc9364) SHA1(3fccb5b22f08d6a0cde85863c1ce5399c84f233e) )
ROM_LOAD( "demoneye.6s", 0x3000, 0x1000, CRC(0a23def9) SHA1(b52f52be312ec7810e3c9cbd3913e887f983b1ee) )
@@ -544,7 +542,7 @@ ROM_END
*
*************************************/
-GAME( 1981, panther, 0, panther, panther, redalert_state, empty_init, ROT270, "Irem", "Panther (bootleg?)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
-GAME( 1981, redalert, 0, redalert, redalert, redalert_state, empty_init, ROT270, "Irem (GDI license)", "Red Alert", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
-GAME( 1981, ww3, redalert, ww3, redalert, redalert_state, empty_init, ROT270, "Irem", "WW III", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
-GAME( 1981, demoneye, 0, demoneye, demoneye, redalert_state, empty_init, ROT270, "Irem", "Demoneye-X", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
+GAME( 1981, panther, 0, panther, panther, redalert_state, empty_init, ROT270, "Irem", "Panther (bootleg?)", MACHINE_SUPPORTS_SAVE )
+GAME( 1981, redalert, 0, redalert, redalert, redalert_state, empty_init, ROT270, "Irem (GDI license)", "Red Alert", MACHINE_SUPPORTS_SAVE )
+GAME( 1981, ww3, redalert, ww3, redalert, redalert_state, empty_init, ROT270, "Irem", "WW III", MACHINE_SUPPORTS_SAVE )
+GAME( 1981, demoneye, 0, demoneye, demoneye, redalert_state, empty_init, ROT270, "Irem", "Demoneye-X", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/includes/cchasm.h b/src/mame/includes/cchasm.h
deleted file mode 100644
index b4f20542a0e..00000000000
--- a/src/mame/includes/cchasm.h
+++ /dev/null
@@ -1,85 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Mathis Rosenhauer
-
-/*************************************************************************
-
- Cinematronics Cosmic Chasm hardware
-
-*************************************************************************/
-
-#include "cpu/z80/z80.h"
-#include "machine/gen_latch.h"
-#include "machine/z80ctc.h"
-#include "sound/dac.h"
-#include "video/vector.h"
-#include "screen.h"
-
-class cchasm_state : public driver_device
-{
-public:
- enum
- {
- TIMER_REFRESH_END
- };
-
- cchasm_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag),
- m_maincpu(*this, "maincpu"),
- m_ctc(*this, "ctc"),
- m_audiocpu(*this, "audiocpu"),
- m_dac1(*this, "dac1"),
- m_dac2(*this, "dac2"),
- m_vector(*this, "vector"),
- m_screen(*this, "screen"),
- m_soundlatch(*this, "soundlatch"),
- m_soundlatch2(*this, "soundlatch2"),
- m_soundlatch3(*this, "soundlatch3"),
- m_soundlatch4(*this, "soundlatch4"),
- m_ram(*this, "ram") { }
-
- required_device<cpu_device> m_maincpu;
- required_device<z80ctc_device> m_ctc;
- required_device<z80_device> m_audiocpu;
- required_device<dac_bit_interface> m_dac1;
- required_device<dac_bit_interface> m_dac2;
- required_device<vector_device> m_vector;
- required_device<screen_device> m_screen;
- required_device<generic_latch_8_device> m_soundlatch;
- required_device<generic_latch_8_device> m_soundlatch2;
- required_device<generic_latch_8_device> m_soundlatch3;
- required_device<generic_latch_8_device> m_soundlatch4;
-
- required_shared_ptr<uint16_t> m_ram;
-
- int m_sound_flags;
- int m_coin_flag;
- int m_output[2];
- int m_xcenter;
- int m_ycenter;
- emu_timer *m_refresh_end_timer;
-
- void led_w(offs_t offset, uint16_t data);
- void refresh_control_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
- void reset_coin_flag_w(uint8_t data);
- uint8_t coin_sound_r();
- uint8_t soundlatch2_r();
- void soundlatch4_w(uint8_t data);
- void io_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
- uint16_t io_r(offs_t offset);
- DECLARE_WRITE_LINE_MEMBER(ctc_timer_1_w);
- DECLARE_WRITE_LINE_MEMBER(ctc_timer_2_w);
-
- INPUT_CHANGED_MEMBER(set_coin_flag);
-
- virtual void video_start() override;
- virtual void sound_start() override;
-
- void refresh();
-
- void cchasm(machine_config &config);
- void memmap(address_map &map);
- void sound_memmap(address_map &map);
- void sound_portmap(address_map &map);
-protected:
- virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
-};
diff --git a/src/mame/includes/redalert.h b/src/mame/includes/redalert.h
index 3d017355cde..04748852b3f 100644
--- a/src/mame/includes/redalert.h
+++ b/src/mame/includes/redalert.h
@@ -8,8 +8,7 @@
ask. - Mike Balfour (mab22@po.cwru.edu)
To Do:
- - Device-ify video and audio hardware to turn optional_devices into
- required_devices.
+ - Device-ify video hardware.
****************************************************************************/
@@ -18,11 +17,6 @@
#pragma once
-#include "cpu/i8085/i8085.h"
-#include "machine/6821pia.h"
-#include "machine/gen_latch.h"
-#include "sound/ay8910.h"
-#include "sound/hc55516.h"
#include "screen.h"
class redalert_state : public driver_device
@@ -35,15 +29,7 @@ public:
m_video_control(*this, "video_control"),
m_bitmap_color(*this, "bitmap_color"),
m_maincpu(*this, "maincpu"),
- m_audiocpu(*this, "audiocpu"),
- m_voicecpu(*this, "voice"),
- m_ay8910(*this, "aysnd"),
- m_ay(*this, "ay%u", 1U),
- m_cvsd(*this, "cvsd"),
- m_sndpia(*this, "sndpia"),
- m_screen(*this, "screen"),
- m_soundlatch(*this, "soundlatch"),
- m_soundlatch2(*this, "soundlatch2")
+ m_screen(*this, "screen")
{
}
@@ -52,19 +38,12 @@ public:
void ww3_video(machine_config &config);
void panther_video(machine_config &config);
void demoneye_video(machine_config &config);
- void redalert_audio_m37b(machine_config &config);
- void redalert_audio_voice(machine_config &config);
- void redalert_audio(machine_config &config);
- void ww3_audio(machine_config &config);
- void panther_audio(machine_config &config);
- void demoneye_audio(machine_config &config);
void demoneye(machine_config &config);
void ww3(machine_config &config);
void panther(machine_config &config);
void redalert(machine_config &config);
DECLARE_INPUT_CHANGED_MEMBER(coin_inserted);
- DECLARE_CUSTOM_INPUT_MEMBER(sound_status_r);
private:
required_shared_ptr<uint8_t> m_bitmap_videoram;
@@ -73,15 +52,7 @@ private:
required_shared_ptr<uint8_t> m_bitmap_color;
required_device<cpu_device> m_maincpu;
- required_device<cpu_device> m_audiocpu;
- optional_device<i8085a_cpu_device> m_voicecpu;
- optional_device<ay8910_device> m_ay8910;
- optional_device_array<ay8910_device, 2> m_ay;
- optional_device<hc55516_device> m_cvsd;
- optional_device<pia6821_device> m_sndpia;
required_device<screen_device> m_screen;
- required_device<generic_latch_8_device> m_soundlatch;
- optional_device<generic_latch_8_device> m_soundlatch2;
std::unique_ptr<uint8_t[]> m_bitmap_colorram;
uint8_t m_control_xor;
@@ -89,11 +60,6 @@ private:
void redalert_interrupt_clear_w(uint8_t data);
uint8_t panther_interrupt_clear_r();
void redalert_bitmap_videoram_w(offs_t offset, uint8_t data);
- void redalert_audio_command_w(uint8_t data);
- uint8_t redalert_ay8910_latch_1_r();
- void redalert_ay8910_latch_2_w(uint8_t data);
- void redalert_voice_command_w(uint8_t data);
- void demoneye_audio_command_w(uint8_t data);
DECLARE_VIDEO_START(redalert);
DECLARE_VIDEO_START(ww3);
DECLARE_VIDEO_START(demoneye);
@@ -101,42 +67,19 @@ private:
uint32_t screen_update_demoneye(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
uint32_t screen_update_panther(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
INTERRUPT_GEN_MEMBER(redalert_vblank_interrupt);
- TIMER_CALLBACK_MEMBER(audio_irq_on);
- TIMER_CALLBACK_MEMBER(audio_irq_off);
- void redalert_analog_w(uint8_t data);
- void redalert_AY8910_w(uint8_t data);
- DECLARE_WRITE_LINE_MEMBER(sod_callback);
- DECLARE_READ_LINE_MEMBER(sid_callback);
- void demoneye_ay8910_latch_1_w(uint8_t data);
- uint8_t demoneye_ay8910_latch_2_r();
- void demoneye_ay8910_data_w(uint8_t data);
void get_redalert_pens(pen_t *pens);
void get_panther_pens(pen_t *pens);
void get_demoneye_pens(pen_t *pens);
void demoneye_bitmap_layer_w(offs_t offset, uint8_t data);
void demoneye_bitmap_ypos_w(u8 data);
- virtual void sound_start() override;
-
void redalert_main_map(address_map &map);
void ww3_main_map(address_map &map);
void panther_main_map(address_map &map);
void demoneye_main_map(address_map &map);
- void redalert_audio_map(address_map &map);
- void panther_audio_map(address_map &map);
- void demoneye_audio_map(address_map &map);
-
- void redalert_voice_map(address_map &map);
-
- emu_timer *m_audio_irq_on_timer;
- emu_timer *m_audio_irq_off_timer;
-
- uint8_t m_ay8910_latch_1;
- uint8_t m_ay8910_latch_2;
u8 m_demoneye_bitmap_reg[4];
u8 m_demoneye_bitmap_yoffs;
- u8 m_sound_hs;
};
#endif // MAME_INCLUDES_REDALERT_H
diff --git a/src/mame/machine/cchasm.cpp b/src/mame/machine/cchasm.cpp
deleted file mode 100644
index 4a6ce9a397c..00000000000
--- a/src/mame/machine/cchasm.cpp
+++ /dev/null
@@ -1,15 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Mathis Rosenhauer
-/***************************************************************************
-
- Cinematronics Cosmic Chasm hardware
-
-***************************************************************************/
-
-#include "emu.h"
-#include "includes/cchasm.h"
-
-void cchasm_state::led_w(offs_t offset, uint16_t data)
-{
- /*logerror("LED write %x to %x\n", data, offset);*/
-}
diff --git a/src/mame/video/cchasm.cpp b/src/mame/video/cchasm.cpp
deleted file mode 100644
index 8f91bee8cc0..00000000000
--- a/src/mame/video/cchasm.cpp
+++ /dev/null
@@ -1,136 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Mathis Rosenhauer
-/***************************************************************************
-
- Cinematronics Cosmic Chasm hardware
-
-***************************************************************************/
-
-#include "emu.h"
-#include "includes/cchasm.h"
-
-#define HALT 0
-#define JUMP 1
-#define COLOR 2
-#define SCALEY 3
-#define POSY 4
-#define SCALEX 5
-#define POSX 6
-#define LENGTH 7
-
-
-void cchasm_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
-{
- switch (id)
- {
- case TIMER_REFRESH_END:
- m_maincpu->set_input_line(2, ASSERT_LINE);
- break;
- default:
- throw emu_fatalerror("Unknown id in cchasm_state::device_timer");
- }
-}
-
-
-void cchasm_state::refresh ()
-{
- int pc = 0;
- int done = 0;
- int opcode, data;
- int currentx = 0, currenty = 0;
- int scalex = 0, scaley = 0;
- int color = 0;
- int total_length = 1; /* length of all lines drawn in a frame */
- int move = 0;
-
- m_vector->clear_list();
-
- while (!done)
- {
- data = m_ram[pc];
- opcode = data >> 12;
- data &= 0xfff;
- if ((opcode > COLOR) && (data & 0x800))
- data |= 0xfffff000;
-
- pc++;
-
- switch (opcode)
- {
- case HALT:
- done=1;
- break;
- case JUMP:
- pc = data - 0xb00;
- logerror("JUMP to %x\n", data);
- break;
- case COLOR:
- color = vector_device::color444(data ^ 0xfff);
- break;
- case SCALEY:
- scaley = data << 5;
- break;
- case POSY:
- move = 1;
- currenty = m_ycenter + (data << 16);
- break;
- case SCALEX:
- scalex = data << 5;
- break;
- case POSX:
- move = 1;
- currentx = m_xcenter - (data << 16);
- break;
- case LENGTH:
- if (move)
- {
- m_vector->add_point (currentx, currenty, 0, 0);
- move = 0;
- }
-
- currentx -= data * scalex;
- currenty += data * scaley;
-
- total_length += abs(data);
-
- if (color)
- m_vector->add_point (currentx, currenty, color, 0xff);
- else
- move = 1;
- break;
- default:
- logerror("Unknown refresh proc opcode %x with data %x at pc = %x\n", opcode, data, pc-2);
- done = 1;
- break;
- }
- }
- /* Refresh processor runs with 6 MHz */
- m_refresh_end_timer->adjust(attotime::from_hz(6000000) * total_length);
-}
-
-
-void cchasm_state::refresh_control_w(offs_t offset, uint16_t data, uint16_t mem_mask)
-{
- if (ACCESSING_BITS_8_15)
- {
- switch (data >> 8)
- {
- case 0x37:
- refresh();
- break;
- case 0xf7:
- m_maincpu->set_input_line(2, CLEAR_LINE);
- break;
- }
- }
-}
-
-void cchasm_state::video_start()
-{
- const rectangle &visarea = m_screen->visible_area();
-
- m_xcenter=visarea.xcenter() << 16;
- m_ycenter=visarea.ycenter() << 16;
-
- m_refresh_end_timer = timer_alloc(TIMER_REFRESH_END);
-}