From 693764eb9c6848ba5f5ba1bd57bbf25d972085f8 Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Thu, 9 Sep 2021 04:12:45 +1000 Subject: [PATCH] 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. --- scripts/target/mame/arcade.lua | 5 +- src/devices/bus/amiga/keyboard/a2000.cpp | 441 +++++++++++---------- src/devices/bus/amiga/keyboard/a2000.h | 118 +----- src/devices/bus/sunkbd/hlekbd.cpp | 477 +++++++++++------------ src/devices/bus/sunkbd/hlekbd.h | 110 +----- src/mame/audio/cchasm.cpp | 128 ------ src/mame/audio/redalert.cpp | 216 +++++----- src/mame/audio/redalert.h | 127 ++++++ src/mame/drivers/cchasm.cpp | 350 ++++++++++++++++- src/mame/drivers/redalert.cpp | 52 ++- src/mame/includes/cchasm.h | 85 ---- src/mame/includes/redalert.h | 61 +-- src/mame/machine/cchasm.cpp | 15 - src/mame/video/cchasm.cpp | 136 ------- 14 files changed, 1093 insertions(+), 1228 deletions(-) delete mode 100644 src/mame/audio/cchasm.cpp create mode 100644 src/mame/audio/redalert.h delete mode 100644 src/mame/includes/cchasm.h delete mode 100644 src/mame/machine/cchasm.cpp delete mode 100644 src/mame/video/cchasm.cpp 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,22 +70,148 @@ #define LOGSCAN(...) LOGMASKED(LOG_SCAN, __VA_ARGS__) -//************************************************************************** -// GLOBAL VARIABLES -//************************************************************************** - -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)") - - - -namespace bus::amiga::keyboard { - namespace { +//************************************************************************** +// ROM DEFINITIONS +//************************************************************************** + +ROM_START(a2000kbd) + ROM_REGION(0x0800, "mcu", 0) + ROM_LOAD("467.u4", 0x0000, 0x0800, CRC(fb92a773) SHA1(e787dc05de227f30a47ac5b9ee7a355c2e9e693b)) +ROM_END + + +//************************************************************************** +// KEYBOARD BASE CLASSES +//************************************************************************** + +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); + } + } + +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 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") PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F6) PORT_CHAR(UCHAR_MAMEKEY(F6)) @@ -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 +//************************************************************************** +// SPECIFIC KEYBOARD CLASSES +//************************************************************************** + +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) + : a2000_kbd_g80_device(mconfig, A2000_KBD_G80_US, tag, owner, clock) + { + } + +protected: + virtual ioport_constructor device_input_ports() const override + { + return INPUT_PORTS_NAME(a2000_us_keyboard); + } +}; + + +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) + : a2000_kbd_g80_device(mconfig, A2000_KBD_G80_DE, tag, owner, clock) + { + } + + static auto parent_rom_device_type() { return &A2000_KBD_G80_US; } + +protected: + virtual ioport_constructor device_input_ports() const override + { + return INPUT_PORTS_NAME(a2000_de_keyboard); + } +}; + + +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) + : a2000_kbd_g80_device(mconfig, A2000_KBD_G80_SE, tag, owner, clock) + { + } + + static auto parent_rom_device_type() { return &A2000_KBD_G80_US; } + +protected: + virtual ioport_constructor device_input_ports() const override + { + return INPUT_PORTS_NAME(a2000_se_keyboard); + } +}; + + +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) + : a2000_kbd_g80_device(mconfig, A2000_KBD_G80_DK, tag, owner, clock) + { + } + + static auto parent_rom_device_type() { return &A2000_KBD_G80_US; } + +protected: + virtual ioport_constructor device_input_ports() const override + { + return INPUT_PORTS_NAME(a2000_dk_keyboard); + } +}; + + +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) + : a2000_kbd_g80_device(mconfig, A2000_KBD_G80_GB, tag, owner, clock) + { + } + + static auto parent_rom_device_type() { return &A2000_KBD_G80_US; } + +protected: + virtual ioport_constructor device_input_ports() const override + { + return INPUT_PORTS_NAME(a2000_gb_keyboard); + } +}; } // anonymous namespace //************************************************************************** -// LIVE DEVICE +// GLOBAL VARIABLES //************************************************************************** -// ======================> 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) -{ - 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); - } -} - -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) - { - 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 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) -{ - 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); - } -} - -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) -{ -} - -ioport_constructor a2000_kbd_g80_us_device::device_input_ports() const -{ - return INPUT_PORTS_NAME(a2000_us_keyboard); -} - - -// ======================> a2000_kbd_g80_de_device - -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 -{ - return INPUT_PORTS_NAME(a2000_de_keyboard); -} - - -// ======================> a2000_kbd_g80_se_device - -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 -{ - return INPUT_PORTS_NAME(a2000_se_keyboard); -} - - -// ======================> a2000_kbd_g80_dk_device - -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) -{ -} - -ioport_constructor a2000_kbd_g80_dk_device::device_input_ports() const -{ - return INPUT_PORTS_NAME(a2000_dk_keyboard); -} - - -// ======================> 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); -} - -} // 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 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); -} - - - -/*************************************************************************** - TYPE 5 JAPANESE HLE KEYBOARD DEVICE -***************************************************************************/ - -/*-------------------------------------------------- - 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 + + + +/*************************************************************************** + DEVICE TYPE GLOBALS +***************************************************************************/ + +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) { - if (m_sndpia.found()) - m_sndpia->cb1_w(0); // guess - else - m_audiocpu->set_input_line(m6502_device::IRQ_LINE, ASSERT_LINE); +} + +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) +{ +} + + +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(redalert_state::audio_irq_off) +TIMER_CALLBACK_MEMBER(irem_m37b_audio_device::audio_irq_off) { - if (m_sndpia.found()) - m_sndpia->cb1_w(1); // guess - else - m_audiocpu->set_input_line(m6502_device::IRQ_LINE, CLEAR_LINE); + m_audiocpu->set_input_line(m6502_device::IRQ_LINE, CLEAR_LINE); +} + + +TIMER_CALLBACK_MEMBER(demoneye_audio_device::audio_irq_on) +{ + 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,33 +303,11 @@ 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); -} - -/************************************* - * - * Red Alert - * - *************************************/ - -void redalert_state::ww3_audio(machine_config &config) -{ - SPEAKER(config, "mono").front_center(); - - redalert_audio_m37b(config); -} - -void redalert_state::panther_audio(machine_config &config) -{ - SPEAKER(config, "mono").front_center(); - - redalert_audio_m37b(config); - m_audiocpu->set_addrmap(AS_PROGRAM, &redalert_state::panther_audio_map); + m_audiocpu->set_addrmap(AS_PROGRAM, &panther_audio_device::panther_audio_map); } /************************************* @@ -285,8 +316,19 @@ void redalert_state::panther_audio(machine_config &config) * *************************************/ +void demoneye_audio_device::device_start() +{ + 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::demoneye_audio_command_w(uint8_t data) + m_audio_irq_on_timer->adjust(REDALERT_AUDIO_CPU_IRQ_FREQ, 0, REDALERT_AUDIO_CPU_IRQ_FREQ); + + save_item(NAME(m_ay8910_latch_1)); + save_item(NAME(m_ay8910_latch_2)); +} + + +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 m_audiocpu; + required_device m_ay8910; + required_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 m_voicecpu; + required_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 m_audiocpu; + required_device_array m_ay; + required_device m_sndpia; + required_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 m_maincpu; + required_device m_ctc; + required_device m_audiocpu; + required_device m_dac1; + required_device m_dac2; + required_device m_vector; + required_device m_screen; + required_device m_soundlatch; + required_device m_soundlatch2; + required_device m_soundlatch3; + required_device m_soundlatch4; + + required_shared_ptr 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 m_maincpu; - required_device m_ctc; - required_device m_audiocpu; - required_device m_dac1; - required_device m_dac2; - required_device m_vector; - required_device m_screen; - required_device m_soundlatch; - required_device m_soundlatch2; - required_device m_soundlatch3; - required_device m_soundlatch4; - - required_shared_ptr 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 m_bitmap_videoram; @@ -73,15 +52,7 @@ private: required_shared_ptr m_bitmap_color; required_device m_maincpu; - required_device m_audiocpu; - optional_device m_voicecpu; - optional_device m_ay8910; - optional_device_array m_ay; - optional_device m_cvsd; - optional_device m_sndpia; required_device m_screen; - required_device m_soundlatch; - optional_device m_soundlatch2; std::unique_ptr 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); -}