summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Fabio Priuli <etabeta78@users.noreply.github.com>2010-01-06 11:38:48 +0000
committer Fabio Priuli <etabeta78@users.noreply.github.com>2010-01-06 11:38:48 +0000
commit2336b51f2fcade4c7763e414a3b8e2d59c96d1d7 (patch)
treeb4518fd88a0eaa4175d1a2e6f1fdd9ed7a4c1771
parentfd4e438cdbdd817bcb1cd02801439e0b8301c3dc (diff)
Forgot to commit these:
- added driver data struct & save states to gradius3.c
-rw-r--r--.gitattributes1
-rw-r--r--src/mame/drivers/gradius3.c197
-rw-r--r--src/mame/includes/gradius3.h39
-rw-r--r--src/mame/video/gradius3.c101
4 files changed, 204 insertions, 134 deletions
diff --git a/.gitattributes b/.gitattributes
index 509d20a98bc..23ef2a222df 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -2522,6 +2522,7 @@ src/mame/includes/gomoku.h svneol=native#text/plain
src/mame/includes/gotcha.h svneol=native#text/plain
src/mame/includes/gottlieb.h svneol=native#text/plain
src/mame/includes/gotya.h svneol=native#text/plain
+src/mame/includes/gradius3.h svneol=native#text/plain
src/mame/includes/grchamp.h svneol=native#text/plain
src/mame/includes/gridlee.h svneol=native#text/plain
src/mame/includes/gstriker.h svneol=native#text/plain
diff --git a/src/mame/drivers/gradius3.c b/src/mame/drivers/gradius3.c
index 1a372ba8d37..a6dbaecdba7 100644
--- a/src/mame/drivers/gradius3.c
+++ b/src/mame/drivers/gradius3.c
@@ -1,20 +1,20 @@
/***************************************************************************
-Gradius 3 (GX945) (c) 1989 Konami
+ Gradius 3 (GX945) (c) 1989 Konami
-driver by Nicola Salmoria
+ driver by Nicola Salmoria
-This board uses the well known 052109 051962 custom gfx chips, however unlike
-all other games they fetch gfx data from RAM. The gfx ROMs are memory mapped
-on cpu B and the needed parts are copied to RAM at run time.
-To handle this efficiently in MAME, some changes would be required to the
-tilemap system and to video/konamiic.c. For the time being, I'm kludging
-my way in.
-There's also something wrong in the way tile banks are implemented in
-konamiic.c. They don't seem to be used by this game.
+ This board uses the well known 052109 051962 custom gfx chips, however unlike
+ all other games they fetch gfx data from RAM. The gfx ROMs are memory mapped
+ on cpu B and the needed parts are copied to RAM at run time.
+ To handle this efficiently in MAME, some changes would be required to the
+ tilemap system and to video/konamiic.c. For the time being, I'm kludging
+ my way in.
+ There's also something wrong in the way tile banks are implemented in
+ konamiic.c. They don't seem to be used by this game.
-2009-03:
-Added dsw locations and verified factory setting based on Guru's notes
+ 2009-03:
+ Added dsw locations and verified factory setting based on Guru's notes
***************************************************************************/
@@ -26,146 +26,134 @@ Added dsw locations and verified factory setting based on Guru's notes
#include "sound/2151intf.h"
#include "sound/k007232.h"
#include "includes/konamipt.h"
+#include "includes/gradius3.h"
-extern UINT16 *gradius3_gfxram;
-extern int gradius3_priority;
-VIDEO_START( gradius3 );
-READ16_HANDLER( gradius3_gfxrom_r );
-WRITE16_HANDLER( gradius3_gfxram_w );
-VIDEO_UPDATE( gradius3 );
-
-extern void gradius3_sprite_callback(running_machine *machine, int *code,int *color,int *priority_mask,int *shadow);
-extern void gradius3_tile_callback(running_machine *machine, int layer,int bank,int *code,int *color,int *flags,int *priority);
-
-
-static READ16_HANDLER( K052109_halfword_r )
+static READ16_HANDLER( k052109_halfword_r )
{
- const device_config *k052109 = devtag_get_device(space->machine, "k052109");
- return k052109_r(k052109, offset);
+ gradius3_state *state = (gradius3_state *)space->machine->driver_data;
+ return k052109_r(state->k052109, offset);
}
-static WRITE16_HANDLER( K052109_halfword_w )
+static WRITE16_HANDLER( k052109_halfword_w )
{
- const device_config *k052109 = devtag_get_device(space->machine, "k052109");
+ gradius3_state *state = (gradius3_state *)space->machine->driver_data;
+
if (ACCESSING_BITS_0_7)
- k052109_w(k052109, offset, data & 0xff);
+ k052109_w(state->k052109, offset, data & 0xff);
/* is this a bug in the game or something else? */
if (!ACCESSING_BITS_0_7)
- k052109_w(k052109, offset, (data >> 8) & 0xff);
+ k052109_w(state->k052109, offset, (data >> 8) & 0xff);
// logerror("%06x half %04x = %04x\n",cpu_get_pc(space->cpu),offset,data);
}
-static READ16_HANDLER( K051937_halfword_r )
+static READ16_HANDLER( k051937_halfword_r )
{
- const device_config *k051960 = devtag_get_device(space->machine, "k051960");
- return k051937_r(k051960, offset);
+ gradius3_state *state = (gradius3_state *)space->machine->driver_data;
+ return k051937_r(state->k051960, offset);
}
-static WRITE16_HANDLER( K051937_halfword_w )
+static WRITE16_HANDLER( k051937_halfword_w )
{
- const device_config *k051960 = devtag_get_device(space->machine, "k051960");
+ gradius3_state *state = (gradius3_state *)space->machine->driver_data;
if (ACCESSING_BITS_0_7)
- k051937_w(k051960, offset, data & 0xff);
+ k051937_w(state->k051960, offset, data & 0xff);
}
-static READ16_HANDLER( K051960_halfword_r )
+static READ16_HANDLER( k051960_halfword_r )
{
- const device_config *k051960 = devtag_get_device(space->machine, "k051960");
- return k051960_r(k051960, offset);
+ gradius3_state *state = (gradius3_state *)space->machine->driver_data;
+ return k051960_r(state->k051960, offset);
}
-static WRITE16_HANDLER( K051960_halfword_w )
+static WRITE16_HANDLER( k051960_halfword_w )
{
- const device_config *k051960 = devtag_get_device(space->machine, "k051960");
+ gradius3_state *state = (gradius3_state *)space->machine->driver_data;
if (ACCESSING_BITS_0_7)
- k051960_w(k051960, offset, data & 0xff);
-}
-
-
-
-static int irqAen,irqBmask;
-
-
-static MACHINE_RESET( gradius3 )
-{
- /* start with cpu B halted */
- cputag_set_input_line(machine, "sub", INPUT_LINE_RESET, ASSERT_LINE);
- irqAen = 0;
- irqBmask = 0;
+ k051960_w(state->k051960, offset, data & 0xff);
}
static WRITE16_HANDLER( cpuA_ctrl_w )
{
+ gradius3_state *state = (gradius3_state *)space->machine->driver_data;
+
if (ACCESSING_BITS_8_15)
{
data >>= 8;
/* bits 0-1 are coin counters */
- coin_counter_w(space->machine, 0,data & 0x01);
- coin_counter_w(space->machine, 1,data & 0x02);
+ coin_counter_w(space->machine, 0, data & 0x01);
+ coin_counter_w(space->machine, 1, data & 0x02);
/* bit 2 selects layer priority */
- gradius3_priority = data & 0x04;
+ state->priority = data & 0x04;
/* bit 3 enables cpu B */
- cputag_set_input_line(space->machine, "sub", INPUT_LINE_RESET, (data & 0x08) ? CLEAR_LINE : ASSERT_LINE);
+ cpu_set_input_line(state->subcpu, INPUT_LINE_RESET, (data & 0x08) ? CLEAR_LINE : ASSERT_LINE);
/* bit 5 enables irq */
- irqAen = data & 0x20;
+ state->irqAen = data & 0x20;
/* other bits unknown */
-//logerror("%06x: write %04x to c0000\n",cpu_get_pc(space->cpu),data);
+ //logerror("%06x: write %04x to c0000\n",cpu_get_pc(space->cpu),data);
}
}
static WRITE16_HANDLER( cpuB_irqenable_w )
{
+ gradius3_state *state = (gradius3_state *)space->machine->driver_data;
+
if (ACCESSING_BITS_8_15)
- irqBmask = (data >> 8) & 0x07;
+ state->irqBmask = (data >> 8) & 0x07;
}
static INTERRUPT_GEN( cpuA_interrupt )
{
- if (irqAen)
+ gradius3_state *state = (gradius3_state *)device->machine->driver_data;
+ if (state->irqAen)
cpu_set_input_line(device, 2, HOLD_LINE);
}
static INTERRUPT_GEN( cpuB_interrupt )
{
+ gradius3_state *state = (gradius3_state *)device->machine->driver_data;
+
if (cpu_getiloops(device) & 1) /* ??? */
{
- if (irqBmask & 2)
+ if (state->irqBmask & 2)
cpu_set_input_line(device, 2, HOLD_LINE);
}
else
{
- if (irqBmask & 1)
+ if (state->irqBmask & 1)
cpu_set_input_line(device, 1, HOLD_LINE);
}
}
static WRITE16_HANDLER( cpuB_irqtrigger_w )
{
- if (irqBmask & 4)
+ gradius3_state *state = (gradius3_state *)space->machine->driver_data;
+
+ if (state->irqBmask & 4)
{
-logerror("%04x trigger cpu B irq 4 %02x\n",cpu_get_pc(space->cpu),data);
- cputag_set_input_line(space->machine, "sub", 4, HOLD_LINE);
+ logerror("%04x trigger cpu B irq 4 %02x\n",cpu_get_pc(space->cpu),data);
+ cpu_set_input_line(state->subcpu, 4, HOLD_LINE);
}
else
-logerror("%04x MISSED cpu B irq 4 %02x\n",cpu_get_pc(space->cpu),data);
+ logerror("%04x MISSED cpu B irq 4 %02x\n",cpu_get_pc(space->cpu),data);
}
static WRITE16_HANDLER( sound_command_w )
{
if (ACCESSING_BITS_8_15)
- soundlatch_w(space,0,(data >> 8) & 0xff);
+ soundlatch_w(space, 0, (data >> 8) & 0xff);
}
static WRITE16_HANDLER( sound_irq_w )
{
- cputag_set_input_line_and_vector(space->machine, "audiocpu", 0, HOLD_LINE, 0xff);
+ gradius3_state *state = (gradius3_state *)space->machine->driver_data;
+ cpu_set_input_line_and_vector(state->audiocpu, 0, HOLD_LINE, 0xff);
}
static WRITE8_DEVICE_HANDLER( sound_bank_w )
@@ -175,7 +163,7 @@ static WRITE8_DEVICE_HANDLER( sound_bank_w )
/* banks # for the 007232 (chip 1) */
bank_A = ((data >> 0) & 0x03);
bank_B = ((data >> 2) & 0x03);
- k007232_set_bank( device, bank_A, bank_B );
+ k007232_set_bank(device, bank_A, bank_B);
}
@@ -196,8 +184,8 @@ static ADDRESS_MAP_START( gradius3_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x0e8000, 0x0e8001) AM_WRITE(sound_command_w)
AM_RANGE(0x0f0000, 0x0f0001) AM_WRITE(sound_irq_w)
AM_RANGE(0x100000, 0x103fff) AM_RAM AM_SHARE("share1")
- AM_RANGE(0x14c000, 0x153fff) AM_READWRITE(K052109_halfword_r, K052109_halfword_w)
- AM_RANGE(0x180000, 0x19ffff) AM_RAM_WRITE(gradius3_gfxram_w) AM_BASE(&gradius3_gfxram) AM_SHARE("share2")
+ AM_RANGE(0x14c000, 0x153fff) AM_READWRITE(k052109_halfword_r, k052109_halfword_w)
+ AM_RANGE(0x180000, 0x19ffff) AM_RAM_WRITE(gradius3_gfxram_w) AM_BASE_MEMBER(gradius3_state, gfxram) AM_SHARE("share2")
ADDRESS_MAP_END
@@ -206,19 +194,19 @@ static ADDRESS_MAP_START( gradius3_map2, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x100000, 0x103fff) AM_RAM
AM_RANGE(0x140000, 0x140001) AM_WRITE(cpuB_irqenable_w)
AM_RANGE(0x200000, 0x203fff) AM_RAM AM_SHARE("share1")
- AM_RANGE(0x24c000, 0x253fff) AM_READWRITE(K052109_halfword_r, K052109_halfword_w)
+ AM_RANGE(0x24c000, 0x253fff) AM_READWRITE(k052109_halfword_r, k052109_halfword_w)
AM_RANGE(0x280000, 0x29ffff) AM_RAM_WRITE(gradius3_gfxram_w) AM_SHARE("share2")
- AM_RANGE(0x2c0000, 0x2c000f) AM_READWRITE(K051937_halfword_r, K051937_halfword_w)
- AM_RANGE(0x2c0800, 0x2c0fff) AM_READWRITE(K051960_halfword_r, K051960_halfword_w)
+ AM_RANGE(0x2c0000, 0x2c000f) AM_READWRITE(k051937_halfword_r, k051937_halfword_w)
+ AM_RANGE(0x2c0800, 0x2c0fff) AM_READWRITE(k051960_halfword_r, k051960_halfword_w)
AM_RANGE(0x400000, 0x5fffff) AM_READ(gradius3_gfxrom_r) /* gfx ROMs are mapped here, and copied to RAM */
ADDRESS_MAP_END
static ADDRESS_MAP_START( gradius3_s_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0xefff) AM_ROM
- AM_RANGE(0xf000, 0xf000) AM_DEVWRITE("konami", sound_bank_w) /* 007232 bankswitch */
+ AM_RANGE(0xf000, 0xf000) AM_DEVWRITE("k007232", sound_bank_w) /* 007232 bankswitch */
AM_RANGE(0xf010, 0xf010) AM_READ(soundlatch_r)
- AM_RANGE(0xf020, 0xf02d) AM_DEVREADWRITE("konami", k007232_r, k007232_w)
+ AM_RANGE(0xf020, 0xf02d) AM_DEVREADWRITE("k007232", k007232_r, k007232_w)
AM_RANGE(0xf030, 0xf031) AM_DEVREADWRITE("ymsnd", ym2151_r, ym2151_w)
AM_RANGE(0xf800, 0xffff) AM_RAM
ADDRESS_MAP_END
@@ -282,11 +270,10 @@ static INPUT_PORTS_START( gradius3 )
INPUT_PORTS_END
-
static void volume_callback(const device_config *device, int v)
{
- k007232_set_volume(device,0,(v >> 4) * 0x11,0);
- k007232_set_volume(device,1,0,(v & 0x0f) * 0x11);
+ k007232_set_volume(device, 0, (v >> 4) * 0x11, 0);
+ k007232_set_volume(device, 1, 0, (v & 0x0f) * 0x11);
}
static const k007232_interface k007232_config =
@@ -312,8 +299,39 @@ static const k051960_interface gradius3_k051960_intf =
gradius3_sprite_callback
};
+static MACHINE_START( gradius3 )
+{
+ gradius3_state *state = (gradius3_state *)machine->driver_data;
+
+ state->maincpu = devtag_get_device(machine, "maincpu");
+ state->audiocpu = devtag_get_device(machine, "audiocpu");
+ state->subcpu = devtag_get_device(machine, "sub");
+ state->k007232 = devtag_get_device(machine, "k007232");
+ state->k052109 = devtag_get_device(machine, "k052109");
+ state->k051960 = devtag_get_device(machine, "k051960");
+
+ state_save_register_global(machine, state->irqAen);
+ state_save_register_global(machine, state->irqBmask);
+ state_save_register_global(machine, state->priority);
+}
+
+static MACHINE_RESET( gradius3 )
+{
+ gradius3_state *state = (gradius3_state *)machine->driver_data;
+
+ /* start with cpu B halted */
+ cputag_set_input_line(machine, "sub", INPUT_LINE_RESET, ASSERT_LINE);
+ state->irqAen = 0;
+ state->irqBmask = 0;
+ state->priority = 0;
+
+}
+
static MACHINE_DRIVER_START( gradius3 )
+ /* driver data */
+ MDRV_DRIVER_DATA(gradius3_state)
+
/* basic machine hardware */
MDRV_CPU_ADD("maincpu", M68000, 10000000) /* 10 MHz */
MDRV_CPU_PROGRAM_MAP(gradius3_map)
@@ -329,6 +347,7 @@ static MACHINE_DRIVER_START( gradius3 )
MDRV_QUANTUM_TIME(HZ(6000))
+ MDRV_MACHINE_START(gradius3)
MDRV_MACHINE_RESET(gradius3)
/* video hardware */
@@ -356,7 +375,7 @@ static MACHINE_DRIVER_START( gradius3 )
MDRV_SOUND_ROUTE(0, "lspeaker", 1.0)
MDRV_SOUND_ROUTE(1, "rspeaker", 1.0)
- MDRV_SOUND_ADD("konami", K007232, 3579545)
+ MDRV_SOUND_ADD("k007232", K007232, 3579545)
MDRV_SOUND_CONFIG(k007232_config)
MDRV_SOUND_ROUTE(0, "lspeaker", 0.20)
MDRV_SOUND_ROUTE(0, "rspeaker", 0.20)
@@ -408,7 +427,7 @@ ROM_START( gradius3 )
ROM_REGION( 0x0100, "proms", 0 )
ROM_LOAD( "945l14.j28", 0x0000, 0x0100, CRC(c778c189) SHA1(847eaf379ba075c25911c6f83dd63ff390534f60) ) /* priority encoder (not used) */
- ROM_REGION( 0x80000, "konami", 0 ) /* 007232 samples */
+ ROM_REGION( 0x80000, "k007232", 0 ) /* 007232 samples */
ROM_LOAD( "945_a10.b15", 0x00000, 0x40000, CRC(1d083e10) SHA1(b116f133a7647ef7a6c373aff00e9622d9954b61) )
ROM_LOAD( "945_l11a.c18", 0x40000, 0x20000, CRC(6043f4eb) SHA1(1c2e9ace1cfdde504b7b6158e3c3f54dc5ae33d4) )
ROM_LOAD( "945_l11b.c20", 0x60000, 0x20000, CRC(89ea3baf) SHA1(8edcbaa7969185cfac48c02559826d1b8b081f3f) )
@@ -450,7 +469,7 @@ ROM_START( gradius3a )
ROM_REGION( 0x0100, "proms", 0 )
ROM_LOAD( "945l14.j28", 0x0000, 0x0100, CRC(c778c189) SHA1(847eaf379ba075c25911c6f83dd63ff390534f60) ) /* priority encoder (not used) */
- ROM_REGION( 0x80000, "konami", 0 ) /* 007232 samples */
+ ROM_REGION( 0x80000, "k007232", 0 ) /* 007232 samples */
ROM_LOAD( "945_a10.b15", 0x00000, 0x40000, CRC(1d083e10) SHA1(b116f133a7647ef7a6c373aff00e9622d9954b61) )
ROM_LOAD( "945_l11a.c18", 0x40000, 0x20000, CRC(6043f4eb) SHA1(1c2e9ace1cfdde504b7b6158e3c3f54dc5ae33d4) )
ROM_LOAD( "945_l11b.c20", 0x60000, 0x20000, CRC(89ea3baf) SHA1(8edcbaa7969185cfac48c02559826d1b8b081f3f) )
@@ -492,7 +511,7 @@ ROM_START( gradius3e )
ROM_REGION( 0x0100, "proms", 0 )
ROM_LOAD( "945l14.j28", 0x0000, 0x0100, CRC(c778c189) SHA1(847eaf379ba075c25911c6f83dd63ff390534f60) ) /* priority encoder (not used) */
- ROM_REGION( 0x80000, "konami", 0 ) /* 007232 samples */
+ ROM_REGION( 0x80000, "k007232", 0 ) /* 007232 samples */
ROM_LOAD( "945_a10.b15", 0x00000, 0x40000, CRC(1d083e10) SHA1(b116f133a7647ef7a6c373aff00e9622d9954b61) )
ROM_LOAD( "945_l11a.c18", 0x40000, 0x20000, CRC(6043f4eb) SHA1(1c2e9ace1cfdde504b7b6158e3c3f54dc5ae33d4) )
ROM_LOAD( "945_l11b.c20", 0x60000, 0x20000, CRC(89ea3baf) SHA1(8edcbaa7969185cfac48c02559826d1b8b081f3f) )
@@ -500,6 +519,6 @@ ROM_END
-GAME( 1989, gradius3, 0, gradius3, gradius3, 0, ROT0, "Konami", "Gradius III (Japan)", 0 )
-GAME( 1989, gradius3a, gradius3, gradius3, gradius3, 0, ROT0, "Konami", "Gradius III (Asia)", 0 )
-GAME( 1989, gradius3e, gradius3, gradius3, gradius3, 0, ROT0, "Konami", "Gradius III (World ?)", 0 )
+GAME( 1989, gradius3, 0, gradius3, gradius3, 0, ROT0, "Konami", "Gradius III (Japan)", GAME_SUPPORTS_SAVE )
+GAME( 1989, gradius3a, gradius3, gradius3, gradius3, 0, ROT0, "Konami", "Gradius III (Asia)", GAME_SUPPORTS_SAVE )
+GAME( 1989, gradius3e, gradius3, gradius3, gradius3, 0, ROT0, "Konami", "Gradius III (World ?)", GAME_SUPPORTS_SAVE )
diff --git a/src/mame/includes/gradius3.h b/src/mame/includes/gradius3.h
new file mode 100644
index 00000000000..6dfd82674ff
--- /dev/null
+++ b/src/mame/includes/gradius3.h
@@ -0,0 +1,39 @@
+/*************************************************************************
+
+ Gradius 3
+
+*************************************************************************/
+
+typedef struct _gradius3_state gradius3_state;
+struct _gradius3_state
+{
+ /* memory pointers */
+ UINT16 * gfxram;
+// UINT16 * paletteram; // currently this uses generic palette handling
+
+ /* video-related */
+ int layer_colorbase[3], sprite_colorbase;
+
+ /* misc */
+ int priority;
+ int irqAen, irqBmask;
+
+ /* devices */
+ const device_config *maincpu;
+ const device_config *audiocpu;
+ const device_config *subcpu;
+ const device_config *k007232;
+ const device_config *k052109;
+ const device_config *k051960;
+};
+
+/*----------- defined in video/gradius3.c -----------*/
+
+extern void gradius3_sprite_callback(running_machine *machine, int *code,int *color,int *priority_mask,int *shadow);
+extern void gradius3_tile_callback(running_machine *machine, int layer,int bank,int *code,int *color,int *flags,int *priority);
+
+READ16_HANDLER( gradius3_gfxrom_r );
+WRITE16_HANDLER( gradius3_gfxram_w );
+
+VIDEO_START( gradius3 );
+VIDEO_UPDATE( gradius3 );
diff --git a/src/mame/video/gradius3.c b/src/mame/video/gradius3.c
index 48fedc10af8..5a1554b48a5 100644
--- a/src/mame/video/gradius3.c
+++ b/src/mame/video/gradius3.c
@@ -1,15 +1,10 @@
#include "driver.h"
#include "video/konicdev.h"
+#include "includes/gradius3.h"
-#define TOTAL_CHARS 0x1000
-#define TOTAL_SPRITES 0x4000
-
-UINT16 *gradius3_gfxram;
-int gradius3_priority;
-static int layer_colorbase[3],sprite_colorbase;
-
-
+#define TOTAL_CHARS 0x1000
+#define TOTAL_SPRITES 0x4000
/***************************************************************************
@@ -17,22 +12,23 @@ static int layer_colorbase[3],sprite_colorbase;
***************************************************************************/
-void gradius3_tile_callback(running_machine *machine, int layer,int bank,int *code,int *color,int *flags,int *priority)
+void gradius3_tile_callback( running_machine *machine, int layer, int bank, int *code, int *color, int *flags, int *priority )
{
+ gradius3_state *state = (gradius3_state *)machine->driver_data;
+
/* (color & 0x02) is flip y handled internally by the 052109 */
*code |= ((*color & 0x01) << 8) | ((*color & 0x1c) << 7);
- *color = layer_colorbase[layer] + ((*color & 0xe0) >> 5);
+ *color = state->layer_colorbase[layer] + ((*color & 0xe0) >> 5);
}
-
/***************************************************************************
Callbacks for the K051960
***************************************************************************/
-void gradius3_sprite_callback(running_machine *machine, int *code,int *color,int *priority_mask,int *shadow)
+void gradius3_sprite_callback( running_machine *machine, int *code, int *color, int *priority_mask, int *shadow )
{
#define L0 0xaa
#define L1 0xcc
@@ -42,12 +38,16 @@ void gradius3_sprite_callback(running_machine *machine, int *code,int *color,int
{ L0|L2, L0, L0|L2, L0|L1|L2 },
{ L1|L2, L2, 0, L0|L1|L2 }
};
+ gradius3_state *state = (gradius3_state *)machine->driver_data;
int pri = ((*color & 0x60) >> 5);
- if (gradius3_priority == 0) *priority_mask = primask[0][pri];
- else *priority_mask = primask[1][pri];
+
+ if (state->priority == 0)
+ *priority_mask = primask[0][pri];
+ else
+ *priority_mask = primask[1][pri];
*code |= (*color & 0x01) << 13;
- *color = sprite_colorbase + ((*color & 0x1e) >> 1);
+ *color = state->sprite_colorbase + ((*color & 0x1e) >> 1);
}
@@ -58,26 +58,37 @@ void gradius3_sprite_callback(running_machine *machine, int *code,int *color,int
***************************************************************************/
+static STATE_POSTLOAD( gradius3_postload )
+{
+ int i;
+
+ for (i = 0; i < 0x20000; i += 16)
+ {
+ gfx_element_mark_dirty(machine->gfx[0], i / 16);
+ }
+}
+
VIDEO_START( gradius3 )
{
- const device_config *k052109 = devtag_get_device(machine, "k052109");
- const device_config *k051960 = devtag_get_device(machine, "k051960");
+ gradius3_state *state = (gradius3_state *)machine->driver_data;
int i;
- layer_colorbase[0] = 0;
- layer_colorbase[1] = 32;
- layer_colorbase[2] = 48;
- sprite_colorbase = 16;
+ state->layer_colorbase[0] = 0;
+ state->layer_colorbase[1] = 32;
+ state->layer_colorbase[2] = 48;
+ state->sprite_colorbase = 16;
- k052109_set_layer_offsets(k052109, 2, -2, 0);
- k051960_set_sprite_offsets(k051960, 2, 0);
+ k052109_set_layer_offsets(state->k052109, 2, -2, 0);
+ k051960_set_sprite_offsets(state->k051960, 2, 0);
/* re-decode the sprites because the ROMs are connected to the custom IC differently
from how they are connected to the CPU. */
for (i = 0; i < TOTAL_SPRITES; i++)
- gfx_element_mark_dirty(machine->gfx[1],i);
+ gfx_element_mark_dirty(machine->gfx[1], i);
+
+ gfx_element_set_source(machine->gfx[0], (UINT8 *)state->gfxram);
- gfx_element_set_source(machine->gfx[0], (UINT8 *)gradius3_gfxram);
+ state_save_register_postload(machine, gradius3_postload, NULL);
}
@@ -92,18 +103,19 @@ READ16_HANDLER( gradius3_gfxrom_r )
{
UINT8 *gfxdata = memory_region(space->machine, "gfx2");
- return (gfxdata[2*offset+1] << 8) | gfxdata[2*offset];
+ return (gfxdata[2 * offset + 1] << 8) | gfxdata[2 * offset];
}
WRITE16_HANDLER( gradius3_gfxram_w )
{
- int oldword = gradius3_gfxram[offset];
- COMBINE_DATA(&gradius3_gfxram[offset]);
- if (oldword != gradius3_gfxram[offset])
- gfx_element_mark_dirty(space->machine->gfx[0], offset / 16);
-}
+ gradius3_state *state = (gradius3_state *)space->machine->driver_data;
+ int oldword = state->gfxram[offset];
+ COMBINE_DATA(&state->gfxram[offset]);
+ if (oldword != state->gfxram[offset])
+ gfx_element_mark_dirty(space->machine->gfx[0], offset / 16);
+}
/***************************************************************************
@@ -113,29 +125,28 @@ WRITE16_HANDLER( gradius3_gfxram_w )
VIDEO_UPDATE( gradius3 )
{
- const device_config *k052109 = devtag_get_device(screen->machine, "k052109");
- const device_config *k051960 = devtag_get_device(screen->machine, "k051960");
+ gradius3_state *state = (gradius3_state *)screen->machine->driver_data;
/* TODO: this kludge enforces the char banks. For some reason, they don't work otherwise. */
- k052109_w(k052109, 0x1d80, 0x10);
- k052109_w(k052109, 0x1f00, 0x32);
+ k052109_w(state->k052109, 0x1d80, 0x10);
+ k052109_w(state->k052109, 0x1f00, 0x32);
- k052109_tilemap_update(k052109);
+ k052109_tilemap_update(state->k052109);
- bitmap_fill(screen->machine->priority_bitmap,cliprect,0);
- if (gradius3_priority == 0)
+ bitmap_fill(screen->machine->priority_bitmap, cliprect, 0);
+ if (state->priority == 0)
{
- k052109_tilemap_draw(k052109, bitmap, cliprect, 1, TILEMAP_DRAW_OPAQUE, 2);
- k052109_tilemap_draw(k052109, bitmap, cliprect, 2, 0, 4);
- k052109_tilemap_draw(k052109, bitmap, cliprect, 0, 0, 1);
+ k052109_tilemap_draw(state->k052109, bitmap, cliprect, 1, TILEMAP_DRAW_OPAQUE, 2);
+ k052109_tilemap_draw(state->k052109, bitmap, cliprect, 2, 0, 4);
+ k052109_tilemap_draw(state->k052109, bitmap, cliprect, 0, 0, 1);
}
else
{
- k052109_tilemap_draw(k052109, bitmap, cliprect, 0, TILEMAP_DRAW_OPAQUE, 1);
- k052109_tilemap_draw(k052109, bitmap, cliprect, 1, 0, 2);
- k052109_tilemap_draw(k052109, bitmap, cliprect, 2, 0, 4);
+ k052109_tilemap_draw(state->k052109, bitmap, cliprect, 0, TILEMAP_DRAW_OPAQUE, 1);
+ k052109_tilemap_draw(state->k052109, bitmap, cliprect, 1, 0, 2);
+ k052109_tilemap_draw(state->k052109, bitmap, cliprect, 2, 0, 4);
}
- k051960_sprites_draw(k051960, bitmap, cliprect, -1, -1);
+ k051960_sprites_draw(state->k051960, bitmap, cliprect, -1, -1);
return 0;
}