mirror of
https://github.com/holub/mame
synced 2025-04-16 05:24:54 +03:00
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.
This commit is contained in:
parent
e7528a445b
commit
693764eb9c
@ -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",
|
||||
|
@ -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<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")
|
||||
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)")
|
||||
|
@ -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
|
||||
|
@ -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)")
|
||||
|
@ -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
|
||||
|
@ -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));
|
||||
}
|
@ -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();
|
||||
|
127
src/mame/audio/redalert.h
Normal file
127
src/mame/audio/redalert.h
Normal file
@ -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
|
@ -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
|
||||
|
||||
|
||||
|
||||
|
@ -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 )
|
||||
|
@ -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;
|
||||
};
|
@ -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
|
||||
|
@ -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);*/
|
||||
}
|
@ -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);
|
||||
}
|
Loading…
Reference in New Issue
Block a user