From b80c356a42144ff2c5c78fa4e6fac7d981d52cf6 Mon Sep 17 00:00:00 2001 From: angelosa Date: Tue, 12 Nov 2024 10:51:02 +0100 Subject: [PATCH 01/19] cbus/pc9801_86.cpp: convert irq handling to input_merger --- src/devices/bus/cbus/pc9801_86.cpp | 27 +++++++++++++++------------ src/devices/bus/cbus/pc9801_86.h | 5 ++++- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/src/devices/bus/cbus/pc9801_86.cpp b/src/devices/bus/cbus/pc9801_86.cpp index 6343596aa24..630e4250819 100644 --- a/src/devices/bus/cbus/pc9801_86.cpp +++ b/src/devices/bus/cbus/pc9801_86.cpp @@ -44,13 +44,6 @@ // device type definition DEFINE_DEVICE_TYPE(PC9801_86, pc9801_86_device, "pc9801_86", "NEC PC-9801-86") -void pc9801_86_device::sound_irq(int state) -{ - m_fmirq = state ? true : false; - // TODO: sometimes misfired irq causes sound or even host hang - m_bus->int_w<5>(state || (m_pcmirq ? ASSERT_LINE : CLEAR_LINE)); -} - // only for derived designs? void pc9801_86_device::opna_map(address_map &map) { @@ -74,12 +67,14 @@ void pc9801_86_device::pc9801_86_config(machine_config &config) // TC55257CFL-10 (U15) // unknown chip (most likely surface scratched) U3) + INPUT_MERGER_ANY_HIGH(config, m_irqs).output_handler().set([this](int state) { m_bus->int_w<5>(state); }); + SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); YM2608(config, m_opna, 7.987_MHz_XTAL); // actually YM2608B // shouldn't have one // m_opna->set_addrmap(0, &pc9801_86_device::opna_map); - m_opna->irq_handler().set(FUNC(pc9801_86_device::sound_irq)); + m_opna->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<0>)); m_opna->port_a_read_callback().set(FUNC(pc9801_86_device::opn_porta_r)); //m_opna->port_b_read_callback().set(FUNC(pc8801_state::opn_portb_r)); //m_opna->port_a_write_callback().set(FUNC(pc8801_state::opn_porta_w)); @@ -182,6 +177,7 @@ pc9801_86_device::pc9801_86_device(const machine_config &mconfig, device_type ty : pc9801_snd_device(mconfig, type, tag, owner, clock) , m_bus(*this, DEVICE_SELF_OWNER) , m_opna(*this, "opna") + , m_irqs(*this, "irqs") , m_ldac(*this, "ldac") , m_rdac(*this, "rdac") , m_queue(QUEUE_SIZE) @@ -264,7 +260,7 @@ void pc9801_86_device::device_reset() m_mask = 0; m_head = m_tail = m_count = 0; - m_fmirq = m_pcmirq = m_init = false; + m_pcmirq = m_init = false; m_irq_rate = 0; m_pcm_ctrl = m_pcm_mode = 0; // Starts off with DACs muted (os2warp3 will burp a lot while initializing OS) @@ -329,7 +325,9 @@ u8 pc9801_86_device::pcm_r(offs_t offset) case 3: return m_pcm_mode; case 4: + { return 0; + } } } else // odd @@ -355,9 +353,13 @@ void pc9801_86_device::pcm_w(offs_t offset, u8 data) m_head = m_tail = m_count = 0; if(!(data & 0x10)) { - m_bus->int_w<5>(m_fmirq ? ASSERT_LINE : CLEAR_LINE); + //m_bus->int_w<5>(m_fmirq ? ASSERT_LINE : CLEAR_LINE); if(!(queue_count() < m_irq_rate) || !(data & 0x80)) - m_pcmirq = false; //TODO: this needs research + { + //TODO: this needs research + m_pcmirq = false; + m_irqs->in_w<1>(CLEAR_LINE); + } } m_init = true; m_pcm_ctrl = data & ~0x10; @@ -435,7 +437,8 @@ TIMER_CALLBACK_MEMBER(pc9801_86_device::dac_tick) if((queue_count() < m_irq_rate) && (m_pcm_ctrl & 0x20)) { m_pcmirq = true; - m_bus->int_w<5>(ASSERT_LINE); + //m_bus->int_w<5>(ASSERT_LINE); + m_irqs->in_w<1>(ASSERT_LINE); } } diff --git a/src/devices/bus/cbus/pc9801_86.h b/src/devices/bus/cbus/pc9801_86.h index 16891fd54c5..35af5c7b48e 100644 --- a/src/devices/bus/cbus/pc9801_86.h +++ b/src/devices/bus/cbus/pc9801_86.h @@ -12,8 +12,10 @@ #pragma once #include "bus/cbus/pc9801_cbus.h" +#include "machine/input_merger.h" #include "sound/dac.h" #include "sound/ymopn.h" + #include "pc9801_snd.h" //************************************************************************** @@ -48,6 +50,7 @@ class pc9801_86_device : public pc9801_snd_device required_device m_bus; required_device m_opna; + required_device m_irqs; void opna_map(address_map &map) ATTR_COLD; @@ -66,7 +69,7 @@ class pc9801_86_device : public pc9801_snd_device u8 m_pcm_mode, m_vol[7], m_pcm_ctrl, m_pcm_mute; uint16_t m_head, m_tail, m_count, m_irq_rate; - bool m_pcmirq, m_fmirq, m_pcm_clk, m_init; + bool m_pcmirq, m_pcm_clk, m_init; required_device m_ldac; required_device m_rdac; std::vector m_queue; From 81af1bf8429929bc15edeeb4d7c0527f5fbab7eb Mon Sep 17 00:00:00 2001 From: angelosa Date: Tue, 12 Nov 2024 12:06:37 +0100 Subject: [PATCH 02/19] cbus/pc9801_86.cpp: convert PCM space to address_map --- src/devices/bus/cbus/pc9801_86.cpp | 186 +++++++++++++++------------ src/devices/bus/cbus/pc9801_86.h | 8 +- src/devices/bus/cbus/pc9801_cbus.cpp | 1 + src/devices/bus/cbus/pc9801_cbus.h | 4 + 4 files changed, 115 insertions(+), 84 deletions(-) diff --git a/src/devices/bus/cbus/pc9801_86.cpp b/src/devices/bus/cbus/pc9801_86.cpp index 630e4250819..bbefe26a7a7 100644 --- a/src/devices/bus/cbus/pc9801_86.cpp +++ b/src/devices/bus/cbus/pc9801_86.cpp @@ -133,7 +133,6 @@ static INPUT_PORTS_START( pc9801_86 ) PORT_INCLUDE( pc9801_joy_port ) // Single 8-bit DSW bank - // TODO: how HW really reads these? PORT_START("OPNA_DSW") PORT_DIPNAME( 0x01, 0x00, "PC-9801-86: Port Base" ) PORT_DIPLOCATION("OPNA_SW:!1") PORT_DIPSETTING( 0x00, "0x188" ) @@ -149,6 +148,7 @@ static INPUT_PORTS_START( pc9801_86 ) PORT_DIPNAME( 0x10, 0x00, "PC-9801-86: Interrupt enable") PORT_DIPLOCATION("OPNA_SW:!5") PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) PORT_DIPSETTING( 0x10, DEF_STR( No ) ) + // TODO: how HW really read this? PORT_DIPNAME( 0xe0, 0x80, "PC-9801-86: ID number") PORT_DIPLOCATION("OPNA_SW:!6,!7,!8") PORT_DIPSETTING( 0x00, "0" ) PORT_DIPSETTING( 0x20, "1" ) @@ -190,7 +190,6 @@ pc9801_86_device::pc9801_86_device(const machine_config &mconfig, const char *ta } - //------------------------------------------------- // device_validity_check - perform validity checks // on this device @@ -209,7 +208,6 @@ u16 pc9801_86_device::read_io_base() // device_start - device-specific startup //------------------------------------------------- - void pc9801_86_device::device_start() { // TODO: uninstall option from dip @@ -218,10 +216,10 @@ void pc9801_86_device::device_start() 0xcffff, memregion(this->subtag("sound_bios").c_str())->base() ); - m_bus->install_io(0xa460, 0xa463, read8smo_delegate(*this, FUNC(pc9801_86_device::id_r)), write8smo_delegate(*this, FUNC(pc9801_86_device::mask_w))); - m_bus->install_io(0xa464, 0xa46f, read8sm_delegate(*this, FUNC(pc9801_86_device::pcm_r)), write8sm_delegate(*this, FUNC(pc9801_86_device::pcm_w))); + // TODO: who wins if 2+ PC-9801-86 or mixed -73/-86 are mounted? + m_bus->install_device(0xa460, 0xa46f, *this, &pc9801_86_device::io_map); m_bus->install_io(0xa66c, 0xa66f, - read8sm_delegate(*this, [this](offs_t o){ return o == 2 ? m_pcm_mute : 0xff; }, "pc9801_86_mute_r"), + read8sm_delegate(*this, [this](offs_t o){ return o == 2 ? m_pcm_mute : 0xff; }, "pcm_mute_r"), write8sm_delegate(*this, [this](offs_t o, u8 d){ if(o == 2) { @@ -229,7 +227,7 @@ void pc9801_86_device::device_start() m_ldac->set_output_gain(ALL_OUTPUTS, BIT(m_pcm_mute, 0) ? 0.0 : 1.0); m_rdac->set_output_gain(ALL_OUTPUTS, BIT(m_pcm_mute, 0) ? 0.0 : 1.0); } - }, "pc9801_86_mute_w") + }, "pcm_mute_w") ); m_io_base = 0; @@ -297,91 +295,119 @@ void pc9801_86_device::opna_w(offs_t offset, u8 data) logerror("%s: Write to undefined port [%02x] %02x\n", machine().describe_context(), offset + m_io_base, data); } -u8 pc9801_86_device::id_r() +u8 pc9801_86_device::pcm_control_r() { - // either a -86 or 9821 MATE A uses this id (built-in) - const u8 id_port = ((ioport("OPNA_DSW")->read() & 1) << 4) | 0x40; - return id_port | m_mask; + return m_pcm_ctrl | (m_pcmirq ? 0x10 : 0); } -void pc9801_86_device::mask_w(u8 data) +void pc9801_86_device::pcm_control_w(u8 data) { - m_mask = data & 1; - // TODO: bit 1 totally cuts off OPNA output - logerror("%s: OPNA mask setting %02x\n", machine().describe_context(), data); -} + const u32 rate = (25.4_MHz_XTAL).value() / 16; + const int divs[8] = {36, 48, 72, 96, 144, 192, 288, 384}; -u8 pc9801_86_device::pcm_r(offs_t offset) -{ - if((offset & 1) == 0) + if(((data & 7) != (m_pcm_ctrl & 7)) || !m_init) + m_dac_timer->adjust(attotime::from_ticks(divs[data & 7], rate), 0, attotime::from_ticks(divs[data & 7], rate)); + if(data & 8) + m_head = m_tail = m_count = 0; + if(!(data & 0x10)) { - switch(offset >> 1) + //m_bus->int_w<5>(m_fmirq ? ASSERT_LINE : CLEAR_LINE); + if(!(queue_count() < m_irq_rate) || !(data & 0x80)) { - case 1: - return ((queue_count() == QUEUE_SIZE) ? 0x80 : 0) | - (!queue_count() ? 0x40 : 0) | (m_pcm_clk ? 1 : 0); - case 2: - return m_pcm_ctrl | (m_pcmirq ? 0x10 : 0); - case 3: - return m_pcm_mode; - case 4: - { - return 0; - } + //TODO: this needs research + m_pcmirq = false; + m_irqs->in_w<1>(CLEAR_LINE); } } - else // odd - logerror("PC9801-86: Read to undefined port [%02x]\n",offset+0xa464); - return 0xff; + m_init = true; + m_pcm_ctrl = data & ~0x10; +} + +// $a460 base +void pc9801_86_device::io_map(address_map &map) +{ + map.unmap_value_high(); + map(0x00, 0x00).rw(FUNC(pc9801_86_device::id_r), FUNC(pc9801_86_device::mask_w)); +// map(0x02, 0x02) μPD6380 for PC9801-73 control +// map(0x04, 0x04) μPD6380 for PC9801-73 data + map(0x06, 0x06).lrw8( + NAME([this] () { + u8 res = 0; + // FIFO full + res |= (queue_count() == QUEUE_SIZE) << 7; + // FIFO empty + res |= !queue_count() << 6; + // recording overflow + res |= 0 << 5; + // DAC clock + res |= m_pcm_clk << 0; + return res; + }), + NAME([this] (u8 data) { + const u8 line_select = data >> 5; + m_vol[line_select] = data & 0x0f; + logerror("$a466 volume control [%02x] %02x\n", line_select, data & 0xf); + }) + ); + map(0x08, 0x08).rw(FUNC(pc9801_86_device::pcm_control_r), FUNC(pc9801_86_device::pcm_control_w)); + map(0x0a, 0x0a).lrw8( + NAME([this] () { + return m_pcm_mode; + }), + NAME([this] (u8 data) { + if(m_pcm_ctrl & 0x20) + m_irq_rate = (data + 1) * 128; + else + m_pcm_mode = data; + }) + ); + map(0x0c, 0x0c).lrw8( + NAME([this] () { + // TODO: recording mode + return 0; + }), + NAME([this] (u8 data) { + if(queue_count() < QUEUE_SIZE) + { + m_queue[m_head++] = data; + m_head %= QUEUE_SIZE; + m_count++; + } + // TODO: what should happen on overflow? + // os2warp3 startup / shutdown chimes do this already + }) + ); } -void pc9801_86_device::pcm_w(offs_t offset, u8 data) +/* + * xxxx ---- ID + * 0000 ---- PC-90DO+ built-in + * 0001 ---- PC-98GS built-in + * 0010 ---- PC-9801-73/-76, I/O base $188 + * 0011 ---- PC-9801-73/-76, I/O base $288 + * 0100 ---- PC-9801-86, I/O base $188, PC-9821 Multi/A Mate/early CanBe (Ce/Cs2/Ce2) + * 0101 ---- PC-9801-86, I/O base $288 + * 0110 ---- PC-9821Nf/Np built-in + * 0111 ---- PC-9821 X Mate (as PC-9821XE10-B?) + * 1000 ---- PC-9821 later CanBe/Na7/Nx built-in + * 1111 ---- + * ---- --x- (1) OPNA force volume to 0 + * ---- ---x select OPN base + * ---- ---1 OPNA + * ---- ---0 OPN + */ +u8 pc9801_86_device::id_r() { - const u32 rate = (25.4_MHz_XTAL).value() / 16; - const int divs[8] = {36, 48, 72, 96, 144, 192, 288, 384}; - if((offset & 1) == 0) - { - switch(offset >> 1) - { - case 1: - m_vol[data >> 5] = data & 0x0f; - break; - case 2: - if(((data & 7) != (m_pcm_ctrl & 7)) || !m_init) - m_dac_timer->adjust(attotime::from_ticks(divs[data & 7], rate), 0, attotime::from_ticks(divs[data & 7], rate)); - if(data & 8) - m_head = m_tail = m_count = 0; - if(!(data & 0x10)) - { - //m_bus->int_w<5>(m_fmirq ? ASSERT_LINE : CLEAR_LINE); - if(!(queue_count() < m_irq_rate) || !(data & 0x80)) - { - //TODO: this needs research - m_pcmirq = false; - m_irqs->in_w<1>(CLEAR_LINE); - } - } - m_init = true; - m_pcm_ctrl = data & ~0x10; - break; - case 3: - if(m_pcm_ctrl & 0x20) - m_irq_rate = (data + 1) * 128; - else - m_pcm_mode = data; - break; - case 4: - if(queue_count() < QUEUE_SIZE) - { - m_queue[m_head++] = data; - m_head %= QUEUE_SIZE; - m_count++; - } - break; - } - } - else // odd - logerror("PC9801-86: Write to undefined port [%02x] %02x\n",offset+0xa464,data); + // either a -86 or 9821 MATE A uses this id (built-in) + const u8 id_port = ((ioport("OPNA_DSW")->read() & 1) << 4) | 0x40; + return id_port | m_mask; +} + +void pc9801_86_device::mask_w(u8 data) +{ + m_mask = data & 3; + // TODO: bit 1 totally cuts off OPNA output + logerror("%s: OPNA mask setting %02x\n", machine().describe_context(), data); } int pc9801_86_device::queue_count() diff --git a/src/devices/bus/cbus/pc9801_86.h b/src/devices/bus/cbus/pc9801_86.h index 35af5c7b48e..991559d5327 100644 --- a/src/devices/bus/cbus/pc9801_86.h +++ b/src/devices/bus/cbus/pc9801_86.h @@ -31,9 +31,11 @@ class pc9801_86_device : public pc9801_snd_device pc9801_86_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); pc9801_86_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); - void sound_irq(int state); - protected: + void io_map(address_map &map) ATTR_COLD; + u8 pcm_control_r(); + void pcm_control_w(u8 data); + // device-level overrides virtual void device_validity_check(validity_checker &valid) const override; virtual void device_start() override ATTR_COLD; @@ -58,8 +60,6 @@ class pc9801_86_device : public pc9801_snd_device void opna_w(offs_t offset, u8 data); virtual u8 id_r(); void mask_w(u8 data); - u8 pcm_r(offs_t offset); - void pcm_w(offs_t offset, u8 data); u8 m_mask; diff --git a/src/devices/bus/cbus/pc9801_cbus.cpp b/src/devices/bus/cbus/pc9801_cbus.cpp index 5f6dfce58a7..0471674aa68 100644 --- a/src/devices/bus/cbus/pc9801_cbus.cpp +++ b/src/devices/bus/cbus/pc9801_cbus.cpp @@ -123,6 +123,7 @@ template void pc9801_slot_device::install_io void int_w(bool state) { m_int_callback[I](state); } template void install_io(offs_t start, offs_t end, R rhandler, W whandler); + template void install_device(offs_t addrstart, offs_t addrend, T &device, void (T::*map)(class address_map &map), uint64_t unitmask = ~u64(0)) + { + m_iospace->install_device(addrstart, addrend, device, map, unitmask); + } void flush_install_io(const char *client_tag, u16 old_io, u16 new_io, u16 size, read8sm_delegate rhandler, write8sm_delegate whandler); From e428b6bd0787c1680aaf72e909a9635040af613f Mon Sep 17 00:00:00 2001 From: arcadez2003 <51386955+arcadez2003@users.noreply.github.com> Date: Tue, 12 Nov 2024 14:12:08 +0000 Subject: [PATCH 03/19] tfight: Fix missing and or incorrect sounds with a player 2 game (#12967) The game requires the same mono style banking which is used by Stadium Cross, with thanks to mahoneyt944 who spotted the issues --- src/mame/sega/segas32.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/mame/sega/segas32.cpp b/src/mame/sega/segas32.cpp index 0c5659741b7..3666deb5010 100644 --- a/src/mame/sega/segas32.cpp +++ b/src/mame/sega/segas32.cpp @@ -5926,6 +5926,7 @@ void segas32_state::init_jleague() void segas32_state::init_titlef() { segas32_common_init(); + m_soundcpu->space(AS_PROGRAM).install_write_handler(0xb0, 0xbf, write8smo_delegate(*this, FUNC(segas32_state::scross_bank_w))); m_sw1_output = &segas32_state::titlef_sw1_output; m_sw2_output = &segas32_state::titlef_sw2_output; } From 28cb15d13190ae74ed41038d0762250426f09d5c Mon Sep 17 00:00:00 2001 From: AJR Date: Tue, 12 Nov 2024 09:13:54 -0500 Subject: [PATCH 04/19] bus/cbus/pc9801_86.cpp: Fix clang error: lambda capture 'this' is not used [-Werror,-Wunused-lambda-capture] --- src/devices/bus/cbus/pc9801_86.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/devices/bus/cbus/pc9801_86.cpp b/src/devices/bus/cbus/pc9801_86.cpp index bbefe26a7a7..92ccce8bbee 100644 --- a/src/devices/bus/cbus/pc9801_86.cpp +++ b/src/devices/bus/cbus/pc9801_86.cpp @@ -364,6 +364,7 @@ void pc9801_86_device::io_map(address_map &map) map(0x0c, 0x0c).lrw8( NAME([this] () { // TODO: recording mode + (void)this; return 0; }), NAME([this] (u8 data) { From 671e52155e82131b9cc70eea0edf6112d79f03da Mon Sep 17 00:00:00 2001 From: hap Date: Tue, 12 Nov 2024 16:30:34 +0100 Subject: [PATCH 05/19] system1: correct mcu t0 pin --- src/mame/sega/system1.cpp | 17 +++++++---------- src/mame/sega/system1.h | 2 +- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/src/mame/sega/system1.cpp b/src/mame/sega/system1.cpp index b2d228334b6..c2e5b93fd19 100644 --- a/src/mame/sega/system1.cpp +++ b/src/mame/sega/system1.cpp @@ -572,7 +572,7 @@ void system1_state::mcu_control_w(u8 data) { /* Bit 7 -> connects to TD62003 pins 5 & 6 @ IC151 - Bit 6 -> via PLS153, when high, asserts the BUSREQ signal, halting the Z80 + Bit 6 -> via PLS153, when high, asserts the BUSRQ signal, halting the Z80 Bit 5 -> n/c Bit 4 -> (with bit 3) Memory select: 0=Z80 program space, 1=banked ROM, 2=Z80 I/O space, 3=watchdog? Bit 3 -> @@ -635,16 +635,12 @@ u8 system1_state::mcu_io_r(offs_t offset) } -TIMER_DEVICE_CALLBACK_MEMBER(system1_state::mcu_t0_callback) +IRQ_CALLBACK_MEMBER(system1_state::mcu_t0_callback) { - /* The T0 line is clocked by something; if it is not clocked fast - enough, the MCU will fail; on shtngmst this happens after 3 - VBLANKs without a tick. - choplift is even more picky about it, affecting scroll speed - */ - m_mcu->set_input_line(MCS51_T0_LINE, ASSERT_LINE); m_mcu->set_input_line(MCS51_T0_LINE, CLEAR_LINE); + + return 0xff; } @@ -2524,11 +2520,12 @@ void system1_state::mcu(machine_config &config) config.set_maximum_quantum(attotime::from_hz(m_maincpu->clock() / 16)); - TIMER(config, "mcu_t0", 0).configure_periodic(FUNC(system1_state::mcu_t0_callback), attotime::from_usec(2500)); - // This interrupt is driven by pin 15 of a PAL16R4 (315-5138 on Choplifter), based on the vertical count. // The actual duty cycle likely differs from VBLANK, which is another output from the same PAL. m_screen->screen_vblank().set_inputline("mcu", MCS51_INT0_LINE); + + // bus controller INTACK pin clocks MCU T0 + m_maincpu->set_irq_acknowledge_callback(FUNC(system1_state::mcu_t0_callback)); } // alternate program map with RAM/collision swapped diff --git a/src/mame/sega/system1.h b/src/mame/sega/system1.h index 2d35e15b369..405dc6cc286 100644 --- a/src/mame/sega/system1.h +++ b/src/mame/sega/system1.h @@ -187,7 +187,7 @@ class system1_state : public driver_device // misc functions TIMER_DEVICE_CALLBACK_MEMBER(soundirq_gen); - TIMER_DEVICE_CALLBACK_MEMBER(mcu_t0_callback); + IRQ_CALLBACK_MEMBER(mcu_t0_callback); void bank44_custom_w(u8 data); void bank0c_custom_w(u8 data); From f172eba084c67b035b4938b9c19bb043933aff16 Mon Sep 17 00:00:00 2001 From: cracyc Date: Tue, 12 Nov 2024 10:28:27 -0600 Subject: [PATCH 06/19] pc9801: reset egc on rop reg write --- src/mame/nec/pc9801.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/mame/nec/pc9801.cpp b/src/mame/nec/pc9801.cpp index 93775675c68..e740c370f18 100644 --- a/src/mame/nec/pc9801.cpp +++ b/src/mame/nec/pc9801.cpp @@ -859,6 +859,7 @@ void pc9801vm_state::egc_w(offs_t offset, uint16_t data, uint16_t mem_mask) COMBINE_DATA(&m_egc.regs[offset]); switch(offset) { + case 2: case 6: case 7: m_egc.leftover[0] = m_egc.leftover[1] = m_egc.leftover[2] = m_egc.leftover[3] = 0; From e76b2cd790bbc43d8316b1201d851d76665c377d Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Wed, 13 Nov 2024 03:43:55 +1100 Subject: [PATCH 07/19] -dynax/dynax.cpp: Corrected Mahjong Tenkaigen DIP switches according to the manual. -rm/rm480z.cpp: The system is just called LINK 480Z. --- src/mame/dynax/dynax.cpp | 240 +++++++++++++++++++++------------------ src/mame/rm/rm480z.cpp | 6 +- 2 files changed, 132 insertions(+), 114 deletions(-) diff --git a/src/mame/dynax/dynax.cpp b/src/mame/dynax/dynax.cpp index 09ce829525a..9aca64f9163 100644 --- a/src/mame/dynax/dynax.cpp +++ b/src/mame/dynax/dynax.cpp @@ -3738,136 +3738,154 @@ INPUT_PORTS_END static INPUT_PORTS_START( tenkai ) + // The manual provides two sets of standard settings: + // 標準設定 シングル向け 標準設定 コーナー向け + // SW 1 OFF OFF OFF ON ON ON OFF ON ON OFF OFF OFF OFF ON ON ON OFF ON ON OFF + // SW 2 OFF OFF OFF OFF ON ON OFF ON ON ON OFF OFF OFF OFF OFF OFF OFF OFF ON ON + // SW 3 OFF OFF ON ON ON ON ON ON OFF ON OFF OFF ON ON ON ON ON ON OFF ON + // SW 4 OFF ON ON ON OFF OFF OFF OFF OFF OFF ON ON ON ON OFF OFF OFF OFF OFF OFF + + // There is an additional 4-switch bank (SW 5) for selecting the wiring options. + PORT_START("DSW0") - PORT_DIPNAME( 0x0f, 0x07, "Pay Out Rate" ) - PORT_DIPSETTING( 0x00, "50" ) - PORT_DIPSETTING( 0x01, "53" ) - PORT_DIPSETTING( 0x02, "56" ) - PORT_DIPSETTING( 0x03, "59" ) - PORT_DIPSETTING( 0x04, "62" ) - PORT_DIPSETTING( 0x05, "65" ) - PORT_DIPSETTING( 0x06, "68" ) - PORT_DIPSETTING( 0x07, "71" ) - PORT_DIPSETTING( 0x08, "75" ) - PORT_DIPSETTING( 0x09, "78" ) - PORT_DIPSETTING( 0x0a, "81" ) - PORT_DIPSETTING( 0x0b, "84" ) - PORT_DIPSETTING( 0x0c, "87" ) - PORT_DIPSETTING( 0x0d, "90" ) - PORT_DIPSETTING( 0x0e, "93" ) - PORT_DIPSETTING( 0x0f, "96" ) - PORT_DIPNAME( 0x30, 0x10, "Odds Rate" ) + PORT_DIPNAME( 0x0f, 0x07, "Payout Rate" ) PORT_DIPLOCATION("SW 1:1,2,3,4") // PAY-OUT RATE + PORT_DIPSETTING( 0x00, "50%" ) + PORT_DIPSETTING( 0x01, "53%" ) + PORT_DIPSETTING( 0x02, "56%" ) + PORT_DIPSETTING( 0x03, "59%" ) + PORT_DIPSETTING( 0x04, "62%" ) + PORT_DIPSETTING( 0x05, "65%" ) + PORT_DIPSETTING( 0x06, "68%" ) + PORT_DIPSETTING( 0x07, "71%" ) + PORT_DIPSETTING( 0x08, "75%" ) + PORT_DIPSETTING( 0x09, "78%" ) + PORT_DIPSETTING( 0x0a, "81%" ) + PORT_DIPSETTING( 0x0b, "84%" ) + PORT_DIPSETTING( 0x0c, "87%" ) + PORT_DIPSETTING( 0x0d, "90%" ) + PORT_DIPSETTING( 0x0e, "93%" ) + PORT_DIPSETTING( 0x0f, "96%" ) + PORT_DIPNAME( 0x30, 0x00, "Odds Rate" ) PORT_DIPLOCATION("SW 1:5,6") // ODDS RATE PORT_DIPSETTING( 0x30, "1 2 4 8 12 16 24 32" ) PORT_DIPSETTING( 0x00, "1 2 3 5 8 15 30 50" ) PORT_DIPSETTING( 0x10, "1 2 3 5 10 25 50 100" ) PORT_DIPSETTING( 0x20, "1 2 3 5 10 50 100 200" ) - PORT_DIPNAME( 0xc0, 0x40, "Max Bet" ) + PORT_DIPNAME( 0xc0, 0x40, "Maximum Bet" ) PORT_DIPLOCATION("SW 1:7,8") // BET-MAX PORT_DIPSETTING( 0xc0, "1" ) PORT_DIPSETTING( 0x80, "5" ) PORT_DIPSETTING( 0x40, "10" ) PORT_DIPSETTING( 0x00, "20" ) PORT_START("DSW1") - PORT_DIPNAME( 0x03, 0x03, "Unknown 1-0&1" ) - PORT_DIPSETTING( 0x03, "1:1" ) - PORT_DIPSETTING( 0x02, "1:2" ) - PORT_DIPSETTING( 0x01, "1:5" ) - PORT_DIPSETTING( 0x00, "1:10" ) - PORT_DIPNAME( 0x0c, 0x0c, "Min Rate To Play" ) - PORT_DIPSETTING( 0x0c, "1" ) - PORT_DIPSETTING( 0x08, "2" ) - PORT_DIPSETTING( 0x04, "3" ) - PORT_DIPSETTING( 0x00, "5" ) - PORT_DIPNAME( 0x70, 0x70, "YAKUMAN Bonus" ) - PORT_DIPSETTING( 0x70, "Cut" ) - PORT_DIPSETTING( 0x60, "1 T" ) - PORT_DIPSETTING( 0x50, "300" ) - PORT_DIPSETTING( 0x40, "500" ) - PORT_DIPSETTING( 0x30, "700" ) - PORT_DIPSETTING( 0x20, "1000" ) -// PORT_DIPSETTING( 0x10, "1000" ) -// PORT_DIPSETTING( 0x00, "1000" ) - PORT_DIPNAME( 0x80, 0x80, "Unknown 1-7" ) - PORT_DIPSETTING( 0x00, "1" ) - PORT_DIPSETTING( 0x80, "2" ) + PORT_DIPNAME( 0x03, 0x03, DEF_STR(Coinage) ) PORT_DIPLOCATION("SW 2:1,2") // COIN RATE + PORT_DIPSETTING( 0x03, DEF_STR(1C_1C) ) // 1コイン  1プレイ + PORT_DIPSETTING( 0x02, DEF_STR(1C_2C) ) // 1コイン  2プレイ + PORT_DIPSETTING( 0x01, DEF_STR(1C_5C) ) // 1コイン  5プレイ + PORT_DIPSETTING( 0x00, "1 Coin/10 Credits" ) // 1コイン 10プレイ + PORT_DIPNAME( 0x0c, 0x0c, "Minimum Bet" ) PORT_DIPLOCATION("SW 2:3,4") // ゲーム・スタート時の最低レート数 + PORT_DIPSETTING( 0x0c, "1" ) // レート 1 + PORT_DIPSETTING( 0x08, "2" ) // レート 2 + PORT_DIPSETTING( 0x04, "3" ) // レート 3 + PORT_DIPSETTING( 0x00, "5" ) // レート 5 + PORT_DIPNAME( 0x70, 0x40, "Yakuman Bonus Cycle" ) PORT_DIPLOCATION("SW 2:5,6,7") // 役満ボーナスの設定周期 + PORT_DIPSETTING( 0x70, "None" ) // 無し + PORT_DIPSETTING( 0x60, "First time only" ) // 初回のみ + PORT_DIPSETTING( 0x50, "Every 300 coins" ) // 300コイン毎 + PORT_DIPSETTING( 0x40, "Every 500 coins" ) // 500コイン毎 + PORT_DIPSETTING( 0x30, "Every 700 coins" ) // 700コイン毎 + PORT_DIPSETTING( 0x20, "Every 1000 coins" ) // 1000コイン毎 +// PORT_DIPSETTING( 0x10, "Every 1000 coins" ) +// PORT_DIPSETTING( 0x00, "Every 1000 coins" ) + PORT_DIPNAME( 0x80, 0x00, "Yakuman Bonuses Per Cycle" ) PORT_DIPLOCATION("SW 2:8") // 役満ボーナスの回数設定周期毎に + PORT_DIPSETTING( 0x00, "1" ) // 1回 + PORT_DIPSETTING( 0x80, "2" ) // 2回 PORT_START("DSW2") - PORT_DIPNAME( 0x01, 0x01, "Unknown 2-0" ) - PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x02, "Unknown 2-1" ) - PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x04, 0x04, "Girls (Demo)" ) - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x04, DEF_STR( On ) ) - PORT_DIPNAME( 0x08, 0x08, "In-Game Bet?" ) - PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x10, 0x10, "Unknown 2-4" ) - PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x20, 0x20, "Auto Tsumo after Reach" ) - PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x40, 0x40, "Last Chance" ) - PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x80, 0x80, "DonDen Key" ) - PORT_DIPSETTING( 0x80, "Start" ) - PORT_DIPSETTING( 0x00, "Flip Flop" ) + PORT_DIPNAME( 0x01, 0x01, "Game Type" ) PORT_DIPLOCATION("SW 3:1") // ゲーム・タイプ + PORT_DIPSETTING( 0x01, "Credit type" ) // クレジット・タイプ + PORT_DIPSETTING( 0x00, "Hopper type" ) // ホッパー・タイプ + PORT_DIPNAME( 0x02, 0x02, "Hopper Polarity" ) PORT_DIPLOCATION("SW 3:2") // ホッパー・アクティブ + PORT_DIPSETTING( 0x02, DEF_STR(Off) ) + PORT_DIPSETTING( 0x00, DEF_STR(On) ) + PORT_DIPNAME( 0x04, 0x00, "Tenkaigen Day" ) PORT_DIPLOCATION("SW 3:3") // 天開眼の日 + PORT_DIPSETTING( 0x04, DEF_STR(Off) ) // 無 + PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 有 + PORT_DIPNAME( 0x08, 0x00, "Double Up" ) PORT_DIPLOCATION("SW 3:4") // W-BET + PORT_DIPSETTING( 0x08, DEF_STR(Off) ) // 無 + PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 有 + PORT_DIPNAME( 0x10, 0x00, "Renso Rate" ) PORT_DIPLOCATION("SW 3:5") + PORT_DIPSETTING( 0x10, DEF_STR(Off) ) // 無 + PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 有 + PORT_DIPNAME( 0x20, 0x00, "Auto Reach" ) PORT_DIPLOCATION("SW 3:6") // オート・リーチ + PORT_DIPSETTING( 0x20, DEF_STR(Off) ) // 無 + PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 有 + PORT_DIPNAME( 0x40, 0x00, "Last Chance" ) PORT_DIPLOCATION("SW 3:7") // ラスト・チャンス + PORT_DIPSETTING( 0x40, DEF_STR(Off) ) // 無 + PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 有 + PORT_DIPNAME( 0x80, 0x00, "Don Den Key" ) PORT_DIPLOCATION("SW 3:8") + PORT_DIPSETTING( 0x80, "Start" ) // スタート・ボタ + PORT_DIPSETTING( 0x00, "Flip Flop" ) // F/F・ボタン PORT_START("DSW3") - PORT_DIPNAME( 0x01, 0x00, DEF_STR( Demo_Sounds ) ) - PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x00, "In-Game Music" ) - PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x04, 0x04, "Select Girl" ) - PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x08, 0x00, "Moles On Gal's Face" ) - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x08, DEF_STR( On ) ) - PORT_DIPNAME( 0x10, 0x10, "Unknown 3-4" ) - PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x20, 0x20, "Unknown 3-5" ) - PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x40, 0x40, "Unknown 3-6" ) - PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x80, 0x80, "Set Date" ) - PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x01, 0x00, DEF_STR(Demo_Sounds )) PORT_DIPLOCATION("SW 4:1") // デモ・サウンド + PORT_DIPSETTING( 0x01, DEF_STR(Off) ) // 無 + PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 有 + PORT_DIPNAME( 0x02, 0x00, "In-Game Music" ) PORT_DIPLOCATION("SW 4:2") // ゲーム・サウンド + PORT_DIPSETTING( 0x02, DEF_STR(Off) ) // 無 + PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 有 + PORT_DIPNAME( 0x04, 0x00, "Gal Select" ) PORT_DIPLOCATION("SW 4:3") // ギャル・セレクト + PORT_DIPSETTING( 0x04, DEF_STR(Off) ) // 無 + PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 有 + PORT_DIPNAME( 0x08, 0x00, "Gal Pose" ) PORT_DIPLOCATION("SW 4:4") // ギャル・ポーズ + PORT_DIPSETTING( 0x00, "Type A" ) // Aタイプ + PORT_DIPSETTING( 0x08, "Type B" ) // Bタイプ + PORT_DIPNAME( 0x10, 0x10, "Demo Message Language" ) PORT_DIPLOCATION("SW 4:5") // デモメッセージ + PORT_DIPSETTING( 0x10, DEF_STR(Japanese) ) // 日本語メッセージ + PORT_DIPSETTING( 0x00, DEF_STR(Taiwan) ) // 台湾メッセージ + PORT_DIPNAME( 0x20, 0x20, "SP Express Frequency" ) PORT_DIPLOCATION("SW 4:6") // 特急便SPの頻度 + PORT_DIPSETTING( 0x00, DEF_STR(Low) ) // 少ない + PORT_DIPSETTING( 0x20, DEF_STR(Normal) ) // 普通 + PORT_DIPNAME( 0x40, 0x40, "Tenkaigen Day Frequency") PORT_DIPLOCATION("SW 4:7") // 天開眼の日頻度 + PORT_DIPSETTING( 0x00, DEF_STR(Low) ) // 少ない + PORT_DIPSETTING( 0x40, DEF_STR(Normal) ) // 普通 + PORT_DIPNAME( 0x80, 0x80, "Time Settings Mode" ) PORT_DIPLOCATION("SW 4:8") // 時間設定モード + PORT_DIPSETTING( 0x80, DEF_STR(Off) ) // 無 + PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 有 PORT_START("DSW4") /* (top) */ - PORT_DIPNAME( 0x01, 0x01, "Credits Per Note" ) - PORT_DIPSETTING( 0x01, "5" ) - PORT_DIPSETTING( 0x00, "10" ) - PORT_DIPNAME( 0x02, 0x02, DEF_STR( Flip_Screen ) ) + PORT_DIPNAME( 0x01, 0x00, "Credits Per Note" ) PORT_DIPLOCATION("SW 1:9") // NOTE RATE + PORT_DIPSETTING( 0x01, "5" ) PORT_CONDITION("DSW1", 0x03, EQUALS, 0x03) // COIN×5 + PORT_DIPSETTING( 0x01, "10" ) PORT_CONDITION("DSW1", 0x03, EQUALS, 0x02) + PORT_DIPSETTING( 0x01, "25" ) PORT_CONDITION("DSW1", 0x03, EQUALS, 0x01) + PORT_DIPSETTING( 0x01, "50" ) PORT_CONDITION("DSW1", 0x03, EQUALS, 0x00) + PORT_DIPSETTING( 0x00, "10" ) PORT_CONDITION("DSW1", 0x03, EQUALS, 0x03) // COIN×10 + PORT_DIPSETTING( 0x00, "20" ) PORT_CONDITION("DSW1", 0x03, EQUALS, 0x02) + PORT_DIPSETTING( 0x00, "50" ) PORT_CONDITION("DSW1", 0x03, EQUALS, 0x01) + PORT_DIPSETTING( 0x00, "100" ) PORT_CONDITION("DSW1", 0x03, EQUALS, 0x00) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW 1:10") PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x04, 0x04, "Unknown top-2" ) - PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x08, 0x08, "Unknown top-3" ) - PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x10, 0x10, "Unknown top-4" ) - PORT_DIPSETTING( 0x10, "8" ) - PORT_DIPSETTING( 0x00, "5" ) - PORT_DIPNAME( 0x20, 0x20, "Unknown top-5" ) - PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x40, 0x40, "Subtitle" ) - PORT_DIPSETTING( 0x40, DEF_STR( None ) ) - PORT_DIPSETTING( 0x00, "Part 2" ) - PORT_DIPNAME( 0x80, 0x80, "Unknown top-7" ) - PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x00, "Computer Strength" ) PORT_DIPLOCATION("SW 2:9") // コンピューターの強さ + PORT_DIPSETTING( 0x00, DEF_STR(Normal) ) // 普通 + PORT_DIPSETTING( 0x04, "Strong" ) // 強い + PORT_DIPNAME( 0x08, 0x00, "Service Count" ) PORT_DIPLOCATION("SW 2:10") // サービス・カウント + PORT_DIPSETTING( 0x08, DEF_STR(Off) ) // 無 + PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 有 + PORT_DIPNAME( 0x10, 0x10, "Don Den Count" ) PORT_DIPLOCATION("SW 3:9") + PORT_DIPSETTING( 0x00, "5 times" ) // 5回 + PORT_DIPSETTING( 0x10, "8 times" ) // 8回 + PORT_DIPNAME( 0x20, 0x00, "Show In-Game Clock" ) PORT_DIPLOCATION("SW 3:10") // ゲーム中の時計表示 + PORT_DIPSETTING( 0x20, DEF_STR(No) ) // 無 + PORT_DIPSETTING( 0x00, DEF_STR(Yes) ) // 有 + PORT_DIPNAME( 0x40, 0x40, "Game Title" ) PORT_DIPLOCATION("SW 4:9") + PORT_DIPSETTING( 0x40, "Mahjong Tenkaigen" ) + PORT_DIPSETTING( 0x00, "Mahjong Tenkaigen Part 2" ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR(Unknown) ) PORT_DIPLOCATION("SW 4:10") PORT_CONDITION("DSW4", 0x40, EQUALS, 0x40) + PORT_DIPSETTING( 0x80, DEF_STR(Off) ) + PORT_DIPSETTING( 0x00, DEF_STR(On) ) + PORT_DIPNAME( 0x80, 0x80, "Show Yakuman Table" ) PORT_DIPLOCATION("SW 4:10") PORT_CONDITION("DSW4", 0x40, EQUALS, 0x00) + PORT_DIPSETTING( 0x80, DEF_STR(No) ) + PORT_DIPSETTING( 0x00, DEF_STR(Yes) ) PORT_START("COINS") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_GAMBLE_PAYOUT ) PORT_CODE(KEYCODE_4) // Pay diff --git a/src/mame/rm/rm480z.cpp b/src/mame/rm/rm480z.cpp index a61d92d4325..4637ea6570d 100644 --- a/src/mame/rm/rm480z.cpp +++ b/src/mame/rm/rm480z.cpp @@ -367,6 +367,6 @@ ROM_START( rm480za ) ROM_END /* Driver */ -// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -COMP(1981, rm480z, 0, 0, rm480z, rm480z, rm480z_state, driver_device::empty_init, "Research Machines", "LINK RM-480Z (set 1)", 0) -COMP(1981, rm480za, rm480z, 0, rm480za, rm480z, rm480z_state, driver_device::empty_init, "Research Machines", "LINK RM-480Z (set 2)", 0) +// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS +COMP(1981, rm480z, 0, 0, rm480z, rm480z, rm480z_state, driver_device::empty_init, "Research Machines", "LINK 480Z (set 1)", 0) +COMP(1981, rm480za, rm480z, 0, rm480za, rm480z, rm480z_state, driver_device::empty_init, "Research Machines", "LINK 480Z (set 2)", 0) From 09b69a1a25bc50947a9d53dc4df9831d79368b44 Mon Sep 17 00:00:00 2001 From: Dirk Best Date: Tue, 12 Nov 2024 17:53:47 +0100 Subject: [PATCH 08/19] sega/megadriv_acbl: Hook up PIC dumps for aladmdb and jparkmb. [Dirk Best, Darksoft, Hammy] Systems promoted to working --------------------------- Jurassic Park (bootleg of Mega Drive version) --- src/mame/sega/megadriv_acbl.cpp | 246 ++++++++++++++++---------------- src/mame/sega/megadriv_acbl.h | 7 - 2 files changed, 123 insertions(+), 130 deletions(-) diff --git a/src/mame/sega/megadriv_acbl.cpp b/src/mame/sega/megadriv_acbl.cpp index 99a3935e5b7..500c768a823 100644 --- a/src/mame/sega/megadriv_acbl.cpp +++ b/src/mame/sega/megadriv_acbl.cpp @@ -91,7 +91,7 @@ Stephh's notes (based on the game M68000 code and some tests) : 0xff7e12.l 0x30313000 0x30313200 0x30313400 0xff7e16.l 0x30303900 0x30313200 0x30313500 -3) MCU notes +3) MCU notes (obsolete, PIC emulated now) - As I don't know how it is on real hardware, MCU simulation is more a guess than anything; anyway, the game now runs correctly (coins are handled and settings change) @@ -150,7 +150,7 @@ Sunset Riders info - title raster effect is broken (bug in Mega Drive code, happens with normal set too) - TODO (barek2mb): + TODO (games with PIC): - Unknown inputs to Port B of the emulated PIC - MCU clock frequency - There is only a 50 MHz XTAL on the PCB, are the other clocks correct? @@ -174,10 +174,16 @@ void md_boot_state::md_bootleg_map(address_map &map) void md_boot_mcu_state::md_boot_mcu_map(address_map &map) { - md_bootleg_map(map); + megadriv_68k_base_map(map); + + map(0x000000, 0x1fffff).rom(); - map(0x220000, 0x220001).w(FUNC(md_boot_mcu_state::mcu_w)); - map(0x330000, 0x330001).r(FUNC(md_boot_mcu_state::mcu_r)); + // could be mirrors + map(0x100000, 0x100001).w(FUNC(md_boot_mcu_state::mcu_w)); // twinktmb, sonic2mb + map(0x200000, 0x200001).w(FUNC(md_boot_mcu_state::mcu_w)); // jparkmb, sonic3mb + map(0x220000, 0x220001).w(FUNC(md_boot_mcu_state::mcu_w)); // aladmdb, barek2mb + map(0x300000, 0x300001).r(FUNC(md_boot_mcu_state::mcu_r)); // twinktmb, sonic2mb, jparkmb, sonic3mb, barek3mba + map(0x330000, 0x330001).r(FUNC(md_boot_mcu_state::mcu_r)); // aladmdb, barek2mb } void md_boot_6button_state::ssf2mdb_68k_map(address_map &map) @@ -208,25 +214,6 @@ void md_boot_state::aladmdb_w(uint16_t data) logerror("aladmdb_w : %06x - data = %04x\n",m_maincpu->pc(),data); } -uint16_t md_boot_state::aladmdb_r() -{ - if (m_maincpu->pc() == 0x1b2a56) - { - m_aladmdb_mcu_port = ioport("MCU")->read(); - - if (m_aladmdb_mcu_port & 0x100) - return ((m_aladmdb_mcu_port & 0x0f) | 0x100); // coin inserted, calculate the number of coins - else - return (0x100); //MCU status, needed if you fall into a pitfall - } - if (m_maincpu->pc() == 0x1b2a72) return 0x0000; - if (m_maincpu->pc() == 0x1b2d24) return (ioport("MCU")->read() & 0x00f0) | 0x1200; // difficulty - if (m_maincpu->pc() == 0x1b2d4e) return 0x0000; - - logerror("aladbl_r : %06x\n",m_maincpu->pc()); - return 0x0000; -} - uint16_t md_boot_state::twinktmb_r() { if (m_maincpu->pc() == 0x02f81e) @@ -239,18 +226,6 @@ uint16_t md_boot_state::twinktmb_r() return 0x0000; } -uint16_t md_boot_state::jparkmb_r() -{ - if (m_maincpu->pc() == 0x1e327a) - return ioport("COIN")->read(); // TODO: coins don't respond well - - if (m_maincpu->pc() == 0x1e3254) return 0x0000; // what's this? dips? - - //logerror("jparkmb_r : %06x\n",m_maincpu->pc()); - - return 0x0000; -} - uint16_t md_boot_state::barek3mba_r() // missing PIC dump, simulated for now { if (m_maincpu->pc() == 0x4dbc6) @@ -356,23 +331,22 @@ void md_boot_mcu_state::mcu_portb_w(uint8_t data) uint8_t md_boot_mcu_state::mcu_portc_r() { + uint8_t data = 0xff; + // read dip switches if (BIT(m_mcu_porta, 3) == 0) - return m_dsw->read(); + data &= m_dsw->read(); // read from latch if (BIT(m_mcu_porta, 1) == 0) { if (BIT(m_mcu_porta, 0) == 0) - return m_mcu_in_latch_lsb; + data &= m_mcu_in_latch_lsb; else - return m_mcu_in_latch_msb; + data &= m_mcu_in_latch_msb; } - // should never go here - logerror("mcu: read from output latch!\n"); - - return 0xff; + return data; } void md_boot_mcu_state::mcu_portc_w(uint8_t data) @@ -519,39 +493,51 @@ INPUT_PORTS_START( mk3mdb ) PORT_START("DSWC") // Not even read in this set INPUT_PORTS_END -// Verified from M68000 code INPUT_PORTS_START( aladmdb ) PORT_INCLUDE( md_common ) - PORT_MODIFY("PAD1") // Joypad 1 (3 button + start) NOT READ DIRECTLY - PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_NAME("P1 Throw") // a - PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_NAME("P1 Sword") // b - PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1) PORT_NAME("P1 Jump") // c - PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_START1 ) // start + PORT_MODIFY("PAD1") + PORT_BIT(0x0010, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_PLAYER(1) PORT_NAME("P1 Throw") // a + PORT_BIT(0x0020, IP_ACTIVE_LOW, IPT_BUTTON2) PORT_PLAYER(1) PORT_NAME("P1 Sword") // b + PORT_BIT(0x0040, IP_ACTIVE_LOW, IPT_BUTTON3) PORT_PLAYER(1) PORT_NAME("P1 Jump") // c + PORT_BIT(0x0080, IP_ACTIVE_LOW, IPT_START1) // start - PORT_MODIFY("PAD2") // Joypad 2 (3 button + start) NOT READ DIRECTLY - not used - PORT_BIT( 0x00ff, IP_ACTIVE_LOW, IPT_UNUSED ) + // not used + PORT_MODIFY("PAD2") + PORT_BIT(0x00ff, IP_ACTIVE_LOW, IPT_UNUSED) - // As I don't know how it is on real hardware, this is more a guess than anything - PORT_START("MCU") - PORT_DIPNAME( 0x07, 0x01, DEF_STR( Coinage ) ) // Code at 0x1b2a50 - unsure if there are so many settings -// PORT_DIPSETTING( 0x00, "INVALID" ) // Adds 0 credit - PORT_DIPSETTING( 0x01, DEF_STR( 1C_1C ) ) - PORT_DIPSETTING( 0x02, DEF_STR( 1C_2C ) ) - PORT_DIPSETTING( 0x03, DEF_STR( 1C_3C ) ) - PORT_DIPSETTING( 0x04, DEF_STR( 1C_4C ) ) - PORT_DIPSETTING( 0x05, DEF_STR( 1C_5C ) ) - PORT_DIPSETTING( 0x06, DEF_STR( 1C_6C ) ) - PORT_DIPSETTING( 0x07, DEF_STR( 1C_7C ) ) -// PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_CUSTOM ) // To avoid it being changed and corrupting Coinage settings - PORT_DIPNAME( 0x30, 0x00, DEF_STR( Difficulty ) ) // Code at 0x1b2680 - PORT_DIPSETTING( 0x10, DEF_STR( Easy ) ) // "PRACTICE" - PORT_DIPSETTING( 0x00, DEF_STR( Normal ) ) // "NORMAL" - PORT_DIPSETTING( 0x20, DEF_STR( Hard ) ) // "DIFFICULT" -// PORT_DIPSETTING( 0x30, DEF_STR( Normal ) ) - PORT_DIPUNUSED( 0x40, IP_ACTIVE_HIGH ) - PORT_DIPUNUSED( 0x80, IP_ACTIVE_HIGH ) - PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_IMPULSE(1) // Needed to avoid credits getting mad + PORT_START("DSW") + PORT_DIPNAME(0x0f, 0x0f, DEF_STR( Coinage )) + PORT_DIPSETTING( 0x05, DEF_STR( 6C_1C )) + PORT_DIPSETTING( 0x06, DEF_STR( 5C_1C )) + PORT_DIPSETTING( 0x07, DEF_STR( 4C_1C )) + PORT_DIPSETTING( 0x08, DEF_STR( 3C_1C )) + PORT_DIPSETTING( 0x01, DEF_STR( 8C_3C )) + PORT_DIPSETTING( 0x09, DEF_STR( 2C_1C )) + PORT_DIPSETTING( 0x02, DEF_STR( 5C_3C )) + PORT_DIPSETTING( 0x03, DEF_STR( 3C_2C )) + PORT_DIPSETTING( 0x0f, DEF_STR( 1C_1C )) +// PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C )) // duplicate + PORT_DIPSETTING( 0x04, DEF_STR( 2C_3C )) + PORT_DIPSETTING( 0x0e, DEF_STR( 1C_2C )) + PORT_DIPSETTING( 0x0d, DEF_STR( 1C_3C )) + PORT_DIPSETTING( 0x0c, DEF_STR( 1C_4C )) + PORT_DIPSETTING( 0x0b, DEF_STR( 1C_5C )) + PORT_DIPSETTING( 0x0a, DEF_STR( 1C_6C )) + PORT_DIPNAME(0x30, 0x30, DEF_STR( Difficulty )) // Code at 0x1b2680 + PORT_DIPSETTING( 0x10, DEF_STR( Easy )) // "PRACTICE" + PORT_DIPSETTING( 0x30, DEF_STR( Normal )) // "NORMAL" +// PORT_DIPSETTING( 0x00, DEF_STR( Normal )) // "NORMAL" (duplicate) + PORT_DIPSETTING( 0x20, DEF_STR( Hard )) // "DIFFICULT" + PORT_DIPUNUSED(0x40, IP_ACTIVE_LOW) + PORT_DIPUNUSED(0x80, IP_ACTIVE_LOW) + + PORT_START("IN0") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_COIN1) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_UNKNOWN) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNKNOWN) + PORT_BIT(0xf0, IP_ACTIVE_LOW, IPT_UNUSED) INPUT_PORTS_END INPUT_PORTS_START( sonic2mb ) @@ -597,11 +583,20 @@ INPUT_PORTS_START( sonic2mb ) INPUT_PORTS_END INPUT_PORTS_START( twinktmb ) - PORT_INCLUDE( aladmdb ) + PORT_INCLUDE( md_common ) + + PORT_MODIFY("PAD1") // Joypad 1 (3 button + start) NOT READ DIRECTLY + PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_NAME("P1 Throw") // a + PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_NAME("P1 Sword") // b + PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1) PORT_NAME("P1 Jump") // c + PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_START1 ) // start + + PORT_MODIFY("PAD2") // Joypad 2 (3 button + start) NOT READ DIRECTLY - not used + PORT_BIT( 0x00ff, IP_ACTIVE_LOW, IPT_UNUSED ) // As I don't know how it is on real hardware, this is more a guess than anything - PORT_MODIFY("MCU") + PORT_START("MCU") PORT_DIPUNKNOWN_DIPLOC(0x01, 0x01, "SW1:1") PORT_DIPUNKNOWN_DIPLOC(0x02, 0x02, "SW1:2") PORT_DIPUNKNOWN_DIPLOC(0x04, 0x04, "SW1:3") @@ -623,6 +618,32 @@ INPUT_PORTS_START( twinktmb ) PORT_BIT( 0xff00, IP_ACTIVE_HIGH, IPT_UNUSED ) INPUT_PORTS_END +INPUT_PORTS_START( jparkmb ) + PORT_INCLUDE( md_common ) + + // not used + PORT_MODIFY("PAD2") + PORT_BIT( 0x00ff, IP_ACTIVE_LOW, IPT_UNUSED ) + + // not read by the mcu, but physically on the pcb + PORT_START("DSW") + PORT_DIPUNUSED_DIPLOC(0x01, 0x01, "SW1:1") + PORT_DIPUNUSED_DIPLOC(0x02, 0x02, "SW1:2") + PORT_DIPUNUSED_DIPLOC(0x04, 0x04, "SW1:3") + PORT_DIPUNUSED_DIPLOC(0x08, 0x08, "SW1:4") + PORT_DIPUNUSED_DIPLOC(0x10, 0x10, "SW1:5") + PORT_DIPUNUSED_DIPLOC(0x20, 0x20, "SW1:6") + PORT_DIPUNUSED_DIPLOC(0x40, 0x40, "SW1:7") + PORT_DIPUNUSED_DIPLOC(0x80, 0x80, "SW1:8") + + PORT_START("IN0") + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_COIN1) + PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_UNKNOWN) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNKNOWN) + PORT_BIT(0xf0, IP_ACTIVE_LOW, IPT_UNUSED) +INPUT_PORTS_END + INPUT_PORTS_START( sonic3mb ) PORT_INCLUDE( twinktmb ) @@ -822,7 +843,7 @@ INPUT_PORTS_START( barek2 ) PORT_DIPSETTING( 0x02, DEF_STR( 5C_3C )) PORT_DIPSETTING( 0x03, DEF_STR( 3C_2C )) PORT_DIPSETTING( 0x0f, DEF_STR( 1C_1C )) - PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C )) // duplicate +// PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C )) // duplicate PORT_DIPSETTING( 0x04, DEF_STR( 2C_3C )) PORT_DIPSETTING( 0x0e, DEF_STR( 1C_2C )) PORT_DIPSETTING( 0x0d, DEF_STR( 1C_3C )) @@ -979,12 +1000,6 @@ void md_boot_mcu_state::md_boot_mcu(machine_config &config) m_mcu->write_c().set(FUNC(md_boot_mcu_state::mcu_portc_w)); } -void md_boot_6button_state::machine_start() -{ - md_boot_state::machine_start(); - m_vdp->stop_timers(); -} - void md_boot_6button_state::megadrvb_6b(machine_config &config) { megadrvb(config); @@ -1000,6 +1015,12 @@ void md_boot_6button_state::ssf2mdb(machine_config &config) m_maincpu->set_addrmap(AS_PROGRAM, &md_boot_6button_state::ssf2mdb_68k_map); } +void md_boot_6button_state::machine_start() +{ + md_boot_state::machine_start(); + m_vdp->stop_timers(); +} + /************************************* * @@ -1007,23 +1028,6 @@ void md_boot_6button_state::ssf2mdb(machine_config &config) * *************************************/ -#define ENERGY_CONSOLE_MODE 0 - -void md_boot_state::init_aladmdb() -{ - // Game does a check @ 1afc00 with work RAM fff57c that makes it play like the original console version (i.e. 8 energy hits instead of 2) -#if ENERGY_CONSOLE_MODE - uint16_t *rom = (uint16_t *)memregion("maincpu")->base(); - rom[0x1afc08/2] = 0x6600; -#endif - - // 220000 = writes to mcu? 330000 = reads? - m_maincpu->space(AS_PROGRAM).install_write_handler(0x220000, 0x220001, write16smo_delegate(*this, FUNC(md_boot_state::aladmdb_w))); - m_maincpu->space(AS_PROGRAM).install_read_handler(0x330000, 0x330001, read16smo_delegate(*this, FUNC(md_boot_state::aladmdb_r))); - - init_megadrij(); -} - // This should be correct, the areas of the ROM that differ to the original // after this decode look like intentional changes void md_boot_6button_state::init_mk3mdb() @@ -1241,13 +1245,6 @@ void md_boot_state::init_twinktmb() m_maincpu->space(AS_PROGRAM).install_read_handler(0x300000, 0x300001, read16smo_delegate(*this, FUNC(md_boot_state::twinktmb_r))); } -void md_boot_state::init_jparkmb() -{ - init_megadrij(); - m_maincpu->space(AS_PROGRAM).install_write_handler(0x100000, 0x100001, write16smo_delegate(*this, FUNC(md_boot_state::aladmdb_w))); - m_maincpu->space(AS_PROGRAM).install_read_handler(0x300000, 0x300001, read16smo_delegate(*this, FUNC(md_boot_state::jparkmb_r))); -} - /************************************* * @@ -1261,9 +1258,12 @@ ROM_START( aladmdb ) ROM_LOAD16_BYTE( "m2.bin", 0x000000, 0x080000, CRC(142a0366) SHA1(6c94aa9936cd11ccda503b52019a6721e64a32f0) ) ROM_LOAD16_BYTE( "m3.bin", 0x100001, 0x080000, CRC(0feeeb19) SHA1(bd567a33077ab9997871d21736066140d50e3d70) ) ROM_LOAD16_BYTE( "m4.bin", 0x100000, 0x080000, CRC(bc712661) SHA1(dfd554d000399e17b4ddc69761e572195ed4e1f0) ) +#if 0 + ROM_FILL(0x1afc08, 1, 0x66) // makes it play like the original console version (i.e. 8 energy hits instead of 2) +#endif - ROM_REGION( 0x1000, "pic", ROMREGION_ERASE00 ) - ROM_LOAD( "pic16c57xtp", 0x0000, 0x1000, NO_DUMP ) + ROM_REGION( 0x2000, "mcu", 0 ) + ROM_LOAD( "pic16c57.bin", 0x0000, 0x2000, CRC(f35ded67) SHA1(c46f39ffe92c9d01f3b5e1380039ead488cbf41a) ) ROM_END ROM_START( mk3mdb ) // ROMs are scrambled, we take care of the address descramble in the ROM load, and the data descramble in the init @@ -1398,8 +1398,8 @@ ROM_START( jparkmb ) // Same PCB as twinktmb, JPA-028 label ROM_LOAD16_BYTE( "f22.bin", 0x100000, 0x080000, CRC(36337d06) SHA1(d537cff2c8ed58da146faf390c09252be359ccd1) ) ROM_LOAD16_BYTE( "f21.bin", 0x100001, 0x080000, CRC(6ede6b6b) SHA1(cf29300d9278ea03f54cf54ea582bdd8b9bbdbbd) ) - ROM_REGION( 0x1000, "pic", ROMREGION_ERASE00 ) - ROM_LOAD( "pic16c57xtp", 0x0000, 0x1000, NO_DUMP ) + ROM_REGION( 0x2000, "mcu", 0 ) + ROM_LOAD( "pic16c57.bin", 0x0000, 0x2000, CRC(4101ff42) SHA1(f00bb8a94bbbea8cda7d0cbcffc9721804e08dbd) ) ROM_END ROM_START( barekch ) // all 27c010 @@ -1426,20 +1426,20 @@ ROM_END *************************************/ // PIC protected hardware with Mega Drive bootleg chipset marked TA-04, TA-05 and TA-06. -GAME( 1993, aladmdb, 0, megadrvb, aladmdb, md_boot_state, init_aladmdb, ROT0, "bootleg / Sega", "Aladdin (bootleg of Mega Drive version)", 0 ) -GAME( 1993, sonic2mb, 0, md_bootleg, sonic2mb, md_boot_state, init_sonic2mb, ROT0, "bootleg / Sega", "Sonic The Hedgehog 2 (bootleg of Mega Drive version)", 0 ) // Flying wires going through the empty PIC space aren't completely understood -GAME( 1993, sonic3mb, 0, md_bootleg, sonic3mb, md_sonic3bl_state, init_sonic3mb, ROT0, "bootleg / Sega", "Sonic The Hedgehog 3 (bootleg of Mega Drive version)", MACHINE_UNEMULATED_PROTECTION | MACHINE_NOT_WORKING ) // undumped PIC -GAME( 1994, barek2mb, 0, md_boot_mcu, barek2, md_boot_mcu_state, init_megadrij, ROT0, "bootleg / Sega", "Bare Knuckle II (bootleg of Mega Drive version)", 0 ) // PCB labeled "BK-059" -GAME( 1994, barek3mba, barek3mb, megadrvb, barek3, md_boot_state, init_barek3a, ROT0, "bootleg / Sega", "Bare Knuckle III (bootleg of Mega Drive version)", MACHINE_UNEMULATED_PROTECTION | MACHINE_NOT_WORKING ) // undumped PIC -GAME( 1993, twinktmb, 0, md_bootleg, twinktmb, md_boot_state, init_twinktmb, ROT0, "bootleg / Sega", "Twinkle Tale (bootleg of Mega Drive version)", MACHINE_UNEMULATED_PROTECTION | MACHINE_NOT_WORKING ) // Needs PIC decap or simulation -GAME( 1993, jparkmb, 0, md_bootleg, twinktmb, md_boot_state, init_jparkmb, ROT0, "bootleg / Sega", "Jurassic Park (bootleg of Mega Drive version)", MACHINE_UNEMULATED_PROTECTION | MACHINE_NOT_WORKING ) // Needs PIC decap or simulation +GAME( 1993, aladmdb, 0, md_boot_mcu, aladmdb, md_boot_mcu_state, init_megadrij, ROT0, "bootleg / Sega", "Aladdin (bootleg of Mega Drive version)", 0 ) +GAME( 1993, sonic2mb, 0, md_bootleg, sonic2mb, md_boot_state, init_sonic2mb, ROT0, "bootleg / Sega", "Sonic The Hedgehog 2 (bootleg of Mega Drive version)", 0 ) // Flying wires going through the empty PIC space aren't completely understood +GAME( 1993, sonic3mb, 0, md_bootleg, sonic3mb, md_sonic3bl_state, init_sonic3mb, ROT0, "bootleg / Sega", "Sonic The Hedgehog 3 (bootleg of Mega Drive version)", MACHINE_UNEMULATED_PROTECTION | MACHINE_NOT_WORKING ) // undumped PIC +GAME( 1994, barek2mb, 0, md_boot_mcu, barek2, md_boot_mcu_state, init_megadrij, ROT0, "bootleg / Sega", "Bare Knuckle II (bootleg of Mega Drive version)", 0 ) // PCB labeled "BK-059" +GAME( 1994, barek3mba, barek3mb, megadrvb, barek3, md_boot_state, init_barek3a, ROT0, "bootleg / Sega", "Bare Knuckle III (bootleg of Mega Drive version)", MACHINE_UNEMULATED_PROTECTION | MACHINE_NOT_WORKING ) // undumped PIC +GAME( 1993, twinktmb, 0, md_bootleg, twinktmb, md_boot_state, init_twinktmb, ROT0, "bootleg / Sega", "Twinkle Tale (bootleg of Mega Drive version)", MACHINE_UNEMULATED_PROTECTION | MACHINE_NOT_WORKING ) // Needs PIC decap or simulation +GAME( 1993, jparkmb, 0, md_boot_mcu, jparkmb, md_boot_mcu_state, init_megadrij, ROT0, "bootleg / Sega", "Jurassic Park (bootleg of Mega Drive version)", 0 ) // PCB labeled "JPA-028" // Scrambled bootlegs with Actel for scrambling and Mega Drive bootleg chipset marked TA-04, TA-05 and TA-06. -GAME( 1994, barekch, 0, megadrvb_6b, barekch, md_boot_6button_state, init_barekch, ROT0, "bootleg", "Bare Knuckle (scrambled bootleg of Mega Drive version)", 0 ) -GAME( 1994, barek2ch, 0, md_bootleg, barek2ch, md_boot_state, init_barek2ch, ROT0, "bootleg", "Bare Knuckle II (scrambled bootleg of Mega Drive version)", 0 ) -GAME( 1994, barek3mb, 0, megadrvb, barek3, md_boot_state, init_barek3, ROT0, "bootleg / Sega", "Bare Knuckle III (scrambled bootleg of Mega Drive version)", 0 ) -GAME( 1994, bk3ssrmb, 0, megadrvb_6b, bk3ssrmb, md_boot_6button_state, init_bk3ssrmb, ROT0, "bootleg / Sega", "Bare Knuckle III / Sunset Riders (scrambled bootleg of Mega Drive versions)", MACHINE_NOT_WORKING ) // Currently boots as Bare Knuckle III, mechanism to switch game not emulated yet -GAME( 1994, srssf2mb, 0, megadrvb_6b, bk3ssrmb, md_boot_6button_state, init_srssf2mb, ROT0, "bootleg / Sega", "Sunset Riders / Super Street Fighter II - The New Challengers (scrambled bootleg of Mega Drive versions)", MACHINE_NOT_WORKING ) -GAME( 1996, mk3mdb, 0, megadrvb_6b, mk3mdb, md_boot_6button_state, init_mk3mdb, ROT0, "bootleg / Midway", "Mortal Kombat 3 (scrambled bootleg of Mega Drive version)", 0 ) -GAME( 1994, ssf2mdb, 0, ssf2mdb, ssf2mdb, md_boot_6button_state, init_megadrij, ROT0, "bootleg / Capcom", "Super Street Fighter II - The New Challengers (scrambled bootleg of Mega Drive version)", 0 ) -GAME( 1993, srmdb, 0, megadrvb, srmdb, md_boot_state, init_srmdb, ROT0, "bootleg / Konami", "Sunset Riders (scrambled bootleg of Mega Drive version)", 0 ) +GAME( 1994, barekch, 0, megadrvb_6b, barekch, md_boot_6button_state, init_barekch, ROT0, "bootleg", "Bare Knuckle (scrambled bootleg of Mega Drive version)", 0 ) +GAME( 1994, barek2ch, 0, md_bootleg, barek2ch, md_boot_state, init_barek2ch, ROT0, "bootleg", "Bare Knuckle II (scrambled bootleg of Mega Drive version)", 0 ) +GAME( 1994, barek3mb, 0, megadrvb, barek3, md_boot_state, init_barek3, ROT0, "bootleg / Sega", "Bare Knuckle III (scrambled bootleg of Mega Drive version)", 0 ) +GAME( 1994, bk3ssrmb, 0, megadrvb_6b, bk3ssrmb, md_boot_6button_state, init_bk3ssrmb, ROT0, "bootleg / Sega", "Bare Knuckle III / Sunset Riders (scrambled bootleg of Mega Drive versions)", MACHINE_NOT_WORKING ) // Currently boots as Bare Knuckle III, mechanism to switch game not emulated yet +GAME( 1994, srssf2mb, 0, megadrvb_6b, bk3ssrmb, md_boot_6button_state, init_srssf2mb, ROT0, "bootleg / Sega", "Sunset Riders / Super Street Fighter II - The New Challengers (scrambled bootleg of Mega Drive versions)", MACHINE_NOT_WORKING ) +GAME( 1996, mk3mdb, 0, megadrvb_6b, mk3mdb, md_boot_6button_state, init_mk3mdb, ROT0, "bootleg / Midway", "Mortal Kombat 3 (scrambled bootleg of Mega Drive version)", 0 ) +GAME( 1994, ssf2mdb, 0, ssf2mdb, ssf2mdb, md_boot_6button_state, init_megadrij, ROT0, "bootleg / Capcom", "Super Street Fighter II - The New Challengers (scrambled bootleg of Mega Drive version)", 0 ) +GAME( 1993, srmdb, 0, megadrvb, srmdb, md_boot_state, init_srmdb, ROT0, "bootleg / Konami", "Sunset Riders (scrambled bootleg of Mega Drive version)", 0 ) diff --git a/src/mame/sega/megadriv_acbl.h b/src/mame/sega/megadriv_acbl.h index f3015c11b25..1c60db5142a 100644 --- a/src/mame/sega/megadriv_acbl.h +++ b/src/mame/sega/megadriv_acbl.h @@ -18,14 +18,12 @@ class md_boot_state : public md_ctrl_state void megadrvb(machine_config &config); void md_bootleg(machine_config &config); - void init_aladmdb(); void init_srmdb(); void init_barek2ch(); void init_barek3(); void init_barek3a(); void init_sonic2mb(); void init_twinktmb(); - void init_jparkmb(); protected: uint16_t dsw_r(offs_t offset); @@ -34,15 +32,10 @@ class md_boot_state : public md_ctrl_state private: void aladmdb_w(uint16_t data); - uint16_t aladmdb_r(); uint16_t barek3mba_r(); - uint16_t jparkmb_r(); uint16_t twinktmb_r(); optional_ioport m_io_exp; - - // bootleg specific - int m_aladmdb_mcu_port = 0; }; // for games with emulated PIC microcontroller From 761f98270ab9d1b4c4bad55de7a8b9cadd1bab68 Mon Sep 17 00:00:00 2001 From: hap Date: Tue, 12 Nov 2024 19:15:22 +0100 Subject: [PATCH 09/19] tsamurai: correct stupid strcmp --- src/mame/taito/tsamurai.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/mame/taito/tsamurai.cpp b/src/mame/taito/tsamurai.cpp index affa1356881..c2ca30fd740 100644 --- a/src/mame/taito/tsamurai.cpp +++ b/src/mame/taito/tsamurai.cpp @@ -317,7 +317,7 @@ uint8_t vsgongf_state::vsgongf_a006_r() /* sound CPU busy? */ if (!strcmp(machine().system().name,"vsgongf")) return 0x80; if (!strcmp(machine().system().name,"ringfgt")) return 0x80; - if (!strcmp(machine().system().name,"ringfgt2")) return 0xc0; + if (!strcmp(machine().system().name,"ringfgta")) return 0xc0; logerror ("unhandled read from a006\n"); return 0x00; @@ -328,7 +328,7 @@ uint8_t vsgongf_state::vsgongf_a100_r() /* protection? */ if (!strcmp(machine().system().name,"vsgongf")) return 0xaa; if (!strcmp(machine().system().name,"ringfgt")) return 0x63; - if (!strcmp(machine().system().name,"ringfgt2")) return 0x6a; + if (!strcmp(machine().system().name,"ringfgta")) return 0x6a; logerror ("unhandled read from a100\n"); return 0x00; @@ -1355,9 +1355,9 @@ void m660_state::init_the26thz() m_maincpu->space(AS_PROGRAM).install_read_handler(0xd803, 0xd803, read8smo_delegate(*this, FUNC(m660_state::tsamurai_unknown_d803_r))); } -GAME( 1984, vsgongf, 0, vsgongf, vsgongf, vsgongf_state, empty_init, ROT90, "Kaneko", "VS Gong Fight", MACHINE_IMPERFECT_COLORS | MACHINE_SUPPORTS_SAVE | MACHINE_UNEMULATED_PROTECTION ) -GAME( 1984, ringfgt, vsgongf, vsgongf, vsgongf, vsgongf_state, empty_init, ROT90, "Kaneko (Taito license)", "Ring Fighter (rev 1)", MACHINE_IMPERFECT_COLORS | MACHINE_SUPPORTS_SAVE ) -GAME( 1984, ringfgta, vsgongf, vsgongf, vsgongf, vsgongf_state, empty_init, ROT90, "Kaneko (Taito license)", "Ring Fighter", MACHINE_IMPERFECT_COLORS | MACHINE_SUPPORTS_SAVE ) +GAME( 1984, vsgongf, 0, vsgongf, vsgongf, vsgongf_state, empty_init, ROT90, "Kaneko", "VS Gong Fight", MACHINE_IMPERFECT_COLORS | MACHINE_SUPPORTS_SAVE | MACHINE_UNEMULATED_PROTECTION ) +GAME( 1984, ringfgt, vsgongf, vsgongf, vsgongf, vsgongf_state, empty_init, ROT90, "Kaneko (Taito license)", "Ring Fighter (rev 1)", MACHINE_IMPERFECT_COLORS | MACHINE_SUPPORTS_SAVE ) +GAME( 1984, ringfgta, vsgongf, vsgongf, vsgongf, vsgongf_state, empty_init, ROT90, "Kaneko (Taito license)", "Ring Fighter", MACHINE_IMPERFECT_COLORS | MACHINE_SUPPORTS_SAVE ) GAME( 1985, tsamurai, 0, tsamurai, tsamurai, tsamurai_state, empty_init, ROT90, "Kaneko / Taito", "Samurai Nihon-Ichi (rev 1)", MACHINE_SUPPORTS_SAVE ) GAME( 1985, tsamuraia, tsamurai, tsamurai, tsamurai, tsamurai_state, empty_init, ROT90, "Kaneko / Taito", "Samurai Nihon-Ichi", MACHINE_SUPPORTS_SAVE ) @@ -1369,8 +1369,8 @@ GAME( 1985, nunchaku, ladymstr, tsamurai, nunchaku, tsamurai_state, empty_init GAME( 1985, yamagchi, 0, tsamurai, yamagchi, tsamurai_state, empty_init, ROT90, "Kaneko / Taito", "Go Go Mr. Yamaguchi / Yuke Yuke Yamaguchi-kun", MACHINE_IMPERFECT_COLORS | MACHINE_SUPPORTS_SAVE ) -GAME( 1986, m660, 0, m660, m660, m660_state, empty_init, ROT90, "Wood Place Co. Ltd. (Taito America Corporation license)", "Mission 660 (US)", MACHINE_SUPPORTS_SAVE ) -GAME( 1986, m660j, m660, m660, m660, m660_state, empty_init, ROT90, "Wood Place Co. Ltd. (Taito Corporation license)", "Mission 660 (Japan)", MACHINE_SUPPORTS_SAVE ) -GAME( 1986, m660b, m660, m660, m660, m660_state, empty_init, ROT90, "bootleg", "Mission 660 (bootleg)", MACHINE_SUPPORTS_SAVE ) -GAME( 1986, alphaxz, 0, m660, m660, m660_state, empty_init, ROT90, "Ed Co., Ltd. (Wood Place Co., Ltd. license)", "The Alphax Z (Japan)", MACHINE_SUPPORTS_SAVE ) -GAME( 1986, the26thz, alphaxz, m660, m660, m660_state, init_the26thz, ROT90, "Ed Co., Ltd. (Taito license)", "The 26th Z (Japan, location test)", MACHINE_SUPPORTS_SAVE ) +GAME( 1986, m660, 0, m660, m660, m660_state, empty_init, ROT90, "Wood Place Co. Ltd. (Taito America Corporation license)", "Mission 660 (US)", MACHINE_SUPPORTS_SAVE ) +GAME( 1986, m660j, m660, m660, m660, m660_state, empty_init, ROT90, "Wood Place Co. Ltd. (Taito Corporation license)", "Mission 660 (Japan)", MACHINE_SUPPORTS_SAVE ) +GAME( 1986, m660b, m660, m660, m660, m660_state, empty_init, ROT90, "bootleg", "Mission 660 (bootleg)", MACHINE_SUPPORTS_SAVE ) +GAME( 1986, alphaxz, 0, m660, m660, m660_state, empty_init, ROT90, "Ed Co., Ltd. (Wood Place Co., Ltd. license)", "The Alphax Z (Japan)", MACHINE_SUPPORTS_SAVE ) +GAME( 1986, the26thz, alphaxz, m660, m660, m660_state, init_the26thz, ROT90, "Ed Co., Ltd. (Taito license)", "The 26th Z (Japan, location test)", MACHINE_SUPPORTS_SAVE ) From ecacee47330774c88394660948708387c1ece0de Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Wed, 13 Nov 2024 05:55:47 +1100 Subject: [PATCH 10/19] dynax/dynax.cpp: Corrected DIP switch settings for Ougon no Hai. --- src/mame/dynax/dynax.cpp | 83 +++++++++++++++++++++++++++++++++------- 1 file changed, 69 insertions(+), 14 deletions(-) diff --git a/src/mame/dynax/dynax.cpp b/src/mame/dynax/dynax.cpp index 9aca64f9163..9312e48a696 100644 --- a/src/mame/dynax/dynax.cpp +++ b/src/mame/dynax/dynax.cpp @@ -3745,6 +3745,16 @@ static INPUT_PORTS_START( tenkai ) // SW 3 OFF OFF ON ON ON ON ON ON OFF ON OFF OFF ON ON ON ON ON ON OFF ON // SW 4 OFF ON ON ON OFF OFF OFF OFF OFF OFF ON ON ON ON OFF OFF OFF OFF OFF OFF + // The odds rate table entries correspond to the following hands: + // * 1ハン 1 han + // * 2ハン 2 han + // * 3ハン 3 han + // * 満 貫 mangan + // * 跳 満 haneman + // * 倍 満 baiman + // * 三倍満 sanbaiman + // * 役 満 yakuman + // There is an additional 4-switch bank (SW 5) for selecting the wiring options. PORT_START("DSW0") @@ -3805,15 +3815,15 @@ static INPUT_PORTS_START( tenkai ) PORT_DIPSETTING( 0x01, "Credit type" ) // クレジット・タイプ PORT_DIPSETTING( 0x00, "Hopper type" ) // ホッパー・タイプ PORT_DIPNAME( 0x02, 0x02, "Hopper Polarity" ) PORT_DIPLOCATION("SW 3:2") // ホッパー・アクティブ - PORT_DIPSETTING( 0x02, DEF_STR(Off) ) - PORT_DIPSETTING( 0x00, DEF_STR(On) ) + PORT_DIPSETTING( 0x02, DEF_STR(Normal) ) // 通常 + PORT_DIPSETTING( 0x00, "Inverted" ) // 反転 PORT_DIPNAME( 0x04, 0x00, "Tenkaigen Day" ) PORT_DIPLOCATION("SW 3:3") // 天開眼の日 PORT_DIPSETTING( 0x04, DEF_STR(Off) ) // 無 PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 有 PORT_DIPNAME( 0x08, 0x00, "Double Up" ) PORT_DIPLOCATION("SW 3:4") // W-BET PORT_DIPSETTING( 0x08, DEF_STR(Off) ) // 無 PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 有 - PORT_DIPNAME( 0x10, 0x00, "Renso Rate" ) PORT_DIPLOCATION("SW 3:5") + PORT_DIPNAME( 0x10, 0x00, "Renso Rate" ) PORT_DIPLOCATION("SW 3:5") // 連荘レート PORT_DIPSETTING( 0x10, DEF_STR(Off) ) // 無 PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 有 PORT_DIPNAME( 0x20, 0x00, "Auto Reach" ) PORT_DIPLOCATION("SW 3:6") // オート・リーチ @@ -3822,7 +3832,7 @@ static INPUT_PORTS_START( tenkai ) PORT_DIPNAME( 0x40, 0x00, "Last Chance" ) PORT_DIPLOCATION("SW 3:7") // ラスト・チャンス PORT_DIPSETTING( 0x40, DEF_STR(Off) ) // 無 PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 有 - PORT_DIPNAME( 0x80, 0x00, "Don Den Key" ) PORT_DIPLOCATION("SW 3:8") + PORT_DIPNAME( 0x80, 0x00, "Don Den Button" ) PORT_DIPLOCATION("SW 3:8") // Don・Den 機能ボタン変更 PORT_DIPSETTING( 0x80, "Start" ) // スタート・ボタ PORT_DIPSETTING( 0x00, "Flip Flop" ) // F/F・ボタン @@ -3862,25 +3872,25 @@ static INPUT_PORTS_START( tenkai ) PORT_DIPSETTING( 0x00, "20" ) PORT_CONDITION("DSW1", 0x03, EQUALS, 0x02) PORT_DIPSETTING( 0x00, "50" ) PORT_CONDITION("DSW1", 0x03, EQUALS, 0x01) PORT_DIPSETTING( 0x00, "100" ) PORT_CONDITION("DSW1", 0x03, EQUALS, 0x00) - PORT_DIPNAME( 0x02, 0x02, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW 1:10") - PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW 1:10") // モニター画面反転 + PORT_DIPSETTING( 0x02, DEF_STR(Off) ) // 通常 + PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 反転 PORT_DIPNAME( 0x04, 0x00, "Computer Strength" ) PORT_DIPLOCATION("SW 2:9") // コンピューターの強さ PORT_DIPSETTING( 0x00, DEF_STR(Normal) ) // 普通 PORT_DIPSETTING( 0x04, "Strong" ) // 強い PORT_DIPNAME( 0x08, 0x00, "Service Count" ) PORT_DIPLOCATION("SW 2:10") // サービス・カウント PORT_DIPSETTING( 0x08, DEF_STR(Off) ) // 無 PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 有 - PORT_DIPNAME( 0x10, 0x10, "Don Den Count" ) PORT_DIPLOCATION("SW 3:9") + PORT_DIPNAME( 0x10, 0x10, "Don Den Count" ) PORT_DIPLOCATION("SW 3:9") // Don・Den 回数 PORT_DIPSETTING( 0x00, "5 times" ) // 5回 PORT_DIPSETTING( 0x10, "8 times" ) // 8回 PORT_DIPNAME( 0x20, 0x00, "Show In-Game Clock" ) PORT_DIPLOCATION("SW 3:10") // ゲーム中の時計表示 PORT_DIPSETTING( 0x20, DEF_STR(No) ) // 無 PORT_DIPSETTING( 0x00, DEF_STR(Yes) ) // 有 - PORT_DIPNAME( 0x40, 0x40, "Game Title" ) PORT_DIPLOCATION("SW 4:9") + PORT_DIPNAME( 0x40, 0x40, "Game Title" ) PORT_DIPLOCATION("SW 4:9") // OFF固定 PORT_DIPSETTING( 0x40, "Mahjong Tenkaigen" ) PORT_DIPSETTING( 0x00, "Mahjong Tenkaigen Part 2" ) - PORT_DIPNAME( 0x80, 0x80, DEF_STR(Unknown) ) PORT_DIPLOCATION("SW 4:10") PORT_CONDITION("DSW4", 0x40, EQUALS, 0x40) + PORT_DIPNAME( 0x80, 0x80, DEF_STR(Unknown) ) PORT_DIPLOCATION("SW 4:10") PORT_CONDITION("DSW4", 0x40, EQUALS, 0x40) // OFF固定 PORT_DIPSETTING( 0x80, DEF_STR(Off) ) PORT_DIPSETTING( 0x00, DEF_STR(On) ) PORT_DIPNAME( 0x80, 0x80, "Show Yakuman Table" ) PORT_DIPLOCATION("SW 4:10") PORT_CONDITION("DSW4", 0x40, EQUALS, 0x00) @@ -3901,6 +3911,51 @@ static INPUT_PORTS_START( tenkai ) INPUT_PORTS_END +INPUT_PORTS_START( ougonhai ) + // The manual provides two sets of standard settings: + // 標準設定 シングル向け 標準設定 コーナー向け + // SW 1 OFF OFF OFF ON ON ON OFF ON ON OFF OFF OFF OFF ON ON ON OFF ON ON OFF + // SW 2 OFF OFF OFF OFF ON ON OFF ON ON ON OFF OFF OFF OFF ON OFF ON ON ON ON + // SW 3 OFF OFF ON ON ON ON OFF OFF OFF OFF OFF ON ON ON ON OFF + // SW 4 OFF ON ON OFF OFF OFF OFF OFF ON ON ON OFF OFF OFF OFF OFF + + PORT_INCLUDE( tenkai ) + + PORT_MODIFY("DSW2") + PORT_DIPNAME( 0x04, 0x00, "Don Den Button" ) PORT_DIPLOCATION("SW 3:3") // Don・Den 機能ボタン変更 + PORT_DIPSETTING( 0x04, "Start" ) // スタート・ボタ + PORT_DIPSETTING( 0x00, "Flip Flop" ) // F/F・ボタン + PORT_DIPNAME( 0x10, 0x00, "Auto Reach" ) PORT_DIPLOCATION("SW 3:5") // オート・リーチ + PORT_DIPSETTING( 0x10, DEF_STR(Off) ) // 無 + PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 有 + PORT_DIPNAME( 0x20, 0x00, "Slot Last Chance" ) PORT_DIPLOCATION("SW 3:6") // スロット ラスト・チャンス + PORT_DIPSETTING( 0x20, DEF_STR(Off) ) // 無 + PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 有 + PORT_DIPNAME( 0x40, 0x40, "Show Yakuman Table" ) PORT_DIPLOCATION("SW 3:7") // 役満ウインポイントの表示 + PORT_DIPSETTING( 0x40, DEF_STR(No) ) // 無 + PORT_DIPSETTING( 0x00, DEF_STR(Yes) ) // 有 + PORT_DIPNAME( 0x80, 0x80, "Gold Rush Payout Rate" ) PORT_DIPLOCATION("SW 3:8") // GOLD RUSH 出率 + PORT_DIPSETTING( 0x80, DEF_STR(Normal) ) // 普通 + PORT_DIPSETTING( 0x00, DEF_STR(High) ) // 多い + + PORT_MODIFY("DSW3") + PORT_DIPNAME( 0x04, 0x00, "Show Renso Gal" ) PORT_DIPLOCATION("SW 4:3") // 連荘ギャル表示 + PORT_DIPSETTING( 0x04, DEF_STR(No) ) // 無 + PORT_DIPSETTING( 0x00, DEF_STR(Yes) ) // 有 + PORT_DIPUNKNOWN_DIPLOC( 0x08, 0x08, "SW 4:4" ) // OFF固定 + PORT_DIPUNKNOWN_DIPLOC( 0x10, 0x10, "SW 4:5" ) // OFF固定 + PORT_DIPUNKNOWN_DIPLOC( 0x20, 0x20, "SW 4:6" ) // OFF固定 + PORT_DIPUNKNOWN_DIPLOC( 0x40, 0x40, "SW 4:7" ) // OFF固定 + PORT_DIPUNKNOWN_DIPLOC( 0x80, 0x80, "SW 4:8" ) // OFF固定 + + PORT_MODIFY("DSW4") + PORT_DIPNAME( 0x08, 0x00, "Renso Rate" ) PORT_DIPLOCATION("SW 2:10") // 連荘レート + PORT_DIPSETTING( 0x08, DEF_STR(Off) ) // 無 + PORT_DIPSETTING( 0x00, DEF_STR(On) ) // 有 + PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED ) +INPUT_PORTS_END + + static INPUT_PORTS_START( mjreach ) PORT_START("DSW0") PORT_DIPNAME( 0x0f, 0x07, "Pay Out Rate" ) @@ -7461,10 +7516,10 @@ GAME( 1991, tenkai2b, tenkai, tenkai, tenkai, dynax_state, empty GAME( 1991, tenkaibb, tenkai, tenkai, tenkai, dynax_state, empty_init, ROT0, "bootleg", "Mahjong Tenkaigen (Japan bootleg b)", MACHINE_SUPPORTS_SAVE ) // FIXME: check if "b" is a PCB rev. letter GAME( 1991, tenkaicb, tenkai, tenkai, tenkai, dynax_state, empty_init, ROT0, "bootleg", "Mahjong Tenkaigen (Japan bootleg c)", MACHINE_SUPPORTS_SAVE ) // FIXME: check if "c" is a PCB rev. letter GAME( 1991, tenkaie, tenkai, tenkai, tenkai, dynax_state, empty_init, ROT0, "Dynax", "Mahjong Tenkaigen (Japan set 2)", MACHINE_SUPPORTS_SAVE ) -GAME( 1991, ougonhai, 0, ougonhai, tenkai, dynax_state, empty_init, ROT0, "Dynax", "Mahjong Ougon no Hai (Japan)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // FIXME: correct TMP90840 hookup, confirm being a medal game as well -GAME( 1991, ougonhaib1, ougonhai, ougonhaib1, tenkai, dynax_state, empty_init, ROT0, "bootleg", "Mahjong Ougon no Hai (Japan bootleg set 1, medal)", MACHINE_SUPPORTS_SAVE ) -GAME( 1991, ougonhaib2, ougonhai, ougonhaib1, tenkai, dynax_state, empty_init, ROT0, "bootleg", "Mahjong Ougon no Hai (Japan bootleg set 2, medal)", MACHINE_SUPPORTS_SAVE ) -GAME( 1991, ougonhaib3, ougonhai, ougonhaib1, tenkai, dynax_state, empty_init, ROT0, "bootleg", "Mahjong Ougon no Hai (Japan bootleg set 3, medal)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) +GAME( 1991, ougonhai, 0, ougonhai, ougonhai, dynax_state, empty_init, ROT0, "Dynax", "Mahjong Ougon no Hai (Japan)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // FIXME: correct TMP90840 hookup, confirm being a medal game as well +GAME( 1991, ougonhaib1, ougonhai, ougonhaib1, ougonhai, dynax_state, empty_init, ROT0, "bootleg", "Mahjong Ougon no Hai (Japan bootleg set 1, medal)", MACHINE_SUPPORTS_SAVE ) +GAME( 1991, ougonhaib2, ougonhai, ougonhaib1, ougonhai, dynax_state, empty_init, ROT0, "bootleg", "Mahjong Ougon no Hai (Japan bootleg set 2, medal)", MACHINE_SUPPORTS_SAVE ) +GAME( 1991, ougonhaib3, ougonhai, ougonhaib1, ougonhai, dynax_state, empty_init, ROT0, "bootleg", "Mahjong Ougon no Hai (Japan bootleg set 3, medal)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) GAME( 1994, mjreach, 0, mjreach, mjreach, dynax_state, empty_init, ROT0, "Dynax", "Mahjong Reach (Ver. 1.00)", MACHINE_SUPPORTS_SAVE ) GAME( 1994, mjreachbl, mjreach, mjreach, mjreach, dynax_state, empty_init, ROT0, "bootleg", "Mahjong Reach (Ver. 1.00, bootleg)", MACHINE_SUPPORTS_SAVE ) GAME( 1994, mjreachp2, mjreach, mjreachp2, mjreach, dynax_state, empty_init, ROT0, "Dynax", "Mahjong Reach Part II (Ver. D88)", MACHINE_SUPPORTS_SAVE ) From 878d70d975c8ccd97c0fea9890195dbd937c9a86 Mon Sep 17 00:00:00 2001 From: Ivan Vangelista Date: Tue, 12 Nov 2024 21:07:35 +0100 Subject: [PATCH 11/19] New systems marked not working ------------------------------ Tangram Q [system11, buffi, rtw, f205v, Sean Sutton, Smitdogg, The Dumping Union] --- src/mame/mame.lst | 1 + src/mame/nichibutsu/cclimber.cpp | 195 ++++++++++++++++++++++++++++++- src/mame/nichibutsu/cclimber.h | 3 + src/mame/upl/mouser.cpp | 2 + 4 files changed, 200 insertions(+), 1 deletion(-) diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 2c223856efc..145740f1c0f 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -34196,6 +34196,7 @@ silvland // Falcon swimmer // (c) 1982 Tehkan swimmera // (c) 1982 Tehkan swimmerb // (c) 1982 Tehkan +tangramq // (c) 1983 SNK toprollr // (c) 1983 Jaleco yamato // (c) 1983 Sega yamato2 // (c) 1983 Sega diff --git a/src/mame/nichibutsu/cclimber.cpp b/src/mame/nichibutsu/cclimber.cpp index caef959b8ee..4d44d535caa 100644 --- a/src/mame/nichibutsu/cclimber.cpp +++ b/src/mame/nichibutsu/cclimber.cpp @@ -240,15 +240,22 @@ Dip location verified from manual for: cclimber, guzzler, swimmer this causes them to crash after the a few rounds - confirmed on an original PCB. They clearly weren't tested properly by the bootleggers. + Tangram Q + --------- + Inputs aren't correct, sound tempo is wrong (NMI ack problem?) + ***************************************************************************/ #include "emu.h" + #include "cclimber.h" #include "cclimber_a.h" #include "cpu/z80/z80.h" #include "sound/ay8910.h" #include "sound/samples.h" +#include "sound/snkwave.h" + #include "speaker.h" @@ -497,6 +504,27 @@ void cclimber_state::bagmanf_map(address_map &map) map(0xb800, 0xb800).nopr(); } +void cclimber_state::tangramq_map(address_map &map) +{ + map(0x0000, 0x5fff).rom(); + map(0x6000, 0x6bff).ram(); + map(0x8000, 0x8000).portr("P1"); + map(0x8020, 0x8020).portr("P2"); + map(0x8800, 0x88ff).ram().share("bigspriteram"); + map(0x9000, 0x93ff).mirror(0x0400).ram().share("videoram"); + map(0x9800, 0x981f).ram().share("column_scroll"); + map(0x9820, 0x987f).ram(); // not used, but initialized + map(0x9880, 0x989f).ram().share("spriteram"); + map(0x98a0, 0x98db).ram(); // not used, but initialized + map(0x98dc, 0x98df).ram().share("bigspritectrl"); + map(0x98e0, 0x98ff).ram(); // not used, but initialized + map(0x9c00, 0x9fff).ram().w(FUNC(cclimber_state::cclimber_colorram_w)).share("colorram"); + map(0xa000, 0xa000).portr("P3"); + map(0xa000, 0xa007).w(m_mainlatch, FUNC(ls259_device::write_d0)); + map(0xb000, 0xb000).portr("DSW").w("soundlatch", FUNC(generic_latch_8_device::write)); + map(0xb800, 0xb800).portr("SYSTEM"); +} + void toprollr_state::toprollr_decrypted_opcodes_map(address_map &map) { map(0x0000, 0x5fff).bankr("bank1d"); @@ -557,6 +585,17 @@ void yamato_state::yamato_audio_portmap(address_map &map) map(0x08, 0x08).r(FUNC(yamato_state::yamato_p1_r)); // ??? } +void cclimber_state::tangramq_sound_map(address_map &map) +{ + map(0x0000, 0x1fff).rom(); + map(0x4000, 0x4000).r("soundlatch", FUNC(generic_latch_8_device::read)); + map(0x8000, 0x8001).w("ay1", FUNC(ay8910_device::address_data_w)); + map(0x8002, 0x8007).w("wave", FUNC(snkwave_device::snkwave_w)); + map(0x8008, 0x8009).w("ay2", FUNC(ay8910_device::address_data_w)); + // map(0xa000, 0xa000) // TODO: NMI related? + map(0xe000, 0xe3ff).ram(); +} + static INPUT_PORTS_START( cclimber ) PORT_START("P1") @@ -800,6 +839,89 @@ static INPUT_PORTS_START( rpatrol ) PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED ) INPUT_PORTS_END +static INPUT_PORTS_START( tangramq ) + PORT_START("P1") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START2 ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START1 ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START("P2") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START("P3") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) // this drops the piece + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) // pressing this one and the following together rotates pieces + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START("DSW") + PORT_DIPNAME( 0x01, 0x00, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:1") + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x01, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x00, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:2") + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x02, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x00, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:3") + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x04, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, "Invincibility" ) PORT_DIPLOCATION("DSW1:4") + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x00, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:5") + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x10, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x00, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:6") + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x20, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:7") + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x40, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:8") + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x80, DEF_STR( On ) ) + + PORT_START("SYSTEM") + PORT_DIPNAME( 0x03, 0x00, DEF_STR( Lives ) ) PORT_DIPLOCATION("DSW2:1,2") + PORT_DIPSETTING( 0x00, "1" ) + PORT_DIPSETTING( 0x01, "2" ) + PORT_DIPSETTING( 0x02, "3" ) + PORT_DIPSETTING( 0x03, "5" ) + PORT_DIPNAME( 0x04, 0x04, "Freeze" ) PORT_DIPLOCATION("DSW2:3") + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("DSW2:4") + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x08, DEF_STR( On ) ) + PORT_DIPNAME( 0x70, 0x00, DEF_STR( Coinage ) ) PORT_DIPLOCATION("DSW2:5,6,7") + PORT_DIPSETTING( 0x70, DEF_STR( 4C_1C ) ) + PORT_DIPSETTING( 0x60, DEF_STR( 3C_1C ) ) + PORT_DIPSETTING( 0x50, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x10, DEF_STR( 1C_2C ) ) + PORT_DIPSETTING( 0x20, DEF_STR( 1C_3C ) ) + PORT_DIPSETTING( 0x30, DEF_STR( 1C_5C ) ) + PORT_DIPSETTING( 0x40, DEF_STR( 1C_6C ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("DSW2:8") + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) +INPUT_PORTS_END + static INPUT_PORTS_START( swimmer ) PORT_START("P1") PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_8WAY @@ -1204,7 +1326,6 @@ void cclimber_state::root(machine_config &config) // basic machine hardware Z80(config, m_maincpu, 18.432_MHz_XTAL/3/2); // 3.072 MHz m_maincpu->set_addrmap(AS_PROGRAM, &cclimber_state::cclimber_map); - m_maincpu->set_addrmap(AS_IO, &cclimber_state::cclimber_portmap); LS259(config, m_mainlatch, 0); m_mainlatch->q_out_cb<0>().set(FUNC(cclimber_state::nmi_mask_w)); @@ -1230,6 +1351,8 @@ void cclimber_state::cclimber(machine_config &config) { root(config); + m_maincpu->set_addrmap(AS_IO, &cclimber_state::cclimber_portmap); + // 7J on CCG-1 m_mainlatch->q_out_cb<4>().set("cclimber_audio", FUNC(cclimber_audio_device::sample_trigger)); @@ -1250,6 +1373,29 @@ void cclimber_state::rpatrol(machine_config &config) AY8910(config, "aysnd", 18.432_MHz_XTAL/3/2/2).add_route(ALL_OUTPUTS, "speaker", 0.5); } +void cclimber_state::tangramq(machine_config &config) +{ + root(config); + + m_maincpu->set_addrmap(AS_PROGRAM, &cclimber_state::tangramq_map); + + Z80(config, m_audiocpu, 8_MHz_XTAL / 2); // divider not verified + m_audiocpu->set_addrmap(AS_PROGRAM, &cclimber_state::tangramq_sound_map); + + m_screen->screen_vblank().append_inputline(m_audiocpu, INPUT_LINE_NMI); // TODO: probably wrong + + // sound hardware + SPEAKER(config, "speaker").front_center(); + + GENERIC_LATCH_8(config, "soundlatch").data_pending_callback().set_inputline(m_audiocpu, 0, HOLD_LINE); + + AY8910(config, "ay1", 8_MHz_XTAL / 4).add_route(ALL_OUTPUTS, "speaker", 0.35); // divider not verified + + AY8910(config, "ay2", 8_MHz_XTAL / 4).add_route(ALL_OUTPUTS, "speaker", 0.35); // divider not verified + + SNKWAVE(config, "wave", 8_MHz_XTAL).add_route(ALL_OUTPUTS, "speaker", 0.30); // lack of divider not verified +} + void cclimber_state::cclimberx(machine_config &config) { cclimber(config); @@ -2385,6 +2531,51 @@ ROM_START( silvland ) ROM_END +/* +Tangram Q + +SNK ELECTRONICS A3002 UC01 + A2003UP03-01 PCBs + +A3002 UC01 main components: +NEC D780C-1 CPU +18.432 MHz XTAL +2x HM6116LP-3 RAM (near program ROMs) +6x TMM315D-1 SRAM (near CPU) +2x M5L5101LP-1 RAM (near BG ROMs) +2x bank of 8 DIP switches +lots of TTL + +A2003UP03-01 main components: +NEC D780C-1 CPU +2x AY-3-8910 sound chip +8 MHz XTAL +HM6116P-4 RAM +lots of TTL +*/ + +ROM_START(tangramq) + ROM_REGION( 0x6000, "maincpu", 0 ) + ROM_LOAD( "m1.k5", 0x0000, 0x2000, CRC(dff92169) SHA1(805784afeba676306ed6c0d41d33ed0163bdc08e) ) + ROM_LOAD( "m2.k4", 0x2000, 0x2000, CRC(1cbade75) SHA1(1fa276261428c392917df4a4dbd9f99710b9855e) ) + + ROM_REGION( 0x2000, "audiocpu", 0 ) + ROM_LOAD( "s1.a6", 0x0000, 0x2000, CRC(05af38f6) SHA1(7bdbf798964aa4d603fca0178b3f8fc251d207f6) ) + + ROM_REGION( 0x2000, "bigsprite", 0 ) + ROM_LOAD( "b1.e19", 0x0000, 0x1000, CRC(f3ec2562) SHA1(859473c45b9d22c138b70ea649b93d41721e1e0d) ) // 1xxxxxxxxxxx = 0xFF + ROM_LOAD( "b2.e17", 0x1000, 0x1000, CRC(77d21b84) SHA1(7f9bfbfbc7fd51a97f15fee54ac851ddfa97b213) ) // 1xxxxxxxxxxx = 0xFF + + ROM_REGION( 0x4000, "tile", 0 ) + ROM_LOAD( "f1.h4", 0x0000, 0x2000, CRC(c7c3ffe1) SHA1(f8f0ac3b73f560af3ef0954e5d80984bad605ea2) ) + ROM_LOAD( "f2.h2", 0x2000, 0x2000, CRC(dbc13c1f) SHA1(b299582f97a384b2d252d815a3c64e9f54346748) ) + + ROM_REGION( 0x60, "proms", 0 ) + ROM_LOAD( "mb7051_m02.m6", 0x00, 0x20, CRC(b3fc1505) SHA1(5b94adde0428a26b815c7eb9b3f3716470d349c7) ) + ROM_LOAD( "mb7051_m02.m7", 0x20, 0x20, CRC(26aada9e) SHA1(f59645e606ea4f0dd0fc4ea47dd03f526c534941) ) + ROM_LOAD( "mb7051_m02.m8", 0x40, 0x20, CRC(676b3166) SHA1(29b9434cd34d43ea5664e436e2a24b54f8d88aac) ) +ROM_END + + /* This dump was a mess. 11n and 11k seem to be bad dumps, the second half should probably be sprite data Comparing to set 2 11l and 11h are unnecessary, and are actually from Le Bagnard(set1), as is 5m. 5n ID'd as unknown, but it also is from bagnard with some patches. @@ -2933,6 +3124,8 @@ GAME( 1981, rpatroln, rpatrol, rpatrol, rpatrol, cclimber_state, empty_i GAME( 1981, rpatrolb, rpatrol, rpatrol, rpatrol, cclimber_state, empty_init, ROT0, "bootleg", "River Patrol (bootleg)", MACHINE_SUPPORTS_SAVE ) GAME( 1981, silvland, rpatrol, rpatrol, rpatrol, cclimber_state, empty_init, ROT0, "Falcon", "Silver Land (hack of River Patrol)", MACHINE_SUPPORTS_SAVE ) +GAME( 1983, tangramq, 0, tangramq, tangramq, cclimber_state, empty_init, ROT270, "SNK", "Tangram Q", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) + // see pacman.cpp for parent GAME( 1985, cannonb, cannonbp, cannonb, cannonb, cclimber_state, init_cannonb, ROT90, "bootleg (Soft)", "Cannon Ball (bootleg on Crazy Kong hardware) (set 1, buggy)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) // bootleggers missed protection after bonus game GAME( 1985, cannonb2, cannonbp, cannonb, cannonb, cclimber_state, init_cannonb2, ROT90, "bootleg (TV Game Gruenberg)", "Cannon Ball (bootleg on Crazy Kong hardware) (set 2, buggy)", MACHINE_SUPPORTS_SAVE ) // bootleggers missed protection after bonus game diff --git a/src/mame/nichibutsu/cclimber.h b/src/mame/nichibutsu/cclimber.h index d03748a10cf..51756076229 100644 --- a/src/mame/nichibutsu/cclimber.h +++ b/src/mame/nichibutsu/cclimber.h @@ -48,6 +48,7 @@ class cclimber_state : public driver_device void cclimberx(machine_config &config); void ckongb(machine_config &config); void rpatrol(machine_config &config); + void tangramq(machine_config &config); protected: virtual void machine_start() override ATTR_COLD; @@ -112,6 +113,8 @@ class cclimber_state : public driver_device void decrypted_opcodes_map(address_map &map) ATTR_COLD; void rpatrol_map(address_map &map) ATTR_COLD; void rpatrol_portmap(address_map &map) ATTR_COLD; + void tangramq_map(address_map &map) ATTR_COLD; + void tangramq_sound_map(address_map &map) ATTR_COLD; }; class swimmer_state : public cclimber_state diff --git a/src/mame/upl/mouser.cpp b/src/mame/upl/mouser.cpp index 1db22915d1d..0ab11da4cb8 100644 --- a/src/mame/upl/mouser.cpp +++ b/src/mame/upl/mouser.cpp @@ -6,6 +6,8 @@ Driver by Frank Palazzolo (palazzol@comcast.net) + Hardware is extremely similar to nichibutsu/cclimber.cpp (possibly derived) + - This driver was done with only flyer shots to go by. - Colors are a good guess (might be perfect) - Clock and interrupt speeds for the sound CPU is a guess, but seem From d566c8f76baceeff7c1a83fdb7fa0feede95b9cf Mon Sep 17 00:00:00 2001 From: angelosa Date: Tue, 12 Nov 2024 21:23:03 +0100 Subject: [PATCH 12/19] cbus/pc9801_86.cpp: attempt to resolve DAC FIFO under/overflows --- src/devices/bus/cbus/pc9801_86.cpp | 84 ++++++++++++++++++------------ src/devices/bus/cbus/pc9801_86.h | 5 ++ 2 files changed, 56 insertions(+), 33 deletions(-) diff --git a/src/devices/bus/cbus/pc9801_86.cpp b/src/devices/bus/cbus/pc9801_86.cpp index 92ccce8bbee..131ad785ac6 100644 --- a/src/devices/bus/cbus/pc9801_86.cpp +++ b/src/devices/bus/cbus/pc9801_86.cpp @@ -2,32 +2,33 @@ // copyright-holders:Angelo Salese /************************************************************************************************** - NEC PC-9801-86 sound card - NEC PC-9801-SpeakBoard sound card - Mad Factory Otomi-chan Kai sound card - - Similar to PC-9801-26, this one has YM2608 instead of YM2203 and an - additional DAC port - - SpeakBoard sound card seems to be derived design from -86, with an additional - OPNA mapped at 0x58* - - Otomi-chan Kai is a doujinshi sound card based off SpeakBoard design. - It uses YM3438 OPL2C mapped at 0x78*, and anything that uses the nax.exe sound driver - expects this to be installed as default (cfr. datsumj). - To fallback to a regular -26/-86 board user needs to add parameter switches "-2" or "-3" - respectively, cfr. "nax -?" for additional details. - - TODO: - - Test all pcm modes; - - Make volume work; - - Recording; - - SpeakBoard: no idea about software that uses this, also board shows a single YM2608B? - "-86 only supports ADPCM instead of PCM, while SpeakBoard has OPNA + 256 Kbit RAM"; - - Otomi-chan Kai: find a manual (マニュアル), it's mentioned with nax usage. - Very low-res scan of the PCB sports a 4-bit dip-sw bank at very least; - - Otomi-chan Kai: unknown ID port readback; - - verify sound irq; +NEC PC-9801-86 sound card +NEC PC-9801-SpeakBoard sound card +Mad Factory Otomi-chan Kai sound card + +Similar to PC-9801-26, this one has YM2608 instead of YM2203 and an +additional DAC port + +SpeakBoard sound card seems to be derived design from -86, with an additional +OPNA mapped at 0x58* + +Otomi-chan Kai is a doujinshi sound card based off SpeakBoard design. +It uses YM3438 OPL2C mapped at 0x78*, and anything that uses the nax.exe sound driver +expects this to be installed as default (cfr. datsumj). +To fallback to a regular -26/-86 board user needs to add parameter switches "-2" or "-3" +respectively, cfr. "nax -?" for additional details. + +TODO: +- Test all pcm modes; +- Fix PCM overflow bug properly (CPUENB signal yield host CPU until DAC catches up?) +- Make volume work; +- Recording; +- SpeakBoard: no idea about software that uses this, also board shows a single YM2608B? + "-86 only supports ADPCM instead of PCM, while SpeakBoard has OPNA + 256 Kbit RAM"; +- Otomi-chan Kai: find a manual (マニュアル), it's mentioned with nax usage. + Very low-res scan of the PCB sports a 4-bit dip-sw bank at very least; +- Otomi-chan Kai: unknown ID port readback; +- verify sound irq; **************************************************************************************************/ @@ -368,14 +369,21 @@ void pc9801_86_device::io_map(address_map &map) return 0; }), NAME([this] (u8 data) { + // HACK: on overflow make sure to single step the FIFO enough to claim some space back + // os2warp3 initializes the full buffer with 0x00 then quickly pretends + // that DAC already catched up by the time the actual startup/shutdown chimes are sent. + if (queue_count() == QUEUE_SIZE) + { + dac_transfer(); + logerror("Warning: $a46c write with FIFO overflow %02x\n", m_pcm_mode); + } + if(queue_count() < QUEUE_SIZE) { m_queue[m_head++] = data; m_head %= QUEUE_SIZE; m_count++; } - // TODO: what should happen on overflow? - // os2warp3 startup / shutdown chimes do this already }) ); } @@ -424,12 +432,8 @@ u8 pc9801_86_device::queue_pop() return ret; } -TIMER_CALLBACK_MEMBER(pc9801_86_device::dac_tick) +void pc9801_86_device::dac_transfer() { - m_pcm_clk = !m_pcm_clk; - if((m_pcm_ctrl & 0x40) || !(m_pcm_ctrl & 0x80)) - return; - switch(m_pcm_mode & 0x70) { case 0x70: // 8bit stereo @@ -461,6 +465,20 @@ TIMER_CALLBACK_MEMBER(pc9801_86_device::dac_tick) m_rdac->write(rsample); } break; } +} + +TIMER_CALLBACK_MEMBER(pc9801_86_device::dac_tick) +{ + m_pcm_clk = !m_pcm_clk; + if((m_pcm_ctrl & 0x40) || !(m_pcm_ctrl & 0x80)) + return; + + // TODO: verify underflow + // should leave the DACs in whatever state they are or ...? + if (!queue_count()) + return; + + dac_transfer(); if((queue_count() < m_irq_rate) && (m_pcm_ctrl & 0x20)) { m_pcmirq = true; diff --git a/src/devices/bus/cbus/pc9801_86.h b/src/devices/bus/cbus/pc9801_86.h index 991559d5327..64a2516bb8d 100644 --- a/src/devices/bus/cbus/pc9801_86.h +++ b/src/devices/bus/cbus/pc9801_86.h @@ -31,6 +31,9 @@ class pc9801_86_device : public pc9801_snd_device pc9801_86_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); pc9801_86_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); + static constexpr feature_type unemulated_features() { return feature::MICROPHONE; } + static constexpr feature_type imperfect_features() { return feature::SOUND; } + protected: void io_map(address_map &map) ATTR_COLD; u8 pcm_control_r(); @@ -74,6 +77,8 @@ class pc9801_86_device : public pc9801_snd_device required_device m_rdac; std::vector m_queue; emu_timer *m_dac_timer; + + void dac_transfer(); }; class pc9801_speakboard_device : public pc9801_86_device From 0def2f0ec4d7785f001c601fdb48ecdb0994a2e1 Mon Sep 17 00:00:00 2001 From: Ivan Vangelista Date: Tue, 12 Nov 2024 21:25:46 +0100 Subject: [PATCH 13/19] New working clones ------------------ Lode Runner III - Majin no Fukkatsu (Japan, rev. C) [Kebrank] --- src/mame/irem/m62.cpp | 45 +++++++++++++++++++++++++++++++++++++++++-- src/mame/mame.lst | 1 + 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/src/mame/irem/m62.cpp b/src/mame/irem/m62.cpp index 9af8d00183e..9407cc0174b 100644 --- a/src/mame/irem/m62.cpp +++ b/src/mame/irem/m62.cpp @@ -1687,6 +1687,46 @@ ROM_START( ldrun3j ) ROM_LOAD( "lr3-b-6f", 0x000, 0x100, CRC(34d88d3c) SHA1(727f4c5cfff33538886fa0a29fd119aa085d7008) ) // video timing - common to the other games ROM_END +ROM_START( ldrun3jc ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "lr3-a-4e-c", 0x0000, 0x4000, CRC(9cdd7c9f) SHA1(355b0b31947ac0a6c87d013384c151e1555ccd11) ) + ROM_LOAD( "lr3-a-4d-c", 0x4000, 0x4000, CRC(858b339f) SHA1(9f879eec5153ed8d777faa650394c546e91aa1d0) ) + ROM_LOAD( "lr3-a-4b-c", 0x8000, 0x4000, CRC(63052776) SHA1(59e887304ca3921a97bb98551d40b4e5e4396f26) ) + + ROM_REGION( 0x10000, "irem_audio:iremsound", 0 ) // 64k for the audio CPU (6803) + ROM_LOAD( "lr3-a-3d", 0x8000, 0x4000, CRC(28be68cd) SHA1(1e48cdf649bc861066fbef0293466091092045f3) ) + ROM_LOAD( "lr3-a-3f", 0xc000, 0x4000, CRC(cb7186b7) SHA1(cc99821f3f1523523598e4b7d68b95eee6c84e69) ) + + ROM_REGION( 0xc000, "gfx1", 0 ) + ROM_LOAD( "lr3-n-2a", 0x00000, 0x4000, CRC(f9b74dee) SHA1(f4407024aea05d0c698f8a7a6a20cbbcbd8baf44) ) // characters + ROM_LOAD( "lr3-n-2c", 0x04000, 0x4000, CRC(fef707ba) SHA1(ff6e64eeda6a9be672a1b8778a051886c38bd8f6) ) + ROM_LOAD( "lr3-n-2b", 0x08000, 0x4000, CRC(af3d27b9) SHA1(2eda0bf7ffd7bcb7b7dcd2ffb1482f748ee2edfc) ) + + ROM_REGION( 0xc000, "gfx2", 0 ) + ROM_LOAD( "lr3-b-4k", 0x00000, 0x4000, CRC(63f070c7) SHA1(beeb13dbba228827cf18e4c23deac041acbb2903) ) // sprites + ROM_LOAD( "lr3-b-3n", 0x04000, 0x4000, CRC(eab7ad91) SHA1(c4e8dec38f6df27c0309172232aa8056be7982c4) ) + ROM_LOAD( "lr3-b-4c", 0x08000, 0x4000, CRC(1a460a46) SHA1(2f9e85ab45e8ec7a08edb9c1f82bce694cc2bc99) ) + + ROM_REGION( 0x100, "proms", 0 ) + ROM_LOAD( "lr3-n-4f", 0x000, 0x100, CRC(df674be9) SHA1(4d8c5378234bc24fac62dc227d8cd72f1ab7a35c) ) // unknown + + ROM_REGION( 0x20, "spr_height_prom", 0 ) + ROM_LOAD( "lr3-b-5p", 0x00, 0x20, CRC(e01f69e2) SHA1(0d00ef348025ea4a9c274a7e3dbb006217d8449d) ) // sprite height, one entry per 32 + + ROM_REGION( 0x300, "spr_color_proms", 0 ) + ROM_LOAD( "lr3-b-1m", 0x0000, 0x0100, CRC(f02d7167) SHA1(385a9179143e3dcccd7052e70c7cc71473caaaca) ) // sprite palette red component + ROM_LOAD( "lr3-b-1n", 0x0100, 0x0100, CRC(9e37f181) SHA1(8e36eb8f4aefcc6d21dfbb2e86dcb4875bcf82cd) ) // sprite palette green component + ROM_LOAD( "lr3-b-1l", 0x0200, 0x0100, CRC(5b11c41d) SHA1(186ca7bfa2894311fc573f3f5882da677e029f2a) ) // sprite palette blue component + + ROM_REGION( 0x300, "chr_color_proms", 0 ) + ROM_LOAD( "lr3-n-2l", 0x0000, 0x0100, CRC(e880b86b) SHA1(3934f37dc45b725af1c7d862086249256366d572) ) // character palette red component + ROM_LOAD( "lr3-n-2k", 0x0100, 0x0100, CRC(047ee051) SHA1(7c18a223d37ccc5fea20f8f856fba20335c75ea4) ) // character palette green component + ROM_LOAD( "lr3-n-2m", 0x0200, 0x0100, CRC(69ad8678) SHA1(96134aa530cb93a5e3b56fffa996aefa08a666a2) ) // character palette blue component + + ROM_REGION( 0x100, "timing", 0 ) + ROM_LOAD( "lr3-b-6f", 0x000, 0x100, CRC(34d88d3c) SHA1(727f4c5cfff33538886fa0a29fd119aa085d7008) ) // video timing - common to the other games +ROM_END + ROM_START( ldrun4 ) ROM_REGION( 0x18000, "maincpu", 0 ) // 64k for code + 32k for banked ROM ROM_LOAD( "lr4-a-4e", 0x00000, 0x4000, CRC(5383e9bf) SHA1(01f6f76b768107b389d7240bd15a5e0720defcb6) ) @@ -2427,8 +2467,9 @@ GAME( 1984, ldruna, ldrun, ldrun, ldrun, m62_state, empty_init, R GAME( 1984, ldrun2, 0, ldrun2, ldrun2, m62_state, init_ldrun2, ROT0, "Irem (licensed from Broderbund)", "Lode Runner II - The Bungeling Strikes Back", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) // Japanese version is called Bangeringu Teikoku no Gyakushuu -GAME( 1985, ldrun3, 0, ldrun3, ldrun3, m62_state, empty_init, ROT0, "Irem (licensed from Broderbund)", "Lode Runner III - The Golden Labyrinth", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) -GAME( 1985, ldrun3j, ldrun3, ldrun3, ldrun3, m62_state, empty_init, ROT0, "Irem (licensed from Broderbund)", "Lode Runner III - Majin no Fukkatsu (Japan)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) +GAME( 1985, ldrun3, 0, ldrun3, ldrun3, m62_state, empty_init, ROT0, "Irem (licensed from Broderbund)", "Lode Runner III - The Golden Labyrinth", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) +GAME( 1985, ldrun3j, ldrun3, ldrun3, ldrun3, m62_state, empty_init, ROT0, "Irem (licensed from Broderbund)", "Lode Runner III - Majin no Fukkatsu (Japan, rev. A)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) +GAME( 1985, ldrun3jc, ldrun3, ldrun3, ldrun3, m62_state, empty_init, ROT0, "Irem (licensed from Broderbund)", "Lode Runner III - Majin no Fukkatsu (Japan, rev. C)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) GAME( 1986, ldrun4, 0, ldrun4, ldrun4, m62_state, init_ldrun4, ROT0, "Irem (licensed from Broderbund)", "Lode Runner IV - Teikoku Karano Dasshutsu (Japan)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 145740f1c0f..4af95b8fd71 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -21469,6 +21469,7 @@ ldrun // (c) 1984 licensed from Broderbund ldrun2 // (c) 1984 licensed from Broderbund ldrun3 // (c) 1985 licensed from Broderbund ldrun3j // (c) 1985 licensed from Broderbund +ldrun3jc // (c) 1985 licensed from Broderbund ldrun4 // (c) 1986 licensed from Broderbund ldruna // (c) 1984 licensed from Broderbund lithero // bootleg From a58bc25fbcb79e8467c1d5b4959ed62ff55bcb7d Mon Sep 17 00:00:00 2001 From: Ivan Vangelista Date: Tue, 12 Nov 2024 21:47:40 +0100 Subject: [PATCH 14/19] New working clones ------------------ Carnival (ManilaMatic bootleg) [trol] --- src/mame/mame.lst | 1 + src/mame/sega/vicdual.cpp | 30 ++++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 4af95b8fd71..8d13cc48ba2 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -41114,6 +41114,7 @@ carnivalc // 501-516 (c) 1980 Sega carnivalca // 479-494 (c) 1980 Sega carnivalh // carnivalha // +carnivalmm // depthch // 50-55 [1977 Gremlin?] depthcho // ? [1977 Gremlin?] digger // 684-691 no copyright notice diff --git a/src/mame/sega/vicdual.cpp b/src/mame/sega/vicdual.cpp index d1a2d45043e..73ae85273ce 100644 --- a/src/mame/sega/vicdual.cpp +++ b/src/mame/sega/vicdual.cpp @@ -4538,6 +4538,35 @@ ROM_START( carnivalha ) ROM_LOAD( "316-042.u66", 0x0020, 0x0020, CRC(a1506b9d) SHA1(037c3db2ea40eca459e8acba9d1506dd28d72d10) ) /* sequence PROM */ ROM_END +ROM_START( carnivalmm ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "16mm.u33", 0x0000, 0x0400, CRC(0230bd0a) SHA1(1f5ae709e4cc86b8e682401b2d82b31eb45b41d5) ) + ROM_LOAD( "15mm.u32", 0x0400, 0x0400, CRC(a1f58beb) SHA1(e027beca7bf3ef5ef67e2195f909332fd194b5dc) ) + ROM_LOAD( "14mm.u31", 0x0800, 0x0400, CRC(67b17922) SHA1(46cdfd0371dec61a5440c2111660729c0f0ecdb8) ) + ROM_LOAD( "13mm.u30", 0x0c00, 0x0400, CRC(befb09a5) SHA1(da44b6a869b5eb0705e01fee4478696f6bef9de8) ) + ROM_LOAD( "12mm.u29", 0x1000, 0x0400, CRC(b5230913) SHA1(0db699e40c35da113f9301cedcd958d765699aac) ) + ROM_LOAD( "11mm.u28", 0x1400, 0x0400, CRC(53040332) SHA1(ff7a06d93cb890abf0616770774668396d128ba3) ) + ROM_LOAD( "10mm.u27", 0x1800, 0x0400, CRC(a3b9c2db) SHA1(2893fae8c2aeab2a68297bf1f2c3022ff98dca95) ) + ROM_LOAD( "9mm.u26", 0x1c00, 0x0400, CRC(fcc3854e) SHA1(7adbd6ca6f636dec75fa6eccdf3381686e074bc6) ) + ROM_LOAD( "8mm.u8", 0x2000, 0x0400, CRC(28be8d69) SHA1(2d9ac9a53f00fe2282e4317585e6bddadb676c0f) ) + ROM_LOAD( "7mm.u7", 0x2400, 0x0400, CRC(3873ccdb) SHA1(56be81fdee8947758ba966915c0739e5560a7f94) ) + ROM_LOAD( "6mm.u6", 0x2800, 0x0400, CRC(d9a96dff) SHA1(0366acf3418901bfeeda59d4cd51fe8ceaad4577) ) + ROM_LOAD( "5mm.u5", 0x2c00, 0x0400, CRC(d893ca72) SHA1(564176ab7f3757d51db8eef9fbc4228fa2ce328f) ) + ROM_LOAD( "4mm.u4", 0x3000, 0x0400, CRC(df8c63c5) SHA1(e8d0632b5cb5bd7f698485531f3edeb13efdc685) ) + ROM_LOAD( "3mm.u3", 0x3400, 0x0400, CRC(689a73e8) SHA1(b4134e8d892df7ba3352e4d3f581923decae6e54) ) + ROM_LOAD( "2mm.u2", 0x3800, 0x0400, CRC(b94ef7ab) SHA1(8079e0f97688817d2f6ed5810aa1501dc09585d6) ) + ROM_LOAD( "1mm.u1", 0x3c00, 0x0400, CRC(6e10c057) SHA1(743a28bb6f4f395fd3db36d5e40acc3475f55f5d) ) + + ROM_REGION( 0x0020, "proms", 0 ) + ROM_LOAD( "mmi6331.u4", 0x0000, 0x0020, CRC(f0084d80) SHA1(95ec912ac2c64cd58a50c68afc0993746841a531) ) + + ROM_REGION( 0x0400, "audiocpu", 0 ) + ROM_LOAD( "sound.u25", 0x0000, 0x0400, CRC(0dbaa2b0) SHA1(eae7fc362a0ff8f908c42e093c7dbb603659373c) ) + + ROM_REGION( 0x0020, "user1", 0 ) /* timing PROM */ + ROM_LOAD( "mmi6331.u14", 0x0000, 0x0020, CRC(9617d796) SHA1(7cff2741866095ff42eadd8022bea349ec8d2f39) ) +ROM_END + ROM_START( verbena ) ROM_REGION( 0x10000, "maincpu", 0 ) // all 2708s ROM_LOAD( "16v.u33", 0x0000, 0x0400, CRC(a47a1c54) SHA1(1c8944c24b6eb1d35b778dc7448466f1c5be484e) ) // handwritten label @@ -4999,6 +5028,7 @@ GAME( 1980, carnivalc, carnival, carnival, carnivalc, carnival_state, empty_i GAME( 1980, carnivalca, carnival, carnival, carnivalc, carnival_state, empty_init, ROT270, "Sega", "Carnival (cocktail, earlier)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) // one missing ROM GAME( 1980, carnivalh, carnival, carnivalh, carnivalh, carnivalh_state, empty_init, ROT270, "Sega", "Carnival (Head On hardware, set 1)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) GAME( 1980, carnivalha, carnival, carnivalh, carnivalh, carnivalh_state, empty_init, ROT270, "Sega", "Carnival (Head On hardware, set 2)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) +GAME( 1980, carnivalmm, carnival, carnival, carnival, carnival_state, empty_init, ROT270, "bootleg (ManilaMatic)", "Carnival (ManilaMatic bootleg)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) GAME( 1980, verbena, carnival, carnival, carnival, carnival_state, empty_init, ROT270, "bootleg (Cocamatic)", "Verbena (bootleg of Carnival)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) GAME( 1981, brdrline, 0, brdrline, brdrline, vicdual_state, empty_init, ROT270, "Sega", "Borderline", MACHINE_SUPPORTS_SAVE ) GAME( 1981, starrkr, brdrline, brdrline, starrkr, vicdual_state, empty_init, ROT270, "Sega", "Star Raker", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) From 4ac86c7fa034c37f3ff8357056f51cafeea7a0b4 Mon Sep 17 00:00:00 2001 From: AJR Date: Tue, 12 Nov 2024 16:47:40 -0500 Subject: [PATCH 15/19] nec/v25sfr.cpp: Fix BRG logging message --- src/devices/cpu/nec/v25sfr.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/devices/cpu/nec/v25sfr.cpp b/src/devices/cpu/nec/v25sfr.cpp index 2afecf5206c..a41bfb8c8f6 100644 --- a/src/devices/cpu/nec/v25sfr.cpp +++ b/src/devices/cpu/nec/v25sfr.cpp @@ -283,7 +283,7 @@ uint8_t v25_common_device::brg0_r() void v25_common_device::brg0_w(uint8_t d) { - logerror("%06x: BRG0 divider set to %d\n", PC(), d); + logerror("%06x: BRG0 divider set to %u\n", PC(), d); m_brg[0] = d; } @@ -379,7 +379,7 @@ uint8_t v25_common_device::brg1_r() void v25_common_device::brg1_w(uint8_t d) { - logerror("%06x: BRG1 divider set to %d\n", PC(), d); + logerror("%06x: BRG1 divider set to %u\n", PC(), d); m_brg[1] = d; } From 89493da3e82359148187bf1e09bc7185114b76da Mon Sep 17 00:00:00 2001 From: hap Date: Tue, 12 Nov 2024 23:42:23 +0100 Subject: [PATCH 16/19] tangramq: add more inputs, correct music tempo --- src/mame/konami/quickpick5.cpp | 2 +- src/mame/nichibutsu/cclimber.cpp | 128 ++++++++++++++++--------------- 2 files changed, 68 insertions(+), 62 deletions(-) diff --git a/src/mame/konami/quickpick5.cpp b/src/mame/konami/quickpick5.cpp index 838c00c838b..59aa6750c20 100644 --- a/src/mame/konami/quickpick5.cpp +++ b/src/mame/konami/quickpick5.cpp @@ -571,7 +571,7 @@ static INPUT_PORTS_START( waijockey ) PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_GAMBLE_PAYOUT) PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Bet 1-3") PORT_CODE(KEYCODE_F) PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED) - PORT_BIT(0x60, IP_ACTIVE_LOW, IPT_UNUSED) // battery sensor + PORT_BIT(0x60, IP_ACTIVE_LOW, IPT_CUSTOM) // battery sensor PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_CUSTOM) PORT_VBLANK("screen") // guess INPUT_PORTS_END diff --git a/src/mame/nichibutsu/cclimber.cpp b/src/mame/nichibutsu/cclimber.cpp index 4d44d535caa..9554012f694 100644 --- a/src/mame/nichibutsu/cclimber.cpp +++ b/src/mame/nichibutsu/cclimber.cpp @@ -240,10 +240,6 @@ Dip location verified from manual for: cclimber, guzzler, swimmer this causes them to crash after the a few rounds - confirmed on an original PCB. They clearly weren't tested properly by the bootleggers. - Tangram Q - --------- - Inputs aren't correct, sound tempo is wrong (NMI ack problem?) - ***************************************************************************/ #include "emu.h" @@ -508,8 +504,8 @@ void cclimber_state::tangramq_map(address_map &map) { map(0x0000, 0x5fff).rom(); map(0x6000, 0x6bff).ram(); - map(0x8000, 0x8000).portr("P1"); - map(0x8020, 0x8020).portr("P2"); + map(0x8000, 0x8000).portr("SYSTEM1"); + map(0x8020, 0x8020).portr("SYSTEM2"); map(0x8800, 0x88ff).ram().share("bigspriteram"); map(0x9000, 0x93ff).mirror(0x0400).ram().share("videoram"); map(0x9800, 0x981f).ram().share("column_scroll"); @@ -519,10 +515,11 @@ void cclimber_state::tangramq_map(address_map &map) map(0x98dc, 0x98df).ram().share("bigspritectrl"); map(0x98e0, 0x98ff).ram(); // not used, but initialized map(0x9c00, 0x9fff).ram().w(FUNC(cclimber_state::cclimber_colorram_w)).share("colorram"); - map(0xa000, 0xa000).portr("P3"); + map(0xa000, 0xa000).portr("P1"); + map(0xa800, 0xa800).portr("P2"); map(0xa000, 0xa007).w(m_mainlatch, FUNC(ls259_device::write_d0)); - map(0xb000, 0xb000).portr("DSW").w("soundlatch", FUNC(generic_latch_8_device::write)); - map(0xb800, 0xb800).portr("SYSTEM"); + map(0xb000, 0xb000).portr("DSW1").w("soundlatch", FUNC(generic_latch_8_device::write)); + map(0xb800, 0xb800).portr("DSW2"); } void toprollr_state::toprollr_decrypted_opcodes_map(address_map &map) @@ -592,7 +589,7 @@ void cclimber_state::tangramq_sound_map(address_map &map) map(0x8000, 0x8001).w("ay1", FUNC(ay8910_device::address_data_w)); map(0x8002, 0x8007).w("wave", FUNC(snkwave_device::snkwave_w)); map(0x8008, 0x8009).w("ay2", FUNC(ay8910_device::address_data_w)); - // map(0xa000, 0xa000) // TODO: NMI related? + map(0xa000, 0xa000).nopw(); // TODO: NMI related? map(0xe000, 0xe3ff).ram(); } @@ -841,36 +838,26 @@ INPUT_PORTS_END static INPUT_PORTS_START( tangramq ) PORT_START("P1") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START2 ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START1 ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN1 ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_START("P2") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) - - PORT_START("P3") - PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) // this drops the piece - PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) // pressing this one and the following together rotates pieces - PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_START("DSW") + PORT_START("DSW1") PORT_DIPNAME( 0x01, 0x00, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:1") PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x01, DEF_STR( On ) ) @@ -880,12 +867,12 @@ static INPUT_PORTS_START( tangramq ) PORT_DIPNAME( 0x04, 0x00, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:3") PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x04, DEF_STR( On ) ) - PORT_DIPNAME( 0x08, 0x08, "Invincibility" ) PORT_DIPLOCATION("DSW1:4") + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Free_Play ) ) PORT_DIPLOCATION("DSW1:4") PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x10, 0x00, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:5") - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x10, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, "Infinite Lives" ) PORT_DIPLOCATION("DSW1:5") + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPNAME( 0x20, 0x00, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:6") PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x20, DEF_STR( On ) ) @@ -896,7 +883,7 @@ static INPUT_PORTS_START( tangramq ) PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x80, DEF_STR( On ) ) - PORT_START("SYSTEM") + PORT_START("DSW2") PORT_DIPNAME( 0x03, 0x00, DEF_STR( Lives ) ) PORT_DIPLOCATION("DSW2:1,2") PORT_DIPSETTING( 0x00, "1" ) PORT_DIPSETTING( 0x01, "2" ) @@ -917,9 +904,29 @@ static INPUT_PORTS_START( tangramq ) PORT_DIPSETTING( 0x20, DEF_STR( 1C_3C ) ) PORT_DIPSETTING( 0x30, DEF_STR( 1C_5C ) ) PORT_DIPSETTING( 0x40, DEF_STR( 1C_6C ) ) - PORT_DIPNAME( 0x80, 0x80, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("DSW2:8") - PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("DSW2:8") + PORT_DIPSETTING( 0x80, DEF_STR( Upright ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Cocktail ) ) + + PORT_START("SYSTEM1") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START2 ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START1 ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START("SYSTEM2") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN2 ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) INPUT_PORTS_END static INPUT_PORTS_START( swimmer ) @@ -1325,7 +1332,6 @@ void cclimber_state::root(machine_config &config) { // basic machine hardware Z80(config, m_maincpu, 18.432_MHz_XTAL/3/2); // 3.072 MHz - m_maincpu->set_addrmap(AS_PROGRAM, &cclimber_state::cclimber_map); LS259(config, m_mainlatch, 0); m_mainlatch->q_out_cb<0>().set(FUNC(cclimber_state::nmi_mask_w)); @@ -1351,6 +1357,7 @@ void cclimber_state::cclimber(machine_config &config) { root(config); + m_maincpu->set_addrmap(AS_PROGRAM, &cclimber_state::cclimber_map); m_maincpu->set_addrmap(AS_IO, &cclimber_state::cclimber_portmap); // 7J on CCG-1 @@ -1382,7 +1389,7 @@ void cclimber_state::tangramq(machine_config &config) Z80(config, m_audiocpu, 8_MHz_XTAL / 2); // divider not verified m_audiocpu->set_addrmap(AS_PROGRAM, &cclimber_state::tangramq_sound_map); - m_screen->screen_vblank().append_inputline(m_audiocpu, INPUT_LINE_NMI); // TODO: probably wrong + m_audiocpu->set_periodic_int(FUNC(cclimber_state::nmi_line_pulse), attotime::from_ticks(0x8000, 8_MHz_XTAL)); // sound hardware SPEAKER(config, "speaker").front_center(); @@ -1390,7 +1397,6 @@ void cclimber_state::tangramq(machine_config &config) GENERIC_LATCH_8(config, "soundlatch").data_pending_callback().set_inputline(m_audiocpu, 0, HOLD_LINE); AY8910(config, "ay1", 8_MHz_XTAL / 4).add_route(ALL_OUTPUTS, "speaker", 0.35); // divider not verified - AY8910(config, "ay2", 8_MHz_XTAL / 4).add_route(ALL_OUTPUTS, "speaker", 0.35); // divider not verified SNKWAVE(config, "wave", 8_MHz_XTAL).add_route(ALL_OUTPUTS, "speaker", 0.30); // lack of divider not verified @@ -1506,7 +1512,7 @@ void swimmer_state::swimmer(machine_config &config) Z80(config, m_audiocpu, 4_MHz_XTAL/2); // verified on pcb m_audiocpu->set_addrmap(AS_PROGRAM, &swimmer_state::swimmer_audio_map); m_audiocpu->set_addrmap(AS_IO, &swimmer_state::swimmer_audio_portmap); - m_audiocpu->set_periodic_int(FUNC(swimmer_state::nmi_line_pulse), attotime::from_hz((double)4000000/16384)); // IRQs are triggered by the main CPU + m_audiocpu->set_periodic_int(FUNC(swimmer_state::nmi_line_pulse), attotime::from_ticks(0x4000, 4_MHz_XTAL)); // video hardware SCREEN(config, m_screen, SCREEN_TYPE_RASTER); @@ -2553,7 +2559,7 @@ HM6116P-4 RAM lots of TTL */ -ROM_START(tangramq) +ROM_START( tangramq ) ROM_REGION( 0x6000, "maincpu", 0 ) ROM_LOAD( "m1.k5", 0x0000, 0x2000, CRC(dff92169) SHA1(805784afeba676306ed6c0d41d33ed0163bdc08e) ) ROM_LOAD( "m2.k4", 0x2000, 0x2000, CRC(1cbade75) SHA1(1fa276261428c392917df4a4dbd9f99710b9855e) ) @@ -2562,8 +2568,8 @@ ROM_START(tangramq) ROM_LOAD( "s1.a6", 0x0000, 0x2000, CRC(05af38f6) SHA1(7bdbf798964aa4d603fca0178b3f8fc251d207f6) ) ROM_REGION( 0x2000, "bigsprite", 0 ) - ROM_LOAD( "b1.e19", 0x0000, 0x1000, CRC(f3ec2562) SHA1(859473c45b9d22c138b70ea649b93d41721e1e0d) ) // 1xxxxxxxxxxx = 0xFF - ROM_LOAD( "b2.e17", 0x1000, 0x1000, CRC(77d21b84) SHA1(7f9bfbfbc7fd51a97f15fee54ac851ddfa97b213) ) // 1xxxxxxxxxxx = 0xFF + ROM_LOAD( "b2.e17", 0x0000, 0x1000, CRC(77d21b84) SHA1(7f9bfbfbc7fd51a97f15fee54ac851ddfa97b213) ) // 1xxxxxxxxxxx = 0xFF + ROM_LOAD( "b1.e19", 0x1000, 0x1000, CRC(f3ec2562) SHA1(859473c45b9d22c138b70ea649b93d41721e1e0d) ) // 1xxxxxxxxxxx = 0xFF ROM_REGION( 0x4000, "tile", 0 ) ROM_LOAD( "f1.h4", 0x0000, 0x2000, CRC(c7c3ffe1) SHA1(f8f0ac3b73f560af3ef0954e5d80984bad605ea2) ) @@ -3010,8 +3016,8 @@ ROM_START( toprollr ) ROM_LOAD( "2.f5", 0x00000, 0x02000, CRC(ef789f00) SHA1(424d69584d391ee7b9ad5db7ee6ced97d69897d4) ) ROM_LOAD( "8.f3", 0x02000, 0x02000, CRC(94371cfb) SHA1(cb501c36b213c995a4048b3a96c85848c556cd05) ) ROM_LOAD( "4.k5", 0x04000, 0x02000, CRC(1cb48ea0) SHA1(fdc75075112042ec84a7d1b3e5b5a6db1d1cb871) ) - ROM_COPY( "user1", 0x04000, 0x0a000, 0x02000 ) - ROM_COPY( "user1", 0x04000, 0x10000, 0x02000 ) + ROM_COPY( "user1", 0x04000, 0x0a000, 0x02000 ) + ROM_COPY( "user1", 0x04000, 0x10000, 0x02000 ) ROM_LOAD( "3.h5", 0x06000, 0x02000, CRC(d45494ba) SHA1(6e235b34f9457acadad6d4e27799978bc2e3db08) ) ROM_LOAD( "9.h3", 0x08000, 0x02000, CRC(8a8032a7) SHA1(d6642d72645c613c21f65bbbe1560d0437d41f43) ) ROM_LOAD( "1.d5", 0x0c000, 0x02000, CRC(9894374d) SHA1(173de4abbc3fb5d522aa6d6d5caf8e4d54f2a598) ) @@ -3094,10 +3100,10 @@ GAME( 1980, cclimbrrod, cclimber, cclimber, cclimber, cclimber_state, empty_i /* these sets have ugly colours, no extra attract screen, and no graphics for the extra attract screen in the BG roms - there is a Falcon logo in the text roms which is unused - does the code to display the extra screen still exist in the roms? */ -GAME( 1981, ckong, 0, cclimber, ckong, cclimber_state, empty_init, ROT270, "Kyoei / Falcon", "Crazy Kong", MACHINE_SUPPORTS_SAVE ) // on a Falcon FCK-01 PCB, but doesn't display any Falcon copyright -GAME( 1981, ckongalc, ckong, cclimber, ckong, cclimber_state, empty_init, ROT270, "bootleg (Alca)", "Crazy Kong (Alca bootleg)", MACHINE_SUPPORTS_SAVE ) -GAME( 1981, monkeyd, ckong, cclimber, ckong, cclimber_state, empty_init, ROT270, "bootleg", "Monkey Donkey", MACHINE_SUPPORTS_SAVE ) -GAME( 1981, dking, ckong, cclimber, ckong, cclimber_state, init_dking, ROT270, "bootleg", "Donkey King", MACHINE_SUPPORTS_SAVE ) // supposedly, possibly by Hafasonic? +GAME( 1981, ckong, 0, cclimber, ckong, cclimber_state, empty_init, ROT270, "Kyoei / Falcon", "Crazy Kong", MACHINE_SUPPORTS_SAVE ) // on a Falcon FCK-01 PCB, but doesn't display any Falcon copyright +GAME( 1981, ckongalc, ckong, cclimber, ckong, cclimber_state, empty_init, ROT270, "bootleg (Alca)", "Crazy Kong (Alca bootleg)", MACHINE_SUPPORTS_SAVE ) +GAME( 1981, monkeyd, ckong, cclimber, ckong, cclimber_state, empty_init, ROT270, "bootleg", "Monkey Donkey", MACHINE_SUPPORTS_SAVE ) +GAME( 1981, dking, ckong, cclimber, ckong, cclimber_state, init_dking, ROT270, "bootleg", "Donkey King", MACHINE_SUPPORTS_SAVE ) // supposedly, possibly by Hafasonic? GAME( 1981, ckongdks, ckong, cclimber, ckong, cclimber_state, init_dking, ROT270, "bootleg", "Donkey Kong (Spanish bootleg of Crazy Kong)", MACHINE_SUPPORTS_SAVE ) /* these sets have correct colours, and also contain the graphics used for the extra attract screen in the BG roms, but it is unused @@ -3119,12 +3125,12 @@ GAME( 1981, ckongpt2b2, ckongpt2, cclimber, ckongb2, cclimber_state, empty_i // see bagman.cpp for parent GAME( 1982, bagmanf, bagman, bagmanf, bagmanf, cclimber_state, empty_init, ROT270, "bootleg", "Le Bagnard (bootleg on Crazy Kong hardware)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) -GAME( 1981, rpatrol, 0, rpatrol, rpatrol, cclimber_state, init_rpatrol, ROT0, "Orca", "River Patrol (Japan)", MACHINE_SUPPORTS_SAVE) +GAME( 1981, rpatrol, 0, rpatrol, rpatrol, cclimber_state, init_rpatrol, ROT0, "Orca", "River Patrol (Japan)", MACHINE_SUPPORTS_SAVE ) GAME( 1981, rpatroln, rpatrol, rpatrol, rpatrol, cclimber_state, empty_init, ROT0, "Orca", "River Patrol (Japan, unprotected)", MACHINE_SUPPORTS_SAVE ) GAME( 1981, rpatrolb, rpatrol, rpatrol, rpatrol, cclimber_state, empty_init, ROT0, "bootleg", "River Patrol (bootleg)", MACHINE_SUPPORTS_SAVE ) GAME( 1981, silvland, rpatrol, rpatrol, rpatrol, cclimber_state, empty_init, ROT0, "Falcon", "Silver Land (hack of River Patrol)", MACHINE_SUPPORTS_SAVE ) -GAME( 1983, tangramq, 0, tangramq, tangramq, cclimber_state, empty_init, ROT270, "SNK", "Tangram Q", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) +GAME( 1983, tangramq, 0, tangramq, tangramq, cclimber_state, empty_init, ROT270, "SNK", "Tangram Q", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // see pacman.cpp for parent GAME( 1985, cannonb, cannonbp, cannonb, cannonb, cclimber_state, init_cannonb, ROT90, "bootleg (Soft)", "Cannon Ball (bootleg on Crazy Kong hardware) (set 1, buggy)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) // bootleggers missed protection after bonus game @@ -3135,7 +3141,7 @@ GAME( 1982, swimmer, 0, swimmer, swimmer, swimmer_state, empty_i GAME( 1982, swimmera, swimmer, swimmer, swimmer, swimmer_state, empty_init, ROT0, "Tehkan", "Swimmer (set 2)", MACHINE_SUPPORTS_SAVE ) GAME( 1982, swimmerb, swimmer, swimmer, swimmerb, swimmer_state, empty_init, ROT0, "Tehkan", "Swimmer (set 3)", MACHINE_SUPPORTS_SAVE ) -GAME( 1983, guzzler, 0, guzzler, guzzler, swimmer_state, empty_init, ROT90, "Tehkan", "Guzzler", MACHINE_SUPPORTS_SAVE ) +GAME( 1983, guzzler, 0, guzzler, guzzler, swimmer_state, empty_init, ROT90, "Tehkan", "Guzzler", MACHINE_SUPPORTS_SAVE ) GAME( 1983, guzzlers, guzzler, guzzler, guzzler, swimmer_state, empty_init, ROT90, "Tehkan", "Guzzler (Swimmer conversion)", MACHINE_SUPPORTS_SAVE ) GAME( 1983, au, 0, au, au, swimmer_state, empty_init, ROT90, "Tehkan", "Au (location test)", MACHINE_SUPPORTS_SAVE ) From bbe592f97d805eddd1b0205f43e78d8c96e8a756 Mon Sep 17 00:00:00 2001 From: hap Date: Wed, 13 Nov 2024 01:10:55 +0100 Subject: [PATCH 17/19] tangramq: add note, sound pcb freqs should be correct since it's same pcb as Marvin's Maze --- src/mame/nichibutsu/cclimber.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/mame/nichibutsu/cclimber.cpp b/src/mame/nichibutsu/cclimber.cpp index 9554012f694..362fde9674c 100644 --- a/src/mame/nichibutsu/cclimber.cpp +++ b/src/mame/nichibutsu/cclimber.cpp @@ -1386,7 +1386,7 @@ void cclimber_state::tangramq(machine_config &config) m_maincpu->set_addrmap(AS_PROGRAM, &cclimber_state::tangramq_map); - Z80(config, m_audiocpu, 8_MHz_XTAL / 2); // divider not verified + Z80(config, m_audiocpu, 8_MHz_XTAL / 2); m_audiocpu->set_addrmap(AS_PROGRAM, &cclimber_state::tangramq_sound_map); m_audiocpu->set_periodic_int(FUNC(cclimber_state::nmi_line_pulse), attotime::from_ticks(0x8000, 8_MHz_XTAL)); @@ -1396,10 +1396,10 @@ void cclimber_state::tangramq(machine_config &config) GENERIC_LATCH_8(config, "soundlatch").data_pending_callback().set_inputline(m_audiocpu, 0, HOLD_LINE); - AY8910(config, "ay1", 8_MHz_XTAL / 4).add_route(ALL_OUTPUTS, "speaker", 0.35); // divider not verified - AY8910(config, "ay2", 8_MHz_XTAL / 4).add_route(ALL_OUTPUTS, "speaker", 0.35); // divider not verified + AY8910(config, "ay1", 8_MHz_XTAL / 4).add_route(ALL_OUTPUTS, "speaker", 0.35); + AY8910(config, "ay2", 8_MHz_XTAL / 4).add_route(ALL_OUTPUTS, "speaker", 0.35); - SNKWAVE(config, "wave", 8_MHz_XTAL).add_route(ALL_OUTPUTS, "speaker", 0.30); // lack of divider not verified + SNKWAVE(config, "wave", 8_MHz_XTAL).add_route(ALL_OUTPUTS, "speaker", 0.30); // unused? } void cclimber_state::cclimberx(machine_config &config) @@ -2557,6 +2557,7 @@ NEC D780C-1 CPU 8 MHz XTAL HM6116P-4 RAM lots of TTL +note: same PCB as Marvin's Maze */ ROM_START( tangramq ) @@ -2567,6 +2568,7 @@ ROM_START( tangramq ) ROM_REGION( 0x2000, "audiocpu", 0 ) ROM_LOAD( "s1.a6", 0x0000, 0x2000, CRC(05af38f6) SHA1(7bdbf798964aa4d603fca0178b3f8fc251d207f6) ) + // BTANB?: colors look glitchy when in this order, but matches PCB reference and flyers ROM_REGION( 0x2000, "bigsprite", 0 ) ROM_LOAD( "b2.e17", 0x0000, 0x1000, CRC(77d21b84) SHA1(7f9bfbfbc7fd51a97f15fee54ac851ddfa97b213) ) // 1xxxxxxxxxxx = 0xFF ROM_LOAD( "b1.e19", 0x1000, 0x1000, CRC(f3ec2562) SHA1(859473c45b9d22c138b70ea649b93d41721e1e0d) ) // 1xxxxxxxxxxx = 0xFF From a8f97c0624733b74995d8b25199f3fe015532095 Mon Sep 17 00:00:00 2001 From: hap Date: Wed, 13 Nov 2024 01:26:14 +0100 Subject: [PATCH 18/19] tangramq: swap dipswitches, mark game as working Systems promoted to working --------------------------- Tangram Q [system11, buffi, rtw, f205v, Sean Sutton, Smitdogg, The Dumping Union, Ivan Vangelista, hap] --- src/mame/nichibutsu/cclimber.cpp | 68 ++++++++++++++++---------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/src/mame/nichibutsu/cclimber.cpp b/src/mame/nichibutsu/cclimber.cpp index 362fde9674c..fa3f7c935cf 100644 --- a/src/mame/nichibutsu/cclimber.cpp +++ b/src/mame/nichibutsu/cclimber.cpp @@ -518,8 +518,8 @@ void cclimber_state::tangramq_map(address_map &map) map(0xa000, 0xa000).portr("P1"); map(0xa800, 0xa800).portr("P2"); map(0xa000, 0xa007).w(m_mainlatch, FUNC(ls259_device::write_d0)); - map(0xb000, 0xb000).portr("DSW1").w("soundlatch", FUNC(generic_latch_8_device::write)); - map(0xb800, 0xb800).portr("DSW2"); + map(0xb000, 0xb000).portr("DSW2").w("soundlatch", FUNC(generic_latch_8_device::write)); + map(0xb800, 0xb800).portr("DSW1"); } void toprollr_state::toprollr_decrypted_opcodes_map(address_map &map) @@ -858,44 +858,18 @@ static INPUT_PORTS_START( tangramq ) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_START("DSW1") - PORT_DIPNAME( 0x01, 0x00, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:1") - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x01, DEF_STR( On ) ) - PORT_DIPNAME( 0x02, 0x00, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:2") - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x02, DEF_STR( On ) ) - PORT_DIPNAME( 0x04, 0x00, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:3") - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x04, DEF_STR( On ) ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Free_Play ) ) PORT_DIPLOCATION("DSW1:4") - PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x10, 0x10, "Infinite Lives" ) PORT_DIPLOCATION("DSW1:5") - PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x20, 0x00, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:6") - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x20, DEF_STR( On ) ) - PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:7") - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x40, DEF_STR( On ) ) - PORT_DIPNAME( 0x80, 0x00, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:8") - PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x80, DEF_STR( On ) ) - - PORT_START("DSW2") - PORT_DIPNAME( 0x03, 0x00, DEF_STR( Lives ) ) PORT_DIPLOCATION("DSW2:1,2") + PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) ) PORT_DIPLOCATION("DSW1:1,2") PORT_DIPSETTING( 0x00, "1" ) PORT_DIPSETTING( 0x01, "2" ) PORT_DIPSETTING( 0x02, "3" ) PORT_DIPSETTING( 0x03, "5" ) - PORT_DIPNAME( 0x04, 0x04, "Freeze" ) PORT_DIPLOCATION("DSW2:3") + PORT_DIPNAME( 0x04, 0x04, "Freeze" ) PORT_DIPLOCATION("DSW1:3") PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - PORT_DIPNAME( 0x08, 0x08, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("DSW2:4") + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("DSW1:4") PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x08, DEF_STR( On ) ) - PORT_DIPNAME( 0x70, 0x00, DEF_STR( Coinage ) ) PORT_DIPLOCATION("DSW2:5,6,7") + PORT_DIPNAME( 0x70, 0x00, DEF_STR( Coinage ) ) PORT_DIPLOCATION("DSW1:5,6,7") PORT_DIPSETTING( 0x70, DEF_STR( 4C_1C ) ) PORT_DIPSETTING( 0x60, DEF_STR( 3C_1C ) ) PORT_DIPSETTING( 0x50, DEF_STR( 2C_1C ) ) @@ -904,10 +878,36 @@ static INPUT_PORTS_START( tangramq ) PORT_DIPSETTING( 0x20, DEF_STR( 1C_3C ) ) PORT_DIPSETTING( 0x30, DEF_STR( 1C_5C ) ) PORT_DIPSETTING( 0x40, DEF_STR( 1C_6C ) ) - PORT_DIPNAME( 0x80, 0x80, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("DSW2:8") + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("DSW1:8") PORT_DIPSETTING( 0x80, DEF_STR( Upright ) ) PORT_DIPSETTING( 0x00, DEF_STR( Cocktail ) ) + PORT_START("DSW2") + PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:1") + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:2") + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:3") + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Free_Play ) ) PORT_DIPLOCATION("DSW2:4") + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, "Infinite Lives" ) PORT_DIPLOCATION("DSW2:5") + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:6") + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:7") + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:8") + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_START("SYSTEM1") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START2 ) @@ -3132,7 +3132,7 @@ GAME( 1981, rpatroln, rpatrol, rpatrol, rpatrol, cclimber_state, empty_i GAME( 1981, rpatrolb, rpatrol, rpatrol, rpatrol, cclimber_state, empty_init, ROT0, "bootleg", "River Patrol (bootleg)", MACHINE_SUPPORTS_SAVE ) GAME( 1981, silvland, rpatrol, rpatrol, rpatrol, cclimber_state, empty_init, ROT0, "Falcon", "Silver Land (hack of River Patrol)", MACHINE_SUPPORTS_SAVE ) -GAME( 1983, tangramq, 0, tangramq, tangramq, cclimber_state, empty_init, ROT270, "SNK", "Tangram Q", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) +GAME( 1983, tangramq, 0, tangramq, tangramq, cclimber_state, empty_init, ROT270, "SNK", "Tangram Q", MACHINE_SUPPORTS_SAVE ) // see pacman.cpp for parent GAME( 1985, cannonb, cannonbp, cannonb, cannonb, cclimber_state, init_cannonb, ROT90, "bootleg (Soft)", "Cannon Ball (bootleg on Crazy Kong hardware) (set 1, buggy)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) // bootleggers missed protection after bonus game From 4c66f371a2a8a0f4adbd86f03fb0b299cd3f0bdb Mon Sep 17 00:00:00 2001 From: Roberto Fresca Date: Wed, 13 Nov 2024 01:29:43 +0100 Subject: [PATCH 19/19] New working clones ------------------ Makaimura (Japan Revision B, alt GFX) [Roberto Fresca, Gabriel Vega (El Pampa), Emmanuel Firmapaz, Club Argentino de Arcades] --- src/mame/capcom/gng.cpp | 65 +++++++++++++++++++++++++++++++++-------- src/mame/mame.lst | 1 + 2 files changed, 54 insertions(+), 12 deletions(-) diff --git a/src/mame/capcom/gng.cpp b/src/mame/capcom/gng.cpp index 139b6c6a44f..a70db9ad1be 100644 --- a/src/mame/capcom/gng.cpp +++ b/src/mame/capcom/gng.cpp @@ -949,6 +949,46 @@ ROM_START( makaimurb ) // 85606-A-3/85606-B-3 ROM_LOAD( "63s141.2e", 0x0100, 0x0100, CRC(4a1285a4) SHA1(5018c3950b675af58db499e2883ecbc55419b491) ) // priority (not used) ROM_END +/* + Makaimura + Program is the same as set makaimurb, but different sized/arranged ROMs. + Some GFX ROMs are different. +*/ +ROM_START( makaimurba ) + ROM_REGION( 0x18000, "maincpu", 0 ) + ROM_LOAD( "gg5.bin", 0x04000, 0x4000, CRC(f8bda78f) SHA1(ed5d67996475504cdf7b9fa356f6e160cbbcfa77) ) // 4000-5fff is page 4 + ROM_LOAD( "gg4.bin", 0x08000, 0x4000, CRC(ac0b25fb) SHA1(81b349b969e1ea4f90e8e523ec05a93b62252433) ) + ROM_LOAD( "gg3.bin", 0x0c000, 0x4000, CRC(762b5af0) SHA1(1752b825b936f0f5ff338f81006f1dc84705d875) ) + ROM_LOAD( "gg7.bin", 0x10000, 0x4000, CRC(fd9a8dda) SHA1(222c3c759c6b60f82351b9e6bf748fb4872e82b4) ) // page 0, 1, 2, 3 + ROM_LOAD( "gg6.bin", 0x14000, 0x4000, CRC(2e44634f) SHA1(60b6b8630f14688488593ee439ef77a7a65cd467) ) // page 0, 1, 2, 3 + + ROM_REGION( 0x10000, "audiocpu", 0 ) + ROM_LOAD( "gg2.bin", 0x0000, 0x8000, CRC(615f5b6f) SHA1(7ef9ec5c2072e21c787a6bbf700033f50c759c1d) ) + + ROM_REGION( 0x04000, "chars", 0 ) + ROM_LOAD( "gg1.bin", 0x00000, 0x4000, CRC(ecfccf07) SHA1(0a1518e19a2e0a4cc3dde4b9568202ea911b5ece) ) + + ROM_REGION( 0x18000, "tiles", 0 ) + ROM_LOAD( "gg13.bin", 0x00000, 0x4000, CRC(ddd56fa9) SHA1(f9d77eee5e2738b7e83ba02fcc55dd480391479f) ) // 0-1 Plane 1 + ROM_LOAD( "gg12.bin", 0x04000, 0x4000, CRC(7302529d) SHA1(8434c994cc55d2586641f3b90b6b15fd65dfb67c) ) // 2-3 Plane 1 + ROM_LOAD( "gg11.bin", 0x08000, 0x4000, CRC(20035bda) SHA1(bbb1fba0eb19471f66d29526fa8423ccb047bd63) ) // 0-1 Plane 2 + ROM_LOAD( "gg10.bin", 0x0c000, 0x4000, CRC(f12ba271) SHA1(1c42fa02cb27b35d10c3f7f036005e747f9f6b79) ) // 2-3 Plane 2 + ROM_LOAD( "gg9.bin", 0x10000, 0x4000, CRC(e525207d) SHA1(1947f159189b3a53f1251d8653b6e7c65c91fc3c) ) // 0-1 Plane 3 + ROM_LOAD( "gg8.bin", 0x14000, 0x4000, CRC(2d77e9b2) SHA1(944da1ce29a18bf0fc8deff78bceacba0bf23a07) ) // 2-3 Plane 3 + + ROM_REGION( 0x20000, "sprites", ROMREGION_ERASEFF ) + ROM_LOAD( "gg19.bin", 0x00000, 0x4000, CRC(93e50a8f) SHA1(42d367f57bb2fdf60a0445ac1533da99cfeaa617) ) // sprites 0 Plane 1-2 + ROM_LOAD( "gg18.bin", 0x04000, 0x4000, CRC(06d7e5ca) SHA1(9e06012bcd82f98fad43de666ef9a75979d940ab) ) // sprites 1 Plane 1-2 + ROM_LOAD( "gg17.bin", 0x08000, 0x4000, CRC(bc1fe02d) SHA1(e3a1421d465b87148ffa94f5673b2307f0246afe) ) // sprites 2 Plane 1-2 + ROM_LOAD( "gg16.bin", 0x10000, 0x4000, CRC(6aaf12f9) SHA1(207a7407288182a4f3eddaea634c6a6452131182) ) // sprites 0 Plane 3-4 + ROM_LOAD( "gg15.bin", 0x14000, 0x4000, CRC(e80c3fca) SHA1(cb641c25bb04b970b2cbeca41adb792bbe142fb5) ) // sprites 1 Plane 3-4 + ROM_LOAD( "gg14.bin", 0x18000, 0x4000, CRC(7780a925) SHA1(3f129ca6d695548b659955fe538584bd9ac2ff17) ) // sprites 2 Plane 3-4 + + ROM_REGION( 0x0200, "proms", 0 ) + ROM_LOAD( "prom1", 0x0000, 0x0100, NO_DUMP ) // video timing (not used) + ROM_LOAD( "prom2", 0x0100, 0x0100, NO_DUMP ) // priority (not used) +ROM_END + ROM_START( makaimurc ) ROM_REGION( 0x18000, "maincpu", 0 ) ROM_LOAD( "mj04c.bin", 0x04000, 0x4000, CRC(1294edb1) SHA1(35d3b3ce4ee25d3cfa27097de0c9a2ab5e4892aa) ) // 4000-5fff is page 4 @@ -1048,15 +1088,16 @@ ROM_END } // anonymous namespace -GAME( 1985, gng, 0, gng, gng, gng_state, empty_init, ROT0, "Capcom", "Ghosts'n Goblins (World? set 1)", MACHINE_SUPPORTS_SAVE ) -GAME( 1985, gnga, gng, gng, gng, gng_state, empty_init, ROT0, "Capcom", "Ghosts'n Goblins (World? set 2)", MACHINE_SUPPORTS_SAVE ) -GAME( 1985, gngbl, gng, gng, gng, gng_state, empty_init, ROT0, "bootleg", "Ghosts'n Goblins (bootleg with Cross)", MACHINE_SUPPORTS_SAVE ) -GAME( 1985, gngprot, gng, gng, gng, gng_state, empty_init, ROT0, "Capcom", "Ghosts'n Goblins (prototype)", MACHINE_SUPPORTS_SAVE ) -GAME( 1985, gngblita, gng, gng, gng, gng_state, empty_init, ROT0, "bootleg", "Ghosts'n Goblins (Italian bootleg, harder)", MACHINE_SUPPORTS_SAVE ) -GAME( 1985, gngc, gng, gng, gng, gng_state, empty_init, ROT0, "Capcom", "Ghosts'n Goblins (World? set 3)", MACHINE_SUPPORTS_SAVE ) // rev c? -GAME( 1985, gngt, gng, gng, gng, gng_state, empty_init, ROT0, "Capcom (Taito America license)", "Ghosts'n Goblins (US)", MACHINE_SUPPORTS_SAVE ) -GAME( 1985, makaimur, gng, gng, makaimur, gng_state, empty_init, ROT0, "Capcom", "Makaimura (Japan)", MACHINE_SUPPORTS_SAVE ) -GAME( 1985, makaimurb, gng, gng, makaimur, gng_state, empty_init, ROT0, "Capcom", "Makaimura (Japan Revision B)", MACHINE_SUPPORTS_SAVE ) -GAME( 1985, makaimurc, gng, gng, makaimur, gng_state, empty_init, ROT0, "Capcom", "Makaimura (Japan Revision C)", MACHINE_SUPPORTS_SAVE ) -GAME( 1985, makaimurg, gng, gng, makaimur, gng_state, empty_init, ROT0, "Capcom", "Makaimura (Japan Revision G)", MACHINE_SUPPORTS_SAVE ) -GAME( 1989, diamrun, 0, diamrun, diamrun, gng_state, empty_init, ROT0, "KH Video", "Diamond Run", MACHINE_SUPPORTS_SAVE ) // Kyle Hodgetts +GAME( 1985, gng, 0, gng, gng, gng_state, empty_init, ROT0, "Capcom", "Ghosts'n Goblins (World? set 1)", MACHINE_SUPPORTS_SAVE ) +GAME( 1985, gnga, gng, gng, gng, gng_state, empty_init, ROT0, "Capcom", "Ghosts'n Goblins (World? set 2)", MACHINE_SUPPORTS_SAVE ) +GAME( 1985, gngbl, gng, gng, gng, gng_state, empty_init, ROT0, "bootleg", "Ghosts'n Goblins (bootleg with Cross)", MACHINE_SUPPORTS_SAVE ) +GAME( 1985, gngprot, gng, gng, gng, gng_state, empty_init, ROT0, "Capcom", "Ghosts'n Goblins (prototype)", MACHINE_SUPPORTS_SAVE ) +GAME( 1985, gngblita, gng, gng, gng, gng_state, empty_init, ROT0, "bootleg", "Ghosts'n Goblins (Italian bootleg, harder)", MACHINE_SUPPORTS_SAVE ) +GAME( 1985, gngc, gng, gng, gng, gng_state, empty_init, ROT0, "Capcom", "Ghosts'n Goblins (World? set 3)", MACHINE_SUPPORTS_SAVE ) // rev c? +GAME( 1985, gngt, gng, gng, gng, gng_state, empty_init, ROT0, "Capcom (Taito America license)", "Ghosts'n Goblins (US)", MACHINE_SUPPORTS_SAVE ) +GAME( 1985, makaimur, gng, gng, makaimur, gng_state, empty_init, ROT0, "Capcom", "Makaimura (Japan)", MACHINE_SUPPORTS_SAVE ) +GAME( 1985, makaimurb, gng, gng, makaimur, gng_state, empty_init, ROT0, "Capcom", "Makaimura (Japan Revision B)", MACHINE_SUPPORTS_SAVE ) +GAME( 1985, makaimurba, gng, gng, makaimur, gng_state, empty_init, ROT0, "Capcom", "Makaimura (Japan Revision B, alt GFX)", MACHINE_SUPPORTS_SAVE ) +GAME( 1985, makaimurc, gng, gng, makaimur, gng_state, empty_init, ROT0, "Capcom", "Makaimura (Japan Revision C)", MACHINE_SUPPORTS_SAVE ) +GAME( 1985, makaimurg, gng, gng, makaimur, gng_state, empty_init, ROT0, "Capcom", "Makaimura (Japan Revision G)", MACHINE_SUPPORTS_SAVE ) +GAME( 1989, diamrun, 0, diamrun, diamrun, gng_state, empty_init, ROT0, "KH Video", "Diamond Run", MACHINE_SUPPORTS_SAVE ) // Kyle Hodgetts diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 8d13cc48ba2..62655759c05 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -15900,6 +15900,7 @@ gngprot // Capcom/Romstar Proto gngt // 9/1985 (c) 1985 makaimur // 9/1985 (c) 1985 makaimurb // 9/1985 (c) 1985 +makaimurba // 9/1985 (c) 1985 makaimurc // 9/1985 (c) 1985 makaimurg // 9/1985 (c) 1985