Added save state support and driver data struct to m10.c, m14.c, m52.c, m57.c, m58.c, m62.c, m63.c and travrusa.c.

Merged some include files and merged audio/fghtbskt.c in drivers/m63.c.
This commit is contained in:
Fabio Priuli 2009-11-18 06:47:40 +00:00
parent 693024974e
commit d8588f632f
25 changed files with 1312 additions and 1044 deletions

7
.gitattributes vendored
View File

@ -1149,7 +1149,6 @@ src/mame/audio/dkong.c svneol=native#text/plain
src/mame/audio/dragrace.c svneol=native#text/plain src/mame/audio/dragrace.c svneol=native#text/plain
src/mame/audio/exidy.c svneol=native#text/plain src/mame/audio/exidy.c svneol=native#text/plain
src/mame/audio/exidy440.c svneol=native#text/plain src/mame/audio/exidy440.c svneol=native#text/plain
src/mame/audio/fghtbskt.c svneol=native#text/plain
src/mame/audio/firetrk.c svneol=native#text/plain src/mame/audio/firetrk.c svneol=native#text/plain
src/mame/audio/flower.c svneol=native#text/plain src/mame/audio/flower.c svneol=native#text/plain
src/mame/audio/galaga.c svneol=native#text/plain src/mame/audio/galaga.c svneol=native#text/plain
@ -1165,7 +1164,6 @@ src/mame/audio/harddriv.c svneol=native#text/plain
src/mame/audio/hitme.c svneol=native#text/plain src/mame/audio/hitme.c svneol=native#text/plain
src/mame/audio/invinco.c svneol=native#text/plain src/mame/audio/invinco.c svneol=native#text/plain
src/mame/audio/irem.c svneol=native#text/plain src/mame/audio/irem.c svneol=native#text/plain
src/mame/audio/irem.h svneol=native#text/plain
src/mame/audio/jaguar.c svneol=native#text/plain src/mame/audio/jaguar.c svneol=native#text/plain
src/mame/audio/jedi.c svneol=native#text/plain src/mame/audio/jedi.c svneol=native#text/plain
src/mame/audio/laserbat.c svneol=native#text/plain src/mame/audio/laserbat.c svneol=native#text/plain
@ -2422,6 +2420,7 @@ src/mame/includes/hyprduel.h svneol=native#text/plain
src/mame/includes/inufuku.h svneol=native#text/plain src/mame/includes/inufuku.h svneol=native#text/plain
src/mame/includes/iqblock.h svneol=native#text/plain src/mame/includes/iqblock.h svneol=native#text/plain
src/mame/includes/iremipt.h svneol=native#text/plain src/mame/includes/iremipt.h svneol=native#text/plain
src/mame/includes/iremz80.h svneol=native#text/plain
src/mame/includes/irobot.h svneol=native#text/plain src/mame/includes/irobot.h svneol=native#text/plain
src/mame/includes/itech32.h svneol=native#text/plain src/mame/includes/itech32.h svneol=native#text/plain
src/mame/includes/itech8.h svneol=native#text/plain src/mame/includes/itech8.h svneol=native#text/plain
@ -2449,10 +2448,6 @@ src/mame/includes/lsasquad.h svneol=native#text/plain
src/mame/includes/lwings.h svneol=native#text/plain src/mame/includes/lwings.h svneol=native#text/plain
src/mame/includes/m10.h svneol=native#text/plain src/mame/includes/m10.h svneol=native#text/plain
src/mame/includes/m107.h svneol=native#text/plain src/mame/includes/m107.h svneol=native#text/plain
src/mame/includes/m52.h svneol=native#text/plain
src/mame/includes/m57.h svneol=native#text/plain
src/mame/includes/m58.h svneol=native#text/plain
src/mame/includes/m62.h svneol=native#text/plain
src/mame/includes/m72.h svneol=native#text/plain src/mame/includes/m72.h svneol=native#text/plain
src/mame/includes/m79amb.h svneol=native#text/plain src/mame/includes/m79amb.h svneol=native#text/plain
src/mame/includes/m92.h svneol=native#text/plain src/mame/includes/m92.h svneol=native#text/plain

View File

@ -1,31 +0,0 @@
/*
Fighting Basketball PCM unsigned 8 bit mono samples
*/
#include "driver.h"
#include "sound/samples.h"
static INT16 *samplebuf;
WRITE8_HANDLER( fghtbskt_samples_w )
{
if( data & 1 )
{
const device_config *samples = devtag_get_device(space->machine, "samples");
sample_start_raw(samples, 0, samplebuf + ((data & 0xf0) << 8), 0x2000, 8000, 0);
}
}
SAMPLES_START( fghtbskt_sh_start )
{
running_machine *machine = device->machine;
int i, len = memory_region_length(machine, "samples");
UINT8 *ROM = memory_region(machine, "samples");
samplebuf = auto_alloc_array(machine, INT16, len);
for(i=0;i<len;i++)
samplebuf[i] = ((INT8)(ROM[i] ^ 0x80)) * 256;
}

View File

@ -10,8 +10,7 @@
#include "sound/ay8910.h" #include "sound/ay8910.h"
#include "sound/msm5205.h" #include "sound/msm5205.h"
#include "sound/discrete.h" #include "sound/discrete.h"
#include "includes/iremz80.h"
static UINT8 port1, port2;
/************************************* /*************************************
@ -22,8 +21,15 @@ static UINT8 port1, port2;
static SOUND_START( irem_audio ) static SOUND_START( irem_audio )
{ {
state_save_register_global(machine, port1); irem_z80_state *state = (irem_z80_state *)machine->driver_data;
state_save_register_global(machine, port2);
state->adpcm1 = devtag_get_device(machine, "msm1");
state->adpcm2 = devtag_get_device(machine, "msm2");
state->ay1 = devtag_get_device(machine, "ay1");
state->ay2 = devtag_get_device(machine, "ay2");
state_save_register_global(machine, state->port1);
state_save_register_global(machine, state->port2);
} }
@ -53,37 +59,38 @@ WRITE8_HANDLER( irem_sound_cmd_w )
static WRITE8_HANDLER( m6803_port1_w ) static WRITE8_HANDLER( m6803_port1_w )
{ {
port1 = data; irem_z80_state *state = (irem_z80_state *)space->machine->driver_data;
state->port1 = data;
} }
static WRITE8_HANDLER( m6803_port2_w ) static WRITE8_HANDLER( m6803_port2_w )
{ {
/* write latch */ irem_z80_state *state = (irem_z80_state *)space->machine->driver_data;
if ((port2 & 0x01) && !(data & 0x01))
{
const device_config *ay1 = devtag_get_device(space->machine, "ay1");
const device_config *ay2 = devtag_get_device(space->machine, "ay2");
/* write latch */
if ((state->port2 & 0x01) && !(data & 0x01))
{
/* control or data port? */ /* control or data port? */
if (port2 & 0x04) if (state->port2 & 0x04)
{ {
/* PSG 0 or 1? */ /* PSG 0 or 1? */
if (port2 & 0x08) if (state->port2 & 0x08)
ay8910_address_w(ay1, 0, port1); ay8910_address_w(state->ay1, 0, state->port1);
if (port2 & 0x10) if (state->port2 & 0x10)
ay8910_address_w(ay2, 0, port1); ay8910_address_w(state->ay2, 0, state->port1);
} }
else else
{ {
/* PSG 0 or 1? */ /* PSG 0 or 1? */
if (port2 & 0x08) if (state->port2 & 0x08)
ay8910_data_w(ay1, 0, port1); ay8910_data_w(state->ay1, 0, state->port1);
if (port2 & 0x10) if (state->port2 & 0x10)
ay8910_data_w(ay2, 0, port1); ay8910_data_w(state->ay2, 0, state->port1);
} }
} }
port2 = data; state->port2 = data;
} }
@ -96,11 +103,13 @@ static WRITE8_HANDLER( m6803_port2_w )
static READ8_HANDLER( m6803_port1_r ) static READ8_HANDLER( m6803_port1_r )
{ {
irem_z80_state *state = (irem_z80_state *)space->machine->driver_data;
/* PSG 0 or 1? */ /* PSG 0 or 1? */
if (port2 & 0x08) if (state->port2 & 0x08)
return ay8910_r(devtag_get_device(space->machine, "ay1"), 0); return ay8910_r(state->ay1, 0);
if (port2 & 0x10) if (state->port2 & 0x10)
return ay8910_r(devtag_get_device(space->machine, "ay2"), 0); return ay8910_r(state->ay2, 0);
return 0xff; return 0xff;
} }
@ -120,18 +129,17 @@ static READ8_HANDLER( m6803_port2_r )
static WRITE8_DEVICE_HANDLER( ay8910_0_portb_w ) static WRITE8_DEVICE_HANDLER( ay8910_0_portb_w )
{ {
const device_config *adpcm0 = devtag_get_device(device->machine, "msm1"); irem_z80_state *state = (irem_z80_state *)device->machine->driver_data;
const device_config *adpcm1 = devtag_get_device(device->machine, "msm2");
/* bits 2-4 select MSM5205 clock & 3b/4b playback mode */ /* bits 2-4 select MSM5205 clock & 3b/4b playback mode */
msm5205_playmode_w(adpcm0, (data >> 2) & 7); msm5205_playmode_w(state->adpcm1, (data >> 2) & 7);
if (adpcm1 != NULL) if (state->adpcm2 != NULL)
msm5205_playmode_w(adpcm1, ((data >> 2) & 4) | 3); /* always in slave mode */ msm5205_playmode_w(state->adpcm2, ((data >> 2) & 4) | 3); /* always in slave mode */
/* bits 0 and 1 reset the two chips */ /* bits 0 and 1 reset the two chips */
msm5205_reset_w(adpcm0, data & 1); msm5205_reset_w(state->adpcm1, data & 1);
if (adpcm1 != NULL) if (state->adpcm2 != NULL)
msm5205_reset_w(adpcm1, data & 2); msm5205_reset_w(state->adpcm2, data & 2);
} }
@ -158,23 +166,25 @@ static WRITE8_HANDLER( sound_irq_ack_w )
static WRITE8_HANDLER( m52_adpcm_w ) static WRITE8_HANDLER( m52_adpcm_w )
{ {
irem_z80_state *state = (irem_z80_state *)space->machine->driver_data;
if (offset & 1) if (offset & 1)
{ {
const device_config *adpcm = devtag_get_device(space->machine, "msm1"); msm5205_data_w(state->adpcm1, data);
msm5205_data_w(adpcm, data);
} }
if (offset & 2) if (offset & 2)
{ {
const device_config *adpcm = devtag_get_device(space->machine, "msm2"); if (state->adpcm2 != NULL)
if (adpcm != NULL) msm5205_data_w(state->adpcm2, data);
msm5205_data_w(adpcm, data);
} }
} }
static WRITE8_HANDLER( m62_adpcm_w ) static WRITE8_HANDLER( m62_adpcm_w )
{ {
const device_config *adpcm = devtag_get_device(space->machine, (offset & 1) ? "msm2" : "msm1"); irem_z80_state *state = (irem_z80_state *)space->machine->driver_data;
const device_config *adpcm = (offset & 1) ? state->adpcm2 : state->adpcm1;
if (adpcm != NULL) if (adpcm != NULL)
msm5205_data_w(adpcm, data); msm5205_data_w(adpcm, data);
} }
@ -189,15 +199,15 @@ static WRITE8_HANDLER( m62_adpcm_w )
static void adpcm_int(const device_config *device) static void adpcm_int(const device_config *device)
{ {
const device_config *msm2 = devtag_get_device(device->machine, "msm2"); irem_z80_state *state = (irem_z80_state *)device->machine->driver_data;
cputag_set_input_line(device->machine, "iremsound", INPUT_LINE_NMI, PULSE_LINE); cputag_set_input_line(device->machine, "iremsound", INPUT_LINE_NMI, PULSE_LINE);
/* the first MSM5205 clocks the second */ /* the first MSM5205 clocks the second */
if (msm2 != NULL) if (state->adpcm2 != NULL)
{ {
msm5205_vclk_w(msm2, 1); msm5205_vclk_w(state->adpcm2, 1);
msm5205_vclk_w(msm2, 0); msm5205_vclk_w(state->adpcm2, 0);
} }
} }

View File

@ -1,11 +0,0 @@
/***************************************************************************
Irem audio interface
****************************************************************************/
MACHINE_DRIVER_EXTERN( m52_sound_c_audio );
MACHINE_DRIVER_EXTERN( m52_large_audio );
MACHINE_DRIVER_EXTERN( m62_audio );
WRITE8_HANDLER( irem_sound_cmd_w );

View File

@ -136,10 +136,12 @@ static WRITE8_DEVICE_HANDLER(ic8j1_output_changed)
static WRITE8_DEVICE_HANDLER( ic8j2_output_changed ) static WRITE8_DEVICE_HANDLER( ic8j2_output_changed )
{ {
m10_state *state = (m10_state *)device->machine->driver_data;
/* written from /Q to A with slight delight */ /* written from /Q to A with slight delight */
LOG(("ic8j2: %d\n", data)); LOG(("ic8j2: %d\n", data));
ttl74123_a_w(device, 0, data); ttl74123_a_w(device, 0, data);
ttl74123_a_w(devtag_get_device(device->machine, "ic8j1"), 0, data); ttl74123_a_w(state->ic8j1, 0, data);
} }
static const ttl74123_config ic8j1_intf = static const ttl74123_config ic8j1_intf =
@ -189,12 +191,26 @@ static PALETTE_INIT( m10 )
} }
} }
static MACHINE_RESET( irem ) static MACHINE_START( m10 )
{ {
m10_state *state = (m10_state *)machine->driver_data; m10_state *state = (m10_state *)machine->driver_data;
state->ic8j1 = devtag_get_device(machine, "ic8j1");
state->ic8j2 = devtag_get_device(machine, "ic8j2");
state->samples = devtag_get_device(machine, "samples");
state_save_register_global(machine, state->bottomline); state_save_register_global(machine, state->bottomline);
state_save_register_global(machine, state->flip); state_save_register_global(machine, state->flip);
state_save_register_global(machine, state->last);
}
static MACHINE_RESET( m10 )
{
m10_state *state = (m10_state *)machine->driver_data;
state->bottomline = 0;
state->flip = 0;
state->last = 0;
} }
/************************************* /*************************************
@ -224,7 +240,6 @@ static MACHINE_RESET( irem )
static WRITE8_HANDLER( m10_ctrl_w ) static WRITE8_HANDLER( m10_ctrl_w )
{ {
const device_config *samples = devtag_get_device(space->machine, "samples");
m10_state *state = (m10_state *)space->machine->driver_data; m10_state *state = (m10_state *)space->machine->driver_data;
#if DEBUG #if DEBUG
@ -249,27 +264,27 @@ static WRITE8_HANDLER( m10_ctrl_w )
break; break;
case 0x01: case 0x01:
/* MISSILE sound */ /* MISSILE sound */
sample_start(samples, 0, 0, 0); sample_start(state->samples, 0, 0, 0);
break; break;
case 0x02: case 0x02:
/* EXPLOSION sound */ /* EXPLOSION sound */
sample_start(samples, 1, 1, 0); sample_start(state->samples, 1, 1, 0);
break; break;
case 0x03: case 0x03:
/* INVADER HIT sound */ /* INVADER HIT sound */
sample_start(samples, 2, 2, 0); sample_start(state->samples, 2, 2, 0);
break; break;
case 0x04: case 0x04:
/* BONUS BASE sound */ /* BONUS BASE sound */
sample_start(samples, 3, 8, 0); sample_start(state->samples, 3, 8, 0);
break; break;
case 0x05: case 0x05:
/* FLEET MOVE sound */ /* FLEET MOVE sound */
sample_start(samples, 3, 3, 0); sample_start(state->samples, 3, 3, 0);
break; break;
case 0x06: case 0x06:
/* SAUCER HIT SOUND */ /* SAUCER HIT SOUND */
sample_start(samples, 2, 7, 0); sample_start(state->samples, 2, 7, 0);
break; break;
default: default:
popmessage("Unknown sound M10: %02x\n", data & 0x07); popmessage("Unknown sound M10: %02x\n", data & 0x07);
@ -277,9 +292,9 @@ static WRITE8_HANDLER( m10_ctrl_w )
} }
/* UFO SOUND */ /* UFO SOUND */
if (data & 0x08) if (data & 0x08)
sample_stop(samples, 4); sample_stop(state->samples, 4);
else else
sample_start(samples, 4, 9, 1); sample_start(state->samples, 4, 9, 1);
} }
@ -305,7 +320,7 @@ static WRITE8_HANDLER( m11_ctrl_w )
m10_state *state = (m10_state *)space->machine->driver_data; m10_state *state = (m10_state *)space->machine->driver_data;
#if DEBUG #if DEBUG
if (data & 0x4C) if (data & 0x4c)
popmessage("M11 ctrl: %02x",data); popmessage("M11 ctrl: %02x",data);
#endif #endif
@ -338,7 +353,7 @@ static WRITE8_HANDLER( m15_ctrl_w )
m10_state *state = (m10_state *)space->machine->driver_data; m10_state *state = (m10_state *)space->machine->driver_data;
#if DEBUG #if DEBUG
if (data & 0xF0) if (data & 0xf0)
popmessage("M15 ctrl: %02x",data); popmessage("M15 ctrl: %02x",data);
#endif #endif
if (input_port_read(space->machine, "CAB") & 0x01) if (input_port_read(space->machine, "CAB") & 0x01)
@ -364,52 +379,51 @@ static WRITE8_HANDLER( m15_ctrl_w )
static WRITE8_HANDLER( m10_a500_w ) static WRITE8_HANDLER( m10_a500_w )
{ {
#if DEBUG #if DEBUG
if (data & 0xFC) if (data & 0xfc)
popmessage("a500: %02x",data); popmessage("a500: %02x",data);
#endif #endif
} }
static WRITE8_HANDLER( m11_a100_w ) static WRITE8_HANDLER( m11_a100_w )
{ {
static int last = 0x00; m10_state *state = (m10_state *)space->machine->driver_data;
const device_config *samples = devtag_get_device(space->machine, "samples"); int raising_bits = data & ~state->last;
int raising_bits = data & ~last; //int falling_bits = ~data & state->last;
//int falling_bits = ~data & last;
// should a falling bit stop a sample? // should a falling bit stop a sample?
// This port is written to about 20x per vblank // This port is written to about 20x per vblank
#if DEBUG #if DEBUG
if ((last & 0xE8) != (data & 0xE8)) if ((state->last & 0xe8) != (data & 0xe8))
popmessage("A100: %02x\n", data); popmessage("A100: %02x\n", data);
#endif #endif
last = data; state->last = data;
// audio control! // audio control!
/* MISSILE sound */ /* MISSILE sound */
if (raising_bits & 0x01) if (raising_bits & 0x01)
sample_start(samples, 0, 0, 0); sample_start(state->samples, 0, 0, 0);
/* EXPLOSION sound */ /* EXPLOSION sound */
if (raising_bits & 0x02) if (raising_bits & 0x02)
sample_start(samples, 1, 1, 0); sample_start(state->samples, 1, 1, 0);
/* Rapidly falling parachute */ /* Rapidly falling parachute */
if (raising_bits & 0x04) if (raising_bits & 0x04)
sample_start(samples, 3, 8, 0); sample_start(state->samples, 3, 8, 0);
/* Background sound ? */ /* Background sound ? */
if (data & 0x10) if (data & 0x10)
sample_start(samples, 4, 9, 1); sample_start(state->samples, 4, 9, 1);
else else
sample_stop(samples, 4); sample_stop(state->samples, 4);
} }
static WRITE8_HANDLER( m15_a100_w ) static WRITE8_HANDLER( m15_a100_w )
{ {
static int last = 0x00; m10_state *state = (m10_state *)space->machine->driver_data;
const device_config *samples = devtag_get_device(space->machine, "samples"); //int raising_bits = data & ~state->last;
//int raising_bits = data & ~last; int falling_bits = ~data & state->last;
int falling_bits = ~data & last;
// should a falling bit stop a sample? // should a falling bit stop a sample?
// Bit 4 is used // Bit 4 is used
@ -425,60 +439,62 @@ static WRITE8_HANDLER( m15_a100_w )
// 0x40: dot // 0x40: dot
#if DEBUG #if DEBUG
if ((last & 0x82) != (data & 0x82)) if ((state->last & 0x82) != (data & 0x82))
popmessage("A100: %02x\n", data); popmessage("A100: %02x\n", data);
#endif #endif
/* DOT sound */ /* DOT sound */
if (falling_bits & 0x40) if (falling_bits & 0x40)
sample_start(samples, 0, 0, 0); sample_start(state->samples, 0, 0, 0);
#if 0 #if 0
if (raising_bits & 0x40) if (raising_bits & 0x40)
sample_stop(samples, 0); sample_stop(state->samples, 0);
#endif #endif
/* EXPLOSION sound */ /* EXPLOSION sound */
if (falling_bits & 0x08) if (falling_bits & 0x08)
sample_start(samples, 1, 1, 0); sample_start(state->samples, 1, 1, 0);
#if 0 #if 0
if (raising_bits & 0x08) if (raising_bits & 0x08)
sample_stop(samples, 1); sample_stop(state->samples, 1);
#endif #endif
/* player changes lane */ /* player changes lane */
if (falling_bits & 0x10) if (falling_bits & 0x10)
sample_start(samples, 3, 3, 0); sample_start(state->samples, 3, 3, 0);
#if 0 #if 0
if (raising_bits & 0x10) if (raising_bits & 0x10)
sample_stop(samples, 3); sample_stop(state->samples, 3);
#endif #endif
/* computer car changes lane */ /* computer car changes lane */
if (falling_bits & 0x20) if (falling_bits & 0x20)
sample_start(samples, 4, 4, 0); sample_start(state->samples, 4, 4, 0);
#if 0 #if 0
if (raising_bits & 0x20) if (raising_bits & 0x20)
sample_stop(samples, 4); sample_stop(state->samples, 4);
#endif #endif
last = data; state->last = data;
} }
static READ8_HANDLER( m10_a700_r ) static READ8_HANDLER( m10_a700_r )
{ {
m10_state *state = (m10_state *)space->machine->driver_data;
//LOG(("rd:%d\n",video_screen_get_vpos(space->machine->primary_screen))); //LOG(("rd:%d\n",video_screen_get_vpos(space->machine->primary_screen)));
LOG(("clear\n")); LOG(("clear\n"));
ttl74123_clear_w(devtag_get_device(space->machine, "ic8j1"), 0, 0); ttl74123_clear_w(state->ic8j1, 0, 0);
ttl74123_clear_w(devtag_get_device(space->machine, "ic8j1"), 0, 1); ttl74123_clear_w(state->ic8j1, 0, 1);
return 0x00; return 0x00;
} }
static READ8_HANDLER( m11_a700_r ) static READ8_HANDLER( m11_a700_r )
{ {
m10_state *state = (m10_state *)space->machine->driver_data;
//LOG(("rd:%d\n",video_screen_get_vpos(space->machine->primary_screen))); //LOG(("rd:%d\n",video_screen_get_vpos(space->machine->primary_screen)));
//cputag_set_input_line(space->machine, "maincpu", 0, CLEAR_LINE); //cputag_set_input_line(space->machine, "maincpu", 0, CLEAR_LINE);
LOG(("clear\n")); LOG(("clear\n"));
ttl74123_clear_w(devtag_get_device(space->machine, "ic8j1"), 0, 0); ttl74123_clear_w(state->ic8j1, 0, 0);
ttl74123_clear_w(devtag_get_device(space->machine, "ic8j1"), 0, 1); ttl74123_clear_w(state->ic8j1, 0, 1);
return 0x00; return 0x00;
} }
@ -540,8 +556,8 @@ static INTERRUPT_GEN( m15_interrupt )
static ADDRESS_MAP_START( m10_main, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( m10_main, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x02ff) AM_RAM AM_BASE_MEMBER(m10_state, memory) /* scratch ram */ AM_RANGE(0x0000, 0x02ff) AM_RAM AM_BASE_MEMBER(m10_state, memory) /* scratch ram */
AM_RANGE(0x1000, 0x2fff) AM_READ(SMH_ROM) AM_BASE_MEMBER(m10_state, rom) AM_RANGE(0x1000, 0x2fff) AM_READ(SMH_ROM) AM_BASE_MEMBER(m10_state, rom)
AM_RANGE(0x4000, 0x43ff) AM_RAM AM_BASE(&videoram) AM_SIZE(&videoram_size) AM_RANGE(0x4000, 0x43ff) AM_RAM AM_BASE_MEMBER(m10_state, videoram) AM_SIZE(&videoram_size)
AM_RANGE(0x4800, 0x4bff) AM_RAM_WRITE(m10_colorram_w) AM_BASE(&colorram) /* foreground colour */ AM_RANGE(0x4800, 0x4bff) AM_RAM_WRITE(m10_colorram_w) AM_BASE_MEMBER(m10_state, colorram) /* foreground colour */
AM_RANGE(0x5000, 0x53ff) AM_RAM_WRITE(m10_chargen_w) AM_BASE_MEMBER(m10_state, chargen) /* background ????? */ AM_RANGE(0x5000, 0x53ff) AM_RAM_WRITE(m10_chargen_w) AM_BASE_MEMBER(m10_state, chargen) /* background ????? */
AM_RANGE(0xa200, 0xa200) AM_READ_PORT("DSW") AM_RANGE(0xa200, 0xa200) AM_READ_PORT("DSW")
AM_RANGE(0xa300, 0xa300) AM_READ_PORT("INPUTS") AM_RANGE(0xa300, 0xa300) AM_READ_PORT("INPUTS")
@ -554,8 +570,8 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( m11_main, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( m11_main, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x02ff) AM_RAM AM_BASE_MEMBER(m10_state, memory) /* scratch ram */ AM_RANGE(0x0000, 0x02ff) AM_RAM AM_BASE_MEMBER(m10_state, memory) /* scratch ram */
AM_RANGE(0x1000, 0x2fff) AM_READ(SMH_ROM) AM_BASE_MEMBER(m10_state, rom) AM_RANGE(0x1000, 0x2fff) AM_READ(SMH_ROM) AM_BASE_MEMBER(m10_state, rom)
AM_RANGE(0x4000, 0x43ff) AM_RAM AM_BASE(&videoram) AM_SIZE(&videoram_size) AM_RANGE(0x4000, 0x43ff) AM_RAM AM_BASE_MEMBER(m10_state, videoram) AM_SIZE(&videoram_size)
AM_RANGE(0x4800, 0x4bff) AM_RAM_WRITE(m10_colorram_w) AM_BASE(&colorram) /* foreground colour */ AM_RANGE(0x4800, 0x4bff) AM_RAM_WRITE(m10_colorram_w) AM_BASE_MEMBER(m10_state, colorram) /* foreground colour */
AM_RANGE(0x5000, 0x53ff) AM_RAM AM_BASE_MEMBER(m10_state, chargen) /* background ????? */ AM_RANGE(0x5000, 0x53ff) AM_RAM AM_BASE_MEMBER(m10_state, chargen) /* background ????? */
AM_RANGE(0xa100, 0xa100) AM_WRITE(m11_a100_w) /* sound writes ???? */ AM_RANGE(0xa100, 0xa100) AM_WRITE(m11_a100_w) /* sound writes ???? */
AM_RANGE(0xa200, 0xa200) AM_READ_PORT("DSW") AM_RANGE(0xa200, 0xa200) AM_READ_PORT("DSW")
@ -568,8 +584,8 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( m15_main, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( m15_main, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x02ff) AM_RAM AM_BASE_MEMBER(m10_state, memory) /* scratch ram */ AM_RANGE(0x0000, 0x02ff) AM_RAM AM_BASE_MEMBER(m10_state, memory) /* scratch ram */
AM_RANGE(0x1000, 0x33ff) AM_READ(SMH_ROM) AM_BASE_MEMBER(m10_state, rom) AM_RANGE(0x1000, 0x33ff) AM_READ(SMH_ROM) AM_BASE_MEMBER(m10_state, rom)
AM_RANGE(0x4000, 0x43ff) AM_RAM AM_BASE(&videoram) AM_SIZE(&videoram_size) AM_RANGE(0x4000, 0x43ff) AM_RAM AM_BASE_MEMBER(m10_state, videoram) AM_SIZE(&videoram_size)
AM_RANGE(0x4800, 0x4bff) AM_RAM_WRITE(m10_colorram_w) AM_BASE(&colorram) /* foreground colour */ AM_RANGE(0x4800, 0x4bff) AM_RAM_WRITE(m10_colorram_w) AM_BASE_MEMBER(m10_state, colorram) /* foreground colour */
AM_RANGE(0x5000, 0x57ff) AM_RAM_WRITE(m15_chargen_w) AM_BASE_MEMBER(m10_state, chargen) /* background ????? */ AM_RANGE(0x5000, 0x57ff) AM_RAM_WRITE(m15_chargen_w) AM_BASE_MEMBER(m10_state, chargen) /* background ????? */
AM_RANGE(0xa000, 0xa000) AM_READ_PORT("P2") AM_RANGE(0xa000, 0xa000) AM_READ_PORT("P2")
AM_RANGE(0xa100, 0xa100) AM_WRITE(m15_a100_w) /* sound writes ???? */ AM_RANGE(0xa100, 0xa100) AM_WRITE(m15_a100_w) /* sound writes ???? */
@ -821,7 +837,8 @@ static MACHINE_DRIVER_START( m10 )
MDRV_CPU_ADD("maincpu", M6502,IREMM10_CPU_CLOCK) MDRV_CPU_ADD("maincpu", M6502,IREMM10_CPU_CLOCK)
MDRV_CPU_PROGRAM_MAP(m10_main) MDRV_CPU_PROGRAM_MAP(m10_main)
MDRV_MACHINE_RESET(irem) MDRV_MACHINE_START(m10)
MDRV_MACHINE_RESET(m10)
//MDRV_CPU_VBLANK_INT("screen", m10_interrupt) //MDRV_CPU_VBLANK_INT("screen", m10_interrupt)
@ -873,7 +890,8 @@ static MACHINE_DRIVER_START( m15 )
MDRV_CPU_ADD("maincpu", M6502,IREMM15_CPU_CLOCK) MDRV_CPU_ADD("maincpu", M6502,IREMM15_CPU_CLOCK)
MDRV_CPU_PROGRAM_MAP(m15_main) MDRV_CPU_PROGRAM_MAP(m15_main)
MDRV_MACHINE_RESET(irem) MDRV_MACHINE_START(m10)
MDRV_MACHINE_RESET(m10)
MDRV_CPU_VBLANK_INT("screen", m15_interrupt) MDRV_CPU_VBLANK_INT("screen", m15_interrupt)
@ -1039,10 +1057,10 @@ ROM_START( greenber )
ROM_LOAD( "gb9", 0x3000, 0x0400, CRC(c27b9ba3) SHA1(a2f4f0c4b61eb03bba13ae5d25dc01009a4f86ee) ) // ok ? ROM_LOAD( "gb9", 0x3000, 0x0400, CRC(c27b9ba3) SHA1(a2f4f0c4b61eb03bba13ae5d25dc01009a4f86ee) ) // ok ?
ROM_END ROM_END
GAME( 1979, andromed, 0, m11, skychut, andromed, ROT270, "Irem", "Andromeda (Japan?)", GAME_NO_COCKTAIL | GAME_NO_SOUND | GAME_IMPERFECT_COLORS | GAME_NOT_WORKING ) GAME( 1979, andromed, 0, m11, skychut, andromed, ROT270, "Irem", "Andromeda (Japan?)", GAME_NO_COCKTAIL | GAME_NO_SOUND | GAME_IMPERFECT_COLORS | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE )
GAME( 1979, ipminvad, 0, m10, ipminvad, 0, ROT270, "Irem", "I P M Invader", GAME_IMPERFECT_SOUND | GAME_NO_COCKTAIL | GAME_IMPERFECT_COLORS ) GAME( 1979, ipminvad, 0, m10, ipminvad, 0, ROT270, "Irem", "I P M Invader", GAME_IMPERFECT_SOUND | GAME_NO_COCKTAIL | GAME_IMPERFECT_COLORS | GAME_SUPPORTS_SAVE )
GAME( 1979, ipminvad1, ipminvad, m10, ipminvad, ipminva1, ROT270, "Irem", "I P M Invader (Incomplete Dump)", GAME_IMPERFECT_SOUND | GAME_NOT_WORKING ) GAME( 1979, ipminvad1, ipminvad, m10, ipminvad, ipminva1, ROT270, "Irem", "I P M Invader (Incomplete Dump)", GAME_IMPERFECT_SOUND | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE )
GAME( 1980, skychut, 0, m11, skychut, 0, ROT270, "Irem", "Sky Chuter", GAME_NO_COCKTAIL | GAME_NO_SOUND | GAME_IMPERFECT_COLORS ) GAME( 1980, skychut, 0, m11, skychut, 0, ROT270, "Irem", "Sky Chuter", GAME_NO_COCKTAIL | GAME_NO_SOUND | GAME_IMPERFECT_COLORS | GAME_SUPPORTS_SAVE )
GAME( 1979, spacbeam, 0, m15, spacbeam, 0, ROT270, "Irem", "Space Beam", GAME_NO_COCKTAIL | GAME_NO_SOUND | GAME_IMPERFECT_COLORS ) GAME( 1979, spacbeam, 0, m15, spacbeam, 0, ROT270, "Irem", "Space Beam", GAME_NO_COCKTAIL | GAME_NO_SOUND | GAME_IMPERFECT_COLORS | GAME_SUPPORTS_SAVE )
GAME( 1979, headoni, 0, headoni, headoni, 0, ROT270, "Irem", "Head On (Irem, M-15 Hardware)", GAME_NO_COCKTAIL | GAME_NO_SOUND | GAME_IMPERFECT_COLORS ) GAME( 1979, headoni, 0, headoni, headoni, 0, ROT270, "Irem", "Head On (Irem, M-15 Hardware)", GAME_NO_COCKTAIL | GAME_NO_SOUND | GAME_IMPERFECT_COLORS | GAME_SUPPORTS_SAVE )
GAME( 1980, greenber, 0, m15, spacbeam, 0, ROT270, "Irem", "Green Beret (Irem)", GAME_NO_COCKTAIL | GAME_NO_SOUND | GAME_IMPERFECT_COLORS | GAME_NOT_WORKING ) GAME( 1980, greenber, 0, m15, spacbeam, 0, ROT270, "Irem", "Green Beret (Irem)", GAME_NO_COCKTAIL | GAME_NO_SOUND | GAME_IMPERFECT_COLORS | GAME_NOT_WORKING | GAME_SUPPORTS_SAVE )

View File

@ -53,7 +53,19 @@ Dumped by Chackn
#include "driver.h" #include "driver.h"
#include "cpu/i8085/i8085.h" #include "cpu/i8085/i8085.h"
static tilemap *m14_tilemap;
typedef struct _m14_state m14_state;
struct _m14_state
{
/* video-related */
tilemap *m14_tilemap;
UINT8 * video_ram;
UINT8 * color_ram;
/* input-related */
UINT8 hop_mux;
};
/************************************* /*************************************
* *
@ -81,8 +93,10 @@ static PALETTE_INIT( m14 )
static TILE_GET_INFO( m14_get_tile_info ) static TILE_GET_INFO( m14_get_tile_info )
{ {
int code = videoram[tile_index]; m14_state *state = (m14_state *)machine->driver_data;
int color = colorram[tile_index] & 0xf;
int code = state->video_ram[tile_index];
int color = state->color_ram[tile_index] & 0x0f;
/* colorram & 0xf0 used but unknown purpose*/ /* colorram & 0xf0 used but unknown purpose*/
@ -95,26 +109,34 @@ static TILE_GET_INFO( m14_get_tile_info )
static VIDEO_START( m14 ) static VIDEO_START( m14 )
{ {
m14_tilemap = tilemap_create(machine, m14_get_tile_info,tilemap_scan_rows,8,8,32,32); m14_state *state = (m14_state *)machine->driver_data;
state->m14_tilemap = tilemap_create(machine, m14_get_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
} }
static VIDEO_UPDATE( m14 ) static VIDEO_UPDATE( m14 )
{ {
tilemap_draw(bitmap,cliprect,m14_tilemap,0,0); m14_state *state = (m14_state *)screen->machine->driver_data;
tilemap_draw(bitmap, cliprect, state->m14_tilemap, 0, 0);
return 0; return 0;
} }
static WRITE8_HANDLER( m14_vram_w ) static WRITE8_HANDLER( m14_vram_w )
{ {
videoram[offset] = data; m14_state *state = (m14_state *)space->machine->driver_data;
tilemap_mark_tile_dirty(m14_tilemap,offset);
state->video_ram[offset] = data;
tilemap_mark_tile_dirty(state->m14_tilemap, offset);
} }
static WRITE8_HANDLER( m14_cram_w ) static WRITE8_HANDLER( m14_cram_w )
{ {
colorram[offset] = data; m14_state *state = (m14_state *)space->machine->driver_data;
tilemap_mark_tile_dirty(m14_tilemap,offset);
state->color_ram[offset] = data;
tilemap_mark_tile_dirty(state->m14_tilemap, offset);
} }
/************************************* /*************************************
@ -123,8 +145,6 @@ static WRITE8_HANDLER( m14_cram_w )
* *
*************************************/ *************************************/
static UINT8 hop_mux;
static READ8_HANDLER( m14_rng_r ) static READ8_HANDLER( m14_rng_r )
{ {
/* graphic artifacts happens if this doesn't return random values. */ /* graphic artifacts happens if this doesn't return random values. */
@ -134,8 +154,15 @@ static READ8_HANDLER( m14_rng_r )
/* Here routes the hopper & the inputs */ /* Here routes the hopper & the inputs */
static READ8_HANDLER( input_buttons_r ) static READ8_HANDLER( input_buttons_r )
{ {
if(hop_mux) { hop_mux = 0; return 0; } //0x43 status bits m14_state *state = (m14_state *)space->machine->driver_data;
else { return input_port_read(space->machine, "IN0"); }
if (state->hop_mux)
{
state->hop_mux = 0;
return 0; //0x43 status bits
}
else
return input_port_read(space->machine, "IN0");
} }
#if 0 #if 0
@ -151,9 +178,11 @@ static WRITE8_HANDLER( test_w )
static WRITE8_HANDLER( hopper_w ) static WRITE8_HANDLER( hopper_w )
{ {
m14_state *state = (m14_state *)space->machine->driver_data;
/* ---- x--- coin out */ /* ---- x--- coin out */
/* ---- --x- hopper/input mux? */ /* ---- --x- hopper/input mux? */
hop_mux = data & 2; state->hop_mux = data & 2;
//popmessage("%02x",data); //popmessage("%02x",data);
} }
@ -166,8 +195,8 @@ static WRITE8_HANDLER( hopper_w )
static ADDRESS_MAP_START( m14_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( m14_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x1fff) AM_ROM AM_RANGE(0x0000, 0x1fff) AM_ROM
AM_RANGE(0x2000, 0x23ff) AM_RAM AM_RANGE(0x2000, 0x23ff) AM_RAM
AM_RANGE(0xe000, 0xe3ff) AM_RAM_WRITE(m14_vram_w) AM_BASE(&videoram) AM_RANGE(0xe000, 0xe3ff) AM_RAM_WRITE(m14_vram_w) AM_BASE_MEMBER(m14_state, video_ram)
AM_RANGE(0xe400, 0xe7ff) AM_RAM_WRITE(m14_cram_w) AM_BASE(&colorram) AM_RANGE(0xe400, 0xe7ff) AM_RAM_WRITE(m14_cram_w) AM_BASE_MEMBER(m14_state, color_ram)
ADDRESS_MAP_END ADDRESS_MAP_END
static ADDRESS_MAP_START( m14_io_map, ADDRESS_SPACE_IO, 8 ) static ADDRESS_MAP_START( m14_io_map, ADDRESS_SPACE_IO, 8 )
@ -275,14 +304,35 @@ static INTERRUPT_GEN( m14_irq )
cpu_set_input_line(device, I8085_RST75_LINE, CLEAR_LINE); cpu_set_input_line(device, I8085_RST75_LINE, CLEAR_LINE);
} }
static MACHINE_START( m14 )
{
m14_state *state = (m14_state *)machine->driver_data;
state_save_register_global(machine, state->hop_mux);
}
static MACHINE_RESET( m14 )
{
m14_state *state = (m14_state *)machine->driver_data;
state->hop_mux = 0;
}
static MACHINE_DRIVER_START( m14 ) static MACHINE_DRIVER_START( m14 )
/* driver data */
MDRV_DRIVER_DATA(m14_state)
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD("maincpu",8085A,6000000/2) //guess: 6 Mhz internally divided by 2 MDRV_CPU_ADD("maincpu",8085A,6000000/2) //guess: 6 Mhz internally divided by 2
MDRV_CPU_PROGRAM_MAP(m14_map) MDRV_CPU_PROGRAM_MAP(m14_map)
MDRV_CPU_IO_MAP(m14_io_map) MDRV_CPU_IO_MAP(m14_io_map)
MDRV_CPU_VBLANK_INT("screen",m14_irq) MDRV_CPU_VBLANK_INT("screen",m14_irq)
MDRV_MACHINE_START(m14)
MDRV_MACHINE_RESET(m14)
/* video hardware */ /* video hardware */
MDRV_SCREEN_ADD("screen", RASTER) MDRV_SCREEN_ADD("screen", RASTER)
MDRV_SCREEN_REFRESH_RATE(60) MDRV_SCREEN_REFRESH_RATE(60)
@ -328,4 +378,4 @@ ROM_START( ptrmj )
ROM_LOAD( "mgpa10.bin", 0x0400, 0x0400, CRC(e1a4ebdc) SHA1(d9df42424ede17f0634d8d0a56c0374a33c55333) ) ROM_LOAD( "mgpa10.bin", 0x0400, 0x0400, CRC(e1a4ebdc) SHA1(d9df42424ede17f0634d8d0a56c0374a33c55333) )
ROM_END ROM_END
GAME( 1979, ptrmj, 0, m14, m14, 0, ROT0, "Irem", "PT Reach Mahjong (Japan)", GAME_NO_SOUND ) GAME( 1979, ptrmj, 0, m14, m14, 0, ROT0, "Irem", "PT Reach Mahjong (Japan)", GAME_NO_SOUND | GAME_SUPPORTS_SAVE )

View File

@ -44,7 +44,7 @@
#include "driver.h" #include "driver.h"
#include "iremipt.h" #include "iremipt.h"
#include "m52.h" #include "includes/iremz80.h"
#include "audio/irem.h" #include "audio/irem.h"
#include "cpu/z80/z80.h" #include "cpu/z80/z80.h"
@ -60,10 +60,10 @@
static ADDRESS_MAP_START( main_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( main_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x3fff) AM_ROM AM_RANGE(0x0000, 0x3fff) AM_ROM
AM_RANGE(0x8000, 0x83ff) AM_RAM_WRITE(m52_videoram_w) AM_BASE(&videoram) AM_RANGE(0x8000, 0x83ff) AM_RAM_WRITE(m52_videoram_w) AM_BASE_MEMBER(irem_z80_state, videoram)
AM_RANGE(0x8400, 0x87ff) AM_RAM_WRITE(m52_colorram_w) AM_BASE(&colorram) AM_RANGE(0x8400, 0x87ff) AM_RAM_WRITE(m52_colorram_w) AM_BASE_MEMBER(irem_z80_state, colorram)
AM_RANGE(0x8800, 0x8800) AM_MIRROR(0x07ff) AM_READ(m52_protection_r) AM_RANGE(0x8800, 0x8800) AM_MIRROR(0x07ff) AM_READ(m52_protection_r)
AM_RANGE(0xc800, 0xcbff) AM_MIRROR(0x0400) AM_WRITE(SMH_RAM) AM_BASE(&spriteram) AM_SIZE(&spriteram_size) AM_RANGE(0xc800, 0xcbff) AM_MIRROR(0x0400) AM_WRITE(SMH_RAM) AM_BASE_MEMBER(irem_z80_state, spriteram) AM_SIZE(&spriteram_size)
AM_RANGE(0xd000, 0xd000) AM_MIRROR(0x07fc) AM_WRITE(irem_sound_cmd_w) AM_RANGE(0xd000, 0xd000) AM_MIRROR(0x07fc) AM_WRITE(irem_sound_cmd_w)
AM_RANGE(0xd001, 0xd001) AM_MIRROR(0x07fc) AM_WRITE(m52_flipscreen_w) /* + coin counters */ AM_RANGE(0xd001, 0xd001) AM_MIRROR(0x07fc) AM_WRITE(m52_flipscreen_w) /* + coin counters */
AM_RANGE(0xd000, 0xd000) AM_MIRROR(0x07f8) AM_READ_PORT("IN0") AM_RANGE(0xd000, 0xd000) AM_MIRROR(0x07f8) AM_READ_PORT("IN0")
@ -77,9 +77,9 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( alpha1v_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( alpha1v_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x6fff) AM_ROM AM_RANGE(0x0000, 0x6fff) AM_ROM
AM_RANGE(0x8000, 0x83ff) AM_RAM_WRITE(m52_videoram_w) AM_BASE(&videoram) AM_RANGE(0x8000, 0x83ff) AM_RAM_WRITE(m52_videoram_w) AM_BASE_MEMBER(irem_z80_state, videoram)
AM_RANGE(0x8400, 0x87ff) AM_RAM_WRITE(m52_colorram_w) AM_BASE(&colorram) AM_RANGE(0x8400, 0x87ff) AM_RAM_WRITE(m52_colorram_w) AM_BASE_MEMBER(irem_z80_state, colorram)
AM_RANGE(0xc800, 0xc9ff) AM_WRITE(SMH_RAM) AM_BASE(&spriteram) AM_SIZE(&spriteram_size) AM_SHARE(1) // bigger or mirrored? AM_RANGE(0xc800, 0xc9ff) AM_WRITE(SMH_RAM) AM_BASE_MEMBER(irem_z80_state, spriteram) AM_SIZE(&spriteram_size) AM_SHARE(1) // bigger or mirrored?
AM_RANGE(0xd000, 0xd000) AM_READ_PORT("IN0") AM_WRITE(irem_sound_cmd_w) AM_RANGE(0xd000, 0xd000) AM_READ_PORT("IN0") AM_WRITE(irem_sound_cmd_w)
AM_RANGE(0xd001, 0xd001) AM_READ_PORT("IN1") AM_WRITE(alpha1v_flipscreen_w) AM_RANGE(0xd001, 0xd001) AM_READ_PORT("IN1") AM_WRITE(alpha1v_flipscreen_w)
AM_RANGE(0xd002, 0xd002) AM_READ_PORT("IN2") AM_RANGE(0xd002, 0xd002) AM_READ_PORT("IN2")
@ -380,14 +380,30 @@ GFXDECODE_END
* *
*************************************/ *************************************/
static MACHINE_RESET( m52 )
{
irem_z80_state *state = (irem_z80_state *)machine->driver_data;
state->bg1xpos = 0;
state->bg1ypos = 0;
state->bg2xpos = 0;
state->bg2ypos = 0;
state->bgcontrol = 0;
}
static MACHINE_DRIVER_START( m52 ) static MACHINE_DRIVER_START( m52 )
/* driver data */
MDRV_DRIVER_DATA(irem_z80_state)
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD("maincpu", Z80, MASTER_CLOCK/6) MDRV_CPU_ADD("maincpu", Z80, MASTER_CLOCK/6)
MDRV_CPU_PROGRAM_MAP(main_map) MDRV_CPU_PROGRAM_MAP(main_map)
MDRV_CPU_IO_MAP(main_portmap) MDRV_CPU_IO_MAP(main_portmap)
MDRV_CPU_VBLANK_INT("screen", irq0_line_hold) MDRV_CPU_VBLANK_INT("screen", irq0_line_hold)
MDRV_MACHINE_RESET(m52)
/* video hardware */ /* video hardware */
MDRV_GFXDECODE(m52) MDRV_GFXDECODE(m52)
MDRV_PALETTE_LENGTH(128*4+16*4+3*4) MDRV_PALETTE_LENGTH(128*4+16*4+3*4)
@ -540,4 +556,4 @@ ROM_END
GAME( 1982, mpatrol, 0, m52, mpatrol, 0, ROT0, "Irem", "Moon Patrol", GAME_SUPPORTS_SAVE ) GAME( 1982, mpatrol, 0, m52, mpatrol, 0, ROT0, "Irem", "Moon Patrol", GAME_SUPPORTS_SAVE )
GAME( 1982, mpatrolw, mpatrol, m52, mpatrolw, 0, ROT0, "Irem (Williams license)", "Moon Patrol (Williams)", GAME_SUPPORTS_SAVE ) GAME( 1982, mpatrolw, mpatrol, m52, mpatrolw, 0, ROT0, "Irem (Williams license)", "Moon Patrol (Williams)", GAME_SUPPORTS_SAVE )
GAME( 1988, alpha1v, 0, alpha1v, alpha1v, 0, ROT0, "Vision Electronics", "Alpha One (Vision Electronics / Kyle Hodgetts)", GAME_NOT_WORKING|GAME_NO_SOUND ) GAME( 1988, alpha1v, 0, alpha1v, alpha1v, 0, ROT0, "Vision Electronics", "Alpha One (Vision Electronics / Kyle Hodgetts)", GAME_NOT_WORKING|GAME_NO_SOUND|GAME_SUPPORTS_SAVE )

View File

@ -36,7 +36,7 @@
Ribbon cable connector to M57-A-A PCB Ribbon cable connector to M57-A-A PCB
New Tropical Angel: New Tropical Angel:
Roms where found on an official IREM board with genuine IREM Tropical Angel Roms were found on an official IREM board with genuine IREM Tropical Angel
license seal and genuine IREM serial number sticker. license seal and genuine IREM serial number sticker.
The "new" roms have hand written labels, while those that match the current The "new" roms have hand written labels, while those that match the current
Tropical Angel set look to be factory labeled chips. Tropical Angel set look to be factory labeled chips.
@ -50,7 +50,7 @@
#include "driver.h" #include "driver.h"
#include "cpu/z80/z80.h" #include "cpu/z80/z80.h"
#include "iremipt.h" #include "iremipt.h"
#include "m57.h" #include "includes/iremz80.h"
#include "audio/irem.h" #include "audio/irem.h"
@ -66,9 +66,9 @@
static ADDRESS_MAP_START( main_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( main_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x0000, 0x7fff) AM_ROM
AM_RANGE(0x8000, 0x87ff) AM_RAM_WRITE(m57_videoram_w) AM_BASE(&videoram) AM_RANGE(0x8000, 0x87ff) AM_RAM_WRITE(m57_videoram_w) AM_BASE_MEMBER(irem_z80_state, videoram)
AM_RANGE(0x9000, 0x91ff) AM_RAM AM_BASE(&m57_scroll) AM_RANGE(0x9000, 0x91ff) AM_RAM AM_BASE_MEMBER(irem_z80_state, scrollram)
AM_RANGE(0xc820, 0xc8ff) AM_WRITE(SMH_RAM) AM_BASE(&spriteram) AM_SIZE(&spriteram_size) AM_RANGE(0xc820, 0xc8ff) AM_WRITE(SMH_RAM) AM_BASE_MEMBER(irem_z80_state, spriteram) AM_SIZE(&spriteram_size)
AM_RANGE(0xd000, 0xd000) AM_WRITE(irem_sound_cmd_w) AM_RANGE(0xd000, 0xd000) AM_WRITE(irem_sound_cmd_w)
AM_RANGE(0xd001, 0xd001) AM_WRITE(m57_flipscreen_w) /* + coin counters */ AM_RANGE(0xd001, 0xd001) AM_WRITE(m57_flipscreen_w) /* + coin counters */
AM_RANGE(0xd000, 0xd000) AM_READ_PORT("IN0") AM_RANGE(0xd000, 0xd000) AM_READ_PORT("IN0")
@ -225,6 +225,9 @@ GFXDECODE_END
static MACHINE_DRIVER_START( m57 ) static MACHINE_DRIVER_START( m57 )
/* driver data */
MDRV_DRIVER_DATA(irem_z80_state)
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD("maincpu", Z80, XTAL_18_432MHz/6) /* verified on pcb */ MDRV_CPU_ADD("maincpu", Z80, XTAL_18_432MHz/6) /* verified on pcb */
MDRV_CPU_PROGRAM_MAP(main_map) MDRV_CPU_PROGRAM_MAP(main_map)
@ -327,5 +330,5 @@ ROM_END
* *
*************************************/ *************************************/
GAME( 1983, troangel, 0, m57, troangel, 0, ROT0, "Irem", "Tropical Angel", 0 ) GAME( 1983, troangel, 0, m57, troangel, 0, ROT0, "Irem", "Tropical Angel", GAME_SUPPORTS_SAVE )
GAME( 1983, newtangl, troangel, m57, troangel, 0, ROT0, "Irem", "New Tropical Angel", 0 ) GAME( 1983, newtangl, troangel, m57, troangel, 0, ROT0, "Irem", "New Tropical Angel", GAME_SUPPORTS_SAVE )

View File

@ -12,7 +12,7 @@
#include "driver.h" #include "driver.h"
#include "cpu/z80/z80.h" #include "cpu/z80/z80.h"
#include "iremipt.h" #include "iremipt.h"
#include "m58.h" #include "includes/iremz80.h"
#include "audio/irem.h" #include "audio/irem.h"
#define MASTER_CLOCK XTAL_18_432MHz #define MASTER_CLOCK XTAL_18_432MHz
@ -26,13 +26,13 @@
static ADDRESS_MAP_START( yard_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( yard_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x5fff) AM_ROM AM_RANGE(0x0000, 0x5fff) AM_ROM
AM_RANGE(0x8000, 0x8fff) AM_RAM_WRITE(yard_videoram_w) AM_BASE(&videoram) AM_RANGE(0x8000, 0x8fff) AM_RAM_WRITE(yard_videoram_w) AM_BASE_MEMBER(irem_z80_state, videoram)
AM_RANGE(0x9000, 0x9fff) AM_WRITE(yard_scroll_panel_w) AM_RANGE(0x9000, 0x9fff) AM_WRITE(yard_scroll_panel_w)
AM_RANGE(0xc820, 0xc87f) AM_RAM AM_BASE(&spriteram) AM_SIZE(&spriteram_size) AM_RANGE(0xc820, 0xc87f) AM_RAM AM_BASE_MEMBER(irem_z80_state, spriteram) AM_SIZE(&spriteram_size)
AM_RANGE(0xa000, 0xa000) AM_RAM AM_BASE(&yard_scroll_x_low) AM_RANGE(0xa000, 0xa000) AM_RAM AM_BASE_MEMBER(irem_z80_state, yard_scroll_x_low)
AM_RANGE(0xa200, 0xa200) AM_RAM AM_BASE(&yard_scroll_x_high) AM_RANGE(0xa200, 0xa200) AM_RAM AM_BASE_MEMBER(irem_z80_state, yard_scroll_x_high)
AM_RANGE(0xa400, 0xa400) AM_RAM AM_BASE(&yard_scroll_y_low) AM_RANGE(0xa400, 0xa400) AM_RAM AM_BASE_MEMBER(irem_z80_state, yard_scroll_y_low)
AM_RANGE(0xa800, 0xa800) AM_RAM AM_BASE(&yard_score_panel_disabled) AM_RANGE(0xa800, 0xa800) AM_RAM AM_BASE_MEMBER(irem_z80_state, yard_score_panel_disabled)
AM_RANGE(0xd000, 0xd000) AM_WRITE(irem_sound_cmd_w) AM_RANGE(0xd000, 0xd000) AM_WRITE(irem_sound_cmd_w)
AM_RANGE(0xd001, 0xd001) AM_WRITE(yard_flipscreen_w) /* + coin counters */ AM_RANGE(0xd001, 0xd001) AM_WRITE(yard_flipscreen_w) /* + coin counters */
AM_RANGE(0xd000, 0xd000) AM_READ_PORT("IN0") AM_RANGE(0xd000, 0xd000) AM_READ_PORT("IN0")
@ -190,6 +190,9 @@ GFXDECODE_END
static MACHINE_DRIVER_START( yard ) static MACHINE_DRIVER_START( yard )
/* driver data */
MDRV_DRIVER_DATA(irem_z80_state)
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD("maincpu", Z80, MASTER_CLOCK/3/2) MDRV_CPU_ADD("maincpu", Z80, MASTER_CLOCK/3/2)
MDRV_CPU_PROGRAM_MAP(yard_map) MDRV_CPU_PROGRAM_MAP(yard_map)
@ -363,7 +366,7 @@ ROM_END
* *
*************************************/ *************************************/
GAME( 1983, 10yard, 0, yard, yard, 0, ROT0, "Irem", "10-Yard Fight (World)", 0 ) GAME( 1983, 10yard, 0, yard, yard, 0, ROT0, "Irem", "10-Yard Fight (World)", GAME_SUPPORTS_SAVE )
GAME( 1983, 10yardj, 10yard, yard, yard, 0, ROT0, "Irem", "10-Yard Fight (Japan)", 0 ) GAME( 1983, 10yardj, 10yard, yard, yard, 0, ROT0, "Irem", "10-Yard Fight (Japan)", GAME_SUPPORTS_SAVE )
GAME( 1984, vs10yard, 10yard, yard, vs10yard, 0, ROT0, "Irem", "Vs 10-Yard Fight (World, 11/05/84)", 0 ) GAME( 1984, vs10yard, 10yard, yard, vs10yard, 0, ROT0, "Irem", "Vs 10-Yard Fight (World, 11/05/84)", GAME_SUPPORTS_SAVE )
GAME( 1984, vs10yardj,10yard, yard, vs10yarj, 0, ROT0, "Irem", "Vs 10-Yard Fight (Japan)", 0 ) GAME( 1984, vs10yardj,10yard, yard, vs10yarj, 0, ROT0, "Irem", "Vs 10-Yard Fight (Japan)", GAME_SUPPORTS_SAVE )

View File

@ -69,7 +69,7 @@ other supported games as well.
#include "driver.h" #include "driver.h"
#include "cpu/z80/z80.h" #include "cpu/z80/z80.h"
#include "m62.h" #include "includes/iremz80.h"
#include "iremipt.h" #include "iremipt.h"
#include "audio/irem.h" #include "audio/irem.h"
@ -81,16 +81,16 @@ other supported games as well.
/* Since the data written to 0x80 is always the level number, I just use */ /* Since the data written to 0x80 is always the level number, I just use */
/* that to select the ROM. The only exception I make is a special case used in */ /* that to select the ROM. The only exception I make is a special case used in */
/* service mode to test the ROMs. */ /* service mode to test the ROMs. */
static int ldrun2_bankswap;
static READ8_HANDLER( ldrun2_bankswitch_r ) static READ8_HANDLER( ldrun2_bankswitch_r )
{ {
if (ldrun2_bankswap) irem_z80_state *state = (irem_z80_state *)space->machine->driver_data;
if (state->ldrun2_bankswap)
{ {
ldrun2_bankswap--; state->ldrun2_bankswap--;
/* swap to bank #1 on second read */ /* swap to bank #1 on second read */
if (ldrun2_bankswap == 0) if (state->ldrun2_bankswap == 0)
memory_set_bank(space->machine, 1, 1); memory_set_bank(space->machine, 1, 1);
} }
return 0; return 0;
@ -98,7 +98,7 @@ static READ8_HANDLER( ldrun2_bankswitch_r )
static WRITE8_HANDLER( ldrun2_bankswitch_w ) static WRITE8_HANDLER( ldrun2_bankswitch_w )
{ {
static int bankcontrol[2]; irem_z80_state *state = (irem_z80_state *)space->machine->driver_data;
static const int banks[30] = static const int banks[30] =
{ {
0,0,0,0,0,1,0,1,0,0, 0,0,0,0,0,1,0,1,0,0,
@ -107,7 +107,8 @@ static WRITE8_HANDLER( ldrun2_bankswitch_w )
}; };
bankcontrol[offset] = data; state->bankcontrol[offset] = data;
if (offset == 0) if (offset == 0)
{ {
if (data < 1 || data > 30) if (data < 1 || data > 30)
@ -119,10 +120,11 @@ logerror("unknown bank select %02x\n",data);
} }
else else
{ {
if (bankcontrol[0] == 0x01 && data == 0x0d) if (state->bankcontrol[0] == 0x01 && data == 0x0d)
/* special case for service mode */ /* special case for service mode */
ldrun2_bankswap = 2; state->ldrun2_bankswap = 2;
else ldrun2_bankswap = 0; else
state->ldrun2_bankswap = 0;
} }
} }
@ -174,10 +176,10 @@ static ADDRESS_MAP_START( kungfum_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x0000, 0x7fff) AM_ROM
AM_RANGE(0xa000, 0xa000) AM_WRITE(m62_hscroll_low_w) AM_RANGE(0xa000, 0xa000) AM_WRITE(m62_hscroll_low_w)
AM_RANGE(0xb000, 0xb000) AM_WRITE(m62_hscroll_high_w) AM_RANGE(0xb000, 0xb000) AM_WRITE(m62_hscroll_high_w)
AM_RANGE(0xc000, 0xc0ff) AM_WRITEONLY AM_BASE(&spriteram) AM_SIZE(&spriteram_size) AM_RANGE(0xc000, 0xc0ff) AM_WRITEONLY AM_BASE_MEMBER(irem_z80_state, spriteram) AM_SIZE(&spriteram_size)
/* Kung Fu Master is the only game in this driver to have separated (but */ /* Kung Fu Master is the only game in this driver to have separated (but */
/* contiguous) videoram and colorram. They are interleaved in all the others. */ /* contiguous) videoram and colorram. They are interleaved in all the others. */
AM_RANGE(0xd000, 0xdfff) AM_RAM_WRITE(kungfum_tileram_w) AM_BASE(&m62_tileram) AM_RANGE(0xd000, 0xdfff) AM_RAM_WRITE(kungfum_tileram_w) AM_BASE_MEMBER(irem_z80_state, m62_tileram)
AM_RANGE(0xe000, 0xefff) AM_RAM AM_RANGE(0xe000, 0xefff) AM_RAM
ADDRESS_MAP_END ADDRESS_MAP_END
@ -193,9 +195,9 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( battroad_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( battroad_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x0000, 0x7fff) AM_ROM
AM_RANGE(0xa000, 0xbfff) AM_ROMBANK(1) AM_RANGE(0xa000, 0xbfff) AM_ROMBANK(1)
AM_RANGE(0xc000, 0xc0ff) AM_WRITEONLY AM_BASE(&spriteram) AM_SIZE(&spriteram_size) AM_RANGE(0xc000, 0xc0ff) AM_WRITEONLY AM_BASE_MEMBER(irem_z80_state, spriteram) AM_SIZE(&spriteram_size)
AM_RANGE(0xc800, 0xcfff) AM_RAM_WRITE(m62_textram_w) AM_BASE(&m62_textram) AM_RANGE(0xc800, 0xcfff) AM_RAM_WRITE(m62_textram_w) AM_BASE_MEMBER(irem_z80_state, m62_textram)
AM_RANGE(0xd000, 0xdfff) AM_RAM_WRITE(m62_tileram_w) AM_BASE(&m62_tileram) AM_RANGE(0xd000, 0xdfff) AM_RAM_WRITE(m62_tileram_w) AM_BASE_MEMBER(irem_z80_state, m62_tileram)
AM_RANGE(0xe000, 0xefff) AM_RAM AM_RANGE(0xe000, 0xefff) AM_RAM
ADDRESS_MAP_END ADDRESS_MAP_END
@ -214,16 +216,16 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( ldrun_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( ldrun_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x0000, 0x7fff) AM_ROM
AM_RANGE(0xc000, 0xc0ff) AM_WRITEONLY AM_BASE(&spriteram) AM_SIZE(&spriteram_size) AM_RANGE(0xc000, 0xc0ff) AM_WRITEONLY AM_BASE_MEMBER(irem_z80_state, spriteram) AM_SIZE(&spriteram_size)
AM_RANGE(0xd000, 0xdfff) AM_RAM_WRITE(m62_tileram_w) AM_BASE(&m62_tileram) AM_RANGE(0xd000, 0xdfff) AM_RAM_WRITE(m62_tileram_w) AM_BASE_MEMBER(irem_z80_state, m62_tileram)
AM_RANGE(0xe000, 0xefff) AM_RAM AM_RANGE(0xe000, 0xefff) AM_RAM
ADDRESS_MAP_END ADDRESS_MAP_END
static ADDRESS_MAP_START( ldrun2_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( ldrun2_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x0000, 0x7fff) AM_ROM
AM_RANGE(0x8000, 0x9fff) AM_ROMBANK(1) AM_RANGE(0x8000, 0x9fff) AM_ROMBANK(1)
AM_RANGE(0xc000, 0xc0ff) AM_WRITEONLY AM_BASE(&spriteram) AM_SIZE(&spriteram_size) AM_RANGE(0xc000, 0xc0ff) AM_WRITEONLY AM_BASE_MEMBER(irem_z80_state, spriteram) AM_SIZE(&spriteram_size)
AM_RANGE(0xd000, 0xdfff) AM_RAM_WRITE(m62_tileram_w) AM_BASE(&m62_tileram) AM_RANGE(0xd000, 0xdfff) AM_RAM_WRITE(m62_tileram_w) AM_BASE_MEMBER(irem_z80_state, m62_tileram)
AM_RANGE(0xe000, 0xefff) AM_RAM AM_RANGE(0xe000, 0xefff) AM_RAM
ADDRESS_MAP_END ADDRESS_MAP_END
@ -243,8 +245,8 @@ static ADDRESS_MAP_START( ldrun3_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0xc800, 0xc800) AM_READ(ldrun3_prot_5_r) AM_RANGE(0xc800, 0xc800) AM_READ(ldrun3_prot_5_r)
AM_RANGE(0xcc00, 0xcc00) AM_READ(ldrun3_prot_7_r) AM_RANGE(0xcc00, 0xcc00) AM_READ(ldrun3_prot_7_r)
AM_RANGE(0xcfff, 0xcfff) AM_READ(ldrun3_prot_7_r) AM_RANGE(0xcfff, 0xcfff) AM_READ(ldrun3_prot_7_r)
AM_RANGE(0xc000, 0xc0ff) AM_WRITEONLY AM_BASE(&spriteram) AM_SIZE(&spriteram_size) AM_RANGE(0xc000, 0xc0ff) AM_WRITEONLY AM_BASE_MEMBER(irem_z80_state, spriteram) AM_SIZE(&spriteram_size)
AM_RANGE(0xd000, 0xdfff) AM_RAM_WRITE(m62_tileram_w) AM_BASE(&m62_tileram) AM_RANGE(0xd000, 0xdfff) AM_RAM_WRITE(m62_tileram_w) AM_BASE_MEMBER(irem_z80_state, m62_tileram)
AM_RANGE(0xd000, 0xefff) AM_RAM AM_RANGE(0xd000, 0xefff) AM_RAM
ADDRESS_MAP_END ADDRESS_MAP_END
@ -262,9 +264,9 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( ldrun4_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( ldrun4_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x0000, 0x7fff) AM_ROM
AM_RANGE(0x8000, 0xbfff) AM_ROMBANK(1) AM_RANGE(0x8000, 0xbfff) AM_ROMBANK(1)
AM_RANGE(0xc000, 0xc0ff) AM_WRITEONLY AM_BASE(&spriteram) AM_SIZE(&spriteram_size) AM_RANGE(0xc000, 0xc0ff) AM_WRITEONLY AM_BASE_MEMBER(irem_z80_state, spriteram) AM_SIZE(&spriteram_size)
AM_RANGE(0xc800, 0xc800) AM_WRITE(ldrun4_bankswitch_w) AM_RANGE(0xc800, 0xc800) AM_WRITE(ldrun4_bankswitch_w)
AM_RANGE(0xd000, 0xdfff) AM_RAM_WRITE(m62_tileram_w) AM_BASE(&m62_tileram) AM_RANGE(0xd000, 0xdfff) AM_RAM_WRITE(m62_tileram_w) AM_BASE_MEMBER(irem_z80_state, m62_tileram)
AM_RANGE(0xe000, 0xefff) AM_RAM AM_RANGE(0xe000, 0xefff) AM_RAM
ADDRESS_MAP_END ADDRESS_MAP_END
@ -281,18 +283,18 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( lotlot_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( lotlot_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x0000, 0x7fff) AM_ROM
AM_RANGE(0xa000, 0xafff) AM_RAM_WRITE(m62_textram_w) AM_BASE(&m62_textram) AM_RANGE(0xa000, 0xafff) AM_RAM_WRITE(m62_textram_w) AM_BASE_MEMBER(irem_z80_state, m62_textram)
AM_RANGE(0xc000, 0xc0ff) AM_WRITEONLY AM_BASE(&spriteram) AM_SIZE(&spriteram_size) AM_RANGE(0xc000, 0xc0ff) AM_WRITEONLY AM_BASE_MEMBER(irem_z80_state, spriteram) AM_SIZE(&spriteram_size)
AM_RANGE(0xd000, 0xdfff) AM_RAM_WRITE(m62_tileram_w) AM_BASE(&m62_tileram) AM_RANGE(0xd000, 0xdfff) AM_RAM_WRITE(m62_tileram_w) AM_BASE_MEMBER(irem_z80_state, m62_tileram)
AM_RANGE(0xe000, 0xefff) AM_RAM AM_RANGE(0xe000, 0xefff) AM_RAM
ADDRESS_MAP_END ADDRESS_MAP_END
static ADDRESS_MAP_START( kidniki_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( kidniki_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x0000, 0x7fff) AM_ROM
AM_RANGE(0x8000, 0x9fff) AM_ROMBANK(1) AM_RANGE(0x8000, 0x9fff) AM_ROMBANK(1)
AM_RANGE(0xa000, 0xafff) AM_RAM_WRITE(m62_tileram_w) AM_BASE(&m62_tileram) AM_RANGE(0xa000, 0xafff) AM_RAM_WRITE(m62_tileram_w) AM_BASE_MEMBER(irem_z80_state, m62_tileram)
AM_RANGE(0xc000, 0xc0ff) AM_WRITEONLY AM_BASE(&spriteram) AM_SIZE(&spriteram_size) AM_RANGE(0xc000, 0xc0ff) AM_WRITEONLY AM_BASE_MEMBER(irem_z80_state, spriteram) AM_SIZE(&spriteram_size)
AM_RANGE(0xd000, 0xdfff) AM_RAM_WRITE(m62_textram_w) AM_BASE(&m62_textram) AM_RANGE(0xd000, 0xdfff) AM_RAM_WRITE(m62_textram_w) AM_BASE_MEMBER(irem_z80_state, m62_textram)
AM_RANGE(0xe000, 0xefff) AM_RAM AM_RANGE(0xe000, 0xefff) AM_RAM
ADDRESS_MAP_END ADDRESS_MAP_END
@ -314,9 +316,9 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( spelunkr_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( spelunkr_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x0000, 0x7fff) AM_ROM
AM_RANGE(0x8000, 0x9fff) AM_ROMBANK(1) AM_RANGE(0x8000, 0x9fff) AM_ROMBANK(1)
AM_RANGE(0xa000, 0xbfff) AM_RAM_WRITE(m62_tileram_w) AM_BASE(&m62_tileram) AM_RANGE(0xa000, 0xbfff) AM_RAM_WRITE(m62_tileram_w) AM_BASE_MEMBER(irem_z80_state, m62_tileram)
AM_RANGE(0xc000, 0xc0ff) AM_WRITEONLY AM_BASE(&spriteram) AM_SIZE(&spriteram_size) AM_RANGE(0xc000, 0xc0ff) AM_WRITEONLY AM_BASE_MEMBER(irem_z80_state, spriteram) AM_SIZE(&spriteram_size)
AM_RANGE(0xc800, 0xcfff) AM_RAM_WRITE(m62_textram_w) AM_BASE(&m62_textram) AM_RANGE(0xc800, 0xcfff) AM_RAM_WRITE(m62_textram_w) AM_BASE_MEMBER(irem_z80_state, m62_textram)
AM_RANGE(0xd000, 0xd000) AM_WRITE(m62_vscroll_low_w) AM_RANGE(0xd000, 0xd000) AM_WRITE(m62_vscroll_low_w)
AM_RANGE(0xd001, 0xd001) AM_WRITE(m62_vscroll_high_w) AM_RANGE(0xd001, 0xd001) AM_WRITE(m62_vscroll_high_w)
AM_RANGE(0xd002, 0xd002) AM_WRITE(m62_hscroll_low_w) AM_RANGE(0xd002, 0xd002) AM_WRITE(m62_hscroll_low_w)
@ -330,9 +332,9 @@ static ADDRESS_MAP_START( spelunk2_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x0000, 0x7fff) AM_ROM
AM_RANGE(0x8000, 0x8fff) AM_ROMBANK(1) AM_RANGE(0x8000, 0x8fff) AM_ROMBANK(1)
AM_RANGE(0x9000, 0x9fff) AM_ROMBANK(2) AM_RANGE(0x9000, 0x9fff) AM_ROMBANK(2)
AM_RANGE(0xa000, 0xbfff) AM_RAM_WRITE(m62_tileram_w) AM_BASE(&m62_tileram) AM_RANGE(0xa000, 0xbfff) AM_RAM_WRITE(m62_tileram_w) AM_BASE_MEMBER(irem_z80_state, m62_tileram)
AM_RANGE(0xc000, 0xc0ff) AM_WRITEONLY AM_BASE(&spriteram) AM_SIZE(&spriteram_size) AM_RANGE(0xc000, 0xc0ff) AM_WRITEONLY AM_BASE_MEMBER(irem_z80_state, spriteram) AM_SIZE(&spriteram_size)
AM_RANGE(0xc800, 0xcfff) AM_RAM_WRITE(m62_textram_w) AM_BASE(&m62_textram) AM_RANGE(0xc800, 0xcfff) AM_RAM_WRITE(m62_textram_w) AM_BASE_MEMBER(irem_z80_state, m62_textram)
AM_RANGE(0xd000, 0xd000) AM_WRITE(m62_vscroll_low_w) AM_RANGE(0xd000, 0xd000) AM_WRITE(m62_vscroll_low_w)
AM_RANGE(0xd001, 0xd001) AM_WRITE(m62_hscroll_low_w) AM_RANGE(0xd001, 0xd001) AM_WRITE(m62_hscroll_low_w)
AM_RANGE(0xd002, 0xd002) AM_WRITE(spelunk2_gfxport_w) AM_RANGE(0xd002, 0xd002) AM_WRITE(spelunk2_gfxport_w)
@ -343,9 +345,9 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( youjyudn_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( youjyudn_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x0000, 0x7fff) AM_ROM
AM_RANGE(0x8000, 0xbfff) AM_ROMBANK(1) AM_RANGE(0x8000, 0xbfff) AM_ROMBANK(1)
AM_RANGE(0xc000, 0xc0ff) AM_WRITEONLY AM_BASE(&spriteram) AM_SIZE(&spriteram_size) AM_RANGE(0xc000, 0xc0ff) AM_WRITEONLY AM_BASE_MEMBER(irem_z80_state, spriteram) AM_SIZE(&spriteram_size)
AM_RANGE(0xc800, 0xcfff) AM_RAM_WRITE(m62_textram_w) AM_BASE(&m62_textram) AM_RANGE(0xc800, 0xcfff) AM_RAM_WRITE(m62_textram_w) AM_BASE_MEMBER(irem_z80_state, m62_textram)
AM_RANGE(0xd000, 0xd7ff) AM_RAM_WRITE(m62_tileram_w) AM_BASE(&m62_tileram) AM_RANGE(0xd000, 0xd7ff) AM_RAM_WRITE(m62_tileram_w) AM_BASE_MEMBER(irem_z80_state, m62_tileram)
AM_RANGE(0xe000, 0xefff) AM_RAM AM_RANGE(0xe000, 0xefff) AM_RAM
ADDRESS_MAP_END ADDRESS_MAP_END
@ -363,9 +365,9 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( horizon_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( horizon_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0xbfff) AM_ROM AM_RANGE(0x0000, 0xbfff) AM_ROM
AM_RANGE(0xc000, 0xc1ff) AM_RAM AM_BASE(&spriteram) AM_SIZE(&spriteram_size) AM_RANGE(0xc000, 0xc1ff) AM_RAM AM_BASE_MEMBER(irem_z80_state, spriteram) AM_SIZE(&spriteram_size)
AM_RANGE(0xc800, 0xc83f) AM_RAM_WRITE(horizon_scrollram_w) AM_BASE(&horizon_scrollram) AM_RANGE(0xc800, 0xc83f) AM_RAM_WRITE(horizon_scrollram_w) AM_BASE_MEMBER(irem_z80_state, scrollram)
AM_RANGE(0xd000, 0xdfff) AM_RAM_WRITE(m62_tileram_w) AM_BASE(&m62_tileram) AM_RANGE(0xd000, 0xdfff) AM_RAM_WRITE(m62_tileram_w) AM_BASE_MEMBER(irem_z80_state, m62_tileram)
AM_RANGE(0xe000, 0xefff) AM_RAM AM_RANGE(0xe000, 0xefff) AM_RAM
ADDRESS_MAP_END ADDRESS_MAP_END
@ -928,16 +930,45 @@ static GFXDECODE_START( youjyudn )
GFXDECODE_END GFXDECODE_END
static MACHINE_START( m62 )
{
irem_z80_state *state = (irem_z80_state *)machine->driver_data;
state_save_register_global(machine, state->ldrun2_bankswap);
state_save_register_global_array(machine, state->bankcontrol);
}
static MACHINE_RESET( m62 )
{
irem_z80_state *state = (irem_z80_state *)machine->driver_data;
state->flipscreen = 0;
state->m62_background_hscroll = 0;
state->m62_background_vscroll = 0;
state->kidniki_background_bank = 0;
state->kidniki_text_vscroll = 0;
state->ldrun3_topbottom_mask = 0;
state->spelunkr_palbank = 0;
state->ldrun2_bankswap = 0;
state->bankcontrol[0] = 0;
state->bankcontrol[1] = 0;
}
static MACHINE_DRIVER_START( ldrun ) static MACHINE_DRIVER_START( ldrun )
/* driver data */
MDRV_DRIVER_DATA(irem_z80_state)
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD("maincpu", Z80, 24000000/6) MDRV_CPU_ADD("maincpu", Z80, 24000000/6)
MDRV_CPU_PROGRAM_MAP(ldrun_map) MDRV_CPU_PROGRAM_MAP(ldrun_map)
MDRV_CPU_IO_MAP(kungfum_io_map) MDRV_CPU_IO_MAP(kungfum_io_map)
MDRV_CPU_VBLANK_INT("screen", irq0_line_hold) MDRV_CPU_VBLANK_INT("screen", irq0_line_hold)
MDRV_MACHINE_START(m62)
MDRV_MACHINE_RESET(m62)
/* video hardware */ /* video hardware */
MDRV_SCREEN_ADD("screen", RASTER) MDRV_SCREEN_ADD("screen", RASTER)
MDRV_SCREEN_REFRESH_RATE(55) MDRV_SCREEN_REFRESH_RATE(55)
@ -2180,25 +2211,25 @@ static DRIVER_INIT( youjyudn )
memory_configure_bank(machine, 1, 0, 2, memory_region(machine, "maincpu") + 0x10000, 0x4000); memory_configure_bank(machine, 1, 0, 2, memory_region(machine, "maincpu") + 0x10000, 0x4000);
} }
GAME( 1984, kungfum, 0, kungfum, kungfum, 0, ROT0, "Irem", "Kung-Fu Master", 0 ) GAME( 1984, kungfum, 0, kungfum, kungfum, 0, ROT0, "Irem", "Kung-Fu Master", GAME_SUPPORTS_SAVE )
GAME( 1984, kungfumd, kungfum, kungfum, kungfum, 0, ROT0, "Irem (Data East license)", "Kung-Fu Master (Data East)", 0 ) GAME( 1984, kungfumd, kungfum, kungfum, kungfum, 0, ROT0, "Irem (Data East license)", "Kung-Fu Master (Data East)", GAME_SUPPORTS_SAVE )
GAME( 1984, spartanx, kungfum, kungfum, kungfum, 0, ROT0, "Irem", "Spartan X (Japan)", 0 ) GAME( 1984, spartanx, kungfum, kungfum, kungfum, 0, ROT0, "Irem", "Spartan X (Japan)", GAME_SUPPORTS_SAVE )
GAME( 1984, kungfub, kungfum, kungfum, kungfum, 0, ROT0, "bootleg", "Kung-Fu Master (bootleg set 1)", 0 ) GAME( 1984, kungfub, kungfum, kungfum, kungfum, 0, ROT0, "bootleg", "Kung-Fu Master (bootleg set 1)", GAME_SUPPORTS_SAVE )
GAME( 1984, kungfub2, kungfum, kungfum, kungfum, 0, ROT0, "bootleg", "Kung-Fu Master (bootleg set 2)", 0 ) GAME( 1984, kungfub2, kungfum, kungfum, kungfum, 0, ROT0, "bootleg", "Kung-Fu Master (bootleg set 2)", GAME_SUPPORTS_SAVE )
GAME( 1984, battroad, 0, battroad, battroad, battroad, ROT90, "Irem", "The Battle-Road", GAME_IMPERFECT_COLORS ) GAME( 1984, battroad, 0, battroad, battroad, battroad, ROT90, "Irem", "The Battle-Road", GAME_IMPERFECT_COLORS | GAME_SUPPORTS_SAVE )
GAME( 1984, ldrun, 0, ldrun, ldrun, 0, ROT0, "Irem (licensed from Broderbund)", "Lode Runner (set 1)", 0 ) GAME( 1984, ldrun, 0, ldrun, ldrun, 0, ROT0, "Irem (licensed from Broderbund)", "Lode Runner (set 1)", GAME_SUPPORTS_SAVE )
GAME( 1984, ldruna, ldrun, ldrun, ldrun, 0, ROT0, "Irem (licensed from Broderbund)", "Lode Runner (set 2)", 0 ) GAME( 1984, ldruna, ldrun, ldrun, ldrun, 0, ROT0, "Irem (licensed from Broderbund)", "Lode Runner (set 2)", GAME_SUPPORTS_SAVE )
GAME( 1984, ldrun2, 0, ldrun2, ldrun2, ldrun2, ROT0, "Irem (licensed from Broderbund)", "Lode Runner II - The Bungeling Strikes Back" , 0) /* Japanese version is called Bangeringu Teikoku No Gyakushuu */ GAME( 1984, ldrun2, 0, ldrun2, ldrun2, ldrun2, ROT0, "Irem (licensed from Broderbund)", "Lode Runner II - The Bungeling Strikes Back", GAME_SUPPORTS_SAVE ) /* Japanese version is called Bangeringu Teikoku No Gyakushuu */
GAME( 1985, ldrun3, 0, ldrun3, ldrun3, 0, ROT0, "Irem (licensed from Broderbund)", "Lode Runner III - The Golden Labyrinth", 0 ) GAME( 1985, ldrun3, 0, ldrun3, ldrun3, 0, ROT0, "Irem (licensed from Broderbund)", "Lode Runner III - The Golden Labyrinth", GAME_SUPPORTS_SAVE )
GAME( 1985, ldrun3j, ldrun3, ldrun3, ldrun3, 0, ROT0, "Irem (licensed from Broderbund)", "Lode Runner III - Majin No Fukkatsu", 0 ) GAME( 1985, ldrun3j, ldrun3, ldrun3, ldrun3, 0, ROT0, "Irem (licensed from Broderbund)", "Lode Runner III - Majin No Fukkatsu", GAME_SUPPORTS_SAVE )
GAME( 1986, ldrun4, 0, ldrun4, ldrun4, ldrun4, ROT0, "Irem (licensed from Broderbund)", "Lode Runner IV - Teikoku Karano Dasshutsu", 0 ) GAME( 1986, ldrun4, 0, ldrun4, ldrun4, ldrun4, ROT0, "Irem (licensed from Broderbund)", "Lode Runner IV - Teikoku Karano Dasshutsu", GAME_SUPPORTS_SAVE )
GAME( 1985, lotlot, 0, lotlot, lotlot, 0, ROT0, "Irem (licensed from Tokuma Shoten)", "Lot Lot", 0 ) GAME( 1985, lotlot, 0, lotlot, lotlot, 0, ROT0, "Irem (licensed from Tokuma Shoten)", "Lot Lot", GAME_SUPPORTS_SAVE )
GAME( 1986, kidniki, 0, kidniki, kidniki, kidniki, ROT0, "Irem", "Kid Niki - Radical Ninja (World)", GAME_IMPERFECT_SOUND ) GAME( 1986, kidniki, 0, kidniki, kidniki, kidniki, ROT0, "Irem", "Kid Niki - Radical Ninja (World)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE )
GAME( 1986, kidnikiu, kidniki, kidniki, kidniki, kidniki, ROT0, "Irem (Data East USA license)", "Kid Niki - Radical Ninja (US)", GAME_IMPERFECT_SOUND ) GAME( 1986, kidnikiu, kidniki, kidniki, kidniki, kidniki, ROT0, "Irem (Data East USA license)", "Kid Niki - Radical Ninja (US)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE )
GAME( 1986, yanchamr, kidniki, kidniki, kidniki, kidniki, ROT0, "Irem", "Kaiketsu Yanchamaru (Japan)", GAME_IMPERFECT_SOUND ) GAME( 1986, yanchamr, kidniki, kidniki, kidniki, kidniki, ROT0, "Irem", "Kaiketsu Yanchamaru (Japan)", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE )
GAME( 1987, lithero, kidniki, kidniki, kidniki, kidniki, ROT0, "bootleg", "Little Hero", GAME_IMPERFECT_SOUND ) GAME( 1987, lithero, kidniki, kidniki, kidniki, kidniki, ROT0, "bootleg", "Little Hero", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE )
GAME( 1985, spelunkr, 0, spelunkr, spelunkr, spelunkr, ROT0, "Irem (licensed from Broderbund)", "Spelunker", 0 ) GAME( 1985, spelunkr, 0, spelunkr, spelunkr, spelunkr, ROT0, "Irem (licensed from Broderbund)", "Spelunker", GAME_SUPPORTS_SAVE )
GAME( 1985, spelunkrj,spelunkr, spelunkr, spelunkr, spelunkr, ROT0, "Irem (licensed from Broderbund)", "Spelunker (Japan)", 0 ) GAME( 1985, spelunkrj,spelunkr, spelunkr, spelunkr, spelunkr, ROT0, "Irem (licensed from Broderbund)", "Spelunker (Japan)", GAME_SUPPORTS_SAVE )
GAME( 1986, spelunk2, 0, spelunk2, spelunk2, spelunk2, ROT0, "Irem (licensed from Broderbund)", "Spelunker II", GAME_IMPERFECT_SOUND ) GAME( 1986, spelunk2, 0, spelunk2, spelunk2, spelunk2, ROT0, "Irem (licensed from Broderbund)", "Spelunker II", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE )
GAME( 1986, youjyudn, 0, youjyudn, youjyudn, youjyudn, ROT270, "Irem", "Youjyuden (Japan)", 0 ) GAME( 1986, youjyudn, 0, youjyudn, youjyudn, youjyudn, ROT270, "Irem", "Youjyuden (Japan)", GAME_SUPPORTS_SAVE )
GAME( 1985, horizon, 0, horizon, horizon, 0, ROT0, "Irem", "Horizon", GAME_IMPERFECT_SOUND ) GAME( 1985, horizon, 0, horizon, horizon, 0, ROT0, "Irem", "Horizon", GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE )

View File

@ -121,15 +121,30 @@ Dip locations verified for:
#include "sound/ay8910.h" #include "sound/ay8910.h"
#include "sound/samples.h" #include "sound/samples.h"
SAMPLES_START( fghtbskt_sh_start ); typedef struct _m63_state m63_state;
WRITE8_HANDLER( fghtbskt_samples_w ); struct _m63_state
{
UINT8 * videoram;
UINT8 * colorram;
UINT8 * spriteram;
UINT8 * videoram2;
UINT8 * scrollram;
static UINT8 *m63_videoram2, *m63_scrollram; /* video-related */
static int pal_bank, fg_flag, sy_offset; tilemap *bg_tilemap, *fg_tilemap;
static tilemap *bg_tilemap, *fg_tilemap; int pal_bank, fg_flag, sy_offset;
static UINT8 sound_irq;
static int sound_status; /* sound-related */
static int p1,p2; UINT8 sound_irq;
int sound_status;
int p1, p2;
INT16 *samplebuf;
/* sound devices */
const device_config *ay1;
const device_config *ay2;
const device_config *samples;
};
static PALETTE_INIT( m63 ) static PALETTE_INIT( m63 )
@ -189,28 +204,36 @@ static PALETTE_INIT( m63 )
static WRITE8_HANDLER( m63_videoram_w ) static WRITE8_HANDLER( m63_videoram_w )
{ {
videoram[offset] = data; m63_state *state = (m63_state *)space->machine->driver_data;
tilemap_mark_tile_dirty(bg_tilemap, offset);
state->videoram[offset] = data;
tilemap_mark_tile_dirty(state->bg_tilemap, offset);
} }
static WRITE8_HANDLER( m63_colorram_w ) static WRITE8_HANDLER( m63_colorram_w )
{ {
colorram[offset] = data; m63_state *state = (m63_state *)space->machine->driver_data;
tilemap_mark_tile_dirty(bg_tilemap, offset);
state->colorram[offset] = data;
tilemap_mark_tile_dirty(state->bg_tilemap, offset);
} }
static WRITE8_HANDLER( m63_videoram2_w ) static WRITE8_HANDLER( m63_videoram2_w )
{ {
m63_videoram2[offset] = data; m63_state *state = (m63_state *)space->machine->driver_data;
tilemap_mark_tile_dirty(fg_tilemap, offset);
state->videoram2[offset] = data;
tilemap_mark_tile_dirty(state->fg_tilemap, offset);
} }
static WRITE8_HANDLER( m63_palbank_w ) static WRITE8_HANDLER( m63_palbank_w )
{ {
if (pal_bank != (data & 0x01)) m63_state *state = (m63_state *)space->machine->driver_data;
if (state->pal_bank != (data & 0x01))
{ {
pal_bank = data & 0x01; state->pal_bank = data & 0x01;
tilemap_mark_all_tiles_dirty(bg_tilemap); tilemap_mark_all_tiles_dirty(state->bg_tilemap);
} }
} }
@ -225,58 +248,62 @@ static WRITE8_HANDLER( m63_flipscreen_w )
static WRITE8_HANDLER( fghtbskt_flipscreen_w ) static WRITE8_HANDLER( fghtbskt_flipscreen_w )
{ {
m63_state *state = (m63_state *)space->machine->driver_data;
flip_screen_set(space->machine, data); flip_screen_set(space->machine, data);
fg_flag = flip_screen_get(space->machine) ? TILE_FLIPX : 0; state->fg_flag = flip_screen_get(space->machine) ? TILE_FLIPX : 0;
} }
static TILE_GET_INFO( get_bg_tile_info ) static TILE_GET_INFO( get_bg_tile_info )
{ {
int attr = colorram[tile_index]; m63_state *state = (m63_state *)machine->driver_data;
int code = videoram[tile_index] | ((attr & 0x30) << 4);
int color = (attr & 0x0f) + (pal_bank << 4); int attr = state->colorram[tile_index];
int code = state->videoram[tile_index] | ((attr & 0x30) << 4);
int color = (attr & 0x0f) + (state->pal_bank << 4);
SET_TILE_INFO(1, code, color, 0); SET_TILE_INFO(1, code, color, 0);
} }
static TILE_GET_INFO( get_fg_tile_info ) static TILE_GET_INFO( get_fg_tile_info )
{ {
int code = m63_videoram2[tile_index]; m63_state *state = (m63_state *)machine->driver_data;
SET_TILE_INFO(0, code, 0, fg_flag); int code = state->videoram2[tile_index];
SET_TILE_INFO(0, code, 0, state->fg_flag);
} }
static VIDEO_START( m63 ) static VIDEO_START( m63 )
{ {
bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, m63_state *state = (m63_state *)machine->driver_data;
8, 8, 32, 32);
fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, state->bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
8, 8, 32, 32); state->fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
tilemap_set_scroll_cols(bg_tilemap, 32); tilemap_set_scroll_cols(state->bg_tilemap, 32);
tilemap_set_transparent_pen(fg_tilemap, 0); tilemap_set_transparent_pen(state->fg_tilemap, 0);
fg_flag = 0;
} }
static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect) static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect)
{ {
m63_state *state = (m63_state *)machine->driver_data;
int offs; int offs;
for (offs = 0; offs < spriteram_size; offs += 4) for (offs = 0; offs < spriteram_size; offs += 4)
{ {
int code = spriteram[offs + 1] | ((spriteram[offs + 2] & 0x10) << 4); int code = state->spriteram[offs + 1] | ((state->spriteram[offs + 2] & 0x10) << 4);
int color = (spriteram[offs + 2] & 0x0f) + (pal_bank << 4); int color = (state->spriteram[offs + 2] & 0x0f) + (state->pal_bank << 4);
int flipx = spriteram[offs + 2] & 0x20; int flipx = state->spriteram[offs + 2] & 0x20;
int flipy = 0; int flipy = 0;
int sx = spriteram[offs + 3]; int sx = state->spriteram[offs + 3];
int sy = sy_offset - spriteram[offs]; int sy = state->sy_offset - state->spriteram[offs];
if (flip_screen_get(machine)) if (flip_screen_get(machine))
{ {
sx = 240 - sx; sx = 240 - sx;
sy = sy_offset - sy; sy = state->sy_offset - sy;
flipx = !flipx; flipx = !flipx;
flipy = !flipy; flipy = !flipy;
} }
@ -302,14 +329,16 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
static VIDEO_UPDATE( m63 ) static VIDEO_UPDATE( m63 )
{ {
m63_state *state = (m63_state *)screen->machine->driver_data;
int col; int col;
for (col = 0; col < 32; col++) for (col = 0; col < 32; col++)
tilemap_set_scrolly(bg_tilemap, col, m63_scrollram[col * 8]); tilemap_set_scrolly(state->bg_tilemap, col, state->scrollram[col * 8]);
tilemap_draw(bitmap, cliprect, bg_tilemap, 0, 0); tilemap_draw(bitmap, cliprect, state->bg_tilemap, 0, 0);
draw_sprites(screen->machine, bitmap, cliprect); draw_sprites(screen->machine, bitmap, cliprect);
tilemap_draw(bitmap, cliprect, fg_tilemap, 0, 0); tilemap_draw(bitmap, cliprect, state->fg_tilemap, 0, 0);
return 0; return 0;
} }
@ -327,30 +356,32 @@ static WRITE8_HANDLER( snd_irq_w )
static WRITE8_HANDLER( snddata_w ) static WRITE8_HANDLER( snddata_w )
{ {
const device_config *ay1 = devtag_get_device(space->machine, "ay1"); m63_state *state = (m63_state *)space->machine->driver_data;
const device_config *ay2 = devtag_get_device(space->machine, "ay2");
if ((p2 & 0xf0) == 0xe0) if ((state->p2 & 0xf0) == 0xe0)
ay8910_address_w(ay1, 0, offset); ay8910_address_w(state->ay1, 0, offset);
else if ((p2 & 0xf0) == 0xa0) else if ((state->p2 & 0xf0) == 0xa0)
ay8910_data_w(ay1, 0, offset); ay8910_data_w(state->ay1, 0, offset);
else if (ay2 != NULL && (p1 & 0xe0) == 0x60) else if (state->ay2 != NULL && (state->p1 & 0xe0) == 0x60)
ay8910_address_w(ay2, 0, offset); ay8910_address_w(state->ay2, 0, offset);
else if (ay2 != NULL && (p1 & 0xe0) == 0x40) else if (state->ay2 != NULL && (state->p1 & 0xe0) == 0x40)
ay8910_data_w(ay2, 0, offset); ay8910_data_w(state->ay2, 0, offset);
else if ((p2 & 0xf0) == 0x70 ) else if ((state->p2 & 0xf0) == 0x70 )
sound_status = offset; state->sound_status = offset;
} }
static WRITE8_HANDLER( p1_w ) static WRITE8_HANDLER( p1_w )
{ {
p1 = data; m63_state *state = (m63_state *)space->machine->driver_data;
state->p1 = data;
} }
static WRITE8_HANDLER( p2_w ) static WRITE8_HANDLER( p2_w )
{ {
p2 = data; m63_state *state = (m63_state *)space->machine->driver_data;
if((p2 & 0xf0) == 0x50)
state->p2 = data;
if((state->p2 & 0xf0) == 0x50)
{ {
cputag_set_input_line(space->machine, "soundcpu", 0, CLEAR_LINE); cputag_set_input_line(space->machine, "soundcpu", 0, CLEAR_LINE);
} }
@ -358,14 +389,17 @@ static WRITE8_HANDLER( p2_w )
static READ8_HANDLER( snd_status_r ) static READ8_HANDLER( snd_status_r )
{ {
return sound_status; m63_state *state = (m63_state *)space->machine->driver_data;
return state->sound_status;
} }
static READ8_HANDLER( irq_r ) static READ8_HANDLER( irq_r )
{ {
if (sound_irq) m63_state *state = (m63_state *)space->machine->driver_data;
if (state->sound_irq)
{ {
sound_irq = 0; state->sound_irq = 0;
return 1; return 1;
} }
return 0; return 0;
@ -373,23 +407,32 @@ static READ8_HANDLER( irq_r )
static READ8_HANDLER( snddata_r ) static READ8_HANDLER( snddata_r )
{ {
switch(p2 & 0xf0) m63_state *state = (m63_state *)space->machine->driver_data;
switch (state->p2 & 0xf0)
{ {
case 0x60: return soundlatch_r(space, 0); ; case 0x60: return soundlatch_r(space, 0); ;
case 0x70: return memory_region(space->machine, "user1")[((p1 & 0x1f) << 8) | offset]; case 0x70: return memory_region(space->machine, "user1")[((state->p1 & 0x1f) << 8) | offset];
} }
return 0xff; return 0xff;
} }
static WRITE8_HANDLER( fghtbskt_samples_w )
{
m63_state *state = (m63_state *)space->machine->driver_data;
if (data & 1)
sample_start_raw(state->samples, 0, state->samplebuf + ((data & 0xf0) << 8), 0x2000, 8000, 0);
}
static ADDRESS_MAP_START( m63_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( m63_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0xbfff) AM_ROM AM_RANGE(0x0000, 0xbfff) AM_ROM
AM_RANGE(0xd000, 0xdfff) AM_RAM AM_RANGE(0xd000, 0xdfff) AM_RAM
AM_RANGE(0xe000, 0xe1ff) AM_RAM AM_RANGE(0xe000, 0xe1ff) AM_RAM
AM_RANGE(0xe200, 0xe2ff) AM_RAM AM_BASE(&spriteram) AM_SIZE(&spriteram_size) AM_RANGE(0xe200, 0xe2ff) AM_RAM AM_BASE_MEMBER(m63_state, spriteram) AM_SIZE(&spriteram_size)
AM_RANGE(0xe300, 0xe3ff) AM_RAM AM_BASE(&m63_scrollram) AM_RANGE(0xe300, 0xe3ff) AM_RAM AM_BASE_MEMBER(m63_state, scrollram)
AM_RANGE(0xe400, 0xe7ff) AM_RAM_WRITE(m63_videoram2_w) AM_BASE(&m63_videoram2) AM_RANGE(0xe400, 0xe7ff) AM_RAM_WRITE(m63_videoram2_w) AM_BASE_MEMBER(m63_state, videoram2)
AM_RANGE(0xe800, 0xebff) AM_RAM_WRITE(m63_videoram_w) AM_BASE(&videoram) AM_RANGE(0xe800, 0xebff) AM_RAM_WRITE(m63_videoram_w) AM_BASE_MEMBER(m63_state, videoram)
AM_RANGE(0xec00, 0xefff) AM_RAM_WRITE(m63_colorram_w) AM_BASE(&colorram) AM_RANGE(0xec00, 0xefff) AM_RAM_WRITE(m63_colorram_w) AM_BASE_MEMBER(m63_state, colorram)
AM_RANGE(0xf000, 0xf000) AM_WRITE(interrupt_enable_w) /* NMI enable */ AM_RANGE(0xf000, 0xf000) AM_WRITE(interrupt_enable_w) /* NMI enable */
AM_RANGE(0xf002, 0xf002) AM_WRITE(m63_flipscreen_w) AM_RANGE(0xf002, 0xf002) AM_WRITE(m63_flipscreen_w)
AM_RANGE(0xf003, 0xf003) AM_WRITE(m63_palbank_w) AM_RANGE(0xf003, 0xf003) AM_WRITE(m63_palbank_w)
@ -406,11 +449,11 @@ static ADDRESS_MAP_START( fghtbskt_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x8000, 0xbfff) AM_ROM AM_RANGE(0x8000, 0xbfff) AM_ROM
AM_RANGE(0xc000, 0xc7ff) AM_RAM AM_RANGE(0xc000, 0xc7ff) AM_RAM
AM_RANGE(0xd000, 0xd1ff) AM_RAM AM_RANGE(0xd000, 0xd1ff) AM_RAM
AM_RANGE(0xd200, 0xd2ff) AM_RAM AM_BASE(&spriteram) AM_SIZE(&spriteram_size) AM_RANGE(0xd200, 0xd2ff) AM_RAM AM_BASE_MEMBER(m63_state, spriteram) AM_SIZE(&spriteram_size)
AM_RANGE(0xd300, 0xd3ff) AM_RAM AM_BASE(&m63_scrollram) AM_RANGE(0xd300, 0xd3ff) AM_RAM AM_BASE_MEMBER(m63_state, scrollram)
AM_RANGE(0xd400, 0xd7ff) AM_RAM_WRITE(m63_videoram2_w) AM_BASE(&m63_videoram2) AM_RANGE(0xd400, 0xd7ff) AM_RAM_WRITE(m63_videoram2_w) AM_BASE_MEMBER(m63_state, videoram2)
AM_RANGE(0xd800, 0xdbff) AM_RAM_WRITE(m63_videoram_w) AM_BASE(&videoram) AM_RANGE(0xd800, 0xdbff) AM_RAM_WRITE(m63_videoram_w) AM_BASE_MEMBER(m63_state, videoram)
AM_RANGE(0xdc00, 0xdfff) AM_RAM_WRITE(m63_colorram_w) AM_BASE(&colorram) AM_RANGE(0xdc00, 0xdfff) AM_RAM_WRITE(m63_colorram_w) AM_BASE_MEMBER(m63_state, colorram)
AM_RANGE(0xf000, 0xf000) AM_READ(snd_status_r) AM_RANGE(0xf000, 0xf000) AM_READ(snd_status_r)
AM_RANGE(0xf001, 0xf001) AM_READ_PORT("P1") AM_RANGE(0xf001, 0xf001) AM_READ_PORT("P1")
AM_RANGE(0xf002, 0xf002) AM_READ_PORT("P2") AM_RANGE(0xf002, 0xf002) AM_READ_PORT("P2")
@ -622,6 +665,20 @@ static GFXDECODE_START( fghtbskt )
GFXDECODE_END GFXDECODE_END
static SAMPLES_START( fghtbskt_sh_start )
{
running_machine *machine = device->machine;
m63_state *state = (m63_state *)machine->driver_data;
int i, len = memory_region_length(machine, "samples");
UINT8 *ROM = memory_region(machine, "samples");
state->samplebuf = auto_alloc_array(machine, INT16, len);
state_save_register_global_pointer(machine, state->samplebuf, len);
for(i = 0; i < len; i++)
state->samplebuf[i] = ((INT8)(ROM[i] ^ 0x80)) * 256;
}
static const samples_interface fghtbskt_samples_interface = static const samples_interface fghtbskt_samples_interface =
{ {
1, 1,
@ -631,11 +688,46 @@ static const samples_interface fghtbskt_samples_interface =
static INTERRUPT_GEN( snd_irq ) static INTERRUPT_GEN( snd_irq )
{ {
sound_irq = 1; m63_state *state = (m63_state *)device->machine->driver_data;
state->sound_irq = 1;
}
static MACHINE_START( m63 )
{
m63_state *state = (m63_state *)machine->driver_data;
state->ay1 = devtag_get_device(machine, "ay1");
state->ay2 = devtag_get_device(machine, "ay2");
state->samples = devtag_get_device(machine, "samples");
state_save_register_global(machine, state->pal_bank);
state_save_register_global(machine, state->fg_flag);
state_save_register_global(machine, state->sy_offset);
/* sound-related */
state_save_register_global(machine, state->sound_irq);
state_save_register_global(machine, state->sound_status);
state_save_register_global(machine, state->p1);
state_save_register_global(machine, state->p2);
}
static MACHINE_RESET( m63 )
{
m63_state *state = (m63_state *)machine->driver_data;
state->pal_bank = 0;
state->fg_flag = 0;
state->sound_irq = 0;
state->sound_status = 0;
state->p1 = 0;
state->p2 = 0;
} }
static MACHINE_DRIVER_START( m63 ) static MACHINE_DRIVER_START( m63 )
/* driver data */
MDRV_DRIVER_DATA(m63_state)
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD("maincpu",Z80,XTAL_12MHz/4) /* 3 MHz */ MDRV_CPU_ADD("maincpu",Z80,XTAL_12MHz/4) /* 3 MHz */
MDRV_CPU_PROGRAM_MAP(m63_map) MDRV_CPU_PROGRAM_MAP(m63_map)
@ -646,6 +738,8 @@ static MACHINE_DRIVER_START( m63 )
MDRV_CPU_IO_MAP(i8039_port_map) MDRV_CPU_IO_MAP(i8039_port_map)
MDRV_CPU_PERIODIC_INT(snd_irq, 60) MDRV_CPU_PERIODIC_INT(snd_irq, 60)
MDRV_MACHINE_START(m63)
MDRV_MACHINE_RESET(m63)
/* video hardware */ /* video hardware */
MDRV_SCREEN_ADD("screen", RASTER) MDRV_SCREEN_ADD("screen", RASTER)
@ -680,6 +774,9 @@ MACHINE_DRIVER_END
static MACHINE_DRIVER_START( fghtbskt ) static MACHINE_DRIVER_START( fghtbskt )
/* driver data */
MDRV_DRIVER_DATA(m63_state)
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD("maincpu", Z80, XTAL_12MHz/4) /* 3 MHz */ MDRV_CPU_ADD("maincpu", Z80, XTAL_12MHz/4) /* 3 MHz */
MDRV_CPU_PROGRAM_MAP(fghtbskt_map) MDRV_CPU_PROGRAM_MAP(fghtbskt_map)
@ -690,6 +787,9 @@ static MACHINE_DRIVER_START( fghtbskt )
MDRV_CPU_IO_MAP(i8039_port_map) MDRV_CPU_IO_MAP(i8039_port_map)
MDRV_CPU_PERIODIC_INT(snd_irq, 60/2) MDRV_CPU_PERIODIC_INT(snd_irq, 60/2)
MDRV_MACHINE_START(m63)
MDRV_MACHINE_RESET(m63)
/* video hardware */ /* video hardware */
MDRV_SCREEN_ADD("screen", RASTER) MDRV_SCREEN_ADD("screen", RASTER)
MDRV_SCREEN_REFRESH_RATE(60) MDRV_SCREEN_REFRESH_RATE(60)
@ -888,21 +988,21 @@ ROM_START( fghtbskt )
ROM_LOAD( "fb_r.9e", 0x0000, 0x0100, CRC(c5cdc8ba) SHA1(3fcef3ebe0dda72dfa35e042ff611758c345d749) ) ROM_LOAD( "fb_r.9e", 0x0000, 0x0100, CRC(c5cdc8ba) SHA1(3fcef3ebe0dda72dfa35e042ff611758c345d749) )
ROM_LOAD( "fb_g.10e", 0x0100, 0x0100, CRC(1460c936) SHA1(f99a544c83931de098a6cfac391f63ae43f5cdd0) ) ROM_LOAD( "fb_g.10e", 0x0100, 0x0100, CRC(1460c936) SHA1(f99a544c83931de098a6cfac391f63ae43f5cdd0) )
ROM_LOAD( "fb_b.11e", 0x0200, 0x0100, CRC(fca5bf0e) SHA1(5846f43aa2906cac58e300fdab197b99f896e3ef) ) ROM_LOAD( "fb_b.11e", 0x0200, 0x0100, CRC(fca5bf0e) SHA1(5846f43aa2906cac58e300fdab197b99f896e3ef) )
ROM_END ROM_END
static DRIVER_INIT( wilytowr ) static DRIVER_INIT( wilytowr )
{ {
sy_offset = 238; m63_state *state = (m63_state *)machine->driver_data;
state->sy_offset = 238;
} }
static DRIVER_INIT( fghtbskt ) static DRIVER_INIT( fghtbskt )
{ {
sy_offset = 240; m63_state *state = (m63_state *)machine->driver_data;
state->sy_offset = 240;
} }
GAME( 1984, wilytowr, 0, m63, wilytowr, wilytowr, ROT180, "Irem", "Wily Tower", 0 ) GAME( 1984, wilytowr, 0, m63, wilytowr, wilytowr, ROT180, "Irem", "Wily Tower", GAME_SUPPORTS_SAVE )
GAME( 1985, atomboy, wilytowr, atomboy, wilytowr, wilytowr, ROT180, "Irem (Memetron license)", "Atomic Boy (revision B)", 0 ) GAME( 1985, atomboy, wilytowr, atomboy, wilytowr, wilytowr, ROT180, "Irem (Memetron license)", "Atomic Boy (revision B)", GAME_SUPPORTS_SAVE )
GAME( 1985, atomboya, wilytowr, atomboy, wilytowr, wilytowr, ROT180, "Irem (Memetron license)", "Atomic Boy (revision A)", 0 ) GAME( 1985, atomboya, wilytowr, atomboy, wilytowr, wilytowr, ROT180, "Irem (Memetron license)", "Atomic Boy (revision A)", GAME_SUPPORTS_SAVE )
GAME( 1984, fghtbskt, 0, fghtbskt, fghtbskt, fghtbskt, ROT0, "Paradise Co. Ltd.", "Fighting Basketball", 0 ) GAME( 1984, fghtbskt, 0, fghtbskt, fghtbskt, fghtbskt, ROT0, "Paradise Co. Ltd.", "Fighting Basketball", GAME_SUPPORTS_SAVE )

View File

@ -50,26 +50,15 @@ and 2764 eprom (swapped D3/D4 and D5/D6 data lines)
#include "driver.h" #include "driver.h"
#include "cpu/z80/z80.h" #include "cpu/z80/z80.h"
#include "audio/irem.h" #include "audio/irem.h"
#include "includes/iremz80.h"
extern UINT8 *travrusa_videoram;
PALETTE_INIT( travrusa );
PALETTE_INIT( shtrider );
VIDEO_START( travrusa );
WRITE8_HANDLER( travrusa_videoram_w );
WRITE8_HANDLER( travrusa_scroll_x_low_w );
WRITE8_HANDLER( travrusa_scroll_x_high_w );
WRITE8_HANDLER( travrusa_flipscreen_w );
VIDEO_UPDATE( travrusa );
static ADDRESS_MAP_START( main_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( main_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x0000, 0x7fff) AM_ROM
AM_RANGE(0x8000, 0x8fff) AM_RAM_WRITE(travrusa_videoram_w) AM_BASE(&travrusa_videoram) AM_RANGE(0x8000, 0x8fff) AM_RAM_WRITE(travrusa_videoram_w) AM_BASE_MEMBER(irem_z80_state, videoram)
AM_RANGE(0x9000, 0x9000) AM_WRITE(travrusa_scroll_x_low_w) AM_RANGE(0x9000, 0x9000) AM_WRITE(travrusa_scroll_x_low_w)
AM_RANGE(0xa000, 0xa000) AM_WRITE(travrusa_scroll_x_high_w) AM_RANGE(0xa000, 0xa000) AM_WRITE(travrusa_scroll_x_high_w)
AM_RANGE(0xc800, 0xc9ff) AM_WRITE(SMH_RAM) AM_BASE(&spriteram) AM_SIZE(&spriteram_size) AM_RANGE(0xc800, 0xc9ff) AM_WRITE(SMH_RAM) AM_BASE_MEMBER(irem_z80_state, spriteram) AM_SIZE(&spriteram_size)
AM_RANGE(0xd000, 0xd000) AM_WRITE(irem_sound_cmd_w) AM_RANGE(0xd000, 0xd000) AM_WRITE(irem_sound_cmd_w)
AM_RANGE(0xd001, 0xd001) AM_WRITE(travrusa_flipscreen_w) /* + coin counters - not written by shtrider */ AM_RANGE(0xd001, 0xd001) AM_WRITE(travrusa_flipscreen_w) /* + coin counters - not written by shtrider */
AM_RANGE(0xd000, 0xd000) AM_READ_PORT("SYSTEM") /* IN0 */ AM_RANGE(0xd000, 0xd000) AM_READ_PORT("SYSTEM") /* IN0 */
@ -300,15 +289,26 @@ static GFXDECODE_START( shtrider )
GFXDECODE_ENTRY( "gfx2", 0, shtrider_spritelayout, 16*8, 16 ) GFXDECODE_ENTRY( "gfx2", 0, shtrider_spritelayout, 16*8, 16 )
GFXDECODE_END GFXDECODE_END
static MACHINE_RESET( travrusa )
{
irem_z80_state *state = (irem_z80_state *)machine->driver_data;
state->scrollx[0] = 0;
state->scrollx[1] = 0;
}
static MACHINE_DRIVER_START( travrusa ) static MACHINE_DRIVER_START( travrusa )
/* driver data */
MDRV_DRIVER_DATA(irem_z80_state)
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_ADD("maincpu", Z80, 4000000) /* 4 MHz (?) */ MDRV_CPU_ADD("maincpu", Z80, 4000000) /* 4 MHz (?) */
MDRV_CPU_PROGRAM_MAP(main_map) MDRV_CPU_PROGRAM_MAP(main_map)
MDRV_CPU_VBLANK_INT("screen", irq0_line_hold) MDRV_CPU_VBLANK_INT("screen", irq0_line_hold)
MDRV_MACHINE_RESET(travrusa)
/* video hardware */ /* video hardware */
MDRV_SCREEN_ADD("screen", RASTER) MDRV_SCREEN_ADD("screen", RASTER)
MDRV_SCREEN_REFRESH_RATE(56.75) MDRV_SCREEN_REFRESH_RATE(56.75)
@ -486,7 +486,7 @@ static DRIVER_INIT( shtridra )
GAME( 1983, travrusa, 0, travrusa, travrusa, 0, ROT270, "Irem", "Traverse USA / Zippy Race", 0 ) GAME( 1983, travrusa, 0, travrusa, travrusa, 0, ROT270, "Irem", "Traverse USA / Zippy Race", GAME_SUPPORTS_SAVE )
GAME( 1983, motorace, travrusa, travrusa, motorace, motorace, ROT270, "Irem (Williams license)", "MotoRace USA", 0 ) GAME( 1983, motorace, travrusa, travrusa, motorace, motorace, ROT270, "Irem (Williams license)", "MotoRace USA", GAME_SUPPORTS_SAVE )
GAME( 1985, shtrider, 0, shtrider, shtrider, 0, ROT270|ORIENTATION_FLIP_X, "Seibu Kaihatsu", "Shot Rider", 0 ) GAME( 1985, shtrider, 0, shtrider, shtrider, 0, ROT270|ORIENTATION_FLIP_X, "Seibu Kaihatsu", "Shot Rider", GAME_SUPPORTS_SAVE )
GAME( 1984, shtridera,shtrider, shtrider, shtrider, shtridra, ROT270|ORIENTATION_FLIP_X, "Seibu Kaihatsu (Sigma license)", "Shot Rider (Sigma license)", 0 ) GAME( 1984, shtridera,shtrider, shtrider, shtrider, shtridra, ROT270|ORIENTATION_FLIP_X, "Seibu Kaihatsu (Sigma license)", "Shot Rider (Sigma license)", GAME_SUPPORTS_SAVE )

175
src/mame/includes/iremz80.h Normal file
View File

@ -0,0 +1,175 @@
/*************************************************************************
Irem Z80 hardware - M52, M57, M58 and M62 boards
*************************************************************************/
/* These share sound hardware (in audio/irem.h) and hence driver data */
typedef struct _irem_z80_state irem_z80_state;
struct _irem_z80_state
{
/* memory pointers */
UINT8 * videoram; // m52, m57, m58
UINT8 * spriteram; // m52, m57, m58, m62
UINT8 * colorram; // m52
UINT8 * m62_tileram; // m62
UINT8 * m62_textram; // m62
UINT8 * scrollram; // m57, m62 (horizon only)
/* sound-related */
UINT8 port1, port2;
/* video-related */
tilemap* bg_tilemap; // m52, m57, m58, m62
tilemap* fg_tilemap; // m62
int flipscreen; // m57, m62
/* driver specific (video-related) */
/* travrusa */
int scrollx[2];
/* M52 */
UINT8 bg1xpos, bg1ypos;
UINT8 bg2xpos, bg2ypos;
UINT8 bgcontrol;
/* M58 */
UINT8 *yard_scroll_x_low;
UINT8 *yard_scroll_x_high;
UINT8 *yard_scroll_y_low;
UINT8 *yard_score_panel_disabled;
bitmap_t *scroll_panel_bitmap;
/* M62 */
const UINT8 *sprite_height_prom;
INT32 m62_background_hscroll;
INT32 m62_background_vscroll;
UINT8 kidniki_background_bank;
INT32 kidniki_text_vscroll;
int ldrun3_topbottom_mask;
INT32 spelunkr_palbank;
/* misc */
int ldrun2_bankswap; //ldrun2
int bankcontrol[2]; //ldrun2
/* sound devices */
const device_config *ay1;
const device_config *ay2;
const device_config *adpcm1;
const device_config *adpcm2;
};
/*----------- defined in audio/irem.c -----------*/
MACHINE_DRIVER_EXTERN( m52_sound_c_audio );
MACHINE_DRIVER_EXTERN( m52_large_audio );
MACHINE_DRIVER_EXTERN( m62_audio );
WRITE8_HANDLER( irem_sound_cmd_w );
/* Video hardware is different otoh */
/*----------- defined in video/m52.c -----------*/
READ8_HANDLER( m52_protection_r );
WRITE8_HANDLER( m52_scroll_w );
WRITE8_HANDLER( m52_bg1xpos_w );
WRITE8_HANDLER( m52_bg1ypos_w );
WRITE8_HANDLER( m52_bg2xpos_w );
WRITE8_HANDLER( m52_bg2ypos_w );
WRITE8_HANDLER( m52_bgcontrol_w );
WRITE8_HANDLER( m52_flipscreen_w );
WRITE8_HANDLER( alpha1v_flipscreen_w );
WRITE8_HANDLER( m52_videoram_w );
WRITE8_HANDLER( m52_colorram_w );
PALETTE_INIT( m52 );
VIDEO_START( m52 );
VIDEO_UPDATE( m52 );
/*----------- defined in video/m57.c -----------*/
WRITE8_HANDLER( m57_videoram_w );
WRITE8_HANDLER( m57_flipscreen_w );
PALETTE_INIT( m57 );
VIDEO_START( m57 );
VIDEO_UPDATE( m57 );
/*----------- defined in video/m58.c -----------*/
WRITE8_HANDLER( yard_videoram_w );
WRITE8_HANDLER( yard_scroll_panel_w );
WRITE8_HANDLER( yard_flipscreen_w );
PALETTE_INIT( yard );
VIDEO_START( yard );
VIDEO_UPDATE( yard );
/*----------- defined in video/travrusa.c -----------*/
WRITE8_HANDLER( travrusa_videoram_w );
WRITE8_HANDLER( travrusa_scroll_x_low_w );
WRITE8_HANDLER( travrusa_scroll_x_high_w );
WRITE8_HANDLER( travrusa_flipscreen_w );
PALETTE_INIT( travrusa );
PALETTE_INIT( shtrider );
VIDEO_START( travrusa );
VIDEO_UPDATE( travrusa );
/*----------- defined in video/m62.c -----------*/
WRITE8_HANDLER( m62_tileram_w );
WRITE8_HANDLER( m62_textram_w );
WRITE8_HANDLER( m62_flipscreen_w );
WRITE8_HANDLER( m62_hscroll_low_w );
WRITE8_HANDLER( m62_hscroll_high_w );
WRITE8_HANDLER( m62_vscroll_low_w );
WRITE8_HANDLER( m62_vscroll_high_w );
WRITE8_HANDLER( horizon_scrollram_w );
WRITE8_HANDLER( kidniki_text_vscroll_low_w );
WRITE8_HANDLER( kidniki_text_vscroll_high_w );
WRITE8_HANDLER( kidniki_background_bank_w );
WRITE8_HANDLER( kungfum_tileram_w );
WRITE8_HANDLER( ldrun3_topbottom_mask_w );
WRITE8_HANDLER( spelunkr_palbank_w );
WRITE8_HANDLER( spelunk2_gfxport_w );
PALETTE_INIT( m62 );
PALETTE_INIT( lotlot );
PALETTE_INIT( battroad );
PALETTE_INIT( spelunk2 );
VIDEO_START( battroad );
VIDEO_START( horizon );
VIDEO_START( kidniki );
VIDEO_START( kungfum );
VIDEO_START( ldrun );
VIDEO_START( ldrun2 );
VIDEO_START( ldrun4 );
VIDEO_START( lotlot );
VIDEO_START( spelunkr );
VIDEO_START( spelunk2 );
VIDEO_START( youjyudn );
VIDEO_UPDATE( battroad );
VIDEO_UPDATE( horizon );
VIDEO_UPDATE( kidniki );
VIDEO_UPDATE( kungfum );
VIDEO_UPDATE( ldrun );
VIDEO_UPDATE( ldrun3 );
VIDEO_UPDATE( ldrun4 );
VIDEO_UPDATE( lotlot );
VIDEO_UPDATE( spelunkr );
VIDEO_UPDATE( spelunk2 );
VIDEO_UPDATE( youjyudn );

View File

@ -34,16 +34,27 @@ struct _m10_state
UINT8 * chargen; UINT8 * chargen;
UINT8 * memory; UINT8 * memory;
UINT8 * rom; UINT8 * rom;
UINT8 * videoram;
UINT8 * colorram;
/* machine states */ /* video-related */
tilemap * tx_tilemap;
gfx_element * back_gfx;
/* sound state */ /* this is currently unused, because it is needed by gfx_layout (which has no machine) */
UINT32 extyoffs[32 * 8];
/* video state */ /* video state */
UINT8 bottomline; UINT8 bottomline;
UINT8 flip; UINT8 flip;
/* Specific states */ /* misc */
int last;
/* devices */
const device_config *ic8j1;
const device_config *ic8j2;
const device_config *samples;
}; };
@ -59,4 +70,3 @@ VIDEO_UPDATE( m15 );
VIDEO_START( m10 ); VIDEO_START( m10 );
VIDEO_START( m15 ); VIDEO_START( m15 );

View File

@ -1,25 +0,0 @@
/*************************************************************************
Irem M52 hardware
*************************************************************************/
/*----------- defined in video/m52.c -----------*/
READ8_HANDLER( m52_protection_r );
WRITE8_HANDLER( m52_scroll_w );
WRITE8_HANDLER( m52_bg1xpos_w );
WRITE8_HANDLER( m52_bg1ypos_w );
WRITE8_HANDLER( m52_bg2xpos_w );
WRITE8_HANDLER( m52_bg2ypos_w );
WRITE8_HANDLER( m52_bgcontrol_w );
WRITE8_HANDLER( m52_flipscreen_w );
WRITE8_HANDLER( alpha1v_flipscreen_w );
WRITE8_HANDLER( m52_videoram_w );
WRITE8_HANDLER( m52_colorram_w );
PALETTE_INIT( m52 );
VIDEO_START( m52 );
VIDEO_UPDATE( m52 );

View File

@ -1,17 +0,0 @@
/*************************************************************************
Irem M57 hardware
*************************************************************************/
/*----------- defined in video/m57.c -----------*/
extern UINT8 *m57_scroll;
WRITE8_HANDLER( m57_videoram_w );
WRITE8_HANDLER( m57_flipscreen_w );
PALETTE_INIT( m57 );
VIDEO_START( m57 );
VIDEO_UPDATE( m57 );

View File

@ -1,20 +0,0 @@
/*************************************************************************
Irem M58 hardware
*************************************************************************/
/*----------- defined in video/m58.c -----------*/
extern UINT8 *yard_scroll_x_low;
extern UINT8 *yard_scroll_x_high;
extern UINT8 *yard_scroll_y_low;
extern UINT8 *yard_score_panel_disabled;
WRITE8_HANDLER( yard_videoram_w );
WRITE8_HANDLER( yard_scroll_panel_w );
WRITE8_HANDLER( yard_flipscreen_w );
PALETTE_INIT( yard );
VIDEO_START( yard );
VIDEO_UPDATE( yard );

View File

@ -1,65 +0,0 @@
/*************************************************************************
Irem M62 hardware
*************************************************************************/
/*----------- defined in video/m62.c -----------*/
PALETTE_INIT( m62 );
PALETTE_INIT( lotlot );
PALETTE_INIT( battroad );
PALETTE_INIT( spelunk2 );
WRITE8_HANDLER( m62_tileram_w );
WRITE8_HANDLER( m62_textram_w );
WRITE8_HANDLER( m62_flipscreen_w );
WRITE8_HANDLER( m62_hscroll_low_w );
WRITE8_HANDLER( m62_hscroll_high_w );
WRITE8_HANDLER( m62_vscroll_low_w );
WRITE8_HANDLER( m62_vscroll_high_w );
WRITE8_HANDLER( ldrun3_topbottom_mask_w );
extern UINT8 *m62_tileram;
extern UINT8 *m62_textram;
VIDEO_START( kungfum );
VIDEO_UPDATE( kungfum );
WRITE8_HANDLER( kungfum_tileram_w );
VIDEO_START( ldrun );
VIDEO_UPDATE( ldrun );
VIDEO_START( ldrun2 );
VIDEO_UPDATE( ldrun3 );
VIDEO_START( battroad );
VIDEO_UPDATE( battroad );
VIDEO_START( ldrun4 );
VIDEO_UPDATE( ldrun4 );
VIDEO_START( lotlot );
VIDEO_UPDATE( lotlot );
WRITE8_HANDLER( kidniki_text_vscroll_low_w );
WRITE8_HANDLER( kidniki_text_vscroll_high_w );
WRITE8_HANDLER( kidniki_background_bank_w );
VIDEO_START( kidniki );
VIDEO_UPDATE( kidniki );
WRITE8_HANDLER( spelunkr_palbank_w );
VIDEO_START( spelunkr );
VIDEO_UPDATE( spelunkr );
WRITE8_HANDLER( spelunk2_gfxport_w );
VIDEO_START( spelunk2 );
VIDEO_UPDATE( spelunk2 );
VIDEO_START( youjyudn );
VIDEO_UPDATE( youjyudn );
VIDEO_START( horizon );
VIDEO_UPDATE( horizon );
WRITE8_HANDLER( horizon_scrollram_w );
extern UINT8 *horizon_scrollram;

View File

@ -705,7 +705,6 @@ $(MAMEOBJ)/irem.a: \
$(DRIVERS)/travrusa.o $(VIDEO)/travrusa.o \ $(DRIVERS)/travrusa.o $(VIDEO)/travrusa.o \
$(DRIVERS)/vigilant.o $(VIDEO)/vigilant.o \ $(DRIVERS)/vigilant.o $(VIDEO)/vigilant.o \
$(MACHINE)/irem_cpu.o \ $(MACHINE)/irem_cpu.o \
$(AUDIO)/fghtbskt.o \
$(AUDIO)/irem.o \ $(AUDIO)/irem.o \
$(MAMEOBJ)/itech.a: \ $(MAMEOBJ)/itech.a: \

View File

@ -13,9 +13,8 @@
#include "driver.h" #include "driver.h"
#include "m10.h" #include "m10.h"
static tilemap * tx_tilemap; static UINT32 extyoffs[32 * 8]; // FIXME: this should be moved to m10_state, but backlayout would have problems
static gfx_element * back_gfx;
static UINT32 extyoffs[32*8];
static const gfx_layout backlayout = static const gfx_layout backlayout =
{ {
@ -48,16 +47,20 @@ static UINT32 tilemap_scan(UINT32 col,UINT32 row,UINT32 num_cols,UINT32 num_rows
static void get_tile_info( running_machine *machine, tile_data *tileinfo, tilemap_memory_index tile_index, void *param ) static void get_tile_info( running_machine *machine, tile_data *tileinfo, tilemap_memory_index tile_index, void *param )
{ {
SET_TILE_INFO(0, videoram[tile_index], colorram[tile_index] & 0x07, 0); m10_state *state = (m10_state *)machine->driver_data;
SET_TILE_INFO(0, state->videoram[tile_index], state->colorram[tile_index] & 0x07, 0);
} }
WRITE8_HANDLER( m10_colorram_w ) WRITE8_HANDLER( m10_colorram_w )
{ {
if (colorram[offset] != data) m10_state *state = (m10_state *)space->machine->driver_data;
if (state->colorram[offset] != data)
{ {
tilemap_mark_tile_dirty(tx_tilemap, offset); tilemap_mark_tile_dirty(state->tx_tilemap, offset);
colorram[offset] = data; state->colorram[offset] = data;
} }
} }
@ -69,7 +72,7 @@ WRITE8_HANDLER( m10_chargen_w )
if (state->chargen[offset] != data) if (state->chargen[offset] != data)
{ {
state->chargen[offset] = data; state->chargen[offset] = data;
gfx_element_mark_dirty(back_gfx, offset >> (3+5)); gfx_element_mark_dirty(state->back_gfx, offset >> (3 + 5));
} }
} }
@ -93,8 +96,8 @@ INLINE void plot_pixel_m10(running_machine *machine, bitmap_t *bm, int x, int y,
if (!state->flip) if (!state->flip)
*BITMAP_ADDR16(bm, y, x) = col; *BITMAP_ADDR16(bm, y, x) = col;
else else
*BITMAP_ADDR16(bm, (IREMM10_VBSTART - 1)- (y - IREMM10_VBEND) + 6 *BITMAP_ADDR16(bm, (IREMM10_VBSTART - 1) - (y - IREMM10_VBEND) + 6,
, (IREMM10_HBSTART - 1)- (x- IREMM10_HBEND)) = col; // only when flip_screen(?) (IREMM10_HBSTART - 1) - (x - IREMM10_HBEND)) = col; // only when flip_screen(?)
} }
VIDEO_START( m10 ) VIDEO_START( m10 )
@ -105,14 +108,14 @@ VIDEO_START( m10 )
for (i = 0; i < 32 * 8; i++) for (i = 0; i < 32 * 8; i++)
extyoffs[i] = i * 8; extyoffs[i] = i * 8;
tx_tilemap = tilemap_create(machine, get_tile_info,tilemap_scan,8,8,32,32); state->tx_tilemap = tilemap_create(machine, get_tile_info, tilemap_scan, 8, 8, 32, 32);
tilemap_set_transparent_pen(tx_tilemap, 0); tilemap_set_transparent_pen(state->tx_tilemap, 0);
tilemap_set_scrolldx(tx_tilemap, 0, 62); tilemap_set_scrolldx(state->tx_tilemap, 0, 62);
tilemap_set_scrolldy(tx_tilemap, 0, 0); tilemap_set_scrolldy(state->tx_tilemap, 0, 0);
back_gfx = gfx_element_alloc(machine, &backlayout, state->chargen, 8, 0); state->back_gfx = gfx_element_alloc(machine, &backlayout, state->chargen, 8, 0);
machine->gfx[1] = back_gfx; machine->gfx[1] = state->back_gfx;
return ; return ;
} }
@ -122,9 +125,9 @@ VIDEO_START( m15 )
machine->gfx[0] = gfx_element_alloc(machine, &charlayout, state->chargen, 8, 0); machine->gfx[0] = gfx_element_alloc(machine, &charlayout, state->chargen, 8, 0);
tx_tilemap = tilemap_create(machine, get_tile_info,tilemap_scan,8,8,32,32); state->tx_tilemap = tilemap_create(machine, get_tile_info,tilemap_scan, 8, 8, 32, 32);
tilemap_set_scrolldx(tx_tilemap, 0, 116); tilemap_set_scrolldx(state->tx_tilemap, 0, 116);
tilemap_set_scrolldy(tx_tilemap, 0, 0); tilemap_set_scrolldy(state->tx_tilemap, 0, 0);
return ; return ;
} }
@ -134,6 +137,7 @@ VIDEO_START( m15 )
Draw the game screen in the given bitmap_t. Draw the game screen in the given bitmap_t.
***************************************************************************/ ***************************************************************************/
VIDEO_UPDATE( m10 ) VIDEO_UPDATE( m10 )
{ {
m10_state *state = (m10_state *)screen->machine->driver_data; m10_state *state = (m10_state *)screen->machine->driver_data;
@ -146,9 +150,9 @@ VIDEO_UPDATE( m10 )
for (i = 0; i < 4; i++) for (i = 0; i < 4; i++)
if (state->flip) if (state->flip)
drawgfx_opaque(bitmap, cliprect, back_gfx, i, color[i], 1, 1, 31*8 - xpos[i], 6); drawgfx_opaque(bitmap, cliprect, state->back_gfx, i, color[i], 1, 1, 31 * 8 - xpos[i], 6);
else else
drawgfx_opaque(bitmap, cliprect, back_gfx, i, color[i], 0, 0, xpos[i], 0); drawgfx_opaque(bitmap, cliprect, state->back_gfx, i, color[i], 0, 0, xpos[i], 0);
if (state->bottomline) if (state->bottomline)
{ {
@ -159,10 +163,10 @@ VIDEO_UPDATE( m10 )
} }
for (offs = videoram_size - 1; offs >= 0; offs--) for (offs = videoram_size - 1; offs >= 0; offs--)
tilemap_mark_tile_dirty(tx_tilemap, offs); tilemap_mark_tile_dirty(state->tx_tilemap, offs);
tilemap_set_flip(tx_tilemap, state->flip ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0); tilemap_set_flip(state->tx_tilemap, state->flip ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0);
tilemap_draw(bitmap,cliprect,tx_tilemap,0,0); tilemap_draw(bitmap, cliprect, state->tx_tilemap, 0, 0);
return 0; return 0;
} }
@ -173,18 +177,18 @@ VIDEO_UPDATE( m10 )
Draw the game screen in the given bitmap_t. Draw the game screen in the given bitmap_t.
***************************************************************************/ ***************************************************************************/
VIDEO_UPDATE( m15 ) VIDEO_UPDATE( m15 )
{ {
m10_state *state = (m10_state *)screen->machine->driver_data; m10_state *state = (m10_state *)screen->machine->driver_data;
int offs; int offs;
for (offs = videoram_size - 1; offs >= 0; offs--) for (offs = videoram_size - 1; offs >= 0; offs--)
tilemap_mark_tile_dirty(tx_tilemap, offs); tilemap_mark_tile_dirty(state->tx_tilemap, offs);
//tilemap_mark_all_tiles_dirty(tx_tilemap); //tilemap_mark_all_tiles_dirty(state->tx_tilemap);
tilemap_set_flip(tx_tilemap, state->flip ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0); tilemap_set_flip(state->tx_tilemap, state->flip ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0);
tilemap_draw(bitmap,cliprect,tx_tilemap,0,0); tilemap_draw(bitmap, cliprect, state->tx_tilemap, 0, 0);
return 0; return 0;
} }

View File

@ -5,19 +5,11 @@
***************************************************************************/ ***************************************************************************/
#include "driver.h" #include "driver.h"
#include "m52.h" #include "includes/iremz80.h"
#include "video/resnet.h" #include "video/resnet.h"
#define BGHEIGHT 64 #define BGHEIGHT 64
static UINT8 bg1xpos;
static UINT8 bg1ypos;
static UINT8 bg2xpos;
static UINT8 bg2ypos;
static UINT8 bgcontrol;
static tilemap* bg_tilemap;
/************************************* /*************************************
* *
@ -124,8 +116,9 @@ PALETTE_INIT( m52 )
static TILE_GET_INFO( get_tile_info ) static TILE_GET_INFO( get_tile_info )
{ {
UINT8 video = videoram[tile_index]; irem_z80_state *state = (irem_z80_state *)machine->driver_data;
UINT8 color = colorram[tile_index]; UINT8 video = state->videoram[tile_index];
UINT8 color = state->colorram[tile_index];
int flag = 0; int flag = 0;
int code = 0; int code = 0;
@ -155,18 +148,20 @@ static TILE_GET_INFO( get_tile_info )
VIDEO_START( m52 ) VIDEO_START( m52 )
{ {
bg_tilemap = tilemap_create(machine, get_tile_info, tilemap_scan_rows, 8, 8, 32, 32); irem_z80_state *state = (irem_z80_state *)machine->driver_data;
tilemap_set_transparent_pen(bg_tilemap, 0); state->bg_tilemap = tilemap_create(machine, get_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
tilemap_set_scrolldx(bg_tilemap, 128 - 1, -1);
tilemap_set_scrolldy(bg_tilemap, 16, 16);
tilemap_set_scroll_rows(bg_tilemap, 4); /* only lines 192-256 scroll */
state_save_register_global(machine, bg1xpos); tilemap_set_transparent_pen(state->bg_tilemap, 0);
state_save_register_global(machine, bg1ypos); tilemap_set_scrolldx(state->bg_tilemap, 128 - 1, -1);
state_save_register_global(machine, bg2xpos); tilemap_set_scrolldy(state->bg_tilemap, 16, 16);
state_save_register_global(machine, bg2ypos); tilemap_set_scroll_rows(state->bg_tilemap, 4); /* only lines 192-256 scroll */
state_save_register_global(machine, bgcontrol);
state_save_register_global(machine, state->bg1xpos);
state_save_register_global(machine, state->bg1ypos);
state_save_register_global(machine, state->bg2xpos);
state_save_register_global(machine, state->bg2ypos);
state_save_register_global(machine, state->bgcontrol);
} }
@ -179,7 +174,7 @@ VIDEO_START( m52 )
WRITE8_HANDLER( m52_scroll_w ) WRITE8_HANDLER( m52_scroll_w )
{ {
irem_z80_state *state = (irem_z80_state *)space->machine->driver_data;
/* /*
According to the schematics there is only one video register that holds the X scroll value According to the schematics there is only one video register that holds the X scroll value
with a NAND gate on the V64 and V128 lines to control when it's read, and when with a NAND gate on the V64 and V128 lines to control when it's read, and when
@ -187,10 +182,10 @@ WRITE8_HANDLER( m52_scroll_w )
So we set the first 3 quarters to 255 and the last to the scroll value So we set the first 3 quarters to 255 and the last to the scroll value
*/ */
tilemap_set_scrollx(bg_tilemap, 0, 255); tilemap_set_scrollx(state->bg_tilemap, 0, 255);
tilemap_set_scrollx(bg_tilemap, 1, 255); tilemap_set_scrollx(state->bg_tilemap, 1, 255);
tilemap_set_scrollx(bg_tilemap, 2, 255); tilemap_set_scrollx(state->bg_tilemap, 2, 255);
tilemap_set_scrollx(bg_tilemap, 3, -data); tilemap_set_scrollx(state->bg_tilemap, 3, -data);
} }
@ -203,15 +198,19 @@ WRITE8_HANDLER( m52_scroll_w )
WRITE8_HANDLER( m52_videoram_w ) WRITE8_HANDLER( m52_videoram_w )
{ {
videoram[offset] = data; irem_z80_state *state = (irem_z80_state *)space->machine->driver_data;
tilemap_mark_tile_dirty(bg_tilemap, offset);
state->videoram[offset] = data;
tilemap_mark_tile_dirty(state->bg_tilemap, offset);
} }
WRITE8_HANDLER( m52_colorram_w ) WRITE8_HANDLER( m52_colorram_w )
{ {
colorram[offset] = data; irem_z80_state *state = (irem_z80_state *)space->machine->driver_data;
tilemap_mark_tile_dirty(bg_tilemap, offset);
state->colorram[offset] = data;
tilemap_mark_tile_dirty(state->bg_tilemap, offset);
} }
@ -227,12 +226,13 @@ WRITE8_HANDLER( m52_colorram_w )
follows: result = popcount(value & 0x7f) ^ (value >> 7) */ follows: result = popcount(value & 0x7f) ^ (value >> 7) */
READ8_HANDLER( m52_protection_r ) READ8_HANDLER( m52_protection_r )
{ {
irem_z80_state *state = (irem_z80_state *)space->machine->driver_data;
int popcount = 0; int popcount = 0;
int temp; int temp;
for (temp = bg1xpos & 0x7f; temp != 0; temp >>= 1) for (temp = state->bg1xpos & 0x7f; temp != 0; temp >>= 1)
popcount += temp & 1; popcount += temp & 1;
return popcount ^ (bg1xpos >> 7); return popcount ^ (state->bg1xpos >> 7);
} }
@ -245,27 +245,32 @@ READ8_HANDLER( m52_protection_r )
WRITE8_HANDLER( m52_bg1ypos_w ) WRITE8_HANDLER( m52_bg1ypos_w )
{ {
bg1ypos = data; irem_z80_state *state = (irem_z80_state *)space->machine->driver_data;
state->bg1ypos = data;
} }
WRITE8_HANDLER( m52_bg1xpos_w ) WRITE8_HANDLER( m52_bg1xpos_w )
{ {
bg1xpos = data; irem_z80_state *state = (irem_z80_state *)space->machine->driver_data;
state->bg1xpos = data;
} }
WRITE8_HANDLER( m52_bg2xpos_w ) WRITE8_HANDLER( m52_bg2xpos_w )
{ {
bg2xpos = data; irem_z80_state *state = (irem_z80_state *)space->machine->driver_data;
state->bg2xpos = data;
} }
WRITE8_HANDLER( m52_bg2ypos_w ) WRITE8_HANDLER( m52_bg2ypos_w )
{ {
bg2ypos = data; irem_z80_state *state = (irem_z80_state *)space->machine->driver_data;
state->bg2ypos = data;
} }
WRITE8_HANDLER( m52_bgcontrol_w ) WRITE8_HANDLER( m52_bgcontrol_w )
{ {
bgcontrol = data; irem_z80_state *state = (irem_z80_state *)space->machine->driver_data;
state->bgcontrol = data;
} }
@ -357,35 +362,36 @@ static void draw_background(running_machine *machine, bitmap_t *bitmap, const re
VIDEO_UPDATE( m52 ) VIDEO_UPDATE( m52 )
{ {
irem_z80_state *state = (irem_z80_state *)screen->machine->driver_data;
int offs; int offs;
bitmap_fill(bitmap, cliprect, 0); bitmap_fill(bitmap, cliprect, 0);
if (!(bgcontrol & 0x20)) if (!(state->bgcontrol & 0x20))
{ {
if (!(bgcontrol & 0x10)) if (!(state->bgcontrol & 0x10))
draw_background(screen->machine, bitmap, cliprect, bg2xpos, bg2ypos, 2); /* distant mountains */ draw_background(screen->machine, bitmap, cliprect, state->bg2xpos, state->bg2ypos, 2); /* distant mountains */
if (!(bgcontrol & 0x02)) if (!(state->bgcontrol & 0x02))
draw_background(screen->machine, bitmap, cliprect, bg1xpos, bg1ypos, 3); /* hills */ draw_background(screen->machine, bitmap, cliprect, state->bg1xpos, state->bg1ypos, 3); /* hills */
if (!(bgcontrol & 0x04)) if (!(state->bgcontrol & 0x04))
draw_background(screen->machine, bitmap, cliprect, bg1xpos, bg1ypos, 4); /* cityscape */ draw_background(screen->machine, bitmap, cliprect, state->bg1xpos, state->bg1ypos, 4); /* cityscape */
} }
tilemap_set_flip(bg_tilemap, flip_screen_get(screen->machine) ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0); tilemap_set_flip(state->bg_tilemap, flip_screen_get(screen->machine) ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0);
tilemap_draw(bitmap, cliprect, bg_tilemap, 0, 0); tilemap_draw(bitmap, cliprect, state->bg_tilemap, 0, 0);
/* draw the sprites */ /* draw the sprites */
for (offs = 0xfc; offs >= 0; offs -= 4) for (offs = 0xfc; offs >= 0; offs -= 4)
{ {
int sy = 257 - spriteram[offs]; int sy = 257 - state->spriteram[offs];
int color = spriteram[offs + 1] & 0x3f; int color = state->spriteram[offs + 1] & 0x3f;
int flipx = spriteram[offs + 1] & 0x40; int flipx = state->spriteram[offs + 1] & 0x40;
int flipy = spriteram[offs + 1] & 0x80; int flipy = state->spriteram[offs + 1] & 0x80;
int code = spriteram[offs + 2]; int code = state->spriteram[offs + 2];
int sx = spriteram[offs + 3]; int sx = state->spriteram[offs + 3];
rectangle clip; rectangle clip;
/* sprites from offsets $00-$7F are processed in the upper half of the frame */ /* sprites from offsets $00-$7F are processed in the upper half of the frame */

View File

@ -5,13 +5,7 @@
****************************************************************************/ ****************************************************************************/
#include "driver.h" #include "driver.h"
#include "m57.h" #include "includes/iremz80.h"
UINT8 *m57_scroll;
static int flipscreen;
static tilemap *bg_tilemap;
/*************************************************************************** /***************************************************************************
@ -35,6 +29,7 @@ static tilemap *bg_tilemap;
bit 0 -- 1 kohm resistor -- BLUE bit 0 -- 1 kohm resistor -- BLUE
***************************************************************************/ ***************************************************************************/
PALETTE_INIT( m57 ) PALETTE_INIT( m57 )
{ {
int i; int i;
@ -116,8 +111,10 @@ PALETTE_INIT( m57 )
static TILE_GET_INFO( get_tile_info ) static TILE_GET_INFO( get_tile_info )
{ {
UINT8 attr = videoram[tile_index*2 + 0]; irem_z80_state *state = (irem_z80_state *)machine->driver_data;
UINT16 code = videoram[tile_index*2 + 1] | ((attr & 0xc0) << 2);
UINT8 attr = state->videoram[tile_index * 2 + 0];
UINT16 code = state->videoram[tile_index * 2 + 1] | ((attr & 0xc0) << 2);
SET_TILE_INFO(0, code, attr & 0x0f, TILE_FLIPXY(attr >> 4)); SET_TILE_INFO(0, code, attr & 0x0f, TILE_FLIPXY(attr >> 4));
} }
@ -131,8 +128,10 @@ static TILE_GET_INFO( get_tile_info )
WRITE8_HANDLER( m57_videoram_w ) WRITE8_HANDLER( m57_videoram_w )
{ {
videoram[offset] = data; irem_z80_state *state = (irem_z80_state *)space->machine->driver_data;
tilemap_mark_tile_dirty(bg_tilemap, offset / 2);
state->videoram[offset] = data;
tilemap_mark_tile_dirty(state->bg_tilemap, offset / 2);
} }
@ -144,8 +143,12 @@ WRITE8_HANDLER( m57_videoram_w )
VIDEO_START( m57 ) VIDEO_START( m57 )
{ {
bg_tilemap = tilemap_create(machine, get_tile_info, tilemap_scan_rows, 8, 8, 32, 32); irem_z80_state *state = (irem_z80_state *)machine->driver_data;
tilemap_set_scroll_rows(bg_tilemap, 256);
state->bg_tilemap = tilemap_create(machine, get_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
tilemap_set_scroll_rows(state->bg_tilemap, 256);
state_save_register_global(machine, state->flipscreen);
} }
@ -157,9 +160,11 @@ VIDEO_START( m57 )
WRITE8_HANDLER( m57_flipscreen_w ) WRITE8_HANDLER( m57_flipscreen_w )
{ {
irem_z80_state *state = (irem_z80_state *)space->machine->driver_data;
/* screen flip is handled both by software and hardware */ /* screen flip is handled both by software and hardware */
flipscreen = (data & 0x01) ^ (~input_port_read(space->machine, "DSW2") & 0x01); state->flipscreen = (data & 0x01) ^ (~input_port_read(space->machine, "DSW2") & 0x01);
tilemap_set_flip(bg_tilemap, flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); tilemap_set_flip(state->bg_tilemap, state->flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0);
coin_counter_w(0,data & 0x02); coin_counter_w(0,data & 0x02);
coin_counter_w(1,data & 0x20); coin_counter_w(1,data & 0x20);
@ -174,19 +179,20 @@ WRITE8_HANDLER( m57_flipscreen_w )
static void draw_background(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect) static void draw_background(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect)
{ {
irem_z80_state *state = (irem_z80_state *)machine->driver_data;
int y,x; int y,x;
INT16 scrolly; INT16 scrolly;
// from 64 to 127: not wrapped // from 64 to 127: not wrapped
for (y = 64; y < 128; y++) for (y = 64; y < 128; y++)
tilemap_set_scrollx(bg_tilemap, y, m57_scroll[0x40]); tilemap_set_scrollx(state->bg_tilemap, y, state->scrollram[0x40]);
tilemap_draw(bitmap, cliprect, bg_tilemap, 0, 0); tilemap_draw(bitmap, cliprect, state->bg_tilemap, 0, 0);
// from 128 to 255: wrapped // from 128 to 255: wrapped
for (y = 128; y <= cliprect->max_y; y++) for (y = 128; y <= cliprect->max_y; y++)
{ {
scrolly = m57_scroll[y] + (m57_scroll[y + 0x100] << 8); scrolly = state->scrollram[y] + (state->scrollram[y + 0x100] << 8);
if (scrolly >= 0) if (scrolly >= 0)
{ {
@ -217,15 +223,15 @@ static void draw_background(running_machine *machine, bitmap_t *bitmap, const re
static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect) static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect)
{ {
irem_z80_state *state = (irem_z80_state *)machine->driver_data;
int offs; int offs;
for (offs = spriteram_size - 4; offs >= 0; offs -= 4) for (offs = spriteram_size - 4; offs >= 0; offs -= 4)
{ {
UINT8 attributes = spriteram[offs+1]; UINT8 attributes = state->spriteram[offs + 1];
int sx = spriteram[offs+3]; int sx = state->spriteram[offs + 3];
int sy = ((224-spriteram[offs+0]-32)&0xff)+32; int sy = ((224 - state->spriteram[offs + 0] - 32) & 0xff) + 32;
int code = spriteram[offs+2]; int code = state->spriteram[offs + 2];
int color = attributes & 0x1f; int color = attributes & 0x1f;
int flipy = attributes & 0x80; int flipy = attributes & 0x80;
int flipx = attributes & 0x40; int flipx = attributes & 0x40;
@ -236,7 +242,7 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
if (code & 0x80) bank += 1; if (code & 0x80) bank += 1;
if (attributes & 0x20) bank += 2; if (attributes & 0x20) bank += 2;
if (flipscreen) if (state->flipscreen)
{ {
sx = 240 - sx; sx = 240 - sx;
sy = 224 - sy; sy = 224 - sy;

View File

@ -5,17 +5,9 @@
***************************************************************************/ ***************************************************************************/
#include "driver.h" #include "driver.h"
#include "m58.h" #include "includes/iremz80.h"
#include "video/resnet.h" #include "video/resnet.h"
UINT8 *yard_scroll_x_low;
UINT8 *yard_scroll_x_high;
UINT8 *yard_scroll_y_low;
UINT8 *yard_score_panel_disabled;
static bitmap_t *scroll_panel_bitmap;
static tilemap *bg_tilemap;
#define SCROLL_PANEL_WIDTH (14*4) #define SCROLL_PANEL_WIDTH (14*4)
#define RADAR_PALETTE_BASE (256) #define RADAR_PALETTE_BASE (256)
@ -113,19 +105,24 @@ PALETTE_INIT( yard )
WRITE8_HANDLER( yard_videoram_w ) WRITE8_HANDLER( yard_videoram_w )
{ {
videoram[offset] = data; irem_z80_state *state = (irem_z80_state *)space->machine->driver_data;
tilemap_mark_tile_dirty(bg_tilemap, offset / 2);
state->videoram[offset] = data;
tilemap_mark_tile_dirty(state->bg_tilemap, offset / 2);
} }
WRITE8_HANDLER( yard_scroll_panel_w ) WRITE8_HANDLER( yard_scroll_panel_w )
{ {
irem_z80_state *state = (irem_z80_state *)space->machine->driver_data;
int sx,sy,i; int sx,sy,i;
sx = ( offset % 16 ); sx = ( offset % 16 );
sy = ( offset / 16 ); sy = ( offset / 16 );
if (sx < 1 || sx > 14) return; if (sx < 1 || sx > 14)
return;
sx = 4 * (sx - 1); sx = 4 * (sx - 1);
@ -136,7 +133,7 @@ WRITE8_HANDLER( yard_scroll_panel_w )
col = (data >> i) & 0x11; col = (data >> i) & 0x11;
col = ((col >> 3) | col) & 3; col = ((col >> 3) | col) & 3;
*BITMAP_ADDR16(scroll_panel_bitmap, sy, sx + i) = RADAR_PALETTE_BASE + (sy & 0xfc) + col; *BITMAP_ADDR16(state->scroll_panel_bitmap, sy, sx + i) = RADAR_PALETTE_BASE + (sy & 0xfc) + col;
} }
} }
@ -150,9 +147,11 @@ WRITE8_HANDLER( yard_scroll_panel_w )
static TILE_GET_INFO( yard_get_bg_tile_info ) static TILE_GET_INFO( yard_get_bg_tile_info )
{ {
irem_z80_state *state = (irem_z80_state *)machine->driver_data;
int offs = tile_index * 2; int offs = tile_index * 2;
int attr = videoram[offs + 1]; int attr = state->videoram[offs + 1];
int code = videoram[offs] + ((attr & 0xc0) << 2); int code = state->videoram[offs] + ((attr & 0xc0) << 2);
int color = attr & 0x1f; int color = attr & 0x1f;
int flags = (attr & 0x20) ? TILE_FLIPX : 0; int flags = (attr & 0x20) ? TILE_FLIPX : 0;
@ -179,16 +178,18 @@ static UINT32 yard_tilemap_scan_rows( UINT32 col, UINT32 row, UINT32 num_cols, U
VIDEO_START( yard ) VIDEO_START( yard )
{ {
irem_z80_state *state = (irem_z80_state *)machine->driver_data;
int width = video_screen_get_width(machine->primary_screen); int width = video_screen_get_width(machine->primary_screen);
int height = video_screen_get_height(machine->primary_screen); int height = video_screen_get_height(machine->primary_screen);
bitmap_format format = video_screen_get_format(machine->primary_screen); bitmap_format format = video_screen_get_format(machine->primary_screen);
const rectangle *visarea = video_screen_get_visible_area(machine->primary_screen); const rectangle *visarea = video_screen_get_visible_area(machine->primary_screen);
bg_tilemap = tilemap_create(machine, yard_get_bg_tile_info, yard_tilemap_scan_rows, 8, 8, 64, 32); state->bg_tilemap = tilemap_create(machine, yard_get_bg_tile_info, yard_tilemap_scan_rows, 8, 8, 64, 32);
tilemap_set_scrolldx(bg_tilemap, visarea->min_x, width - (visarea->max_x + 1)); tilemap_set_scrolldx(state->bg_tilemap, visarea->min_x, width - (visarea->max_x + 1));
tilemap_set_scrolldy(bg_tilemap, visarea->min_y - 8, height + 16 - (visarea->max_y + 1)); tilemap_set_scrolldy(state->bg_tilemap, visarea->min_y - 8, height + 16 - (visarea->max_y + 1));
scroll_panel_bitmap = auto_bitmap_alloc(machine, SCROLL_PANEL_WIDTH, height, format); state->scroll_panel_bitmap = auto_bitmap_alloc(machine, SCROLL_PANEL_WIDTH, height, format);
} }
@ -220,20 +221,21 @@ WRITE8_HANDLER( yard_flipscreen_w )
static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect ) static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect )
{ {
irem_z80_state *state = (irem_z80_state *)machine->driver_data;
int offs; int offs;
const rectangle *visarea = video_screen_get_visible_area(machine->primary_screen); const rectangle *visarea = video_screen_get_visible_area(machine->primary_screen);
for (offs = spriteram_size - 4; offs >= 0; offs -= 4) for (offs = spriteram_size - 4; offs >= 0; offs -= 4)
{ {
int attr = spriteram[offs + 1]; int attr = state->spriteram[offs + 1];
int bank = (attr & 0x20) >> 5; int bank = (attr & 0x20) >> 5;
int code1 = spriteram[offs + 2] & 0xbf; int code1 = state->spriteram[offs + 2] & 0xbf;
int code2 = 0; int code2 = 0;
int color = attr & 0x1f; int color = attr & 0x1f;
int flipx = attr & 0x40; int flipx = attr & 0x40;
int flipy = attr & 0x80; int flipy = attr & 0x80;
int sx = spriteram[offs + 3]; int sx = state->spriteram[offs + 3];
int sy1 = 233 - spriteram[offs]; int sy1 = 233 - state->spriteram[offs];
int sy2 = 0; int sy2 = 0;
if (flipy) if (flipy)
@ -274,7 +276,9 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
static void draw_panel( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect ) static void draw_panel( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect )
{ {
if (! *yard_score_panel_disabled) irem_z80_state *state = (irem_z80_state *)machine->driver_data;
if (!*state->yard_score_panel_disabled)
{ {
static const rectangle clippanel = static const rectangle clippanel =
{ {
@ -295,7 +299,7 @@ static void draw_panel( running_machine *machine, bitmap_t *bitmap, const rectan
clip.max_y += visarea->max_y + yoffs; clip.max_y += visarea->max_y + yoffs;
sect_rect(&clip, cliprect); sect_rect(&clip, cliprect);
copybitmap(bitmap, scroll_panel_bitmap, flip_screen_get(machine), flip_screen_get(machine), copybitmap(bitmap, state->scroll_panel_bitmap, flip_screen_get(machine), flip_screen_get(machine),
sx, visarea->min_y + yoffs, &clip); sx, visarea->min_y + yoffs, &clip);
} }
} }
@ -310,10 +314,12 @@ static void draw_panel( running_machine *machine, bitmap_t *bitmap, const rectan
VIDEO_UPDATE( yard ) VIDEO_UPDATE( yard )
{ {
tilemap_set_scrollx(bg_tilemap, 0, (*yard_scroll_x_high * 0x100) + *yard_scroll_x_low); irem_z80_state *state = (irem_z80_state *)screen->machine->driver_data;
tilemap_set_scrolly(bg_tilemap, 0, *yard_scroll_y_low);
tilemap_draw(bitmap, cliprect, bg_tilemap, 0, 0); tilemap_set_scrollx(state->bg_tilemap, 0, (*state->yard_scroll_x_high * 0x100) + *state->yard_scroll_x_low);
tilemap_set_scrolly(state->bg_tilemap, 0, *state->yard_scroll_y_low);
tilemap_draw(bitmap, cliprect, state->bg_tilemap, 0, 0);
draw_sprites(screen->machine, bitmap, cliprect); draw_sprites(screen->machine, bitmap, cliprect);
draw_panel(screen->machine, bitmap, cliprect); draw_panel(screen->machine, bitmap, cliprect);
return 0; return 0;

View File

@ -14,32 +14,9 @@ Tile/sprite priority system (for the Kung Fu Master M62 board):
***************************************************************************/ ***************************************************************************/
#include "driver.h" #include "driver.h"
#include "m62.h" #include "includes/iremz80.h"
#include "video/resnet.h" #include "video/resnet.h"
UINT8 *m62_tileram;
UINT8 *m62_textram;
UINT8 *horizon_scrollram;
static tilemap *m62_background;
static tilemap *m62_foreground;
static UINT8 flipscreen;
static const UINT8 *sprite_height_prom;
static INT32 m62_background_hscroll;
static INT32 m62_background_vscroll;
static int ldrun3_topbottom_mask;
static UINT8 *irem_textram;
static size_t irem_textram_size;
static UINT8 kidniki_background_bank;
static INT32 kidniki_text_vscroll;
static INT32 spelunkr_palbank;
/*************************************************************************** /***************************************************************************
Convert the color PROMs into a more useable format. Convert the color PROMs into a more useable format.
@ -205,6 +182,7 @@ static const res_net_decode_info spelunk2_sprite_decode_info =
PALETTE_INIT( m62 ) PALETTE_INIT( m62 )
{ {
irem_z80_state *state = (irem_z80_state *)machine->driver_data;
rgb_t *rgb; rgb_t *rgb;
rgb = compute_res_net_all(color_prom, &m62_tile_decode_info, &m62_tile_net_info); rgb = compute_res_net_all(color_prom, &m62_tile_decode_info, &m62_tile_net_info);
@ -218,12 +196,13 @@ PALETTE_INIT( m62 )
palette_normalize_range(machine->palette, 0x000, 0x1ff, 0x00, 0xff); palette_normalize_range(machine->palette, 0x000, 0x1ff, 0x00, 0xff);
/* we'll need this at run time */ /* we'll need this at run time */
sprite_height_prom = color_prom + 0x600; state->sprite_height_prom = color_prom + 0x600;
} }
PALETTE_INIT( lotlot ) PALETTE_INIT( lotlot )
{ {
irem_z80_state *state = (irem_z80_state *)machine->driver_data;
rgb_t *rgb; rgb_t *rgb;
rgb = compute_res_net_all(color_prom, &lotlot_tile_decode_info, &m62_tile_net_info); rgb = compute_res_net_all(color_prom, &lotlot_tile_decode_info, &m62_tile_net_info);
@ -237,12 +216,13 @@ PALETTE_INIT( lotlot )
palette_normalize_range(machine->palette, 0x000, 0x2ff, 0x00, 0xff); palette_normalize_range(machine->palette, 0x000, 0x2ff, 0x00, 0xff);
/* we'll need this at run time */ /* we'll need this at run time */
sprite_height_prom = color_prom + 0x900; state->sprite_height_prom = color_prom + 0x900;
} }
PALETTE_INIT( battroad ) PALETTE_INIT( battroad )
{ {
irem_z80_state *state = (irem_z80_state *)machine->driver_data;
rgb_t *rgb; rgb_t *rgb;
rgb = compute_res_net_all(color_prom, &m62_tile_decode_info, &m62_tile_net_info); rgb = compute_res_net_all(color_prom, &m62_tile_decode_info, &m62_tile_net_info);
@ -259,12 +239,13 @@ PALETTE_INIT( battroad )
palette_normalize_range(machine->palette, 0x000, 0x21f, 0x00, 0xff); palette_normalize_range(machine->palette, 0x000, 0x21f, 0x00, 0xff);
sprite_height_prom = color_prom + 0x620; /* we'll need this at run time */ state->sprite_height_prom = color_prom + 0x620; /* we'll need this at run time */
} }
PALETTE_INIT( spelunk2 ) PALETTE_INIT( spelunk2 )
{ {
irem_z80_state *state = (irem_z80_state *)machine->driver_data;
rgb_t *rgb; rgb_t *rgb;
rgb = compute_res_net_all(color_prom, &spelunk2_tile_decode_info, &m62_tile_net_info); rgb = compute_res_net_all(color_prom, &spelunk2_tile_decode_info, &m62_tile_net_info);
@ -278,29 +259,33 @@ PALETTE_INIT( spelunk2 )
palette_normalize_range(machine->palette, 0x000, 0x2ff, 0x00, 0xff); palette_normalize_range(machine->palette, 0x000, 0x2ff, 0x00, 0xff);
/* we'll need this at run time */ /* we'll need this at run time */
sprite_height_prom = color_prom + 0x700; state->sprite_height_prom = color_prom + 0x700;
} }
static void register_savestate( running_machine *machine ) static void register_savestate( running_machine *machine )
{ {
state_save_register_global(machine, flipscreen); irem_z80_state *state = (irem_z80_state *)machine->driver_data;
state_save_register_global(machine, kidniki_background_bank);
state_save_register_global(machine, m62_background_hscroll); state_save_register_global(machine, state->flipscreen);
state_save_register_global(machine, m62_background_vscroll); state_save_register_global(machine, state->m62_background_hscroll);
state_save_register_global(machine, kidniki_text_vscroll); state_save_register_global(machine, state->m62_background_vscroll);
state_save_register_global(machine, spelunkr_palbank);
state_save_register_global_pointer(machine, irem_textram, irem_textram_size); state_save_register_global(machine, state->kidniki_background_bank);
state_save_register_global(machine, state->kidniki_text_vscroll);
state_save_register_global(machine, state->ldrun3_topbottom_mask);
state_save_register_global(machine, state->spelunkr_palbank);
} }
WRITE8_HANDLER( m62_flipscreen_w ) WRITE8_HANDLER( m62_flipscreen_w )
{ {
irem_z80_state *state = (irem_z80_state *)space->machine->driver_data;
/* screen flip is handled both by software and hardware */ /* screen flip is handled both by software and hardware */
data ^= ~input_port_read(space->machine, "DSW2") & 1; data ^= ~input_port_read(space->machine, "DSW2") & 1;
flipscreen = data & 0x01; state->flipscreen = data & 0x01;
if (flipscreen) if (state->flipscreen)
tilemap_set_flip_all(space->machine, TILEMAP_FLIPX | TILEMAP_FLIPY); tilemap_set_flip_all(space->machine, TILEMAP_FLIPX | TILEMAP_FLIPY);
else else
tilemap_set_flip_all(space->machine, 0); tilemap_set_flip_all(space->machine, 0);
@ -311,55 +296,62 @@ WRITE8_HANDLER( m62_flipscreen_w )
WRITE8_HANDLER( m62_hscroll_low_w ) WRITE8_HANDLER( m62_hscroll_low_w )
{ {
m62_background_hscroll = ( m62_background_hscroll & 0xff00 ) | data; irem_z80_state *state = (irem_z80_state *)space->machine->driver_data;
state->m62_background_hscroll = (state->m62_background_hscroll & 0xff00) | data;
} }
WRITE8_HANDLER( m62_hscroll_high_w ) WRITE8_HANDLER( m62_hscroll_high_w )
{ {
m62_background_hscroll = ( m62_background_hscroll & 0xff ) | ( data << 8 ); irem_z80_state *state = (irem_z80_state *)space->machine->driver_data;
state->m62_background_hscroll = (state->m62_background_hscroll & 0xff) | (data << 8);
} }
WRITE8_HANDLER( m62_vscroll_low_w ) WRITE8_HANDLER( m62_vscroll_low_w )
{ {
m62_background_vscroll = ( m62_background_vscroll & 0xff00 ) | data; irem_z80_state *state = (irem_z80_state *)space->machine->driver_data;
state->m62_background_vscroll = (state->m62_background_vscroll & 0xff00) | data;
} }
WRITE8_HANDLER( m62_vscroll_high_w ) WRITE8_HANDLER( m62_vscroll_high_w )
{ {
m62_background_vscroll = ( m62_background_vscroll & 0xff ) | ( data << 8 ); irem_z80_state *state = (irem_z80_state *)space->machine->driver_data;
state->m62_background_vscroll = (state->m62_background_vscroll & 0xff) | (data << 8);
} }
WRITE8_HANDLER( m62_tileram_w ) WRITE8_HANDLER( m62_tileram_w )
{ {
m62_tileram[ offset ] = data; irem_z80_state *state = (irem_z80_state *)space->machine->driver_data;
tilemap_mark_tile_dirty( m62_background, offset >> 1 ); state->m62_tileram[offset] = data;
tilemap_mark_tile_dirty(state->bg_tilemap, offset >> 1);
} }
WRITE8_HANDLER( m62_textram_w ) WRITE8_HANDLER( m62_textram_w )
{ {
m62_textram[ offset ] = data; irem_z80_state *state = (irem_z80_state *)space->machine->driver_data;
tilemap_mark_tile_dirty( m62_foreground, offset >> 1 ); state->m62_textram[offset] = data;
tilemap_mark_tile_dirty(state->fg_tilemap, offset >> 1);
} }
static void draw_sprites( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect, int colormask, int prioritymask, int priority ) static void draw_sprites( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect, int colormask, int prioritymask, int priority )
{ {
irem_z80_state *state = (irem_z80_state *)machine->driver_data;
int offs; int offs;
for (offs = 0; offs < spriteram_size; offs += 8) for (offs = 0; offs < spriteram_size; offs += 8)
{ {
int i, incr, code, col, flipx, flipy, sx, sy; int i, incr, code, col, flipx, flipy, sx, sy;
if( ( spriteram[offs] & prioritymask ) == priority ) if ((state->spriteram[offs] & prioritymask) == priority)
{ {
code = spriteram[offs+4] + ((spriteram[offs+5] & 0x07) << 8); code = state->spriteram[offs + 4] + ((state->spriteram[offs + 5] & 0x07) << 8);
col = spriteram[offs+0] & colormask; col = state->spriteram[offs + 0] & colormask;
sx = 256 * (spriteram[offs+7] & 1) + spriteram[offs+6], sx = 256 * (state->spriteram[offs + 7] & 1) + state->spriteram[offs + 6],
sy = 256+128-15 - (256 * (spriteram[offs+3] & 1) + spriteram[offs+2]), sy = 256 + 128 - 15 - (256 * (state->spriteram[offs + 3] & 1) + state->spriteram[offs + 2]),
flipx = spriteram[offs+5] & 0x40; flipx = state->spriteram[offs + 5] & 0x40;
flipy = spriteram[offs+5] & 0x80; flipy = state->spriteram[offs + 5] & 0x80;
i = sprite_height_prom[(code >> 5) & 0x1f]; i = state->sprite_height_prom[(code >> 5) & 0x1f];
if (i == 1) /* double height */ if (i == 1) /* double height */
{ {
code &= ~1; code &= ~1;
@ -372,7 +364,7 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
sy -= 3*16; sy -= 3*16;
} }
if (flipscreen) if (state->flipscreen)
{ {
sx = 496 - sx; sx = 496 - sx;
sy = 242 - i*16 - sy; /* sprites are slightly misplaced by the hardware */ sy = 242 - i*16 - sy; /* sprites are slightly misplaced by the hardware */
@ -402,50 +394,45 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
static void m62_start( running_machine *machine, tile_get_info_func tile_get_info, int rows, int cols, int x1, int y1, int x2, int y2 ) static void m62_start( running_machine *machine, tile_get_info_func tile_get_info, int rows, int cols, int x1, int y1, int x2, int y2 )
{ {
m62_background = tilemap_create( machine, tile_get_info, tilemap_scan_rows, x1, y1, x2, y2 ); irem_z80_state *state = (irem_z80_state *)machine->driver_data;
state->bg_tilemap = tilemap_create(machine, tile_get_info, tilemap_scan_rows, x1, y1, x2, y2);
m62_background_hscroll = 0;
m62_background_vscroll = 0;
register_savestate(machine); register_savestate(machine);
if (rows != 0) if (rows != 0)
{ tilemap_set_scroll_rows(state->bg_tilemap, rows);
tilemap_set_scroll_rows( m62_background, rows );
}
if (cols != 0) if (cols != 0)
{ tilemap_set_scroll_cols(state->bg_tilemap, cols);
tilemap_set_scroll_cols( m62_background, cols );
}
} }
static void m62_textlayer( running_machine *machine, tile_get_info_func tile_get_info, int rows, int cols, int x1, int y1, int x2, int y2 ) static void m62_textlayer( running_machine *machine, tile_get_info_func tile_get_info, int rows, int cols, int x1, int y1, int x2, int y2 )
{ {
m62_foreground = tilemap_create( machine, tile_get_info, tilemap_scan_rows, x1, y1, x2, y2 ); irem_z80_state *state = (irem_z80_state *)machine->driver_data;
state->fg_tilemap = tilemap_create(machine, tile_get_info, tilemap_scan_rows, x1, y1, x2, y2);
if (rows != 0) if (rows != 0)
{ tilemap_set_scroll_rows(state->fg_tilemap, rows);
tilemap_set_scroll_rows( m62_foreground, rows );
}
if (cols != 0) if (cols != 0)
{ tilemap_set_scroll_cols(state->fg_tilemap, cols);
tilemap_set_scroll_cols( m62_foreground, cols );
}
} }
WRITE8_HANDLER( kungfum_tileram_w ) WRITE8_HANDLER( kungfum_tileram_w )
{ {
m62_tileram[ offset ] = data; irem_z80_state *state = (irem_z80_state *)space->machine->driver_data;
tilemap_mark_tile_dirty( m62_background, offset & 0x7ff ); state->m62_tileram[offset] = data;
tilemap_mark_tile_dirty(state->bg_tilemap, offset & 0x7ff);
} }
static TILE_GET_INFO( get_kungfum_bg_tile_info ) static TILE_GET_INFO( get_kungfum_bg_tile_info )
{ {
irem_z80_state *state = (irem_z80_state *)machine->driver_data;
int code; int code;
int color; int color;
int flags; int flags;
code = m62_tileram[ tile_index ]; code = state->m62_tileram[tile_index];
color = m62_tileram[ tile_index + 0x800 ]; color = state->m62_tileram[tile_index + 0x800];
flags = 0; flags = 0;
if ((color & 0x20)) if ((color & 0x20))
{ {
@ -455,14 +442,10 @@ static TILE_GET_INFO( get_kungfum_bg_tile_info )
/* is the following right? */ /* is the following right? */
if ((tile_index / 64) < 6 || ((color & 0x1f) >> 1) > 0x0c) if ((tile_index / 64) < 6 || ((color & 0x1f) >> 1) > 0x0c)
{
tileinfo->category = 1; tileinfo->category = 1;
}
else else
{
tileinfo->category = 0; tileinfo->category = 0;
} }
}
VIDEO_START( kungfum ) VIDEO_START( kungfum )
{ {
@ -471,30 +454,32 @@ VIDEO_START( kungfum )
VIDEO_UPDATE( kungfum ) VIDEO_UPDATE( kungfum )
{ {
irem_z80_state *state = (irem_z80_state *)screen->machine->driver_data;
int i; int i;
for (i = 0; i < 6; i++) for (i = 0; i < 6; i++)
{ {
tilemap_set_scrollx( m62_background, i, 0 ); tilemap_set_scrollx(state->bg_tilemap, i, 0);
} }
for (i = 6; i < 32; i++) for (i = 6; i < 32; i++)
{ {
tilemap_set_scrollx( m62_background, i, m62_background_hscroll ); tilemap_set_scrollx(state->bg_tilemap, i, state->m62_background_hscroll);
} }
tilemap_draw( bitmap, cliprect, m62_background, 0, 0 ); tilemap_draw(bitmap, cliprect, state->bg_tilemap, 0, 0);
draw_sprites(screen->machine, bitmap, cliprect, 0x1f, 0x00, 0x00); draw_sprites(screen->machine, bitmap, cliprect, 0x1f, 0x00, 0x00);
tilemap_draw( bitmap, cliprect, m62_background, 1, 0 ); tilemap_draw(bitmap, cliprect, state->bg_tilemap, 1, 0);
return 0; return 0;
} }
static TILE_GET_INFO( get_ldrun_bg_tile_info ) static TILE_GET_INFO( get_ldrun_bg_tile_info )
{ {
irem_z80_state *state = (irem_z80_state *)machine->driver_data;
int code; int code;
int color; int color;
int flags; int flags;
code = m62_tileram[ tile_index << 1 ]; code = state->m62_tileram[tile_index << 1];
color = m62_tileram[ ( tile_index << 1 ) | 1 ]; color = state->m62_tileram[(tile_index << 1) | 1];
flags = 0; flags = 0;
if ((color & 0x20)) if ((color & 0x20))
{ {
@ -502,41 +487,41 @@ static TILE_GET_INFO( get_ldrun_bg_tile_info )
} }
SET_TILE_INFO(0, code | ((color & 0xc0) << 2), color & 0x1f, flags); SET_TILE_INFO(0, code | ((color & 0xc0) << 2), color & 0x1f, flags);
if (((color & 0x1f) >> 1) >= 0x0c) if (((color & 0x1f) >> 1) >= 0x0c)
{
tileinfo->group = 1; tileinfo->group = 1;
}
else else
{
tileinfo->group = 0; tileinfo->group = 0;
} }
}
VIDEO_START( ldrun ) VIDEO_START( ldrun )
{ {
irem_z80_state *state = (irem_z80_state *)machine->driver_data;
m62_start(machine, get_ldrun_bg_tile_info, 1, 1, 8, 8, 64, 32); m62_start(machine, get_ldrun_bg_tile_info, 1, 1, 8, 8, 64, 32);
tilemap_set_transmask(m62_background,0,0xffff,0x0000); /* split type 0 is totally transparent in front half */ tilemap_set_transmask(state->bg_tilemap, 0, 0xffff, 0x0000); /* split type 0 is totally transparent in front half */
tilemap_set_transmask(m62_background,1,0x0001,0xfffe); /* split type 1 has pen 0 transparent in front half */ tilemap_set_transmask(state->bg_tilemap, 1, 0x0001, 0xfffe); /* split type 1 has pen 0 transparent in front half */
} }
VIDEO_UPDATE( ldrun ) VIDEO_UPDATE( ldrun )
{ {
tilemap_set_scrollx( m62_background, 0, m62_background_hscroll ); irem_z80_state *state = (irem_z80_state *)screen->machine->driver_data;
tilemap_set_scrolly( m62_background, 0, m62_background_vscroll ); tilemap_set_scrollx(state->bg_tilemap, 0, state->m62_background_hscroll);
tilemap_set_scrolly(state->bg_tilemap, 0, state->m62_background_vscroll);
tilemap_draw( bitmap, cliprect, m62_background, TILEMAP_DRAW_LAYER1, 0 ); tilemap_draw(bitmap, cliprect, state->bg_tilemap, TILEMAP_DRAW_LAYER1, 0);
draw_sprites(screen->machine, bitmap, cliprect, 0x0f, 0x10, 0x00); draw_sprites(screen->machine, bitmap, cliprect, 0x0f, 0x10, 0x00);
tilemap_draw( bitmap, cliprect, m62_background, TILEMAP_DRAW_LAYER0, 0 ); tilemap_draw(bitmap, cliprect, state->bg_tilemap, TILEMAP_DRAW_LAYER0, 0);
draw_sprites(screen->machine, bitmap, cliprect, 0x0f, 0x10, 0x10); draw_sprites(screen->machine, bitmap, cliprect, 0x0f, 0x10, 0x10);
return 0; return 0;
} }
static TILE_GET_INFO( get_ldrun2_bg_tile_info ) static TILE_GET_INFO( get_ldrun2_bg_tile_info )
{ {
irem_z80_state *state = (irem_z80_state *)machine->driver_data;
int code; int code;
int color; int color;
int flags; int flags;
code = m62_tileram[ tile_index << 1 ]; code = state->m62_tileram[tile_index << 1];
color = m62_tileram[ ( tile_index << 1 ) | 1 ]; color = state->m62_tileram[(tile_index << 1) | 1];
flags = 0; flags = 0;
if ((color & 0x20)) if ((color & 0x20))
{ {
@ -544,34 +529,32 @@ static TILE_GET_INFO( get_ldrun2_bg_tile_info )
} }
SET_TILE_INFO(0, code | ((color & 0xc0) << 2), color & 0x1f, flags); SET_TILE_INFO(0, code | ((color & 0xc0) << 2), color & 0x1f, flags);
if (((color & 0x1f) >> 1) >= 0x04) if (((color & 0x1f) >> 1) >= 0x04)
{
tileinfo->group = 1; tileinfo->group = 1;
}
else else
{
tileinfo->group = 0; tileinfo->group = 0;
} }
}
VIDEO_START( ldrun2 ) VIDEO_START( ldrun2 )
{ {
irem_z80_state *state = (irem_z80_state *)machine->driver_data;
m62_start(machine, get_ldrun2_bg_tile_info, 1, 1, 8, 8, 64, 32); m62_start(machine, get_ldrun2_bg_tile_info, 1, 1, 8, 8, 64, 32);
tilemap_set_transmask(m62_background,0,0xffff,0x0000); /* split type 0 is totally transparent in front half */ tilemap_set_transmask(state->bg_tilemap, 0, 0xffff, 0x0000); /* split type 0 is totally transparent in front half */
tilemap_set_transmask(m62_background,1,0x0001,0xfffe); /* split type 1 has pen 0 transparent in front half */ tilemap_set_transmask(state->bg_tilemap, 1, 0x0001, 0xfffe); /* split type 1 has pen 0 transparent in front half */
} }
WRITE8_HANDLER( ldrun3_topbottom_mask_w ) WRITE8_HANDLER( ldrun3_topbottom_mask_w )
{ {
ldrun3_topbottom_mask = data & 1; irem_z80_state *state = (irem_z80_state *)space->machine->driver_data;
state->ldrun3_topbottom_mask = data & 1;
} }
VIDEO_UPDATE( ldrun3 ) VIDEO_UPDATE( ldrun3 )
{ {
irem_z80_state *state = (irem_z80_state *)screen->machine->driver_data;
VIDEO_UPDATE_CALL(ldrun); VIDEO_UPDATE_CALL(ldrun);
if (ldrun3_topbottom_mask) if (state->ldrun3_topbottom_mask)
{ {
rectangle my_cliprect = *cliprect; rectangle my_cliprect = *cliprect;
@ -590,11 +573,12 @@ VIDEO_UPDATE( ldrun3 )
static TILE_GET_INFO( get_battroad_bg_tile_info ) static TILE_GET_INFO( get_battroad_bg_tile_info )
{ {
irem_z80_state *state = (irem_z80_state *)machine->driver_data;
int code; int code;
int color; int color;
int flags; int flags;
code = m62_tileram[ tile_index << 1 ]; code = state->m62_tileram[tile_index << 1];
color = m62_tileram[ ( tile_index << 1 ) | 1 ]; color = state->m62_tileram[(tile_index << 1) | 1];
flags = 0; flags = 0;
if ((color & 0x20)) if ((color & 0x20))
{ {
@ -602,45 +586,44 @@ static TILE_GET_INFO( get_battroad_bg_tile_info )
} }
SET_TILE_INFO(0, code | ((color & 0x40) << 3) | ((color & 0x10) << 4), color & 0x0f, flags); SET_TILE_INFO(0, code | ((color & 0x40) << 3) | ((color & 0x10) << 4), color & 0x0f, flags);
if (((color & 0x1f) >> 1) >= 0x04) if (((color & 0x1f) >> 1) >= 0x04)
{
tileinfo->group = 1; tileinfo->group = 1;
}
else else
{
tileinfo->group = 0; tileinfo->group = 0;
} }
}
static TILE_GET_INFO( get_battroad_fg_tile_info ) static TILE_GET_INFO( get_battroad_fg_tile_info )
{ {
irem_z80_state *state = (irem_z80_state *)machine->driver_data;
int code; int code;
int color; int color;
code = m62_textram[ tile_index << 1 ]; code = state->m62_textram[tile_index << 1];
color = m62_textram[ ( tile_index << 1 ) | 1 ]; color = state->m62_textram[(tile_index << 1) | 1];
SET_TILE_INFO(2, code | ((color & 0x40) << 3) | ((color & 0x10) << 4), color & 0x0f, 0); SET_TILE_INFO(2, code | ((color & 0x40) << 3) | ((color & 0x10) << 4), color & 0x0f, 0);
} }
VIDEO_START( battroad ) VIDEO_START( battroad )
{ {
irem_z80_state *state = (irem_z80_state *)machine->driver_data;
m62_start(machine, get_battroad_bg_tile_info, 1, 1, 8, 8, 64, 32); m62_start(machine, get_battroad_bg_tile_info, 1, 1, 8, 8, 64, 32);
m62_textlayer(machine, get_battroad_fg_tile_info, 1, 1, 8, 8, 32, 32); m62_textlayer(machine, get_battroad_fg_tile_info, 1, 1, 8, 8, 32, 32);
tilemap_set_transmask(m62_background,0,0xffff,0x0000); /* split type 0 is totally transparent in front half */ tilemap_set_transmask(state->bg_tilemap, 0, 0xffff, 0x0000); /* split type 0 is totally transparent in front half */
tilemap_set_transmask(m62_background,1,0x0001,0xfffe); /* split type 1 has pen 0 transparent in front half */ tilemap_set_transmask(state->bg_tilemap, 1, 0x0001, 0xfffe); /* split type 1 has pen 0 transparent in front half */
} }
VIDEO_UPDATE( battroad ) VIDEO_UPDATE( battroad )
{ {
tilemap_set_scrollx( m62_background, 0, m62_background_hscroll ); irem_z80_state *state = (irem_z80_state *)screen->machine->driver_data;
tilemap_set_scrolly( m62_background, 0, m62_background_vscroll ); tilemap_set_scrollx(state->bg_tilemap, 0, state->m62_background_hscroll);
tilemap_set_scrollx( m62_foreground, 0, 128 ); tilemap_set_scrolly(state->bg_tilemap, 0, state->m62_background_vscroll);
tilemap_set_scrolly( m62_foreground, 0, 0 ); tilemap_set_scrollx(state->fg_tilemap, 0, 128);
tilemap_set_transparent_pen( m62_foreground, 0 ); tilemap_set_scrolly(state->fg_tilemap, 0, 0);
tilemap_set_transparent_pen(state->fg_tilemap, 0);
tilemap_draw( bitmap, cliprect, m62_background, TILEMAP_DRAW_LAYER1, 0 ); tilemap_draw(bitmap, cliprect, state->bg_tilemap, TILEMAP_DRAW_LAYER1, 0);
draw_sprites(screen->machine, bitmap, cliprect, 0x0f, 0x10, 0x00); draw_sprites(screen->machine, bitmap, cliprect, 0x0f, 0x10, 0x00);
tilemap_draw( bitmap, cliprect, m62_background, TILEMAP_DRAW_LAYER0, 0 ); tilemap_draw(bitmap, cliprect, state->bg_tilemap, TILEMAP_DRAW_LAYER0, 0);
draw_sprites(screen->machine, bitmap, cliprect, 0x0f, 0x10, 0x10); draw_sprites(screen->machine, bitmap, cliprect, 0x0f, 0x10, 0x10);
tilemap_draw( bitmap, cliprect, m62_foreground, 0, 0 ); tilemap_draw(bitmap, cliprect, state->fg_tilemap, 0, 0);
return 0; return 0;
} }
@ -649,10 +632,11 @@ VIDEO_UPDATE( battroad )
/* no char x flip, and more sprites */ /* no char x flip, and more sprites */
static TILE_GET_INFO( get_ldrun4_bg_tile_info ) static TILE_GET_INFO( get_ldrun4_bg_tile_info )
{ {
irem_z80_state *state = (irem_z80_state *)machine->driver_data;
int code; int code;
int color; int color;
code = m62_tileram[ tile_index << 1 ]; code = state->m62_tileram[tile_index << 1];
color = m62_tileram[ ( tile_index << 1 ) | 1 ]; color = state->m62_tileram[(tile_index << 1) | 1];
SET_TILE_INFO(0, code | ((color & 0xc0) << 2) | ((color & 0x20) << 5), color & 0x1f, 0); SET_TILE_INFO(0, code | ((color & 0xc0) << 2) | ((color & 0x20) << 5), color & 0x1f, 0);
} }
@ -663,9 +647,10 @@ VIDEO_START( ldrun4 )
VIDEO_UPDATE( ldrun4 ) VIDEO_UPDATE( ldrun4 )
{ {
tilemap_set_scrollx( m62_background, 0, m62_background_hscroll-2 ); irem_z80_state *state = (irem_z80_state *)screen->machine->driver_data;
tilemap_set_scrollx(state->bg_tilemap, 0, state->m62_background_hscroll - 2);
tilemap_draw( bitmap, cliprect, m62_background, 0, 0 ); tilemap_draw(bitmap, cliprect, state->bg_tilemap, 0, 0);
draw_sprites(screen->machine, bitmap, cliprect, 0x1f, 0x00, 0x00); draw_sprites(screen->machine, bitmap, cliprect, 0x1f, 0x00, 0x00);
return 0; return 0;
} }
@ -673,11 +658,12 @@ VIDEO_UPDATE( ldrun4 )
static TILE_GET_INFO( get_lotlot_bg_tile_info ) static TILE_GET_INFO( get_lotlot_bg_tile_info )
{ {
irem_z80_state *state = (irem_z80_state *)machine->driver_data;
int code; int code;
int color; int color;
int flags; int flags;
code = m62_tileram[ tile_index << 1 ]; code = state->m62_tileram[tile_index << 1];
color = m62_tileram[ ( tile_index << 1 ) | 1 ]; color = state->m62_tileram[(tile_index << 1) | 1];
flags = 0; flags = 0;
if ((color & 0x20)) if ((color & 0x20))
{ {
@ -688,10 +674,11 @@ static TILE_GET_INFO( get_lotlot_bg_tile_info )
static TILE_GET_INFO( get_lotlot_fg_tile_info ) static TILE_GET_INFO( get_lotlot_fg_tile_info )
{ {
irem_z80_state *state = (irem_z80_state *)machine->driver_data;
int code; int code;
int color; int color;
code = m62_textram[ tile_index << 1 ]; code = state->m62_textram[tile_index << 1];
color = m62_textram[ ( tile_index << 1 ) | 1 ]; color = state->m62_textram[(tile_index << 1) | 1];
SET_TILE_INFO(2, code | ((color & 0xc0) << 2), color & 0x1f, 0); SET_TILE_INFO(2, code | ((color & 0xc0) << 2), color & 0x1f, 0);
} }
@ -703,14 +690,15 @@ VIDEO_START( lotlot )
VIDEO_UPDATE( lotlot ) VIDEO_UPDATE( lotlot )
{ {
tilemap_set_scrollx( m62_background, 0, m62_background_hscroll - 64 ); irem_z80_state *state = (irem_z80_state *)screen->machine->driver_data;
tilemap_set_scrolly( m62_background, 0, m62_background_vscroll + 32 ); tilemap_set_scrollx(state->bg_tilemap, 0, state->m62_background_hscroll - 64);
tilemap_set_scrollx( m62_foreground, 0, -64 ); tilemap_set_scrolly(state->bg_tilemap, 0, state->m62_background_vscroll + 32);
tilemap_set_scrolly( m62_foreground, 0, 32 ); tilemap_set_scrollx(state->fg_tilemap, 0, -64);
tilemap_set_transparent_pen( m62_foreground, 0 ); tilemap_set_scrolly(state->fg_tilemap, 0, 32);
tilemap_set_transparent_pen(state->fg_tilemap, 0);
tilemap_draw( bitmap, cliprect, m62_background, 0, 0 ); tilemap_draw(bitmap, cliprect, state->bg_tilemap, 0, 0);
tilemap_draw( bitmap, cliprect, m62_foreground, 0, 0 ); tilemap_draw(bitmap, cliprect, state->fg_tilemap, 0, 0);
draw_sprites(screen->machine, bitmap, cliprect, 0x1f, 0x00, 0x00); draw_sprites(screen->machine, bitmap, cliprect, 0x1f, 0x00, 0x00);
return 0; return 0;
} }
@ -718,51 +706,54 @@ VIDEO_UPDATE( lotlot )
WRITE8_HANDLER( kidniki_text_vscroll_low_w ) WRITE8_HANDLER( kidniki_text_vscroll_low_w )
{ {
kidniki_text_vscroll = (kidniki_text_vscroll & 0xff00) | data; irem_z80_state *state = (irem_z80_state *)space->machine->driver_data;
state->kidniki_text_vscroll = (state->kidniki_text_vscroll & 0xff00) | data;
} }
WRITE8_HANDLER( kidniki_text_vscroll_high_w ) WRITE8_HANDLER( kidniki_text_vscroll_high_w )
{ {
kidniki_text_vscroll = (kidniki_text_vscroll & 0xff) | (data << 8); irem_z80_state *state = (irem_z80_state *)space->machine->driver_data;
state->kidniki_text_vscroll = (state->kidniki_text_vscroll & 0xff) | (data << 8);
} }
WRITE8_HANDLER( kidniki_background_bank_w ) WRITE8_HANDLER( kidniki_background_bank_w )
{ {
if (kidniki_background_bank != (data & 1)) irem_z80_state *state = (irem_z80_state *)space->machine->driver_data;
if (state->kidniki_background_bank != (data & 1))
{ {
kidniki_background_bank = data & 1; state->kidniki_background_bank = data & 1;
tilemap_mark_all_tiles_dirty(m62_background); tilemap_mark_all_tiles_dirty(state->bg_tilemap);
} }
} }
static TILE_GET_INFO( get_kidniki_bg_tile_info ) static TILE_GET_INFO( get_kidniki_bg_tile_info )
{ {
irem_z80_state *state = (irem_z80_state *)machine->driver_data;
int code; int code;
int color; int color;
code = m62_tileram[ tile_index << 1 ]; code = state->m62_tileram[tile_index << 1];
color = m62_tileram[ ( tile_index << 1 ) | 1 ]; color = state->m62_tileram[(tile_index << 1) | 1];
SET_TILE_INFO( 0, code | ( ( color & 0xe0 ) << 3 ) | ( kidniki_background_bank << 11 ), color & 0x1f, 0); SET_TILE_INFO(0, code | ((color & 0xe0) << 3) | (state->kidniki_background_bank << 11), color & 0x1f, 0);
tileinfo->group = ((color & 0xe0) == 0xe0) ? 1 : 0; tileinfo->group = ((color & 0xe0) == 0xe0) ? 1 : 0;
} }
static TILE_GET_INFO( get_kidniki_fg_tile_info ) static TILE_GET_INFO( get_kidniki_fg_tile_info )
{ {
irem_z80_state *state = (irem_z80_state *)machine->driver_data;
int code; int code;
int color; int color;
code = m62_textram[ tile_index << 1 ]; code = state->m62_textram[tile_index << 1];
color = m62_textram[ ( tile_index << 1 ) | 1 ]; color = state->m62_textram[(tile_index << 1) | 1];
SET_TILE_INFO(2, code | ( ( color & 0xc0 ) << 2 ), color & 0x1f, 0); SET_TILE_INFO(2, code | ( ( color & 0xc0 ) << 2 ), color & 0x1f, 0);
} }
VIDEO_START( kidniki ) VIDEO_START( kidniki )
{ {
m62_background = tilemap_create( machine, get_kidniki_bg_tile_info, tilemap_scan_rows, 8, 8, 64, 32 ); irem_z80_state *state = (irem_z80_state *)machine->driver_data;
m62_background_hscroll = 0; state->bg_tilemap = tilemap_create(machine, get_kidniki_bg_tile_info, tilemap_scan_rows, 8, 8, 64, 32);
m62_background_vscroll = 0; tilemap_set_transmask(state->bg_tilemap, 0, 0xffff, 0x0000); /* split type 0 is totally transparent in front half */
tilemap_set_transmask(state->bg_tilemap, 1, 0x0001, 0xfffe); /* split type 1 has pen 0 transparent in front half */
tilemap_set_transmask(m62_background,0,0xffff,0x0000); /* split type 0 is totally transparent in front half */
tilemap_set_transmask(m62_background,1,0x0001,0xfffe); /* split type 1 has pen 0 transparent in front half */
register_savestate(machine); register_savestate(machine);
@ -771,46 +762,50 @@ VIDEO_START( kidniki )
VIDEO_UPDATE( kidniki ) VIDEO_UPDATE( kidniki )
{ {
tilemap_set_scrollx( m62_background, 0, m62_background_hscroll ); irem_z80_state *state = (irem_z80_state *)screen->machine->driver_data;
tilemap_set_scrollx( m62_foreground, 0, -64 ); tilemap_set_scrollx(state->bg_tilemap, 0, state->m62_background_hscroll);
tilemap_set_scrolly( m62_foreground, 0, kidniki_text_vscroll + 128 ); tilemap_set_scrollx(state->fg_tilemap, 0, -64);
tilemap_set_transparent_pen( m62_foreground, 0 ); tilemap_set_scrolly(state->fg_tilemap, 0, state->kidniki_text_vscroll + 128);
tilemap_set_transparent_pen(state->fg_tilemap, 0);
tilemap_draw( bitmap, cliprect, m62_background, TILEMAP_DRAW_LAYER1, 0 ); tilemap_draw(bitmap, cliprect, state->bg_tilemap, TILEMAP_DRAW_LAYER1, 0);
draw_sprites(screen->machine, bitmap, cliprect, 0x1f, 0x00, 0x00); draw_sprites(screen->machine, bitmap, cliprect, 0x1f, 0x00, 0x00);
tilemap_draw( bitmap, cliprect, m62_background, TILEMAP_DRAW_LAYER0, 0 ); tilemap_draw(bitmap, cliprect, state->bg_tilemap, TILEMAP_DRAW_LAYER0, 0);
tilemap_draw( bitmap, cliprect, m62_foreground, 0, 0 ); tilemap_draw(bitmap, cliprect, state->fg_tilemap, 0, 0);
return 0; return 0;
} }
WRITE8_HANDLER( spelunkr_palbank_w ) WRITE8_HANDLER( spelunkr_palbank_w )
{ {
if (spelunkr_palbank != (data & 0x01)) irem_z80_state *state = (irem_z80_state *)space->machine->driver_data;
if (state->spelunkr_palbank != (data & 0x01))
{ {
spelunkr_palbank = data & 0x01; state->spelunkr_palbank = data & 0x01;
tilemap_mark_all_tiles_dirty(m62_background); tilemap_mark_all_tiles_dirty(state->bg_tilemap);
tilemap_mark_all_tiles_dirty(m62_foreground); tilemap_mark_all_tiles_dirty(state->fg_tilemap);
} }
} }
static TILE_GET_INFO( get_spelunkr_bg_tile_info ) static TILE_GET_INFO( get_spelunkr_bg_tile_info )
{ {
irem_z80_state *state = (irem_z80_state *)machine->driver_data;
int code; int code;
int color; int color;
code = m62_tileram[ tile_index << 1 ]; code = state->m62_tileram[tile_index << 1];
color = m62_tileram[ ( tile_index << 1 ) | 1 ]; color = state->m62_tileram[(tile_index << 1) | 1];
SET_TILE_INFO( 0, code | ( ( color & 0x10 ) << 4 ) | ( ( color & 0x20 ) << 6 ) | ( ( color & 0xc0 ) << 3 ), ( color & 0x0f ) | ( spelunkr_palbank << 4 ), 0 ); SET_TILE_INFO(0, code | ((color & 0x10) << 4) | ((color & 0x20) << 6) | ((color & 0xc0) << 3), (color & 0x0f) | (state->spelunkr_palbank << 4), 0);
} }
static TILE_GET_INFO( get_spelunkr_fg_tile_info ) static TILE_GET_INFO( get_spelunkr_fg_tile_info )
{ {
irem_z80_state *state = (irem_z80_state *)machine->driver_data;
int code; int code;
int color; int color;
code = m62_textram[ tile_index << 1 ]; code = state->m62_textram[tile_index << 1];
color = m62_textram[ ( tile_index << 1 ) | 1 ]; color = state->m62_textram[(tile_index << 1) | 1];
if (color & 0xe0) popmessage("fg tilemap %x %x", tile_index, color & 0xe0); if (color & 0xe0) popmessage("fg tilemap %x %x", tile_index, color & 0xe0);
SET_TILE_INFO( 2, code | ( ( color & 0x10 ) << 4 ), ( color & 0x0f ) | ( spelunkr_palbank << 4 ), 0 ); SET_TILE_INFO(2, code | ((color & 0x10) << 4), (color & 0x0f) | (state->spelunkr_palbank << 4), 0);
} }
VIDEO_START( spelunkr ) VIDEO_START( spelunkr )
@ -821,38 +816,41 @@ VIDEO_START( spelunkr )
VIDEO_UPDATE( spelunkr ) VIDEO_UPDATE( spelunkr )
{ {
tilemap_set_scrollx( m62_background, 0, m62_background_hscroll ); irem_z80_state *state = (irem_z80_state *)screen->machine->driver_data;
tilemap_set_scrolly( m62_background, 0, m62_background_vscroll + 128 ); tilemap_set_scrollx(state->bg_tilemap, 0, state->m62_background_hscroll);
tilemap_set_scrollx( m62_foreground, 0, -64 ); tilemap_set_scrolly(state->bg_tilemap, 0, state->m62_background_vscroll + 128);
tilemap_set_scrolly( m62_foreground, 0, 0 ); tilemap_set_scrollx(state->fg_tilemap, 0, -64);
tilemap_set_transparent_pen( m62_foreground, 0 ); tilemap_set_scrolly(state->fg_tilemap, 0, 0);
tilemap_set_transparent_pen(state->fg_tilemap, 0);
tilemap_draw( bitmap, cliprect, m62_background, 0, 0 ); tilemap_draw(bitmap, cliprect, state->bg_tilemap, 0, 0);
draw_sprites(screen->machine, bitmap, cliprect, 0x1f, 0x00, 0x00); draw_sprites(screen->machine, bitmap, cliprect, 0x1f, 0x00, 0x00);
tilemap_draw( bitmap, cliprect, m62_foreground, 0, 0 ); tilemap_draw(bitmap, cliprect, state->fg_tilemap, 0, 0);
return 0; return 0;
} }
WRITE8_HANDLER( spelunk2_gfxport_w ) WRITE8_HANDLER( spelunk2_gfxport_w )
{ {
irem_z80_state *state = (irem_z80_state *)space->machine->driver_data;
m62_hscroll_high_w(space, 0, (data & 2) >> 1); m62_hscroll_high_w(space, 0, (data & 2) >> 1);
m62_vscroll_high_w(space, 0, (data & 1)); m62_vscroll_high_w(space, 0, (data & 1));
if (spelunkr_palbank != ((data & 0x0c) >> 2)) if (state->spelunkr_palbank != ((data & 0x0c) >> 2))
{ {
spelunkr_palbank = (data & 0x0c) >> 2; state->spelunkr_palbank = (data & 0x0c) >> 2;
tilemap_mark_all_tiles_dirty(m62_background); tilemap_mark_all_tiles_dirty(state->bg_tilemap);
tilemap_mark_all_tiles_dirty(m62_foreground); tilemap_mark_all_tiles_dirty(state->fg_tilemap);
} }
} }
static TILE_GET_INFO( get_spelunk2_bg_tile_info ) static TILE_GET_INFO( get_spelunk2_bg_tile_info )
{ {
irem_z80_state *state = (irem_z80_state *)machine->driver_data;
int code; int code;
int color; int color;
code = m62_tileram[ tile_index << 1 ]; code = state->m62_tileram[tile_index << 1];
color = m62_tileram[ ( tile_index << 1 ) | 1 ]; color = state->m62_tileram[(tile_index << 1) | 1];
SET_TILE_INFO( 0, code | ( ( color & 0xf0 ) << 4 ), ( color & 0x0f ) | ( spelunkr_palbank << 4 ), 0 ); SET_TILE_INFO( 0, code | ((color & 0xf0) << 4), (color & 0x0f) | (state->spelunkr_palbank << 4), 0 );
} }
VIDEO_START( spelunk2 ) VIDEO_START( spelunk2 )
@ -863,106 +861,108 @@ VIDEO_START( spelunk2 )
VIDEO_UPDATE( spelunk2 ) VIDEO_UPDATE( spelunk2 )
{ {
tilemap_set_scrollx( m62_background, 0, m62_background_hscroll - 1); irem_z80_state *state = (irem_z80_state *)screen->machine->driver_data;
tilemap_set_scrolly( m62_background, 0, m62_background_vscroll + 128 ); tilemap_set_scrollx(state->bg_tilemap, 0, state->m62_background_hscroll - 1);
tilemap_set_scrollx( m62_foreground, 0, -65 ); tilemap_set_scrolly(state->bg_tilemap, 0, state->m62_background_vscroll + 128);
tilemap_set_scrolly( m62_foreground, 0, 0 ); tilemap_set_scrollx(state->fg_tilemap, 0, -65);
tilemap_set_transparent_pen( m62_foreground, 0 ); tilemap_set_scrolly(state->fg_tilemap, 0, 0);
tilemap_set_transparent_pen(state->fg_tilemap, 0);
tilemap_draw( bitmap, cliprect, m62_background, 0, 0 ); tilemap_draw(bitmap, cliprect, state->bg_tilemap, 0, 0);
draw_sprites(screen->machine, bitmap, cliprect, 0x1f, 0x00, 0x00); draw_sprites(screen->machine, bitmap, cliprect, 0x1f, 0x00, 0x00);
tilemap_draw( bitmap, cliprect, m62_foreground, 0, 0 ); tilemap_draw(bitmap, cliprect, state->fg_tilemap, 0, 0);
return 0; return 0;
} }
static TILE_GET_INFO( get_youjyudn_bg_tile_info ) static TILE_GET_INFO( get_youjyudn_bg_tile_info )
{ {
irem_z80_state *state = (irem_z80_state *)machine->driver_data;
int code; int code;
int color; int color;
code = m62_tileram[ tile_index << 1 ]; code = state->m62_tileram[tile_index << 1];
color = m62_tileram[ ( tile_index << 1 ) | 1 ]; color = state->m62_tileram[(tile_index << 1) | 1];
SET_TILE_INFO( 0, code | ((color & 0x60) << 3), color & 0x1f, 0); SET_TILE_INFO( 0, code | ((color & 0x60) << 3), color & 0x1f, 0);
if (((color & 0x1f) >> 1) >= 0x08) if (((color & 0x1f) >> 1) >= 0x08)
{
tileinfo->group = 1; tileinfo->group = 1;
}
else else
{
tileinfo->group = 0; tileinfo->group = 0;
} }
}
static TILE_GET_INFO( get_youjyudn_fg_tile_info ) static TILE_GET_INFO( get_youjyudn_fg_tile_info )
{ {
irem_z80_state *state = (irem_z80_state *)machine->driver_data;
int code; int code;
int color; int color;
code = m62_textram[ tile_index << 1 ]; code = state->m62_textram[tile_index << 1];
color = m62_textram[ ( tile_index << 1 ) | 1 ]; color = state->m62_textram[(tile_index << 1) | 1];
SET_TILE_INFO(2, code | ((color & 0xc0) << 2), (color & 0x0f), 0); SET_TILE_INFO(2, code | ((color & 0xc0) << 2), (color & 0x0f), 0);
} }
VIDEO_START( youjyudn ) VIDEO_START( youjyudn )
{ {
irem_z80_state *state = (irem_z80_state *)machine->driver_data;
m62_start(machine, get_youjyudn_bg_tile_info, 1, 0, 8, 16, 64, 16); m62_start(machine, get_youjyudn_bg_tile_info, 1, 0, 8, 16, 64, 16);
m62_textlayer(machine, get_youjyudn_fg_tile_info, 1, 1, 12, 8, 32, 32); m62_textlayer(machine, get_youjyudn_fg_tile_info, 1, 1, 12, 8, 32, 32);
tilemap_set_transmask(m62_background,0,0xffff,0x0000); /* split type 0 is totally transparent in front half */ tilemap_set_transmask(state->bg_tilemap, 0, 0xffff, 0x0000); /* split type 0 is totally transparent in front half */
tilemap_set_transmask(m62_background,1,0x0001,0xfffe); /* split type 1 has pen 0 transparent in front half */ tilemap_set_transmask(state->bg_tilemap, 1, 0x0001, 0xfffe); /* split type 1 has pen 0 transparent in front half */
} }
VIDEO_UPDATE( youjyudn ) VIDEO_UPDATE( youjyudn )
{ {
tilemap_set_scrollx( m62_background, 0, m62_background_hscroll ); irem_z80_state *state = (irem_z80_state *)screen->machine->driver_data;
tilemap_set_scrollx( m62_foreground, 0, -64 ); tilemap_set_scrollx(state->bg_tilemap, 0, state->m62_background_hscroll);
tilemap_set_scrolly( m62_foreground, 0, 0 ); tilemap_set_scrollx(state->fg_tilemap, 0, -64);
tilemap_set_transparent_pen( m62_foreground, 0 ); tilemap_set_scrolly(state->fg_tilemap, 0, 0);
tilemap_set_transparent_pen(state->fg_tilemap, 0);
tilemap_draw( bitmap, cliprect, m62_background, TILEMAP_DRAW_LAYER1, 0 ); tilemap_draw(bitmap, cliprect, state->bg_tilemap, TILEMAP_DRAW_LAYER1, 0);
draw_sprites(screen->machine, bitmap, cliprect, 0x1f, 0x00, 0x00); draw_sprites(screen->machine, bitmap, cliprect, 0x1f, 0x00, 0x00);
tilemap_draw( bitmap, cliprect, m62_background, TILEMAP_DRAW_LAYER0, 0 ); tilemap_draw(bitmap, cliprect, state->bg_tilemap, TILEMAP_DRAW_LAYER0, 0);
tilemap_draw( bitmap, cliprect, m62_foreground, 0, 0 ); tilemap_draw(bitmap, cliprect, state->fg_tilemap, 0, 0);
return 0; return 0;
} }
WRITE8_HANDLER( horizon_scrollram_w ) WRITE8_HANDLER( horizon_scrollram_w )
{ {
horizon_scrollram[ offset ] = data; irem_z80_state *state = (irem_z80_state *)space->machine->driver_data;
state->scrollram[offset] = data;
} }
static TILE_GET_INFO( get_horizon_bg_tile_info ) static TILE_GET_INFO( get_horizon_bg_tile_info )
{ {
irem_z80_state *state = (irem_z80_state *)machine->driver_data;
int code; int code;
int color; int color;
code = m62_tileram[ tile_index << 1 ]; code = state->m62_tileram[tile_index << 1];
color = m62_tileram[ ( tile_index << 1 ) | 1 ]; color = state->m62_tileram[(tile_index << 1) | 1];
SET_TILE_INFO(0, code | ((color & 0xc0) << 2) | ((color & 0x20) << 5), color & 0x1f, 0); SET_TILE_INFO(0, code | ((color & 0xc0) << 2) | ((color & 0x20) << 5), color & 0x1f, 0);
if (((color & 0x1f) >> 1) >= 0x08) if (((color & 0x1f) >> 1) >= 0x08)
{
tileinfo->group = 1; tileinfo->group = 1;
}
else else
{
tileinfo->group = 0; tileinfo->group = 0;
} }
}
VIDEO_START( horizon ) VIDEO_START( horizon )
{ {
irem_z80_state *state = (irem_z80_state *)machine->driver_data;
m62_start(machine, get_horizon_bg_tile_info, 32, 0, 8, 8, 64, 32); m62_start(machine, get_horizon_bg_tile_info, 32, 0, 8, 8, 64, 32);
tilemap_set_transmask(m62_background,0,0xffff,0x0000); /* split type 0 is totally transparent in front half */ tilemap_set_transmask(state->bg_tilemap, 0, 0xffff, 0x0000); /* split type 0 is totally transparent in front half */
tilemap_set_transmask(m62_background,1,0x0001,0xfffe); /* split type 1 has pen 0 transparent in front half */ tilemap_set_transmask(state->bg_tilemap, 1, 0x0001, 0xfffe); /* split type 1 has pen 0 transparent in front half */
} }
VIDEO_UPDATE( horizon ) VIDEO_UPDATE( horizon )
{ {
irem_z80_state *state = (irem_z80_state *)screen->machine->driver_data;
int i; int i;
for (i = 0; i < 32; i++) for (i = 0; i < 32; i++)
{ {
tilemap_set_scrollx( m62_background, i, horizon_scrollram[ i << 1 ] | ( horizon_scrollram[ ( i << 1 ) | 1 ] << 8 ) ); tilemap_set_scrollx(state->bg_tilemap, i, state->scrollram[i << 1] | (state->scrollram[(i << 1) | 1] << 8));
} }
tilemap_draw( bitmap, cliprect, m62_background, TILEMAP_DRAW_LAYER1, 0 ); tilemap_draw(bitmap, cliprect, state->bg_tilemap, TILEMAP_DRAW_LAYER1, 0);
draw_sprites(screen->machine, bitmap, cliprect, 0x1f, 0x00, 0x00); draw_sprites(screen->machine, bitmap, cliprect, 0x1f, 0x00, 0x00);
tilemap_draw( bitmap, cliprect, m62_background, TILEMAP_DRAW_LAYER0, 0 ); tilemap_draw(bitmap, cliprect, state->bg_tilemap, TILEMAP_DRAW_LAYER0, 0);
return 0; return 0;
} }

View File

@ -12,12 +12,7 @@ J Clegg
***************************************************************************/ ***************************************************************************/
#include "driver.h" #include "driver.h"
#include "includes/iremz80.h"
UINT8 *travrusa_videoram;
static tilemap *bg_tilemap;
/*************************************************************************** /***************************************************************************
@ -202,14 +197,15 @@ PALETTE_INIT( shtrider )
static TILE_GET_INFO( get_tile_info ) static TILE_GET_INFO( get_tile_info )
{ {
UINT8 attr = travrusa_videoram[2*tile_index+1]; irem_z80_state *state = (irem_z80_state *)machine->driver_data;
UINT8 attr = state->videoram[2 * tile_index + 1];
int flags = TILE_FLIPXY((attr & 0x30) >> 4); int flags = TILE_FLIPXY((attr & 0x30) >> 4);
tileinfo->group = ((attr & 0x0f) == 0x0f) ? 1 : 0; /* tunnels */ tileinfo->group = ((attr & 0x0f) == 0x0f) ? 1 : 0; /* tunnels */
SET_TILE_INFO( SET_TILE_INFO(
0, 0,
travrusa_videoram[2*tile_index] + ((attr & 0xc0) << 2), state->videoram[2 * tile_index] + ((attr & 0xc0) << 2),
attr & 0x0f, attr & 0x0f,
flags); flags);
} }
@ -224,12 +220,16 @@ static TILE_GET_INFO( get_tile_info )
VIDEO_START( travrusa ) VIDEO_START( travrusa )
{ {
bg_tilemap = tilemap_create(machine, get_tile_info,tilemap_scan_rows,8,8,64,32); irem_z80_state *state = (irem_z80_state *)machine->driver_data;
tilemap_set_transmask(bg_tilemap,0,0xff,0x00); /* split type 0 is totally transparent in front half */ state_save_register_global_array(machine, state->scrollx);
tilemap_set_transmask(bg_tilemap,1,0x3f,0xc0); /* split type 1 has pens 6 and 7 opaque - tunnels */
tilemap_set_scroll_rows(bg_tilemap,4); state->bg_tilemap = tilemap_create(machine, get_tile_info, tilemap_scan_rows, 8, 8, 64, 32);
tilemap_set_transmask(state->bg_tilemap, 0, 0xff, 0x00); /* split type 0 is totally transparent in front half */
tilemap_set_transmask(state->bg_tilemap, 1, 0x3f, 0xc0); /* split type 1 has pens 6 and 7 opaque - tunnels */
tilemap_set_scroll_rows(state->bg_tilemap, 4);
} }
@ -242,32 +242,35 @@ VIDEO_START( travrusa )
WRITE8_HANDLER( travrusa_videoram_w ) WRITE8_HANDLER( travrusa_videoram_w )
{ {
travrusa_videoram[offset] = data; irem_z80_state *state = (irem_z80_state *)space->machine->driver_data;
tilemap_mark_tile_dirty(bg_tilemap,offset/2); state->videoram[offset] = data;
tilemap_mark_tile_dirty(state->bg_tilemap, offset / 2);
} }
static int scrollx[2]; static void set_scroll( running_machine *machine )
static void set_scroll(void)
{ {
irem_z80_state *state = (irem_z80_state *)machine->driver_data;
int i; int i;
for (i = 0; i <= 2; i++) for (i = 0; i <= 2; i++)
tilemap_set_scrollx(bg_tilemap,i,scrollx[0] + 256 * scrollx[1]); tilemap_set_scrollx(state->bg_tilemap, i, state->scrollx[0] + 256 * state->scrollx[1]);
tilemap_set_scrollx(bg_tilemap,3,0);
tilemap_set_scrollx(state->bg_tilemap, 3, 0);
} }
WRITE8_HANDLER( travrusa_scroll_x_low_w ) WRITE8_HANDLER( travrusa_scroll_x_low_w )
{ {
scrollx[0] = data; irem_z80_state *state = (irem_z80_state *)space->machine->driver_data;
set_scroll(); state->scrollx[0] = data;
set_scroll(space->machine);
} }
WRITE8_HANDLER( travrusa_scroll_x_high_w ) WRITE8_HANDLER( travrusa_scroll_x_high_w )
{ {
scrollx[1] = data; irem_z80_state *state = (irem_z80_state *)space->machine->driver_data;
set_scroll(); state->scrollx[1] = data;
set_scroll(space->machine);
} }
@ -292,6 +295,7 @@ WRITE8_HANDLER( travrusa_flipscreen_w )
static void draw_sprites(running_machine *machine, bitmap_t *bitmap,const rectangle *cliprect) static void draw_sprites(running_machine *machine, bitmap_t *bitmap,const rectangle *cliprect)
{ {
irem_z80_state *state = (irem_z80_state *)machine->driver_data;
int offs; int offs;
static const rectangle spritevisiblearea = static const rectangle spritevisiblearea =
{ {
@ -312,10 +316,10 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap,const rectan
for (offs = spriteram_size - 4;offs >= 0;offs -= 4) for (offs = spriteram_size - 4;offs >= 0;offs -= 4)
{ {
int sx = ((spriteram[offs + 3] + 8) & 0xff) - 8; int sx = ((state->spriteram[offs + 3] + 8) & 0xff) - 8;
int sy = 240 - spriteram[offs]; int sy = 240 - state->spriteram[offs];
int code = spriteram[offs + 2]; int code = state->spriteram[offs + 2];
int attr = spriteram[offs + 1]; int attr = state->spriteram[offs + 1];
int flipx = attr & 0x40; int flipx = attr & 0x40;
int flipy = attr & 0x80; int flipy = attr & 0x80;
@ -338,8 +342,9 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap,const rectan
VIDEO_UPDATE( travrusa ) VIDEO_UPDATE( travrusa )
{ {
tilemap_draw(bitmap,cliprect,bg_tilemap,TILEMAP_DRAW_LAYER1,0); irem_z80_state *state = (irem_z80_state *)screen->machine->driver_data;
tilemap_draw(bitmap, cliprect, state->bg_tilemap, TILEMAP_DRAW_LAYER1, 0);
draw_sprites(screen->machine, bitmap,cliprect); draw_sprites(screen->machine, bitmap,cliprect);
tilemap_draw(bitmap,cliprect,bg_tilemap,TILEMAP_DRAW_LAYER0,0); tilemap_draw(bitmap, cliprect, state->bg_tilemap, TILEMAP_DRAW_LAYER0, 0);
return 0; return 0;
} }