summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--scripts/target/mame/arcade.lua4
-rw-r--r--src/devices/machine/ataflash.cpp294
-rw-r--r--src/devices/machine/ataflash.h68
-rw-r--r--src/devices/machine/mb3773.cpp6
-rw-r--r--src/devices/machine/pccard.cpp4
-rw-r--r--src/mame/drivers/taitogn.cpp294
-rw-r--r--src/mame/drivers/zn.cpp179
-rw-r--r--src/mame/machine/zndip.cpp66
-rw-r--r--src/mame/machine/zndip.h50
-rw-r--r--src/mame/machine/znmcu.cpp114
-rw-r--r--src/mame/machine/znmcu.h64
-rw-r--r--src/mame/mame.lst3
12 files changed, 806 insertions, 340 deletions
diff --git a/scripts/target/mame/arcade.lua b/scripts/target/mame/arcade.lua
index 27944446f9a..f3670262e62 100644
--- a/scripts/target/mame/arcade.lua
+++ b/scripts/target/mame/arcade.lua
@@ -3433,8 +3433,8 @@ files {
createMAMEProjects(_target, _subtarget, "sony")
files {
MAME_DIR .. "src/mame/drivers/zn.cpp",
- MAME_DIR .. "src/mame/machine/zndip.cpp",
- MAME_DIR .. "src/mame/machine/zndip.h",
+ MAME_DIR .. "src/mame/machine/znmcu.cpp",
+ MAME_DIR .. "src/mame/machine/znmcu.h",
MAME_DIR .. "src/mame/machine/cat702.cpp",
MAME_DIR .. "src/mame/machine/cat702.h",
}
diff --git a/src/devices/machine/ataflash.cpp b/src/devices/machine/ataflash.cpp
index 7ff624a5421..21c5289138d 100644
--- a/src/devices/machine/ataflash.cpp
+++ b/src/devices/machine/ataflash.cpp
@@ -2,23 +2,16 @@
// copyright-holders:smf
#include "ataflash.h"
-#define IDE_COMMAND_TAITO_GNET_UNLOCK_1 0xfe
-#define IDE_COMMAND_TAITO_GNET_UNLOCK_2 0xfc
-#define IDE_COMMAND_TAITO_GNET_UNLOCK_3 0x0f
-
const device_type ATA_FLASH_PCCARD = &device_creator<ata_flash_pccard_device>;
ata_flash_pccard_device::ata_flash_pccard_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
- ide_hdd_device(mconfig, ATA_FLASH_PCCARD, "ATA Flash PCCARD", tag, owner, clock, "ataflash", __FILE__), m_gnetreadlock(0), m_locked(0)
+ ide_hdd_device(mconfig, ATA_FLASH_PCCARD, "ATA Flash PCCARD", tag, owner, clock, "ataflash", __FILE__)
{
}
-void ata_flash_pccard_device::device_start()
+ata_flash_pccard_device::ata_flash_pccard_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source)
+ : ide_hdd_device(mconfig, type, name, tag, owner, clock, shortname, source)
{
- ide_hdd_device::device_start();
-
- save_item(NAME(m_locked));
- save_item(NAME(m_gnetreadlock));
}
void ata_flash_pccard_device::device_reset()
@@ -26,19 +19,16 @@ void ata_flash_pccard_device::device_reset()
ide_hdd_device::device_reset();
uint32_t metalength;
- memset(m_key, 0, sizeof(m_key));
memset(m_cis, 0xff, 512);
if (m_handle != nullptr)
{
m_handle->read_metadata(PCMCIA_CIS_METADATA_TAG, 0, m_cis, 512, metalength);
-
- if (m_handle->read_metadata(HARD_DISK_KEY_METADATA_TAG, 0, m_key, 5, metalength) == CHDERR_NONE)
- {
- m_locked = 0x1ff;
- m_gnetreadlock = 1;
- }
}
+
+ m_configuration_option = 0;
+ m_configuration_and_status = 0;
+ m_pin_replacement = 0x002e;
}
READ16_MEMBER( ata_flash_pccard_device::read_memory )
@@ -73,37 +63,109 @@ WRITE16_MEMBER( ata_flash_pccard_device::write_memory )
READ16_MEMBER( ata_flash_pccard_device::read_reg )
{
- if(offset < 0x100)
- return m_cis[offset];
-
- switch(offset)
+ switch (offset)
{
case 0x100:
- return 0x0041;
+ return m_configuration_option;
case 0x101:
- return 0x0080;
+ return m_configuration_and_status;
case 0x102:
- return 0x002e;
+ return m_pin_replacement;
+
+ default:
+ if (offset < 0x100)
+ return m_cis[offset];
+ }
+
+ return pccard_interface::read_reg(space, offset, mem_mask);
+}
+
+WRITE16_MEMBER( ata_flash_pccard_device::write_reg )
+{
+ /// TODO: get offsets from CIS
+ switch (offset)
+ {
+ case 0x07:
+ // TODO: figure out what this is
+ /// taito type 1: 0x0e, 0x0a (after unlock)
+ /// taito type 2: 0xdf, 0xdf (before unlock)
+ /// taito compact 0x0c, 0x0c, 0x0c, 0x0c (before unlock)
+ // logerror("unknown reg 0x07 %02x\n", data);
+ break;
+
+ case 0x100:
+ m_configuration_option = data;
+ break;
+
+ case 0x101:
+ // TODO: irq ack
+ m_configuration_and_status = data;
+ break;
+
+ default:
+ pccard_interface::write_reg(space, offset, data, mem_mask);
+ break;
+ }
+}
+
+attotime ata_flash_pccard_device::seek_time()
+{
+ return attotime::zero;
+}
+
+
+const device_type TAITO_PCCARD1 = &device_creator<taito_pccard1_device>;
+
+taito_pccard1_device::taito_pccard1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ ata_flash_pccard_device(mconfig, TAITO_PCCARD1, "Taito PC-CARD (Type 1)", tag, owner, clock, "taito_pccard1", __FILE__),
+ m_locked(0)
+{
+}
+void taito_pccard1_device::device_start()
+{
+ ata_flash_pccard_device::device_start();
+
+ save_item(NAME(m_locked));
+}
+
+void taito_pccard1_device::device_reset()
+{
+ ata_flash_pccard_device::device_reset();
+
+ uint32_t metalength;
+ memset(m_key, 0, sizeof(m_key));
+
+ if (m_handle != nullptr && m_handle->read_metadata(HARD_DISK_KEY_METADATA_TAG, 0, m_key, 5, metalength) == CHDERR_NONE)
+ {
+ m_locked = 0x1ff;
+ }
+}
+
+READ16_MEMBER(taito_pccard1_device::read_reg)
+{
+ switch (offset)
+ {
case 0x201:
- return m_gnetreadlock;
+ return m_locked != 0;
default:
- return 0;
+ return ata_flash_pccard_device::read_reg(space, offset, mem_mask);
}
}
-WRITE16_MEMBER( ata_flash_pccard_device::write_reg )
+WRITE16_MEMBER(taito_pccard1_device::write_reg)
{
- if(offset >= 0x280 && offset <= 0x288 && m_handle != nullptr)
+ if (offset >= 0x280 && offset <= 0x288)
{
uint8_t v = data;
int pos = offset - 0x280;
uint8_t k = pos < sizeof(m_key) ? m_key[pos] : 0;
- if(v == k)
+ // TODO: find out if unlocking the key then using an incorrect key will re-lock the card.
+ if (v == k)
{
m_locked &= ~(1 << pos);
}
@@ -112,19 +174,68 @@ WRITE16_MEMBER( ata_flash_pccard_device::write_reg )
m_locked |= 1 << pos;
}
- if (!m_locked)
+ // logerror("unlock %d %02x %04x\n", pos, data, m_locked);
+ }
+ else
+ {
+ ata_flash_pccard_device::write_reg(space, offset, data, mem_mask);
+ }
+}
+
+void taito_pccard1_device::process_command()
+{
+ m_buffer_size = IDE_DISK_SECTOR_SIZE;
+
+ switch (m_command)
+ {
+ default:
+ if (m_locked != 0)
{
- m_gnetreadlock = 0;
+ m_status |= IDE_STATUS_ERR;
+ m_error = IDE_ERROR_NONE;
+ m_status &= ~IDE_STATUS_DRDY;
+ return;
}
+ break;
}
+
+ ata_flash_pccard_device::process_command();
+}
+
+bool taito_pccard1_device::is_ready()
+{
+ return m_locked == 0;
+}
+
+const device_type TAITO_PCCARD2 = &device_creator<taito_pccard2_device>;
+
+taito_pccard2_device::taito_pccard2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ ata_flash_pccard_device(mconfig, TAITO_PCCARD1, "Taito PC-CARD (Type 2)", tag, owner, clock, "taito_pccard2", __FILE__),
+ m_locked(false)
+{
+}
+
+void taito_pccard2_device::device_start()
+{
+ ata_flash_pccard_device::device_start();
+
+ save_item(NAME(m_locked));
}
-bool ata_flash_pccard_device::is_ready()
+void taito_pccard2_device::device_reset()
{
- return !m_gnetreadlock;
+ ata_flash_pccard_device::device_reset();
+
+ uint32_t metalength;
+ memset(m_key, 0, sizeof(m_key));
+
+ if (m_handle != nullptr && m_handle->read_metadata(HARD_DISK_KEY_METADATA_TAG, 0, m_key, 5, metalength) == CHDERR_NONE)
+ {
+ m_locked = true;
+ }
}
-void ata_flash_pccard_device::process_command()
+void taito_pccard2_device::process_command()
{
m_buffer_size = IDE_DISK_SECTOR_SIZE;
@@ -137,7 +248,7 @@ void ata_flash_pccard_device::process_command()
m_status |= IDE_STATUS_DRDY;
set_irq(ASSERT_LINE);
- break;
+ return;
case IDE_COMMAND_TAITO_GNET_UNLOCK_2:
//LOGPRINT(("IDE GNET Unlock 2\n"));
@@ -146,64 +257,121 @@ void ata_flash_pccard_device::process_command()
m_status |= IDE_STATUS_DRQ;
set_irq(ASSERT_LINE);
- break;
-
- case IDE_COMMAND_TAITO_GNET_UNLOCK_3:
- //LOGPRINT(("IDE GNET Unlock 3\n"));
-
- /* key check */
- if (m_feature == m_key[0] && m_sector_count == m_key[1] && m_sector_number == m_key[2] && m_cylinder_low == m_key[3] && m_cylinder_high == m_key[4])
- {
- m_gnetreadlock = 0;
- }
- else
- {
- m_status &= ~IDE_STATUS_DRDY;
- }
-
- set_irq(ASSERT_LINE);
- break;
+ return;
default:
- if (m_gnetreadlock)
+ if (m_locked)
{
m_status |= IDE_STATUS_ERR;
m_error = IDE_ERROR_NONE;
m_status &= ~IDE_STATUS_DRDY;
- break;
+ return;
}
-
- ide_hdd_device::process_command();
break;
}
+
+ ata_flash_pccard_device::process_command();
}
-void ata_flash_pccard_device::process_buffer()
+void taito_pccard2_device::process_buffer()
{
if (m_command == IDE_COMMAND_TAITO_GNET_UNLOCK_2)
{
int i, bad = 0;
- for (i=0; !bad && i<512; i++)
- bad = ((i < 2 || i >= 7) && m_buffer[i]) || ((i >= 2 && i < 7) && m_buffer[i] != m_key[i-2]);
+ for (i = 0; !bad && i<512; i++)
+ bad = ((i < 2 || i >= 7) && m_buffer[i]) || ((i >= 2 && i < 7) && m_buffer[i] != m_key[i - 2]);
if (bad)
{
+ // TODO: find out if unlocking the key then using an incorrect key will re-lock the card.
m_status |= IDE_STATUS_ERR;
m_error = IDE_ERROR_NONE;
}
else
{
- m_gnetreadlock= 0;
+ m_locked = false;
}
+
+ // logerror("unlock %02x %02x %02x %02x %02x %d\n", m_buffer[2], m_buffer[3], m_buffer[4], m_buffer[5], m_buffer[6], m_locked);
}
else
{
- ide_hdd_device::process_buffer();
+ ata_flash_pccard_device::process_buffer();
}
}
-attotime ata_flash_pccard_device::seek_time()
+bool taito_pccard2_device::is_ready()
{
- return attotime::zero;
+ return !m_locked;
+}
+
+const device_type TAITO_COMPACT_FLASH = &device_creator<taito_compact_flash_device>;
+
+taito_compact_flash_device::taito_compact_flash_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ ata_flash_pccard_device(mconfig, TAITO_COMPACT_FLASH, "Taito Compact Flash", tag, owner, clock, "taito_cf", __FILE__),
+ m_locked(false)
+{
+}
+
+void taito_compact_flash_device::device_start()
+{
+ ata_flash_pccard_device::device_start();
+
+ save_item(NAME(m_locked));
+}
+
+void taito_compact_flash_device::device_reset()
+{
+ ata_flash_pccard_device::device_reset();
+
+ uint32_t metalength;
+ memset(m_key, 0, sizeof(m_key));
+
+ if (m_handle != nullptr && m_handle->read_metadata(HARD_DISK_KEY_METADATA_TAG, 0, m_key, 5, metalength) == CHDERR_NONE)
+ {
+ m_locked = true;
+ }
+}
+
+void taito_compact_flash_device::process_command()
+{
+ m_buffer_size = IDE_DISK_SECTOR_SIZE;
+
+ switch (m_command)
+ {
+ case IDE_COMMAND_TAITO_COMPACT_FLASH_UNLOCK:
+ /* key check */
+ if (m_feature != m_key[0] || m_sector_count != m_key[1] || m_sector_number != m_key[2] || m_cylinder_low != m_key[3] || m_cylinder_high != m_key[4])
+ {
+ // TODO: find out if unlocking the key then using an incorrect key will lock the re-card.
+ m_status &= ~IDE_STATUS_DRDY; // TODO: check if this is used as a flag to the unlock code, would it already be set this early?
+ }
+ else
+ {
+ m_locked = false;
+ }
+
+ // logerror("unlock %02x %02x %02x %02x %02x %d\n", m_feature, m_sector_count, m_sector_number, m_cylinder_low, m_cylinder_high, m_locked);
+
+ set_irq(ASSERT_LINE);
+ return;
+
+ default:
+ if (m_locked)
+ {
+ m_status |= IDE_STATUS_ERR;
+ m_error = IDE_ERROR_NONE;
+ m_status &= ~IDE_STATUS_DRDY;
+ return;
+ }
+ break;
+ }
+
+ ata_flash_pccard_device::process_command();
+}
+
+bool taito_compact_flash_device::is_ready()
+{
+ return !m_locked;
}
diff --git a/src/devices/machine/ataflash.h b/src/devices/machine/ataflash.h
index d54d09d552b..55e46ff1c1c 100644
--- a/src/devices/machine/ataflash.h
+++ b/src/devices/machine/ataflash.h
@@ -15,6 +15,7 @@ class ata_flash_pccard_device : public ide_hdd_device,
{
public:
ata_flash_pccard_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ ata_flash_pccard_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source);
virtual DECLARE_READ16_MEMBER(read_memory) override;
virtual DECLARE_WRITE16_MEMBER(write_memory) override;
@@ -23,19 +24,78 @@ public:
protected:
// device-level overrides
- virtual void device_start() override;
virtual void device_reset() override;
virtual attotime seek_time() override;
+
+private:
+ uint8_t m_cis[512];
+ uint8_t m_configuration_option;
+ uint8_t m_configuration_and_status;
+ uint8_t m_pin_replacement;
+};
+
+extern const device_type TAITO_PCCARD1;
+
+class taito_pccard1_device : public ata_flash_pccard_device
+{
+public:
+ taito_pccard1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ virtual DECLARE_READ16_MEMBER(read_reg) override;
+ virtual DECLARE_WRITE16_MEMBER(write_reg) override;
+
+protected:
+ virtual void device_start() override;
+ virtual void device_reset() override;
+ virtual void process_command() override;
+ virtual bool is_ready() override;
+
+private:
+ uint8_t m_key[5];
+ uint16_t m_locked;
+};
+
+extern const device_type TAITO_PCCARD2;
+
+class taito_pccard2_device : public ata_flash_pccard_device
+{
+public:
+ taito_pccard2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ virtual void device_start() override;
+ virtual void device_reset() override;
virtual void process_command() override;
virtual void process_buffer() override;
virtual bool is_ready() override;
+ static const int IDE_COMMAND_TAITO_GNET_UNLOCK_1 = 0xfe;
+ static const int IDE_COMMAND_TAITO_GNET_UNLOCK_2 = 0xfc;
+
+private:
+ uint8_t m_key[5];
+ bool m_locked;
+};
+
+extern const device_type TAITO_COMPACT_FLASH;
+
+class taito_compact_flash_device : public ata_flash_pccard_device
+{
+public:
+ taito_compact_flash_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ virtual void device_start() override;
+ virtual void device_reset() override;
+ virtual void process_command() override;
+ virtual bool is_ready() override;
+
+ static const int IDE_COMMAND_TAITO_COMPACT_FLASH_UNLOCK = 0x0f;
+
private:
- uint8_t m_cis[512];
uint8_t m_key[5];
- uint8_t m_gnetreadlock;
- int m_locked;
+ bool m_locked;
};
#endif
diff --git a/src/devices/machine/mb3773.cpp b/src/devices/machine/mb3773.cpp
index 1819825fadd..72a4dda7845 100644
--- a/src/devices/machine/mb3773.cpp
+++ b/src/devices/machine/mb3773.cpp
@@ -16,6 +16,8 @@
#include "mb3773.h"
+#define WATCHDOG_DEBUG ( 0 )
+
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
@@ -57,7 +59,11 @@ void mb3773_device::device_reset()
void mb3773_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
{
+#if WATCHDOG_DEBUG
+ machine().debug_break();
+#else
machine().schedule_soft_reset();
+#endif
}
void mb3773_device::reset_timer()
diff --git a/src/devices/machine/pccard.cpp b/src/devices/machine/pccard.cpp
index a937fe64739..6350e194590 100644
--- a/src/devices/machine/pccard.cpp
+++ b/src/devices/machine/pccard.cpp
@@ -4,20 +4,24 @@
READ16_MEMBER( pccard_interface::read_memory )
{
+ //printf("unhandled memory read %08x %04x\n", offset, mem_mask);
return 0xffff;
}
WRITE16_MEMBER( pccard_interface::write_memory )
{
+ //printf("unhandled memory write %08x %04x %04x\n", offset, data, mem_mask);
}
READ16_MEMBER( pccard_interface::read_reg )
{
+ //printf("unhandled register read %08x %04x\n", offset, mem_mask);
return 0xffff;
}
WRITE16_MEMBER( pccard_interface::write_reg )
{
+ //printf("unhandled register write %08x %04x %04x\n", offset, data, mem_mask);
}
const device_type PCCARD_SLOT = &device_creator<pccard_slot_device>;
diff --git a/src/mame/drivers/taitogn.cpp b/src/mame/drivers/taitogn.cpp
index 202f3badb16..79df2343d50 100644
--- a/src/mame/drivers/taitogn.cpp
+++ b/src/mame/drivers/taitogn.cpp
@@ -339,7 +339,7 @@ Type 3 (PCMCIA Compact Flash Adaptor + Compact Flash card, sealed together with
#include "machine/mb3773.h"
#include "machine/rf5c296.h"
#include "machine/cat702.h"
-#include "machine/zndip.h"
+#include "machine/znmcu.h"
#include "sound/spu.h"
#include "video/psx.h"
@@ -351,7 +351,7 @@ public:
m_sio0(*this, "maincpu:sio0"),
m_cat702_1(*this, "cat702_1"),
m_cat702_2(*this, "cat702_2"),
- m_zndip(*this, "zndip"),
+ m_znmcu(*this, "znmcu"),
m_maincpu(*this, "maincpu"),
m_mn10200(*this, "mn10200"),
m_flashbank(*this, "flashbank"),
@@ -361,19 +361,20 @@ public:
m_sndflash0(*this, "sndflash0"),
m_sndflash1(*this, "sndflash1"),
m_sndflash2(*this, "sndflash2"),
+ m_jp1(*this, "JP1"),
m_has_zoom(true),
m_cat702_1_dataout(1),
m_cat702_2_dataout(1),
- m_zndip_dataout(1)
+ m_znmcu_dataout(1)
{
}
- DECLARE_WRITE_LINE_MEMBER(sio0_sck){ m_cat702_1->write_clock(state); m_cat702_2->write_clock(state); m_zndip->write_clock(state); }
+ DECLARE_WRITE_LINE_MEMBER(sio0_sck){ m_cat702_1->write_clock(state); m_cat702_2->write_clock(state); m_znmcu->write_clock(state); }
DECLARE_WRITE_LINE_MEMBER(sio0_txd){ m_cat702_1->write_datain(state); m_cat702_2->write_datain(state); }
DECLARE_WRITE_LINE_MEMBER(cat702_1_dataout){ m_cat702_1_dataout = state; update_sio0_rxd(); }
DECLARE_WRITE_LINE_MEMBER(cat702_2_dataout){ m_cat702_2_dataout = state; update_sio0_rxd(); }
- DECLARE_WRITE_LINE_MEMBER(zndip_dataout){ m_zndip_dataout = state; update_sio0_rxd(); }
- void update_sio0_rxd() { m_sio0->write_rxd(m_cat702_1_dataout && m_cat702_2_dataout && m_zndip_dataout); }
+ DECLARE_WRITE_LINE_MEMBER(znmcu_dataout){ m_znmcu_dataout = state; update_sio0_rxd(); }
+ void update_sio0_rxd() { m_sio0->write_rxd(m_cat702_1_dataout && m_cat702_2_dataout && m_znmcu_dataout); }
DECLARE_READ8_MEMBER(control_r);
DECLARE_WRITE8_MEMBER(control_w);
DECLARE_WRITE16_MEMBER(control2_w);
@@ -392,13 +393,14 @@ public:
DECLARE_DRIVER_INIT(coh3002t_nz);
protected:
+ virtual void machine_start() override;
virtual void machine_reset() override;
private:
required_device<psxsio0_device> m_sio0;
required_device<cat702_device> m_cat702_1;
required_device<cat702_device> m_cat702_2;
- required_device<zndip_device> m_zndip;
+ required_device<znmcu_device> m_znmcu;
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_mn10200;
required_device<address_map_bank_device> m_flashbank;
@@ -408,6 +410,7 @@ private:
required_device<intelfsh16_device> m_sndflash0;
required_device<intelfsh16_device> m_sndflash1;
required_device<intelfsh16_device> m_sndflash2;
+ required_ioport m_jp1;
bool m_has_zoom;
uint8_t m_control;
@@ -421,7 +424,7 @@ private:
int m_cat702_1_dataout;
int m_cat702_2_dataout;
- int m_zndip_dataout;
+ int m_znmcu_dataout;
};
@@ -459,7 +462,7 @@ WRITE8_MEMBER(taitogn_state::control_w)
// 04 = select bank
// According to the rom code, bits 1-0 may be part of the bank
// selection too, but they're always 0.
- m_flashbank->set_bank(data & 4);
+ m_flashbank->set_bank(((data>>2) & 1) | (m_jp1->read() << 1));
m_control = data;
}
@@ -524,9 +527,10 @@ READ8_MEMBER(taitogn_state::znsecsel_r)
WRITE8_MEMBER(taitogn_state::znsecsel_w)
{
- m_cat702_1->write_select((data >> 2) & 1);
- m_cat702_2->write_select((data >> 3) & 1);
- m_zndip->write_select((data & 0x8c) != 0x8c);
+ m_cat702_1->write_select(BIT(data, 2));
+ m_cat702_2->write_select(BIT(data, 3));
+ m_znmcu->write_select((data & 0x8c) != 0x8c);
+ // BIT(data,4); // read analogue controls?
m_n_znsecsel = data;
}
@@ -542,9 +546,12 @@ WRITE8_MEMBER(taitogn_state::coin_w)
{
/* 0x01=counter
0x02=coin lock 1
- 0x08=??
+ 0x04=mahjong row select
+ 0x08=mahjong row select
+ 0x01=??
0x20=coin lock 2
- 0x80=??
+ 0x40=mahjong row select
+ 0x80=mahjong row select
*/
m_coin_info = data;
}
@@ -588,12 +595,26 @@ READ32_MEMBER(taitogn_state::zsg2_ext_r)
return 0;
}
+void taitogn_state::machine_start()
+{
+ save_item(NAME(m_control));
+ save_item(NAME(m_control2));
+ save_item(NAME(m_control3));
+ save_item(NAME(m_v));
+ save_item(NAME(m_n_znsecsel));
+ save_item(NAME(m_coin_info));
+ save_item(NAME(m_cat702_1_dataout));
+ save_item(NAME(m_cat702_2_dataout));
+ save_item(NAME(m_znmcu_dataout));
+}
+
void taitogn_state::machine_reset()
{
// halt sound CPU since it has no valid program at start
m_mn10200->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
m_control = 0x10;
+ m_flashbank->set_bank(m_jp1->read() << 1);
}
DRIVER_INIT_MEMBER(taitogn_state,coh3002t_nz)
@@ -628,15 +649,20 @@ static ADDRESS_MAP_START( taitogn_map, AS_PROGRAM, 32, taitogn_state )
ADDRESS_MAP_END
static ADDRESS_MAP_START( flashbank_map, AS_PROGRAM, 16, taitogn_state )
- // Bank 0 has access to the subbios, the mn102 flash and the rf5c296 mem zone
+ // Bank 0 has access to the sub-bios, the mn102 flash and the rf5c296 mem zone
AM_RANGE(0x00000000, 0x001fffff) AM_DEVREADWRITE("biosflash", intelfsh16_device, read, write)
AM_RANGE(0x00200000, 0x002fffff) AM_DEVREADWRITE("rf5c296", rf5c296_device, mem_r, mem_w )
AM_RANGE(0x00300000, 0x0037ffff) AM_DEVREADWRITE("pgmflash", intelfsh16_device, read, write)
- // Bank 1 has access to the 3 samples flashes
- AM_RANGE(0x08000000, 0x081fffff) AM_DEVREADWRITE("sndflash0", intelfsh16_device, read, write)
- AM_RANGE(0x08200000, 0x083fffff) AM_DEVREADWRITE("sndflash1", intelfsh16_device, read, write)
- AM_RANGE(0x08400000, 0x085fffff) AM_DEVREADWRITE("sndflash2", intelfsh16_device, read, write)
+ // Bank 1 & 3 has access to the 3 samples flashes
+ AM_RANGE(0x08000000, 0x081fffff) AM_MIRROR(0x10000000) AM_DEVREADWRITE("sndflash0", intelfsh16_device, read, write)
+ AM_RANGE(0x08200000, 0x083fffff) AM_MIRROR(0x10000000) AM_DEVREADWRITE("sndflash1", intelfsh16_device, read, write)
+ AM_RANGE(0x08400000, 0x085fffff) AM_MIRROR(0x10000000) AM_DEVREADWRITE("sndflash2", intelfsh16_device, read, write)
+
+ // Bank 2 has access to the sub-bios, the mn102 flash and the mask eprom
+ AM_RANGE(0x10000000, 0x100fffff) AM_ROM AM_REGION("bioseprom", 0)
+ AM_RANGE(0x10100000, 0x1017ffff) AM_MIRROR(0x80000) AM_DEVREADWRITE("pgmflash", intelfsh16_device, read, write)
+ AM_RANGE(0x10200000, 0x103fffff) AM_DEVREADWRITE("biosflash", intelfsh16_device, read, write)
ADDRESS_MAP_END
static ADDRESS_MAP_START( taitogn_mp_map, AS_PROGRAM, 32, taitogn_state )
@@ -650,6 +676,9 @@ static ADDRESS_MAP_START( taitogn_mn_map, AS_PROGRAM, 16, taitogn_state )
ADDRESS_MAP_END
SLOT_INTERFACE_START(slot_ataflash)
+ SLOT_INTERFACE("taitopccard1", TAITO_PCCARD1)
+ SLOT_INTERFACE("taitopccard2", TAITO_PCCARD2)
+ SLOT_INTERFACE("taitocf", TAITO_COMPACT_FLASH)
SLOT_INTERFACE("ataflash", ATA_FLASH_PCCARD)
SLOT_INTERFACE_END
@@ -672,17 +701,19 @@ static MACHINE_CONFIG_START( coh3002t, taitogn_state )
MCFG_DEVICE_ADD("cat702_2", CAT702, 0)
MCFG_CAT702_DATAOUT_HANDLER(WRITELINE(taitogn_state, cat702_2_dataout))
- MCFG_DEVICE_ADD("zndip", ZNDIP, 0)
- MCFG_ZNDIP_DATAOUT_HANDLER(WRITELINE(taitogn_state, zndip_dataout))
- MCFG_ZNDIP_DSR_HANDLER(DEVWRITELINE("maincpu:sio0", psxsio0_device, write_dsr))
- MCFG_ZNDIP_DATA_HANDLER(IOPORT(":DSW"))
+ MCFG_DEVICE_ADD("znmcu", ZNMCU, 0)
+ MCFG_ZNMCU_DATAOUT_HANDLER(WRITELINE(taitogn_state, znmcu_dataout))
+ MCFG_ZNMCU_DSR_HANDLER(DEVWRITELINE("maincpu:sio0", psxsio0_device, write_dsr))
+ MCFG_ZNMCU_DSW_HANDLER(IOPORT(":DSW"))
+ MCFG_ZNMCU_ANALOG1_HANDLER(IOPORT(":ANALOG1"))
+ MCFG_ZNMCU_ANALOG2_HANDLER(IOPORT(":ANALOG2"))
MCFG_DEVICE_ADD("at28c16", AT28C16, 0)
MCFG_DEVICE_ADD("rf5c296", RF5C296, 0)
MCFG_RF5C296_SLOT(":pccard")
MCFG_DEVICE_ADD("pccard", PCCARD_SLOT, 0)
- MCFG_DEVICE_SLOT_INTERFACE(slot_ataflash, "ataflash", false)
+ MCFG_DEVICE_SLOT_INTERFACE(slot_ataflash, nullptr, false)
MCFG_MB3773_ADD("mb3773")
@@ -696,7 +727,7 @@ static MACHINE_CONFIG_START( coh3002t, taitogn_state )
MCFG_DEVICE_PROGRAM_MAP(flashbank_map)
MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_LITTLE)
MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(16)
- MCFG_ADDRESS_MAP_BANK_STRIDE(0x2000000)
+ MCFG_ADDRESS_MAP_BANK_STRIDE(0x8000000)
// 5MHz NEC uPD78081 MCU:
// we don't have a 78K0 emulation core yet..
@@ -722,13 +753,36 @@ static MACHINE_CONFIG_START( coh3002t, taitogn_state )
MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
MACHINE_CONFIG_END
-static MACHINE_CONFIG_DERIVED( coh3002t_mp, coh3002t )
+static MACHINE_CONFIG_DERIVED(coh3002t_t1, coh3002t)
+ MCFG_DEVICE_MODIFY("pccard")
+ MCFG_SLOT_DEFAULT_OPTION("taitopccard1")
+MACHINE_CONFIG_END
+
+static MACHINE_CONFIG_DERIVED(coh3002t_t2, coh3002t)
+ MCFG_DEVICE_MODIFY("pccard")
+ MCFG_SLOT_DEFAULT_OPTION("taitopccard2")
+MACHINE_CONFIG_END
+
+static MACHINE_CONFIG_DERIVED( coh3002t_t1_mp, coh3002t_t1 )
/* basic machine hardware */
MCFG_CPU_MODIFY( "maincpu" )
MCFG_CPU_PROGRAM_MAP(taitogn_mp_map)
MACHINE_CONFIG_END
+static MACHINE_CONFIG_DERIVED( coh3002t_t2_mp, coh3002t_t2 )
+
+ /* basic machine hardware */
+ MCFG_CPU_MODIFY( "maincpu" )
+ MCFG_CPU_PROGRAM_MAP(taitogn_mp_map)
+MACHINE_CONFIG_END
+
+static MACHINE_CONFIG_DERIVED(coh3002t_cf, coh3002t)
+ MCFG_DEVICE_MODIFY("pccard")
+ MCFG_SLOT_DEFAULT_OPTION("taitocf")
+MACHINE_CONFIG_END
+
+
static INPUT_PORTS_START( coh3002t )
PORT_START("P1")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1)
@@ -795,6 +849,35 @@ static INPUT_PORTS_START( coh3002t )
PORT_DIPNAME( 0x08, 0x08, "Test Mode" ) PORT_DIPLOCATION("S551:4") // game testmode
PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START( "ANALOG1" )
+ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START( "ANALOG2" )
+ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START("JP1")
+ PORT_DIPNAME( 0x01, 0x00, "Bios Flash" )
+ PORT_DIPSETTING( 0x01, DEF_STR( On ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START(gobyrc)
+ PORT_INCLUDE(coh3002t)
+
+ PORT_MODIFY( "ANALOG1" )
+ PORT_BIT( 0xff, 0x80, IPT_PADDLE ) PORT_MINMAX( 0x00, 0xff ) PORT_SENSITIVITY( 100 ) PORT_KEYDELTA( 30 ) PORT_NAME("Wheel")
+
+ PORT_MODIFY( "ANALOG2" )
+ PORT_BIT( 0xff, 0x80, IPT_PADDLE_V ) PORT_MINMAX( 0x00, 0xff ) PORT_SENSITIVITY( 100 ) PORT_KEYDELTA( 30 ) PORT_NAME("Trigger") PORT_REVERSE
+
+ //8006FF70
+ //PORT_START( "ID" )
+ //PORT_CONFNAME( 0x03, 0x00, "ID" )
+ //PORT_CONFSETTING( 0, "1" )
+ //PORT_CONFSETTING( 1, "2" )
+ //PORT_CONFSETTING( 2, "3" )
+ //PORT_CONFSETTING( 3, "4" )
INPUT_PORTS_END
/* input port define for the mahjong panel (standard type) */
@@ -836,10 +919,17 @@ static INPUT_PORTS_START( coh3002t_mp )
PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED )
INPUT_PORTS_END
+static INPUT_PORTS_START(coh3002t_jp1)
+ PORT_INCLUDE(coh3002t)
+ PORT_MODIFY("JP1")
+ PORT_DIPNAME( 0x01, 0x01, "Bios Flash")
+ PORT_DIPSETTING( 0x01, DEF_STR( On ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+INPUT_PORTS_END
//
-#define ROM_LOAD16_WORD_BIOS(bios,name,offset,length,hash) \
+#define ROM_LOAD16_WORD_SWAP_BIOS(bios,name,offset,length,hash) \
ROMX_LOAD(name, offset, length, hash, ROM_GROUPWORD | ROM_REVERSE | ROM_BIOS(bios+1)) /* Note '+1' */
#define TAITOGNET_BIOS \
@@ -852,14 +942,16 @@ INPUT_PORTS_END
ROM_REGION( 0x2000, "mcu", 0 ) \
ROM_LOAD( "upd78081.655", 0x0000, 0x2000, NO_DUMP ) /* internal rom :( */ \
ROM_REGION16_BE( 0x200000, "biosflash", 0 ) \
- ROM_SYSTEM_BIOS( 0, "v1", "G-NET Bios v1" ) \
- ROM_LOAD16_WORD_BIOS(0, "flash.u30", 0x000000, 0x200000, CRC(c48c8236) SHA1(c6dad60266ce2ff635696bc0d91903c543273559) ) \
- ROM_SYSTEM_BIOS( 1, "v2", "G-NET Bios v2" ) \
- ROM_LOAD16_WORD_BIOS(1, "flashv2.u30", 0x000000, 0x200000, CRC(cae462d3) SHA1(f1b10846a8423d9fe021191c5876190857c3d2a4) ) \
- ROM_REGION( 0x80000, "mn10200", 0) \
- ROM_FILL( 0, 0x80000, 0xff) \
- ROM_REGION32_LE( 0x600000, "zsg2", 0) \
- ROM_FILL( 0, 0x600000, 0xff)
+ ROM_LOAD16_WORD_SWAP( "flash.u30", 0x000000, 0x200000, CRC(c48c8236) SHA1(c6dad60266ce2ff635696bc0d91903c543273559) ) \
+ ROM_REGION16_BE( 0x100000, "bioseprom", 0 ) \
+ ROM_SYSTEM_BIOS( 0, "v1", "G-NET Bios v1 flasher" ) \
+ ROM_LOAD16_WORD_SWAP_BIOS( 0, "f35-01_m27c800_v1.bin", 0x000000, 0x100000, CRC(cd15cc30) SHA1(78361f46fa7186d5058937c86c66247a86b1257f) ) /* hand made */ \
+ ROM_SYSTEM_BIOS( 1, "v2", "G-NET Bios v2 flasher" ) \
+ ROM_LOAD16_WORD_SWAP_BIOS( 1, "f35-01_m27c800.bin", 0x000000, 0x100000, CRC(6225ec11) SHA1(047852d456b6ff85f8e640887caa03cf3e63ffad) ) \
+ ROM_REGION( 0x80000, "mn10200", 0 ) \
+ ROM_FILL( 0, 0x80000, 0xff ) \
+ ROM_REGION32_LE( 0x600000, "zsg2", 0 ) \
+ ROM_FILL( 0, 0x600000, 0xff )
ROM_START( coh3002t )
TAITOGNET_BIOS
@@ -870,87 +962,84 @@ ROM_END
ROM_START(raycris)
TAITOGNET_BIOS
- DISK_REGION( "pccard:ataflash:image" )
+ DISK_REGION( "pccard:taitopccard1:image" )
DISK_IMAGE( "raycris", 0, SHA1(015cb0e6c4421cc38809de28c4793b4491386aee))
ROM_END
-
ROM_START(gobyrc)
TAITOGNET_BIOS
- DISK_REGION( "pccard:ataflash:image" )
+ DISK_REGION( "pccard:taitopccard2:image" )
DISK_IMAGE( "gobyrc", 0, SHA1(0bee1f495fc8b033fd56aad9260ae94abb35eb58))
ROM_END
ROM_START(rcdego)
TAITOGNET_BIOS
- DISK_REGION( "pccard:ataflash:image" )
+ DISK_REGION( "pccard:taitopccard1:image" )
DISK_IMAGE( "rcdego", 0, SHA1(9e177f2a3954cfea0c8c5a288e116324d10f5dd1))
ROM_END
ROM_START(chaoshea)
TAITOGNET_BIOS
- DISK_REGION( "pccard:ataflash:image" )
+ DISK_REGION( "pccard:taitopccard1:image" )
DISK_IMAGE( "chaosheat", 0, SHA1(c13b7d7025eee05f1f696d108801c7bafb3f1356))
ROM_END
ROM_START(chaosheaj)
TAITOGNET_BIOS
- DISK_REGION( "pccard:ataflash:image" )
+ DISK_REGION( "pccard:taitopccard1:image" )
DISK_IMAGE( "chaosheatj", 0, SHA1(2f211ac08675ea8ec33c7659a13951db94eaa627))
ROM_END
-
ROM_START(flipmaze)
TAITOGNET_BIOS
- DISK_REGION( "pccard:ataflash:image" )
+ DISK_REGION( "pccard:taitopccard1:image" )
DISK_IMAGE( "flipmaze", 0, SHA1(423b6c06f4f2d9a608ce20b61a3ac11687d22c40) )
ROM_END
-
ROM_START(spuzbobl)
TAITOGNET_BIOS
- DISK_REGION( "pccard:ataflash:image" )
+ DISK_REGION( "pccard:taitopccard2:image" )
DISK_IMAGE( "spuzbobl", 0, SHA1(1b1c72fb7e5656021485fefaef8f2ba48e2b4ea8))
ROM_END
ROM_START(spuzboblj)
TAITOGNET_BIOS
- DISK_REGION( "pccard:ataflash:image" )
+ DISK_REGION( "pccard:taitopccard2:image" )
DISK_IMAGE( "spuzbobj", 0, SHA1(dac433cf88543d2499bf797d7406b82ae4338726))
ROM_END
ROM_START(soutenry)
TAITOGNET_BIOS
- DISK_REGION( "pccard:ataflash:image" )
+ DISK_REGION( "pccard:taitopccard1:image" )
DISK_IMAGE( "soutenry", 0, SHA1(9204d0be833d29f37b8cd3fbdf09da69b622254b))
ROM_END
ROM_START(shanghss)
TAITOGNET_BIOS
- DISK_REGION( "pccard:ataflash:image" )
+ DISK_REGION( "pccard:taitopccard1:image" )
DISK_IMAGE( "shanghss", 0, SHA1(7964f71ec5c81d2120d83b63a82f97fbad5a8e6d))
ROM_END
ROM_START(sianniv)
TAITOGNET_BIOS
- DISK_REGION( "pccard:ataflash:image" )
+ DISK_REGION( "pccard:taitopccard1:image" )
DISK_IMAGE( "sianniv", 0, SHA1(1e08b813190a9e1baf29bc16884172d6c8da7ae3))
ROM_END
ROM_START(kollon)
TAITOGNET_BIOS
- DISK_REGION( "pccard:ataflash:image" )
+ DISK_REGION( "pccard:taitopccard1:image" )
DISK_IMAGE( "kollon", 0, SHA1(d8ea5b5b0ee99004b16ef89883e23de6c7ddd7ce))
ROM_END
@@ -958,53 +1047,59 @@ ROM_START(kollonc)
TAITOGNET_BIOS
ROM_DEFAULT_BIOS( "v2" )
- DISK_REGION( "pccard:ataflash:image" )
+ DISK_REGION( "pccard:taitocf:image" )
DISK_IMAGE( "kollonc", 0, SHA1(ce62181659701cfb8f7c564870ab902be4d8e060)) /* Original Taito Compact Flash version */
ROM_END
ROM_START(shikigam)
TAITOGNET_BIOS
- DISK_REGION( "pccard:ataflash:image" )
+ DISK_REGION( "pccard:taitopccard1:image" )
DISK_IMAGE( "shikigam", 0, SHA1(fa49a0bc47f5cb7c30d7e49e2c3696b21bafb840))
ROM_END
+ROM_START(shikigama)
+ TAITOGNET_BIOS
+
+ DISK_REGION( "pccard:taitopccard1:image" )
+ DISK_IMAGE( "shikigama", 0, SHA1(a6fe194c86730963301be9710782ca4ac1bf3e8d))
+ROM_END
+
/* Success */
ROM_START(otenamih)
TAITOGNET_BIOS
- DISK_REGION( "pccard:ataflash:image" )
+ DISK_REGION( "pccard:taitopccard1:image" )
DISK_IMAGE( "otenamih", 0, SHA1(b3babe3a1876c43745616ee1e7d87276ce7dad0b) )
ROM_END
-
ROM_START(psyvaria)
TAITOGNET_BIOS
- DISK_REGION( "pccard:ataflash:image" )
+ DISK_REGION( "pccard:taitopccard1:image" )
DISK_IMAGE( "psyvaria", 0, SHA1(b981a42a10069322b77f7a268beae1d409b4156d))
ROM_END
ROM_START(psyvarrv)
TAITOGNET_BIOS
- DISK_REGION( "pccard:ataflash:image" )
+ DISK_REGION( "pccard:taitopccard1:image" )
DISK_IMAGE( "psyvarrv", 0, SHA1(277c4f52502bcd7acc1889840962ec80d56465f3))
ROM_END
ROM_START(zooo)
TAITOGNET_BIOS
- DISK_REGION( "pccard:ataflash:image" )
+ DISK_REGION( "pccard:taitopccard1:image" )
DISK_IMAGE( "zooo", 0, SHA1(e275b3141b2bc49142990e6b497a5394a314a30b))
ROM_END
ROM_START(zokuoten)
TAITOGNET_BIOS
- DISK_REGION( "pccard:ataflash:image" )
+ DISK_REGION( "pccard:taitopccard1:image" )
DISK_IMAGE( "zokuoten", 0, SHA1(5ce13db00518f96af64935176c71ec68d2a51938))
ROM_END
@@ -1012,49 +1107,48 @@ ROM_START(otenamhf)
TAITOGNET_BIOS
ROM_DEFAULT_BIOS( "v2" )
- DISK_REGION( "pccard:ataflash:image" )
+ DISK_REGION( "pccard:taitocf:image" )
DISK_IMAGE( "otenamhf", 0, SHA1(5b15c33bf401e5546d78e905f538513d6ffcf562)) /* Original Taito Compact Flash version */
ROM_END
-
-
/* Takumi */
ROM_START(nightrai)
TAITOGNET_BIOS
- DISK_REGION( "pccard:ataflash:image" )
+ DISK_REGION( "pccard:taitopccard1:image" )
DISK_IMAGE( "nightrai", 0, SHA1(74d0458f851cbcf10453c5cc4c47bb4388244cdf))
ROM_END
ROM_START(otenki)
TAITOGNET_BIOS
- DISK_REGION( "pccard:ataflash:image" )
+ DISK_REGION( "pccard:taitopccard1:image" )
DISK_IMAGE( "otenki", 0, SHA1(7e745ca4c4570215f452fd09cdd56a42c39caeba))
ROM_END
+
/* Warashi */
ROM_START(usagi)
TAITOGNET_BIOS
- DISK_REGION( "pccard:ataflash:image" )
+ DISK_REGION( "pccard:taitopccard2:image" )
DISK_IMAGE( "usagi", 0, SHA1(edf9dd271957f6cb06feed238ae21100514bef8e))
ROM_END
ROM_START(mahjngoh)
TAITOGNET_BIOS
- DISK_REGION( "pccard:ataflash:image" )
+ DISK_REGION( "pccard:taitopccard1:image" )
DISK_IMAGE( "mahjngoh", 0, SHA1(3ef1110d15582d7c0187438d7ad61765dd121cff))
ROM_END
ROM_START(shangtou)
TAITOGNET_BIOS
- DISK_REGION( "pccard:ataflash:image" )
+ DISK_REGION( "pccard:taitopccard1:image" )
DISK_IMAGE( "shanghaito", 0, SHA1(9901db5a9aae77e3af4157aa2c601eaab5b7ca85) )
ROM_END
@@ -1064,7 +1158,7 @@ ROM_END
ROM_START(xiistag)
TAITOGNET_BIOS
- DISK_REGION( "pccard:ataflash:image" )
+ DISK_REGION( "pccard:taitopccard1:image" )
DISK_IMAGE( "xiistag", 0, SHA1(586e37c8d926293b2bd928e5f0d693910cfb05a2))
ROM_END
@@ -1074,33 +1168,39 @@ ROM_END
/* it in every zip file */
GAME( 1997, coh3002t, 0, coh3002t, coh3002t, driver_device, 0, ROT0, "Taito", "Taito GNET", MACHINE_IS_BIOS_ROOT )
-GAME( 1998, chaoshea, coh3002t, coh3002t, coh3002t, driver_device, 0, ROT0, "Taito", "Chaos Heat (V2.09O)", MACHINE_IMPERFECT_SOUND )
-GAME( 1998, chaosheaj,chaoshea, coh3002t, coh3002t, driver_device, 0, ROT0, "Taito", "Chaos Heat (V2.08J)", MACHINE_IMPERFECT_SOUND )
-GAME( 1998, raycris, coh3002t, coh3002t, coh3002t, driver_device, 0, ROT0, "Taito", "Ray Crisis (V2.03J)", MACHINE_IMPERFECT_SOUND )
-GAME( 1999, spuzbobl, coh3002t, coh3002t, coh3002t, driver_device, 0, ROT0, "Taito", "Super Puzzle Bobble (V2.05O)", MACHINE_IMPERFECT_SOUND )
-GAME( 1999, spuzboblj,spuzbobl, coh3002t, coh3002t, driver_device, 0, ROT0, "Taito", "Super Puzzle Bobble (V2.04J)", MACHINE_IMPERFECT_SOUND )
-GAME( 1999, gobyrc, coh3002t, coh3002t, coh3002t, driver_device, 0, ROT0, "Taito", "Go By RC (V2.03O)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // analog controls, needs mcu emulation
-GAME( 1999, rcdego, gobyrc, coh3002t, coh3002t, driver_device, 0, ROT0, "Taito", "RC De Go (V2.03J)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // "
-GAME( 1999, flipmaze, coh3002t, coh3002t, coh3002t, driver_device, 0, ROT0, "MOSS / Taito", "Flip Maze (V2.04J)", MACHINE_IMPERFECT_SOUND )
-GAME( 2001, shikigam, coh3002t, coh3002t, coh3002t, driver_device, 0, ROT270, "Alfa System / Taito", "Shikigami no Shiro (V2.03J)", MACHINE_IMPERFECT_SOUND )
-GAME( 2003, sianniv, coh3002t, coh3002t, coh3002t, driver_device, 0, ROT270, "Taito", "Space Invaders Anniversary (V2.02J)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // IRQ at the wrong time
-GAME( 2003, kollon, coh3002t, coh3002t, coh3002t, driver_device, 0, ROT0, "Taito", "Kollon (V2.04J)", MACHINE_IMPERFECT_SOUND )
-GAME( 2003, kollonc, kollon, coh3002t, coh3002t, driver_device, 0, ROT0, "Taito", "Kollon (V2.04JC)", MACHINE_IMPERFECT_SOUND )
-
-GAME( 1999, otenamih, coh3002t, coh3002t, coh3002t, taitogn_state, coh3002t_nz, ROT0, "Success", "Otenami Haiken (V2.04J)", 0 )
-GAME( 2005, otenamhf, coh3002t, coh3002t, coh3002t, taitogn_state, coh3002t_nz, ROT0, "Success / Warashi", "Otenami Haiken Final (V2.07JC)", 0 )
-GAME( 2000, psyvaria, coh3002t, coh3002t, coh3002t, driver_device, 0, ROT270, "Success", "Psyvariar -Medium Unit- (V2.04J)", MACHINE_IMPERFECT_SOUND )
-GAME( 2000, psyvarrv, coh3002t, coh3002t, coh3002t, driver_device, 0, ROT270, "Success", "Psyvariar -Revision- (V2.04J)", MACHINE_IMPERFECT_SOUND )
-GAME( 2000, zokuoten, coh3002t, coh3002t, coh3002t, taitogn_state, coh3002t_nz, ROT0, "Success", "Zoku Otenamihaiken (V2.03J)", 0 ) // boots the soundcpu without any valid code, causing an infinite NMI loop (currently circumvented)
-GAME( 2004, zooo, coh3002t, coh3002t, coh3002t, taitogn_state, coh3002t_nz, ROT0, "Success", "Zooo (V2.01J)", 0 )
-
-GAME( 1999, mahjngoh, coh3002t, coh3002t_mp, coh3002t_mp, driver_device, 0, ROT0, "Warashi / Mahjong Kobo / Taito", "Mahjong Oh (V2.06J)", MACHINE_IMPERFECT_SOUND )
-GAME( 2001, usagi, coh3002t, coh3002t_mp, coh3002t_mp, driver_device, 0, ROT0, "Warashi / Mahjong Kobo / Taito", "Usagi (V2.02J)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // missing transparencies, see MT #06258
-GAME( 2000, soutenry, coh3002t, coh3002t, coh3002t, driver_device, 0, ROT0, "Warashi", "Soutenryu (V2.07J)", MACHINE_IMPERFECT_SOUND )
-GAME( 2000, shanghss, coh3002t, coh3002t, coh3002t, driver_device, 0, ROT0, "Warashi", "Shanghai Shoryu Sairin (V2.03J)", MACHINE_IMPERFECT_SOUND )
-GAME( 2002, shangtou, coh3002t, coh3002t, coh3002t, driver_device, 0, ROT0, "Warashi / Sunsoft / Taito", "Shanghai Sangokuhai Tougi (Ver 2.01J)", MACHINE_IMPERFECT_SOUND )
-
-GAME( 2001, nightrai, coh3002t, coh3002t, coh3002t, driver_device, 0, ROT0, "Takumi", "Night Raid (V2.03J)", MACHINE_IMPERFECT_SOUND )
-GAME( 2001, otenki, coh3002t, coh3002t, coh3002t, driver_device, 0, ROT0, "Takumi", "Otenki Kororin (V2.01J)", MACHINE_IMPERFECT_SOUND )
-
-GAME( 2002, xiistag, coh3002t, coh3002t, coh3002t, driver_device, 0, ROT270, "Triangle Service", "XII Stag (V2.01J)", MACHINE_IMPERFECT_SOUND )
+/* Taito */
+GAME( 1998, chaoshea, coh3002t, coh3002t_t1, coh3002t, driver_device, 0, ROT0, "Taito", "Chaos Heat (V2.09O 1998/10/02 17:00)", MACHINE_IMPERFECT_SOUND )
+GAME( 1998, chaosheaj,chaoshea, coh3002t_t1, coh3002t, driver_device, 0, ROT0, "Taito", "Chaos Heat (V2.08J 1998/09/25 17:00)", MACHINE_IMPERFECT_SOUND )
+GAME( 1998, raycris, coh3002t, coh3002t_t1, coh3002t, driver_device, 0, ROT0, "Taito", "Ray Crisis (V2.03J 1998/11/15 15:43)", MACHINE_IMPERFECT_SOUND )
+GAME( 1999, spuzbobl, coh3002t, coh3002t_t2, coh3002t, driver_device, 0, ROT0, "Taito", "Super Puzzle Bobble (V2.05O 1999/2/24 18:00)", MACHINE_IMPERFECT_SOUND )
+GAME( 1999, spuzboblj,spuzbobl, coh3002t_t2, coh3002t, driver_device, 0, ROT0, "Taito", "Super Puzzle Bobble (V2.04J 1999/2/27 02:10)", MACHINE_IMPERFECT_SOUND )
+GAME( 1999, gobyrc, coh3002t, coh3002t_t2, gobyrc, driver_device, 0, ROT0, "Taito", "Go By RC (V2.03O 1999/05/25 13:31)", MACHINE_IMPERFECT_SOUND )
+GAME( 1999, rcdego, gobyrc, coh3002t_t1, gobyrc, driver_device, 0, ROT0, "Taito", "RC De Go (V2.03J 1999/05/22 19:29)", MACHINE_IMPERFECT_SOUND )
+GAME( 1999, flipmaze, coh3002t, coh3002t_t1, coh3002t, driver_device, 0, ROT0, "MOSS / Taito", "Flip Maze (V2.04J 1999/09/02 20:00)", MACHINE_IMPERFECT_SOUND )
+GAME( 2001, shikigam, coh3002t, coh3002t_t1, coh3002t, driver_device, 0, ROT270, "Alfa System / Taito", "Shikigami no Shiro (V2.03J 2001/08/07 18:11)", MACHINE_IMPERFECT_SOUND )
+GAME( 2001, shikigama,coh3002t, coh3002t_t1, coh3002t, driver_device, 0, ROT270, "Alfa System / Taito", "Shikigami no Shiro - internal build (V1.02J 2001/09/27 18:45)", MACHINE_IMPERFECT_SOUND )
+GAME( 2003, sianniv, coh3002t, coh3002t_t1, coh3002t, driver_device, 0, ROT270, "Taito", "Space Invaders Anniversary (V2.02J)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) // IRQ at the wrong time
+GAME( 2003, kollon, coh3002t, coh3002t_t1, coh3002t, driver_device, 0, ROT0, "Taito", "Kollon (V2.04JA 2003/11/01 12:00)", MACHINE_IMPERFECT_SOUND )
+GAME( 2003, kollonc, kollon, coh3002t_cf, coh3002t_jp1,driver_device, 0, ROT0, "Taito", "Kollon (V2.04JC 2003/11/01 12:00)", MACHINE_IMPERFECT_SOUND )
+
+/* Success */
+GAME( 1999, otenamih, coh3002t, coh3002t_t1, coh3002t, taitogn_state, coh3002t_nz, ROT0, "Success", "Otenami Haiken (V2.04J 1999/02/01 18:00:00)", 0 )
+GAME( 2000, psyvaria, coh3002t, coh3002t_t1, coh3002t, driver_device, 0, ROT270, "Success", "Psyvariar -Medium Unit- (V2.04J 2000/02/15 11:00)", MACHINE_IMPERFECT_SOUND )
+GAME( 2000, psyvarrv, coh3002t, coh3002t_t1, coh3002t, driver_device, 0, ROT270, "Success", "Psyvariar -Revision- (V2.04J 2000/08/11 22:00)", MACHINE_IMPERFECT_SOUND )
+GAME( 2001, zokuoten, coh3002t, coh3002t_t1, coh3002t, taitogn_state, coh3002t_nz, ROT0, "Success", "Zoku Otenamihaiken (V2.03J 2001/02/16 16:00)", 0 ) // boots the soundcpu without any valid code, causing an infinite NMI loop (currently circumvented)
+GAME( 2004, zooo, coh3002t, coh3002t_t1, coh3002t, taitogn_state, coh3002t_nz, ROT0, "Success", "Zooo (V2.01JA 2004/04/13 12:00)", 0 )
+GAME( 2005, otenamhf, coh3002t, coh3002t_cf, coh3002t_jp1,taitogn_state, coh3002t_nz, ROT0, "Success / Warashi", "Otenami Haiken Final (V2.07JC 2005/04/20 15:36)", 0 )
+
+/* Takumi */
+GAME( 2001, nightrai, coh3002t, coh3002t_t1, coh3002t, driver_device, 0, ROT0, "Takumi", "Night Raid (V2.03J 2001/02/26 17:00)", MACHINE_IMPERFECT_SOUND )
+GAME( 2001, otenki, coh3002t, coh3002t_t1, coh3002t, driver_device, 0, ROT0, "Takumi", "Otenki Kororin (V2.01J 2001/07/02 10:00)", MACHINE_IMPERFECT_SOUND )
+
+/* Warashi */
+GAME( 1999, mahjngoh, coh3002t, coh3002t_t1_mp,coh3002t_mp,driver_device,0, ROT0, "Warashi / Mahjong Kobo / Taito", "Mahjong Oh (V2.06J 1999/11/23 08:52:22)", MACHINE_IMPERFECT_SOUND )
+GAME( 2000, shanghss, coh3002t, coh3002t_t1, coh3002t, driver_device, 0, ROT0, "Warashi", "Shanghai Shoryu Sairin (V2.03J 2000/05/26 12:45:28)", MACHINE_IMPERFECT_SOUND )
+GAME( 2000, soutenry, coh3002t, coh3002t_t1, coh3002t, driver_device, 0, ROT0, "Warashi", "Soutenryu (V2.07J 2000/12/14 11:13:02)", MACHINE_IMPERFECT_SOUND )
+GAME( 2001, usagi, coh3002t, coh3002t_t2_mp,coh3002t_mp,driver_device,0, ROT0, "Warashi / Mahjong Kobo / Taito", "Usagi (V2.02J 2001/10/02 12:41:19)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // missing transparencies, see MT #06258
+GAME( 2002, shangtou, coh3002t, coh3002t_t1, coh3002t, driver_device, 0, ROT0, "Warashi / Sunsoft / Taito", "Shanghai Sangokuhai Tougi (Ver 2.01J 2002/01/18 18:26:58)", MACHINE_IMPERFECT_SOUND )
+
+/* Triangle Service */
+GAME( 2002, xiistag, coh3002t, coh3002t_t1, coh3002t, driver_device, 0, ROT270, "Triangle Service", "XII Stag (V2.01J 2002/6/26 22:27)", MACHINE_IMPERFECT_SOUND )
diff --git a/src/mame/drivers/zn.cpp b/src/mame/drivers/zn.cpp
index 5ebbf5253c4..9cade11d531 100644
--- a/src/mame/drivers/zn.cpp
+++ b/src/mame/drivers/zn.cpp
@@ -20,7 +20,7 @@
#include "machine/mb3773.h"
#include "machine/7200fifo.h"
#include "machine/cat702.h"
-#include "machine/zndip.h"
+#include "machine/znmcu.h"
#include "machine/ataintf.h"
#include "machine/vt83c461.h"
#include "machine/gen_latch.h"
@@ -45,7 +45,7 @@ public:
m_sio0(*this, "maincpu:sio0"),
m_cat702_1(*this, "cat702_1"),
m_cat702_2(*this, "cat702_2"),
- m_zndip(*this, "zndip"),
+ m_znmcu(*this, "znmcu"),
m_maincpu(*this, "maincpu"),
m_audiocpu(*this, "audiocpu"),
m_ram(*this, "maincpu:ram"),
@@ -59,16 +59,19 @@ public:
m_soundlatch16(*this, "soundlatch16"),
m_cat702_1_dataout(1),
m_cat702_2_dataout(1),
- m_zndip_dataout(1)
+ m_znmcu_dataout(1),
+ m_znmcu_dsrout(1)
{
}
- DECLARE_WRITE_LINE_MEMBER(sio0_sck){ m_cat702_1->write_clock(state); m_cat702_2->write_clock(state); m_zndip->write_clock(state); }
+ DECLARE_WRITE_LINE_MEMBER(sio0_sck){ m_cat702_1->write_clock(state); m_cat702_2->write_clock(state); m_znmcu->write_clock(state); }
DECLARE_WRITE_LINE_MEMBER(sio0_txd){ m_cat702_1->write_datain(state); m_cat702_2->write_datain(state); }
DECLARE_WRITE_LINE_MEMBER(cat702_1_dataout){ m_cat702_1_dataout = state; update_sio0_rxd(); }
DECLARE_WRITE_LINE_MEMBER(cat702_2_dataout){ m_cat702_2_dataout = state; update_sio0_rxd(); }
- DECLARE_WRITE_LINE_MEMBER(zndip_dataout){ m_zndip_dataout = state; update_sio0_rxd(); }
- void update_sio0_rxd() { m_sio0->write_rxd( m_cat702_1_dataout && m_cat702_2_dataout && m_zndip_dataout ); }
+ DECLARE_WRITE_LINE_MEMBER(znmcu_dataout){ m_znmcu_dataout = state; update_sio0_rxd(); }
+ DECLARE_WRITE_LINE_MEMBER(znmcu_dsrout){ m_znmcu_dsrout = state; update_sio0_dsr(); }
+ void update_sio0_rxd(){ m_sio0->write_rxd(m_cat702_1_dataout && m_cat702_2_dataout && m_znmcu_dataout); }
+ void update_sio0_dsr(){ m_sio0->write_dsr(m_znmcu_dsrout); }
DECLARE_CUSTOM_INPUT_MEMBER(jdredd_gun_mux_read);
DECLARE_READ8_MEMBER(znsecsel_r);
DECLARE_WRITE8_MEMBER(znsecsel_w);
@@ -124,6 +127,9 @@ public:
void atpsx_dma_write(uint32_t *p_n_psxram, uint32_t n_address, int32_t n_size );
void jdredd_vblank(screen_device &screen, bool vblank_state);
+protected:
+ virtual void machine_start() override;
+
private:
inline void ATTR_PRINTF(3,4) verboselog( int n_level, const char *s_fmt, ... );
inline void psxwriteword( uint32_t *p_n_psxram, uint32_t n_address, uint16_t n_data );
@@ -145,7 +151,7 @@ private:
required_device<psxsio0_device> m_sio0;
required_device<cat702_device> m_cat702_1;
required_device<cat702_device> m_cat702_2;
- required_device<zndip_device> m_zndip;
+ required_device<znmcu_device> m_znmcu;
required_device<cpu_device> m_maincpu;
optional_device<cpu_device> m_audiocpu;
required_device<ram_device> m_ram;
@@ -160,7 +166,8 @@ private:
int m_cat702_1_dataout;
int m_cat702_2_dataout;
- int m_zndip_dataout;
+ int m_znmcu_dataout;
+ int m_znmcu_dsrout;
};
inline void ATTR_PRINTF(3,4) zn_state::verboselog( int n_level, const char *s_fmt, ... )
@@ -176,6 +183,16 @@ inline void ATTR_PRINTF(3,4) zn_state::verboselog( int n_level, const char *s_fm
}
}
+void zn_state::machine_start()
+{
+ save_item(NAME(m_n_znsecsel));
+ save_item(NAME(m_cat702_1_dataout));
+ save_item(NAME(m_cat702_2_dataout));
+ save_item(NAME(m_znmcu_dataout));
+ save_item(NAME(m_znmcu_dsrout));
+}
+
+
#ifdef UNUSED_FUNCTION
inline uint16_t zn_state::psxreadword( uint32_t *p_n_psxram, uint32_t n_address )
{
@@ -198,9 +215,10 @@ WRITE8_MEMBER(zn_state::znsecsel_w)
{
verboselog(2, "znsecsel_w( %08x, %08x, %08x )\n", offset, data, mem_mask );
- m_cat702_1->write_select((data >> 2) & 1);
- m_cat702_2->write_select((data >> 3) & 1);
- m_zndip->write_select((data & 0x8c) != 0x8c);
+ m_cat702_1->write_select(BIT(data, 2));
+ m_cat702_2->write_select(BIT(data, 3));
+ m_znmcu->write_select((data & 0x8c) != 0x8c);
+ // BIT(data,4); // read analogue controls?
m_n_znsecsel = data;
}
@@ -307,10 +325,12 @@ static MACHINE_CONFIG_START( zn1_1mb_vram, zn_state )
MCFG_DEVICE_ADD("cat702_2", CAT702, 0)
MCFG_CAT702_DATAOUT_HANDLER(WRITELINE(zn_state, cat702_2_dataout))
- MCFG_DEVICE_ADD("zndip", ZNDIP, 0)
- MCFG_ZNDIP_DATAOUT_HANDLER(WRITELINE(zn_state, zndip_dataout))
- MCFG_ZNDIP_DSR_HANDLER(DEVWRITELINE("maincpu:sio0", psxsio0_device, write_dsr))
- MCFG_ZNDIP_DATA_HANDLER(IOPORT(":DSW"))
+ MCFG_DEVICE_ADD("znmcu", ZNMCU, 0)
+ MCFG_ZNMCU_DATAOUT_HANDLER(WRITELINE(zn_state, znmcu_dataout))
+ MCFG_ZNMCU_DSR_HANDLER(WRITELINE(zn_state, znmcu_dsrout))
+ MCFG_ZNMCU_DSW_HANDLER(IOPORT(":DSW"))
+ MCFG_ZNMCU_ANALOG1_HANDLER(IOPORT(":ANALOG1"))
+ MCFG_ZNMCU_ANALOG2_HANDLER(IOPORT(":ANALOG2"))
/* video hardware */
MCFG_PSXGPU_ADD( "maincpu", "gpu", CXD8561Q, 0x100000, XTAL_53_693175MHz )
@@ -350,10 +370,12 @@ static MACHINE_CONFIG_START( zn2, zn_state )
MCFG_DEVICE_ADD("cat702_2", CAT702, 0)
MCFG_CAT702_DATAOUT_HANDLER(WRITELINE(zn_state, cat702_2_dataout))
- MCFG_DEVICE_ADD("zndip", ZNDIP, 0)
- MCFG_ZNDIP_DATAOUT_HANDLER(WRITELINE(zn_state, zndip_dataout))
- MCFG_ZNDIP_DSR_HANDLER(DEVWRITELINE("maincpu:sio0", psxsio0_device, write_dsr))
- MCFG_ZNDIP_DATA_HANDLER(IOPORT(":DSW"))
+ MCFG_DEVICE_ADD("znmcu", ZNMCU, 0)
+ MCFG_ZNMCU_DATAOUT_HANDLER(WRITELINE(zn_state, znmcu_dataout))
+ MCFG_ZNMCU_DSR_HANDLER(WRITELINE(zn_state, znmcu_dsrout))
+ MCFG_ZNMCU_DSW_HANDLER(IOPORT(":DSW"))
+ MCFG_ZNMCU_ANALOG1_HANDLER(IOPORT(":ANALOG1"))
+ MCFG_ZNMCU_ANALOG2_HANDLER(IOPORT(":ANALOG2"))
/* video hardware */
MCFG_PSXGPU_ADD( "maincpu", "gpu", CXD8654Q, 0x200000, XTAL_53_693175MHz )
@@ -2515,15 +2537,21 @@ static INPUT_PORTS_START( zn )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(4)
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_START("ANALOG1")
+ PORT_BIT(0xff, IP_ACTIVE_LOW, IPT_UNKNOWN)
+
+ PORT_START("ANALOG2")
+ PORT_BIT(0xff, IP_ACTIVE_LOW, IPT_UNKNOWN)
+
PORT_START("DSW")
- PORT_DIPNAME( 0x01, 0x01, "Freeze" ) PORT_DIPLOCATION("S551:1")
+ PORT_DIPUNKNOWN_DIPLOC( 0x01, 0x01, "S551:1" )
PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x02, 0x02, DEF_STR( Service_Mode ) ) PORT_DIPLOCATION("S551:2") // bios testmode
PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPUNKNOWN_DIPLOC( 0x04, 0x04, "S551:3" )
- PORT_DIPUNKNOWN_DIPLOC( 0x08, 0x08, "S551:4" ) // game testmode in some games
+ PORT_DIPUNKNOWN_DIPLOC( 0x08, 0x08, "S551:4" )
INPUT_PORTS_END
static INPUT_PORTS_START( zn4w )
@@ -2630,6 +2658,43 @@ static INPUT_PORTS_START( primrag2 )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_PLAYER(2)
INPUT_PORTS_END
+static INPUT_PORTS_START( aerofgts )
+ PORT_INCLUDE( zn )
+
+ PORT_MODIFY("DSW")
+ PORT_DIPNAME( 0x04, 0x04, "Test Mode" ) PORT_DIPLOCATION("S551:3")
+ PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x08, 0x08, "Save" ) PORT_DIPLOCATION("S551:4")
+ PORT_DIPSETTING( 0x08, DEF_STR( Yes ) ) // OK
+ PORT_DIPSETTING( 0x00, DEF_STR( No ) ) // NG
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( znt )
+ PORT_INCLUDE( zn )
+
+ PORT_MODIFY("DSW")
+ PORT_DIPNAME( 0x08, 0x08, "Test Mode" ) PORT_DIPLOCATION("S551:4")
+ PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( bldyror2 )
+ PORT_INCLUDE( znt )
+
+ PORT_MODIFY("P3")
+ PORT_BIT( 0x4f, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON4 )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(2)
+
+ PORT_MODIFY("P4")
+ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_MODIFY("DSW")
+ PORT_DIPNAME( 0x08, 0x08, "Test Mode" ) PORT_DIPLOCATION("S551:4")
+ PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+INPUT_PORTS_END
/*
@@ -5042,7 +5107,7 @@ GAME( 1999, shiryu2, strider2, coh3002c, zn, driver_device, 0, ROT0,
/* Atari */
GAME( 1996, coh1000w, 0, coh1000w, zn, driver_device, 0, ROT0, "Atari", "Atari PSX", MACHINE_IS_BIOS_ROOT )
-GAME( 1996, primrag2, coh1000w, coh1000w, primrag2, driver_device, 0, ROT0, "Atari", "Primal Rage 2 (Ver 0.36a)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // locks up when starting a game
+GAME( 1996, primrag2, coh1000w, coh1000w, primrag2, driver_device, 0, ROT0, "Atari", "Primal Rage 2 (Ver 0.36a)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // watchdog reset at startup
/* Acclaim */
GAME( 1995, coh1000a, 0, coh1000a, zn, driver_device, 0, ROT0, "Acclaim", "Acclaim PSX", MACHINE_IS_BIOS_ROOT )
@@ -5072,51 +5137,51 @@ GAME( 2001, mfjump, coh1002m, coh1002m, zn, driver_device, 0, ROT0,
/* Video System */
GAME( 1996, coh1002v, 0, coh1002v, zn, driver_device, 0, ROT0, "Video System Co.", "Video System PSX", MACHINE_IS_BIOS_ROOT )
-GAME( 1996, aerofgts, coh1002v, coh1002v, zn, driver_device, 0, ROT270, "Video System Co.", "Aero Fighters Special (Taiwan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1996, sncwgltd, aerofgts, coh1002v, zn, driver_device, 0, ROT270, "Video System Co.", "Sonic Wings Limited (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+GAME( 1996, aerofgts, coh1002v, coh1002v, aerofgts, driver_device, 0, ROT270, "Video System Co.", "Aero Fighters Special (Taiwan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+GAME( 1996, sncwgltd, aerofgts, coh1002v, aerofgts, driver_device, 0, ROT270, "Video System Co.", "Sonic Wings Limited (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
/* Taito FX-1A */
-GAME( 1995, coh1000t, 0, coh1000ta, zn, driver_device, 0, ROT0, "Taito", "Taito FX1", MACHINE_IS_BIOS_ROOT )
-GAME( 1995, sfchamp, coh1000t, coh1000ta, zn, driver_device, 0, ROT0, "Taito", "Super Football Champ (Ver 2.5O)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1995, sfchampo, sfchamp, coh1000ta, zn, driver_device, 0, ROT0, "Taito", "Super Football Champ (Ver 2.4O)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1995, sfchampu, sfchamp, coh1000ta, zn, driver_device, 0, ROT0, "Taito", "Super Football Champ (Ver 2.4A)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1995, sfchampj, sfchamp, coh1000ta, zn, driver_device, 0, ROT0, "Taito", "Super Football Champ (Ver 2.4J)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1995, psyforce, coh1000t, coh1000ta, zn, driver_device, 0, ROT0, "Taito", "Psychic Force (Ver 2.4O)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1995, psyforcej, psyforce, coh1000ta, zn, driver_device, 0, ROT0, "Taito", "Psychic Force (Ver 2.4J)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1995, psyforcex, psyforce, coh1000ta, zn, driver_device, 0, ROT0, "Taito", "Psychic Force EX (Ver 2.0J)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1996, mgcldate, mgcldtex, coh1000ta, zn, driver_device, 0, ROT0, "Taito", "Magical Date / Magical Date - dokidoki kokuhaku daisakusen (Ver 2.02J)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1997, mgcldtex, coh1000t, coh1000ta, zn, driver_device, 0, ROT0, "Taito", "Magical Date EX / Magical Date - sotsugyou kokuhaku daisakusen (Ver 2.01J)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+GAME( 1995, coh1000t, 0, coh1000ta, znt, driver_device, 0, ROT0, "Taito", "Taito FX1", MACHINE_IS_BIOS_ROOT )
+GAME( 1995, sfchamp, coh1000t, coh1000ta, znt, driver_device, 0, ROT0, "Taito", "Super Football Champ (Ver 2.5O)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+GAME( 1995, sfchampo, sfchamp, coh1000ta, znt, driver_device, 0, ROT0, "Taito", "Super Football Champ (Ver 2.4O)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+GAME( 1995, sfchampu, sfchamp, coh1000ta, znt, driver_device, 0, ROT0, "Taito", "Super Football Champ (Ver 2.4A)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+GAME( 1995, sfchampj, sfchamp, coh1000ta, znt, driver_device, 0, ROT0, "Taito", "Super Football Champ (Ver 2.4J)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+GAME( 1995, psyforce, coh1000t, coh1000ta, znt, driver_device, 0, ROT0, "Taito", "Psychic Force (Ver 2.4O)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+GAME( 1995, psyforcej, psyforce, coh1000ta, znt, driver_device, 0, ROT0, "Taito", "Psychic Force (Ver 2.4J)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+GAME( 1995, psyforcex, psyforce, coh1000ta, znt, driver_device, 0, ROT0, "Taito", "Psychic Force EX (Ver 2.0J)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // exception in attract after reading 0xbbbbbbbb from 0x8025ed18 leads to watchdog reset
+GAME( 1996, mgcldate, mgcldtex, coh1000ta, znt, driver_device, 0, ROT0, "Taito", "Magical Date / Magical Date - dokidoki kokuhaku daisakusen (Ver 2.02J)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+GAME( 1997, mgcldtex, coh1000t, coh1000ta, znt, driver_device, 0, ROT0, "Taito", "Magical Date EX / Magical Date - sotsugyou kokuhaku daisakusen (Ver 2.01J)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
/* Taito FX-1B */
-GAME( 1996, raystorm, coh1000t, coh1000tb, zn, zn_state, coh1000tb, ROT0, "Taito", "Ray Storm (Ver 2.06A)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1996, raystormo, raystorm, coh1000tb, zn, zn_state, coh1000tb, ROT0, "Taito", "Ray Storm (Ver 2.05O)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1996, raystormu, raystorm, coh1000tb, zn, zn_state, coh1000tb, ROT0, "Taito", "Ray Storm (Ver 2.05A)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1996, raystormj, raystorm, coh1000tb, zn, zn_state, coh1000tb, ROT0, "Taito", "Ray Storm (Ver 2.05J)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1996, ftimpact, ftimpcta, coh1000tb, zn, zn_state, coh1000tb, ROT0, "Taito", "Fighters' Impact (Ver 2.02O)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1996, ftimpactu, ftimpcta, coh1000tb, zn, zn_state, coh1000tb, ROT0, "Taito", "Fighters' Impact (Ver 2.02A)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1996, ftimpactj, ftimpcta, coh1000tb, zn, zn_state, coh1000tb, ROT0, "Taito", "Fighters' Impact (Ver 2.02J)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1997, ftimpcta, coh1000t, coh1000tb, zn, zn_state, coh1000tb, ROT0, "Taito", "Fighters' Impact A (Ver 2.00J)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1997, gdarius, gdarius2, coh1002tb, zn, zn_state, coh1000tb, ROT0, "Taito", "G-Darius (Ver 2.01J)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1997, gdariusb, gdarius2, coh1002tb, zn, zn_state, coh1000tb, ROT0, "Taito", "G-Darius (Ver 2.02A)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1997, gdarius2, coh1000t, coh1002tb, zn, zn_state, coh1000tb, ROT0, "Taito", "G-Darius Ver.2 (Ver 2.03J)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+GAME( 1996, raystorm, coh1000t, coh1000tb, znt, zn_state, coh1000tb, ROT0, "Taito", "Ray Storm (Ver 2.06A)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+GAME( 1996, raystormo, raystorm, coh1000tb, znt, zn_state, coh1000tb, ROT0, "Taito", "Ray Storm (Ver 2.05O)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+GAME( 1996, raystormu, raystorm, coh1000tb, znt, zn_state, coh1000tb, ROT0, "Taito", "Ray Storm (Ver 2.05A)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+GAME( 1996, raystormj, raystorm, coh1000tb, znt, zn_state, coh1000tb, ROT0, "Taito", "Ray Storm (Ver 2.05J)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+GAME( 1996, ftimpact, ftimpcta, coh1000tb, znt, zn_state, coh1000tb, ROT0, "Taito", "Fighters' Impact (Ver 2.02O)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+GAME( 1996, ftimpactu, ftimpcta, coh1000tb, znt, zn_state, coh1000tb, ROT0, "Taito", "Fighters' Impact (Ver 2.02A)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+GAME( 1996, ftimpactj, ftimpcta, coh1000tb, znt, zn_state, coh1000tb, ROT0, "Taito", "Fighters' Impact (Ver 2.02J)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+GAME( 1997, ftimpcta, coh1000t, coh1000tb, znt, zn_state, coh1000tb, ROT0, "Taito", "Fighters' Impact A (Ver 2.00J)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+GAME( 1997, gdarius, gdarius2, coh1002tb, znt, zn_state, coh1000tb, ROT0, "Taito", "G-Darius (Ver 2.01J)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+GAME( 1997, gdariusb, gdarius2, coh1002tb, znt, zn_state, coh1000tb, ROT0, "Taito", "G-Darius (Ver 2.02A)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+GAME( 1997, gdarius2, coh1000t, coh1002tb, znt, zn_state, coh1000tb, ROT0, "Taito", "G-Darius Ver.2 (Ver 2.03J)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
/* Eighting / Raizing */
-GAME( 1997, coh1002e, 0, coh1002e, zn, driver_device, 0, ROT0, "Eighting / Raizing", "PS Arcade 95", MACHINE_IS_BIOS_ROOT )
-GAME( 1997, beastrzr, coh1002e, coh1002e, zn, driver_device, 0, ROT0, "Eighting / Raizing", "Beastorizer (USA)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1997, bldyroar, beastrzr, coh1002e, zn, driver_device, 0, ROT0, "Eighting / Raizing", "Bloody Roar (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1997, beastrzrb, beastrzr, coh1002e, zn, driver_device, 0, ROT0, "bootleg", "Beastorizer (USA bootleg)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING )
+GAME( 1997, coh1002e, 0, coh1002e, znt, driver_device, 0, ROT0, "Eighting / Raizing", "PS Arcade 95", MACHINE_IS_BIOS_ROOT )
+GAME( 1997, beastrzr, coh1002e, coh1002e, znt, driver_device, 0, ROT0, "Eighting / Raizing", "Beastorizer (USA)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+GAME( 1997, bldyroar, beastrzr, coh1002e, znt, driver_device, 0, ROT0, "Eighting / Raizing", "Bloody Roar (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+GAME( 1997, beastrzrb, beastrzr, coh1002e, znt, driver_device, 0, ROT0, "bootleg", "Beastorizer (USA bootleg)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING )
/* The region on these is determined from the NVRAM, it can't be changed from the test menu, it's pre-programmed */
-GAME( 1998, bldyror2, coh1002e, coh1002e, zn6b, driver_device, 0, ROT0, "Eighting / Raizing", "Bloody Roar 2 (World)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1998, bldyror2u, bldyror2, coh1002e, zn6b, driver_device, 0, ROT0, "Eighting / Raizing", "Bloody Roar 2 (USA)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1998, bldyror2a, bldyror2, coh1002e, zn6b, driver_device, 0, ROT0, "Eighting / Raizing", "Bloody Roar 2 (Asia)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1998, bldyror2j, bldyror2, coh1002e, zn6b, driver_device, 0, ROT0, "Eighting / Raizing", "Bloody Roar 2 (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+GAME( 1998, bldyror2, coh1002e, coh1002e, bldyror2, driver_device, 0, ROT0, "Eighting / Raizing", "Bloody Roar 2 (World)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // locks up if you coin up during the fmw with interlace enabled
+GAME( 1998, bldyror2u, bldyror2, coh1002e, bldyror2, driver_device, 0, ROT0, "Eighting / Raizing", "Bloody Roar 2 (USA)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+GAME( 1998, bldyror2a, bldyror2, coh1002e, bldyror2, driver_device, 0, ROT0, "Eighting / Raizing", "Bloody Roar 2 (Asia)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+GAME( 1998, bldyror2j, bldyror2, coh1002e, bldyror2, driver_device, 0, ROT0, "Eighting / Raizing", "Bloody Roar 2 (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
/* The region on these is determined from the NVRAM, it can't be changed from the test menu, it's pre-programmed */
-GAME( 2000, brvblade, coh1002m, coh1002e, zn, driver_device, 0, ROT270, "Eighting / Raizing", "Brave Blade (World)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 2000, brvbladeu, brvblade, coh1002e, zn, driver_device, 0, ROT270, "Eighting / Raizing", "Brave Blade (USA)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 2000, brvbladea, brvblade, coh1002e, zn, driver_device, 0, ROT270, "Eighting / Raizing", "Brave Blade (Asia)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 2000, brvbladej, brvblade, coh1002e, zn, driver_device, 0, ROT270, "Eighting / Raizing", "Brave Blade (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+GAME( 2000, brvblade, coh1002m, coh1002e, znt, driver_device, 0, ROT270, "Eighting / Raizing", "Brave Blade (World)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+GAME( 2000, brvbladeu, brvblade, coh1002e, znt, driver_device, 0, ROT270, "Eighting / Raizing", "Brave Blade (USA)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+GAME( 2000, brvbladea, brvblade, coh1002e, znt, driver_device, 0, ROT270, "Eighting / Raizing", "Brave Blade (Asia)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+GAME( 2000, brvbladej, brvblade, coh1002e, znt, driver_device, 0, ROT270, "Eighting / Raizing", "Brave Blade (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
/* Bust a Move 2 uses the PSARC95 bios and ET series security but the top board is completely different */
GAME( 1999, bam2, coh1002e, bam2, zn, driver_device, 0, ROT0, "Metro / Enix / Namco", "Bust a Move 2 - Dance Tengoku Mix (Japanese ROM ver. 1999/07/17 10:00:00)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING )
diff --git a/src/mame/machine/zndip.cpp b/src/mame/machine/zndip.cpp
deleted file mode 100644
index 7f27b157aaa..00000000000
--- a/src/mame/machine/zndip.cpp
+++ /dev/null
@@ -1,66 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:smf
-#include "zndip.h"
-
-const device_type ZNDIP = &device_creator<zndip_device>;
-
-zndip_device::zndip_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
- device_t(mconfig, ZNDIP, "Sony ZNDIP", tag, owner, clock, "zndip", __FILE__),
- m_data_handler(*this),
- m_dataout_handler(*this),
- m_dsr_handler(*this)
-{
-}
-
-void zndip_device::device_start()
-{
- m_data_handler.resolve_safe( 0 );
- m_dataout_handler.resolve_safe();
- m_dsr_handler.resolve_safe();
-
- m_dip_timer = timer_alloc( 0 );
-
- m_dataout_handler(1);
- m_dsr_handler(1);
-}
-
-WRITE_LINE_MEMBER(zndip_device::write_select)
-{
- if (!state && m_select)
- {
- m_bit = 0;
- m_dip_timer->adjust( attotime::from_usec( 100 ), 0 );
- }
- else
- {
- m_dataout_handler(1);
- m_dsr_handler(1);
- }
-
- m_select = state;
-}
-
-WRITE_LINE_MEMBER(zndip_device::write_clock)
-{
- if (!state && m_clock && !m_select)
- {
- int dip = m_data_handler();
- int bit = ( ( dip >> m_bit ) & 1 );
-// verboselog( machine, 2, "read dip %02x -> %02x\n", n_data, bit * PSX_SIO_IN_DATA );
- m_dataout_handler(bit);
- m_bit++;
- m_bit &= 7;
- }
-
- m_clock = state;
-}
-
-void zndip_device::device_timer(emu_timer &timer, device_timer_id tid, int param, void *ptr)
-{
- m_dsr_handler(param);
-
- if( !param )
- {
- m_dip_timer->adjust( attotime::from_usec( 50 ), 1 );
- }
-}
diff --git a/src/mame/machine/zndip.h b/src/mame/machine/zndip.h
deleted file mode 100644
index 75cb607f5f3..00000000000
--- a/src/mame/machine/zndip.h
+++ /dev/null
@@ -1,50 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:smf
-#pragma once
-
-#ifndef __ZNDIP_H__
-#define __ZNDIP_H__
-
-#include "emu.h"
-
-extern const device_type ZNDIP;
-
-#define MCFG_ZNDIP_DATAOUT_HANDLER(_devcb) \
- devcb = &zndip_device::set_dataout_handler(*device, DEVCB_##_devcb);
-
-#define MCFG_ZNDIP_DSR_HANDLER(_devcb) \
- devcb = &zndip_device::set_dsr_handler(*device, DEVCB_##_devcb);
-
-#define MCFG_ZNDIP_DATA_HANDLER(_devcb) \
- devcb = &zndip_device::set_data_handler(*device, DEVCB_##_devcb);
-
-class zndip_device : public device_t
-{
-public:
- zndip_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
-
- // static configuration helpers
- template<class _Object> static devcb_base &set_data_handler(device_t &device, _Object object) { return downcast<zndip_device &>(device).m_data_handler.set_callback(object); }
- template<class _Object> static devcb_base &set_dataout_handler(device_t &device, _Object object) { return downcast<zndip_device &>(device).m_dataout_handler.set_callback(object); }
- template<class _Object> static devcb_base &set_dsr_handler(device_t &device, _Object object) { return downcast<zndip_device &>(device).m_dsr_handler.set_callback(object); }
-
- WRITE_LINE_MEMBER(write_select);
- WRITE_LINE_MEMBER(write_clock);
-
-protected:
- virtual void device_start() override;
- virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
-
-private:
- devcb_read8 m_data_handler;
- devcb_write_line m_dataout_handler;
- devcb_write_line m_dsr_handler;
-
- int m_select;
- int m_clock;
-
- uint8_t m_bit;
- emu_timer *m_dip_timer;
-};
-
-#endif
diff --git a/src/mame/machine/znmcu.cpp b/src/mame/machine/znmcu.cpp
new file mode 100644
index 00000000000..495ff89e740
--- /dev/null
+++ b/src/mame/machine/znmcu.cpp
@@ -0,0 +1,114 @@
+// license:BSD-3-Clause
+// copyright-holders:smf
+#include "znmcu.h"
+
+const device_type ZNMCU = &device_creator<znmcu_device>;
+
+znmcu_device::znmcu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ device_t(mconfig, ZNMCU, "Sony ZN MCU", tag, owner, clock, "znmcu", __FILE__),
+ m_dsw_handler(*this),
+ m_analog1_handler(*this),
+ m_analog2_handler(*this),
+ m_dataout_handler(*this),
+ m_dsr_handler(*this),
+ m_select(1),
+ m_clk(1),
+ m_bit(0),
+ m_byte(0),
+ m_databytes(0)
+{
+}
+
+void znmcu_device::device_start()
+{
+ m_dsw_handler.resolve_safe(0xff);
+ m_analog1_handler.resolve_safe(0xff);
+ m_analog2_handler.resolve_safe(0xff);
+ m_dataout_handler.resolve_safe();
+ m_dsr_handler.resolve_safe();
+
+ m_mcu_timer = timer_alloc(0);
+
+ m_dataout_handler(1);
+ m_dsr_handler(1);
+
+ save_item(NAME(m_select));
+ save_item(NAME(m_clk));
+ save_item(NAME(m_bit));
+ save_item(NAME(m_byte));
+ save_item(NAME(m_databytes));
+ save_item(NAME(m_send));
+
+ memset(m_send, 0, sizeof(m_send));
+}
+
+WRITE_LINE_MEMBER(znmcu_device::write_select)
+{
+ if (m_select != state)
+ {
+ if (!state)
+ {
+ m_bit = 0;
+ m_byte = 0;
+ m_mcu_timer->adjust(attotime::from_usec(50), 0);
+ }
+ else
+ {
+ m_dataout_handler(1);
+ m_dsr_handler(1);
+ m_mcu_timer->adjust(attotime::never);
+ }
+
+ m_select = state;
+ }
+}
+
+WRITE_LINE_MEMBER(znmcu_device::write_clock)
+{
+ if (m_clk != state)
+ {
+ if (!state && !m_select)
+ {
+ uint8_t data = 0;
+ if (m_byte <= m_databytes && m_byte < MaxBytes)
+ {
+ data = m_send[m_byte];
+ }
+
+ int dataout = ((data >> m_bit) & 1);
+ m_dataout_handler(dataout);
+
+ m_bit++;
+ if (m_bit == 8)
+ {
+ if (m_byte < m_databytes)
+ {
+ m_mcu_timer->adjust(attotime::from_usec(50), 0);
+ }
+
+ m_bit = 0;
+ m_byte++;
+ }
+ }
+
+ m_clk = state;
+ }
+}
+
+void znmcu_device::device_timer(emu_timer &timer, device_timer_id tid, int param, void *ptr)
+{
+ m_dsr_handler(param);
+
+ if (!param)
+ {
+ if (m_byte == 0)
+ {
+ m_databytes = 2;
+ m_send[0] = (m_databytes << 4) | (m_dsw_handler() & 0xf);
+ m_send[1] = m_analog1_handler();
+ m_send[2] = m_analog2_handler();
+ }
+
+ m_mcu_timer->adjust(attotime::from_usec(5), 1);
+ }
+} \ No newline at end of file
diff --git a/src/mame/machine/znmcu.h b/src/mame/machine/znmcu.h
new file mode 100644
index 00000000000..d69c70197d4
--- /dev/null
+++ b/src/mame/machine/znmcu.h
@@ -0,0 +1,64 @@
+// license:BSD-3-Clause
+// copyright-holders:smf
+#pragma once
+
+#ifndef __ZNMCU_H__
+#define __ZNMCU_H__
+
+#include "emu.h"
+
+extern const device_type ZNMCU;
+
+#define MCFG_ZNMCU_DATAOUT_HANDLER(_devcb) \
+ devcb = &znmcu_device::set_dataout_handler(*device, DEVCB_##_devcb);
+
+#define MCFG_ZNMCU_DSR_HANDLER(_devcb) \
+ devcb = &znmcu_device::set_dsr_handler(*device, DEVCB_##_devcb);
+
+#define MCFG_ZNMCU_DSW_HANDLER(_devcb) \
+ devcb = &znmcu_device::set_dsw_handler(*device, DEVCB_##_devcb);
+
+#define MCFG_ZNMCU_ANALOG1_HANDLER(_devcb) \
+ devcb = &znmcu_device::set_analog1_handler(*device, DEVCB_##_devcb);
+
+#define MCFG_ZNMCU_ANALOG2_HANDLER(_devcb) \
+ devcb = &znmcu_device::set_analog2_handler(*device, DEVCB_##_devcb);
+
+class znmcu_device : public device_t
+{
+public:
+ znmcu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ // static configuration helpers
+ template<class _Object> static devcb_base &set_dsw_handler(device_t &device, _Object object) { return downcast<znmcu_device &>(device).m_dsw_handler.set_callback(object); }
+ template<class _Object> static devcb_base &set_analog1_handler(device_t &device, _Object object) { return downcast<znmcu_device &>(device).m_analog1_handler.set_callback(object); }
+ template<class _Object> static devcb_base &set_analog2_handler(device_t &device, _Object object) { return downcast<znmcu_device &>(device).m_analog2_handler.set_callback(object); }
+ template<class _Object> static devcb_base &set_dataout_handler(device_t &device, _Object object) { return downcast<znmcu_device &>(device).m_dataout_handler.set_callback(object); }
+ template<class _Object> static devcb_base &set_dsr_handler(device_t &device, _Object object) { return downcast<znmcu_device &>(device).m_dsr_handler.set_callback(object); }
+
+ WRITE_LINE_MEMBER(write_select);
+ WRITE_LINE_MEMBER(write_clock);
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
+
+private:
+ devcb_read8 m_dsw_handler;
+ devcb_read8 m_analog1_handler;
+ devcb_read8 m_analog2_handler;
+ devcb_write_line m_dataout_handler;
+ devcb_write_line m_dsr_handler;
+
+ static const int MaxBytes = 3;
+ int m_select;
+ int m_clk;
+ int m_bit;
+ int m_byte;
+ int m_databytes;
+ uint8_t m_send[MaxBytes];
+ emu_timer *m_mcu_timer;
+};
+
+#endif
diff --git a/src/mame/mame.lst b/src/mame/mame.lst
index 598826ec05a..f4fcb4bbc10 100644
--- a/src/mame/mame.lst
+++ b/src/mame/mame.lst
@@ -35015,7 +35015,8 @@ raycris // 1998.12 Ray Crisis (V2.03J)
rcdego // 1999.06 RC De Go (V2.03J)
shanghss // 2000.07 Shanghai Shoryu Sairin (V2.03J)
shangtou // 2002.02 Shanghai Sangokuhaitougi
-shikigam // 2001.09 Shikigami no Shiro
+shikigam // 2001.09 Shikigami no Shiro (V2.03J)
+shikigama // 2001.09 Shikigami no Shiro (V1.02J)
sianniv // 2003.10 Space Invaders Anniversary (V2.02J)
soutenry // 2001.02 Soutenryu (V2.07J)
spuzbobl // 1999.?? Super Puzzle Bobble (V2.05O)