Added save states to bionicc.c

Out of whatsnew: this driver also has 99% of driver data stored in the struct. 
it still misses paletteram16, which currently uses a generic handler(and hence does not fit the struct approach), but I wanted save states so much for this game that I commit it anyway :-)
This commit is contained in:
Fabio Priuli 2009-11-19 23:22:24 +00:00
parent aa2e1eb445
commit cba7af8e5b
4 changed files with 270 additions and 161 deletions

1
.gitattributes vendored
View File

@ -2334,6 +2334,7 @@ src/mame/includes/battlex.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/bigevglf.h svneol=native#text/plain
src/mame/includes/bionicc.h svneol=native#text/plain
src/mame/includes/blockade.h svneol=native#text/plain
src/mame/includes/blstroid.h svneol=native#text/plain
src/mame/includes/blueprnt.h svneol=native#text/plain

View File

@ -1,4 +1,4 @@
/********************************************************************
/******************************************************************************************
Bionic Commando
@ -52,78 +52,75 @@ ToDo:
related). In fact, currently coin insertions are not consistently recognized.
********************************************************************/
******************************************************************************************/
#include "driver.h"
#include "cpu/z80/z80.h"
#include "cpu/m68000/m68000.h"
#include "deprecat.h"
#include "sound/2151intf.h"
#include "bionicc.h"
#define MASTER_CLOCK XTAL_24MHz
#define EXO3_F0_CLK XTAL_14_31818MHz
WRITE16_HANDLER( bionicc_fgvideoram_w );
WRITE16_HANDLER( bionicc_bgvideoram_w );
WRITE16_HANDLER( bionicc_txvideoram_w );
WRITE16_HANDLER( bionicc_paletteram_w );
WRITE16_HANDLER( bionicc_scroll_w );
WRITE16_HANDLER( bionicc_gfxctrl_w );
extern UINT16 *bionicc_bgvideoram;
extern UINT16 *bionicc_fgvideoram;
extern UINT16 *bionicc_txvideoram;
VIDEO_START( bionicc );
VIDEO_UPDATE( bionicc );
VIDEO_EOF( bionicc );
static UINT16 bionicc_inp[3];
/*************************************
*
* Memory handlers
*
*************************************/
static WRITE16_HANDLER( hacked_controls_w )
{
bionicc_state *state = (bionicc_state *)space->machine->driver_data;
logerror("%06x: hacked_controls_w %04x %02x\n", cpu_get_pc(space->cpu), offset, data);
COMBINE_DATA(&bionicc_inp[offset]);
COMBINE_DATA(&state->inp[offset]);
}
static READ16_HANDLER( hacked_controls_r )
{
logerror("%06x: hacked_controls_r %04x %04x\n",cpu_get_pc(space->cpu),offset,bionicc_inp[offset]);
return bionicc_inp[offset];
bionicc_state *state = (bionicc_state *)space->machine->driver_data;
logerror("%06x: hacked_controls_r %04x %04x\n", cpu_get_pc(space->cpu), offset, state->inp[offset]);
return state->inp[offset];
}
static WRITE16_HANDLER( bionicc_mpu_trigger_w )
{
bionicc_state *state = (bionicc_state *)space->machine->driver_data;
data = input_port_read(space->machine, "SYSTEM") >> 12;
bionicc_inp[0] = data ^ 0x0f;
state->inp[0] = data ^ 0x0f;
data = input_port_read(space->machine, "P2");
bionicc_inp[1] = data ^ 0xff;
state->inp[1] = data ^ 0xff;
data = input_port_read(space->machine, "P1");
bionicc_inp[2] = data ^ 0xff;
state->inp[2] = data ^ 0xff;
}
static UINT16 soundcommand;
static WRITE16_HANDLER( hacked_soundcommand_w )
{
COMBINE_DATA(&soundcommand);
soundlatch_w(space,0,soundcommand & 0xff);
bionicc_state *state = (bionicc_state *)space->machine->driver_data;
COMBINE_DATA(&state->soundcommand);
soundlatch_w(space, 0, state->soundcommand & 0xff);
}
static READ16_HANDLER( hacked_soundcommand_r )
{
return soundcommand;
bionicc_state *state = (bionicc_state *)space->machine->driver_data;
return state->soundcommand;
}
/********************************************************************
INTERRUPT
Interrupt
The game runs on 2 interrupts.
@ -143,6 +140,12 @@ static INTERRUPT_GEN( bionicc_interrupt )
cpu_set_input_line(device, 4, HOLD_LINE);
}
/*************************************
*
* Address maps
*
*************************************/
static ADDRESS_MAP_START( main_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x03ffff) AM_ROM
AM_RANGE(0xfe0000, 0xfe07ff) AM_RAM /* RAM? */
@ -153,10 +156,10 @@ static ADDRESS_MAP_START( main_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0xfe4002, 0xfe4003) AM_READ_PORT("DSW")
AM_RANGE(0xfe8010, 0xfe8017) AM_WRITE(bionicc_scroll_w)
AM_RANGE(0xfe801a, 0xfe801b) AM_WRITE(bionicc_mpu_trigger_w) /* ??? not sure, but looks like it */
AM_RANGE(0xfec000, 0xfecfff) AM_RAM_WRITE(bionicc_txvideoram_w) AM_BASE(&bionicc_txvideoram)
AM_RANGE(0xff0000, 0xff3fff) AM_RAM_WRITE(bionicc_fgvideoram_w) AM_BASE(&bionicc_fgvideoram)
AM_RANGE(0xff4000, 0xff7fff) AM_RAM_WRITE(bionicc_bgvideoram_w) AM_BASE(&bionicc_bgvideoram)
AM_RANGE(0xff8000, 0xff87ff) AM_RAM_WRITE(bionicc_paletteram_w) AM_BASE(&paletteram16)
AM_RANGE(0xfec000, 0xfecfff) AM_RAM_WRITE(bionicc_txvideoram_w) AM_BASE_MEMBER(bionicc_state, txvideoram)
AM_RANGE(0xff0000, 0xff3fff) AM_RAM_WRITE(bionicc_fgvideoram_w) AM_BASE_MEMBER(bionicc_state, fgvideoram)
AM_RANGE(0xff4000, 0xff7fff) AM_RAM_WRITE(bionicc_bgvideoram_w) AM_BASE_MEMBER(bionicc_state, bgvideoram)
AM_RANGE(0xff8000, 0xff87ff) AM_RAM_WRITE(bionicc_paletteram_w) AM_BASE_MEMBER(bionicc_state, paletteram16)
AM_RANGE(0xffc000, 0xfffff7) AM_RAM /* working RAM */
AM_RANGE(0xfffff8, 0xfffff9) AM_READWRITE(hacked_soundcommand_r, hacked_soundcommand_w) /* hack */
AM_RANGE(0xfffffa, 0xffffff) AM_READWRITE(hacked_controls_r, hacked_controls_w) /* hack */
@ -171,6 +174,11 @@ static ADDRESS_MAP_START( sound_map, ADDRESS_SPACE_PROGRAM, 8 )
ADDRESS_MAP_END
/*************************************
*
* Input ports
*
*************************************/
static INPUT_PORTS_START( bionicc )
PORT_START("SYSTEM")
@ -247,13 +255,11 @@ static INPUT_PORTS_START( bionicc )
INPUT_PORTS_END
/********************************************************************
GRAPHICS
********************************************************************/
/*************************************
*
* Graphics definitions
*
*************************************/
static const gfx_layout spritelayout_bionicc=
{
@ -321,8 +327,40 @@ static GFXDECODE_START( bionicc )
GFXDECODE_END
/*************************************
*
* Machine driver
*
*************************************/
static MACHINE_START( bionicc )
{
bionicc_state *state = (bionicc_state *)machine->driver_data;
state_save_register_global(machine, state->soundcommand);
state_save_register_global_array(machine, state->inp);
state_save_register_global_array(machine, state->scroll);
}
static MACHINE_RESET( bionicc )
{
bionicc_state *state = (bionicc_state *)machine->driver_data;
state->inp[0] = 0;
state->inp[1] = 0;
state->inp[2] = 0;
state->scroll[0] = 0;
state->scroll[1] = 0;
state->scroll[2] = 0;
state->scroll[3] = 0;
state->soundcommand = 0;
}
static MACHINE_DRIVER_START( bionicc )
/* driver data */
MDRV_DRIVER_DATA(bionicc_state)
/* basic machine hardware */
MDRV_CPU_ADD("maincpu", M68000, MASTER_CLOCK / 2) /* 12 MHz - verified in schematics */
MDRV_CPU_PROGRAM_MAP(main_map)
@ -336,6 +374,9 @@ static MACHINE_DRIVER_START( bionicc )
*/
MDRV_CPU_VBLANK_INT_HACK(nmi_line_pulse,4)
MDRV_MACHINE_START(bionicc)
MDRV_MACHINE_RESET(bionicc)
/* video hardware */
MDRV_VIDEO_ATTRIBUTES(VIDEO_BUFFERS_SPRITERAM)
@ -361,6 +402,12 @@ MACHINE_DRIVER_END
/*************************************
*
* ROM definition(s)
*
*************************************/
ROM_START( bionicc ) /* "Not for use in Japan" */
ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */
ROM_LOAD16_BYTE( "tse_02.1a", 0x00000, 0x10000, CRC(e4aeefaa) SHA1(77b6a2d4337bf350239abb50013d030d7c5c8640) ) /* 68000 code */
@ -538,8 +585,13 @@ ROM_START( topsecrt ) /* "Not for use in any other country but Japan" */
ROM_END
/*************************************
*
* Game driver(s)
*
*************************************/
GAME( 1987, bionicc, 0, bionicc, bionicc, 0, ROT0, "Capcom", "Bionic Commando (Euro)", 0 )
GAME( 1987, bionicc1, bionicc, bionicc, bionicc, 0, ROT0, "Capcom", "Bionic Commando (US set 1)", 0 )
GAME( 1987, bionicc2, bionicc, bionicc, bionicc, 0, ROT0, "Capcom", "Bionic Commando (US set 2)", 0 )
GAME( 1987, topsecrt, bionicc, bionicc, bionicc, 0, ROT0, "Capcom", "Top Secret (Japan)", 0 )
GAME( 1987, bionicc, 0, bionicc, bionicc, 0, ROT0, "Capcom", "Bionic Commando (Euro)", GAME_SUPPORTS_SAVE )
GAME( 1987, bionicc1, bionicc, bionicc, bionicc, 0, ROT0, "Capcom", "Bionic Commando (US set 1)", GAME_SUPPORTS_SAVE )
GAME( 1987, bionicc2, bionicc, bionicc, bionicc, 0, ROT0, "Capcom", "Bionic Commando (US set 2)", GAME_SUPPORTS_SAVE )
GAME( 1987, topsecrt, bionicc, bionicc, bionicc, 0, ROT0, "Capcom", "Top Secret (Japan)", GAME_SUPPORTS_SAVE )

View File

@ -0,0 +1,37 @@
/***************************************************************************
Bionic Commando
***************************************************************************/
typedef struct _bionicc_state bionicc_state;
struct _bionicc_state
{
/* memory pointers */
UINT16 * bgvideoram;
UINT16 * fgvideoram;
UINT16 * txvideoram;
UINT16 * paletteram16;
// UINT16 * spriteram16; // needed for EOF, but currently handled through buffer_spriteram16
/* video-related */
tilemap *tx_tilemap, *bg_tilemap, *fg_tilemap;
UINT16 scroll[4];
UINT16 inp[3];
UINT16 soundcommand;
};
/*----------- defined in video/bionicc.c -----------*/
WRITE16_HANDLER( bionicc_fgvideoram_w );
WRITE16_HANDLER( bionicc_bgvideoram_w );
WRITE16_HANDLER( bionicc_txvideoram_w );
WRITE16_HANDLER( bionicc_paletteram_w );
WRITE16_HANDLER( bionicc_scroll_w );
WRITE16_HANDLER( bionicc_gfxctrl_w );
VIDEO_START( bionicc );
VIDEO_UPDATE( bionicc );
VIDEO_EOF( bionicc );

View File

@ -24,12 +24,7 @@ The output selects the active layer, it can be:
***************************************************************************/
#include "driver.h"
UINT16 *bionicc_fgvideoram;
UINT16 *bionicc_bgvideoram;
UINT16 *bionicc_txvideoram;
static tilemap *tx_tilemap, *bg_tilemap, *fg_tilemap;
#include "bionicc.h"
/***************************************************************************
@ -40,17 +35,21 @@ static tilemap *tx_tilemap, *bg_tilemap, *fg_tilemap;
static TILE_GET_INFO( get_bg_tile_info )
{
int attr = bionicc_bgvideoram[2*tile_index+1];
bionicc_state *state = (bionicc_state *)machine->driver_data;
int attr = state->bgvideoram[2 * tile_index + 1];
SET_TILE_INFO(
1,
(bionicc_bgvideoram[2*tile_index] & 0xff) + ((attr & 0x07) << 8),
(state->bgvideoram[2 * tile_index] & 0xff) + ((attr & 0x07) << 8),
(attr & 0x18) >> 3,
TILE_FLIPXY((attr & 0xc0) >> 6));
}
static TILE_GET_INFO( get_fg_tile_info )
{
int attr = bionicc_fgvideoram[2*tile_index+1];
bionicc_state *state = (bionicc_state *)machine->driver_data;
int attr = state->fgvideoram[2 * tile_index + 1];
int flags;
if ((attr & 0xc0) == 0xc0)
@ -68,17 +67,19 @@ static TILE_GET_INFO( get_fg_tile_info )
SET_TILE_INFO(
2,
(bionicc_fgvideoram[2*tile_index] & 0xff) + ((attr & 0x07) << 8),
(state->fgvideoram[2 * tile_index] & 0xff) + ((attr & 0x07) << 8),
(attr & 0x18) >> 3,
flags);
}
static TILE_GET_INFO( get_tx_tile_info )
{
int attr = bionicc_txvideoram[tile_index + 0x400];
bionicc_state *state = (bionicc_state *)machine->driver_data;
int attr = state->txvideoram[tile_index + 0x400];
SET_TILE_INFO(
0,
(bionicc_txvideoram[tile_index] & 0xff) + ((attr & 0x00c0) << 2),
(state->txvideoram[tile_index] & 0xff) + ((attr & 0x00c0) << 2),
attr & 0x3f,
0);
}
@ -93,14 +94,16 @@ static TILE_GET_INFO( get_tx_tile_info )
VIDEO_START( bionicc )
{
tx_tilemap = tilemap_create(machine, get_tx_tile_info,tilemap_scan_rows, 8, 8,32,32);
fg_tilemap = tilemap_create(machine, get_fg_tile_info,tilemap_scan_rows,16,16,64,64);
bg_tilemap = tilemap_create(machine, get_bg_tile_info,tilemap_scan_rows, 8, 8,64,64);
bionicc_state *state = (bionicc_state *)machine->driver_data;
tilemap_set_transparent_pen(tx_tilemap,3);
tilemap_set_transmask(fg_tilemap,0,0xffff,0x8000); /* split type 0 is completely transparent in front half */
tilemap_set_transmask(fg_tilemap,1,0xffc1,0x803e); /* split type 1 has pens 1-5 opaque in front half */
tilemap_set_transparent_pen(bg_tilemap,15);
state->tx_tilemap = tilemap_create(machine, get_tx_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
state->fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 16, 16, 64, 64);
state->bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 64, 64);
tilemap_set_transparent_pen(state->tx_tilemap, 3);
tilemap_set_transmask(state->fg_tilemap, 0, 0xffff, 0x8000); /* split type 0 is completely transparent in front half */
tilemap_set_transmask(state->fg_tilemap, 1, 0xffc1, 0x803e); /* split type 1 has pens 1-5 opaque in front half */
tilemap_set_transparent_pen(state->bg_tilemap, 15);
}
@ -113,26 +116,33 @@ VIDEO_START( bionicc )
WRITE16_HANDLER( bionicc_bgvideoram_w )
{
COMBINE_DATA(&bionicc_bgvideoram[offset]);
tilemap_mark_tile_dirty(bg_tilemap,offset/2);
bionicc_state *state = (bionicc_state *)space->machine->driver_data;
COMBINE_DATA(&state->bgvideoram[offset]);
tilemap_mark_tile_dirty(state->bg_tilemap, offset / 2);
}
WRITE16_HANDLER( bionicc_fgvideoram_w )
{
COMBINE_DATA(&bionicc_fgvideoram[offset]);
tilemap_mark_tile_dirty(fg_tilemap,offset/2);
bionicc_state *state = (bionicc_state *)space->machine->driver_data;
COMBINE_DATA(&state->fgvideoram[offset]);
tilemap_mark_tile_dirty(state->fg_tilemap, offset / 2);
}
WRITE16_HANDLER( bionicc_txvideoram_w )
{
COMBINE_DATA(&bionicc_txvideoram[offset]);
tilemap_mark_tile_dirty(tx_tilemap,offset&0x3ff);
bionicc_state *state = (bionicc_state *)space->machine->driver_data;
COMBINE_DATA(&state->txvideoram[offset]);
tilemap_mark_tile_dirty(state->tx_tilemap, offset & 0x3ff);
}
WRITE16_HANDLER( bionicc_paletteram_w )
{
bionicc_state *state = (bionicc_state *)space->machine->driver_data;
int r, g, b, bright;
data = COMBINE_DATA(&paletteram16[offset]);
data = COMBINE_DATA(&state->paletteram16[offset]);
bright = (data & 0x0f);
@ -152,35 +162,37 @@ WRITE16_HANDLER( bionicc_paletteram_w )
WRITE16_HANDLER( bionicc_scroll_w )
{
static UINT16 scroll[4];
bionicc_state *state = (bionicc_state *)space->machine->driver_data;
data = COMBINE_DATA(&scroll[offset]);
data = COMBINE_DATA(&state->scroll[offset]);
switch (offset)
{
case 0:
tilemap_set_scrollx(fg_tilemap,0,data);
tilemap_set_scrollx(state->fg_tilemap, 0, data);
break;
case 1:
tilemap_set_scrolly(fg_tilemap,0,data);
tilemap_set_scrolly(state->fg_tilemap, 0, data);
break;
case 2:
tilemap_set_scrollx(bg_tilemap,0,data);
tilemap_set_scrollx(state->bg_tilemap, 0, data);
break;
case 3:
tilemap_set_scrolly(bg_tilemap,0,data);
tilemap_set_scrolly(state->bg_tilemap, 0, data);
break;
}
}
WRITE16_HANDLER( bionicc_gfxctrl_w )
{
bionicc_state *state = (bionicc_state *)space->machine->driver_data;
if (ACCESSING_BITS_8_15)
{
flip_screen_set(space->machine, data & 0x0100);
tilemap_set_enable(bg_tilemap,data & 0x2000); /* guess */
tilemap_set_enable(fg_tilemap,data & 0x1000); /* guess */
tilemap_set_enable(state->bg_tilemap, data & 0x2000); /* guess */
tilemap_set_enable(state->fg_tilemap, data & 0x1000); /* guess */
coin_counter_w(0, data & 0x8000);
coin_counter_w(1, data & 0x4000);
@ -197,20 +209,25 @@ WRITE16_HANDLER( bionicc_gfxctrl_w )
static void draw_sprites( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect )
{
// bionicc_state *state = (bionicc_state *)machine->driver_data;
int offs;
const gfx_element *gfx = machine->gfx[3];
for (offs = (spriteram_size - 8) / 2; offs >= 0; offs -= 4)
{
int tile_number = buffered_spriteram16[offs] & 0x7ff;
if( tile_number!=0x7FF ){
if( tile_number != 0x7ff )
{
int attr = buffered_spriteram16[offs + 1];
int color = (attr&0x3C)>>2;
int color = (attr & 0x3c) >> 2;
int flipx = attr & 0x02;
int flipy = 0;
int sx = (INT16)buffered_spriteram16[offs + 3]; /* signed */
int sy = (INT16)buffered_spriteram16[offs + 2]; /* signed */
if(sy>512-16) sy-=512;
if (sy > 512 - 16)
sy -= 512;
if (flip_screen_get(machine))
{
sx = 240 - sx;
@ -230,13 +247,15 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
VIDEO_UPDATE( bionicc )
{
bionicc_state *state = (bionicc_state *)screen->machine->driver_data;
bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine));
tilemap_draw(bitmap,cliprect,fg_tilemap,1|TILEMAP_DRAW_LAYER1,0); /* nothing in FRONT */
tilemap_draw(bitmap,cliprect,bg_tilemap,0,0);
tilemap_draw(bitmap,cliprect,fg_tilemap,0|TILEMAP_DRAW_LAYER1,0);
tilemap_draw(bitmap, cliprect, state->fg_tilemap, 1 | TILEMAP_DRAW_LAYER1, 0); /* nothing in FRONT */
tilemap_draw(bitmap, cliprect, state->bg_tilemap, 0, 0);
tilemap_draw(bitmap, cliprect, state->fg_tilemap, 0 | TILEMAP_DRAW_LAYER1, 0);
draw_sprites(screen->machine, bitmap, cliprect);
tilemap_draw(bitmap,cliprect,fg_tilemap,0|TILEMAP_DRAW_LAYER0,0);
tilemap_draw(bitmap,cliprect,tx_tilemap,0,0);
tilemap_draw(bitmap, cliprect, state->fg_tilemap, 0 | TILEMAP_DRAW_LAYER0, 0);
tilemap_draw(bitmap, cliprect, state->tx_tilemap, 0, 0);
return 0;
}