diff options
author | 2011-09-06 12:37:49 +0000 | |
---|---|---|
committer | 2011-09-06 12:37:49 +0000 | |
commit | 86b55a6d552d5579ff1a7b5994772f30d22c478b (patch) | |
tree | 25ef0fa14c770e3eb3af62aa0ddf47b1424b5614 | |
parent | 9be96922f22c4806609dbb45ceb2a9053e6d8ad9 (diff) |
Decoded graphics in gigaman2 [iq_132]
Hooked up sound, fixed layer offsets in ppan [iq_132]
Fixed graphics glitches in speedspn on character select screen [iq_132]
Fixed layer enable in cninjabl, giving it working status [iq_132]
-rw-r--r-- | src/mame/drivers/cninja.c | 9 | ||||
-rw-r--r-- | src/mame/drivers/cps2.c | 42 | ||||
-rw-r--r-- | src/mame/drivers/m92.c | 52 | ||||
-rw-r--r-- | src/mame/drivers/speedspn.c | 3 | ||||
-rw-r--r-- | src/mame/includes/m92.h | 2 | ||||
-rw-r--r-- | src/mame/video/cninja.c | 4 | ||||
-rw-r--r-- | src/mame/video/deco16ic.c | 12 | ||||
-rw-r--r-- | src/mame/video/deco16ic.h | 3 | ||||
-rw-r--r-- | src/mame/video/m92.c | 127 | ||||
-rw-r--r-- | src/mame/video/speedspn.c | 2 |
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; |