summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--src/mame/drivers/cninja.c9
-rw-r--r--src/mame/drivers/cps2.c42
-rw-r--r--src/mame/drivers/m92.c52
-rw-r--r--src/mame/drivers/speedspn.c3
-rw-r--r--src/mame/includes/m92.h2
-rw-r--r--src/mame/video/cninja.c4
-rw-r--r--src/mame/video/deco16ic.c12
-rw-r--r--src/mame/video/deco16ic.h3
-rw-r--r--src/mame/video/m92.c127
-rw-r--r--src/mame/video/speedspn.c2
10 files changed, 214 insertions, 42 deletions
diff --git a/src/mame/drivers/cninja.c b/src/mame/drivers/cninja.c
index c45b1d2bd2d..36ec2d48679 100644
--- a/src/mame/drivers/cninja.c
+++ b/src/mame/drivers/cninja.c
@@ -193,11 +193,6 @@ static ADDRESS_MAP_START( cninja_map, AS_PROGRAM, 16 )
AM_RANGE(0x308000, 0x308fff) AM_WRITENOP /* Bootleg only */
ADDRESS_MAP_END
-static WRITE16_HANDLER( cninjabl_soundlatch_w )
-{
- // todo:
-}
-
static ADDRESS_MAP_START( cninjabl_map, AS_PROGRAM, 16 )
AM_RANGE(0x000000, 0x0bffff) AM_ROM
@@ -217,7 +212,7 @@ static ADDRESS_MAP_START( cninjabl_map, AS_PROGRAM, 16 )
AM_RANGE(0x17ff22, 0x17ff23) AM_READ_PORT("DSW")
AM_RANGE(0x17ff28, 0x17ff29) AM_READ_PORT("IN1")
- AM_RANGE(0x17ff2a, 0x17ff2b) AM_WRITE(cninjabl_soundlatch_w)
+ AM_RANGE(0x17ff2a, 0x17ff2b) AM_WRITE(stoneage_sound_w)
AM_RANGE(0x17ff2c, 0x17ff2d) AM_READ_PORT("IN0")
AM_RANGE(0x180000, 0x187fff) AM_RAM // more ram on bootleg?
@@ -2066,7 +2061,7 @@ GAME( 1991, cninja1, cninja, cninja, cninja, cninja, ROT0, "Data East Cor
GAME( 1991, cninjau, cninja, cninja, cninjau, cninja, ROT0, "Data East Corporation", "Caveman Ninja (US ver 4)", GAME_SUPPORTS_SAVE )
GAME( 1991, joemac, cninja, cninja, cninja, cninja, ROT0, "Data East Corporation", "Tatakae Genshizin Joe & Mac (Japan ver 1)", GAME_SUPPORTS_SAVE )
GAME( 1991, stoneage, cninja, stoneage, cninja, stoneage, ROT0, "bootleg", "Stoneage (bootleg of Caveman Ninja)", GAME_SUPPORTS_SAVE )
-GAME( 1991, cninjabl, cninja, cninjabl, cninja, 0, ROT0, "bootleg", "Caveman Ninja (bootleg)", GAME_NOT_WORKING | GAME_SUPPORTS_SAVE )
+GAME( 1991, cninjabl, cninja, cninjabl, cninja, 0, ROT0, "bootleg", "Caveman Ninja (bootleg)", GAME_SUPPORTS_SAVE )
GAME( 1991, robocop2, 0, robocop2, robocop2,0, ROT0, "Data East Corporation", "Robocop 2 (Euro/Asia v0.10)", GAME_SUPPORTS_SAVE )
GAME( 1991, robocop2u,robocop2,robocop2, robocop2,0, ROT0, "Data East Corporation", "Robocop 2 (US v0.05)", GAME_SUPPORTS_SAVE )
GAME( 1991, robocop2j,robocop2,robocop2, robocop2,0, ROT0, "Data East Corporation", "Robocop 2 (Japan v0.11)", GAME_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/cps2.c b/src/mame/drivers/cps2.c
index ec627ae58f6..37261be1a72 100644
--- a/src/mame/drivers/cps2.c
+++ b/src/mame/drivers/cps2.c
@@ -3612,15 +3612,11 @@ ROM_START( gigaman2 )
ROM_REGION(0x10000, "mcu", 0 ) /* sound MCU code */
ROM_LOAD( "89c4051.bin", 0x000000, 0x10000, NO_DUMP )
- ROM_REGION( 0x1000000, "gfx", 0 )
- /* you can use the original CPS2 gfx roms, but the 'GIGA part of GIGAMAN2 is missing, on real HW it isn't, roms are different */
-// ROMX_LOAD( "rm2.14m", 0x800000, 0x200000, CRC(9b1f00b4) SHA1(c1c5c2d9d00121425ae6598444d704f420ef4eef) , ROM_GROUPWORD | ROM_SKIP(6) )
-// ROMX_LOAD( "rm2.16m", 0x800002, 0x200000, CRC(c2bb0c24) SHA1(38724c49d9db49765a4ed9bc2dc8f57cec45ec7c) , ROM_GROUPWORD | ROM_SKIP(6) )
-// ROMX_LOAD( "rm2.18m", 0x800004, 0x200000, CRC(12257251) SHA1(20cb58afda0e6200991277817485340a6a41ae2b) , ROM_GROUPWORD | ROM_SKIP(6) )
-// ROMX_LOAD( "rm2.20m", 0x800006, 0x200000, CRC(f9b6e786) SHA1(aeb4acff7208e66a35198143fd2478039fdaa3a6) , ROM_GROUPWORD | ROM_SKIP(6) )
- /* TODO: understand the proper ROM loading and gfxdecoding */
- ROM_LOAD32_WORD( "cg_rom1.bin", 0x0000000, 0x800000, CRC(ed55a641) SHA1(fa798779a3787317937a646047620b1c0dbe102a) )
- ROM_LOAD32_WORD( "cg_rom2.bin", 0x0000002, 0x800000, CRC(63918c05) SHA1(3a7fdf88e87bdbc622504276287740c08df38f6f) )
+ ROM_REGION( 0x800000, "gfx", 0 )
+ ROM_LOAD( "cg_rom1.bin", 0x0000000, 0x400000, CRC(ed55a641) SHA1(fa798779a3787317937a646047620b1c0dbe102a) )
+ ROM_IGNORE( 0x400000 )
+ ROM_LOAD( "cg_rom2.bin", 0x0400000, 0x400000, CRC(63918c05) SHA1(3a7fdf88e87bdbc622504276287740c08df38f6f) )
+ ROM_IGNORE( 0x400000 )
ROM_REGION( 0x800000, "oki", 0 ) /* QSound samples */
/* No Qsound, OKI instead.. */
@@ -8038,6 +8034,23 @@ static WRITE16_HANDLER( gigaman2_dummyqsound_w )
state->m_gigaman2_dummyqsound_ram[offset] = data;
};
+/* rearrange the graphics data into the normal order */
+static void gigaman2_gfx_reorder(running_machine &machine)
+{
+ int i;
+ int length = machine.region( "gfx" )->bytes();
+ UINT16 *rom = (UINT16 *)machine.region("gfx")->base();
+ UINT16 *buf = auto_alloc_array(machine, UINT16, length );
+
+ memcpy (buf, rom, length);
+
+ for (i = 0; i < length/2; i++) {
+ rom[i] = buf[((i & ~7) >> 2) | ((i & 4) << 18) | ((i & 2) >> 1) | ((i & 1) << 21)];
+ }
+
+ auto_free( machine, buf );
+}
+
static DRIVER_INIT( gigaman2 )
{
cps_state *state = machine.driver_data<cps_state>();
@@ -8045,6 +8058,8 @@ static DRIVER_INIT( gigaman2 )
UINT16 *rom = (UINT16 *)machine.region("maincpu")->base();
int length = machine.region("maincpu")->bytes();
+ gigaman2_gfx_reorder(machine);
+
DRIVER_INIT_CALL(cps2);
state->m_gigaman2_dummyqsound_ram = auto_alloc_array(machine, UINT16, 0x20000 / 2);
@@ -8334,13 +8349,6 @@ GAME( 2001, progeara, progear, cps2, cps2_2p3b, cps2, ROT0, "Cave (Capc
This may not be a complete list of sets, it was taken from MamePlus. Other sets, and
further customized bootlegs boards are known to exist.
- ------------------------
- Other bootlegs
- ------------------------
-
- There is a bootleg of Megaman 2 called 'Gigaman 2' which has SMT roms, and replaces
- the Qsound hardware with an OKI6295 / AD-65 chip. No known complete dump exists.
-
*/
@@ -9631,7 +9639,7 @@ GAME( 1996, sfz2jd, sfa2, dead_cps2, cps2_2p6b, cps2, ROT0, "bootleg"
GAME( 1996, spf2td, spf2t, dead_cps2, cps2_2p2b, cps2, ROT0, "bootleg", "Super Puzzle Fighter II Turbo (USA 960620 Phoenix Edition) (bootleg)", GAME_SUPPORTS_SAVE )
GAME( 1996, spf2xjd, spf2t, dead_cps2, cps2_2p2b, cps2, ROT0, "bootleg", "Super Puzzle Fighter II X (Japan 960531 Phoenix Edition) (bootleg)", GAME_SUPPORTS_SAVE )
GAME( 1996, ddsomud, ddsom, dead_cps2, cps2_4p4b, cps2, ROT0, "bootleg", "Dungeons & Dragons: Shadow over Mystara (USA 960619 Phoenix Edition) (bootleg)", GAME_SUPPORTS_SAVE )
-GAME( 1996, gigaman2, megaman2, gigaman2, cps2_2p3b, gigaman2,ROT0, "bootleg", "Giga Man 2: The Power Fighters (bootleg of Mega Man 2: The Power Fighters)", GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) // flash roms aren't dumped, layer offsets different, different sound system
+GAME( 1996, gigaman2, megaman2, gigaman2, cps2_2p3b, gigaman2,ROT0, "bootleg", "Giga Man 2: The Power Fighters (bootleg of Mega Man 2: The Power Fighters)", GAME_IMPERFECT_GRAPHICS | GAME_NO_SOUND | GAME_SUPPORTS_SAVE ) // different layer offsets and sound system
GAME( 1996, megamn2d, megaman2, dead_cps2, cps2_2p3b, cps2, ROT0, "bootleg", "Mega Man 2: The Power Fighters (USA 960708 Phoenix Edition) (bootleg)", GAME_SUPPORTS_SAVE )
GAME( 1996, sfz2ald, sfz2al, dead_cps2, cps2_2p6b, cps2, ROT0, "bootleg", "Street Fighter Zero 2 Alpha (Asia 960826 Phoenix Edition) (bootleg)", GAME_SUPPORTS_SAVE )
GAME( 1996, xmvsfu1d, xmvsf, dead_cps2, cps2_2p6b, cps2, ROT0, "bootleg", "X-Men Vs. Street Fighter (USA 961004 Phoenix Edition) (bootleg)", GAME_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/m92.c b/src/mame/drivers/m92.c
index 93f269b82e9..18bf7d8352c 100644
--- a/src/mame/drivers/m92.c
+++ b/src/mame/drivers/m92.c
@@ -373,6 +373,28 @@ static ADDRESS_MAP_START( m92_portmap, AS_IO, 16 )
AM_RANGE(0xc0, 0xc1) AM_WRITE(m92_sound_reset_w)
ADDRESS_MAP_END
+static WRITE16_DEVICE_HANDLER( oki_bank_w )
+{
+ downcast<okim6295_device *>(device)->set_bank_base(0x40000 * ((data+1) & 0x3)); // +1?
+}
+
+static ADDRESS_MAP_START( ppan_portmap, AS_IO, 16 )
+ AM_RANGE(0x00, 0x01) AM_READ_PORT("P1_P2")
+ AM_RANGE(0x02, 0x03) AM_READ_PORT("COINS_DSW3")
+ AM_RANGE(0x04, 0x05) AM_READ_PORT("DSW")
+ AM_RANGE(0x06, 0x07) AM_READ_PORT("P3_P4")
+ AM_RANGE(0x08, 0x09) AM_READ(m92_sound_status_r) /* answer from sound CPU */
+ AM_RANGE(0x10, 0x11) AM_DEVWRITE("oki", oki_bank_w)
+ AM_RANGE(0x18, 0x19) AM_DEVREADWRITE8_MODERN("oki", okim6295_device, read, write, 0x00ff)
+ AM_RANGE(0x02, 0x03) AM_WRITE(m92_coincounter_w)
+ AM_RANGE(0x40, 0x43) AM_WRITENOP /* Interrupt controller, only written to at bootup */
+ AM_RANGE(0x80, 0x87) AM_WRITE(m92_pf1_control_w)
+ AM_RANGE(0x88, 0x8f) AM_WRITE(m92_pf2_control_w)
+ AM_RANGE(0x90, 0x97) AM_WRITE(m92_pf3_control_w)
+ AM_RANGE(0x98, 0x9f) AM_WRITE(m92_master_control_w)
+ADDRESS_MAP_END
+
+
/******************************************************************************/
static ADDRESS_MAP_START( sound_map, AS_PROGRAM, 16 )
@@ -966,7 +988,7 @@ static MACHINE_CONFIG_START( ppan, m92_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu",V33,18000000/2)
MCFG_CPU_PROGRAM_MAP(m92_map)
- MCFG_CPU_IO_MAP(m92_portmap)
+ MCFG_CPU_IO_MAP(ppan_portmap)
/* no Sound CPU */
@@ -976,7 +998,7 @@ static MACHINE_CONFIG_START( ppan, m92_state )
MCFG_TIMER_ADD_SCANLINE("scantimer", m92_scanline_interrupt, "screen", 0, 1)
/* video hardware */
- MCFG_VIDEO_ATTRIBUTES(VIDEO_BUFFERS_SPRITERAM)
+ MCFG_VIDEO_ATTRIBUTES(VIDEO_BUFFERS_SPRITERAM) // not really...
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
@@ -984,12 +1006,12 @@ static MACHINE_CONFIG_START( ppan, m92_state )
MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
MCFG_SCREEN_SIZE(512, 256)
MCFG_SCREEN_VISIBLE_AREA(80, 511-112, 8, 247) /* 320 x 240 */
- MCFG_SCREEN_UPDATE(m92)
+ MCFG_SCREEN_UPDATE(ppan)
MCFG_GFXDECODE(m92)
MCFG_PALETTE_LENGTH(2048)
- MCFG_VIDEO_START(m92)
+ MCFG_VIDEO_START(ppan)
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
@@ -1509,8 +1531,18 @@ ROM_START( ppan )
ROM_LOAD( "9.u109", 0x300000, 0x080000, CRC(9d466b1a) SHA1(c65b7afcfbd6bfec1b495a5dbce806ff34a7cbc1) )
ROM_LOAD( "8.u113", 0x380000, 0x080000, CRC(d08a5f6b) SHA1(ab762be9e5fadac2dc3149bfa69b8cbdbac3218b) )
- ROM_REGION( 0x80000, "oki", 0 ) /* OKI M6295 samples */
- ROM_LOAD( "3.u122", 0x000000, 0x080000, CRC(d0d37028) SHA1(0f58d220a1972bafa1299a19e704b7735886c8b6) )
+ ROM_REGION( 0x080000, "okidata", 0 ) /* OKI M6295 samples */
+ ROM_LOAD( "3.u122", 0x000000, 0x080000, CRC(d0d37028) SHA1(0f58d220a1972bafa1299a19e704b7735886c8b6) )
+
+ ROM_REGION( 0x100000, "oki", 0) /* OKI Samples copied here */
+ ROM_COPY( "okidata", 0x000000, 0x000000, 0x20000 )
+ ROM_COPY( "okidata", 0x000000, 0x020000, 0x20000 )
+ ROM_COPY( "okidata", 0x000000, 0x040000, 0x20000 )
+ ROM_COPY( "okidata", 0x020000, 0x060000, 0x20000 )
+ ROM_COPY( "okidata", 0x000000, 0x080000, 0x20000 )
+ ROM_COPY( "okidata", 0x040000, 0x0a0000, 0x20000 )
+ ROM_COPY( "okidata", 0x000000, 0x0c0000, 0x20000 )
+ ROM_COPY( "okidata", 0x060000, 0x0e0000, 0x20000 )
ROM_END
ROM_START( rtypeleo )
@@ -2091,20 +2123,14 @@ static DRIVER_INIT( majtitl2 )
}
/* TODO: figure out actual address map and other differences from real Irem h/w */
-/* Based on the size of the program ROMs, this board might have bankswitching */
static DRIVER_INIT( ppan )
{
m92_state *state = machine.driver_data<m92_state>();
UINT8 *ROM = machine.region("maincpu")->base();
-
memory_set_bankptr(machine, "bank1", &ROM[0xa0000]);
state->m_game_kludge = 0;
state->m_irq_vectorbase = 0x80;
-
- /* NOP out the sound comms */
- machine.device("maincpu")->memory().space(AS_IO)->nop_write(0x00, 0x01);
- machine.device("maincpu")->memory().space(AS_IO)->nop_write(0xc0, 0xc1);
}
/***************************************************************************/
@@ -2132,7 +2158,7 @@ GAME( 1992, skingame2,majtitl2, majtitl2, majtitl2, majtitl2, ROT0, "Irem
GAME( 1992, hook, 0, hook, hook, m92, ROT0, "Irem", "Hook (World)", GAME_SUPPORTS_SAVE )
GAME( 1992, hooku, hook, hook, hook, m92, ROT0, "Irem America", "Hook (US)", GAME_SUPPORTS_SAVE )
GAME( 1992, hookj, hook, hook, hook, m92, ROT0, "Irem", "Hook (Japan)", GAME_SUPPORTS_SAVE )
-GAME( 1992, ppan, hook, ppan, hook, ppan, ROT0, "bootleg", "Peter Pan (bootleg of Hook)", GAME_NOT_WORKING ) // PCB marked 'Peter Pan', no title screen, made in Italy?
+GAME( 1992, ppan, hook, ppan, hook, ppan, ROT0, "bootleg", "Peter Pan (bootleg of Hook)", GAME_IMPERFECT_GRAPHICS ) // PCB marked 'Peter Pan', no title screen, made in Italy?
GAME( 1992, rtypeleo, 0, rtypeleo, rtypeleo, m92_alt, ROT0, "Irem", "R-Type Leo (World)", GAME_SUPPORTS_SAVE )
GAME( 1992, rtypeleoj,rtypeleo, rtypeleo, rtypeleo, m92_alt, ROT0, "Irem", "R-Type Leo (Japan)", GAME_SUPPORTS_SAVE )
GAME( 1993, inthunt, 0, inthunt, inthunt, m92, ROT0, "Irem", "In The Hunt (World)", GAME_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/speedspn.c b/src/mame/drivers/speedspn.c
index 39e795e76e1..d351bc987d0 100644
--- a/src/mame/drivers/speedspn.c
+++ b/src/mame/drivers/speedspn.c
@@ -7,7 +7,6 @@ Notes:
e.g. BUTTON 1.
TODO:
-- A couple of garbage sprites on the player selection screen
- Unknown Port Writes:
cpu #0 (PC=00000D88): unmapped port byte write to 00000001 = 02
cpu #0 (PC=00006974): unmapped port byte write to 00000010 = 10
@@ -340,4 +339,4 @@ ROM_END
/*** GAME DRIVERS ************************************************************/
-GAME( 1994, speedspn, 0, speedspn, speedspn, 0, ROT180, "TCH", "Speed Spin", GAME_IMPERFECT_GRAPHICS )
+GAME( 1994, speedspn, 0, speedspn, speedspn, 0, ROT180, "TCH", "Speed Spin", 0 )
diff --git a/src/mame/includes/m92.h b/src/mame/includes/m92.h
index f4df40ef2dd..39761040dda 100644
--- a/src/mame/includes/m92.h
+++ b/src/mame/includes/m92.h
@@ -52,3 +52,5 @@ WRITE16_HANDLER( m92_master_control_w );
VIDEO_START( m92 );
SCREEN_UPDATE( m92 );
+VIDEO_START( ppan );
+SCREEN_UPDATE( ppan );
diff --git a/src/mame/video/cninja.c b/src/mame/video/cninja.c
index aa43a914423..7864ade634d 100644
--- a/src/mame/video/cninja.c
+++ b/src/mame/video/cninja.c
@@ -150,6 +150,10 @@ SCREEN_UPDATE( cninjabl )
cninja_state *state = screen->machine().driver_data<cninja_state>();
UINT16 flip = deco16ic_pf_control_r(state->m_deco_tilegen1, 0, 0xffff);
+ /* force layers to be enabled */
+ deco16ic_set_enable(state->m_deco_tilegen2, 0, 1 );
+ deco16ic_set_enable(state->m_deco_tilegen2, 1, 1 );
+
flip_screen_set(screen->machine(), BIT(flip, 7));
deco16ic_pf_update(state->m_deco_tilegen1, state->m_pf1_rowscroll, state->m_pf2_rowscroll);
deco16ic_pf_update(state->m_deco_tilegen2, state->m_pf3_rowscroll, state->m_pf4_rowscroll);
diff --git a/src/mame/video/deco16ic.c b/src/mame/video/deco16ic.c
index 6314abcc009..57e7c28068f 100644
--- a/src/mame/video/deco16ic.c
+++ b/src/mame/video/deco16ic.c
@@ -551,6 +551,17 @@ void deco16ic_set_scrolldx( device_t *device, int tmap, int size, int dx, int dx
}
}
+/* cninjabl does not enable background layers */
+void deco16ic_set_enable( device_t *device, int tmap, int enable )
+{
+ deco16ic_state *deco16ic = get_safe_token(device);
+
+ int shift = (tmap & 1) ? 15 : 7;
+ deco16ic->pf12_control[5] &= ~(1 << shift);
+ deco16ic->pf12_control[5] |= (enable & 1) << shift;
+}
+
+
/******************************************************************************/
WRITE16_DEVICE_HANDLER( deco16ic_pf1_data_w )
@@ -587,7 +598,6 @@ READ16_DEVICE_HANDLER( deco16ic_pf2_data_r )
return deco16ic->pf2_data[offset];
}
-
WRITE16_DEVICE_HANDLER( deco16ic_pf_control_w )
{
deco16ic_state *deco16ic = get_safe_token(device);
diff --git a/src/mame/video/deco16ic.h b/src/mame/video/deco16ic.h
index 81853ac453d..48d9ec60c7f 100644
--- a/src/mame/video/deco16ic.h
+++ b/src/mame/video/deco16ic.h
@@ -90,4 +90,7 @@ void deco16ic_set_pf1_8bpp_mode(device_t *device, int mode);
/* used by stoneage */
void deco16ic_set_scrolldx(device_t *device, int tmap, int size, int dx, int dx_if_flipped);
+/* used by cninjabl */
+void deco16ic_set_enable( device_t *device, int tmap, int enable );
+
#endif
diff --git a/src/mame/video/m92.c b/src/mame/video/m92.c
index d89ce95c46b..ec3d6e4aee2 100644
--- a/src/mame/video/m92.c
+++ b/src/mame/video/m92.c
@@ -284,6 +284,27 @@ VIDEO_START( m92 )
state_save_register_global_pointer(machine, machine.generic.paletteram.u16, 0x1000);
}
+VIDEO_START( ppan )
+{
+ m92_state *state = machine.driver_data<m92_state>();
+ int laynum;
+
+ VIDEO_START_CALL(m92);
+
+ for (laynum = 0; laynum < 3; laynum++)
+ {
+ pf_layer_info *layer = &state->m_pf_layer[laynum];
+
+ /* set scroll offsets */
+ tilemap_set_scrolldx(layer->tmap, 2 * laynum + 11, -2 * laynum + 11);
+ tilemap_set_scrolldy(layer->tmap, -8, -8);
+ tilemap_set_scrolldx(layer->wide_tmap, 2 * laynum - 256 + 11, -2 * laynum + 11 - 256);
+ tilemap_set_scrolldy(layer->wide_tmap, -8, -8);
+ }
+
+ machine.generic.buffered_spriteram.u16 = machine.generic.spriteram.u16; // sprite buffer control is never triggered
+}
+
/*****************************************************************************/
static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect)
@@ -370,6 +391,93 @@ static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const recta
}
}
+// This needs a lot of work...
+static void ppan_draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect)
+{
+ m92_state *state = machine.driver_data<m92_state>();
+ UINT16 *buffered_spriteram16 = machine.generic.buffered_spriteram.u16;
+ int offs,k;
+
+ for (k=0; k<8; k++)
+ {
+ for (offs = 0; offs < state->m_sprite_list; )
+ {
+ int x,y,sprite,colour,fx,fy,x_multi,y_multi,i,j,s_ptr,pri_back,pri_sprite;
+
+ y = buffered_spriteram16[offs+0] & 0x1ff;
+ x = buffered_spriteram16[offs+3] & 0x1ff;
+
+ if (buffered_spriteram16[offs+2] & 0x0080) pri_back=0; else pri_back=2;
+
+ sprite= buffered_spriteram16[offs+1];
+ colour = buffered_spriteram16[offs+2] & 0x007f;
+ pri_sprite= (buffered_spriteram16[offs+0] & 0xe000) >> 13;
+
+ fx = (buffered_spriteram16[offs+2] >> 8) & 1;
+ fy = (buffered_spriteram16[offs+2] >> 9) & 1;
+ y_multi = (buffered_spriteram16[offs+0] >> 9) & 3;
+ x_multi = (buffered_spriteram16[offs+0] >> 11) & 3;
+
+ y_multi = 1 << y_multi;
+ x_multi = 1 << x_multi;
+
+ offs += 4 * x_multi;
+ if (pri_sprite != k) continue;
+
+ x = x - 0;
+ y = 384 - 16 - y - 7;
+
+ y -= 128;
+ if (y < 0) y += 512;
+
+ if (fx) x+=16 * (x_multi - 1);
+
+ for (j=0; j<x_multi; j++)
+ {
+ s_ptr=8 * j;
+ if (!fy) s_ptr+=y_multi-1;
+
+ x &= 0x1ff;
+ for (i=0; i<y_multi; i++)
+ {
+ if (flip_screen_get(machine)) {
+ pdrawgfx_transpen(bitmap,cliprect,machine.gfx[1],
+ sprite + s_ptr,
+ colour,
+ !fx,!fy,
+ 464-x,240-(y-i*16),
+ machine.priority_bitmap,pri_back,0);
+
+ // wrap around x
+ pdrawgfx_transpen(bitmap,cliprect,machine.gfx[1],
+ sprite + s_ptr,
+ colour,
+ !fx,!fy,
+ 464-x+512,240-(y-i*16),
+ machine.priority_bitmap,pri_back,0);
+ } else {
+ pdrawgfx_transpen(bitmap,cliprect,machine.gfx[1],
+ sprite + s_ptr,
+ colour,
+ fx,fy,
+ x,y-i*16,
+ machine.priority_bitmap,pri_back,0);
+
+ // wrap around x
+ pdrawgfx_transpen(bitmap,cliprect,machine.gfx[1],
+ sprite + s_ptr,
+ colour,
+ fx,fy,
+ x-512,y-i*16,
+ machine.priority_bitmap,pri_back,0);
+ }
+ if (fy) s_ptr++; else s_ptr--;
+ }
+ if (fx) x-=16; else x+=16;
+ }
+ }
+ }
+}
/*****************************************************************************/
@@ -445,8 +553,6 @@ static void m92_screenrefresh(running_machine &machine, bitmap_t *bitmap,const r
tilemap_draw(bitmap, cliprect, state->m_pf_layer[0].tmap, TILEMAP_DRAW_LAYER1, 0);
tilemap_draw(bitmap, cliprect, state->m_pf_layer[0].wide_tmap, TILEMAP_DRAW_LAYER0, 1);
tilemap_draw(bitmap, cliprect, state->m_pf_layer[0].tmap, TILEMAP_DRAW_LAYER0, 1);
-
- draw_sprites(machine, bitmap, cliprect);
}
@@ -455,6 +561,23 @@ SCREEN_UPDATE( m92 )
m92_update_scroll_positions(screen->machine());
m92_screenrefresh(screen->machine(), bitmap, cliprect);
+ draw_sprites(screen->machine(), bitmap, cliprect);
+
+ /* Flipscreen appears hardwired to the dipswitch - strange */
+ if (input_port_read(screen->machine(), "DSW") & 0x100)
+ flip_screen_set(screen->machine(), 0);
+ else
+ flip_screen_set(screen->machine(), 1);
+ return 0;
+}
+
+SCREEN_UPDATE( ppan )
+{
+ m92_update_scroll_positions(screen->machine());
+ m92_screenrefresh(screen->machine(), bitmap, cliprect);
+
+ ppan_draw_sprites(screen->machine(), bitmap, cliprect);
+
/* Flipscreen appears hardwired to the dipswitch - strange */
if (input_port_read(screen->machine(), "DSW") & 0x100)
flip_screen_set(screen->machine(), 0);
diff --git a/src/mame/video/speedspn.c b/src/mame/video/speedspn.c
index b11f42e44d9..61dedd478d1 100644
--- a/src/mame/video/speedspn.c
+++ b/src/mame/video/speedspn.c
@@ -74,6 +74,8 @@ static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const recta
int ypos = source[3];
int color;
+ if (!attr && xpos) break; // end of sprite list marker?
+
if (attr&0x10) xpos +=0x100;
xpos = 0x1f8-xpos;