Added driver data struct + save states to darius.c & othunder.c

Added driver data struct to ninjaw.c, slapshot.c, warriorb.c, wgp.c

There is still some TC0100SCN issue when reloading, which corrupts tilemap2, hence no save states in the latter drivers atm
This commit is contained in:
Fabio Priuli 2010-01-09 08:36:34 +00:00
parent e338ba361a
commit cbfecc9d6b
20 changed files with 1439 additions and 1019 deletions

6
.gitattributes vendored
View File

@ -2438,6 +2438,7 @@ src/mame/includes/crshrace.h svneol=native#text/plain
src/mame/includes/cubocd32.h svneol=native#text/plain src/mame/includes/cubocd32.h svneol=native#text/plain
src/mame/includes/cvs.h svneol=native#text/plain src/mame/includes/cvs.h svneol=native#text/plain
src/mame/includes/cyberbal.h svneol=native#text/plain src/mame/includes/cyberbal.h svneol=native#text/plain
src/mame/includes/darius.h svneol=native#text/plain
src/mame/includes/dbz.h svneol=native#text/plain src/mame/includes/dbz.h svneol=native#text/plain
src/mame/includes/dc.h svneol=native#text/plain src/mame/includes/dc.h svneol=native#text/plain
src/mame/includes/dcheese.h svneol=native#text/plain src/mame/includes/dcheese.h svneol=native#text/plain
@ -2645,6 +2646,7 @@ src/mame/includes/nemesis.h svneol=native#text/plain
src/mame/includes/neogeo.h svneol=native#text/plain src/mame/includes/neogeo.h svneol=native#text/plain
src/mame/includes/news.h svneol=native#text/plain src/mame/includes/news.h svneol=native#text/plain
src/mame/includes/ninjakd2.h svneol=native#text/plain src/mame/includes/ninjakd2.h svneol=native#text/plain
src/mame/includes/ninjaw.h svneol=native#text/plain
src/mame/includes/nitedrvr.h svneol=native#text/plain src/mame/includes/nitedrvr.h svneol=native#text/plain
src/mame/includes/niyanpai.h svneol=native#text/plain src/mame/includes/niyanpai.h svneol=native#text/plain
src/mame/includes/nmk16.h svneol=native#text/plain src/mame/includes/nmk16.h svneol=native#text/plain
@ -2655,6 +2657,7 @@ src/mame/includes/offtwall.h svneol=native#text/plain
src/mame/includes/oneshot.h svneol=native#text/plain src/mame/includes/oneshot.h svneol=native#text/plain
src/mame/includes/opwolf.h svneol=native#text/plain src/mame/includes/opwolf.h svneol=native#text/plain
src/mame/includes/orbit.h svneol=native#text/plain src/mame/includes/orbit.h svneol=native#text/plain
src/mame/includes/othunder.h svneol=native#text/plain
src/mame/includes/overdriv.h svneol=native#text/plain src/mame/includes/overdriv.h svneol=native#text/plain
src/mame/includes/pacman.h svneol=native#text/plain src/mame/includes/pacman.h svneol=native#text/plain
src/mame/includes/pandoras.h svneol=native#text/plain src/mame/includes/pandoras.h svneol=native#text/plain
@ -2704,6 +2707,7 @@ src/mame/includes/skullxbo.h svneol=native#text/plain
src/mame/includes/skydiver.h svneol=native#text/plain src/mame/includes/skydiver.h svneol=native#text/plain
src/mame/includes/skyraid.h svneol=native#text/plain src/mame/includes/skyraid.h svneol=native#text/plain
src/mame/includes/slapfght.h svneol=native#text/plain src/mame/includes/slapfght.h svneol=native#text/plain
src/mame/includes/slapshot.h svneol=native#text/plain
src/mame/includes/slapstic.h svneol=native#text/plain src/mame/includes/slapstic.h svneol=native#text/plain
src/mame/includes/snes.h svneol=native#text/plain src/mame/includes/snes.h svneol=native#text/plain
src/mame/includes/snk.h svneol=native#text/plain src/mame/includes/snk.h svneol=native#text/plain
@ -2782,7 +2786,9 @@ src/mame/includes/vindictr.h svneol=native#text/plain
src/mame/includes/volfied.h svneol=native#text/plain src/mame/includes/volfied.h svneol=native#text/plain
src/mame/includes/vsnes.h svneol=native#text/plain src/mame/includes/vsnes.h svneol=native#text/plain
src/mame/includes/warpwarp.h svneol=native#text/plain src/mame/includes/warpwarp.h svneol=native#text/plain
src/mame/includes/warriorb.h svneol=native#text/plain
src/mame/includes/wc90.h svneol=native#text/plain src/mame/includes/wc90.h svneol=native#text/plain
src/mame/includes/wgp.h svneol=native#text/plain
src/mame/includes/williams.h svneol=native#text/plain src/mame/includes/williams.h svneol=native#text/plain
src/mame/includes/wiping.h svneol=native#text/plain src/mame/includes/wiping.h svneol=native#text/plain
src/mame/includes/wrally.h svneol=native#text/plain src/mame/includes/wrally.h svneol=native#text/plain

View File

@ -134,37 +134,28 @@ sounds.
#include "sound/2203intf.h" #include "sound/2203intf.h"
#include "sound/msm5205.h" #include "sound/msm5205.h"
#include "sound/flt_vol.h" #include "sound/flt_vol.h"
#include "includes/darius.h"
#include "darius.lh" #include "darius.lh"
static MACHINE_START( darius );
static MACHINE_RESET( darius );
VIDEO_START( darius );
VIDEO_UPDATE( darius );
static UINT16 cpua_ctrl;
static UINT16 coin_word=0;
extern UINT16 *darius_fg_ram;
WRITE16_HANDLER( darius_fg_layer_w );
static void parse_control( running_machine *machine ) /* assumes Z80 sandwiched between 68Ks */ static void parse_control( running_machine *machine ) /* assumes Z80 sandwiched between 68Ks */
{ {
/* bit 0 enables cpu B */ /* bit 0 enables cpu B */
/* however this fails when recovering from a save state /* however this fails when recovering from a save state
if cpu B is disabled !! */ if cpu B is disabled !! */
cputag_set_input_line(machine, "cpub", INPUT_LINE_RESET, (cpua_ctrl &0x1) ? CLEAR_LINE : ASSERT_LINE); darius_state *state = (darius_state *)machine->driver_data;
cpu_set_input_line(state->cpub, INPUT_LINE_RESET, (state->cpua_ctrl & 0x01) ? CLEAR_LINE : ASSERT_LINE);
} }
static WRITE16_HANDLER( cpua_ctrl_w ) static WRITE16_HANDLER( cpua_ctrl_w )
{ {
darius_state *state = (darius_state *)space->machine->driver_data;
if ((data & 0xff00) && ((data & 0xff) == 0)) if ((data & 0xff00) && ((data & 0xff) == 0))
data = data >> 8; /* for Wgp */ data = data >> 8;
cpua_ctrl = data;
state->cpua_ctrl = data;
parse_control(space->machine); parse_control(space->machine);
@ -183,11 +174,12 @@ static WRITE16_HANDLER( darius_watchdog_w )
static READ16_HANDLER( darius_ioc_r ) static READ16_HANDLER( darius_ioc_r )
{ {
const device_config *tc0140syt = devtag_get_device(space->machine, "tc0140syt"); darius_state *state = (darius_state *)space->machine->driver_data;
switch (offset) switch (offset)
{ {
case 0x01: case 0x01:
return (tc0140syt_comm_r(tc0140syt, 0) & 0xff); /* sound interface read */ return (tc0140syt_comm_r(state->tc0140syt, 0) & 0xff); /* sound interface read */
case 0x04: case 0x04:
return input_port_read(space->machine, "P1"); return input_port_read(space->machine, "P1");
@ -199,7 +191,7 @@ static READ16_HANDLER( darius_ioc_r )
return input_port_read(space->machine, "SYSTEM"); return input_port_read(space->machine, "SYSTEM");
case 0x07: case 0x07:
return coin_word; /* bits 3&4 coin lockouts, must return zero */ return state->coin_word; /* bits 3&4 coin lockouts, must return zero */
case 0x08: case 0x08:
return input_port_read(space->machine, "DSW"); return input_port_read(space->machine, "DSW");
@ -212,17 +204,18 @@ logerror("CPU #0 PC %06x: warning - read unmapped ioc offset %06x\n",cpu_get_pc(
static WRITE16_HANDLER( darius_ioc_w ) static WRITE16_HANDLER( darius_ioc_w )
{ {
const device_config *tc0140syt = devtag_get_device(space->machine, "tc0140syt"); darius_state *state = (darius_state *)space->machine->driver_data;
switch (offset) switch (offset)
{ {
case 0x00: /* sound interface write */ case 0x00: /* sound interface write */
tc0140syt_port_w (tc0140syt, 0, data & 0xff); tc0140syt_port_w(state->tc0140syt, 0, data & 0xff);
return; return;
case 0x01: /* sound interface write */ case 0x01: /* sound interface write */
tc0140syt_comm_w (tc0140syt, 0, data & 0xff); tc0140syt_comm_w(state->tc0140syt, 0, data & 0xff);
return; return;
case 0x28: /* unknown, written by both cpus - always 0? */ case 0x28: /* unknown, written by both cpus - always 0? */
@ -236,7 +229,7 @@ static WRITE16_HANDLER( darius_ioc_w )
coin_lockout_w(space->machine, 1, ~data & 0x04); coin_lockout_w(space->machine, 1, ~data & 0x04);
coin_counter_w(space->machine, 0, data & 0x08); coin_counter_w(space->machine, 0, data & 0x08);
coin_counter_w(space->machine, 1, data & 0x40); coin_counter_w(space->machine, 1, data & 0x40);
coin_word = data &0xffff; state->coin_word = data & 0xffff;
//popmessage(" address %04x value %04x",offset,data); //popmessage(" address %04x value %04x",offset,data);
return; return;
} }
@ -260,9 +253,9 @@ static ADDRESS_MAP_START( darius_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0xd40000, 0xd40003) AM_DEVWRITE("pc080sn", pc080sn_xscroll_word_w) AM_RANGE(0xd40000, 0xd40003) AM_DEVWRITE("pc080sn", pc080sn_xscroll_word_w)
AM_RANGE(0xd50000, 0xd50003) AM_DEVWRITE("pc080sn", pc080sn_ctrl_word_w) AM_RANGE(0xd50000, 0xd50003) AM_DEVWRITE("pc080sn", pc080sn_ctrl_word_w)
AM_RANGE(0xd80000, 0xd80fff) AM_RAM_WRITE(paletteram16_xBBBBBGGGGGRRRRR_word_w) AM_BASE_GENERIC(paletteram)/* palette */ AM_RANGE(0xd80000, 0xd80fff) AM_RAM_WRITE(paletteram16_xBBBBBGGGGGRRRRR_word_w) AM_BASE_GENERIC(paletteram)/* palette */
AM_RANGE(0xe00100, 0xe00fff) AM_RAM AM_SHARE("share1") AM_BASE_SIZE_GENERIC(spriteram) AM_RANGE(0xe00100, 0xe00fff) AM_RAM AM_SHARE("share1") AM_BASE_SIZE_MEMBER(darius_state, spriteram, spriteram_size)
AM_RANGE(0xe01000, 0xe02fff) AM_RAM AM_SHARE("share2") AM_RANGE(0xe01000, 0xe02fff) AM_RAM AM_SHARE("share2")
AM_RANGE(0xe08000, 0xe0ffff) AM_RAM_WRITE(darius_fg_layer_w) AM_SHARE("share3") AM_BASE(&darius_fg_ram) AM_RANGE(0xe08000, 0xe0ffff) AM_RAM_WRITE(darius_fg_layer_w) AM_SHARE("share3") AM_BASE_MEMBER(darius_state, fg_ram)
AM_RANGE(0xe10000, 0xe10fff) AM_RAM /* ??? */ AM_RANGE(0xe10000, 0xe10fff) AM_RAM /* ??? */
ADDRESS_MAP_END ADDRESS_MAP_END
@ -281,19 +274,17 @@ ADDRESS_MAP_END
SOUND SOUND
*****************************************************/ *****************************************************/
static INT32 banknum;
static UINT8 adpcm_command = 0;
static UINT8 nmi_enable = 0;
static void reset_sound_region( running_machine *machine ) static void reset_sound_region( running_machine *machine )
{ {
memory_set_bankptr(machine, "bank1", memory_region(machine, "audiocpu") + (banknum * 0x8000) + 0x10000 ); darius_state *state = (darius_state *)machine->driver_data;
memory_set_bank(machine, "bank1", state->banknum);
} }
static WRITE8_HANDLER( sound_bankswitch_w ) static WRITE8_HANDLER( sound_bankswitch_w )
{ {
banknum = data &0x03; darius_state *state = (darius_state *)space->machine->driver_data;
state->banknum = data & 0x03;
reset_sound_region(space->machine); reset_sound_region(space->machine);
// banknum = data; // banknum = data;
// reset_sound_region(); // reset_sound_region();
@ -301,7 +292,8 @@ static WRITE8_HANDLER( sound_bankswitch_w )
static WRITE8_HANDLER( adpcm_command_w ) static WRITE8_HANDLER( adpcm_command_w )
{ {
adpcm_command = data; darius_state *state = (darius_state *)space->machine->driver_data;
state->adpcm_command = data;
/* logerror("#ADPCM command write =%2x\n",data); */ /* logerror("#ADPCM command write =%2x\n",data); */
} }
@ -317,47 +309,47 @@ static WRITE8_HANDLER( display_value )
Sound mixer/pan control Sound mixer/pan control
*****************************************************/ *****************************************************/
static UINT32 darius_def_vol[0x10];
#define DARIUS_VOL_MAX (3*2 + 2)
#define DARIUS_PAN_MAX (2 + 2 + 1) /* FM 2port + PSG 2port + DA 1port */
static UINT8 darius_vol[DARIUS_VOL_MAX];
static UINT8 darius_pan[DARIUS_PAN_MAX];
static void update_fm0( running_machine *machine ) static void update_fm0( running_machine *machine )
{ {
const device_config *lvol = devtag_get_device(machine, "filter0.3l"); darius_state *state = (darius_state *)machine->driver_data;
const device_config *rvol = devtag_get_device(machine, "filter0.3r"); int left = ( state->pan[0] * state->vol[6]) >> 8;
int left, right; int right = ((0xff - state->pan[0]) * state->vol[6]) >> 8;
left = ( darius_pan[0] * darius_vol[6])>>8;
right = ((0xff - darius_pan[0]) * darius_vol[6])>>8; if (state->filter0_3l != NULL)
if (lvol != NULL) flt_volume_set_volume(state->filter0_3l, left / 100.0);
flt_volume_set_volume(lvol, left / 100.0); if (state->filter0_3r != NULL)
if (rvol != NULL) flt_volume_set_volume(state->filter0_3r, right / 100.0); /* FM #0 */
flt_volume_set_volume(rvol, right / 100.0); /* FM #0 */
} }
static void update_fm1( running_machine *machine ) static void update_fm1( running_machine *machine )
{ {
const device_config *lvol = devtag_get_device(machine, "filter1.3l"); darius_state *state = (darius_state *)machine->driver_data;
const device_config *rvol = devtag_get_device(machine, "filter1.3r"); int left = ( state->pan[1] * state->vol[7]) >> 8;
int left, right; int right = ((0xff - state->pan[1]) * state->vol[7]) >> 8;
left = ( darius_pan[1] * darius_vol[7])>>8;
right = ((0xff - darius_pan[1]) * darius_vol[7])>>8; if (state->filter1_3l != NULL)
if (lvol != NULL) flt_volume_set_volume(state->filter1_3l, left / 100.0);
flt_volume_set_volume(lvol, left / 100.0); if (state->filter1_3r != NULL)
if (rvol != NULL) flt_volume_set_volume(state->filter1_3r, right / 100.0); /* FM #1 */
flt_volume_set_volume(rvol, right / 100.0); /* FM #1 */
} }
static void update_psg0( running_machine *machine, int port ) static void update_psg0( running_machine *machine, int port )
{ {
static const char *const fltname[3][2] = { { "filter0.0l", "filter0.0r" }, { "filter0.1l", "filter0.1r" }, { "filter0.2l", "filter0.2r" } }; darius_state *state = (darius_state *)machine->driver_data;
const device_config *lvol = devtag_get_device(machine, fltname[port][0]); const device_config *lvol = NULL, *rvol = NULL;
const device_config *rvol = devtag_get_device(machine, fltname[port][1]);
int left, right; int left, right;
left = ( darius_pan[2] * darius_vol[port])>>8;
right = ((0xff - darius_pan[2]) * darius_vol[port])>>8; switch (port)
{
case 0: lvol = state->filter0_0l; rvol = state->filter0_0r; break;
case 1: lvol = state->filter0_1l; rvol = state->filter0_1r; break;
case 2: lvol = state->filter0_2l; rvol = state->filter0_2r; break;
default: break;
}
left = ( state->pan[2] * state->vol[port]) >> 8;
right = ((0xff - state->pan[2]) * state->vol[port]) >> 8;
if (lvol != NULL) if (lvol != NULL)
flt_volume_set_volume(lvol, left / 100.0); flt_volume_set_volume(lvol, left / 100.0);
if (rvol != NULL) if (rvol != NULL)
@ -366,12 +358,21 @@ static void update_psg0( running_machine *machine, int port )
static void update_psg1( running_machine *machine, int port ) static void update_psg1( running_machine *machine, int port )
{ {
static const char *const fltname[3][2] = { { "filter0.0l", "filter0.0r" }, { "filter0.1l", "filter0.1r" }, { "filter0.2l", "filter0.2r" } }; darius_state *state = (darius_state *)machine->driver_data;
const device_config *lvol = devtag_get_device(machine, fltname[port][0]); const device_config *lvol = NULL, *rvol = NULL;
const device_config *rvol = devtag_get_device(machine, fltname[port][1]);
int left, right; int left, right;
left = ( darius_pan[3] * darius_vol[port + 3])>>8;
right = ((0xff - darius_pan[3]) * darius_vol[port + 3])>>8; switch (port)
{
case 0: lvol = state->filter1_0l; rvol = state->filter1_0r; break;
case 1: lvol = state->filter1_1l; rvol = state->filter1_1r; break;
case 2: lvol = state->filter1_2l; rvol = state->filter1_2r; break;
default: break;
}
left = ( state->pan[3] * state->vol[port + 3]) >> 8;
right = ((0xff - state->pan[3]) * state->vol[port + 3]) >> 8;
if (lvol != NULL) if (lvol != NULL)
flt_volume_set_volume(lvol, left / 100.0); flt_volume_set_volume(lvol, left / 100.0);
if (rvol != NULL) if (rvol != NULL)
@ -380,32 +381,34 @@ static void update_psg1( running_machine *machine, int port )
static void update_da( running_machine *machine ) static void update_da( running_machine *machine )
{ {
const device_config *lvol = devtag_get_device(machine, "msm5205.l"); darius_state *state = (darius_state *)machine->driver_data;
const device_config *rvol = devtag_get_device(machine, "msm5205.r"); int left = state->def_vol[(state->pan[4] >> 4) & 0x0f];
int left, right; int right = state->def_vol[(state->pan[4] >> 0) & 0x0f];
left = darius_def_vol[(darius_pan[4]>>4)&0x0f];
right = darius_def_vol[(darius_pan[4]>>0)&0x0f]; if (state->msm5205_l != NULL)
if (lvol != NULL) flt_volume_set_volume(state->msm5205_l, left / 100.0);
flt_volume_set_volume(lvol, left / 100.0); if (state->msm5205_r != NULL)
if (rvol != NULL) flt_volume_set_volume(state->msm5205_r, right / 100.0);
flt_volume_set_volume(rvol, right / 100.0); /* FM #1 */
} }
static WRITE8_HANDLER( darius_fm0_pan ) static WRITE8_HANDLER( darius_fm0_pan )
{ {
darius_pan[0] = data&0xff; /* data 0x00:right 0xff:left */ darius_state *state = (darius_state *)space->machine->driver_data;
state->pan[0] = data & 0xff; /* data 0x00:right 0xff:left */
update_fm0(space->machine); update_fm0(space->machine);
} }
static WRITE8_HANDLER( darius_fm1_pan ) static WRITE8_HANDLER( darius_fm1_pan )
{ {
darius_pan[1] = data&0xff; darius_state *state = (darius_state *)space->machine->driver_data;
state->pan[1] = data & 0xff;
update_fm1(space->machine); update_fm1(space->machine);
} }
static WRITE8_HANDLER( darius_psg0_pan ) static WRITE8_HANDLER( darius_psg0_pan )
{ {
darius_pan[2] = data&0xff; darius_state *state = (darius_state *)space->machine->driver_data;
state->pan[2] = data & 0xff;
update_psg0(space->machine, 0); update_psg0(space->machine, 0);
update_psg0(space->machine, 1); update_psg0(space->machine, 1);
update_psg0(space->machine, 2); update_psg0(space->machine, 2);
@ -413,7 +416,8 @@ static WRITE8_HANDLER( darius_psg0_pan )
static WRITE8_HANDLER( darius_psg1_pan ) static WRITE8_HANDLER( darius_psg1_pan )
{ {
darius_pan[3] = data&0xff; darius_state *state = (darius_state *)space->machine->driver_data;
state->pan[3] = data & 0xff;
update_psg1(space->machine, 0); update_psg1(space->machine, 0);
update_psg1(space->machine, 1); update_psg1(space->machine, 1);
update_psg1(space->machine, 2); update_psg1(space->machine, 2);
@ -421,7 +425,8 @@ static WRITE8_HANDLER( darius_psg1_pan )
static WRITE8_HANDLER( darius_da_pan ) static WRITE8_HANDLER( darius_da_pan )
{ {
darius_pan[4] = data&0xff; darius_state *state = (darius_state *)space->machine->driver_data;
state->pan[4] = data & 0xff;
update_da(space->machine); update_da(space->machine);
} }
@ -429,41 +434,53 @@ static WRITE8_HANDLER( darius_da_pan )
static WRITE8_DEVICE_HANDLER( darius_write_portA0 ) static WRITE8_DEVICE_HANDLER( darius_write_portA0 )
{ {
darius_state *state = (darius_state *)device->machine->driver_data;
// volume control FM #0 PSG #0 A // volume control FM #0 PSG #0 A
//popmessage(" pan %02x %02x %02x %02x %02x", darius_pan[0], darius_pan[1], darius_pan[2], darius_pan[3], darius_pan[4] ); //popmessage(" pan %02x %02x %02x %02x %02x", state->pan[0], state->pan[1], state->pan[2], state->pan[3], state->pan[4] );
//popmessage(" A0 %02x A1 %02x B0 %02x B1 %02x", port[0], port[1], port[2], port[3] ); //popmessage(" A0 %02x A1 %02x B0 %02x B1 %02x", port[0], port[1], port[2], port[3] );
darius_vol[0] = darius_def_vol[(data>>4)&0x0f];
darius_vol[6] = darius_def_vol[(data>>0)&0x0f]; state->vol[0] = state->def_vol[(data >> 4) & 0x0f];
state->vol[6] = state->def_vol[(data >> 0) & 0x0f];
update_fm0(device->machine); update_fm0(device->machine);
update_psg0(device->machine, 0); update_psg0(device->machine, 0);
} }
static WRITE8_DEVICE_HANDLER( darius_write_portA1 ) static WRITE8_DEVICE_HANDLER( darius_write_portA1 )
{ {
darius_state *state = (darius_state *)device->machine->driver_data;
// volume control FM #1 PSG #1 A // volume control FM #1 PSG #1 A
//popmessage(" pan %02x %02x %02x %02x %02x", darius_pan[0], darius_pan[1], darius_pan[2], darius_pan[3], darius_pan[4] ); //popmessage(" pan %02x %02x %02x %02x %02x", state->pan[0], state->pan[1], state->pan[2], state->pan[3], state->pan[4] );
darius_vol[3] = darius_def_vol[(data>>4)&0x0f];
darius_vol[7] = darius_def_vol[(data>>0)&0x0f]; state->vol[3] = state->def_vol[(data >> 4) & 0x0f];
state->vol[7] = state->def_vol[(data >> 0) & 0x0f];
update_fm1(device->machine); update_fm1(device->machine);
update_psg1(device->machine, 0); update_psg1(device->machine, 0);
} }
static WRITE8_DEVICE_HANDLER( darius_write_portB0 ) static WRITE8_DEVICE_HANDLER( darius_write_portB0 )
{ {
darius_state *state = (darius_state *)device->machine->driver_data;
// volume control PSG #0 B/C // volume control PSG #0 B/C
//popmessage(" pan %02x %02x %02x %02x %02x", darius_pan[0], darius_pan[1], darius_pan[2], darius_pan[3], darius_pan[4] ); //popmessage(" pan %02x %02x %02x %02x %02x", state->pan[0], state->pan[1], state->pan[2], state->pan[3], state->pan[4] );
darius_vol[1] = darius_def_vol[(data>>4)&0x0f];
darius_vol[2] = darius_def_vol[(data>>0)&0x0f]; state->vol[1] = state->def_vol[(data >> 4) & 0x0f];
state->vol[2] = state->def_vol[(data >> 0) & 0x0f];
update_psg0(device->machine, 1); update_psg0(device->machine, 1);
update_psg0(device->machine, 2); update_psg0(device->machine, 2);
} }
static WRITE8_DEVICE_HANDLER( darius_write_portB1 ) static WRITE8_DEVICE_HANDLER( darius_write_portB1 )
{ {
darius_state *state = (darius_state *)device->machine->driver_data;
// volume control PSG #1 B/C // volume control PSG #1 B/C
//popmessage(" pan %02x %02x %02x %02x %02x", darius_pan[0], darius_pan[1], darius_pan[2], darius_pan[3], darius_pan[4] ); //popmessage(" pan %02x %02x %02x %02x %02x", state->pan[0], state->pan[1], state->pan[2], state->pan[3], state->pan[4] );
darius_vol[4] = darius_def_vol[(data>>4)&0x0f];
darius_vol[5] = darius_def_vol[(data>>0)&0x0f]; state->vol[4] = state->def_vol[(data >> 4) & 0x0f];
state->vol[5] = state->def_vol[(data >> 0) & 0x0f];
update_psg1(device->machine, 1); update_psg1(device->machine, 1);
update_psg1(device->machine, 2); update_psg1(device->machine, 2);
} }
@ -498,8 +515,10 @@ ADDRESS_MAP_END
static void darius_adpcm_int( const device_config *device ) static void darius_adpcm_int( const device_config *device )
{ {
if (nmi_enable) darius_state *state = (darius_state *)device->machine->driver_data;
cputag_set_input_line(device->machine, "adpcm", INPUT_LINE_NMI, PULSE_LINE);
if (state->nmi_enable)
cpu_set_input_line(state->adpcm, INPUT_LINE_NMI, PULSE_LINE);
} }
static const msm5205_interface msm5205_config = static const msm5205_interface msm5205_config =
@ -510,8 +529,10 @@ static const msm5205_interface msm5205_config =
static READ8_HANDLER( adpcm_command_read ) static READ8_HANDLER( adpcm_command_read )
{ {
darius_state *state = (darius_state *)space->machine->driver_data;
/* logerror("read port 0: %02x PC=%4x\n",adpcm_command, cpu_get_pc(space->cpu) ); */ /* logerror("read port 0: %02x PC=%4x\n",adpcm_command, cpu_get_pc(space->cpu) ); */
return adpcm_command; return state->adpcm_command;
} }
static READ8_HANDLER( readport2 ) static READ8_HANDLER( readport2 )
@ -526,13 +547,16 @@ static READ8_HANDLER( readport3 )
static WRITE8_HANDLER( adpcm_nmi_disable ) static WRITE8_HANDLER( adpcm_nmi_disable )
{ {
nmi_enable = 0; darius_state *state = (darius_state *)space->machine->driver_data;
state->nmi_enable = 0;
/* logerror("write port 0: NMI DISABLE PC=%4x\n", data, cpu_get_pc(space->cpu) ); */ /* logerror("write port 0: NMI DISABLE PC=%4x\n", data, cpu_get_pc(space->cpu) ); */
} }
static WRITE8_HANDLER( adpcm_nmi_enable ) static WRITE8_HANDLER( adpcm_nmi_enable )
{ {
nmi_enable = 1; darius_state *state = (darius_state *)space->machine->driver_data;
state->nmi_enable = 1;
/* logerror("write port 1: NMI ENABLE PC=%4x\n", cpu_get_pc(space->cpu) ); */ /* logerror("write port 1: NMI ENABLE PC=%4x\n", cpu_get_pc(space->cpu) ); */
} }
@ -776,7 +800,8 @@ GFXDECODE_END
/* handler called by the YM2203 emulator when the internal timers cause an IRQ */ /* handler called by the YM2203 emulator when the internal timers cause an IRQ */
static void irqhandler( const device_config *device, int irq ) /* assumes Z80 sandwiched between 68Ks */ static void irqhandler( const device_config *device, int irq ) /* assumes Z80 sandwiched between 68Ks */
{ {
cputag_set_input_line(device->machine, "audiocpu", 0, irq ? ASSERT_LINE : CLEAR_LINE); darius_state *state = (darius_state *)device->machine->driver_data;
cpu_set_input_line(state->audiocpu, 0, irq ? ASSERT_LINE : CLEAR_LINE);
} }
static const ym2203_interface ym2203_interface_1 = static const ym2203_interface ym2203_interface_1 =
@ -820,8 +845,96 @@ static const tc0140syt_interface darius_tc0140syt_intf =
"maincpu", "audiocpu" "maincpu", "audiocpu"
}; };
static STATE_POSTLOAD( darius_postload )
{
parse_control(machine);
reset_sound_region(machine);
}
static MACHINE_START( darius )
{
darius_state *state = (darius_state *)machine->driver_data;
memory_configure_bank(machine, "bank1", 0, 4, memory_region(machine, "audiocpu") + 0x10000, 0x8000);
memory_configure_bank(machine, "bank1", 4, 1, memory_region(machine, "audiocpu"), 0x8000);
memory_set_bank(machine, "bank1", 4);
state->maincpu = devtag_get_device(machine, "maincpu");
state->audiocpu = devtag_get_device(machine, "audiocpu");
state->cpub = devtag_get_device(machine, "cpub");
state->adpcm = devtag_get_device(machine, "adpcm");
state->pc080sn = devtag_get_device(machine, "pc080sn");
state->tc0140syt = devtag_get_device(machine, "tc0140syt");
state->lscreen = devtag_get_device(machine, "lscreen");
state->mscreen = devtag_get_device(machine, "mscreen");
state->rscreen = devtag_get_device(machine, "rscreen");
state->filter0_0l = devtag_get_device(machine, "filter0.0l");
state->filter0_0r = devtag_get_device(machine, "filter0.0r");
state->filter0_1l = devtag_get_device(machine, "filter0.1l");
state->filter0_1r = devtag_get_device(machine, "filter0.1r");
state->filter0_2l = devtag_get_device(machine, "filter0.2l");
state->filter0_2r = devtag_get_device(machine, "filter0.2r");
state->filter0_3l = devtag_get_device(machine, "filter0.3l");
state->filter0_3r = devtag_get_device(machine, "filter0.3r");
state->filter1_0l = devtag_get_device(machine, "filter1.0l");
state->filter1_0r = devtag_get_device(machine, "filter1.0r");
state->filter1_1l = devtag_get_device(machine, "filter1.1l");
state->filter1_1r = devtag_get_device(machine, "filter1.1r");
state->filter1_2l = devtag_get_device(machine, "filter1.2l");
state->filter1_2r = devtag_get_device(machine, "filter1.2r");
state->filter1_3l = devtag_get_device(machine, "filter1.3l");
state->filter1_3r = devtag_get_device(machine, "filter1.3r");
state->msm5205_l = devtag_get_device(machine, "msm5205.l");
state->msm5205_r = devtag_get_device(machine, "msm5205.r");
state_save_register_global(machine, state->cpua_ctrl);
state_save_register_global(machine, state->coin_word);
state_save_register_global(machine, state->banknum);
state_save_register_global(machine, state->adpcm_command);
state_save_register_global(machine, state->nmi_enable);
state_save_register_global_array(machine, state->vol);
state_save_register_global_array(machine, state->pan);
state_save_register_postload(machine, darius_postload, NULL);
}
static MACHINE_RESET( darius )
{
darius_state *state = (darius_state *)machine->driver_data;
int i;
state->cpua_ctrl = 0xff;
state->banknum = 0;
state->coin_word = 0;
state->adpcm_command = 0;
state->nmi_enable = 0;
sound_global_enable(machine, 1); /* mixer enabled */
for (i = 0; i < DARIUS_VOL_MAX; i++)
state->vol[i] = 0x00; /* min volume */
for (i = 0; i < DARIUS_PAN_MAX; i++)
state->pan[i] = 0x80; /* center */
for (i = 0; i < 0x10; i++)
{
//logerror( "calc %d = %d\n", i, (int)(100.0f / (float)pow(10.0f, (32.0f - (i * (32.0f / (float)(0xf)))) / 20.0f)) );
state->def_vol[i] = (int)(100.0f / (float)pow(10.0f, (32.0f - (i * (32.0f / (float)(0xf)))) / 20.0f));
}
}
static MACHINE_DRIVER_START( darius ) static MACHINE_DRIVER_START( darius )
/* driver data */
MDRV_DRIVER_DATA(darius_state)
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD("maincpu", M68000,16000000/2) /* 8 MHz ? */ MDRV_CPU_ADD("maincpu", M68000,16000000/2) /* 8 MHz ? */
MDRV_CPU_PROGRAM_MAP(darius_map) MDRV_CPU_PROGRAM_MAP(darius_map)
@ -1178,63 +1291,19 @@ ROM_END
static DRIVER_INIT( darius ) static DRIVER_INIT( darius )
{ {
// taitosnd_setz80_soundcpu( 2 );
}
static STATE_POSTLOAD( darius_postload )
{
parse_control(machine);
reset_sound_region(machine);
}
static MACHINE_START( darius )
{
cpua_ctrl = 0xff;
banknum = -1;
adpcm_command = 0;
nmi_enable = 0;
state_save_register_global(machine, cpua_ctrl);
// (there are other sound vars that may need saving too) //
state_save_register_global(machine, banknum);
state_save_register_global(machine, adpcm_command);
state_save_register_global(machine, nmi_enable);
state_save_register_postload(machine, darius_postload, NULL);
}
static MACHINE_RESET( darius )
{
int i;
/**** setup sound bank image ****/ /**** setup sound bank image ****/
UINT8 *RAM = memory_region(machine, "audiocpu"); UINT8 *RAM = memory_region(machine, "audiocpu");
int i;
for( i = 3; i >= 0; i-- ){ for (i = 3; i >= 0; i--)
{
memcpy(RAM + 0x8000 * i + 0x10000, RAM, 0x4000); memcpy(RAM + 0x8000 * i + 0x10000, RAM, 0x4000);
memcpy(RAM + 0x8000 * i + 0x14000, RAM + 0x4000 * i, 0x4000); memcpy(RAM + 0x8000 * i + 0x14000, RAM + 0x4000 * i, 0x4000);
} }
memory_set_bankptr(machine, "bank1", RAM);
sound_global_enable( machine, 1 ); /* mixer enabled */
for( i = 0; i < DARIUS_VOL_MAX; i++ ){
darius_vol[i] = 0x00; /* min volume */
}
for( i = 0; i < DARIUS_PAN_MAX; i++ ){
darius_pan[i] = 0x80; /* center */
}
for( i = 0; i < 0x10; i++ ){
//logerror( "calc %d = %d\n", i, (int)(100.0f / (float)pow(10.0f, (32.0f - (i * (32.0f / (float)(0xf)))) / 20.0f)) );
darius_def_vol[i] = (int)(100.0f / (float)pow(10.0f, (32.0f - (i * (32.0f / (float)(0xf)))) / 20.0f));
}
} }
GAME( 1986, darius, 0, darius, darius, darius, ROT0, "Taito Corporation Japan", "Darius (World)", 0 ) GAME( 1986, darius, 0, darius, darius, darius, ROT0, "Taito Corporation Japan", "Darius (World)", GAME_SUPPORTS_SAVE )
GAME( 1986, dariusj, darius, darius, dariusj, darius, ROT0, "Taito Corporation", "Darius (Japan)", 0 ) GAME( 1986, dariusj, darius, darius, dariusj, darius, ROT0, "Taito Corporation", "Darius (Japan)", GAME_SUPPORTS_SAVE )
GAME( 1986, dariuso, darius, darius, dariusj, darius, ROT0, "Taito Corporation", "Darius (Japan old version)", 0 ) GAME( 1986, dariuso, darius, darius, dariusj, darius, ROT0, "Taito Corporation", "Darius (Japan old version)", GAME_SUPPORTS_SAVE )
GAME( 1986, dariuse, darius, darius, dariuse, darius, ROT0, "Taito Corporation", "Darius (Extra) (Japan)", 0 ) GAME( 1986, dariuse, darius, darius, dariuse, darius, ROT0, "Taito Corporation", "Darius (Extra) (Japan)", GAME_SUPPORTS_SAVE )

View File

@ -312,38 +312,34 @@ rumbling on a subwoofer in the cabinet.)
#include "driver.h" #include "driver.h"
#include "cpu/z80/z80.h" #include "cpu/z80/z80.h"
#include "includes/taitoipt.h"
#include "cpu/m68000/m68000.h" #include "cpu/m68000/m68000.h"
#include "video/taitoic.h" #include "video/taitoic.h"
#include "machine/taitoio.h" #include "machine/taitoio.h"
#include "audio/taitosnd.h" #include "audio/taitosnd.h"
#include "sound/2610intf.h" #include "sound/2610intf.h"
#include "sound/flt_vol.h" #include "sound/flt_vol.h"
#include "includes/taitoipt.h"
#include "includes/ninjaw.h"
extern const char layout_darius[]; extern const char layout_darius[];
static MACHINE_START( ninjaw );
static MACHINE_RESET( ninjaw );
VIDEO_START( ninjaw );
VIDEO_UPDATE( ninjaw );
static UINT16 cpua_ctrl;
static void parse_control( running_machine *machine ) /* assumes Z80 sandwiched between 68Ks */ static void parse_control( running_machine *machine ) /* assumes Z80 sandwiched between 68Ks */
{ {
/* bit 0 enables cpu B */ /* bit 0 enables cpu B */
/* however this fails when recovering from a save state /* however this fails when recovering from a save state
if cpu B is disabled !! */ if cpu B is disabled !! */
cputag_set_input_line(machine, "sub", INPUT_LINE_RESET, (cpua_ctrl &0x1) ? CLEAR_LINE : ASSERT_LINE); ninjaw_state *state = (ninjaw_state *)machine->driver_data;
cpu_set_input_line(state->subcpu, INPUT_LINE_RESET, (state->cpua_ctrl & 0x1) ? CLEAR_LINE : ASSERT_LINE);
} }
static WRITE16_HANDLER( cpua_ctrl_w ) static WRITE16_HANDLER( cpua_ctrl_w )
{ {
ninjaw_state *state = (ninjaw_state *)space->machine->driver_data;
if ((data &0xff00) && ((data &0xff) == 0)) if ((data &0xff00) && ((data &0xff) == 0))
data = data >> 8; /* for Wgp */ data = data >> 8;
cpua_ctrl = data; state->cpua_ctrl = data;
parse_control(space->machine); parse_control(space->machine);
@ -355,26 +351,28 @@ static WRITE16_HANDLER( cpua_ctrl_w )
SOUND SOUND
*****************************************/ *****************************************/
static INT32 banknum;
static void reset_sound_region( running_machine *machine ) static void reset_sound_region( running_machine *machine )
{ {
memory_set_bankptr(machine, "bank10", memory_region(machine, "audiocpu") + (banknum * 0x4000) + 0x10000 ); ninjaw_state *state = (ninjaw_state *)machine->driver_data;
memory_set_bank(machine, "bank10", state->banknum);
} }
static WRITE8_HANDLER( sound_bankswitch_w ) static WRITE8_HANDLER( sound_bankswitch_w )
{ {
banknum = (data - 1) & 7; ninjaw_state *state = (ninjaw_state *)space->machine->driver_data;
state->banknum = data & 7;
reset_sound_region(space->machine); reset_sound_region(space->machine);
} }
static WRITE16_HANDLER( ninjaw_sound_w ) static WRITE16_HANDLER( ninjaw_sound_w )
{ {
const device_config *tc0140syt = devtag_get_device(space->machine, "tc0140syt"); ninjaw_state *state = (ninjaw_state *)space->machine->driver_data;
if (offset == 0) if (offset == 0)
tc0140syt_port_w(tc0140syt, 0, data & 0xff); tc0140syt_port_w(state->tc0140syt, 0, data & 0xff);
else if (offset == 1) else if (offset == 1)
tc0140syt_comm_w(tc0140syt, 0, data & 0xff); tc0140syt_comm_w(state->tc0140syt, 0, data & 0xff);
#ifdef MAME_DEBUG #ifdef MAME_DEBUG
if (data & 0xff00) if (data & 0xff00)
@ -384,35 +382,44 @@ static WRITE16_HANDLER( ninjaw_sound_w )
static READ16_HANDLER( ninjaw_sound_r ) static READ16_HANDLER( ninjaw_sound_r )
{ {
const device_config *tc0140syt = devtag_get_device(space->machine, "tc0140syt"); ninjaw_state *state = (ninjaw_state *)space->machine->driver_data;
if (offset == 1) if (offset == 1)
return ((tc0140syt_comm_r(tc0140syt, 0) & 0xff)); return ((tc0140syt_comm_r(state->tc0140syt, 0) & 0xff));
else else
return 0; return 0;
} }
/**** sound pan control ****/ /**** sound pan control ****/
static int ninjaw_pandata[4];
static WRITE8_HANDLER( ninjaw_pancontrol ) static WRITE8_HANDLER( ninjaw_pancontrol )
{ {
static const char *const fltname[] = { "2610.1.l", "2610.1.r", "2610.2.l", "2610.2.r" }; ninjaw_state *state = (ninjaw_state *)space->machine->driver_data;
offset = offset&3; const device_config *flt = NULL;
ninjaw_pandata[offset] = (float)data * (100.f / 255.0f); offset &= 3;
//popmessage(" pan %02x %02x %02x %02x", ninjaw_pandata[0], ninjaw_pandata[1], ninjaw_pandata[2], ninjaw_pandata[3] );
flt_volume_set_volume(devtag_get_device(space->machine, fltname[offset]), ninjaw_pandata[offset] / 100.0); switch (offset)
{
case 0: flt = state->_2610_1l; break;
case 1: flt = state->_2610_1r; break;
case 2: flt = state->_2610_2l; break;
case 3: flt = state->_2610_2r; break;
}
state->pandata[offset] = (float)data * (100.f / 255.0f);
//popmessage(" pan %02x %02x %02x %02x", state->pandata[0], state->pandata[1], state->pandata[2], state->pandata[3] );
flt_volume_set_volume(flt, state->pandata[offset] / 100.0);
} }
WRITE16_HANDLER( tc0100scn_triple_screen_w ) WRITE16_HANDLER( tc0100scn_triple_screen_w )
{ {
const device_config *tc0100scn_1 = devtag_get_device(space->machine, "tc0100scn_1"); ninjaw_state *state = (ninjaw_state *)space->machine->driver_data;
const device_config *tc0100scn_2 = devtag_get_device(space->machine, "tc0100scn_2");
const device_config *tc0100scn_3 = devtag_get_device(space->machine, "tc0100scn_3");
tc0100scn_word_w(tc0100scn_1, offset, data, mem_mask); tc0100scn_word_w(state->tc0100scn_1, offset, data, mem_mask);
tc0100scn_word_w(tc0100scn_2, offset, data, mem_mask); tc0100scn_word_w(state->tc0100scn_2, offset, data, mem_mask);
tc0100scn_word_w(tc0100scn_3, offset, data, mem_mask); tc0100scn_word_w(state->tc0100scn_3, offset, data, mem_mask);
} }
/*********************************************************** /***********************************************************
@ -427,7 +434,7 @@ static ADDRESS_MAP_START( ninjaw_master_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x210000, 0x210001) AM_WRITE(cpua_ctrl_w) AM_RANGE(0x210000, 0x210001) AM_WRITE(cpua_ctrl_w)
AM_RANGE(0x220000, 0x220003) AM_READWRITE(ninjaw_sound_r,ninjaw_sound_w) AM_RANGE(0x220000, 0x220003) AM_READWRITE(ninjaw_sound_r,ninjaw_sound_w)
AM_RANGE(0x240000, 0x24ffff) AM_RAM AM_SHARE("share1") AM_RANGE(0x240000, 0x24ffff) AM_RAM AM_SHARE("share1")
AM_RANGE(0x260000, 0x263fff) AM_RAM AM_SHARE("share2") AM_BASE_SIZE_GENERIC(spriteram) AM_RANGE(0x260000, 0x263fff) AM_RAM AM_SHARE("share2") AM_BASE_SIZE_MEMBER(ninjaw_state, spriteram, spriteram_size)
AM_RANGE(0x280000, 0x293fff) AM_DEVREAD("tc0100scn_1", tc0100scn_word_r) AM_WRITE(tc0100scn_triple_screen_w) /* tilemaps (1st screen/all screens) */ AM_RANGE(0x280000, 0x293fff) AM_DEVREAD("tc0100scn_1", tc0100scn_word_r) AM_WRITE(tc0100scn_triple_screen_w) /* tilemaps (1st screen/all screens) */
AM_RANGE(0x2a0000, 0x2a000f) AM_DEVREADWRITE("tc0100scn_1", tc0100scn_ctrl_word_r, tc0100scn_ctrl_word_w) AM_RANGE(0x2a0000, 0x2a000f) AM_DEVREADWRITE("tc0100scn_1", tc0100scn_ctrl_word_r, tc0100scn_ctrl_word_w)
AM_RANGE(0x2c0000, 0x2d3fff) AM_DEVREADWRITE("tc0100scn_2", tc0100scn_word_r, tc0100scn_word_w) /* tilemaps (2nd screen) */ AM_RANGE(0x2c0000, 0x2d3fff) AM_DEVREADWRITE("tc0100scn_2", tc0100scn_word_r, tc0100scn_word_w) /* tilemaps (2nd screen) */
@ -463,7 +470,7 @@ static ADDRESS_MAP_START( darius2_master_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x210000, 0x210001) AM_WRITE(cpua_ctrl_w) AM_RANGE(0x210000, 0x210001) AM_WRITE(cpua_ctrl_w)
AM_RANGE(0x220000, 0x220003) AM_READWRITE(ninjaw_sound_r,ninjaw_sound_w) AM_RANGE(0x220000, 0x220003) AM_READWRITE(ninjaw_sound_r,ninjaw_sound_w)
AM_RANGE(0x240000, 0x24ffff) AM_RAM AM_SHARE("share1") AM_RANGE(0x240000, 0x24ffff) AM_RAM AM_SHARE("share1")
AM_RANGE(0x260000, 0x263fff) AM_RAM AM_SHARE("share2") AM_BASE_SIZE_GENERIC(spriteram) AM_RANGE(0x260000, 0x263fff) AM_RAM AM_SHARE("share2") AM_BASE_SIZE_MEMBER(ninjaw_state, spriteram, spriteram_size)
AM_RANGE(0x280000, 0x293fff) AM_DEVREAD("tc0100scn_1", tc0100scn_word_r) AM_WRITE(tc0100scn_triple_screen_w) /* tilemaps (1st screen/all screens) */ AM_RANGE(0x280000, 0x293fff) AM_DEVREAD("tc0100scn_1", tc0100scn_word_r) AM_WRITE(tc0100scn_triple_screen_w) /* tilemaps (1st screen/all screens) */
AM_RANGE(0x2a0000, 0x2a000f) AM_DEVREADWRITE("tc0100scn_1", tc0100scn_ctrl_word_r, tc0100scn_ctrl_word_w) AM_RANGE(0x2a0000, 0x2a000f) AM_DEVREADWRITE("tc0100scn_1", tc0100scn_ctrl_word_r, tc0100scn_ctrl_word_w)
AM_RANGE(0x2c0000, 0x2d3fff) AM_DEVREADWRITE("tc0100scn_2", tc0100scn_word_r, tc0100scn_word_w) /* tilemaps (2nd screen) */ AM_RANGE(0x2c0000, 0x2d3fff) AM_DEVREADWRITE("tc0100scn_2", tc0100scn_word_r, tc0100scn_word_w) /* tilemaps (2nd screen) */
@ -641,7 +648,8 @@ GFXDECODE_END
/* handler called by the YM2610 emulator when the internal timers cause an IRQ */ /* handler called by the YM2610 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); ninjaw_state *state = (ninjaw_state *)device->machine->driver_data;
cpu_set_input_line(state->audiocpu, 0, irq ? ASSERT_LINE : CLEAR_LINE);
} }
static const ym2610_interface ym2610_config = static const ym2610_interface ym2610_config =
@ -741,8 +749,58 @@ static const tc0140syt_interface ninjaw_tc0140syt_intf =
"maincpu", "audiocpu" "maincpu", "audiocpu"
}; };
static STATE_POSTLOAD( ninjaw_postload )
{
parse_control(machine);
reset_sound_region(machine);
}
static MACHINE_START( ninjaw )
{
ninjaw_state *state = (ninjaw_state *)machine->driver_data;
memory_configure_bank(machine, "bank10", 0, 8, memory_region(machine, "audiocpu") + 0xc000, 0x4000);
state->maincpu = devtag_get_device(machine, "maincpu");
state->audiocpu = devtag_get_device(machine, "audiocpu");
state->subcpu = devtag_get_device(machine, "sub");
state->tc0140syt = devtag_get_device(machine, "tc0140syt");
state->tc0100scn_1 = devtag_get_device(machine, "tc0100scn_1");
state->tc0100scn_2 = devtag_get_device(machine, "tc0100scn_2");
state->tc0100scn_3 = devtag_get_device(machine, "tc0100scn_3");
state->lscreen = devtag_get_device(machine, "lscreen");
state->mscreen = devtag_get_device(machine, "mscreen");
state->rscreen = devtag_get_device(machine, "rscreen");
state->_2610_1l = devtag_get_device(machine, "2610.1.l");
state->_2610_1r = devtag_get_device(machine, "2610.1.r");
state->_2610_2l = devtag_get_device(machine, "2610.2.l");
state->_2610_2r = devtag_get_device(machine, "2610.2.r");
state_save_register_global(machine, state->cpua_ctrl);
state_save_register_global(machine, state->banknum);
state_save_register_global_array(machine, state->pandata);
state_save_register_postload(machine, ninjaw_postload, NULL);
}
static MACHINE_RESET( ninjaw )
{
ninjaw_state *state = (ninjaw_state *)machine->driver_data;
state->cpua_ctrl = 0xff;
state->banknum = 0;
memset(state->pandata, 0, sizeof(state->pandata));
/**** mixer control enable ****/
sound_global_enable(machine, 1); /* mixer enabled */
}
static MACHINE_DRIVER_START( ninjaw ) static MACHINE_DRIVER_START( ninjaw )
/* driver data */
MDRV_DRIVER_DATA(ninjaw_state)
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD("maincpu", M68000,16000000/2) /* 8 MHz ? */ MDRV_CPU_ADD("maincpu", M68000,16000000/2) /* 8 MHz ? */
MDRV_CPU_PROGRAM_MAP(ninjaw_master_map) MDRV_CPU_PROGRAM_MAP(ninjaw_master_map)
@ -827,6 +885,9 @@ MACHINE_DRIVER_END
static MACHINE_DRIVER_START( darius2 ) static MACHINE_DRIVER_START( darius2 )
/* driver data */
MDRV_DRIVER_DATA(ninjaw_state)
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD("maincpu", M68000,16000000/2) /* 8 MHz ? */ MDRV_CPU_ADD("maincpu", M68000,16000000/2) /* 8 MHz ? */
MDRV_CPU_PROGRAM_MAP(darius2_master_map) MDRV_CPU_PROGRAM_MAP(darius2_master_map)
@ -1068,29 +1129,6 @@ ROM_START( darius2 )
ROM_LOAD( "c07-12.107", 0x00000, 0x80000, CRC(e0b71258) SHA1(0258e308b643d723475824752ebffc4ea29d1ac4) ) ROM_LOAD( "c07-12.107", 0x00000, 0x80000, CRC(e0b71258) SHA1(0258e308b643d723475824752ebffc4ea29d1ac4) )
ROM_END ROM_END
static STATE_POSTLOAD( ninjaw_postload )
{
parse_control(machine);
reset_sound_region(machine);
}
static MACHINE_START( ninjaw )
{
cpua_ctrl = 0xff;
banknum = -1;
memset(ninjaw_pandata, 0, sizeof(ninjaw_pandata));
state_save_register_global(machine, cpua_ctrl);
state_save_register_global(machine, banknum);
state_save_register_postload(machine, ninjaw_postload, NULL);
}
static MACHINE_RESET( ninjaw )
{
/**** mixer control enable ****/
sound_global_enable( machine, 1 ); /* mixer enabled */
}
/* Working Games */ /* Working Games */

View File

@ -232,7 +232,6 @@ TODO:
#include "driver.h" #include "driver.h"
#include "cpu/z80/z80.h" #include "cpu/z80/z80.h"
#include "includes/taitoipt.h"
#include "cpu/m68000/m68000.h" #include "cpu/m68000/m68000.h"
#include "machine/eeprom.h" #include "machine/eeprom.h"
#include "video/taitoic.h" #include "video/taitoic.h"
@ -240,39 +239,33 @@ TODO:
#include "audio/taitosnd.h" #include "audio/taitosnd.h"
#include "sound/2610intf.h" #include "sound/2610intf.h"
#include "sound/flt_vol.h" #include "sound/flt_vol.h"
#include "includes/othunder.h"
VIDEO_START( othunder ); #include "includes/taitoipt.h"
VIDEO_UPDATE( othunder );
/*********************************************************** /***********************************************************
INTERRUPTS INTERRUPTS
***********************************************************/ ***********************************************************/
static int vblank_irq, ad_irq;
static MACHINE_RESET( othunder )
{
vblank_irq = 0;
ad_irq = 0;
}
static void update_irq( running_machine *machine ) static void update_irq( running_machine *machine )
{ {
cputag_set_input_line(machine, "maincpu", 6, ad_irq ? ASSERT_LINE : CLEAR_LINE); othunder_state *state = (othunder_state *)machine->driver_data;
cputag_set_input_line(machine, "maincpu", 5, vblank_irq ? ASSERT_LINE : CLEAR_LINE); cpu_set_input_line(state->maincpu, 6, state->ad_irq ? ASSERT_LINE : CLEAR_LINE);
cpu_set_input_line(state->maincpu, 5, state->vblank_irq ? ASSERT_LINE : CLEAR_LINE);
} }
static WRITE16_HANDLER( irq_ack_w ) static WRITE16_HANDLER( irq_ack_w )
{ {
othunder_state *state = (othunder_state *)space->machine->driver_data;
switch (offset) switch (offset)
{ {
case 0: case 0:
vblank_irq = 0; state->vblank_irq = 0;
break; break;
case 1: case 1:
ad_irq = 0; state->ad_irq = 0;
break; break;
} }
@ -281,13 +274,17 @@ static WRITE16_HANDLER( irq_ack_w )
static INTERRUPT_GEN( vblank_interrupt ) static INTERRUPT_GEN( vblank_interrupt )
{ {
vblank_irq = 1; othunder_state *state = (othunder_state *)device->machine->driver_data;
state->vblank_irq = 1;
update_irq(device->machine); update_irq(device->machine);
} }
static TIMER_CALLBACK( ad_interrupt ) static TIMER_CALLBACK( ad_interrupt )
{ {
ad_irq = 1; othunder_state *state = (othunder_state *)machine->driver_data;
state->ad_irq = 1;
update_irq(machine); update_irq(machine);
} }
@ -313,7 +310,7 @@ static const eeprom_interface eeprom_intf =
static WRITE16_HANDLER( othunder_tc0220ioc_w ) static WRITE16_HANDLER( othunder_tc0220ioc_w )
{ {
const device_config *device; othunder_state *state = (othunder_state *)space->machine->driver_data;
if (ACCESSING_BITS_0_7) if (ACCESSING_BITS_0_7)
{ {
@ -336,15 +333,13 @@ static WRITE16_HANDLER( othunder_tc0220ioc_w )
if (data & 4) if (data & 4)
popmessage("OBPRI SET!"); popmessage("OBPRI SET!");
device = devtag_get_device(space->machine, "eeprom"); eeprom_write_bit(state->eeprom, data & 0x40);
eeprom_write_bit(device, data & 0x40); eeprom_set_clock_line(state->eeprom, (data & 0x20) ? ASSERT_LINE : CLEAR_LINE);
eeprom_set_clock_line(device, (data & 0x20) ? ASSERT_LINE : CLEAR_LINE); eeprom_set_cs_line(state->eeprom, (data & 0x10) ? CLEAR_LINE : ASSERT_LINE);
eeprom_set_cs_line(device, (data & 0x10) ? CLEAR_LINE : ASSERT_LINE);
break; break;
default: default:
device = devtag_get_device(space->machine, "tc0220ioc"); tc0220ioc_w(state->tc0220ioc, offset, data & 0xff);
tc0220ioc_w(device, offset, data & 0xff);
} }
} }
} }
@ -356,17 +351,15 @@ if (data & 4)
static READ16_HANDLER( othunder_tc0220ioc_r ) static READ16_HANDLER( othunder_tc0220ioc_r )
{ {
const device_config *device; othunder_state *state = (othunder_state *)space->machine->driver_data;
switch (offset) switch (offset)
{ {
case 0x03: case 0x03:
device = devtag_get_device(space->machine, "eeprom"); return (eeprom_read_bit(state->eeprom) & 1) << 7;
return (eeprom_read_bit(device) & 1) << 7;
default: default:
device = devtag_get_device(space->machine, "tc0220ioc"); return tc0220ioc_r(state->tc0220ioc, offset);
return tc0220ioc_r(device, offset);
} }
} }
@ -397,46 +390,34 @@ static WRITE16_HANDLER( othunder_lightgun_w )
SOUND SOUND
*****************************************/ *****************************************/
static INT32 banknum;
static void reset_sound_region( running_machine *machine ) static void reset_sound_region( running_machine *machine )
{ {
memory_set_bankptr(machine, "bank10", memory_region(machine, "audiocpu") + (banknum * 0x4000) + 0x10000 ); othunder_state *state = (othunder_state *)machine->driver_data;
} memory_set_bank(machine, "bank10", state->banknum);
static STATE_POSTLOAD( othunder_postload )
{
reset_sound_region(machine);
}
static MACHINE_START( othunder )
{
banknum = -1;
state_save_register_global(machine, banknum);
state_save_register_postload(machine, othunder_postload, NULL);
} }
static WRITE8_HANDLER( sound_bankswitch_w ) static WRITE8_HANDLER( sound_bankswitch_w )
{ {
banknum = (data - 1) & 7; othunder_state *state = (othunder_state *)space->machine->driver_data;
state->banknum = data & 7;
reset_sound_region(space->machine); reset_sound_region(space->machine);
} }
static WRITE16_HANDLER( othunder_sound_w ) static WRITE16_HANDLER( othunder_sound_w )
{ {
const device_config *tc0140syt = devtag_get_device(space->machine, "tc0140syt"); othunder_state *state = (othunder_state *)space->machine->driver_data;
if (offset == 0) if (offset == 0)
tc0140syt_port_w(tc0140syt, 0, data & 0xff); tc0140syt_port_w(state->tc0140syt, 0, data & 0xff);
else if (offset == 1) else if (offset == 1)
tc0140syt_comm_w(tc0140syt, 0, data & 0xff); tc0140syt_comm_w(state->tc0140syt, 0, data & 0xff);
} }
static READ16_HANDLER( othunder_sound_r ) static READ16_HANDLER( othunder_sound_r )
{ {
const device_config *tc0140syt = devtag_get_device(space->machine, "tc0140syt"); othunder_state *state = (othunder_state *)space->machine->driver_data;
if (offset == 1) if (offset == 1)
return ((tc0140syt_comm_r(tc0140syt, 0) & 0xff)); return ((tc0140syt_comm_r(state->tc0140syt, 0) & 0xff));
else else
return 0; return 0;
} }
@ -445,29 +426,29 @@ static WRITE8_HANDLER( othunder_TC0310FAM_w )
{ {
/* there are two TC0310FAM, one for CH1 and one for CH2 from the YM2610. The /* there are two TC0310FAM, one for CH1 and one for CH2 from the YM2610. The
PSG output is routed to both chips. */ PSG output is routed to both chips. */
static int pan[4]; othunder_state *state = (othunder_state *)space->machine->driver_data;
int voll, volr; int voll, volr;
pan[offset] = data & 0x1f; state->pan[offset] = data & 0x1f;
/* PSG output (single ANALOG OUT pin on the YM2610, but we have three channels /* PSG output (single ANALOG OUT pin on the YM2610, but we have three channels
because we are using the AY-3-8910 emulation. */ because we are using the AY-3-8910 emulation. */
volr = (pan[0] + pan[2]) * 100 / (2 * 0x1f); volr = (state->pan[0] + state->pan[2]) * 100 / (2 * 0x1f);
voll = (pan[1] + pan[3]) * 100 / (2 * 0x1f); voll = (state->pan[1] + state->pan[3]) * 100 / (2 * 0x1f);
flt_volume_set_volume(devtag_get_device(space->machine, "2610.0l"), voll / 100.0); flt_volume_set_volume(state->_2610_0l, voll / 100.0);
flt_volume_set_volume(devtag_get_device(space->machine, "2610.0r"), volr / 100.0); flt_volume_set_volume(state->_2610_0r, volr / 100.0);
/* CH1 */ /* CH1 */
volr = pan[0] * 100 / 0x1f; volr = state->pan[0] * 100 / 0x1f;
voll = pan[1] * 100 / 0x1f; voll = state->pan[1] * 100 / 0x1f;
flt_volume_set_volume(devtag_get_device(space->machine, "2610.1l"), voll / 100.0); flt_volume_set_volume(state->_2610_1l, voll / 100.0);
flt_volume_set_volume(devtag_get_device(space->machine, "2610.1r"), volr / 100.0); flt_volume_set_volume(state->_2610_1r, volr / 100.0);
/* CH2 */ /* CH2 */
volr = pan[2] * 100 / 0x1f; volr = state->pan[2] * 100 / 0x1f;
voll = pan[3] * 100 / 0x1f; voll = state->pan[3] * 100 / 0x1f;
flt_volume_set_volume(devtag_get_device(space->machine, "2610.2l"), voll / 100.0); flt_volume_set_volume(state->_2610_2l, voll / 100.0);
flt_volume_set_volume(devtag_get_device(space->machine, "2610.2r"), volr / 100.0); flt_volume_set_volume(state->_2610_2r, volr / 100.0);
} }
@ -485,7 +466,7 @@ static ADDRESS_MAP_START( othunder_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x200000, 0x20ffff) AM_DEVREADWRITE("tc0100scn", tc0100scn_word_r, tc0100scn_word_w) /* tilemaps */ AM_RANGE(0x200000, 0x20ffff) AM_DEVREADWRITE("tc0100scn", tc0100scn_word_r, tc0100scn_word_w) /* tilemaps */
AM_RANGE(0x220000, 0x22000f) AM_DEVREADWRITE("tc0100scn", tc0100scn_ctrl_word_r, tc0100scn_ctrl_word_w) AM_RANGE(0x220000, 0x22000f) AM_DEVREADWRITE("tc0100scn", tc0100scn_ctrl_word_r, tc0100scn_ctrl_word_w)
AM_RANGE(0x300000, 0x300003) AM_READWRITE(othunder_sound_r, othunder_sound_w) AM_RANGE(0x300000, 0x300003) AM_READWRITE(othunder_sound_r, othunder_sound_w)
AM_RANGE(0x400000, 0x4005ff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) AM_RANGE(0x400000, 0x4005ff) AM_RAM AM_BASE_SIZE_MEMBER(othunder_state, spriteram, spriteram_size)
AM_RANGE(0x500000, 0x500007) AM_READWRITE(othunder_lightgun_r, othunder_lightgun_w) AM_RANGE(0x500000, 0x500007) AM_READWRITE(othunder_lightgun_r, othunder_lightgun_w)
AM_RANGE(0x600000, 0x600003) AM_WRITE(irq_ack_w) AM_RANGE(0x600000, 0x600003) AM_WRITE(irq_ack_w)
ADDRESS_MAP_END ADDRESS_MAP_END
@ -652,7 +633,8 @@ GFXDECODE_END
/* handler called by the YM2610 emulator when the internal timers cause an IRQ */ /* handler called by the YM2610 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); othunder_state *state = (othunder_state *)device->machine->driver_data;
cpu_set_input_line(state->audiocpu, 0, irq ? ASSERT_LINE : CLEAR_LINE);
} }
static const ym2610_interface ym2610_config = static const ym2610_interface ym2610_config =
@ -692,8 +674,52 @@ static const tc0140syt_interface othunder_tc0140syt_intf =
"maincpu", "audiocpu" "maincpu", "audiocpu"
}; };
static STATE_POSTLOAD( othunder_postload )
{
reset_sound_region(machine);
}
static MACHINE_START( othunder )
{
othunder_state *state = (othunder_state *)machine->driver_data;
memory_configure_bank(machine, "bank10", 0, 4, memory_region(machine, "audiocpu") + 0xc000, 0x4000);
state->maincpu = devtag_get_device(machine, "maincpu");
state->audiocpu = devtag_get_device(machine, "audiocpu");
state->eeprom = devtag_get_device(machine, "eeprom");
state->tc0220ioc = devtag_get_device(machine, "tc0220ioc");
state->tc0100scn = devtag_get_device(machine, "tc0100scn");
state->tc0110pcr = devtag_get_device(machine, "tc0110pcr");
state->tc0140syt = devtag_get_device(machine, "tc0140syt");
state->_2610_0l = devtag_get_device(machine, "2610.0l");
state->_2610_0r = devtag_get_device(machine, "2610.0r");
state->_2610_1l = devtag_get_device(machine, "2610.1l");
state->_2610_1r = devtag_get_device(machine, "2610.1r");
state->_2610_2l = devtag_get_device(machine, "2610.2l");
state->_2610_2r = devtag_get_device(machine, "2610.2r");
state_save_register_global(machine, state->vblank_irq);
state_save_register_global(machine, state->ad_irq);
state_save_register_global(machine, state->banknum);
state_save_register_global_array(machine, state->pan);
state_save_register_postload(machine, othunder_postload, NULL);
}
static MACHINE_RESET( othunder )
{
othunder_state *state = (othunder_state *)machine->driver_data;
state->vblank_irq = 0;
state->ad_irq = 0;
state->banknum = 0;
}
static MACHINE_DRIVER_START( othunder ) static MACHINE_DRIVER_START( othunder )
/* driver data */
MDRV_DRIVER_DATA(othunder_state)
/* basic machine hardware */ /* basic machine hardware */
// MDRV_CPU_ADD("maincpu", M68000, 24000000/2 ) /* 12 MHz */ // MDRV_CPU_ADD("maincpu", M68000, 24000000/2 ) /* 12 MHz */
MDRV_CPU_ADD("maincpu", M68000, 13000000 ) /* fixes garbage graphics on startup */ MDRV_CPU_ADD("maincpu", M68000, 13000000 ) /* fixes garbage graphics on startup */

View File

@ -139,16 +139,7 @@ Region byte at offset 0x031:
#include "sound/2610intf.h" #include "sound/2610intf.h"
#include "machine/timekpr.h" #include "machine/timekpr.h"
#include "machine/taitoio.h" #include "machine/taitoio.h"
#include "includes/slapshot.h"
VIDEO_EOF( taito_no_buffer );
VIDEO_START( slapshot );
VIDEO_UPDATE( slapshot );
static UINT16 *color_ram;
extern UINT16 *taito_sprite_ext;
extern size_t taito_spriteext_size;
/****************************************************** /******************************************************
@ -157,19 +148,21 @@ extern size_t taito_spriteext_size;
static READ16_HANDLER( color_ram_word_r ) static READ16_HANDLER( color_ram_word_r )
{ {
return color_ram[offset]; slapshot_state *state = (slapshot_state *)space->machine->driver_data;
return state->color_ram[offset];
} }
static WRITE16_HANDLER( color_ram_word_w ) static WRITE16_HANDLER( color_ram_word_w )
{ {
slapshot_state *state = (slapshot_state *)space->machine->driver_data;
int r,g,b; int r,g,b;
COMBINE_DATA(&color_ram[offset]); COMBINE_DATA(&state->color_ram[offset]);
if ((offset % 2) == 1) /* assume words written sequentially */ if ((offset % 2) == 1) /* assume words written sequentially */
{ {
r = (color_ram[offset-1] &0xff); r = (state->color_ram[offset- 1 ] & 0xff);
g = (color_ram[offset] &0xff00) >> 8; g = (state->color_ram[offset] & 0xff00) >> 8;
b = (color_ram[offset] &0xff); b = (state->color_ram[offset] & 0xff);
palette_set_color(space->machine, offset / 2, MAKE_RGB(r,g,b)); palette_set_color(space->machine, offset / 2, MAKE_RGB(r,g,b));
} }
@ -182,7 +175,8 @@ static WRITE16_HANDLER( color_ram_word_w )
static TIMER_CALLBACK( slapshot_interrupt6 ) static TIMER_CALLBACK( slapshot_interrupt6 )
{ {
cputag_set_input_line(machine, "maincpu", 6, HOLD_LINE); slapshot_state *state = (slapshot_state *)machine->driver_data;
cpu_set_input_line(state->maincpu, 6, HOLD_LINE);
} }
@ -199,7 +193,7 @@ static INTERRUPT_GEN( slapshot_interrupt )
static READ16_HANDLER( slapshot_service_input_r ) static READ16_HANDLER( slapshot_service_input_r )
{ {
const device_config *tc0640fio = devtag_get_device(space->machine, "tc0640fio"); slapshot_state *state = (slapshot_state *)space->machine->driver_data;
switch (offset) switch (offset)
{ {
case 0x03: case 0x03:
@ -207,7 +201,7 @@ static READ16_HANDLER( slapshot_service_input_r )
(input_port_read(space->machine, "SERVICE") & 0x10)) << 8; /* IN3 + service switch */ (input_port_read(space->machine, "SERVICE") & 0x10)) << 8; /* IN3 + service switch */
default: default:
return tc0640fio_r(tc0640fio, offset) << 8; return tc0640fio_r(state->tc0640fio, offset) << 8;
} }
} }
@ -220,47 +214,36 @@ static READ16_HANDLER( opwolf3_adc_r )
static WRITE16_HANDLER( opwolf3_adc_req_w ) static WRITE16_HANDLER( opwolf3_adc_req_w )
{ {
slapshot_state *state = (slapshot_state *)space->machine->driver_data;
/* 4 writes a frame - one for each analogue port */ /* 4 writes a frame - one for each analogue port */
cputag_set_input_line(space->machine, "maincpu", 3, HOLD_LINE); cpu_set_input_line(state->maincpu, 3, HOLD_LINE);
} }
/***************************************************** /*****************************************************
SOUND SOUND
*****************************************************/ *****************************************************/
static INT32 banknum;
static void reset_sound_region( running_machine *machine ) static void reset_sound_region( running_machine *machine )
{ {
memory_set_bankptr(machine, "bank10", memory_region(machine, "audiocpu") + (banknum * 0x4000) + 0x10000 ); slapshot_state *state = (slapshot_state *)machine->driver_data;
memory_set_bank(machine, "bank10", state->banknum);
} }
static STATE_POSTLOAD( slapshot_postload )
{
reset_sound_region(machine);
}
static MACHINE_START( slapshot )
{
banknum = -1;
state_save_register_global(machine, banknum);
state_save_register_postload(machine, slapshot_postload, NULL);
}
static WRITE8_HANDLER( sound_bankswitch_w ) static WRITE8_HANDLER( sound_bankswitch_w )
{ {
banknum = (data - 1) & 7; slapshot_state *state = (slapshot_state *)space->machine->driver_data;
state->banknum = data & 7;
reset_sound_region(space->machine); reset_sound_region(space->machine);
} }
static WRITE16_HANDLER( slapshot_msb_sound_w ) static WRITE16_HANDLER( slapshot_msb_sound_w )
{ {
const device_config *tc0140syt = devtag_get_device(space->machine, "tc0140syt"); slapshot_state *state = (slapshot_state *)space->machine->driver_data;
if (offset == 0) if (offset == 0)
tc0140syt_port_w(tc0140syt, 0, (data >> 8) & 0xff); tc0140syt_port_w(state->tc0140syt, 0, (data >> 8) & 0xff);
else if (offset == 1) else if (offset == 1)
tc0140syt_comm_w(tc0140syt, 0, (data >> 8) & 0xff); tc0140syt_comm_w(state->tc0140syt, 0, (data >> 8) & 0xff);
#ifdef MAME_DEBUG #ifdef MAME_DEBUG
if (data & 0xff) if (data & 0xff)
@ -270,9 +253,9 @@ static WRITE16_HANDLER( slapshot_msb_sound_w )
static READ16_HANDLER( slapshot_msb_sound_r ) static READ16_HANDLER( slapshot_msb_sound_r )
{ {
const device_config *tc0140syt = devtag_get_device(space->machine, "tc0140syt"); slapshot_state *state = (slapshot_state *)space->machine->driver_data;
if (offset == 1) if (offset == 1)
return ((tc0140syt_comm_r(tc0140syt, 0) & 0xff) << 8); return ((tc0140syt_comm_r(state->tc0140syt, 0) & 0xff) << 8);
else else
return 0; return 0;
} }
@ -285,11 +268,11 @@ static READ16_HANDLER( slapshot_msb_sound_r )
static ADDRESS_MAP_START( slapshot_map, ADDRESS_SPACE_PROGRAM, 16 ) static ADDRESS_MAP_START( slapshot_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x0fffff) AM_ROM AM_RANGE(0x000000, 0x0fffff) AM_ROM
AM_RANGE(0x500000, 0x50ffff) AM_RAM /* main RAM */ AM_RANGE(0x500000, 0x50ffff) AM_RAM /* main RAM */
AM_RANGE(0x600000, 0x60ffff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) /* sprite ram */ AM_RANGE(0x600000, 0x60ffff) AM_RAM AM_BASE_SIZE_MEMBER(slapshot_state, spriteram, spriteram_size) /* sprite ram */
AM_RANGE(0x700000, 0x701fff) AM_RAM AM_BASE(&taito_sprite_ext) AM_SIZE(&taito_spriteext_size) /* debugging */ AM_RANGE(0x700000, 0x701fff) AM_RAM AM_BASE_SIZE_MEMBER(slapshot_state, spriteext, spriteext_size) /* debugging */
AM_RANGE(0x800000, 0x80ffff) AM_DEVREADWRITE("tc0480scp", tc0480scp_word_r, tc0480scp_word_w) /* tilemaps */ AM_RANGE(0x800000, 0x80ffff) AM_DEVREADWRITE("tc0480scp", tc0480scp_word_r, tc0480scp_word_w) /* tilemaps */
AM_RANGE(0x830000, 0x83002f) AM_DEVREADWRITE("tc0480scp", tc0480scp_ctrl_word_r, tc0480scp_ctrl_word_w) AM_RANGE(0x830000, 0x83002f) AM_DEVREADWRITE("tc0480scp", tc0480scp_ctrl_word_r, tc0480scp_ctrl_word_w)
AM_RANGE(0x900000, 0x907fff) AM_READWRITE(color_ram_word_r, color_ram_word_w) AM_BASE(&color_ram) /* 8bpg palette */ AM_RANGE(0x900000, 0x907fff) AM_READWRITE(color_ram_word_r, color_ram_word_w) AM_BASE_MEMBER(slapshot_state, color_ram) /* 8bpg palette */
AM_RANGE(0xa00000, 0xa03fff) AM_DEVREADWRITE8("mk48t08", timekeeper_r, timekeeper_w, 0xff00) /* nvram (only low bytes used) */ AM_RANGE(0xa00000, 0xa03fff) AM_DEVREADWRITE8("mk48t08", timekeeper_r, timekeeper_w, 0xff00) /* nvram (only low bytes used) */
AM_RANGE(0xb00000, 0xb0001f) AM_DEVWRITE8("tc0360pri", tc0360pri_w, 0xff00) /* priority chip */ AM_RANGE(0xb00000, 0xb0001f) AM_DEVWRITE8("tc0360pri", tc0360pri_w, 0xff00) /* priority chip */
AM_RANGE(0xc00000, 0xc0000f) AM_DEVREADWRITE("tc0640fio", tc0640fio_halfword_byteswap_r, tc0640fio_halfword_byteswap_w) AM_RANGE(0xc00000, 0xc0000f) AM_DEVREADWRITE("tc0640fio", tc0640fio_halfword_byteswap_r, tc0640fio_halfword_byteswap_w)
@ -300,11 +283,11 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( opwolf3_map, ADDRESS_SPACE_PROGRAM, 16 ) static ADDRESS_MAP_START( opwolf3_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x1fffff) AM_ROM AM_RANGE(0x000000, 0x1fffff) AM_ROM
AM_RANGE(0x500000, 0x50ffff) AM_RAM /* main RAM */ AM_RANGE(0x500000, 0x50ffff) AM_RAM /* main RAM */
AM_RANGE(0x600000, 0x60ffff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) /* sprite ram */ AM_RANGE(0x600000, 0x60ffff) AM_RAM AM_BASE_SIZE_MEMBER(slapshot_state, spriteram, spriteram_size) /* sprite ram */
AM_RANGE(0x700000, 0x701fff) AM_RAM AM_BASE(&taito_sprite_ext) AM_SIZE(&taito_spriteext_size) /* debugging */ AM_RANGE(0x700000, 0x701fff) AM_RAM AM_BASE_SIZE_MEMBER(slapshot_state, spriteext, spriteext_size) /* debugging */
AM_RANGE(0x800000, 0x80ffff) AM_DEVREADWRITE("tc0480scp", tc0480scp_word_r, tc0480scp_word_w) /* tilemaps */ AM_RANGE(0x800000, 0x80ffff) AM_DEVREADWRITE("tc0480scp", tc0480scp_word_r, tc0480scp_word_w) /* tilemaps */
AM_RANGE(0x830000, 0x83002f) AM_DEVREADWRITE("tc0480scp", tc0480scp_ctrl_word_r, tc0480scp_ctrl_word_w) AM_RANGE(0x830000, 0x83002f) AM_DEVREADWRITE("tc0480scp", tc0480scp_ctrl_word_r, tc0480scp_ctrl_word_w)
AM_RANGE(0x900000, 0x907fff) AM_READWRITE(color_ram_word_r, color_ram_word_w) AM_BASE(&color_ram) /* 8bpg palette */ AM_RANGE(0x900000, 0x907fff) AM_READWRITE(color_ram_word_r, color_ram_word_w) AM_BASE_MEMBER(slapshot_state, color_ram) /* 8bpg palette */
AM_RANGE(0xa00000, 0xa03fff) AM_DEVREADWRITE8("mk48t08", timekeeper_r, timekeeper_w, 0xff00) /* nvram (only low bytes used) */ AM_RANGE(0xa00000, 0xa03fff) AM_DEVREADWRITE8("mk48t08", timekeeper_r, timekeeper_w, 0xff00) /* nvram (only low bytes used) */
AM_RANGE(0xb00000, 0xb0001f) AM_DEVWRITE8("tc0360pri", tc0360pri_w, 0xff00) /* priority chip */ AM_RANGE(0xb00000, 0xb0001f) AM_DEVWRITE8("tc0360pri", tc0360pri_w, 0xff00) /* priority chip */
AM_RANGE(0xc00000, 0xc0000f) AM_DEVREADWRITE("tc0640fio", tc0640fio_halfword_byteswap_r, tc0640fio_halfword_byteswap_w) AM_RANGE(0xc00000, 0xc0000f) AM_DEVREADWRITE("tc0640fio", tc0640fio_halfword_byteswap_r, tc0640fio_halfword_byteswap_w)
@ -485,7 +468,8 @@ GFXDECODE_END
/* handler called by the YM2610 emulator when the internal timers cause an IRQ */ /* handler called by the YM2610 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); slapshot_state *state = (slapshot_state *)device->machine->driver_data;
cpu_set_input_line(state->audiocpu, 0, irq ? ASSERT_LINE : CLEAR_LINE);
} }
static const ym2610_interface ym2610_config = static const ym2610_interface ym2610_config =
@ -519,8 +503,35 @@ static const tc0140syt_interface slapshot_tc0140syt_intf =
"maincpu", "audiocpu" "maincpu", "audiocpu"
}; };
static STATE_POSTLOAD( slapshot_postload )
{
reset_sound_region(machine);
}
static MACHINE_START( slapshot )
{
slapshot_state *state = (slapshot_state *)machine->driver_data;
memory_configure_bank(machine, "bank10", 0, 4, memory_region(machine, "audiocpu") + 0xc000, 0x4000);
state->maincpu = devtag_get_device(machine, "maincpu");
state->audiocpu = devtag_get_device(machine, "audiocpu");
state->tc0140syt = devtag_get_device(machine, "tc0140syt");
state->tc0480scp = devtag_get_device(machine, "tc0480scp");
state->tc0360pri = devtag_get_device(machine, "tc0360pri");
state->tc0640fio = devtag_get_device(machine, "tc0640fio");
state->banknum = 0;
state_save_register_global(machine, state->banknum);
state_save_register_postload(machine, slapshot_postload, NULL);
}
static MACHINE_DRIVER_START( slapshot ) static MACHINE_DRIVER_START( slapshot )
/* driver data */
MDRV_DRIVER_DATA(slapshot_state)
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD("maincpu", M68000, 14346000) /* 28.6860 MHz / 2 ??? */ MDRV_CPU_ADD("maincpu", M68000, 14346000) /* 28.6860 MHz / 2 ??? */
MDRV_CPU_PROGRAM_MAP(slapshot_map) MDRV_CPU_PROGRAM_MAP(slapshot_map)
@ -570,6 +581,9 @@ MACHINE_DRIVER_END
static MACHINE_DRIVER_START( opwolf3 ) static MACHINE_DRIVER_START( opwolf3 )
/* driver data */
MDRV_DRIVER_DATA(slapshot_state)
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD("maincpu", M68000, 14346000) /* 28.6860 MHz / 2 ??? */ MDRV_CPU_ADD("maincpu", M68000, 14346000) /* 28.6860 MHz / 2 ??? */
MDRV_CPU_PROGRAM_MAP(opwolf3_map) MDRV_CPU_PROGRAM_MAP(opwolf3_map)
@ -580,6 +594,8 @@ static MACHINE_DRIVER_START( opwolf3 )
MDRV_QUANTUM_TIME(HZ(600)) MDRV_QUANTUM_TIME(HZ(600))
MDRV_MACHINE_START(slapshot)
MDRV_TC0640FIO_ADD("tc0640fio", slapshot_io_intf) MDRV_TC0640FIO_ADD("tc0640fio", slapshot_io_intf)
/* video hardware */ /* video hardware */

View File

@ -145,7 +145,6 @@ Colscroll effects?
#include "driver.h" #include "driver.h"
#include "cpu/z80/z80.h" #include "cpu/z80/z80.h"
#include "includes/taitoipt.h"
#include "rendlay.h" #include "rendlay.h"
#include "cpu/m68000/m68000.h" #include "cpu/m68000/m68000.h"
#include "video/taitoic.h" #include "video/taitoic.h"
@ -153,71 +152,79 @@ Colscroll effects?
#include "audio/taitosnd.h" #include "audio/taitosnd.h"
#include "sound/2610intf.h" #include "sound/2610intf.h"
#include "sound/flt_vol.h" #include "sound/flt_vol.h"
#include "includes/warriorb.h"
#include "includes/taitoipt.h"
static MACHINE_START( warriorb ); static MACHINE_START( warriorb );
static MACHINE_RESET( taito_dualscreen ); static MACHINE_RESET( taito_dualscreen );
VIDEO_START( warriorb );
VIDEO_UPDATE( warriorb );
/*********************************************************** /***********************************************************
SOUND SOUND
***********************************************************/ ***********************************************************/
static INT32 banknum;
static void reset_sound_region( running_machine *machine ) static void reset_sound_region( running_machine *machine )
{ {
memory_set_bankptr(machine, "bank10", memory_region(machine, "audiocpu") + (banknum * 0x4000) + 0x10000 ); warriorb_state *state = (warriorb_state *)machine->driver_data;
memory_set_bank(machine, "bank10", state->banknum);
} }
static WRITE8_HANDLER( sound_bankswitch_w ) static WRITE8_HANDLER( sound_bankswitch_w )
{ {
banknum = (data - 1) & 7; warriorb_state *state = (warriorb_state *)space->machine->driver_data;
state->banknum = data & 7;
reset_sound_region(space->machine); reset_sound_region(space->machine);
} }
static WRITE16_HANDLER( warriorb_sound_w ) static WRITE16_HANDLER( warriorb_sound_w )
{ {
const device_config *tc0140syt = devtag_get_device(space->machine, "tc0140syt"); warriorb_state *state = (warriorb_state *)space->machine->driver_data;
if (offset == 0) if (offset == 0)
tc0140syt_port_w (tc0140syt, 0, data & 0xff); tc0140syt_port_w(state->tc0140syt, 0, data & 0xff);
else if (offset == 1) else if (offset == 1)
tc0140syt_comm_w (tc0140syt, 0, data & 0xff); tc0140syt_comm_w(state->tc0140syt, 0, data & 0xff);
} }
static READ16_HANDLER( warriorb_sound_r ) static READ16_HANDLER( warriorb_sound_r )
{ {
const device_config *tc0140syt = devtag_get_device(space->machine, "tc0140syt"); warriorb_state *state = (warriorb_state *)space->machine->driver_data;
if (offset == 1) if (offset == 1)
return ((tc0140syt_comm_r (tc0140syt, 0) & 0xff)); return ((tc0140syt_comm_r(state->tc0140syt, 0) & 0xff));
else return 0; else
return 0;
} }
static int ninjaw_pandata[4]; /**** sound pan control ****/
static WRITE8_HANDLER( warriorb_pancontrol ) static WRITE8_HANDLER( warriorb_pancontrol )
{ {
static const char *const fltname[] = { "2610.1.l", "2610.1.r", "2610.2.l", "2610.2.r" }; warriorb_state *state = (warriorb_state *)space->machine->driver_data;
const device_config *flt = NULL;
offset &= 3;
offset = offset&3; switch (offset)
ninjaw_pandata[offset] = (data<<1) + data; /* original volume*3 */ {
case 0: flt = state->_2610_1l; break;
case 1: flt = state->_2610_1r; break;
case 2: flt = state->_2610_2l; break;
case 3: flt = state->_2610_2r; break;
}
// popmessage(" pan %02x %02x %02x %02x", ninjaw_pandata[0], ninjaw_pandata[1], ninjaw_pandata[2], ninjaw_pandata[3] ); state->pandata[offset] = (data << 1) + data; /* original volume*3 */
//popmessage(" pan %02x %02x %02x %02x", state->pandata[0], state->pandata[1], state->pandata[2], state->pandata[3] );
flt_volume_set_volume(devtag_get_device(space->machine, fltname[offset & 3]), ninjaw_pandata[offset] / 100.0); flt_volume_set_volume(flt, state->pandata[offset] / 100.0);
} }
WRITE16_HANDLER( tc0100scn_dual_screen_w ) WRITE16_HANDLER( tc0100scn_dual_screen_w )
{ {
const device_config *tc0100scn_1 = devtag_get_device(space->machine, "tc0100scn_1"); warriorb_state *state = (warriorb_state *)space->machine->driver_data;
const device_config *tc0100scn_2 = devtag_get_device(space->machine, "tc0100scn_2");
tc0100scn_word_w(tc0100scn_1, offset, data, mem_mask); tc0100scn_word_w(state->tc0100scn_1, offset, data, mem_mask);
tc0100scn_word_w(tc0100scn_2, offset, data, mem_mask); tc0100scn_word_w(state->tc0100scn_2, offset, data, mem_mask);
} }
/*********************************************************** /***********************************************************
@ -234,7 +241,7 @@ static ADDRESS_MAP_START( darius2d_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x260000, 0x26000f) AM_DEVREADWRITE("tc0100scn_2", tc0100scn_ctrl_word_r, tc0100scn_ctrl_word_w) AM_RANGE(0x260000, 0x26000f) AM_DEVREADWRITE("tc0100scn_2", tc0100scn_ctrl_word_r, tc0100scn_ctrl_word_w)
AM_RANGE(0x400000, 0x400007) AM_DEVREADWRITE("tc0110pcr_1", tc0110pcr_word_r, tc0110pcr_step1_word_w) /* palette (1st screen) */ AM_RANGE(0x400000, 0x400007) AM_DEVREADWRITE("tc0110pcr_1", tc0110pcr_word_r, tc0110pcr_step1_word_w) /* palette (1st screen) */
AM_RANGE(0x420000, 0x420007) AM_DEVREADWRITE("tc0110pcr_2", tc0110pcr_word_r, tc0110pcr_step1_word_w) /* palette (2nd screen) */ AM_RANGE(0x420000, 0x420007) AM_DEVREADWRITE("tc0110pcr_2", tc0110pcr_word_r, tc0110pcr_step1_word_w) /* palette (2nd screen) */
AM_RANGE(0x600000, 0x6013ff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) AM_RANGE(0x600000, 0x6013ff) AM_RAM AM_BASE_SIZE_MEMBER(warriorb_state, spriteram, spriteram_size)
AM_RANGE(0x800000, 0x80000f) AM_DEVREADWRITE8("tc0220ioc", tc0220ioc_r, tc0220ioc_w, 0x00ff) AM_RANGE(0x800000, 0x80000f) AM_DEVREADWRITE8("tc0220ioc", tc0220ioc_r, tc0220ioc_w, 0x00ff)
// AM_RANGE(0x820000, 0x820001) AM_WRITENOP // ??? // AM_RANGE(0x820000, 0x820001) AM_WRITENOP // ???
AM_RANGE(0x830000, 0x830003) AM_READWRITE(warriorb_sound_r, warriorb_sound_w) AM_RANGE(0x830000, 0x830003) AM_READWRITE(warriorb_sound_r, warriorb_sound_w)
@ -249,7 +256,7 @@ static ADDRESS_MAP_START( warriorb_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x360000, 0x36000f) AM_DEVREADWRITE("tc0100scn_2", tc0100scn_ctrl_word_r, tc0100scn_ctrl_word_w) AM_RANGE(0x360000, 0x36000f) AM_DEVREADWRITE("tc0100scn_2", tc0100scn_ctrl_word_r, tc0100scn_ctrl_word_w)
AM_RANGE(0x400000, 0x400007) AM_DEVREADWRITE("tc0110pcr_1", tc0110pcr_word_r, tc0110pcr_step1_word_w) /* palette (1st screen) */ AM_RANGE(0x400000, 0x400007) AM_DEVREADWRITE("tc0110pcr_1", tc0110pcr_word_r, tc0110pcr_step1_word_w) /* palette (1st screen) */
AM_RANGE(0x420000, 0x420007) AM_DEVREADWRITE("tc0110pcr_2", tc0110pcr_word_r, tc0110pcr_step1_word_w) /* palette (2nd screen) */ AM_RANGE(0x420000, 0x420007) AM_DEVREADWRITE("tc0110pcr_2", tc0110pcr_word_r, tc0110pcr_step1_word_w) /* palette (2nd screen) */
AM_RANGE(0x600000, 0x6013ff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) AM_RANGE(0x600000, 0x6013ff) AM_RAM AM_BASE_SIZE_MEMBER(warriorb_state, spriteram, spriteram_size)
AM_RANGE(0x800000, 0x80000f) AM_DEVREADWRITE("tc0510nio", tc0510nio_halfword_r, tc0510nio_halfword_w) AM_RANGE(0x800000, 0x80000f) AM_DEVREADWRITE("tc0510nio", tc0510nio_halfword_r, tc0510nio_halfword_w)
// AM_RANGE(0x820000, 0x820001) AM_WRITENOP // ? uses bits 0,2,3 // AM_RANGE(0x820000, 0x820001) AM_WRITENOP // ? uses bits 0,2,3
AM_RANGE(0x830000, 0x830003) AM_READWRITE(warriorb_sound_r, warriorb_sound_w) AM_RANGE(0x830000, 0x830003) AM_READWRITE(warriorb_sound_r, warriorb_sound_w)
@ -412,7 +419,8 @@ GFXDECODE_END
/* handler called by the YM2610 emulator when the internal timers cause an IRQ */ /* handler called by the YM2610 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); warriorb_state *state = (warriorb_state *)device->machine->driver_data;
cpu_set_input_line(state->audiocpu, 0, irq ? ASSERT_LINE : CLEAR_LINE);
} }
static const ym2610_interface ym2610_config = static const ym2610_interface ym2610_config =
@ -422,7 +430,7 @@ static const ym2610_interface ym2610_config =
/************************************************************** /**************************************************************
SUBWOOFER (SOUND) SUBWOOFEr(SOUND)
**************************************************************/ **************************************************************/
#if 0 #if 0
@ -522,8 +530,52 @@ static const tc0140syt_interface warriorb_tc0140syt_intf =
"maincpu", "audiocpu" "maincpu", "audiocpu"
}; };
static STATE_POSTLOAD( warriorb_postload )
{
reset_sound_region(machine);
}
static MACHINE_START( warriorb )
{
warriorb_state *state = (warriorb_state *)machine->driver_data;
memory_configure_bank(machine, "bank10", 0, 8, memory_region(machine, "audiocpu") + 0xc000, 0x4000);
state->maincpu = devtag_get_device(machine, "maincpu");
state->audiocpu = devtag_get_device(machine, "audiocpu");
state->tc0140syt = devtag_get_device(machine, "tc0140syt");
state->tc0100scn_1 = devtag_get_device(machine, "tc0100scn_1");
state->tc0100scn_2 = devtag_get_device(machine, "tc0100scn_2");
state->lscreen = devtag_get_device(machine, "lscreen");
state->rscreen = devtag_get_device(machine, "rscreen");
state->_2610_1l = devtag_get_device(machine, "2610.1.l");
state->_2610_1r = devtag_get_device(machine, "2610.1.r");
state->_2610_2l = devtag_get_device(machine, "2610.2.l");
state->_2610_2r = devtag_get_device(machine, "2610.2.r");
state_save_register_global(machine, state->banknum);
state_save_register_global_array(machine, state->pandata);
state_save_register_postload(machine, warriorb_postload, NULL);
}
static MACHINE_RESET( taito_dualscreen )
{
warriorb_state *state = (warriorb_state *)machine->driver_data;
state->banknum = 0;
/**** mixer control enable ****/
sound_global_enable(machine, 1); /* mixer enabled */
}
static MACHINE_DRIVER_START( darius2d ) static MACHINE_DRIVER_START( darius2d )
/* driver data */
MDRV_DRIVER_DATA(warriorb_state)
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD("maincpu", M68000, 12000000) /* 12 MHz ??? (Might well be 16!) */ MDRV_CPU_ADD("maincpu", M68000, 12000000) /* 12 MHz ??? (Might well be 16!) */
MDRV_CPU_PROGRAM_MAP(darius2d_map) MDRV_CPU_PROGRAM_MAP(darius2d_map)
@ -591,6 +643,9 @@ MACHINE_DRIVER_END
static MACHINE_DRIVER_START( warriorb ) static MACHINE_DRIVER_START( warriorb )
/* driver data */
MDRV_DRIVER_DATA(warriorb_state)
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD("maincpu", M68000, 16000000) /* 16 MHz ? */ MDRV_CPU_ADD("maincpu", M68000, 16000000) /* 16 MHz ? */
MDRV_CPU_PROGRAM_MAP(warriorb_map) MDRV_CPU_PROGRAM_MAP(warriorb_map)
@ -674,7 +729,7 @@ ROM_START( darius2d )
ROM_CONTINUE( 0x10000, 0x1c000 ) /* banked stuff */ ROM_CONTINUE( 0x10000, 0x1c000 ) /* banked stuff */
ROM_REGION( 0x100000, "gfx1", 0 ) ROM_REGION( 0x100000, "gfx1", 0 )
ROM_LOAD( "c07-03.12", 0x00000, 0x80000, CRC(189bafce) SHA1(d885e444523489fe24269b90dec58e0d92cfbd6e) ) /* SCR (screen 1) */ ROM_LOAD( "c07-03.12", 0x00000, 0x80000, CRC(189bafce) SHA1(d885e444523489fe24269b90dec58e0d92cfbd6e) ) /* SCr(screen 1) */
ROM_LOAD( "c07-04.11", 0x80000, 0x80000, CRC(50421e81) SHA1(27ac420602f1dac00dc32903543a518e6f47fb2f) ) ROM_LOAD( "c07-04.11", 0x80000, 0x80000, CRC(50421e81) SHA1(27ac420602f1dac00dc32903543a518e6f47fb2f) )
ROM_REGION( 0x200000, "gfx2", 0 ) ROM_REGION( 0x200000, "gfx2", 0 )
@ -684,7 +739,7 @@ ROM_START( darius2d )
ROM_LOAD32_BYTE( "c07-07.26", 0x00003, 0x80000, CRC(fd9f9e74) SHA1(e89beb5cac844fe16662465b0c76337692591aae) ) ROM_LOAD32_BYTE( "c07-07.26", 0x00003, 0x80000, CRC(fd9f9e74) SHA1(e89beb5cac844fe16662465b0c76337692591aae) )
ROM_REGION( 0x100000, "gfx3", 0 ) ROM_REGION( 0x100000, "gfx3", 0 )
ROM_COPY( "gfx1", 0x000000, 0x000000, 0x100000 ) /* SCR (screen 2) */ ROM_COPY( "gfx1", 0x000000, 0x000000, 0x100000 ) /* SCr(screen 2) */
/* The actual board duplicates the SCR gfx roms for the 2nd TC0100SCN */ /* The actual board duplicates the SCR gfx roms for the 2nd TC0100SCN */
// ROM_LOAD( "c07-03.47", 0x00000, 0x80000, CRC(189bafce) SHA1(d885e444523489fe24269b90dec58e0d92cfbd6e) ) // ROM_LOAD( "c07-03.47", 0x00000, 0x80000, CRC(189bafce) SHA1(d885e444523489fe24269b90dec58e0d92cfbd6e) )
@ -720,7 +775,7 @@ ROM_START( darius2do )
ROM_CONTINUE( 0x10000, 0x1c000 ) /* banked stuff */ ROM_CONTINUE( 0x10000, 0x1c000 ) /* banked stuff */
ROM_REGION( 0x100000, "gfx1", 0 ) ROM_REGION( 0x100000, "gfx1", 0 )
ROM_LOAD( "c07-03.12", 0x00000, 0x80000, CRC(189bafce) SHA1(d885e444523489fe24269b90dec58e0d92cfbd6e) ) /* SCR (screen 1) */ ROM_LOAD( "c07-03.12", 0x00000, 0x80000, CRC(189bafce) SHA1(d885e444523489fe24269b90dec58e0d92cfbd6e) ) /* SCr(screen 1) */
ROM_LOAD( "c07-04.11", 0x80000, 0x80000, CRC(50421e81) SHA1(27ac420602f1dac00dc32903543a518e6f47fb2f) ) ROM_LOAD( "c07-04.11", 0x80000, 0x80000, CRC(50421e81) SHA1(27ac420602f1dac00dc32903543a518e6f47fb2f) )
ROM_REGION( 0x200000, "gfx2", 0 ) ROM_REGION( 0x200000, "gfx2", 0 )
@ -730,7 +785,7 @@ ROM_START( darius2do )
ROM_LOAD32_BYTE( "c07-07.26", 0x00003, 0x80000, CRC(fd9f9e74) SHA1(e89beb5cac844fe16662465b0c76337692591aae) ) ROM_LOAD32_BYTE( "c07-07.26", 0x00003, 0x80000, CRC(fd9f9e74) SHA1(e89beb5cac844fe16662465b0c76337692591aae) )
ROM_REGION( 0x100000, "gfx3", 0 ) ROM_REGION( 0x100000, "gfx3", 0 )
ROM_COPY( "gfx1", 0x000000, 0x000000, 0x100000 ) /* SCR (screen 2) */ ROM_COPY( "gfx1", 0x000000, 0x000000, 0x100000 ) /* SCr(screen 2) */
/* The actual board duplicates the SCR gfx roms for the 2nd TC0100SCN */ /* The actual board duplicates the SCR gfx roms for the 2nd TC0100SCN */
// ROM_LOAD( "c07-03.47", 0x00000, 0x80000, CRC(189bafce) SHA1(d885e444523489fe24269b90dec58e0d92cfbd6e) ) // ROM_LOAD( "c07-03.47", 0x00000, 0x80000, CRC(189bafce) SHA1(d885e444523489fe24269b90dec58e0d92cfbd6e) )
@ -790,25 +845,6 @@ ROM_START( warriorb )
// ROM_LOAD( "d24-16.79", 0x00000, 0xa??, NO_DUMP ) // ROM_LOAD( "d24-16.79", 0x00000, 0xa??, NO_DUMP )
ROM_END ROM_END
static STATE_POSTLOAD( warriorb_postload )
{
reset_sound_region(machine);
}
static MACHINE_START( warriorb )
{
state_save_register_global(machine, banknum);
state_save_register_postload(machine, warriorb_postload, NULL);
}
static MACHINE_RESET( taito_dualscreen )
{
banknum = -1;
/**** mixer control enable ****/
sound_global_enable( machine, 1 ); /* mixer enabled */
}
/* Working Games */ /* Working Games */

View File

@ -401,37 +401,18 @@ Stephh's notes (based on the game M68000 code and some tests) :
#include "video/taitoic.h" #include "video/taitoic.h"
#include "audio/taitosnd.h" #include "audio/taitosnd.h"
#include "sound/2610intf.h" #include "sound/2610intf.h"
#include "includes/wgp.h"
VIDEO_START( wgp );
VIDEO_START( wgp2 );
VIDEO_UPDATE( wgp );
extern UINT16 *wgp_spritemap;
extern size_t wgp_spritemap_size;
extern UINT16 *wgp_pivram;
READ16_HANDLER ( wgp_pivram_word_r );
WRITE16_HANDLER( wgp_pivram_word_w );
extern UINT16 *wgp_piv_ctrlram;
READ16_HANDLER ( wgp_piv_ctrl_word_r );
WRITE16_HANDLER( wgp_piv_ctrl_word_w );
static UINT16 cpua_ctrl;
static UINT16 port_sel=0;
extern UINT16 wgp_rotate_ctrl[8];
static UINT16 *sharedram;
static size_t sharedram_size;
static READ16_HANDLER( sharedram_r ) static READ16_HANDLER( sharedram_r )
{ {
return sharedram[offset]; wgp_state *state = (wgp_state *)space->machine->driver_data;
return state->sharedram[offset];
} }
static WRITE16_HANDLER( sharedram_w ) static WRITE16_HANDLER( sharedram_w )
{ {
COMBINE_DATA(&sharedram[offset]); wgp_state *state = (wgp_state *)space->machine->driver_data;
COMBINE_DATA(&state->sharedram[offset]);
} }
static void parse_control(running_machine *machine) static void parse_control(running_machine *machine)
@ -439,16 +420,19 @@ static void parse_control(running_machine *machine)
/* bit 0 enables cpu B */ /* bit 0 enables cpu B */
/* however this fails when recovering from a save state /* however this fails when recovering from a save state
if cpu B is disabled !! */ if cpu B is disabled !! */
cputag_set_input_line(machine, "sub", INPUT_LINE_RESET, (cpua_ctrl & 0x1) ? CLEAR_LINE : ASSERT_LINE); wgp_state *state = (wgp_state *)machine->driver_data;
cpu_set_input_line(state->subcpu, INPUT_LINE_RESET, (state->cpua_ctrl & 0x1) ? CLEAR_LINE : ASSERT_LINE);
/* bit 1 is "vibration" acc. to test mode */ /* bit 1 is "vibration" acc. to test mode */
} }
static WRITE16_HANDLER( cpua_ctrl_w ) /* assumes Z80 sandwiched between 68Ks */ static WRITE16_HANDLER( cpua_ctrl_w ) /* assumes Z80 sandwiched between 68Ks */
{ {
wgp_state *state = (wgp_state *)space->machine->driver_data;
if ((data &0xff00) && ((data &0xff) == 0)) if ((data &0xff00) && ((data &0xff) == 0))
data = data >> 8; /* for Wgp */ data = data >> 8; /* for Wgp */
cpua_ctrl = data; state->cpua_ctrl = data;
parse_control(space->machine); parse_control(space->machine);
@ -465,20 +449,23 @@ static WRITE16_HANDLER( cpua_ctrl_w ) /* assumes Z80 sandwiched between 68Ks */
#ifdef UNUSED_FUNCTION #ifdef UNUSED_FUNCTION
static TIMER_CALLBACK( wgp_interrupt4 ) static TIMER_CALLBACK( wgp_interrupt4 )
{ {
cputag_set_input_line(machine, "maincpu", 4, HOLD_LINE); wgp_state *state = (wgp_state *)machine->driver_data;
cpu_set_input_line(state->maincpu, 4, HOLD_LINE);
} }
#endif #endif
static TIMER_CALLBACK( wgp_interrupt6 ) static TIMER_CALLBACK( wgp_interrupt6 )
{ {
cputag_set_input_line(machine, "maincpu", 6, HOLD_LINE); wgp_state *state = (wgp_state *)machine->driver_data;
cpu_set_input_line(state->maincpu, 6, HOLD_LINE);
} }
/* 68000 B */ /* 68000 B */
static TIMER_CALLBACK( wgp_cpub_interrupt6 ) static TIMER_CALLBACK( wgp_cpub_interrupt6 )
{ {
cputag_set_input_line(machine, "sub", 6, HOLD_LINE); /* assumes Z80 sandwiched between the 68Ks */ wgp_state *state = (wgp_state *)machine->driver_data;
cpu_set_input_line(state->subcpu, 6, HOLD_LINE); /* assumes Z80 sandwiched between the 68Ks */
} }
@ -523,6 +510,7 @@ static WRITE16_HANDLER( rotate_port_w )
which contains sets of 4 words (used for ports 0-3). which contains sets of 4 words (used for ports 0-3).
NB: port 6 is not written. NB: port 6 is not written.
*/ */
wgp_state *state = (wgp_state *)space->machine->driver_data;
switch (offset) switch (offset)
{ {
@ -530,13 +518,13 @@ static WRITE16_HANDLER( rotate_port_w )
{ {
//logerror("CPU #0 PC %06x: warning - port %04x write %04x\n",cpu_get_pc(space->cpu),port_sel,data); //logerror("CPU #0 PC %06x: warning - port %04x write %04x\n",cpu_get_pc(space->cpu),port_sel,data);
wgp_rotate_ctrl[port_sel] = data; state->rotate_ctrl[state->port_sel] = data;
return; return;
} }
case 0x01: case 0x01:
{ {
port_sel = data &0x7; state->port_sel = data & 0x7;
} }
} }
} }
@ -621,33 +609,35 @@ static WRITE16_HANDLER( wgp_adinput_w )
SOUND SOUND
**********************************************************/ **********************************************************/
static INT32 banknum;
static void reset_sound_region( running_machine *machine ) /* assumes Z80 sandwiched between the 68Ks */ static void reset_sound_region( running_machine *machine ) /* assumes Z80 sandwiched between the 68Ks */
{ {
memory_set_bankptr(machine, "bank10", memory_region(machine, "audiocpu") + (banknum * 0x4000) + 0x10000 ); wgp_state *state = (wgp_state *)machine->driver_data;
memory_set_bank(machine, "bank10", state->banknum);
} }
static WRITE8_HANDLER( sound_bankswitch_w ) static WRITE8_HANDLER( sound_bankswitch_w )
{ {
banknum = (data - 1) & 7; wgp_state *state = (wgp_state *)space->machine->driver_data;
state->banknum = data & 7;
reset_sound_region(space->machine); reset_sound_region(space->machine);
} }
static WRITE16_HANDLER( wgp_sound_w ) static WRITE16_HANDLER( wgp_sound_w )
{ {
const device_config *tc0140syt = devtag_get_device(space->machine, "tc0140syt"); wgp_state *state = (wgp_state *)space->machine->driver_data;
if (offset == 0) if (offset == 0)
tc0140syt_port_w(tc0140syt, 0, data & 0xff); tc0140syt_port_w(state->tc0140syt, 0, data & 0xff);
else if (offset == 1) else if (offset == 1)
tc0140syt_comm_w(tc0140syt, 0, data & 0xff); tc0140syt_comm_w(state->tc0140syt, 0, data & 0xff);
} }
static READ16_HANDLER( wgp_sound_r ) static READ16_HANDLER( wgp_sound_r )
{ {
const device_config *tc0140syt = devtag_get_device(space->machine, "tc0140syt"); wgp_state *state = (wgp_state *)space->machine->driver_data;
if (offset == 1) if (offset == 1)
return ((tc0140syt_comm_r(tc0140syt, 0) & 0xff)); return ((tc0140syt_comm_r(state->tc0140syt, 0) & 0xff));
else else
return 0; return 0;
} }
@ -660,18 +650,18 @@ static READ16_HANDLER( wgp_sound_r )
static ADDRESS_MAP_START( main_map, ADDRESS_SPACE_PROGRAM, 16 ) static ADDRESS_MAP_START( main_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x0fffff) AM_ROM AM_RANGE(0x000000, 0x0fffff) AM_ROM
AM_RANGE(0x100000, 0x10ffff) AM_RAM /* main CPUA ram */ AM_RANGE(0x100000, 0x10ffff) AM_RAM /* main CPUA ram */
AM_RANGE(0x140000, 0x143fff) AM_RAM AM_BASE(&sharedram) AM_SIZE(&sharedram_size) AM_RANGE(0x140000, 0x143fff) AM_RAM AM_BASE_SIZE_MEMBER(wgp_state, sharedram, sharedram_size)
AM_RANGE(0x180000, 0x18000f) AM_DEVREADWRITE8("tc0220ioc", tc0220ioc_r, tc0220ioc_w, 0xff00) AM_RANGE(0x180000, 0x18000f) AM_DEVREADWRITE8("tc0220ioc", tc0220ioc_r, tc0220ioc_w, 0xff00)
AM_RANGE(0x1c0000, 0x1c0001) AM_WRITE(cpua_ctrl_w) AM_RANGE(0x1c0000, 0x1c0001) AM_WRITE(cpua_ctrl_w)
AM_RANGE(0x200000, 0x20000f) AM_READWRITE(wgp_adinput_r,wgp_adinput_w) AM_RANGE(0x200000, 0x20000f) AM_READWRITE(wgp_adinput_r,wgp_adinput_w)
AM_RANGE(0x300000, 0x30ffff) AM_DEVREADWRITE("tc0100scn", tc0100scn_word_r, tc0100scn_word_w) /* tilemaps */ AM_RANGE(0x300000, 0x30ffff) AM_DEVREADWRITE("tc0100scn", tc0100scn_word_r, tc0100scn_word_w) /* tilemaps */
AM_RANGE(0x320000, 0x32000f) AM_DEVREADWRITE("tc0100scn", tc0100scn_ctrl_word_r, tc0100scn_ctrl_word_w) AM_RANGE(0x320000, 0x32000f) AM_DEVREADWRITE("tc0100scn", tc0100scn_ctrl_word_r, tc0100scn_ctrl_word_w)
AM_RANGE(0x400000, 0x40bfff) AM_RAM AM_BASE(&wgp_spritemap) AM_SIZE(&wgp_spritemap_size) /* sprite tilemaps */ AM_RANGE(0x400000, 0x40bfff) AM_RAM AM_BASE_SIZE_MEMBER(wgp_state, spritemap, spritemap_size) /* sprite tilemaps */
AM_RANGE(0x40c000, 0x40dfff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) /* sprite ram */ AM_RANGE(0x40c000, 0x40dfff) AM_RAM AM_BASE_SIZE_MEMBER(wgp_state, spriteram, spriteram_size) /* sprite ram */
AM_RANGE(0x40fff0, 0x40fff1) AM_WRITENOP /* ?? (writes 0x8000 and 0 alternately - Wgp2 just 0) */ AM_RANGE(0x40fff0, 0x40fff1) AM_WRITENOP /* ?? (writes 0x8000 and 0 alternately - Wgp2 just 0) */
AM_RANGE(0x500000, 0x501fff) AM_RAM /* unknown/unused */ AM_RANGE(0x500000, 0x501fff) AM_RAM /* unknown/unused */
AM_RANGE(0x502000, 0x517fff) AM_READWRITE(wgp_pivram_word_r,wgp_pivram_word_w) AM_BASE(&wgp_pivram) /* piv tilemaps */ AM_RANGE(0x502000, 0x517fff) AM_READWRITE(wgp_pivram_word_r, wgp_pivram_word_w) AM_BASE_MEMBER(wgp_state, pivram) /* piv tilemaps */
AM_RANGE(0x520000, 0x52001f) AM_READWRITE(wgp_piv_ctrl_word_r,wgp_piv_ctrl_word_w) AM_BASE(&wgp_piv_ctrlram) AM_RANGE(0x520000, 0x52001f) AM_READWRITE(wgp_piv_ctrl_word_r, wgp_piv_ctrl_word_w) AM_BASE_MEMBER(wgp_state, piv_ctrlram)
AM_RANGE(0x600000, 0x600003) AM_WRITE(rotate_port_w) /* rotation control ? */ AM_RANGE(0x600000, 0x600003) AM_WRITE(rotate_port_w) /* rotation control ? */
AM_RANGE(0x700000, 0x701fff) AM_RAM_WRITE(paletteram16_RRRRGGGGBBBBxxxx_word_w) AM_BASE_GENERIC(paletteram) AM_RANGE(0x700000, 0x701fff) AM_RAM_WRITE(paletteram16_RRRRGGGGBBBBxxxx_word_w) AM_BASE_GENERIC(paletteram)
ADDRESS_MAP_END ADDRESS_MAP_END
@ -915,7 +905,8 @@ GFXDECODE_END
/* handler called by the YM2610 emulator when the internal timers cause an IRQ */ /* handler called by the YM2610 emulator when the internal timers cause an IRQ */
static void irqhandler( const device_config *device, int irq ) // assumes Z80 sandwiched between 68Ks static void irqhandler( const device_config *device, int irq ) // assumes Z80 sandwiched between 68Ks
{ {
cputag_set_input_line(device->machine, "audiocpu", 0, irq ? ASSERT_LINE : CLEAR_LINE); wgp_state *state = (wgp_state *)device->machine->driver_data;
cpu_set_input_line(state->audiocpu, 0, irq ? ASSERT_LINE : CLEAR_LINE);
} }
static const ym2610_interface ym2610_config = static const ym2610_interface ym2610_config =
@ -940,15 +931,39 @@ static STATE_POSTLOAD( wgp_postload )
static MACHINE_RESET( wgp ) static MACHINE_RESET( wgp )
{ {
banknum = -1; wgp_state *state = (wgp_state *)machine->driver_data;
cpua_ctrl = 0xff; int i;
port_sel = 0;
state->banknum = 0;
state->cpua_ctrl = 0xff;
state->port_sel = 0;
state->piv_ctrl_reg = 0;
for (i = 0; i < 3; i++)
{
state->piv_zoom[i] = 0;
state->piv_scrollx[i] = 0;
state->piv_scrolly[i] = 0;
}
memset(state->rotate_ctrl, 0, 8);
} }
static MACHINE_START( wgp ) static MACHINE_START( wgp )
{ {
state_save_register_global(machine, cpua_ctrl); wgp_state *state = (wgp_state *)machine->driver_data;
state_save_register_global(machine, banknum);
memory_configure_bank(machine, "bank10", 0, 4, memory_region(machine, "audiocpu") + 0xc000, 0x4000);
state->maincpu = devtag_get_device(machine, "maincpu");
state->audiocpu = devtag_get_device(machine, "audiocpu");
state->subcpu = devtag_get_device(machine, "sub");
state->tc0140syt = devtag_get_device(machine, "tc0140syt");
state->tc0100scn = devtag_get_device(machine, "tc0100scn");
state_save_register_global(machine, state->cpua_ctrl);
state_save_register_global(machine, state->banknum);
state_save_register_global(machine, state->port_sel);
state_save_register_postload(machine, wgp_postload, NULL); state_save_register_postload(machine, wgp_postload, NULL);
} }
@ -985,6 +1000,9 @@ static const tc0140syt_interface wgp_tc0140syt_intf =
static MACHINE_DRIVER_START( wgp ) static MACHINE_DRIVER_START( wgp )
/* driver data */
MDRV_DRIVER_DATA(wgp_state)
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD("maincpu", M68000, 12000000) /* 12 MHz ??? */ MDRV_CPU_ADD("maincpu", M68000, 12000000) /* 12 MHz ??? */
MDRV_CPU_PROGRAM_MAP(main_map) MDRV_CPU_PROGRAM_MAP(main_map)
@ -1259,8 +1277,6 @@ static DRIVER_INIT( wgp )
UINT16 *ROM = (UINT16 *)memory_region(machine, "maincpu"); UINT16 *ROM = (UINT16 *)memory_region(machine, "maincpu");
ROM[0x25dc / 2] = 0x0602; // faulty value is 0x0206 ROM[0x25dc / 2] = 0x0602; // faulty value is 0x0206
#endif #endif
// taitosnd_setz80_soundcpu( 2 );
} }
static DRIVER_INIT( wgp2 ) static DRIVER_INIT( wgp2 )

View File

@ -0,0 +1,69 @@
/*************************************************************************
Darius
*************************************************************************/
#define DARIUS_VOL_MAX (3*2 + 2)
#define DARIUS_PAN_MAX (2 + 2 + 1) /* FM 2port + PSG 2port + DA 1port */
typedef struct _darius_state darius_state;
struct _darius_state
{
/* memory pointers */
UINT16 * spriteram;
UINT16 * fg_ram;
size_t spriteram_size;
/* video-related */
tilemap_t *fg_tilemap;
/* misc */
UINT16 cpua_ctrl;
UINT16 coin_word;
INT32 banknum;
UINT8 adpcm_command;
UINT8 nmi_enable;
UINT32 def_vol[0x10];
UINT8 vol[DARIUS_VOL_MAX];
UINT8 pan[DARIUS_PAN_MAX];
/* devices */
const device_config *maincpu;
const device_config *audiocpu;
const device_config *cpub;
const device_config *adpcm;
const device_config *tc0140syt;
const device_config *pc080sn;
const device_config *lscreen;
const device_config *mscreen;
const device_config *rscreen;
const device_config *filter0_0l;
const device_config *filter0_0r;
const device_config *filter0_1l;
const device_config *filter0_1r;
const device_config *filter0_2l;
const device_config *filter0_2r;
const device_config *filter0_3l;
const device_config *filter0_3r;
const device_config *filter1_0l;
const device_config *filter1_0r;
const device_config *filter1_1l;
const device_config *filter1_1r;
const device_config *filter1_2l;
const device_config *filter1_2r;
const device_config *filter1_3l;
const device_config *filter1_3r;
const device_config *msm5205_l;
const device_config *msm5205_r;
};
/*----------- defined in video/darius.c -----------*/
WRITE16_HANDLER( darius_fg_layer_w );
VIDEO_START( darius );
VIDEO_UPDATE( darius );

View File

@ -0,0 +1,40 @@
/*************************************************************************
Taito Triple Screen Games
*************************************************************************/
typedef struct _ninjaw_state ninjaw_state;
struct _ninjaw_state
{
/* memory pointers */
UINT16 * spriteram;
size_t spriteram_size;
/* misc */
UINT16 cpua_ctrl;
INT32 banknum;
int pandata[4];
/* devices */
const device_config *maincpu;
const device_config *audiocpu;
const device_config *subcpu;
const device_config *tc0140syt;
const device_config *tc0100scn_1;
const device_config *tc0100scn_2;
const device_config *tc0100scn_3;
const device_config *lscreen;
const device_config *mscreen;
const device_config *rscreen;
const device_config *_2610_1l;
const device_config *_2610_1r;
const device_config *_2610_2l;
const device_config *_2610_2r;
};
/*----------- defined in video/ninjaw.c -----------*/
VIDEO_START( ninjaw );
VIDEO_UPDATE( ninjaw );

View File

@ -0,0 +1,53 @@
/*************************************************************************
Operation Thunderbolt
*************************************************************************/
struct othunder_tempsprite
{
int gfx;
int code,color;
int flipx,flipy;
int x,y;
int zoomx,zoomy;
int primask;
};
typedef struct _othunder_state othunder_state;
struct _othunder_state
{
/* memory pointers */
UINT16 * spriteram;
size_t spriteram_size;
/* video-related */
struct othunder_tempsprite *spritelist;
/* misc */
int vblank_irq, ad_irq;
INT32 banknum;
int pan[4];
/* devices */
const device_config *maincpu;
const device_config *audiocpu;
const device_config *eeprom;
const device_config *tc0220ioc;
const device_config *tc0100scn;
const device_config *tc0110pcr;
const device_config *tc0140syt;
const device_config *_2610_0l;
const device_config *_2610_0r;
const device_config *_2610_1l;
const device_config *_2610_1r;
const device_config *_2610_2l;
const device_config *_2610_2r;
};
/*----------- defined in video/othunder.c -----------*/
VIDEO_START( othunder );
VIDEO_UPDATE( othunder );

View File

@ -0,0 +1,54 @@
/*************************************************************************
Slapshot / Operation Wolf 3
*************************************************************************/
struct slapshot_tempsprite
{
int gfx;
int code,color;
int flipx,flipy;
int x,y;
int zoomx,zoomy;
int primask;
};
typedef struct _slapshot_state slapshot_state;
struct _slapshot_state
{
/* memory pointers */
UINT16 * color_ram;
UINT16 * spriteram;
UINT16 * spriteext;
UINT16 * spriteram_buffered, *spriteram_delayed;
// UINT16 * paletteram; // currently this uses generic palette handling
size_t spriteext_size;
size_t spriteram_size;
/* video-related */
struct slapshot_tempsprite *spritelist;
INT32 sprites_disabled, sprites_active_area, sprites_master_scrollx, sprites_master_scrolly;
int sprites_flipscreen;
int prepare_sprites;
UINT16 spritebank[8];
/* misc */
INT32 banknum;
/* devices */
const device_config *maincpu;
const device_config *audiocpu;
const device_config *tc0140syt;
const device_config *tc0480scp;
const device_config *tc0360pri;
const device_config *tc0640fio;
};
/*----------- defined in video/slapshot.c -----------*/
VIDEO_START( slapshot );
VIDEO_UPDATE( slapshot );
VIDEO_EOF( taito_no_buffer );

View File

@ -0,0 +1,36 @@
/*************************************************************************
Taito Dual Screen Games
*************************************************************************/
typedef struct _warriorb_state warriorb_state;
struct _warriorb_state
{
/* memory pointers */
UINT16 * spriteram;
size_t spriteram_size;
/* misc */
INT32 banknum;
int pandata[4];
/* devices */
const device_config *maincpu;
const device_config *audiocpu;
const device_config *tc0140syt;
const device_config *tc0100scn_1;
const device_config *tc0100scn_2;
const device_config *lscreen;
const device_config *rscreen;
const device_config *_2610_1l;
const device_config *_2610_1r;
const device_config *_2610_2l;
const device_config *_2610_2r;
};
/*----------- defined in video/warriorb.c -----------*/
VIDEO_START( warriorb );
VIDEO_UPDATE( warriorb );

52
src/mame/includes/wgp.h Normal file
View File

@ -0,0 +1,52 @@
/*************************************************************************
World Grand Prix
*************************************************************************/
typedef struct _wgp_state wgp_state;
struct _wgp_state
{
/* memory pointers */
UINT16 * spritemap;
UINT16 * spriteram;
UINT16 * pivram;
UINT16 * piv_ctrlram;
UINT16 * sharedram;
// UINT16 * paletteram; // currently this uses generic palette handling
size_t sharedram_size;
size_t spritemap_size;
size_t spriteram_size;
/* video-related */
tilemap_t *piv_tilemap[3];
UINT16 piv_ctrl_reg;
UINT16 piv_zoom[3], piv_scrollx[3], piv_scrolly[3];
UINT16 rotate_ctrl[8];
int piv_xoffs, piv_yoffs;
/* misc */
UINT16 cpua_ctrl;
UINT16 port_sel;
INT32 banknum;
/* devices */
const device_config *maincpu;
const device_config *audiocpu;
const device_config *subcpu;
const device_config *tc0100scn;
const device_config *tc0140syt;
};
/*----------- defined in video/wgp.c -----------*/
READ16_HANDLER ( wgp_pivram_word_r );
WRITE16_HANDLER( wgp_pivram_word_w );
READ16_HANDLER ( wgp_piv_ctrl_word_r );
WRITE16_HANDLER( wgp_piv_ctrl_word_w );
VIDEO_START( wgp );
VIDEO_START( wgp2 );
VIDEO_UPDATE( wgp );

View File

@ -1,21 +1,6 @@
#include "driver.h" #include "driver.h"
#include "video/taitoic.h" #include "video/taitoic.h"
#include "includes/darius.h"
static tilemap_t *fg_tilemap;
UINT16 *darius_fg_ram;
struct tempsprite
{
int gfx;
int code,color;
int flipx,flipy;
int x,y;
int zoomx,zoomy;
int primask;
};
static struct tempsprite *spritelist;
/***************************************************************************/ /***************************************************************************/
@ -33,61 +18,62 @@ INLINE void actual_get_fg_tile_info(running_machine *machine, tile_data *tileinf
static TILE_GET_INFO( get_fg_tile_info ) static TILE_GET_INFO( get_fg_tile_info )
{ {
actual_get_fg_tile_info(machine, tileinfo, tile_index, darius_fg_ram, 2); darius_state *state = (darius_state *)machine->driver_data;
actual_get_fg_tile_info(machine, tileinfo, tile_index, state->fg_ram, 2);
} }
/***************************************************************************/ /***************************************************************************/
VIDEO_START( darius ) VIDEO_START( darius )
{ {
fg_tilemap = tilemap_create(machine, get_fg_tile_info,tilemap_scan_rows,8,8,128,64); darius_state *state = (darius_state *)machine->driver_data;
spritelist = auto_alloc_array(machine, struct tempsprite, 0x800); state->fg_tilemap = tilemap_create(machine, get_fg_tile_info,tilemap_scan_rows,8,8,128,64);
tilemap_set_transparent_pen(fg_tilemap,0); tilemap_set_transparent_pen(state->fg_tilemap, 0);
} }
/***************************************************************************/ /***************************************************************************/
WRITE16_HANDLER( darius_fg_layer_w ) WRITE16_HANDLER( darius_fg_layer_w )
{ {
COMBINE_DATA(&darius_fg_ram[offset]); darius_state *state = (darius_state *)space->machine->driver_data;
COMBINE_DATA(&state->fg_ram[offset]);
if (offset < 0x4000) if (offset < 0x4000)
tilemap_mark_tile_dirty(fg_tilemap,(offset & 0x1fff)); tilemap_mark_tile_dirty(state->fg_tilemap, (offset & 0x1fff));
} }
/***************************************************************************/ /***************************************************************************/
static void draw_sprites( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect, int primask, int x_offs, int y_offs ) static void draw_sprites( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect, int primask, int x_offs, int y_offs )
{ {
UINT16 *spriteram16 = machine->generic.spriteram.u16; darius_state *state = (darius_state *)machine->driver_data;
UINT16 *spriteram = state->spriteram;
int offs, curx, cury; int offs, curx, cury;
UINT16 code, data, sx, sy; UINT16 code, data, sx, sy;
UINT8 flipx, flipy, color, priority; UINT8 flipx, flipy, color, priority;
/* pdrawgfx() needs us to draw sprites front to back, so we have to build a list for (offs = state->spriteram_size / 2 - 4; offs >= 0; offs -= 4)
while processing sprite ram and then draw them all at the end */
struct tempsprite *sprite_ptr = spritelist;
for (offs = machine->generic.spriteram_size/2-4; offs >= 0; offs -= 4)
{ {
code = spriteram16[offs+2] &0x1fff; code = spriteram[offs + 2] & 0x1fff;
if (code) if (code)
{ {
data = spriteram16[offs]; data = spriteram[offs];
sy = (256 - data) & 0x1ff; sy = (256 - data) & 0x1ff;
data = spriteram16[offs+1]; data = spriteram[offs + 1];
sx = data & 0x3ff; sx = data & 0x3ff;
data = spriteram16[offs+2]; data = spriteram[offs + 2];
flipx = ((data & 0x4000) >> 14); flipx = ((data & 0x4000) >> 14);
flipy = ((data & 0x8000) >> 15); flipy = ((data & 0x8000) >> 15);
data = spriteram16[offs+3]; data = spriteram[offs + 3];
priority = (data & 0x80) >> 7; // 0 = low priority = (data & 0x80) >> 7; // 0 = low
if (priority != primask) continue; if (priority != primask)
continue;
color = (data & 0x7f); color = (data & 0x7f);
curx = sx - x_offs; curx = sx - x_offs;
@ -96,18 +82,10 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap,const rectan
if (curx > 900) curx -= 1024; if (curx > 900) curx -= 1024;
if (cury > 400) cury -= 512; if (cury > 400) cury -= 512;
sprite_ptr->code = code;
sprite_ptr->color = color;
sprite_ptr->flipx = flipx;
sprite_ptr->flipy = flipy;
sprite_ptr->x = curx;
sprite_ptr->y = cury;
drawgfx_transpen(bitmap,cliprect,machine->gfx[0], drawgfx_transpen(bitmap,cliprect,machine->gfx[0],
sprite_ptr->code, code, color,
sprite_ptr->color, flipx, flipy,
sprite_ptr->flipx,sprite_ptr->flipy, curx, cury, 0);
sprite_ptr->x,sprite_ptr->y,0);
} }
} }
} }
@ -116,35 +94,32 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap,const rectan
VIDEO_UPDATE( darius ) VIDEO_UPDATE( darius )
{ {
darius_state *state = (darius_state *)screen->machine->driver_data;
int xoffs = 0; int xoffs = 0;
const device_config *left_screen = devtag_get_device(screen->machine, "lscreen");
const device_config *middle_screen = devtag_get_device(screen->machine, "mscreen");
const device_config *right_screen = devtag_get_device(screen->machine, "rscreen");
const device_config *pc080sn = devtag_get_device(screen->machine, "pc080sn");
if (screen == left_screen) if (screen == state->lscreen)
xoffs = 36 * 8 * 0; xoffs = 36 * 8 * 0;
else if (screen == middle_screen) else if (screen == state->mscreen)
xoffs = 36 * 8 * 1; xoffs = 36 * 8 * 1;
else if (screen == right_screen) else if (screen == state->rscreen)
xoffs = 36 * 8 * 2; xoffs = 36 * 8 * 2;
pc080sn_tilemap_update(pc080sn); pc080sn_tilemap_update(state->pc080sn);
// draw bottom layer(always active) // draw bottom layer(always active)
pc080sn_tilemap_draw_offset(pc080sn, bitmap, cliprect, 0, TILEMAP_DRAW_OPAQUE, 0, -xoffs, 0); pc080sn_tilemap_draw_offset(state->pc080sn, bitmap, cliprect, 0, TILEMAP_DRAW_OPAQUE, 0, -xoffs, 0);
/* Sprites can be under/over the layer below text layer */ /* Sprites can be under/over the layer below text layer */
draw_sprites(screen->machine, bitmap, cliprect, 0, xoffs, -8); // draw sprites with priority 0 which are under the mid layer draw_sprites(screen->machine, bitmap, cliprect, 0, xoffs, -8); // draw sprites with priority 0 which are under the mid layer
// draw middle layer // draw middle layer
pc080sn_tilemap_draw_offset(pc080sn, bitmap, cliprect, 1, 0, 0, -xoffs, 0); pc080sn_tilemap_draw_offset(state->pc080sn, bitmap, cliprect, 1, 0, 0, -xoffs, 0);
draw_sprites(screen->machine, bitmap, cliprect, 1, xoffs, -8); // draw sprites with priority 1 which are over the mid layer draw_sprites(screen->machine, bitmap, cliprect, 1, xoffs, -8); // draw sprites with priority 1 which are over the mid layer
/* top(text) layer is in fixed position */ /* top(text) layer is in fixed position */
tilemap_set_scrollx(fg_tilemap, 0, 0 + xoffs); tilemap_set_scrollx(state->fg_tilemap, 0, 0 + xoffs);
tilemap_set_scrolly(fg_tilemap, 0, -8); tilemap_set_scrolly(state->fg_tilemap, 0, -8);
tilemap_draw(bitmap, cliprect, fg_tilemap, 0, 0); tilemap_draw(bitmap, cliprect, state->fg_tilemap, 0, 0);
return 0; return 0;
} }

View File

@ -1,28 +1,15 @@
#include "driver.h" #include "driver.h"
#include "video/taitoic.h" #include "video/taitoic.h"
#include "includes/ninjaw.h"
struct tempsprite
{
int gfx;
int code,color;
int flipx,flipy;
int x,y;
int zoomx,zoomy;
int primask;
};
static struct tempsprite *spritelist;
/**********************************************************/ /**********************************************************/
VIDEO_START( ninjaw ) VIDEO_START( ninjaw )
{ {
const device_config *tc0100scn = devtag_get_device(machine, "tc0100scn_1"); ninjaw_state *state = (ninjaw_state *)machine->driver_data;
spritelist = auto_alloc_array(machine, struct tempsprite, 0x1000);
/* Ensure palette from correct TC0110PCR used for each screen */ /* Ensure palette from correct TC0110PCR used for each screen */
tc0100scn_set_colbanks(tc0100scn, 0x0, 0x100, 0x200); tc0100scn_set_colbanks(state->tc0100scn_1, 0x0, 0x100, 0x200);
} }
/************************************************************ /************************************************************
@ -31,7 +18,8 @@ VIDEO_START( ninjaw )
static void draw_sprites( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect, int primask, int x_offs, int y_offs ) static void draw_sprites( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect, int primask, int x_offs, int y_offs )
{ {
UINT16 *spriteram16 = machine->generic.spriteram.u16; ninjaw_state *state = (ninjaw_state *)machine->driver_data;
UINT16 *spriteram = state->spriteram;
int offs, data, tilenum, color, flipx, flipy; int offs, data, tilenum, color, flipx, flipy;
int x, y, priority, curx, cury; int x, y, priority, curx, cury;
int code; int code;
@ -40,21 +28,18 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap,const rectan
int unknown = 0; int unknown = 0;
#endif #endif
/* pdrawgfx() needs us to draw sprites front to back, so we have to build a list for (offs = (state->spriteram_size / 2) - 4; offs >= 0; offs -= 4)
while processing sprite ram and then draw them all at the end */
struct tempsprite *sprite_ptr = spritelist;
for (offs = (machine->generic.spriteram_size/2)-4;offs >=0;offs -= 4)
{ {
data = spriteram16[offs+2]; data = spriteram[offs + 2];
tilenum = data & 0x7fff; tilenum = data & 0x7fff;
if (!tilenum) continue; if (!tilenum)
continue;
data = spriteram16[offs+0]; data = spriteram[offs + 0];
x = (data - 32) & 0x3ff; /* aligns sprites on rock outcrops and sewer hole */ x = (data - 32) & 0x3ff; /* aligns sprites on rock outcrops and sewer hole */
data = spriteram16[offs+1]; data = spriteram[offs + 1];
y = (data - 0) & 0x1ff; y = (data - 0) & 0x1ff;
/* /*
@ -70,12 +55,13 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap,const rectan
Bit&0x8000 is set on some sprites in later levels of Darius Bit&0x8000 is set on some sprites in later levels of Darius
but is again unknown, and there is no obvious visual problem. but is again unknown, and there is no obvious visual problem.
*/ */
data = spriteram16[offs+3]; data = spriteram[offs + 3];
flipx = (data & 0x1); flipx = (data & 0x1);
flipy = (data & 0x2) >> 1; flipy = (data & 0x2) >> 1;
priority = (data & 0x4) >> 2; // 1 = low priority = (data & 0x4) >> 2; // 1 = low
/* data&0x8 - unknown */ /* data&0x8 - unknown */
if (priority != primask) continue; if (priority != primask)
continue;
color = (data & 0x7f00) >> 8; color = (data & 0x7f00) >> 8;
/* data&0x8000 - unknown */ /* data&0x8000 - unknown */
@ -94,18 +80,10 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap,const rectan
cury = y; cury = y;
code = tilenum; code = tilenum;
sprite_ptr->code = code;
sprite_ptr->color = color;
sprite_ptr->flipx = flipx;
sprite_ptr->flipy = flipy;
sprite_ptr->x = curx;
sprite_ptr->y = cury;
drawgfx_transpen(bitmap,cliprect,machine->gfx[0], drawgfx_transpen(bitmap,cliprect,machine->gfx[0],
sprite_ptr->code, code, color,
sprite_ptr->color, flipx, flipy,
sprite_ptr->flipx,sprite_ptr->flipy, curx, cury, 0);
sprite_ptr->x,sprite_ptr->y,0);
} }
#ifdef MAME_DEBUG #ifdef MAME_DEBUG
@ -121,28 +99,25 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap,const rectan
VIDEO_UPDATE( ninjaw ) VIDEO_UPDATE( ninjaw )
{ {
ninjaw_state *state = (ninjaw_state *)screen->machine->driver_data;
int xoffs = 0; int xoffs = 0;
UINT8 layer[3], nodraw; UINT8 layer[3], nodraw;
const device_config *left_screen = devtag_get_device(screen->machine, "lscreen");
const device_config *middle_screen = devtag_get_device(screen->machine, "mscreen");
const device_config *right_screen = devtag_get_device(screen->machine, "rscreen");
const device_config *tc0100scn = NULL; const device_config *tc0100scn = NULL;
if (screen == left_screen) if (screen == state->lscreen)
{ {
xoffs = 36 * 8 * 0; xoffs = 36 * 8 * 0;
tc0100scn = devtag_get_device(screen->machine, "tc0100scn_1"); tc0100scn = state->tc0100scn_1;
} }
else if (screen == middle_screen) else if (screen == state->mscreen)
{ {
xoffs = 36 * 8 * 1; xoffs = 36 * 8 * 1;
tc0100scn = devtag_get_device(screen->machine, "tc0100scn_2"); tc0100scn = state->tc0100scn_2;
} }
else if (screen == right_screen) else if (screen == state->rscreen)
{ {
xoffs = 36 * 8 * 2; xoffs = 36 * 8 * 2;
tc0100scn = devtag_get_device(screen->machine, "tc0100scn_3"); tc0100scn = state->tc0100scn_3;
} }
tc0100scn_tilemap_update(tc0100scn); tc0100scn_tilemap_update(tc0100scn);

View File

@ -1,27 +1,15 @@
#include "driver.h" #include "driver.h"
#include "video/taitoic.h" #include "video/taitoic.h"
#include "includes/othunder.h"
struct tempsprite
{
int gfx;
int code,color;
int flipx,flipy;
int x,y;
int zoomx,zoomy;
int primask;
};
static struct tempsprite *spritelist;
/**********************************************************/
VIDEO_START( othunder ) VIDEO_START( othunder )
{ {
/* Up to $800/8 big sprites, requires 0x100 * sizeof(*spritelist) /* Up to $800/8 big sprites, requires 0x100 * sizeof(*spritelist)
Multiply this by 32 to give room for the number of small sprites, Multiply this by 32 to give room for the number of small sprites,
which are what actually get put in the structure. */ which are what actually get put in the structure. */
spritelist = auto_alloc_array(machine, struct tempsprite, 0x2000); othunder_state *state = (othunder_state *)machine->driver_data;
state->spritelist = auto_alloc_array(machine, struct othunder_tempsprite, 0x2000);
} }
@ -77,9 +65,10 @@ spriteram is being tested, take no notice of that.]
static void draw_sprites( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect, const int *primasks, int y_offs ) static void draw_sprites( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect, const int *primasks, int y_offs )
{ {
othunder_state *state = (othunder_state *)machine->driver_data;
UINT16 *spritemap = (UINT16 *)memory_region(machine, "user1"); UINT16 *spritemap = (UINT16 *)memory_region(machine, "user1");
UINT16 tile_mask = (machine->gfx[0]->total_elements) - 1; UINT16 tile_mask = (machine->gfx[0]->total_elements) - 1;
UINT16 *spriteram16 = machine->generic.spriteram.u16; UINT16 *spriteram16 = state->spriteram;
int offs, data, tilenum, color, flipx, flipy; int offs, data, tilenum, color, flipx, flipy;
int x, y, priority, curx, cury; int x, y, priority, curx, cury;
int sprites_flipscreen = 0; int sprites_flipscreen = 0;
@ -89,9 +78,9 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap,const rectan
/* pdrawgfx() needs us to draw sprites front to back, so we have to build a list /* pdrawgfx() needs us to draw sprites front to back, so we have to build a list
while processing sprite ram and then draw them all at the end */ while processing sprite ram and then draw them all at the end */
struct tempsprite *sprite_ptr = spritelist; struct othunder_tempsprite *sprite_ptr = state->spritelist;
for (offs = (machine->generic.spriteram_size/2)-4;offs >=0;offs -= 4) for (offs = (state->spriteram_size / 2) - 4; offs >= 0; offs -= 4)
{ {
data = spriteram16[offs + 0]; data = spriteram16[offs + 0];
zoomy = (data & 0xfe00) >> 9; zoomy = (data & 0xfe00) >> 9;
@ -110,7 +99,8 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap,const rectan
tilenum = data & 0x1fff; // $80000 spritemap rom maps up to $2000 64x64 sprites tilenum = data & 0x1fff; // $80000 spritemap rom maps up to $2000 64x64 sprites
flipy = (data & 0x8000) >> 15; flipy = (data & 0x8000) >> 15;
if (!tilenum) continue; if (!tilenum)
continue;
map_offset = tilenum << 5; map_offset = tilenum << 5;
@ -191,7 +181,7 @@ logerror("Sprite number %04x had %02x invalid chunks\n",tilenum,bad_chunks);
} }
/* this happens only if primsks != NULL */ /* this happens only if primsks != NULL */
while (sprite_ptr != spritelist) while (sprite_ptr != state->spritelist)
{ {
sprite_ptr--; sprite_ptr--;
@ -212,12 +202,12 @@ logerror("Sprite number %04x had %02x invalid chunks\n",tilenum,bad_chunks);
VIDEO_UPDATE( othunder ) VIDEO_UPDATE( othunder )
{ {
const device_config *tc0100scn = devtag_get_device(screen->machine, "tc0100scn"); othunder_state *state = (othunder_state *)screen->machine->driver_data;
int layer[3]; int layer[3];
tc0100scn_tilemap_update(tc0100scn); tc0100scn_tilemap_update(state->tc0100scn);
layer[0] = tc0100scn_bottomlayer(tc0100scn); layer[0] = tc0100scn_bottomlayer(state->tc0100scn);
layer[1] = layer[0] ^ 1; layer[1] = layer[0] ^ 1;
layer[2] = 2; layer[2] = 2;
@ -226,9 +216,9 @@ VIDEO_UPDATE( othunder )
/* Ensure screen blanked even when bottom layer not drawn due to disable bit */ /* Ensure screen blanked even when bottom layer not drawn due to disable bit */
bitmap_fill(bitmap, cliprect, 0); bitmap_fill(bitmap, cliprect, 0);
tc0100scn_tilemap_draw(tc0100scn, bitmap, cliprect, layer[0], TILEMAP_DRAW_OPAQUE, 1); tc0100scn_tilemap_draw(state->tc0100scn, bitmap, cliprect, layer[0], TILEMAP_DRAW_OPAQUE, 1);
tc0100scn_tilemap_draw(tc0100scn, bitmap, cliprect, layer[1], 0, 2); tc0100scn_tilemap_draw(state->tc0100scn, bitmap, cliprect, layer[1], 0, 2);
tc0100scn_tilemap_draw(tc0100scn, bitmap, cliprect, layer[2], 0, 4); tc0100scn_tilemap_draw(state->tc0100scn, bitmap, cliprect, layer[2], 0, 4);
/* Sprites can be under/over the layer below text layer */ /* Sprites can be under/over the layer below text layer */
{ {

View File

@ -1,62 +1,34 @@
#include "driver.h" #include "driver.h"
#include "video/taitoic.h" #include "video/taitoic.h"
#include "includes/slapshot.h"
struct tempsprite
{
int gfx;
int code,color;
int flipx,flipy;
int x,y;
int zoomx,zoomy;
int primask;
};
static struct tempsprite *spritelist;
static INT32 sprites_disabled,sprites_active_area,sprites_master_scrollx,sprites_master_scrolly;
static int sprites_flipscreen = 0;
static UINT16 *spriteram_buffered,*spriteram_delayed;
static INT32 taito_sprite_type = 0;
UINT16 *taito_sprite_ext;
size_t taito_spriteext_size;
static UINT16 spritebank[8];
static INT32 taito_hide_pixels;
/**********************************************************/ /**********************************************************/
static VIDEO_START( slapshot_core )
{
int i;
spriteram_delayed = auto_alloc_array(machine, UINT16, machine->generic.spriteram_size/2);
spriteram_buffered = auto_alloc_array(machine, UINT16, machine->generic.spriteram_size/2);
spritelist = auto_alloc_array(machine, struct tempsprite, 0x400);
for (i = 0; i < 8; i ++)
spritebank[i] = 0x400 * i;
sprites_disabled = 1;
sprites_active_area = 0;
state_save_register_global(machine, taito_hide_pixels);
state_save_register_global(machine, taito_sprite_type);
state_save_register_global_array(machine, spritebank);
state_save_register_global(machine, sprites_disabled);
state_save_register_global(machine, sprites_active_area);
state_save_register_global_pointer(machine, spriteram_delayed, machine->generic.spriteram_size/2);
state_save_register_global_pointer(machine, spriteram_buffered, machine->generic.spriteram_size/2);
}
VIDEO_START( slapshot ) VIDEO_START( slapshot )
{ {
taito_hide_pixels = 3; slapshot_state *state = (slapshot_state *)machine->driver_data;
taito_sprite_type = 2; int i;
VIDEO_START_CALL(slapshot_core);
}
state->spriteram_delayed = auto_alloc_array(machine, UINT16, state->spriteram_size / 2);
state->spriteram_buffered = auto_alloc_array(machine, UINT16, state->spriteram_size / 2);
state->spritelist = auto_alloc_array(machine, struct slapshot_tempsprite, 0x400);
for (i = 0; i < 8; i ++)
state->spritebank[i] = 0x400 * i;
state->sprites_disabled = 1;
state->sprites_active_area = 0;
state_save_register_global_array(machine, state->spritebank);
state_save_register_global(machine, state->sprites_disabled);
state_save_register_global(machine, state->sprites_active_area);
state_save_register_global(machine, state->sprites_master_scrollx);
state_save_register_global(machine, state->sprites_master_scrolly);
state_save_register_global(machine, state->sprites_flipscreen);
state_save_register_global(machine, state->prepare_sprites);
state_save_register_global_pointer(machine, state->spriteram_delayed, state->spriteram_size / 2);
state_save_register_global_pointer(machine, state->spriteram_buffered, state->spriteram_size / 2);
}
/************************************************************ /************************************************************
SPRITE DRAW ROUTINES SPRITE DRAW ROUTINES
@ -117,6 +89,7 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap,const rectan
000b - 000f : unused 000b - 000f : unused
*/ */
slapshot_state *state = (slapshot_state *)machine->driver_data;
int x, y, off, extoffs; int x, y, off, extoffs;
int code, color, spritedata, spritecont, flipx, flipy; int code, color, spritedata, spritecont, flipx, flipy;
int xcurrent, ycurrent, big_sprite = 0; int xcurrent, ycurrent, big_sprite = 0;
@ -129,19 +102,19 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap,const rectan
/* pdrawgfx() needs us to draw sprites front to back, so we have to build a list /* pdrawgfx() needs us to draw sprites front to back, so we have to build a list
while processing sprite ram and then draw them all at the end */ while processing sprite ram and then draw them all at the end */
struct tempsprite *sprite_ptr = spritelist; struct slapshot_tempsprite *sprite_ptr = state->spritelist;
/* must remember enable status from last frame because driftout fails to /* must remember enable status from last frame because driftout fails to
reactivate them from a certain point onwards. */ reactivate them from a certain point onwards. */
int disabled = sprites_disabled; int disabled = state->sprites_disabled;
/* must remember master scroll from previous frame because driftout /* must remember master scroll from previous frame because driftout
sometimes doesn't set it. */ sometimes doesn't set it. */
int master_scrollx = sprites_master_scrollx; int master_scrollx = state->sprites_master_scrollx;
int master_scrolly = sprites_master_scrolly; int master_scrolly = state->sprites_master_scrolly;
/* must also remember the sprite bank from previous frame. */ /* must also remember the sprite bank from previous frame. */
int area = sprites_active_area; int area = state->sprites_active_area;
scroll1x = 0; scroll1x = 0;
scroll1y = 0; scroll1y = 0;
@ -149,13 +122,13 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap,const rectan
xcurrent = ycurrent = 0; xcurrent = ycurrent = 0;
color = 0; color = 0;
x_offset = taito_hide_pixels; /* Get rid of 0-3 unwanted pixels on edge of screen. */ x_offset = 3; /* Get rid of 0-3 unwanted pixels on edge of screen. */
if (sprites_flipscreen) x_offset = -x_offset; if (state->sprites_flipscreen) x_offset = -x_offset;
/* safety check to avoid getting stuck in bank 2 for games using only one bank */ /* safety check to avoid getting stuck in bank 2 for games using only one bank */
if (area == 0x8000 && if (area == 0x8000 &&
spriteram_buffered[(0x8000+6)/2] == 0 && state->spriteram_buffered[(0x8000 + 6) / 2] == 0 &&
spriteram_buffered[(0x8000+10)/2] == 0) state->spriteram_buffered[(0x8000 + 10) / 2] == 0)
area = 0; area = 0;
@ -164,40 +137,45 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap,const rectan
/* sprites_active_area may change during processing */ /* sprites_active_area may change during processing */
int offs = off + area; int offs = off + area;
if (spriteram_buffered[(offs+6)/2] & 0x8000) if (state->spriteram_buffered[(offs + 6) / 2] & 0x8000)
{ {
disabled = spriteram_buffered[(offs+10)/2] & 0x1000; disabled = state->spriteram_buffered[(offs + 10) / 2] & 0x1000;
sprites_flipscreen = spriteram_buffered[(offs+10)/2] & 0x2000; state->sprites_flipscreen = state->spriteram_buffered[(offs + 10) / 2] & 0x2000;
x_offset = taito_hide_pixels; /* Get rid of 0-3 unwanted pixels on edge of screen. */ x_offset = 3; /* Get rid of 0-3 unwanted pixels on edge of screen. */
if (sprites_flipscreen) x_offset = -x_offset; if (state->sprites_flipscreen) x_offset = -x_offset;
area = 0x8000 * (spriteram_buffered[(offs+10)/2] & 0x0001); area = 0x8000 * (state->spriteram_buffered[(offs + 10) / 2] & 0x0001);
continue; continue;
} }
//popmessage("%04x",area); //popmessage("%04x",area);
/* check for extra scroll offset */ /* check for extra scroll offset */
if ((spriteram_buffered[(offs+4)/2] & 0xf000) == 0xa000) if ((state->spriteram_buffered[(offs + 4) / 2] & 0xf000) == 0xa000)
{ {
master_scrollx = spriteram_buffered[(offs+4)/2] & 0xfff; master_scrollx = state->spriteram_buffered[(offs + 4) / 2] & 0xfff;
if (master_scrollx >= 0x800) master_scrollx -= 0x1000; /* signed value */ if (master_scrollx >= 0x800)
master_scrolly = spriteram_buffered[(offs+6)/2] & 0xfff; master_scrollx -= 0x1000; /* signed value */
if (master_scrolly >= 0x800) master_scrolly -= 0x1000; /* signed value */
master_scrolly = state->spriteram_buffered[(offs + 6) / 2] & 0xfff;
if (master_scrolly >= 0x800)
master_scrolly -= 0x1000; /* signed value */
} }
if ((spriteram_buffered[(offs+4)/2] & 0xf000) == 0x5000) if ((state->spriteram_buffered[(offs + 4) / 2] & 0xf000) == 0x5000)
{ {
scroll1x = spriteram_buffered[(offs+4)/2] & 0xfff; scroll1x = state->spriteram_buffered[(offs + 4) / 2] & 0xfff;
if (scroll1x >= 0x800) scroll1x -= 0x1000; /* signed value */ if (scroll1x >= 0x800)
scroll1x -= 0x1000; /* signed value */
scroll1y = spriteram_buffered[(offs+6)/2] & 0xfff; scroll1y = state->spriteram_buffered[(offs + 6) / 2] & 0xfff;
if (scroll1y >= 0x800) scroll1y -= 0x1000; /* signed value */ if (scroll1y >= 0x800)
scroll1y -= 0x1000; /* signed value */
} }
if (disabled) if (disabled)
continue; continue;
spritedata = spriteram_buffered[(offs+8)/2]; spritedata = state->spriteram_buffered[(offs + 8) / 2];
spritecont = (spritedata & 0xff00) >> 8; spritecont = (spritedata & 0xff00) >> 8;
@ -205,13 +183,13 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap,const rectan
{ {
if (big_sprite == 0) /* are we starting a big sprite ? */ if (big_sprite == 0) /* are we starting a big sprite ? */
{ {
xlatch = spriteram_buffered[(offs+4)/2] & 0xfff; xlatch = state->spriteram_buffered[(offs + 4) / 2] & 0xfff;
ylatch = spriteram_buffered[(offs+6)/2] & 0xfff; ylatch = state->spriteram_buffered[(offs + 6) / 2] & 0xfff;
x_no = 0; x_no = 0;
y_no = 0; y_no = 0;
zoomword = spriteram_buffered[(offs+2)/2]; zoomword = state->spriteram_buffered[(offs + 2) / 2];
zoomylatch = (zoomword >> 8) & 0xff; zoomylatch = (zoomword >> 8) & 0xff;
zoomxlatch = (zoomword) & 0xff; zoomxlatch = (zoomword >> 0) & 0xff;
big_sprite = 1; /* we have started a new big sprite */ big_sprite = 1; /* we have started a new big sprite */
} }
} }
@ -230,7 +208,7 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap,const rectan
// of anything. // of anything.
if (big_sprite == 0 || (spritecont & 0xf0) == 0) if (big_sprite == 0 || (spritecont & 0xf0) == 0)
{ {
x = spriteram_buffered[(offs+4)/2]; x = state->spriteram_buffered[(offs + 4) / 2];
// DG: some absolute x values deduced here are 1 too high (scenes when you get // DG: some absolute x values deduced here are 1 too high (scenes when you get
// home run in Koshien, and may also relate to BG layer woods and stuff as you // home run in Koshien, and may also relate to BG layer woods and stuff as you
@ -253,7 +231,7 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap,const rectan
scrolly = scroll1y + master_scrolly; scrolly = scroll1y + master_scrolly;
} }
x &= 0xfff; x &= 0xfff;
y = spriteram_buffered[(offs+6)/2] & 0xfff; y = state->spriteram_buffered[(offs+6)/2] & 0xfff;
xcurrent = x; xcurrent = x;
ycurrent = y; ycurrent = y;
@ -301,9 +279,9 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap,const rectan
} }
else else
{ {
zoomword = spriteram_buffered[(offs+2)/2]; zoomword = state->spriteram_buffered[(offs+2)/2];
zoomy = (zoomword >> 8) & 0xff; zoomy = (zoomword >> 8) & 0xff;
zoomx = (zoomword) & 0xff; zoomx = (zoomword >> 0) & 0xff;
zx = (0x100 - zoomx) / 16; zx = (0x100 - zoomx) / 16;
zy = (0x100 - zoomy) / 16; zy = (0x100 - zoomy) / 16;
} }
@ -318,42 +296,14 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap,const rectan
extoffs = offs; extoffs = offs;
if (extoffs >= 0x8000) extoffs -= 0x4000; /* spriteram[0x4000-7fff] has no corresponding extension area */ if (extoffs >= 0x8000) extoffs -= 0x4000; /* spriteram[0x4000-7fff] has no corresponding extension area */
if (taito_sprite_type == 0)
{
int bank;
code = spriteram_buffered[(offs)/2] & 0x1fff;
bank = (code & 0x1c00) >> 10;
code = spritebank[bank] + (code & 0x3ff);
}
if (taito_sprite_type == 1) /* Yuyugogo */
{ {
int i; int i;
code = spriteram_buffered[(offs)/2] & 0x3ff; code = state->spriteram_buffered[(offs)/2] & 0xff;
i = (taito_sprite_ext[(extoffs >> 4)] & 0x3f ) << 10; i = (state->spriteext[(extoffs >> 4)] & 0xff00 );
code = (i | code); code = (i | code);
} }
if (taito_sprite_type == 2) /* Pulirula, Slapshot */
{
int i;
code = spriteram_buffered[(offs)/2] & 0xff;
i = (taito_sprite_ext[(extoffs >> 4)] & 0xff00 );
code = (i | code);
}
if (taito_sprite_type == 3) /* Dinorex and a few quizzes */
{
int i;
code = spriteram_buffered[(offs)/2] & 0xff;
i = (taito_sprite_ext[(extoffs >> 4)] & 0xff ) << 8;
code = (i | code);
}
if (code == 0) continue; if (code == 0) continue;
@ -366,7 +316,7 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap,const rectan
cury = (y + scrolly) & 0xfff; cury = (y + scrolly) & 0xfff;
if (cury >= 0x800) cury -= 0x1000; /* treat it as signed */ if (cury >= 0x800) cury -= 0x1000; /* treat it as signed */
if (sprites_flipscreen) if (state->sprites_flipscreen)
{ {
/* -zx/y is there to fix zoomed sprite coords in screenflip. /* -zx/y is there to fix zoomed sprite coords in screenflip.
drawgfxzoom does not know to draw from flip-side of sprites when drawgfxzoom does not know to draw from flip-side of sprites when
@ -412,7 +362,7 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap,const rectan
/* this happens only if primsks != NULL */ /* this happens only if primsks != NULL */
while (sprite_ptr != spritelist) while (sprite_ptr != state->spritelist)
{ {
sprite_ptr--; sprite_ptr--;
@ -426,59 +376,65 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap,const rectan
} }
} }
static int prepare_sprites;
static void taito_handle_sprite_buffering( running_machine *machine ) static void taito_handle_sprite_buffering( running_machine *machine )
{ {
if (prepare_sprites) /* no buffering */ slapshot_state *state = (slapshot_state *)machine->driver_data;
if (state->prepare_sprites) /* no buffering */
{ {
memcpy(spriteram_buffered,machine->generic.spriteram.u16,machine->generic.spriteram_size); memcpy(state->spriteram_buffered, state->spriteram, state->spriteram_size);
prepare_sprites = 0; state->prepare_sprites = 0;
} }
} }
static void taito_update_sprites_active_area( running_machine *machine ) static void taito_update_sprites_active_area( running_machine *machine )
{ {
slapshot_state *state = (slapshot_state *)machine->driver_data;
int off; int off;
/* if the frame was skipped, we'll have to do the buffering now */ /* if the frame was skipped, we'll have to do the buffering now */
taito_handle_sprite_buffering(machine); taito_handle_sprite_buffering(machine);
/* safety check to avoid getting stuck in bank 2 for games using only one bank */ /* safety check to avoid getting stuck in bank 2 for games using only one bank */
if (sprites_active_area == 0x8000 && if (state->sprites_active_area == 0x8000 &&
spriteram_buffered[(0x8000+6)/2] == 0 && state->spriteram_buffered[(0x8000 + 6) / 2] == 0 &&
spriteram_buffered[(0x8000+10)/2] == 0) state->spriteram_buffered[(0x8000 + 10) / 2] == 0)
sprites_active_area = 0; state->sprites_active_area = 0;
for (off = 0; off < 0x4000; off += 16) for (off = 0; off < 0x4000; off += 16)
{ {
/* sprites_active_area may change during processing */ /* sprites_active_area may change during processing */
int offs = off + sprites_active_area; int offs = off + state->sprites_active_area;
if (spriteram_buffered[(offs+6)/2] & 0x8000) if (state->spriteram_buffered[(offs + 6) / 2] & 0x8000)
{ {
sprites_disabled = spriteram_buffered[(offs+10)/2] & 0x1000; state->sprites_disabled = state->spriteram_buffered[(offs + 10) / 2] & 0x1000;
sprites_active_area = 0x8000 * (spriteram_buffered[(offs+10)/2] & 0x0001); state->sprites_active_area = 0x8000 * (state->spriteram_buffered[(offs + 10) / 2] & 0x0001);
continue; continue;
} }
/* check for extra scroll offset */ /* check for extra scroll offset */
if ((spriteram_buffered[(offs+4)/2] & 0xf000) == 0xa000) if ((state->spriteram_buffered[(offs+4)/2] & 0xf000) == 0xa000)
{ {
sprites_master_scrollx = spriteram_buffered[(offs+4)/2] & 0xfff; state->sprites_master_scrollx = state->spriteram_buffered[(offs + 4) / 2] & 0xfff;
if (sprites_master_scrollx >= 0x800) sprites_master_scrollx -= 0x1000; /* signed value */ if (state->sprites_master_scrollx >= 0x800)
sprites_master_scrolly = spriteram_buffered[(offs+6)/2] & 0xfff; state->sprites_master_scrollx -= 0x1000; /* signed value */
if (sprites_master_scrolly >= 0x800) sprites_master_scrolly -= 0x1000; /* signed value */
state->sprites_master_scrolly = state->spriteram_buffered[(offs + 6) / 2] & 0xfff;
if (state->sprites_master_scrolly >= 0x800)
state->sprites_master_scrolly -= 0x1000; /* signed value */
} }
} }
} }
VIDEO_EOF( taito_no_buffer ) VIDEO_EOF( taito_no_buffer )
{ {
slapshot_state *state = (slapshot_state *)machine->driver_data;
taito_update_sprites_active_area(machine); taito_update_sprites_active_area(machine);
prepare_sprites = 1; state->prepare_sprites = 1;
} }
@ -500,8 +456,7 @@ a bg layer given priority over some sprites.
VIDEO_UPDATE( slapshot ) VIDEO_UPDATE( slapshot )
{ {
const device_config *tc0480scp = devtag_get_device(screen->machine, "tc0480scp"); slapshot_state *state = (slapshot_state *)screen->machine->driver_data;
const device_config *tc0360pri = devtag_get_device(screen->machine, "tc0360pri");
UINT8 layer[5]; UINT8 layer[5];
UINT8 tilepri[5]; UINT8 tilepri[5];
UINT8 spritepri[4]; UINT8 spritepri[4];
@ -545,9 +500,9 @@ VIDEO_UPDATE( slapshot )
taito_handle_sprite_buffering(screen->machine); taito_handle_sprite_buffering(screen->machine);
tc0480scp_tilemap_update(tc0480scp); tc0480scp_tilemap_update(state->tc0480scp);
priority = tc0480scp_get_bg_priority(tc0480scp); priority = tc0480scp_get_bg_priority(state->tc0480scp);
layer[0] = (priority & 0xf000) >> 12; /* tells us which bg layer is bottom */ layer[0] = (priority & 0xf000) >> 12; /* tells us which bg layer is bottom */
layer[1] = (priority & 0x0f00) >> 8; layer[1] = (priority & 0x0f00) >> 8;
@ -555,18 +510,18 @@ VIDEO_UPDATE( slapshot )
layer[3] = (priority & 0x000f) >> 0; /* tells us which is top */ layer[3] = (priority & 0x000f) >> 0; /* tells us which is top */
layer[4] = 4; /* text layer always over bg layers */ layer[4] = 4; /* text layer always over bg layers */
tilepri[0] = tc0360pri_r(tc0360pri, 4) & 0x0f; /* bg0 */ tilepri[0] = tc0360pri_r(state->tc0360pri, 4) & 0x0f; /* bg0 */
tilepri[1] = tc0360pri_r(tc0360pri, 4) >> 4; /* bg1 */ tilepri[1] = tc0360pri_r(state->tc0360pri, 4) >> 4; /* bg1 */
tilepri[2] = tc0360pri_r(tc0360pri, 5) & 0x0f; /* bg2 */ tilepri[2] = tc0360pri_r(state->tc0360pri, 5) & 0x0f; /* bg2 */
tilepri[3] = tc0360pri_r(tc0360pri, 5) >> 4; /* bg3 */ tilepri[3] = tc0360pri_r(state->tc0360pri, 5) >> 4; /* bg3 */
/* we actually assume text layer is on top of everything anyway, but FWIW... */ /* we actually assume text layer is on top of everything anyway, but FWIW... */
tilepri[layer[4]] = tc0360pri_r(tc0360pri, 7) & 0x0f; /* fg (text layer) */ tilepri[layer[4]] = tc0360pri_r(state->tc0360pri, 7) & 0x0f; /* fg (text layer) */
spritepri[0] = tc0360pri_r(tc0360pri, 6) & 0x0f; spritepri[0] = tc0360pri_r(state->tc0360pri, 6) & 0x0f;
spritepri[1] = tc0360pri_r(tc0360pri, 6) >> 4; spritepri[1] = tc0360pri_r(state->tc0360pri, 6) >> 4;
spritepri[2] = tc0360pri_r(tc0360pri, 7) & 0x0f; spritepri[2] = tc0360pri_r(state->tc0360pri, 7) & 0x0f;
spritepri[3] = tc0360pri_r(tc0360pri, 7) >> 4; spritepri[3] = tc0360pri_r(state->tc0360pri, 7) >> 4;
bitmap_fill(screen->machine->priority_bitmap, cliprect, 0); bitmap_fill(screen->machine->priority_bitmap, cliprect, 0);
bitmap_fill(bitmap, cliprect, 0); bitmap_fill(bitmap, cliprect, 0);
@ -574,22 +529,22 @@ VIDEO_UPDATE( slapshot )
#ifdef MAME_DEBUG #ifdef MAME_DEBUG
if (dislayer[layer[0]] == 0) if (dislayer[layer[0]] == 0)
#endif #endif
tc0480scp_tilemap_draw(tc0480scp, bitmap, cliprect, layer[0], 0, 1); tc0480scp_tilemap_draw(state->tc0480scp, bitmap, cliprect, layer[0], 0, 1);
#ifdef MAME_DEBUG #ifdef MAME_DEBUG
if (dislayer[layer[1]] == 0) if (dislayer[layer[1]] == 0)
#endif #endif
tc0480scp_tilemap_draw(tc0480scp, bitmap, cliprect, layer[1], 0, 2); tc0480scp_tilemap_draw(state->tc0480scp, bitmap, cliprect, layer[1], 0, 2);
#ifdef MAME_DEBUG #ifdef MAME_DEBUG
if (dislayer[layer[2]] == 0) if (dislayer[layer[2]] == 0)
#endif #endif
tc0480scp_tilemap_draw(tc0480scp, bitmap, cliprect, layer[2], 0, 4); tc0480scp_tilemap_draw(state->tc0480scp, bitmap, cliprect, layer[2], 0, 4);
#ifdef MAME_DEBUG #ifdef MAME_DEBUG
if (dislayer[layer[3]] == 0) if (dislayer[layer[3]] == 0)
#endif #endif
tc0480scp_tilemap_draw(tc0480scp, bitmap, cliprect, layer[3], 0, 8); tc0480scp_tilemap_draw(state->tc0480scp, bitmap, cliprect, layer[3], 0, 8);
{ {
int primasks[4] = {0,0,0,0}; int primasks[4] = {0,0,0,0};
@ -615,7 +570,7 @@ VIDEO_UPDATE( slapshot )
#ifdef MAME_DEBUG #ifdef MAME_DEBUG
if (dislayer[layer[4]] == 0) if (dislayer[layer[4]] == 0)
#endif #endif
tc0480scp_tilemap_draw(tc0480scp, bitmap, cliprect, layer[4], 0, 0); tc0480scp_tilemap_draw(state->tc0480scp, bitmap, cliprect, layer[4], 0, 0);
return 0; return 0;
} }

View File

@ -2154,6 +2154,13 @@ static STATE_POSTLOAD( tc0100scn_postload )
tc0100scn_set_layer_ptrs(tc0100scn); tc0100scn_set_layer_ptrs(tc0100scn);
tc0100scn_restore_scroll(tc0100scn); tc0100scn_restore_scroll(tc0100scn);
tilemap_mark_all_tiles_dirty(tc0100scn->tilemap[0][0]);
tilemap_mark_all_tiles_dirty(tc0100scn->tilemap[1][0]);
tilemap_mark_all_tiles_dirty(tc0100scn->tilemap[2][0]);
tilemap_mark_all_tiles_dirty(tc0100scn->tilemap[0][1]);
tilemap_mark_all_tiles_dirty(tc0100scn->tilemap[1][1]);
tilemap_mark_all_tiles_dirty(tc0100scn->tilemap[2][1]);
} }
READ16_DEVICE_HANDLER( tc0100scn_word_r ) READ16_DEVICE_HANDLER( tc0100scn_word_r )

View File

@ -1,14 +1,15 @@
#include "driver.h" #include "driver.h"
#include "video/taitoic.h" #include "video/taitoic.h"
#include "includes/warriorb.h"
/**********************************************************/ /**********************************************************/
VIDEO_START( warriorb ) VIDEO_START( warriorb )
{ {
const device_config *tc0100scn = devtag_get_device(machine, "tc0100scn_1"); warriorb_state *state = (warriorb_state *)machine->driver_data;
/* Ensure palette from correct TC0110PCR used for each screen */ /* Ensure palette from correct TC0110PCR used for each screen */
tc0100scn_set_colbanks(tc0100scn, 0x0, 0x100, 0x0); tc0100scn_set_colbanks(state->tc0100scn_1, 0x0, 0x100, 0x0);
} }
@ -18,7 +19,8 @@ VIDEO_START( warriorb )
static void draw_sprites( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect, int x_offs, int y_offs ) static void draw_sprites( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect, int x_offs, int y_offs )
{ {
UINT16 *spriteram16 = machine->generic.spriteram.u16; warriorb_state *state = (warriorb_state *)machine->driver_data;
UINT16 *spriteram = state->spriteram;
int offs, data, data2, tilenum, color, flipx, flipy; int offs, data, data2, tilenum, color, flipx, flipy;
int x, y, priority, pri_mask; int x, y, priority, pri_mask;
@ -27,16 +29,16 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap,const rectan
#endif #endif
/* pdrawgfx() needs us to draw sprites front to back */ /* pdrawgfx() needs us to draw sprites front to back */
for (offs = 0;offs < machine->generic.spriteram_size/2;offs += 4) for (offs = 0; offs < state->spriteram_size / 2; offs += 4)
{ {
data = spriteram16[offs+1]; data = spriteram[offs + 1];
tilenum = data & 0x7fff; tilenum = data & 0x7fff;
data = spriteram16[offs+0]; data = spriteram[offs + 0];
y = (-(data & 0x1ff) - 24) & 0x1ff; /* (inverted y adjusted for vis area) */ y = (-(data & 0x1ff) - 24) & 0x1ff; /* (inverted y adjusted for vis area) */
flipy = (data & 0x200) >> 9; flipy = (data & 0x200) >> 9;
data2 = spriteram16[offs+2]; data2 = spriteram[offs + 2];
/* 8,4 also seen in msbyte */ /* 8,4 also seen in msbyte */
priority = (data2 & 0x0100) >> 8; // 1 = low priority = (data2 & 0x0100) >> 8; // 1 = low
@ -47,7 +49,7 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap,const rectan
color = (data2 & 0x7f); color = (data2 & 0x7f);
data = spriteram16[offs+3]; data = spriteram[offs + 3];
x = (data & 0x3ff); x = (data & 0x3ff);
flipx = (data & 0x400) >> 10; flipx = (data & 0x400) >> 10;
@ -84,22 +86,20 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap,const rectan
VIDEO_UPDATE( warriorb ) VIDEO_UPDATE( warriorb )
{ {
warriorb_state *state = (warriorb_state *)screen->machine->driver_data;
int xoffs = 0; int xoffs = 0;
UINT8 layer[3], nodraw; UINT8 layer[3], nodraw;
const device_config *left_screen = devtag_get_device(screen->machine, "lscreen");
const device_config *right_screen = devtag_get_device(screen->machine, "rscreen");
const device_config *tc0100scn = NULL; const device_config *tc0100scn = NULL;
if (screen == left_screen) if (screen == state->lscreen)
{ {
xoffs = 40 * 8 * 0; xoffs = 40 * 8 * 0;
tc0100scn = devtag_get_device(screen->machine, "tc0100scn_1"); tc0100scn = state->tc0100scn_1;
} }
else if (screen == right_screen) else if (screen == state->rscreen)
{ {
xoffs = 40 * 8 * 1; xoffs = 40 * 8 * 1;
tc0100scn = devtag_get_device(screen->machine, "tc0100scn_2"); tc0100scn = state->tc0100scn_2;
} }
tc0100scn_tilemap_update(tc0100scn); tc0100scn_tilemap_update(tc0100scn);

View File

@ -1,26 +1,15 @@
#include "driver.h" #include "driver.h"
#include "video/taitoic.h" #include "video/taitoic.h"
#include "includes/wgp.h"
static tilemap_t *wgp_piv_tilemap[3];
UINT16 *wgp_spritemap;
size_t wgp_spritemap_size;
UINT16 *wgp_pivram;
UINT16 *wgp_piv_ctrlram;
static UINT16 wgp_piv_ctrl_reg;
static UINT16 wgp_piv_zoom[3],wgp_piv_scrollx[3],wgp_piv_scrolly[3];
UINT16 wgp_rotate_ctrl[8];
static int wgp_piv_xoffs,wgp_piv_yoffs;
/*******************************************************************/ /*******************************************************************/
INLINE void common_get_piv_tile_info( running_machine *machine, tile_data *tileinfo, int tile_index, int num ) INLINE void common_get_piv_tile_info( running_machine *machine, tile_data *tileinfo, int tile_index, int num )
{ {
UINT16 tilenum = wgp_pivram[tile_index + num*0x1000]; /* 3 blocks of $2000 */ wgp_state *state = (wgp_state *)machine->driver_data;
UINT16 attr = wgp_pivram[tile_index + num*0x1000 + 0x8000]; /* 3 blocks of $2000 */ UINT16 tilenum = state->pivram[tile_index + num * 0x1000]; /* 3 blocks of $2000 */
UINT16 attr = state->pivram[tile_index + num * 0x1000 + 0x8000]; /* 3 blocks of $2000 */
SET_TILE_INFO( SET_TILE_INFO(
2, 2,
@ -47,29 +36,35 @@ static TILE_GET_INFO( get_piv2_tile_info )
static void wgp_core_vh_start( running_machine *machine, int piv_xoffs, int piv_yoffs ) static void wgp_core_vh_start( running_machine *machine, int piv_xoffs, int piv_yoffs )
{ {
const device_config *tc0100scn = devtag_get_device(machine, "tc0100scn"); wgp_state *state = (wgp_state *)machine->driver_data;
wgp_piv_tilemap[0] = tilemap_create(machine, get_piv0_tile_info, tilemap_scan_rows, 16, 16, 64, 64); state->piv_tilemap[0] = tilemap_create(machine, get_piv0_tile_info, tilemap_scan_rows, 16, 16, 64, 64);
wgp_piv_tilemap[1] = tilemap_create(machine, get_piv1_tile_info, tilemap_scan_rows, 16, 16, 64, 64); state->piv_tilemap[1] = tilemap_create(machine, get_piv1_tile_info, tilemap_scan_rows, 16, 16, 64, 64);
wgp_piv_tilemap[2] = tilemap_create(machine, get_piv2_tile_info, tilemap_scan_rows, 16, 16, 64, 64); state->piv_tilemap[2] = tilemap_create(machine, get_piv2_tile_info, tilemap_scan_rows, 16, 16, 64, 64);
wgp_piv_xoffs = piv_xoffs; state->piv_xoffs = piv_xoffs;
wgp_piv_yoffs = piv_yoffs; state->piv_yoffs = piv_yoffs;
tilemap_set_transparent_pen(wgp_piv_tilemap[0], 0); tilemap_set_transparent_pen(state->piv_tilemap[0], 0);
tilemap_set_transparent_pen(wgp_piv_tilemap[1], 0); tilemap_set_transparent_pen(state->piv_tilemap[1], 0);
tilemap_set_transparent_pen(wgp_piv_tilemap[2], 0); tilemap_set_transparent_pen(state->piv_tilemap[2], 0);
/* flipscreen n/a */ /* flipscreen n/a */
tilemap_set_scrolldx(wgp_piv_tilemap[0], -piv_xoffs, 0); tilemap_set_scrolldx(state->piv_tilemap[0], -piv_xoffs, 0);
tilemap_set_scrolldx(wgp_piv_tilemap[1], -piv_xoffs, 0); tilemap_set_scrolldx(state->piv_tilemap[1], -piv_xoffs, 0);
tilemap_set_scrolldx(wgp_piv_tilemap[2], -piv_xoffs, 0); tilemap_set_scrolldx(state->piv_tilemap[2], -piv_xoffs, 0);
tilemap_set_scrolldy(wgp_piv_tilemap[0], -piv_yoffs, 0); tilemap_set_scrolldy(state->piv_tilemap[0], -piv_yoffs, 0);
tilemap_set_scrolldy(wgp_piv_tilemap[1], -piv_yoffs, 0); tilemap_set_scrolldy(state->piv_tilemap[1], -piv_yoffs, 0);
tilemap_set_scrolldy(wgp_piv_tilemap[2], -piv_yoffs, 0); tilemap_set_scrolldy(state->piv_tilemap[2], -piv_yoffs, 0);
/* We don't need tilemap_set_scroll_rows, as the custom draw routine applies rowscroll manually */ /* We don't need tilemap_set_scroll_rows, as the custom draw routine applies rowscroll manually */
tc0100scn_set_colbanks(tc0100scn, 0x80, 0xc0, 0x40); tc0100scn_set_colbanks(state->tc0100scn, 0x80, 0xc0, 0x40);
state_save_register_global(machine, state->piv_ctrl_reg);
state_save_register_global_array(machine, state->rotate_ctrl);
state_save_register_global_array(machine, state->piv_zoom);
state_save_register_global_array(machine, state->piv_scrollx);
state_save_register_global_array(machine, state->piv_scrolly);
} }
VIDEO_START( wgp ) VIDEO_START( wgp )
@ -129,16 +124,19 @@ custom chip capable of four rather than three tilemaps.)
READ16_HANDLER( wgp_pivram_word_r ) READ16_HANDLER( wgp_pivram_word_r )
{ {
return wgp_pivram[offset]; wgp_state *state = (wgp_state *)space->machine->driver_data;
return state->pivram[offset];
} }
WRITE16_HANDLER( wgp_pivram_word_w ) WRITE16_HANDLER( wgp_pivram_word_w )
{ {
COMBINE_DATA(&wgp_pivram[offset]); wgp_state *state = (wgp_state *)space->machine->driver_data;
COMBINE_DATA(&state->pivram[offset]);
if (offset < 0x3000) if (offset < 0x3000)
{ {
tilemap_mark_tile_dirty(wgp_piv_tilemap[(offset / 0x1000)], (offset % 0x1000) ); tilemap_mark_tile_dirty(state->piv_tilemap[(offset / 0x1000)], (offset % 0x1000));
} }
else if ((offset >= 0x3400) && (offset < 0x4000)) else if ((offset >= 0x3400) && (offset < 0x4000))
{ {
@ -146,52 +144,54 @@ WRITE16_HANDLER( wgp_pivram_word_w )
} }
else if ((offset >= 0x8000) && (offset < 0xb000)) else if ((offset >= 0x8000) && (offset < 0xb000))
{ {
tilemap_mark_tile_dirty(wgp_piv_tilemap[((offset - 0x8000)/ 0x1000)], (offset % 0x1000) ); tilemap_mark_tile_dirty(state->piv_tilemap[((offset - 0x8000)/ 0x1000)], (offset % 0x1000));
} }
} }
READ16_HANDLER( wgp_piv_ctrl_word_r ) READ16_HANDLER( wgp_piv_ctrl_word_r )
{ {
return wgp_piv_ctrlram[offset]; wgp_state *state = (wgp_state *)space->machine->driver_data;
return state->piv_ctrlram[offset];
} }
WRITE16_HANDLER( wgp_piv_ctrl_word_w ) WRITE16_HANDLER( wgp_piv_ctrl_word_w )
{ {
wgp_state *state = (wgp_state *)space->machine->driver_data;
UINT16 a, b; UINT16 a, b;
COMBINE_DATA(&wgp_piv_ctrlram[offset]); COMBINE_DATA(&state->piv_ctrlram[offset]);
data = wgp_piv_ctrlram[offset]; data = state->piv_ctrlram[offset];
switch (offset) switch (offset)
{ {
case 0x00: case 0x00:
a = -data; a = -data;
b = (a & 0xffe0) >> 1; /* kill bit 4 */ b = (a & 0xffe0) >> 1; /* kill bit 4 */
wgp_piv_scrollx[0] = (a &0xf) | b; state->piv_scrollx[0] = (a & 0xf) | b;
break; break;
case 0x01: case 0x01:
a = -data; a = -data;
b = (a & 0xffe0) >> 1; b = (a & 0xffe0) >> 1;
wgp_piv_scrollx[1] = (a &0xf) | b; state->piv_scrollx[1] = (a & 0xf) | b;
break; break;
case 0x02: case 0x02:
a = -data; a = -data;
b = (a & 0xffe0) >> 1; b = (a & 0xffe0) >> 1;
wgp_piv_scrollx[2] = (a &0xf) | b; state->piv_scrollx[2] = (a & 0xf) | b;
break; break;
case 0x03: case 0x03:
wgp_piv_scrolly[0] = data; state->piv_scrolly[0] = data;
break; break;
case 0x04: case 0x04:
wgp_piv_scrolly[1] = data; state->piv_scrolly[1] = data;
break; break;
case 0x05: case 0x05:
wgp_piv_scrolly[2] = data; state->piv_scrolly[2] = data;
break; break;
case 0x06: case 0x06:
@ -201,24 +201,24 @@ WRITE16_HANDLER( wgp_piv_ctrl_word_w )
seen on Wgp stages 4,5,7 in which piv 2 used seen on Wgp stages 4,5,7 in which piv 2 used
for cloud or scenery wandering up screen */ for cloud or scenery wandering up screen */
wgp_piv_ctrl_reg = data; state->piv_ctrl_reg = data;
break; break;
case 0x08: case 0x08:
/* piv 0 y zoom (0x7f = normal, not seen others) */ /* piv 0 y zoom (0x7f = normal, not seen others) */
wgp_piv_zoom[0] = data; state->piv_zoom[0] = data;
break; break;
case 0x09: case 0x09:
/* piv 1 y zoom (0x7f = normal, values 0 & /* piv 1 y zoom (0x7f = normal, values 0 &
0xff7f-ffbc in Wgp2) */ 0xff7f-ffbc in Wgp2) */
wgp_piv_zoom[1] = data; state->piv_zoom[1] = data;
break; break;
case 0x0a: case 0x0a:
/* piv 2 y zoom (0x7f = normal, values 0 & /* piv 2 y zoom (0x7f = normal, values 0 &
0xff7f-ffbc in Wgp2, 0-0x98 in Wgp round 4/5) */ 0xff7f-ffbc in Wgp2, 0-0x98 in Wgp round 4/5) */
wgp_piv_zoom[2] = data; state->piv_zoom[2] = data;
break; break;
} }
} }
@ -348,7 +348,8 @@ static const UINT8 ylookup[16] =
static void draw_sprites( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect, int y_offs ) static void draw_sprites( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect, int y_offs )
{ {
UINT16 *spriteram16 = machine->generic.spriteram.u16; wgp_state *state = (wgp_state *)machine->driver_data;
UINT16 *spriteram = state->spriteram;
int offs, i, j, k; int offs, i, j, k;
int x, y, curx, cury; int x, y, curx, cury;
int zx, zy, zoomx, zoomy, priority = 0; int zx, zy, zoomx, zoomy, priority = 0;
@ -360,33 +361,32 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap,const rectan
for (offs = 0x1ff; offs >= 0; offs--) for (offs = 0x1ff; offs >= 0; offs--)
{ {
code = (spriteram16[0xe00+offs]); code = (spriteram[0xe00 + offs]);
if (code) /* do we have an active sprite ? */ if (code) /* do we have an active sprite ? */
{ {
i = (code << 3) & 0xfff; /* yes, so we look up its sprite entry */ i = (code << 3) & 0xfff; /* yes, so we look up its sprite entry */
x = spriteram16[i]; x = spriteram[i];
y = spriteram16[i + 1]; y = spriteram[i + 1];
bigsprite = spriteram16[i + 2] &0x3fff; bigsprite = spriteram[i + 2] & 0x3fff;
/* The last five words [i + 3 thru 7] must be zoom/rotation /* The last five words [i + 3 thru 7] must be zoom/rotation
control: for time being we kludge zoom using 1 word. control: for time being we kludge zoom using 1 word.
Timing problems are causing many glitches. */ Timing problems are causing many glitches. */
if ((spriteram16[i + 4]==0xfff6) && (spriteram16[i + 5]==0)) if ((spriteram[i + 4] == 0xfff6) && (spriteram[i + 5] == 0))
continue; continue;
if (((spriteram16[i + 4]!=0xf800) && (spriteram16[i + 4]!=0xfff6)) if (((spriteram[i + 4] != 0xf800) && (spriteram[i + 4] != 0xfff6))
|| ((spriteram16[i + 5]!=0xf800) && (spriteram16[i + 5]!=0)) || ((spriteram[i + 5] != 0xf800) && (spriteram[i + 5] != 0))
|| spriteram16[i + 7]!=0) || spriteram[i + 7] != 0)
rotate = i << 1; rotate = i << 1;
/***** Begin zoom kludge ******/ /***** Begin zoom kludge ******/
zoomx = (spriteram16[i + 3] &0x1ff) + 1; zoomx = (spriteram[i + 3] & 0x1ff) + 1;
zoomy = (spriteram16[i + 3] &0x1ff) + 1; zoomy = (spriteram[i + 3] & 0x1ff) + 1;
y -= 4; y -= 4;
// distant sprites were some 16 pixels too far down // // distant sprites were some 16 pixels too far down //
@ -400,22 +400,21 @@ if (((spriteram16[i + 4]!=0xf800) && (spriteram16[i + 4]!=0xfff6))
map_index = bigsprite << 1; /* now we access sprite tilemap */ map_index = bigsprite << 1; /* now we access sprite tilemap */
/* don't know what selects 2x2 sprites: we use a nasty kludge /* don't know what selects 2x2 sprites: we use a nasty kludge which seems to work */
which seems to work */
i = wgp_spritemap[map_index + 0xa]; i = state->spritemap[map_index + 0xa];
j = wgp_spritemap[map_index + 0xc]; j = state->spritemap[map_index + 0xc];
small_sprite = ((i > 0) & (i <= 8) & (j > 0) & (j <= 8)); small_sprite = ((i > 0) & (i <= 8) & (j > 0) & (j <= 8));
if (small_sprite) if (small_sprite)
{ {
for (i = 0; i < 4; i++) for (i = 0; i < 4; i++)
{ {
code = wgp_spritemap[(map_index + (i << 1))] &tile_mask; code = state->spritemap[(map_index + (i << 1))] & tile_mask;
col = wgp_spritemap[(map_index + (i << 1) + 1)] &0xf; col = state->spritemap[(map_index + (i << 1) + 1)] & 0xf;
/* not known what controls priority */ /* not known what controls priority */
priority = (wgp_spritemap[(map_index + (i << 1) + 1)] &0x70) >> 4; priority = (state->spritemap[(map_index + (i << 1) + 1)] & 0x70) >> 4;
flipx = 0; // no flip xy? flipx = 0; // no flip xy?
flipy = 0; flipy = 0;
@ -442,11 +441,11 @@ if (((spriteram16[i + 4]!=0xf800) && (spriteram16[i + 4]!=0xfff6))
{ {
for (i = 0; i < 16; i++) for (i = 0; i < 16; i++)
{ {
code = wgp_spritemap[(map_index + (i << 1))] &tile_mask; code = state->spritemap[(map_index + (i << 1))] & tile_mask;
col = wgp_spritemap[(map_index + (i << 1) + 1)] &0xf; col = state->spritemap[(map_index + (i << 1) + 1)] & 0xf;
/* not known what controls priority */ /* not known what controls priority */
priority = (wgp_spritemap[(map_index + (i << 1) + 1)] &0x70) >> 4; priority = (state->spritemap[(map_index + (i << 1) + 1)] & 0x70) >> 4;
flipx = 0; // no flip xy? flipx = 0; // no flip xy?
flipy = 0; flipy = 0;
@ -487,25 +486,30 @@ if (((spriteram16[i + 4]!=0xf800) && (spriteram16[i + 4]!=0xfff6))
CUSTOM DRAW CUSTOM DRAW
*********************************************************/ *********************************************************/
INLINE void bryan2_drawscanline( INLINE void bryan2_drawscanline( bitmap_t *bitmap, int x, int y, int length,
bitmap_t *bitmap,int x,int y,int length,
const UINT16 *src, int transparent, UINT32 orient, bitmap_t *priority, int pri ) const UINT16 *src, int transparent, UINT32 orient, bitmap_t *priority, int pri )
{ {
UINT16 *dsti = BITMAP_ADDR16(bitmap, y, x); UINT16 *dsti = BITMAP_ADDR16(bitmap, y, x);
UINT8 *dstp = BITMAP_ADDR8(priority, y, x); UINT8 *dstp = BITMAP_ADDR8(priority, y, x);
if (transparent) { if (transparent)
while (length--) { {
while (length--)
{
UINT32 spixel = *src++; UINT32 spixel = *src++;
if (spixel<0x7fff) { if (spixel < 0x7fff)
{
*dsti = spixel; *dsti = spixel;
*dstp = pri; *dstp = pri;
} }
dsti++; dsti++;
dstp++; dstp++;
} }
} else { /* Not transparent case */ }
while (length--) { else /* Not transparent case */
{
while (length--)
{
*dsti++ = *src++; *dsti++ = *src++;
*dstp++ = pri; *dstp++ = pri;
} }
@ -516,8 +520,9 @@ INLINE void bryan2_drawscanline(
static void wgp_piv_layer_draw( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect, int layer, int flags, UINT32 priority ) static void wgp_piv_layer_draw( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect, int layer, int flags, UINT32 priority )
{ {
bitmap_t *srcbitmap = tilemap_get_pixmap(wgp_piv_tilemap[layer]); wgp_state *state = (wgp_state *)machine->driver_data;
bitmap_t *flagsbitmap = tilemap_get_flagsmap(wgp_piv_tilemap[layer]); bitmap_t *srcbitmap = tilemap_get_pixmap(state->piv_tilemap[layer]);
bitmap_t *flagsbitmap = tilemap_get_flagsmap(state->piv_tilemap[layer]);
UINT16 *dst16,*src16; UINT16 *dst16,*src16;
UINT8 *tsrc; UINT8 *tsrc;
@ -533,8 +538,7 @@ static void wgp_piv_layer_draw(running_machine *machine,bitmap_t *bitmap,const r
int flipscreen = 0; /* n/a */ int flipscreen = 0; /* n/a */
int machine_flip = 0; /* for ROT 180 ? */ int machine_flip = 0; /* for ROT 180 ? */
UINT16 screen_width = cliprect->max_x - UINT16 screen_width = cliprect->max_x - cliprect->min_x + 1;
cliprect->min_x + 1;
UINT16 min_y = cliprect->min_y; UINT16 min_y = cliprect->min_y;
UINT16 max_y = cliprect->max_y; UINT16 max_y = cliprect->max_y;
@ -550,15 +554,15 @@ static void wgp_piv_layer_draw(running_machine *machine,bitmap_t *bitmap,const r
In WGP2 see: road at big hill (default course) */ In WGP2 see: road at big hill (default course) */
/* This calculation may be wrong, the y_index one too */ /* This calculation may be wrong, the y_index one too */
zoomy = 0x10000 - (((wgp_piv_ctrlram[0x08 + layer] &0xff) - 0x7f) * 512); zoomy = 0x10000 - (((state->piv_ctrlram[0x08 + layer] & 0xff) - 0x7f) * 512);
if (!flipscreen) if (!flipscreen)
{ {
sx = ((wgp_piv_scrollx[layer]) << 16); sx = ((state->piv_scrollx[layer]) << 16);
sx += (wgp_piv_xoffs) * zoomx; /* may be imperfect */ sx += (state->piv_xoffs) * zoomx; /* may be imperfect */
y_index = (wgp_piv_scrolly[layer] << 16); y_index = (state->piv_scrolly[layer] << 16);
y_index += (wgp_piv_yoffs + min_y) * zoomy; /* may be imperfect */ y_index += (state->piv_yoffs + min_y) * zoomy; /* may be imperfect */
} }
else /* piv tiles flipscreen n/a */ else /* piv tiles flipscreen n/a */
{ {
@ -566,7 +570,10 @@ static void wgp_piv_layer_draw(running_machine *machine,bitmap_t *bitmap,const r
y_index = 0; y_index = 0;
} }
if (!machine_flip) y=min_y; else y=max_y; if (!machine_flip)
y = min_y;
else
y = max_y;
do do
{ {
@ -575,13 +582,13 @@ static void wgp_piv_layer_draw(running_machine *machine,bitmap_t *bitmap,const r
src_y_index = (y_index >> 16) & 0x3ff; src_y_index = (y_index >> 16) & 0x3ff;
row_index = src_y_index; row_index = src_y_index;
row_zoom = wgp_pivram[row_index + layer*0x400 + 0x3400] &0xff; row_zoom = state->pivram[row_index + layer * 0x400 + 0x3400] & 0xff;
row_colbank = wgp_pivram[row_index + layer*0x400 + 0x3400] >> 8; row_colbank = state->pivram[row_index + layer * 0x400 + 0x3400] >> 8;
a = (row_colbank & 0xe0); /* kill bit 4 */ a = (row_colbank & 0xe0); /* kill bit 4 */
row_colbank = (((row_colbank & 0xf) << 1) | a) << 4; row_colbank = (((row_colbank & 0xf) << 1) | a) << 4;
row_scroll = wgp_pivram[row_index + layer*0x1000 + 0x4000]; row_scroll = state->pivram[row_index + layer * 0x1000 + 0x4000];
a = (row_scroll & 0xffe0) >> 1; /* kill bit 4 */ a = (row_scroll & 0xffe0) >> 1; /* kill bit 4 */
row_scroll = ((row_scroll & 0xf) | a) & width_mask; row_scroll = ((row_scroll & 0xf) | a) & width_mask;
@ -639,7 +646,7 @@ static void wgp_piv_layer_draw(running_machine *machine,bitmap_t *bitmap,const r
VIDEO_UPDATE( wgp ) VIDEO_UPDATE( wgp )
{ {
const device_config *tc0100scn = devtag_get_device(screen->machine, "tc0100scn"); wgp_state *state = (wgp_state *)screen->machine->driver_data;
int i; int i;
UINT8 layer[3]; UINT8 layer[3];
@ -675,11 +682,11 @@ VIDEO_UPDATE( wgp )
for (i = 0; i < 3; i++) for (i = 0; i < 3; i++)
{ {
tilemap_set_scrollx(wgp_piv_tilemap[i], 0, wgp_piv_scrollx[i]); tilemap_set_scrollx(state->piv_tilemap[i], 0, state->piv_scrollx[i]);
tilemap_set_scrolly(wgp_piv_tilemap[i], 0, wgp_piv_scrolly[i]); tilemap_set_scrolly(state->piv_tilemap[i], 0, state->piv_scrolly[i]);
} }
tc0100scn_tilemap_update(tc0100scn); tc0100scn_tilemap_update(state->tc0100scn);
bitmap_fill(bitmap, cliprect, 0); bitmap_fill(bitmap, cliprect, 0);
@ -687,7 +694,7 @@ VIDEO_UPDATE( wgp )
layer[1] = 1; layer[1] = 1;
layer[2] = 2; layer[2] = 2;
if (wgp_piv_ctrl_reg == 0x2d) if (state->piv_ctrl_reg == 0x2d)
{ {
layer[1] = 2; layer[1] = 2;
layer[2] = 1; layer[2] = 1;
@ -713,23 +720,23 @@ VIDEO_UPDATE( wgp )
draw_sprites(screen->machine, bitmap, cliprect, 16); draw_sprites(screen->machine, bitmap, cliprect, 16);
/* ... then here we should apply rotation from wgp_sate_ctrl[] to the bitmap before we draw the TC0100SCN layers on it */ /* ... then here we should apply rotation from wgp_sate_ctrl[] to the bitmap before we draw the TC0100SCN layers on it */
layer[0] = tc0100scn_bottomlayer(tc0100scn); layer[0] = tc0100scn_bottomlayer(state->tc0100scn);
layer[1] = layer[0] ^ 1; layer[1] = layer[0] ^ 1;
layer[2] = 2; layer[2] = 2;
tc0100scn_tilemap_draw(tc0100scn, bitmap, cliprect, layer[0], 0, 0); tc0100scn_tilemap_draw(state->tc0100scn, bitmap, cliprect, layer[0], 0, 0);
#ifdef MAME_DEBUG #ifdef MAME_DEBUG
if (dislayer[3] == 0) if (dislayer[3] == 0)
#endif #endif
tc0100scn_tilemap_draw(tc0100scn, bitmap, cliprect, layer[1], 0, 0); tc0100scn_tilemap_draw(state->tc0100scn, bitmap, cliprect, layer[1], 0, 0);
tc0100scn_tilemap_draw(tc0100scn, bitmap, cliprect, layer[2], 0, 0); tc0100scn_tilemap_draw(state->tc0100scn, bitmap, cliprect, layer[2], 0, 0);
#if 0 #if 0
{ {
char buf[80]; char buf[80];
sprintf(buf,"wgp_piv_ctrl_reg: %04x y zoom: %04x %04x %04x",wgp_piv_ctrl_reg, sprintf(buf,"wgp_piv_ctrl_reg: %04x y zoom: %04x %04x %04x",state->piv_ctrl_reg,
wgp_piv_zoom[0],wgp_piv_zoom[1],wgp_piv_zoom[2]); state->piv_zoom[0],state->piv_zoom[1],state->piv_zoom[2]);
popmessage(buf); popmessage(buf);
} }
#endif #endif