New working clones

-------------------
N-Sub (cocktail) [system11]
This commit is contained in:
Ivan Vangelista 2025-01-21 17:58:59 +01:00
parent 9a8d047011
commit 102e876772
3 changed files with 188 additions and 14 deletions

View File

@ -41389,6 +41389,7 @@ invho2a // 326-341 (c) 1979 Sega
invinco // 310-318 (c) 1979 Sega
nostromo // bootleg
nsub // 268-275 (c) 1980 Sega
nsubc // 581-596 (c) 1980 Sega
pulsar // 790-805 (c) 1981 Sega
safari // 57-66 [1977 Gremlin?]
safaria // bootleg?

View File

@ -3313,6 +3313,49 @@ void nsub_state::nsub_io_map(address_map &map)
map(0x00, 0x0f).rw(FUNC(nsub_state::nsub_io_r), FUNC(nsub_state::nsub_io_w));
}
void nsub_state::nsubc_io_w(offs_t offset, uint8_t data)
{
if (offset & 0x01)
m_s97271p->port_w(data);
if (offset & 0x02)
{
palette_bank_w(data);
m_s97269pb->palette_bank_w(data);
}
if (offset & 0x08)
assert_coin_status();
}
void nsub_state::nsubc_prot_w(uint8_t data)
{
switch (data)
{
case 0x24: m_prot_value = 0x02; break;
case 0x66: m_prot_value = 0x07; break;
default: logerror("%s: unknown protection value %02x\n", machine().describe_context(), data);
}
}
void nsub_state::nsubc_map(address_map &map)
{
nsub_map(map);
map(0x7f00, 0x7f00).lr8(NAME([this] () -> uint8_t { return m_prot_value; }));
map(0xebe8, 0xebe8).w(FUNC(nsub_state::nsubc_prot_w));
}
void nsub_state::nsubc_io_map(address_map &map)
{
map.global_mask(0x0f);
map(0x00, 0x00).mirror(0x0c).portr("IN0");
map(0x01, 0x01).mirror(0x0c).portr("IN1");
map(0x02, 0x02).mirror(0x0c).portr("IN2");
map(0x03, 0x03).mirror(0x0c).portr("IN3");
map(0x00, 0x0f).w(FUNC(nsub_state::nsubc_io_w));
}
// coinage is handled by extra hardware on a daughterboard, put before the coin-in pin on the main logic board
// IC board "COIN CALCULATOR" (97201-P): two 74191 counters, a 555 timer, coin meters, and lots of other TTL
@ -3412,25 +3455,97 @@ static INPUT_PORTS_START( nsub )
PORT_DIPUNUSED_DIPLOC( 0x80, 0x80, "SW:8" )
INPUT_PORTS_END
static INPUT_PORTS_START( nsubc )
PORT_START("IN0")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_COCKTAIL
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY
PORT_BIT( 0xc0, IP_ACTIVE_LOW, IPT_UNKNOWN )
MACHINE_START_MEMBER(nsub_state, nsub)
PORT_START("IN1")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(FUNC(nsub_state::cblank_comp_r))
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY
PORT_BIT( 0xc0, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_START("IN2")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL
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_START1 )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 )
PORT_BIT( 0xc0, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_START("IN3")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(FUNC(vicdual_state::coin_status_r))
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_START2 )
PORT_BIT( 0xc0, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_COIN_DEFAULT
// TODO: hook this up. The main PCB also has a bank of 6 DIPs, but they don't seem used?
PORT_START("COINAGE") // "OPTION SW." on daughterboard
PORT_DIPNAME( 0x07, 0x01, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW:1,2,3")
PORT_DIPSETTING( 0x07, DEF_STR( 7C_1C ) )
PORT_DIPSETTING( 0x06, DEF_STR( 6C_1C ) )
PORT_DIPSETTING( 0x05, DEF_STR( 5C_1C ) )
PORT_DIPSETTING( 0x04, DEF_STR( 4C_1C ) )
PORT_DIPSETTING( 0x03, DEF_STR( 3C_1C ) )
PORT_DIPSETTING( 0x02, DEF_STR( 2C_1C ) )
PORT_DIPSETTING( 0x01, DEF_STR( 1C_1C ) )
// PORT_DIPSETTING( 0x00, DEF_STR( 0C_1C ) ) // invalid
PORT_DIPNAME( 0x78, 0x08, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SW:4,5,6,7")
PORT_DIPSETTING( 0x40, "Shared With Coin A" )
// PORT_DIPSETTING( 0x00, DEF_STR( 1C_0C ) ) // invalid
PORT_DIPSETTING( 0x08, DEF_STR( 1C_1C ) )
PORT_DIPSETTING( 0x10, DEF_STR( 1C_2C ) )
PORT_DIPSETTING( 0x18, DEF_STR( 1C_3C ) )
PORT_DIPSETTING( 0x20, DEF_STR( 1C_4C ) )
PORT_DIPSETTING( 0x28, DEF_STR( 1C_5C ) )
PORT_DIPSETTING( 0x30, DEF_STR( 1C_6C ) )
PORT_DIPSETTING( 0x38, DEF_STR( 1C_7C ) )
PORT_DIPUNUSED_DIPLOC( 0x80, 0x80, "SW:8" )
INPUT_PORTS_END
void nsub_state::machine_start()
{
m_nsub_play_counter = 0;
save_item(NAME(m_nsub_coin_counter));
save_item(NAME(m_nsub_play_counter));
machine_start();
vicdual_state::machine_start();
// playcounter 555 timer frequency is unknown
// keep in mind that intervals need to be longer than the main coin_in timeout
m_nsub_coinage_timer->adjust(attotime::zero, 0, attotime::from_msec(150));
if (m_nsub_coinage_timer.found())
m_nsub_coinage_timer->adjust(attotime::zero, 0, attotime::from_msec(150));
}
MACHINE_RESET_MEMBER(nsub_state, nsub)
void nsub_state::machine_reset()
{
m_nsub_coin_counter = m_coinage->read() & 7;
if (m_coinage.found())
m_nsub_coin_counter = m_coinage->read() & 7;
machine_reset();
vicdual_state::machine_reset();
}
MACHINE_START_MEMBER(nsub_state, nsubc)
{
nsub_state::machine_start();
save_item(NAME(m_prot_value));
}
void nsub_state::nsub(machine_config &config)
@ -3450,8 +3565,22 @@ void nsub_state::nsub(machine_config &config)
S97269PB(config, m_s97269pb, 0);
MCFG_MACHINE_START_OVERRIDE(nsub_state, nsub)
MCFG_MACHINE_RESET_OVERRIDE(nsub_state, nsub)
/* audio hardware */
S97271P(config, m_s97271p, 0);
}
void nsub_state::nsubc(machine_config &config)
{
vicdual_root(config);
m_maincpu->set_addrmap(AS_PROGRAM, &nsub_state::nsubc_map);
m_maincpu->set_addrmap(AS_IO, &nsub_state::nsubc_io_map);
m_screen->set_screen_update(FUNC(nsub_state::screen_update_color));
S97269PB(config, m_s97269pb, 0);
MCFG_MACHINE_START_OVERRIDE(nsub_state, nsubc)
/* audio hardware */
S97271P(config, m_s97271p, 0);
@ -3738,6 +3867,38 @@ ROM_START( nsub )
ROM_LOAD( "pr-34.u83", 0x0020, 0x0020, CRC(a1506b9d) SHA1(037c3db2ea40eca459e8acba9d1506dd28d72d10) ) /* sequence PROM */
ROM_END
// Heavily modified Carnival PCB with an extra video output card matching the one on the upright version.
// Had 2x PROMs missing but worked with ones dumped from the existing set. PCB found in genuine N-Sub cocktail cabinet.
ROM_START( nsubc ) // S-97396-P main board + 97093-P-B-S sub board + 97269-P-B (gradient and starfield) + 97201-P PCB for coinage
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "epr-581.u33", 0x0000, 0x0400, CRC(be5f0f44) SHA1(5e6802c6e15c9857f0a8150bb9b37aabfa0e0245) )
ROM_LOAD( "epr-582.u32", 0x0400, 0x0400, CRC(97a5e094) SHA1(c5ee9af7488f03627e780a1cf23af5f296520d95) )
ROM_LOAD( "epr-583.u31", 0x0800, 0x0400, CRC(bcf48a8d) SHA1(6fa96a449bc8440844a1b61c545ebed724c2d71d) )
ROM_LOAD( "epr-584.u30", 0x0c00, 0x0400, CRC(a0197ffb) SHA1(6bb72105e1c7a3126ada1f1b9eaf026383c203be) )
ROM_LOAD( "epr-585.u29", 0x1000, 0x0400, CRC(68f64111) SHA1(e7bec469316317560c99798b8b10e6a3cacf5be4) )
ROM_LOAD( "epr-586.u28", 0x1400, 0x0400, CRC(d7e75bce) SHA1(99726c800d60154efc42795ee9dd195e9b055bd6) )
ROM_LOAD( "epr-587.u27", 0x1800, 0x0400, CRC(a9f1c390) SHA1(31a197d27919a9db8e1b1a4089918f857a9e9ed6) )
ROM_LOAD( "epr-588.u26", 0x1c00, 0x0400, CRC(77598bf2) SHA1(df46e6f4dbf165e46c8d85d037828e96d87ad654) )
ROM_LOAD( "epr-589.u8", 0x2000, 0x0400, CRC(917c5204) SHA1(6633160e37d72f92f2135c9e56cd79e3d0cc6082) )
ROM_LOAD( "epr-590.u7", 0x2400, 0x0400, CRC(3cc9b52e) SHA1(6f2d7ce39c39b804924bafc09df585bcce250091) )
ROM_LOAD( "epr-591.u6", 0x2800, 0x0400, CRC(3e0ac65f) SHA1(3ae2f8c36b3d7042e5621125e6cdfcfbc0537dfe) )
ROM_LOAD( "epr-592.u5", 0x2c00, 0x0400, CRC(7864676c) SHA1(012292ead2f4f9fb16edc56e4ebe99e0cb4cf2d4) )
ROM_LOAD( "epr-593.u4", 0x3000, 0x0400, CRC(30233912) SHA1(a03a1b6271683a2e00298c30c2fea137403efab0) )
ROM_LOAD( "epr-594.u3", 0x3400, 0x0400, CRC(e93807cc) SHA1(2a6ad5162e539ed7be5efab1858f1c8119b70737) )
ROM_LOAD( "epr-595.u2", 0x3800, 0x0400, CRC(01f3f941) SHA1(33991ac68e73ef08d8dffcc5e9319f08dd2b2836) )
ROM_LOAD( "epr-596.u1", 0x3c00, 0x0400, CRC(ac63b3b5) SHA1(16466899d17a81c77dcb040028e54bfaf9ba9e9d) )
ROM_REGION( 0x0020, "proms", ROMREGION_INVERT )
ROM_LOAD( "pr-69.u49", 0x0000, 0x0020, CRC(c94dd091) SHA1(f88cfb033ff83adb7375652be1fa32ba489d8418) )
ROM_REGION( 0x0040, "user1", 0 ) // timing PROMs, missing on PCB but using the ones from nsub made the PCB work again
ROM_LOAD( "pr-33.u14", 0x0000, 0x0020, BAD_DUMP CRC(e60a7960) SHA1(b8b8716e859c57c35310efc4594262afedb84823) ) // control PROM
ROM_LOAD( "pr-34.u15", 0x0020, 0x0020, BAD_DUMP CRC(a1506b9d) SHA1(037c3db2ea40eca459e8acba9d1506dd28d72d10) ) // sequence PROM
ROM_REGION( 0x2c, "plds", ROMREGION_ERASE00 )
ROM_LOAD( "pay03.ic4", 0x00, 0x2c, NO_DUMP ) // PAL10H8. Protection related? on 97093-P-B-S stickered sub board.
ROM_END
ROM_START( sspaceat )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "155.u27", 0x0000, 0x0400, CRC(ba7bb86f) SHA1(030e6f69d3ae00456fc02d1dc0fb915a81689df4) )
@ -5012,7 +5173,8 @@ GAME( 1979, headon2s, headon2, headon2bw, headon2s, headonsa_state, empty_i
GAME( 1979, car2, headon2, headon2bw, car2, vicdual_state, empty_init, ROT0, "bootleg (RZ Bologna)", "Car 2 (bootleg of Head On 2)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) // title still says 'HeadOn 2'
GAME( 1979, invho2, 0, invho2, invho2, vicdual_state, empty_init, ROT270, "Sega", "Invinco / Head On 2 (set 1)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1979, invho2a, invho2, invho2, invho2, vicdual_state, empty_init, ROT270, "Sega", "Invinco / Head On 2 (set 2)", MACHINE_NOT_WORKING | MACHINE_WRONG_COLORS | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) // wrong colors make Head On 2 unplayable (all black)
GAME( 1980, nsub, 0, nsub, nsub, nsub_state, empty_init, ROT270, "Sega", "N-Sub (upright)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) // this is the upright set. cocktail set still needs to be dumped
GAME( 1980, nsub, 0, nsub, nsub, nsub_state, empty_init, ROT270, "Sega", "N-Sub (upright)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1980, nsubc, nsub, nsubc, nsubc, nsub_state, empty_init, ROT270, "Sega", "N-Sub (cocktail)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1980, samurai, 0, samurai, samurai, vicdual_state, empty_init, ROT270, "Sega", "Samurai (World)", MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1980, samuraij, samurai, samurai, samurai, vicdual_state, empty_init, ROT270, "Sega", "Samurai (Japan)", MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1979, invinco, 0, invinco, invinco, vicdual_state, empty_init, ROT270, "Sega", "Invinco", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )

View File

@ -27,7 +27,6 @@ public:
m_samples(*this, "samples"),
m_discrete(*this, "discrete"),
m_coinstate_timer(*this, "coinstate"),
m_nsub_coinage_timer(*this, "nsub_coin"),
m_screen(*this, "screen"),
m_vicdual_sound(*this, "vicdual_sound"),
m_proms(*this, "proms"),
@ -83,7 +82,6 @@ protected:
optional_device<samples_device> m_samples;
optional_device<discrete_sound_device> m_discrete;
required_device<timer_device> m_coinstate_timer;
optional_device<timer_device> m_nsub_coinage_timer;
required_device<screen_device> m_screen;
optional_device<vicdual_audio_device_base> m_vicdual_sound;
optional_memory_region m_proms;
@ -234,31 +232,44 @@ public:
nsub_state(const machine_config &mconfig, device_type type, const char *tag) :
vicdual_state(mconfig, type, tag),
m_s97269pb(*this,"s97269pb"),
m_s97271p(*this,"s97271p")
m_s97271p(*this,"s97271p"),
m_nsub_coinage_timer(*this, "nsub_coin")
{ }
void nsub(machine_config &config);
void nsubc(machine_config &config);
DECLARE_INPUT_CHANGED_MEMBER(nsub_coin_in);
protected:
virtual void machine_start() override ATTR_COLD;
virtual void machine_reset() override ATTR_COLD;
private:
required_device<s97269pb_device> m_s97269pb;
required_device<s97271p_device> m_s97271p;
optional_device<timer_device> m_nsub_coinage_timer;
int m_nsub_coin_counter = 0;
int m_nsub_play_counter = 0;
uint8_t m_prot_value = 0;
uint8_t nsub_io_r(offs_t offset);
void nsub_io_w(offs_t offset, uint8_t data);
void nsubc_io_w(offs_t offset, uint8_t data);
void nsubc_prot_w(uint8_t data);
TIMER_DEVICE_CALLBACK_MEMBER(nsub_coin_pulse);
DECLARE_MACHINE_START(nsub);
DECLARE_MACHINE_RESET(nsub);
DECLARE_MACHINE_START(nsubc);
virtual pen_t choose_pen(uint8_t x, uint8_t y, pen_t back_pen) override;
void nsub_io_map(address_map &map) ATTR_COLD;
void nsubc_io_map(address_map &map) ATTR_COLD;
void nsub_map(address_map &map) ATTR_COLD;
void nsubc_map(address_map &map) ATTR_COLD;
};
class carnival_state : public vicdual_state