summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Fabio Priuli <etabeta78@users.noreply.github.com>2009-11-19 23:22:24 +0000
committer Fabio Priuli <etabeta78@users.noreply.github.com>2009-11-19 23:22:24 +0000
commitcba7af8e5bb2e7071e48f0ce3a4a2bfdb130b04f (patch)
tree2bac984ef90d6b6018b8086e77fa2056c246e353
parentaa2e1eb4453128ade5e3f52d54fd2086b4e7a8af (diff)
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 :-)
-rw-r--r--.gitattributes1
-rw-r--r--src/mame/drivers/bionicc.c230
-rw-r--r--src/mame/includes/bionicc.h37
-rw-r--r--src/mame/video/bionicc.c165
4 files changed, 271 insertions, 162 deletions
diff --git a/.gitattributes b/.gitattributes
index fb00d817230..c392f16c26f 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -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
diff --git a/src/mame/drivers/bionicc.c b/src/mame/drivers/bionicc.c
index 963eec74c4b..254a031dfaf 100644
--- a/src/mame/drivers/bionicc.c
+++ b/src/mame/drivers/bionicc.c
@@ -1,129 +1,126 @@
-/********************************************************************
+/******************************************************************************************
- Bionic Commando
+ Bionic Commando
-PCB is a 3 board stack:
- Main CPU board: 86612-A-2
-Graphics ROM board: 86612-B-2
- Program ROM board: 86612-C-2
+ PCB is a 3 board stack:
+ Main CPU board: 86612-A-2
+ Graphics ROM board: 86612-B-2
+ Program ROM board: 86612-C-2
- Main CPU: 68000CP10
- Sound CPU: Z80A
- MCU: Intel C8751H-88
-Sound Chip: YM2151 & YM3012
- OSC: 24.000 MHz (on the 86612-B-2 PCB)
- Custom: CAPCOM DL-010D-103 (on the 86612-B-2 PCB)
+ Main CPU: 68000CP10
+ Sound CPU: Z80A
+ MCU: Intel C8751H-88
+ Sound Chip: YM2151 & YM3012
+ OSC: 24.000 MHz (on the 86612-B-2 PCB)
+ Custom: CAPCOM DL-010D-103 (on the 86612-B-2 PCB)
-Note: Euro rom labels (IE: "TSE") had a blue stripe, while those labeled
- as USA (TSU) had an red stripe on the sticker. The intermixing
- of TSE and TSU roms in the parent set is correct and verified.
-Note: Euro set simply states the game cannot be operated in Japan....
-Note: These issues have been verified on a real PCB and are not emulation bugs:
- - misplaced sprites ( see beginning of level 1 or 2 for example )
- - sprite / sprite priority ( see level 2 the reflectors )
- - sprite / background priority ( see level 1: birds walk through
- branches of different trees )
- - see the beginning of level 3: background screwed
- - gray tiles around the title in Top Secret
+ Note: Euro rom labels (IE: "TSE") had a blue stripe, while those labeled
+ as USA (TSU) had an red stripe on the sticker. The intermixing
+ of TSE and TSU roms in the parent set is correct and verified.
+ Note: Euro set simply states the game cannot be operated in Japan....
+ Note: These issues have been verified on a real PCB and are not emulation bugs:
+ - misplaced sprites ( see beginning of level 1 or 2 for example )
+ - sprite / sprite priority ( see level 2 the reflectors )
+ - sprite / background priority ( see level 1: birds walk through
+ branches of different trees )
+ - see the beginning of level 3: background screwed
+ - gray tiles around the title in Top Secret
-ToDo:
-- get rid of input port hack
+ ToDo:
+ - get rid of input port hack
- Controls appear to be mapped at 0xFE4000, alongside dip switches, but there
- is something strange going on that I can't (yet) figure out.
- Player controls and coin inputs are supposed to magically appear at
- 0xFFFFFB (coin/start)
- 0xFFFFFD (player 2)
- 0xFFFFFF (player 1)
+ Controls appear to be mapped at 0xFE4000, alongside dip switches, but there
+ is something strange going on that I can't (yet) figure out.
+ Player controls and coin inputs are supposed to magically appear at
+ 0xFFFFFB (coin/start)
+ 0xFFFFFD (player 2)
+ 0xFFFFFF (player 1)
- This is probably done by the Intel C8751H MCU on the board (whose interal ROM
- is not yet available).
+ This is probably done by the Intel C8751H MCU on the board (whose interal ROM
+ is not yet available).
- The MCU also takes care of the commands for the sound CPU, which are stored
- at FFFFF9.
+ The MCU also takes care of the commands for the sound CPU, which are stored
+ at FFFFF9.
- IRQ4 seems to be control related.
- On each interrupt, it reads 0xFE4000 (coin/start), shift the bits around
- and move the resulting byte into a dword RAM location. The dword RAM location
- is rotated by 8 bits each time this happens.
- This is probably done to be pedantic about coin insertions (might be protection
- related). In fact, currently coin insertions are not consistently recognized.
+ IRQ4 seems to be control related.
+ On each interrupt, it reads 0xFE4000 (coin/start), shift the bits around
+ and move the resulting byte into a dword RAM location. The dword RAM location
+ is rotated by 8 bits each time this happens.
+ This is probably done to be pedantic about coin insertions (might be protection
+ 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;
+#define MASTER_CLOCK XTAL_24MHz
+#define EXO3_F0_CLK XTAL_14_31818MHz
-VIDEO_START( bionicc );
-VIDEO_UPDATE( bionicc );
-VIDEO_EOF( bionicc );
-
-
-static UINT16 bionicc_inp[3];
+/*************************************
+ *
+ * Memory handlers
+ *
+ *************************************/
static WRITE16_HANDLER( hacked_controls_w )
{
-logerror("%06x: hacked_controls_w %04x %02x\n",cpu_get_pc(space->cpu),offset,data);
- COMBINE_DATA(&bionicc_inp[offset]);
+ 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(&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 )
diff --git a/src/mame/includes/bionicc.h b/src/mame/includes/bionicc.h
new file mode 100644
index 00000000000..65c2f696687
--- /dev/null
+++ b/src/mame/includes/bionicc.h
@@ -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 );
diff --git a/src/mame/video/bionicc.c b/src/mame/video/bionicc.c
index 27ef3bba76b..18b6f3d4c74 100644
--- a/src/mame/video/bionicc.c
+++ b/src/mame/video/bionicc.c
@@ -1,35 +1,30 @@
/***************************************************************************
-Bionic Commando Video Hardware
+ Bionic Commando Video Hardware
-This board handles tile/tile and tile/sprite priority with a PROM. Its
-working is complicated and hardcoded in the driver.
+ This board handles tile/tile and tile/sprite priority with a PROM. Its
+ working is complicated and hardcoded in the driver.
-The PROM is a 256x4 chip, with address inputs wired as follows:
+ The PROM is a 256x4 chip, with address inputs wired as follows:
-A0 bg opaque
-A1 \
-A2 | fg pen
-A3 |
-A4 /
-A5 fg has priority over sprites (bit 5 of tile attribute)
-A6 fg has not priority over bg (bits 6 & 7 of tile attribute both set)
-A7 sprite opaque
+ A0 bg opaque
+ A1 \
+ A2 | fg pen
+ A3 |
+ A4 /
+ A5 fg has priority over sprites (bit 5 of tile attribute)
+ A6 fg has not priority over bg (bits 6 & 7 of tile attribute both set)
+ A7 sprite opaque
-The output selects the active layer, it can be:
-0 bg
-1 fg
-2 sprite
+ The output selects the active layer, it can be:
+ 0 bg
+ 1 fg
+ 2 sprite
***************************************************************************/
#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);
-
- 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);
+ bionicc_state *state = (bionicc_state *)machine->driver_data;
+
+ 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,32 +116,39 @@ 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);
+ bright = (data & 0x0f);
- r = ((data>>12)&0x0f) * 0x11;
- g = ((data>>8 )&0x0f) * 0x11;
- b = ((data>>4 )&0x0f) * 0x11;
+ r = ((data >> 12) & 0x0f) * 0x11;
+ g = ((data >> 8 ) & 0x0f) * 0x11;
+ b = ((data >> 4 ) & 0x0f) * 0x11;
if ((bright & 0x08) == 0)
{
@@ -152,38 +162,40 @@ 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);
+ coin_counter_w(0, data & 0x8000);
+ coin_counter_w(1, data & 0x4000);
}
}
@@ -195,22 +207,27 @@ WRITE16_HANDLER( bionicc_gfxctrl_w )
***************************************************************************/
-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 )
{
+// 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)
+ for (offs = (spriteram_size - 8) / 2; offs >= 0; offs -= 4)
{
int tile_number = buffered_spriteram16[offs] & 0x7ff;
- if( tile_number!=0x7FF ){
- int attr = buffered_spriteram16[offs+1];
- int color = (attr&0x3C)>>2;
- int flipx = attr&0x02;
+ if( tile_number != 0x7ff )
+ {
+ int attr = buffered_spriteram16[offs + 1];
+ 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;
+ int sx = (INT16)buffered_spriteram16[offs + 3]; /* signed */
+ int sy = (INT16)buffered_spriteram16[offs + 2]; /* signed */
+
+ 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 )
{
- 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);
- 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);
+ bionicc_state *state = (bionicc_state *)screen->machine->driver_data;
+
+ bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine));
+ 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, state->fg_tilemap, 0 | TILEMAP_DRAW_LAYER0, 0);
+ tilemap_draw(bitmap, cliprect, state->tx_tilemap, 0, 0);
return 0;
}