Added driver_data struct and save states to battlex.c, carjmbre.c, popper.c and spaceg.c

...some Omori love ;)
This commit is contained in:
Fabio Priuli 2009-11-19 08:40:17 +00:00
parent cf62f4e8bc
commit a7d1114325
11 changed files with 675 additions and 364 deletions

3
.gitattributes vendored
View File

@ -2326,6 +2326,7 @@ src/mame/includes/badlands.h svneol=native#text/plain
src/mame/includes/bagman.h svneol=native#text/plain src/mame/includes/bagman.h svneol=native#text/plain
src/mame/includes/balsente.h svneol=native#text/plain src/mame/includes/balsente.h svneol=native#text/plain
src/mame/includes/batman.h svneol=native#text/plain src/mame/includes/batman.h svneol=native#text/plain
src/mame/includes/battlex.h svneol=native#text/plain
src/mame/includes/beathead.h svneol=native#text/plain src/mame/includes/beathead.h svneol=native#text/plain
src/mame/includes/beezer.h svneol=native#text/plain src/mame/includes/beezer.h svneol=native#text/plain
src/mame/includes/bigevglf.h svneol=native#text/plain src/mame/includes/bigevglf.h svneol=native#text/plain
@ -2339,6 +2340,7 @@ src/mame/includes/buggychl.h svneol=native#text/plain
src/mame/includes/bzone.h svneol=native#text/plain src/mame/includes/bzone.h svneol=native#text/plain
src/mame/includes/canyon.h svneol=native#text/plain src/mame/includes/canyon.h svneol=native#text/plain
src/mame/includes/capbowl.h svneol=native#text/plain src/mame/includes/capbowl.h svneol=native#text/plain
src/mame/includes/carjmbre.h svneol=native#text/plain
src/mame/includes/carpolo.h svneol=native#text/plain src/mame/includes/carpolo.h svneol=native#text/plain
src/mame/includes/cave.h svneol=native#text/plain src/mame/includes/cave.h svneol=native#text/plain
src/mame/includes/ccastles.h svneol=native#text/plain src/mame/includes/ccastles.h svneol=native#text/plain
@ -2519,6 +2521,7 @@ src/mame/includes/policetr.h svneol=native#text/plain
src/mame/includes/polyplay.h svneol=native#text/plain src/mame/includes/polyplay.h svneol=native#text/plain
src/mame/includes/poolshrk.h svneol=native#text/plain src/mame/includes/poolshrk.h svneol=native#text/plain
src/mame/includes/pooyan.h svneol=native#text/plain src/mame/includes/pooyan.h svneol=native#text/plain
src/mame/includes/popper.h svneol=native#text/plain
src/mame/includes/psikyosh.h svneol=native#text/plain src/mame/includes/psikyosh.h svneol=native#text/plain
src/mame/includes/psx.h svneol=native#text/plain src/mame/includes/psx.h svneol=native#text/plain
src/mame/includes/qix.h svneol=native#text/plain src/mame/includes/qix.h svneol=native#text/plain

View File

@ -1,68 +1,65 @@
/* battlex.c - by David Haywood /***************************************************************************
Stephh's notes : Omori Battle Cross
- I don't know exactly how to call the "Free Play" Dip Switch 8( driver by David Haywood
It's effect is the following :
* you need to insert at least one credit and start a game
* when the game is over, you can start another games WITHOUT
inserting another coins
Note that the number of credits is decremented though.
Credits are BCD coded on 3 bytes (0x000000-0x999999) at addresses
0xa039 (LSB), 0xa03a and 0xa03b (MSB), but only the LSB is displayed.
- Setting the flipscreen dip to ON also hides the copyright message (?) Stephh's notes :
TO DO : - I don't know exactly how to call the "Free Play" Dip Switch 8(
It's effect is the following :
* you need to insert at least one credit and start a game
* when the game is over, you can start another games WITHOUT
inserting another coins
Note that the number of credits is decremented though.
Credits are BCD coded on 3 bytes (0x000000-0x999999) at addresses
0xa039 (LSB), 0xa03a and 0xa03b (MSB), but only the LSB is displayed.
- missing starfield - Setting the flipscreen dip to ON also hides the copyright message (?)
- game speed, its seems to be controlled by the IRQ's, how fast should it TO DO :
be? firing seems frustratingly inconsistant
- colors match Tim's screen shots, but there's no guarantee RGB are in the - missing starfield
correct order.
*/
/* - game speed, its seems to be controlled by the IRQ's, how fast should it
be? firing seems frustratingly inconsistant
Battle Cross (c)1982 Omori - colors match Tim's screen shots, but there's no guarantee RGB are in the
correct order.
CPU: Z80A ****************************************************************************
Sound: AY-3-8910
Other: 93419 (in socket marked 93219)
RAM: 4116(x12), 2114(x2), 2114(x6) Battle Cross (c)1982 Omori
PROMS: none
XTAL: 10.0 MHz CPU: Z80A
Sound: AY-3-8910
Other: 93419 (in socket marked 93219)
*/ RAM: 4116(x12), 2114(x2), 2114(x6)
PROMS: none
XTAL: 10.0 MHz
***************************************************************************/
#include "driver.h" #include "driver.h"
#include "cpu/z80/z80.h" #include "cpu/z80/z80.h"
#include "deprecat.h" #include "deprecat.h"
#include "sound/ay8910.h" #include "sound/ay8910.h"
#include "battlex.h"
extern WRITE8_HANDLER( battlex_palette_w ); /*************************************
extern WRITE8_HANDLER( battlex_videoram_w ); *
extern WRITE8_HANDLER( battlex_scroll_x_lsb_w ); * Memory maps
extern WRITE8_HANDLER( battlex_scroll_x_msb_w ); *
extern WRITE8_HANDLER( battlex_flipscreen_w ); *************************************/
extern PALETTE_INIT( battlex );
extern VIDEO_START( battlex );
extern VIDEO_UPDATE( battlex );
/*** MEMORY & PORT READ / WRITE **********************************************/
static ADDRESS_MAP_START( battlex_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( battlex_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x5fff) AM_ROM AM_RANGE(0x0000, 0x5fff) AM_ROM
AM_RANGE(0x8000, 0x8fff) AM_RAM_WRITE(battlex_videoram_w) AM_BASE(&videoram) AM_RANGE(0x8000, 0x8fff) AM_RAM_WRITE(battlex_videoram_w) AM_BASE_MEMBER(battlex_state, videoram)
AM_RANGE(0x9000, 0x91ff) AM_RAM AM_BASE(&spriteram) AM_RANGE(0x9000, 0x91ff) AM_RAM AM_BASE_MEMBER(battlex_state, spriteram)
AM_RANGE(0xa000, 0xa3ff) AM_RAM AM_RANGE(0xa000, 0xa3ff) AM_RAM
AM_RANGE(0xe000, 0xe03f) AM_RAM_WRITE(battlex_palette_w) AM_RANGE(0xe000, 0xe03f) AM_RAM_WRITE(battlex_palette_w)
ADDRESS_MAP_END ADDRESS_MAP_END
@ -87,7 +84,11 @@ static ADDRESS_MAP_START( io_map, ADDRESS_SPACE_IO, 8 )
AM_RANGE(0x33, 0x33) AM_WRITE(battlex_scroll_x_msb_w) AM_RANGE(0x33, 0x33) AM_WRITE(battlex_scroll_x_msb_w)
ADDRESS_MAP_END ADDRESS_MAP_END
/*** INPUT PORTS *************************************************************/ /*************************************
*
* Input ports
*
*************************************/
static INPUT_PORTS_START( battlex ) static INPUT_PORTS_START( battlex )
PORT_START("DSW1") /* IN0 */ PORT_START("DSW1") /* IN0 */
@ -158,9 +159,14 @@ static INPUT_PORTS_START( battlex )
PORT_DIPSETTING( 0x80, DEF_STR( On ) ) PORT_DIPSETTING( 0x80, DEF_STR( On ) )
INPUT_PORTS_END INPUT_PORTS_END
/*** GFX DECODE **************************************************************/
/*************************************
*
* Graphics definitions
*
*************************************/
static const gfx_layout battlex_charlayout = static const gfx_layout battlex_charlayout =
{ {
8,8, 8,8,
@ -192,16 +198,34 @@ static GFXDECODE_START( battlex )
GFXDECODE_ENTRY( "gfx2", 0, battlex_spritelayout, 16*8, 8 ) GFXDECODE_ENTRY( "gfx2", 0, battlex_spritelayout, 16*8, 8 )
GFXDECODE_END GFXDECODE_END
/*** MACHINE DRIVERS *********************************************************/
/*************************************
*
* Machine driver
*
*************************************/
static MACHINE_RESET( battlex )
{
battlex_state *state = (battlex_state *)machine->driver_data;
state->scroll_lsb = 0;
state->scroll_msb = 0;
}
static MACHINE_DRIVER_START( battlex ) static MACHINE_DRIVER_START( battlex )
/* driver data */
MDRV_DRIVER_DATA(battlex_state)
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD("maincpu", Z80,10000000/2 ) /* 10 MHz, divided ? (Z80A CPU) */ MDRV_CPU_ADD("maincpu", Z80,10000000/2 ) /* 10 MHz, divided ? (Z80A CPU) */
MDRV_CPU_PROGRAM_MAP(battlex_map) MDRV_CPU_PROGRAM_MAP(battlex_map)
MDRV_CPU_IO_MAP(io_map) MDRV_CPU_IO_MAP(io_map)
MDRV_CPU_VBLANK_INT_HACK(irq0_line_hold,8) /* controls game speed? */ MDRV_CPU_VBLANK_INT_HACK(irq0_line_hold,8) /* controls game speed? */
MDRV_MACHINE_RESET(battlex)
/* video hardware */ /* video hardware */
MDRV_SCREEN_ADD("screen", RASTER) MDRV_SCREEN_ADD("screen", RASTER)
MDRV_SCREEN_REFRESH_RATE(56) /* The video syncs at 15.8k H and 56 V (www.klov.com) */ MDRV_SCREEN_REFRESH_RATE(56) /* The video syncs at 15.8k H and 56 V (www.klov.com) */
@ -223,7 +247,11 @@ static MACHINE_DRIVER_START( battlex )
MACHINE_DRIVER_END MACHINE_DRIVER_END
/*** ROM LOADING *************************************************************/ /*************************************
*
* ROM definition
*
*************************************/
ROM_START( battlex ) ROM_START( battlex )
ROM_REGION( 0x10000, "maincpu", 0 ) ROM_REGION( 0x10000, "maincpu", 0 )
@ -250,11 +278,18 @@ ROM_START( battlex )
ROM_LOAD( "2732.e", 0x0000, 0x1000, CRC(126842b7) SHA1(2da4f64e077232c1dd0853d07d801f9781517850) ) ROM_LOAD( "2732.e", 0x0000, 0x1000, CRC(126842b7) SHA1(2da4f64e077232c1dd0853d07d801f9781517850) )
ROM_END ROM_END
/*************************************
*
* Driver initialization
*
*************************************/
static DRIVER_INIT( battlex ) static DRIVER_INIT( battlex )
{ {
UINT8 *cold = memory_region ( machine, "user1" ); UINT8 *cold = memory_region(machine, "user1");
UINT8 *mskd = memory_region ( machine, "user2" ); UINT8 *mskd = memory_region(machine, "user2");
UINT8 *dest = memory_region ( machine, "gfx1" ); UINT8 *dest = memory_region(machine, "gfx1");
int outcount; int outcount;
@ -267,22 +302,28 @@ static DRIVER_INIT( battlex )
int bitmask = 0x01; int bitmask = 0x01;
int bitcount; int bitcount;
for (bitcount = 0;bitcount < 8 ; bitcount ++) for (bitcount = 0; bitcount < 8 ; bitcount ++)
{ {
int bit, col; int bit, col;
bit = (mskd[outcount*8+linecount] & bitmask) >> bitcount; bit = (mskd[outcount * 8 + linecount] & bitmask) >> bitcount;
if (bit) col = (cold[outcount*8+(linecount&~1)+(bitcount/4)] & 0x0f) << 4; if (bit)
else col = (cold[outcount*8+(linecount&~1)+(bitcount/4)] & 0xf0); col = (cold[outcount * 8 + (linecount & ~1) + (bitcount / 4)] & 0x0f) << 4;
else
col = (cold[outcount * 8 + (linecount & ~1) + (bitcount / 4)] & 0xf0);
dest[outcount*32 + linecount*4 + bitcount /2] |= (col >> (4*(bitcount & 1))); dest[outcount * 32 + linecount * 4 + bitcount /2] |= (col >> (4 * (bitcount & 1)));
bitmask = bitmask << 1; bitmask = bitmask << 1;
} }
} }
} }
} }
/*** GAME DRIVERS ************************************************************/
GAME( 1982, battlex, 0, battlex, battlex, battlex, ROT180, "Omori Electric", "Battle Cross", GAME_IMPERFECT_GRAPHICS ) /*************************************
*
* Game driver
*
*************************************/
GAME( 1982, battlex, 0, battlex, battlex, battlex, ROT180, "Omori Electric", "Battle Cross", GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE )

View File

@ -1,29 +1,30 @@
/* /***************************************************************************
Car Jamboree
Omori Electric CAD (OEC) 1981
c14 c.d19 Car Jamboree
c13 c.d18 c10 Omori Electric CAD (OEC) 1981
c12 c9
c11 2125 2125 c14 c.d19
2125 2125 c13 c.d18 c10
2125 2125 2114 2114 c12 c9
2125 2125 2114 2114 c11 2125 2125
2125 2125 c8 2125 2125
2125 2125 c7 2125 2125 2114 2114
c6 2125 2125 2114 2114
c5 2125 2125 c8
c4 2125 2125 c7
c3 c6
5101 c2 c5
5101 c1 c4
6116 c3
18.432MHz 5101 c2
6116 5101 c1
Z80A c15 6116
Z80A 18.432MHz
8910 SW 6116
8910 Z80A c15
Z80A
8910 SW
8910
Notes: Notes:
@ -38,20 +39,19 @@ Notes:
- colours are wrong, sprites and characters only using one of the proms - colours are wrong, sprites and characters only using one of the proms
- background colour calculation is a guess - background colour calculation is a guess
*/
***************************************************************************/
#include "driver.h" #include "driver.h"
#include "cpu/z80/z80.h" #include "cpu/z80/z80.h"
#include "sound/ay8910.h" #include "sound/ay8910.h"
#include "carjmbre.h"
WRITE8_HANDLER( carjmbre_flipscreen_w ); /*************************************
WRITE8_HANDLER( carjmbre_bgcolor_w ); *
WRITE8_HANDLER( carjmbre_videoram_w ); * Memory maps
*
PALETTE_INIT( carjmbre ); *************************************/
VIDEO_START( carjmbre );
VIDEO_UPDATE( carjmbre );
static ADDRESS_MAP_START( carjmbre_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( carjmbre_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x0000, 0x7fff) AM_ROM
@ -62,8 +62,8 @@ static ADDRESS_MAP_START( carjmbre_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x8807, 0x8807) AM_WRITE(carjmbre_flipscreen_w) AM_RANGE(0x8807, 0x8807) AM_WRITE(carjmbre_flipscreen_w)
AM_RANGE(0x8fc1, 0x8fc1) AM_WRITENOP //overrun during initial screen clear AM_RANGE(0x8fc1, 0x8fc1) AM_WRITENOP //overrun during initial screen clear
AM_RANGE(0x8fe1, 0x8fe1) AM_WRITENOP //overrun during initial screen clear AM_RANGE(0x8fe1, 0x8fe1) AM_WRITENOP //overrun during initial screen clear
AM_RANGE(0x9000, 0x97ff) AM_RAM_WRITE(carjmbre_videoram_w) AM_BASE(&videoram) AM_RANGE(0x9000, 0x97ff) AM_RAM_WRITE(carjmbre_videoram_w) AM_BASE_MEMBER(carjmbre_state, videoram)
AM_RANGE(0x9800, 0x985f) AM_WRITE(SMH_RAM) AM_BASE(&spriteram) AM_SIZE(&spriteram_size) AM_RANGE(0x9800, 0x985f) AM_WRITE(SMH_RAM) AM_BASE_MEMBER(carjmbre_state, spriteram) AM_SIZE(&spriteram_size)
AM_RANGE(0x9880, 0x98df) AM_WRITE(SMH_RAM) //spriteram mirror AM_RANGE(0x9880, 0x98df) AM_WRITE(SMH_RAM) //spriteram mirror
AM_RANGE(0xa000, 0xa000) AM_READ_PORT("P1") AM_RANGE(0xa000, 0xa000) AM_READ_PORT("P1")
AM_RANGE(0xa800, 0xa800) AM_READ_PORT("P2") AM_RANGE(0xa800, 0xa800) AM_READ_PORT("P2")
@ -92,6 +92,12 @@ static ADDRESS_MAP_START( carjmbre_sound_io_map, ADDRESS_SPACE_IO, 8 )
AM_RANGE(0x32, 0x32) AM_WRITENOP //?? written before and after 0x31 with same value AM_RANGE(0x32, 0x32) AM_WRITENOP //?? written before and after 0x31 with same value
ADDRESS_MAP_END ADDRESS_MAP_END
/*************************************
*
* Input ports
*
*************************************/
static INPUT_PORTS_START( carjmbre ) static INPUT_PORTS_START( carjmbre )
PORT_START("P1") PORT_START("P1")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 ) //coin error if held high for 1s PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 ) //coin error if held high for 1s
@ -138,6 +144,12 @@ static INPUT_PORTS_START( carjmbre )
PORT_DIPSETTING( 0x00, DEF_STR( Cocktail ) ) PORT_DIPSETTING( 0x00, DEF_STR( Cocktail ) )
INPUT_PORTS_END INPUT_PORTS_END
/*************************************
*
* Graphics definitions
*
*************************************/
static const gfx_layout carjmbre_charlayout = static const gfx_layout carjmbre_charlayout =
{ {
8,8, 8,8,
@ -165,13 +177,33 @@ static GFXDECODE_START( carjmbre )
GFXDECODE_ENTRY( "gfx2", 0, carjmbre_spritelayout, 0, 16 ) GFXDECODE_ENTRY( "gfx2", 0, carjmbre_spritelayout, 0, 16 )
GFXDECODE_END GFXDECODE_END
/*************************************
*
* Machine driver
*
*************************************/
static MACHINE_RESET( carjmbre )
{
carjmbre_state *state = (carjmbre_state *)machine->driver_data;
state->flipscreen = 0;
state->bgcolor = 0;
}
static MACHINE_DRIVER_START( carjmbre ) static MACHINE_DRIVER_START( carjmbre )
/* driver data */
MDRV_DRIVER_DATA(carjmbre_state)
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD("maincpu", Z80,18432000/6) MDRV_CPU_ADD("maincpu", Z80,18432000/6)
MDRV_CPU_PROGRAM_MAP(carjmbre_map) MDRV_CPU_PROGRAM_MAP(carjmbre_map)
MDRV_CPU_VBLANK_INT("screen", nmi_line_pulse) MDRV_CPU_VBLANK_INT("screen", nmi_line_pulse)
MDRV_MACHINE_RESET(carjmbre)
MDRV_CPU_ADD("audiocpu", Z80, 1500000) MDRV_CPU_ADD("audiocpu", Z80, 1500000)
MDRV_CPU_PROGRAM_MAP(carjmbre_sound_map) MDRV_CPU_PROGRAM_MAP(carjmbre_sound_map)
MDRV_CPU_IO_MAP(carjmbre_sound_io_map) MDRV_CPU_IO_MAP(carjmbre_sound_io_map)
@ -180,7 +212,7 @@ static MACHINE_DRIVER_START( carjmbre )
/* video hardware */ /* video hardware */
MDRV_SCREEN_ADD("screen", RASTER) MDRV_SCREEN_ADD("screen", RASTER)
MDRV_SCREEN_REFRESH_RATE(60) MDRV_SCREEN_REFRESH_RATE(60)
MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */) MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
MDRV_SCREEN_SIZE(32*8, 32*8) MDRV_SCREEN_SIZE(32*8, 32*8)
MDRV_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) MDRV_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
@ -202,6 +234,12 @@ static MACHINE_DRIVER_START( carjmbre )
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.12) MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.12)
MACHINE_DRIVER_END MACHINE_DRIVER_END
/*************************************
*
* ROM definition
*
*************************************/
ROM_START( carjmbre ) ROM_START( carjmbre )
ROM_REGION( 0x10000, "maincpu", 0 ) ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "c1", 0x0000, 0x1000, CRC(62b21739) SHA1(710e5c52f27603aa8f864f6f28d7272f21271d60) ) ROM_LOAD( "c1", 0x0000, 0x1000, CRC(62b21739) SHA1(710e5c52f27603aa8f864f6f28d7272f21271d60) )
@ -231,5 +269,10 @@ ROM_START( carjmbre )
ROM_LOAD( "c.d18", 0x0020, 0x0020, CRC(7b9ed1b0) SHA1(ec5e1f56e5a2fc726083866c08ac0e1de0ed6ace) ) ROM_LOAD( "c.d18", 0x0020, 0x0020, CRC(7b9ed1b0) SHA1(ec5e1f56e5a2fc726083866c08ac0e1de0ed6ace) )
ROM_END ROM_END
GAME( 1983, carjmbre, 0, carjmbre, carjmbre, 0, ROT90, "Omori Electric Co., Ltd.", "Car Jamboree", GAME_IMPERFECT_COLORS ) /*************************************
*
* Game driver
*
*************************************/
GAME( 1983, carjmbre, 0, carjmbre, carjmbre, 0, ROT90, "Omori Electric Co., Ltd.", "Car Jamboree", GAME_IMPERFECT_COLORS | GAME_SUPPORTS_SAVE )

View File

@ -1,24 +1,26 @@
/* /***************************************************************************
Popper
Omori Electric CAD (OEC) 1983 Popper
Omori Electric CAD (OEC) 1983
PPR-12 PPR-12
18.432MHz 6148 6148 18.432MHz 6148 6148
6148 4148 6148 4148
2128 2128
2128 2128
2128 2128
2128 2128
p3 p6 p3 p6
z80A p2 p5 z80A p2 p5
p0 p1 p4 p0 p1 p4
z80A z80A
8910 8910
8910 SW2 SW1 p.m4 p.m3 8910 SW2 SW1 p.m4 p.m3
Notes: Notes:
@ -76,28 +78,21 @@ Notes:
- the game freezes in much the same way as the stop dip switch when the coin - the game freezes in much the same way as the stop dip switch when the coin
inputs are high (a short PORT_IMPULSE duration will still cause a hitch), inputs are high (a short PORT_IMPULSE duration will still cause a hitch),
so potentially there's a coin lockout mechanism so potentially there's a coin lockout mechanism
*/
***************************************************************************/
#include "driver.h" #include "driver.h"
#include "cpu/z80/z80.h" #include "cpu/z80/z80.h"
#include "deprecat.h" #include "deprecat.h"
#include "sound/ay8910.h" #include "sound/ay8910.h"
#include "popper.h"
extern UINT8 *popper_videoram, *popper_attribram, *popper_ol_videoram, *popper_ol_attribram, *popper_spriteram;
extern size_t popper_spriteram_size;
WRITE8_HANDLER( popper_videoram_w );
WRITE8_HANDLER( popper_attribram_w );
WRITE8_HANDLER( popper_ol_videoram_w );
WRITE8_HANDLER( popper_ol_attribram_w );
WRITE8_HANDLER( popper_flipscreen_w );
WRITE8_HANDLER( popper_e002_w );
WRITE8_HANDLER( popper_gfx_bank_w );
PALETTE_INIT( popper );
VIDEO_START( popper );
VIDEO_UPDATE( popper );
/*************************************
*
* Memory handlers
*
*************************************/
//e000 e001 e002 e003 //e000 e001 e002 e003
//76543210 76543210 76543210 76543210 //76543210 76543210 76543210 76543210
@ -128,18 +123,18 @@ VIDEO_UPDATE( popper );
// -------x sound // -------x sound
static READ8_HANDLER( popper_input_ports_r ) static READ8_HANDLER( popper_input_ports_r )
{ {
UINT8 data=0; UINT8 data = 0;
switch (offset) switch (offset)
{ {
// player inputs dsw1 dsw2 // player inputs dsw1 dsw2
case 0: data=input_port_read(space->machine, "IN0") | ((input_port_read(space->machine, "DSW1") & 0x02)<<5) | ((input_port_read(space->machine, "DSW2") & 0x01)<<4); break; case 0: data = input_port_read(space->machine, "IN0") | ((input_port_read(space->machine, "DSW1") & 0x02) << 5) | ((input_port_read(space->machine, "DSW2") & 0x01) << 4); break;
case 1: data=input_port_read(space->machine, "IN1") | ((input_port_read(space->machine, "DSW1") & 0x01)<<6) | ((input_port_read(space->machine, "DSW2") & 0x02)<<3); break; case 1: data = input_port_read(space->machine, "IN1") | ((input_port_read(space->machine, "DSW1") & 0x01) << 6) | ((input_port_read(space->machine, "DSW2") & 0x02) << 3); break;
case 2: data=input_port_read(space->machine, "IN2") | ((input_port_read(space->machine, "DSW1") & 0x08)<<3) | ((input_port_read(space->machine, "DSW2") & 0x04)<<2); break; case 2: data = input_port_read(space->machine, "IN2") | ((input_port_read(space->machine, "DSW1") & 0x08) << 3) | ((input_port_read(space->machine, "DSW2") & 0x04) << 2); break;
case 3: data=input_port_read(space->machine, "IN3") | ((input_port_read(space->machine, "DSW1") & 0x04)<<4) | ((input_port_read(space->machine, "DSW2") & 0x08)<<1); break; case 3: data = input_port_read(space->machine, "IN3") | ((input_port_read(space->machine, "DSW1") & 0x04) << 4) | ((input_port_read(space->machine, "DSW2") & 0x08) << 1); break;
case 4: data= ((input_port_read(space->machine, "DSW1") & 0x20)<<2) | ((input_port_read(space->machine, "DSW2") & 0x10)<<1); break; case 4: data = ((input_port_read(space->machine, "DSW1") & 0x20) << 2) | ((input_port_read(space->machine, "DSW2") & 0x10) << 1); break;
case 5: data= ((input_port_read(space->machine, "DSW1") & 0x10)<<3) | ((input_port_read(space->machine, "DSW2") & 0x20)<<0); break; case 5: data = ((input_port_read(space->machine, "DSW1") & 0x10) << 3) | ((input_port_read(space->machine, "DSW2") & 0x20) << 0); break;
case 6: data= ((input_port_read(space->machine, "DSW1") & 0x80)<<0) | ((input_port_read(space->machine, "DSW2") & 0x40)>>1); break; case 6: data = ((input_port_read(space->machine, "DSW1") & 0x80) << 0) | ((input_port_read(space->machine, "DSW2") & 0x40) >> 1); break;
case 7: data= ((input_port_read(space->machine, "DSW1") & 0x40)<<1) | ((input_port_read(space->machine, "DSW2") & 0x80)>>2); break; case 7: data = ((input_port_read(space->machine, "DSW1") & 0x40) << 1) | ((input_port_read(space->machine, "DSW2") & 0x80) >> 2); break;
} }
return data; return data;
} }
@ -150,16 +145,22 @@ static READ8_HANDLER( popper_soundcpu_nmi_r )
return 0; return 0;
} }
/*************************************
*
* Memory maps
*
*************************************/
static ADDRESS_MAP_START( popper_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( popper_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x5fff) AM_ROM AM_RANGE(0x0000, 0x5fff) AM_ROM
AM_RANGE(0xc000, 0xc1bf) AM_RAM AM_RANGE(0xc000, 0xc1bf) AM_RAM
AM_RANGE(0xc1c0, 0xc1ff) AM_RAM_WRITE(popper_ol_videoram_w) AM_BASE(&popper_ol_videoram) AM_RANGE(0xc1c0, 0xc1ff) AM_RAM_WRITE(popper_ol_videoram_w) AM_BASE_MEMBER(popper_state, ol_videoram)
AM_RANGE(0xc200, 0xc61f) AM_RAM_WRITE(popper_videoram_w) AM_BASE(&popper_videoram) AM_RANGE(0xc200, 0xc61f) AM_RAM_WRITE(popper_videoram_w) AM_BASE_MEMBER(popper_state, videoram)
AM_RANGE(0xc620, 0xc9bf) AM_RAM AM_RANGE(0xc620, 0xc9bf) AM_RAM
AM_RANGE(0xc9c0, 0xc9ff) AM_RAM_WRITE(popper_ol_attribram_w) AM_BASE(&popper_ol_attribram) AM_RANGE(0xc9c0, 0xc9ff) AM_RAM_WRITE(popper_ol_attribram_w) AM_BASE_MEMBER(popper_state, ol_attribram)
AM_RANGE(0xca00, 0xce1f) AM_RAM_WRITE(popper_attribram_w) AM_BASE(&popper_attribram) AM_RANGE(0xca00, 0xce1f) AM_RAM_WRITE(popper_attribram_w) AM_BASE_MEMBER(popper_state, attribram)
AM_RANGE(0xce20, 0xcfff) AM_RAM AM_RANGE(0xce20, 0xcfff) AM_RAM
AM_RANGE(0xd000, 0xd7ff) AM_RAM AM_BASE(&popper_spriteram) AM_SIZE(&popper_spriteram_size) AM_RANGE(0xd000, 0xd7ff) AM_RAM AM_BASE_MEMBER(popper_state, spriteram) AM_SIZE(&spriteram_size)
AM_RANGE(0xd800, 0xdfff) AM_RAM AM_SHARE(1) AM_RANGE(0xd800, 0xdfff) AM_RAM AM_SHARE(1)
AM_RANGE(0xe000, 0xe007) AM_READ(popper_input_ports_r) AM_RANGE(0xe000, 0xe007) AM_READ(popper_input_ports_r)
AM_RANGE(0xe000, 0xe000) AM_WRITE(interrupt_enable_w) AM_RANGE(0xe000, 0xe000) AM_WRITE(interrupt_enable_w)
@ -185,6 +186,12 @@ static ADDRESS_MAP_START( popper_sound_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0xd800, 0xdfff) AM_RAM AM_SHARE(1) AM_RANGE(0xd800, 0xdfff) AM_RAM AM_SHARE(1)
ADDRESS_MAP_END ADDRESS_MAP_END
/*************************************
*
* Input ports
*
*************************************/
static INPUT_PORTS_START( popper ) static INPUT_PORTS_START( popper )
PORT_START("IN0") PORT_START("IN0")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 )
@ -258,6 +265,12 @@ static INPUT_PORTS_START( popper )
PORT_DIPSETTING( 0x80, DEF_STR( On ) ) PORT_DIPSETTING( 0x80, DEF_STR( On ) )
INPUT_PORTS_END INPUT_PORTS_END
/*************************************
*
* Graphics definitions
*
*************************************/
static const gfx_layout popper_charlayout = static const gfx_layout popper_charlayout =
{ {
8,8, 8,8,
@ -285,8 +298,26 @@ static GFXDECODE_START( popper )
GFXDECODE_ENTRY( "gfx2", 0, popper_spritelayout, 0, 16 ) GFXDECODE_ENTRY( "gfx2", 0, popper_spritelayout, 0, 16 )
GFXDECODE_END GFXDECODE_END
/*************************************
*
* Machine driver
*
*************************************/
static MACHINE_RESET( popper )
{
popper_state *state = (popper_state *)machine->driver_data;
state->flipscreen = 0;
state->e002 = 0;
state->gfx_bank = 0;
}
static MACHINE_DRIVER_START( popper ) static MACHINE_DRIVER_START( popper )
/* driver data */
MDRV_DRIVER_DATA(popper_state)
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD("maincpu", Z80,18432000/6) MDRV_CPU_ADD("maincpu", Z80,18432000/6)
MDRV_CPU_PROGRAM_MAP(popper_map) MDRV_CPU_PROGRAM_MAP(popper_map)
@ -298,6 +329,8 @@ static MACHINE_DRIVER_START( popper )
MDRV_QUANTUM_TIME(HZ(1800)) MDRV_QUANTUM_TIME(HZ(1800))
MDRV_MACHINE_RESET(popper)
/* video hardware */ /* video hardware */
MDRV_SCREEN_ADD("screen", RASTER) MDRV_SCREEN_ADD("screen", RASTER)
MDRV_SCREEN_REFRESH_RATE(60) MDRV_SCREEN_REFRESH_RATE(60)
@ -324,6 +357,12 @@ static MACHINE_DRIVER_START( popper )
MACHINE_DRIVER_END MACHINE_DRIVER_END
/*************************************
*
* ROM definition
*
*************************************/
ROM_START( popper ) ROM_START( popper )
ROM_REGION( 0x10000, "maincpu", 0 ) ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "p1", 0x0000, 0x2000, CRC(56881b70) SHA1(d3ade7a54a6cb8a0babf0d667a6b27f492a739dc) ) ROM_LOAD( "p1", 0x0000, 0x2000, CRC(56881b70) SHA1(d3ade7a54a6cb8a0babf0d667a6b27f492a739dc) )
@ -346,4 +385,10 @@ ROM_START( popper )
ROM_END ROM_END
GAME( 1983, popper, 0, popper, popper, 0, ROT90, "Omori Electric Co., Ltd.", "Popper", GAME_IMPERFECT_COLORS ) /*************************************
*
* Game driver
*
*************************************/
GAME( 1983, popper, 0, popper, popper, 0, ROT90, "Omori Electric Co., Ltd.", "Popper", GAME_IMPERFECT_COLORS | GAME_SUPPORTS_SAVE )

View File

@ -1,10 +1,5 @@
#include "driver.h" /**************************************************************************************
#include "cpu/z80/z80.h"
#include "sound/dac.h"
#include "sound/sn76496.h"
/*
Space Guerrilla PCB Layout Space Guerrilla PCB Layout
-------------------------- --------------------------
@ -164,94 +159,114 @@ Notes:
DIP24- Unpopulated position for DIP24 IC DIP24- Unpopulated position for DIP24 IC
All ROMs type 2708 (DIP24) All ROMs type 2708 (DIP24)
*/ **************************************************************************************/
#include "driver.h"
#include "cpu/z80/z80.h"
#include "sound/dac.h"
#include "sound/sn76496.h"
/*************************************
*
* Driver data
*
*************************************/
typedef struct _spaceg_state spaceg_state;
struct _spaceg_state
{
UINT8 * videoram;
UINT8 * unkram;
UINT8 * io9400;
UINT8 * io9401;
};
static UINT8 *unkram; /*************************************
*
static UINT8 *io9400; * Video emulation
static UINT8 *io9401; *
*************************************/
static PALETTE_INIT( spaceg ) static PALETTE_INIT( spaceg )
{ {
int i; int i;
for (i=0; i<128; i++) for (i = 0; i < 128; i++)
palette_set_color (machine, i, MAKE_RGB(0x00,0x00,0x00)); palette_set_color (machine, i, MAKE_RGB(0x00,0x00,0x00));
palette_set_color (machine,0, MAKE_RGB(0x00,0x00,0x00)); //ok czarny palette_set_color (machine, 0, MAKE_RGB(0x00,0x00,0x00)); //ok czarny
palette_set_color (machine,1, MAKE_RGB(0x7f,0x00,0x00));//??? palette_set_color (machine, 1, MAKE_RGB(0x7f,0x00,0x00));//???
palette_set_color (machine,2, MAKE_RGB(0xff,0xff,0xff)); //ok+ bialy palette_set_color (machine, 2, MAKE_RGB(0xff,0xff,0xff)); //ok+ bialy
palette_set_color (machine,3, MAKE_RGB(0xff,0x00,0x00)); //ok j.czerw. palette_set_color (machine, 3, MAKE_RGB(0xff,0x00,0x00)); //ok j.czerw.
palette_set_color (machine,4, MAKE_RGB(0x3f,0x3f,0xff)); //ok j.niebieski palette_set_color (machine, 4, MAKE_RGB(0x3f,0x3f,0xff)); //ok j.niebieski
palette_set_color (machine,5, MAKE_RGB(0x3f,0xff,0x3f)); //ok j.zielony palette_set_color (machine, 5, MAKE_RGB(0x3f,0xff,0x3f)); //ok j.zielony
palette_set_color (machine,6, MAKE_RGB(0xff,0xbf,0xbf)); //ok+ 'majtki' palette_set_color (machine, 6, MAKE_RGB(0xff,0xbf,0xbf)); //ok+ 'majtki'
palette_set_color (machine,7, MAKE_RGB(0xff,0xff,0x00)); //ok+ zolty palette_set_color (machine, 7, MAKE_RGB(0xff,0xff,0x00)); //ok+ zolty
palette_set_color (machine,8, MAKE_RGB(0xff,0x7f,0x00)); //ok+ pomaranczowy palette_set_color (machine, 8, MAKE_RGB(0xff,0x7f,0x00)); //ok+ pomaranczowy
palette_set_color (machine,9, MAKE_RGB(0x3f,0xbf,0xff)); //ok j.niebieski (ciemniejszy od 13) palette_set_color (machine, 9, MAKE_RGB(0x3f,0xbf,0xff)); //ok j.niebieski (ciemniejszy od 13)
palette_set_color (machine,10,MAKE_RGB(0x3f,0xbf,0x3f)); //ok+ c.zielony palette_set_color (machine, 10, MAKE_RGB(0x3f,0xbf,0x3f)); //ok+ c.zielony
palette_set_color (machine,11,MAKE_RGB(0x00,0xff,0x00)); //ok j.zielony palette_set_color (machine, 11, MAKE_RGB(0x00,0xff,0x00)); //ok j.zielony
palette_set_color (machine,12,MAKE_RGB(0x7f,0x00,0x00)); //ok brazowy (c.czerw) palette_set_color (machine, 12, MAKE_RGB(0x7f,0x00,0x00)); //ok brazowy (c.czerw)
palette_set_color (machine,13,MAKE_RGB(0x7f,0xbf,0xff)); //ok j.niebieski (jasniejszy od 9) palette_set_color (machine, 13, MAKE_RGB(0x7f,0xbf,0xff)); //ok j.niebieski (jasniejszy od 9)
palette_set_color (machine,14,MAKE_RGB(0x00,0xff,0xff));//??? palette_set_color (machine, 14, MAKE_RGB(0x00,0xff,0xff));//???
palette_set_color (machine,15,MAKE_RGB(0x7f,0x7f,0x7f));//??? palette_set_color (machine, 15, MAKE_RGB(0x7f,0x7f,0x7f));//???
} }
static WRITE8_HANDLER( zvideoram_w ) static WRITE8_HANDLER( zvideoram_w )
{ {
spaceg_state *state = (spaceg_state *)space->machine->driver_data;
int col; int col;
col = unkram[0x400]; col = state->unkram[0x400];
if (col>0x0f) popmessage("color>0x0f =%2d",col); if (col > 0x0f)
popmessage("color > 0x0f = %2d", col);
col &=0x0f; col &= 0x0f;
switch(*io9401) switch (*state->io9401)
{ {
case 0x0d: /* 1101 */ case 0x0d: /* 1101 */
videoram[offset] &= ~data; state->videoram[offset] &= ~data;
data = videoram[offset]; data = state->videoram[offset];
break; break;
case 0x01: /* 0001 */ case 0x01: /* 0001 */
case 0x00: /* 0000 */ case 0x00: /* 0000 */
videoram[offset] = data; state->videoram[offset] = data;
break; break;
default: default:
logerror("mode =%02x pc=%04x\n",*io9401,cpu_get_pc(space->cpu) ); logerror("mode = %02x pc = %04x\n", *state->io9401, cpu_get_pc(space->cpu));
popmessage("mode =%02x pc=%04x\n",*io9401,cpu_get_pc(space->cpu) ); popmessage("mode = %02x pc = %04x\n", *state->io9401, cpu_get_pc(space->cpu));
return; return;
} }
unkram [offset] = col; state->unkram[offset] = col;
} }
static READ8_HANDLER(spaceg_colorram_r) static READ8_HANDLER(spaceg_colorram_r)
{ {
spaceg_state *state = (spaceg_state *)space->machine->driver_data;
int rgbcolor;
int rgbcolor; if (offset < 0x400)
if (offset<0x400)
{ {
rgbcolor = (unkram[offset]<<1) | ((offset &0x100)>>8); rgbcolor = (state->unkram[offset] << 1) | ((offset &0x100) >> 8);
if ((offset>=0x200) && (offset<0x220)) /* 0xa200- 0xa21f */ if ((offset >= 0x200) && (offset < 0x220)) /* 0xa200- 0xa21f */
{ {
/* palette 1 */ /* palette 1 */
int col_ind = offset & 0x1f; int col_ind = offset & 0x1f;
palette_set_color_rgb(space->machine, 0x10 + 0x00 + col_ind, pal3bit(rgbcolor >> 0), pal3bit(rgbcolor >> 6), pal3bit(rgbcolor >> 3)); palette_set_color_rgb(space->machine, 0x10 + 0x00 + col_ind, pal3bit(rgbcolor >> 0), pal3bit(rgbcolor >> 6), pal3bit(rgbcolor >> 3));
} }
else else if ((offset >= 0x300) && (offset < 0x320)) /* 0xa300- 0xa31f */
if ((offset>=0x300) && (offset<0x320)) /* 0xa300- 0xa31f */
{ {
/* palette 2 */ /* palette 2 */
int col_ind = offset & 0x1f; int col_ind = offset & 0x1f;
@ -261,29 +276,29 @@ int rgbcolor;
logerror("palette? read from unkram offset = %04x\n",offset); logerror("palette? read from unkram offset = %04x\n",offset);
} }
if (*io9401!=0x40) if (*state->io9401 != 0x40)
logerror("unkram read in mode: 9401 = %02x (offset=%04x)\n",*io9401,offset); logerror("unkram read in mode: 9401 = %02x (offset = %04x)\n", *state->io9401, offset);
return state->unkram[offset];
return unkram[offset];
} }
static VIDEO_UPDATE( spaceg ) static VIDEO_UPDATE( spaceg )
{ {
spaceg_state *state = (spaceg_state *)screen->machine->driver_data;
offs_t offs; offs_t offs;
for (offs = 0; offs < 0x2000; offs++) for (offs = 0; offs < 0x2000; offs++)
{ {
int i; int i;
UINT8 data = videoram[offs]; UINT8 data = state->videoram[offs];
int y = offs & 0xff; int y = offs & 0xff;
UINT8 x = ((offs >> 8) << 3) - ((*io9400 & 0xe0) >> 5); UINT8 x = ((offs >> 8) << 3) - ((*state->io9400 & 0xe0) >> 5);
for (i = 0; i < 8; i++) for (i = 0; i < 8; i++)
{ {
*BITMAP_ADDR16(bitmap, y, x) = (data & 0x80) ? unkram[offs] : 0; *BITMAP_ADDR16(bitmap, y, x) = (data & 0x80) ? state->unkram[offs] : 0;
x++; x++;
data <<= 1; data <<= 1;
@ -294,16 +309,22 @@ static VIDEO_UPDATE( spaceg )
} }
/*************************************
*
* Memory maps
*
*************************************/
static ADDRESS_MAP_START( spaceg_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( spaceg_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x1fff) AM_ROM AM_RANGE(0x0000, 0x1fff) AM_ROM
AM_RANGE(0x3000, 0x3fff) AM_ROM AM_RANGE(0x3000, 0x3fff) AM_ROM
AM_RANGE(0x7000, 0x77ff) AM_RAM AM_RANGE(0x7000, 0x77ff) AM_RAM
AM_RANGE(0xa000, 0xbfff) AM_READWRITE(spaceg_colorram_r, SMH_RAM) AM_BASE(&unkram) AM_RANGE(0xa000, 0xbfff) AM_READWRITE(spaceg_colorram_r, SMH_RAM) AM_BASE_MEMBER(spaceg_state, unkram)
AM_RANGE(0xc000, 0xdfff) AM_RAM_WRITE(zvideoram_w) AM_BASE(&videoram) AM_RANGE(0xc000, 0xdfff) AM_RAM_WRITE(zvideoram_w) AM_BASE_MEMBER(spaceg_state, videoram)
AM_RANGE(0x9400, 0x9400) AM_WRITE(SMH_RAM) AM_BASE(&io9400) /* gfx ctrl */ AM_RANGE(0x9400, 0x9400) AM_WRITE(SMH_RAM) AM_BASE_MEMBER(spaceg_state, io9400) /* gfx ctrl */
AM_RANGE(0x9401, 0x9401) AM_WRITE(SMH_RAM) AM_BASE(&io9401) /* gfx ctrl */ AM_RANGE(0x9401, 0x9401) AM_WRITE(SMH_RAM) AM_BASE_MEMBER(spaceg_state, io9401) /* gfx ctrl */
/* 9402 - /* 9402 -
bits 0 and 1 probably control the lamps under the player 1 and player 2 start buttons bits 0 and 1 probably control the lamps under the player 1 and player 2 start buttons
bit 2 - unknown - bit 2 - unknown -
@ -321,6 +342,12 @@ ADDRESS_MAP_END
/*************************************
*
* Input ports
*
*************************************/
static INPUT_PORTS_START( spaceg ) static INPUT_PORTS_START( spaceg )
PORT_START("9800") PORT_START("9800")
PORT_DIPUNUSED( 0x01, IP_ACTIVE_HIGH ) /* was related to coinage */ PORT_DIPUNUSED( 0x01, IP_ACTIVE_HIGH ) /* was related to coinage */
@ -360,8 +387,17 @@ static INPUT_PORTS_START( spaceg )
INPUT_PORTS_END INPUT_PORTS_END
/*************************************
*
* Machine driver
*
*************************************/
static MACHINE_DRIVER_START( spaceg ) static MACHINE_DRIVER_START( spaceg )
/* driver data */
MDRV_DRIVER_DATA(spaceg_state)
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD("maincpu", Z80,2500000) /* 2.5 MHz */ MDRV_CPU_ADD("maincpu", Z80,2500000) /* 2.5 MHz */
MDRV_CPU_PROGRAM_MAP(spaceg_map) MDRV_CPU_PROGRAM_MAP(spaceg_map)
@ -396,11 +432,11 @@ static MACHINE_DRIVER_START( spaceg )
MACHINE_DRIVER_END MACHINE_DRIVER_END
/*************************************************************************** /*************************************
*
Game driver(s) * ROM definition
*
***************************************************************************/ *************************************/
ROM_START( spaceg ) ROM_START( spaceg )
ROM_REGION( 0x10000, "maincpu", 0 ) ROM_REGION( 0x10000, "maincpu", 0 )
@ -419,4 +455,10 @@ ROM_START( spaceg )
ROM_END ROM_END
GAME( 1979, spaceg, 0, spaceg, spaceg, 0, ROT270, "Omori", "Space Guerrilla", GAME_IMPERFECT_GRAPHICS | GAME_NO_SOUND ) /*************************************
*
* Game driver
*
*************************************/
GAME( 1979, spaceg, 0, spaceg, spaceg, 0, ROT270, "Omori", "Space Guerrilla", GAME_IMPERFECT_GRAPHICS | GAME_NO_SOUND | GAME_SUPPORTS_SAVE )

View File

@ -0,0 +1,30 @@
/***************************************************************************
Battle Cross
***************************************************************************/
typedef struct _battlex_state battlex_state;
struct _battlex_state
{
/* memory pointers */
UINT8 * videoram;
UINT8 * spriteram;
/* video-related */
tilemap *bg_tilemap;
int scroll_lsb, scroll_msb;
};
/*----------- defined in video/battlex.c -----------*/
extern WRITE8_HANDLER( battlex_palette_w );
extern WRITE8_HANDLER( battlex_videoram_w );
extern WRITE8_HANDLER( battlex_scroll_x_lsb_w );
extern WRITE8_HANDLER( battlex_scroll_x_msb_w );
extern WRITE8_HANDLER( battlex_flipscreen_w );
extern PALETTE_INIT( battlex );
extern VIDEO_START( battlex );
extern VIDEO_UPDATE( battlex );

View File

@ -0,0 +1,32 @@
/***************************************************************************
carjmbre
***************************************************************************/
typedef struct _carjmbre_state carjmbre_state;
struct _carjmbre_state
{
/* memory pointers */
UINT8 * videoram;
UINT8 * spriteram;
/* video-related */
tilemap *cj_tilemap;
UINT8 flipscreen;
UINT16 bgcolor;
};
/*----------- defined in video/carjmbre.c -----------*/
WRITE8_HANDLER( carjmbre_flipscreen_w );
WRITE8_HANDLER( carjmbre_bgcolor_w );
WRITE8_HANDLER( carjmbre_videoram_w );
PALETTE_INIT( carjmbre );
VIDEO_START( carjmbre );
VIDEO_UPDATE( carjmbre );

View File

@ -0,0 +1,40 @@
/***************************************************************************
Popper
***************************************************************************/
typedef struct _popper_state popper_state;
struct _popper_state
{
/* memory pointers */
UINT8 * videoram;
UINT8 * ol_videoram;
UINT8 * attribram;
UINT8 * ol_attribram;
UINT8 * spriteram;
// size_t spriteram_size;
/* video-related */
tilemap *p123_tilemap, *p0_tilemap;
tilemap *ol_p123_tilemap, *ol_p0_tilemap;
INT32 flipscreen, e002, gfx_bank;
rectangle tilemap_clip;
};
/*----------- defined in video/popper.c -----------*/
WRITE8_HANDLER( popper_videoram_w );
WRITE8_HANDLER( popper_attribram_w );
WRITE8_HANDLER( popper_ol_videoram_w );
WRITE8_HANDLER( popper_ol_attribram_w );
WRITE8_HANDLER( popper_flipscreen_w );
WRITE8_HANDLER( popper_e002_w );
WRITE8_HANDLER( popper_gfx_bank_w );
PALETTE_INIT( popper );
VIDEO_START( popper );
VIDEO_UPDATE( popper );

View File

@ -1,17 +1,19 @@
/***************************************************************************
Video emulation for Omori Battle Cross
***************************************************************************/
#include "driver.h" #include "driver.h"
#include "battlex.h"
static int battlex_scroll_lsb;
static int battlex_scroll_msb;
static tilemap *bg_tilemap;
PALETTE_INIT( battlex ) PALETTE_INIT( battlex )
{ {
int i,col; int i, col;
for (col = 0;col < 8;col++) for (col = 0; col < 8; col++)
{ {
for (i = 0;i < 16;i++) for (i = 0; i < 16; i++)
{ {
int data = i | col; int data = i | col;
int g = pal1bit(data >> 0); int g = pal1bit(data >> 0);
@ -28,30 +30,33 @@ PALETTE_INIT( battlex )
} }
#endif #endif
palette_set_color(machine, i + 16 * col,MAKE_RGB(r,g,b)); palette_set_color(machine, i + 16 * col, MAKE_RGB(r,g,b));
} }
} }
} }
WRITE8_HANDLER( battlex_palette_w ) WRITE8_HANDLER( battlex_palette_w )
{ {
palette_set_color_rgb(space->machine,16*8 + offset,pal1bit(data >> 2),pal1bit(data >> 0),pal1bit(data >> 1)); palette_set_color_rgb(space->machine, 16 * 8 + offset, pal1bit(data >> 2), pal1bit(data >> 0), pal1bit(data >> 1));
} }
WRITE8_HANDLER( battlex_scroll_x_lsb_w ) WRITE8_HANDLER( battlex_scroll_x_lsb_w )
{ {
battlex_scroll_lsb = data; battlex_state *state = (battlex_state *)space->machine->driver_data;
state->scroll_lsb = data;
} }
WRITE8_HANDLER( battlex_scroll_x_msb_w ) WRITE8_HANDLER( battlex_scroll_x_msb_w )
{ {
battlex_scroll_msb = data; battlex_state *state = (battlex_state *)space->machine->driver_data;
state->scroll_msb = data;
} }
WRITE8_HANDLER( battlex_videoram_w ) WRITE8_HANDLER( battlex_videoram_w )
{ {
videoram[offset] = data; battlex_state *state = (battlex_state *)space->machine->driver_data;
tilemap_mark_tile_dirty(bg_tilemap, offset / 2); state->videoram[offset] = data;
tilemap_mark_tile_dirty(state->bg_tilemap, offset / 2);
} }
WRITE8_HANDLER( battlex_flipscreen_w ) WRITE8_HANDLER( battlex_flipscreen_w )
@ -69,25 +74,30 @@ WRITE8_HANDLER( battlex_flipscreen_w )
static TILE_GET_INFO( get_bg_tile_info ) static TILE_GET_INFO( get_bg_tile_info )
{ {
int tile = videoram[tile_index*2] | (((videoram[tile_index*2+1] & 0x01)) << 8); battlex_state *state = (battlex_state *)machine->driver_data;
int color = (videoram[tile_index*2+1] & 0x0e) >> 1; int tile = state->videoram[tile_index * 2] | (((state->videoram[tile_index * 2 + 1] & 0x01)) << 8);
int color = (state->videoram[tile_index * 2 + 1] & 0x0e) >> 1;
SET_TILE_INFO(0,tile,color,0); SET_TILE_INFO(0, tile, color, 0);
} }
VIDEO_START( battlex ) VIDEO_START( battlex )
{ {
bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, battlex_state *state = (battlex_state *)machine->driver_data;
8, 8, 64, 32);
state->bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 64, 32);
state_save_register_global(machine, state->scroll_lsb);
state_save_register_global(machine, state->scroll_msb);
} }
static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect ) static void draw_sprites( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect )
{ {
battlex_state *state = (battlex_state *)machine->driver_data;
const gfx_element *gfx = machine->gfx[1]; const gfx_element *gfx = machine->gfx[1];
UINT8 *source = spriteram; UINT8 *source = state->spriteram;
UINT8 *finish = spriteram + 0x200; UINT8 *finish = state->spriteram + 0x200;
while( source<finish ) while (source < finish)
{ {
int sx = (source[0] & 0x7f) * 2 - (source[0] & 0x80) * 2; int sx = (source[0] & 0x7f) * 2 - (source[0] & 0x80) * 2;
int sy = source[3]; int sy = source[3];
@ -104,8 +114,7 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
flipy = !flipy; flipy = !flipy;
} }
drawgfx_transpen(bitmap,cliprect,gfx,tile,color,flipx,flipy,sx,sy,0); drawgfx_transpen(bitmap, cliprect, gfx, tile, color, flipx, flipy, sx, sy, 0);
source += 4; source += 4;
} }
@ -113,8 +122,10 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
VIDEO_UPDATE(battlex) VIDEO_UPDATE(battlex)
{ {
tilemap_set_scrollx(bg_tilemap, 0, battlex_scroll_lsb | (battlex_scroll_msb << 8)); battlex_state *state = (battlex_state *)screen->machine->driver_data;
tilemap_draw(bitmap, cliprect, bg_tilemap, 0, 0);
tilemap_set_scrollx(state->bg_tilemap, 0, state->scroll_lsb | (state->scroll_msb << 8));
tilemap_draw(bitmap, cliprect, state->bg_tilemap, 0, 0);
draw_sprites(screen->machine, bitmap, cliprect); draw_sprites(screen->machine, bitmap, cliprect);
return 0; return 0;
} }

View File

@ -1,20 +1,18 @@
/* /***************************************************************************
Car Jamboree
Omori Electric CAD (OEC) 1981 Car Jamboree
*/ Omori Electric CAD (OEC) 1981
***************************************************************************/
#include "driver.h" #include "driver.h"
#include "carjmbre.h"
static tilemap *carjmbre_tilemap;
static UINT8 carjmbre_flipscreen;
static UINT16 carjmbre_bgcolor;
PALETTE_INIT( carjmbre ) PALETTE_INIT( carjmbre )
{ {
int i,bit0,bit1,bit2,r,g,b; int i, bit0, bit1, bit2, r, g, b;
for (i = 0;i < machine->config->total_colors; i++) for (i = 0; i < machine->config->total_colors; i++)
{ {
/* red component */ /* red component */
bit0 = (*color_prom >> 0) & 0x01; bit0 = (*color_prom >> 0) & 0x01;
@ -32,63 +30,73 @@ PALETTE_INIT( carjmbre )
bit2 = (*color_prom >> 7) & 0x01; bit2 = (*color_prom >> 7) & 0x01;
b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
palette_set_color(machine,i,MAKE_RGB(r,g,b)); palette_set_color(machine, i, MAKE_RGB(r,g,b));
color_prom++; color_prom++;
} }
} }
WRITE8_HANDLER( carjmbre_flipscreen_w ) WRITE8_HANDLER( carjmbre_flipscreen_w )
{ {
carjmbre_flipscreen = data?(TILEMAP_FLIPX|TILEMAP_FLIPY):0; carjmbre_state *state = (carjmbre_state *)space->machine->driver_data;
tilemap_set_flip_all( space->machine,carjmbre_flipscreen );
state->flipscreen = data ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0;
tilemap_set_flip_all(space->machine, state->flipscreen);
} }
WRITE8_HANDLER( carjmbre_bgcolor_w ) WRITE8_HANDLER( carjmbre_bgcolor_w )
{ {
int oldbg,i; carjmbre_state *state = (carjmbre_state *)space->machine->driver_data;
int oldbg, i;
oldbg=carjmbre_bgcolor; oldbg = state->bgcolor;
carjmbre_bgcolor&=0xff00>>(offset*8); state->bgcolor &= 0xff00 >> (offset * 8);
carjmbre_bgcolor|=((~data)&0xff)<<(offset*8); state->bgcolor |= ((~data) & 0xff) << (offset * 8);
if(oldbg!=carjmbre_bgcolor) if ( oldbg != state->bgcolor)
{ {
for (i=0;i<64;i+=4) for (i = 0; i < 64; i += 4)
palette_set_color_rgb(space->machine, i, (carjmbre_bgcolor&0xff)*0x50, (carjmbre_bgcolor&0xff)*0x50, (carjmbre_bgcolor&0xff)!=0?0x50:0); palette_set_color_rgb(space->machine, i, (state->bgcolor & 0xff) * 0x50,
(state->bgcolor & 0xff) * 0x50, (state->bgcolor & 0xff)!=0 ? 0x50 : 0);
} }
} }
static TILE_GET_INFO( get_carjmbre_tile_info ){ static TILE_GET_INFO( get_carjmbre_tile_info )
UINT32 tile_number = videoram[tile_index] & 0xFF; {
UINT8 attr = videoram[tile_index+0x400]; carjmbre_state *state = (carjmbre_state *)machine->driver_data;
UINT32 tile_number = state->videoram[tile_index] & 0xff;
UINT8 attr = state->videoram[tile_index + 0x400];
tile_number += (attr & 0x80) << 1; /* bank */ tile_number += (attr & 0x80) << 1; /* bank */
SET_TILE_INFO( SET_TILE_INFO(
0, 0,
tile_number, tile_number,
(attr&0x7), (attr & 0x7),
0); 0);
} }
WRITE8_HANDLER( carjmbre_videoram_w ){ WRITE8_HANDLER( carjmbre_videoram_w )
videoram[offset] = data; {
tilemap_mark_tile_dirty(carjmbre_tilemap,offset&0x3ff); carjmbre_state *state = (carjmbre_state *)space->machine->driver_data;
state->videoram[offset] = data;
tilemap_mark_tile_dirty(state->cj_tilemap, offset & 0x3ff);
} }
VIDEO_START( carjmbre ) VIDEO_START( carjmbre )
{ {
carjmbre_state *state = (carjmbre_state *)machine->driver_data;
carjmbre_tilemap = tilemap_create( machine, get_carjmbre_tile_info,tilemap_scan_rows,8,8,32,32 ); state->cj_tilemap = tilemap_create(machine, get_carjmbre_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
state_save_register_global(machine, state->flipscreen);
state_save_register_global(machine, carjmbre_flipscreen); state_save_register_global(machine, state->bgcolor);
state_save_register_global(machine, carjmbre_bgcolor);
} }
VIDEO_UPDATE( carjmbre ) VIDEO_UPDATE( carjmbre )
{ {
int offs,troffs,sx,sy,flipx,flipy; carjmbre_state *state = (carjmbre_state *)screen->machine->driver_data;
int offs, troffs, sx, sy, flipx, flipy;
//colorram //colorram
//76543210 //76543210
@ -97,7 +105,7 @@ VIDEO_UPDATE( carjmbre )
//----x--- ?? probably colour, only used for ramp and pond //----x--- ?? probably colour, only used for ramp and pond
//-----xxx colour //-----xxx colour
tilemap_draw( bitmap,cliprect,carjmbre_tilemap,0,0 ); tilemap_draw(bitmap, cliprect, state->cj_tilemap, 0, 0);
//spriteram[offs] //spriteram[offs]
//+0 y pos //+0 y pos
@ -110,32 +118,32 @@ VIDEO_UPDATE( carjmbre )
//----x--- ?? probably colour //----x--- ?? probably colour
//-----xxx colour //-----xxx colour
//+3 x pos //+3 x pos
for (offs = spriteram_size-4; offs >= 0; offs-=4) for (offs = spriteram_size - 4; offs >= 0; offs -= 4)
{ {
//before copying the sprites to spriteram the game reorders the first //before copying the sprites to spriteram the game reorders the first
//sprite to last, sprite ordering is incorrect if this isn't undone //sprite to last, sprite ordering is incorrect if this isn't undone
troffs=(offs-4+spriteram_size)%spriteram_size; troffs = (offs - 4 + spriteram_size) % spriteram_size;
//unused sprites are marked with ypos <= 0x02 (or >= 0xfd if screen flipped) //unused sprites are marked with ypos <= 0x02 (or >= 0xfd if screen flipped)
if (spriteram[troffs] > 0x02 && spriteram[troffs] < 0xfd) if (state->spriteram[troffs] > 0x02 && state->spriteram[troffs] < 0xfd)
{ {
{ {
sx = spriteram[troffs+3]-7; sx = state->spriteram[troffs + 3] - 7;
sy = 241-spriteram[troffs]; sy = 241 - state->spriteram[troffs];
flipx = (spriteram[troffs+2]&0x40)>>6; flipx = (state->spriteram[troffs + 2] & 0x40) >> 6;
flipy = (spriteram[troffs+2]&0x80)>>7; flipy = (state->spriteram[troffs + 2] & 0x80) >> 7;
if (carjmbre_flipscreen) if (state->flipscreen)
{ {
sx = (256+(226-sx))%256; sx = (256 + (226 - sx)) % 256;
sy = 242-sy; sy = 242 - sy;
flipx = !flipx; flipx = !flipx;
flipy = !flipy; flipy = !flipy;
} }
drawgfx_transpen(bitmap,cliprect,screen->machine->gfx[1], drawgfx_transpen(bitmap, cliprect, screen->machine->gfx[1],
spriteram[troffs+1], state->spriteram[troffs + 1],
spriteram[troffs+2]&0x07, state->spriteram[troffs + 2] & 0x07,
flipx,flipy, flipx,flipy,
sx,sy,0); sx,sy,0);
} }

View File

@ -1,16 +1,14 @@
/* /***************************************************************************
Popper
Omori Electric CAD (OEC) 1983 Popper
*/
Omori Electric CAD (OEC) 1983
***************************************************************************/
#include "driver.h" #include "driver.h"
#include "video/resnet.h" #include "video/resnet.h"
#include "popper.h"
static tilemap *popper_p123_tilemap, *popper_p0_tilemap, *popper_ol_p123_tilemap, *popper_ol_p0_tilemap;
UINT8 *popper_videoram, *popper_attribram, *popper_ol_videoram, *popper_ol_attribram, *popper_spriteram;
size_t popper_spriteram_size;
static INT32 popper_flipscreen, popper_e002, popper_gfx_bank;
static rectangle tilemap_clip;
/*************************************************************************** /***************************************************************************
@ -58,150 +56,167 @@ PALETTE_INIT( popper )
WRITE8_HANDLER( popper_ol_videoram_w ) WRITE8_HANDLER( popper_ol_videoram_w )
{ {
popper_ol_videoram[offset] = data; popper_state *state = (popper_state *)space->machine->driver_data;
tilemap_mark_tile_dirty(popper_ol_p123_tilemap,offset);
tilemap_mark_tile_dirty(popper_ol_p0_tilemap,offset); state->ol_videoram[offset] = data;
tilemap_mark_tile_dirty(state->ol_p123_tilemap, offset);
tilemap_mark_tile_dirty(state->ol_p0_tilemap, offset);
} }
WRITE8_HANDLER( popper_videoram_w ) WRITE8_HANDLER( popper_videoram_w )
{ {
popper_videoram[offset] = data; popper_state *state = (popper_state *)space->machine->driver_data;
tilemap_mark_tile_dirty(popper_p123_tilemap,offset);
tilemap_mark_tile_dirty(popper_p0_tilemap,offset); state->videoram[offset] = data;
tilemap_mark_tile_dirty(state->p123_tilemap, offset);
tilemap_mark_tile_dirty(state->p0_tilemap, offset);
} }
WRITE8_HANDLER( popper_ol_attribram_w ) WRITE8_HANDLER( popper_ol_attribram_w )
{ {
popper_ol_attribram[offset] = data; popper_state *state = (popper_state *)space->machine->driver_data;
tilemap_mark_tile_dirty(popper_ol_p123_tilemap,offset);
tilemap_mark_tile_dirty(popper_ol_p0_tilemap,offset); state->ol_attribram[offset] = data;
tilemap_mark_tile_dirty(state->ol_p123_tilemap, offset);
tilemap_mark_tile_dirty(state->ol_p0_tilemap, offset);
} }
WRITE8_HANDLER( popper_attribram_w ) WRITE8_HANDLER( popper_attribram_w )
{ {
popper_attribram[offset] = data; popper_state *state = (popper_state *)space->machine->driver_data;
tilemap_mark_tile_dirty(popper_p123_tilemap,offset);
tilemap_mark_tile_dirty(popper_p0_tilemap,offset); state->attribram[offset] = data;
tilemap_mark_tile_dirty(state->p123_tilemap, offset);
tilemap_mark_tile_dirty(state->p0_tilemap, offset);
} }
WRITE8_HANDLER( popper_flipscreen_w ) WRITE8_HANDLER( popper_flipscreen_w )
{ {
popper_flipscreen = data; popper_state *state = (popper_state *)space->machine->driver_data;
tilemap_set_flip_all( space->machine,popper_flipscreen?(TILEMAP_FLIPX|TILEMAP_FLIPY):0 );
tilemap_clip = *video_screen_get_visible_area(space->machine->primary_screen); state->flipscreen = data;
tilemap_set_flip_all(space->machine, state->flipscreen ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0);
if (popper_flipscreen) if (state->flipscreen)
tilemap_clip.min_x=tilemap_clip.max_x-15; state->tilemap_clip.min_x = state->tilemap_clip.max_x - 15;
else else
tilemap_clip.max_x=15; state->tilemap_clip.max_x = 15;
} }
WRITE8_HANDLER( popper_e002_w ) WRITE8_HANDLER( popper_e002_w )
{ {
popper_e002 = data; popper_state *state = (popper_state *)space->machine->driver_data;
state->e002 = data;
} }
WRITE8_HANDLER( popper_gfx_bank_w ) WRITE8_HANDLER( popper_gfx_bank_w )
{ {
if (popper_gfx_bank != data) popper_state *state = (popper_state *)space->machine->driver_data;
if (state->gfx_bank != data)
{ {
popper_gfx_bank = data; state->gfx_bank = data;
tilemap_mark_all_tiles_dirty_all(space->machine); tilemap_mark_all_tiles_dirty_all(space->machine);
} }
} }
static TILE_GET_INFO( get_popper_p123_tile_info ) static TILE_GET_INFO( get_popper_p123_tile_info )
{ {
UINT32 tile_number = popper_videoram[tile_index]; popper_state *state = (popper_state *)machine->driver_data;
UINT8 attr = popper_attribram[tile_index]; UINT32 tile_number = state->videoram[tile_index];
tile_number += popper_gfx_bank << 8; UINT8 attr = state->attribram[tile_index];
tile_number += state->gfx_bank << 8;
SET_TILE_INFO( SET_TILE_INFO(
0, 0,
tile_number, tile_number,
(attr&0xf), (attr & 0xf),
0); 0);
tileinfo->group = (attr & 0x80)>>7; tileinfo->group = (attr & 0x80) >> 7;
} }
static TILE_GET_INFO( get_popper_p0_tile_info ) static TILE_GET_INFO( get_popper_p0_tile_info )
{ {
UINT32 tile_number = popper_videoram[tile_index]; popper_state *state = (popper_state *)machine->driver_data;
UINT8 attr = popper_attribram[tile_index]; UINT32 tile_number = state->videoram[tile_index];
tile_number += popper_gfx_bank << 8; UINT8 attr = state->attribram[tile_index];
tile_number += state->gfx_bank << 8;
//pen 0 only in front if colour set as well //pen 0 only in front if colour set as well
tileinfo->group = (attr&0x70) ? ((attr & 0x80)>>7) : 0; tileinfo->group = (attr & 0x70) ? ((attr & 0x80) >> 7) : 0;
SET_TILE_INFO( SET_TILE_INFO(
0, 0,
tile_number, tile_number,
((attr&0x70)>>4)+8, ((attr & 0x70) >> 4) + 8,
0); 0);
} }
static TILE_GET_INFO( get_popper_ol_p123_tile_info ) static TILE_GET_INFO( get_popper_ol_p123_tile_info )
{ {
UINT32 tile_number = popper_ol_videoram[tile_index]; popper_state *state = (popper_state *)machine->driver_data;
UINT8 attr = popper_ol_attribram[tile_index]; UINT32 tile_number = state->ol_videoram[tile_index];
tile_number += popper_gfx_bank << 8; UINT8 attr = state->ol_attribram[tile_index];
tile_number += state->gfx_bank << 8;
SET_TILE_INFO( SET_TILE_INFO(
0, 0,
tile_number, tile_number,
(attr&0xf), (attr & 0xf),
0); 0);
tileinfo->group = (attr & 0x80)>>7; tileinfo->group = (attr & 0x80) >> 7;
} }
static TILE_GET_INFO( get_popper_ol_p0_tile_info ) static TILE_GET_INFO( get_popper_ol_p0_tile_info )
{ {
UINT32 tile_number = popper_ol_videoram[tile_index]; popper_state *state = (popper_state *)machine->driver_data;
UINT8 attr = popper_ol_attribram[tile_index]; UINT32 tile_number = state->ol_videoram[tile_index];
tile_number += popper_gfx_bank << 8; UINT8 attr = state->ol_attribram[tile_index];
tile_number += state->gfx_bank << 8;
//pen 0 only in front if colour set as well //pen 0 only in front if colour set as well
tileinfo->group = (attr&0x70) ? ((attr & 0x80)>>7) : 0; tileinfo->group = (attr & 0x70) ? ((attr & 0x80) >> 7) : 0;
SET_TILE_INFO( SET_TILE_INFO(
0, 0,
tile_number, tile_number,
((attr&0x70)>>4)+8, ((attr & 0x70) >> 4) + 8,
0); 0);
} }
VIDEO_START( popper ) VIDEO_START( popper )
{ {
popper_p123_tilemap = tilemap_create( machine, get_popper_p123_tile_info, tilemap_scan_cols,8,8,33,32 ); popper_state *state = (popper_state *)machine->driver_data;
popper_p0_tilemap = tilemap_create( machine, get_popper_p0_tile_info, tilemap_scan_cols,8,8,33,32 ); state->p123_tilemap = tilemap_create(machine, get_popper_p123_tile_info, tilemap_scan_cols, 8, 8, 33, 32 );
popper_ol_p123_tilemap = tilemap_create( machine, get_popper_ol_p123_tile_info,tilemap_scan_cols,8,8,2 ,32 ); state->p0_tilemap = tilemap_create(machine, get_popper_p0_tile_info, tilemap_scan_cols, 8, 8, 33, 32);
popper_ol_p0_tilemap = tilemap_create( machine, get_popper_ol_p0_tile_info, tilemap_scan_cols,8,8,2 ,32 ); state->ol_p123_tilemap = tilemap_create(machine, get_popper_ol_p123_tile_info, tilemap_scan_cols, 8, 8, 2, 32);
state->ol_p0_tilemap = tilemap_create(machine, get_popper_ol_p0_tile_info, tilemap_scan_cols, 8, 8, 2, 32);
tilemap_set_transmask(popper_p123_tilemap, 0,0x0f,0x01); tilemap_set_transmask(state->p123_tilemap, 0, 0x0f, 0x01);
tilemap_set_transmask(popper_p123_tilemap, 1,0x01,0x0f); tilemap_set_transmask(state->p123_tilemap, 1, 0x01, 0x0f);
tilemap_set_transmask(popper_p0_tilemap, 0,0x0f,0x0e); tilemap_set_transmask(state->p0_tilemap, 0, 0x0f, 0x0e);
tilemap_set_transmask(popper_p0_tilemap, 1,0x0e,0x0f); tilemap_set_transmask(state->p0_tilemap, 1, 0x0e, 0x0f);
tilemap_set_transmask(popper_ol_p123_tilemap,0,0x0f,0x01); tilemap_set_transmask(state->ol_p123_tilemap, 0, 0x0f, 0x01);
tilemap_set_transmask(popper_ol_p123_tilemap,1,0x01,0x0f); tilemap_set_transmask(state->ol_p123_tilemap, 1, 0x01, 0x0f);
tilemap_set_transmask(popper_ol_p0_tilemap, 0,0x0f,0x0e); tilemap_set_transmask(state->ol_p0_tilemap, 0, 0x0f, 0x0e);
tilemap_set_transmask(popper_ol_p0_tilemap, 1,0x0e,0x0f); tilemap_set_transmask(state->ol_p0_tilemap, 1, 0x0e, 0x0f);
tilemap_clip = *video_screen_get_visible_area(machine->primary_screen); state->tilemap_clip = *video_screen_get_visible_area(machine->primary_screen);
state_save_register_global(machine, popper_flipscreen); state_save_register_global(machine, state->flipscreen);
// state_save_register_global(machine, popper_e002); state_save_register_global(machine, state->e002);
state_save_register_global(machine, popper_gfx_bank); state_save_register_global(machine, state->gfx_bank);
} }
static void draw_sprites(running_machine *machine, bitmap_t *bitmap,const rectangle *cliprect) static void draw_sprites( running_machine *machine, bitmap_t *bitmap,const rectangle *cliprect )
{ {
int offs,sx,sy,flipx,flipy; popper_state *state = (popper_state *)machine->driver_data;
int offs, sx, sy, flipx, flipy;
for (offs = 0; offs < popper_spriteram_size-4; offs += 4) for (offs = 0; offs < spriteram_size - 4; offs += 4)
{ {
//if y position is in the current strip //if y position is in the current strip
if(popper_spriteram[offs+1] && (((popper_spriteram[offs]+(popper_flipscreen?2:0))&0xf0) == (0x0f-offs/0x80)<<4)) if (state->spriteram[offs + 1] && (((state->spriteram[offs] + (state->flipscreen ? 2 : 0)) & 0xf0) == (0x0f - offs / 0x80) << 4))
{ {
//offs y pos //offs y pos
//offs+1 sprite number //offs+1 sprite number
@ -213,12 +228,12 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap,const rectan
//----xxxx colour //----xxxx colour
//offs+3 x pos //offs+3 x pos
sx = popper_spriteram[offs+3]; sx = state->spriteram[offs + 3];
sy = 240-popper_spriteram[offs]; sy = 240 - state->spriteram[offs];
flipx = (popper_spriteram[offs+2]&0x40)>>6; flipx = (state->spriteram[offs + 2] & 0x40) >> 6;
flipy = (popper_spriteram[offs+2]&0x80)>>7; flipy = (state->spriteram[offs + 2] & 0x80) >> 7;
if (popper_flipscreen) if (state->flipscreen)
{ {
sx = 248 - sx; sx = 248 - sx;
sy = 242 - sy; sy = 242 - sy;
@ -226,9 +241,9 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap,const rectan
flipy = !flipy; flipy = !flipy;
} }
drawgfx_transpen(bitmap,cliprect,machine->gfx[1], drawgfx_transpen(bitmap, cliprect, machine->gfx[1],
popper_spriteram[offs+1], state->spriteram[offs + 1],
(popper_spriteram[offs+2]&0x0f), (state->spriteram[offs + 2] & 0x0f),
flipx,flipy, flipx,flipy,
sx,sy,0); sx,sy,0);
} }
@ -237,7 +252,8 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap,const rectan
VIDEO_UPDATE( popper ) VIDEO_UPDATE( popper )
{ {
rectangle finalclip = tilemap_clip; popper_state *state = (popper_state *)screen->machine->driver_data;
rectangle finalclip = state->tilemap_clip;
sect_rect(&finalclip, cliprect); sect_rect(&finalclip, cliprect);
//attribram //attribram
@ -246,16 +262,16 @@ VIDEO_UPDATE( popper )
//-xxx---- colour for pen 0 (from second prom?) //-xxx---- colour for pen 0 (from second prom?)
//----xxxx colour for pens 1,2,3 //----xxxx colour for pens 1,2,3
tilemap_draw( bitmap,cliprect,popper_p123_tilemap, TILEMAP_DRAW_LAYER1,0 ); tilemap_draw(bitmap, cliprect, state->p123_tilemap, TILEMAP_DRAW_LAYER1, 0);
tilemap_draw( bitmap,cliprect,popper_p0_tilemap, TILEMAP_DRAW_LAYER1,0 ); tilemap_draw(bitmap, cliprect, state->p0_tilemap, TILEMAP_DRAW_LAYER1, 0);
tilemap_draw( bitmap,&finalclip,popper_ol_p123_tilemap,TILEMAP_DRAW_LAYER1,0 ); tilemap_draw(bitmap, &finalclip, state->ol_p123_tilemap, TILEMAP_DRAW_LAYER1, 0);
tilemap_draw( bitmap,&finalclip,popper_ol_p0_tilemap, TILEMAP_DRAW_LAYER1,0 ); tilemap_draw(bitmap, &finalclip, state->ol_p0_tilemap, TILEMAP_DRAW_LAYER1, 0);
draw_sprites(screen->machine, bitmap,cliprect); draw_sprites(screen->machine, bitmap, cliprect);
tilemap_draw( bitmap,cliprect,popper_p123_tilemap, TILEMAP_DRAW_LAYER0,0 ); tilemap_draw(bitmap, cliprect, state->p123_tilemap, TILEMAP_DRAW_LAYER0, 0);
tilemap_draw( bitmap,cliprect,popper_p0_tilemap, TILEMAP_DRAW_LAYER0,0 ); tilemap_draw(bitmap, cliprect, state->p0_tilemap, TILEMAP_DRAW_LAYER0, 0);
tilemap_draw( bitmap,&finalclip,popper_ol_p123_tilemap,TILEMAP_DRAW_LAYER0,0 ); tilemap_draw(bitmap, &finalclip, state->ol_p123_tilemap, TILEMAP_DRAW_LAYER0, 0);
tilemap_draw( bitmap,&finalclip,popper_ol_p0_tilemap, TILEMAP_DRAW_LAYER0,0 ); tilemap_draw(bitmap, &finalclip, state->ol_p0_tilemap, TILEMAP_DRAW_LAYER0, 0);
return 0; return 0;
} }