From 828c8d4cbc89fbddfdb23f4afe6aabd4d05a670d Mon Sep 17 00:00:00 2001 From: hap Date: Sat, 22 Dec 2018 11:33:51 +0100 Subject: New working machines -------------------- Pastel Island (Japan, prototype) [ShouTime, David Haywood] --- src/mame/drivers/ssv.cpp | 261 +++++++++++++++++++++++++++++++++-------------- src/mame/includes/ssv.h | 34 ++---- src/mame/mame.lst | 1 + src/mame/video/ssv.cpp | 37 ++++--- 4 files changed, 217 insertions(+), 116 deletions(-) diff --git a/src/mame/drivers/ssv.cpp b/src/mame/drivers/ssv.cpp index d507509c783..ec54e4a2495 100644 --- a/src/mame/drivers/ssv.cpp +++ b/src/mame/drivers/ssv.cpp @@ -187,8 +187,7 @@ void ssv_state::update_irq_state() IRQ_CALLBACK_MEMBER(ssv_state::irq_callback) { - int i; - for ( i = 0; i <= 7; i++ ) + for (int i = 0; i <= 7; i++) { if (m_requested_int & (1 << i)) { @@ -243,6 +242,16 @@ TIMER_DEVICE_CALLBACK_MEMBER(ssv_state::interrupt) update_irq_state(); } } + else if ((scanline == 120) && m_raster_interrupt_enabled) + { + /* scanline can almost certainly be programmed, where is the register? (unless it's really just a 'half screen' interrupt) + this split position seems to be correct for pastelis 2 player mode, the end credits aren't quite right, but like the 'for japan' warning it seems to be + more based on polling vblank_read than the raster interrupt. + note, janjans1 and keithlcy and ryorioh might be using it too (they enable this IRQ level at least) */ + m_requested_int |= 1 << 2; + update_irq_state(); + //m_screen->update_partial(m_screen->vpos() - 1); + } else if(scanline == 240) { m_requested_int |= 1 << 3; // vblank @@ -671,8 +680,7 @@ WRITE16_MEMBER(ssv_state::srmp7_sound_bank_w) if (ACCESSING_BITS_0_7) { int bank = 0x400000/2 * (data & 1); // uint16_t address - int voice; - for (voice = 0; voice < 32; voice++) + for (int voice = 0; voice < 32; voice++) m_ensoniq->voice_bank_w(voice, bank); } // popmessage("%04X",data); @@ -1229,6 +1237,61 @@ static INPUT_PORTS_START( dynagear ) PORT_BIT( 0x00ff, IP_ACTIVE_LOW, IPT_UNKNOWN ) INPUT_PORTS_END +/*************************************************************************** + Pastel Island +***************************************************************************/ + +static INPUT_PORTS_START( pastelis ) + PORT_INCLUDE(ssv_joystick) + + PORT_MODIFY("DSW1") // IN0 - $210002 + PORT_DIPNAME( 0x0001, 0x0001, DEF_STR( Unused ) ) PORT_DIPLOCATION( "DSW1:1" ) + PORT_DIPSETTING( 0x0001, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION( "DSW1:2" ) + PORT_DIPSETTING( 0x0002, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_SERVICE_DIPLOC( 0x0004, IP_ACTIVE_LOW, "DSW1:3" ) + PORT_DIPNAME( 0x0008, 0x0000, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION( "DSW1:4" ) + PORT_DIPSETTING( 0x0008, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0030, 0x0030, DEF_STR( Coin_A ) ) PORT_DIPLOCATION( "DSW1:5,6" ) + PORT_DIPSETTING( 0x0010, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( 2C_3C ) ) + PORT_DIPSETTING( 0x0030, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x0020, DEF_STR( 1C_2C ) ) + PORT_DIPNAME( 0x00c0, 0x00c0, DEF_STR( Coin_B ) ) PORT_DIPLOCATION( "DSW1:7,8" ) + PORT_DIPSETTING( 0x0040, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( 2C_3C ) ) + PORT_DIPSETTING( 0x00c0, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x0080, DEF_STR( 1C_2C ) ) + + PORT_MODIFY("DSW2") // IN0 - $210004 + PORT_DIPNAME( 0x0003, 0x0003, DEF_STR( Difficulty ) ) PORT_DIPLOCATION( "DSW2:1,2" ) + PORT_DIPSETTING( 0x0002, DEF_STR( Easy) ) + PORT_DIPSETTING( 0x0003, DEF_STR( Normal ) ) + PORT_DIPSETTING( 0x0001, DEF_STR( Hard ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( Hardest ) ) + PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unused ) ) PORT_DIPLOCATION( "DSW2:3" ) + PORT_DIPSETTING( 0x0004, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unused ) ) PORT_DIPLOCATION( "DSW2:4" ) + PORT_DIPSETTING( 0x0008, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0030, 0x0030, DEF_STR( Lives ) ) PORT_DIPLOCATION( "DSW2:5,6" ) + PORT_DIPSETTING( 0x0020, "1" ) + PORT_DIPSETTING( 0x0030, "2" ) + PORT_DIPSETTING( 0x0010, "3" ) + PORT_DIPSETTING( 0x0000, "4" ) + PORT_DIPNAME( 0x00c0, 0x00c0, "Extend" ) PORT_DIPLOCATION( "DSW2:7,8" ) + PORT_DIPSETTING( 0x0000, "70000, every 90000" ) + PORT_DIPSETTING( 0x0040, "every 70000" ) + PORT_DIPSETTING( 0x0080, "50000, every 70000" ) + PORT_DIPSETTING( 0x00c0, "every 50000" ) + + PORT_START("ADD_BUTTONS") // IN5 - $500008 + PORT_BIT( 0x00ff, IP_ACTIVE_LOW, IPT_UNKNOWN ) +INPUT_PORTS_END /*************************************************************************** Eagle Shot Golf @@ -2452,59 +2515,61 @@ GFXDECODE_END ***************************************************************************/ -void ssv_state::init(int interrupt_ultrax) +void ssv_state::init_ssv() { - int i; - for (i = 0; i < 16; i++) - m_tile_code[i] = ( (i & 8) ? (1 << 16) : 0 ) + - ( (i & 4) ? (2 << 16) : 0 ) + - ( (i & 2) ? (4 << 16) : 0 ) + - ( (i & 1) ? (8 << 16) : 0 ) ; + for (int i = 0; i < 16; i++) + m_tile_code[i] = bitswap<4>(i,0,1,2,3) << 16; + enable_video(1); - m_interrupt_ultrax = interrupt_ultrax; + m_interrupt_ultrax = 0; save_item(NAME(m_requested_int)); save_item(NAME(m_irq_enable)); } -void ssv_state::init_hypreac2_common() +void ssv_state::init_ssv_tilescram() { - int i; + init_ssv(); - for (i = 0; i < 16; i++) - m_tile_code[i] = (i << 16); + for (int i = 0; i < 16; i++) + m_tile_code[i] = i << 16; } -void ssv_state::init_eaglshot_banking() + +// srmp4 +// ((uint16_t *)memregion("maincpu")->base())[0x2b38/2] = 0x037a; /* patch to see gal test mode */ + +void ssv_state::init_sexy() { - init_hypreac2_common(); + init_ssv_tilescram(); + save_item(NAME(m_sxyreact_serial)); + save_item(NAME(m_sxyreact_dial)); +} + +void ssv_state::init_eaglshot() +{ + init_ssv_tilescram(); membank("gfxrom")->configure_entries(0, 6+1, memregion("gfxdata")->base(), 0x200000); } -void ssv_state::init_drifto94() { init(0); } -void ssv_state::init_eaglshot() { init(0); init_eaglshot_banking(); } -void ssv_state::init_gdfs() { init(0); } -void ssv_state::init_hypreact() { init(0); } -void ssv_state::init_hypreac2() { init(0); init_hypreac2_common(); } -void ssv_state::init_janjans1() { init(0); } -void ssv_state::init_keithlcy() { init(0); } -void ssv_state::init_meosism() { init(0); } -void ssv_state::init_mslider() { init(0); } -void ssv_state::init_ryorioh() { init(0); } -void ssv_state::init_srmp4() { init(0); -// ((uint16_t *)memregion("maincpu")->base())[0x2b38/2] = 0x037a; /* patch to see gal test mode */ +void ssv_state::init_jsk() +{ + init_ssv(); + save_item(NAME(m_latches)); +} + +void ssv_state::init_pastelis() +{ + init_ssv(); + m_raster_interrupt_enabled = true; } -void ssv_state::init_srmp7() { init(0); } -void ssv_state::init_stmblade() { init(0); } -void ssv_state::init_survarts() { init(0); } -void ssv_state::init_dynagear() { init(0); } -void ssv_state::init_sxyreact() { init(0); init_hypreac2_common(); save_item(NAME(m_sxyreact_serial)); save_item(NAME(m_sxyreact_dial)); } -void ssv_state::init_cairblad() { init(0); init_hypreac2_common(); } -void ssv_state::init_sxyreac2() { init(0); init_hypreac2_common(); save_item(NAME(m_sxyreact_serial)); save_item(NAME(m_sxyreact_dial)); } -void ssv_state::init_twineag2() { init(1); } -void ssv_state::init_ultrax() { init(1); } -void ssv_state::init_vasara() { init(0); } -void ssv_state::init_jsk() { init(0); save_item(NAME(m_latches)); } + +void ssv_state::init_ssv_irq1() +{ + init_ssv(); + m_interrupt_ultrax = 1; +} + #define SSV_MASTER_CLOCK XTAL(48'000'000)/3 @@ -2529,6 +2594,7 @@ void ssv_state::ssv(machine_config &config) m_screen->set_raw(SSV_PIXEL_CLOCK,SSV_HTOTAL,SSV_HBEND,SSV_HBSTART,SSV_VTOTAL,SSV_VBEND,SSV_VBSTART); m_screen->set_screen_update(FUNC(ssv_state::screen_update)); m_screen->set_palette(m_palette); + //m_screen->set_video_attributes(VIDEO_UPDATE_SCANLINE); GFXDECODE(config, m_gfxdecode, m_palette, gfx_ssv); PALETTE(config, m_palette, 0x8000).set_format(PALETTE_FORMAT_XRGB); @@ -2732,7 +2798,7 @@ void ssv_state::stmblade(machine_config &config) m_dsp->set_addrmap(AS_DATA, &ssv_state::dsp_data_map); /* don't need this, game just does a simple check at boot then the DSP stalls into a tight loop. */ -// MCFG_QUANTUM_PERFECT_CPU("maincpu") + //config.m_perfect_cpu_quantum = subtag("maincpu"); NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); @@ -2877,6 +2943,16 @@ void ssv_state::jsk(machine_config &config) m_screen->set_visarea(0, (0xca - 0x22)*2-1, 0, (0xfe - 0x0e)-1); } +void ssv_state::pastelis(machine_config &config) +{ + ssv(config); + + /* basic machine hardware */ + m_maincpu->set_addrmap(AS_PROGRAM, &ssv_state::keithlcy_map); + + /* video hardware */ + m_screen->set_visarea(0, (0xd6-0x26)*2-1, 0, (0xfe - 0x0e)-1); +} /*************************************************************************** @@ -3471,6 +3547,39 @@ ROM_START( keithlcy ) ROM_LOAD16_WORD_SWAP( "vg002-06.u33", 0x200000, 0x200000, CRC(75d8c8ea) SHA1(545768ac6d8953cd3044680953476276337a94b9) ) ROM_END +/*************************************************************************** + + Pastel Island + +STS-0001 (ROM board) + +***************************************************************************/ + +ROM_START( pastelis ) + ROM_REGION( 0x400000, "maincpu", 0 ) /* V60 Code */ + ROM_LOAD( "data.u28", 0x000000, 0x200000, CRC(e71dcc02) SHA1(38a66255c8fbf8f1a49a2180719bfaf26fd37ccf) ) // 27c160 - 1ST AND 2ND HALF IDENTICAL (but correct, 2nd half unused) + ROM_LOAD16_BYTE( "prg_l.u26", 0x100000, 0x080000, CRC(96c9d4d7) SHA1(27ba8218f667ae12f8d1b14db259c0797220126f) ) // 27c040 + ROM_LOAD16_BYTE( "prg_h.u27", 0x100001, 0x080000, CRC(a513733b) SHA1(c3caeb0d1b9c56a61552865815cddf67b649d435) ) // 27c040 + + ROM_REGION( 0x0a00000, "gfx1", ROMREGION_ERASEFF ) /* Sprites */ + ROM_LOAD( "a0.u13", 0x0000000, 0x200000, CRC(61688d29) SHA1(e5cb96ea9190bc20ad9c10e9d0773350f7defc3f) ) // 27c160 + ROM_LOAD( "a1.u14", 0x0200000, 0x080000, CRC(d38b9805) SHA1(3b573f7e6b70ce68389001c1e119d4d8dd1cde3d) ) // 27c4100 + ROM_LOAD( "b0.u16", 0x0280000, 0x200000, CRC(fc93f7bb) SHA1(86baddd1809adc9b4a48919db58ddd008af3aa99) ) // 27c160 + ROM_LOAD( "b1.u17", 0x0480000, 0x080000, CRC(b85f4933) SHA1(00b13a8ffd4d5fa6e9c399ff4e369e2563761a42) ) // 27c4100 + ROM_LOAD( "c0.u21", 0x0500000, 0x200000, CRC(7128bc51) SHA1(a858d4de3a2acedf7e1257a607a482781ac490e8) ) // 27c160 + ROM_LOAD( "c1.u22", 0x0700000, 0x080000, CRC(2462206b) SHA1(35071e629877b77d23c865b407fd3dd824fbb8be) ) // 27c4100 + ROM_LOAD( "d0.u34", 0x0780000, 0x200000, CRC(4f79415a) SHA1(af70656f5a0f46f773a238260e53f646efb2d238) ) // 27c160 + ROM_LOAD( "d1.u35", 0x0980000, 0x080000, CRC(d3c75994) SHA1(08ff739181e4316f55f3ba50513f8fdb16db7116) ) // 27c4100 - FIXED BITS (xxxxxxxx00000000) (but correct, just lower bpp) (used for startup logo animation only) + + ROM_REGION16_BE( 0x400000, "ensoniq.0", 0 ) /* Samples */ + ROM_LOAD16_WORD_SWAP( "snd_0.u29", 0x000000, 0x200000, CRC(8bc0dde9) SHA1(4dffef4d709da02d6dfd15b5266ed529e148c024) ) // 27c160 + ROM_LOAD16_WORD_SWAP( "snd_1.u33", 0x200000, 0x200000, CRC(f958e0ea) SHA1(699ea44a0ef9f9a969e4eb692592b07d629923d1) ) // 27c160 + + ROM_REGION( 0x117, "pals", 0 ) + ROM_LOAD( "u25.bin", 0x000, 0x117, CRC(e9d28bdf) SHA1(b83b798ce5a46bcda05e82fa1dd0d24260c9b5cc) ) + ROM_LOAD( "u36.bin", 0x000, 0x117, CRC(6b5d083e) SHA1(1f127944c7b1f1e3c3e53f1091f8641f8d454445) ) +ROM_END + /*************************************************************************** @@ -4717,62 +4826,64 @@ ROM_END ***************************************************************************/ -// year rom clone machine inputs init monitor manufacturer title flags +// year rom clone machine inputs init monitor manufacturer title flags + +GAME( 1993, dynagear, 0, dynagear, dynagear, ssv_state, init_ssv, ROT0, "Sammy", "Dyna Gear", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) -GAME( 1993, dynagear, 0, dynagear, dynagear, ssv_state, init_dynagear, ROT0, "Sammy", "Dyna Gear", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) +GAME( 1993, keithlcy, 0, keithlcy, keithlcy, ssv_state, init_ssv, ROT0, "Visco", "Dramatic Adventure Quiz Keith & Lucy (Japan)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) -GAME( 1993, keithlcy, 0, keithlcy, keithlcy, ssv_state, init_keithlcy, ROT0, "Visco", "Dramatic Adventure Quiz Keith & Lucy (Japan)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) +GAME( 1993, pastelis, 0, pastelis, pastelis, ssv_state, init_pastelis, ROT0, "Visco", "Pastel Island (Japan, prototype)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) // imperfect raster effects in ending credits and shadows -GAME( 1993, srmp4, 0, srmp4, srmp4, ssv_state, init_srmp4, ROT0, "Seta", "Super Real Mahjong PIV (Japan)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) -GAME( 1993, srmp4o, srmp4, srmp4, srmp4, ssv_state, init_srmp4, ROT0, "Seta", "Super Real Mahjong PIV (Japan, older set)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) // by the numbering of the program ROMs this should be older +GAME( 1993, srmp4, 0, srmp4, srmp4, ssv_state, init_ssv, ROT0, "Seta", "Super Real Mahjong PIV (Japan)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) +GAME( 1993, srmp4o, srmp4, srmp4, srmp4, ssv_state, init_ssv, ROT0, "Seta", "Super Real Mahjong PIV (Japan, older set)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) // by the numbering of the program ROMs this should be older -GAME( 1993, survarts, 0, survarts, survarts, ssv_state, init_survarts, ROT0, "Sammy", "Survival Arts (World)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) -GAME( 1993, survartsu, survarts, survarts, survarts, ssv_state, init_survarts, ROT0, "American Sammy", "Survival Arts (USA)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) -GAME( 1993, survartsj, survarts, survarts, survarts, ssv_state, init_survarts, ROT0, "Sammy", "Survival Arts (Japan)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) +GAME( 1993, survarts, 0, survarts, survarts, ssv_state, init_ssv, ROT0, "Sammy", "Survival Arts (World)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) +GAME( 1993, survartsu, survarts, survarts, survarts, ssv_state, init_ssv, ROT0, "American Sammy", "Survival Arts (USA)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) +GAME( 1993, survartsj, survarts, survarts, survarts, ssv_state, init_ssv, ROT0, "Sammy", "Survival Arts (Japan)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) -GAME( 1994, drifto94, 0, drifto94, drifto94, ssv_state, init_drifto94, ROT0, "Visco", "Drift Out '94 - The Hard Order (Japan)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) +GAME( 1994, drifto94, 0, drifto94, drifto94, ssv_state, init_ssv, ROT0, "Visco", "Drift Out '94 - The Hard Order (Japan)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) -GAME( 1994, eaglshot, 0, eaglshot, eaglshot, ssv_state, init_eaglshot, ROT0, "Sammy", "Eagle Shot Golf (US)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) -GAME( 1994, eaglshotj, eaglshot, eaglshot, eaglshot, ssv_state, init_eaglshot, ROT0, "Sammy", "Eagle Shot Golf (Japan, bootleg?)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) // from a bootleg ROM board with no proper Seta / Sammy markings, possibly original ROM tho? +GAME( 1994, eaglshot, 0, eaglshot, eaglshot, ssv_state, init_eaglshot, ROT0, "Sammy", "Eagle Shot Golf (US)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) +GAME( 1994, eaglshotj, eaglshot, eaglshot, eaglshot, ssv_state, init_eaglshot, ROT0, "Sammy", "Eagle Shot Golf (Japan, bootleg?)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) // from a bootleg ROM board with no proper Seta / Sammy markings, possibly original ROM tho? -GAME( 1995, hypreact, 0, hypreact, hypreact, ssv_state, init_hypreact, ROT0, "Sammy", "Mahjong Hyper Reaction (Japan)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) +GAME( 1995, hypreact, 0, hypreact, hypreact, ssv_state, init_ssv, ROT0, "Sammy", "Mahjong Hyper Reaction (Japan)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) -GAME( 1994, twineag2, 0, twineag2, twineag2, ssv_state, init_twineag2, ROT270, "Seta", "Twin Eagle II - The Rescue Mission", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) +GAME( 1994, twineag2, 0, twineag2, twineag2, ssv_state, init_ssv_irq1, ROT270, "Seta", "Twin Eagle II - The Rescue Mission", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) -GAME( 1995, gdfs, 0, gdfs, gdfs, ssv_state, init_gdfs, ROT0, "Banpresto", "Mobile Suit Gundam Final Shooting (Japan)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) // title screen spells the title "Mobil" but standardized spelling is "Mobile" it also lists the company name as "Banprest" instead of "Banpresto" +GAME( 1995, gdfs, 0, gdfs, gdfs, ssv_state, init_ssv, ROT0, "Banpresto", "Mobile Suit Gundam Final Shooting (Japan)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) // title screen spells the title "Mobil" but standardized spelling is "Mobile" it also lists the company name as "Banprest" instead of "Banpresto" // Ultra X Weapon: "developed by Seta" in ending screen -GAME( 1995, ultrax, 0, ultrax, ultrax, ssv_state, init_ultrax, ROT270, "Banpresto / Tsuburaya Productions / Seta", "Ultra X Weapons / Ultra Keibitai", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) // 95-01-30 13:27:15 on startup -GAME( 1995, ultraxg, ultrax, ultrax, ultrax, ssv_state, init_ultrax, ROT270, "Banpresto / Tsuburaya Productions / Seta", "Ultra X Weapons / Ultra Keibitai (GAMEST review build)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) // 95-02-16 15:30:24 on startup (newer, but could have pause functionality due to being a review build so left as clone) +GAME( 1995, ultrax, 0, ultrax, ultrax, ssv_state, init_ssv_irq1, ROT270, "Banpresto / Tsuburaya Productions / Seta", "Ultra X Weapons / Ultra Keibitai", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) // 95-01-30 13:27:15 on startup +GAME( 1995, ultraxg, ultrax, ultrax, ultrax, ssv_state, init_ssv_irq1, ROT270, "Banpresto / Tsuburaya Productions / Seta", "Ultra X Weapons / Ultra Keibitai (GAMEST review build)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) // 95-02-16 15:30:24 on startup (newer, but could have pause functionality due to being a review build so left as clone) -GAME( 1996, janjans1, 0, janjans1, janjans1, ssv_state, init_janjans1, ROT0, "Visco", "Lovely Pop Mahjong JangJang Shimasho (Japan)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) +GAME( 1996, janjans1, 0, janjans1, janjans1, ssv_state, init_ssv, ROT0, "Visco", "Lovely Pop Mahjong JangJang Shimasho (Japan)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) -GAME( 1996?, meosism, 0, meosism, meosism, ssv_state, init_meosism, ROT0, "Sammy", "Meosis Magic (Japan)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) +GAME( 1996?, meosism, 0, meosism, meosism, ssv_state, init_ssv, ROT0, "Sammy", "Meosis Magic (Japan)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) -GAME( 1996, stmblade, 0, stmblade, stmblade, ssv_state, init_stmblade, ROT270, "Visco", "Storm Blade (US)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) -GAME( 1996, stmbladej, stmblade, stmblade, stmblade, ssv_state, init_stmblade, ROT270, "Visco", "Storm Blade (Japan)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) +GAME( 1996, stmblade, 0, stmblade, stmblade, ssv_state, init_ssv, ROT270, "Visco", "Storm Blade (US)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) +GAME( 1996, stmbladej, stmblade, stmblade, stmblade, ssv_state, init_ssv, ROT270, "Visco", "Storm Blade (Japan)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) -GAME( 1997, hypreac2, 0, hypreac2, hypreac2, ssv_state, init_hypreac2, ROT0, "Sammy", "Mahjong Hyper Reaction 2 (Japan)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) +GAME( 1997, hypreac2, 0, hypreac2, hypreac2, ssv_state, init_ssv_tilescram, ROT0, "Sammy", "Mahjong Hyper Reaction 2 (Japan)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) -GAME( 1997, jsk, 0, jsk, jsk, ssv_state, init_jsk, ROT0, "Visco", "Joryuu Syougi Kyoushitsu (Japan)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) +GAME( 1997, jsk, 0, jsk, jsk, ssv_state, init_jsk, ROT0, "Visco", "Joryuu Syougi Kyoushitsu (Japan)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) -GAME( 1997, koikois2, 0, janjans1, koikois2, ssv_state, init_janjans1, ROT0, "Visco", "Koi Koi Shimasho 2 - Super Real Hanafuda (Japan)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) +GAME( 1997, koikois2, 0, janjans1, koikois2, ssv_state, init_ssv, ROT0, "Visco", "Koi Koi Shimasho 2 - Super Real Hanafuda (Japan)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) -GAME( 1997, mslider, 0, mslider, mslider, ssv_state, init_mslider, ROT0, "Visco / Datt Japan", "Monster Slider (Japan)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) +GAME( 1997, mslider, 0, mslider, mslider, ssv_state, init_ssv, ROT0, "Visco / Datt Japan", "Monster Slider (Japan)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) -GAME( 1997, srmp7, 0, srmp7, srmp7, ssv_state, init_srmp7, ROT0, "Seta", "Super Real Mahjong P7 (Japan)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) +GAME( 1997, srmp7, 0, srmp7, srmp7, ssv_state, init_ssv, ROT0, "Seta", "Super Real Mahjong P7 (Japan)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) -GAME( 1998, ryorioh, 0, ryorioh, ryorioh, ssv_state, init_ryorioh, ROT0, "Visco", "Gourmet Battle Quiz Ryohrioh CooKing (Japan)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) +GAME( 1998, ryorioh, 0, ryorioh, ryorioh, ssv_state, init_ssv, ROT0, "Visco", "Gourmet Battle Quiz Ryohrioh CooKing (Japan)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) -GAME( 1998, sxyreact, 0, sxyreact, sxyreact, ssv_state, init_sxyreact, ROT0, "Sammy", "Pachinko Sexy Reaction (Japan)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) +GAME( 1998, sxyreact, 0, sxyreact, sxyreact, ssv_state, init_sexy, ROT0, "Sammy", "Pachinko Sexy Reaction (Japan)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) -GAME( 1999, sxyreac2, 0, sxyreac2, sxyreact, ssv_state, init_sxyreac2, ROT0, "Sammy", "Pachinko Sexy Reaction 2 (Japan)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) +GAME( 1999, sxyreac2, 0, sxyreac2, sxyreact, ssv_state, init_sexy, ROT0, "Sammy", "Pachinko Sexy Reaction 2 (Japan)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) -GAME( 1999, cairblad, 0, cairblad, cairblad, ssv_state, init_cairblad, ROT270, "Sammy", "Change Air Blade (Japan)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) +GAME( 1999, cairblad, 0, cairblad, cairblad, ssv_state, init_ssv_tilescram, ROT270, "Sammy", "Change Air Blade (Japan)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) -GAME( 2000, janjans2, 0, janjans1, janjans2, ssv_state, init_janjans1, ROT0, "Visco", "Lovely Pop Mahjong JangJang Shimasho 2 (Japan)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) +GAME( 2000, janjans2, 0, janjans1, janjans2, ssv_state, init_ssv, ROT0, "Visco", "Lovely Pop Mahjong JangJang Shimasho 2 (Japan)", MACHINE_NO_COCKTAIL | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) -GAME( 2000, vasara, 0, vasara, vasara, ssv_state, init_vasara, ROT270, "Visco", "Vasara", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) +GAME( 2000, vasara, 0, vasara, vasara, ssv_state, init_ssv, ROT270, "Visco", "Vasara", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) -GAME( 2001, vasara2, 0, vasara, vasara2, ssv_state, init_vasara, ROT270, "Visco", "Vasara 2 (set 1)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) -GAME( 2001, vasara2a, vasara2, vasara, vasara2, ssv_state, init_vasara, ROT270, "Visco", "Vasara 2 (set 2)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) +GAME( 2001, vasara2, 0, vasara, vasara2, ssv_state, init_ssv, ROT270, "Visco", "Vasara 2 (set 1)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) +GAME( 2001, vasara2a, vasara2, vasara, vasara2, ssv_state, init_ssv, ROT270, "Visco", "Vasara 2 (set 2)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/includes/ssv.h b/src/mame/includes/ssv.h index 520c2cf6ca3..00b1bd83412 100644 --- a/src/mame/includes/ssv.h +++ b/src/mame/includes/ssv.h @@ -34,6 +34,7 @@ public: m_gdfs_tmapscroll(*this, "gdfs_tmapscroll"), m_gdfs_st0020(*this, "st0020_spr"), m_input_sel(*this, "input_sel"), + m_raster_interrupt_enabled(false), m_io_key(*this, "KEY%u", 0U), m_io_service(*this, "SERVICE"), m_io_paddle(*this, "PADDLE"), @@ -64,30 +65,16 @@ public: void jsk(machine_config &config); void hypreact(machine_config &config); void keithlcy(machine_config &config); + void pastelis(machine_config &config); void cairblad(machine_config &config); - void init_gdfs(); - void init_sxyreac2(); - void init_hypreac2(); - void init_hypreact(); - void init_dynagear(); + void init_ssv(); + void init_ssv_tilescram(); void init_eaglshot(); - void init_srmp4(); - void init_srmp7(); - void init_keithlcy(); - void init_meosism(); - void init_vasara(); - void init_cairblad(); - void init_sxyreact(); - void init_janjans1(); - void init_ryorioh(); - void init_drifto94(); - void init_survarts(); - void init_ultrax(); - void init_stmblade(); + void init_sexy(); + void init_ssv_irq1(); void init_jsk(); - void init_twineag2(); - void init_mslider(); + void init_pastelis(); private: required_device m_maincpu; @@ -115,6 +102,7 @@ private: std::unique_ptr m_eaglshot_gfxram; tilemap_t *m_gdfs_tmap; int m_interrupt_ultrax; + bool m_raster_interrupt_enabled; uint16_t m_sxyreact_serial; int m_sxyreact_dial; uint32_t m_latches[8]; @@ -176,14 +164,10 @@ private: void get_tile(int x, int y, int size, int page, int& code, int& attr, int& flipx, int& flipy); void draw_row_64pixhigh(bitmap_ind16 &bitmap, const rectangle &cliprect, int in_sy, int scroll); void draw_layer(bitmap_ind16 &bitmap, const rectangle &cliprect, int nr); - + void draw_sprites_tiles(bitmap_ind16 &bitmap, const rectangle &cliprect, int code, int flipx, int flipy, int gfx, int shadow, int color, int sx, int sy, int xnum, int ynum); void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect); void enable_video(int enable); - void init(int interrupt_ultrax); - void init_hypreac2_common(); - void init_eaglshot_banking(); - void drifto94_map(address_map &map); void dsp_data_map(address_map &map); diff --git a/src/mame/mame.lst b/src/mame/mame.lst index f1827473fe1..3a4347a5f3c 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -35877,6 +35877,7 @@ keithlcy // (c) 1993 Visco koikois2 // (c) 1997 Visco meosism // (c) 1996?Sammy mslider // (c) 1997 Visco / Datt Japan +pastelis // (c) 1993 Visco ryorioh // (c) 1998 Visco srmp4 // (c) 1993 Seta srmp4o // (c) 1993 Seta diff --git a/src/mame/video/ssv.cpp b/src/mame/video/ssv.cpp index 062274161d9..8e1e81b2d7c 100644 --- a/src/mame/video/ssv.cpp +++ b/src/mame/video/ssv.cpp @@ -161,12 +161,12 @@ void ssv_state::drawgfx_line(bitmap_ind16 &bitmap, const rectangle &cliprect, in { 0x3f,0 }, // 0: ultrax, twineag2 text - is there a local / global mixup somewhere, or is this an 'invalid' setting that just enables all planes? { 0xff,0 }, // 1: unverified case, mimic old driver behavior of only using lowest bit { 0x3f,0 }, // 2: unverified case, mimic old driver behavior of only using lowest bit - { 0xff,0 }, // 3: unverified case, mimic old driver behavior of only using lowest bit + { 0xff,0 }, // 3: unverified case, mimic old driver behavior of only using lowest bit (pastelis sets this on shadows, but seems to need behavior beyond what we currently emulate, maybe also changes number of shadow bits in addition to global shadow mask/shift?) { 0x0f,0 }, // 4: eagle shot 4bpp birdie text { 0xf0,4 }, // 5: eagle shot 4bpp Japanese text { 0x3f,0 }, // 6: common 6bpp case + keithlcy (logo), drifto94 (wheels) masking { 0xff,0 } // 7: common 8bpp case - }; + }; const uint8_t gfxbppmask = BPP_MASK_TABLE[gfx & 0x07].gfx_mask; const uint8_t gfxshift = BPP_MASK_TABLE[gfx & 0x07].gfx_shift; @@ -386,14 +386,22 @@ VIDEO_START_MEMBER(ssv_state,gdfs) READ16_MEMBER(ssv_state::vblank_r) { + // maybe reads scanline counter? pastelis reads this on the 'for use in Japan' screen + end credits + // and adjusts y position to do a polled raster effect by changing scroll values midscreen + uint16_t ret = 0x0000; + if (m_screen->vblank()) - return 0x2000 | 0x1000; - else - return 0x0000; + ret |= 0x3000; + + if (m_screen->hblank()) + ret |= 0x0800; + + return ret; } WRITE16_MEMBER(ssv_state::scroll_w) { + m_screen->update_partial(m_screen->vpos() - 1); // pastelis FOR USE IN JAPAN screen polls the vblank / hblank to do a raster effect COMBINE_DATA(m_scroll + offset); /* offsets 60-7f: CRT Controller */ @@ -810,7 +818,12 @@ void ssv_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect) } if (local_num != 0) - draw_row_64pixhigh(bitmap, cliprect, sy, scroll); + { + if (spritelist_local[0] != 0) // index 0 is the 'always automatically drawn background layer' so don't draw it twice even if it's specified later? + { + draw_row_64pixhigh(bitmap, cliprect, sy, scroll); + } + } } else { @@ -896,7 +909,7 @@ void ssv_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect) } else { - // hypreact, hypreac2, janjanspritelist_global, meosism, ryorioh, survarts, sxyreact, sxyreac2, vasara, vasara2 + // hypreact, hypreac2, janjans1, meosism, ryorioh, survarts, sxyreact, sxyreac2, vasara, vasara2 sx = sprites_offsx + sx; sy = sprites_offsy - sy - (ynum * 8); } @@ -979,15 +992,7 @@ uint32_t ssv_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, c // printf("%04x %04x %04x %04x\n",clip.min_x, clip.max_x, clip.min_y, clip.max_y); - if (clip.min_x < 0) clip.min_x = 0; - if (clip.min_y < 0) clip.min_y = 0; - if (clip.max_x > cliprect.max_x) clip.max_x = cliprect.max_x; - if (clip.max_y > cliprect.max_y) clip.max_y = cliprect.max_y; - - if (clip.min_x > clip.max_x) - clip.min_x = clip.max_x; - if (clip.min_y > clip.max_y) - clip.min_y = clip.max_y; + clip &= cliprect; if (!m_enable_video) return 0; -- cgit v1.2.3