diff options
-rw-r--r-- | scripts/target/mame/arcade.lua | 4 | ||||
-rw-r--r-- | src/devices/machine/ataflash.cpp | 294 | ||||
-rw-r--r-- | src/devices/machine/ataflash.h | 68 | ||||
-rw-r--r-- | src/devices/machine/mb3773.cpp | 6 | ||||
-rw-r--r-- | src/devices/machine/pccard.cpp | 4 | ||||
-rw-r--r-- | src/mame/drivers/taitogn.cpp | 294 | ||||
-rw-r--r-- | src/mame/drivers/zn.cpp | 179 | ||||
-rw-r--r-- | src/mame/machine/zndip.cpp | 66 | ||||
-rw-r--r-- | src/mame/machine/zndip.h | 50 | ||||
-rw-r--r-- | src/mame/machine/znmcu.cpp | 114 | ||||
-rw-r--r-- | src/mame/machine/znmcu.h | 64 | ||||
-rw-r--r-- | src/mame/mame.lst | 3 |
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) |