diff options
author | angelosa <lordkale4@gmail.com> | 2019-09-26 01:01:54 +0200 |
---|---|---|
committer | angelosa <lordkale4@gmail.com> | 2019-09-26 01:01:54 +0200 |
commit | 2961878efed71cb66413973dbc65b6f6ad0ecfba (patch) | |
tree | 349f2e3011aa388cb04ee77f9d8d0671f43e8008 /src/mame/drivers/alpha68k_i.cpp | |
parent | b86192703494e0b1db3260a76197dc80a713a011 (diff) |
Split up alpha68k I and N games into own files (nw)
Diffstat (limited to 'src/mame/drivers/alpha68k_i.cpp')
-rw-r--r-- | src/mame/drivers/alpha68k_i.cpp | 541 |
1 files changed, 541 insertions, 0 deletions
diff --git a/src/mame/drivers/alpha68k_i.cpp b/src/mame/drivers/alpha68k_i.cpp new file mode 100644 index 00000000000..1b96efb23ad --- /dev/null +++ b/src/mame/drivers/alpha68k_i.cpp @@ -0,0 +1,541 @@ +// license:BSD-3-Clause +// copyright-holders:Pierpaolo Prazzoli, Bryan McPhail, Stephane Humbert, Angelo Salese +/*************************************************************************** + + SNK/Alpha 68000 I board based games + + derived from alpha68k.cpp + + TODO: + - Both POST screens are X offset by a large margin, + i.e. Paddle Mania draws a middle line there, which isn't shown on real HW. + - Paddle Mania: ranking screen is unreadable, maybe + +***************************************************************************/ + +#include "emu.h" +#include "includes/alpha68k.h" + +/* + * + * Video Section + * + */ + +// TODO: document, also awfully similar to the II board but with proms +void alpha68k_I_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, int c, int d) +{ + gfx_element *gfx = m_gfxdecode->gfx(0); + + for (int offs = 0; offs < 0x400; offs += 0x20) + { + int mx = m_spriteram[offs + c]; + int my = (m_yshift - (mx >> 8)) & 0xff; + mx &= 0xff; + + for (int i = 0; i < 0x20; i++) + { + const u16 data = m_spriteram[offs + d + i]; + const u16 tile = data & 0x3fff; + const bool fy = data & 0x4000; + const u8 color = m_color_proms[tile << 1 | data >> 15]; + + gfx->transpen(bitmap,cliprect, tile, color, 0, fy, mx, my, 0); + + my = (my + 8) & 0xff; + } + } +} + +u32 alpha68k_I_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + bitmap.fill(m_palette->black_pen(), cliprect); + + /* This appears to be correct priority */ + draw_sprites(bitmap, cliprect, 2, 0x0800); + draw_sprites(bitmap, cliprect, 3, 0x0c00); + draw_sprites(bitmap, cliprect, 1, 0x0400); + return 0; +} + +/* + * + * Read/Write handler overrides + * + */ + +void thenextspace_state::tnextspc_soundlatch_w(u8 data) +{ + m_soundlatch->write(data); + m_audiocpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero); +} + +void thenextspace_state::tnextspc_coin_counters_w(offs_t offset, u16 data) +{ + machine().bookkeeping().coin_counter_w(offset, data & 0x01); +} + +void thenextspace_state::tnextspc_unknown_w(offs_t offset, u16 data) +{ + logerror("tnextspc_unknown_w : PC = %04x - offset = %04x - data = %04x\n", m_maincpu->pc(), offset, data); + if (offset == 0) + flipscreen_w(data & 0x100); +} + +/* + * + * Address Maps + * + */ + +void paddlemania_state::main_map(address_map &map) +{ + map(0x000000, 0x03ffff).rom(); // main program + map(0x080000, 0x083fff).ram(); // work RAM + map(0x100000, 0x103fff).ram().share("spriteram"); // video RAM + map(0x180000, 0x180001).portr("IN3").nopw(); // LSB: DSW0, MSB: watchdog(?) + map(0x180008, 0x180009).portr("IN4"); // LSB: DSW1 + map(0x300000, 0x300001).portr("IN0"); // joy1, joy2 + map(0x340000, 0x340001).portr("IN1"); // coin, start, service + map(0x380000, 0x380001).portr("IN2"); + map(0x380001, 0x380001).w(m_soundlatch, FUNC(generic_latch_8_device::write)); // LSB: sound latch write and RST38 trigger, joy3, joy4 +} + +void thenextspace_state::main_map(address_map &map) +{ + map(0x000000, 0x03ffff).rom(); + map(0x070000, 0x073fff).ram(); + map(0x0a0000, 0x0a3fff).ram().share("spriteram"); + map(0x0d0000, 0x0d0001).nopw(); // unknown write port (0) + map(0x0e0000, 0x0e0001).portr("P1"); + map(0x0e0002, 0x0e0003).portr("P2"); + map(0x0e0004, 0x0e0005).portr("SYSTEM"); + map(0x0e0006, 0x0e0007).nopw(); // unknown write port (0) + map(0x0e0008, 0x0e0009).portr("DSW1"); + map(0x0e000a, 0x0e000b).portr("DSW2"); + map(0x0e000e, 0x0e000f).nopw(); // unknown write port (0) + map(0x0e0018, 0x0e0019).r(FUNC(thenextspace_state::sound_cpu_r)); + map(0x0f0000, 0x0f0001).w(FUNC(thenextspace_state::tnextspc_unknown_w)); + map(0x0f0002, 0x0f0005).w(FUNC(thenextspace_state::tnextspc_coin_counters_w)); + map(0x0f0009, 0x0f0009).w(FUNC(thenextspace_state::tnextspc_soundlatch_w)); +} + +void paddlemania_state::sound_map(address_map &map) +{ + map(0x0000, 0x9fff).rom(); + map(0xe000, 0xe000).rw(m_soundlatch, FUNC(generic_latch_8_device::read), FUNC(generic_latch_8_device::clear_w)); + map(0xe800, 0xe800).rw("ymsnd", FUNC(ym3812_device::status_port_r), FUNC(ym3812_device::control_port_w)); + map(0xec00, 0xec00).w("ymsnd", FUNC(ym3812_device::write_port_w)); + map(0xf000, 0xf7ff).ram(); + map(0xfc00, 0xfc00).ram(); // unknown port +} + +void thenextspace_state::sound_map(address_map &map) +{ + map(0x0000, 0xefff).rom(); + map(0xf000, 0xf7ff).ram(); + map(0xf800, 0xf800).rw(m_soundlatch, FUNC(generic_latch_8_device::read), FUNC(generic_latch_8_device::clear_w)); +} + +void thenextspace_state::sound_iomap(address_map &map) +{ + map.global_mask(0xff); + map(0x00, 0x00).rw("ymsnd", FUNC(ym3812_device::status_port_r), FUNC(ym3812_device::control_port_w)); + map(0x20, 0x20).w("ymsnd", FUNC(ym3812_device::write_port_w)); + map(0x3b, 0x3b).nopr(); // unknown read port + map(0x3d, 0x3d).nopr(); // unknown read port + map(0x7b, 0x7b).nopr(); // unknown read port +} + +/* + * + * Gfx layout Defs + * + */ + +// TODO: merge with base driver somehow +static const gfx_layout charlayout = +{ + 8,8, /* 8x8 */ + RGN_FRAC(1,1), + 4, /* 4 bits per pixel */ + { STEP4(0,4) }, + { STEP4(8*4*4+3,-1), STEP4(3,-1) }, + { STEP8(0,4*4) }, + 32*8 /* every char takes 32 consecutive bytes */ +}; + +static GFXDECODE_START( gfx_alpha68k_I ) + GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, 64 ) +GFXDECODE_END + +/* + * + * Input Defs + * + */ + +// TODO: deduplicate these +#ifndef ALPHA68K_PLAYER_INPUT_LSB +#define ALPHA68K_PLAYER_INPUT_LSB( player, button3, start, active ) \ + PORT_BIT( 0x0001, active, IPT_JOYSTICK_UP ) PORT_PLAYER(player) \ + PORT_BIT( 0x0002, active, IPT_JOYSTICK_DOWN ) PORT_PLAYER(player) \ + PORT_BIT( 0x0004, active, IPT_JOYSTICK_LEFT ) PORT_PLAYER(player) \ + PORT_BIT( 0x0008, active, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(player) \ + PORT_BIT( 0x0010, active, IPT_BUTTON1 ) PORT_PLAYER(player) \ + PORT_BIT( 0x0020, active, IPT_BUTTON2 ) PORT_PLAYER(player) \ + PORT_BIT( 0x0040, active, button3 ) PORT_PLAYER(player) \ + PORT_BIT( 0x0080, active, start ) +#endif + +#ifndef ALPHA68K_PLAYER_INPUT_MSB +#define ALPHA68K_PLAYER_INPUT_MSB( player, button3, start, active ) \ + PORT_BIT( 0x0100, active, IPT_JOYSTICK_UP ) PORT_PLAYER(player) \ + PORT_BIT( 0x0200, active, IPT_JOYSTICK_DOWN ) PORT_PLAYER(player) \ + PORT_BIT( 0x0400, active, IPT_JOYSTICK_LEFT ) PORT_PLAYER(player) \ + PORT_BIT( 0x0800, active, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(player) \ + PORT_BIT( 0x1000, active, IPT_BUTTON1 ) PORT_PLAYER(player) \ + PORT_BIT( 0x2000, active, IPT_BUTTON2 ) PORT_PLAYER(player) \ + PORT_BIT( 0x4000, active, button3 ) PORT_PLAYER(player) \ + PORT_BIT( 0x8000, active, start ) +#endif + +static INPUT_PORTS_START( paddlema ) + PORT_START("IN0") // (bottom players) + ALPHA68K_PLAYER_INPUT_LSB( 1, IPT_UNKNOWN, IPT_UNKNOWN, IP_ACTIVE_LOW ) + ALPHA68K_PLAYER_INPUT_MSB( 2, IPT_UNKNOWN, IPT_UNKNOWN, IP_ACTIVE_LOW ) + + PORT_START("IN1") + PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_COIN2 ) + PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_START1 ) PORT_NAME("Button A (Start)") + PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_START2 ) PORT_NAME("Button B (Start)") + PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_SERVICE2 ) // "Test" ? + PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_SERVICE1 ) + PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START("IN2") // (top players) + ALPHA68K_PLAYER_INPUT_LSB( 3, IPT_UNKNOWN, IPT_UNKNOWN, IP_ACTIVE_LOW ) + ALPHA68K_PLAYER_INPUT_MSB( 4, IPT_UNKNOWN, IPT_UNKNOWN, IP_ACTIVE_LOW ) + + PORT_START("IN3") //DSW0 + PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SW1:8,7") + PORT_DIPSETTING( 0x03, DEF_STR( 1C_2C ) ) + PORT_DIPSETTING( 0x01, DEF_STR( 1C_3C ) ) + PORT_DIPSETTING( 0x02, DEF_STR( 1C_4C ) ) + PORT_DIPSETTING( 0x00, DEF_STR( 1C_6C ) ) + PORT_DIPNAME( 0x0c, 0x00, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW1:6,5") + PORT_DIPSETTING( 0x0c, DEF_STR( 4C_1C ) ) + PORT_DIPSETTING( 0x04, DEF_STR( 3C_1C ) ) + PORT_DIPSETTING( 0x08, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) ) + PORT_DIPNAME( 0x30, 0x30, DEF_STR( Game_Time ) ) PORT_DIPLOCATION("SW1:4,3") /* See notes for Game Time / Match Type combos */ + PORT_DIPSETTING( 0x00, "Default Time" ) + PORT_DIPSETTING( 0x20, "+10 Seconds" ) + PORT_DIPSETTING( 0x10, "+20 Seconds" ) + PORT_DIPSETTING( 0x30, "+30 Seconds" ) + PORT_DIPNAME( 0xc0, 0x40, "Match Type" ) PORT_DIPLOCATION("SW1:2,1") /* Styles are for Upright/Table & Single/Dual controls???? */ + PORT_DIPSETTING( 0x80, "A to B" ) /* Manual shows "Upright Sytle B" */ + PORT_DIPSETTING( 0x00, "A to C" ) /* Manual shows "Upright Sytle A" */ + PORT_DIPSETTING( 0x40, "A to E" ) /* Manual shows "Table Sytle C" */ +// PORT_DIPSETTING( 0xc0, "A to B" ) /* Manual shows "Table Sytle D" */ + + PORT_START("IN4") // DSW1 + PORT_SERVICE_DIPLOC( 0x01, IP_ACTIVE_HIGH, "SW2:8" ) + PORT_DIPUNUSED_DIPLOC( 0x02, 0x01, "SW2:7" ) /* Listed as "Unused" */ + PORT_DIPUNUSED_DIPLOC( 0x04, 0x01, "SW2:6" ) /* Listed as "Unused" */ + PORT_DIPUNUSED_DIPLOC( 0x08, 0x01, "SW2:5" ) /* Listed as "Unused" */ + PORT_DIPNAME( 0x30, 0x00, "Game Mode" ) PORT_DIPLOCATION("SW2:4,3") + PORT_DIPSETTING( 0x20, "Demo Sounds Off" ) + PORT_DIPSETTING( 0x00, "Demo Sounds On" ) + PORT_DIPSETTING( 0x10, "Win Match Against CPU (Cheat)") + PORT_DIPSETTING( 0x30, "Freeze" ) + PORT_DIPNAME( 0x40, 0x00, DEF_STR( Language ) ) PORT_DIPLOCATION("SW2:2") /* Manual shows "Off" for this dipswitch */ + PORT_DIPSETTING( 0x00, DEF_STR( English ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Japanese ) ) + PORT_DIPNAME( 0x80, 0x00, DEF_STR( Allow_Continue ) ) PORT_DIPLOCATION("SW2:1") + PORT_DIPSETTING( 0x80, DEF_STR( No ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) +INPUT_PORTS_END + +static INPUT_PORTS_START( tnextspc ) + PORT_START("P1") + ALPHA68K_PLAYER_INPUT_LSB( 1, IPT_UNKNOWN, IPT_START1, IP_ACTIVE_LOW ) + + PORT_START("P2") + ALPHA68K_PLAYER_INPUT_LSB( 2, IPT_UNKNOWN, IPT_START2, IP_ACTIVE_LOW ) + + PORT_START("SYSTEM") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE1 ) + 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("DSW1") + PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW1:1") + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPUNUSED_DIPLOC( 0x02, 0x02, "SW1:2" ) /* Listed as "Unused" */ + PORT_DIPNAME( 0x04, 0x04, "Additional Bonus Life" ) PORT_DIPLOCATION("SW1:3") + PORT_DIPSETTING( 0x04, "2nd Extend ONLY" ) + PORT_DIPSETTING( 0x00, "Every Extend" ) + PORT_DIPUNUSED_DIPLOC( 0x08, 0x08, "SW1:4" ) /* Listed as "Unused" */ + PORT_DIPNAME( 0x30, 0x30, DEF_STR( Coinage ) ) PORT_DIPLOCATION("SW1:5,6") + PORT_DIPSETTING( 0x30, "A 1C/1C B 1C/2C" ) + PORT_DIPSETTING( 0x20, "A 2C/1C B 1C/3C" ) + PORT_DIPSETTING( 0x10, "A 3C/1C B 1C/5C" ) + PORT_DIPSETTING( 0x00, "A 4C/1C B 1C/6C" ) + PORT_DIPNAME( 0xc0, 0x80, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW1:7,8") + PORT_DIPSETTING( 0xc0, "2" ) + PORT_DIPSETTING( 0x80, "3" ) + PORT_DIPSETTING( 0x40, "4" ) + PORT_DIPSETTING( 0x00, "5" ) + + PORT_START("DSW2") + PORT_DIPNAME( 0x03, 0x03, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:1,2") + PORT_DIPSETTING( 0x02, DEF_STR( Easy ) ) + PORT_DIPSETTING( 0x03, DEF_STR( Normal ) ) + PORT_DIPSETTING( 0x01, DEF_STR( Hard ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:3") PORT_CONDITION("DSW2",0x08,EQUALS,0x08) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x04, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, "Game Mode" ) PORT_DIPLOCATION("SW2:3") PORT_CONDITION("DSW2",0x08,EQUALS,0x00) + PORT_DIPSETTING( 0x00, "Freeze" ) + PORT_DIPSETTING( 0x04, "Infinite Lives (Cheat)") + PORT_DIPNAME( 0x08, 0x08, "SW2:3 Demo Sound/Game Mode" ) PORT_DIPLOCATION("SW2:4") + PORT_DIPSETTING( 0x08, DEF_STR( Demo_Sounds ) ) + PORT_DIPSETTING( 0x00, "Game Mode" ) + PORT_DIPNAME( 0x30, 0x30, DEF_STR( Bonus_Life ) ) PORT_DIPLOCATION("SW2:5,6") + PORT_DIPSETTING( 0x30, "100000 200000" ) + PORT_DIPSETTING( 0x20, "150000 300000" ) + PORT_DIPSETTING( 0x10, "300000 500000" ) + PORT_DIPSETTING( 0x00, DEF_STR( None ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Allow_Continue ) ) PORT_DIPLOCATION("SW2:7") + PORT_DIPSETTING( 0x00, DEF_STR( No ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Yes ) ) + PORT_SERVICE_DIPLOC( 0x80, IP_ACTIVE_LOW, "SW2:8" ) +INPUT_PORTS_END + +/* + * + * Machine Config + * + */ + +void alpha68k_I_state::base_config(machine_config &config) +{ + MCFG_MACHINE_START_OVERRIDE(alpha68k_I_state,common) + MCFG_MACHINE_RESET_OVERRIDE(alpha68k_I_state,common) + + /* sound hardware */ + SPEAKER(config, "speaker").front_center(); + + GENERIC_LATCH_8(config, m_soundlatch); + + ym3812_device &ymsnd(YM3812(config, "ymsnd", 4000000)); + ymsnd.irq_handler().set_inputline(m_audiocpu, 0); + ymsnd.add_route(ALL_OUTPUTS, "speaker", 1.0); +} + +void alpha68k_I_state::video_config(machine_config &config, int yshift) +{ + /* video hardware */ + SCREEN(config, m_screen, SCREEN_TYPE_RASTER); + set_screen_raw_params(config); + m_screen->set_screen_update(FUNC(alpha68k_I_state::screen_update)); + m_screen->set_palette(m_palette); + + GFXDECODE(config, m_gfxdecode, m_palette, gfx_alpha68k_I); + PALETTE(config, m_palette, FUNC(alpha68k_I_state::palette_init), 1024, 256); + + // TODO: add video device here + m_yshift = yshift; +} + +void paddlemania_state::paddlema(machine_config &config) +{ + base_config(config); + /* basic machine hardware */ + M68000(config, m_maincpu, 6000000); /* 24MHz/4? */ + m_maincpu->set_addrmap(AS_PROGRAM, &paddlemania_state::main_map); + m_maincpu->set_vblank_int("screen", FUNC(paddlemania_state::irq1_line_hold)); /* VBL */ + + Z80(config, m_audiocpu, 4000000); // 4Mhz seems to yield the correct tone + m_audiocpu->set_addrmap(AS_PROGRAM, &paddlemania_state::sound_map); + + video_config(config, 0); + + m_soundlatch->data_pending_callback().set_inputline(m_audiocpu, 0, HOLD_LINE); +} + +void thenextspace_state::tnextspc(machine_config &config) +{ + base_config(config); + /* basic machine hardware */ + M68000(config, m_maincpu, 9000000); /* Confirmed 18 MHz/2 */ + m_maincpu->set_addrmap(AS_PROGRAM, &thenextspace_state::main_map); + m_maincpu->set_vblank_int("screen", FUNC(thenextspace_state::irq1_line_hold)); /* VBL */ + + Z80(config, m_audiocpu, 4000000); + m_audiocpu->set_addrmap(AS_PROGRAM, &thenextspace_state::sound_map); + m_audiocpu->set_addrmap(AS_IO, &thenextspace_state::sound_iomap); + + video_config(config, 1); +} + + +/* + * + * ROM definitions + * + */ + +ROM_START( paddlema ) + ROM_REGION( 0x40000, "maincpu", 0 ) + ROM_LOAD16_BYTE( "padlem.6g", 0x00000, 0x10000, CRC(c227a6e8) SHA1(9c98be6e82a0dd76fd5b786601456b060407c57f) ) + ROM_LOAD16_BYTE( "padlem.3g", 0x00001, 0x10000, CRC(f11a21aa) SHA1(6eda9ff99f2aa8832fff1e2a054c5ffb6dae7ae3) ) + ROM_LOAD16_BYTE( "padlem.6h", 0x20000, 0x10000, CRC(8897555f) SHA1(7d30aa56a727700a6e02af92b065ed982a39ccc2) ) + ROM_LOAD16_BYTE( "padlem.3h", 0x20001, 0x10000, CRC(f0fe9b9d) SHA1(2e7a80dc25c549e57b7698052f53562a9a608205) ) + + ROM_REGION( 0x10000, "audiocpu", 0 ) + ROM_LOAD( "padlem.18c", 0x000000, 0x10000, CRC(9269778d) SHA1(bdc9100827f2e018db943d9f7d81b7936c155bf0) ) + + ROM_REGION( 0x10000, "mcu", 0 ) + ROM_LOAD( "alpha.mcu", 0x000, 0x1000, NO_DUMP ) + + ROM_REGION( 0x80000, "gfx1", 0 ) + ROM_LOAD16_BYTE( "padlem.9m", 0x00001, 0x10000, CRC(4ee4970d) SHA1(d57d9178129236dfb3a18688e8544e5e555ce559) ) + ROM_LOAD16_BYTE( "padlem.16m", 0x00000, 0x10000, CRC(0984fb4d) SHA1(6bc529db93fad277f286e4a380812c40c7f42301) ) + ROM_LOAD16_BYTE( "padlem.9n", 0x20001, 0x10000, CRC(a1756f15) SHA1(1220075e34c482e38eead9ea5e63b53b822e87de) ) + ROM_LOAD16_BYTE( "padlem.16n", 0x20000, 0x10000, CRC(4249e047) SHA1(9f35b316b5de65f8b1878fca283c9d534bb8ae25) ) + ROM_LOAD16_BYTE( "padlem.6m", 0x40001, 0x10000, CRC(3f47910c) SHA1(429d425dc57fbd868bc39c3d799bbaebcf313cc0) ) + ROM_LOAD16_BYTE( "padlem.13m", 0x40000, 0x10000, CRC(fd9dbc27) SHA1(c01f512afef7686c64cc0766c235084cc8e2f5fc) ) + ROM_LOAD16_BYTE( "padlem.6n", 0x60001, 0x10000, CRC(fe337655) SHA1(ac04124642b245d6a530c72d0dea1b1585b5cebd) ) + ROM_LOAD16_BYTE( "padlem.13n", 0x60000, 0x10000, CRC(1d460486) SHA1(4ade817a036447e7e6d4fe56fa2c5712f198c625) ) + + ROM_REGION( 0x300, "proms", 0 ) + ROM_LOAD( "padlem.a", 0x0000, 0x0100, CRC(cae6bcd6) SHA1(da3b3bdcdc7fefae80b0ef8365565bbe5ff0d5d2) ) /* R */ + ROM_LOAD( "padlem.b", 0x0100, 0x0100, CRC(b6df8dcb) SHA1(318ca20fab6608aa2956ec3bb82e8ae77c250d51) ) /* G */ + ROM_LOAD( "padlem.c", 0x0200, 0x0100, CRC(39ca9b86) SHA1(8b8d7aae85830e69366e86f8b6cccfb8140cd526) ) /* B */ + + ROM_REGION( 0x800, "clut_proms", 0 ) + ROM_LOAD( "padlem.17j", 0x0000, 0x0400, CRC(86170069) SHA1(8e2ad7afa50453e9a2dc89386ce02d10e7c89fbc) ) /* Clut low nibble */ + ROM_LOAD( "padlem.16j", 0x0400, 0x0400, CRC(8da58e2c) SHA1(6012715a2d3ba4cf8bc5a8250e7f28cb59913092) ) /* Clut high nibble */ + + ROM_REGION( 0x8000, "color_proms", 0 ) + ROM_LOAD( "padlem.18n", 0x0000, 0x8000, CRC(06506200) SHA1(d43337e5611cb0d3432942539ccf04bff2bdd345) ) /* Colour lookup */ +ROM_END + +ROM_START( tnextspc ) /* mask ROM for gfx */ + ROM_REGION( 0x40000, "maincpu", 0 ) + ROM_LOAD16_BYTE( "ns_4.bin", 0x00000, 0x20000, CRC(4617cba3) SHA1(615a1e67fc1c76d2be004b19a965f423b8daaf5c) ) + ROM_LOAD16_BYTE( "ns_3.bin", 0x00001, 0x20000, CRC(a6c47fef) SHA1(b7e4a0fffd5c44ed0b138c1ad04c3b6644ec463b) ) + + ROM_REGION( 0x10000, "audiocpu", 0 ) /* Sound CPU */ + ROM_LOAD( "ns_1.bin", 0x000000, 0x10000, CRC(fc26853c) SHA1(0118b048046a6125bba20dec081b936486eb1597) ) + + ROM_REGION( 0x080000, "gfx1", 0 ) + ROM_LOAD16_WORD_SWAP( "ns_5678.bin", 0x000000, 0x80000, CRC(22756451) SHA1(ce1d58a75ef4b09feb6fd9b3dd2de48b986070c0) ) + + ROM_REGION( 0x300, "proms", 0 ) + ROM_LOAD( "2.p2", 0x0000, 0x0100, CRC(1f388d48) SHA1(5e7dc37b4e177483f4fc65b801dca8ef132ac282) ) /* R */ + ROM_LOAD( "3.p3", 0x0100, 0x0100, CRC(0254533a) SHA1(d0ec0d03ed78482cd9344661eab3305640e85682) ) /* G */ + ROM_LOAD( "1.p1", 0x0200, 0x0100, CRC(488fd0e9) SHA1(cde18e9ca0b320ded821bea537c88424b02e8910) ) /* B */ + + ROM_REGION( 0x800, "clut_proms", 0 ) + ROM_LOAD( "5.p5", 0x0000, 0x0400, CRC(9c8527bf) SHA1(6b52ab37ea6c07a4814ed33deadd59d137b5fd4d) ) /* Clut high nibble */ + ROM_LOAD( "4.p4", 0x0400, 0x0400, CRC(cc9ff769) SHA1(e9de0371fd8bae7f08924891d78799ace97902b1) ) /* Clut low nibble */ + + ROM_REGION( 0x8000, "color_proms", 0 ) + ROM_LOAD( "ns_2.bin", 0x0000, 0x8000, CRC(05771d48) SHA1(9e9376b1449679f554eabf8cea023714dd1ed487) ) /* Colour lookup */ +ROM_END + +ROM_START( tnextspc2 ) // two bootleg PCBs have been found with the same ROMs as this set, the only difference being ns_2.bin being double sized with 1st and 2nd half identical + ROM_REGION( 0x40000, "maincpu", 0 ) + ROM_LOAD16_BYTE( "ns_4.bin", 0x00000, 0x20000, CRC(4617cba3) SHA1(615a1e67fc1c76d2be004b19a965f423b8daaf5c) ) /* b18.ic13 */ + ROM_LOAD16_BYTE( "ns_3.bin", 0x00001, 0x20000, CRC(a6c47fef) SHA1(b7e4a0fffd5c44ed0b138c1ad04c3b6644ec463b) ) /* b17.ic11 */ + + ROM_REGION( 0x10000, "audiocpu", 0 ) /* Sound CPU */ + ROM_LOAD( "ns_1.bin", 0x000000, 0x10000, CRC(fc26853c) SHA1(0118b048046a6125bba20dec081b936486eb1597) ) /* b1.ic129 */ + + ROM_REGION( 0x080000, "gfx1", 0 ) /* EPROMs, graphics are odd/even interleaved */ + ROM_LOAD16_BYTE( "b3.ic49", 0x00001, 0x10000, CRC(2bddf94d) SHA1(e064f48d0e3bb089753c1b59c863bb46bfa2bcee) ) + ROM_LOAD16_BYTE( "b7.ic53", 0x00000, 0x10000, CRC(a8b13a9a) SHA1(2f808c17e97a272be14099c53b287e665dd90b14) ) + ROM_LOAD16_BYTE( "b4.ic50", 0x20001, 0x10000, CRC(80c6c841) SHA1(ab0aa4cad6dcadae62f849e53c3c5cd909f77971) ) + ROM_LOAD16_BYTE( "b8.ic54", 0x20000, 0x10000, CRC(bf0762a0) SHA1(2fe32b1bf08dfc78668d7a12a7a67e6b2c0a2c48) ) + ROM_LOAD16_BYTE( "b5.ic51", 0x40001, 0x10000, CRC(e487750b) SHA1(f01d15f6624822dc78ff7e1cd2fdce54568ab5dc) ) + ROM_LOAD16_BYTE( "b9.ic55", 0x40000, 0x10000, CRC(45d730b9) SHA1(cb05942b12589e76afbbbac94cba0e8284bb3deb) ) + ROM_LOAD16_BYTE( "b6.ic52", 0x60001, 0x10000, CRC(0618cf49) SHA1(fad33b316613b82231f8372d0faf8cf1c669ac98) ) + ROM_LOAD16_BYTE( "b10.ic56", 0x60000, 0x10000, CRC(f48819df) SHA1(86d688590379316638ef4c3094c11629931cd69e) ) + + ROM_REGION( 0x300, "proms", 0 ) + ROM_LOAD( "2.p2", 0x0000, 0x0100, CRC(1f388d48) SHA1(5e7dc37b4e177483f4fc65b801dca8ef132ac282) ) /* R */ + ROM_LOAD( "3.p3", 0x0100, 0x0100, CRC(0254533a) SHA1(d0ec0d03ed78482cd9344661eab3305640e85682) ) /* G */ + ROM_LOAD( "1.p1", 0x0200, 0x0100, CRC(488fd0e9) SHA1(cde18e9ca0b320ded821bea537c88424b02e8910) ) /* B */ + + ROM_REGION( 0x800, "clut_proms", 0 ) + ROM_LOAD( "5.p5", 0x0000, 0x0400, CRC(9c8527bf) SHA1(6b52ab37ea6c07a4814ed33deadd59d137b5fd4d) ) /* Clut high nibble */ + ROM_LOAD( "4.p4", 0x0400, 0x0400, CRC(cc9ff769) SHA1(e9de0371fd8bae7f08924891d78799ace97902b1) ) /* Clut low nibble */ + + ROM_REGION( 0x8000, "color_proms", 0 ) + ROM_LOAD( "ns_2.bin", 0x0000, 0x8000, CRC(05771d48) SHA1(9e9376b1449679f554eabf8cea023714dd1ed487) ) /* b2.ic90 - Colour lookup */ +ROM_END + +ROM_START( tnextspcj ) + ROM_REGION( 0x40000, "maincpu", 0 ) + ROM_LOAD16_BYTE( "ns_ver1_j4.bin", 0x00000, 0x20000, CRC(5cdf710d) SHA1(c744e532f2f5a248d7b50a2e62cc77a0888d8dff) ) + ROM_LOAD16_BYTE( "ns_ver1_j3.bin", 0x00001, 0x20000, CRC(cd9532d0) SHA1(dbd7ced8f015334f0acb8d760f4d9d0299feef70) ) + + ROM_REGION( 0x10000, "audiocpu", 0 ) /* Sound CPU */ + ROM_LOAD( "ns_1.bin", 0x000000, 0x10000, CRC(fc26853c) SHA1(0118b048046a6125bba20dec081b936486eb1597) ) + + ROM_REGION( 0x080000, "gfx1", 0 ) + ROM_LOAD16_WORD_SWAP( "ns_5678.bin", 0x000000, 0x80000, CRC(22756451) SHA1(ce1d58a75ef4b09feb6fd9b3dd2de48b986070c0) ) + + ROM_REGION( 0x300, "proms", 0 ) + ROM_LOAD( "2.p2", 0x0000, 0x0100, CRC(1f388d48) SHA1(5e7dc37b4e177483f4fc65b801dca8ef132ac282) ) /* R */ + ROM_LOAD( "3.p3", 0x0100, 0x0100, CRC(0254533a) SHA1(d0ec0d03ed78482cd9344661eab3305640e85682) ) /* G */ + ROM_LOAD( "1.p1", 0x0200, 0x0100, CRC(488fd0e9) SHA1(cde18e9ca0b320ded821bea537c88424b02e8910) ) /* B */ + + ROM_REGION( 0x800, "clut_proms", 0 ) + ROM_LOAD( "5.p5", 0x0000, 0x0400, CRC(9c8527bf) SHA1(6b52ab37ea6c07a4814ed33deadd59d137b5fd4d) ) /* Clut high nibble */ + ROM_LOAD( "4.p4", 0x0400, 0x0400, CRC(cc9ff769) SHA1(e9de0371fd8bae7f08924891d78799ace97902b1) ) /* Clut low nibble */ + + ROM_REGION( 0x8000, "color_proms", 0 ) + ROM_LOAD( "ns_2.bin", 0x0000, 0x8000, CRC(05771d48) SHA1(9e9376b1449679f554eabf8cea023714dd1ed487) ) /* Colour lookup */ +ROM_END + +void paddlemania_state::init_paddlema() +{ + m_invert_controls = 0; + m_microcontroller_id = 0; + m_game_id = 0; +} + +void thenextspace_state::init_tnextspc() +{ + m_invert_controls = 0; + m_microcontroller_id = 0x890a; + m_game_id = 0; +} + +GAME( 1988, paddlema, 0, paddlema, paddlema, paddlemania_state, init_paddlema, ROT90, "SNK", "Paddle Mania", MACHINE_SUPPORTS_SAVE ) + +GAME( 1989, tnextspc, 0, tnextspc, tnextspc, thenextspace_state, init_tnextspc, ROT90, "SNK", "The Next Space (set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_COCKTAIL ) +GAME( 1989, tnextspc2, tnextspc, tnextspc, tnextspc, thenextspace_state, init_tnextspc, ROT90, "SNK", "The Next Space (set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_COCKTAIL ) +GAME( 1989, tnextspcj, tnextspc, tnextspc, tnextspc, thenextspace_state, init_tnextspc, ROT90, "SNK (Pasadena International Corp. license)", "The Next Space (Japan)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_COCKTAIL ) + |