summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author Fabio Priuli <etabeta78@users.noreply.github.com>2009-11-30 00:03:05 +0000
committer Fabio Priuli <etabeta78@users.noreply.github.com>2009-11-30 00:03:05 +0000
commit9694fca5f258f2ee3f57f5791bbb66b602eb2eca (patch)
tree435a0b2911a5e7d8d1a0a6b9758cbf67696bdc36 /src
parent6dd4c78bcd5c48ee578c12aa0c1f20dbd723db61 (diff)
Added save states to funybubl.c, galaxi.c, gaiden.c and rocnrope.c
Added driver data struct to fuukifg2.c and fuukifg3.c (no save states yet due to anonymous timers) Also, added more devices to dkong driver data (to minimize # of cputag_xxxx calls) As a side note, now drgnbowl (one of the worst game ever) supports saves! enjoy :-P
Diffstat (limited to 'src')
-rw-r--r--src/mame/audio/dkong.c1
-rw-r--r--src/mame/drivers/dkong.c98
-rw-r--r--src/mame/drivers/funybubl.c59
-rw-r--r--src/mame/drivers/fuukifg2.c93
-rw-r--r--src/mame/drivers/fuukifg3.c154
-rw-r--r--src/mame/drivers/gaiden.c260
-rw-r--r--src/mame/drivers/galaxi.c215
-rw-r--r--src/mame/drivers/rocnrope.c79
-rw-r--r--src/mame/includes/dkong.h61
-rw-r--r--src/mame/includes/funybubl.h21
-rw-r--r--src/mame/includes/fuukifg2.h38
-rw-r--r--src/mame/includes/fuukifg3.h52
-rw-r--r--src/mame/includes/gaiden.h57
-rw-r--r--src/mame/includes/rocnrope.h26
-rw-r--r--src/mame/video/dkong.c6
-rw-r--r--src/mame/video/funybubl.c65
-rw-r--r--src/mame/video/fuukifg2.c174
-rw-r--r--src/mame/video/fuukifg3.c198
-rw-r--r--src/mame/video/gaiden.c218
-rw-r--r--src/mame/video/rocnrope.c36
20 files changed, 1145 insertions, 766 deletions
diff --git a/src/mame/audio/dkong.c b/src/mame/audio/dkong.c
index 45bbcc64c87..99104c1d806 100644
--- a/src/mame/audio/dkong.c
+++ b/src/mame/audio/dkong.c
@@ -1068,7 +1068,6 @@ static SOUND_START( dkong)
dkong_state *state = (dkong_state *)machine->driver_data;
state->snd_rom = memory_region(machine, "soundcpu");
- state->dev_vp2 = devtag_get_device(machine, "virtual_p2");
}
diff --git a/src/mame/drivers/dkong.c b/src/mame/drivers/dkong.c
index 718dd908d10..97822cf2849 100644
--- a/src/mame/drivers/dkong.c
+++ b/src/mame/drivers/dkong.c
@@ -385,15 +385,25 @@ static INTERRUPT_GEN( s2650_interrupt )
*
*************************************/
-static MACHINE_START( dkong2b )
+static void dkong_init_device_driver_data( running_machine *machine )
{
- dkong_state *state = (dkong_state *)machine->driver_data;
+ dkong_state *state = (dkong_state *)machine->driver_data;
- state->hardware_type = HARDWARE_TKG04;
+ state->dev_n2a03a = devtag_get_device(machine, "n2a03a");
+ state->dev_n2a03b = devtag_get_device(machine, "n2a03b");
+ state->dev_6h = devtag_get_device(machine, "ls259.6h");
+ state->dev_vp2 = devtag_get_device(machine, "virtual_p2");
+}
+
+static MACHINE_START( dkong2b )
+{
+ dkong_state *state = (dkong_state *)machine->driver_data;
- state_save_register_global(machine, state->decrypt_counter);
- state_save_register_global(machine, state->dma_latch);
+ dkong_init_device_driver_data(machine);
+ state->hardware_type = HARDWARE_TKG04;
+ state_save_register_global(machine, state->decrypt_counter);
+ state_save_register_global(machine, state->dma_latch);
}
static MACHINE_START( s2650 )
@@ -405,10 +415,10 @@ static MACHINE_START( s2650 )
MACHINE_START_CALL(dkong2b);
- for (i=0;i<0x200;i++)
+ for (i = 0; i < 0x200; i++)
state->rev_map[i] = -1;
- for (i=0;i<0x200;i++)
- state->rev_map[p[0x0000+i]] = i;
+ for (i = 0; i < 0x200; i++)
+ state->rev_map[p[0x0000 + i]] = i;
state->hunchloopback = 0;
@@ -448,9 +458,10 @@ static MACHINE_START( radarsc1 )
static MACHINE_START( dkong3 )
{
- dkong_state *state = (dkong_state *)machine->driver_data;
+ dkong_state *state = (dkong_state *)machine->driver_data;
- state->hardware_type = HARDWARE_TKG04;
+ dkong_init_device_driver_data(machine);
+ state->hardware_type = HARDWARE_TKG04;
}
static MACHINE_RESET( dkong )
@@ -497,10 +508,10 @@ static READ8_HANDLER( hb_dma_read_byte )
int bucket = state->rev_map[(offset>>10) & 0x1ff];
int addr;
- if (bucket<0)
+ if (bucket < 0)
fatalerror("hb_dma_read_byte - unmapped access for 0x%02x - bucket 0x%02x\n", offset, bucket);
- addr = ((bucket<<7) & 0x7c00) | (offset & 0x3ff);
+ addr = ((bucket << 7) & 0x7c00) | (offset & 0x3ff);
return memory_read_byte(space, addr);
}
@@ -511,10 +522,10 @@ static WRITE8_HANDLER( hb_dma_write_byte )
int bucket = state->rev_map[(offset>>10) & 0x1ff];
int addr;
- if (bucket<0)
+ if (bucket < 0)
fatalerror("hb_dma_read_byte - unmapped access for 0x%02x - bucket 0x%02x\n", offset, bucket);
- addr = ((bucket<<7) & 0x7c00) | (offset & 0x3ff);
+ addr = ((bucket << 7) & 0x7c00) | (offset & 0x3ff);
memory_write_byte(space, addr, data);
}
@@ -551,17 +562,16 @@ static WRITE8_DEVICE_HANDLER( p8257_drq_w )
static READ8_HANDLER( dkong_in2_r )
{
- /* mcu status (sound feedback) is inverted bit4 from port B (8039) */
- const device_config *devvp2 = devtag_get_device(space->machine, "virtual_p2");
- UINT8 mcustatus = latch8_bit4_q_r(devvp2, 0);
-
- UINT8 r;
-
- r = (input_port_read(space->machine, "IN2") & 0xBF) | (mcustatus << 6);
- coin_counter_w(space->machine, offset, r >> 7);
- if (r & 0x10)
- r = (r & ~0x10) | 0x80; /* service ==> coin */
- return r;
+ dkong_state *state = (dkong_state *)space->machine->driver_data;
+ /* mcu status (sound feedback) is inverted bit4 from port B (8039) */
+ UINT8 mcustatus = latch8_bit4_q_r(state->dev_vp2, 0);
+ UINT8 r;
+
+ r = (input_port_read(space->machine, "IN2") & 0xBF) | (mcustatus << 6);
+ coin_counter_w(space->machine, offset, r >> 7);
+ if (r & 0x10)
+ r = (r & ~0x10) | 0x80; /* service ==> coin */
+ return r;
}
static READ8_HANDLER( dkongjr_in2_r )
@@ -579,13 +589,13 @@ static READ8_HANDLER( dkongjr_in2_r )
static READ8_HANDLER( s2650_mirror_r )
{
- return memory_read_byte(space, 0x1000+offset);
+ return memory_read_byte(space, 0x1000 + offset);
}
static WRITE8_HANDLER( s2650_mirror_w )
{
- memory_write_byte(space, 0x1000+offset, data);
+ memory_write_byte(space, 0x1000 + offset, data);
}
@@ -692,16 +702,18 @@ static READ8_HANDLER( s2650_port1_r )
static WRITE8_HANDLER( dkong3_2a03_reset_w )
{
- if (data & 1)
- {
- cputag_set_input_line(space->machine, "n2a03a", INPUT_LINE_RESET, CLEAR_LINE);
- cputag_set_input_line(space->machine, "n2a03b", INPUT_LINE_RESET, CLEAR_LINE);
- }
- else
- {
- cputag_set_input_line(space->machine, "n2a03a", INPUT_LINE_RESET, ASSERT_LINE);
- cputag_set_input_line(space->machine, "n2a03b", INPUT_LINE_RESET, ASSERT_LINE);
- }
+ dkong_state *state = (dkong_state *)space->machine->driver_data;
+
+ if (data & 1)
+ {
+ cpu_set_input_line(state->dev_n2a03a, INPUT_LINE_RESET, CLEAR_LINE);
+ cpu_set_input_line(state->dev_n2a03b, INPUT_LINE_RESET, CLEAR_LINE);
+ }
+ else
+ {
+ cpu_set_input_line(state->dev_n2a03a, INPUT_LINE_RESET, ASSERT_LINE);
+ cpu_set_input_line(state->dev_n2a03b, INPUT_LINE_RESET, ASSERT_LINE);
+ }
}
static READ8_HANDLER( strtheat_inputport_0_r )
@@ -749,8 +761,7 @@ static ADDRESS_MAP_START( dkong_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x3fff) AM_ROM
AM_RANGE(0x6000, 0x6bff) AM_RAM
AM_RANGE(0x7000, 0x73ff) AM_RAM AM_BASE_SIZE_MEMBER(dkong_state, sprite_ram, sprite_ram_size) /* sprite set 1 */
- AM_RANGE(0x7400, 0x77ff) AM_RAM_WRITE(dkong_videoram_w)
- AM_BASE_MEMBER(dkong_state, video_ram)
+ AM_RANGE(0x7400, 0x77ff) AM_RAM_WRITE(dkong_videoram_w) AM_BASE_MEMBER(dkong_state, video_ram)
AM_RANGE(0x7800, 0x780f) AM_DEVREADWRITE("dma8257", i8257_r, i8257_w) /* P8257 control registers */
AM_RANGE(0x7c00, 0x7c00) AM_READ_PORT("IN0") AM_LATCH8_WRITE("ls175.3d") /* IN0, sound CPU intf */
AM_RANGE(0x7c80, 0x7c80) AM_READ_PORT("IN1") AM_WRITE(radarscp_grid_color_w)/* IN1 */
@@ -772,8 +783,7 @@ static ADDRESS_MAP_START( dkongjr_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x6000, 0x6bff) AM_RAM
AM_RANGE(0x6c00, 0x6fff) AM_RAM /* DK3 bootleg only */
AM_RANGE(0x7000, 0x73ff) AM_RAM AM_BASE_SIZE_MEMBER(dkong_state, sprite_ram, sprite_ram_size) /* sprite set 1 */
- AM_RANGE(0x7400, 0x77ff) AM_RAM_WRITE(dkong_videoram_w)
- AM_BASE_MEMBER(dkong_state, video_ram)
+ AM_RANGE(0x7400, 0x77ff) AM_RAM_WRITE(dkong_videoram_w) AM_BASE_MEMBER(dkong_state, video_ram)
AM_RANGE(0x7800, 0x780f) AM_DEVREADWRITE("dma8257", i8257_r, i8257_w) /* P8257 control registers */
AM_RANGE(0x7c00, 0x7c00) AM_READ_PORT("IN0") AM_LATCH8_WRITE("ls174.3d") /* IN0, sound interface */
@@ -802,8 +812,7 @@ static ADDRESS_MAP_START( dkong3_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x6000, 0x67ff) AM_RAM
AM_RANGE(0x6800, 0x6fff) AM_RAM
AM_RANGE(0x7000, 0x73ff) AM_RAM AM_BASE_SIZE_MEMBER(dkong_state, sprite_ram, sprite_ram_size) /* sprite set 1 */
- AM_RANGE(0x7400, 0x77ff) AM_RAM_WRITE(dkong_videoram_w)
- AM_BASE_MEMBER(dkong_state, video_ram)
+ AM_RANGE(0x7400, 0x77ff) AM_RAM_WRITE(dkong_videoram_w) AM_BASE_MEMBER(dkong_state, video_ram)
AM_RANGE(0x7c00, 0x7c00) AM_READ_PORT("IN0") AM_LATCH8_WRITE("latch1")
AM_RANGE(0x7c80, 0x7c80) AM_READ_PORT("IN1") AM_LATCH8_WRITE("latch2")
AM_RANGE(0x7d00, 0x7d00) AM_READ_PORT("DSW0") AM_LATCH8_WRITE("latch3")
@@ -846,8 +855,7 @@ static ADDRESS_MAP_START( s2650_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x1585, 0x1585) AM_DEVWRITE("dma8257", p8257_drq_w) /* P8257 ==> /DRQ0 /DRQ1 */
AM_RANGE(0x1586, 0x1587) AM_WRITE(dkong_palettebank_w)
AM_RANGE(0x1600, 0x17ff) AM_RAM /* 0x6400 spriteram location */
- AM_RANGE(0x1800, 0x1bff) AM_RAM_WRITE(dkong_videoram_w)
- AM_BASE_MEMBER(dkong_state, video_ram) /* 0x7400 */
+ AM_RANGE(0x1800, 0x1bff) AM_RAM_WRITE(dkong_videoram_w) AM_BASE_MEMBER(dkong_state, video_ram) /* 0x7400 */
AM_RANGE(0x1C00, 0x1f7f) AM_RAM /* 0x6000 */
AM_RANGE(0x1f80, 0x1f8f) AM_DEVREADWRITE("dma8257", i8257_r, i8257_w) /* P8257 control registers */
/* 0x6800 not remapped */
diff --git a/src/mame/drivers/funybubl.c b/src/mame/drivers/funybubl.c
index e44caf2d1d3..9367146e95b 100644
--- a/src/mame/drivers/funybubl.c
+++ b/src/mame/drivers/funybubl.c
@@ -51,37 +51,25 @@ Note: SW2, SW3 & SW4 not populated
#include "driver.h"
#include "cpu/z80/z80.h"
#include "sound/okim6295.h"
-
-/* video/funybubl.c */
-extern UINT8* funybubl_banked_videoram;
-extern UINT8 *funybubl_paletteram;
-WRITE8_HANDLER ( funybubl_paldatawrite );
-VIDEO_START(funybubl);
-VIDEO_UPDATE(funybubl);
-
+#include "funybubl.h"
static WRITE8_HANDLER ( funybubl_vidram_bank_w )
{
- if ((data & 1) == 0)
- memory_set_bankptr(space->machine, 1, &funybubl_banked_videoram[0x000000]);
- else
- memory_set_bankptr(space->machine, 1 ,&funybubl_banked_videoram[0x001000]);
+ memory_set_bank(space->machine, 1, data & 1);
}
static WRITE8_HANDLER ( funybubl_cpurombank_w )
{
- UINT8 *rom = memory_region(space->machine, "maincpu");
-
- memory_set_bankptr(space->machine, 2, &rom[0x10000 + 0x4000 * (data & 0x3f)]);
+ memory_set_bank(space->machine, 2, data & 0x3f); // should we add a check that (data&0x3f) < #banks?
}
-
static WRITE8_HANDLER( funybubl_soundcommand_w )
{
+ funybubl_state *state = (funybubl_state *)space->machine->driver_data;
soundlatch_w(space, 0, data);
- cputag_set_input_line(space->machine, "audiocpu", 0, HOLD_LINE);
+ cpu_set_input_line(state->audiocpu, 0, HOLD_LINE);
}
static WRITE8_DEVICE_HANDLER( funybubl_oki_bank_sw )
@@ -93,7 +81,7 @@ static WRITE8_DEVICE_HANDLER( funybubl_oki_bank_sw )
static ADDRESS_MAP_START( funybubl_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x7fff) AM_ROM
AM_RANGE(0x8000, 0xbfff) AM_ROMBANK(2) // banked port 1?
- AM_RANGE(0xc400, 0xcfff) AM_RAM_WRITE(funybubl_paldatawrite) AM_BASE(&funybubl_paletteram) // palette
+ AM_RANGE(0xc400, 0xcfff) AM_RAM_WRITE(funybubl_paldatawrite) AM_BASE_MEMBER(funybubl_state, paletteram) // palette
AM_RANGE(0xd000, 0xdfff) AM_RAMBANK(1) // banked port 0?
AM_RANGE(0xe000, 0xffff) AM_RAM
ADDRESS_MAP_END
@@ -122,7 +110,7 @@ ADDRESS_MAP_END
static INPUT_PORTS_START( funybubl )
- PORT_START("SYSTEM") /* System inputs */
+ PORT_START("SYSTEM")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START1 )
@@ -132,7 +120,7 @@ static INPUT_PORTS_START( funybubl )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* Maybe unused */
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* Maybe unused */
- PORT_START("P1") /* Player 1 controls */
+ PORT_START("P1")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1)
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(1)
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(1)
@@ -142,7 +130,7 @@ static INPUT_PORTS_START( funybubl )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* Maybe unused */
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* Maybe unused */
- PORT_START("P2") /* Player 2 controls */
+ PORT_START("P2")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2)
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2)
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2)
@@ -152,7 +140,7 @@ static INPUT_PORTS_START( funybubl )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* Maybe unused */
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) /* Maybe unused */
- PORT_START("DSW") /* DSW 1 */
+ PORT_START("DSW")
PORT_DIPNAME( 0x07, 0x07, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW1:1,2,3")
PORT_DIPSETTING( 0x01, DEF_STR( 3C_1C ) )
PORT_DIPSETTING( 0x02, DEF_STR( 2C_1C ) )
@@ -211,16 +199,28 @@ GFXDECODE_END
-static DRIVER_INIT( funybubl )
+static MACHINE_START( funybubl )
{
- funybubl_banked_videoram = auto_alloc_array(machine, UINT8, 0x2000);
+ funybubl_state *state = (funybubl_state *)machine->driver_data;
+ UINT8 *ROM = memory_region(machine, "maincpu");
- memory_set_bankptr(machine, 1,&funybubl_banked_videoram[0x000000]);
-}
+ state->audiocpu = devtag_get_device(machine, "audiocpu");
+
+ state->banked_vram = auto_alloc_array(machine, UINT8, 0x2000);
+ state_save_register_global_pointer(machine, state->banked_vram, 0x2000);
+ memory_configure_bank(machine, 1, 0, 2, &state->banked_vram[0x0000], 0x1000);
+ memory_configure_bank(machine, 2, 0, 0x10, &ROM[0x10000], 0x4000);
+
+ memory_set_bank(machine, 1, 0);
+}
static MACHINE_DRIVER_START( funybubl )
+
+ /* driver data */
+ MDRV_DRIVER_DATA(funybubl_state)
+
/* basic machine hardware */
MDRV_CPU_ADD("maincpu", Z80,12000000/2) /* 6 MHz?? */
MDRV_CPU_PROGRAM_MAP(funybubl_map)
@@ -230,6 +230,8 @@ static MACHINE_DRIVER_START( funybubl )
MDRV_CPU_ADD("audiocpu", Z80,8000000/2) /* 4 MHz?? */
MDRV_CPU_PROGRAM_MAP(sound_map)
+ MDRV_MACHINE_START(funybubl)
+
/* video hardware */
MDRV_SCREEN_ADD("screen", RASTER)
MDRV_SCREEN_REFRESH_RATE(60)
@@ -318,6 +320,5 @@ ROM_START( funybublc )
ROM_END
-GAME( 1999, funybubl, 0, funybubl, funybubl, funybubl, ROT0, "In Chang Electronic Co", "Funny Bubble", 0 )
-GAME( 1999, funybublc,funybubl, funybubl, funybubl, funybubl, ROT0, "Comad Industry Co Ltd", "Funny Bubble (Comad version)", 0 )
-
+GAME( 1999, funybubl, 0, funybubl, funybubl, 0, ROT0, "In Chang Electronic Co", "Funny Bubble", GAME_SUPPORTS_SAVE )
+GAME( 1999, funybublc,funybubl, funybubl, funybubl, 0, ROT0, "Comad Industry Co Ltd", "Funny Bubble (Comad version)", GAME_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/fuukifg2.c b/src/mame/drivers/fuukifg2.c
index c486a1863e8..721fb2cea4a 100644
--- a/src/mame/drivers/fuukifg2.c
+++ b/src/mame/drivers/fuukifg2.c
@@ -40,24 +40,8 @@ To Do:
#include "sound/2203intf.h"
#include "sound/3812intf.h"
#include "sound/okim6295.h"
+#include "fuukifg2.h"
-static emu_timer *raster_interrupt_timer;
-
-/* Variables defined in video: */
-
-extern UINT16 *fuuki16_vram_0, *fuuki16_vram_1;
-extern UINT16 *fuuki16_vram_2, *fuuki16_vram_3;
-extern UINT16 *fuuki16_vregs, *fuuki16_priority, *fuuki16_unknown;
-
-/* Functions defined in video: */
-
-WRITE16_HANDLER( fuuki16_vram_0_w );
-WRITE16_HANDLER( fuuki16_vram_1_w );
-WRITE16_HANDLER( fuuki16_vram_2_w );
-WRITE16_HANDLER( fuuki16_vram_3_w );
-
-VIDEO_START( fuuki16 );
-VIDEO_UPDATE( fuuki16 );
/***************************************************************************
@@ -69,22 +53,24 @@ VIDEO_UPDATE( fuuki16 );
static WRITE16_HANDLER( fuuki16_vregs_w )
{
- UINT16 old_data = fuuki16_vregs[offset];
- UINT16 new_data = COMBINE_DATA(&fuuki16_vregs[offset]);
+ fuuki16_state *state = (fuuki16_state *)space->machine->driver_data;
+ UINT16 old_data = state->vregs[offset];
+ UINT16 new_data = COMBINE_DATA(&state->vregs[offset]);
if ((offset == 0x1c/2) && old_data != new_data)
{
const rectangle *visarea = video_screen_get_visible_area(space->machine->primary_screen);
attotime period = video_screen_get_frame_period(space->machine->primary_screen);
- timer_adjust_periodic(raster_interrupt_timer, video_screen_get_time_until_pos(space->machine->primary_screen, new_data, visarea->max_x + 1), 0, period);
+ timer_adjust_periodic(state->raster_interrupt_timer, video_screen_get_time_until_pos(space->machine->primary_screen, new_data, visarea->max_x + 1), 0, period);
}
}
static WRITE16_HANDLER( fuuki16_sound_command_w )
{
+ fuuki16_state *state = (fuuki16_state *)space->machine->driver_data;
if (ACCESSING_BITS_0_7)
{
soundlatch_w(space,0,data & 0xff);
- cputag_set_input_line(space->machine, "audiocpu", INPUT_LINE_NMI, PULSE_LINE);
+ cpu_set_input_line(state->audiocpu, INPUT_LINE_NMI, PULSE_LINE);
// cpu_spinuntil_time(space->cpu, ATTOTIME_IN_USEC(50)); // Allow the other CPU to reply
cpuexec_boost_interleave(space->machine, attotime_zero, ATTOTIME_IN_USEC(50)); // Fixes glitching in rasters
}
@@ -93,19 +79,19 @@ static WRITE16_HANDLER( fuuki16_sound_command_w )
static ADDRESS_MAP_START( fuuki16_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x0fffff) AM_ROM // ROM
AM_RANGE(0x400000, 0x40ffff) AM_RAM // RAM
- AM_RANGE(0x500000, 0x501fff) AM_RAM_WRITE(fuuki16_vram_0_w) AM_BASE(&fuuki16_vram_0) // Layers
- AM_RANGE(0x502000, 0x503fff) AM_RAM_WRITE(fuuki16_vram_1_w) AM_BASE(&fuuki16_vram_1) //
- AM_RANGE(0x504000, 0x505fff) AM_RAM_WRITE(fuuki16_vram_2_w) AM_BASE(&fuuki16_vram_2) //
- AM_RANGE(0x506000, 0x507fff) AM_RAM_WRITE(fuuki16_vram_3_w) AM_BASE(&fuuki16_vram_3) //
- AM_RANGE(0x600000, 0x601fff) AM_MIRROR(0x008000) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) // Sprites, mirrored?
+ AM_RANGE(0x500000, 0x501fff) AM_RAM_WRITE(fuuki16_vram_0_w) AM_BASE_MEMBER(fuuki16_state, vram_0) // Layers
+ AM_RANGE(0x502000, 0x503fff) AM_RAM_WRITE(fuuki16_vram_1_w) AM_BASE_MEMBER(fuuki16_state, vram_1) //
+ AM_RANGE(0x504000, 0x505fff) AM_RAM_WRITE(fuuki16_vram_2_w) AM_BASE_MEMBER(fuuki16_state, vram_2) //
+ AM_RANGE(0x506000, 0x507fff) AM_RAM_WRITE(fuuki16_vram_3_w) AM_BASE_MEMBER(fuuki16_state, vram_3) //
+ AM_RANGE(0x600000, 0x601fff) AM_MIRROR(0x008000) AM_RAM AM_BASE_SIZE_MEMBER(fuuki16_state, spriteram, spriteram_size) // Sprites, mirrored?
AM_RANGE(0x700000, 0x703fff) AM_RAM_WRITE(paletteram16_xRRRRRGGGGGBBBBB_word_w) AM_BASE_GENERIC(paletteram) // Palette
AM_RANGE(0x800000, 0x800001) AM_READ_PORT("SYSTEM")
AM_RANGE(0x810000, 0x810001) AM_READ_PORT("P1_P2")
AM_RANGE(0x880000, 0x880001) AM_READ_PORT("DSW")
AM_RANGE(0x8a0000, 0x8a0001) AM_WRITE(fuuki16_sound_command_w) // To Sound CPU
- AM_RANGE(0x8c0000, 0x8c001f) AM_RAM_WRITE(fuuki16_vregs_w) AM_BASE(&fuuki16_vregs ) // Video Registers
-/**/AM_RANGE(0x8d0000, 0x8d0003) AM_RAM AM_BASE(&fuuki16_unknown) //
-/**/AM_RANGE(0x8e0000, 0x8e0001) AM_RAM AM_BASE(&fuuki16_priority) //
+ AM_RANGE(0x8c0000, 0x8c001f) AM_RAM_WRITE(fuuki16_vregs_w) AM_BASE_MEMBER(fuuki16_state, vregs ) // Video Registers
+ AM_RANGE(0x8d0000, 0x8d0003) AM_RAM AM_BASE_MEMBER(fuuki16_state, unknown) //
+ AM_RANGE(0x8e0000, 0x8e0001) AM_RAM AM_BASE_MEMBER(fuuki16_state, priority) //
ADDRESS_MAP_END
@@ -120,9 +106,9 @@ ADDRESS_MAP_END
static WRITE8_HANDLER( fuuki16_sound_rombank_w )
{
if (data <= 2)
- memory_set_bankptr(space->machine, 1, memory_region(space->machine, "audiocpu") + 0x8000 * data + 0x10000);
+ memory_set_bank(space->machine, 1, data);
else
- logerror("CPU #1 - PC %04X: unknown bank bits: %02X\n",cpu_get_pc(space->cpu),data);
+ logerror("CPU #1 - PC %04X: unknown bank bits: %02X\n", cpu_get_pc(space->cpu), data);
}
static WRITE8_DEVICE_HANDLER( fuuki16_oki_banking_w )
@@ -143,12 +129,12 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( fuuki16_sound_io_map, ADDRESS_SPACE_IO, 8 )
ADDRESS_MAP_GLOBAL_MASK(0xff)
- AM_RANGE(0x00, 0x00) AM_WRITE(fuuki16_sound_rombank_w ) // ROM Bank
- AM_RANGE(0x11, 0x11) AM_READWRITE(soundlatch_r, SMH_NOP ) // From Main CPU / ? To Main CPU ?
- AM_RANGE(0x20, 0x20) AM_DEVWRITE("oki", fuuki16_oki_banking_w ) // Oki Banking
- AM_RANGE(0x30, 0x30) AM_WRITE(SMH_NOP ) // ? In the NMI routine
- AM_RANGE(0x40, 0x41) AM_DEVWRITE("ym1", ym2203_w )
- AM_RANGE(0x50, 0x51) AM_DEVREADWRITE("ym2", ym3812_r, ym3812_w )
+ AM_RANGE(0x00, 0x00) AM_WRITE(fuuki16_sound_rombank_w) // ROM Bank
+ AM_RANGE(0x11, 0x11) AM_READWRITE(soundlatch_r, SMH_NOP) // From Main CPU / ? To Main CPU ?
+ AM_RANGE(0x20, 0x20) AM_DEVWRITE("oki", fuuki16_oki_banking_w) // Oki Banking
+ AM_RANGE(0x30, 0x30) AM_WRITE(SMH_NOP) // ? In the NMI routine
+ AM_RANGE(0x40, 0x41) AM_DEVWRITE("ym1", ym2203_w)
+ AM_RANGE(0x50, 0x51) AM_DEVREADWRITE("ym2", ym3812_r, ym3812_w)
AM_RANGE(0x60, 0x60) AM_DEVREAD("oki", okim6295_r) // M6295
AM_RANGE(0x61, 0x61) AM_DEVWRITE("oki", okim6295_w) // M6295
ADDRESS_MAP_END
@@ -387,9 +373,10 @@ GFXDECODE_END
***************************************************************************/
-static void soundirq(const device_config *device, int state)
+static void soundirq( const device_config *device, int state )
{
- cputag_set_input_line(device->machine, "audiocpu", 0, state);
+ fuuki16_state *fuuki16 = (fuuki16_state *)device->machine->driver_data;
+ cpu_set_input_line(fuuki16->audiocpu, 0, state);
}
static const ym3812_interface fuuki16_ym3812_intf =
@@ -411,44 +398,59 @@ static const ym3812_interface fuuki16_ym3812_intf =
static TIMER_CALLBACK( level_1_interrupt_callback )
{
- cputag_set_input_line(machine, "maincpu", 1, HOLD_LINE);
+ fuuki16_state *state = (fuuki16_state *)machine->driver_data;
+ cpu_set_input_line(state->maincpu, 1, HOLD_LINE);
timer_set(machine, video_screen_get_time_until_pos(machine->primary_screen, 248, 0), NULL, 0, level_1_interrupt_callback);
}
static TIMER_CALLBACK( vblank_interrupt_callback )
{
- cputag_set_input_line(machine, "maincpu", 3, HOLD_LINE); // VBlank IRQ
+ fuuki16_state *state = (fuuki16_state *)machine->driver_data;
+ cpu_set_input_line(state->maincpu, 3, HOLD_LINE); // VBlank IRQ
timer_set(machine, video_screen_get_time_until_vblank_start(machine->primary_screen), NULL, 0, vblank_interrupt_callback);
}
static TIMER_CALLBACK( raster_interrupt_callback )
{
- cputag_set_input_line(machine, "maincpu", 5, HOLD_LINE); // Raster Line IRQ
+ fuuki16_state *state = (fuuki16_state *)machine->driver_data;
+ cpu_set_input_line(state->maincpu, 5, HOLD_LINE); // Raster Line IRQ
video_screen_update_partial(machine->primary_screen, video_screen_get_vpos(machine->primary_screen));
- timer_adjust_oneshot(raster_interrupt_timer, video_screen_get_frame_period(machine->primary_screen), 0);
+ timer_adjust_oneshot(state->raster_interrupt_timer, video_screen_get_frame_period(machine->primary_screen), 0);
}
static MACHINE_START( fuuki16 )
{
- raster_interrupt_timer = timer_alloc(machine, raster_interrupt_callback, NULL);
+ fuuki16_state *state = (fuuki16_state *)machine->driver_data;
+ UINT8 *ROM = memory_region(machine, "audiocpu");
+
+ memory_configure_bank(machine, 1, 0, 3, &ROM[0x10000], 0x8000);
+
+ state->maincpu = devtag_get_device(machine, "maincpu");
+ state->audiocpu = devtag_get_device(machine, "audiocpu");
+
+ state->raster_interrupt_timer = timer_alloc(machine, raster_interrupt_callback, NULL);
}
static MACHINE_RESET( fuuki16 )
{
+ fuuki16_state *state = (fuuki16_state *)machine->driver_data;
const rectangle *visarea = video_screen_get_visible_area(machine->primary_screen);
timer_set(machine, video_screen_get_time_until_pos(machine->primary_screen, 248, 0), NULL, 0, level_1_interrupt_callback);
timer_set(machine, video_screen_get_time_until_vblank_start(machine->primary_screen), NULL, 0, vblank_interrupt_callback);
- timer_adjust_oneshot(raster_interrupt_timer, video_screen_get_time_until_pos(machine->primary_screen, 0, visarea->max_x + 1), 0);
+ timer_adjust_oneshot(state->raster_interrupt_timer, video_screen_get_time_until_pos(machine->primary_screen, 0, visarea->max_x + 1), 0);
}
static MACHINE_DRIVER_START( fuuki16 )
+ /* driver data */
+ MDRV_DRIVER_DATA(fuuki16_state)
+
/* basic machine hardware */
MDRV_CPU_ADD("maincpu", M68000, 16000000)
MDRV_CPU_PROGRAM_MAP(fuuki16_map)
@@ -668,4 +670,3 @@ ROM_END
GAME( 1995, gogomile, 0, fuuki16, gogomile, 0, ROT0, "Fuuki", "Go Go! Mile Smile", GAME_IMPERFECT_SOUND )
GAME( 1995, gogomilej,gogomile, fuuki16, gogomilj, 0, ROT0, "Fuuki", "Susume! Mile Smile (Japan)", GAME_IMPERFECT_SOUND )
GAME( 1996, pbancho, 0, fuuki16, pbancho, 0, ROT0, "Fuuki", "Gyakuten!! Puzzle Bancho (Japan)", 0)
-
diff --git a/src/mame/drivers/fuukifg3.c b/src/mame/drivers/fuukifg3.c
index 54524e971eb..82709c0f195 100644
--- a/src/mame/drivers/fuukifg3.c
+++ b/src/mame/drivers/fuukifg3.c
@@ -148,66 +148,38 @@ FG-3J ROM-J 507KA0301P04 Rev:1.3
***************************************************************************/
-/* Define clocks based on actual OSC on the PCB */
-
-#define CPU_CLOCK (XTAL_40MHz / 2) /* clock for 68020 */
-#define SOUND_CPU_CLOCK (XTAL_12MHz / 2) /* clock for Z80 sound CPU */
-#define FM_SOUND_CLOCK (XTAL_33_8688MHz / 2) /* FM clock */
-
-/* NOTE: YMF278B_STD_CLOCK is defined in /src/emu/sound/ymf278b.h */
-
-
#include "driver.h"
#include "cpu/z80/z80.h"
#include "cpu/m68000/m68000.h"
#include "sound/ymf278b.h"
-
-static emu_timer *raster_interrupt_timer;
-static UINT8 fuuki32_shared_ram[16];
-
-// Described in src/video/fuuki32.c
-extern UINT32 *fuuki32_vram_0, *fuuki32_vram_1;
-extern UINT32 *fuuki32_vram_2, *fuuki32_vram_3;
-extern UINT32 *fuuki32_vregs, *fuuki32_priority, *fuuki32_tilebank;
+#include "fuukifg3.h"
-/* Functions defined in video: */
-
-WRITE32_HANDLER( fuuki32_vram_0_w );
-WRITE32_HANDLER( fuuki32_vram_1_w );
-WRITE32_HANDLER( fuuki32_vram_2_w );
-WRITE32_HANDLER( fuuki32_vram_3_w );
-
-VIDEO_START( fuuki32 );
-VIDEO_UPDATE( fuuki32 );
-VIDEO_EOF( fuuki32 );
-
-//UINT32 *fuuki32_shared_ram;
-
static WRITE32_HANDLER( paletteram32_xRRRRRGGGGGBBBBB_dword_w )
{
+ fuuki32_state *state = (fuuki32_state *)space->machine->driver_data;
if(ACCESSING_BITS_16_31)
{
int r,g,b;
- COMBINE_DATA(&space->machine->generic.paletteram.u32[offset]);
+ COMBINE_DATA(&state->paletteram[offset]);
- r = (space->machine->generic.paletteram.u32[offset] & 0x7c000000) >> (10+16);
- g = (space->machine->generic.paletteram.u32[offset] & 0x03e00000) >> (5+16);
- b = (space->machine->generic.paletteram.u32[offset] & 0x001f0000) >> (0+16);
+ r = (state->paletteram[offset] & 0x7c000000) >> (10 + 16);
+ g = (state->paletteram[offset] & 0x03e00000) >> (5 + 16);
+ b = (state->paletteram[offset] & 0x001f0000) >> (0 + 16);
- palette_set_color_rgb(space->machine,offset*2,pal5bit(r),pal5bit(g),pal5bit(b));
+ palette_set_color_rgb(space->machine, offset * 2, pal5bit(r), pal5bit(g), pal5bit(b));
}
if(ACCESSING_BITS_0_15)
{
int r,g,b;
- COMBINE_DATA(&space->machine->generic.paletteram.u32[offset]);
+ COMBINE_DATA(&state->paletteram[offset]);
- r = (space->machine->generic.paletteram.u32[offset] & 0x00007c00) >> (10);
- g = (space->machine->generic.paletteram.u32[offset] & 0x000003e0) >> (5);
- b = (space->machine->generic.paletteram.u32[offset] & 0x0000001f) >> (0);
+ r = (state->paletteram[offset] & 0x00007c00) >> (10);
+ g = (state->paletteram[offset] & 0x000003e0) >> (5);
+ b = (state->paletteram[offset] & 0x0000001f) >> (0);
- palette_set_color_rgb(space->machine,offset*2+1,pal5bit(r),pal5bit(g),pal5bit(b));
+ palette_set_color_rgb(space->machine, offset * 2 + 1, pal5bit(r), pal5bit(g), pal5bit(b));
}
}
@@ -222,33 +194,34 @@ static WRITE32_HANDLER( paletteram32_xRRRRRGGGGGBBBBB_dword_w )
/* Sound comms */
static READ32_HANDLER( snd_020_r )
{
- UINT32 retdata = fuuki32_shared_ram[offset*2]<<16 | fuuki32_shared_ram[(offset*2)+1];
+ fuuki32_state *state = (fuuki32_state *)space->machine->driver_data;
+ UINT32 retdata = state->shared_ram[offset * 2] << 16 | state->shared_ram[(offset * 2) + 1];
return retdata;
}
static WRITE32_HANDLER( snd_020_w )
{
+ fuuki32_state *state = (fuuki32_state *)space->machine->driver_data;
+
if (ACCESSING_BITS_16_23)
- {
- fuuki32_shared_ram[offset*2] = data>>16;
- }
+ state->shared_ram[offset * 2] = data >> 16;
if (ACCESSING_BITS_0_7)
- {
- fuuki32_shared_ram[(offset*2)+1] = data & 0xff;
- }
+ state->shared_ram[(offset * 2) + 1] = data & 0xff;
}
static WRITE32_HANDLER( fuuki32_vregs_w )
{
- if (fuuki32_vregs[offset] != data)
+ fuuki32_state *state = (fuuki32_state *)space->machine->driver_data;
+
+ if (state->vregs[offset] != data)
{
- COMBINE_DATA(&fuuki32_vregs[offset]);
- if (offset == 0x1c/4)
+ COMBINE_DATA(&state->vregs[offset]);
+ if (offset == 0x1c / 4)
{
const rectangle *visarea = video_screen_get_visible_area(space->machine->primary_screen);
attotime period = video_screen_get_frame_period(space->machine->primary_screen);
- timer_adjust_periodic(raster_interrupt_timer, video_screen_get_time_until_pos(space->machine->primary_screen, fuuki32_vregs[0x1c/4]>>16, visarea->max_x + 1), 0, period);
+ timer_adjust_periodic(state->raster_interrupt_timer, video_screen_get_time_until_pos(space->machine->primary_screen, state->vregs[0x1c / 4] >> 16, visarea->max_x + 1), 0, period);
}
}
}
@@ -256,35 +229,35 @@ static WRITE32_HANDLER( fuuki32_vregs_w )
// Lines with empty comment are for debug only
static ADDRESS_MAP_START( fuuki32_map, ADDRESS_SPACE_PROGRAM, 32 )
- AM_RANGE(0x000000, 0x1fffff) AM_ROM // ROM
+ AM_RANGE(0x000000, 0x1fffff) AM_ROM // ROM
- AM_RANGE(0x400000, 0x40ffff) AM_RAM // Work RAM
- AM_RANGE(0x410000, 0x41ffff) AM_RAM // Work RAM (used by asurabus)
+ AM_RANGE(0x400000, 0x40ffff) AM_RAM // Work RAM
+ AM_RANGE(0x410000, 0x41ffff) AM_RAM // Work RAM (used by asurabus)
- AM_RANGE(0x500000, 0x501fff) AM_RAM_WRITE(fuuki32_vram_0_w) AM_BASE(&fuuki32_vram_0) // Tilemap 1
- AM_RANGE(0x502000, 0x503fff) AM_RAM_WRITE(fuuki32_vram_1_w) AM_BASE(&fuuki32_vram_1) // Tilemap 2
- AM_RANGE(0x504000, 0x505fff) AM_RAM_WRITE(fuuki32_vram_2_w) AM_BASE(&fuuki32_vram_2) // Tilemap bg
- AM_RANGE(0x506000, 0x507fff) AM_RAM_WRITE(fuuki32_vram_3_w) AM_BASE(&fuuki32_vram_3) // Tilemap bg2
- AM_RANGE(0x508000, 0x517fff) AM_RAM // More tilemap, or linescroll? Seems to be empty all of the time
+ AM_RANGE(0x500000, 0x501fff) AM_RAM_WRITE(fuuki32_vram_0_w) AM_BASE_MEMBER(fuuki32_state, vram_0) // Tilemap 1
+ AM_RANGE(0x502000, 0x503fff) AM_RAM_WRITE(fuuki32_vram_1_w) AM_BASE_MEMBER(fuuki32_state, vram_1) // Tilemap 2
+ AM_RANGE(0x504000, 0x505fff) AM_RAM_WRITE(fuuki32_vram_2_w) AM_BASE_MEMBER(fuuki32_state, vram_2) // Tilemap bg
+ AM_RANGE(0x506000, 0x507fff) AM_RAM_WRITE(fuuki32_vram_3_w) AM_BASE_MEMBER(fuuki32_state, vram_3) // Tilemap bg2
+ AM_RANGE(0x508000, 0x517fff) AM_RAM // More tilemap, or linescroll? Seems to be empty all of the time
- AM_RANGE(0x600000, 0x601fff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) // Sprites
- AM_RANGE(0x700000, 0x703fff) AM_RAM_WRITE(paletteram32_xRRRRRGGGGGBBBBB_dword_w) AM_BASE_GENERIC(paletteram) // Palette
+ AM_RANGE(0x600000, 0x601fff) AM_RAM AM_BASE_SIZE_MEMBER(fuuki32_state, spriteram, spriteram_size) // Sprites
+ AM_RANGE(0x700000, 0x703fff) AM_RAM_WRITE(paletteram32_xRRRRRGGGGGBBBBB_dword_w) AM_BASE_MEMBER(fuuki32_state, paletteram) // Palette
AM_RANGE(0x800000, 0x800003) AM_READ_PORT("800000") AM_WRITENOP // Coin
AM_RANGE(0x810000, 0x810003) AM_READ_PORT("810000") AM_WRITENOP // Player Inputs
- AM_RANGE(0x880000, 0x880003) AM_READ_PORT("880000") // Service + DIPS
- AM_RANGE(0x890000, 0x890003) AM_READ_PORT("890000") // More DIPS
+ AM_RANGE(0x880000, 0x880003) AM_READ_PORT("880000") // Service + DIPS
+ AM_RANGE(0x890000, 0x890003) AM_READ_PORT("890000") // More DIPS
- AM_RANGE(0x8c0000, 0x8c001f) AM_RAM_WRITE(fuuki32_vregs_w) AM_BASE(&fuuki32_vregs) // Video Registers
+ AM_RANGE(0x8c0000, 0x8c001f) AM_RAM_WRITE(fuuki32_vregs_w) AM_BASE_MEMBER(fuuki32_state, vregs) // Video Registers
- AM_RANGE(0x8d0000, 0x8d0003) AM_RAM // Flipscreen Related
-/**/AM_RANGE(0x8e0000, 0x8e0003) AM_RAM AM_BASE(&fuuki32_priority) // Controls layer order
+ AM_RANGE(0x8d0000, 0x8d0003) AM_RAM // Flipscreen Related
+ AM_RANGE(0x8e0000, 0x8e0003) AM_RAM AM_BASE_MEMBER(fuuki32_state, priority) // Controls layer order
- AM_RANGE(0x903fe0, 0x903fff) AM_READWRITE(snd_020_r, snd_020_w) // Shared with Z80
+ AM_RANGE(0x903fe0, 0x903fff) AM_READWRITE(snd_020_r, snd_020_w) // Shared with Z80
// AM_RANGE(0x903fe0, 0x903fe3) AM_READ(fuuki32_sound_command_r) // Shared with Z80
// AM_RANGE(0x903fe4, 0x903fff) AM_READ(SMH_RAM) // ??
- AM_RANGE(0xa00000, 0xa00003) AM_WRITE(SMH_RAM) AM_BASE(&fuuki32_tilebank)
+ AM_RANGE(0xa00000, 0xa00003) AM_WRITE(SMH_RAM) AM_BASE_MEMBER(fuuki32_state, tilebank)
ADDRESS_MAP_END
@@ -296,20 +269,20 @@ ADDRESS_MAP_END
static WRITE8_HANDLER ( fuuki32_sound_bw_w )
{
- UINT8 *rom = memory_region(space->machine, "soundcpu");
-
- memory_set_bankptr(space->machine, 1, rom + 0x10000 + (data * 0x8000));
+ memory_set_bank(space->machine, 1, data);
}
static READ8_HANDLER( snd_z80_r )
{
- UINT8 retdata = fuuki32_shared_ram[offset];
+ fuuki32_state *state = (fuuki32_state *)space->machine->driver_data;
+ UINT8 retdata = state->shared_ram[offset];
return retdata;
}
static WRITE8_HANDLER( snd_z80_w )
{
- fuuki32_shared_ram[offset] = data;
+ fuuki32_state *state = (fuuki32_state *)space->machine->driver_data;
+ state->shared_ram[offset] = data;
}
static ADDRESS_MAP_START( fuuki32_sound_map, ADDRESS_SPACE_PROGRAM, 8 )
@@ -512,45 +485,61 @@ GFXDECODE_END
static TIMER_CALLBACK( level_1_interrupt_callback )
{
- cputag_set_input_line(machine, "maincpu", 1, HOLD_LINE);
+ fuuki32_state *state = (fuuki32_state *)machine->driver_data;
+ cpu_set_input_line(state->maincpu, 1, HOLD_LINE);
timer_set(machine, video_screen_get_time_until_pos(machine->primary_screen, 248, 0), NULL, 0, level_1_interrupt_callback);
}
static TIMER_CALLBACK( vblank_interrupt_callback )
{
- cputag_set_input_line(machine, "maincpu", 3, HOLD_LINE); // VBlank IRQ
+ fuuki32_state *state = (fuuki32_state *)machine->driver_data;
+ cpu_set_input_line(state->maincpu, 3, HOLD_LINE); // VBlank IRQ
timer_set(machine, video_screen_get_time_until_vblank_start(machine->primary_screen), NULL, 0, vblank_interrupt_callback);
}
static TIMER_CALLBACK( raster_interrupt_callback )
{
- cputag_set_input_line(machine, "maincpu", 5, HOLD_LINE); // Raster Line IRQ
+ fuuki32_state *state = (fuuki32_state *)machine->driver_data;
+ cpu_set_input_line(state->maincpu, 5, HOLD_LINE); // Raster Line IRQ
video_screen_update_partial(machine->primary_screen, video_screen_get_vpos(machine->primary_screen));
- timer_adjust_oneshot(raster_interrupt_timer, video_screen_get_frame_period(machine->primary_screen), 0);
+ timer_adjust_oneshot(state->raster_interrupt_timer, video_screen_get_frame_period(machine->primary_screen), 0);
}
static MACHINE_START( fuuki32 )
{
- raster_interrupt_timer = timer_alloc(machine, raster_interrupt_callback, NULL);
+ fuuki32_state *state = (fuuki32_state *)machine->driver_data;
+ UINT8 *ROM = memory_region(machine, "soundcpu");
+
+ memory_configure_bank(machine, 1, 0, 0x3e, &ROM[0x10000], 0x8000);
+
+ state->maincpu = devtag_get_device(machine, "maincpu");
+ state->audiocpu = devtag_get_device(machine, "soundcpu");
+
+ state->raster_interrupt_timer = timer_alloc(machine, raster_interrupt_callback, NULL);
+
+ state_save_register_global_array(machine, state->spr_buffered_tilebank);
+ state_save_register_global_array(machine, state->shared_ram);
}
static MACHINE_RESET( fuuki32 )
{
+ fuuki32_state *state = (fuuki32_state *)machine->driver_data;
const rectangle *visarea = video_screen_get_visible_area(machine->primary_screen);
timer_set(machine, video_screen_get_time_until_pos(machine->primary_screen, 248, 0), NULL, 0, level_1_interrupt_callback);
timer_set(machine, video_screen_get_time_until_vblank_start(machine->primary_screen), NULL, 0, vblank_interrupt_callback);
- timer_adjust_oneshot(raster_interrupt_timer, video_screen_get_time_until_pos(machine->primary_screen, 0, visarea->max_x + 1), 0);
+ timer_adjust_oneshot(state->raster_interrupt_timer, video_screen_get_time_until_pos(machine->primary_screen, 0, visarea->max_x + 1), 0);
}
-static void irqhandler(const device_config *device, int irq)
+static void irqhandler( const device_config *device, int irq )
{
- cputag_set_input_line(device->machine, "soundcpu", 0, irq ? ASSERT_LINE : CLEAR_LINE);
+ fuuki32_state *state = (fuuki32_state *)device->machine->driver_data;
+ cpu_set_input_line(state->audiocpu, 0, irq ? ASSERT_LINE : CLEAR_LINE);
}
static const ymf278b_interface fuuki32_ymf278b_interface =
@@ -560,6 +549,9 @@ static const ymf278b_interface fuuki32_ymf278b_interface =
static MACHINE_DRIVER_START( fuuki32 )
+ /* driver data */
+ MDRV_DRIVER_DATA(fuuki32_state)
+
/* basic machine hardware */
MDRV_CPU_ADD("maincpu", M68EC020, CPU_CLOCK) /* 20MHz verified */
MDRV_CPU_PROGRAM_MAP(fuuki32_map)
diff --git a/src/mame/drivers/gaiden.c b/src/mame/drivers/gaiden.c
index f95edcdc320..ca38b5f939c 100644
--- a/src/mame/drivers/gaiden.c
+++ b/src/mame/drivers/gaiden.c
@@ -123,55 +123,33 @@ Notes:
***************************************************************************/
-
#include "driver.h"
#include "cpu/m68000/m68000.h"
#include "cpu/z80/z80.h"
#include "sound/2203intf.h"
#include "sound/2151intf.h"
#include "sound/okim6295.h"
-
-extern UINT16 *gaiden_videoram,*gaiden_videoram2,*gaiden_videoram3;
-extern int gaiden_sprite_sizey;
-
-VIDEO_START( gaiden );
-VIDEO_START( raiga );
-VIDEO_START( drgnbowl );
-VIDEO_START( mastninj );
-
-VIDEO_UPDATE( gaiden );
-VIDEO_UPDATE( raiga );
-VIDEO_UPDATE( drgnbowl );
-
-WRITE16_HANDLER( gaiden_videoram_w );
-WRITE16_HANDLER( gaiden_videoram2_w );
-READ16_HANDLER( gaiden_videoram2_r );
-WRITE16_HANDLER( gaiden_videoram3_w );
-READ16_HANDLER( gaiden_videoram3_r );
-
-WRITE16_HANDLER( gaiden_txscrollx_w );
-WRITE16_HANDLER( gaiden_txscrolly_w );
-WRITE16_HANDLER( gaiden_fgscrollx_w );
-WRITE16_HANDLER( gaiden_fgscrolly_w );
-WRITE16_HANDLER( gaiden_bgscrollx_w );
-WRITE16_HANDLER( gaiden_bgscrolly_w );
-WRITE16_HANDLER( gaiden_flip_w );
-
-
+#include "gaiden.h"
static WRITE16_HANDLER( gaiden_sound_command_w )
{
- if (ACCESSING_BITS_0_7) soundlatch_w(space, 0, data & 0xff); /* Ninja Gaiden */
- if (ACCESSING_BITS_8_15) soundlatch_w(space, 0, data >> 8); /* Tecmo Knight */
- cputag_set_input_line(space->machine, "audiocpu", INPUT_LINE_NMI, PULSE_LINE);
+ gaiden_state *state = (gaiden_state *)space->machine->driver_data;
+
+ if (ACCESSING_BITS_0_7)
+ soundlatch_w(space, 0, data & 0xff); /* Ninja Gaiden */
+ if (ACCESSING_BITS_8_15)
+ soundlatch_w(space, 0, data >> 8); /* Tecmo Knight */
+ cpu_set_input_line(state->audiocpu, INPUT_LINE_NMI, PULSE_LINE);
}
static WRITE16_HANDLER( drgnbowl_sound_command_w )
{
+ gaiden_state *state = (gaiden_state *)space->machine->driver_data;
+
if (ACCESSING_BITS_8_15)
{
soundlatch_w(space, 0, data >> 8);
- cputag_set_input_line(space->machine, "audiocpu", 0, HOLD_LINE);
+ cpu_set_input_line(state->audiocpu, 0, HOLD_LINE);
}
}
@@ -181,11 +159,10 @@ static WRITE16_HANDLER( drgnbowl_sound_command_w )
/* and reads the answer from 0x07a007. The returned values contain the address of */
/* a function to jump to. */
-static int prot;
-static int jumpcode;
-
static WRITE16_HANDLER( wildfang_protection_w )
{
+ gaiden_state *state = (gaiden_state *)space->machine->driver_data;
+
if (ACCESSING_BITS_8_15)
{
static const int jumppoints[] =
@@ -202,32 +179,32 @@ static WRITE16_HANDLER( wildfang_protection_w )
switch (data & 0xf0)
{
case 0x00: /* init */
- prot = 0x00;
+ state->prot = 0x00;
break;
case 0x10: /* high 4 bits of jump code */
- jumpcode = (data & 0x0f) << 4;
- prot = 0x10;
+ state->jumpcode = (data & 0x0f) << 4;
+ state->prot = 0x10;
break;
case 0x20: /* low 4 bits of jump code */
- jumpcode |= data & 0x0f;
- if (jumpcode >= sizeof(jumppoints)/sizeof(jumppoints[0]))
+ state->jumpcode |= data & 0x0f;
+ if (state->jumpcode >= ARRAY_LENGTH(jumppoints))
{
- logerror("unknown jumpcode %02x\n",jumpcode);
- jumpcode = 0;
+ logerror("unknown jumpcode %02x\n", state->jumpcode);
+ state->jumpcode = 0;
}
- prot = 0x20;
+ state->prot = 0x20;
break;
case 0x30: /* ask for bits 12-15 of function address */
- prot = 0x40 | ((jumppoints[jumpcode] >> 12) & 0x0f);
+ state->prot = 0x40 | ((jumppoints[state->jumpcode] >> 12) & 0x0f);
break;
case 0x40: /* ask for bits 8-11 of function address */
- prot = 0x50 | ((jumppoints[jumpcode] >> 8) & 0x0f);
+ state->prot = 0x50 | ((jumppoints[state->jumpcode] >> 8) & 0x0f);
break;
case 0x50: /* ask for bits 4-7 of function address */
- prot = 0x60 | ((jumppoints[jumpcode] >> 4) & 0x0f);
+ state->prot = 0x60 | ((jumppoints[state->jumpcode] >> 4) & 0x0f);
break;
case 0x60: /* ask for bits 0-3 of function address */
- prot = 0x70 | ((jumppoints[jumpcode] >> 0) & 0x0f);
+ state->prot = 0x70 | ((jumppoints[state->jumpcode] >> 0) & 0x0f);
break;
}
}
@@ -235,8 +212,9 @@ static WRITE16_HANDLER( wildfang_protection_w )
static READ16_HANDLER( wildfang_protection_r )
{
-// logerror("PC %06x: read prot %02x\n",cpu_get_pc(space->cpu),prot);
- return prot;
+ gaiden_state *state = (gaiden_state *)space->machine->driver_data;
+// logerror("PC %06x: read prot %02x\n", cpu_get_pc(space->cpu), state->prot);
+ return state->prot;
}
@@ -310,58 +288,84 @@ static const int jumppoints_other[0x100] =
-1, -1, -1, -1, -1, -1, -1, -1
};
-static const int *raiga_jumppoints;
+static MACHINE_RESET( raiga )
+{
+ gaiden_state *state = (gaiden_state *)machine->driver_data;
-static MACHINE_RESET ( raiga )
+ state->prot = 0;
+ state->jumpcode = 0;
+
+ state->tx_scroll_x = 0;
+ state->tx_scroll_y = 0;
+ state->bg_scroll_x = 0;
+ state->bg_scroll_y = 0;
+ state->fg_scroll_x = 0;
+ state->fg_scroll_y = 0;
+}
+
+static MACHINE_START( raiga )
{
- raiga_jumppoints = jumppoints_00;
+ gaiden_state *state = (gaiden_state *)machine->driver_data;
+ state->audiocpu = devtag_get_device(machine, "audiocpu");
+
+ state_save_register_global(machine, state->prot);
+ state_save_register_global(machine, state->jumpcode);
+
+ state_save_register_global(machine, state->tx_scroll_x);
+ state_save_register_global(machine, state->tx_scroll_y);
+ state_save_register_global(machine, state->bg_scroll_x);
+ state_save_register_global(machine, state->bg_scroll_y);
+ state_save_register_global(machine, state->fg_scroll_x);
+ state_save_register_global(machine, state->fg_scroll_y);
}
static WRITE16_HANDLER( raiga_protection_w )
{
+ gaiden_state *state = (gaiden_state *)space->machine->driver_data;
+
if (ACCESSING_BITS_8_15)
{
data >>= 8;
-// logerror("PC %06x: prot = %02x\n",cpu_get_pc(space->cpu),data);
+// logerror("PC %06x: prot = %02x\n", cpu_get_pc(space->cpu), data);
switch (data & 0xf0)
{
case 0x00: /* init */
- prot = 0x00;
+ state->prot = 0x00;
break;
case 0x10: /* high 4 bits of jump code */
- jumpcode = (data & 0x0f) << 4;
- prot = 0x10;
+ state->jumpcode = (data & 0x0f) << 4;
+ state->prot = 0x10;
break;
case 0x20: /* low 4 bits of jump code */
- jumpcode |= data & 0x0f;
- logerror("requested protection jumpcode %02x\n",jumpcode);
-// jumpcode = 0;
- if (raiga_jumppoints[jumpcode] == -2)
+ state->jumpcode |= data & 0x0f;
+ logerror("requested protection jumpcode %02x\n", state->jumpcode);
+// state->jumpcode = 0;
+ if (state->raiga_jumppoints[state->jumpcode] == -2)
{
- raiga_jumppoints = jumppoints_other;
+ state->raiga_jumppoints = jumppoints_other;
}
- if (raiga_jumppoints[jumpcode] == -1)
+ if (state->raiga_jumppoints[state->jumpcode] == -1)
{
- logerror("unknown jumpcode %02x\n",jumpcode);
- popmessage("unknown jumpcode %02x",jumpcode);
- jumpcode = 0;
+ logerror("unknown jumpcode %02x\n", state->jumpcode);
+ popmessage("unknown jumpcode %02x", state->jumpcode);
+ state->jumpcode = 0;
}
- prot = 0x20;
+ state->prot = 0x20;
break;
case 0x30: /* ask for bits 12-15 of function address */
- prot = 0x40 | ((raiga_jumppoints[jumpcode] >> 12) & 0x0f);
+ state->prot = 0x40 | ((state->raiga_jumppoints[state->jumpcode] >> 12) & 0x0f);
break;
case 0x40: /* ask for bits 8-11 of function address */
- prot = 0x50 | ((raiga_jumppoints[jumpcode] >> 8) & 0x0f);
+ state->prot = 0x50 | ((state->raiga_jumppoints[state->jumpcode] >> 8) & 0x0f);
break;
case 0x50: /* ask for bits 4-7 of function address */
- prot = 0x60 | ((raiga_jumppoints[jumpcode] >> 4) & 0x0f);
+ state->prot = 0x60 | ((state->raiga_jumppoints[state->jumpcode] >> 4) & 0x0f);
break;
case 0x60: /* ask for bits 0-3 of function address */
- prot = 0x70 | ((raiga_jumppoints[jumpcode] >> 0) & 0x0f);
+ state->prot = 0x70 | ((state->raiga_jumppoints[state->jumpcode] >> 0) & 0x0f);
break;
}
}
@@ -369,17 +373,18 @@ static WRITE16_HANDLER( raiga_protection_w )
static READ16_HANDLER( raiga_protection_r )
{
-// logerror("PC %06x: read prot %02x\n",cpu_get_pc(space->cpu),prot);
- return prot;
+ gaiden_state *state = (gaiden_state *)space->machine->driver_data;
+// logerror("PC %06x: read prot %02x\n", cpu_get_pc(space->cpu), state->prot);
+ return state->prot;
}
static ADDRESS_MAP_START( gaiden_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x03ffff) AM_ROM
AM_RANGE(0x060000, 0x063fff) AM_RAM
- AM_RANGE(0x070000, 0x070fff) AM_RAM_WRITE(gaiden_videoram_w) AM_BASE(&gaiden_videoram)
- AM_RANGE(0x072000, 0x073fff) AM_READWRITE(gaiden_videoram2_r, gaiden_videoram2_w) AM_BASE(&gaiden_videoram2)
- AM_RANGE(0x074000, 0x075fff) AM_READWRITE(gaiden_videoram3_r, gaiden_videoram3_w) AM_BASE(&gaiden_videoram3)
- AM_RANGE(0x076000, 0x077fff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram)
+ AM_RANGE(0x070000, 0x070fff) AM_RAM_WRITE(gaiden_videoram_w) AM_BASE_MEMBER(gaiden_state, videoram)
+ AM_RANGE(0x072000, 0x073fff) AM_READWRITE(gaiden_videoram2_r, gaiden_videoram2_w) AM_BASE_MEMBER(gaiden_state, videoram2)
+ AM_RANGE(0x074000, 0x075fff) AM_READWRITE(gaiden_videoram3_r, gaiden_videoram3_w) AM_BASE_MEMBER(gaiden_state, videoram3)
+ AM_RANGE(0x076000, 0x077fff) AM_RAM AM_BASE_SIZE_MEMBER(gaiden_state, spriteram, spriteram_size)
AM_RANGE(0x078000, 0x079fff) AM_RAM_WRITE(paletteram16_xxxxBBBBGGGGRRRR_word_w) AM_BASE_GENERIC(paletteram)
AM_RANGE(0x078800, 0x079fff) AM_READNOP /* extra portion of palette RAM, not really used */
AM_RANGE(0x07a000, 0x07a001) AM_READ_PORT("SYSTEM")
@@ -400,10 +405,10 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( drgnbowl_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x03ffff) AM_ROM
AM_RANGE(0x060000, 0x063fff) AM_RAM
- AM_RANGE(0x070000, 0x070fff) AM_RAM_WRITE(gaiden_videoram_w) AM_BASE(&gaiden_videoram)
- AM_RANGE(0x072000, 0x073fff) AM_RAM_WRITE(gaiden_videoram2_w) AM_BASE(&gaiden_videoram2)
- AM_RANGE(0x074000, 0x075fff) AM_RAM_WRITE(gaiden_videoram3_w) AM_BASE(&gaiden_videoram3)
- AM_RANGE(0x076000, 0x077fff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram)
+ AM_RANGE(0x070000, 0x070fff) AM_RAM_WRITE(gaiden_videoram_w) AM_BASE_MEMBER(gaiden_state, videoram)
+ AM_RANGE(0x072000, 0x073fff) AM_RAM_WRITE(gaiden_videoram2_w) AM_BASE_MEMBER(gaiden_state, videoram2)
+ AM_RANGE(0x074000, 0x075fff) AM_RAM_WRITE(gaiden_videoram3_w) AM_BASE_MEMBER(gaiden_state, videoram3)
+ AM_RANGE(0x076000, 0x077fff) AM_RAM AM_BASE_SIZE_MEMBER(gaiden_state, spriteram, spriteram_size)
AM_RANGE(0x078000, 0x079fff) AM_RAM_WRITE(paletteram16_xxxxBBBBGGGGRRRR_word_w) AM_BASE_GENERIC(paletteram)
AM_RANGE(0x07a000, 0x07a001) AM_READ_PORT("SYSTEM")
AM_RANGE(0x07a002, 0x07a003) AM_READ_PORT("P1_P2")
@@ -830,9 +835,10 @@ static GFXDECODE_START( drgnbowl )
GFXDECODE_END
/* handler called by the 2203 emulator when the internal timers cause an IRQ */
-static void irqhandler(const device_config *device, int irq)
+static void irqhandler( const device_config *device, int irq )
{
- cputag_set_input_line(device->machine, "audiocpu", 0, irq ? ASSERT_LINE : CLEAR_LINE);
+ gaiden_state *state = (gaiden_state *)device->machine->driver_data;
+ cpu_set_input_line(state->audiocpu, 0, irq ? ASSERT_LINE : CLEAR_LINE);
}
static const ym2203_interface ym2203_config =
@@ -847,6 +853,9 @@ static const ym2203_interface ym2203_config =
static MACHINE_DRIVER_START( shadoww )
+ /* driver data */
+ MDRV_DRIVER_DATA(gaiden_state)
+
/* basic machine hardware */
MDRV_CPU_ADD("maincpu", M68000, 18432000/2) /* 9.216 MHz */
MDRV_CPU_PROGRAM_MAP(gaiden_map)
@@ -856,6 +865,7 @@ static MACHINE_DRIVER_START( shadoww )
MDRV_CPU_PROGRAM_MAP(sound_map)
/* IRQs are triggered by the YM2203 */
+ MDRV_MACHINE_START(raiga)
MDRV_MACHINE_RESET(raiga)
/* video hardware */
@@ -906,6 +916,9 @@ MACHINE_DRIVER_END
static MACHINE_DRIVER_START( drgnbowl )
+ /* driver data */
+ MDRV_DRIVER_DATA(gaiden_state)
+
/* basic machine hardware */
MDRV_CPU_ADD("maincpu", M68000, 20000000/2) /* 10 MHz */
MDRV_CPU_PROGRAM_MAP(drgnbowl_map)
@@ -915,6 +928,9 @@ static MACHINE_DRIVER_START( drgnbowl )
MDRV_CPU_PROGRAM_MAP(drgnbowl_sound_map)
MDRV_CPU_IO_MAP(drgnbowl_sound_port_map)
+ MDRV_MACHINE_START(raiga)
+ MDRV_MACHINE_RESET(raiga)
+
/* video hardware */
MDRV_SCREEN_ADD("screen", RASTER)
MDRV_SCREEN_REFRESH_RATE(60)
@@ -998,10 +1014,10 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( mastninj_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x03ffff) AM_ROM
AM_RANGE(0x060000, 0x063fff) AM_RAM
- AM_RANGE(0x070000, 0x070fff) AM_RAM_WRITE(gaiden_videoram_w) AM_BASE(&gaiden_videoram)
- AM_RANGE(0x072000, 0x073fff) AM_READWRITE(gaiden_videoram2_r, gaiden_videoram2_w) AM_BASE(&gaiden_videoram2)
- AM_RANGE(0x074000, 0x075fff) AM_READWRITE(gaiden_videoram3_r, gaiden_videoram3_w) AM_BASE(&gaiden_videoram3)
- AM_RANGE(0x076000, 0x077fff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram)
+ AM_RANGE(0x070000, 0x070fff) AM_RAM_WRITE(gaiden_videoram_w) AM_BASE_MEMBER(gaiden_state, videoram)
+ AM_RANGE(0x072000, 0x073fff) AM_READWRITE(gaiden_videoram2_r, gaiden_videoram2_w) AM_BASE_MEMBER(gaiden_state, videoram2)
+ AM_RANGE(0x074000, 0x075fff) AM_READWRITE(gaiden_videoram3_r, gaiden_videoram3_w) AM_BASE_MEMBER(gaiden_state, videoram3)
+ AM_RANGE(0x076000, 0x077fff) AM_RAM AM_BASE_SIZE_MEMBER(gaiden_state, spriteram, spriteram_size)
AM_RANGE(0x078000, 0x079fff) AM_RAM_WRITE(paletteram16_xxxxBBBBGGGGRRRR_word_w) AM_BASE_GENERIC(paletteram)
// AM_RANGE(0x078800, 0x079fff) AM_RAM
AM_RANGE(0x07a000, 0x07a001) AM_READ_PORT("SYSTEM")
@@ -1021,6 +1037,9 @@ ADDRESS_MAP_END
static MACHINE_DRIVER_START( mastninj )
+ /* driver data */
+ MDRV_DRIVER_DATA(gaiden_state)
+
/* basic machine hardware */
MDRV_CPU_ADD("maincpu", M68000, 10000000) /* 10 MHz? */
MDRV_CPU_PROGRAM_MAP(mastninj_map)
@@ -1030,6 +1049,7 @@ static MACHINE_DRIVER_START( mastninj )
MDRV_CPU_PROGRAM_MAP(mastninj_sound_map)
/* IRQs are triggered by the YM2203 */
+ MDRV_MACHINE_START(raiga)
MDRV_MACHINE_RESET(raiga)
/* video hardware */
@@ -1540,31 +1560,34 @@ ROM_END
static DRIVER_INIT( shadoww )
{
+ gaiden_state *state = (gaiden_state *)machine->driver_data;
/* sprite size Y = sprite size X */
- gaiden_sprite_sizey = 0;
- raiga_jumppoints = jumppoints_00;
+ state->sprite_sizey = 0;
+ state->raiga_jumppoints = jumppoints_00;
}
static DRIVER_INIT( wildfang )
{
+ gaiden_state *state = (gaiden_state *)machine->driver_data;
/* sprite size Y = sprite size X */
- gaiden_sprite_sizey = 0;
- raiga_jumppoints = jumppoints_00;
+ state->sprite_sizey = 0;
+ state->raiga_jumppoints = jumppoints_00;
- prot = 0;
- jumpcode = 0;
+ state->prot = 0;
+ state->jumpcode = 0;
memory_install_read16_handler(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x07a006, 0x07a007, 0, 0, wildfang_protection_r);
memory_install_write16_handler(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x07a804, 0x07a805, 0, 0, wildfang_protection_w);
}
static DRIVER_INIT( raiga )
{
+ gaiden_state *state = (gaiden_state *)machine->driver_data;
/* sprite size Y independent from sprite size X */
- gaiden_sprite_sizey = 2;
- raiga_jumppoints = jumppoints_00;
+ state->sprite_sizey = 2;
+ state->raiga_jumppoints = jumppoints_00;
- prot = 0;
- jumpcode = 0;
+ state->prot = 0;
+ state->jumpcode = 0;
memory_install_read16_handler(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x07a006, 0x07a007, 0, 0, raiga_protection_r);
memory_install_write16_handler(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x07a804, 0x07a805, 0, 0, raiga_protection_w);
}
@@ -1573,18 +1596,18 @@ static void descramble_drgnbowl_gfx(running_machine *machine)
{
int i;
UINT8 *ROM = memory_region(machine, "maincpu");
- size_t size = memory_region_length(machine, "maincpu");
+ size_t size = memory_region_length(machine, "maincpu");
UINT8 *buffer = alloc_array_or_die(UINT8, size);
- memcpy(buffer,ROM,size);
+ memcpy(buffer, ROM, size);
for( i = 0; i < size; i++ )
{
ROM[i] = buffer[BITSWAP24(i,23,22,21,20,
19,18,17,15,
- 16,14,13,12,
- 11,10, 9, 8,
- 7, 6, 5, 4,
- 3, 2, 1, 0)];
+ 16,14,13,12,
+ 11,10, 9, 8,
+ 7, 6, 5, 4,
+ 3, 2, 1, 0)];
}
free(buffer);
@@ -1610,7 +1633,8 @@ static void descramble_drgnbowl_gfx(running_machine *machine)
static DRIVER_INIT( drgnbowl )
{
- raiga_jumppoints = jumppoints_00;
+ gaiden_state *state = (gaiden_state *)machine->driver_data;
+ state->raiga_jumppoints = jumppoints_00;
descramble_drgnbowl_gfx(machine);
}
@@ -1634,14 +1658,14 @@ static void descramble_mastninj_gfx(UINT8* src)
7,6,4,
3,2,1,0)];
}
- memcpy(src,buffer,len);
+ memcpy(src, buffer, len);
free(buffer);
}
buffer = alloc_array_or_die(UINT8, len);
{
int i;
- for (i = 0;i < len; i++)
+ for (i = 0; i < len; i++)
{
buffer[i] = src[BITSWAP24(i,
23,22,21,20,
@@ -1651,7 +1675,7 @@ static void descramble_mastninj_gfx(UINT8* src)
7,5,4,
3,2,1,0)];
}
- memcpy(src,buffer,len);
+ memcpy(src, buffer, len);
free(buffer);
}
}
@@ -1664,14 +1688,14 @@ static DRIVER_INIT(mastninj)
DRIVER_INIT_CALL(shadoww);
}
-GAME( 1988, shadoww, 0, shadoww, shadoww, shadoww, ROT0, "Tecmo", "Shadow Warriors (World, set 1)", 0 )
-GAME( 1988, shadowwa, shadoww, shadoww, shadoww, shadoww, ROT0, "Tecmo", "Shadow Warriors (World, set 2)", 0 )
-GAME( 1988, gaiden, shadoww, shadoww, shadoww, shadoww, ROT0, "Tecmo", "Ninja Gaiden (US)", 0 )
-GAME( 1989, ryukendn, shadoww, shadoww, shadoww, shadoww, ROT0, "Tecmo", "Ninja Ryukenden (Japan, set 1)", 0 )
-GAME( 1989, ryukendna,shadoww, shadoww, shadoww, shadoww, ROT0, "Tecmo", "Ninja Ryukenden (Japan, set 2)", 0 )
-GAME( 1989, mastninj, shadoww, mastninj,shadoww, mastninj, ROT0, "bootleg", "Master Ninja (bootleg of Shadow Warriors / Ninja Gaiden)", GAME_NOT_WORKING ) // sprites need fixing, sound and yscroll too.
-GAME( 1989, wildfang, 0, shadoww, wildfang, wildfang, ROT0, "Tecmo", "Wild Fang / Tecmo Knight", 0 )
-GAME( 1989, tknight, wildfang, shadoww, tknight, wildfang, ROT0, "Tecmo", "Tecmo Knight", 0 )
-GAME( 1991, stratof, 0, raiga, raiga, raiga, ROT0, "Tecmo", "Raiga - Strato Fighter (US)", GAME_IMPERFECT_GRAPHICS )
-GAME( 1991, raiga, stratof, raiga, raiga, raiga, ROT0, "Tecmo", "Raiga - Strato Fighter (Japan)", GAME_IMPERFECT_GRAPHICS )
-GAME( 1992, drgnbowl, 0, drgnbowl,drgnbowl, drgnbowl, ROT0, "Nics", "Dragon Bowl", 0 )
+GAME( 1988, shadoww, 0, shadoww, shadoww, shadoww, ROT0, "Tecmo", "Shadow Warriors (World, set 1)", GAME_SUPPORTS_SAVE )
+GAME( 1988, shadowwa, shadoww, shadoww, shadoww, shadoww, ROT0, "Tecmo", "Shadow Warriors (World, set 2)", GAME_SUPPORTS_SAVE )
+GAME( 1988, gaiden, shadoww, shadoww, shadoww, shadoww, ROT0, "Tecmo", "Ninja Gaiden (US)", GAME_SUPPORTS_SAVE )
+GAME( 1989, ryukendn, shadoww, shadoww, shadoww, shadoww, ROT0, "Tecmo", "Ninja Ryukenden (Japan, set 1)", GAME_SUPPORTS_SAVE )
+GAME( 1989, ryukendna,shadoww, shadoww, shadoww, shadoww, ROT0, "Tecmo", "Ninja Ryukenden (Japan, set 2)", GAME_SUPPORTS_SAVE )
+GAME( 1989, mastninj, shadoww, mastninj,shadoww, mastninj, ROT0, "bootleg", "Master Ninja (bootleg of Shadow Warriors / Ninja Gaiden)", GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) // sprites need fixing, sound and yscroll too.
+GAME( 1989, wildfang, 0, shadoww, wildfang, wildfang, ROT0, "Tecmo", "Wild Fang / Tecmo Knight", GAME_SUPPORTS_SAVE )
+GAME( 1989, tknight, wildfang, shadoww, tknight, wildfang, ROT0, "Tecmo", "Tecmo Knight", GAME_SUPPORTS_SAVE )
+GAME( 1991, stratof, 0, raiga, raiga, raiga, ROT0, "Tecmo", "Raiga - Strato Fighter (US)", GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE )
+GAME( 1991, raiga, stratof, raiga, raiga, raiga, ROT0, "Tecmo", "Raiga - Strato Fighter (Japan)", GAME_IMPERFECT_GRAPHICS | GAME_SUPPORTS_SAVE )
+GAME( 1992, drgnbowl, 0, drgnbowl,drgnbowl, drgnbowl, ROT0, "Nics", "Dragon Bowl", GAME_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/galaxi.c b/src/mame/drivers/galaxi.c
index b754e1105d2..bc08904c270 100644
--- a/src/mame/drivers/galaxi.c
+++ b/src/mame/drivers/galaxi.c
@@ -44,90 +44,125 @@ Notes:
#include "sound/okim6295.h"
#include "galaxi.lh"
+typedef struct _galaxi_state galaxi_state;
+struct _galaxi_state
+{
+ /* memory pointers */
+ UINT16 * bg1_ram;
+ UINT16 * bg2_ram;
+ UINT16 * bg3_ram;
+ UINT16 * bg4_ram;
+ UINT16 * fg_ram;
+// UINT16 * paletteram; // currently this uses generic palette handling
+// UINT16 * nvram; // currently this uses generic nvram handling
+
+ /* video-related */
+ tilemap *bg1_tmap, *bg2_tmap, *bg3_tmap, *bg4_tmap, *fg_tmap;
+
+ /* misc */
+ int hopper, ticket;
+ UINT16 out[3];
+};
+
+
/***************************************************************************
Video Hardware
***************************************************************************/
-static UINT16 *bg1_ram, *bg2_ram, *bg3_ram, *bg4_ram, *fg_ram;
-static tilemap *bg1_tmap, *bg2_tmap, *bg3_tmap, *bg4_tmap, *fg_tmap;
-
static TILE_GET_INFO( get_bg1_tile_info )
{
- UINT16 code = bg1_ram[tile_index];
- SET_TILE_INFO(0, code, 0x10+(code >> 12), 0);
+ galaxi_state *state = (galaxi_state *)machine->driver_data;
+ UINT16 code = state->bg1_ram[tile_index];
+ SET_TILE_INFO(0, code, 0x10 + (code >> 12), 0);
}
+
static TILE_GET_INFO( get_bg2_tile_info )
{
- UINT16 code = bg2_ram[tile_index];
- SET_TILE_INFO(0, code, 0x10+(code >> 12), 0);
+ galaxi_state *state = (galaxi_state *)machine->driver_data;
+ UINT16 code = state->bg2_ram[tile_index];
+ SET_TILE_INFO(0, code, 0x10 + (code >> 12), 0);
}
+
static TILE_GET_INFO( get_bg3_tile_info )
{
- UINT16 code = bg3_ram[tile_index];
+ galaxi_state *state = (galaxi_state *)machine->driver_data;
+ UINT16 code = state->bg3_ram[tile_index];
SET_TILE_INFO(0, code, (code >> 12), 0);
}
+
static TILE_GET_INFO( get_bg4_tile_info )
{
- UINT16 code = bg4_ram[tile_index];
+ galaxi_state *state = (galaxi_state *)machine->driver_data;
+ UINT16 code = state->bg4_ram[tile_index];
SET_TILE_INFO(0, code, (code >> 12), 0);
}
-
static TILE_GET_INFO( get_fg_tile_info )
{
- UINT16 code = fg_ram[tile_index];
- SET_TILE_INFO(1, code, 0x20+(code >> 12), 0);
+ galaxi_state *state = (galaxi_state *)machine->driver_data;
+ UINT16 code = state->fg_ram[tile_index];
+ SET_TILE_INFO(1, code, 0x20 + (code >> 12), 0);
}
-
static WRITE16_HANDLER( galaxi_bg1_w )
{
- COMBINE_DATA( &bg1_ram[offset] );
- tilemap_mark_tile_dirty( bg1_tmap, offset );
+ galaxi_state *state = (galaxi_state *)space->machine->driver_data;
+ COMBINE_DATA(&state->bg1_ram[offset]);
+ tilemap_mark_tile_dirty(state->bg1_tmap, offset);
}
+
static WRITE16_HANDLER( galaxi_bg2_w )
{
- COMBINE_DATA( &bg2_ram[offset] );
- tilemap_mark_tile_dirty( bg2_tmap, offset );
+ galaxi_state *state = (galaxi_state *)space->machine->driver_data;
+ COMBINE_DATA(&state->bg2_ram[offset]);
+ tilemap_mark_tile_dirty(state->bg2_tmap, offset);
}
+
static WRITE16_HANDLER( galaxi_bg3_w )
{
- COMBINE_DATA( &bg3_ram[offset] );
- tilemap_mark_tile_dirty( bg3_tmap, offset );
+ galaxi_state *state = (galaxi_state *)space->machine->driver_data;
+ COMBINE_DATA(&state->bg3_ram[offset]);
+ tilemap_mark_tile_dirty(state->bg3_tmap, offset);
}
+
static WRITE16_HANDLER( galaxi_bg4_w )
{
- COMBINE_DATA( &bg4_ram[offset] );
- tilemap_mark_tile_dirty( bg4_tmap, offset );
+ galaxi_state *state = (galaxi_state *)space->machine->driver_data;
+ COMBINE_DATA(&state->bg4_ram[offset]);
+ tilemap_mark_tile_dirty(state->bg4_tmap, offset);
}
static WRITE16_HANDLER( galaxi_fg_w )
{
- COMBINE_DATA( &fg_ram[offset] );
- tilemap_mark_tile_dirty( fg_tmap, offset );
+ galaxi_state *state = (galaxi_state *)space->machine->driver_data;
+ COMBINE_DATA(&state->fg_ram[offset]);
+ tilemap_mark_tile_dirty(state->fg_tmap, offset);
}
static VIDEO_START(galaxi)
{
- bg1_tmap = tilemap_create( machine, get_bg1_tile_info, tilemap_scan_rows, 16,16, 0x20,0x10 );
- bg2_tmap = tilemap_create( machine, get_bg2_tile_info, tilemap_scan_rows, 16,16, 0x20,0x10 );
- bg3_tmap = tilemap_create( machine, get_bg3_tile_info, tilemap_scan_rows, 16,16, 0x20,0x10 );
- bg4_tmap = tilemap_create( machine, get_bg4_tile_info, tilemap_scan_rows, 16,16, 0x20,0x10 );
+ galaxi_state *state = (galaxi_state *)machine->driver_data;
+
+ state->bg1_tmap = tilemap_create(machine, get_bg1_tile_info, tilemap_scan_rows, 16, 16, 0x20, 0x10);
+ state->bg2_tmap = tilemap_create(machine, get_bg2_tile_info, tilemap_scan_rows, 16, 16, 0x20, 0x10);
+ state->bg3_tmap = tilemap_create(machine, get_bg3_tile_info, tilemap_scan_rows, 16, 16, 0x20, 0x10);
+ state->bg4_tmap = tilemap_create(machine, get_bg4_tile_info, tilemap_scan_rows, 16, 16, 0x20, 0x10);
- fg_tmap = tilemap_create( machine, get_fg_tile_info, tilemap_scan_rows, 8,8, 0x40,0x20 );
+ state->fg_tmap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 0x40, 0x20);
- tilemap_set_transparent_pen(bg1_tmap, 0);
- tilemap_set_transparent_pen(bg2_tmap, 0);
- tilemap_set_transparent_pen(bg3_tmap, 0);
- tilemap_set_transparent_pen(bg4_tmap, 0);
+ tilemap_set_transparent_pen(state->bg1_tmap, 0);
+ tilemap_set_transparent_pen(state->bg2_tmap, 0);
+ tilemap_set_transparent_pen(state->bg3_tmap, 0);
+ tilemap_set_transparent_pen(state->bg4_tmap, 0);
- tilemap_set_transparent_pen(fg_tmap, 0);
+ tilemap_set_transparent_pen(state->fg_tmap, 0);
- tilemap_set_scrolldx( bg3_tmap, -8, 0);
+ tilemap_set_scrolldx(state->bg3_tmap, -8, 0);
}
static VIDEO_UPDATE(galaxi)
{
+ galaxi_state *state = (galaxi_state *)screen->machine->driver_data;
int layers_ctrl = -1;
#ifdef MAME_DEBUG
@@ -143,13 +178,13 @@ static VIDEO_UPDATE(galaxi)
}
#endif
- if (layers_ctrl & 1) tilemap_draw(bitmap,cliprect, bg1_tmap, TILEMAP_DRAW_OPAQUE, 0);
- else bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine));
- if (layers_ctrl & 2) tilemap_draw(bitmap,cliprect, bg2_tmap, 0, 0);
- if (layers_ctrl & 4) tilemap_draw(bitmap,cliprect, bg3_tmap, 0, 0);
- if (layers_ctrl & 8) tilemap_draw(bitmap,cliprect, bg4_tmap, 0, 0);
+ if (layers_ctrl & 1) tilemap_draw(bitmap, cliprect, state->bg1_tmap, TILEMAP_DRAW_OPAQUE, 0);
+ else bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine));
+ if (layers_ctrl & 2) tilemap_draw(bitmap, cliprect, state->bg2_tmap, 0, 0);
+ if (layers_ctrl & 4) tilemap_draw(bitmap, cliprect, state->bg3_tmap, 0, 0);
+ if (layers_ctrl & 8) tilemap_draw(bitmap, cliprect, state->bg4_tmap, 0, 0);
- if (layers_ctrl & 16) tilemap_draw(bitmap,cliprect, fg_tmap, 0, 0);
+ if (layers_ctrl & 16) tilemap_draw(bitmap, cliprect, state->fg_tmap, 0, 0);
return 0;
}
@@ -158,30 +193,31 @@ static VIDEO_UPDATE(galaxi)
Memory Maps
***************************************************************************/
-static int hopper, ticket;
-
-static UINT16 out[3];
-
-static void show_out(void)
+static void show_out( running_machine *machine )
{
-// popmessage("%04x %04x %04x", out[0], out[1], out[2]);
+// galaxi_state *state = (galaxi_state *)machine->driver_data;
+// popmessage("%04x %04x %04x", state->out[0], state->out[1], state->out[2]);
}
static WRITE16_HANDLER( galaxi_500000_w )
{
- COMBINE_DATA( &out[0] );
- show_out();
+ galaxi_state *state = (galaxi_state *)space->machine->driver_data;
+ COMBINE_DATA(&state->out[0]);
+ show_out(space->machine);
}
static WRITE16_HANDLER( galaxi_500002_w )
{
- COMBINE_DATA( &out[1] );
- show_out();
+ galaxi_state *state = (galaxi_state *)space->machine->driver_data;
+ COMBINE_DATA(&state->out[1]);
+ show_out(space->machine);
}
static WRITE16_HANDLER( galaxi_500004_w )
{
- if ( ACCESSING_BITS_0_7 )
+ galaxi_state *state = (galaxi_state *)space->machine->driver_data;
+
+ if (ACCESSING_BITS_0_7)
{
/*
- Lbits -
@@ -203,48 +239,51 @@ static WRITE16_HANDLER( galaxi_500004_w )
output_set_lamp_value(5, (data >> 4) & 1); /* Lamp 5 - HOLD 5 */
output_set_lamp_value(6, (data >> 5) & 1); /* Lamp 6 - START */
}
- if ( ACCESSING_BITS_8_15 )
+ if (ACCESSING_BITS_8_15)
{
- ticket = data & 0x0100;
- hopper = data & 0x1000;
+ state->ticket = data & 0x0100;
+ state->hopper = data & 0x1000;
coin_counter_w(space->machine, 0, data & 0x2000); // coins
}
- COMBINE_DATA( &out[2] );
- show_out();
+ COMBINE_DATA(&state->out[2]);
+ show_out(space->machine);
}
static CUSTOM_INPUT( ticket_r )
{
- return ticket && !(video_screen_get_frame_number(field->port->machine->primary_screen)%10);
+ galaxi_state *state = (galaxi_state *)field->port->machine->driver_data;
+ return state->ticket && !(video_screen_get_frame_number(field->port->machine->primary_screen) % 10);
}
+
static CUSTOM_INPUT( hopper_r )
{
- return hopper && !(video_screen_get_frame_number(field->port->machine->primary_screen)%10);
+ galaxi_state *state = (galaxi_state *)field->port->machine->driver_data;
+ return state->hopper && !(video_screen_get_frame_number(field->port->machine->primary_screen) % 10);
}
static ADDRESS_MAP_START( galaxi_map, ADDRESS_SPACE_PROGRAM, 16 )
- AM_RANGE( 0x000000, 0x03ffff ) AM_ROM
+ AM_RANGE(0x000000, 0x03ffff) AM_ROM
- AM_RANGE( 0x100000, 0x1003ff ) AM_RAM_WRITE( galaxi_bg1_w ) AM_BASE( &bg1_ram )
- AM_RANGE( 0x100400, 0x1007ff ) AM_RAM_WRITE( galaxi_bg2_w ) AM_BASE( &bg2_ram )
- AM_RANGE( 0x100800, 0x100bff ) AM_RAM_WRITE( galaxi_bg3_w ) AM_BASE( &bg3_ram )
- AM_RANGE( 0x100c00, 0x100fff ) AM_RAM_WRITE( galaxi_bg4_w ) AM_BASE( &bg4_ram )
+ AM_RANGE(0x100000, 0x1003ff) AM_RAM_WRITE(galaxi_bg1_w) AM_BASE_MEMBER(galaxi_state, bg1_ram)
+ AM_RANGE(0x100400, 0x1007ff) AM_RAM_WRITE(galaxi_bg2_w) AM_BASE_MEMBER(galaxi_state, bg2_ram)
+ AM_RANGE(0x100800, 0x100bff) AM_RAM_WRITE(galaxi_bg3_w) AM_BASE_MEMBER(galaxi_state, bg3_ram)
+ AM_RANGE(0x100c00, 0x100fff) AM_RAM_WRITE(galaxi_bg4_w) AM_BASE_MEMBER(galaxi_state, bg4_ram)
- AM_RANGE( 0x101000, 0x101fff ) AM_RAM_WRITE( galaxi_fg_w ) AM_BASE( &fg_ram )
- AM_RANGE( 0x102000, 0x1047ff ) AM_READNOP // unknown
+ AM_RANGE(0x101000, 0x101fff) AM_RAM_WRITE(galaxi_fg_w ) AM_BASE_MEMBER(galaxi_state, fg_ram)
+ AM_RANGE(0x102000, 0x1047ff) AM_READNOP // unknown
- AM_RANGE( 0x300000, 0x3007ff ) AM_RAM_WRITE( paletteram16_xRRRRRGGGGGBBBBB_word_w ) AM_BASE_GENERIC( paletteram )
+ AM_RANGE(0x300000, 0x3007ff) AM_RAM_WRITE(paletteram16_xRRRRRGGGGGBBBBB_word_w) AM_BASE_GENERIC(paletteram)
- AM_RANGE( 0x500000, 0x500001 ) AM_READ_PORT( "INPUTS" )
- AM_RANGE( 0x500000, 0x500001 ) AM_WRITE( galaxi_500000_w )
- AM_RANGE( 0x500002, 0x500003 ) AM_WRITE( galaxi_500002_w )
- AM_RANGE( 0x500004, 0x500005 ) AM_WRITE( galaxi_500004_w )
+ AM_RANGE(0x500000, 0x500001) AM_READ_PORT("INPUTS")
+ AM_RANGE(0x500000, 0x500001) AM_WRITE(galaxi_500000_w)
+ AM_RANGE(0x500002, 0x500003) AM_WRITE(galaxi_500002_w)
+ AM_RANGE(0x500004, 0x500005) AM_WRITE(galaxi_500004_w)
- AM_RANGE( 0x700000, 0x700001 ) AM_DEVREADWRITE8( "oki", okim6295_r, okim6295_w, 0x00ff )
+ AM_RANGE(0x700000, 0x700001) AM_DEVREADWRITE8("oki", okim6295_r, okim6295_w, 0x00ff)
- AM_RANGE( 0x600000, 0x607fff ) AM_RAM AM_BASE_SIZE_GENERIC( nvram ) // 2x DS1230Y (non volatile SRAM)
+ AM_RANGE(0x600000, 0x607fff) AM_RAM AM_BASE_SIZE_GENERIC(nvram) // 2x DS1230Y (non volatile SRAM)
ADDRESS_MAP_END
/***************************************************************************
@@ -328,12 +367,38 @@ GFXDECODE_END
Machine Drivers
***************************************************************************/
+static MACHINE_START( galaxi )
+{
+ galaxi_state *state = (galaxi_state *)machine->driver_data;
+
+ state_save_register_global(machine, state->hopper);
+ state_save_register_global(machine, state->ticket);
+ state_save_register_global_array(machine, state->out);
+}
+
+static MACHINE_RESET( galaxi )
+{
+ galaxi_state *state = (galaxi_state *)machine->driver_data;
+
+ state->hopper = 0;
+ state->ticket = 0;
+ state->out[0] = 0;
+ state->out[1] = 0;
+ state->out[2] = 0;
+}
+
static MACHINE_DRIVER_START( galaxi )
+
+ /* driver data */
+ MDRV_DRIVER_DATA(galaxi_state)
+
/* basic machine hardware */
MDRV_CPU_ADD("maincpu", M68000, XTAL_10MHz) // ?
MDRV_CPU_PROGRAM_MAP(galaxi_map)
MDRV_CPU_VBLANK_INT("screen", irq4_line_hold)
+ MDRV_MACHINE_START(galaxi)
+ MDRV_MACHINE_RESET(galaxi)
MDRV_NVRAM_HANDLER(generic_0fill)
/* video hardware */
@@ -406,6 +471,6 @@ ROM_END
Game Drivers
***************************************************************************/
-/* YEAR NAME PARENT MACHINE INPUT INIT ROT COMPANY FULLNAME FLAGS LAYOUT */
-GAMEL( 2000, galaxi, 0, galaxi, galaxi, 0, ROT0, "B.R.L.", "Galaxi (v2.0)", 0, layout_galaxi )
-GAMEL( 2000, magjoker, 0, magjoker, magjoker, 0, ROT0, "B.R.L.", "Magic Joker (v1.25.10.2000)", 0, layout_galaxi )
+/* YEAR NAME PARENT MACHINE INPUT INIT ROT COMPANY FULLNAME FLAGS LAYOUT */
+GAMEL( 2000, galaxi, 0, galaxi, galaxi, 0, ROT0, "B.R.L.", "Galaxi (v2.0)", GAME_SUPPORTS_SAVE, layout_galaxi )
+GAMEL( 2000, magjoker, 0, magjoker, magjoker, 0, ROT0, "B.R.L.", "Magic Joker (v1.25.10.2000)", GAME_SUPPORTS_SAVE, layout_galaxi )
diff --git a/src/mame/drivers/rocnrope.c b/src/mame/drivers/rocnrope.c
index 9af31ae0f43..4d2775777fe 100644
--- a/src/mame/drivers/rocnrope.c
+++ b/src/mame/drivers/rocnrope.c
@@ -11,28 +11,32 @@ Based on drivers from Juno First emulator by Chris Hardy (chrish@kcbbs.gen.nz)
#include "machine/konami1.h"
#include "audio/timeplt.h"
#include "konamipt.h"
+#include "rocnrope.h"
-#define MASTER_CLOCK XTAL_18_432MHz
+#define MASTER_CLOCK XTAL_18_432MHz
-extern WRITE8_HANDLER( rocnrope_videoram_w );
-extern WRITE8_HANDLER( rocnrope_colorram_w );
-extern WRITE8_HANDLER( rocnrope_flipscreen_w );
-
-extern PALETTE_INIT( rocnrope );
-extern VIDEO_START( rocnrope );
-extern VIDEO_UPDATE( rocnrope );
+/*************************************
+ *
+ * Memory handlers
+ *
+ *************************************/
/* Roc'n'Rope has the IRQ vectors in RAM. The rom contains $FFFF at this address! */
static WRITE8_HANDLER( rocnrope_interrupt_vector_w )
{
UINT8 *RAM = memory_region(space->machine, "maincpu");
-
- RAM[0xFFF2+offset] = data;
+ RAM[0xfff2 + offset] = data;
}
+/*************************************
+ *
+ * Address maps
+ *
+ *************************************/
+
static ADDRESS_MAP_START( rocnrope_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x3080, 0x3080) AM_READ_PORT("SYSTEM")
AM_RANGE(0x3081, 0x3081) AM_READ_PORT("P1")
@@ -40,11 +44,11 @@ static ADDRESS_MAP_START( rocnrope_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x3083, 0x3083) AM_READ_PORT("DSW1")
AM_RANGE(0x3000, 0x3000) AM_READ_PORT("DSW2")
AM_RANGE(0x3100, 0x3100) AM_READ_PORT("DSW3")
- AM_RANGE(0x4000, 0x402f) AM_RAM AM_BASE_GENERIC(spriteram2)
- AM_RANGE(0x4400, 0x442f) AM_RAM AM_BASE_SIZE_GENERIC(spriteram)
+ AM_RANGE(0x4000, 0x402f) AM_RAM AM_BASE_MEMBER(rocnrope_state, spriteram2)
+ AM_RANGE(0x4400, 0x442f) AM_RAM AM_BASE_SIZE_MEMBER(rocnrope_state, spriteram, spriteram_size)
AM_RANGE(0x4000, 0x47ff) AM_RAM
- AM_RANGE(0x4800, 0x4bff) AM_RAM_WRITE(rocnrope_colorram_w) AM_BASE_GENERIC(colorram)
- AM_RANGE(0x4c00, 0x4fff) AM_RAM_WRITE(rocnrope_videoram_w) AM_BASE_GENERIC(videoram)
+ AM_RANGE(0x4800, 0x4bff) AM_RAM_WRITE(rocnrope_colorram_w) AM_BASE_MEMBER(rocnrope_state, colorram)
+ AM_RANGE(0x4c00, 0x4fff) AM_RAM_WRITE(rocnrope_videoram_w) AM_BASE_MEMBER(rocnrope_state, videoram)
AM_RANGE(0x5000, 0x5fff) AM_RAM
AM_RANGE(0x8000, 0x8000) AM_WRITE(watchdog_reset_w)
AM_RANGE(0x8080, 0x8080) AM_WRITE(rocnrope_flipscreen_w)
@@ -59,6 +63,12 @@ static ADDRESS_MAP_START( rocnrope_map, ADDRESS_SPACE_PROGRAM, 8 )
ADDRESS_MAP_END
+/*************************************
+ *
+ * Input ports
+ *
+ *************************************/
+
static INPUT_PORTS_START( rocnrope )
PORT_START("SYSTEM")
KONAMI8_SYSTEM_UNK
@@ -130,6 +140,12 @@ INPUT_PORTS_END
+/*************************************
+ *
+ * Graphics definitions
+ *
+ *************************************/
+
static const gfx_layout charlayout =
{
8,8, /* 8*8 sprites */
@@ -161,8 +177,17 @@ GFXDECODE_END
+/*************************************
+ *
+ * Machine driver
+ *
+ *************************************/
+
static MACHINE_DRIVER_START( rocnrope )
+ /* driver data */
+ MDRV_DRIVER_DATA(rocnrope_state)
+
/* basic machine hardware */
MDRV_CPU_ADD("maincpu", M6809, MASTER_CLOCK / 3 / 4) /* Verified in schematics */
MDRV_CPU_PROGRAM_MAP(rocnrope_map)
@@ -187,11 +212,11 @@ static MACHINE_DRIVER_START( rocnrope )
MDRV_IMPORT_FROM(timeplt_sound)
MACHINE_DRIVER_END
-/***************************************************************************
-
- Game driver(s)
-
-***************************************************************************/
+/*************************************
+ *
+ * ROM definition(s)
+ *
+ *************************************/
/*
Roc'n Rope
@@ -264,6 +289,12 @@ ROM_END
+/*************************************
+ *
+ * Driver initialization
+ *
+ *************************************/
+
static DRIVER_INIT( rocnrope )
{
UINT8 *decrypted = konami1_decode(machine, "maincpu");
@@ -277,5 +308,11 @@ static DRIVER_INIT( rocnropk )
}
-GAME( 1983, rocnrope, 0, rocnrope, rocnrope, rocnrope, ROT270, "Konami", "Roc'n Rope", 0 )
-GAME( 1983, rocnropek,rocnrope, rocnrope, rocnrope, rocnropk, ROT270, "Konami + Kosuka", "Roc'n Rope (Kosuka)", 0 )
+/*************************************
+ *
+ * Game driver(s)
+ *
+ *************************************/
+
+GAME( 1983, rocnrope, 0, rocnrope, rocnrope, rocnrope, ROT270, "Konami", "Roc'n Rope", GAME_SUPPORTS_SAVE )
+GAME( 1983, rocnropek,rocnrope, rocnrope, rocnrope, rocnropk, ROT270, "Konami + Kosuka", "Roc'n Rope (Kosuka)", GAME_SUPPORTS_SAVE )
diff --git a/src/mame/includes/dkong.h b/src/mame/includes/dkong.h
index fc044e10626..9deefd1f042 100644
--- a/src/mame/includes/dkong.h
+++ b/src/mame/includes/dkong.h
@@ -73,13 +73,22 @@ typedef struct _dkong_state dkong_state;
struct _dkong_state
{
/* memory pointers */
+ UINT8 * video_ram;
+ UINT8 * sprite_ram;
+ size_t sprite_ram_size;
+ /* devices */
+ const device_config *dev_n2a03a;
+ const device_config *dev_n2a03b;
+ const device_config *dev_vp2; /* virtual port 2 */
+ const device_config *dev_6h;
+
+#if 0
/* machine states */
UINT8 hardware_type;
/* sound state */
const UINT8 * snd_rom;
- const device_config * dev_vp2; /* virtual port 2 */
/* video state */
tilemap *bg_tilemap;
@@ -88,9 +97,6 @@ struct _dkong_state
const UINT8 * color_codes;
emu_timer * scanline_timer;
INT8 vidhw; /* Selected video hardware RS Conversion / TKG04 */
- UINT8 * video_ram;
- UINT8 * sprite_ram;
- size_t sprite_ram_size;
/* radar scope */
@@ -125,7 +131,54 @@ struct _dkong_state
/* reverse address lookup map - hunchbkd */
INT16 rev_map[0x200];
+#endif
+ /* machine states */
+ UINT8 hardware_type;
+
+ /* sound state */
+ const UINT8 *snd_rom;
+
+ /* video state */
+ tilemap *bg_tilemap;
+
+ bitmap_t *bg_bits;
+ const UINT8 * color_codes;
+ emu_timer * scanline_timer;
+ INT8 vidhw; /* Selected video hardware RS Conversion / TKG04 */
+
+ /* radar scope */
+ UINT8 * gfx4;
+ UINT8 * gfx3;
+ int gfx3_len;
+
+ UINT8 sig30Hz;
+ UINT8 grid_sig;
+ UINT8 rflip_sig;
+ UINT8 star_ff;
+ UINT8 blue_level;
+ double cd4049_a;
+ double cd4049_b;
+
+ /* Specific states */
+ INT8 decrypt_counter;
+
+ /* 2650 protection */
+ UINT8 protect_type;
+ UINT8 hunchloopback;
+ UINT8 prot_cnt;
+ UINT8 main_fo;
+
+ /* Save state relevant */
+ UINT8 gfx_bank, palette_bank;
+ UINT8 grid_on;
+ UINT16 grid_col;
+ UINT8 sprite_bank;
+ UINT8 dma_latch;
+ UINT8 flip;
+
+ /* reverse address lookup map - hunchbkd */
+ INT16 rev_map[0x200];
};
/*----------- defined in video/dkong.c -----------*/
diff --git a/src/mame/includes/funybubl.h b/src/mame/includes/funybubl.h
new file mode 100644
index 00000000000..599514c497d
--- /dev/null
+++ b/src/mame/includes/funybubl.h
@@ -0,0 +1,21 @@
+
+
+typedef struct _funybubl_state funybubl_state;
+struct _funybubl_state
+{
+ /* memory pointers */
+ UINT8 * banked_vram;
+ UINT8 * paletteram;
+
+ /* devices */
+ const device_config *audiocpu;
+};
+
+
+
+/*----------- defined in video/funybubl.c -----------*/
+
+WRITE8_HANDLER ( funybubl_paldatawrite );
+
+VIDEO_START(funybubl);
+VIDEO_UPDATE(funybubl);
diff --git a/src/mame/includes/fuukifg2.h b/src/mame/includes/fuukifg2.h
new file mode 100644
index 00000000000..0ef3a204038
--- /dev/null
+++ b/src/mame/includes/fuukifg2.h
@@ -0,0 +1,38 @@
+
+
+typedef struct _fuuki16_state fuuki16_state;
+struct _fuuki16_state
+{
+ /* memory pointers */
+ UINT16 * vram_0;
+ UINT16 * vram_1;
+ UINT16 * vram_2;
+ UINT16 * vram_3;
+ UINT16 * vregs;
+ UINT16 * priority;
+ UINT16 * unknown;
+ UINT16 * spriteram;
+// UINT16 * paletteram; // currently this uses generic palette handling
+ size_t spriteram_size;
+
+ /* video-related */
+ tilemap *tilemap_0, *tilemap_1, *tilemap_2, *tilemap_3;
+
+ /* misc */
+ emu_timer *raster_interrupt_timer;
+
+ /* devices */
+ const device_config *maincpu;
+ const device_config *audiocpu;
+};
+
+
+/*----------- defined in video/fuukifg2.c -----------*/
+
+WRITE16_HANDLER( fuuki16_vram_0_w );
+WRITE16_HANDLER( fuuki16_vram_1_w );
+WRITE16_HANDLER( fuuki16_vram_2_w );
+WRITE16_HANDLER( fuuki16_vram_3_w );
+
+VIDEO_START( fuuki16 );
+VIDEO_UPDATE( fuuki16 );
diff --git a/src/mame/includes/fuukifg3.h b/src/mame/includes/fuukifg3.h
new file mode 100644
index 00000000000..ec73bde58cb
--- /dev/null
+++ b/src/mame/includes/fuukifg3.h
@@ -0,0 +1,52 @@
+
+
+/* Define clocks based on actual OSC on the PCB */
+
+#define CPU_CLOCK (XTAL_40MHz / 2) /* clock for 68020 */
+#define SOUND_CPU_CLOCK (XTAL_12MHz / 2) /* clock for Z80 sound CPU */
+#define FM_SOUND_CLOCK (XTAL_33_8688MHz / 2) /* FM clock */
+
+/* NOTE: YMF278B_STD_CLOCK is defined in /src/emu/sound/ymf278b.h */
+
+
+typedef struct _fuuki32_state fuuki32_state;
+struct _fuuki32_state
+{
+ /* memory pointers */
+ UINT32 * vram_0;
+ UINT32 * vram_1;
+ UINT32 * vram_2;
+ UINT32 * vram_3;
+ UINT32 * vregs;
+ UINT32 * priority;
+ UINT32 * tilebank;
+ UINT32 * spriteram;
+ UINT32 * buf_spriteram;
+ UINT32 * buf_spriteram2;
+ UINT32 * paletteram;
+ size_t spriteram_size;
+
+ /* video-related */
+ tilemap *tilemap_0, *tilemap_1, *tilemap_2, *tilemap_3;
+ UINT32 spr_buffered_tilebank[2];
+
+ /* misc */
+ emu_timer *raster_interrupt_timer;
+ UINT8 shared_ram[16];
+
+ /* devices */
+ const device_config *maincpu;
+ const device_config *audiocpu;
+};
+
+
+/*----------- defined in video/fuuki32.c -----------*/
+
+WRITE32_HANDLER( fuuki32_vram_0_w );
+WRITE32_HANDLER( fuuki32_vram_1_w );
+WRITE32_HANDLER( fuuki32_vram_2_w );
+WRITE32_HANDLER( fuuki32_vram_3_w );
+
+VIDEO_START( fuuki32 );
+VIDEO_UPDATE( fuuki32 );
+VIDEO_EOF( fuuki32 );
diff --git a/src/mame/includes/gaiden.h b/src/mame/includes/gaiden.h
new file mode 100644
index 00000000000..c3a3252bc25
--- /dev/null
+++ b/src/mame/includes/gaiden.h
@@ -0,0 +1,57 @@
+/***************************************************************************
+
+ Ninja Gaiden
+
+***************************************************************************/
+
+typedef struct _gaiden_state gaiden_state;
+struct _gaiden_state
+{
+ /* memory pointers */
+ UINT16 * videoram;
+ UINT16 * videoram2;
+ UINT16 * videoram3;
+ UINT16 * spriteram;
+ size_t spriteram_size;
+
+ /* video-related */
+ tilemap *text_layer,*foreground,*background;
+ bitmap_t *sprite_bitmap, *tile_bitmap_bg, *tile_bitmap_fg;
+ UINT16 tx_scroll_x, tx_scroll_y;
+ UINT16 bg_scroll_x, bg_scroll_y;
+ UINT16 fg_scroll_x, fg_scroll_y;
+
+ /* misc */
+ int sprite_sizey;
+ int prot, jumpcode;
+ const int *raiga_jumppoints;
+
+ /* devices */
+ const device_config *audiocpu;
+};
+
+
+/*----------- defined in video/gaiden.c -----------*/
+
+VIDEO_START( gaiden );
+VIDEO_START( raiga );
+VIDEO_START( drgnbowl );
+VIDEO_START( mastninj );
+
+VIDEO_UPDATE( gaiden );
+VIDEO_UPDATE( raiga );
+VIDEO_UPDATE( drgnbowl );
+
+WRITE16_HANDLER( gaiden_videoram_w );
+WRITE16_HANDLER( gaiden_videoram2_w );
+READ16_HANDLER( gaiden_videoram2_r );
+WRITE16_HANDLER( gaiden_videoram3_w );
+READ16_HANDLER( gaiden_videoram3_r );
+
+WRITE16_HANDLER( gaiden_txscrollx_w );
+WRITE16_HANDLER( gaiden_txscrolly_w );
+WRITE16_HANDLER( gaiden_fgscrollx_w );
+WRITE16_HANDLER( gaiden_fgscrolly_w );
+WRITE16_HANDLER( gaiden_bgscrollx_w );
+WRITE16_HANDLER( gaiden_bgscrolly_w );
+WRITE16_HANDLER( gaiden_flip_w );
diff --git a/src/mame/includes/rocnrope.h b/src/mame/includes/rocnrope.h
new file mode 100644
index 00000000000..9ac0d1840e7
--- /dev/null
+++ b/src/mame/includes/rocnrope.h
@@ -0,0 +1,26 @@
+
+
+typedef struct _rocnrope_state rocnrope_state;
+struct _rocnrope_state
+{
+ /* memory pointers */
+ UINT8 * videoram;
+ UINT8 * colorram;
+ UINT8 * spriteram;
+ UINT8 * spriteram2;
+ size_t spriteram_size;
+
+ /* video-related */
+ tilemap *bg_tilemap;
+};
+
+
+/*----------- defined in video/rocnrope.c -----------*/
+
+WRITE8_HANDLER( rocnrope_videoram_w );
+WRITE8_HANDLER( rocnrope_colorram_w );
+WRITE8_HANDLER( rocnrope_flipscreen_w );
+
+PALETTE_INIT( rocnrope );
+VIDEO_START( rocnrope );
+VIDEO_UPDATE( rocnrope );
diff --git a/src/mame/video/dkong.c b/src/mame/video/dkong.c
index 13d9a5a4d75..c0c89188b27 100644
--- a/src/mame/video/dkong.c
+++ b/src/mame/video/dkong.c
@@ -714,8 +714,6 @@ INLINE double CD4049(running_machine *machine, double x)
static void radarscp_step(running_machine *machine, int line_cnt)
{
dkong_state *state = (dkong_state *)machine->driver_data;
- const device_config *dev6h = devtag_get_device(machine, "ls259.6h");
- const device_config *devvp2 = devtag_get_device(machine, "virtual_p2");
/* Condensator is illegible in schematics for TRS2 board.
* TRS1 board states 3.3u.
@@ -744,7 +742,7 @@ static void radarscp_step(running_machine *machine, int line_cnt)
state->sig30Hz = (1-state->sig30Hz);
/* Now mix with SND02 (sound 2) line - on 74ls259, bit2 */
- state->rflip_sig = latch8_bit2_r(dev6h, 0) & state->sig30Hz;
+ state->rflip_sig = latch8_bit2_r(state->dev_6h, 0) & state->sig30Hz;
sig = state->rflip_sig ^ ((line_cnt & 0x80)>>7);
@@ -778,7 +776,7 @@ static void radarscp_step(running_machine *machine, int line_cnt)
*
* Mixed with ANS line (bit 5) from Port B of 8039
*/
- if (state->grid_on && latch8_bit5_r(devvp2, 0))
+ if (state->grid_on && latch8_bit5_r(state->dev_vp2, 0))
{
diff = (0.0 - cv3);
diff = diff - diff*exp(0.0 - (1.0/RC32 * dt) );
diff --git a/src/mame/video/funybubl.c b/src/mame/video/funybubl.c
index 40ff7db281d..2805ac913d6 100644
--- a/src/mame/video/funybubl.c
+++ b/src/mame/video/funybubl.c
@@ -6,24 +6,21 @@ todo - convert to tilemap
#include "driver.h"
-
-UINT8* funybubl_banked_videoram;
-UINT8 *funybubl_paletteram;
+#include "funybubl.h"
WRITE8_HANDLER ( funybubl_paldatawrite )
{
+ funybubl_state *state = (funybubl_state *)space->machine->driver_data;
int colchanged ;
-
UINT32 coldat;
- funybubl_paletteram[offset] = data;
-
+ state->paletteram[offset] = data;
colchanged = offset >> 2;
+ coldat = state->paletteram[colchanged * 4] | (state->paletteram[colchanged * 4 + 1] << 8) |
+ (state->paletteram[colchanged * 4 + 2] << 16) | (state->paletteram[colchanged * 4 + 3] << 24);
- coldat = funybubl_paletteram[colchanged*4] | (funybubl_paletteram[colchanged*4+1] << 8) | (funybubl_paletteram[colchanged*4+2] << 16) | (funybubl_paletteram[colchanged*4+3] << 24);
-
- palette_set_color_rgb(space->machine,colchanged,pal6bit(coldat >> 12),pal6bit(coldat >> 0),pal6bit(coldat >> 6));
+ palette_set_color_rgb(space->machine, colchanged, pal6bit(coldat >> 12), pal6bit(coldat >> 0), pal6bit(coldat >> 6));
}
@@ -31,15 +28,13 @@ VIDEO_START(funybubl)
{
}
-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 )
{
-
-
- UINT8 *source = &funybubl_banked_videoram[0x2000-0x20];
+ funybubl_state *state = (funybubl_state *)machine->driver_data;
+ UINT8 *source = &state->banked_vram[0x2000 - 0x20];
UINT8 *finish = source - 0x1000;
-
- while( source>finish )
+ while (source > finish)
{
int xpos, ypos, tile;
@@ -50,11 +45,11 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
*/
/*
- ypos = 0xff-source[1+0x10];
- xpos = source[2+0x10];
- tile = source[0+0x10] | ( (source[3+0x10] & 0x0f) <<8);
- if (source[3+0x10] & 0x80) tile += 0x1000;
- if (source[3+0x10] & 0x20) xpos += 0x100;
+ ypos = 0xff - source[1 + 0x10];
+ xpos = source[2 + 0x10];
+ tile = source[0 + 0x10] | ( (source[3 + 0x10] & 0x0f) <<8);
+ if (source[3 + 0x10] & 0x80) tile += 0x1000;
+ if (source[3 + 0x10] & 0x20) xpos += 0x100;
// bits 0x40 (not used?) and 0x10 (just set during transition period of x co-ord 0xff and 0x00) ...
xpos -= 8;
ypos -= 14;
@@ -62,28 +57,30 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
*/
ypos = source[2];
xpos = source[3];
- tile = source[0] | ( (source[1] & 0x0f) <<8);
+ tile = source[0] | ( (source[1] & 0x0f) << 8);
if (source[1] & 0x80) tile += 0x1000;
- if (source[1] & 0x20) { if (xpos < 0xe0) xpos += 0x100; }
- // bits 0x40 and 0x10 not used?...
+ if (source[1] & 0x20)
+ {
+ if (xpos < 0xe0)
+ xpos += 0x100;
+ }
- drawgfx_transpen(bitmap,cliprect,machine->gfx[1],tile,0,0,0,xpos,ypos,255);
+ // bits 0x40 and 0x10 not used?...
+ drawgfx_transpen(bitmap, cliprect, machine->gfx[1], tile, 0, 0, 0, xpos, ypos, 255);
source -= 0x20;
}
-
}
VIDEO_UPDATE(funybubl)
{
- int x,y, offs;
-
+ funybubl_state *state = (funybubl_state *)screen->machine->driver_data;
+ int x, y, offs;
offs = 0;
bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine));
-
/* tilemap .. convert it .. banking makes it slightly more annoying but still easy */
for (y = 0; y < 32; y++)
{
@@ -91,23 +88,23 @@ VIDEO_UPDATE(funybubl)
{
int data;
- data = funybubl_banked_videoram[offs] | (funybubl_banked_videoram[offs+1] << 8);
- drawgfx_transpen(bitmap,cliprect,screen->machine->gfx[0],data&0x7fff,(data&0x8000)?2:1,0,0,x*8,y*8,0);
- offs+=2;
+ data = state->banked_vram[offs] | (state->banked_vram[offs + 1] << 8);
+ drawgfx_transpen(bitmap, cliprect, screen->machine->gfx[0], data & 0x7fff, (data & 0x8000) ? 2 : 1, 0, 0, x*8, y*8, 0);
+ offs += 2;
}
}
- draw_sprites(screen->machine,bitmap,cliprect);
+ draw_sprites(screen->machine, bitmap, cliprect);
#if 0
if ( input_code_pressed_once(screen->machine, KEYCODE_W) )
{
FILE *fp;
- fp=fopen("funnybubsprites", "w+b");
+ fp = fopen("funnybubsprites", "w+b");
if (fp)
{
- fwrite(&funybubl_banked_videoram[0x1000], 0x1000, 1, fp);
+ fwrite(&state->banked_vram[0x1000], 0x1000, 1, fp);
fclose(fp);
}
}
diff --git a/src/mame/video/fuukifg2.c b/src/mame/video/fuukifg2.c
index 88471edf632..c2bff3e32be 100644
--- a/src/mame/video/fuukifg2.c
+++ b/src/mame/video/fuukifg2.c
@@ -25,13 +25,7 @@
***************************************************************************/
#include "driver.h"
-
-/* Variables that driver has access to: */
-
-UINT16 *fuuki16_vram_0, *fuuki16_vram_1;
-UINT16 *fuuki16_vram_2, *fuuki16_vram_3;
-UINT16 *fuuki16_vregs, *fuuki16_priority, *fuuki16_unknown;
-
+#include "fuukifg2.h"
/***************************************************************************
@@ -52,19 +46,19 @@ UINT16 *fuuki16_vregs, *fuuki16_priority, *fuuki16_unknown;
#define LAYER( _N_ ) \
\
-static tilemap *tilemap_##_N_; \
-\
static TILE_GET_INFO( get_tile_info_##_N_ ) \
{ \
- UINT16 code = fuuki16_vram_##_N_[ 2 * tile_index + 0 ]; \
- UINT16 attr = fuuki16_vram_##_N_[ 2 * tile_index + 1 ]; \
- SET_TILE_INFO(1 + _N_, code, attr & 0x3f,TILE_FLIPYX( (attr >> 6) & 3 )); \
+ fuuki16_state *state = (fuuki16_state *)machine->driver_data; \
+ UINT16 code = state->vram_##_N_[2 * tile_index + 0]; \
+ UINT16 attr = state->vram_##_N_[2 * tile_index + 1]; \
+ SET_TILE_INFO(1 + _N_, code, attr & 0x3f, TILE_FLIPYX((attr >> 6) & 3)); \
} \
\
WRITE16_HANDLER( fuuki16_vram_##_N_##_w ) \
{ \
- COMBINE_DATA(&fuuki16_vram_##_N_[offset]); \
- tilemap_mark_tile_dirty(tilemap_##_N_,offset/2); \
+ fuuki16_state *state = (fuuki16_state *)space->machine->driver_data; \
+ COMBINE_DATA(&state->vram_##_N_[offset]); \
+ tilemap_mark_tile_dirty(state->tilemap_##_N_, offset / 2); \
}
LAYER( 0 )
@@ -96,24 +90,18 @@ PALETTE_INIT( fuuki16 )
VIDEO_START( fuuki16 )
{
- tilemap_0 = tilemap_create( machine, get_tile_info_0, tilemap_scan_rows,
- 16, 16, 64,32);
-
- tilemap_1 = tilemap_create( machine, get_tile_info_1, tilemap_scan_rows,
- 16, 16, 64,32);
-
- tilemap_2 = tilemap_create( machine, get_tile_info_2, tilemap_scan_rows,
- 8, 8, 64,32);
-
- tilemap_3 = tilemap_create( machine, get_tile_info_3, tilemap_scan_rows,
- 8, 8, 64,32);
-
- tilemap_set_transparent_pen(tilemap_0,0x0f); // 4 bits
- tilemap_set_transparent_pen(tilemap_1,0xff); // 8 bits
- tilemap_set_transparent_pen(tilemap_2,0x0f); // 4 bits
- tilemap_set_transparent_pen(tilemap_3,0x0f); // 4 bits
-
- machine->gfx[2]->color_granularity=16; /* 256 colour tiles with palette selectable on 16 colour boundaries */
+ fuuki16_state *state = (fuuki16_state *)machine->driver_data;
+ state->tilemap_0 = tilemap_create(machine, get_tile_info_0, tilemap_scan_rows, 16, 16, 64, 32);
+ state->tilemap_1 = tilemap_create(machine, get_tile_info_1, tilemap_scan_rows, 16, 16, 64, 32);
+ state->tilemap_2 = tilemap_create(machine, get_tile_info_2, tilemap_scan_rows, 8, 8, 64, 32);
+ state->tilemap_3 = tilemap_create(machine, get_tile_info_3, tilemap_scan_rows, 8, 8, 64, 32);
+
+ tilemap_set_transparent_pen(state->tilemap_0, 0x0f); // 4 bits
+ tilemap_set_transparent_pen(state->tilemap_1, 0xff); // 8 bits
+ tilemap_set_transparent_pen(state->tilemap_2, 0x0f); // 4 bits
+ tilemap_set_transparent_pen(state->tilemap_3, 0x0f); // 4 bits
+
+ machine->gfx[2]->color_granularity = 16; /* 256 colour tiles with palette selectable on 16 colour boundaries */
}
@@ -144,44 +132,46 @@ VIDEO_START( fuuki16 )
***************************************************************************/
-static void draw_sprites(const device_config *screen, bitmap_t *bitmap, const rectangle *cliprect)
+static void draw_sprites( const device_config *screen, bitmap_t *bitmap, const rectangle *cliprect )
{
+ fuuki16_state *state = (fuuki16_state *)screen->machine->driver_data;
int offs;
const gfx_element *gfx = screen->machine->gfx[0];
bitmap_t *priority_bitmap = screen->machine->priority_bitmap;
const rectangle *visarea = video_screen_get_visible_area(screen);
- UINT16 *spriteram16 = screen->machine->generic.spriteram.u16;
- int max_x = visarea->max_x+1;
- int max_y = visarea->max_y+1;
+ UINT16 *spriteram16 = state->spriteram;
+ int max_x = visarea->max_x + 1;
+ int max_y = visarea->max_y + 1;
/* Draw them backwards, for pdrawgfx */
- for ( offs = (screen->machine->generic.spriteram_size-8)/2; offs >=0; offs -= 8/2 )
+ for ( offs = (state->spriteram_size - 8) / 2; offs >=0; offs -= 8 / 2 )
{
int x, y, xstart, ystart, xend, yend, xinc, yinc;
int xnum, ynum, xzoom, yzoom, flipx, flipy;
int pri_mask;
- int sx = spriteram16[offs + 0];
- int sy = spriteram16[offs + 1];
- int attr = spriteram16[offs + 2];
- int code = spriteram16[offs + 3];
+ int sx = spriteram16[offs + 0];
+ int sy = spriteram16[offs + 1];
+ int attr = spriteram16[offs + 2];
+ int code = spriteram16[offs + 3];
- if (sx & 0x400) continue;
+ if (sx & 0x400)
+ continue;
- flipx = sx & 0x0800;
- flipy = sy & 0x0800;
+ flipx = sx & 0x0800;
+ flipy = sy & 0x0800;
- xnum = ((sx >> 12) & 0xf) + 1;
- ynum = ((sy >> 12) & 0xf) + 1;
+ xnum = ((sx >> 12) & 0xf) + 1;
+ ynum = ((sy >> 12) & 0xf) + 1;
- xzoom = 16*8 - (8 * ((attr >> 12) & 0xf))/2;
- yzoom = 16*8 - (8 * ((attr >> 8) & 0xf))/2;
+ xzoom = 16 * 8 - (8 * ((attr >> 12) & 0xf)) / 2;
+ yzoom = 16 * 8 - (8 * ((attr >> 8) & 0xf)) / 2;
- switch( (attr >> 6) & 3 )
+ switch ((attr >> 6) & 3)
{
- case 3: pri_mask = 0xf0|0xcc|0xaa; break; // behind all layers
- case 2: pri_mask = 0xf0|0xcc; break; // behind fg + middle layer
- case 1: pri_mask = 0xf0; break; // behind fg layer
+ case 3: pri_mask = 0xf0 | 0xcc | 0xaa; break; // behind all layers
+ case 2: pri_mask = 0xf0 | 0xcc; break; // behind fg + middle layer
+ case 1: pri_mask = 0xf0; break; // behind fg layer
case 0:
default: pri_mask = 0; // above all
}
@@ -190,8 +180,10 @@ static void draw_sprites(const device_config *screen, bitmap_t *bitmap, const re
sy = (sy & 0x1ff) - (sy & 0x200);
if (flip_screen_get(screen->machine))
- { flipx = !flipx; sx = max_x - sx - xnum * 16;
- flipy = !flipy; sy = max_y - sy - ynum * 16; }
+ {
+ flipx = !flipx; sx = max_x - sx - xnum * 16;
+ flipy = !flipy; sy = max_y - sy - ynum * 16;
+ }
if (flipx) { xstart = xnum-1; xend = -1; xinc = -1; }
else { xstart = 0; xend = xnum; xinc = +1; }
@@ -204,7 +196,7 @@ static void draw_sprites(const device_config *screen, bitmap_t *bitmap, const re
for (x = xstart; x != xend; x += xinc)
{
if (xzoom == (16*8) && yzoom == (16*8))
- pdrawgfx_transpen( bitmap,cliprect,gfx,
+ pdrawgfx_transpen(bitmap,cliprect,gfx,
code++,
attr & 0x3f,
flipx, flipy,
@@ -212,7 +204,7 @@ static void draw_sprites(const device_config *screen, bitmap_t *bitmap, const re
priority_bitmap,
pri_mask,15 );
else
- pdrawgfxzoom_transpen( bitmap,cliprect,gfx,
+ pdrawgfxzoom_transpen(bitmap,cliprect,gfx,
code++,
attr & 0x3f,
flipx, flipy,
@@ -270,35 +262,35 @@ if (input_code_pressed(screen->machine, KEYCODE_X))
***************************************************************************/
/* Wrapper to handle bg and bg2 ttogether */
-static void fuuki16_draw_layer(bitmap_t *bitmap, const rectangle *cliprect, int i, int flag, int pri)
+static void fuuki16_draw_layer( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect, int i, int flag, int pri )
{
- int buffer = (fuuki16_vregs[0x1e/2] & 0x40);
+ fuuki16_state *state = (fuuki16_state *)machine->driver_data;
+ int buffer = (state->vregs[0x1e / 2] & 0x40);
switch( i )
{
- case 2: if (buffer) tilemap_draw(bitmap,cliprect,tilemap_3,flag,pri);
- else tilemap_draw(bitmap,cliprect,tilemap_2,flag,pri);
+ case 2: if (buffer) tilemap_draw(bitmap, cliprect, state->tilemap_3, flag, pri);
+ else tilemap_draw(bitmap, cliprect, state->tilemap_2, flag, pri);
return;
- case 1: tilemap_draw(bitmap,cliprect,tilemap_1,flag,pri);
+ case 1: tilemap_draw(bitmap, cliprect, state->tilemap_1, flag, pri);
return;
- case 0: tilemap_draw(bitmap,cliprect,tilemap_0,flag,pri);
+ case 0: tilemap_draw(bitmap, cliprect, state->tilemap_0, flag, pri);
return;
}
}
VIDEO_UPDATE( fuuki16 )
{
+ fuuki16_state *state = (fuuki16_state *)screen->machine->driver_data;
UINT16 layer0_scrollx, layer0_scrolly;
UINT16 layer1_scrollx, layer1_scrolly;
UINT16 layer2_scrollx, layer2_scrolly;
- UINT16 scrollx_offs, scrolly_offs;
+ UINT16 scrollx_offs, scrolly_offs;
/*
It's not independant bits causing layers to switch, that wouldn't make sense with 3 bits.
See fuukifg3 for more justification
*/
-
- int tm_back, tm_middle, tm_front;
static const int pri_table[6][3] = {
{ 0, 1, 2 },
{ 0, 2, 1 },
@@ -307,47 +299,47 @@ VIDEO_UPDATE( fuuki16 )
{ 2, 0, 1 },
{ 2, 1, 0 }};
- tm_front = pri_table[ fuuki16_priority[0] & 0x0f ][0];
- tm_middle = pri_table[ fuuki16_priority[0] & 0x0f ][1];
- tm_back = pri_table[ fuuki16_priority[0] & 0x0f ][2];
+ int tm_front = pri_table[state->priority[0] & 0x0f][0];
+ int tm_middle = pri_table[state->priority[0] & 0x0f][1];
+ int tm_back = pri_table[state->priority[0] & 0x0f][2];
- flip_screen_set(screen->machine, fuuki16_vregs[0x1e/2] & 1);
+ flip_screen_set(screen->machine, state->vregs[0x1e / 2] & 1);
/* Layers scrolling */
- scrolly_offs = fuuki16_vregs[0xc/2] - (flip_screen_get(screen->machine) ? 0x103 : 0x1f3);
- scrollx_offs = fuuki16_vregs[0xe/2] - (flip_screen_get(screen->machine) ? 0x2a7 : 0x3f6);
+ scrolly_offs = state->vregs[0xc / 2] - (flip_screen_get(screen->machine) ? 0x103 : 0x1f3);
+ scrollx_offs = state->vregs[0xe / 2] - (flip_screen_get(screen->machine) ? 0x2a7 : 0x3f6);
- layer0_scrolly = fuuki16_vregs[0x0/2] + scrolly_offs;
- layer0_scrollx = fuuki16_vregs[0x2/2] + scrollx_offs;
- layer1_scrolly = fuuki16_vregs[0x4/2] + scrolly_offs;
- layer1_scrollx = fuuki16_vregs[0x6/2] + scrollx_offs;
+ layer0_scrolly = state->vregs[0x0 / 2] + scrolly_offs;
+ layer0_scrollx = state->vregs[0x2 / 2] + scrollx_offs;
+ layer1_scrolly = state->vregs[0x4 / 2] + scrolly_offs;
+ layer1_scrollx = state->vregs[0x6 / 2] + scrollx_offs;
- layer2_scrolly = fuuki16_vregs[0x8/2];
- layer2_scrollx = fuuki16_vregs[0xa/2];
+ layer2_scrolly = state->vregs[0x8 / 2];
+ layer2_scrollx = state->vregs[0xa / 2];
- tilemap_set_scrollx(tilemap_0, 0, layer0_scrollx);
- tilemap_set_scrolly(tilemap_0, 0, layer0_scrolly);
- tilemap_set_scrollx(tilemap_1, 0, layer1_scrollx);
- tilemap_set_scrolly(tilemap_1, 0, layer1_scrolly);
+ tilemap_set_scrollx(state->tilemap_0, 0, layer0_scrollx);
+ tilemap_set_scrolly(state->tilemap_0, 0, layer0_scrolly);
+ tilemap_set_scrollx(state->tilemap_1, 0, layer1_scrollx);
+ tilemap_set_scrolly(state->tilemap_1, 0, layer1_scrolly);
- tilemap_set_scrollx(tilemap_2, 0, layer2_scrollx + 0x10);
- tilemap_set_scrolly(tilemap_2, 0, layer2_scrolly /*+ 0x02*/);
- tilemap_set_scrollx(tilemap_3, 0, layer2_scrollx + 0x10);
- tilemap_set_scrolly(tilemap_3, 0, layer2_scrolly /*+ 0x02*/);
+ tilemap_set_scrollx(state->tilemap_2, 0, layer2_scrollx + 0x10);
+ tilemap_set_scrolly(state->tilemap_2, 0, layer2_scrolly /*+ 0x02*/);
+ tilemap_set_scrollx(state->tilemap_3, 0, layer2_scrollx + 0x10);
+ tilemap_set_scrolly(state->tilemap_3, 0, layer2_scrolly /*+ 0x02*/);
/* The backmost tilemap decides the background color(s) but sprites can
go below the opaque pixels of that tilemap. We thus need to mark the
transparent pixels of this layer with a different priority value */
-// fuuki16_draw_layer(bitmap,cliprect, tm_back, TILEMAP_DRAW_OPAQUE, 0);
+// fuuki16_draw_layer(screen->machine, bitmap, cliprect, tm_back, TILEMAP_DRAW_OPAQUE, 0);
/* Actually, bg colour is simply the last pen i.e. 0x1fff -pjp */
- bitmap_fill(bitmap,cliprect,(0x800*4)-1);
- bitmap_fill(screen->machine->priority_bitmap,cliprect,0);
+ bitmap_fill(bitmap, cliprect, (0x800 * 4) - 1);
+ bitmap_fill(screen->machine->priority_bitmap, cliprect, 0);
- fuuki16_draw_layer(bitmap,cliprect, tm_back, 0, 1);
- fuuki16_draw_layer(bitmap,cliprect, tm_middle, 0, 2);
- fuuki16_draw_layer(bitmap,cliprect, tm_front, 0, 4);
+ fuuki16_draw_layer(screen->machine, bitmap, cliprect, tm_back, 0, 1);
+ fuuki16_draw_layer(screen->machine, bitmap, cliprect, tm_middle, 0, 2);
+ fuuki16_draw_layer(screen->machine, bitmap, cliprect, tm_front, 0, 4);
draw_sprites(screen, bitmap, cliprect);
diff --git a/src/mame/video/fuukifg3.c b/src/mame/video/fuukifg3.c
index c364a939aac..25f41a80db6 100644
--- a/src/mame/video/fuukifg3.c
+++ b/src/mame/video/fuukifg3.c
@@ -28,14 +28,7 @@
***************************************************************************/
#include "driver.h"
-
-/* Variables that driver has access to: */
-
-UINT32 *fuuki32_vram_0, *fuuki32_vram_1;
-UINT32 *fuuki32_vram_2, *fuuki32_vram_3;
-UINT32 *fuuki32_vregs, *fuuki32_priority, *fuuki32_tilebank;
-
-static UINT32 spr_buffered_tilebank[2];
+#include "fuukifg3.h"
/***************************************************************************
@@ -57,36 +50,36 @@ static UINT32 spr_buffered_tilebank[2];
#define LAYER_8BPP( _N_ ) \
\
-static tilemap *tilemap_##_N_; \
-\
static TILE_GET_INFO( get_tile_info_##_N_ ) \
{ \
- UINT16 code = (fuuki32_vram_##_N_[tile_index]&0xffff0000)>>16; \
- UINT16 attr = (fuuki32_vram_##_N_[tile_index]&0x0000ffff); \
- SET_TILE_INFO(1 + _N_, code, (attr & 0x3f)>>4,TILE_FLIPYX( (attr >> 6) & 3 )); \
+ fuuki32_state *state = (fuuki32_state *)machine->driver_data; \
+ UINT16 code = (state->vram_##_N_[tile_index] & 0xffff0000) >> 16; \
+ UINT16 attr = (state->vram_##_N_[tile_index] & 0x0000ffff); \
+ SET_TILE_INFO(1 + _N_, code, (attr & 0x3f) >> 4, TILE_FLIPYX((attr >> 6) & 3)); \
} \
\
WRITE32_HANDLER( fuuki32_vram_##_N_##_w ) \
{ \
- COMBINE_DATA(&fuuki32_vram_##_N_[offset]); \
- tilemap_mark_tile_dirty(tilemap_##_N_,offset); \
+ fuuki32_state *state = (fuuki32_state *)space->machine->driver_data; \
+ COMBINE_DATA(&state->vram_##_N_[offset]); \
+ tilemap_mark_tile_dirty(state->tilemap_##_N_,offset); \
}
#define LAYER_4BPP( _N_ ) \
\
-static tilemap *tilemap_##_N_; \
-\
static TILE_GET_INFO( get_tile_info_##_N_ ) \
{ \
- UINT16 code = (fuuki32_vram_##_N_[tile_index]&0xffff0000)>>16; \
- UINT16 attr = (fuuki32_vram_##_N_[tile_index]&0x0000ffff); \
- SET_TILE_INFO(1 + _N_, code, attr & 0x3f,TILE_FLIPYX( (attr >> 6) & 3 )); \
+ fuuki32_state *state = (fuuki32_state *)machine->driver_data; \
+ UINT16 code = (state->vram_##_N_[tile_index] & 0xffff0000) >> 16; \
+ UINT16 attr = (state->vram_##_N_[tile_index] & 0x0000ffff); \
+ SET_TILE_INFO(1 + _N_, code, attr & 0x3f, TILE_FLIPYX((attr >> 6) & 3)); \
} \
\
WRITE32_HANDLER( fuuki32_vram_##_N_##_w ) \
{ \
- COMBINE_DATA(&fuuki32_vram_##_N_[offset]); \
- tilemap_mark_tile_dirty(tilemap_##_N_,offset); \
+ fuuki32_state *state = (fuuki32_state *)space->machine->driver_data; \
+ COMBINE_DATA(&state->vram_##_N_[offset]); \
+ tilemap_mark_tile_dirty(state->tilemap_##_N_, offset); \
}
@@ -106,28 +99,25 @@ LAYER_4BPP( 3 )
VIDEO_START( fuuki32 )
{
- machine->generic.buffered_spriteram.u32 = auto_alloc_array(machine, UINT32, machine->generic.spriteram_size/4);
- machine->generic.buffered_spriteram2.u32 = auto_alloc_array(machine, UINT32, machine->generic.spriteram_size/4);
-
- tilemap_0 = tilemap_create( machine, get_tile_info_0, tilemap_scan_rows,
- 16, 16, 64,32);
+ fuuki32_state *state = (fuuki32_state *)machine->driver_data;
+ state->buf_spriteram = auto_alloc_array(machine, UINT32, state->spriteram_size / 4);
+ state->buf_spriteram2 = auto_alloc_array(machine, UINT32, state->spriteram_size / 4);
- tilemap_1 = tilemap_create( machine, get_tile_info_1, tilemap_scan_rows,
- 16, 16, 64,32);
+ state_save_register_global_pointer(machine, state->buf_spriteram, state->spriteram_size / 4);
+ state_save_register_global_pointer(machine, state->buf_spriteram2, state->spriteram_size / 4);
- tilemap_2 = tilemap_create( machine, get_tile_info_2, tilemap_scan_rows,
- 8, 8, 64,32);
+ state->tilemap_0 = tilemap_create(machine, get_tile_info_0, tilemap_scan_rows, 16, 16, 64, 32);
+ state->tilemap_1 = tilemap_create(machine, get_tile_info_1, tilemap_scan_rows, 16, 16, 64, 32);
+ state->tilemap_2 = tilemap_create(machine, get_tile_info_2, tilemap_scan_rows, 8, 8, 64, 32);
+ state->tilemap_3 = tilemap_create(machine, get_tile_info_3, tilemap_scan_rows, 8, 8, 64, 32);
- tilemap_3 = tilemap_create( machine, get_tile_info_3, tilemap_scan_rows,
- 8, 8, 64,32);
+ tilemap_set_transparent_pen(state->tilemap_0, 0xff); // 8 bits
+ tilemap_set_transparent_pen(state->tilemap_1, 0xff); // 8 bits
+ tilemap_set_transparent_pen(state->tilemap_2, 0x0f); // 4 bits
+ tilemap_set_transparent_pen(state->tilemap_3, 0x0f); // 4 bits
- tilemap_set_transparent_pen(tilemap_0,0xff); // 8 bits
- tilemap_set_transparent_pen(tilemap_1,0xff); // 8 bits
- tilemap_set_transparent_pen(tilemap_2,0x0f); // 4 bits
- tilemap_set_transparent_pen(tilemap_3,0x0f); // 4 bits
-
- //machine->gfx[1]->color_granularity=16; /* 256 colour tiles with palette selectable on 16 colour boundaries */
- //machine->gfx[2]->color_granularity=16;
+ //machine->gfx[1]->color_granularity = 16; /* 256 colour tiles with palette selectable on 16 colour boundaries */
+ //machine->gfx[2]->color_granularity = 16;
}
@@ -159,52 +149,54 @@ VIDEO_START( fuuki32 )
***************************************************************************/
-static void draw_sprites(const device_config *screen, bitmap_t *bitmap, const rectangle *cliprect)
+static void draw_sprites( const device_config *screen, bitmap_t *bitmap, const rectangle *cliprect )
{
+ fuuki32_state *state = (fuuki32_state *)screen->machine->driver_data;
int offs;
const gfx_element *gfx = screen->machine->gfx[0];
bitmap_t *priority_bitmap = screen->machine->priority_bitmap;
const rectangle *visarea = video_screen_get_visible_area(screen);
- int max_x = visarea->max_x+1;
- int max_y = visarea->max_y+1;
+ int max_x = visarea->max_x + 1;
+ int max_y = visarea->max_y + 1;
- UINT32 *src = screen->machine->generic.buffered_spriteram2.u32; /* Use spriteram buffered by 2 frames, need palette buffered by one frame? */
+ UINT32 *src = state->buf_spriteram2; /* Use spriteram buffered by 2 frames, need palette buffered by one frame? */
/* Draw them backwards, for pdrawgfx */
- for ( offs = (screen->machine->generic.spriteram_size-8)/4; offs >=0; offs -= 8/4 )
+ for (offs = (state->spriteram_size - 8) / 4; offs >= 0; offs -= 8/4)
{
int x, y, xstart, ystart, xend, yend, xinc, yinc;
int xnum, ynum, xzoom, yzoom, flipx, flipy;
int pri_mask;
- int sx = (src[offs + 0]& 0xffff0000)>>16;
- int sy = (src[offs + 0]& 0x0000ffff);
- int attr = (src[offs + 1]& 0xffff0000)>>16;
- int code = (src[offs + 1]& 0x0000ffff);
+ int sx = (src[offs + 0]& 0xffff0000) >> 16;
+ int sy = (src[offs + 0]& 0x0000ffff);
+ int attr = (src[offs + 1]& 0xffff0000) >> 16;
+ int code = (src[offs + 1]& 0x0000ffff);
int bank = (code & 0xc000) >> 14;
int bank_lookedup;
- bank_lookedup = ((spr_buffered_tilebank[1] & 0xffff0000)>>(16+bank*4))&0xf;
+ bank_lookedup = ((state->spr_buffered_tilebank[1] & 0xffff0000) >> (16 + bank * 4)) & 0xf;
code &= 0x3fff;
code += bank_lookedup * 0x4000;
- if (sx & 0x400) continue;
+ if (sx & 0x400)
+ continue;
- flipx = sx & 0x0800;
- flipy = sy & 0x0800;
+ flipx = sx & 0x0800;
+ flipy = sy & 0x0800;
- xnum = ((sx >> 12) & 0xf) + 1;
- ynum = ((sy >> 12) & 0xf) + 1;
+ xnum = ((sx >> 12) & 0xf) + 1;
+ ynum = ((sy >> 12) & 0xf) + 1;
- xzoom = 16*8 - (8 * ((attr >> 12) & 0xf))/2;
- yzoom = 16*8 - (8 * ((attr >> 8) & 0xf))/2;
+ xzoom = 16 * 8 - (8 * ((attr >> 12) & 0xf)) / 2;
+ yzoom = 16 * 8 - (8 * ((attr >> 8) & 0xf)) / 2;
switch( (attr >> 6) & 3 )
{
- case 3: pri_mask = 0xf0|0xcc|0xaa; break; // behind all layers
- case 2: pri_mask = 0xf0|0xcc; break; // behind fg + middle layer
- case 1: pri_mask = 0xf0; break; // behind fg layer
+ case 3: pri_mask = 0xf0 | 0xcc | 0xaa; break; // behind all layers
+ case 2: pri_mask = 0xf0 | 0xcc; break; // behind fg + middle layer
+ case 1: pri_mask = 0xf0; break; // behind fg layer
case 0:
default: pri_mask = 0; // above all
}
@@ -213,8 +205,10 @@ static void draw_sprites(const device_config *screen, bitmap_t *bitmap, const re
sy = (sy & 0x1ff) - (sy & 0x200);
if (flip_screen_get(screen->machine))
- { flipx = !flipx; sx = max_x - sx - xnum * 16;
- flipy = !flipy; sy = max_y - sy - ynum * 16; }
+ {
+ flipx = !flipx; sx = max_x - sx - xnum * 16;
+ flipy = !flipy; sy = max_y - sy - ynum * 16;
+ }
if (flipx) { xstart = xnum-1; xend = -1; xinc = -1; }
else { xstart = 0; xend = xnum; xinc = +1; }
@@ -235,7 +229,7 @@ static void draw_sprites(const device_config *screen, bitmap_t *bitmap, const re
for (x = xstart; x != xend; x += xinc)
{
if (xzoom == (16*8) && yzoom == (16*8))
- pdrawgfx_transpen( bitmap,cliprect,gfx,
+ pdrawgfx_transpen(bitmap,cliprect,gfx,
code++,
attr & 0x3f,
flipx, flipy,
@@ -243,7 +237,7 @@ static void draw_sprites(const device_config *screen, bitmap_t *bitmap, const re
priority_bitmap,
pri_mask,15 );
else
- pdrawgfxzoom_transpen( bitmap,cliprect,gfx,
+ pdrawgfxzoom_transpen(bitmap,cliprect,gfx,
code++,
attr & 0x3f,
flipx, flipy,
@@ -301,24 +295,26 @@ if (input_code_pressed(screen->machine, KEYCODE_X))
***************************************************************************/
/* Wrapper to handle bg and bg2 ttogether */
-static void fuuki32_draw_layer(bitmap_t *bitmap, const rectangle *cliprect, int i, int flag, int pri)
+static void fuuki32_draw_layer( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect, int i, int flag, int pri )
{
- int buffer = ((fuuki32_vregs[0x1e/4]&0x0000ffff) & 0x40);
+ fuuki32_state *state = (fuuki32_state *)machine->driver_data;
+ int buffer = ((state->vregs[0x1e / 4] & 0x0000ffff) & 0x40);
switch( i )
{
- case 2: if (buffer) tilemap_draw(bitmap,cliprect,tilemap_3,flag,pri);
- else tilemap_draw(bitmap,cliprect,tilemap_2,flag,pri);
+ case 2: if (buffer) tilemap_draw(bitmap, cliprect, state->tilemap_3, flag, pri);
+ else tilemap_draw(bitmap, cliprect, state->tilemap_2, flag, pri);
return;
- case 1: tilemap_draw(bitmap,cliprect,tilemap_1,flag,pri);
+ case 1: tilemap_draw(bitmap, cliprect, state->tilemap_1, flag, pri);
return;
- case 0: tilemap_draw(bitmap,cliprect,tilemap_0,flag,pri);
+ case 0: tilemap_draw(bitmap, cliprect, state->tilemap_0, flag, pri);
return;
}
}
VIDEO_UPDATE( fuuki32 )
{
+ fuuki32_state *state = (fuuki32_state *)screen->machine->driver_data;
UINT16 layer0_scrollx, layer0_scrolly;
UINT16 layer1_scrollx, layer1_scrolly;
UINT16 layer2_scrollx, layer2_scrolly;
@@ -328,7 +324,6 @@ VIDEO_UPDATE( fuuki32 )
It's not independant bits causing layers to switch, that wouldn't make sense with 3 bits.
*/
- int tm_back, tm_middle, tm_front;
static const int pri_table[6][3] = {
{ 0, 1, 2 }, // Special moves 0>1, 0>2 (0,1,2 or 0,2,1)
{ 0, 2, 1 }, // Two Levels - 0>1 (0,1,2 or 0,2,1 or 2,0,1)
@@ -337,53 +332,54 @@ VIDEO_UPDATE( fuuki32 )
{ 2, 0, 1 }, // Title etc. - 0>1 (0,1,2 or 0,2,1 or 2,0,1)
{ 2, 1, 0 }}; // Char Select, prison stage 1>0 (leaves 1,2,0 or 2,1,0)
- tm_front = pri_table[ (fuuki32_priority[0]>>16) & 0x0f ][0];
- tm_middle = pri_table[ (fuuki32_priority[0]>>16) & 0x0f ][1];
- tm_back = pri_table[ (fuuki32_priority[0]>>16) & 0x0f ][2];
+ int tm_front = pri_table[(state->priority[0] >> 16) & 0x0f][0];
+ int tm_middle = pri_table[(state->priority[0] >> 16) & 0x0f][1];
+ int tm_back = pri_table[(state->priority[0] >> 16) & 0x0f][2];
- flip_screen_set(screen->machine, (fuuki32_vregs[0x1e/4]&0x0000ffff) & 1);
+ flip_screen_set(screen->machine, (state->vregs[0x1e / 4] & 0x0000ffff) & 1);
/* Layers scrolling */
- scrolly_offs = ((fuuki32_vregs[0xc/4]&0xffff0000)>>16) - (flip_screen_get(screen->machine) ? 0x103 : 0x1f3);
- scrollx_offs = (fuuki32_vregs[0xc/4]&0x0000ffff) - (flip_screen_get(screen->machine) ? 0x2c7 : 0x3f6);
+ scrolly_offs = ((state->vregs[0xc / 4] & 0xffff0000) >> 16) - (flip_screen_get(screen->machine) ? 0x103 : 0x1f3);
+ scrollx_offs = (state->vregs[0xc / 4] & 0x0000ffff) - (flip_screen_get(screen->machine) ? 0x2c7 : 0x3f6);
- layer0_scrolly = ((fuuki32_vregs[0x0/4]&0xffff0000)>>16) + scrolly_offs;
- layer0_scrollx = ((fuuki32_vregs[0x0/4]&0x0000ffff)) + scrollx_offs;
- layer1_scrolly = ((fuuki32_vregs[0x4/4]&0xffff0000)>>16) + scrolly_offs;
- layer1_scrollx = ((fuuki32_vregs[0x4/4]&0x0000ffff)) + scrollx_offs;
+ layer0_scrolly = ((state->vregs[0x0 / 4] & 0xffff0000) >> 16) + scrolly_offs;
+ layer0_scrollx = ((state->vregs[0x0 / 4] & 0x0000ffff)) + scrollx_offs;
+ layer1_scrolly = ((state->vregs[0x4 / 4] & 0xffff0000) >> 16) + scrolly_offs;
+ layer1_scrollx = ((state->vregs[0x4 / 4] & 0x0000ffff)) + scrollx_offs;
- layer2_scrolly = ((fuuki32_vregs[0x8/4]&0xffff0000)>>16);
- layer2_scrollx = ((fuuki32_vregs[0x8/4]&0x0000ffff));
+ layer2_scrolly = ((state->vregs[0x8 / 4] & 0xffff0000) >> 16);
+ layer2_scrollx = ((state->vregs[0x8 / 4] & 0x0000ffff));
- tilemap_set_scrollx(tilemap_0, 0, layer0_scrollx);
- tilemap_set_scrolly(tilemap_0, 0, layer0_scrolly);
- tilemap_set_scrollx(tilemap_1, 0, layer1_scrollx);
- tilemap_set_scrolly(tilemap_1, 0, layer1_scrolly);
+ tilemap_set_scrollx(state->tilemap_0, 0, layer0_scrollx);
+ tilemap_set_scrolly(state->tilemap_0, 0, layer0_scrolly);
+ tilemap_set_scrollx(state->tilemap_1, 0, layer1_scrollx);
+ tilemap_set_scrolly(state->tilemap_1, 0, layer1_scrolly);
- tilemap_set_scrollx(tilemap_2, 0, layer2_scrollx);
- tilemap_set_scrolly(tilemap_2, 0, layer2_scrolly);
- tilemap_set_scrollx(tilemap_3, 0, layer2_scrollx);
- tilemap_set_scrolly(tilemap_3, 0, layer2_scrolly);
+ tilemap_set_scrollx(state->tilemap_2, 0, layer2_scrollx);
+ tilemap_set_scrolly(state->tilemap_2, 0, layer2_scrolly);
+ tilemap_set_scrollx(state->tilemap_3, 0, layer2_scrollx);
+ tilemap_set_scrolly(state->tilemap_3, 0, layer2_scrolly);
/* The bg colour is the last pen i.e. 0x1fff */
- bitmap_fill(bitmap,cliprect,(0x800*4)-1);
+ bitmap_fill(bitmap, cliprect, (0x800 * 4) - 1);
bitmap_fill(screen->machine->priority_bitmap,cliprect,0);
- fuuki32_draw_layer(bitmap,cliprect, tm_back, 0, 1);
- fuuki32_draw_layer(bitmap,cliprect, tm_middle, 0, 2);
- fuuki32_draw_layer(bitmap,cliprect, tm_front, 0, 4);
+ fuuki32_draw_layer(screen->machine, bitmap, cliprect, tm_back, 0, 1);
+ fuuki32_draw_layer(screen->machine, bitmap, cliprect, tm_middle, 0, 2);
+ fuuki32_draw_layer(screen->machine, bitmap, cliprect, tm_front, 0, 4);
- draw_sprites(screen,bitmap,cliprect);
+ draw_sprites(screen, bitmap, cliprect);
return 0;
}
VIDEO_EOF( fuuki32 )
{
- /* Buffer sprites and tilebank by 2 frames */
+ fuuki32_state *state = (fuuki32_state *)machine->driver_data;
- spr_buffered_tilebank[1] = spr_buffered_tilebank[0];
- spr_buffered_tilebank[0] = fuuki32_tilebank[0];
- memcpy(machine->generic.buffered_spriteram2.u32,machine->generic.buffered_spriteram.u32,machine->generic.spriteram_size);
- memcpy(machine->generic.buffered_spriteram.u32,machine->generic.spriteram.u32,machine->generic.spriteram_size);
+ /* Buffer sprites and tilebank by 2 frames */
+ state->spr_buffered_tilebank[1] = state->spr_buffered_tilebank[0];
+ state->spr_buffered_tilebank[0] = state->tilebank[0];
+ memcpy(state->buf_spriteram2, state->buf_spriteram, state->spriteram_size);
+ memcpy(state->buf_spriteram, state->spriteram, state->spriteram_size);
}
diff --git a/src/mame/video/gaiden.c b/src/mame/video/gaiden.c
index b6f456b69b0..05ad4a82450 100644
--- a/src/mame/video/gaiden.c
+++ b/src/mame/video/gaiden.c
@@ -5,12 +5,7 @@
***************************************************************************/
#include "driver.h"
-
-UINT16 *gaiden_videoram,*gaiden_videoram2,*gaiden_videoram3;
-int gaiden_sprite_sizey;
-
-static tilemap *text_layer,*foreground,*background;
-static bitmap_t *sprite_bitmap, *tile_bitmap_bg, *tile_bitmap_fg;
+#include "gaiden.h"
/***************************************************************************
@@ -20,8 +15,9 @@ static bitmap_t *sprite_bitmap, *tile_bitmap_bg, *tile_bitmap_fg;
static TILE_GET_INFO( get_bg_tile_info )
{
- UINT16 *videoram1 = &gaiden_videoram3[0x0800];
- UINT16 *videoram2 = gaiden_videoram3;
+ gaiden_state *state = (gaiden_state *)machine->driver_data;
+ UINT16 *videoram1 = &state->videoram3[0x0800];
+ UINT16 *videoram2 = state->videoram3;
SET_TILE_INFO(
1,
videoram1[tile_index] & 0x0fff,
@@ -31,8 +27,9 @@ static TILE_GET_INFO( get_bg_tile_info )
static TILE_GET_INFO( get_fg_tile_info )
{
- UINT16 *videoram1 = &gaiden_videoram2[0x0800];
- UINT16 *videoram2 = gaiden_videoram2;
+ gaiden_state *state = (gaiden_state *)machine->driver_data;
+ UINT16 *videoram1 = &state->videoram2[0x0800];
+ UINT16 *videoram2 = state->videoram2;
SET_TILE_INFO(
2,
videoram1[tile_index] & 0x0fff,
@@ -42,8 +39,9 @@ static TILE_GET_INFO( get_fg_tile_info )
static TILE_GET_INFO( get_fg_tile_info_raiga )
{
- UINT16 *videoram1 = &gaiden_videoram2[0x0800];
- UINT16 *videoram2 = gaiden_videoram2;
+ gaiden_state *state = (gaiden_state *)machine->driver_data;
+ UINT16 *videoram1 = &state->videoram2[0x0800];
+ UINT16 *videoram2 = state->videoram2;
/* bit 3 controls blending */
tileinfo->category = (videoram2[tile_index] & 0x08) >> 3;
@@ -57,8 +55,9 @@ static TILE_GET_INFO( get_fg_tile_info_raiga )
static TILE_GET_INFO( get_tx_tile_info )
{
- UINT16 *videoram1 = &gaiden_videoram[0x0400];
- UINT16 *videoram2 = gaiden_videoram;
+ gaiden_state *state = (gaiden_state *)machine->driver_data;
+ UINT16 *videoram1 = &state->videoram[0x0400];
+ UINT16 *videoram2 = state->videoram;
SET_TILE_INFO(
0,
videoram1[tile_index] & 0x07ff,
@@ -75,64 +74,70 @@ static TILE_GET_INFO( get_tx_tile_info )
VIDEO_START( gaiden )
{
+ gaiden_state *state = (gaiden_state *)machine->driver_data;
+
/* set up tile layers */
- background = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 16, 16, 64, 32);
- foreground = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 16, 16, 64, 32);
- text_layer = tilemap_create(machine, get_tx_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
+ state->background = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 16, 16, 64, 32);
+ state->foreground = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 16, 16, 64, 32);
+ state->text_layer = tilemap_create(machine, get_tx_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
- tilemap_set_transparent_pen(background, 0);
- tilemap_set_transparent_pen(foreground, 0);
- tilemap_set_transparent_pen(text_layer, 0);
+ tilemap_set_transparent_pen(state->background, 0);
+ tilemap_set_transparent_pen(state->foreground, 0);
+ tilemap_set_transparent_pen(state->text_layer, 0);
}
VIDEO_START( mastninj )
{
+ gaiden_state *state = (gaiden_state *)machine->driver_data;
+
/* set up tile layers */
- background = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 16, 16, 64, 32);
- foreground = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 16, 16, 64, 32);
- text_layer = tilemap_create(machine, get_tx_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
+ state->background = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 16, 16, 64, 32);
+ state->foreground = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 16, 16, 64, 32);
+ state->text_layer = tilemap_create(machine, get_tx_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
-// tilemap_set_transparent_pen(background, 15);
- tilemap_set_transparent_pen(foreground, 15);
- tilemap_set_transparent_pen(text_layer, 15);
+// tilemap_set_transparent_pen(state->background, 15);
+ tilemap_set_transparent_pen(state->foreground, 15);
+ tilemap_set_transparent_pen(state->text_layer, 15);
- tilemap_set_scrolldx(background, -248, 248);
- tilemap_set_scrolldx(foreground, -252, 252);
+ tilemap_set_scrolldx(state->background, -248, 248);
+ tilemap_set_scrolldx(state->foreground, -252, 252);
}
VIDEO_START( raiga )
{
+ gaiden_state *state = (gaiden_state *)machine->driver_data;
int width = video_screen_get_width(machine->primary_screen);
int height = video_screen_get_height(machine->primary_screen);
/* set up tile layers */
- tile_bitmap_bg = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16);
- tile_bitmap_fg = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16);
+ state->tile_bitmap_bg = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16);
+ state->tile_bitmap_fg = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16);
- background = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows,16,16,64,32);
- foreground = tilemap_create(machine, get_fg_tile_info_raiga,tilemap_scan_rows,16,16,64,32);
- text_layer = tilemap_create(machine, get_tx_tile_info, tilemap_scan_rows, 8, 8,32,32);
+ state->background = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 16, 16, 64, 32);
+ state->foreground = tilemap_create(machine, get_fg_tile_info_raiga, tilemap_scan_rows, 16, 16, 64, 32);
+ state->text_layer = tilemap_create(machine, get_tx_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
- tilemap_set_transparent_pen(background,0);
- tilemap_set_transparent_pen(foreground,0);
- tilemap_set_transparent_pen(text_layer,0);
+ tilemap_set_transparent_pen(state->background, 0);
+ tilemap_set_transparent_pen(state->foreground, 0);
+ tilemap_set_transparent_pen(state->text_layer, 0);
/* set up sprites */
- sprite_bitmap = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16);
+ state->sprite_bitmap = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16);
}
VIDEO_START( drgnbowl )
{
+ gaiden_state *state = (gaiden_state *)machine->driver_data;
/* set up tile layers */
- background = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 16, 16, 64, 32);
- foreground = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 16, 16, 64, 32);
- text_layer = tilemap_create(machine, get_tx_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
+ state->background = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 16, 16, 64, 32);
+ state->foreground = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 16, 16, 64, 32);
+ state->text_layer = tilemap_create(machine, get_tx_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
- tilemap_set_transparent_pen(foreground, 15);
- tilemap_set_transparent_pen(text_layer, 15);
+ tilemap_set_transparent_pen(state->foreground, 15);
+ tilemap_set_transparent_pen(state->text_layer, 15);
- tilemap_set_scrolldx(background, -248, 248);
- tilemap_set_scrolldx(foreground, -252, 252);
+ tilemap_set_scrolldx(state->background, -248, 248);
+ tilemap_set_scrolldx(state->foreground, -252, 252);
}
@@ -145,50 +150,51 @@ VIDEO_START( drgnbowl )
WRITE16_HANDLER( gaiden_txscrollx_w )
{
- static UINT16 scroll;
- COMBINE_DATA(&scroll);
- tilemap_set_scrollx(text_layer, 0, scroll);
+ gaiden_state *state = (gaiden_state *)space->machine->driver_data;
+ COMBINE_DATA(&state->tx_scroll_x);
+ tilemap_set_scrollx(state->text_layer, 0, state->tx_scroll_x);
}
WRITE16_HANDLER( gaiden_txscrolly_w )
{
- static UINT16 scroll;
- COMBINE_DATA(&scroll);
- tilemap_set_scrolly(text_layer, 0, scroll);
+ gaiden_state *state = (gaiden_state *)space->machine->driver_data;
+ COMBINE_DATA(&state->tx_scroll_y);
+ tilemap_set_scrolly(state->text_layer, 0, state->tx_scroll_y);
}
WRITE16_HANDLER( gaiden_fgscrollx_w )
{
- static UINT16 scroll;
- COMBINE_DATA(&scroll);
- tilemap_set_scrollx(foreground, 0, scroll);
+ gaiden_state *state = (gaiden_state *)space->machine->driver_data;
+ COMBINE_DATA(&state->fg_scroll_x);
+ tilemap_set_scrollx(state->foreground, 0, state->fg_scroll_x);
}
WRITE16_HANDLER( gaiden_fgscrolly_w )
{
- static UINT16 scroll;
- COMBINE_DATA(&scroll);
- tilemap_set_scrolly(foreground, 0, scroll);
+ gaiden_state *state = (gaiden_state *)space->machine->driver_data;
+ COMBINE_DATA(&state->fg_scroll_y);
+ tilemap_set_scrolly(state->foreground, 0, state->fg_scroll_y);
}
WRITE16_HANDLER( gaiden_bgscrollx_w )
{
- static UINT16 scroll;
- COMBINE_DATA(&scroll);
- tilemap_set_scrollx(background, 0, scroll);
+ gaiden_state *state = (gaiden_state *)space->machine->driver_data;
+ COMBINE_DATA(&state->bg_scroll_x);
+ tilemap_set_scrollx(state->background, 0, state->bg_scroll_x);
}
WRITE16_HANDLER( gaiden_bgscrolly_w )
{
- static UINT16 scroll;
- COMBINE_DATA(&scroll);
- tilemap_set_scrolly(background, 0, scroll);
+ gaiden_state *state = (gaiden_state *)space->machine->driver_data;
+ COMBINE_DATA(&state->bg_scroll_y);
+ tilemap_set_scrolly(state->background, 0, state->bg_scroll_y);
}
WRITE16_HANDLER( gaiden_videoram3_w )
{
- COMBINE_DATA(&gaiden_videoram3[offset]);
- tilemap_mark_tile_dirty(background,offset & 0x07ff);
+ gaiden_state *state = (gaiden_state *)space->machine->driver_data;
+ COMBINE_DATA(&state->videoram3[offset]);
+ tilemap_mark_tile_dirty(state->background, offset & 0x07ff);
}
WRITE16_HANDLER( gaiden_flip_w )
@@ -200,24 +206,28 @@ WRITE16_HANDLER( gaiden_flip_w )
READ16_HANDLER( gaiden_videoram3_r )
{
- return gaiden_videoram3[offset];
+ gaiden_state *state = (gaiden_state *)space->machine->driver_data;
+ return state->videoram3[offset];
}
WRITE16_HANDLER( gaiden_videoram2_w )
{
- COMBINE_DATA(&gaiden_videoram2[offset]);
- tilemap_mark_tile_dirty(foreground,offset & 0x07ff);
+ gaiden_state *state = (gaiden_state *)space->machine->driver_data;
+ COMBINE_DATA(&state->videoram2[offset]);
+ tilemap_mark_tile_dirty(state->foreground, offset & 0x07ff);
}
READ16_HANDLER( gaiden_videoram2_r )
{
- return gaiden_videoram2[offset];
+ gaiden_state *state = (gaiden_state *)space->machine->driver_data;
+ return state->videoram2[offset];
}
WRITE16_HANDLER( gaiden_videoram_w )
{
- COMBINE_DATA(&gaiden_videoram[offset]);
- tilemap_mark_tile_dirty(text_layer,offset & 0x03ff);
+ gaiden_state *state = (gaiden_state *)space->machine->driver_data;
+ COMBINE_DATA(&state->videoram[offset]);
+ tilemap_mark_tile_dirty(state->text_layer, offset & 0x03ff);
}
@@ -292,7 +302,7 @@ static void blendbitmaps(running_machine *machine,
#define NUM_SPRITES 256
-static void gaiden_draw_sprites(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect)
+static void gaiden_draw_sprites( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect )
{
static const UINT8 layout[8][8] =
{
@@ -306,8 +316,9 @@ static void gaiden_draw_sprites(running_machine *machine, bitmap_t *bitmap, cons
{42,43,46,47,58,59,62,63}
};
+ gaiden_state *state = (gaiden_state *)machine->driver_data;
const gfx_element *gfx = machine->gfx[3];
- const UINT16 *source = (NUM_SPRITES - 1) * 8 + machine->generic.spriteram.u16;
+ const UINT16 *source = (NUM_SPRITES - 1) * 8 + state->spriteram;
int count = NUM_SPRITES;
/* draw all sprites from front to back */
@@ -325,7 +336,7 @@ static void gaiden_draw_sprites(running_machine *machine, bitmap_t *bitmap, cons
UINT32 color = source[2];
UINT32 sizex = 1 << ((color >> 0) & 3); /* 1,2,4,8 */
- UINT32 sizey = 1 << ((color >> gaiden_sprite_sizey) & 3); /* 1,2,4,8 */
+ UINT32 sizey = 1 << ((color >> state->sprite_sizey) & 3); /* 1,2,4,8 */
/* raiga needs something like this */
UINT32 number = (source[1] & (sizex > 2 ? 0x7ff8 : 0x7ffc));
@@ -390,7 +401,7 @@ skip_sprite:
}
-static void raiga_draw_sprites(running_machine *machine, bitmap_t *bitmap_bg, bitmap_t *bitmap_fg, bitmap_t *bitmap_sp, const rectangle *cliprect)
+static void raiga_draw_sprites( running_machine *machine, bitmap_t *bitmap_bg, bitmap_t *bitmap_fg, bitmap_t *bitmap_sp, const rectangle *cliprect )
{
static const UINT8 layout[8][8] =
{
@@ -404,8 +415,9 @@ static void raiga_draw_sprites(running_machine *machine, bitmap_t *bitmap_bg, bi
{42,43,46,47,58,59,62,63}
};
+ gaiden_state *state = (gaiden_state *)machine->driver_data;
const gfx_element *gfx = machine->gfx[3];
- const UINT16 *source = (NUM_SPRITES - 1) * 8 + machine->generic.spriteram.u16;
+ const UINT16 *source = (NUM_SPRITES - 1) * 8 + state->spriteram;
int count = NUM_SPRITES;
/* draw all sprites from front to back */
@@ -423,7 +435,7 @@ static void raiga_draw_sprites(running_machine *machine, bitmap_t *bitmap_bg, bi
UINT32 color = source[2];
UINT32 sizex = 1 << ((color >> 0) & 3); /* 1,2,4,8 */
- UINT32 sizey = 1 << ((color >> gaiden_sprite_sizey) & 3); /* 1,2,4,8 */
+ UINT32 sizey = 1 << ((color >> state->sprite_sizey) & 3); /* 1,2,4,8 */
/* raiga needs something like this */
UINT32 number = (source[1] & (sizex > 2 ? 0x7ff8 : 0x7ffc));
@@ -531,24 +543,25 @@ static void raiga_draw_sprites(running_machine *machine, bitmap_t *bitmap_bg, bi
static void drgnbowl_draw_sprites(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect)
{
- UINT16 *spriteram16 = machine->generic.spriteram.u16;
+ gaiden_state *state = (gaiden_state *)machine->driver_data;
+ UINT16 *spriteram = state->spriteram;
int i, code, color, x, y, flipx, flipy, priority_mask;
for( i = 0; i < 0x800/2; i += 4 )
{
- code = (spriteram16[i + 0] & 0xff) | ((spriteram16[i + 3] & 0x1f) << 8);
- y = 256 - (spriteram16[i + 1] & 0xff) - 12;
- x = spriteram16[i + 2] & 0xff;
- color = (spriteram16[(0x800/2) + i] & 0x0f);
- flipx = spriteram16[i + 3] & 0x40;
- flipy = spriteram16[i + 3] & 0x80;
-
- if(spriteram16[(0x800/2) + i] & 0x80)
+ code = (spriteram[i + 0] & 0xff) | ((spriteram[i + 3] & 0x1f) << 8);
+ y = 256 - (spriteram[i + 1] & 0xff) - 12;
+ x = spriteram[i + 2] & 0xff;
+ color = (spriteram[(0x800/2) + i] & 0x0f);
+ flipx = spriteram[i + 3] & 0x40;
+ flipy = spriteram[i + 3] & 0x80;
+
+ if(spriteram[(0x800/2) + i] & 0x80)
x -= 256;
x += 256;
- if(spriteram16[i + 3] & 0x20)
+ if(spriteram[i + 3] & 0x20)
priority_mask = 0xf0 | 0xcc; /* obscured by foreground */
else
priority_mask = 0;
@@ -571,12 +584,13 @@ static void drgnbowl_draw_sprites(running_machine *machine, bitmap_t *bitmap, co
VIDEO_UPDATE( gaiden )
{
+ gaiden_state *state = (gaiden_state *)screen->machine->driver_data;
bitmap_fill(screen->machine->priority_bitmap, cliprect, 0);
bitmap_fill(bitmap, cliprect, 0x200);
- tilemap_draw(bitmap, cliprect, background, 0, 1);
- tilemap_draw(bitmap, cliprect, foreground, 0, 2);
- tilemap_draw(bitmap, cliprect, text_layer, 0, 4);
+ tilemap_draw(bitmap, cliprect, state->background, 0, 1);
+ tilemap_draw(bitmap, cliprect, state->foreground, 0, 2);
+ tilemap_draw(bitmap, cliprect, state->text_layer, 0, 4);
gaiden_draw_sprites(screen->machine, bitmap, cliprect);
return 0;
@@ -584,35 +598,37 @@ VIDEO_UPDATE( gaiden )
VIDEO_UPDATE( raiga )
{
+ gaiden_state *state = (gaiden_state *)screen->machine->driver_data;
bitmap_fill(screen->machine->priority_bitmap, cliprect, 0);
- bitmap_fill(tile_bitmap_bg, cliprect, 0x200);
- bitmap_fill(tile_bitmap_fg, cliprect, 0);
- bitmap_fill(sprite_bitmap, cliprect, 0);
+ bitmap_fill(state->tile_bitmap_bg, cliprect, 0x200);
+ bitmap_fill(state->tile_bitmap_fg, cliprect, 0);
+ bitmap_fill(state->sprite_bitmap, cliprect, 0);
/* draw tilemaps into a 16-bit bitmap */
- tilemap_draw(tile_bitmap_bg, cliprect,background, 0, 1);
- tilemap_draw(tile_bitmap_fg, cliprect,foreground, 0, 2);
+ tilemap_draw(state->tile_bitmap_bg, cliprect, state->background, 0, 1);
+ tilemap_draw(state->tile_bitmap_fg, cliprect, state->foreground, 0, 2);
/* draw the blended tiles at a lower priority
so sprites covered by them will still be drawn */
- tilemap_draw(tile_bitmap_fg, cliprect,foreground, 1, 0);
- tilemap_draw(tile_bitmap_fg, cliprect,text_layer, 0, 4);
+ tilemap_draw(state->tile_bitmap_fg, cliprect, state->foreground, 1, 0);
+ tilemap_draw(state->tile_bitmap_fg, cliprect, state->text_layer, 0, 4);
/* draw sprites into a 16-bit bitmap */
- raiga_draw_sprites(screen->machine, tile_bitmap_bg, tile_bitmap_fg, sprite_bitmap, cliprect);
+ raiga_draw_sprites(screen->machine, state->tile_bitmap_bg, state->tile_bitmap_fg, state->sprite_bitmap, cliprect);
/* mix & blend the tilemaps and sprites into a 32-bit bitmap */
- blendbitmaps(screen->machine, bitmap, tile_bitmap_bg, tile_bitmap_fg, sprite_bitmap, 0, 0, cliprect);
+ blendbitmaps(screen->machine, bitmap, state->tile_bitmap_bg, state->tile_bitmap_fg, state->sprite_bitmap, 0, 0, cliprect);
return 0;
}
VIDEO_UPDATE( drgnbowl )
{
+ gaiden_state *state = (gaiden_state *)screen->machine->driver_data;
bitmap_fill(screen->machine->priority_bitmap, cliprect, 0);
- tilemap_draw(bitmap, cliprect, background, 0, 1);
- tilemap_draw(bitmap, cliprect, foreground, 0, 2);
- tilemap_draw(bitmap, cliprect, text_layer, 0, 4);
+ tilemap_draw(bitmap, cliprect, state->background, 0, 1);
+ tilemap_draw(bitmap, cliprect, state->foreground, 0, 2);
+ tilemap_draw(bitmap, cliprect, state->text_layer, 0, 4);
drgnbowl_draw_sprites(screen->machine, bitmap, cliprect);
return 0;
}
diff --git a/src/mame/video/rocnrope.c b/src/mame/video/rocnrope.c
index 337b5a46332..7ec49041e52 100644
--- a/src/mame/video/rocnrope.c
+++ b/src/mame/video/rocnrope.c
@@ -8,8 +8,7 @@
#include "driver.h"
#include "video/resnet.h"
-
-static tilemap *bg_tilemap;
+#include "rocnrope.h"
/***************************************************************************
@@ -29,6 +28,7 @@ static tilemap *bg_tilemap;
bit 0 -- 1 kohm resistor -- RED
***************************************************************************/
+
PALETTE_INIT( rocnrope )
{
static const int resistances_rg[3] = { 1000, 470, 220 };
@@ -84,14 +84,16 @@ PALETTE_INIT( rocnrope )
WRITE8_HANDLER( rocnrope_videoram_w )
{
- space->machine->generic.videoram.u8[offset] = data;
- tilemap_mark_tile_dirty(bg_tilemap, offset);
+ rocnrope_state *state = (rocnrope_state *)space->machine->driver_data;
+ state->videoram[offset] = data;
+ tilemap_mark_tile_dirty(state->bg_tilemap, offset);
}
WRITE8_HANDLER( rocnrope_colorram_w )
{
- space->machine->generic.colorram.u8[offset] = data;
- tilemap_mark_tile_dirty(bg_tilemap, offset);
+ rocnrope_state *state = (rocnrope_state *)space->machine->driver_data;
+ state->colorram[offset] = data;
+ tilemap_mark_tile_dirty(state->bg_tilemap, offset);
}
WRITE8_HANDLER( rocnrope_flipscreen_w )
@@ -105,8 +107,9 @@ WRITE8_HANDLER( rocnrope_flipscreen_w )
static TILE_GET_INFO( get_bg_tile_info )
{
- int attr = machine->generic.colorram.u8[tile_index];
- int code = machine->generic.videoram.u8[tile_index] + 2 * (attr & 0x80);
+ rocnrope_state *state = (rocnrope_state *)machine->driver_data;
+ int attr = state->colorram[tile_index];
+ int code = state->videoram[tile_index] + 2 * (attr & 0x80);
int color = attr & 0x0f;
int flags = ((attr & 0x40) ? TILE_FLIPX : 0) | ((attr & 0x20) ? TILE_FLIPY : 0);
@@ -115,31 +118,34 @@ static TILE_GET_INFO( get_bg_tile_info )
VIDEO_START( rocnrope )
{
- bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
+ rocnrope_state *state = (rocnrope_state *)machine->driver_data;
+ state->bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
}
static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect )
{
- UINT8 *spriteram = machine->generic.spriteram.u8;
- UINT8 *spriteram_2 = machine->generic.spriteram2.u8;
+ rocnrope_state *state = (rocnrope_state *)machine->driver_data;
+ UINT8 *spriteram = state->spriteram;
+ UINT8 *spriteram_2 = state->spriteram2;
int offs;
- for (offs = machine->generic.spriteram_size - 2;offs >= 0;offs -= 2)
+ for (offs = state->spriteram_size - 2;offs >= 0;offs -= 2)
{
int color = spriteram_2[offs] & 0x0f;
- drawgfx_transmask(bitmap,cliprect,machine->gfx[0],
+ drawgfx_transmask(bitmap, cliprect, machine->gfx[0],
spriteram[offs + 1],
color,
spriteram_2[offs] & 0x40,~spriteram_2[offs] & 0x80,
- 240-spriteram[offs],spriteram_2[offs + 1],
+ 240 - spriteram[offs], spriteram_2[offs + 1],
colortable_get_transpen_mask(machine->colortable, machine->gfx[0], color, 0));
}
}
VIDEO_UPDATE( rocnrope )
{
- tilemap_draw(bitmap, cliprect, bg_tilemap, 0, 0);
+ rocnrope_state *state = (rocnrope_state *)screen->machine->driver_data;
+ tilemap_draw(bitmap, cliprect, state->bg_tilemap, 0, 0);
draw_sprites(screen->machine, bitmap, cliprect);
return 0;
}