Converted namco/thepit/toaplan/unico/upl/valadon/veltmjr/venture/vsystem/

zaccaria to driver_device. Also simplified unico and disentangled gridlee
from balsente. [Atari Ace]
This commit is contained in:
Aaron Giles 2011-03-10 07:26:48 +00:00
parent 46550a475b
commit 4977af6a7d
89 changed files with 2884 additions and 2304 deletions

View File

@ -36,7 +36,6 @@ static void turbo_update_samples(turbo_state *state, device_t *samples)
#if (DISCRETE_TEST) #if (DISCRETE_TEST)
static int last_sound_a;
static TIMER_CALLBACK( update_sound_a ) static TIMER_CALLBACK( update_sound_a )
{ {
@ -110,12 +109,12 @@ WRITE8_DEVICE_HANDLER( turbo_sound_a_w )
#else #else
if (((data ^ last_sound_a) & 0x1e) && (last_sound_a & 0x1e) != 0x1e) if (((data ^ state->last_sound_a) & 0x1e) && (state->last_sound_a & 0x1e) != 0x1e)
space->machine->scheduler().timer_set(attotime::from_hz(20000), FUNC(update_sound_a), data); space->machine->scheduler().timer_set(attotime::from_hz(20000), FUNC(update_sound_a), data);
else else
update_sound_a(data); update_sound_a(data);
last_sound_a = data; state->last_sound_a = data;
#endif #endif
} }

View File

@ -66,35 +66,32 @@ DIP locations verified for:
#include "sound/tms5110.h" #include "sound/tms5110.h"
#include "includes/bagman.h" #include "includes/bagman.h"
//static int speech_rom_address = 0;
static UINT8 ls259_buf[8] = {0,0,0,0,0,0,0,0};
static WRITE8_DEVICE_HANDLER( bagman_ls259_w ) static WRITE8_DEVICE_HANDLER( bagman_ls259_w )
{ {
bagman_state *state = device->machine->driver_data<bagman_state>();
address_space *space = cputag_get_address_space(device->machine, "maincpu", ADDRESS_SPACE_PROGRAM); address_space *space = cputag_get_address_space(device->machine, "maincpu", ADDRESS_SPACE_PROGRAM);
bagman_pal16r6_w(space, offset,data); /*this is just a simulation*/ bagman_pal16r6_w(space, offset,data); /*this is just a simulation*/
if (ls259_buf[offset] != (data&1) ) if (state->ls259_buf[offset] != (data&1) )
{ {
ls259_buf[offset] = data&1; state->ls259_buf[offset] = data&1;
switch (offset) switch (offset)
{ {
case 0: case 0:
case 1: case 1:
case 2: case 2:
tmsprom_bit_w(device, 0, 7 - ((ls259_buf[0]<<2) | (ls259_buf[1]<<1) | (ls259_buf[2]<<0))); tmsprom_bit_w(device, 0, 7 - ((state->ls259_buf[0]<<2) | (state->ls259_buf[1]<<1) | (state->ls259_buf[2]<<0)));
break; break;
case 3: case 3:
tmsprom_enable_w(device, ls259_buf[offset]); tmsprom_enable_w(device, state->ls259_buf[offset]);
break; break;
case 4: case 4:
tmsprom_rom_csq_w(device, 0, ls259_buf[offset]); tmsprom_rom_csq_w(device, 0, state->ls259_buf[offset]);
break; break;
case 5: case 5:
tmsprom_rom_csq_w(device, 1, ls259_buf[offset]); tmsprom_rom_csq_w(device, 1, state->ls259_buf[offset]);
break; break;
} }
} }
@ -116,14 +113,14 @@ static WRITE8_DEVICE_HANDLER( bagman_interrupt_w )
static ADDRESS_MAP_START( main_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( main_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x5fff) AM_ROM AM_RANGE(0x0000, 0x5fff) AM_ROM
AM_RANGE(0x6000, 0x67ff) AM_RAM AM_RANGE(0x6000, 0x67ff) AM_RAM
AM_RANGE(0x9000, 0x93ff) AM_RAM_WRITE(bagman_videoram_w) AM_BASE(&bagman_videoram) AM_RANGE(0x9000, 0x93ff) AM_RAM_WRITE(bagman_videoram_w) AM_BASE_MEMBER(bagman_state, videoram)
AM_RANGE(0x9800, 0x9bff) AM_RAM_WRITE(bagman_colorram_w) AM_BASE(&bagman_colorram) AM_RANGE(0x9800, 0x9bff) AM_RAM_WRITE(bagman_colorram_w) AM_BASE_MEMBER(bagman_state, colorram)
AM_RANGE(0x9c00, 0x9fff) AM_WRITENOP /* written to, but unused */ AM_RANGE(0x9c00, 0x9fff) AM_WRITENOP /* written to, but unused */
AM_RANGE(0xa000, 0xa000) AM_READ(bagman_pal16r6_r) AM_RANGE(0xa000, 0xa000) AM_READ(bagman_pal16r6_r)
//AM_RANGE(0xa800, 0xa805) AM_READ(bagman_ls259_r) /*just for debugging purposes*/ //AM_RANGE(0xa800, 0xa805) AM_READ(bagman_ls259_r) /*just for debugging purposes*/
AM_RANGE(0xa000, 0xa000) AM_DEVWRITE("maincpu", bagman_interrupt_w) AM_RANGE(0xa000, 0xa000) AM_DEVWRITE("maincpu", bagman_interrupt_w)
AM_RANGE(0xa001, 0xa002) AM_WRITE(bagman_flipscreen_w) AM_RANGE(0xa001, 0xa002) AM_WRITE(bagman_flipscreen_w)
AM_RANGE(0xa003, 0xa003) AM_WRITEONLY AM_BASE(&bagman_video_enable) AM_RANGE(0xa003, 0xa003) AM_WRITEONLY AM_BASE_MEMBER(bagman_state, video_enable)
AM_RANGE(0xc000, 0xffff) AM_ROM /* Super Bagman only */ AM_RANGE(0xc000, 0xffff) AM_ROM /* Super Bagman only */
AM_RANGE(0x9800, 0x981f) AM_WRITEONLY AM_BASE_SIZE_GENERIC(spriteram) /* hidden portion of color RAM */ AM_RANGE(0x9800, 0x981f) AM_WRITEONLY AM_BASE_SIZE_GENERIC(spriteram) /* hidden portion of color RAM */
/* here only to initialize the pointer, */ /* here only to initialize the pointer, */
@ -145,15 +142,15 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( pickin_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( pickin_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x5fff) AM_ROM AM_RANGE(0x0000, 0x5fff) AM_ROM
AM_RANGE(0x7000, 0x77ff) AM_RAM AM_RANGE(0x7000, 0x77ff) AM_RAM
AM_RANGE(0x8800, 0x8bff) AM_RAM_WRITE(bagman_videoram_w) AM_BASE(&bagman_videoram) AM_RANGE(0x8800, 0x8bff) AM_RAM_WRITE(bagman_videoram_w) AM_BASE_MEMBER(bagman_state, videoram)
AM_RANGE(0x9800, 0x9bff) AM_RAM_WRITE(bagman_colorram_w) AM_BASE(&bagman_colorram) AM_RANGE(0x9800, 0x9bff) AM_RAM_WRITE(bagman_colorram_w) AM_BASE_MEMBER(bagman_state, colorram)
AM_RANGE(0x9800, 0x981f) AM_WRITEONLY AM_BASE_SIZE_GENERIC(spriteram) /* hidden portion of color RAM */ AM_RANGE(0x9800, 0x981f) AM_WRITEONLY AM_BASE_SIZE_GENERIC(spriteram) /* hidden portion of color RAM */
/* here only to initialize the pointer, */ /* here only to initialize the pointer, */
/* writes are handled by bagman_colorram_w */ /* writes are handled by bagman_colorram_w */
AM_RANGE(0x9c00, 0x9fff) AM_WRITENOP /* written to, but unused */ AM_RANGE(0x9c00, 0x9fff) AM_WRITENOP /* written to, but unused */
AM_RANGE(0xa000, 0xa000) AM_WRITE(interrupt_enable_w) AM_RANGE(0xa000, 0xa000) AM_WRITE(interrupt_enable_w)
AM_RANGE(0xa001, 0xa002) AM_WRITE(bagman_flipscreen_w) AM_RANGE(0xa001, 0xa002) AM_WRITE(bagman_flipscreen_w)
AM_RANGE(0xa003, 0xa003) AM_WRITEONLY AM_BASE(&bagman_video_enable) AM_RANGE(0xa003, 0xa003) AM_WRITEONLY AM_BASE_MEMBER(bagman_state, video_enable)
AM_RANGE(0xa004, 0xa004) AM_WRITE(bagman_coin_counter_w) AM_RANGE(0xa004, 0xa004) AM_WRITE(bagman_coin_counter_w)
AM_RANGE(0xa800, 0xa800) AM_READ_PORT("DSW") AM_RANGE(0xa800, 0xa800) AM_READ_PORT("DSW")
@ -381,42 +378,44 @@ static const ay8910_interface ay8910_config =
I don't know if the following is correct, there can possbily be multiple solutions for the same problem. */ I don't know if the following is correct, there can possbily be multiple solutions for the same problem. */
static READ8_DEVICE_HANDLER( dial_input_p1_r ) static READ8_DEVICE_HANDLER( dial_input_p1_r )
{ {
static UINT8 res,dial_val,old_val; bagman_state *state = device->machine->driver_data<bagman_state>();
UINT8 dial_val;
dial_val = input_port_read(device->machine, "DIAL_P1"); dial_val = input_port_read(device->machine, "DIAL_P1");
if(res != 0x60) if(state->p1_res != 0x60)
res = 0x60; state->p1_res = 0x60;
else if(dial_val > old_val) else if(dial_val > state->p1_old_val)
res = 0x40; state->p1_res = 0x40;
else if(dial_val < old_val) else if(dial_val < state->p1_old_val)
res = 0x20; state->p1_res = 0x20;
else else
res = 0x60; state->p1_res = 0x60;
old_val = dial_val; state->p1_old_val = dial_val;
return (input_port_read(device->machine, "P1") & 0x9f) | (res); return (input_port_read(device->machine, "P1") & 0x9f) | (state->p1_res);
} }
static READ8_DEVICE_HANDLER( dial_input_p2_r ) static READ8_DEVICE_HANDLER( dial_input_p2_r )
{ {
static UINT8 res,dial_val,old_val; bagman_state *state = device->machine->driver_data<bagman_state>();
UINT8 dial_val;
dial_val = input_port_read(device->machine, "DIAL_P2"); dial_val = input_port_read(device->machine, "DIAL_P2");
if(res != 0x60) if(state->p2_res != 0x60)
res = 0x60; state->p2_res = 0x60;
else if(dial_val > old_val) else if(dial_val > state->p2_old_val)
res = 0x40; state->p2_res = 0x40;
else if(dial_val < old_val) else if(dial_val < state->p2_old_val)
res = 0x20; state->p2_res = 0x20;
else else
res = 0x60; state->p2_res = 0x60;
old_val = dial_val; state->p2_old_val = dial_val;
return (input_port_read(device->machine, "P2") & 0x9f) | (res); return (input_port_read(device->machine, "P2") & 0x9f) | (state->p2_res);
} }
static const ay8910_interface ay8910_dial_config = static const ay8910_interface ay8910_dial_config =
@ -468,7 +467,7 @@ static const tms5110_interface bagman_tms5110_interface =
DEVCB_NULL /* rom clock - Only used to drive the data lines */ DEVCB_NULL /* rom clock - Only used to drive the data lines */
}; };
static MACHINE_CONFIG_START( bagman, driver_device ) static MACHINE_CONFIG_START( bagman, bagman_state )
/* basic machine hardware */ /* basic machine hardware */
MCFG_CPU_ADD("maincpu", Z80, BAGMAN_H0) MCFG_CPU_ADD("maincpu", Z80, BAGMAN_H0)
@ -505,7 +504,7 @@ static MACHINE_CONFIG_START( bagman, driver_device )
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
MACHINE_CONFIG_END MACHINE_CONFIG_END
static MACHINE_CONFIG_START( pickin, driver_device ) static MACHINE_CONFIG_START( pickin, bagman_state )
/* basic machine hardware */ /* basic machine hardware */
MCFG_CPU_ADD("maincpu", Z80, BAGMAN_H0) MCFG_CPU_ADD("maincpu", Z80, BAGMAN_H0)
@ -558,7 +557,7 @@ z80
*/ */
static MACHINE_CONFIG_START( botanic, driver_device ) static MACHINE_CONFIG_START( botanic, bagman_state )
/* basic machine hardware */ /* basic machine hardware */
MCFG_CPU_ADD("maincpu", Z80, BAGMAN_H0) MCFG_CPU_ADD("maincpu", Z80, BAGMAN_H0)
@ -931,8 +930,9 @@ ROM_END
static DRIVER_INIT( bagnarda ) static DRIVER_INIT( bagnarda )
{ {
bagman_state *state = machine->driver_data<bagman_state>();
/* initialize video enable because it's not done in the code */ /* initialize video enable because it's not done in the code */
*bagman_video_enable = 1; *state->video_enable = 1;
} }
GAME( 1982, bagman, 0, bagman, bagman, 0, ROT270, "Valadon Automation", "Bagman", 0 ) GAME( 1982, bagman, 0, bagman, bagman, 0, ROT270, "Valadon Automation", "Bagman", 0 )

View File

@ -22,19 +22,31 @@
#include "cardline.lh" #include "cardline.lh"
static int cardline_video;
static UINT8 *videoram; class cardline_state : public driver_device
static UINT8 *colorram; {
public:
cardline_state(running_machine &machine, const driver_device_config_base &config)
: driver_device(machine, config) { }
int video;
UINT8 *videoram;
UINT8 *colorram;
int var;
};
#define DRAW_TILE(machine, offset, transparency) drawgfx_transpen(bitmap, cliprect, machine->gfx[0],\ #define DRAW_TILE(machine, offset, transparency) drawgfx_transpen(bitmap, cliprect, machine->gfx[0],\
(videoram[index+offset] | (colorram[index+offset]<<8))&0x3fff,\ (state->videoram[index+offset] | (state->colorram[index+offset]<<8))&0x3fff,\
(colorram[index+offset]&0x80)>>7,\ (state->colorram[index+offset]&0x80)>>7,\
0,0,\ 0,0,\
x<<3, y<<3,\ x<<3, y<<3,\
transparency?transparency:(UINT32)-1); transparency?transparency:(UINT32)-1);
static SCREEN_UPDATE( cardline ) static SCREEN_UPDATE( cardline )
{ {
cardline_state *state = screen->machine->driver_data<cardline_state>();
int x,y; int x,y;
bitmap_fill(bitmap,cliprect,0); bitmap_fill(bitmap,cliprect,0);
for(y=0;y<32;y++) for(y=0;y<32;y++)
@ -42,13 +54,13 @@ static SCREEN_UPDATE( cardline )
for(x=0;x<64;x++) for(x=0;x<64;x++)
{ {
int index=y*64+x; int index=y*64+x;
if(cardline_video&1) if(state->video&1)
{ {
DRAW_TILE(screen->machine,0,0); DRAW_TILE(screen->machine,0,0);
DRAW_TILE(screen->machine,0x800,1); DRAW_TILE(screen->machine,0x800,1);
} }
if(cardline_video&2) if(state->video&2)
{ {
DRAW_TILE(screen->machine,0x1000,0); DRAW_TILE(screen->machine,0x1000,0);
DRAW_TILE(screen->machine,0x1800,1); DRAW_TILE(screen->machine,0x1800,1);
@ -60,27 +72,30 @@ static SCREEN_UPDATE( cardline )
static WRITE8_HANDLER(vram_w) static WRITE8_HANDLER(vram_w)
{ {
offset+=0x1000*((cardline_video&2)>>1); cardline_state *state = space->machine->driver_data<cardline_state>();
videoram[offset]=data; offset+=0x1000*((state->video&2)>>1);
state->videoram[offset]=data;
} }
static WRITE8_HANDLER(attr_w) static WRITE8_HANDLER(attr_w)
{ {
offset+=0x1000*((cardline_video&2)>>1); cardline_state *state = space->machine->driver_data<cardline_state>();
colorram[offset]=data; offset+=0x1000*((state->video&2)>>1);
state->colorram[offset]=data;
} }
static WRITE8_HANDLER(video_w) static WRITE8_HANDLER(video_w)
{ {
cardline_video=data; cardline_state *state = space->machine->driver_data<cardline_state>();
state->video=data;
} }
static READ8_HANDLER(unk_r) static READ8_HANDLER(unk_r)
{ {
static int var=0; cardline_state *state = space->machine->driver_data<cardline_state>();
var^=0x10; state->var^=0x10;
//printf("var %d\n",var); //printf("var %d\n",state->var);
return var; return state->var;
} }
static WRITE8_HANDLER(lamps_w) static WRITE8_HANDLER(lamps_w)
@ -113,8 +128,8 @@ static ADDRESS_MAP_START( mem_io, ADDRESS_SPACE_IO, 8 )
AM_RANGE(0x2840, 0x2840) AM_NOP AM_RANGE(0x2840, 0x2840) AM_NOP
AM_RANGE(0x2880, 0x2880) AM_NOP AM_RANGE(0x2880, 0x2880) AM_NOP
AM_RANGE(0x3003, 0x3003) AM_NOP AM_RANGE(0x3003, 0x3003) AM_NOP
AM_RANGE(0xc000, 0xdfff) AM_WRITE(vram_w) AM_BASE(&videoram) AM_RANGE(0xc000, 0xdfff) AM_WRITE(vram_w) AM_BASE_MEMBER(cardline_state, videoram)
AM_RANGE(0xe000, 0xffff) AM_WRITE(attr_w) AM_BASE(&colorram) AM_RANGE(0xe000, 0xffff) AM_WRITE(attr_w) AM_BASE_MEMBER(cardline_state, colorram)
/* Ports */ /* Ports */
AM_RANGE(MCS51_PORT_P1, MCS51_PORT_P1) AM_READWRITE(unk_r, video_w) AM_RANGE(MCS51_PORT_P1, MCS51_PORT_P1) AM_READWRITE(unk_r, video_w)
ADDRESS_MAP_END ADDRESS_MAP_END
@ -192,7 +207,7 @@ static PALETTE_INIT(cardline)
} }
} }
static MACHINE_CONFIG_START( cardline, driver_device ) static MACHINE_CONFIG_START( cardline, cardline_state )
/* basic machine hardware */ /* basic machine hardware */
MCFG_CPU_ADD("maincpu", I80C32,12000000) MCFG_CPU_ADD("maincpu", I80C32,12000000)

View File

@ -435,7 +435,7 @@ static READ8_DEVICE_HANDLER( dunhuang_dsw_r )
if (!(state->input & 0x04)) return input_port_read(device->machine, "DSW3"); if (!(state->input & 0x04)) return input_port_read(device->machine, "DSW3");
if (!(state->input & 0x08)) return input_port_read(device->machine, "DSW4"); if (!(state->input & 0x08)) return input_port_read(device->machine, "DSW4");
if (!(state->input & 0x10)) return input_port_read(device->machine, "DSW5"); if (!(state->input & 0x10)) return input_port_read(device->machine, "DSW5");
logerror("%s: warning, unknown dsw bits read, state->input = %02x\n", device->machine->describe_context(), state->input); logerror("%s: warning, unknown dsw bits read, input = %02x\n", device->machine->describe_context(), state->input);
return 0xff; return 0xff;
} }
static READ8_HANDLER( dunhuang_input_r ) static READ8_HANDLER( dunhuang_input_r )
@ -446,7 +446,7 @@ static READ8_HANDLER( dunhuang_input_r )
if (!(state->input & 0x04)) return input_port_read(space->machine, "IN2"); if (!(state->input & 0x04)) return input_port_read(space->machine, "IN2");
if (!(state->input & 0x08)) return input_port_read(space->machine, "IN3"); if (!(state->input & 0x08)) return input_port_read(space->machine, "IN3");
if (!(state->input & 0x10)) return input_port_read(space->machine, "IN4"); if (!(state->input & 0x10)) return input_port_read(space->machine, "IN4");
logerror("%s: warning, unknown input bits read, state->input = %02x\n", space->machine->describe_context(), state->input); logerror("%s: warning, unknown input bits read, input = %02x\n", space->machine->describe_context(), state->input);
return 0xff; return 0xff;
} }

View File

@ -28,9 +28,8 @@ Notes:
#include "cpu/z80/z80.h" #include "cpu/z80/z80.h"
#include "sound/ay8910.h" #include "sound/ay8910.h"
#include "machine/nvram.h" #include "machine/nvram.h"
#include "includes/naughtyb.h"
/* it uses the same palette layout as in naughtyb */
PALETTE_INIT( naughtyb );
static int palreg = 0; static int palreg = 0;
static int gfx_bank = 0; static int gfx_bank = 0;

View File

@ -628,8 +628,8 @@ static void GCU_w(running_machine *machine, int chip, UINT32 offset, UINT32 data
if (reg != 0x70 && chip == 0) if (reg != 0x70 && chip == 0)
{ {
//printf("%s:state->gcu%d_w: %08X, %08X, %08X at %08X\n", machine->describe_context(), chip, data, offset, mem_mask); //printf("%s:gcu%d_w: %08X, %08X, %08X at %08X\n", machine->describe_context(), chip, data, offset, mem_mask);
//logerror("%s:state->gcu%d_w: %08X, %08X, %08X at %08X\n", cmachine->describe_context(), hip, data, offset, mem_mask); //logerror("%s:gcu%d_w: %08X, %08X, %08X at %08X\n", cmachine->describe_context(), hip, data, offset, mem_mask);
} }
switch(reg) switch(reg)

View File

@ -142,17 +142,12 @@ static UINT16 *rsoSharedRAM;
static UINT32 led_mst; //Diagnostic LEDs static UINT32 led_mst; //Diagnostic LEDs
static UINT32 led_slv; static UINT32 led_slv;
static int objcode2tile( int code )
{ /* callback for sprite drawing code in namcoic.c */
return code;
} /* objcode2tile */
static VIDEO_START(gal3) static VIDEO_START(gal3)
{ {
namco_obj_init(machine, namco_obj_init(machine,
0, /* gfx bank */ 0, /* gfx bank */
0xf, /* reverse palette mapping */ 0xf, /* reverse palette mapping */
objcode2tile ); NULL );
} }

View File

@ -28,11 +28,22 @@ TS 2008.08.12:
#include "sound/s2636.h" #include "sound/s2636.h"
#include "cpu/s2650/s2650.h" #include "cpu/s2650/s2650.h"
static UINT8 *galaxia_video;
static UINT8 *galaxia_color; class galaxia_state : public driver_device
{
public:
galaxia_state(running_machine &machine, const driver_device_config_base &config)
: driver_device(machine, config) { }
UINT8 *video;
UINT8 *color;
};
static SCREEN_UPDATE( galaxia ) static SCREEN_UPDATE( galaxia )
{ {
galaxia_state *state = screen->machine->driver_data<galaxia_state>();
int x,y, count; int x,y, count;
bitmap_t *s2636_0_bitmap; bitmap_t *s2636_0_bitmap;
@ -49,7 +60,7 @@ static SCREEN_UPDATE( galaxia )
{ {
for (x=0;x<256/8;x++) for (x=0;x<256/8;x++)
{ {
int tile = galaxia_video[count]; int tile = state->video[count];
drawgfx_opaque(bitmap,cliprect,screen->machine->gfx[0],tile,0,0,0,x*8,y*8); drawgfx_opaque(bitmap,cliprect,screen->machine->gfx[0],tile,0,0,0,x*8,y*8);
count++; count++;
} }
@ -89,19 +100,21 @@ static SCREEN_UPDATE( galaxia )
static WRITE8_HANDLER(galaxia_video_w) static WRITE8_HANDLER(galaxia_video_w)
{ {
galaxia_state *state = space->machine->driver_data<galaxia_state>();
if (cpu_get_reg(space->cpu, S2650_FO)) if (cpu_get_reg(space->cpu, S2650_FO))
{ {
galaxia_video[offset]=data; state->video[offset]=data;
} }
else else
{ {
galaxia_color[offset]=data; state->color[offset]=data;
} }
} }
static READ8_HANDLER(galaxia_video_r) static READ8_HANDLER(galaxia_video_r)
{ {
return galaxia_video[offset]; galaxia_state *state = space->machine->driver_data<galaxia_state>();
return state->video[offset];
} }
static ADDRESS_MAP_START( mem_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( mem_map, ADDRESS_SPACE_PROGRAM, 8 )
@ -110,7 +123,7 @@ static ADDRESS_MAP_START( mem_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x1500, 0x15ff) AM_MIRROR(0x6000) AM_DEVREADWRITE("s2636_0", s2636_work_ram_r, s2636_work_ram_w) AM_RANGE(0x1500, 0x15ff) AM_MIRROR(0x6000) AM_DEVREADWRITE("s2636_0", s2636_work_ram_r, s2636_work_ram_w)
AM_RANGE(0x1600, 0x16ff) AM_MIRROR(0x6000) AM_DEVREADWRITE("s2636_1", s2636_work_ram_r, s2636_work_ram_w) AM_RANGE(0x1600, 0x16ff) AM_MIRROR(0x6000) AM_DEVREADWRITE("s2636_1", s2636_work_ram_r, s2636_work_ram_w)
AM_RANGE(0x1700, 0x17ff) AM_MIRROR(0x6000) AM_DEVREADWRITE("s2636_2", s2636_work_ram_r, s2636_work_ram_w) AM_RANGE(0x1700, 0x17ff) AM_MIRROR(0x6000) AM_DEVREADWRITE("s2636_2", s2636_work_ram_r, s2636_work_ram_w)
AM_RANGE(0x1800, 0x1bff) AM_MIRROR(0x6000) AM_READWRITE(galaxia_video_r, galaxia_video_w) AM_BASE(&galaxia_video) AM_RANGE(0x1800, 0x1bff) AM_MIRROR(0x6000) AM_READWRITE(galaxia_video_r, galaxia_video_w) AM_BASE_MEMBER(galaxia_state, video)
AM_RANGE(0x1c00, 0x1fff) AM_MIRROR(0x6000) AM_RAM AM_RANGE(0x1c00, 0x1fff) AM_MIRROR(0x6000) AM_RAM
AM_RANGE(0x2000, 0x33ff) AM_ROM AM_RANGE(0x2000, 0x33ff) AM_ROM
AM_RANGE(0x7214, 0x7214) AM_READ_PORT("IN0") AM_RANGE(0x7214, 0x7214) AM_READ_PORT("IN0")
@ -133,7 +146,7 @@ static ADDRESS_MAP_START( astrowar_mem, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x1500, 0x15ff) AM_MIRROR(0x6000) AM_DEVREADWRITE("s2636_0", s2636_work_ram_r, s2636_work_ram_w) AM_RANGE(0x1500, 0x15ff) AM_MIRROR(0x6000) AM_DEVREADWRITE("s2636_0", s2636_work_ram_r, s2636_work_ram_w)
AM_RANGE(0x1600, 0x16ff) AM_MIRROR(0x6000) AM_DEVREADWRITE("s2636_1", s2636_work_ram_r, s2636_work_ram_w) AM_RANGE(0x1600, 0x16ff) AM_MIRROR(0x6000) AM_DEVREADWRITE("s2636_1", s2636_work_ram_r, s2636_work_ram_w)
AM_RANGE(0x1700, 0x17ff) AM_MIRROR(0x6000) AM_DEVREADWRITE("s2636_2", s2636_work_ram_r, s2636_work_ram_w) AM_RANGE(0x1700, 0x17ff) AM_MIRROR(0x6000) AM_DEVREADWRITE("s2636_2", s2636_work_ram_r, s2636_work_ram_w)
AM_RANGE(0x1800, 0x1bff) AM_MIRROR(0x6000) AM_READWRITE(galaxia_video_r, galaxia_video_w) AM_BASE(&galaxia_video) AM_RANGE(0x1800, 0x1bff) AM_MIRROR(0x6000) AM_READWRITE(galaxia_video_r, galaxia_video_w) AM_BASE_MEMBER(galaxia_state, video)
AM_RANGE(0x1c00, 0x1fff) AM_MIRROR(0x6000) AM_RAM AM_RANGE(0x1c00, 0x1fff) AM_MIRROR(0x6000) AM_RAM
AM_RANGE(0x2000, 0x33ff) AM_ROM AM_RANGE(0x2000, 0x33ff) AM_ROM
ADDRESS_MAP_END ADDRESS_MAP_END
@ -256,7 +269,7 @@ static const s2636_interface s2636_2_config =
"s2636snd_2" "s2636snd_2"
}; };
static MACHINE_CONFIG_START( galaxia, driver_device ) static MACHINE_CONFIG_START( galaxia, galaxia_state )
/* basic machine hardware */ /* basic machine hardware */
MCFG_CPU_ADD("maincpu", S2650,2000000) /* ? MHz */ MCFG_CPU_ADD("maincpu", S2650,2000000) /* ? MHz */
MCFG_CPU_PROGRAM_MAP(mem_map) MCFG_CPU_PROGRAM_MAP(mem_map)
@ -344,7 +357,8 @@ ROM_END
static DRIVER_INIT(galaxia) static DRIVER_INIT(galaxia)
{ {
galaxia_color=auto_alloc_array(machine, UINT8, 0x400); galaxia_state *state = machine->driver_data<galaxia_state>();
state->color=auto_alloc_array(machine, UINT8, 0x400);
} }
GAME( 1979, galaxia, 0, galaxia, galaxia, galaxia, ROT90, "Zaccaria", "Galaxia", GAME_NOT_WORKING ) GAME( 1979, galaxia, 0, galaxia, galaxia, galaxia, ROT90, "Zaccaria", "Galaxia", GAME_NOT_WORKING )

View File

@ -79,10 +79,9 @@
#include "emu.h" #include "emu.h"
#include "cpu/m6809/m6809.h" #include "cpu/m6809/m6809.h"
#include "includes/gridlee.h"
#include "includes/balsente.h"
#include "sound/samples.h" #include "sound/samples.h"
#include "machine/nvram.h" #include "machine/nvram.h"
#include "includes/gridlee.h"
/* constants */ /* constants */
@ -117,7 +116,7 @@ static TIMER_CALLBACK( irq_timer_tick )
cputag_set_input_line(machine, "maincpu", M6809_IRQ_LINE, ASSERT_LINE); cputag_set_input_line(machine, "maincpu", M6809_IRQ_LINE, ASSERT_LINE);
/* it will turn off on the next HBLANK */ /* it will turn off on the next HBLANK */
state->irq_off->adjust(machine->primary_screen->time_until_pos(param, BALSENTE_HBSTART)); state->irq_off->adjust(machine->primary_screen->time_until_pos(param, GRIDLEE_HBSTART));
} }
@ -137,7 +136,7 @@ static TIMER_CALLBACK( firq_timer_tick )
cputag_set_input_line(machine, "maincpu", M6809_FIRQ_LINE, ASSERT_LINE); cputag_set_input_line(machine, "maincpu", M6809_FIRQ_LINE, ASSERT_LINE);
/* it will turn off on the next HBLANK */ /* it will turn off on the next HBLANK */
state->firq_off->adjust(machine->primary_screen->time_until_pos(FIRQ_SCANLINE, BALSENTE_HBSTART)); state->firq_off->adjust(machine->primary_screen->time_until_pos(FIRQ_SCANLINE, GRIDLEE_HBSTART));
} }
static MACHINE_START( gridlee ) static MACHINE_START( gridlee )
@ -429,7 +428,7 @@ static const samples_interface gridlee_samples_interface =
static MACHINE_CONFIG_START( gridlee, gridlee_state ) static MACHINE_CONFIG_START( gridlee, gridlee_state )
/* basic machine hardware */ /* basic machine hardware */
MCFG_CPU_ADD("maincpu", M6809, BALSENTE_CPU_CLOCK) MCFG_CPU_ADD("maincpu", M6809, GRIDLEE_CPU_CLOCK)
MCFG_CPU_PROGRAM_MAP(cpu1_map) MCFG_CPU_PROGRAM_MAP(cpu1_map)
MCFG_MACHINE_START(gridlee) MCFG_MACHINE_START(gridlee)
@ -439,7 +438,7 @@ static MACHINE_CONFIG_START( gridlee, gridlee_state )
/* video hardware */ /* video hardware */
MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
MCFG_SCREEN_RAW_PARAMS(BALSENTE_PIXEL_CLOCK, BALSENTE_HTOTAL, BALSENTE_HBEND, BALSENTE_HBSTART, BALSENTE_VTOTAL, BALSENTE_VBEND, BALSENTE_VBSTART) MCFG_SCREEN_RAW_PARAMS(GRIDLEE_PIXEL_CLOCK, GRIDLEE_HTOTAL, GRIDLEE_HBEND, GRIDLEE_HBSTART, GRIDLEE_VTOTAL, GRIDLEE_VBEND, GRIDLEE_VBSTART)
MCFG_SCREEN_UPDATE(gridlee) MCFG_SCREEN_UPDATE(gridlee)
MCFG_PALETTE_LENGTH(2048) MCFG_PALETTE_LENGTH(2048)

View File

@ -178,28 +178,24 @@ Frequencies: 68k is XTAL_32MHZ/2
******************************************************************************/ ******************************************************************************/
//UINT16 *gs_videoram3;
//UINT16 *gs_mixer_regs;
static UINT16 dmmy_8f_ret;
/*** MISC READ / WRITE HANDLERS **********************************************/ /*** MISC READ / WRITE HANDLERS **********************************************/
static READ16_HANDLER(dmmy_8f) static READ16_HANDLER(dmmy_8f)
{ {
dmmy_8f_ret = ~dmmy_8f_ret; gstriker_state *state = space->machine->driver_data<gstriker_state>();
return dmmy_8f_ret; state->dmmy_8f_ret = ~state->dmmy_8f_ret;
return state->dmmy_8f_ret;
} }
/*** SOUND RELATED ***********************************************************/ /*** SOUND RELATED ***********************************************************/
static int pending_command;
static WRITE16_HANDLER( sound_command_w ) static WRITE16_HANDLER( sound_command_w )
{ {
gstriker_state *state = space->machine->driver_data<gstriker_state>();
if (ACCESSING_BITS_0_7) if (ACCESSING_BITS_0_7)
{ {
pending_command = 1; state->pending_command = 1;
soundlatch_w(space, offset, data & 0xff); soundlatch_w(space, offset, data & 0xff);
cputag_set_input_line(space->machine, "audiocpu", INPUT_LINE_NMI, PULSE_LINE); cputag_set_input_line(space->machine, "audiocpu", INPUT_LINE_NMI, PULSE_LINE);
} }
@ -208,13 +204,15 @@ static WRITE16_HANDLER( sound_command_w )
#if 0 #if 0
static READ16_HANDLER( pending_command_r ) static READ16_HANDLER( pending_command_r )
{ {
return pending_command; gstriker_state *state = space->machine->driver_data<gstriker_state>();
return state->pending_command;
} }
#endif #endif
static WRITE8_HANDLER( gs_sh_pending_command_clear_w ) static WRITE8_HANDLER( gs_sh_pending_command_clear_w )
{ {
pending_command = 0; gstriker_state *state = space->machine->driver_data<gstriker_state>();
state->pending_command = 0;
} }
static WRITE8_HANDLER( gs_sh_bankswitch_w ) static WRITE8_HANDLER( gs_sh_bankswitch_w )
@ -280,15 +278,14 @@ static const ym2610_interface ym2610_config =
/*** MEMORY LAYOUTS **********************************************************/ /*** MEMORY LAYOUTS **********************************************************/
static UINT16 *work_ram;
static ADDRESS_MAP_START( gstriker_map, ADDRESS_SPACE_PROGRAM, 16 ) static ADDRESS_MAP_START( gstriker_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x0fffff) AM_ROM AM_RANGE(0x000000, 0x0fffff) AM_ROM
AM_RANGE(0x100000, 0x103fff) AM_RAM_WRITE(MB60553_0_vram_w) AM_BASE(&MB60553_0_vram) AM_RANGE(0x100000, 0x103fff) AM_RAM_WRITE(MB60553_0_vram_w) AM_BASE_MEMBER(gstriker_state, MB60553[0].vram)
AM_RANGE(0x140000, 0x141fff) AM_RAM AM_BASE(&CG10103_0_vram) AM_RANGE(0x140000, 0x141fff) AM_RAM AM_BASE_MEMBER(gstriker_state, CG10103[0].vram)
AM_RANGE(0x180000, 0x180fff) AM_RAM_WRITE(VS920A_0_vram_w) AM_BASE(&VS920A_0_vram) AM_RANGE(0x180000, 0x180fff) AM_RAM_WRITE(VS920A_0_vram_w) AM_BASE_MEMBER(gstriker_state, VS920A[0].vram)
AM_RANGE(0x181000, 0x181fff) AM_RAM AM_BASE(&gstriker_lineram) AM_RANGE(0x181000, 0x181fff) AM_RAM AM_BASE_MEMBER(gstriker_state, lineram)
AM_RANGE(0x1c0000, 0x1c0fff) AM_RAM_WRITE(paletteram16_xRRRRRGGGGGBBBBB_word_w) AM_BASE_GENERIC(paletteram) AM_RANGE(0x1c0000, 0x1c0fff) AM_RAM_WRITE(paletteram16_xRRRRRGGGGGBBBBB_word_w) AM_BASE_GENERIC(paletteram)
AM_RANGE(0x200000, 0x20000f) AM_RAM_WRITE(MB60553_0_regs_w) AM_RANGE(0x200000, 0x20000f) AM_RAM_WRITE(MB60553_0_regs_w)
@ -302,7 +299,7 @@ static ADDRESS_MAP_START( gstriker_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x20008e, 0x20008f) AM_READ(dmmy_8f) AM_RANGE(0x20008e, 0x20008f) AM_READ(dmmy_8f)
AM_RANGE(0x2000a0, 0x2000a1) AM_WRITE(sound_command_w) AM_RANGE(0x2000a0, 0x2000a1) AM_WRITE(sound_command_w)
AM_RANGE(0xffc000, 0xffffff) AM_RAM AM_BASE(&work_ram) AM_RANGE(0xffc000, 0xffffff) AM_RAM AM_BASE_MEMBER(gstriker_state, work_ram)
ADDRESS_MAP_END ADDRESS_MAP_END
static ADDRESS_MAP_START( sound_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( sound_map, ADDRESS_SPACE_PROGRAM, 8 )
@ -322,10 +319,10 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( vgoal_map, ADDRESS_SPACE_PROGRAM, 16 ) static ADDRESS_MAP_START( vgoal_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x0fffff) AM_ROM AM_RANGE(0x000000, 0x0fffff) AM_ROM
AM_RANGE(0x100000, 0x103fff) AM_RAM_WRITE(MB60553_0_vram_w) AM_BASE(&MB60553_0_vram) AM_RANGE(0x100000, 0x103fff) AM_RAM_WRITE(MB60553_0_vram_w) AM_BASE_MEMBER(gstriker_state, MB60553[0].vram)
AM_RANGE(0x140000, 0x141fff) AM_RAM AM_BASE(&CG10103_0_vram) AM_RANGE(0x140000, 0x141fff) AM_RAM AM_BASE_MEMBER(gstriker_state, CG10103[0].vram)
AM_RANGE(0x180000, 0x180fff) AM_RAM_WRITE(VS920A_0_vram_w) AM_BASE(&VS920A_0_vram) AM_RANGE(0x180000, 0x180fff) AM_RAM_WRITE(VS920A_0_vram_w) AM_BASE_MEMBER(gstriker_state, VS920A[0].vram)
AM_RANGE(0x181000, 0x181fff) AM_RAM AM_BASE(&gstriker_lineram) AM_RANGE(0x181000, 0x181fff) AM_RAM AM_BASE_MEMBER(gstriker_state, lineram)
AM_RANGE(0x1c0000, 0x1c4fff) AM_RAM_WRITE(paletteram16_xRRRRRGGGGGBBBBB_word_w) AM_BASE_GENERIC(paletteram) AM_RANGE(0x1c0000, 0x1c4fff) AM_RAM_WRITE(paletteram16_xRRRRRGGGGGBBBBB_word_w) AM_BASE_GENERIC(paletteram)
AM_RANGE(0x200000, 0x20000f) AM_RAM_WRITE(MB60553_0_regs_w) AM_RANGE(0x200000, 0x20000f) AM_RAM_WRITE(MB60553_0_regs_w)
AM_RANGE(0x200040, 0x20005f) AM_RAM //AM_BASE(&gs_mixer_regs) AM_RANGE(0x200040, 0x20005f) AM_RAM //AM_BASE(&gs_mixer_regs)
@ -338,7 +335,7 @@ static ADDRESS_MAP_START( vgoal_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x20008e, 0x20008f) AM_READ(dmmy_8f) AM_RANGE(0x20008e, 0x20008f) AM_READ(dmmy_8f)
AM_RANGE(0x2000a0, 0x2000a1) AM_WRITE(sound_command_w) AM_RANGE(0x2000a0, 0x2000a1) AM_WRITE(sound_command_w)
AM_RANGE(0xffc000, 0xffffff) AM_RAM AM_BASE(&work_ram) AM_RANGE(0xffc000, 0xffffff) AM_RAM AM_BASE_MEMBER(gstriker_state, work_ram)
ADDRESS_MAP_END ADDRESS_MAP_END
/*** INPUT PORTS *************************************************************/ /*** INPUT PORTS *************************************************************/
@ -546,7 +543,7 @@ INPUT_PORTS_END
/*** MACHINE DRIVER **********************************************************/ /*** MACHINE DRIVER **********************************************************/
static MACHINE_CONFIG_START( gstriker, driver_device ) static MACHINE_CONFIG_START( gstriker, gstriker_state )
MCFG_CPU_ADD("maincpu", M68000, 10000000) MCFG_CPU_ADD("maincpu", M68000, 10000000)
MCFG_CPU_PROGRAM_MAP(gstriker_map) MCFG_CPU_PROGRAM_MAP(gstriker_map)
MCFG_CPU_VBLANK_INT("screen", irq1_line_hold) MCFG_CPU_VBLANK_INT("screen", irq1_line_hold)
@ -585,7 +582,7 @@ static MACHINE_CONFIG_DERIVED( twrldc94, gstriker )
MACHINE_CONFIG_END MACHINE_CONFIG_END
static MACHINE_CONFIG_START( vgoal, driver_device ) static MACHINE_CONFIG_START( vgoal, gstriker_state )
MCFG_CPU_ADD("maincpu", M68000, 16000000) MCFG_CPU_ADD("maincpu", M68000, 16000000)
MCFG_CPU_PROGRAM_MAP(vgoal_map) MCFG_CPU_PROGRAM_MAP(vgoal_map)
MCFG_CPU_VBLANK_INT("screen", irq1_line_hold) MCFG_CPU_VBLANK_INT("screen", irq1_line_hold)
@ -830,34 +827,34 @@ the zooming.To use it,you should use Player 2 Start button to show the test scre
or to advance into the tests. or to advance into the tests.
******************************************************************************************/ ******************************************************************************************/
#define PC(_num_)\ #define PC(_num_)\
work_ram[0x000/2] = (_num_ & 0xffff0000) >> 16;\ state->work_ram[0x000/2] = (_num_ & 0xffff0000) >> 16;\
work_ram[0x002/2] = (_num_ & 0x0000ffff) >> 0; state->work_ram[0x002/2] = (_num_ & 0x0000ffff) >> 0;
static int gametype = 0;
static UINT16 mcu_data = 0;
static WRITE16_HANDLER( twrldc94_mcu_w ) static WRITE16_HANDLER( twrldc94_mcu_w )
{ {
mcu_data = data; gstriker_state *state = space->machine->driver_data<gstriker_state>();
state->mcu_data = data;
} }
static READ16_HANDLER( twrldc94_mcu_r ) static READ16_HANDLER( twrldc94_mcu_r )
{ {
return mcu_data; gstriker_state *state = space->machine->driver_data<gstriker_state>();
return state->mcu_data;
} }
static UINT16 prot_reg[2] = {0,0}; // current,last
static WRITE16_HANDLER( twrldc94_prot_reg_w ) static WRITE16_HANDLER( twrldc94_prot_reg_w )
{ {
prot_reg[1] = prot_reg[0]; gstriker_state *state = space->machine->driver_data<gstriker_state>();
prot_reg[0] = data; state->prot_reg[1] = state->prot_reg[0];
state->prot_reg[0] = data;
if( ((prot_reg[1] & 2) == 2) && ((prot_reg[0] & 2) == 0) ) if( ((state->prot_reg[1] & 2) == 2) && ((state->prot_reg[0] & 2) == 0) )
{ {
switch( gametype ) switch( state->gametype )
{ {
case 1: case 1:
switch(mcu_data) switch(state->mcu_data)
{ {
#define NULL_SUB 0x0000828E #define NULL_SUB 0x0000828E
case 0x53: PC(0x0000a4c); break; // boot -> main loop case 0x53: PC(0x0000a4c); break; // boot -> main loop
@ -917,19 +914,19 @@ static WRITE16_HANDLER( twrldc94_prot_reg_w )
case 0x6f: PC(NULL_SUB); break; case 0x6f: PC(NULL_SUB); break;
default: default:
popmessage("Unknown MCU CMD %04x",mcu_data); popmessage("Unknown MCU CMD %04x",state->mcu_data);
PC(NULL_SUB); PC(NULL_SUB);
break; break;
} }
break; break;
case 2: case 2:
switch(mcu_data) switch(state->mcu_data)
{ {
case 0x53: PC(0x00000a5c); break; // POST case 0x53: PC(0x00000a5c); break; // POST
default: default:
popmessage("Unknown MCU CMD %04x",mcu_data); popmessage("Unknown MCU CMD %04x",state->mcu_data);
PC(NULL_SUB); PC(NULL_SUB);
break; break;
} }
@ -937,7 +934,7 @@ static WRITE16_HANDLER( twrldc94_prot_reg_w )
case 3: case 3:
switch(mcu_data) switch(state->mcu_data)
{ {
case 0x33: PC(0x00063416); break; // *after game over, is this right? case 0x33: PC(0x00063416); break; // *after game over, is this right?
case 0x3d: PC(0x0006275C); break; // after sprite ram init, team select case 0x3d: PC(0x0006275C); break; // after sprite ram init, team select
@ -950,7 +947,7 @@ static WRITE16_HANDLER( twrldc94_prot_reg_w )
case 0x79: PC(0x0006072E); break; // after select, start match case 0x79: PC(0x0006072E); break; // after select, start match
default: default:
popmessage("Unknown MCU CMD %04x",mcu_data); popmessage("Unknown MCU CMD %04x",state->mcu_data);
PC(0x00000586); // rts PC(0x00000586); // rts
break; break;
} }
@ -961,11 +958,12 @@ static WRITE16_HANDLER( twrldc94_prot_reg_w )
static READ16_HANDLER( twrldc94_prot_reg_r ) static READ16_HANDLER( twrldc94_prot_reg_r )
{ {
gstriker_state *state = space->machine->driver_data<gstriker_state>();
// bit 0 is for debugging vgoalsoc? // bit 0 is for debugging vgoalsoc?
// Setting it results in a hang with a digit displayed on screen // Setting it results in a hang with a digit displayed on screen
// For twrldc94, it just disables sound. // For twrldc94, it just disables sound.
return prot_reg[0]; return state->prot_reg[0];
} }
/* /*
@ -979,15 +977,15 @@ static READ16_HANDLER( twrldc94_prot_reg_r )
The tick count is usually set to 0x3c => it's driven off vblank? The tick count is usually set to 0x3c => it's driven off vblank?
*/ */
//work_ram[ (0xffe900 - 0xffc00) ] //state->work_ram[ (0xffe900 - 0xffc00) ]
#define COUNTER1_ENABLE work_ram[0x2900/2] >> 8 #define COUNTER1_ENABLE state->work_ram[0x2900/2] >> 8
#define COUNTER2_ENABLE (work_ram[0x2900/2] & 0xff) #define COUNTER2_ENABLE (state->work_ram[0x2900/2] & 0xff)
#define TICK_1 work_ram[0x2908/2] #define TICK_1 state->work_ram[0x2908/2]
#define TICKCOUNT_1 work_ram[0x290a/2] #define TICKCOUNT_1 state->work_ram[0x290a/2]
#define TICK_2 work_ram[0x290c/2] #define TICK_2 state->work_ram[0x290c/2]
#define TICKCOUNT_3 work_ram[0x290e/2] #define TICKCOUNT_3 state->work_ram[0x290e/2]
#define COUNTER_1 work_ram[0x2928/2] #define COUNTER_1 state->work_ram[0x2928/2]
#define COUNTER_2 work_ram[0x292a/2] #define COUNTER_2 state->work_ram[0x292a/2]
static READ16_HANDLER( vbl_toggle_r ) static READ16_HANDLER( vbl_toggle_r )
{ {
return 0xff; return 0xff;
@ -995,6 +993,7 @@ static READ16_HANDLER( vbl_toggle_r )
static WRITE16_HANDLER( vbl_toggle_w ) static WRITE16_HANDLER( vbl_toggle_w )
{ {
gstriker_state *state = space->machine->driver_data<gstriker_state>();
if( COUNTER1_ENABLE == 1 ) if( COUNTER1_ENABLE == 1 )
{ {
TICK_1 = (TICK_1 - 1) & 0xff; // 8bit TICK_1 = (TICK_1 - 1) & 0xff; // 8bit
@ -1018,9 +1017,10 @@ static WRITE16_HANDLER( vbl_toggle_w )
static void mcu_init( running_machine *machine ) static void mcu_init( running_machine *machine )
{ {
dmmy_8f_ret = 0xFFFF; gstriker_state *state = machine->driver_data<gstriker_state>();
pending_command = 0; state->dmmy_8f_ret = 0xFFFF;
mcu_data = 0; state->pending_command = 0;
state->mcu_data = 0;
memory_install_write16_handler(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x20008a, 0x20008b, 0, 0, twrldc94_mcu_w); memory_install_write16_handler(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x20008a, 0x20008b, 0, 0, twrldc94_mcu_w);
memory_install_read16_handler(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x20008a, 0x20008b, 0, 0, twrldc94_mcu_r); memory_install_read16_handler(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x20008a, 0x20008b, 0, 0, twrldc94_mcu_r);
@ -1031,19 +1031,22 @@ static void mcu_init( running_machine *machine )
static DRIVER_INIT( twrldc94 ) static DRIVER_INIT( twrldc94 )
{ {
gametype = 1; gstriker_state *state = machine->driver_data<gstriker_state>();
state->gametype = 1;
mcu_init( machine ); mcu_init( machine );
} }
static DRIVER_INIT( twrldc94a ) static DRIVER_INIT( twrldc94a )
{ {
gametype = 2; gstriker_state *state = machine->driver_data<gstriker_state>();
state->gametype = 2;
mcu_init( machine ); mcu_init( machine );
} }
static DRIVER_INIT( vgoalsoc ) static DRIVER_INIT( vgoalsoc )
{ {
gametype = 3; gstriker_state *state = machine->driver_data<gstriker_state>();
state->gametype = 3;
mcu_init( machine ); mcu_init( machine );
memory_install_write16_handler(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x200090, 0x200091, 0, 0, vbl_toggle_w); // vblank toggle memory_install_write16_handler(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x200090, 0x200091, 0, 0, vbl_toggle_w); // vblank toggle

View File

@ -87,7 +87,6 @@ L056-6 9A " " VLI-8-4 7A "
#define VBEND (16) #define VBEND (16)
#define VBSTART (224+16) #define VBSTART (224+16)
static UINT8 *cop_io;
/************************************* /*************************************
* *
@ -105,12 +104,15 @@ public:
UINT8 * videoram; UINT8 * videoram;
UINT8 * colorram; UINT8 * colorram;
UINT8 * spriteram; UINT8 * spriteram;
UINT8 * cop_io;
/* tilemaps */ /* tilemaps */
tilemap_t * bg_tilemap; tilemap_t * bg_tilemap;
/* sound state */ /* sound state */
UINT8 sound[8]; UINT8 sound[8];
int last;
}; };
@ -402,10 +404,10 @@ static WRITE8_DEVICE_HANDLER( speech_enable_w )
static WRITE8_HANDLER( ballon_enable_w ) static WRITE8_HANDLER( ballon_enable_w )
{ {
static int last; looping_state *state = space->machine->driver_data<looping_state>();
if (last != data) if (state->last != data)
mame_printf_debug("ballon_enable_w = %d\n", data); mame_printf_debug("ballon_enable_w = %d\n", data);
last = data; state->last = data;
} }
@ -438,18 +440,21 @@ static WRITE8_HANDLER( plr2_w )
static READ8_HANDLER( cop_io_r ) static READ8_HANDLER( cop_io_r )
{ {
//looping_state *state = space->machine->driver_data<looping_state>();
// if (offset == 1) return space->machine->rand() & 0x01; // if (offset == 1) return space->machine->rand() & 0x01;
return 1; // cop_io[offset]; return 1; // state->cop_io[offset];
} }
static WRITE8_HANDLER( cop_io_w ) static WRITE8_HANDLER( cop_io_w )
{ {
cop_io[offset] = data; looping_state *state = space->machine->driver_data<looping_state>();
state->cop_io[offset] = data;
if (offset == 0) logerror("%02x ",data); if (offset == 0) logerror("%02x ",data);
} }
static READ8_HANDLER( protection_r ) static READ8_HANDLER( protection_r )
{ {
looping_state *state = space->machine->driver_data<looping_state>();
// The code reads ($7002) ($7004) alternately // The code reads ($7002) ($7004) alternately
// The result must change at least once every 10 reads // The result must change at least once every 10 reads
// A read from ($34b0 + result) must == $01 // A read from ($34b0 + result) must == $01
@ -468,7 +473,7 @@ static READ8_HANDLER( protection_r )
// cop write randomly fc (unfortunatly) but 61,67,b7,bf,db,e1,f3,fd,ff too and only these values // cop write randomly fc (unfortunatly) but 61,67,b7,bf,db,e1,f3,fd,ff too and only these values
// missing something // missing something
if(cop_io[0] != 0xfc) return cop_io[0]; if(state->cop_io[0] != 0xfc) return state->cop_io[0];
return 0xff; return 0xff;
} }
@ -882,11 +887,12 @@ ROM_END
static DRIVER_INIT( looping ) static DRIVER_INIT( looping )
{ {
looping_state *state = machine->driver_data<looping_state>();
int length = machine->region("maincpu")->bytes(); int length = machine->region("maincpu")->bytes();
UINT8 *rom = machine->region("maincpu")->base(); UINT8 *rom = machine->region("maincpu")->base();
int i; int i;
cop_io = auto_alloc_array(machine, UINT8, 0x08); state->cop_io = auto_alloc_array(machine, UINT8, 0x08);
/* bitswap the TMS9995 ROMs */ /* bitswap the TMS9995 ROMs */
for (i = 0; i < length; i++) for (i = 0; i < length; i++)

View File

@ -1470,7 +1470,7 @@ static READ64_HANDLER( model3_sys_r )
else logerror("m3_sys: Unk sys_r @ 0x10: mask = %x\n", (UINT32)mem_mask); else logerror("m3_sys: Unk sys_r @ 0x10: mask = %x\n", (UINT32)mem_mask);
break; break;
case 0x18/8: case 0x18/8:
// printf("read state->irq_state %x (PC %x)\n", state->irq_state, cpu_get_pc(space->cpu)); // printf("read irq_state %x (PC %x)\n", state->irq_state, cpu_get_pc(space->cpu));
return (UINT64)state->irq_state<<56 | 0xff000000; return (UINT64)state->irq_state<<56 | 0xff000000;
break; break;
} }

View File

@ -1562,7 +1562,7 @@ static WRITE8_DEVICE_HANDLER( pia_ic8_portb_w )
static WRITE_LINE_DEVICE_HANDLER( pia_ic8_ca2_w ) static WRITE_LINE_DEVICE_HANDLER( pia_ic8_ca2_w )
{ {
mpu4_state *drvstate = device->machine->driver_data<mpu4_state>(); mpu4_state *drvstate = device->machine->driver_data<mpu4_state>();
LOG_IC8(("%s: IC8 PIA write CA2 (drvstate->input_strobe bit 2 / LED C) %02X\n", device->machine->describe_context(), state & 0xFF)); LOG_IC8(("%s: IC8 PIA write CA2 (input_strobe bit 2 / LED C) %02X\n", device->machine->describe_context(), state & 0xFF));
drvstate->IC23GC = state; drvstate->IC23GC = state;
ic23_update(drvstate); ic23_update(drvstate);

View File

@ -171,19 +171,15 @@ Super Strong Warriors
#include "machine/ms32crpt.h" #include "machine/ms32crpt.h"
#include "includes/ms32.h" #include "includes/ms32.h"
static UINT8 *ms32_nvram_8;
static UINT32 *ms32_mahjong_input_select;
static UINT32 to_main;
/********** READ INPUTS **********/ /********** READ INPUTS **********/
static CUSTOM_INPUT( mahjong_ctrl_r ) static CUSTOM_INPUT( mahjong_ctrl_r )
{ {
ms32_state *state = field->port->machine->driver_data<ms32_state>();
UINT32 mj_input; UINT32 mj_input;
switch (ms32_mahjong_input_select[0]) switch (state->mahjong_input_select[0])
{ {
case 0x01: case 0x01:
mj_input = input_port_read(field->port->machine, "MJ0"); mj_input = input_port_read(field->port->machine, "MJ0");
@ -231,7 +227,8 @@ static WRITE32_HANDLER( ms32_sound_w )
static READ32_HANDLER( ms32_sound_r ) static READ32_HANDLER( ms32_sound_r )
{ {
return to_main^0xff; ms32_state *state = space->machine->driver_data<ms32_state>();
return state->to_main^0xff;
} }
static WRITE32_HANDLER( reset_sub_w ) static WRITE32_HANDLER( reset_sub_w )
@ -245,26 +242,110 @@ static WRITE32_HANDLER( reset_sub_w )
/********** MEMORY MAP **********/ /********** MEMORY MAP **********/
static READ8_HANDLER( ms32_nvram_r8 ) { return ms32_nvram_8[offset]; } static READ8_HANDLER( ms32_nvram_r8 )
static WRITE8_HANDLER( ms32_nvram_w8 ) { ms32_nvram_8[offset] = data; } {
static READ8_HANDLER( ms32_priram_r8 ) { return ms32_priram_8[offset]; } ms32_state *state = space->machine->driver_data<ms32_state>();
static WRITE8_HANDLER( ms32_priram_w8 ) { ms32_priram_8[offset] = data; } return state->nvram_8[offset];
static READ16_HANDLER( ms32_palram_r16 ) { return ms32_palram_16[offset]; } }
static WRITE16_HANDLER( ms32_palram_w16 ) { COMBINE_DATA(&ms32_palram_16[offset]); }
static READ16_HANDLER( ms32_rozram_r16 ) { return ms32_rozram_16[offset]; } static WRITE8_HANDLER( ms32_nvram_w8 )
static WRITE16_HANDLER( ms32_rozram_w16 ) { COMBINE_DATA(&ms32_rozram_16[offset]); tilemap_mark_tile_dirty(ms32_roz_tilemap,offset/2); } {
static READ16_HANDLER( ms32_lineram_r16 ) { return ms32_lineram_16[offset]; } ms32_state *state = space->machine->driver_data<ms32_state>();
static WRITE16_HANDLER( ms32_lineram_w16 ) { COMBINE_DATA(&ms32_lineram_16[offset]); } state->nvram_8[offset] = data;
static READ16_HANDLER( ms32_sprram_r16 ) { return ms32_sprram_16[offset]; } }
static WRITE16_HANDLER( ms32_sprram_w16 ) { COMBINE_DATA(&ms32_sprram_16[offset]); }
static READ16_HANDLER( ms32_txram_r16 ) { return ms32_txram_16[offset]; } static READ8_HANDLER( ms32_priram_r8 )
static WRITE16_HANDLER( ms32_txram_w16 ) { COMBINE_DATA(&ms32_txram_16[offset]); tilemap_mark_tile_dirty(ms32_tx_tilemap,offset/2); } {
static READ16_HANDLER( ms32_bgram_r16 ) { return ms32_bgram_16[offset]; } ms32_state *state = space->machine->driver_data<ms32_state>();
static WRITE16_HANDLER( ms32_bgram_w16 ) { COMBINE_DATA(&ms32_bgram_16[offset]); tilemap_mark_tile_dirty(ms32_bg_tilemap,offset/2); tilemap_mark_tile_dirty(ms32_bg_tilemap_alt,offset/2); } return state->priram_8[offset];
}
static WRITE8_HANDLER( ms32_priram_w8 )
{
ms32_state *state = space->machine->driver_data<ms32_state>();
state->priram_8[offset] = data;
}
static READ16_HANDLER( ms32_palram_r16 )
{
ms32_state *state = space->machine->driver_data<ms32_state>();
return state->palram_16[offset];
}
static WRITE16_HANDLER( ms32_palram_w16 )
{
ms32_state *state = space->machine->driver_data<ms32_state>();
COMBINE_DATA(&state->palram_16[offset]);
}
static READ16_HANDLER( ms32_rozram_r16 )
{
ms32_state *state = space->machine->driver_data<ms32_state>();
return state->rozram_16[offset];
}
static WRITE16_HANDLER( ms32_rozram_w16 )
{
ms32_state *state = space->machine->driver_data<ms32_state>();
COMBINE_DATA(&state->rozram_16[offset]);
tilemap_mark_tile_dirty(state->roz_tilemap,offset/2);
}
static READ16_HANDLER( ms32_lineram_r16 )
{
ms32_state *state = space->machine->driver_data<ms32_state>();
return state->lineram_16[offset];
}
static WRITE16_HANDLER( ms32_lineram_w16 )
{
ms32_state *state = space->machine->driver_data<ms32_state>();
COMBINE_DATA(&state->lineram_16[offset]);
}
static READ16_HANDLER( ms32_sprram_r16 )
{
ms32_state *state = space->machine->driver_data<ms32_state>();
return state->sprram_16[offset];
}
static WRITE16_HANDLER( ms32_sprram_w16 )
{
ms32_state *state = space->machine->driver_data<ms32_state>();
COMBINE_DATA(&state->sprram_16[offset]);
}
static READ16_HANDLER( ms32_txram_r16 )
{
ms32_state *state = space->machine->driver_data<ms32_state>();
return state->txram_16[offset];
}
static WRITE16_HANDLER( ms32_txram_w16 )
{
ms32_state *state = space->machine->driver_data<ms32_state>();
COMBINE_DATA(&state->txram_16[offset]);
tilemap_mark_tile_dirty(state->tx_tilemap,offset/2);
}
static READ16_HANDLER( ms32_bgram_r16 )
{
ms32_state *state = space->machine->driver_data<ms32_state>();
return state->bgram_16[offset];
}
static WRITE16_HANDLER( ms32_bgram_w16 )
{
ms32_state *state = space->machine->driver_data<ms32_state>();
COMBINE_DATA(&state->bgram_16[offset]);
tilemap_mark_tile_dirty(state->bg_tilemap,offset/2);
tilemap_mark_tile_dirty(state->bg_tilemap_alt,offset/2);
}
static WRITE32_HANDLER( pip_w ) static WRITE32_HANDLER( pip_w )
{ {
ms32_tilemaplayoutcontrol = data; ms32_state *state = space->machine->driver_data<ms32_state>();
state->tilemaplayoutcontrol = data;
if ((data) && (data != 1)) if ((data) && (data != 1))
popmessage("fce00a7c = %02x",data); popmessage("fce00a7c = %02x",data);
@ -288,7 +369,7 @@ static ADDRESS_MAP_START( ms32_map, ADDRESS_SPACE_PROGRAM, 32 )
AM_RANGE(0xc2c00000, 0xc2c07fff) AM_READWRITE16(ms32_txram_r16, ms32_txram_w16, 0x0000ffff) AM_MIRROR(0x3c1f0000) /* txram is 16-bit wide, 0x4000 in size */ AM_RANGE(0xc2c00000, 0xc2c07fff) AM_READWRITE16(ms32_txram_r16, ms32_txram_w16, 0x0000ffff) AM_MIRROR(0x3c1f0000) /* txram is 16-bit wide, 0x4000 in size */
AM_RANGE(0xc2c08000, 0xc2c0ffff) AM_READWRITE16(ms32_bgram_r16, ms32_bgram_w16, 0x0000ffff) AM_MIRROR(0x3c1f0000) /* bgram is 16-bit wide, 0x4000 in size */ AM_RANGE(0xc2c08000, 0xc2c0ffff) AM_READWRITE16(ms32_bgram_r16, ms32_bgram_w16, 0x0000ffff) AM_MIRROR(0x3c1f0000) /* bgram is 16-bit wide, 0x4000 in size */
/* AM_RANGE(0xc2c10000, 0xc2dfffff) // mirrors of txram / bg, handled above */ /* AM_RANGE(0xc2c10000, 0xc2dfffff) // mirrors of txram / bg, handled above */
AM_RANGE(0xc2e00000, 0xc2e1ffff) AM_RAM AM_BASE(&ms32_mainram) AM_MIRROR(0x3c0e0000) /* mainram is 32-bit wide, 0x20000 in size */ AM_RANGE(0xc2e00000, 0xc2e1ffff) AM_RAM AM_BASE_MEMBER(ms32_state, mainram) AM_MIRROR(0x3c0e0000) /* mainram is 32-bit wide, 0x20000 in size */
AM_RANGE(0xc3e00000, 0xc3ffffff) AM_ROMBANK("bank1") AM_MIRROR(0x3c000000) // ROM is 32-bit wide, 0x200000 in size */ AM_RANGE(0xc3e00000, 0xc3ffffff) AM_ROMBANK("bank1") AM_MIRROR(0x3c000000) // ROM is 32-bit wide, 0x200000 in size */
/* todo: clean up the mapping of these */ /* todo: clean up the mapping of these */
@ -302,21 +383,30 @@ static ADDRESS_MAP_START( ms32_map, ADDRESS_SPACE_PROGRAM, 32 )
// AM_RANGE(0xfce00000, 0xfce0007f) AM_WRITEONLY AM_BASE(&ms32_fce00000) /* registers not ram? */ // AM_RANGE(0xfce00000, 0xfce0007f) AM_WRITEONLY AM_BASE(&ms32_fce00000) /* registers not ram? */
AM_RANGE(0xfce00000, 0xfce00003) AM_WRITE(ms32_gfxctrl_w) /* flip screen + other unknown bits */ AM_RANGE(0xfce00000, 0xfce00003) AM_WRITE(ms32_gfxctrl_w) /* flip screen + other unknown bits */
AM_RANGE(0xfce00280, 0xfce0028f) AM_WRITE(ms32_brightness_w) // global brightness control AM_RANGE(0xfce00280, 0xfce0028f) AM_WRITE(ms32_brightness_w) // global brightness control
/**/AM_RANGE(0xfce00600, 0xfce0065f) AM_RAM AM_BASE(&ms32_roz_ctrl) /* roz control registers */ /**/AM_RANGE(0xfce00600, 0xfce0065f) AM_RAM AM_BASE_MEMBER(ms32_state, roz_ctrl) /* roz control registers */
/**/AM_RANGE(0xfce00a00, 0xfce00a17) AM_RAM AM_BASE(&ms32_tx_scroll) /* tx layer scroll */ /**/AM_RANGE(0xfce00a00, 0xfce00a17) AM_RAM AM_BASE_MEMBER(ms32_state, tx_scroll) /* tx layer scroll */
/**/AM_RANGE(0xfce00a20, 0xfce00a37) AM_RAM AM_BASE(&ms32_bg_scroll) /* bg layer scroll */ /**/AM_RANGE(0xfce00a20, 0xfce00a37) AM_RAM AM_BASE_MEMBER(ms32_state, bg_scroll) /* bg layer scroll */
AM_RANGE(0xfce00a7c, 0xfce00a7f) AM_WRITE(pip_w) // ??? layer related? seems to be always 0 AM_RANGE(0xfce00a7c, 0xfce00a7f) AM_WRITE(pip_w) // ??? layer related? seems to be always 0
// AM_RANGE(0xfce00e00, 0xfce00e03) coin counters + something else // AM_RANGE(0xfce00e00, 0xfce00e03) coin counters + something else
AM_RANGE(0xfd000000, 0xfd000003) AM_READ(ms32_sound_r) AM_RANGE(0xfd000000, 0xfd000003) AM_READ(ms32_sound_r)
AM_RANGE(0xfd1c0000, 0xfd1c0003) AM_WRITEONLY AM_BASE(&ms32_mahjong_input_select) AM_RANGE(0xfd1c0000, 0xfd1c0003) AM_WRITEONLY AM_BASE_MEMBER(ms32_state, mahjong_input_select)
ADDRESS_MAP_END ADDRESS_MAP_END
/* F1 Super Battle has an extra linemap for the road, and am unknown maths chip (mcu?) handling perspective calculations for the road / corners etc. */ /* F1 Super Battle has an extra linemap for the road, and am unknown maths chip (mcu?) handling perspective calculations for the road / corners etc. */
/* it should use it's own memory map */ /* it should use it's own memory map */
static WRITE16_HANDLER( ms32_extra_w16 ) { COMBINE_DATA(&f1superb_extraram_16[offset]); tilemap_mark_tile_dirty(ms32_extra_tilemap,offset/2); } static WRITE16_HANDLER( ms32_extra_w16 )
static READ16_HANDLER( ms32_extra_r16 ) { return f1superb_extraram_16[offset]; } {
ms32_state *state = space->machine->driver_data<ms32_state>();
COMBINE_DATA(&state->f1superb_extraram_16[offset]);
tilemap_mark_tile_dirty(state->extra_tilemap,offset/2);
}
static READ16_HANDLER( ms32_extra_r16 )
{
ms32_state *state = space->machine->driver_data<ms32_state>();
return state->f1superb_extraram_16[offset];
}
static void irq_raise(running_machine *machine, int level); static void irq_raise(running_machine *machine, int level);
@ -1205,28 +1295,30 @@ GFXDECODE_END
10 - 6d4 - big, vbl? 10 - 6d4 - big, vbl?
*/ */
static UINT16 irqreq;
static IRQ_CALLBACK(irq_callback) static IRQ_CALLBACK(irq_callback)
{ {
ms32_state *state = device->machine->driver_data<ms32_state>();
int i; int i;
for(i=15; i>=0 && !(irqreq & (1<<i)); i--); for(i=15; i>=0 && !(state->irqreq & (1<<i)); i--);
irqreq &= ~(1<<i); state->irqreq &= ~(1<<i);
if(!irqreq) if(!state->irqreq)
cpu_set_input_line(device, 0, CLEAR_LINE); cpu_set_input_line(device, 0, CLEAR_LINE);
return i; return i;
} }
static void irq_init(running_machine *machine) static void irq_init(running_machine *machine)
{ {
irqreq = 0; ms32_state *state = machine->driver_data<ms32_state>();
state->irqreq = 0;
cputag_set_input_line(machine, "maincpu", 0, CLEAR_LINE); cputag_set_input_line(machine, "maincpu", 0, CLEAR_LINE);
cpu_set_irq_callback(machine->device("maincpu"), irq_callback); cpu_set_irq_callback(machine->device("maincpu"), irq_callback);
} }
static void irq_raise(running_machine *machine, int level) static void irq_raise(running_machine *machine, int level)
{ {
irqreq |= (1<<level); ms32_state *state = machine->driver_data<ms32_state>();
state->irqreq |= (1<<level);
cputag_set_input_line(machine, "maincpu", 0, ASSERT_LINE); cputag_set_input_line(machine, "maincpu", 0, ASSERT_LINE);
} }
@ -1282,7 +1374,8 @@ static WRITE8_HANDLER( ms32_snd_bank_w )
static WRITE8_HANDLER( to_main_w ) static WRITE8_HANDLER( to_main_w )
{ {
to_main=data; ms32_state *state = space->machine->driver_data<ms32_state>();
state->to_main=data;
irq_raise(space->machine, 1); irq_raise(space->machine, 1);
} }
@ -1313,7 +1406,7 @@ static MACHINE_RESET( ms32 )
/********** MACHINE DRIVER **********/ /********** MACHINE DRIVER **********/
static MACHINE_CONFIG_START( ms32, driver_device ) static MACHINE_CONFIG_START( ms32, ms32_state )
/* basic machine hardware */ /* basic machine hardware */
MCFG_CPU_ADD("maincpu", V70, 20000000) // 20MHz MCFG_CPU_ADD("maincpu", V70, 20000000) // 20MHz
@ -2125,14 +2218,16 @@ ROM_END
static void configure_banks(running_machine *machine) static void configure_banks(running_machine *machine)
{ {
state_save_register_global(machine, to_main); ms32_state *state = machine->driver_data<ms32_state>();
state_save_register_global(machine, state->to_main);
memory_configure_bank(machine, "bank4", 0, 16, machine->region("audiocpu")->base() + 0x14000, 0x4000); memory_configure_bank(machine, "bank4", 0, 16, machine->region("audiocpu")->base() + 0x14000, 0x4000);
memory_configure_bank(machine, "bank5", 0, 16, machine->region("audiocpu")->base() + 0x14000, 0x4000); memory_configure_bank(machine, "bank5", 0, 16, machine->region("audiocpu")->base() + 0x14000, 0x4000);
} }
static DRIVER_INIT( ms32_common ) static DRIVER_INIT( ms32_common )
{ {
ms32_nvram_8 = auto_alloc_array(machine, UINT8, 0x2000); ms32_state *state = machine->driver_data<ms32_state>();
state->nvram_8 = auto_alloc_array(machine, UINT8, 0x2000);
configure_banks(machine); configure_banks(machine);
} }

View File

@ -168,13 +168,6 @@ OSC3: 48.384MHz
#include "includes/namcofl.h" #include "includes/namcofl.h"
static emu_timer *raster_interrupt_timer;
static UINT32 *namcofl_workram;
static UINT16 *namcofl_shareram;
static UINT8 mcu_port6;
static READ32_HANDLER( fl_unk1_r ) static READ32_HANDLER( fl_unk1_r )
{ {
return 0xffffffff; return 0xffffffff;
@ -192,23 +185,25 @@ static READ32_HANDLER( namcofl_sysreg_r )
static WRITE32_HANDLER( namcofl_sysreg_w ) static WRITE32_HANDLER( namcofl_sysreg_w )
{ {
namcofl_state *state = space->machine->driver_data<namcofl_state>();
if ((offset == 2) && ACCESSING_BITS_0_7) // address space configuration if ((offset == 2) && ACCESSING_BITS_0_7) // address space configuration
{ {
if (data == 0) // RAM at 00000000, ROM at 10000000 if (data == 0) // RAM at 00000000, ROM at 10000000
{ {
memory_set_bankptr(space->machine, "bank1", namcofl_workram ); memory_set_bankptr(space->machine, "bank1", state->workram );
memory_set_bankptr(space->machine, "bank2", space->machine->region("maincpu")->base() ); memory_set_bankptr(space->machine, "bank2", space->machine->region("maincpu")->base() );
} }
else // ROM at 00000000, RAM at 10000000 else // ROM at 00000000, RAM at 10000000
{ {
memory_set_bankptr(space->machine, "bank1", space->machine->region("maincpu")->base() ); memory_set_bankptr(space->machine, "bank1", space->machine->region("maincpu")->base() );
memory_set_bankptr(space->machine, "bank2", namcofl_workram ); memory_set_bankptr(space->machine, "bank2", state->workram );
} }
} }
} }
static WRITE32_HANDLER( namcofl_paletteram_w ) static WRITE32_HANDLER( namcofl_paletteram_w )
{ {
namcofl_state *state = space->machine->driver_data<namcofl_state>();
COMBINE_DATA(&space->machine->generic.paletteram.u32[offset]); COMBINE_DATA(&space->machine->generic.paletteram.u32[offset]);
if ((offset == 0x1808/4) && ACCESSING_BITS_16_31) if ((offset == 0x1808/4) && ACCESSING_BITS_16_31)
@ -216,21 +211,23 @@ static WRITE32_HANDLER( namcofl_paletteram_w )
UINT16 v = space->machine->generic.paletteram.u32[offset] >> 16; UINT16 v = space->machine->generic.paletteram.u32[offset] >> 16;
UINT16 triggerscanline=(((v>>8)&0xff)|((v&0xff)<<8))-(32+1); UINT16 triggerscanline=(((v>>8)&0xff)|((v&0xff)<<8))-(32+1);
raster_interrupt_timer->adjust(space->machine->primary_screen->time_until_pos(triggerscanline)); state->raster_interrupt_timer->adjust(space->machine->primary_screen->time_until_pos(triggerscanline));
} }
} }
static READ32_HANDLER( namcofl_share_r ) static READ32_HANDLER( namcofl_share_r )
{ {
return (namcofl_shareram[offset*2+1] << 16) | namcofl_shareram[offset*2]; namcofl_state *state = space->machine->driver_data<namcofl_state>();
return (state->shareram[offset*2+1] << 16) | state->shareram[offset*2];
} }
static WRITE32_HANDLER( namcofl_share_w ) static WRITE32_HANDLER( namcofl_share_w )
{ {
COMBINE_DATA(namcofl_shareram+offset*2); namcofl_state *state = space->machine->driver_data<namcofl_state>();
COMBINE_DATA(state->shareram+offset*2);
data >>= 16; data >>= 16;
mem_mask >>= 16; mem_mask >>= 16;
COMBINE_DATA(namcofl_shareram+offset*2+1); COMBINE_DATA(state->shareram+offset*2+1);
} }
static ADDRESS_MAP_START( namcofl_mem, ADDRESS_SPACE_PROGRAM, 32 ) static ADDRESS_MAP_START( namcofl_mem, ADDRESS_SPACE_PROGRAM, 32 )
@ -256,6 +253,7 @@ ADDRESS_MAP_END
static WRITE16_HANDLER( mcu_shared_w ) static WRITE16_HANDLER( mcu_shared_w )
{ {
namcofl_state *state = space->machine->driver_data<namcofl_state>();
// HACK! Many games data ROM routines redirect the vector from the sound command read to an RTS. // HACK! Many games data ROM routines redirect the vector from the sound command read to an RTS.
// This needs more investigation. nebulray and vshoot do NOT do this. // This needs more investigation. nebulray and vshoot do NOT do this.
// Timers A2 and A3 are set up in "external input counter" mode, this may be related. // Timers A2 and A3 are set up in "external input counter" mode, this may be related.
@ -266,7 +264,7 @@ static WRITE16_HANDLER( mcu_shared_w )
} }
#endif #endif
COMBINE_DATA(&namcofl_shareram[offset]); COMBINE_DATA(&state->shareram[offset]);
// C75 BIOS has a very short window on the CPU sync signal, so immediately let the i960 at it // C75 BIOS has a very short window on the CPU sync signal, so immediately let the i960 at it
if ((offset == 0x6000/2) && (data & 0x80)) if ((offset == 0x6000/2) && (data & 0x80))
@ -278,17 +276,20 @@ static WRITE16_HANDLER( mcu_shared_w )
static READ8_HANDLER( port6_r ) static READ8_HANDLER( port6_r )
{ {
return mcu_port6; namcofl_state *state = space->machine->driver_data<namcofl_state>();
return state->mcu_port6;
} }
static WRITE8_HANDLER( port6_w ) static WRITE8_HANDLER( port6_w )
{ {
mcu_port6 = data; namcofl_state *state = space->machine->driver_data<namcofl_state>();
state->mcu_port6 = data;
} }
static READ8_HANDLER( port7_r ) static READ8_HANDLER( port7_r )
{ {
switch (mcu_port6 & 0xf0) namcofl_state *state = space->machine->driver_data<namcofl_state>();
switch (state->mcu_port6 & 0xf0)
{ {
case 0x00: case 0x00:
return input_port_read(space->machine, "IN0"); return input_port_read(space->machine, "IN0");
@ -332,7 +333,7 @@ static READ8_HANDLER(dac0_r) { return 0xff; }
static ADDRESS_MAP_START( namcoc75_am, ADDRESS_SPACE_PROGRAM, 16 ) static ADDRESS_MAP_START( namcoc75_am, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x002000, 0x002fff) AM_DEVREADWRITE("c352", c352_r, c352_w) AM_RANGE(0x002000, 0x002fff) AM_DEVREADWRITE("c352", c352_r, c352_w)
AM_RANGE(0x004000, 0x00bfff) AM_RAM_WRITE(mcu_shared_w) AM_BASE(&namcofl_shareram) AM_RANGE(0x004000, 0x00bfff) AM_RAM_WRITE(mcu_shared_w) AM_BASE_MEMBER(namcofl_state, shareram)
AM_RANGE(0x00c000, 0x00ffff) AM_ROM AM_REGION("c75", 0) AM_RANGE(0x00c000, 0x00ffff) AM_ROM AM_REGION("c75", 0)
AM_RANGE(0x200000, 0x27ffff) AM_ROM AM_REGION("c75data", 0) AM_RANGE(0x200000, 0x27ffff) AM_ROM AM_REGION("c75data", 0)
ADDRESS_MAP_END ADDRESS_MAP_END
@ -548,9 +549,10 @@ static TIMER_CALLBACK( vblank_interrupt_callback )
static TIMER_CALLBACK( raster_interrupt_callback ) static TIMER_CALLBACK( raster_interrupt_callback )
{ {
namcofl_state *state = machine->driver_data<namcofl_state>();
machine->primary_screen->update_partial(machine->primary_screen->vpos()); machine->primary_screen->update_partial(machine->primary_screen->vpos());
cputag_set_input_line(machine, "maincpu", I960_IRQ1, ASSERT_LINE); cputag_set_input_line(machine, "maincpu", I960_IRQ1, ASSERT_LINE);
raster_interrupt_timer->adjust(machine->primary_screen->frame_period()); state->raster_interrupt_timer->adjust(machine->primary_screen->frame_period());
} }
static INTERRUPT_GEN( mcu_interrupt ) static INTERRUPT_GEN( mcu_interrupt )
@ -571,23 +573,25 @@ static INTERRUPT_GEN( mcu_interrupt )
static MACHINE_START( namcofl ) static MACHINE_START( namcofl )
{ {
raster_interrupt_timer = machine->scheduler().timer_alloc(FUNC(raster_interrupt_callback)); namcofl_state *state = machine->driver_data<namcofl_state>();
state->raster_interrupt_timer = machine->scheduler().timer_alloc(FUNC(raster_interrupt_callback));
} }
static MACHINE_RESET( namcofl ) static MACHINE_RESET( namcofl )
{ {
namcofl_state *state = machine->driver_data<namcofl_state>();
machine->scheduler().timer_set(machine->primary_screen->time_until_pos(machine->primary_screen->visible_area().max_y + 3), FUNC(network_interrupt_callback)); machine->scheduler().timer_set(machine->primary_screen->time_until_pos(machine->primary_screen->visible_area().max_y + 3), FUNC(network_interrupt_callback));
machine->scheduler().timer_set(machine->primary_screen->time_until_pos(machine->primary_screen->visible_area().max_y + 1), FUNC(vblank_interrupt_callback)); machine->scheduler().timer_set(machine->primary_screen->time_until_pos(machine->primary_screen->visible_area().max_y + 1), FUNC(vblank_interrupt_callback));
memory_set_bankptr(machine, "bank1", machine->region("maincpu")->base() ); memory_set_bankptr(machine, "bank1", machine->region("maincpu")->base() );
memory_set_bankptr(machine, "bank2", namcofl_workram ); memory_set_bankptr(machine, "bank2", state->workram );
memset(namcofl_workram, 0x00, 0x100000); memset(state->workram, 0x00, 0x100000);
} }
static MACHINE_CONFIG_START( namcofl, driver_device ) static MACHINE_CONFIG_START( namcofl, namcofl_state )
MCFG_CPU_ADD("maincpu", I960, 20000000) // i80960KA-20 == 20 MHz part MCFG_CPU_ADD("maincpu", I960, 20000000) // i80960KA-20 == 20 MHz part
MCFG_CPU_PROGRAM_MAP(namcofl_mem) MCFG_CPU_PROGRAM_MAP(namcofl_mem)
@ -806,10 +810,11 @@ ROM_END
static void namcofl_common_init(running_machine *machine) static void namcofl_common_init(running_machine *machine)
{ {
namcofl_workram = auto_alloc_array(machine, UINT32, 0x100000/4); namcofl_state *state = machine->driver_data<namcofl_state>();
state->workram = auto_alloc_array(machine, UINT32, 0x100000/4);
memory_set_bankptr(machine, "bank1", machine->region("maincpu")->base() ); memory_set_bankptr(machine, "bank1", machine->region("maincpu")->base() );
memory_set_bankptr(machine, "bank2", namcofl_workram ); memory_set_bankptr(machine, "bank2", state->workram );
} }
static DRIVER_INIT(speedrcr) static DRIVER_INIT(speedrcr)

View File

@ -703,7 +703,7 @@ nth_byte32( const UINT32 *pSource, int which )
/**************************************************************************************************************/ /**************************************************************************************************************/
static int (*mpCodeToTile)( int code ); /* sprite banking callback */ static int (*mpCodeToTile)( running_machine *machine, int code ); /* sprite banking callback */
static int mGfxC355; /* gfx bank for sprites */ static int mGfxC355; /* gfx bank for sprites */
/** /**
@ -877,7 +877,7 @@ draw_spriteC355(running_machine *machine, bitmap_t *bitmap, const rectangle *cli
bitmap, bitmap,
&clip, &clip,
machine->gfx[mGfxC355], machine->gfx[mGfxC355],
mpCodeToTile(tile) + offset, mpCodeToTile(machine, tile) + offset,
color, color,
flipx,flipy, flipx,flipy,
sx,sy, sx,sy,
@ -900,13 +900,13 @@ draw_spriteC355(running_machine *machine, bitmap_t *bitmap, const rectangle *cli
} /* draw_spriteC355 */ } /* draw_spriteC355 */
static int DefaultCodeToTile( int code ) static int DefaultCodeToTile( running_machine *machine, int code )
{ {
return code; return code;
} }
void void
namco_obj_init( running_machine *machine, int gfxbank, int palXOR, int (*codeToTile)( int code ) ) namco_obj_init( running_machine *machine, int gfxbank, int palXOR, int (*codeToTile)( running_machine *machine, int code ) )
{ {
mGfxC355 = gfxbank; mGfxC355 = gfxbank;
mPalXOR = palXOR; mPalXOR = palXOR;

View File

@ -347,8 +347,6 @@ C - uses sub board with support for player 3 and 4 controls
#include "machine/nvram.h" #include "machine/nvram.h"
#include "includes/namcos1.h" #include "includes/namcos1.h"
static int dac0_value, dac1_value, dac0_gain, dac1_gain;
/**********************************************************************/ /**********************************************************************/
@ -385,41 +383,46 @@ static WRITE8_HANDLER( namcos1_coin_w )
static void namcos1_update_DACs(running_machine *machine) static void namcos1_update_DACs(running_machine *machine)
{ {
dac_signed_data_16_w(machine->device("dac"),0x8000 + (dac0_value * dac0_gain) + (dac1_value * dac1_gain)); namcos1_state *state = machine->driver_data<namcos1_state>();
dac_signed_data_16_w(machine->device("dac"),0x8000 + (state->dac0_value * state->dac0_gain) + (state->dac1_value * state->dac1_gain));
} }
void namcos1_init_DACs(void) void namcos1_init_DACs(running_machine *machine)
{ {
dac0_value = 0; namcos1_state *state = machine->driver_data<namcos1_state>();
dac1_value = 0; state->dac0_value = 0;
dac0_gain=0x80; state->dac1_value = 0;
dac1_gain=0x80; state->dac0_gain=0x80;
state->dac1_gain=0x80;
} }
static WRITE8_HANDLER( namcos1_dac_gain_w ) static WRITE8_HANDLER( namcos1_dac_gain_w )
{ {
namcos1_state *state = space->machine->driver_data<namcos1_state>();
int value; int value;
/* DAC0 (bits 0,2) */ /* DAC0 (bits 0,2) */
value = (data & 1) | ((data >> 1) & 2); /* GAIN0,GAIN1 */ value = (data & 1) | ((data >> 1) & 2); /* GAIN0,GAIN1 */
dac0_gain = 0x20 * (value+1); state->dac0_gain = 0x20 * (value+1);
/* DAC1 (bits 3,4) */ /* DAC1 (bits 3,4) */
value = (data >> 3) & 3; /* GAIN2,GAIN3 */ value = (data >> 3) & 3; /* GAIN2,GAIN3 */
dac1_gain = 0x20 * (value+1); state->dac1_gain = 0x20 * (value+1);
namcos1_update_DACs(space->machine); namcos1_update_DACs(space->machine);
} }
static WRITE8_HANDLER( namcos1_dac0_w ) static WRITE8_HANDLER( namcos1_dac0_w )
{ {
dac0_value = data - 0x80; /* shift zero point */ namcos1_state *state = space->machine->driver_data<namcos1_state>();
state->dac0_value = data - 0x80; /* shift zero point */
namcos1_update_DACs(space->machine); namcos1_update_DACs(space->machine);
} }
static WRITE8_HANDLER( namcos1_dac1_w ) static WRITE8_HANDLER( namcos1_dac1_w )
{ {
dac1_value = data - 0x80; /* shift zero point */ namcos1_state *state = space->machine->driver_data<namcos1_state>();
state->dac1_value = data - 0x80; /* shift zero point */
namcos1_update_DACs(space->machine); namcos1_update_DACs(space->machine);
} }
@ -1078,7 +1081,7 @@ static const namco_interface namco_config =
LPF info : Fco = 3.3KHz , g = -12dB/oct LPF info : Fco = 3.3KHz , g = -12dB/oct
*/ */
static MACHINE_CONFIG_START( ns1, driver_device ) static MACHINE_CONFIG_START( ns1, namcos1_state )
/* basic machine hardware */ /* basic machine hardware */
MCFG_CPU_ADD("maincpu", M6809,49152000/32) MCFG_CPU_ADD("maincpu", M6809,49152000/32)

View File

@ -143,12 +143,7 @@ TODO:
//#define NE555_FREQUENCY (1.0f / (0.693 * (560 + 2*51) * 0.1e-6)) // theoretical: this gives 21.8kHz which is too high //#define NE555_FREQUENCY (1.0f / (0.693 * (560 + 2*51) * 0.1e-6)) // theoretical: this gives 21.8kHz which is too high
static const INT16* ninjakd2_sampledata; static void omegaf_io_protection_reset(running_machine *machine);
static UINT8 omegaf_io_protection[3];
static UINT8 omegaf_io_protection_input;
static int omegaf_io_protection_tic;
static void omegaf_io_protection_reset(void);
static INTERRUPT_GEN( ninjakd2_interrupt ) static INTERRUPT_GEN( ninjakd2_interrupt )
@ -181,7 +176,7 @@ static MACHINE_RESET( omegaf )
{ {
robokid_init_banks(machine); robokid_init_banks(machine);
omegaf_io_protection_reset(); omegaf_io_protection_reset(machine);
} }
@ -211,6 +206,7 @@ static WRITE8_HANDLER( ninjakd2_soundreset_w )
static SAMPLES_START( ninjakd2_init_samples ) static SAMPLES_START( ninjakd2_init_samples )
{ {
ninjakd2_state *state = device->machine->driver_data<ninjakd2_state>();
running_machine *machine = device->machine; running_machine *machine = device->machine;
const UINT8* const rom = machine->region("pcm")->base(); const UINT8* const rom = machine->region("pcm")->base();
const int length = machine->region("pcm")->bytes(); const int length = machine->region("pcm")->bytes();
@ -222,11 +218,12 @@ static SAMPLES_START( ninjakd2_init_samples )
for (i = 0; i < length; ++i) for (i = 0; i < length; ++i)
sampledata[i] = rom[i] << 7; sampledata[i] = rom[i] << 7;
ninjakd2_sampledata = sampledata; state->sampledata = sampledata;
} }
static WRITE8_HANDLER( ninjakd2_pcm_play_w ) static WRITE8_HANDLER( ninjakd2_pcm_play_w )
{ {
ninjakd2_state *state = space->machine->driver_data<ninjakd2_state>();
device_t *samples = space->machine->device("pcm"); device_t *samples = space->machine->device("pcm");
const UINT8* const rom = space->machine->region("pcm")->base(); const UINT8* const rom = space->machine->region("pcm")->base();
@ -245,7 +242,7 @@ static WRITE8_HANDLER( ninjakd2_pcm_play_w )
++end; ++end;
if (end - start) if (end - start)
sample_start_raw(samples, 0, &ninjakd2_sampledata[start], end - start, NE555_FREQUENCY, 0); sample_start_raw(samples, 0, &state->sampledata[start], end - start, NE555_FREQUENCY, 0);
else else
sample_stop(samples, 0); sample_stop(samples, 0);
} }
@ -259,36 +256,38 @@ static WRITE8_HANDLER( ninjakd2_pcm_play_w )
* *
*************************************/ *************************************/
void omegaf_io_protection_reset(void) static void omegaf_io_protection_reset(running_machine *machine)
{ {
ninjakd2_state *state = machine->driver_data<ninjakd2_state>();
// make sure protection starts in a known state // make sure protection starts in a known state
omegaf_io_protection[0] = 0; state->omegaf_io_protection[0] = 0;
omegaf_io_protection[1] = 0; state->omegaf_io_protection[1] = 0;
omegaf_io_protection[2] = 0; state->omegaf_io_protection[2] = 0;
omegaf_io_protection_input = 0; state->omegaf_io_protection_input = 0;
omegaf_io_protection_tic = 0; state->omegaf_io_protection_tic = 0;
} }
static READ8_HANDLER( omegaf_io_protection_r ) static READ8_HANDLER( omegaf_io_protection_r )
{ {
ninjakd2_state *state = space->machine->driver_data<ninjakd2_state>();
UINT8 result = 0xff; UINT8 result = 0xff;
switch (omegaf_io_protection[1] & 3) switch (state->omegaf_io_protection[1] & 3)
{ {
case 0: case 0:
switch (offset) switch (offset)
{ {
case 1: case 1:
switch (omegaf_io_protection[0] & 0xe0) switch (state->omegaf_io_protection[0] & 0xe0)
{ {
case 0x00: case 0x00:
if (++omegaf_io_protection_tic & 1) if (++state->omegaf_io_protection_tic & 1)
{ {
result = 0x00; result = 0x00;
} }
else else
{ {
switch (omegaf_io_protection_input) switch (state->omegaf_io_protection_input)
{ {
// first interrogation // first interrogation
// this happens just after setting mode 0. // this happens just after setting mode 0.
@ -319,11 +318,11 @@ static READ8_HANDLER( omegaf_io_protection_r )
break; break;
case 0x80: case 0x80:
result = 0x20 | (omegaf_io_protection_input & 0x1f); result = 0x20 | (state->omegaf_io_protection_input & 0x1f);
break; break;
case 0xc0: case 0xc0:
result = 0x60 | (omegaf_io_protection_input & 0x1f); result = 0x60 | (state->omegaf_io_protection_input & 0x1f);
break; break;
} }
break; break;
@ -354,14 +353,15 @@ static READ8_HANDLER( omegaf_io_protection_r )
static WRITE8_HANDLER( omegaf_io_protection_w ) static WRITE8_HANDLER( omegaf_io_protection_w )
{ {
ninjakd2_state *state = space->machine->driver_data<ninjakd2_state>();
// load parameter on c006 bit 0 rise transition // load parameter on c006 bit 0 rise transition
if (offset == 2 && (data & 1) && !(omegaf_io_protection[2] & 1)) if (offset == 2 && (data & 1) && !(state->omegaf_io_protection[2] & 1))
{ {
logerror("loading protection input %02x\n", omegaf_io_protection[0]); logerror("loading protection input %02x\n", state->omegaf_io_protection[0]);
omegaf_io_protection_input = omegaf_io_protection[0]; state->omegaf_io_protection_input = state->omegaf_io_protection[0];
} }
omegaf_io_protection[offset] = data; state->omegaf_io_protection[offset] = data;
} }
@ -386,8 +386,8 @@ static ADDRESS_MAP_START( ninjakd2_main_cpu, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0xc203, 0xc203) AM_WRITE(ninjakd2_sprite_overdraw_w) AM_RANGE(0xc203, 0xc203) AM_WRITE(ninjakd2_sprite_overdraw_w)
AM_RANGE(0xc208, 0xc20c) AM_WRITE(ninjakd2_bg_ctrl_w) // scroll + enable AM_RANGE(0xc208, 0xc20c) AM_WRITE(ninjakd2_bg_ctrl_w) // scroll + enable
AM_RANGE(0xc800, 0xcdff) AM_RAM_WRITE(paletteram_RRRRGGGGBBBBxxxx_be_w) AM_BASE_GENERIC(paletteram) AM_RANGE(0xc800, 0xcdff) AM_RAM_WRITE(paletteram_RRRRGGGGBBBBxxxx_be_w) AM_BASE_GENERIC(paletteram)
AM_RANGE(0xd000, 0xd7ff) AM_RAM_WRITE(ninjakd2_fgvideoram_w) AM_BASE(&ninjakd2_fg_videoram) AM_RANGE(0xd000, 0xd7ff) AM_RAM_WRITE(ninjakd2_fgvideoram_w) AM_BASE_MEMBER(ninjakd2_state, fg_videoram)
AM_RANGE(0xd800, 0xdfff) AM_RAM_WRITE(ninjakd2_bgvideoram_w) AM_BASE(&ninjakd2_bg_videoram) AM_RANGE(0xd800, 0xdfff) AM_RAM_WRITE(ninjakd2_bgvideoram_w) AM_BASE_MEMBER(ninjakd2_state, bg_videoram)
AM_RANGE(0xe000, 0xf9ff) AM_RAM AM_RANGE(0xe000, 0xf9ff) AM_RAM
AM_RANGE(0xfa00, 0xffff) AM_RAM AM_BASE_GENERIC(spriteram) AM_RANGE(0xfa00, 0xffff) AM_RAM AM_BASE_GENERIC(spriteram)
ADDRESS_MAP_END ADDRESS_MAP_END
@ -398,8 +398,8 @@ static ADDRESS_MAP_START( mnight_main_cpu, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("bank1") AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("bank1")
AM_RANGE(0xc000, 0xd9ff) AM_RAM AM_RANGE(0xc000, 0xd9ff) AM_RAM
AM_RANGE(0xda00, 0xdfff) AM_RAM AM_BASE_GENERIC(spriteram) AM_RANGE(0xda00, 0xdfff) AM_RAM AM_BASE_GENERIC(spriteram)
AM_RANGE(0xe000, 0xe7ff) AM_RAM_WRITE(ninjakd2_bgvideoram_w) AM_BASE(&ninjakd2_bg_videoram) AM_RANGE(0xe000, 0xe7ff) AM_RAM_WRITE(ninjakd2_bgvideoram_w) AM_BASE_MEMBER(ninjakd2_state, bg_videoram)
AM_RANGE(0xe800, 0xefff) AM_RAM_WRITE(ninjakd2_fgvideoram_w) AM_BASE(&ninjakd2_fg_videoram) AM_RANGE(0xe800, 0xefff) AM_RAM_WRITE(ninjakd2_fgvideoram_w) AM_BASE_MEMBER(ninjakd2_state, fg_videoram)
AM_RANGE(0xf000, 0xf5ff) AM_RAM_WRITE(paletteram_RRRRGGGGBBBBxxxx_be_w) AM_BASE_GENERIC(paletteram) AM_RANGE(0xf000, 0xf5ff) AM_RAM_WRITE(paletteram_RRRRGGGGBBBBxxxx_be_w) AM_BASE_GENERIC(paletteram)
AM_RANGE(0xf800, 0xf800) AM_READ_PORT("KEYCOIN") AM_RANGE(0xf800, 0xf800) AM_READ_PORT("KEYCOIN")
AM_RANGE(0xf801, 0xf801) AM_READ_PORT("PAD1") AM_RANGE(0xf801, 0xf801) AM_READ_PORT("PAD1")
@ -418,7 +418,7 @@ static ADDRESS_MAP_START( robokid_main_cpu, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x0000, 0x7fff) AM_ROM
AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("bank1") AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("bank1")
AM_RANGE(0xc000, 0xc7ff) AM_RAM_WRITE(paletteram_RRRRGGGGBBBBxxxx_be_w) AM_BASE_GENERIC(paletteram) AM_RANGE(0xc000, 0xc7ff) AM_RAM_WRITE(paletteram_RRRRGGGGBBBBxxxx_be_w) AM_BASE_GENERIC(paletteram)
AM_RANGE(0xc800, 0xcfff) AM_RAM_WRITE(ninjakd2_fgvideoram_w) AM_BASE(&ninjakd2_fg_videoram) AM_RANGE(0xc800, 0xcfff) AM_RAM_WRITE(ninjakd2_fgvideoram_w) AM_BASE_MEMBER(ninjakd2_state, fg_videoram)
AM_RANGE(0xd000, 0xd3ff) AM_READWRITE(robokid_bg2_videoram_r, robokid_bg2_videoram_w) // banked AM_RANGE(0xd000, 0xd3ff) AM_READWRITE(robokid_bg2_videoram_r, robokid_bg2_videoram_w) // banked
AM_RANGE(0xd400, 0xd7ff) AM_READWRITE(robokid_bg1_videoram_r, robokid_bg1_videoram_w) // banked AM_RANGE(0xd400, 0xd7ff) AM_READWRITE(robokid_bg1_videoram_r, robokid_bg1_videoram_w) // banked
AM_RANGE(0xd800, 0xdbff) AM_READWRITE(robokid_bg0_videoram_r, robokid_bg0_videoram_w) // banked AM_RANGE(0xd800, 0xdbff) AM_READWRITE(robokid_bg0_videoram_r, robokid_bg0_videoram_w) // banked
@ -462,7 +462,7 @@ static ADDRESS_MAP_START( omegaf_main_cpu, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0xc400, 0xc7ff) AM_READWRITE(robokid_bg0_videoram_r, robokid_bg0_videoram_w) // banked AM_RANGE(0xc400, 0xc7ff) AM_READWRITE(robokid_bg0_videoram_r, robokid_bg0_videoram_w) // banked
AM_RANGE(0xc800, 0xcbff) AM_READWRITE(robokid_bg1_videoram_r, robokid_bg1_videoram_w) // banked AM_RANGE(0xc800, 0xcbff) AM_READWRITE(robokid_bg1_videoram_r, robokid_bg1_videoram_w) // banked
AM_RANGE(0xcc00, 0xcfff) AM_READWRITE(robokid_bg2_videoram_r, robokid_bg2_videoram_w) // banked AM_RANGE(0xcc00, 0xcfff) AM_READWRITE(robokid_bg2_videoram_r, robokid_bg2_videoram_w) // banked
AM_RANGE(0xd000, 0xd7ff) AM_RAM_WRITE(ninjakd2_fgvideoram_w) AM_BASE(&ninjakd2_fg_videoram) AM_RANGE(0xd000, 0xd7ff) AM_RAM_WRITE(ninjakd2_fgvideoram_w) AM_BASE_MEMBER(ninjakd2_state, fg_videoram)
AM_RANGE(0xd800, 0xdfff) AM_RAM_WRITE(paletteram_RRRRGGGGBBBBxxxx_be_w) AM_BASE_GENERIC(paletteram) AM_RANGE(0xd800, 0xdfff) AM_RAM_WRITE(paletteram_RRRRGGGGBBBBxxxx_be_w) AM_BASE_GENERIC(paletteram)
AM_RANGE(0xe000, 0xf9ff) AM_RAM AM_RANGE(0xe000, 0xf9ff) AM_RAM
AM_RANGE(0xfa00, 0xffff) AM_RAM AM_BASE_GENERIC(spriteram) AM_RANGE(0xfa00, 0xffff) AM_RAM AM_BASE_GENERIC(spriteram)
@ -905,7 +905,7 @@ static const samples_interface ninjakd2_samples_interface =
* *
*************************************/ *************************************/
static MACHINE_CONFIG_START( ninjakd2, driver_device ) static MACHINE_CONFIG_START( ninjakd2, ninjakd2_state )
/* basic machine hardware */ /* basic machine hardware */
MCFG_CPU_ADD("maincpu", Z80, MAIN_CLOCK_12/2) /* verified */ MCFG_CPU_ADD("maincpu", Z80, MAIN_CLOCK_12/2) /* verified */

View File

@ -132,23 +132,25 @@ e000 - e7ff R/W Work RAM
* *
*************************************/ *************************************/
static UINT8 ninjakun_io_a002_ctrl;
static CUSTOM_INPUT( ninjakun_io_A002_ctrl_r ) static CUSTOM_INPUT( ninjakun_io_A002_ctrl_r )
{ {
return ninjakun_io_a002_ctrl; nova2001_state *state = field->port->machine->driver_data<nova2001_state>();
return state->ninjakun_io_a002_ctrl;
} }
static WRITE8_HANDLER( ninjakun_cpu1_io_A002_w ) static WRITE8_HANDLER( ninjakun_cpu1_io_A002_w )
{ {
if( data == 0x80 ) ninjakun_io_a002_ctrl |= 0x01; nova2001_state *state = space->machine->driver_data<nova2001_state>();
if( data == 0x40 ) ninjakun_io_a002_ctrl &= ~0x02; if( data == 0x80 ) state->ninjakun_io_a002_ctrl |= 0x01;
if( data == 0x40 ) state->ninjakun_io_a002_ctrl &= ~0x02;
} }
static WRITE8_HANDLER( ninjakun_cpu2_io_A002_w ) static WRITE8_HANDLER( ninjakun_cpu2_io_A002_w )
{ {
if( data == 0x40 ) ninjakun_io_a002_ctrl |= 0x02; nova2001_state *state = space->machine->driver_data<nova2001_state>();
if( data == 0x80 ) ninjakun_io_a002_ctrl &= ~0x01; if( data == 0x40 ) state->ninjakun_io_a002_ctrl |= 0x02;
if( data == 0x80 ) state->ninjakun_io_a002_ctrl &= ~0x01;
} }
@ -161,8 +163,9 @@ static WRITE8_HANDLER( ninjakun_cpu2_io_A002_w )
static MACHINE_START( ninjakun ) static MACHINE_START( ninjakun )
{ {
nova2001_state *state = machine->driver_data<nova2001_state>();
/* Save State Stuff */ /* Save State Stuff */
state_save_register_global(machine, ninjakun_io_a002_ctrl); state_save_register_global(machine, state->ninjakun_io_a002_ctrl);
} }
@ -175,8 +178,8 @@ static MACHINE_START( ninjakun )
static ADDRESS_MAP_START( nova2001_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( nova2001_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x0000, 0x7fff) AM_ROM
AM_RANGE(0xa000, 0xa7ff) AM_RAM_WRITE(nova2001_fg_videoram_w) AM_BASE(&nova2001_fg_videoram) AM_RANGE(0xa000, 0xa7ff) AM_RAM_WRITE(nova2001_fg_videoram_w) AM_BASE_MEMBER(nova2001_state, fg_videoram)
AM_RANGE(0xa800, 0xafff) AM_RAM_WRITE(nova2001_bg_videoram_w) AM_BASE(&nova2001_bg_videoram) AM_RANGE(0xa800, 0xafff) AM_RAM_WRITE(nova2001_bg_videoram_w) AM_BASE_MEMBER(nova2001_state, bg_videoram)
AM_RANGE(0xb000, 0xb7ff) AM_RAM AM_BASE_GENERIC(spriteram) AM_RANGE(0xb000, 0xb7ff) AM_RAM AM_BASE_GENERIC(spriteram)
AM_RANGE(0xb800, 0xbfff) AM_WRITE(nova2001_flipscreen_w) AM_RANGE(0xb800, 0xbfff) AM_WRITE(nova2001_flipscreen_w)
AM_RANGE(0xc000, 0xc000) AM_DEVREADWRITE("ay1", ay8910_r, ay8910_data_w) AM_RANGE(0xc000, 0xc000) AM_DEVREADWRITE("ay1", ay8910_r, ay8910_data_w)
@ -202,8 +205,8 @@ static ADDRESS_MAP_START( ninjakun_cpu1_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0xa001, 0xa001) AM_READ_PORT("IN1") AM_RANGE(0xa001, 0xa001) AM_READ_PORT("IN1")
AM_RANGE(0xa002, 0xa002) AM_READ_PORT("IN2") AM_WRITE(ninjakun_cpu1_io_A002_w) AM_RANGE(0xa002, 0xa002) AM_READ_PORT("IN2") AM_WRITE(ninjakun_cpu1_io_A002_w)
AM_RANGE(0xa003, 0xa003) AM_WRITE(pkunwar_flipscreen_w) AM_RANGE(0xa003, 0xa003) AM_WRITE(pkunwar_flipscreen_w)
AM_RANGE(0xc000, 0xc7ff) AM_RAM_WRITE(nova2001_fg_videoram_w) AM_BASE(&nova2001_fg_videoram) AM_SHARE("share1") AM_RANGE(0xc000, 0xc7ff) AM_RAM_WRITE(nova2001_fg_videoram_w) AM_BASE_MEMBER(nova2001_state, fg_videoram) AM_SHARE("share1")
AM_RANGE(0xc800, 0xcfff) AM_READWRITE(ninjakun_bg_videoram_r, ninjakun_bg_videoram_w) AM_BASE(&nova2001_bg_videoram) AM_SHARE("share2") AM_RANGE(0xc800, 0xcfff) AM_READWRITE(ninjakun_bg_videoram_r, ninjakun_bg_videoram_w) AM_BASE_MEMBER(nova2001_state, bg_videoram) AM_SHARE("share2")
AM_RANGE(0xd000, 0xd7ff) AM_RAM AM_BASE_GENERIC(spriteram) AM_SHARE("share3") AM_RANGE(0xd000, 0xd7ff) AM_RAM AM_BASE_GENERIC(spriteram) AM_SHARE("share3")
AM_RANGE(0xd800, 0xd9ff) AM_RAM_WRITE(ninjakun_paletteram_w) AM_BASE_GENERIC(paletteram) AM_SHARE("share4") AM_RANGE(0xd800, 0xd9ff) AM_RAM_WRITE(ninjakun_paletteram_w) AM_BASE_GENERIC(paletteram) AM_SHARE("share4")
AM_RANGE(0xe000, 0xe3ff) AM_RAM AM_SHARE("share5") AM_RANGE(0xe000, 0xe3ff) AM_RAM AM_SHARE("share5")
@ -233,7 +236,7 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( pkunwar_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( pkunwar_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x0000, 0x7fff) AM_ROM
AM_RANGE(0x8000, 0x87ff) AM_RAM AM_BASE_GENERIC(spriteram) AM_RANGE(0x8000, 0x87ff) AM_RAM AM_BASE_GENERIC(spriteram)
AM_RANGE(0x8800, 0x8fff) AM_RAM_WRITE(nova2001_bg_videoram_w) AM_BASE(&nova2001_bg_videoram) AM_RANGE(0x8800, 0x8fff) AM_RAM_WRITE(nova2001_bg_videoram_w) AM_BASE_MEMBER(nova2001_state, bg_videoram)
AM_RANGE(0xa000, 0xa001) AM_DEVWRITE("ay1", ay8910_address_data_w) AM_RANGE(0xa000, 0xa001) AM_DEVWRITE("ay1", ay8910_address_data_w)
AM_RANGE(0xa001, 0xa001) AM_DEVREAD("ay1", ay8910_r) AM_RANGE(0xa001, 0xa001) AM_DEVREAD("ay1", ay8910_r)
AM_RANGE(0xa002, 0xa003) AM_DEVWRITE("ay2", ay8910_address_data_w) AM_RANGE(0xa002, 0xa003) AM_DEVWRITE("ay2", ay8910_address_data_w)
@ -251,8 +254,8 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( raiders5_cpu1_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( raiders5_cpu1_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x0000, 0x7fff) AM_ROM
AM_RANGE(0x8000, 0x87ff) AM_RAM AM_BASE_GENERIC(spriteram) AM_RANGE(0x8000, 0x87ff) AM_RAM AM_BASE_GENERIC(spriteram)
AM_RANGE(0x8800, 0x8fff) AM_RAM_WRITE(nova2001_fg_videoram_w) AM_BASE(&nova2001_fg_videoram) AM_RANGE(0x8800, 0x8fff) AM_RAM_WRITE(nova2001_fg_videoram_w) AM_BASE_MEMBER(nova2001_state, fg_videoram)
AM_RANGE(0x9000, 0x97ff) AM_READWRITE(ninjakun_bg_videoram_r, ninjakun_bg_videoram_w) AM_BASE(&nova2001_bg_videoram) AM_RANGE(0x9000, 0x97ff) AM_READWRITE(ninjakun_bg_videoram_r, ninjakun_bg_videoram_w) AM_BASE_MEMBER(nova2001_state, bg_videoram)
AM_RANGE(0xa000, 0xa000) AM_WRITE(nova2001_scroll_x_w) AM_RANGE(0xa000, 0xa000) AM_WRITE(nova2001_scroll_x_w)
AM_RANGE(0xa001, 0xa001) AM_WRITE(nova2001_scroll_y_w) AM_RANGE(0xa001, 0xa001) AM_WRITE(nova2001_scroll_y_w)
AM_RANGE(0xa002, 0xa002) AM_WRITE(pkunwar_flipscreen_w) AM_RANGE(0xa002, 0xa002) AM_WRITE(pkunwar_flipscreen_w)
@ -680,7 +683,7 @@ static const ay8910_interface pkunwar_ay8910_interface_2 =
* *
*************************************/ *************************************/
static MACHINE_CONFIG_START( nova2001, driver_device ) static MACHINE_CONFIG_START( nova2001, nova2001_state )
/* basic machine hardware */ /* basic machine hardware */
MCFG_CPU_ADD("maincpu", Z80, MAIN_CLOCK/4) // 3 MHz verified on schematics MCFG_CPU_ADD("maincpu", Z80, MAIN_CLOCK/4) // 3 MHz verified on schematics
@ -713,7 +716,7 @@ static MACHINE_CONFIG_START( nova2001, driver_device )
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
MACHINE_CONFIG_END MACHINE_CONFIG_END
static MACHINE_CONFIG_START( ninjakun, driver_device ) static MACHINE_CONFIG_START( ninjakun, nova2001_state )
/* basic machine hardware */ /* basic machine hardware */
MCFG_CPU_ADD("maincpu", Z80, MAIN_CLOCK/4) // 3 MHz MCFG_CPU_ADD("maincpu", Z80, MAIN_CLOCK/4) // 3 MHz
@ -754,7 +757,7 @@ static MACHINE_CONFIG_START( ninjakun, driver_device )
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.20) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.20)
MACHINE_CONFIG_END MACHINE_CONFIG_END
static MACHINE_CONFIG_START( pkunwar, driver_device ) static MACHINE_CONFIG_START( pkunwar, nova2001_state )
/* basic machine hardware */ /* basic machine hardware */
MCFG_CPU_ADD("maincpu", Z80, MAIN_CLOCK/4) // 3 MHz MCFG_CPU_ADD("maincpu", Z80, MAIN_CLOCK/4) // 3 MHz
@ -788,7 +791,7 @@ static MACHINE_CONFIG_START( pkunwar, driver_device )
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
MACHINE_CONFIG_END MACHINE_CONFIG_END
static MACHINE_CONFIG_START( raiders5, driver_device ) static MACHINE_CONFIG_START( raiders5, nova2001_state )
/* basic machine hardware */ /* basic machine hardware */
MCFG_CPU_ADD("maincpu", Z80, MAIN_CLOCK/4) // 3 MHz MCFG_CPU_ADD("maincpu", Z80, MAIN_CLOCK/4) // 3 MHz

View File

@ -112,7 +112,8 @@ $8000 - $ffff ROM
/********************************************************************************************/ /********************************************************************************************/
static struct renegade_adpcm_state typedef struct _renegade_adpcm_state renegade_adpcm_state;
struct _renegade_adpcm_state
{ {
adpcm_state adpcm; adpcm_state adpcm;
sound_stream *stream; sound_stream *stream;
@ -120,11 +121,21 @@ static struct renegade_adpcm_state
UINT8 nibble; UINT8 nibble;
UINT8 playing; UINT8 playing;
UINT8 *base; UINT8 *base;
} renegade_adpcm; };
DECLARE_LEGACY_SOUND_DEVICE(RENEGADE_ADPCM, renegade_adpcm);
INLINE renegade_adpcm_state *get_safe_token(device_t *device)
{
assert(device != NULL);
assert(device->type() == RENEGADE_ADPCM);
return (renegade_adpcm_state *)downcast<legacy_device_base *>(device)->token();
}
static STREAM_UPDATE( renegade_adpcm_callback ) static STREAM_UPDATE( renegade_adpcm_callback )
{ {
struct renegade_adpcm_state *state = (struct renegade_adpcm_state *)param; renegade_adpcm_state *state = (renegade_adpcm_state *)param;
stream_sample_t *dest = outputs[0]; stream_sample_t *dest = outputs[0];
while (state->playing && samples > 0) while (state->playing && samples > 0)
@ -151,11 +162,10 @@ static STREAM_UPDATE( renegade_adpcm_callback )
static DEVICE_START( renegade_adpcm ) static DEVICE_START( renegade_adpcm )
{ {
running_machine *machine = device->machine; renegade_adpcm_state *state = get_safe_token(device);
struct renegade_adpcm_state *state = &renegade_adpcm;
state->playing = 0; state->playing = 0;
state->stream = device->machine->sound().stream_alloc(*device, 0, 1, device->clock(), state, renegade_adpcm_callback); state->stream = device->machine->sound().stream_alloc(*device, 0, 1, device->clock(), state, renegade_adpcm_callback);
state->base = machine->region("adpcm")->base(); state->base = device->machine->region("adpcm")->base();
state->adpcm.reset(); state->adpcm.reset();
} }
@ -163,6 +173,9 @@ DEVICE_GET_INFO( renegade_adpcm )
{ {
switch (state) switch (state)
{ {
/* --- the following bits of info are returned as 64-bit signed integers --- */
case DEVINFO_INT_TOKEN_BYTES: info->i = sizeof(renegade_adpcm_state); break;
/* --- the following bits of info are returned as pointers to data or functions --- */ /* --- the following bits of info are returned as pointers to data or functions --- */
case DEVINFO_FCT_START: info->start = DEVICE_START_NAME(renegade_adpcm);break; case DEVINFO_FCT_START: info->start = DEVICE_START_NAME(renegade_adpcm);break;
@ -172,12 +185,12 @@ DEVICE_GET_INFO( renegade_adpcm )
} }
} }
DECLARE_LEGACY_SOUND_DEVICE(RENEGADE_ADPCM, renegade_adpcm);
DEFINE_LEGACY_SOUND_DEVICE(RENEGADE_ADPCM, renegade_adpcm); DEFINE_LEGACY_SOUND_DEVICE(RENEGADE_ADPCM, renegade_adpcm);
static WRITE8_HANDLER( adpcm_play_w ) static WRITE8_DEVICE_HANDLER( adpcm_play_w )
{ {
renegade_adpcm_state *state = get_safe_token(device);
int offs = (data - 0x2c) * 0x2000; int offs = (data - 0x2c) * 0x2000;
int len = 0x2000 * 2; int len = 0x2000 * 2;
@ -187,13 +200,13 @@ static WRITE8_HANDLER( adpcm_play_w )
if (offs >= 0 && offs+len <= 0x20000) if (offs >= 0 && offs+len <= 0x20000)
{ {
renegade_adpcm.stream->update(); state->stream->update();
renegade_adpcm.adpcm.reset(); state->adpcm.reset();
renegade_adpcm.current = offs; state->current = offs;
renegade_adpcm.end = offs + len/2; state->end = offs + len/2;
renegade_adpcm.nibble = 4; state->nibble = 4;
renegade_adpcm.playing = 1; state->playing = 1;
} }
else else
logerror("out of range adpcm command: 0x%02x\n", data); logerror("out of range adpcm command: 0x%02x\n", data);
@ -681,7 +694,7 @@ static ADDRESS_MAP_START( renegade_sound_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x0fff) AM_RAM AM_RANGE(0x0000, 0x0fff) AM_RAM
AM_RANGE(0x1000, 0x1000) AM_READ(soundlatch_r) AM_RANGE(0x1000, 0x1000) AM_READ(soundlatch_r)
AM_RANGE(0x1800, 0x1800) AM_WRITENOP // this gets written the same values as 0x2000 AM_RANGE(0x1800, 0x1800) AM_WRITENOP // this gets written the same values as 0x2000
AM_RANGE(0x2000, 0x2000) AM_WRITE(adpcm_play_w) AM_RANGE(0x2000, 0x2000) AM_DEVWRITE("adpcm", adpcm_play_w)
AM_RANGE(0x2800, 0x2801) AM_DEVREADWRITE("ymsnd", ym3526_r,ym3526_w) AM_RANGE(0x2800, 0x2801) AM_DEVREADWRITE("ymsnd", ym3526_r,ym3526_w)
AM_RANGE(0x3000, 0x3000) AM_WRITENOP /* adpcm related? stereo pan? */ AM_RANGE(0x3000, 0x3000) AM_WRITENOP /* adpcm related? stereo pan? */
AM_RANGE(0x8000, 0xffff) AM_ROM AM_RANGE(0x8000, 0xffff) AM_ROM

View File

@ -116,13 +116,6 @@
#define MASTER_CLOCK 16000000 #define MASTER_CLOCK 16000000
static UINT8 sound_data;
static UINT8 sound_busy;
static UINT8 ym2151_irq;
static UINT8 upd_rom_bank;
/************************************* /*************************************
* *
* Interrupt handling * Interrupt handling
@ -131,8 +124,9 @@ static UINT8 upd_rom_bank;
static void ym2151_irq_gen(device_t *device, int state) static void ym2151_irq_gen(device_t *device, int state)
{ {
ym2151_irq = state; rpunch_state *drvstate = device->machine->driver_data<rpunch_state>();
cputag_set_input_line(device->machine, "audiocpu", 0, (ym2151_irq | sound_busy) ? ASSERT_LINE : CLEAR_LINE); drvstate->ym2151_irq = state;
cputag_set_input_line(device->machine, "audiocpu", 0, (drvstate->ym2151_irq | drvstate->sound_busy) ? ASSERT_LINE : CLEAR_LINE);
} }
@ -164,9 +158,10 @@ static CUSTOM_INPUT( hi_bits_r )
static TIMER_CALLBACK( sound_command_w_callback ) static TIMER_CALLBACK( sound_command_w_callback )
{ {
sound_busy = 1; rpunch_state *state = machine->driver_data<rpunch_state>();
sound_data = param; state->sound_busy = 1;
cputag_set_input_line(machine, "audiocpu", 0, (ym2151_irq | sound_busy) ? ASSERT_LINE : CLEAR_LINE); state->sound_data = param;
cputag_set_input_line(machine, "audiocpu", 0, (state->ym2151_irq | state->sound_busy) ? ASSERT_LINE : CLEAR_LINE);
} }
@ -179,15 +174,17 @@ static WRITE16_HANDLER( sound_command_w )
static READ8_HANDLER( sound_command_r ) static READ8_HANDLER( sound_command_r )
{ {
sound_busy = 0; rpunch_state *state = space->machine->driver_data<rpunch_state>();
cputag_set_input_line(space->machine, "audiocpu", 0, (ym2151_irq | sound_busy) ? ASSERT_LINE : CLEAR_LINE); state->sound_busy = 0;
return sound_data; cputag_set_input_line(space->machine, "audiocpu", 0, (state->ym2151_irq | state->sound_busy) ? ASSERT_LINE : CLEAR_LINE);
return state->sound_data;
} }
static READ16_HANDLER( sound_busy_r ) static READ16_HANDLER( sound_busy_r )
{ {
return sound_busy; rpunch_state *state = space->machine->driver_data<rpunch_state>();
return state->sound_busy;
} }
@ -200,11 +197,12 @@ static READ16_HANDLER( sound_busy_r )
static WRITE8_DEVICE_HANDLER( upd_control_w ) static WRITE8_DEVICE_HANDLER( upd_control_w )
{ {
if ((data & 1) != upd_rom_bank) rpunch_state *state = device->machine->driver_data<rpunch_state>();
if ((data & 1) != state->upd_rom_bank)
{ {
UINT8 *snd = device->machine->region("upd")->base(); UINT8 *snd = device->machine->region("upd")->base();
upd_rom_bank = data & 1; state->upd_rom_bank = data & 1;
memcpy(snd, snd + 0x20000 * (upd_rom_bank + 1), 0x20000); memcpy(snd, snd + 0x20000 * (state->upd_rom_bank + 1), 0x20000);
} }
upd7759_reset_w(device, data >> 7); upd7759_reset_w(device, data >> 7);
} }
@ -228,7 +226,7 @@ static WRITE8_DEVICE_HANDLER( upd_data_w )
static ADDRESS_MAP_START( main_map, ADDRESS_SPACE_PROGRAM, 16 ) static ADDRESS_MAP_START( main_map, ADDRESS_SPACE_PROGRAM, 16 )
ADDRESS_MAP_GLOBAL_MASK(0xfffff) ADDRESS_MAP_GLOBAL_MASK(0xfffff)
AM_RANGE(0x000000, 0x03ffff) AM_ROM AM_RANGE(0x000000, 0x03ffff) AM_ROM
AM_RANGE(0x040000, 0x04ffff) AM_RAM AM_BASE(&rpunch_bitmapram) AM_SIZE(&rpunch_bitmapram_size) AM_RANGE(0x040000, 0x04ffff) AM_RAM AM_BASE_MEMBER(rpunch_state, bitmapram) AM_SIZE_MEMBER(rpunch_state, bitmapram_size)
AM_RANGE(0x060000, 0x060fff) AM_RAM AM_BASE_GENERIC(spriteram) AM_RANGE(0x060000, 0x060fff) AM_RAM AM_BASE_GENERIC(spriteram)
AM_RANGE(0x080000, 0x083fff) AM_RAM_WRITE(rpunch_videoram_w) AM_BASE_MEMBER(rpunch_state, videoram) AM_RANGE(0x080000, 0x083fff) AM_RAM_WRITE(rpunch_videoram_w) AM_BASE_MEMBER(rpunch_state, videoram)
AM_RANGE(0x0a0000, 0x0a07ff) AM_RAM_WRITE(paletteram16_xRRRRRGGGGGBBBBB_word_w) AM_BASE_GENERIC(paletteram) AM_RANGE(0x0a0000, 0x0a07ff) AM_RAM_WRITE(paletteram16_xRRRRRGGGGGBBBBB_word_w) AM_BASE_GENERIC(paletteram)
@ -699,16 +697,18 @@ ROM_END
static DRIVER_INIT( rabiolep ) static DRIVER_INIT( rabiolep )
{ {
rpunch_sprite_palette = 0x300; rpunch_state *state = machine->driver_data<rpunch_state>();
state->sprite_palette = 0x300;
} }
static DRIVER_INIT( svolley ) static DRIVER_INIT( svolley )
{ {
rpunch_state *state = machine->driver_data<rpunch_state>();
/* the main differences between Super Volleyball and Rabbit Punch are */ /* the main differences between Super Volleyball and Rabbit Punch are */
/* the lack of direct-mapped bitmap and a different palette base for sprites */ /* the lack of direct-mapped bitmap and a different palette base for sprites */
rpunch_sprite_palette = 0x080; state->sprite_palette = 0x080;
rpunch_bitmapram = NULL; state->bitmapram = NULL;
} }

View File

@ -269,16 +269,14 @@ Stephh's notes (based on the games Z80 code and some tests) :
#include "sound/ay8910.h" #include "sound/ay8910.h"
#include "includes/slapfght.h" #include "includes/slapfght.h"
int getstar_id;
static ADDRESS_MAP_START( perfrman_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( perfrman_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x0000, 0x7fff) AM_ROM
AM_RANGE(0x8000, 0x87ff) AM_RAM AM_RANGE(0x8000, 0x87ff) AM_RAM
AM_RANGE(0x8800, 0x880f) AM_RAM AM_SHARE("share1") AM_RANGE(0x8800, 0x880f) AM_RAM AM_SHARE("share1")
AM_RANGE(0x8810, 0x8fff) AM_RAMBANK("bank1") /* Shared RAM with sound CPU */ AM_RANGE(0x8810, 0x8fff) AM_RAMBANK("bank1") /* Shared RAM with sound CPU */
AM_RANGE(0x9000, 0x97ff) AM_RAM_WRITE(slapfight_videoram_w) AM_BASE(&slapfight_videoram) AM_RANGE(0x9000, 0x97ff) AM_RAM_WRITE(slapfight_videoram_w) AM_BASE_MEMBER(slapfght_state, slapfight_videoram)
AM_RANGE(0x9800, 0x9fff) AM_RAM_WRITE(slapfight_colorram_w) AM_BASE(&slapfight_colorram) AM_RANGE(0x9800, 0x9fff) AM_RAM_WRITE(slapfight_colorram_w) AM_BASE_MEMBER(slapfght_state, slapfight_colorram)
AM_RANGE(0xa000, 0xa7ff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) AM_RANGE(0xa000, 0xa7ff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram)
ADDRESS_MAP_END ADDRESS_MAP_END
@ -287,14 +285,14 @@ static ADDRESS_MAP_START( tigerh_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0xc000, 0xc7ff) AM_RAM AM_RANGE(0xc000, 0xc7ff) AM_RAM
AM_RANGE(0xc800, 0xc80f) AM_RAM AM_SHARE("share1") AM_RANGE(0xc800, 0xc80f) AM_RAM AM_SHARE("share1")
AM_RANGE(0xc810, 0xcfff) AM_RAM AM_RANGE(0xc810, 0xcfff) AM_RAM
AM_RANGE(0xd000, 0xd7ff) AM_RAM_WRITE(slapfight_videoram_w) AM_BASE(&slapfight_videoram) AM_RANGE(0xd000, 0xd7ff) AM_RAM_WRITE(slapfight_videoram_w) AM_BASE_MEMBER(slapfght_state, slapfight_videoram)
AM_RANGE(0xd800, 0xdfff) AM_RAM_WRITE(slapfight_colorram_w) AM_BASE(&slapfight_colorram) AM_RANGE(0xd800, 0xdfff) AM_RAM_WRITE(slapfight_colorram_w) AM_BASE_MEMBER(slapfght_state, slapfight_colorram)
AM_RANGE(0xe000, 0xe7ff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) AM_RANGE(0xe000, 0xe7ff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram)
AM_RANGE(0xe800, 0xe800) AM_WRITEONLY AM_BASE(&slapfight_scrollx_lo) AM_RANGE(0xe800, 0xe800) AM_WRITEONLY AM_BASE_MEMBER(slapfght_state, slapfight_scrollx_lo)
AM_RANGE(0xe801, 0xe801) AM_WRITEONLY AM_BASE(&slapfight_scrollx_hi) AM_RANGE(0xe801, 0xe801) AM_WRITEONLY AM_BASE_MEMBER(slapfght_state, slapfight_scrollx_hi)
AM_RANGE(0xe802, 0xe802) AM_WRITEONLY AM_BASE(&slapfight_scrolly) AM_RANGE(0xe802, 0xe802) AM_WRITEONLY AM_BASE_MEMBER(slapfght_state, slapfight_scrolly)
AM_RANGE(0xf000, 0xf7ff) AM_RAM_WRITE(slapfight_fixram_w) AM_BASE(&slapfight_fixvideoram) AM_RANGE(0xf000, 0xf7ff) AM_RAM_WRITE(slapfight_fixram_w) AM_BASE_MEMBER(slapfght_state, slapfight_fixvideoram)
AM_RANGE(0xf800, 0xffff) AM_RAM_WRITE(slapfight_fixcol_w) AM_BASE(&slapfight_fixcolorram) AM_RANGE(0xf800, 0xffff) AM_RAM_WRITE(slapfight_fixcol_w) AM_BASE_MEMBER(slapfght_state, slapfight_fixcolorram)
ADDRESS_MAP_END ADDRESS_MAP_END
static ADDRESS_MAP_START( slapfght_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( slapfght_map, ADDRESS_SPACE_PROGRAM, 8 )
@ -303,15 +301,15 @@ static ADDRESS_MAP_START( slapfght_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0xc000, 0xc7ff) AM_RAM AM_RANGE(0xc000, 0xc7ff) AM_RAM
AM_RANGE(0xc800, 0xc80f) AM_RAM AM_SHARE("share1") AM_RANGE(0xc800, 0xc80f) AM_RAM AM_SHARE("share1")
AM_RANGE(0xc810, 0xcfff) AM_RAM AM_RANGE(0xc810, 0xcfff) AM_RAM
AM_RANGE(0xd000, 0xd7ff) AM_RAM_WRITE(slapfight_videoram_w) AM_BASE(&slapfight_videoram) AM_RANGE(0xd000, 0xd7ff) AM_RAM_WRITE(slapfight_videoram_w) AM_BASE_MEMBER(slapfght_state, slapfight_videoram)
AM_RANGE(0xd800, 0xdfff) AM_RAM_WRITE(slapfight_colorram_w) AM_BASE(&slapfight_colorram) AM_RANGE(0xd800, 0xdfff) AM_RAM_WRITE(slapfight_colorram_w) AM_BASE_MEMBER(slapfght_state, slapfight_colorram)
AM_RANGE(0xe000, 0xe7ff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) AM_RANGE(0xe000, 0xe7ff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram)
AM_RANGE(0xe800, 0xe800) AM_WRITEONLY AM_BASE(&slapfight_scrollx_lo) AM_RANGE(0xe800, 0xe800) AM_WRITEONLY AM_BASE_MEMBER(slapfght_state, slapfight_scrollx_lo)
AM_RANGE(0xe801, 0xe801) AM_WRITEONLY AM_BASE(&slapfight_scrollx_hi) AM_RANGE(0xe801, 0xe801) AM_WRITEONLY AM_BASE_MEMBER(slapfght_state, slapfight_scrollx_hi)
AM_RANGE(0xe802, 0xe802) AM_WRITEONLY AM_BASE(&slapfight_scrolly) AM_RANGE(0xe802, 0xe802) AM_WRITEONLY AM_BASE_MEMBER(slapfght_state, slapfight_scrolly)
// AM_RANGE(0xe803, 0xe803) AM_READWRITE(slapfight_mcu_r, slapfight_mcu_w) // AM_RANGE(0xe803, 0xe803) AM_READWRITE(slapfight_mcu_r, slapfight_mcu_w)
AM_RANGE(0xf000, 0xf7ff) AM_RAM_WRITE(slapfight_fixram_w) AM_BASE(&slapfight_fixvideoram) AM_RANGE(0xf000, 0xf7ff) AM_RAM_WRITE(slapfight_fixram_w) AM_BASE_MEMBER(slapfght_state, slapfight_fixvideoram)
AM_RANGE(0xf800, 0xffff) AM_RAM_WRITE(slapfight_fixcol_w) AM_BASE(&slapfight_fixcolorram) AM_RANGE(0xf800, 0xffff) AM_RAM_WRITE(slapfight_fixcol_w) AM_BASE_MEMBER(slapfght_state, slapfight_fixcolorram)
ADDRESS_MAP_END ADDRESS_MAP_END
static ADDRESS_MAP_START( slapfighb2_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( slapfighb2_map, ADDRESS_SPACE_PROGRAM, 8 )
@ -320,15 +318,15 @@ static ADDRESS_MAP_START( slapfighb2_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0xc000, 0xc7ff) AM_RAM AM_RANGE(0xc000, 0xc7ff) AM_RAM
AM_RANGE(0xc800, 0xc80f) AM_RAM AM_SHARE("share1") AM_RANGE(0xc800, 0xc80f) AM_RAM AM_SHARE("share1")
AM_RANGE(0xc810, 0xcfff) AM_RAM AM_RANGE(0xc810, 0xcfff) AM_RAM
AM_RANGE(0xd000, 0xd7ff) AM_RAM_WRITE(slapfight_videoram_w) AM_BASE(&slapfight_videoram) AM_RANGE(0xd000, 0xd7ff) AM_RAM_WRITE(slapfight_videoram_w) AM_BASE_MEMBER(slapfght_state, slapfight_videoram)
AM_RANGE(0xd800, 0xdfff) AM_RAM_WRITE(slapfight_colorram_w) AM_BASE(&slapfight_colorram) AM_RANGE(0xd800, 0xdfff) AM_RAM_WRITE(slapfight_colorram_w) AM_BASE_MEMBER(slapfght_state, slapfight_colorram)
AM_RANGE(0xe000, 0xe7ff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) AM_RANGE(0xe000, 0xe7ff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram)
AM_RANGE(0xe800, 0xe800) AM_WRITEONLY AM_BASE(&slapfight_scrollx_hi) AM_RANGE(0xe800, 0xe800) AM_WRITEONLY AM_BASE_MEMBER(slapfght_state, slapfight_scrollx_hi)
AM_RANGE(0xe802, 0xe802) AM_WRITEONLY AM_BASE(&slapfight_scrolly) AM_RANGE(0xe802, 0xe802) AM_WRITEONLY AM_BASE_MEMBER(slapfght_state, slapfight_scrolly)
AM_RANGE(0xe803, 0xe803) AM_WRITEONLY AM_BASE(&slapfight_scrollx_lo) AM_RANGE(0xe803, 0xe803) AM_WRITEONLY AM_BASE_MEMBER(slapfght_state, slapfight_scrollx_lo)
AM_RANGE(0xec00, 0xefff) AM_ROM // it reads a copy of the logo from here! AM_RANGE(0xec00, 0xefff) AM_ROM // it reads a copy of the logo from here!
AM_RANGE(0xf000, 0xf7ff) AM_RAM_WRITE(slapfight_fixram_w) AM_BASE(&slapfight_fixvideoram) AM_RANGE(0xf000, 0xf7ff) AM_RAM_WRITE(slapfight_fixram_w) AM_BASE_MEMBER(slapfght_state, slapfight_fixvideoram)
AM_RANGE(0xf800, 0xffff) AM_RAM_WRITE(slapfight_fixcol_w) AM_BASE(&slapfight_fixcolorram) AM_RANGE(0xf800, 0xffff) AM_RAM_WRITE(slapfight_fixcol_w) AM_BASE_MEMBER(slapfght_state, slapfight_fixcolorram)
ADDRESS_MAP_END ADDRESS_MAP_END
static ADDRESS_MAP_START( slapfght_io_map, ADDRESS_SPACE_IO, 8 ) static ADDRESS_MAP_START( slapfght_io_map, ADDRESS_SPACE_IO, 8 )
@ -743,7 +741,7 @@ static SCREEN_EOF( perfrman )
buffer_spriteram_w(space, 0, 0); buffer_spriteram_w(space, 0, 0);
} }
static MACHINE_CONFIG_START( perfrman, driver_device ) static MACHINE_CONFIG_START( perfrman, slapfght_state )
/* basic machine hardware */ /* basic machine hardware */
MCFG_CPU_ADD("maincpu", Z80,16000000/4) /* 4MHz ???, 16MHz Oscillator */ MCFG_CPU_ADD("maincpu", Z80,16000000/4) /* 4MHz ???, 16MHz Oscillator */
@ -790,7 +788,7 @@ static MACHINE_CONFIG_START( perfrman, driver_device )
MACHINE_CONFIG_END MACHINE_CONFIG_END
static MACHINE_CONFIG_START( tigerhb, driver_device ) static MACHINE_CONFIG_START( tigerhb, slapfght_state )
/* basic machine hardware */ /* basic machine hardware */
MCFG_CPU_ADD("maincpu", Z80, 6000000) MCFG_CPU_ADD("maincpu", Z80, 6000000)
@ -836,7 +834,7 @@ static MACHINE_CONFIG_START( tigerhb, driver_device )
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
MACHINE_CONFIG_END MACHINE_CONFIG_END
static MACHINE_CONFIG_START( tigerh, driver_device ) static MACHINE_CONFIG_START( tigerh, slapfght_state )
/* basic machine hardware */ /* basic machine hardware */
MCFG_CPU_ADD("maincpu", Z80, XTAL_36MHz/6) /* verified on pcb */ MCFG_CPU_ADD("maincpu", Z80, XTAL_36MHz/6) /* verified on pcb */
@ -886,7 +884,7 @@ static MACHINE_CONFIG_START( tigerh, driver_device )
MACHINE_CONFIG_END MACHINE_CONFIG_END
static MACHINE_CONFIG_START( slapfigh, driver_device ) static MACHINE_CONFIG_START( slapfigh, slapfght_state )
/* basic machine hardware */ /* basic machine hardware */
MCFG_CPU_ADD("maincpu",Z80, XTAL_36MHz/6) /* verified on pcb */ MCFG_CPU_ADD("maincpu",Z80, XTAL_36MHz/6) /* verified on pcb */
@ -1815,21 +1813,24 @@ static void getstar_init( running_machine *machine )
static DRIVER_INIT( getstar ) static DRIVER_INIT( getstar )
{ {
getstar_id = GETSTAR; slapfght_state *state = machine->driver_data<slapfght_state>();
state->getstar_id = GETSTAR;
getstar_init(machine); getstar_init(machine);
} }
static DRIVER_INIT( getstarj ) static DRIVER_INIT( getstarj )
{ {
getstar_id = GETSTARJ; slapfght_state *state = machine->driver_data<slapfght_state>();
state->getstar_id = GETSTARJ;
getstar_init(machine); getstar_init(machine);
} }
static DRIVER_INIT( gtstarb1 ) static DRIVER_INIT( gtstarb1 )
{ {
slapfght_state *state = machine->driver_data<slapfght_state>();
UINT8 *ROM = machine->region("maincpu")->base(); UINT8 *ROM = machine->region("maincpu")->base();
getstar_id = GTSTARB1; state->getstar_id = GTSTARB1;
getstar_init(machine); getstar_init(machine);
/* specific handlers for this bootleg */ /* specific handlers for this bootleg */
@ -1843,7 +1844,8 @@ static DRIVER_INIT( gtstarb1 )
static DRIVER_INIT( gtstarb2 ) static DRIVER_INIT( gtstarb2 )
{ {
getstar_id = GTSTARB2; slapfght_state *state = machine->driver_data<slapfght_state>();
state->getstar_id = GTSTARB2;
getstar_init(machine); getstar_init(machine);
} }

View File

@ -570,22 +570,24 @@ A trojan could be used on the board to verify the exact behaviour.
*****************************************************************************/ *****************************************************************************/
static int hf_posy, hf_posx;
static WRITE8_HANDLER( hardflags_scrollx_w ) static WRITE8_HANDLER( hardflags_scrollx_w )
{ {
hf_posx = (hf_posx & ~0xff) | data; snk_state *state = space->machine->driver_data<snk_state>();
state->hf_posx = (state->hf_posx & ~0xff) | data;
} }
static WRITE8_HANDLER( hardflags_scrolly_w ) static WRITE8_HANDLER( hardflags_scrolly_w )
{ {
hf_posy = (hf_posy & ~0xff) | data; snk_state *state = space->machine->driver_data<snk_state>();
state->hf_posy = (state->hf_posy & ~0xff) | data;
} }
static WRITE8_HANDLER( hardflags_scroll_msb_w ) static WRITE8_HANDLER( hardflags_scroll_msb_w )
{ {
hf_posx = (hf_posx & 0xff) | ((data & 0x80) << 1); snk_state *state = space->machine->driver_data<snk_state>();
hf_posy = (hf_posy & 0xff) | ((data & 0x40) << 2); state->hf_posx = (state->hf_posx & 0xff) | ((data & 0x80) << 1);
state->hf_posy = (state->hf_posy & 0xff) | ((data & 0x40) << 2);
// low 6 bits might indicate radius, but it's not clear // low 6 bits might indicate radius, but it's not clear
} }
@ -597,8 +599,8 @@ static int hardflags_check(running_machine *machine, int num)
int x = sr[2] + ((sr[3] & 0x80) << 1); int x = sr[2] + ((sr[3] & 0x80) << 1);
int y = sr[0] + ((sr[3] & 0x10) << 4); int y = sr[0] + ((sr[3] & 0x10) << 4);
int dx = (x - hf_posx) & 0x1ff; int dx = (x - state->hf_posx) & 0x1ff;
int dy = (y - hf_posy) & 0x1ff; int dy = (y - state->hf_posy) & 0x1ff;
if (dx > 0x20 && dx <= 0x1e0 && dy > 0x20 && dy <= 0x1e0) if (dx > 0x20 && dx <= 0x1e0 && dy > 0x20 && dy <= 0x1e0)
return 0; return 0;
@ -652,34 +654,38 @@ A trojan could be used on the board to verify the exact behaviour.
*****************************************************************************/ *****************************************************************************/
static int tc16_posy, tc16_posx, tc32_posy, tc32_posx;
static WRITE8_HANDLER( turbocheck16_1_w ) static WRITE8_HANDLER( turbocheck16_1_w )
{ {
tc16_posy = (tc16_posy & ~0xff) | data; snk_state *state = space->machine->driver_data<snk_state>();
state->tc16_posy = (state->tc16_posy & ~0xff) | data;
} }
static WRITE8_HANDLER( turbocheck16_2_w ) static WRITE8_HANDLER( turbocheck16_2_w )
{ {
tc16_posx = (tc16_posx & ~0xff) | data; snk_state *state = space->machine->driver_data<snk_state>();
state->tc16_posx = (state->tc16_posx & ~0xff) | data;
} }
static WRITE8_HANDLER( turbocheck32_1_w ) static WRITE8_HANDLER( turbocheck32_1_w )
{ {
tc32_posy = (tc32_posy & ~0xff) | data; snk_state *state = space->machine->driver_data<snk_state>();
state->tc32_posy = (state->tc32_posy & ~0xff) | data;
} }
static WRITE8_HANDLER( turbocheck32_2_w ) static WRITE8_HANDLER( turbocheck32_2_w )
{ {
tc32_posx = (tc32_posx & ~0xff) | data; snk_state *state = space->machine->driver_data<snk_state>();
state->tc32_posx = (state->tc32_posx & ~0xff) | data;
} }
static WRITE8_HANDLER( turbocheck_msb_w ) static WRITE8_HANDLER( turbocheck_msb_w )
{ {
tc16_posx = (tc16_posx & 0xff) | ((data & 0x80) << 1); snk_state *state = space->machine->driver_data<snk_state>();
tc16_posy = (tc16_posy & 0xff) | ((data & 0x40) << 2); state->tc16_posx = (state->tc16_posx & 0xff) | ((data & 0x80) << 1);
tc32_posx = (tc32_posx & 0xff) | ((data & 0x80) << 1); state->tc16_posy = (state->tc16_posy & 0xff) | ((data & 0x40) << 2);
tc32_posy = (tc32_posy & 0xff) | ((data & 0x40) << 2); state->tc32_posx = (state->tc32_posx & 0xff) | ((data & 0x80) << 1);
state->tc32_posy = (state->tc32_posy & 0xff) | ((data & 0x40) << 2);
// low 6 bits might indicate radius, but it's not clear // low 6 bits might indicate radius, but it's not clear
} }
@ -691,8 +697,8 @@ static int turbofront_check(running_machine *machine, int small, int num)
int x = sr[2] + ((sr[3] & 0x80) << 1); int x = sr[2] + ((sr[3] & 0x80) << 1);
int y = sr[0] + ((sr[3] & 0x10) << 4); int y = sr[0] + ((sr[3] & 0x10) << 4);
int dx = (x - (small ? tc16_posx : tc32_posx)) & 0x1ff; int dx = (x - (small ? state->tc16_posx : state->tc32_posx)) & 0x1ff;
int dy = (y - (small ? tc16_posy : tc32_posy)) & 0x1ff; int dy = (y - (small ? state->tc16_posy : state->tc32_posy)) & 0x1ff;
if (dx > 0x20 && dx <= 0x1e0 && dy > 0x20 && dy <= 0x1e0) if (dx > 0x20 && dx <= 0x1e0 && dy > 0x20 && dy <= 0x1e0)
return 0; return 0;

View File

@ -73,6 +73,20 @@ out of the sprite list at that point.. (verify on real hw)
#include "video/kan_panb.h" // for bootlegs / non-original hw #include "video/kan_panb.h" // for bootlegs / non-original hw
#include "cpu/mcs51/mcs51.h" // for semicom mcu #include "cpu/mcs51/mcs51.h" // for semicom mcu
class snowbros_state : public driver_device
{
public:
snowbros_state(running_machine &machine, const driver_device_config_base &config)
: driver_device(machine, config) { }
UINT16 *hyperpac_ram;
int sb3_music_is_playing;
int sb3_music;
UINT8 semicom_prot_offset;
};
static WRITE16_HANDLER( snowbros_flipscreen_w ) static WRITE16_HANDLER( snowbros_flipscreen_w )
{ {
if (ACCESSING_BITS_8_15) if (ACCESSING_BITS_8_15)
@ -98,9 +112,6 @@ static SCREEN_EOF( snowbros )
} }
static UINT16 *hyperpac_ram;
static int sb3_music_is_playing;
static int sb3_music;
static WRITE16_HANDLER( snowbros_irq4_ack_w ) static WRITE16_HANDLER( snowbros_irq4_ack_w )
{ {
@ -124,16 +135,17 @@ static INTERRUPT_GEN( snowbros_interrupt )
static INTERRUPT_GEN( snowbro3_interrupt ) static INTERRUPT_GEN( snowbro3_interrupt )
{ {
snowbros_state *state = device->machine->driver_data<snowbros_state>();
okim6295_device *adpcm = device->machine->device<okim6295_device>("oki"); okim6295_device *adpcm = device->machine->device<okim6295_device>("oki");
int status = adpcm->read_status(); int status = adpcm->read_status();
cpu_set_input_line(device, cpu_getiloops(device) + 2, ASSERT_LINE); /* IRQs 4, 3, and 2 */ cpu_set_input_line(device, cpu_getiloops(device) + 2, ASSERT_LINE); /* IRQs 4, 3, and 2 */
if (sb3_music_is_playing) if (state->sb3_music_is_playing)
{ {
if ((status&0x08)==0x00) if ((status&0x08)==0x00)
{ {
adpcm->write_command(0x80|sb3_music); adpcm->write_command(0x80|state->sb3_music);
adpcm->write_command(0x00|0x82); adpcm->write_command(0x00|0x82);
} }
@ -208,32 +220,32 @@ static READ8_HANDLER( prot_io_r )
return 0x00; return 0x00;
} }
static UINT8 semicom_prot_offset = 0x00;
// probably not endian safe // probably not endian safe
static WRITE8_HANDLER( prot_io_w ) static WRITE8_HANDLER( prot_io_w )
{ {
snowbros_state *state = space->machine->driver_data<snowbros_state>();
switch (offset) switch (offset)
{ {
case 0x00: case 0x00:
{ {
UINT16 word = hyperpac_ram[(0xe000/2)+semicom_prot_offset]; UINT16 word = state->hyperpac_ram[(0xe000/2)+state->semicom_prot_offset];
word = (word & 0xff00) | (data << 0); word = (word & 0xff00) | (data << 0);
hyperpac_ram[(0xe000/2)+semicom_prot_offset] = word; state->hyperpac_ram[(0xe000/2)+state->semicom_prot_offset] = word;
break; break;
} }
case 0x01: case 0x01:
{ {
UINT16 word = hyperpac_ram[(0xe000/2)+semicom_prot_offset]; UINT16 word = state->hyperpac_ram[(0xe000/2)+state->semicom_prot_offset];
word = (word & 0x00ff) | (data << 8); word = (word & 0x00ff) | (data << 8);
hyperpac_ram[(0xe000/2)+semicom_prot_offset] = word; state->hyperpac_ram[(0xe000/2)+state->semicom_prot_offset] = word;
break; break;
} }
case 0x02: // offset case 0x02: // offset
{ {
semicom_prot_offset = data; state->semicom_prot_offset = data;
break; break;
} }
@ -276,7 +288,7 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( honeydol_map, ADDRESS_SPACE_PROGRAM, 16 ) static ADDRESS_MAP_START( honeydol_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x03ffff) AM_ROM AM_RANGE(0x000000, 0x03ffff) AM_ROM
AM_RANGE(0x100000, 0x10ffff) AM_RAM AM_BASE(&hyperpac_ram) AM_RANGE(0x100000, 0x10ffff) AM_RAM AM_BASE_MEMBER(snowbros_state, hyperpac_ram)
AM_RANGE(0x200000, 0x200001) AM_WRITENOP /* ? */ AM_RANGE(0x200000, 0x200001) AM_WRITENOP /* ? */
AM_RANGE(0x300000, 0x300001) AM_WRITE(snowbros_68000_sound_w) /* ? */ AM_RANGE(0x300000, 0x300001) AM_WRITE(snowbros_68000_sound_w) /* ? */
AM_RANGE(0x400000, 0x400001) AM_WRITE(snowbros_irq4_ack_w) /* IRQ 4 acknowledge */ AM_RANGE(0x400000, 0x400001) AM_WRITE(snowbros_irq4_ack_w) /* IRQ 4 acknowledge */
@ -356,7 +368,7 @@ sound hardware is also different
static ADDRESS_MAP_START( hyperpac_map, ADDRESS_SPACE_PROGRAM, 16 ) static ADDRESS_MAP_START( hyperpac_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x0fffff) AM_ROM AM_RANGE(0x000000, 0x0fffff) AM_ROM
AM_RANGE(0x100000, 0x10ffff) AM_RAM AM_BASE(&hyperpac_ram) AM_RANGE(0x100000, 0x10ffff) AM_RAM AM_BASE_MEMBER(snowbros_state, hyperpac_ram)
AM_RANGE(0x300000, 0x300001) AM_WRITE(semicom_soundcmd_w) AM_RANGE(0x300000, 0x300001) AM_WRITE(semicom_soundcmd_w)
// AM_RANGE(0x400000, 0x400001) ??? // AM_RANGE(0x400000, 0x400001) ???
AM_RANGE(0x500000, 0x500001) AM_READ_PORT("DSW1") AM_RANGE(0x500000, 0x500001) AM_READ_PORT("DSW1")
@ -387,10 +399,11 @@ static READ16_HANDLER( sb3_sound_r )
static void sb3_play_music(running_machine *machine, int data) static void sb3_play_music(running_machine *machine, int data)
{ {
snowbros_state *state = machine->driver_data<snowbros_state>();
UINT8 *snd; UINT8 *snd;
/* sample is actually played in interrupt function so it loops */ /* sample is actually played in interrupt function so it loops */
sb3_music = data; state->sb3_music = data;
switch (data) switch (data)
{ {
@ -398,13 +411,13 @@ static void sb3_play_music(running_machine *machine, int data)
case 0x26: case 0x26:
snd = machine->region("oki")->base(); snd = machine->region("oki")->base();
memcpy(snd+0x20000, snd+0x80000+0x00000, 0x20000); memcpy(snd+0x20000, snd+0x80000+0x00000, 0x20000);
sb3_music_is_playing = 1; state->sb3_music_is_playing = 1;
break; break;
case 0x24: case 0x24:
snd = machine->region("oki")->base(); snd = machine->region("oki")->base();
memcpy(snd+0x20000, snd+0x80000+0x20000, 0x20000); memcpy(snd+0x20000, snd+0x80000+0x20000, 0x20000);
sb3_music_is_playing = 1; state->sb3_music_is_playing = 1;
break; break;
case 0x25: case 0x25:
@ -417,11 +430,11 @@ static void sb3_play_music(running_machine *machine, int data)
case 0x2d: case 0x2d:
snd = machine->region("oki")->base(); snd = machine->region("oki")->base();
memcpy(snd+0x20000, snd+0x80000+0x40000, 0x20000); memcpy(snd+0x20000, snd+0x80000+0x40000, 0x20000);
sb3_music_is_playing = 1; state->sb3_music_is_playing = 1;
break; break;
case 0x2e: case 0x2e:
sb3_music_is_playing = 0; state->sb3_music_is_playing = 0;
break; break;
} }
} }
@ -451,10 +464,11 @@ static void sb3_play_sound (okim6295_device *oki, int data)
static WRITE16_DEVICE_HANDLER( sb3_sound_w ) static WRITE16_DEVICE_HANDLER( sb3_sound_w )
{ {
snowbros_state *state = device->machine->driver_data<snowbros_state>();
okim6295_device *oki = downcast<okim6295_device *>(device); okim6295_device *oki = downcast<okim6295_device *>(device);
if (data == 0x00fe) if (data == 0x00fe)
{ {
sb3_music_is_playing = 0; state->sb3_music_is_playing = 0;
oki->write_command(0x78); /* Stop sounds */ oki->write_command(0x78); /* Stop sounds */
} }
else /* the alternating 0x00-0x2f or 0x30-0x5f might be something to do with the channels */ else /* the alternating 0x00-0x2f or 0x30-0x5f might be something to do with the channels */
@ -507,7 +521,7 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( finalttr_map, ADDRESS_SPACE_PROGRAM, 16 ) static ADDRESS_MAP_START( finalttr_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x0fffff) AM_ROM AM_RANGE(0x000000, 0x0fffff) AM_ROM
AM_RANGE(0x100000, 0x103fff) AM_RAM AM_BASE(&hyperpac_ram) AM_RANGE(0x100000, 0x103fff) AM_RAM AM_BASE_MEMBER(snowbros_state, hyperpac_ram)
AM_RANGE(0x300000, 0x300001) AM_WRITE(semicom_soundcmd_w) AM_RANGE(0x300000, 0x300001) AM_WRITE(semicom_soundcmd_w)
// AM_RANGE(0x400000, 0x400001) ??? // AM_RANGE(0x400000, 0x400001) ???
@ -1423,20 +1437,22 @@ static const ym2151_interface ym2151_config =
static MACHINE_RESET (semiprot) static MACHINE_RESET (semiprot)
{ {
snowbros_state *state = machine->driver_data<snowbros_state>();
UINT16 *PROTDATA = (UINT16*)machine->region("user1")->base(); UINT16 *PROTDATA = (UINT16*)machine->region("user1")->base();
int i; int i;
for (i = 0;i < 0x200/2;i++) for (i = 0;i < 0x200/2;i++)
hyperpac_ram[0xf000/2 + i] = PROTDATA[i]; state->hyperpac_ram[0xf000/2 + i] = PROTDATA[i];
} }
static MACHINE_RESET (finalttr) static MACHINE_RESET (finalttr)
{ {
snowbros_state *state = machine->driver_data<snowbros_state>();
UINT16 *PROTDATA = (UINT16*)machine->region("user1")->base(); UINT16 *PROTDATA = (UINT16*)machine->region("user1")->base();
int i; int i;
for (i = 0;i < 0x200/2;i++) for (i = 0;i < 0x200/2;i++)
hyperpac_ram[0x2000/2 + i] = PROTDATA[i]; state->hyperpac_ram[0x2000/2 + i] = PROTDATA[i];
} }
static const kaneko_pandora_interface snowbros_pandora_config = static const kaneko_pandora_interface snowbros_pandora_config =
@ -1446,7 +1462,7 @@ static const kaneko_pandora_interface snowbros_pandora_config =
0, 0 /* x_offs, y_offs */ 0, 0 /* x_offs, y_offs */
}; };
static MACHINE_CONFIG_START( snowbros, driver_device ) static MACHINE_CONFIG_START( snowbros, snowbros_state )
/* basic machine hardware */ /* basic machine hardware */
MCFG_CPU_ADD("maincpu", M68000, 8000000) /* 8 Mhz - confirmed */ MCFG_CPU_ADD("maincpu", M68000, 8000000) /* 8 Mhz - confirmed */
@ -1557,7 +1573,7 @@ CPU : 1 X MC68000P12
See included pics See included pics
*/ */
static MACHINE_CONFIG_START( honeydol, driver_device ) static MACHINE_CONFIG_START( honeydol, snowbros_state )
/* basic machine hardware */ /* basic machine hardware */
MCFG_CPU_ADD("maincpu", M68000, 16000000) MCFG_CPU_ADD("maincpu", M68000, 16000000)
@ -1594,7 +1610,7 @@ static MACHINE_CONFIG_START( honeydol, driver_device )
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
MACHINE_CONFIG_END MACHINE_CONFIG_END
static MACHINE_CONFIG_START( twinadv, driver_device ) static MACHINE_CONFIG_START( twinadv, snowbros_state )
/* basic machine hardware */ /* basic machine hardware */
MCFG_CPU_ADD("maincpu", M68000, 16000000) // or 12 MCFG_CPU_ADD("maincpu", M68000, 16000000) // or 12
@ -1672,7 +1688,7 @@ static MACHINE_CONFIG_DERIVED( _4in1, semicom )
MCFG_GFXDECODE(snowbros) MCFG_GFXDECODE(snowbros)
MACHINE_CONFIG_END MACHINE_CONFIG_END
static MACHINE_CONFIG_START( snowbro3, driver_device ) static MACHINE_CONFIG_START( snowbro3, snowbros_state )
/* basic machine hardware */ /* basic machine hardware */
MCFG_CPU_ADD("maincpu", M68000, 16000000) /* 16mhz or 12mhz ? */ MCFG_CPU_ADD("maincpu", M68000, 16000000) /* 16mhz or 12mhz ? */
@ -2246,11 +2262,12 @@ static READ16_HANDLER ( moremorp_0a_read )
static DRIVER_INIT( moremorp ) static DRIVER_INIT( moremorp )
{ {
//snowbros_state *state = machine->driver_data<snowbros_state>();
// UINT16 *PROTDATA = (UINT16*)machine->region("user1")->base(); // UINT16 *PROTDATA = (UINT16*)machine->region("user1")->base();
// int i; // int i;
// for (i = 0;i < 0x200/2;i++) // for (i = 0;i < 0x200/2;i++)
// hyperpac_ram[0xf000/2 + i] = PROTDATA[i]; // state->hyperpac_ram[0xf000/2 + i] = PROTDATA[i];
/* explicit check in the code */ /* explicit check in the code */
memory_install_read16_handler(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x200000, 0x200001, 0, 0, moremorp_0a_read ); memory_install_read16_handler(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x200000, 0x200001, 0, 0, moremorp_0a_read );
@ -2259,11 +2276,12 @@ static DRIVER_INIT( moremorp )
static DRIVER_INIT( cookbib2 ) static DRIVER_INIT( cookbib2 )
{ {
//snowbros_state *state = machine->driver_data<snowbros_state>();
// UINT16 *HCROM = (UINT16*)machine->region("maincpu")->base(); // UINT16 *HCROM = (UINT16*)machine->region("maincpu")->base();
// UINT16 *PROTDATA = (UINT16*)machine->region("user1")->base(); // UINT16 *PROTDATA = (UINT16*)machine->region("user1")->base();
// int i; // int i;
// hyperpac_ram[0xf000/2] = 0x46fc; // state->hyperpac_ram[0xf000/2] = 0x46fc;
// hyperpac_ram[0xf002/2] = 0x2700; // state->hyperpac_ram[0xf002/2] = 0x2700;
// verified on real hardware, need to move this to a file really // verified on real hardware, need to move this to a file really
@ -2276,18 +2294,18 @@ static DRIVER_INIT( cookbib2 )
//for (i = 0;i < sizeof(cookbib2_mcu68k)/sizeof(cookbib2_mcu68k[0]);i++) //for (i = 0;i < sizeof(cookbib2_mcu68k)/sizeof(cookbib2_mcu68k[0]);i++)
// hyperpac_ram[0xf000/2 + i] = cookbib2_mcu68k[i]; // state->hyperpac_ram[0xf000/2 + i] = cookbib2_mcu68k[i];
// for (i = 0;i < 0x200/2;i++) // for (i = 0;i < 0x200/2;i++)
// hyperpac_ram[0xf000/2 + i] = PROTDATA[i]; // state->hyperpac_ram[0xf000/2 + i] = PROTDATA[i];
// trojan is actually buggy and gfx flicker like crazy // trojan is actually buggy and gfx flicker like crazy
// but we can pause the system after bootup with HALT line of 68k to get the table before // but we can pause the system after bootup with HALT line of 68k to get the table before
// it goes nuts // it goes nuts
// hyperpac_ram[0xf07a/2] = 0x4e73; // state->hyperpac_ram[0xf07a/2] = 0x4e73;
// hyperpac_ram[0xf000/2] = 0x4e73; // state->hyperpac_ram[0xf000/2] = 0x4e73;
#if 0 #if 0
@ -2603,6 +2621,8 @@ static DRIVER_INIT( cookbib2 )
#if 0 #if 0
static DRIVER_INIT( hyperpac ) static DRIVER_INIT( hyperpac )
{ {
snowbros_state *state = machine->driver_data<snowbros_state>();
UINT16 *hyperpac_ram = state->hyperpac_ram;
/* simulate RAM initialization done by the protection MCU */ /* simulate RAM initialization done by the protection MCU */
/* not verified on real hardware */ /* not verified on real hardware */
hyperpac_ram[0xe000/2] = 0x4ef9; hyperpac_ram[0xe000/2] = 0x4ef9;

View File

@ -62,11 +62,6 @@ Note:
#include "includes/srmp2.h" #include "includes/srmp2.h"
#include "machine/nvram.h" #include "machine/nvram.h"
static struct
{
int reset,ff_event,ff_1,protcheck[4],protlatch[4];
}iox;
/*************************************************************************** /***************************************************************************
Interrupt(s) Interrupt(s)
@ -90,6 +85,9 @@ static INTERRUPT_GEN( srmp2_interrupt )
static MACHINE_START( srmp2 ) static MACHINE_START( srmp2 )
{ {
srmp2_state *state = machine->driver_data<srmp2_state>();
iox_t &iox = state->iox;
iox.reset = 0x1f; iox.reset = 0x1f;
iox.ff_event = -1; iox.ff_event = -1;
iox.ff_1 = 0x00; iox.ff_1 = 0x00;
@ -102,6 +100,9 @@ static MACHINE_START( srmp2 )
static MACHINE_START( srmp3 ) static MACHINE_START( srmp3 )
{ {
srmp2_state *state = machine->driver_data<srmp2_state>();
iox_t &iox = state->iox;
iox.reset = 0xc8; iox.reset = 0xc8;
iox.ff_event = 0xef; iox.ff_event = 0xef;
iox.ff_1 = -1; iox.ff_1 = -1;
@ -113,6 +114,9 @@ static MACHINE_START( srmp3 )
static MACHINE_START( rmgoldyh ) static MACHINE_START( rmgoldyh )
{ {
srmp2_state *state = machine->driver_data<srmp2_state>();
iox_t &iox = state->iox;
iox.reset = 0xc8; iox.reset = 0xc8;
iox.ff_event = 0xff; iox.ff_event = 0xff;
iox.ff_1 = -1; iox.ff_1 = -1;
@ -285,6 +289,8 @@ static UINT8 iox_key_matrix_calc(running_machine *machine,UINT8 p_side)
static READ8_HANDLER( iox_mux_r ) static READ8_HANDLER( iox_mux_r )
{ {
srmp2_state *state = space->machine->driver_data<srmp2_state>(); srmp2_state *state = space->machine->driver_data<srmp2_state>();
iox_t &iox = state->iox;
/* first off check any pending protection value */ /* first off check any pending protection value */
{ {
int i; int i;
@ -294,21 +300,21 @@ static READ8_HANDLER( iox_mux_r )
if(iox.protcheck[i] == -1) if(iox.protcheck[i] == -1)
continue; //skip continue; //skip
if(state->iox_data == iox.protcheck[i]) if(iox.data == iox.protcheck[i])
{ {
state->iox_data = 0; //clear write latch iox.data = 0; //clear write latch
return iox.protlatch[i]; return iox.protlatch[i];
} }
} }
} }
if(state->iox_ff == 0) if(iox.ff == 0)
{ {
if(state->iox_mux != 1 && state->iox_mux != 2 && state->iox_mux != 4) if(iox.mux != 1 && iox.mux != 2 && iox.mux != 4)
return 0xff; //unknown command return 0xff; //unknown command
/* both side checks */ /* both side checks */
if(state->iox_mux == 1) if(iox.mux == 1)
{ {
UINT8 p1_side = iox_key_matrix_calc(space->machine,0); UINT8 p1_side = iox_key_matrix_calc(space->machine,0);
UINT8 p2_side = iox_key_matrix_calc(space->machine,4); UINT8 p2_side = iox_key_matrix_calc(space->machine,4);
@ -320,7 +326,7 @@ static READ8_HANDLER( iox_mux_r )
} }
/* check individual input side */ /* check individual input side */
return iox_key_matrix_calc(space->machine,(state->iox_mux == 2) ? 0 : 4); return iox_key_matrix_calc(space->machine,(iox.mux == 2) ? 0 : 4);
} }
return input_port_read(space->machine,"SERVICE") & 0xff; return input_port_read(space->machine,"SERVICE") & 0xff;
@ -334,6 +340,7 @@ static READ8_HANDLER( iox_status_r )
static WRITE8_HANDLER( iox_command_w ) static WRITE8_HANDLER( iox_command_w )
{ {
srmp2_state *state = space->machine->driver_data<srmp2_state>(); srmp2_state *state = space->machine->driver_data<srmp2_state>();
iox_t &iox = state->iox;
/* /*
bit wise command port apparently bit wise command port apparently
0x01: selects both sides 0x01: selects both sides
@ -341,23 +348,24 @@ static WRITE8_HANDLER( iox_command_w )
0x04: selects p2 side 0x04: selects p2 side
*/ */
state->iox_mux = data; iox.mux = data;
state->iox_ff = 0; // this also set flip flop back to 0 iox.ff = 0; // this also set flip flop back to 0
} }
static WRITE8_HANDLER( iox_data_w ) static WRITE8_HANDLER( iox_data_w )
{ {
srmp2_state *state = space->machine->driver_data<srmp2_state>(); srmp2_state *state = space->machine->driver_data<srmp2_state>();
state->iox_data = data; iox_t &iox = state->iox;
iox.data = data;
if(data == iox.reset && iox.reset != -1) //resets device if(data == iox.reset && iox.reset != -1) //resets device
state->iox_ff = 0; iox.ff = 0;
if(data == iox.ff_event && iox.ff_event != -1) // flip flop event if(data == iox.ff_event && iox.ff_event != -1) // flip flop event
state->iox_ff ^= 1; iox.ff ^= 1;
if(data == iox.ff_1 && iox.ff_1 != -1) // set flip flop to 1 if(data == iox.ff_1 && iox.ff_1 != -1) // set flip flop to 1
state->iox_ff = 1; iox.ff = 1;
} }
static WRITE8_HANDLER( srmp3_rombank_w ) static WRITE8_HANDLER( srmp3_rombank_w )

View File

@ -84,10 +84,6 @@
#include "includes/suprridr.h" #include "includes/suprridr.h"
#include "sound/ay8910.h" #include "sound/ay8910.h"
static UINT8 nmi_enable;
static UINT8 sound_data;
/************************************* /*************************************
* *
@ -97,13 +93,15 @@ static UINT8 sound_data;
static WRITE8_HANDLER( nmi_enable_w ) static WRITE8_HANDLER( nmi_enable_w )
{ {
nmi_enable = data; suprridr_state *state = space->machine->driver_data<suprridr_state>();
state->nmi_enable = data;
} }
static INTERRUPT_GEN( main_nmi_gen ) static INTERRUPT_GEN( main_nmi_gen )
{ {
if (nmi_enable) suprridr_state *state = device->machine->driver_data<suprridr_state>();
if (state->nmi_enable)
cpu_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); cpu_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE);
} }
@ -117,7 +115,8 @@ static INTERRUPT_GEN( main_nmi_gen )
static TIMER_CALLBACK( delayed_sound_w ) static TIMER_CALLBACK( delayed_sound_w )
{ {
sound_data = param; suprridr_state *state = machine->driver_data<suprridr_state>();
state->sound_data = param;
cputag_set_input_line(machine, "audiocpu", 0, ASSERT_LINE); cputag_set_input_line(machine, "audiocpu", 0, ASSERT_LINE);
} }
@ -130,7 +129,8 @@ static WRITE8_HANDLER( sound_data_w )
static READ8_DEVICE_HANDLER( sound_data_r ) static READ8_DEVICE_HANDLER( sound_data_r )
{ {
return sound_data; suprridr_state *state = device->machine->driver_data<suprridr_state>();
return state->sound_data;
} }
@ -164,8 +164,8 @@ static WRITE8_HANDLER( coin_lock_w )
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 AM_RANGE(0x8000, 0x87ff) AM_RAM
AM_RANGE(0x8800, 0x8bff) AM_RAM_WRITE(suprridr_bgram_w) AM_BASE(&suprridr_bgram) AM_RANGE(0x8800, 0x8bff) AM_RAM_WRITE(suprridr_bgram_w) AM_BASE_MEMBER(suprridr_state, bgram)
AM_RANGE(0x9000, 0x97ff) AM_RAM_WRITE(suprridr_fgram_w) AM_BASE(&suprridr_fgram) AM_RANGE(0x9000, 0x97ff) AM_RAM_WRITE(suprridr_fgram_w) AM_BASE_MEMBER(suprridr_state, fgram)
AM_RANGE(0x9800, 0x983f) AM_RAM AM_RANGE(0x9800, 0x983f) AM_RAM
AM_RANGE(0x9840, 0x987f) AM_RAM AM_BASE_GENERIC(spriteram) AM_RANGE(0x9840, 0x987f) AM_RAM AM_BASE_GENERIC(spriteram)
AM_RANGE(0x9880, 0x9bff) AM_RAM AM_RANGE(0x9880, 0x9bff) AM_RAM
@ -228,7 +228,7 @@ static CUSTOM_INPUT( suprridr_control_r )
UINT32 ret; UINT32 ret;
/* screen flip multiplexes controls */ /* screen flip multiplexes controls */
if (suprridr_is_screen_flipped()) if (suprridr_is_screen_flipped(field->port->machine))
ret = input_port_read(field->port->machine, SUPRRIDR_P2_CONTROL_PORT_TAG); ret = input_port_read(field->port->machine, SUPRRIDR_P2_CONTROL_PORT_TAG);
else else
ret = input_port_read(field->port->machine, SUPRRIDR_P1_CONTROL_PORT_TAG); ret = input_port_read(field->port->machine, SUPRRIDR_P1_CONTROL_PORT_TAG);
@ -354,7 +354,7 @@ static const ay8910_interface ay8910_config =
* *
*************************************/ *************************************/
static MACHINE_CONFIG_START( suprridr, driver_device ) static MACHINE_CONFIG_START( suprridr, suprridr_state )
/* basic machine hardware */ /* basic machine hardware */
MCFG_CPU_ADD("maincpu", Z80, XTAL_49_152MHz/16) /* 3 MHz */ MCFG_CPU_ADD("maincpu", Z80, XTAL_49_152MHz/16) /* 3 MHz */

View File

@ -23,11 +23,11 @@ To do:
//port A of ay8910#0 //port A of ay8910#0
static int latch;
static TIMER_CALLBACK( soundlatch_callback ) static TIMER_CALLBACK( soundlatch_callback )
{ {
latch = param; tankbust_state *state = machine->driver_data<tankbust_state>();
state->latch = param;
} }
static WRITE8_HANDLER( tankbust_soundlatch_w ) static WRITE8_HANDLER( tankbust_soundlatch_w )
@ -37,17 +37,18 @@ static WRITE8_HANDLER( tankbust_soundlatch_w )
static READ8_DEVICE_HANDLER( tankbust_soundlatch_r ) static READ8_DEVICE_HANDLER( tankbust_soundlatch_r )
{ {
return latch; tankbust_state *state = device->machine->driver_data<tankbust_state>();
return state->latch;
} }
//port B of ay8910#0 //port B of ay8910#0
static UINT32 timer1 = 0;
static READ8_DEVICE_HANDLER( tankbust_soundtimer_r ) static READ8_DEVICE_HANDLER( tankbust_soundtimer_r )
{ {
tankbust_state *state = device->machine->driver_data<tankbust_state>();
int ret; int ret;
timer1++; state->timer1++;
ret = timer1; ret = state->timer1;
return ret; return ret;
} }
@ -60,18 +61,18 @@ static TIMER_CALLBACK( soundirqline_callback )
} }
static int e0xx_data[8] = { 0,0,0,0, 0,0,0,0 };
static WRITE8_HANDLER( tankbust_e0xx_w ) static WRITE8_HANDLER( tankbust_e0xx_w )
{ {
e0xx_data[offset] = data; tankbust_state *state = space->machine->driver_data<tankbust_state>();
state->e0xx_data[offset] = data;
#if 0 #if 0
popmessage("e0: %x %x (%x cnt) %x %x %x %x", popmessage("e0: %x %x (%x cnt) %x %x %x %x",
e0xx_data[0], e0xx_data[1], state->e0xx_data[0], state->e0xx_data[1],
e0xx_data[2], e0xx_data[3], state->e0xx_data[2], state->e0xx_data[3],
e0xx_data[4], e0xx_data[5], state->e0xx_data[4], state->e0xx_data[5],
e0xx_data[6] ); state->e0xx_data[6] );
#endif #endif
switch (offset) switch (offset)
@ -107,7 +108,8 @@ static WRITE8_HANDLER( tankbust_e0xx_w )
static READ8_HANDLER( debug_output_area_r ) static READ8_HANDLER( debug_output_area_r )
{ {
return e0xx_data[offset]; tankbust_state *state = space->machine->driver_data<tankbust_state>();
return state->e0xx_data[offset];
} }
@ -170,20 +172,20 @@ static READ8_HANDLER( read_from_unmapped_memory )
} }
#endif #endif
static UINT8 variable_data;
static READ8_HANDLER( some_changing_input ) static READ8_HANDLER( some_changing_input )
{ {
variable_data += 8; tankbust_state *state = space->machine->driver_data<tankbust_state>();
return variable_data; state->variable_data += 8;
return state->variable_data;
} }
static ADDRESS_MAP_START( main_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( main_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x5fff) AM_ROM AM_RANGE(0x0000, 0x5fff) AM_ROM
AM_RANGE(0x6000, 0x9fff) AM_ROMBANK("bank1") AM_RANGE(0x6000, 0x9fff) AM_ROMBANK("bank1")
AM_RANGE(0xa000, 0xbfff) AM_ROMBANK("bank2") AM_RANGE(0xa000, 0xbfff) AM_ROMBANK("bank2")
AM_RANGE(0xc000, 0xc7ff) AM_READWRITE(tankbust_background_videoram_r, tankbust_background_videoram_w) AM_BASE(&tankbust_videoram) AM_RANGE(0xc000, 0xc7ff) AM_READWRITE(tankbust_background_videoram_r, tankbust_background_videoram_w) AM_BASE_MEMBER(tankbust_state, videoram)
AM_RANGE(0xc800, 0xcfff) AM_READWRITE(tankbust_background_colorram_r, tankbust_background_colorram_w) AM_BASE(&tankbust_colorram) AM_RANGE(0xc800, 0xcfff) AM_READWRITE(tankbust_background_colorram_r, tankbust_background_colorram_w) AM_BASE_MEMBER(tankbust_state, colorram)
AM_RANGE(0xd000, 0xd7ff) AM_READWRITE(tankbust_txtram_r, tankbust_txtram_w) AM_BASE(&tankbust_txtram) AM_RANGE(0xd000, 0xd7ff) AM_READWRITE(tankbust_txtram_r, tankbust_txtram_w) AM_BASE_MEMBER(tankbust_state, txtram)
AM_RANGE(0xd800, 0xd8ff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) AM_RANGE(0xd800, 0xd8ff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram)
AM_RANGE(0xe000, 0xe007) AM_READWRITE(debug_output_area_r, tankbust_e0xx_w) AM_RANGE(0xe000, 0xe007) AM_READWRITE(debug_output_area_r, tankbust_e0xx_w)
AM_RANGE(0xe800, 0xe800) AM_READ_PORT("INPUTS") AM_WRITE(tankbust_yscroll_w) AM_RANGE(0xe800, 0xe800) AM_READ_PORT("INPUTS") AM_WRITE(tankbust_yscroll_w)
@ -318,11 +320,12 @@ static const ay8910_interface ay8910_config =
static MACHINE_RESET( tankbust ) static MACHINE_RESET( tankbust )
{ {
variable_data = 0x11; tankbust_state *state = machine->driver_data<tankbust_state>();
state->variable_data = 0x11;
} }
static MACHINE_CONFIG_START( tankbust, driver_device ) static MACHINE_CONFIG_START( tankbust, tankbust_state )
/* basic machine hardware */ /* basic machine hardware */
MCFG_CPU_ADD("maincpu", Z80, XTAL_14_31818MHz/2) /* Verified on PCB */ MCFG_CPU_ADD("maincpu", Z80, XTAL_14_31818MHz/2) /* Verified on PCB */

View File

@ -71,31 +71,32 @@ zooming might be wrong
#define TAOTAIDO_SHOW_ALL_INPUTS 0 #define TAOTAIDO_SHOW_ALL_INPUTS 0
static int pending_command;
static READ16_HANDLER( pending_command_r ) static READ16_HANDLER( pending_command_r )
{ {
taotaido_state *state = space->machine->driver_data<taotaido_state>();
/* Only bit 0 is tested */ /* Only bit 0 is tested */
return pending_command; return state->pending_command;
} }
static WRITE16_HANDLER( sound_command_w ) static WRITE16_HANDLER( sound_command_w )
{ {
taotaido_state *state = space->machine->driver_data<taotaido_state>();
if (ACCESSING_BITS_0_7) if (ACCESSING_BITS_0_7)
{ {
pending_command = 1; state->pending_command = 1;
soundlatch_w(space, offset, data & 0xff); soundlatch_w(space, offset, data & 0xff);
cputag_set_input_line(space->machine, "audiocpu", INPUT_LINE_NMI, PULSE_LINE); cputag_set_input_line(space->machine, "audiocpu", INPUT_LINE_NMI, PULSE_LINE);
} }
} }
static ADDRESS_MAP_START( main_map, ADDRESS_SPACE_PROGRAM, 16 ) static ADDRESS_MAP_START( main_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x000000, 0x0fffff) AM_ROM AM_RANGE(0x000000, 0x0fffff) AM_ROM
AM_RANGE(0x800000, 0x803fff) AM_RAM_WRITE(taotaido_bgvideoram_w) AM_BASE(&taotaido_bgram) // bg ram? AM_RANGE(0x800000, 0x803fff) AM_RAM_WRITE(taotaido_bgvideoram_w) AM_BASE_MEMBER(taotaido_state, bgram) // bg ram?
AM_RANGE(0xa00000, 0xa01fff) AM_RAM AM_BASE(&taotaido_spriteram) // sprite ram AM_RANGE(0xa00000, 0xa01fff) AM_RAM AM_BASE_MEMBER(taotaido_state, spriteram) // sprite ram
AM_RANGE(0xc00000, 0xc0ffff) AM_RAM AM_BASE(&taotaido_spriteram2) // sprite tile lookup ram AM_RANGE(0xc00000, 0xc0ffff) AM_RAM AM_BASE_MEMBER(taotaido_state, spriteram2) // sprite tile lookup ram
AM_RANGE(0xfe0000, 0xfeffff) AM_RAM // main ram AM_RANGE(0xfe0000, 0xfeffff) AM_RAM // main ram
AM_RANGE(0xffc000, 0xffcfff) AM_RAM_WRITE(paletteram16_xRRRRRGGGGGBBBBB_word_w) AM_BASE_GENERIC(paletteram) // palette ram AM_RANGE(0xffc000, 0xffcfff) AM_RAM_WRITE(paletteram16_xRRRRRGGGGGBBBBB_word_w) AM_BASE_GENERIC(paletteram) // palette ram
AM_RANGE(0xffe000, 0xffe3ff) AM_RAM AM_BASE(&taotaido_scrollram) // rowscroll / rowselect / scroll ram AM_RANGE(0xffe000, 0xffe3ff) AM_RAM AM_BASE_MEMBER(taotaido_state, scrollram) // rowscroll / rowselect / scroll ram
AM_RANGE(0xffff80, 0xffff81) AM_READ_PORT("P1") AM_RANGE(0xffff80, 0xffff81) AM_READ_PORT("P1")
AM_RANGE(0xffff82, 0xffff83) AM_READ_PORT("P2") AM_RANGE(0xffff82, 0xffff83) AM_READ_PORT("P2")
AM_RANGE(0xffff84, 0xffff85) AM_READ_PORT("SYSTEM") AM_RANGE(0xffff84, 0xffff85) AM_READ_PORT("SYSTEM")
@ -119,7 +120,8 @@ ADDRESS_MAP_END
static WRITE8_HANDLER( pending_command_clear_w ) static WRITE8_HANDLER( pending_command_clear_w )
{ {
pending_command = 0; taotaido_state *state = space->machine->driver_data<taotaido_state>();
state->pending_command = 0;
} }
static WRITE8_HANDLER( taotaido_sh_bankswitch_w ) static WRITE8_HANDLER( taotaido_sh_bankswitch_w )
@ -330,7 +332,7 @@ static const ym2610_interface ym2610_config =
irqhandler irqhandler
}; };
static MACHINE_CONFIG_START( taotaido, driver_device ) static MACHINE_CONFIG_START( taotaido, taotaido_state )
MCFG_CPU_ADD("maincpu", M68000, 32000000/2) MCFG_CPU_ADD("maincpu", M68000, 32000000/2)
MCFG_CPU_PROGRAM_MAP(main_map) MCFG_CPU_PROGRAM_MAP(main_map)
MCFG_CPU_VBLANK_INT("screen", irq1_line_hold) MCFG_CPU_VBLANK_INT("screen", irq1_line_hold)

View File

@ -137,7 +137,8 @@ HT-01B
static READ8_HANDLER( thepit_colorram_r ) static READ8_HANDLER( thepit_colorram_r )
{ {
return thepit_colorram[offset]; thepit_state *state = space->machine->driver_data<thepit_state>();
return state->colorram[offset];
} }
static WRITE8_HANDLER( thepit_sound_enable_w ) static WRITE8_HANDLER( thepit_sound_enable_w )
@ -149,10 +150,10 @@ static WRITE8_HANDLER( thepit_sound_enable_w )
static ADDRESS_MAP_START( thepit_main_map, ADDRESS_SPACE_PROGRAM, 8 ) static ADDRESS_MAP_START( thepit_main_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x4fff) AM_ROM AM_RANGE(0x0000, 0x4fff) AM_ROM
AM_RANGE(0x8000, 0x87ff) AM_RAM AM_RANGE(0x8000, 0x87ff) AM_RAM
AM_RANGE(0x8800, 0x8bff) AM_MIRROR(0x0400) AM_RAM_WRITE(thepit_colorram_w) AM_BASE(&thepit_colorram) AM_RANGE(0x8800, 0x8bff) AM_MIRROR(0x0400) AM_RAM_WRITE(thepit_colorram_w) AM_BASE_MEMBER(thepit_state, colorram)
AM_RANGE(0x9000, 0x93ff) AM_MIRROR(0x0400) AM_RAM_WRITE(thepit_videoram_w) AM_BASE(&thepit_videoram) AM_RANGE(0x9000, 0x93ff) AM_MIRROR(0x0400) AM_RAM_WRITE(thepit_videoram_w) AM_BASE_MEMBER(thepit_state, videoram)
AM_RANGE(0x9800, 0x983f) AM_MIRROR(0x0700) AM_RAM AM_BASE(&thepit_attributesram) AM_RANGE(0x9800, 0x983f) AM_MIRROR(0x0700) AM_RAM AM_BASE_MEMBER(thepit_state, attributesram)
AM_RANGE(0x9840, 0x985f) AM_RAM AM_BASE(&thepit_spriteram) AM_SIZE(&thepit_spriteram_size) AM_RANGE(0x9840, 0x985f) AM_RAM AM_BASE_MEMBER(thepit_state, spriteram) AM_SIZE_MEMBER(thepit_state, spriteram_size)
AM_RANGE(0x9860, 0x98ff) AM_RAM AM_RANGE(0x9860, 0x98ff) AM_RAM
AM_RANGE(0xa000, 0xa000) AM_READ(thepit_input_port_0_r) AM_WRITENOP // Not hooked up according to the schematics AM_RANGE(0xa000, 0xa000) AM_READ(thepit_input_port_0_r) AM_WRITENOP // Not hooked up according to the schematics
AM_RANGE(0xa800, 0xa800) AM_READ_PORT("IN1") AM_RANGE(0xa800, 0xa800) AM_READ_PORT("IN1")
@ -170,10 +171,10 @@ static ADDRESS_MAP_START( intrepid_main_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x7fff) AM_ROM AM_RANGE(0x0000, 0x7fff) AM_ROM
AM_RANGE(0x8000, 0x87ff) AM_RAM AM_RANGE(0x8000, 0x87ff) AM_RAM
AM_RANGE(0x8c00, 0x8fff) AM_READWRITE(thepit_colorram_r, thepit_colorram_w) /* mirror for intrepi2 */ AM_RANGE(0x8c00, 0x8fff) AM_READWRITE(thepit_colorram_r, thepit_colorram_w) /* mirror for intrepi2 */
AM_RANGE(0x9000, 0x93ff) AM_RAM_WRITE(thepit_videoram_w) AM_BASE(&thepit_videoram) AM_RANGE(0x9000, 0x93ff) AM_RAM_WRITE(thepit_videoram_w) AM_BASE_MEMBER(thepit_state, videoram)
AM_RANGE(0x9400, 0x97ff) AM_RAM_WRITE(thepit_colorram_w) AM_BASE(&thepit_colorram) AM_RANGE(0x9400, 0x97ff) AM_RAM_WRITE(thepit_colorram_w) AM_BASE_MEMBER(thepit_state, colorram)
AM_RANGE(0x9800, 0x983f) AM_MIRROR(0x0700) AM_RAM AM_BASE(&thepit_attributesram) AM_RANGE(0x9800, 0x983f) AM_MIRROR(0x0700) AM_RAM AM_BASE_MEMBER(thepit_state, attributesram)
AM_RANGE(0x9840, 0x985f) AM_RAM AM_BASE(&thepit_spriteram) AM_SIZE(&thepit_spriteram_size) AM_RANGE(0x9840, 0x985f) AM_RAM AM_BASE_MEMBER(thepit_state, spriteram) AM_SIZE_MEMBER(thepit_state, spriteram_size)
AM_RANGE(0x9860, 0x98ff) AM_RAM AM_RANGE(0x9860, 0x98ff) AM_RAM
AM_RANGE(0xa000, 0xa000) AM_READ(thepit_input_port_0_r) AM_RANGE(0xa000, 0xa000) AM_READ(thepit_input_port_0_r)
AM_RANGE(0xa800, 0xa800) AM_READ_PORT("IN1") AM_RANGE(0xa800, 0xa800) AM_READ_PORT("IN1")
@ -630,7 +631,7 @@ static const ay8910_interface ay8910_config =
}; };
static MACHINE_CONFIG_START( thepit, driver_device ) static MACHINE_CONFIG_START( thepit, thepit_state )
/* basic machine hardware */ /* basic machine hardware */
MCFG_CPU_ADD("maincpu", Z80, PIXEL_CLOCK/2) /* 3.072 MHz */ MCFG_CPU_ADD("maincpu", Z80, PIXEL_CLOCK/2) /* 3.072 MHz */
@ -1012,22 +1013,20 @@ ROM_END
Romar Triv questions read handler Romar Triv questions read handler
*/ */
static int question_address = 0;
static int question_rom = 0;
static int remap_address[16];
static READ8_HANDLER( rtriv_question_r ) static READ8_HANDLER( rtriv_question_r )
{ {
thepit_state *state = space->machine->driver_data<thepit_state>();
// Set-up the remap table for every 16 bytes // Set-up the remap table for every 16 bytes
if((offset & 0xc00) == 0x800) if((offset & 0xc00) == 0x800)
{ {
remap_address[offset & 0x0f] = ((offset & 0xf0) >> 4) ^ 0x0f; state->remap_address[offset & 0x0f] = ((offset & 0xf0) >> 4) ^ 0x0f;
} }
// Select which rom to read and the high 5 bits of address // Select which rom to read and the high 5 bits of address
else if((offset & 0xc00) == 0x400) else if((offset & 0xc00) == 0x400)
{ {
question_rom = (offset & 0x70) >> 4; state->question_rom = (offset & 0x70) >> 4;
question_address = ((offset & 0x80) << 3) | ((offset & 0x0f) << 11); state->question_address = ((offset & 0x80) << 3) | ((offset & 0x0f) << 11);
} }
// Read the actual byte from question roms // Read the actual byte from question roms
else if((offset & 0xc00) == 0xc00) else if((offset & 0xc00) == 0xc00)
@ -1035,7 +1034,7 @@ static READ8_HANDLER( rtriv_question_r )
UINT8 *ROM = space->machine->region("user1")->base(); UINT8 *ROM = space->machine->region("user1")->base();
int real_address; int real_address;
real_address = (0x8000 * question_rom) | question_address | (offset & 0x3f0) | remap_address[offset & 0x0f]; real_address = (0x8000 * state->question_rom) | state->question_address | (offset & 0x3f0) | state->remap_address[offset & 0x0f];
return ROM[real_address]; return ROM[real_address];
} }

View File

@ -17,7 +17,6 @@ Notes:
/***************************************************************************/ /***************************************************************************/
static int nmi_enabled = 0;
static MACHINE_START( timelimt ) static MACHINE_START( timelimt )
{ {
@ -26,12 +25,14 @@ static MACHINE_START( timelimt )
static MACHINE_RESET( timelimt ) static MACHINE_RESET( timelimt )
{ {
nmi_enabled = 0; timelimt_state *state = machine->driver_data<timelimt_state>();
state->nmi_enabled = 0;
} }
static WRITE8_HANDLER( nmi_enable_w ) static WRITE8_HANDLER( nmi_enable_w )
{ {
nmi_enabled = data & 1; /* bit 0 = nmi enable */ timelimt_state *state = space->machine->driver_data<timelimt_state>();
state->nmi_enabled = data & 1; /* bit 0 = nmi enable */
} }
static WRITE8_HANDLER( sound_reset_w ) static WRITE8_HANDLER( sound_reset_w )
@ -46,7 +47,7 @@ static ADDRESS_MAP_START( main_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x7fff) AM_ROM /* rom */ AM_RANGE(0x0000, 0x7fff) AM_ROM /* rom */
AM_RANGE(0x8000, 0x87ff) AM_RAM /* ram */ AM_RANGE(0x8000, 0x87ff) AM_RAM /* ram */
AM_RANGE(0x8800, 0x8bff) AM_RAM_WRITE(timelimt_videoram_w) AM_BASE_MEMBER(timelimt_state, videoram) /* video ram */ AM_RANGE(0x8800, 0x8bff) AM_RAM_WRITE(timelimt_videoram_w) AM_BASE_MEMBER(timelimt_state, videoram) /* video ram */
AM_RANGE(0x9000, 0x97ff) AM_RAM_WRITE(timelimt_bg_videoram_w) AM_BASE(&timelimt_bg_videoram) AM_SIZE(&timelimt_bg_videoram_size)/* background ram */ AM_RANGE(0x9000, 0x97ff) AM_RAM_WRITE(timelimt_bg_videoram_w) AM_BASE_MEMBER(timelimt_state, bg_videoram) AM_SIZE_MEMBER(timelimt_state, bg_videoram_size)/* background ram */
AM_RANGE(0x9800, 0x98ff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) /* sprite ram */ AM_RANGE(0x9800, 0x98ff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) /* sprite ram */
AM_RANGE(0xa000, 0xa000) AM_READ_PORT("INPUTS") AM_RANGE(0xa000, 0xa000) AM_READ_PORT("INPUTS")
AM_RANGE(0xa800, 0xa800) AM_READ_PORT("SYSTEM") AM_RANGE(0xa800, 0xa800) AM_READ_PORT("SYSTEM")
@ -221,8 +222,10 @@ static const ay8910_interface ay8910_config =
DEVCB_NULL DEVCB_NULL
}; };
static INTERRUPT_GEN( timelimt_irq ) { static INTERRUPT_GEN( timelimt_irq )
if ( nmi_enabled ) {
timelimt_state *state = device->machine->driver_data<timelimt_state>();
if ( state->nmi_enabled )
cpu_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); cpu_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE);
} }

View File

@ -288,7 +288,7 @@ static TIMER_CALLBACK( tubep_scanline_callback )
if (scanline == 16) if (scanline == 16)
{ {
logerror("/nmi CPU#3\n"); logerror("/nmi CPU#3\n");
tubep_vblank_end(machine); /* switch buffered sprite RAM state->page */ tubep_vblank_end(machine); /* switch buffered sprite RAM page */
cputag_set_input_line(machine, "mcu", INPUT_LINE_NMI, ASSERT_LINE); cputag_set_input_line(machine, "mcu", INPUT_LINE_NMI, ASSERT_LINE);
} }
/* CPU #3 MS2010-A NMI */ /* CPU #3 MS2010-A NMI */
@ -474,7 +474,7 @@ static TIMER_CALLBACK( rjammer_scanline_callback )
if (scanline == 16) if (scanline == 16)
{ {
logerror("/nmi CPU#3\n"); logerror("/nmi CPU#3\n");
tubep_vblank_end(machine); /* switch buffered sprite RAM state->page */ tubep_vblank_end(machine); /* switch buffered sprite RAM page */
cputag_set_input_line(machine, "mcu", INPUT_LINE_NMI, ASSERT_LINE); cputag_set_input_line(machine, "mcu", INPUT_LINE_NMI, ASSERT_LINE);
} }
/* CPU #3 MS2010-A NMI */ /* CPU #3 MS2010-A NMI */

View File

@ -65,20 +65,13 @@ static ADDRESS_MAP_START( burglarx_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x80001a, 0x80001b) AM_READ_PORT("DSW1") AM_RANGE(0x80001a, 0x80001b) AM_READ_PORT("DSW1")
AM_RANGE(0x80001c, 0x80001d) AM_READ_PORT("DSW2") AM_RANGE(0x80001c, 0x80001d) AM_READ_PORT("DSW2")
AM_RANGE(0x800030, 0x800031) AM_WRITENOP // ? 0 AM_RANGE(0x800030, 0x800031) AM_WRITENOP // ? 0
AM_RANGE(0x80010c, 0x80010d) AM_WRITEONLY AM_BASE(&unico_scrollx_0) // Scroll AM_RANGE(0x80010c, 0x800121) AM_WRITEONLY AM_BASE_MEMBER(unico_state, scroll) // Scroll
AM_RANGE(0x80010e, 0x80010f) AM_WRITEONLY AM_BASE(&unico_scrolly_0) //
AM_RANGE(0x800110, 0x800111) AM_WRITEONLY AM_BASE(&unico_scrolly_2) //
AM_RANGE(0x800114, 0x800115) AM_WRITEONLY AM_BASE(&unico_scrollx_2) //
AM_RANGE(0x800116, 0x800117) AM_WRITEONLY AM_BASE(&unico_scrollx_1) //
AM_RANGE(0x800120, 0x800121) AM_WRITEONLY AM_BASE(&unico_scrolly_1) //
AM_RANGE(0x800188, 0x800189) AM_DEVREADWRITE8_MODERN("oki", okim6295_device, read, write, 0x00ff) // Sound AM_RANGE(0x800188, 0x800189) AM_DEVREADWRITE8_MODERN("oki", okim6295_device, read, write, 0x00ff) // Sound
AM_RANGE(0x80018a, 0x80018b) AM_DEVWRITE8("ymsnd", ym3812_write_port_w, 0xff00 ) // AM_RANGE(0x80018a, 0x80018b) AM_DEVWRITE8("ymsnd", ym3812_write_port_w, 0xff00 ) //
AM_RANGE(0x80018c, 0x80018d) AM_DEVREADWRITE8("ymsnd", ym3812_status_port_r, ym3812_control_port_w, 0xff00 ) // AM_RANGE(0x80018c, 0x80018d) AM_DEVREADWRITE8("ymsnd", ym3812_status_port_r, ym3812_control_port_w, 0xff00 ) //
AM_RANGE(0x80018e, 0x80018f) AM_DEVWRITE("oki", burglarx_sound_bank_w) // AM_RANGE(0x80018e, 0x80018f) AM_DEVWRITE("oki", burglarx_sound_bank_w) //
AM_RANGE(0x8001e0, 0x8001e1) AM_WRITENOP // IRQ Ack AM_RANGE(0x8001e0, 0x8001e1) AM_WRITENOP // IRQ Ack
AM_RANGE(0x904000, 0x907fff) AM_RAM_WRITE(unico_vram_1_w) AM_BASE(&unico_vram_1 ) // Layers AM_RANGE(0x904000, 0x90ffff) AM_RAM_WRITE(unico_vram_w) AM_BASE_MEMBER(unico_state, vram) // Layers 1, 2, 0
AM_RANGE(0x908000, 0x90bfff) AM_RAM_WRITE(unico_vram_2_w) AM_BASE(&unico_vram_2 ) //
AM_RANGE(0x90c000, 0x90ffff) AM_RAM_WRITE(unico_vram_0_w) AM_BASE(&unico_vram_0 ) //
AM_RANGE(0x920000, 0x923fff) AM_RAM // ? 0 AM_RANGE(0x920000, 0x923fff) AM_RAM // ? 0
AM_RANGE(0x930000, 0x9307ff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) // Sprites AM_RANGE(0x930000, 0x9307ff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) // Sprites
AM_RANGE(0x940000, 0x947fff) AM_RAM_WRITE(unico_palette_w) AM_BASE_GENERIC(paletteram) // Palette AM_RANGE(0x940000, 0x947fff) AM_RAM_WRITE(unico_palette_w) AM_BASE_GENERIC(paletteram) // Palette
@ -156,12 +149,7 @@ static ADDRESS_MAP_START( zeropnt_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x800018, 0x800019) AM_READ_PORT("INPUTS") AM_RANGE(0x800018, 0x800019) AM_READ_PORT("INPUTS")
AM_RANGE(0x80001a, 0x80001b) AM_READ_PORT("DSW1") AM_RANGE(0x80001a, 0x80001b) AM_READ_PORT("DSW1")
AM_RANGE(0x80001c, 0x80001d) AM_READ_PORT("DSW2") AM_RANGE(0x80001c, 0x80001d) AM_READ_PORT("DSW2")
AM_RANGE(0x80010c, 0x80010d) AM_WRITEONLY AM_BASE(&unico_scrollx_0 ) // Scroll AM_RANGE(0x80010c, 0x800121) AM_WRITEONLY AM_BASE_MEMBER(unico_state, scroll) // Scroll
AM_RANGE(0x80010e, 0x80010f) AM_WRITEONLY AM_BASE(&unico_scrolly_0 ) //
AM_RANGE(0x800110, 0x800111) AM_WRITEONLY AM_BASE(&unico_scrolly_2 ) //
AM_RANGE(0x800114, 0x800115) AM_WRITEONLY AM_BASE(&unico_scrollx_2 ) //
AM_RANGE(0x800116, 0x800117) AM_WRITEONLY AM_BASE(&unico_scrollx_1 ) //
AM_RANGE(0x800120, 0x800121) AM_WRITEONLY AM_BASE(&unico_scrolly_1 ) //
AM_RANGE(0x800170, 0x800171) AM_READ(unico_guny_0_msb_r ) // Light Guns AM_RANGE(0x800170, 0x800171) AM_READ(unico_guny_0_msb_r ) // Light Guns
AM_RANGE(0x800174, 0x800175) AM_READ(unico_gunx_0_msb_r ) // AM_RANGE(0x800174, 0x800175) AM_READ(unico_gunx_0_msb_r ) //
AM_RANGE(0x800178, 0x800179) AM_READ(unico_guny_1_msb_r ) // AM_RANGE(0x800178, 0x800179) AM_READ(unico_guny_1_msb_r ) //
@ -171,9 +159,7 @@ static ADDRESS_MAP_START( zeropnt_map, ADDRESS_SPACE_PROGRAM, 16 )
AM_RANGE(0x80018c, 0x80018d) AM_DEVREADWRITE8("ymsnd", ym3812_status_port_r, ym3812_control_port_w, 0xff00 ) // AM_RANGE(0x80018c, 0x80018d) AM_DEVREADWRITE8("ymsnd", ym3812_status_port_r, ym3812_control_port_w, 0xff00 ) //
AM_RANGE(0x80018e, 0x80018f) AM_WRITE(zeropnt_sound_bank_w ) // AM_RANGE(0x80018e, 0x80018f) AM_WRITE(zeropnt_sound_bank_w ) //
AM_RANGE(0x8001e0, 0x8001e1) AM_WRITEONLY // ? IRQ Ack AM_RANGE(0x8001e0, 0x8001e1) AM_WRITEONLY // ? IRQ Ack
AM_RANGE(0x904000, 0x907fff) AM_RAM_WRITE(unico_vram_1_w) AM_BASE(&unico_vram_1 ) // Layers AM_RANGE(0x904000, 0x90ffff) AM_RAM_WRITE(unico_vram_w) AM_BASE_MEMBER(unico_state, vram) // Layers 1, 2, 0
AM_RANGE(0x908000, 0x90bfff) AM_RAM_WRITE(unico_vram_2_w) AM_BASE(&unico_vram_2 ) //
AM_RANGE(0x90c000, 0x90ffff) AM_RAM_WRITE(unico_vram_0_w) AM_BASE(&unico_vram_0 ) //
AM_RANGE(0x920000, 0x923fff) AM_RAM // ? 0 AM_RANGE(0x920000, 0x923fff) AM_RAM // ? 0
AM_RANGE(0x930000, 0x9307ff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) // Sprites AM_RANGE(0x930000, 0x9307ff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) // Sprites
AM_RANGE(0x940000, 0x947fff) AM_RAM_WRITE(unico_palette_w) AM_BASE_GENERIC(paletteram) // Palette AM_RANGE(0x940000, 0x947fff) AM_RAM_WRITE(unico_palette_w) AM_BASE_GENERIC(paletteram) // Palette
@ -236,7 +222,7 @@ static ADDRESS_MAP_START( zeropnt2_map, ADDRESS_SPACE_PROGRAM, 32 )
AM_RANGE(0x800030, 0x800033) AM_DEVREADWRITE8_MODERN("oki2", okim6295_device, read, write, 0x00ff0000 ) // AM_RANGE(0x800030, 0x800033) AM_DEVREADWRITE8_MODERN("oki2", okim6295_device, read, write, 0x00ff0000 ) //
AM_RANGE(0x800034, 0x800037) AM_WRITE(zeropnt2_sound_bank_w ) // AM_RANGE(0x800034, 0x800037) AM_WRITE(zeropnt2_sound_bank_w ) //
AM_RANGE(0x800038, 0x80003b) AM_WRITE(zeropnt2_leds_w ) // ? AM_RANGE(0x800038, 0x80003b) AM_WRITE(zeropnt2_leds_w ) // ?
AM_RANGE(0x80010c, 0x800123) AM_WRITEONLY AM_BASE(&unico_scroll32 ) // Scroll AM_RANGE(0x80010c, 0x800123) AM_WRITEONLY AM_BASE_MEMBER(unico_state, scroll32 ) // Scroll
AM_RANGE(0x800140, 0x800143) AM_READ(zeropnt2_guny_0_msb_r ) // Light Guns AM_RANGE(0x800140, 0x800143) AM_READ(zeropnt2_guny_0_msb_r ) // Light Guns
AM_RANGE(0x800144, 0x800147) AM_READ(zeropnt2_gunx_0_msb_r ) // AM_RANGE(0x800144, 0x800147) AM_READ(zeropnt2_gunx_0_msb_r ) //
AM_RANGE(0x800148, 0x80014b) AM_READ(zeropnt2_guny_1_msb_r ) // AM_RANGE(0x800148, 0x80014b) AM_READ(zeropnt2_guny_1_msb_r ) //
@ -246,9 +232,7 @@ static ADDRESS_MAP_START( zeropnt2_map, ADDRESS_SPACE_PROGRAM, 32 )
AM_RANGE(0x80015c, 0x80015f) AM_READ_PORT("BUTTONS") AM_RANGE(0x80015c, 0x80015f) AM_READ_PORT("BUTTONS")
AM_RANGE(0x8001e0, 0x8001e3) AM_WRITENOP // ? IRQ Ack AM_RANGE(0x8001e0, 0x8001e3) AM_WRITENOP // ? IRQ Ack
AM_RANGE(0x8001f0, 0x8001f3) AM_DEVWRITE("eeprom", zeropnt2_eeprom_w) // EEPROM AM_RANGE(0x8001f0, 0x8001f3) AM_DEVWRITE("eeprom", zeropnt2_eeprom_w) // EEPROM
AM_RANGE(0x904000, 0x907fff) AM_RAM_WRITE(unico_vram32_1_w) AM_BASE(&unico_vram32_1 ) // Layers AM_RANGE(0x904000, 0x90ffff) AM_RAM_WRITE(unico_vram32_w) AM_BASE_MEMBER(unico_state, vram32) // Layers 1, 2, 0
AM_RANGE(0x908000, 0x90bfff) AM_RAM_WRITE(unico_vram32_2_w) AM_BASE(&unico_vram32_2 ) //
AM_RANGE(0x90c000, 0x90ffff) AM_RAM_WRITE(unico_vram32_0_w) AM_BASE(&unico_vram32_0 ) //
AM_RANGE(0x920000, 0x923fff) AM_RAM // ? 0 AM_RANGE(0x920000, 0x923fff) AM_RAM // ? 0
AM_RANGE(0x930000, 0x9307ff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) // Sprites AM_RANGE(0x930000, 0x9307ff) AM_RAM AM_BASE_SIZE_GENERIC(spriteram) // Sprites
AM_RANGE(0x940000, 0x947fff) AM_RAM_WRITE(unico_palette32_w) AM_BASE_GENERIC(paletteram ) // Palette AM_RANGE(0x940000, 0x947fff) AM_RAM_WRITE(unico_palette32_w) AM_BASE_GENERIC(paletteram ) // Palette
@ -601,7 +585,7 @@ static const eeprom_interface zeropnt2_eeprom_interface =
Burglar X Burglar X
***************************************************************************/ ***************************************************************************/
static MACHINE_CONFIG_START( burglarx, driver_device ) static MACHINE_CONFIG_START( burglarx, unico_state )
/* basic machine hardware */ /* basic machine hardware */
MCFG_CPU_ADD("maincpu", M68000, 16000000) MCFG_CPU_ADD("maincpu", M68000, 16000000)
@ -647,7 +631,7 @@ static MACHINE_RESET( zeropt )
MACHINE_RESET_CALL(unico); MACHINE_RESET_CALL(unico);
} }
static MACHINE_CONFIG_START( zeropnt, driver_device ) static MACHINE_CONFIG_START( zeropnt, unico_state )
/* basic machine hardware */ /* basic machine hardware */
MCFG_CPU_ADD("maincpu", M68000, 16000000) MCFG_CPU_ADD("maincpu", M68000, 16000000)
@ -688,7 +672,7 @@ MACHINE_CONFIG_END
Zero Point 2 Zero Point 2
***************************************************************************/ ***************************************************************************/
static MACHINE_CONFIG_START( zeropnt2, driver_device ) static MACHINE_CONFIG_START( zeropnt2, unico_state )
/* basic machine hardware */ /* basic machine hardware */
MCFG_CPU_ADD("maincpu", M68EC020, 16000000) MCFG_CPU_ADD("maincpu", M68EC020, 16000000)
@ -1016,7 +1000,7 @@ DIPSW-B
| V.Hard | |on |on | | V.Hard | |on |on |
------------------------------------------------------------------ ------------------------------------------------------------------
* Denotes Factory Defualts * Denotes Factory Defaults
BrianT BrianT

View File

@ -132,11 +132,20 @@ out:
#include "sound/3812intf.h" #include "sound/3812intf.h"
class wardner_state : public driver_device
{
public:
wardner_state(running_machine &machine, const driver_device_config_base &config)
: driver_device(machine, config) { }
UINT8 *rambase_ae00;
UINT8 *rambase_c000;
};
static UINT8 *rambase_ae00, *rambase_c000;
static WRITE8_HANDLER( wardner_ramrom_bank_sw ) static WRITE8_HANDLER( wardner_ramrom_bank_sw )
{ {
wardner_state *state = space->machine->driver_data<wardner_state>();
if (wardner_membank != data) { if (wardner_membank != data) {
int bankaddress = 0; int bankaddress = 0;
@ -169,8 +178,8 @@ static WRITE8_HANDLER( wardner_ramrom_bank_sw )
memory_install_read_bank(mainspace, 0xae00, 0xafff, 0, 0, "bank2"); memory_install_read_bank(mainspace, 0xae00, 0xafff, 0, 0, "bank2");
memory_install_read_bank(mainspace, 0xc000, 0xc7ff, 0, 0, "bank3"); memory_install_read_bank(mainspace, 0xc000, 0xc7ff, 0, 0, "bank3");
memory_set_bankptr(space->machine, "bank1", &RAM[0x0000]); memory_set_bankptr(space->machine, "bank1", &RAM[0x0000]);
memory_set_bankptr(space->machine, "bank2", rambase_ae00); memory_set_bankptr(space->machine, "bank2", state->rambase_ae00);
memory_set_bankptr(space->machine, "bank3", rambase_c000); memory_set_bankptr(space->machine, "bank3", state->rambase_c000);
memory_set_bankptr(space->machine, "bank4", space->machine->generic.paletteram.v); memory_set_bankptr(space->machine, "bank4", space->machine->generic.paletteram.v);
} }
} }
@ -196,9 +205,9 @@ static ADDRESS_MAP_START( main_program_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x8000, 0x8fff) AM_WRITE(wardner_sprite_w) AM_BASE_SIZE_GENERIC(spriteram) AM_RANGE(0x8000, 0x8fff) AM_WRITE(wardner_sprite_w) AM_BASE_SIZE_GENERIC(spriteram)
AM_RANGE(0x9000, 0x9fff) AM_ROM AM_RANGE(0x9000, 0x9fff) AM_ROM
AM_RANGE(0xa000, 0xadff) AM_WRITE(paletteram_xBBBBBGGGGGRRRRR_le_w) AM_BASE_GENERIC(paletteram) AM_RANGE(0xa000, 0xadff) AM_WRITE(paletteram_xBBBBBGGGGGRRRRR_le_w) AM_BASE_GENERIC(paletteram)
AM_RANGE(0xae00, 0xafff) AM_RAM AM_BASE(&rambase_ae00) AM_RANGE(0xae00, 0xafff) AM_RAM AM_BASE_MEMBER(wardner_state, rambase_ae00)
AM_RANGE(0xb000, 0xbfff) AM_ROM AM_RANGE(0xb000, 0xbfff) AM_ROM
AM_RANGE(0xc000, 0xc7ff) AM_RAM AM_BASE(&rambase_c000) AM_SHARE("share1") /* Shared RAM with Sound Z80 */ AM_RANGE(0xc000, 0xc7ff) AM_RAM AM_BASE_MEMBER(wardner_state, rambase_c000) AM_SHARE("share1") /* Shared RAM with Sound Z80 */
AM_RANGE(0xc800, 0xffff) AM_ROM AM_RANGE(0xc800, 0xffff) AM_ROM
ADDRESS_MAP_END ADDRESS_MAP_END
@ -392,7 +401,7 @@ GFXDECODE_END
static MACHINE_CONFIG_START( wardner, driver_device ) static MACHINE_CONFIG_START( wardner, wardner_state )
/* basic machine hardware */ /* basic machine hardware */
MCFG_CPU_ADD("maincpu", Z80, XTAL_24MHz/4) /* 6MHz */ MCFG_CPU_ADD("maincpu", Z80, XTAL_24MHz/4) /* 6MHz */

View File

@ -195,30 +195,36 @@ TODO :
#include "sound/2203intf.h" #include "sound/2203intf.h"
#include "machine/nvram.h" #include "machine/nvram.h"
class witch_state : public driver_device
{
public:
witch_state(running_machine &machine, const driver_device_config_base &config)
: driver_device(machine, config) { }
tilemap_t *gfx0a_tilemap;
tilemap_t *gfx0b_tilemap;
tilemap_t *gfx1_tilemap;
UINT8 *gfx0_cram;
UINT8 *gfx0_vram;
UINT8 *gfx1_cram;
UINT8 *gfx1_vram;
UINT8 *sprite_ram;
int scrollx;
int scrolly;
UINT8 reg_a002;
int bank;
};
#define UNBANKED_SIZE 0x800 #define UNBANKED_SIZE 0x800
static tilemap_t *gfx0a_tilemap;
static tilemap_t *gfx0b_tilemap;
static tilemap_t *gfx1_tilemap;
static UINT8 *gfx0_cram;
static UINT8 *gfx0_vram;
static UINT8 *gfx1_cram;
static UINT8 *gfx1_vram;
static UINT8 *sprite_ram;
static int scrollx=0;
static int scrolly=0;
static UINT8 reg_a002=0;
static int bank;
static TILE_GET_INFO( get_gfx0b_tile_info ) static TILE_GET_INFO( get_gfx0b_tile_info )
{ {
int code = gfx0_vram[tile_index]; witch_state *state = machine->driver_data<witch_state>();
int color = gfx0_cram[tile_index]; int code = state->gfx0_vram[tile_index];
int color = state->gfx0_cram[tile_index];
code=code | ((color & 0xe0) << 3); code=code | ((color & 0xe0) << 3);
@ -236,8 +242,9 @@ static TILE_GET_INFO( get_gfx0b_tile_info )
static TILE_GET_INFO( get_gfx0a_tile_info ) static TILE_GET_INFO( get_gfx0a_tile_info )
{ {
int code = gfx0_vram[tile_index]; witch_state *state = machine->driver_data<witch_state>();
int color = gfx0_cram[tile_index]; int code = state->gfx0_vram[tile_index];
int color = state->gfx0_cram[tile_index];
code=code | ((color & 0xe0) << 3); code=code | ((color & 0xe0) << 3);
@ -255,8 +262,9 @@ static TILE_GET_INFO( get_gfx0a_tile_info )
static TILE_GET_INFO( get_gfx1_tile_info ) static TILE_GET_INFO( get_gfx1_tile_info )
{ {
int code = gfx1_vram[tile_index]; witch_state *state = machine->driver_data<witch_state>();
int color = gfx1_cram[tile_index]; int code = state->gfx1_vram[tile_index];
int color = state->gfx1_cram[tile_index];
SET_TILE_INFO( SET_TILE_INFO(
0, 0,
@ -267,59 +275,69 @@ static TILE_GET_INFO( get_gfx1_tile_info )
static WRITE8_HANDLER( gfx0_vram_w ) static WRITE8_HANDLER( gfx0_vram_w )
{ {
gfx0_vram[offset] = data; witch_state *state = space->machine->driver_data<witch_state>();
tilemap_mark_tile_dirty(gfx0a_tilemap,offset); state->gfx0_vram[offset] = data;
tilemap_mark_tile_dirty(gfx0b_tilemap,offset); tilemap_mark_tile_dirty(state->gfx0a_tilemap,offset);
tilemap_mark_tile_dirty(state->gfx0b_tilemap,offset);
} }
static WRITE8_HANDLER( gfx0_cram_w ) static WRITE8_HANDLER( gfx0_cram_w )
{ {
gfx0_cram[offset] = data; witch_state *state = space->machine->driver_data<witch_state>();
tilemap_mark_tile_dirty(gfx0a_tilemap,offset); state->gfx0_cram[offset] = data;
tilemap_mark_tile_dirty(gfx0b_tilemap,offset); tilemap_mark_tile_dirty(state->gfx0a_tilemap,offset);
tilemap_mark_tile_dirty(state->gfx0b_tilemap,offset);
} }
static READ8_HANDLER( gfx0_vram_r ) static READ8_HANDLER( gfx0_vram_r )
{ {
return gfx0_vram[offset]; witch_state *state = space->machine->driver_data<witch_state>();
return state->gfx0_vram[offset];
} }
static READ8_HANDLER( gfx0_cram_r ) static READ8_HANDLER( gfx0_cram_r )
{ {
return gfx0_cram[offset]; witch_state *state = space->machine->driver_data<witch_state>();
return state->gfx0_cram[offset];
} }
#define FIX_OFFSET() do { offset=(((offset + ((scrolly & 0xf8) << 2) ) & 0x3e0)+((offset + (scrollx >> 3) ) & 0x1f)+32)&0x3ff; } while(0) #define FIX_OFFSET() do { \
offset=(((offset + ((state->scrolly & 0xf8) << 2) ) & 0x3e0)+((offset + (state->scrollx >> 3) ) & 0x1f)+32)&0x3ff; } while(0)
static WRITE8_HANDLER( gfx1_vram_w ) static WRITE8_HANDLER( gfx1_vram_w )
{ {
witch_state *state = space->machine->driver_data<witch_state>();
FIX_OFFSET(); FIX_OFFSET();
gfx1_vram[offset] = data; state->gfx1_vram[offset] = data;
tilemap_mark_tile_dirty(gfx1_tilemap,offset); tilemap_mark_tile_dirty(state->gfx1_tilemap,offset);
} }
static WRITE8_HANDLER( gfx1_cram_w ) static WRITE8_HANDLER( gfx1_cram_w )
{ {
witch_state *state = space->machine->driver_data<witch_state>();
FIX_OFFSET(); FIX_OFFSET();
gfx1_cram[offset] = data; state->gfx1_cram[offset] = data;
tilemap_mark_tile_dirty(gfx1_tilemap,offset); tilemap_mark_tile_dirty(state->gfx1_tilemap,offset);
} }
static READ8_HANDLER( gfx1_vram_r ) static READ8_HANDLER( gfx1_vram_r )
{ {
witch_state *state = space->machine->driver_data<witch_state>();
FIX_OFFSET(); FIX_OFFSET();
return gfx1_vram[offset]; return state->gfx1_vram[offset];
} }
static READ8_HANDLER( gfx1_cram_r ) static READ8_HANDLER( gfx1_cram_r )
{ {
witch_state *state = space->machine->driver_data<witch_state>();
FIX_OFFSET(); FIX_OFFSET();
return gfx1_cram[offset]; return state->gfx1_cram[offset];
} }
static READ8_HANDLER(read_a00x) static READ8_HANDLER(read_a00x)
{ {
witch_state *state = space->machine->driver_data<witch_state>();
switch(offset) switch(offset)
{ {
case 0x02: return reg_a002; case 0x02: return state->reg_a002;
case 0x04: return input_port_read(space->machine, "A004"); case 0x04: return input_port_read(space->machine, "A004");
case 0x05: return input_port_read(space->machine, "A005"); case 0x05: return input_port_read(space->machine, "A005");
case 0x0c: return input_port_read(space->machine, "SERVICE"); // stats / reset case 0x0c: return input_port_read(space->machine, "SERVICE"); // stats / reset
@ -328,7 +346,7 @@ static READ8_HANDLER(read_a00x)
if(offset == 0x00) //muxed with A002? if(offset == 0x00) //muxed with A002?
{ {
switch(reg_a002 & 0x3f) switch(state->reg_a002 & 0x3f)
{ {
case 0x3b: case 0x3b:
return input_port_read(space->machine, "UNK"); //bet10 / pay out return input_port_read(space->machine, "UNK"); //bet10 / pay out
@ -337,7 +355,7 @@ static READ8_HANDLER(read_a00x)
case 0x3d: case 0x3d:
return input_port_read(space->machine, "A005"); return input_port_read(space->machine, "A005");
default: default:
logerror("A000 read with mux=0x%02x\n", reg_a002 & 0x3f); logerror("A000 read with mux=0x%02x\n", state->reg_a002 & 0x3f);
} }
} }
return 0xff; return 0xff;
@ -345,18 +363,19 @@ static READ8_HANDLER(read_a00x)
static WRITE8_HANDLER(write_a00x) static WRITE8_HANDLER(write_a00x)
{ {
witch_state *state = space->machine->driver_data<witch_state>();
switch(offset) switch(offset)
{ {
case 0x02: //A002 bit 7&6 = bank ???? case 0x02: //A002 bit 7&6 = state->bank ????
{ {
int newbank; int newbank;
reg_a002 = data; state->reg_a002 = data;
newbank = (data>>6)&3; newbank = (data>>6)&3;
if(newbank != bank) if(newbank != state->bank)
{ {
UINT8 *ROM = space->machine->region("maincpu")->base(); UINT8 *ROM = space->machine->region("maincpu")->base();
bank = newbank; state->bank = newbank;
ROM = &ROM[0x10000+0x8000 * newbank + UNBANKED_SIZE]; ROM = &ROM[0x10000+0x8000 * newbank + UNBANKED_SIZE];
memory_set_bankptr(space->machine, "bank1",ROM); memory_set_bankptr(space->machine, "bank1",ROM);
} }
@ -405,11 +424,13 @@ static READ8_DEVICE_HANDLER(read_8010) { return 0x00; }
static WRITE8_DEVICE_HANDLER(xscroll_w) static WRITE8_DEVICE_HANDLER(xscroll_w)
{ {
scrollx=data; witch_state *state = device->machine->driver_data<witch_state>();
state->scrollx=data;
} }
static WRITE8_DEVICE_HANDLER(yscroll_w) static WRITE8_DEVICE_HANDLER(yscroll_w)
{ {
scrolly=data; witch_state *state = device->machine->driver_data<witch_state>();
state->scrolly=data;
} }
static const ym2203_interface ym2203_interface_0 = static const ym2203_interface ym2203_interface_0 =
@ -444,11 +465,11 @@ static ADDRESS_MAP_START( map_main, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x8000, 0x8001) AM_DEVREADWRITE("ym1", ym2203_r, ym2203_w) AM_RANGE(0x8000, 0x8001) AM_DEVREADWRITE("ym1", ym2203_r, ym2203_w)
AM_RANGE(0x8008, 0x8009) AM_DEVREADWRITE("ym2", ym2203_r, ym2203_w) AM_RANGE(0x8008, 0x8009) AM_DEVREADWRITE("ym2", ym2203_r, ym2203_w)
AM_RANGE(0xa000, 0xa00f) AM_READWRITE(read_a00x, write_a00x) AM_RANGE(0xa000, 0xa00f) AM_READWRITE(read_a00x, write_a00x)
AM_RANGE(0xc000, 0xc3ff) AM_READWRITE(gfx0_vram_r, gfx0_vram_w) AM_BASE(&gfx0_vram) AM_RANGE(0xc000, 0xc3ff) AM_READWRITE(gfx0_vram_r, gfx0_vram_w) AM_BASE_MEMBER(witch_state, gfx0_vram)
AM_RANGE(0xc400, 0xc7ff) AM_READWRITE(gfx0_cram_r, gfx0_cram_w) AM_BASE(&gfx0_cram) AM_RANGE(0xc400, 0xc7ff) AM_READWRITE(gfx0_cram_r, gfx0_cram_w) AM_BASE_MEMBER(witch_state, gfx0_cram)
AM_RANGE(0xc800, 0xcbff) AM_READWRITE(gfx1_vram_r, gfx1_vram_w) AM_BASE(&gfx1_vram) AM_RANGE(0xc800, 0xcbff) AM_READWRITE(gfx1_vram_r, gfx1_vram_w) AM_BASE_MEMBER(witch_state, gfx1_vram)
AM_RANGE(0xcc00, 0xcfff) AM_READWRITE(gfx1_cram_r, gfx1_cram_w) AM_BASE(&gfx1_cram) AM_RANGE(0xcc00, 0xcfff) AM_READWRITE(gfx1_cram_r, gfx1_cram_w) AM_BASE_MEMBER(witch_state, gfx1_cram)
AM_RANGE(0xd000, 0xdfff) AM_RAM AM_BASE(&sprite_ram) AM_RANGE(0xd000, 0xdfff) AM_RAM AM_BASE_MEMBER(witch_state, sprite_ram)
AM_RANGE(0xe000, 0xe7ff) AM_RAM_WRITE(paletteram_xBBBBBGGGGGRRRRR_split1_w) AM_BASE_GENERIC(paletteram) AM_RANGE(0xe000, 0xe7ff) AM_RAM_WRITE(paletteram_xBBBBBGGGGGRRRRR_split1_w) AM_BASE_GENERIC(paletteram)
AM_RANGE(0xe800, 0xefff) AM_RAM_WRITE(paletteram_xBBBBBGGGGGRRRRR_split2_w) AM_BASE_GENERIC(paletteram2) AM_RANGE(0xe800, 0xefff) AM_RAM_WRITE(paletteram_xBBBBBGGGGGRRRRR_split2_w) AM_BASE_GENERIC(paletteram2)
AM_RANGE(0xf000, 0xf0ff) AM_RAM AM_SHARE("share1") AM_RANGE(0xf000, 0xf0ff) AM_RAM AM_SHARE("share1")
@ -675,19 +696,21 @@ GFXDECODE_END
static VIDEO_START(witch) static VIDEO_START(witch)
{ {
gfx0a_tilemap = tilemap_create(machine, get_gfx0a_tile_info,tilemap_scan_rows,8,8,32,32); witch_state *state = machine->driver_data<witch_state>();
gfx0b_tilemap = tilemap_create(machine, get_gfx0b_tile_info,tilemap_scan_rows,8,8,32,32); state->gfx0a_tilemap = tilemap_create(machine, get_gfx0a_tile_info,tilemap_scan_rows,8,8,32,32);
gfx1_tilemap = tilemap_create(machine, get_gfx1_tile_info,tilemap_scan_rows,8,8,32,32); state->gfx0b_tilemap = tilemap_create(machine, get_gfx0b_tile_info,tilemap_scan_rows,8,8,32,32);
state->gfx1_tilemap = tilemap_create(machine, get_gfx1_tile_info,tilemap_scan_rows,8,8,32,32);
tilemap_set_transparent_pen(gfx0a_tilemap,0); tilemap_set_transparent_pen(state->gfx0a_tilemap,0);
tilemap_set_transparent_pen(gfx0b_tilemap,0); tilemap_set_transparent_pen(state->gfx0b_tilemap,0);
tilemap_set_palette_offset(gfx0a_tilemap,0x100); tilemap_set_palette_offset(state->gfx0a_tilemap,0x100);
tilemap_set_palette_offset(gfx0b_tilemap,0x100); tilemap_set_palette_offset(state->gfx0b_tilemap,0x100);
tilemap_set_palette_offset(gfx1_tilemap,0x200); tilemap_set_palette_offset(state->gfx1_tilemap,0x200);
} }
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)
{ {
witch_state *state = machine->driver_data<witch_state>();
int i,sx,sy,tileno,flags,color; int i,sx,sy,tileno,flags,color;
int flipx=0; int flipx=0;
int flipy=0; int flipy=0;
@ -695,12 +718,12 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
for(i=0;i<0x800;i+=0x20) { for(i=0;i<0x800;i+=0x20) {
sx = sprite_ram[i+1]; sx = state->sprite_ram[i+1];
if(sx!=0xF8) { if(sx!=0xF8) {
tileno = (sprite_ram[i]<<2) | (( sprite_ram[i+0x800] & 0x07 ) << 10 ); tileno = (state->sprite_ram[i]<<2) | (( state->sprite_ram[i+0x800] & 0x07 ) << 10 );
sy = sprite_ram[i+2]; sy = state->sprite_ram[i+2];
flags = sprite_ram[i+3]; flags = state->sprite_ram[i+3];
flipx = (flags & 0x10 ) ? 1 : 0; flipx = (flags & 0x10 ) ? 1 : 0;
flipy = (flags & 0x20 ) ? 1 : 0; flipy = (flags & 0x20 ) ? 1 : 0;
@ -735,15 +758,16 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
static SCREEN_UPDATE(witch) static SCREEN_UPDATE(witch)
{ {
tilemap_set_scrollx( gfx1_tilemap, 0, scrollx-7 ); //offset to have it aligned with the sprites witch_state *state = screen->machine->driver_data<witch_state>();
tilemap_set_scrolly( gfx1_tilemap, 0, scrolly+8 ); tilemap_set_scrollx( state->gfx1_tilemap, 0, state->scrollx-7 ); //offset to have it aligned with the sprites
tilemap_set_scrolly( state->gfx1_tilemap, 0, state->scrolly+8 );
tilemap_draw(bitmap,cliprect,gfx1_tilemap,0,0); tilemap_draw(bitmap,cliprect,state->gfx1_tilemap,0,0);
tilemap_draw(bitmap,cliprect,gfx0a_tilemap,0,0); tilemap_draw(bitmap,cliprect,state->gfx0a_tilemap,0,0);
draw_sprites(screen->machine, bitmap, cliprect); draw_sprites(screen->machine, bitmap, cliprect);
tilemap_draw(bitmap,cliprect,gfx0b_tilemap,0,0); tilemap_draw(bitmap,cliprect,state->gfx0b_tilemap,0,0);
return 0; return 0;
} }
@ -757,7 +781,7 @@ static INTERRUPT_GEN( witch_sub_interrupt )
cpu_set_input_line(device,0,ASSERT_LINE); cpu_set_input_line(device,0,ASSERT_LINE);
} }
static MACHINE_CONFIG_START( witch, driver_device ) static MACHINE_CONFIG_START( witch, witch_state )
/* basic machine hardware */ /* basic machine hardware */
MCFG_CPU_ADD("maincpu", Z80,8000000) /* ? MHz */ MCFG_CPU_ADD("maincpu", Z80,8000000) /* ? MHz */
MCFG_CPU_PROGRAM_MAP(map_main) MCFG_CPU_PROGRAM_MAP(map_main)
@ -840,11 +864,12 @@ ROM_END
static DRIVER_INIT(witch) static DRIVER_INIT(witch)
{ {
witch_state *state = machine->driver_data<witch_state>();
UINT8 *ROM = (UINT8 *)machine->region("maincpu")->base(); UINT8 *ROM = (UINT8 *)machine->region("maincpu")->base();
memory_set_bankptr(machine, "bank1", &ROM[0x10000+UNBANKED_SIZE]); memory_set_bankptr(machine, "bank1", &ROM[0x10000+UNBANKED_SIZE]);
memory_install_read8_handler(cputag_get_address_space(machine, "sub", ADDRESS_SPACE_PROGRAM), 0x7000, 0x700f, 0, 0, prot_read_700x); memory_install_read8_handler(cputag_get_address_space(machine, "sub", ADDRESS_SPACE_PROGRAM), 0x7000, 0x700f, 0, 0, prot_read_700x);
bank = -1; state->bank = -1;
} }
GAME( 1992, witch, 0, witch, witch, witch, ROT0, "Sega / Vic Tokai", "Witch", 0 ) GAME( 1992, witch, 0, witch, witch, witch, ROT0, "Sega / Vic Tokai", "Witch", 0 )

View File

@ -14,7 +14,6 @@ XX Mission (c) 1986 UPL
#include "sound/2203intf.h" #include "sound/2203intf.h"
#include "includes/xxmissio.h" #include "includes/xxmissio.h"
static UINT8 xxmissio_status;
static WRITE8_HANDLER( xxmissio_bank_sel_w ) static WRITE8_HANDLER( xxmissio_bank_sel_w )
{ {
@ -23,43 +22,46 @@ static WRITE8_HANDLER( xxmissio_bank_sel_w )
static CUSTOM_INPUT( xxmissio_status_r ) static CUSTOM_INPUT( xxmissio_status_r )
{ {
xxmissio_state *state = field->port->machine->driver_data<xxmissio_state>();
int bit_mask = (FPTR)param; int bit_mask = (FPTR)param;
return (xxmissio_status & bit_mask) ? 1 : 0; return (state->status & bit_mask) ? 1 : 0;
} }
static WRITE8_HANDLER ( xxmissio_status_m_w ) static WRITE8_HANDLER ( xxmissio_status_m_w )
{ {
xxmissio_state *state = space->machine->driver_data<xxmissio_state>();
switch (data) switch (data)
{ {
case 0x00: case 0x00:
xxmissio_status |= 0x20; state->status |= 0x20;
break; break;
case 0x40: case 0x40:
xxmissio_status &= ~0x08; state->status &= ~0x08;
cputag_set_input_line_and_vector(space->machine, "sub", 0, HOLD_LINE, 0x10); cputag_set_input_line_and_vector(space->machine, "sub", 0, HOLD_LINE, 0x10);
break; break;
case 0x80: case 0x80:
xxmissio_status |= 0x04; state->status |= 0x04;
break; break;
} }
} }
static WRITE8_HANDLER ( xxmissio_status_s_w ) static WRITE8_HANDLER ( xxmissio_status_s_w )
{ {
xxmissio_state *state = space->machine->driver_data<xxmissio_state>();
switch (data) switch (data)
{ {
case 0x00: case 0x00:
xxmissio_status |= 0x10; state->status |= 0x10;
break; break;
case 0x40: case 0x40:
xxmissio_status |= 0x08; state->status |= 0x08;
break; break;
case 0x80: case 0x80:
xxmissio_status &= ~0x04; state->status &= ~0x04;
cputag_set_input_line_and_vector(space->machine, "maincpu", 0, HOLD_LINE, 0x10); cputag_set_input_line_and_vector(space->machine, "maincpu", 0, HOLD_LINE, 0x10);
break; break;
} }
@ -67,13 +69,15 @@ static WRITE8_HANDLER ( xxmissio_status_s_w )
static INTERRUPT_GEN( xxmissio_interrupt_m ) static INTERRUPT_GEN( xxmissio_interrupt_m )
{ {
xxmissio_status &= ~0x20; xxmissio_state *state = device->machine->driver_data<xxmissio_state>();
state->status &= ~0x20;
cpu_set_input_line(device, 0, HOLD_LINE); cpu_set_input_line(device, 0, HOLD_LINE);
} }
static INTERRUPT_GEN( xxmissio_interrupt_s ) static INTERRUPT_GEN( xxmissio_interrupt_s )
{ {
xxmissio_status &= ~0x10; xxmissio_state *state = device->machine->driver_data<xxmissio_state>();
state->status &= ~0x10;
cpu_set_input_line(device, 0, HOLD_LINE); cpu_set_input_line(device, 0, HOLD_LINE);
} }
@ -97,9 +101,9 @@ static ADDRESS_MAP_START( map1, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0xa002, 0xa002) AM_WRITE(xxmissio_status_m_w) AM_RANGE(0xa002, 0xa002) AM_WRITE(xxmissio_status_m_w)
AM_RANGE(0xa003, 0xa003) AM_WRITE(xxmissio_flipscreen_w) AM_RANGE(0xa003, 0xa003) AM_WRITE(xxmissio_flipscreen_w)
AM_RANGE(0xc000, 0xc7ff) AM_SHARE("share1") AM_RAM AM_BASE(&xxmissio_fgram) AM_RANGE(0xc000, 0xc7ff) AM_SHARE("share1") AM_RAM AM_BASE_MEMBER(xxmissio_state, fgram)
AM_RANGE(0xc800, 0xcfff) AM_SHARE("share2") AM_READWRITE(xxmissio_bgram_r, xxmissio_bgram_w) AM_BASE(&xxmissio_bgram) AM_RANGE(0xc800, 0xcfff) AM_SHARE("share2") AM_READWRITE(xxmissio_bgram_r, xxmissio_bgram_w) AM_BASE_MEMBER(xxmissio_state, bgram)
AM_RANGE(0xd000, 0xd7ff) AM_SHARE("share3") AM_RAM AM_BASE(&xxmissio_spriteram) AM_RANGE(0xd000, 0xd7ff) AM_SHARE("share3") AM_RAM AM_BASE_MEMBER(xxmissio_state, spriteram)
AM_RANGE(0xd800, 0xdaff) AM_SHARE("share4") AM_RAM_WRITE(xxmissio_paletteram_w) AM_BASE_GENERIC(paletteram) AM_RANGE(0xd800, 0xdaff) AM_SHARE("share4") AM_RAM_WRITE(xxmissio_paletteram_w) AM_BASE_GENERIC(paletteram)
@ -287,7 +291,7 @@ static const ym2203_interface ym2203_interface_2 =
NULL NULL
}; };
static MACHINE_CONFIG_START( xxmissio, driver_device ) static MACHINE_CONFIG_START( xxmissio, xxmissio_state )
/* basic machine hardware */ /* basic machine hardware */
MCFG_CPU_ADD("maincpu", Z80,12000000/4) /* 3.0MHz */ MCFG_CPU_ADD("maincpu", Z80,12000000/4) /* 3.0MHz */

View File

@ -27,7 +27,7 @@ static ADDRESS_MAP_START( main_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x1e82, 0x1e82) AM_READ_PORT("1E82") AM_RANGE(0x1e82, 0x1e82) AM_READ_PORT("1E82")
AM_RANGE(0x1e85, 0x1e85) AM_READ_PORT("1E85") /* Dodgem Only */ AM_RANGE(0x1e85, 0x1e85) AM_READ_PORT("1E85") /* Dodgem Only */
AM_RANGE(0x1e86, 0x1e86) AM_READ_PORT("1E86") AM_WRITENOP /* Dodgem Only */ AM_RANGE(0x1e86, 0x1e86) AM_READ_PORT("1E86") AM_WRITENOP /* Dodgem Only */
AM_RANGE(0x1f00, 0x1fff) AM_READWRITE(zac_s2636_r, zac_s2636_w) AM_BASE(&zac2650_s2636_0_ram) AM_RANGE(0x1f00, 0x1fff) AM_READWRITE(zac_s2636_r, zac_s2636_w) AM_BASE_MEMBER(zac2650_state, s2636_0_ram)
ADDRESS_MAP_END ADDRESS_MAP_END
static ADDRESS_MAP_START( port_map, ADDRESS_SPACE_IO, 8 ) static ADDRESS_MAP_START( port_map, ADDRESS_SPACE_IO, 8 )

View File

@ -48,24 +48,21 @@ Notes:
#include "includes/zaccaria.h" #include "includes/zaccaria.h"
static int dsw;
static int active_8910, port0a, acs;
static int last_port0b;
static WRITE8_DEVICE_HANDLER( zaccaria_dsw_sel_w ) static WRITE8_DEVICE_HANDLER( zaccaria_dsw_sel_w )
{ {
zaccaria_state *state = device->machine->driver_data<zaccaria_state>();
switch (data & 0xf0) switch (data & 0xf0)
{ {
case 0xe0: case 0xe0:
dsw = 0; state->dsw = 0;
break; break;
case 0xd0: case 0xd0:
dsw = 1; state->dsw = 1;
break; break;
case 0xb0: case 0xb0:
dsw = 2; state->dsw = 2;
break; break;
default: default:
@ -76,9 +73,10 @@ static WRITE8_DEVICE_HANDLER( zaccaria_dsw_sel_w )
static READ8_HANDLER( zaccaria_dsw_r ) static READ8_HANDLER( zaccaria_dsw_r )
{ {
zaccaria_state *state = space->machine->driver_data<zaccaria_state>();
static const char *const dswnames[] = { "IN0", "DSW0", "DSW1" }; static const char *const dswnames[] = { "IN0", "DSW0", "DSW1" };
return input_port_read(space->machine, dswnames[dsw]); return input_port_read(space->machine, dswnames[state->dsw]);
} }
@ -116,56 +114,60 @@ static WRITE_LINE_DEVICE_HANDLER( zaccaria_irq0b )
static READ8_DEVICE_HANDLER( zaccaria_port0a_r ) static READ8_DEVICE_HANDLER( zaccaria_port0a_r )
{ {
return ay8910_r(device->machine->device((active_8910 == 0) ? "ay1" : "ay2"), 0); zaccaria_state *state = device->machine->driver_data<zaccaria_state>();
return ay8910_r(device->machine->device((state->active_8910 == 0) ? "ay1" : "ay2"), 0);
} }
static WRITE8_DEVICE_HANDLER( zaccaria_port0a_w ) static WRITE8_DEVICE_HANDLER( zaccaria_port0a_w )
{ {
port0a = data; zaccaria_state *state = device->machine->driver_data<zaccaria_state>();
state->port0a = data;
} }
static WRITE8_DEVICE_HANDLER( zaccaria_port0b_w ) static WRITE8_DEVICE_HANDLER( zaccaria_port0b_w )
{ {
zaccaria_state *state = device->machine->driver_data<zaccaria_state>();
/* bit 1 goes to 8910 #0 BDIR pin */ /* bit 1 goes to 8910 #0 BDIR pin */
if ((last_port0b & 0x02) == 0x02 && (data & 0x02) == 0x00) if ((state->last_port0b & 0x02) == 0x02 && (data & 0x02) == 0x00)
{ {
/* bit 0 goes to the 8910 #0 BC1 pin */ /* bit 0 goes to the 8910 #0 BC1 pin */
ay8910_data_address_w(device->machine->device("ay1"), last_port0b, port0a); ay8910_data_address_w(device->machine->device("ay1"), state->last_port0b, state->port0a);
} }
else if ((last_port0b & 0x02) == 0x00 && (data & 0x02) == 0x02) else if ((state->last_port0b & 0x02) == 0x00 && (data & 0x02) == 0x02)
{ {
/* bit 0 goes to the 8910 #0 BC1 pin */ /* bit 0 goes to the 8910 #0 BC1 pin */
if (last_port0b & 0x01) if (state->last_port0b & 0x01)
active_8910 = 0; state->active_8910 = 0;
} }
/* bit 3 goes to 8910 #1 BDIR pin */ /* bit 3 goes to 8910 #1 BDIR pin */
if ((last_port0b & 0x08) == 0x08 && (data & 0x08) == 0x00) if ((state->last_port0b & 0x08) == 0x08 && (data & 0x08) == 0x00)
{ {
/* bit 2 goes to the 8910 #1 BC1 pin */ /* bit 2 goes to the 8910 #1 BC1 pin */
ay8910_data_address_w(device->machine->device("ay2"), last_port0b >> 2, port0a); ay8910_data_address_w(device->machine->device("ay2"), state->last_port0b >> 2, state->port0a);
} }
else if ((last_port0b & 0x08) == 0x00 && (data & 0x08) == 0x08) else if ((state->last_port0b & 0x08) == 0x00 && (data & 0x08) == 0x08)
{ {
/* bit 2 goes to the 8910 #1 BC1 pin */ /* bit 2 goes to the 8910 #1 BC1 pin */
if (last_port0b & 0x04) if (state->last_port0b & 0x04)
active_8910 = 1; state->active_8910 = 1;
} }
last_port0b = data; state->last_port0b = data;
} }
static INTERRUPT_GEN( zaccaria_cb1_toggle ) static INTERRUPT_GEN( zaccaria_cb1_toggle )
{ {
zaccaria_state *state = device->machine->driver_data<zaccaria_state>();
device_t *pia0 = device->machine->device("pia0"); device_t *pia0 = device->machine->device("pia0");
static int toggle = 0;
pia6821_cb1_w(pia0, toggle & 1); pia6821_cb1_w(pia0, state->toggle & 1);
toggle ^= 1; state->toggle ^= 1;
} }
static WRITE8_DEVICE_HANDLER( zaccaria_port1b_w ) static WRITE8_DEVICE_HANDLER( zaccaria_port1b_w )
{ {
zaccaria_state *state = device->machine->driver_data<zaccaria_state>();
device_t *tms = device->machine->device("tms"); device_t *tms = device->machine->device("tms");
// bit 0 = /RS // bit 0 = /RS
@ -174,7 +176,7 @@ static WRITE8_DEVICE_HANDLER( zaccaria_port1b_w )
tms5220_wsq_w(tms, (data >> 1) & 0x01); tms5220_wsq_w(tms, (data >> 1) & 0x01);
// bit 3 = "ACS" (goes, inverted, to input port 6 bit 3) // bit 3 = "ACS" (goes, inverted, to input port 6 bit 3)
acs = ~data & 0x08; state->acs = ~data & 0x08;
// bit 4 = led (for testing?) // bit 4 = led (for testing?)
set_led_status(device->machine, 0,~data & 0x10); set_led_status(device->machine, 0,~data & 0x10);
@ -260,8 +262,8 @@ static ADDRESS_MAP_START( main_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x5fff) AM_ROM AM_RANGE(0x0000, 0x5fff) AM_ROM
AM_RANGE(0x6000, 0x63ff) AM_READONLY AM_RANGE(0x6000, 0x63ff) AM_READONLY
AM_RANGE(0x6400, 0x6407) AM_READ(zaccaria_prot1_r) AM_RANGE(0x6400, 0x6407) AM_READ(zaccaria_prot1_r)
AM_RANGE(0x6000, 0x67ff) AM_WRITE(zaccaria_videoram_w) AM_BASE(&zaccaria_videoram) /* 6400-67ff is 4 bits wide */ AM_RANGE(0x6000, 0x67ff) AM_WRITE(zaccaria_videoram_w) AM_BASE_MEMBER(zaccaria_state, videoram) /* 6400-67ff is 4 bits wide */
AM_RANGE(0x6800, 0x683f) AM_WRITE(zaccaria_attributes_w) AM_BASE(&zaccaria_attributesram) AM_RANGE(0x6800, 0x683f) AM_WRITE(zaccaria_attributes_w) AM_BASE_MEMBER(zaccaria_state, attributesram)
AM_RANGE(0x6840, 0x685f) AM_RAM AM_BASE_GENERIC(spriteram) AM_RANGE(0x6840, 0x685f) AM_RAM AM_BASE_GENERIC(spriteram)
AM_RANGE(0x6881, 0x68c0) AM_RAM AM_BASE_GENERIC(spriteram2) AM_RANGE(0x6881, 0x68c0) AM_RAM AM_BASE_GENERIC(spriteram2)
AM_RANGE(0x6c00, 0x6c00) AM_WRITE(zaccaria_flip_screen_x_w) AM_RANGE(0x6c00, 0x6c00) AM_WRITE(zaccaria_flip_screen_x_w)
@ -340,7 +342,8 @@ ADDRESS_MAP_END
static CUSTOM_INPUT( acs_r ) static CUSTOM_INPUT( acs_r )
{ {
return (acs & 0x08) ? 1 : 0; zaccaria_state *state = field->port->machine->driver_data<zaccaria_state>();
return (state->acs & 0x08) ? 1 : 0;
} }
static INPUT_PORTS_START( monymony ) static INPUT_PORTS_START( monymony )
@ -576,7 +579,7 @@ static const tms5220_interface tms5220_config =
static MACHINE_CONFIG_START( zaccaria, driver_device ) static MACHINE_CONFIG_START( zaccaria, zaccaria_state )
/* basic machine hardware */ /* basic machine hardware */
MCFG_CPU_ADD("maincpu", Z80,XTAL_18_432MHz/6) /* verified on pcb */ MCFG_CPU_ADD("maincpu", Z80,XTAL_18_432MHz/6) /* verified on pcb */

View File

@ -1,4 +1,32 @@
class bagman_state : public driver_device
{
public:
bagman_state(running_machine &machine, const driver_device_config_base &config)
: driver_device(machine, config) { }
UINT8 ls259_buf[8];
UINT8 p1_res;
UINT8 p1_old_val;
UINT8 p2_res;
UINT8 p2_old_val;
UINT8 *videoram;
UINT8 *colorram;
UINT8 *video_enable;
/*table holds outputs of all ANDs (after AND map)*/
UINT8 andmap[64];
/*table holds inputs (ie. not x, x, not q, q) to the AND map*/
UINT8 columnvalue[32];
/*8 output pins (actually 6 output and 2 input/output)*/
UINT8 outvalue[8];
tilemap_t *bg_tilemap;
};
/*----------- timings -----------*/ /*----------- timings -----------*/
#define BAGMAN_MAIN_CLOCK XTAL_18_432MHz #define BAGMAN_MAIN_CLOCK XTAL_18_432MHz
@ -28,10 +56,6 @@ WRITE8_HANDLER( bagman_pal16r6_w );
/*----------- defined in video/bagman.c -----------*/ /*----------- defined in video/bagman.c -----------*/
extern UINT8 *bagman_videoram;
extern UINT8 *bagman_colorram;
extern UINT8 *bagman_video_enable;
WRITE8_HANDLER( bagman_videoram_w ); WRITE8_HANDLER( bagman_videoram_w );
WRITE8_HANDLER( bagman_colorram_w ); WRITE8_HANDLER( bagman_colorram_w );
WRITE8_HANDLER( bagman_flipscreen_w ); WRITE8_HANDLER( bagman_flipscreen_w );

View File

@ -9,6 +9,17 @@
#include "devlegcy.h" #include "devlegcy.h"
#define GRIDLEE_MASTER_CLOCK (20000000)
#define GRIDLEE_CPU_CLOCK (GRIDLEE_MASTER_CLOCK / 16)
#define GRIDLEE_PIXEL_CLOCK (GRIDLEE_MASTER_CLOCK / 4)
#define GRIDLEE_HTOTAL (0x140)
#define GRIDLEE_HBEND (0x000)
#define GRIDLEE_HBSTART (0x100)
#define GRIDLEE_VTOTAL (0x108)
#define GRIDLEE_VBEND (0x010)
#define GRIDLEE_VBSTART (0x100)
class gridlee_state : public driver_device class gridlee_state : public driver_device
{ {
public: public:

View File

@ -1,10 +1,6 @@
#ifndef __GSTRIKER_H #ifndef __GSTRIKER_H
#define __GSTRIKER_H #define __GSTRIKER_H
/*----------- defined in video/gstriker.c -----------*/
extern UINT16 *gstriker_lineram;
/*** VS920A **********************************************/ /*** VS920A **********************************************/
#define MAX_VS920A 2 #define MAX_VS920A 2
@ -15,18 +11,9 @@ typedef struct
UINT16* vram; UINT16* vram;
UINT16 pal_base; UINT16 pal_base;
UINT8 gfx_region; UINT8 gfx_region;
} sVS920A; } sVS920A;
extern sVS920A VS920A[MAX_VS920A];
#define VS920A_0_vram (VS920A[0].vram)
#define VS920A_1_vram (VS920A[1].vram)
extern WRITE16_HANDLER( VS920A_0_vram_w );
extern WRITE16_HANDLER( VS920A_1_vram_w );
/*** MB60553 **********************************************/ /*** MB60553 **********************************************/
#define MAX_MB60553 2 #define MAX_MB60553 2
@ -42,18 +29,6 @@ typedef struct
} tMB60553; } tMB60553;
extern tMB60553 MB60553[MAX_MB60553];
#define MB60553_0_vram (MB60553[0].vram)
#define MB60553_1_vram (MB60553[1].vram)
extern WRITE16_HANDLER(MB60553_0_regs_w);
extern WRITE16_HANDLER(MB60553_1_regs_w);
extern WRITE16_HANDLER(MB60553_0_vram_w);
extern WRITE16_HANDLER(MB60553_1_vram_w);
/*** CG10103 **********************************************/ /*** CG10103 **********************************************/
#define MAX_CG10103 2 #define MAX_CG10103 2
@ -67,10 +42,36 @@ typedef struct
} tCG10103; } tCG10103;
extern tCG10103 CG10103[MAX_CG10103]; class gstriker_state : public driver_device
{
public:
gstriker_state(running_machine &machine, const driver_device_config_base &config)
: driver_device(machine, config) { }
#define CG10103_0_vram (CG10103[0].vram) UINT16 dmmy_8f_ret;
#define CG10103_1_vram (CG10103[1].vram) int pending_command;
UINT16 *work_ram;
int gametype;
UINT16 mcu_data;
UINT16 prot_reg[2];
UINT16 *lineram;
sVS920A VS920A[MAX_VS920A];
tMB60553 MB60553[MAX_MB60553];
tCG10103 CG10103[MAX_CG10103];
sVS920A* VS920A_cur_chip;
tMB60553 *MB60553_cur_chip;
tCG10103* CG10103_cur_chip;
};
/*----------- defined in video/gstriker.c -----------*/
WRITE16_HANDLER( VS920A_0_vram_w );
WRITE16_HANDLER( VS920A_1_vram_w );
WRITE16_HANDLER( MB60553_0_regs_w );
WRITE16_HANDLER( MB60553_1_regs_w );
WRITE16_HANDLER( MB60553_0_vram_w );
WRITE16_HANDLER( MB60553_1_vram_w );
SCREEN_UPDATE( gstriker ); SCREEN_UPDATE( gstriker );
VIDEO_START( gstriker ); VIDEO_START( gstriker );

View File

@ -1,24 +1,47 @@
class ms32_state : public driver_device
{
public:
ms32_state(running_machine &machine, const driver_device_config_base &config)
: driver_device(machine, config) { }
UINT8 *nvram_8;
UINT32 *mahjong_input_select;
UINT32 to_main;
UINT16 irqreq;
tilemap_t *tx_tilemap;
tilemap_t *roz_tilemap;
tilemap_t *bg_tilemap;
tilemap_t *bg_tilemap_alt;
UINT8* priram_8;
UINT16* palram_16;
UINT16* rozram_16;
UINT16* lineram_16;
UINT16* sprram_16;
UINT16* txram_16;
UINT16* bgram_16;
UINT32 tilemaplayoutcontrol;
UINT16* f1superb_extraram_16;
tilemap_t* extra_tilemap;
UINT32 *roz_ctrl;
UINT32 *tx_scroll;
UINT32 *bg_scroll;
UINT32 *mainram;
bitmap_t* temp_bitmap_tilemaps;
bitmap_t* temp_bitmap_sprites;
bitmap_t* temp_bitmap_sprites_pri;
int reverse_sprite_order;
int flipscreen;
UINT32 brt[4];
int brt_r;
int brt_g;
int brt_b;
};
/*----------- defined in video/ms32.c -----------*/ /*----------- defined in video/ms32.c -----------*/
extern tilemap_t *ms32_tx_tilemap, *ms32_roz_tilemap, *ms32_bg_tilemap, *ms32_bg_tilemap_alt;
extern UINT8* ms32_priram_8;
extern UINT16* ms32_palram_16;
extern UINT16* ms32_rozram_16;
extern UINT16* ms32_lineram_16;
extern UINT16* ms32_sprram_16;
extern UINT16* ms32_txram_16;
extern UINT16* ms32_bgram_16;
extern UINT32 ms32_tilemaplayoutcontrol;
extern UINT16* f1superb_extraram_16;
extern tilemap_t* ms32_extra_tilemap;
//extern UINT32 *ms32_fce00000; //extern UINT32 *ms32_fce00000;
extern UINT32 *ms32_roz_ctrl;
extern UINT32 *ms32_tx_scroll;
extern UINT32 *ms32_bg_scroll;
extern UINT32 *ms32_mainram;
WRITE32_HANDLER( ms32_brightness_w ); WRITE32_HANDLER( ms32_brightness_w );

View File

@ -5,8 +5,9 @@ public:
: driver_device(machine, config) { } : driver_device(machine, config) { }
UINT8 *videoram; UINT8 *videoram;
emu_timer *clear_irq_timer; emu_timer *clear_irq_timer;
tilemap_t *bg_tilemap;
int control_byte;
}; };

View File

@ -1,3 +1,17 @@
class namcofl_state : public driver_device
{
public:
namcofl_state(running_machine &machine, const driver_device_config_base &config)
: driver_device(machine, config) { }
emu_timer *raster_interrupt_timer;
UINT32 *workram;
UINT16 *shareram;
UINT8 mcu_port6;
UINT32 sprbank;
};
/*----------- defined in video/namcofl.c -----------*/ /*----------- defined in video/namcofl.c -----------*/
VIDEO_START( namcofl ); VIDEO_START( namcofl );

View File

@ -121,7 +121,7 @@ void namcos2_draw_sprites_metalhawk(running_machine *machine, bitmap_t *bitmap,
/* C355 Motion Object Emulation */ /* C355 Motion Object Emulation */
/* for palXOR, supply either 0x0 (normal) or 0xf (palette mapping reversed) */ /* for palXOR, supply either 0x0 (normal) or 0xf (palette mapping reversed) */
void namco_obj_init( running_machine *machine, int gfxbank, int palXOR, int (*code2tile)( int code ) ); void namco_obj_init( running_machine *machine, int gfxbank, int palXOR, int (*code2tile)( running_machine *machine, int code ) );
void namco_obj_draw( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect, int pri ); void namco_obj_draw( running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect, int pri );
WRITE16_HANDLER( namco_obj16_w ); WRITE16_HANDLER( namco_obj16_w );

View File

@ -1,12 +1,62 @@
#define NAMCOS1_MAX_BANK 0x400
/* Bank handler definitions */
typedef struct
{
read8_space_func bank_handler_r;
write8_space_func bank_handler_w;
int bank_offset;
UINT8 *bank_pointer;
} bankhandler;
class namcos1_state : public driver_device
{
public:
namcos1_state(running_machine &machine, const driver_device_config_base &config)
: driver_device(machine, config) { }
int dac0_value;
int dac1_value;
int dac0_gain;
int dac1_gain;
UINT8 *paletteram;
UINT8 *triram;
UINT8 *s1ram;
bankhandler bank_element[NAMCOS1_MAX_BANK];
bankhandler active_bank[16];
int key_id;
int key_reg;
int key_rng;
int key_swap4_arg;
int key_swap4;
int key_bottom4;
int key_top4;
unsigned int key_quotient;
unsigned int key_reminder;
unsigned int key_numerator_high_word;
UINT8 key[8];
int mcu_patch_data;
int reset;
int wdog;
int chip[16];
UINT8 *videoram;
UINT8 cus116[0x10];
UINT8 *spriteram;
UINT8 playfield_control[0x20];
tilemap_t *bg_tilemap[6];
UINT8 *tilemap_maskdata;
int copy_sprites;
UINT8 drawmode_table[16];
};
/*----------- defined in drivers/namcos1.c -----------*/ /*----------- defined in drivers/namcos1.c -----------*/
void namcos1_init_DACs(void); void namcos1_init_DACs(running_machine *machine);
/*----------- defined in machine/namcos1.c -----------*/ /*----------- defined in machine/namcos1.c -----------*/
extern UINT8 *namcos1_paletteram;
WRITE8_HANDLER( namcos1_bankswitch_w ); WRITE8_HANDLER( namcos1_bankswitch_w );
WRITE8_HANDLER( namcos1_subcpu_bank_w ); WRITE8_HANDLER( namcos1_subcpu_bank_w );

View File

@ -1,3 +1,35 @@
class ninjakd2_state : public driver_device
{
public:
ninjakd2_state(running_machine &machine, const driver_device_config_base &config)
: driver_device(machine, config) { }
const INT16* sampledata;
UINT8 omegaf_io_protection[3];
UINT8 omegaf_io_protection_input;
int omegaf_io_protection_tic;
UINT8* bg_videoram;
UINT8* fg_videoram;
int next_sprite_overdraw_enabled;
int (*stencil_compare_function) (UINT16 pal);
int sprites_updated;
bitmap_t *sp_bitmap;
int robokid_sprites;
tilemap_t* fg_tilemap;
tilemap_t* bg_tilemap;
tilemap_t* bg0_tilemap;
tilemap_t* bg1_tilemap;
tilemap_t* bg2_tilemap;
int bank_mask;
int robokid_bg0_bank;
int robokid_bg1_bank;
int robokid_bg2_bank;
UINT8* robokid_bg0_videoram;
UINT8* robokid_bg1_videoram;
UINT8* robokid_bg2_videoram;
};
/*----------- defined in video/ninjakd2.c -----------*/ /*----------- defined in video/ninjakd2.c -----------*/
extern WRITE8_HANDLER( ninjakd2_bgvideoram_w ); extern WRITE8_HANDLER( ninjakd2_bgvideoram_w );
@ -28,5 +60,3 @@ extern SCREEN_UPDATE( robokid );
extern SCREEN_UPDATE( omegaf ); extern SCREEN_UPDATE( omegaf );
extern SCREEN_EOF( ninjakd2 ); extern SCREEN_EOF( ninjakd2 );
extern UINT8* ninjakd2_bg_videoram;
extern UINT8* ninjakd2_fg_videoram;

View File

@ -1,6 +1,18 @@
/*----------- defined in video/nova2001.c -----------*/ class nova2001_state : public driver_device
{
public:
nova2001_state(running_machine &machine, const driver_device_config_base &config)
: driver_device(machine, config) { }
extern UINT8 *nova2001_fg_videoram, *nova2001_bg_videoram; UINT8 ninjakun_io_a002_ctrl;
UINT8 *fg_videoram;
UINT8 *bg_videoram;
tilemap_t *bg_tilemap;
tilemap_t *fg_tilemap;
};
/*----------- defined in video/nova2001.c -----------*/
extern WRITE8_HANDLER( nova2001_fg_videoram_w ); extern WRITE8_HANDLER( nova2001_fg_videoram_w );
extern WRITE8_HANDLER( nova2001_bg_videoram_w ); extern WRITE8_HANDLER( nova2001_bg_videoram_w );

View File

@ -5,15 +5,24 @@ public:
: driver_device(machine, config) { } : driver_device(machine, config) { }
UINT16 *videoram; UINT16 *videoram;
UINT8 sound_data;
UINT8 sound_busy;
UINT8 ym2151_irq;
UINT8 upd_rom_bank;
UINT16 *bitmapram;
size_t bitmapram_size;
int sprite_palette;
tilemap_t *background[2];
UINT16 videoflags;
UINT8 crtc_register;
emu_timer *crtc_timer;
UINT8 bins;
UINT8 gins;
}; };
/*----------- defined in video/rpunch.c -----------*/ /*----------- defined in video/rpunch.c -----------*/
extern UINT16 *rpunch_bitmapram;
extern size_t rpunch_bitmapram_size;
extern int rpunch_sprite_palette;
VIDEO_START( rpunch ); VIDEO_START( rpunch );
SCREEN_UPDATE( rpunch ); SCREEN_UPDATE( rpunch );

View File

@ -11,23 +11,62 @@ enum {
}; };
class slapfght_state : public driver_device
{
public:
slapfght_state(running_machine &machine, const driver_device_config_base &config)
: driver_device(machine, config) { }
int getstar_id;
UINT8 *slapfight_videoram;
UINT8 *slapfight_colorram;
UINT8 *slapfight_fixvideoram;
UINT8 *slapfight_fixcolorram;
UINT8 *slapfight_scrollx_lo;
UINT8 *slapfight_scrollx_hi;
UINT8 *slapfight_scrolly;
int slapfight_status;
int getstar_sequence_index;
int getstar_sh_intenabled;
int slapfight_status_state;
UINT8 mcu_val;
UINT8 getstar_cmd;
UINT8 gs_a;
UINT8 gs_d;
UINT8 gs_e;
UINT8 tigerhb_cmd;
UINT8 from_main;
UINT8 from_mcu;
int mcu_sent;
int main_sent;
UINT8 portA_in;
UINT8 portA_out;
UINT8 ddrA;
UINT8 portB_in;
UINT8 portB_out;
UINT8 ddrB;
UINT8 portC_in;
UINT8 portC_out;
UINT8 ddrC;
int flipscreen;
int slapfight_palette_bank;
tilemap_t *pf1_tilemap;
tilemap_t *fix_tilemap;
};
/*----------- defines -----------*/ /*----------- defines -----------*/
/* due to code at 0x108d (GUARDIAN) or 0x1152 (GETSTARJ), /* due to code at 0x108d (GUARDIAN) or 0x1152 (GETSTARJ),
register C is a unaltered copy of register A */ register C is a unaltered copy of register A */
# define GS_SAVE_REGS gs_a = cpu_get_reg(space->cpu, Z80_BC) >> 0; \ #define GS_SAVE_REGS state->gs_a = cpu_get_reg(space->cpu, Z80_BC) >> 0; \
gs_d = cpu_get_reg(space->cpu, Z80_DE) >> 8; \ state->gs_d = cpu_get_reg(space->cpu, Z80_DE) >> 8; \
gs_e = cpu_get_reg(space->cpu, Z80_DE) >> 0; state->gs_e = cpu_get_reg(space->cpu, Z80_DE) >> 0;
# define GS_RESET_REGS gs_a = 0; \ #define GS_RESET_REGS state->gs_a = 0; \
gs_d = 0; \ state->gs_d = 0; \
gs_e = 0; state->gs_e = 0;
/*----------- defined in drivers/slapfght.c -----------*/
extern int getstar_id;
/*----------- defined in machine/slapfght.c -----------*/ /*----------- defined in machine/slapfght.c -----------*/
@ -83,12 +122,6 @@ INTERRUPT_GEN( getstar_interrupt );
/*----------- defined in video/slapfght.c -----------*/ /*----------- defined in video/slapfght.c -----------*/
extern UINT8 *slapfight_videoram;
extern UINT8 *slapfight_colorram;
extern UINT8 *slapfight_fixvideoram;
extern UINT8 *slapfight_fixcolorram;
extern UINT8 *slapfight_scrollx_lo,*slapfight_scrollx_hi,*slapfight_scrolly;
SCREEN_UPDATE( slapfight ); SCREEN_UPDATE( slapfight );
SCREEN_UPDATE( perfrman ); SCREEN_UPDATE( perfrman );
VIDEO_START( slapfight ); VIDEO_START( slapfight );

View File

@ -36,6 +36,12 @@ public:
UINT8 drawmode_table[16]; UINT8 drawmode_table[16];
UINT8 empty_tile[16*16]; UINT8 empty_tile[16*16];
int hf_posy;
int hf_posx;
int tc16_posy;
int tc16_posx;
int tc32_posy;
int tc32_posx;
}; };

View File

@ -1,3 +1,11 @@
struct iox_t
{
int reset,ff_event,ff_1,protcheck[4],protlatch[4];
UINT8 data;
UINT8 mux;
UINT8 ff;
};
class srmp2_state : public driver_device class srmp2_state : public driver_device
{ {
public: public:
@ -19,9 +27,8 @@ public:
UINT8 *u8; UINT8 *u8;
UINT16 *u16; UINT16 *u16;
} spriteram1, spriteram2, spriteram3; } spriteram1, spriteram2, spriteram3;
UINT8 iox_data;
UINT8 iox_mux; iox_t iox;
UINT8 iox_ff;
}; };

View File

@ -4,10 +4,25 @@
**************************************************************************/ **************************************************************************/
/*----------- defined in video/suprridr.c -----------*/ class suprridr_state : public driver_device
{
public:
suprridr_state(running_machine &machine, const driver_device_config_base &config)
: driver_device(machine, config) { }
extern UINT8 *suprridr_fgram; UINT8 nmi_enable;
extern UINT8 *suprridr_bgram; UINT8 sound_data;
UINT8 *fgram;
UINT8 *bgram;
tilemap_t *fg_tilemap;
tilemap_t *bg_tilemap;
tilemap_t *bg_tilemap_noscroll;
UINT8 flipx;
UINT8 flipy;
};
/*----------- defined in video/suprridr.c -----------*/
VIDEO_START( suprridr ); VIDEO_START( suprridr );
PALETTE_INIT( suprridr ); PALETTE_INIT( suprridr );
@ -17,7 +32,7 @@ WRITE8_HANDLER( suprridr_flipy_w );
WRITE8_HANDLER( suprridr_fgdisable_w ); WRITE8_HANDLER( suprridr_fgdisable_w );
WRITE8_HANDLER( suprridr_fgscrolly_w ); WRITE8_HANDLER( suprridr_fgscrolly_w );
WRITE8_HANDLER( suprridr_bgscrolly_w ); WRITE8_HANDLER( suprridr_bgscrolly_w );
int suprridr_is_screen_flipped(void); int suprridr_is_screen_flipped(running_machine *machine);
WRITE8_HANDLER( suprridr_fgram_w ); WRITE8_HANDLER( suprridr_fgram_w );
WRITE8_HANDLER( suprridr_bgram_w ); WRITE8_HANDLER( suprridr_bgram_w );

View File

@ -1,8 +1,24 @@
/*----------- defined in video/tankbust.c -----------*/ class tankbust_state : public driver_device
{
public:
tankbust_state(running_machine &machine, const driver_device_config_base &config)
: driver_device(machine, config) { }
extern UINT8 *tankbust_txtram; int latch;
extern UINT8 *tankbust_videoram; UINT32 timer1;
extern UINT8 *tankbust_colorram; int e0xx_data[8];
UINT8 variable_data;
UINT8 *txtram;
UINT8 *videoram;
UINT8 *colorram;
tilemap_t *bg_tilemap;
tilemap_t *txt_tilemap;
UINT8 xscroll[2];
UINT8 yscroll[2];
};
/*----------- defined in video/tankbust.c -----------*/
VIDEO_START( tankbust ); VIDEO_START( tankbust );
SCREEN_UPDATE( tankbust ); SCREEN_UPDATE( tankbust );

View File

@ -1,9 +1,25 @@
/*----------- defined in video/taotaido.c -----------*/ class taotaido_state : public driver_device
{
public:
taotaido_state(running_machine &machine, const driver_device_config_base &config)
: driver_device(machine, config) { }
extern UINT16 *taotaido_spriteram; int pending_command;
extern UINT16 *taotaido_spriteram2; UINT16 *spriteram;
extern UINT16 *taotaido_scrollram; UINT16 *spriteram2;
extern UINT16 *taotaido_bgram; UINT16 *scrollram;
UINT16 *bgram;
UINT16 sprite_character_bank_select[8];
UINT16 video_bank_select[8];
tilemap_t *bg_tilemap;
UINT16 *spriteram_old;
UINT16 *spriteram_older;
UINT16 *spriteram2_old;
UINT16 *spriteram2_older;
};
/*----------- defined in video/taotaido.c -----------*/
WRITE16_HANDLER( taotaido_sprite_character_bank_select_w ); WRITE16_HANDLER( taotaido_sprite_character_bank_select_w );
WRITE16_HANDLER( taotaido_tileregs_w ); WRITE16_HANDLER( taotaido_tileregs_w );

View File

@ -1,10 +1,27 @@
/*----------- defined in video/thepit.c -----------*/ class thepit_state : public driver_device
{
public:
thepit_state(running_machine &machine, const driver_device_config_base &config)
: driver_device(machine, config) { }
extern UINT8 *thepit_videoram; int question_address;
extern UINT8 *thepit_colorram; int question_rom;
extern UINT8 *thepit_attributesram; int remap_address[16];
extern UINT8 *thepit_spriteram; UINT8 *videoram;
extern size_t thepit_spriteram_size; UINT8 *colorram;
UINT8 *attributesram;
UINT8 *spriteram;
size_t spriteram_size;
UINT8 graphics_bank;
UINT8 flip_screen_x;
UINT8 flip_screen_y;
tilemap_t *solid_tilemap;
tilemap_t *tilemap;
UINT8 *dummy_tile;
};
/*----------- defined in video/thepit.c -----------*/
PALETTE_INIT( thepit ); PALETTE_INIT( thepit );
PALETTE_INIT( suprmous ); PALETTE_INIT( suprmous );

View File

@ -5,14 +5,18 @@ public:
: driver_device(machine, config) { } : driver_device(machine, config) { }
UINT8 *videoram; UINT8 *videoram;
int nmi_enabled;
UINT8 *bg_videoram;
size_t bg_videoram_size;
int scrollx;
int scrolly;
tilemap_t *bg_tilemap;
tilemap_t *fg_tilemap;
}; };
/*----------- defined in video/timelimt.c -----------*/ /*----------- defined in video/timelimt.c -----------*/
extern UINT8 *timelimt_bg_videoram;
extern size_t timelimt_bg_videoram_size;
VIDEO_START( timelimt ); VIDEO_START( timelimt );
PALETTE_INIT( timelimt ); PALETTE_INIT( timelimt );
SCREEN_UPDATE( timelimt ); SCREEN_UPDATE( timelimt );

View File

@ -64,6 +64,7 @@ public:
UINT8 buckrog_fchg, buckrog_mov, buckrog_obch; UINT8 buckrog_fchg, buckrog_mov, buckrog_obch;
UINT8 buckrog_command; UINT8 buckrog_command;
UINT8 buckrog_myship; UINT8 buckrog_myship;
int last_sound_a;
}; };

View File

@ -1,18 +1,25 @@
class unico_state : public driver_device
{
public:
unico_state(running_machine &machine, const driver_device_config_base &config)
: driver_device(machine, config) { }
UINT16 *vram;
UINT16 *scroll;
UINT32 *vram32;
UINT32 *scroll32;
tilemap_t *tilemap[3];
int sprites_scrolldx;
int sprites_scrolldy;
};
/*----------- defined in video/unico.c -----------*/ /*----------- defined in video/unico.c -----------*/
extern UINT16 *unico_vram_0, *unico_scrollx_0, *unico_scrolly_0; WRITE16_HANDLER( unico_vram_w );
extern UINT16 *unico_vram_1, *unico_scrollx_1, *unico_scrolly_1;
extern UINT16 *unico_vram_2, *unico_scrollx_2, *unico_scrolly_2;
extern UINT32 *unico_vram32_0, *unico_vram32_1, *unico_vram32_2, *unico_scroll32;
WRITE16_HANDLER( unico_vram_0_w );
WRITE16_HANDLER( unico_vram_1_w );
WRITE16_HANDLER( unico_vram_2_w );
WRITE16_HANDLER( unico_palette_w ); WRITE16_HANDLER( unico_palette_w );
WRITE32_HANDLER( unico_vram32_0_w ); WRITE32_HANDLER( unico_vram32_w );
WRITE32_HANDLER( unico_vram32_1_w );
WRITE32_HANDLER( unico_vram32_2_w );
WRITE32_HANDLER( unico_palette32_w ); WRITE32_HANDLER( unico_palette32_w );
VIDEO_START( unico ); VIDEO_START( unico );

View File

@ -1,8 +1,22 @@
/*----------- defined in video/xxmissio.c -----------*/ class xxmissio_state : public driver_device
{
public:
xxmissio_state(running_machine &machine, const driver_device_config_base &config)
: driver_device(machine, config) { }
extern UINT8 *xxmissio_bgram; UINT8 status;
extern UINT8 *xxmissio_fgram; UINT8 *bgram;
extern UINT8 *xxmissio_spriteram; UINT8 *fgram;
UINT8 *spriteram;
tilemap_t *bg_tilemap;
tilemap_t *fg_tilemap;
UINT8 xscroll;
UINT8 yscroll;
UINT8 flipscreen;
};
/*----------- defined in video/xxmissio.c -----------*/
VIDEO_START( xxmissio ); VIDEO_START( xxmissio );
SCREEN_UPDATE( xxmissio ); SCREEN_UPDATE( xxmissio );

View File

@ -5,13 +5,16 @@ public:
: driver_device(machine, config) { } : driver_device(machine, config) { }
UINT8 *videoram; UINT8 *videoram;
UINT8 *s2636_0_ram;
bitmap_t *spritebitmap;
int CollisionBackground;
int CollisionSprite;
tilemap_t *bg_tilemap;
}; };
/*----------- defined in video/zac2650.c -----------*/ /*----------- defined in video/zac2650.c -----------*/
extern UINT8 *zac2650_s2636_0_ram;
WRITE8_HANDLER( tinvader_videoram_w ); WRITE8_HANDLER( tinvader_videoram_w );
READ8_HANDLER( zac_s2636_r ); READ8_HANDLER( zac_s2636_r );
WRITE8_HANDLER( zac_s2636_w ); WRITE8_HANDLER( zac_s2636_w );

View File

@ -1,6 +1,22 @@
/*----------- defined in video/zaccaria.c -----------*/ class zaccaria_state : public driver_device
{
public:
zaccaria_state(running_machine &machine, const driver_device_config_base &config)
: driver_device(machine, config) { }
extern UINT8 *zaccaria_videoram,*zaccaria_attributesram; int dsw;
int active_8910;
int port0a;
int acs;
int last_port0b;
int toggle;
UINT8 *videoram;
UINT8 *attributesram;
tilemap_t *bg_tilemap;
};
/*----------- defined in video/zaccaria.c -----------*/
PALETTE_INIT( zaccaria ); PALETTE_INIT( zaccaria );
VIDEO_START( zaccaria ); VIDEO_START( zaccaria );

View File

@ -23,15 +23,6 @@
*/ */
/*table holds outputs of all ANDs (after AND map)*/
static UINT8 andmap[64];
/*table holds inputs (ie. not x, x, not q, q) to the AND map*/
static UINT8 columnvalue[32];
/*8 output pins (actually 6 output and 2 input/output)*/
static UINT8 outvalue[8];
/* 64 rows x 32 columns /* 64 rows x 32 columns
** 1 - fuse blown: disconnected from input (equal to 1) ** 1 - fuse blown: disconnected from input (equal to 1)
** 0 - fuse not blown: connected to input (ie. x, not x, q, not q accordingly) ** 0 - fuse not blown: connected to input (ie. x, not x, q, not q accordingly)
@ -105,7 +96,7 @@ static const UINT8 fusemap[64*32]=
}; };
static void update_pal(void) static void update_pal(bagman_state *state)
{ {
UINT16 rowoffs; UINT16 rowoffs;
UINT8 row, column, val; UINT8 row, column, val;
@ -118,91 +109,91 @@ UINT8 row, column, val;
for (column = 0; column < 32; column++) for (column = 0; column < 32; column++)
{ {
if ( fusemap[ rowoffs + column ] == 0 ) if ( fusemap[ rowoffs + column ] == 0 )
val &= columnvalue[column]; val &= state->columnvalue[column];
} }
andmap[row] = val; state->andmap[row] = val;
} }
/* I/O pin #19 */ /* I/O pin #19 */
val = 0; /*prepare for OR*/ val = 0; /*prepare for OR*/
for (row = 1; row < 8; row++) for (row = 1; row < 8; row++)
val |= andmap[row]; val |= state->andmap[row];
if (andmap[0] == 1) if (state->andmap[0] == 1)
{ {
columnvalue[2] = 1-val; state->columnvalue[2] = 1-val;
columnvalue[3] = val; state->columnvalue[3] = val;
outvalue[0] = 1-val; state->outvalue[0] = 1-val;
} }
else else
{ {
/*pin is in INPUT configuration so it doesn't create output...*/ /*pin is in INPUT configuration so it doesn't create output...*/
columnvalue[2] = 0; state->columnvalue[2] = 0;
columnvalue[3] = 1; state->columnvalue[3] = 1;
} }
/* O pin #18 (D1) */ /* O pin #18 (D1) */
val = 0; /*prepare for OR*/ val = 0; /*prepare for OR*/
for (row = 8; row < 16; row++) for (row = 8; row < 16; row++)
val |= andmap[row]; val |= state->andmap[row];
columnvalue[6] = 1-val; state->columnvalue[6] = 1-val;
columnvalue[7] = val; state->columnvalue[7] = val;
outvalue[1] = 1-val; state->outvalue[1] = 1-val;
/* O pin #17 (D2) */ /* O pin #17 (D2) */
val = 0; /*prepare for OR*/ val = 0; /*prepare for OR*/
for (row = 16; row < 24; row++) for (row = 16; row < 24; row++)
val |= andmap[row]; val |= state->andmap[row];
columnvalue[10] = 1-val; state->columnvalue[10] = 1-val;
columnvalue[11] = val; state->columnvalue[11] = val;
outvalue[2] = 1-val; state->outvalue[2] = 1-val;
/* O pin #16 (D3) */ /* O pin #16 (D3) */
val = 0; /*prepare for OR*/ val = 0; /*prepare for OR*/
for (row = 24; row < 32; row++) for (row = 24; row < 32; row++)
val |= andmap[row]; val |= state->andmap[row];
columnvalue[14] = 1-val; state->columnvalue[14] = 1-val;
columnvalue[15] = val; state->columnvalue[15] = val;
outvalue[3] = 1-val; state->outvalue[3] = 1-val;
/* O pin #15 (D4) */ /* O pin #15 (D4) */
val = 0; /*prepare for OR*/ val = 0; /*prepare for OR*/
for (row = 32; row < 40; row++) for (row = 32; row < 40; row++)
val |= andmap[row]; val |= state->andmap[row];
columnvalue[18] = 1-val; state->columnvalue[18] = 1-val;
columnvalue[19] = val; state->columnvalue[19] = val;
outvalue[4] = 1-val; state->outvalue[4] = 1-val;
/* O pin #14 (D5) */ /* O pin #14 (D5) */
val = 0; /*prepare for OR*/ val = 0; /*prepare for OR*/
for (row = 40; row < 48; row++) for (row = 40; row < 48; row++)
val |= andmap[row]; val |= state->andmap[row];
columnvalue[22] = 1-val; state->columnvalue[22] = 1-val;
columnvalue[23] = val; state->columnvalue[23] = val;
outvalue[5] = 1-val; state->outvalue[5] = 1-val;
/* O pin #13 (D6) */ /* O pin #13 (D6) */
val = 0; /*prepare for OR*/ val = 0; /*prepare for OR*/
for (row = 48; row < 56; row++) for (row = 48; row < 56; row++)
val |= andmap[row]; val |= state->andmap[row];
columnvalue[26] = 1-val; state->columnvalue[26] = 1-val;
columnvalue[27] = val; state->columnvalue[27] = val;
outvalue[6] = 1-val; state->outvalue[6] = 1-val;
/* I/O pin #12 */ /* I/O pin #12 */
val = 0; /*prepare for OR*/ val = 0; /*prepare for OR*/
for (row = 57; row < 64; row++) for (row = 57; row < 64; row++)
val |= andmap[row]; val |= state->andmap[row];
if (andmap[56] == 1) if (state->andmap[56] == 1)
{ {
columnvalue[30] = 1-val; state->columnvalue[30] = 1-val;
columnvalue[31] = val; state->columnvalue[31] = val;
outvalue[7] = 1-val; state->outvalue[7] = 1-val;
} }
else else
{ {
/*pin is in INPUT configuration so it doesn't create output...*/ /*pin is in INPUT configuration so it doesn't create output...*/
columnvalue[30] = 0; state->columnvalue[30] = 0;
columnvalue[31] = 1; state->columnvalue[31] = 1;
} }
} }
@ -210,15 +201,17 @@ UINT8 row, column, val;
WRITE8_HANDLER( bagman_pal16r6_w ) WRITE8_HANDLER( bagman_pal16r6_w )
{ {
bagman_state *state = space->machine->driver_data<bagman_state>();
UINT8 line; UINT8 line;
line = offset * 4; line = offset * 4;
columnvalue[line ] = data & 1; state->columnvalue[line ] = data & 1;
columnvalue[line + 1] = 1 - (data & 1); state->columnvalue[line + 1] = 1 - (data & 1);
} }
MACHINE_RESET( bagman ) MACHINE_RESET( bagman )
{ {
bagman_state *state = machine->driver_data<bagman_state>();
address_space *space = cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM); address_space *space = cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM);
bagman_pal16r6_w(space, 0, 1); /*pin 2*/ bagman_pal16r6_w(space, 0, 1); /*pin 2*/
bagman_pal16r6_w(space, 1, 1); /*pin 3*/ bagman_pal16r6_w(space, 1, 1); /*pin 3*/
@ -228,14 +221,15 @@ MACHINE_RESET( bagman )
bagman_pal16r6_w(space, 5, 1); /*pin 7*/ bagman_pal16r6_w(space, 5, 1); /*pin 7*/
bagman_pal16r6_w(space, 6, 1); /*pin 8*/ bagman_pal16r6_w(space, 6, 1); /*pin 8*/
bagman_pal16r6_w(space, 7, 1); /*pin 9*/ bagman_pal16r6_w(space, 7, 1); /*pin 9*/
update_pal(); update_pal(state);
} }
READ8_HANDLER( bagman_pal16r6_r ) READ8_HANDLER( bagman_pal16r6_r )
{ {
update_pal(); bagman_state *state = space->machine->driver_data<bagman_state>();
return (outvalue[6]) + (outvalue[5] << 1) + (outvalue[4] << 2) + update_pal(state);
(outvalue[3] << 3) + (outvalue[2] << 4) + (outvalue[1] << 5); return (state->outvalue[6]) + (state->outvalue[5] << 1) + (state->outvalue[4] << 2) +
(state->outvalue[3] << 3) + (state->outvalue[2] << 4) + (state->outvalue[1] << 5);
/* Bagman schematics show that this is right mapping order of PAL outputs to bits. /* Bagman schematics show that this is right mapping order of PAL outputs to bits.
** This is the PAL 16R6 shown almost in the middle of the schematics. ** This is the PAL 16R6 shown almost in the middle of the schematics.

View File

@ -3,13 +3,6 @@
#include "sound/namco.h" #include "sound/namco.h"
#include "includes/namcos1.h" #include "includes/namcos1.h"
#define NAMCOS1_MAX_BANK 0x400
UINT8 *namcos1_paletteram;
static UINT8 *namcos1_triram;
static UINT8 *s1ram;
/******************************************************************************* /*******************************************************************************
* * * *
@ -17,52 +10,53 @@ static UINT8 *s1ram;
* * * *
*******************************************************************************/ *******************************************************************************/
/* Bank handler definitions */
typedef struct
{
read8_space_func bank_handler_r;
write8_space_func bank_handler_w;
int bank_offset;
UINT8 *bank_pointer;
} bankhandler;
/* hardware elements of 1Mbytes physical memory space */ /* hardware elements of 1Mbytes physical memory space */
static bankhandler namcos1_bank_element[NAMCOS1_MAX_BANK];
static bankhandler namcos1_active_bank[16];
static READ8_HANDLER( bank1_r ) { return (*namcos1_active_bank[0].bank_handler_r )(space, offset + namcos1_active_bank[0].bank_offset); } INLINE UINT8 bank_r(address_space *space, offs_t offset, int bank)
static READ8_HANDLER( bank2_r ) { return (*namcos1_active_bank[1].bank_handler_r )(space, offset + namcos1_active_bank[1].bank_offset); } {
static READ8_HANDLER( bank3_r ) { return (*namcos1_active_bank[2].bank_handler_r )(space, offset + namcos1_active_bank[2].bank_offset); } namcos1_state *state = space->machine->driver_data<namcos1_state>();
static READ8_HANDLER( bank4_r ) { return (*namcos1_active_bank[3].bank_handler_r )(space, offset + namcos1_active_bank[3].bank_offset); } return (*state->active_bank[bank].bank_handler_r )(space, offset + state->active_bank[bank].bank_offset);
static READ8_HANDLER( bank5_r ) { return (*namcos1_active_bank[4].bank_handler_r )(space, offset + namcos1_active_bank[4].bank_offset); } }
static READ8_HANDLER( bank6_r ) { return (*namcos1_active_bank[5].bank_handler_r )(space, offset + namcos1_active_bank[5].bank_offset); }
static READ8_HANDLER( bank7_r ) { return (*namcos1_active_bank[6].bank_handler_r )(space, offset + namcos1_active_bank[6].bank_offset); }
static READ8_HANDLER( bank8_r ) { return (*namcos1_active_bank[7].bank_handler_r )(space, offset + namcos1_active_bank[7].bank_offset); }
static READ8_HANDLER( bank9_r ) { return (*namcos1_active_bank[8].bank_handler_r )(space, offset + namcos1_active_bank[8].bank_offset); }
static READ8_HANDLER( bank10_r ) { return (*namcos1_active_bank[9].bank_handler_r )(space, offset + namcos1_active_bank[9].bank_offset); }
static READ8_HANDLER( bank11_r ) { return (*namcos1_active_bank[10].bank_handler_r)(space, offset + namcos1_active_bank[10].bank_offset); }
static READ8_HANDLER( bank12_r ) { return (*namcos1_active_bank[11].bank_handler_r)(space, offset + namcos1_active_bank[11].bank_offset); }
static READ8_HANDLER( bank13_r ) { return (*namcos1_active_bank[12].bank_handler_r)(space, offset + namcos1_active_bank[12].bank_offset); }
static READ8_HANDLER( bank14_r ) { return (*namcos1_active_bank[13].bank_handler_r)(space, offset + namcos1_active_bank[13].bank_offset); }
static READ8_HANDLER( bank15_r ) { return (*namcos1_active_bank[14].bank_handler_r)(space, offset + namcos1_active_bank[14].bank_offset); }
static READ8_HANDLER( bank16_r ) { return (*namcos1_active_bank[15].bank_handler_r)(space, offset + namcos1_active_bank[15].bank_offset); }
static WRITE8_HANDLER( bank1_w ) { (*namcos1_active_bank[0].bank_handler_w )(space, offset + namcos1_active_bank[0].bank_offset, data); } static READ8_HANDLER( bank1_r ) { return bank_r(space, offset, 0); }
static WRITE8_HANDLER( bank2_w ) { (*namcos1_active_bank[1].bank_handler_w )(space, offset + namcos1_active_bank[1].bank_offset, data); } static READ8_HANDLER( bank2_r ) { return bank_r(space, offset, 1); }
static WRITE8_HANDLER( bank3_w ) { (*namcos1_active_bank[2].bank_handler_w )(space, offset + namcos1_active_bank[2].bank_offset, data); } static READ8_HANDLER( bank3_r ) { return bank_r(space, offset, 2); }
static WRITE8_HANDLER( bank4_w ) { (*namcos1_active_bank[3].bank_handler_w )(space, offset + namcos1_active_bank[3].bank_offset, data); } static READ8_HANDLER( bank4_r ) { return bank_r(space, offset, 3); }
static WRITE8_HANDLER( bank5_w ) { (*namcos1_active_bank[4].bank_handler_w )(space, offset + namcos1_active_bank[4].bank_offset, data); } static READ8_HANDLER( bank5_r ) { return bank_r(space, offset, 4); }
static WRITE8_HANDLER( bank6_w ) { (*namcos1_active_bank[5].bank_handler_w )(space, offset + namcos1_active_bank[5].bank_offset, data); } static READ8_HANDLER( bank6_r ) { return bank_r(space, offset, 5); }
static WRITE8_HANDLER( bank7_w ) { (*namcos1_active_bank[6].bank_handler_w )(space, offset + namcos1_active_bank[6].bank_offset, data); } static READ8_HANDLER( bank7_r ) { return bank_r(space, offset, 6); }
static WRITE8_HANDLER( bank8_w ) { (*namcos1_active_bank[7].bank_handler_w )(space, offset + namcos1_active_bank[7].bank_offset, data); } static READ8_HANDLER( bank8_r ) { return bank_r(space, offset, 7); }
static WRITE8_HANDLER( bank9_w ) { (*namcos1_active_bank[8].bank_handler_w )(space, offset + namcos1_active_bank[8].bank_offset, data); } static READ8_HANDLER( bank9_r ) { return bank_r(space, offset, 8); }
static WRITE8_HANDLER( bank10_w ) { (*namcos1_active_bank[9].bank_handler_w )(space, offset + namcos1_active_bank[9].bank_offset, data); } static READ8_HANDLER( bank10_r ) { return bank_r(space, offset, 9); }
static WRITE8_HANDLER( bank11_w ) { (*namcos1_active_bank[10].bank_handler_w)(space, offset + namcos1_active_bank[10].bank_offset, data); } static READ8_HANDLER( bank11_r ) { return bank_r(space, offset, 10); }
static WRITE8_HANDLER( bank12_w ) { (*namcos1_active_bank[11].bank_handler_w)(space, offset + namcos1_active_bank[11].bank_offset, data); } static READ8_HANDLER( bank12_r ) { return bank_r(space, offset, 11); }
static WRITE8_HANDLER( bank13_w ) { (*namcos1_active_bank[12].bank_handler_w)(space, offset + namcos1_active_bank[12].bank_offset, data); } static READ8_HANDLER( bank13_r ) { return bank_r(space, offset, 12); }
static WRITE8_HANDLER( bank14_w ) { (*namcos1_active_bank[13].bank_handler_w)(space, offset + namcos1_active_bank[13].bank_offset, data); } static READ8_HANDLER( bank14_r ) { return bank_r(space, offset, 13); }
static WRITE8_HANDLER( bank15_w ) { (*namcos1_active_bank[14].bank_handler_w)(space, offset + namcos1_active_bank[14].bank_offset, data); } static READ8_HANDLER( bank15_r ) { return bank_r(space, offset, 14); }
static WRITE8_HANDLER( bank16_w ) { (*namcos1_active_bank[15].bank_handler_w)(space, offset + namcos1_active_bank[15].bank_offset, data); } static READ8_HANDLER( bank16_r ) { return bank_r(space, offset, 15); }
INLINE void bank_w(address_space *space, offs_t offset, UINT8 data, int bank)
{
namcos1_state *state = space->machine->driver_data<namcos1_state>();
(*state->active_bank[bank].bank_handler_w )(space, offset + state->active_bank[bank].bank_offset, data);
}
static WRITE8_HANDLER( bank1_w ) { bank_w(space, offset, data, 0); }
static WRITE8_HANDLER( bank2_w ) { bank_w(space, offset, data, 1); }
static WRITE8_HANDLER( bank3_w ) { bank_w(space, offset, data, 2); }
static WRITE8_HANDLER( bank4_w ) { bank_w(space, offset, data, 3); }
static WRITE8_HANDLER( bank5_w ) { bank_w(space, offset, data, 4); }
static WRITE8_HANDLER( bank6_w ) { bank_w(space, offset, data, 5); }
static WRITE8_HANDLER( bank7_w ) { bank_w(space, offset, data, 6); }
static WRITE8_HANDLER( bank8_w ) { bank_w(space, offset, data, 7); }
static WRITE8_HANDLER( bank9_w ) { bank_w(space, offset, data, 8); }
static WRITE8_HANDLER( bank10_w ) { bank_w(space, offset, data, 9); }
static WRITE8_HANDLER( bank11_w ) { bank_w(space, offset, data, 10); }
static WRITE8_HANDLER( bank12_w ) { bank_w(space, offset, data, 11); }
static WRITE8_HANDLER( bank13_w ) { bank_w(space, offset, data, 12); }
static WRITE8_HANDLER( bank14_w ) { bank_w(space, offset, data, 13); }
static WRITE8_HANDLER( bank15_w ) { bank_w(space, offset, data, 14); }
static WRITE8_HANDLER( bank16_w ) { bank_w(space, offset, data, 15); }
static const read8_space_func io_bank_handler_r[16] = static const read8_space_func io_bank_handler_r[16] =
{ {
@ -89,11 +83,6 @@ static WRITE8_HANDLER( namcos1_3dcs_w )
} }
static int key_id, key_reg, key_rng, key_swap4_arg, key_swap4, key_bottom4, key_top4;
static unsigned int key_quotient, key_reminder, key_numerator_high_word;
static UINT8 key[8];
// used by faceoff and tankforce 4 player (input multiplex) // used by faceoff and tankforce 4 player (input multiplex)
static READ8_HANDLER( faceoff_inputs_r ); static READ8_HANDLER( faceoff_inputs_r );
@ -210,12 +199,13 @@ CPU #0 PC e3d4: keychip read 0003 [AND #$37 = key no.]
*/ */
static READ8_HANDLER( key_type1_r ) static READ8_HANDLER( key_type1_r )
{ {
namcos1_state *state = space->machine->driver_data<namcos1_state>();
// logerror("CPU %s PC %04x: keychip read %04x\n", space->cpu->tag(), cpu_get_pc(space->cpu), offset); // logerror("CPU %s PC %04x: keychip read %04x\n", space->cpu->tag(), cpu_get_pc(space->cpu), offset);
if (offset < 3) if (offset < 3)
{ {
int d = key[0]; int d = state->key[0];
int n = (key[1] << 8) | key[2]; int n = (state->key[1] << 8) | state->key[2];
int q,r; int q,r;
if (d) if (d)
@ -234,17 +224,18 @@ static READ8_HANDLER( key_type1_r )
if (offset == 2) return q & 0xff; if (offset == 2) return q & 0xff;
} }
else if (offset == 3) else if (offset == 3)
return key_id; return state->key_id;
return 0; return 0;
} }
static WRITE8_HANDLER( key_type1_w ) static WRITE8_HANDLER( key_type1_w )
{ {
namcos1_state *state = space->machine->driver_data<namcos1_state>();
// logerror("CPU %s PC %04x: keychip write %04x=%02x\n", space->cpu->tag(), cpu_get_pc(space->cpu), offset, data); // logerror("CPU %s PC %04x: keychip write %04x=%02x\n", space->cpu->tag(), cpu_get_pc(space->cpu), offset, data);
if (offset < 4) if (offset < 4)
key[offset] = data; state->key[offset] = data;
} }
@ -393,50 +384,52 @@ CPU #0 PC e574: keychip read 0001
static READ8_HANDLER( key_type2_r ) static READ8_HANDLER( key_type2_r )
{ {
namcos1_state *state = space->machine->driver_data<namcos1_state>();
// logerror("CPU %s PC %04x: keychip read %04x\n", space->cpu->tag(), cpu_get_pc(space->cpu), offset); // logerror("CPU %s PC %04x: keychip read %04x\n", space->cpu->tag(), cpu_get_pc(space->cpu), offset);
key_numerator_high_word = 0; state->key_numerator_high_word = 0;
if (offset < 4) if (offset < 4)
{ {
if (offset == 0) return key_reminder >> 8; if (offset == 0) return state->key_reminder >> 8;
if (offset == 1) return key_reminder & 0xff; if (offset == 1) return state->key_reminder & 0xff;
if (offset == 2) return key_quotient >> 8; if (offset == 2) return state->key_quotient >> 8;
if (offset == 3) return key_quotient & 0xff; if (offset == 3) return state->key_quotient & 0xff;
} }
else if (offset == 4) else if (offset == 4)
return key_id; return state->key_id;
return 0; return 0;
} }
static WRITE8_HANDLER( key_type2_w ) static WRITE8_HANDLER( key_type2_w )
{ {
namcos1_state *state = space->machine->driver_data<namcos1_state>();
// logerror("CPU %s PC %04x: keychip write %04x=%02x\n", space->cpu->tag(), cpu_get_pc(space->cpu), offset, data); // logerror("CPU %s PC %04x: keychip write %04x=%02x\n", space->cpu->tag(), cpu_get_pc(space->cpu), offset, data);
if (offset < 5) if (offset < 5)
{ {
key[offset] = data; state->key[offset] = data;
if (offset == 3) if (offset == 3)
{ {
unsigned int d = (key[0] << 8) | key[1]; unsigned int d = (state->key[0] << 8) | state->key[1];
unsigned int n = (key_numerator_high_word << 16) | (key[2] << 8) | key[3]; unsigned int n = (state->key_numerator_high_word << 16) | (state->key[2] << 8) | state->key[3];
if (d) if (d)
{ {
key_quotient = n / d; state->key_quotient = n / d;
key_reminder = n % d; state->key_reminder = n % d;
} }
else else
{ {
key_quotient = 0xffff; state->key_quotient = 0xffff;
key_reminder = 0x0000; state->key_reminder = 0x0000;
} }
// logerror("calculating division: %08x / %04x = %04x, %04x\n", n, d, key_quotient, key_reminder); // logerror("calculating division: %08x / %04x = %04x, %04x\n", n, d, key_quotient, state->key_reminder);
key_numerator_high_word = (key[2] << 8) | key[3]; state->key_numerator_high_word = (state->key[2] << 8) | state->key[3];
} }
} }
} }
@ -519,6 +512,7 @@ CPU #0 PC e45a: keychip read 0030 [discarded]
static READ8_HANDLER( key_type3_r ) static READ8_HANDLER( key_type3_r )
{ {
namcos1_state *state = space->machine->driver_data<namcos1_state>();
int op; int op;
// logerror("CPU %s PC %04x: keychip read %04x\n", space->cpu->tag(), cpu_get_pc(space->cpu), offset); // logerror("CPU %s PC %04x: keychip read %04x\n", space->cpu->tag(), cpu_get_pc(space->cpu), offset);
@ -531,11 +525,11 @@ static READ8_HANDLER( key_type3_r )
op = (offset & 0x70) >> 4; op = (offset & 0x70) >> 4;
if (op == key_reg) return key_id; if (op == state->key_reg) return state->key_id;
if (op == key_rng) return space->machine->rand(); if (op == state->key_rng) return space->machine->rand();
if (op == key_swap4) return (key[key_swap4_arg] << 4) | (key[key_swap4_arg] >> 4); if (op == state->key_swap4) return (state->key[state->key_swap4_arg] << 4) | (state->key[state->key_swap4_arg] >> 4);
if (op == key_bottom4) return (offset << 4) | (key[key_swap4_arg] & 0x0f); if (op == state->key_bottom4) return (offset << 4) | (state->key[state->key_swap4_arg] & 0x0f);
if (op == key_top4) return (offset << 4) | (key[key_swap4_arg] >> 4); if (op == state->key_top4) return (offset << 4) | (state->key[state->key_swap4_arg] >> 4);
popmessage("CPU %s PC %08x: keychip read %04x", space->cpu->tag(), cpu_get_pc(space->cpu), offset); popmessage("CPU %s PC %08x: keychip read %04x", space->cpu->tag(), cpu_get_pc(space->cpu), offset);
@ -544,9 +538,10 @@ static READ8_HANDLER( key_type3_r )
static WRITE8_HANDLER( key_type3_w ) static WRITE8_HANDLER( key_type3_w )
{ {
namcos1_state *state = space->machine->driver_data<namcos1_state>();
// logerror("CPU %s PC %04x: keychip write %04x=%02x\n", space->cpu->tag(), cpu_get_pc(space->cpu), offset, data); // logerror("CPU %s PC %04x: keychip write %04x=%02x\n", space->cpu->tag(), cpu_get_pc(space->cpu), offset, data);
key[(offset & 0x70) >> 4] = data; state->key[(offset & 0x70) >> 4] = data;
} }
@ -573,18 +568,15 @@ WRITE8_HANDLER( namcos1_sound_bankswitch_w )
* * * *
*******************************************************************************/ *******************************************************************************/
static int mcu_patch_data;
static int namcos1_reset = 0;
static int wdog;
static int chip[16];
WRITE8_HANDLER( namcos1_cpu_control_w ) WRITE8_HANDLER( namcos1_cpu_control_w )
{ {
namcos1_state *state = space->machine->driver_data<namcos1_state>();
// logerror("reset control pc=%04x %02x\n",cpu_get_pc(space->cpu),data); // logerror("reset control pc=%04x %02x\n",cpu_get_pc(space->cpu),data);
if ((data & 1) ^ namcos1_reset) if ((data & 1) ^ state->reset)
{ {
mcu_patch_data = 0; state->mcu_patch_data = 0;
namcos1_reset = data & 1; state->reset = data & 1;
} }
cputag_set_input_line(space->machine, "sub", INPUT_LINE_RESET, (data & 1) ? CLEAR_LINE : ASSERT_LINE); cputag_set_input_line(space->machine, "sub", INPUT_LINE_RESET, (data & 1) ? CLEAR_LINE : ASSERT_LINE);
@ -596,16 +588,17 @@ WRITE8_HANDLER( namcos1_cpu_control_w )
WRITE8_HANDLER( namcos1_watchdog_w ) WRITE8_HANDLER( namcos1_watchdog_w )
{ {
namcos1_state *state = space->machine->driver_data<namcos1_state>();
if (space->cpu == space->machine->device("maincpu")) if (space->cpu == space->machine->device("maincpu"))
wdog |= 1; state->wdog |= 1;
else if (space->cpu == space->machine->device("sub")) else if (space->cpu == space->machine->device("sub"))
wdog |= 2; state->wdog |= 2;
else if (space->cpu == space->machine->device("audiocpu")) else if (space->cpu == space->machine->device("audiocpu"))
wdog |= 4; state->wdog |= 4;
if (wdog == 7 || !namcos1_reset) if (state->wdog == 7 || !state->reset)
{ {
wdog = 0; state->wdog = 0;
watchdog_reset_w(space,0,0); watchdog_reset_w(space,0,0);
} }
} }
@ -614,6 +607,7 @@ WRITE8_HANDLER( namcos1_watchdog_w )
static READ8_HANDLER( soundram_r ) static READ8_HANDLER( soundram_r )
{ {
namcos1_state *state = space->machine->driver_data<namcos1_state>();
if (offset < 0x1000) if (offset < 0x1000)
{ {
offset &= 0x3ff; offset &= 0x3ff;
@ -626,12 +620,13 @@ static READ8_HANDLER( soundram_r )
offset &= 0x7ff; offset &= 0x7ff;
/* shared ram */ /* shared ram */
return namcos1_triram[offset]; return state->triram[offset];
} }
} }
static WRITE8_HANDLER( soundram_w ) static WRITE8_HANDLER( soundram_w )
{ {
namcos1_state *state = space->machine->driver_data<namcos1_state>();
if (offset < 0x1000) if (offset < 0x1000)
{ {
offset &= 0x3ff; offset &= 0x3ff;
@ -644,7 +639,7 @@ static WRITE8_HANDLER( soundram_w )
offset &= 0x7ff; offset &= 0x7ff;
/* shared ram */ /* shared ram */
namcos1_triram[offset] = data; state->triram[offset] = data;
return; return;
} }
} }
@ -673,6 +668,7 @@ static WRITE8_HANDLER( unknown_w )
/* Main bankswitching routine */ /* Main bankswitching routine */
static void set_bank(running_machine *machine, int banknum, const bankhandler *handler) static void set_bank(running_machine *machine, int banknum, const bankhandler *handler)
{ {
namcos1_state *state = machine->driver_data<namcos1_state>();
static const char *const banktags[] = { static const char *const banktags[] = {
"bank1", "bank2", "bank3", "bank4", "bank5", "bank6", "bank7", "bank8", "bank1", "bank2", "bank3", "bank4", "bank5", "bank6", "bank7", "bank8",
"bank9", "bank10", "bank11", "bank12", "bank13", "bank14", "bank15", "bank16" "bank9", "bank10", "bank11", "bank12", "bank13", "bank14", "bank15", "bank16"
@ -688,12 +684,12 @@ static void set_bank(running_machine *machine, int banknum, const bankhandler *h
/* read handlers */ /* read handlers */
if (!handler->bank_handler_r) if (!handler->bank_handler_r)
{ {
if (namcos1_active_bank[banknum].bank_handler_r) if (state->active_bank[banknum].bank_handler_r)
memory_install_read_bank(space, bankstart, bankstart + 0x1fff, 0, 0, banktags[banknum]); memory_install_read_bank(space, bankstart, bankstart + 0x1fff, 0, 0, banktags[banknum]);
} }
else else
{ {
if (!namcos1_active_bank[banknum].bank_handler_r) if (!state->active_bank[banknum].bank_handler_r)
memory_install_read8_handler(space, bankstart, bankstart + 0x1fff, 0, 0, io_bank_handler_r[banknum]); memory_install_read8_handler(space, bankstart, bankstart + 0x1fff, 0, 0, io_bank_handler_r[banknum]);
} }
@ -702,42 +698,43 @@ static void set_bank(running_machine *machine, int banknum, const bankhandler *h
{ {
if (!handler->bank_handler_w) if (!handler->bank_handler_w)
{ {
if (namcos1_active_bank[banknum].bank_handler_w) if (state->active_bank[banknum].bank_handler_w)
memory_install_write_bank(space, bankstart, bankstart + 0x1fff, 0, 0, banktags[banknum]); memory_install_write_bank(space, bankstart, bankstart + 0x1fff, 0, 0, banktags[banknum]);
} }
else else
{ {
if (!namcos1_active_bank[banknum].bank_handler_r) if (!state->active_bank[banknum].bank_handler_r)
memory_install_write8_handler(space, bankstart, bankstart + 0x1fff, 0, 0, io_bank_handler_w[banknum]); memory_install_write8_handler(space, bankstart, bankstart + 0x1fff, 0, 0, io_bank_handler_w[banknum]);
} }
} }
/* Remember this bank handler */ /* Remember this bank handler */
namcos1_active_bank[banknum] = *handler; state->active_bank[banknum] = *handler;
} }
static void namcos1_bankswitch(running_machine *machine, int cpu, offs_t offset, UINT8 data) static void namcos1_bankswitch(running_machine *machine, int cpu, offs_t offset, UINT8 data)
{ {
namcos1_state *state = machine->driver_data<namcos1_state>();
int bank = (cpu*8) + (( offset >> 9) & 0x07); int bank = (cpu*8) + (( offset >> 9) & 0x07);
if (offset & 1) if (offset & 1)
{ {
chip[bank] &= 0x0300; state->chip[bank] &= 0x0300;
chip[bank] |= (data & 0xff); state->chip[bank] |= (data & 0xff);
} }
else else
{ {
chip[bank] &= 0x00ff; state->chip[bank] &= 0x00ff;
chip[bank] |= (data & 0x03) << 8; state->chip[bank] |= (data & 0x03) << 8;
} }
set_bank(machine, bank, &namcos1_bank_element[chip[bank]]); set_bank(machine, bank, &state->bank_element[state->chip[bank]]);
/* unmapped bank warning */ /* unmapped bank warning */
if( namcos1_active_bank[bank].bank_handler_r == unknown_r) if( state->active_bank[bank].bank_handler_r == unknown_r)
{ {
logerror("%s:warning unknown chip selected bank %x=$%04x\n", machine->describe_context(), bank , chip[bank] ); logerror("%s:warning unknown chip selected bank %x=$%04x\n", machine->describe_context(), bank , state->chip[bank] );
// if (chip) popmessage("%s:unknown chip selected bank %x=$%04x", cpu , machine->describe_context(), bank , chip[bank] ); // if (state->chip) popmessage("%s:unknown chip selected bank %x=$%04x", cpu , machine->describe_context(), bank , state->chip[bank] );
} }
} }
@ -764,16 +761,16 @@ WRITE8_HANDLER( namcos1_subcpu_bank_w )
* * * *
*******************************************************************************/ *******************************************************************************/
static void namcos1_install_bank(int start,int end,read8_space_func hr,write8_space_func hw, static void namcos1_install_bank(namcos1_state *state, int start,int end,read8_space_func hr,write8_space_func hw,
int offset,UINT8 *pointer) int offset,UINT8 *pointer)
{ {
int i; int i;
for(i=start;i<=end;i++) for(i=start;i<=end;i++)
{ {
namcos1_bank_element[i].bank_handler_r = hr; state->bank_element[i].bank_handler_r = hr;
namcos1_bank_element[i].bank_handler_w = hw; state->bank_element[i].bank_handler_w = hw;
namcos1_bank_element[i].bank_offset = offset; state->bank_element[i].bank_offset = offset;
namcos1_bank_element[i].bank_pointer = pointer; state->bank_element[i].bank_pointer = pointer;
offset += 0x2000; offset += 0x2000;
if(pointer) pointer += 0x2000; if(pointer) pointer += 0x2000;
} }
@ -783,6 +780,7 @@ static void namcos1_install_bank(int start,int end,read8_space_func hr,write8_sp
static void namcos1_build_banks(running_machine *machine,read8_space_func key_r,write8_space_func key_w) static void namcos1_build_banks(running_machine *machine,read8_space_func key_r,write8_space_func key_w)
{ {
namcos1_state *state = machine->driver_data<namcos1_state>();
int i; int i;
/**** kludge alert ****/ /**** kludge alert ****/
@ -806,30 +804,30 @@ static void namcos1_build_banks(running_machine *machine,read8_space_func key_r,
/* clear all banks to unknown area */ /* clear all banks to unknown area */
for(i = 0;i < NAMCOS1_MAX_BANK;i++) for(i = 0;i < NAMCOS1_MAX_BANK;i++)
namcos1_install_bank(i,i,0,unknown_w,0,dummyrom); namcos1_install_bank(state,i,i,0,unknown_w,0,dummyrom);
/**** end of kludge alert ****/ /**** end of kludge alert ****/
/* 3D glasses */ /* 3D glasses */
namcos1_install_bank(0x160,0x160,0,namcos1_3dcs_w,0,0); namcos1_install_bank(state,0x160,0x160,0,namcos1_3dcs_w,0,0);
/* RAM 6 banks - palette */ /* RAM 6 banks - palette */
namcos1_install_bank(0x170,0x173,0,namcos1_paletteram_w,0,namcos1_paletteram); namcos1_install_bank(state,0x170,0x173,0,namcos1_paletteram_w,0,state->paletteram);
/* RAM 5 banks - videoram */ /* RAM 5 banks - videoram */
namcos1_install_bank(0x178,0x17b,namcos1_videoram_r,namcos1_videoram_w,0,0); namcos1_install_bank(state,0x178,0x17b,namcos1_videoram_r,namcos1_videoram_w,0,0);
/* key chip bank */ /* key chip bank */
namcos1_install_bank(0x17c,0x17c,key_r,key_w,0,0); namcos1_install_bank(state,0x17c,0x17c,key_r,key_w,0,0);
/* RAM 7 banks - display control, playfields, sprites */ /* RAM 7 banks - display control, playfields, sprites */
namcos1_install_bank(0x17e,0x17e,namcos1_spriteram_r,namcos1_spriteram_w,0,0); namcos1_install_bank(state,0x17e,0x17e,namcos1_spriteram_r,namcos1_spriteram_w,0,0);
/* RAM 1 shared ram, PSG device */ /* RAM 1 shared ram, PSG device */
namcos1_install_bank(0x17f,0x17f,soundram_r,soundram_w,0,0); namcos1_install_bank(state,0x17f,0x17f,soundram_r,soundram_w,0,0);
/* RAM 3 banks */ /* RAM 3 banks */
namcos1_install_bank(0x180,0x183,0,0,0,s1ram); namcos1_install_bank(state,0x180,0x183,0,0,0,state->s1ram);
/* PRG0-PRG7 */ /* PRG0-PRG7 */
{ {
UINT8 *rom = machine->region("user1")->base(); UINT8 *rom = machine->region("user1")->base();
namcos1_install_bank(0x200,0x3ff,0,rom_w,0,rom); namcos1_install_bank(state,0x200,0x3ff,0,rom_w,0,rom);
/* bit 16 of the address is inverted for PRG7 (and bits 17,18 just not connected) */ /* bit 16 of the address is inverted for PRG7 (and bits 17,18 just not connected) */
for (i = 0x380000;i < 0x400000;i++) for (i = 0x380000;i < 0x400000;i++)
@ -846,6 +844,7 @@ static void namcos1_build_banks(running_machine *machine,read8_space_func key_r,
MACHINE_RESET( namcos1 ) MACHINE_RESET( namcos1 )
{ {
namcos1_state *state = machine->driver_data<namcos1_state>();
static const bankhandler unknown_handler = { unknown_r, unknown_w, 0, NULL }; static const bankhandler unknown_handler = { unknown_r, unknown_w, 0, NULL };
int bank; int bank;
@ -876,13 +875,13 @@ MACHINE_RESET( namcos1 )
cputag_set_input_line(machine, "mcu", INPUT_LINE_RESET, ASSERT_LINE); cputag_set_input_line(machine, "mcu", INPUT_LINE_RESET, ASSERT_LINE);
/* mcu patch data clear */ /* mcu patch data clear */
mcu_patch_data = 0; state->mcu_patch_data = 0;
namcos1_reset = 0; state->reset = 0;
namcos1_init_DACs(); namcos1_init_DACs(machine);
memset(key, 0, sizeof(key)); memset(state->key, 0, sizeof(state->key));
memset(chip, 0, sizeof(chip)); memset(state->chip, 0, sizeof(state->chip));
wdog = 0; state->wdog = 0;
} }
@ -938,10 +937,11 @@ WRITE8_HANDLER( namcos1_mcu_bankswitch_w )
WRITE8_HANDLER( namcos1_mcu_patch_w ) WRITE8_HANDLER( namcos1_mcu_patch_w )
{ {
namcos1_state *state = space->machine->driver_data<namcos1_state>();
//logerror("mcu C000 write pc=%04x data=%02x\n",cpu_get_pc(space->cpu),data); //logerror("mcu C000 write pc=%04x data=%02x\n",cpu_get_pc(space->cpu),data);
if (mcu_patch_data == 0xa6) return; if (state->mcu_patch_data == 0xa6) return;
mcu_patch_data = data; state->mcu_patch_data = data;
namcos1_triram[0] = data; state->triram[0] = data;
} }
@ -967,6 +967,7 @@ struct namcos1_specific
static void namcos1_driver_init( running_machine *machine, const struct namcos1_specific *specific ) static void namcos1_driver_init( running_machine *machine, const struct namcos1_specific *specific )
{ {
namcos1_state *state = machine->driver_data<namcos1_state>();
static const struct namcos1_specific no_key = static const struct namcos1_specific no_key =
{ {
no_key_r,no_key_w no_key_r,no_key_w
@ -975,28 +976,28 @@ static void namcos1_driver_init( running_machine *machine, const struct namcos1_
if (!specific) specific = &no_key; if (!specific) specific = &no_key;
/* keychip id */ /* keychip id */
key_id = specific->key_id; state->key_id = specific->key_id;
/* for key type 3 */ /* for key type 3 */
key_reg = specific->key_reg1; state->key_reg = specific->key_reg1;
key_rng = specific->key_reg2; state->key_rng = specific->key_reg2;
key_swap4_arg = specific->key_reg3; state->key_swap4_arg = specific->key_reg3;
key_swap4 = specific->key_reg4; state->key_swap4 = specific->key_reg4;
key_bottom4 = specific->key_reg5; state->key_bottom4 = specific->key_reg5;
key_top4 = specific->key_reg6; state->key_top4 = specific->key_reg6;
/* S1 RAM pointer set */ /* S1 RAM pointer set */
s1ram = auto_alloc_array(machine, UINT8, 0x8000); state->s1ram = auto_alloc_array(machine, UINT8, 0x8000);
namcos1_triram = auto_alloc_array(machine, UINT8, 0x800); state->triram = auto_alloc_array(machine, UINT8, 0x800);
namcos1_paletteram = auto_alloc_array(machine, UINT8, 0x8000); state->paletteram = auto_alloc_array(machine, UINT8, 0x8000);
/* Register volatile user memory for save state */ /* Register volatile user memory for save state */
state_save_register_global_pointer(machine, s1ram, 0x8000); state_save_register_global_pointer(machine, state->s1ram, 0x8000);
state_save_register_global_pointer(machine, namcos1_triram, 0x800); state_save_register_global_pointer(machine, state->triram, 0x800);
state_save_register_global_pointer(machine, namcos1_paletteram, 0x8000); state_save_register_global_pointer(machine, state->paletteram, 0x8000);
/* Point mcu & sound shared RAM to destination */ /* Point mcu & sound shared RAM to destination */
memory_set_bankptr(machine, "bank18", namcos1_triram ); memory_set_bankptr(machine, "bank18", state->triram );
memory_set_bankptr(machine, "bank19", namcos1_triram ); memory_set_bankptr(machine, "bank19", state->triram );
/* build bank elements */ /* build bank elements */
namcos1_build_banks(machine,specific->key_r,specific->key_w); namcos1_build_banks(machine,specific->key_r,specific->key_w);

View File

@ -11,47 +11,23 @@
#include "includes/slapfght.h" #include "includes/slapfght.h"
static int slapfight_status;
static int getstar_sequence_index;
static int getstar_sh_intenabled;
static int slapfight_status_state;
static UINT8 mcu_val;
/* used for MCU simulation of 'getstar' and its clones */
static UINT8 getstar_cmd;
/* copy of some Z80 registers for 'getstar' and its clones */
static UINT8 gs_a, gs_d, gs_e;
/* used for MCU simulation of 'tigerhb1' */
static UINT8 tigerhb_cmd;
static UINT8 from_main, from_mcu;
static int mcu_sent = 0, main_sent = 0;
static UINT8 portA_in, portA_out, ddrA;
static UINT8 portB_in, portB_out, ddrB;
static UINT8 portC_in, portC_out, ddrC;
/* Perform basic machine initialisation */ /* Perform basic machine initialisation */
MACHINE_RESET( slapfight ) MACHINE_RESET( slapfight )
{ {
slapfght_state *state = machine->driver_data<slapfght_state>();
/* MAIN CPU */ /* MAIN CPU */
slapfight_status_state=0; state->slapfight_status_state=0;
slapfight_status = 0xc7; state->slapfight_status = 0xc7;
getstar_sequence_index = 0; state->getstar_sequence_index = 0;
getstar_sh_intenabled = 0; /* disable sound cpu interrupts */ state->getstar_sh_intenabled = 0; /* disable sound cpu interrupts */
/* SOUND CPU */ /* SOUND CPU */
cputag_set_input_line(machine, "audiocpu", INPUT_LINE_RESET, ASSERT_LINE); cputag_set_input_line(machine, "audiocpu", INPUT_LINE_RESET, ASSERT_LINE);
/* MCU */ /* MCU */
mcu_val = 0; state->mcu_val = 0;
} }
/* Slapfight CPU input/output ports /* Slapfight CPU input/output ports
@ -63,8 +39,9 @@ MACHINE_RESET( slapfight )
/* Reset and hold sound CPU */ /* Reset and hold sound CPU */
WRITE8_HANDLER( slapfight_port_00_w ) WRITE8_HANDLER( slapfight_port_00_w )
{ {
slapfght_state *state = space->machine->driver_data<slapfght_state>();
cputag_set_input_line(space->machine, "audiocpu", INPUT_LINE_RESET, ASSERT_LINE); cputag_set_input_line(space->machine, "audiocpu", INPUT_LINE_RESET, ASSERT_LINE);
getstar_sh_intenabled = 0; state->getstar_sh_intenabled = 0;
} }
/* Release reset on sound CPU */ /* Release reset on sound CPU */
@ -103,111 +80,124 @@ WRITE8_HANDLER( slapfight_port_09_w )
/* Status register */ /* Status register */
READ8_HANDLER( slapfight_port_00_r ) READ8_HANDLER( slapfight_port_00_r )
{ {
slapfght_state *state = space->machine->driver_data<slapfght_state>();
static const int states[3]={ 0xc7, 0x55, 0x00 }; static const int states[3]={ 0xc7, 0x55, 0x00 };
slapfight_status = states[slapfight_status_state]; state->slapfight_status = states[state->slapfight_status_state];
slapfight_status_state++; state->slapfight_status_state++;
if (slapfight_status_state > 2) slapfight_status_state = 0; if (state->slapfight_status_state > 2) state->slapfight_status_state = 0;
return slapfight_status; return state->slapfight_status;
} }
READ8_HANDLER( slapfight_68705_portA_r ) READ8_HANDLER( slapfight_68705_portA_r )
{ {
return (portA_out & ddrA) | (portA_in & ~ddrA); slapfght_state *state = space->machine->driver_data<slapfght_state>();
return (state->portA_out & state->ddrA) | (state->portA_in & ~state->ddrA);
} }
WRITE8_HANDLER( slapfight_68705_portA_w ) WRITE8_HANDLER( slapfight_68705_portA_w )
{ {
portA_out = data; slapfght_state *state = space->machine->driver_data<slapfght_state>();
state->portA_out = data;
} }
WRITE8_HANDLER( slapfight_68705_ddrA_w ) WRITE8_HANDLER( slapfight_68705_ddrA_w )
{ {
ddrA = data; slapfght_state *state = space->machine->driver_data<slapfght_state>();
state->ddrA = data;
} }
READ8_HANDLER( slapfight_68705_portB_r ) READ8_HANDLER( slapfight_68705_portB_r )
{ {
return (portB_out & ddrB) | (portB_in & ~ddrB); slapfght_state *state = space->machine->driver_data<slapfght_state>();
return (state->portB_out & state->ddrB) | (state->portB_in & ~state->ddrB);
} }
WRITE8_HANDLER( slapfight_68705_portB_w ) WRITE8_HANDLER( slapfight_68705_portB_w )
{ {
if ((ddrB & 0x02) && (~data & 0x02) && (portB_out & 0x02)) slapfght_state *state = space->machine->driver_data<slapfght_state>();
if ((state->ddrB & 0x02) && (~data & 0x02) && (state->portB_out & 0x02))
{ {
portA_in = from_main; state->portA_in = state->from_main;
if (main_sent) if (state->main_sent)
cputag_set_input_line(space->machine, "mcu", 0, CLEAR_LINE); cputag_set_input_line(space->machine, "mcu", 0, CLEAR_LINE);
main_sent = 0; state->main_sent = 0;
} }
if ((ddrB & 0x04) && (data & 0x04) && (~portB_out & 0x04)) if ((state->ddrB & 0x04) && (data & 0x04) && (~state->portB_out & 0x04))
{ {
from_mcu = portA_out; state->from_mcu = state->portA_out;
mcu_sent = 1; state->mcu_sent = 1;
} }
if ((ddrB & 0x08) && (~data & 0x08) && (portB_out & 0x08)) if ((state->ddrB & 0x08) && (~data & 0x08) && (state->portB_out & 0x08))
{ {
*slapfight_scrollx_lo = portA_out; *state->slapfight_scrollx_lo = state->portA_out;
} }
if ((ddrB & 0x10) && (~data & 0x10) && (portB_out & 0x10)) if ((state->ddrB & 0x10) && (~data & 0x10) && (state->portB_out & 0x10))
{ {
*slapfight_scrollx_hi = portA_out; *state->slapfight_scrollx_hi = state->portA_out;
} }
portB_out = data; state->portB_out = data;
} }
WRITE8_HANDLER( slapfight_68705_ddrB_w ) WRITE8_HANDLER( slapfight_68705_ddrB_w )
{ {
ddrB = data; slapfght_state *state = space->machine->driver_data<slapfght_state>();
state->ddrB = data;
} }
READ8_HANDLER( slapfight_68705_portC_r ) READ8_HANDLER( slapfight_68705_portC_r )
{ {
portC_in = 0; slapfght_state *state = space->machine->driver_data<slapfght_state>();
state->portC_in = 0;
if (main_sent) if (state->main_sent)
portC_in |= 0x01; state->portC_in |= 0x01;
if (!mcu_sent) if (!state->mcu_sent)
portC_in |= 0x02; state->portC_in |= 0x02;
return (portC_out & ddrC) | (portC_in & ~ddrC); return (state->portC_out & state->ddrC) | (state->portC_in & ~state->ddrC);
} }
WRITE8_HANDLER( slapfight_68705_portC_w ) WRITE8_HANDLER( slapfight_68705_portC_w )
{ {
portC_out = data; slapfght_state *state = space->machine->driver_data<slapfght_state>();
state->portC_out = data;
} }
WRITE8_HANDLER( slapfight_68705_ddrC_w ) WRITE8_HANDLER( slapfight_68705_ddrC_w )
{ {
ddrC = data; slapfght_state *state = space->machine->driver_data<slapfght_state>();
state->ddrC = data;
} }
WRITE8_HANDLER( slapfight_mcu_w ) WRITE8_HANDLER( slapfight_mcu_w )
{ {
from_main = data; slapfght_state *state = space->machine->driver_data<slapfght_state>();
main_sent = 1; state->from_main = data;
state->main_sent = 1;
cputag_set_input_line(space->machine, "mcu", 0, ASSERT_LINE); cputag_set_input_line(space->machine, "mcu", 0, ASSERT_LINE);
} }
READ8_HANDLER( slapfight_mcu_r ) READ8_HANDLER( slapfight_mcu_r )
{ {
mcu_sent = 0; slapfght_state *state = space->machine->driver_data<slapfght_state>();
return from_mcu; state->mcu_sent = 0;
return state->from_mcu;
} }
READ8_HANDLER( slapfight_mcu_status_r ) READ8_HANDLER( slapfight_mcu_status_r )
{ {
slapfght_state *state = space->machine->driver_data<slapfght_state>();
int res = 0; int res = 0;
if (!main_sent) if (!state->main_sent)
res |= 0x02; res |= 0x02;
if (!mcu_sent) if (!state->mcu_sent)
res |= 0x04; res |= 0x04;
return res; return res;
@ -221,80 +211,81 @@ READ8_HANDLER( slapfight_mcu_status_r )
READ8_HANDLER( getstar_e803_r ) READ8_HANDLER( getstar_e803_r )
{ {
slapfght_state *state = space->machine->driver_data<slapfght_state>();
UINT16 tmp = 0; /* needed for values computed on 16 bits */ UINT16 tmp = 0; /* needed for values computed on 16 bits */
UINT8 getstar_val = 0; UINT8 getstar_val = 0;
UINT8 phase_lookup_table[] = {0x00, 0x01, 0x03, 0xff, 0xff, 0x02, 0x05, 0xff, 0xff, 0x05}; /* table at 0x0e05 in 'gtstarb1' */ UINT8 phase_lookup_table[] = {0x00, 0x01, 0x03, 0xff, 0xff, 0x02, 0x05, 0xff, 0xff, 0x05}; /* table at 0x0e05 in 'gtstarb1' */
UINT8 lives_lookup_table[] = {0x03, 0x05, 0x01, 0x02}; /* table at 0x0e62 in 'gtstarb1' */ UINT8 lives_lookup_table[] = {0x03, 0x05, 0x01, 0x02}; /* table at 0x0e62 in 'gtstarb1' */
UINT8 lgsb2_lookup_table[] = {0x00, 0x03, 0x04, 0x05}; /* fake tanle for "test mode" in 'gtstarb2' */ UINT8 lgsb2_lookup_table[] = {0x00, 0x03, 0x04, 0x05}; /* fake tanle for "test mode" in 'gtstarb2' */
switch (getstar_id) switch (state->getstar_id)
{ {
case GETSTAR: case GETSTAR:
case GETSTARJ: case GETSTARJ:
switch (getstar_cmd) switch (state->getstar_cmd)
{ {
case 0x20: /* continue play */ case 0x20: /* continue play */
getstar_val = ((gs_a & 0x30) == 0x30) ? 0x20 : 0x80; getstar_val = ((state->gs_a & 0x30) == 0x30) ? 0x20 : 0x80;
break; break;
case 0x21: /* lose life */ case 0x21: /* lose life */
getstar_val = (gs_a << 1) | (gs_a >> 7); getstar_val = (state->gs_a << 1) | (state->gs_a >> 7);
break; break;
case 0x22: /* starting difficulty */ case 0x22: /* starting difficulty */
getstar_val = ((gs_a & 0x0c) >> 2) + 1; getstar_val = ((state->gs_a & 0x0c) >> 2) + 1;
break; break;
case 0x23: /* starting lives */ case 0x23: /* starting lives */
getstar_val = lives_lookup_table[gs_a]; getstar_val = lives_lookup_table[state->gs_a];
break; break;
case 0x24: /* game phase */ case 0x24: /* game phase */
getstar_val = phase_lookup_table[((gs_a & 0x18) >> 1) | (gs_a & 0x03)]; getstar_val = phase_lookup_table[((state->gs_a & 0x18) >> 1) | (state->gs_a & 0x03)];
break; break;
case 0x25: /* players inputs */ case 0x25: /* players inputs */
getstar_val = BITSWAP8(gs_a, 3, 2, 1, 0, 7, 5, 6, 4); getstar_val = BITSWAP8(state->gs_a, 3, 2, 1, 0, 7, 5, 6, 4);
break; break;
case 0x26: /* background (1st read) */ case 0x26: /* background (1st read) */
tmp = 0x8800 + (0x001f * gs_a); tmp = 0x8800 + (0x001f * state->gs_a);
getstar_val = (tmp & 0x00ff) >> 0; getstar_val = (tmp & 0x00ff) >> 0;
getstar_cmd |= 0x80; /* to allow a second consecutive read */ state->getstar_cmd |= 0x80; /* to allow a second consecutive read */
break; break;
case 0xa6: /* background (2nd read) */ case 0xa6: /* background (2nd read) */
tmp = 0x8800 + (0x001f * gs_a); tmp = 0x8800 + (0x001f * state->gs_a);
getstar_val = (tmp & 0xff00) >> 8; getstar_val = (tmp & 0xff00) >> 8;
break; break;
case 0x29: /* unknown effect */ case 0x29: /* unknown effect */
getstar_val = 0x00; getstar_val = 0x00;
break; break;
case 0x2a: /* change player (if 2 players game) */ case 0x2a: /* change player (if 2 players game) */
getstar_val = (gs_a ^ 0x40); getstar_val = (state->gs_a ^ 0x40);
break; break;
case 0x37: /* foreground (1st read) */ case 0x37: /* foreground (1st read) */
tmp = ((0xd0 + ((gs_e >> 2) & 0x0f)) << 8) | (0x40 * (gs_e & 03) + gs_d); tmp = ((0xd0 + ((state->gs_e >> 2) & 0x0f)) << 8) | (0x40 * (state->gs_e & 03) + state->gs_d);
getstar_val = (tmp & 0x00ff) >> 0; getstar_val = (tmp & 0x00ff) >> 0;
getstar_cmd |= 0x80; /* to allow a second consecutive read */ state->getstar_cmd |= 0x80; /* to allow a second consecutive read */
break; break;
case 0xb7: /* foreground (2nd read) */ case 0xb7: /* foreground (2nd read) */
tmp = ((0xd0 + ((gs_e >> 2) & 0x0f)) << 8) | (0x40 * (gs_e & 03) + gs_d); tmp = ((0xd0 + ((state->gs_e >> 2) & 0x0f)) << 8) | (0x40 * (state->gs_e & 03) + state->gs_d);
getstar_val = (tmp & 0xff00) >> 8; getstar_val = (tmp & 0xff00) >> 8;
break; break;
case 0x38: /* laser position (1st read) */ case 0x38: /* laser position (1st read) */
tmp = 0xf740 - (((gs_e >> 4) << 8) | ((gs_e & 0x08) ? 0x80 : 0x00)) + (0x02 + (gs_d >> 2)); tmp = 0xf740 - (((state->gs_e >> 4) << 8) | ((state->gs_e & 0x08) ? 0x80 : 0x00)) + (0x02 + (state->gs_d >> 2));
getstar_val = (tmp & 0x00ff) >> 0; getstar_val = (tmp & 0x00ff) >> 0;
getstar_cmd |= 0x80; /* to allow a second consecutive read */ state->getstar_cmd |= 0x80; /* to allow a second consecutive read */
break; break;
case 0xb8: /* laser position (2nd read) */ case 0xb8: /* laser position (2nd read) */
tmp = 0xf740 - (((gs_e >> 4) << 8) | ((gs_e & 0x08) ? 0x80 : 0x00)) + (0x02 + (gs_d >> 2)); tmp = 0xf740 - (((state->gs_e >> 4) << 8) | ((state->gs_e & 0x08) ? 0x80 : 0x00)) + (0x02 + (state->gs_d >> 2));
getstar_val = (tmp & 0xff00) >> 8; getstar_val = (tmp & 0xff00) >> 8;
break; break;
case 0x73: /* avoid "BAD HW" message */ case 0x73: /* avoid "BAD HW" message */
getstar_val = 0x76; getstar_val = 0x76;
break; break;
default: default:
logerror("%04x: getstar_e803_r - cmd = %02x\n",cpu_get_pc(space->cpu),getstar_cmd); logerror("%04x: getstar_e803_r - cmd = %02x\n",cpu_get_pc(space->cpu),state->getstar_cmd);
break; break;
} }
break; break;
case GTSTARB1: case GTSTARB1:
/* value isn't computed by the bootleg but we want to please the "test mode" */ /* value isn't computed by the bootleg but we want to please the "test mode" */
if (cpu_get_pc(space->cpu) == 0x6b04) return (lives_lookup_table[gs_a]); if (cpu_get_pc(space->cpu) == 0x6b04) return (lives_lookup_table[state->gs_a]);
break; break;
case GTSTARB2: case GTSTARB2:
/* /*
@ -311,10 +302,10 @@ READ8_HANDLER( getstar_e803_r )
if (cpu_get_pc(space->cpu) == 0x0570) return (getstar_val+1); if (cpu_get_pc(space->cpu) == 0x0570) return (getstar_val+1);
if (cpu_get_pc(space->cpu) == 0x0577) return ((getstar_val+0x05) ^ 0x56); if (cpu_get_pc(space->cpu) == 0x0577) return ((getstar_val+0x05) ^ 0x56);
/* value isn't computed by the bootleg but we want to please the "test mode" */ /* value isn't computed by the bootleg but we want to please the "test mode" */
if (cpu_get_pc(space->cpu) == 0x6b04) return (lgsb2_lookup_table[gs_a]); if (cpu_get_pc(space->cpu) == 0x6b04) return (lgsb2_lookup_table[state->gs_a]);
break; break;
default: default:
logerror("%04x: getstar_e803_r - cmd = %02x - unknown set !\n",cpu_get_pc(space->cpu),getstar_cmd); logerror("%04x: getstar_e803_r - cmd = %02x - unknown set !\n",cpu_get_pc(space->cpu),state->getstar_cmd);
break; break;
} }
return getstar_val; return getstar_val;
@ -322,189 +313,190 @@ READ8_HANDLER( getstar_e803_r )
WRITE8_HANDLER( getstar_e803_w ) WRITE8_HANDLER( getstar_e803_w )
{ {
switch (getstar_id) slapfght_state *state = space->machine->driver_data<slapfght_state>();
switch (state->getstar_id)
{ {
case GETSTAR: case GETSTAR:
/* unknown effect - not read back */ /* unknown effect - not read back */
if (cpu_get_pc(space->cpu) == 0x00bf) if (cpu_get_pc(space->cpu) == 0x00bf)
{ {
getstar_cmd = 0x00; state->getstar_cmd = 0x00;
GS_RESET_REGS GS_RESET_REGS
} }
/* players inputs */ /* players inputs */
if (cpu_get_pc(space->cpu) == 0x0560) if (cpu_get_pc(space->cpu) == 0x0560)
{ {
getstar_cmd = 0x25; state->getstar_cmd = 0x25;
GS_RESET_REGS GS_RESET_REGS
} }
if (cpu_get_pc(space->cpu) == 0x056d) if (cpu_get_pc(space->cpu) == 0x056d)
{ {
getstar_cmd = 0x25; state->getstar_cmd = 0x25;
GS_SAVE_REGS GS_SAVE_REGS
} }
/* lose life */ /* lose life */
if (cpu_get_pc(space->cpu) == 0x0a0a) if (cpu_get_pc(space->cpu) == 0x0a0a)
{ {
getstar_cmd = 0x21; state->getstar_cmd = 0x21;
GS_RESET_REGS GS_RESET_REGS
} }
if (cpu_get_pc(space->cpu) == 0x0a17) if (cpu_get_pc(space->cpu) == 0x0a17)
{ {
getstar_cmd = 0x21; state->getstar_cmd = 0x21;
GS_SAVE_REGS GS_SAVE_REGS
} }
/* unknown effect */ /* unknown effect */
if (cpu_get_pc(space->cpu) == 0x0a51) if (cpu_get_pc(space->cpu) == 0x0a51)
{ {
getstar_cmd = 0x29; state->getstar_cmd = 0x29;
GS_RESET_REGS GS_RESET_REGS
} }
if (cpu_get_pc(space->cpu) == 0x0a6e) if (cpu_get_pc(space->cpu) == 0x0a6e)
{ {
getstar_cmd = 0x29; state->getstar_cmd = 0x29;
GS_SAVE_REGS GS_SAVE_REGS
} }
/* continue play */ /* continue play */
if (cpu_get_pc(space->cpu) == 0x0ae3) if (cpu_get_pc(space->cpu) == 0x0ae3)
{ {
getstar_cmd = 0x20; state->getstar_cmd = 0x20;
GS_RESET_REGS GS_RESET_REGS
} }
if (cpu_get_pc(space->cpu) == 0x0af0) if (cpu_get_pc(space->cpu) == 0x0af0)
{ {
getstar_cmd = 0x20; state->getstar_cmd = 0x20;
GS_SAVE_REGS GS_SAVE_REGS
} }
/* unknown effect - not read back */ /* unknown effect - not read back */
if (cpu_get_pc(space->cpu) == 0x0b62) if (cpu_get_pc(space->cpu) == 0x0b62)
{ {
getstar_cmd = 0x00; /* 0x1f */ state->getstar_cmd = 0x00; /* 0x1f */
GS_RESET_REGS GS_RESET_REGS
} }
/* change player (if 2 players game) */ /* change player (if 2 players game) */
if (cpu_get_pc(space->cpu) == 0x0bab) if (cpu_get_pc(space->cpu) == 0x0bab)
{ {
getstar_cmd = 0x2a; state->getstar_cmd = 0x2a;
GS_RESET_REGS GS_RESET_REGS
} }
if (cpu_get_pc(space->cpu) == 0x0bb8) if (cpu_get_pc(space->cpu) == 0x0bb8)
{ {
getstar_cmd = 0x2a; state->getstar_cmd = 0x2a;
GS_SAVE_REGS GS_SAVE_REGS
} }
/* game phase */ /* game phase */
if (cpu_get_pc(space->cpu) == 0x0d37) if (cpu_get_pc(space->cpu) == 0x0d37)
{ {
getstar_cmd = 0x24; state->getstar_cmd = 0x24;
GS_RESET_REGS GS_RESET_REGS
} }
if (cpu_get_pc(space->cpu) == 0x0d44) if (cpu_get_pc(space->cpu) == 0x0d44)
{ {
getstar_cmd = 0x24; state->getstar_cmd = 0x24;
GS_SAVE_REGS GS_SAVE_REGS
} }
/* starting lives */ /* starting lives */
if (cpu_get_pc(space->cpu) == 0x0d79) if (cpu_get_pc(space->cpu) == 0x0d79)
{ {
getstar_cmd = 0x23; state->getstar_cmd = 0x23;
GS_RESET_REGS GS_RESET_REGS
} }
if (cpu_get_pc(space->cpu) == 0x0d8a) if (cpu_get_pc(space->cpu) == 0x0d8a)
{ {
getstar_cmd = 0x23; state->getstar_cmd = 0x23;
GS_SAVE_REGS GS_SAVE_REGS
} }
/* starting difficulty */ /* starting difficulty */
if (cpu_get_pc(space->cpu) == 0x0dc1) if (cpu_get_pc(space->cpu) == 0x0dc1)
{ {
getstar_cmd = 0x22; state->getstar_cmd = 0x22;
GS_RESET_REGS GS_RESET_REGS
} }
if (cpu_get_pc(space->cpu) == 0x0dd0) if (cpu_get_pc(space->cpu) == 0x0dd0)
{ {
getstar_cmd = 0x22; state->getstar_cmd = 0x22;
GS_SAVE_REGS GS_SAVE_REGS
} }
/* starting lives (again) */ /* starting lives (again) */
if (cpu_get_pc(space->cpu) == 0x1011) if (cpu_get_pc(space->cpu) == 0x1011)
{ {
getstar_cmd = 0x23; state->getstar_cmd = 0x23;
GS_RESET_REGS GS_RESET_REGS
} }
if (cpu_get_pc(space->cpu) == 0x101e) if (cpu_get_pc(space->cpu) == 0x101e)
{ {
getstar_cmd = 0x23; state->getstar_cmd = 0x23;
GS_SAVE_REGS GS_SAVE_REGS
} }
/* hardware test */ /* hardware test */
if (cpu_get_pc(space->cpu) == 0x107a) if (cpu_get_pc(space->cpu) == 0x107a)
{ {
getstar_cmd = 0x73; state->getstar_cmd = 0x73;
GS_RESET_REGS GS_RESET_REGS
} }
/* game phase (again) */ /* game phase (again) */
if (cpu_get_pc(space->cpu) == 0x10c6) if (cpu_get_pc(space->cpu) == 0x10c6)
{ {
getstar_cmd = 0x24; state->getstar_cmd = 0x24;
GS_RESET_REGS GS_RESET_REGS
} }
if (cpu_get_pc(space->cpu) == 0x10d3) if (cpu_get_pc(space->cpu) == 0x10d3)
{ {
getstar_cmd = 0x24; state->getstar_cmd = 0x24;
GS_SAVE_REGS GS_SAVE_REGS
} }
/* background */ /* background */
if (cpu_get_pc(space->cpu) == 0x1910) if (cpu_get_pc(space->cpu) == 0x1910)
{ {
getstar_cmd = 0x26; state->getstar_cmd = 0x26;
GS_RESET_REGS GS_RESET_REGS
} }
if (cpu_get_pc(space->cpu) == 0x191d) if (cpu_get_pc(space->cpu) == 0x191d)
{ {
getstar_cmd = 0x26; state->getstar_cmd = 0x26;
GS_SAVE_REGS GS_SAVE_REGS
} }
/* foreground */ /* foreground */
if (cpu_get_pc(space->cpu) == 0x19d5) if (cpu_get_pc(space->cpu) == 0x19d5)
{ {
getstar_cmd = 0x37; state->getstar_cmd = 0x37;
GS_RESET_REGS GS_RESET_REGS
} }
if (cpu_get_pc(space->cpu) == 0x19e4) if (cpu_get_pc(space->cpu) == 0x19e4)
{ {
getstar_cmd = 0x37; state->getstar_cmd = 0x37;
GS_SAVE_REGS GS_SAVE_REGS
} }
if (cpu_get_pc(space->cpu) == 0x19f1) if (cpu_get_pc(space->cpu) == 0x19f1)
{ {
getstar_cmd = 0x37; state->getstar_cmd = 0x37;
/* do NOT update the registers because there are 2 writes before 2 reads ! */ /* do NOT update the registers because there are 2 writes before 2 reads ! */
} }
/* laser position */ /* laser position */
if (cpu_get_pc(space->cpu) == 0x26af) if (cpu_get_pc(space->cpu) == 0x26af)
{ {
getstar_cmd = 0x38; state->getstar_cmd = 0x38;
GS_RESET_REGS GS_RESET_REGS
} }
if (cpu_get_pc(space->cpu) == 0x26be) if (cpu_get_pc(space->cpu) == 0x26be)
{ {
getstar_cmd = 0x38; state->getstar_cmd = 0x38;
GS_SAVE_REGS GS_SAVE_REGS
} }
if (cpu_get_pc(space->cpu) == 0x26cb) if (cpu_get_pc(space->cpu) == 0x26cb)
{ {
getstar_cmd = 0x38; state->getstar_cmd = 0x38;
/* do NOT update the registers because there are 2 writes before 2 reads ! */ /* do NOT update the registers because there are 2 writes before 2 reads ! */
} }
/* starting lives (for "test mode") */ /* starting lives (for "test mode") */
if (cpu_get_pc(space->cpu) == 0x6a27) if (cpu_get_pc(space->cpu) == 0x6a27)
{ {
getstar_cmd = 0x23; state->getstar_cmd = 0x23;
GS_RESET_REGS GS_RESET_REGS
} }
if (cpu_get_pc(space->cpu) == 0x6a38) if (cpu_get_pc(space->cpu) == 0x6a38)
{ {
getstar_cmd = 0x23; state->getstar_cmd = 0x23;
GS_SAVE_REGS GS_SAVE_REGS
} }
break; break;
@ -512,183 +504,183 @@ WRITE8_HANDLER( getstar_e803_w )
/* unknown effect - not read back */ /* unknown effect - not read back */
if (cpu_get_pc(space->cpu) == 0x00bf) if (cpu_get_pc(space->cpu) == 0x00bf)
{ {
getstar_cmd = 0x00; state->getstar_cmd = 0x00;
GS_RESET_REGS GS_RESET_REGS
} }
/* players inputs */ /* players inputs */
if (cpu_get_pc(space->cpu) == 0x0560) if (cpu_get_pc(space->cpu) == 0x0560)
{ {
getstar_cmd = 0x25; state->getstar_cmd = 0x25;
GS_RESET_REGS GS_RESET_REGS
} }
if (cpu_get_pc(space->cpu) == 0x056d) if (cpu_get_pc(space->cpu) == 0x056d)
{ {
getstar_cmd = 0x25; state->getstar_cmd = 0x25;
GS_SAVE_REGS GS_SAVE_REGS
} }
/* lose life */ /* lose life */
if (cpu_get_pc(space->cpu) == 0x0ad5) if (cpu_get_pc(space->cpu) == 0x0ad5)
{ {
getstar_cmd = 0x21; state->getstar_cmd = 0x21;
GS_RESET_REGS GS_RESET_REGS
} }
if (cpu_get_pc(space->cpu) == 0x0ae2) if (cpu_get_pc(space->cpu) == 0x0ae2)
{ {
getstar_cmd = 0x21; state->getstar_cmd = 0x21;
GS_SAVE_REGS GS_SAVE_REGS
} }
/* unknown effect */ /* unknown effect */
if (cpu_get_pc(space->cpu) == 0x0b1c) if (cpu_get_pc(space->cpu) == 0x0b1c)
{ {
getstar_cmd = 0x29; state->getstar_cmd = 0x29;
GS_RESET_REGS GS_RESET_REGS
} }
if (cpu_get_pc(space->cpu) == 0x0b29) if (cpu_get_pc(space->cpu) == 0x0b29)
{ {
getstar_cmd = 0x29; state->getstar_cmd = 0x29;
GS_SAVE_REGS GS_SAVE_REGS
} }
/* continue play */ /* continue play */
if (cpu_get_pc(space->cpu) == 0x0bae) if (cpu_get_pc(space->cpu) == 0x0bae)
{ {
getstar_cmd = 0x20; state->getstar_cmd = 0x20;
GS_RESET_REGS GS_RESET_REGS
} }
if (cpu_get_pc(space->cpu) == 0x0bbb) if (cpu_get_pc(space->cpu) == 0x0bbb)
{ {
getstar_cmd = 0x20; state->getstar_cmd = 0x20;
GS_SAVE_REGS GS_SAVE_REGS
} }
/* unknown effect - not read back */ /* unknown effect - not read back */
if (cpu_get_pc(space->cpu) == 0x0c2d) if (cpu_get_pc(space->cpu) == 0x0c2d)
{ {
getstar_cmd = 0x00; /* 0x1f */ state->getstar_cmd = 0x00; /* 0x1f */
GS_RESET_REGS GS_RESET_REGS
} }
/* change player (if 2 players game) */ /* change player (if 2 players game) */
if (cpu_get_pc(space->cpu) == 0x0c76) if (cpu_get_pc(space->cpu) == 0x0c76)
{ {
getstar_cmd = 0x2a; state->getstar_cmd = 0x2a;
GS_RESET_REGS GS_RESET_REGS
} }
if (cpu_get_pc(space->cpu) == 0x0c83) if (cpu_get_pc(space->cpu) == 0x0c83)
{ {
getstar_cmd = 0x2a; state->getstar_cmd = 0x2a;
GS_SAVE_REGS GS_SAVE_REGS
} }
/* game phase */ /* game phase */
if (cpu_get_pc(space->cpu) == 0x0e02) if (cpu_get_pc(space->cpu) == 0x0e02)
{ {
getstar_cmd = 0x24; state->getstar_cmd = 0x24;
GS_RESET_REGS GS_RESET_REGS
} }
if (cpu_get_pc(space->cpu) == 0x0e0f) if (cpu_get_pc(space->cpu) == 0x0e0f)
{ {
getstar_cmd = 0x24; state->getstar_cmd = 0x24;
GS_SAVE_REGS GS_SAVE_REGS
} }
/* starting lives */ /* starting lives */
if (cpu_get_pc(space->cpu) == 0x0e44) if (cpu_get_pc(space->cpu) == 0x0e44)
{ {
getstar_cmd = 0x23; state->getstar_cmd = 0x23;
GS_RESET_REGS GS_RESET_REGS
} }
if (cpu_get_pc(space->cpu) == 0x0e55) if (cpu_get_pc(space->cpu) == 0x0e55)
{ {
getstar_cmd = 0x23; state->getstar_cmd = 0x23;
GS_SAVE_REGS GS_SAVE_REGS
} }
/* starting difficulty */ /* starting difficulty */
if (cpu_get_pc(space->cpu) == 0x0e8c) if (cpu_get_pc(space->cpu) == 0x0e8c)
{ {
getstar_cmd = 0x22; state->getstar_cmd = 0x22;
GS_RESET_REGS GS_RESET_REGS
} }
if (cpu_get_pc(space->cpu) == 0x0e9b) if (cpu_get_pc(space->cpu) == 0x0e9b)
{ {
getstar_cmd = 0x22; state->getstar_cmd = 0x22;
GS_SAVE_REGS GS_SAVE_REGS
} }
/* starting lives (again) */ /* starting lives (again) */
if (cpu_get_pc(space->cpu) == 0x10d6) if (cpu_get_pc(space->cpu) == 0x10d6)
{ {
getstar_cmd = 0x23; state->getstar_cmd = 0x23;
GS_RESET_REGS GS_RESET_REGS
} }
if (cpu_get_pc(space->cpu) == 0x10e3) if (cpu_get_pc(space->cpu) == 0x10e3)
{ {
getstar_cmd = 0x23; state->getstar_cmd = 0x23;
GS_SAVE_REGS GS_SAVE_REGS
} }
/* hardware test */ /* hardware test */
if (cpu_get_pc(space->cpu) == 0x113f) if (cpu_get_pc(space->cpu) == 0x113f)
{ {
getstar_cmd = 0x73; state->getstar_cmd = 0x73;
GS_RESET_REGS GS_RESET_REGS
} }
/* game phase (again) */ /* game phase (again) */
if (cpu_get_pc(space->cpu) == 0x118b) if (cpu_get_pc(space->cpu) == 0x118b)
{ {
getstar_cmd = 0x24; state->getstar_cmd = 0x24;
GS_RESET_REGS GS_RESET_REGS
} }
if (cpu_get_pc(space->cpu) == 0x1198) if (cpu_get_pc(space->cpu) == 0x1198)
{ {
getstar_cmd = 0x24; state->getstar_cmd = 0x24;
GS_SAVE_REGS GS_SAVE_REGS
} }
/* background */ /* background */
if (cpu_get_pc(space->cpu) == 0x19f8) if (cpu_get_pc(space->cpu) == 0x19f8)
{ {
getstar_cmd = 0x26; state->getstar_cmd = 0x26;
GS_RESET_REGS GS_RESET_REGS
} }
if (cpu_get_pc(space->cpu) == 0x1a05) if (cpu_get_pc(space->cpu) == 0x1a05)
{ {
getstar_cmd = 0x26; state->getstar_cmd = 0x26;
GS_SAVE_REGS GS_SAVE_REGS
} }
/* foreground */ /* foreground */
if (cpu_get_pc(space->cpu) == 0x1abd) if (cpu_get_pc(space->cpu) == 0x1abd)
{ {
getstar_cmd = 0x37; state->getstar_cmd = 0x37;
GS_RESET_REGS GS_RESET_REGS
} }
if (cpu_get_pc(space->cpu) == 0x1acc) if (cpu_get_pc(space->cpu) == 0x1acc)
{ {
getstar_cmd = 0x37; state->getstar_cmd = 0x37;
GS_SAVE_REGS GS_SAVE_REGS
} }
if (cpu_get_pc(space->cpu) == 0x1ad9) if (cpu_get_pc(space->cpu) == 0x1ad9)
{ {
getstar_cmd = 0x37; state->getstar_cmd = 0x37;
/* do NOT update the registers because there are 2 writes before 2 reads ! */ /* do NOT update the registers because there are 2 writes before 2 reads ! */
} }
/* laser position */ /* laser position */
if (cpu_get_pc(space->cpu) == 0x2792) if (cpu_get_pc(space->cpu) == 0x2792)
{ {
getstar_cmd = 0x38; state->getstar_cmd = 0x38;
GS_RESET_REGS GS_RESET_REGS
} }
if (cpu_get_pc(space->cpu) == 0x27a1) if (cpu_get_pc(space->cpu) == 0x27a1)
{ {
getstar_cmd = 0x38; state->getstar_cmd = 0x38;
GS_SAVE_REGS GS_SAVE_REGS
} }
if (cpu_get_pc(space->cpu) == 0x27ae) if (cpu_get_pc(space->cpu) == 0x27ae)
{ {
getstar_cmd = 0x38; state->getstar_cmd = 0x38;
/* do NOT update the registers because there are 2 writes before 2 reads ! */ /* do NOT update the registers because there are 2 writes before 2 reads ! */
} }
/* starting lives (for "test mode") */ /* starting lives (for "test mode") */
if (cpu_get_pc(space->cpu) == 0x6ae2) if (cpu_get_pc(space->cpu) == 0x6ae2)
{ {
getstar_cmd = 0x23; state->getstar_cmd = 0x23;
GS_RESET_REGS GS_RESET_REGS
} }
if (cpu_get_pc(space->cpu) == 0x6af3) if (cpu_get_pc(space->cpu) == 0x6af3)
{ {
getstar_cmd = 0x23; state->getstar_cmd = 0x23;
GS_SAVE_REGS GS_SAVE_REGS
} }
break; break;
@ -720,12 +712,12 @@ WRITE8_HANDLER( getstar_e803_w )
*/ */
if (cpu_get_pc(space->cpu) == 0x6ae2) if (cpu_get_pc(space->cpu) == 0x6ae2)
{ {
getstar_cmd = 0x00; state->getstar_cmd = 0x00;
GS_RESET_REGS GS_RESET_REGS
} }
if (cpu_get_pc(space->cpu) == 0x6af3) if (cpu_get_pc(space->cpu) == 0x6af3)
{ {
getstar_cmd = 0x00; state->getstar_cmd = 0x00;
GS_SAVE_REGS GS_SAVE_REGS
} }
break; break;
@ -759,12 +751,12 @@ WRITE8_HANDLER( getstar_e803_w )
*/ */
if (cpu_get_pc(space->cpu) == 0x6ae2) if (cpu_get_pc(space->cpu) == 0x6ae2)
{ {
getstar_cmd = 0x00; state->getstar_cmd = 0x00;
GS_RESET_REGS GS_RESET_REGS
} }
if (cpu_get_pc(space->cpu) == 0x6af3) if (cpu_get_pc(space->cpu) == 0x6af3)
{ {
getstar_cmd = 0x00; state->getstar_cmd = 0x00;
GS_SAVE_REGS GS_SAVE_REGS
} }
break; break;
@ -777,7 +769,8 @@ WRITE8_HANDLER( getstar_e803_w )
/* Enable hardware interrupt of sound cpu */ /* Enable hardware interrupt of sound cpu */
WRITE8_HANDLER( getstar_sh_intenable_w ) WRITE8_HANDLER( getstar_sh_intenable_w )
{ {
getstar_sh_intenabled = 1; slapfght_state *state = space->machine->driver_data<slapfght_state>();
state->getstar_sh_intenabled = 1;
logerror("cpu #1 PC=%d: %d written to a0e0\n",cpu_get_pc(space->cpu),data); logerror("cpu #1 PC=%d: %d written to a0e0\n",cpu_get_pc(space->cpu),data);
} }
@ -786,7 +779,8 @@ WRITE8_HANDLER( getstar_sh_intenable_w )
/* Generate interrups only if they have been enabled */ /* Generate interrups only if they have been enabled */
INTERRUPT_GEN( getstar_interrupt ) INTERRUPT_GEN( getstar_interrupt )
{ {
if (getstar_sh_intenabled) slapfght_state *state = device->machine->driver_data<slapfght_state>();
if (state->getstar_sh_intenabled)
cpu_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); cpu_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE);
} }
@ -806,101 +800,114 @@ WRITE8_HANDLER( getstar_port_04_w )
READ8_HANDLER( tigerh_68705_portA_r ) READ8_HANDLER( tigerh_68705_portA_r )
{ {
return (portA_out & ddrA) | (portA_in & ~ddrA); slapfght_state *state = space->machine->driver_data<slapfght_state>();
return (state->portA_out & state->ddrA) | (state->portA_in & ~state->ddrA);
} }
WRITE8_HANDLER( tigerh_68705_portA_w ) WRITE8_HANDLER( tigerh_68705_portA_w )
{ {
portA_out = data;//? slapfght_state *state = space->machine->driver_data<slapfght_state>();
from_mcu = portA_out; state->portA_out = data;//?
mcu_sent = 1; state->from_mcu = state->portA_out;
state->mcu_sent = 1;
} }
WRITE8_HANDLER( tigerh_68705_ddrA_w ) WRITE8_HANDLER( tigerh_68705_ddrA_w )
{ {
ddrA = data; slapfght_state *state = space->machine->driver_data<slapfght_state>();
state->ddrA = data;
} }
READ8_HANDLER( tigerh_68705_portB_r ) READ8_HANDLER( tigerh_68705_portB_r )
{ {
return (portB_out & ddrB) | (portB_in & ~ddrB); slapfght_state *state = space->machine->driver_data<slapfght_state>();
return (state->portB_out & state->ddrB) | (state->portB_in & ~state->ddrB);
} }
WRITE8_HANDLER( tigerh_68705_portB_w ) WRITE8_HANDLER( tigerh_68705_portB_w )
{ {
slapfght_state *state = space->machine->driver_data<slapfght_state>();
if ((ddrB & 0x02) && (~data & 0x02) && (portB_out & 0x02)) if ((state->ddrB & 0x02) && (~data & 0x02) && (state->portB_out & 0x02))
{ {
portA_in = from_main; state->portA_in = state->from_main;
if (main_sent) cputag_set_input_line(space->machine, "mcu", 0, CLEAR_LINE); if (state->main_sent) cputag_set_input_line(space->machine, "mcu", 0, CLEAR_LINE);
main_sent = 0; state->main_sent = 0;
} }
if ((ddrB & 0x04) && (data & 0x04) && (~portB_out & 0x04)) if ((state->ddrB & 0x04) && (data & 0x04) && (~state->portB_out & 0x04))
{ {
from_mcu = portA_out; state->from_mcu = state->portA_out;
mcu_sent = 1; state->mcu_sent = 1;
} }
portB_out = data; state->portB_out = data;
} }
WRITE8_HANDLER( tigerh_68705_ddrB_w ) WRITE8_HANDLER( tigerh_68705_ddrB_w )
{ {
ddrB = data; slapfght_state *state = space->machine->driver_data<slapfght_state>();
state->ddrB = data;
} }
READ8_HANDLER( tigerh_68705_portC_r ) READ8_HANDLER( tigerh_68705_portC_r )
{ {
portC_in = 0; slapfght_state *state = space->machine->driver_data<slapfght_state>();
if (!main_sent) portC_in |= 0x01; state->portC_in = 0;
if (mcu_sent) portC_in |= 0x02; if (!state->main_sent) state->portC_in |= 0x01;
return (portC_out & ddrC) | (portC_in & ~ddrC); if (state->mcu_sent) state->portC_in |= 0x02;
return (state->portC_out & state->ddrC) | (state->portC_in & ~state->ddrC);
} }
WRITE8_HANDLER( tigerh_68705_portC_w ) WRITE8_HANDLER( tigerh_68705_portC_w )
{ {
portC_out = data; slapfght_state *state = space->machine->driver_data<slapfght_state>();
state->portC_out = data;
} }
WRITE8_HANDLER( tigerh_68705_ddrC_w ) WRITE8_HANDLER( tigerh_68705_ddrC_w )
{ {
ddrC = data; slapfght_state *state = space->machine->driver_data<slapfght_state>();
state->ddrC = data;
} }
WRITE8_HANDLER( tigerh_mcu_w ) WRITE8_HANDLER( tigerh_mcu_w )
{ {
from_main = data; slapfght_state *state = space->machine->driver_data<slapfght_state>();
main_sent = 1; state->from_main = data;
mcu_sent = 0; state->main_sent = 1;
state->mcu_sent = 0;
cputag_set_input_line(space->machine, "mcu", 0, ASSERT_LINE); cputag_set_input_line(space->machine, "mcu", 0, ASSERT_LINE);
} }
READ8_HANDLER( tigerh_mcu_r ) READ8_HANDLER( tigerh_mcu_r )
{ {
mcu_sent = 0; slapfght_state *state = space->machine->driver_data<slapfght_state>();
return from_mcu; state->mcu_sent = 0;
return state->from_mcu;
} }
READ8_HANDLER( tigerh_mcu_status_r ) READ8_HANDLER( tigerh_mcu_status_r )
{ {
slapfght_state *state = space->machine->driver_data<slapfght_state>();
int res = 0; int res = 0;
if (!main_sent) res |= 0x02; if (!state->main_sent) res |= 0x02;
if (!mcu_sent) res |= 0x04; if (!state->mcu_sent) res |= 0x04;
return res; return res;
} }
READ8_HANDLER( tigerhb_e803_r ) READ8_HANDLER( tigerhb_e803_r )
{ {
slapfght_state *state = space->machine->driver_data<slapfght_state>();
UINT8 tigerhb_val = 0; UINT8 tigerhb_val = 0;
switch (tigerhb_cmd) switch (state->tigerhb_cmd)
{ {
case 0x73: /* avoid "BAD HW" message */ case 0x73: /* avoid "BAD HW" message */
tigerhb_val = 0x83; tigerhb_val = 0x83;
break; break;
default: default:
logerror("%04x: tigerhb_e803_r - cmd = %02x\n",cpu_get_pc(space->cpu),getstar_cmd); logerror("%04x: tigerhb_e803_r - cmd = %02x\n",cpu_get_pc(space->cpu),state->getstar_cmd);
break; break;
} }
return tigerhb_val; return tigerhb_val;
@ -908,15 +915,16 @@ READ8_HANDLER( tigerhb_e803_r )
WRITE8_HANDLER( tigerhb_e803_w ) WRITE8_HANDLER( tigerhb_e803_w )
{ {
slapfght_state *state = space->machine->driver_data<slapfght_state>();
switch (data) switch (data)
{ {
/* hardware test */ /* hardware test */
case 0x73: case 0x73:
tigerhb_cmd = 0x73; state->tigerhb_cmd = 0x73;
break; break;
default: default:
logerror("%04x: tigerhb_e803_w - data = %02x\n",cpu_get_pc(space->cpu),data); logerror("%04x: tigerhb_e803_w - data = %02x\n",cpu_get_pc(space->cpu),data);
tigerhb_cmd = 0x00; state->tigerhb_cmd = 0x00;
break; break;
} }
} }

View File

@ -234,8 +234,8 @@ static void run_mproc(running_machine *machine)
IP6_0 = state->PROM_MAS[state->MPA]; IP6_0 = state->PROM_MAS[state->MPA];
#if (MATHDEBUG) #if (MATHDEBUG)
mame_printf_debug("\n(state->MPA:%x), Strobe: %x, IP7: %d, IP6_0:%x\n",state->MPA, IP15_8, IP7, IP6_0); mame_printf_debug("\n(MPA:%x), Strobe: %x, IP7: %d, IP6_0:%x\n",state->MPA, IP15_8, IP7, IP6_0);
mame_printf_debug("(state->BIC: %x), state->A: %x, state->B: %x, state->C: %x, state->ACC: %x\n",state->BIC,state->A,state->B,state->C,state->ACC); mame_printf_debug("(BIC: %x), A: %x, B: %x, C: %x, ACC: %x\n",state->BIC,state->A,state->B,state->C,state->ACC);
#endif #endif
/* construct the current RAM address */ /* construct the current RAM address */

View File

@ -11,23 +11,18 @@
#include "includes/bagman.h" #include "includes/bagman.h"
UINT8 *bagman_video_enable;
UINT8 *bagman_videoram;
UINT8 *bagman_colorram;
static tilemap_t *bg_tilemap;
WRITE8_HANDLER( bagman_videoram_w ) WRITE8_HANDLER( bagman_videoram_w )
{ {
bagman_videoram[offset] = data; bagman_state *state = space->machine->driver_data<bagman_state>();
tilemap_mark_tile_dirty(bg_tilemap, offset); state->videoram[offset] = data;
tilemap_mark_tile_dirty(state->bg_tilemap, offset);
} }
WRITE8_HANDLER( bagman_colorram_w ) WRITE8_HANDLER( bagman_colorram_w )
{ {
bagman_colorram[offset] = data; bagman_state *state = space->machine->driver_data<bagman_state>();
tilemap_mark_tile_dirty(bg_tilemap, offset); state->colorram[offset] = data;
tilemap_mark_tile_dirty(state->bg_tilemap, offset);
} }
/*************************************************************************** /***************************************************************************
@ -88,28 +83,31 @@ PALETTE_INIT( bagman )
WRITE8_HANDLER( bagman_flipscreen_w ) WRITE8_HANDLER( bagman_flipscreen_w )
{ {
bagman_state *state = space->machine->driver_data<bagman_state>();
if ((flip_screen_get(space->machine) ^ data) & 1) if ((flip_screen_get(space->machine) ^ data) & 1)
{ {
flip_screen_set(space->machine, data & 0x01); flip_screen_set(space->machine, data & 0x01);
tilemap_mark_all_tiles_dirty(bg_tilemap); tilemap_mark_all_tiles_dirty(state->bg_tilemap);
} }
} }
static TILE_GET_INFO( get_bg_tile_info ) static TILE_GET_INFO( get_bg_tile_info )
{ {
int gfxbank = (machine->gfx[2] && (bagman_colorram[tile_index] & 0x10)) ? 2 : 0; bagman_state *state = machine->driver_data<bagman_state>();
int code = bagman_videoram[tile_index] + 8 * (bagman_colorram[tile_index] & 0x20); int gfxbank = (machine->gfx[2] && (state->colorram[tile_index] & 0x10)) ? 2 : 0;
int color = bagman_colorram[tile_index] & 0x0f; int code = state->videoram[tile_index] + 8 * (state->colorram[tile_index] & 0x20);
int color = state->colorram[tile_index] & 0x0f;
SET_TILE_INFO(gfxbank, code, color, 0); SET_TILE_INFO(gfxbank, code, color, 0);
} }
VIDEO_START( bagman ) VIDEO_START( bagman )
{ {
bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, bagman_state *state = machine->driver_data<bagman_state>();
state->bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows,
8, 8, 32, 32); 8, 8, 32, 32);
tilemap_set_scrolldy(bg_tilemap, -1, -1); tilemap_set_scrolldy(state->bg_tilemap, -1, -1);
} }
@ -149,12 +147,12 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
SCREEN_UPDATE( bagman ) SCREEN_UPDATE( bagman )
{ {
bagman_state *state = screen->machine->driver_data<bagman_state>();
bitmap_fill(bitmap,cliprect,0); bitmap_fill(bitmap,cliprect,0);
if (*state->video_enable == 0)
if (*bagman_video_enable == 0)
return 0; return 0;
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);
return 0; return 0;
} }

View File

@ -237,7 +237,7 @@ WRITE8_HANDLER( HuC6270_data_w )
} }
break; break;
} }
logerror("%04x: unknown write to state->VDC_register %02x (%02x) at %02x\n",cpu_get_pc(space->cpu),state->VDC_register,data,offset); logerror("%04x: unknown write to VDC_register %02x (%02x) at %02x\n",cpu_get_pc(space->cpu),state->VDC_register,data,offset);
} }
/******************************************************************************/ /******************************************************************************/

View File

@ -10,7 +10,6 @@
#include "emu.h" #include "emu.h"
#include "includes/gridlee.h" #include "includes/gridlee.h"
#include "includes/balsente.h"
/************************************* /*************************************
@ -118,7 +117,7 @@ WRITE8_HANDLER( gridlee_palette_select_w )
{ {
gridlee_state *state = space->machine->driver_data<gridlee_state>(); gridlee_state *state = space->machine->driver_data<gridlee_state>();
/* update the scanline palette */ /* update the scanline palette */
space->machine->primary_screen->update_partial(space->machine->primary_screen->vpos() - 1 + BALSENTE_VBEND); space->machine->primary_screen->update_partial(space->machine->primary_screen->vpos() - 1 + GRIDLEE_VBEND);
state->palettebank_vis = data & 0x3f; state->palettebank_vis = data & 0x3f;
} }
@ -130,7 +129,7 @@ WRITE8_HANDLER( gridlee_palette_select_w )
* *
*************************************/ *************************************/
/* all the BALSENTE_VBEND adjustments are needed because the hardware has a seperate counting chain /* all the GRIDLEE_VBEND adjustments are needed because the hardware has a seperate counting chain
to address the video memory instead of using the video chain directly */ to address the video memory instead of using the video chain directly */
SCREEN_UPDATE( gridlee ) SCREEN_UPDATE( gridlee )
@ -145,12 +144,12 @@ SCREEN_UPDATE( gridlee )
{ {
/* non-flipped: draw directly from the bitmap */ /* non-flipped: draw directly from the bitmap */
if (!state->cocktail_flip) if (!state->cocktail_flip)
draw_scanline8(bitmap, 0, y, 256, &state->local_videoram[(y - BALSENTE_VBEND) * 256], pens + 16); draw_scanline8(bitmap, 0, y, 256, &state->local_videoram[(y - GRIDLEE_VBEND) * 256], pens + 16);
/* flipped: x-flip the scanline into a temp buffer and draw that */ /* flipped: x-flip the scanline into a temp buffer and draw that */
else else
{ {
int srcy = BALSENTE_VBSTART - 1 - y; int srcy = GRIDLEE_VBSTART - 1 - y;
UINT8 temp[256]; UINT8 temp[256];
int xx; int xx;
@ -167,7 +166,7 @@ SCREEN_UPDATE( gridlee )
UINT8 *sprite = screen->machine->generic.spriteram.u8 + i * 4; UINT8 *sprite = screen->machine->generic.spriteram.u8 + i * 4;
UINT8 *src; UINT8 *src;
int image = sprite[0]; int image = sprite[0];
int ypos = sprite[2] + 17 + BALSENTE_VBEND; int ypos = sprite[2] + 17 + GRIDLEE_VBEND;
int xpos = sprite[3]; int xpos = sprite[3];
/* get a pointer to the source image */ /* get a pointer to the source image */
@ -185,7 +184,7 @@ SCREEN_UPDATE( gridlee )
currxor = 0xff; currxor = 0xff;
} }
if (ypos >= (16 + BALSENTE_VBEND) && ypos >= cliprect->min_y && ypos <= cliprect->max_y) if (ypos >= (16 + GRIDLEE_VBEND) && ypos >= cliprect->min_y && ypos <= cliprect->max_y)
{ {
int currx = xpos; int currx = xpos;

View File

@ -1,10 +1,6 @@
#include "emu.h" #include "emu.h"
#include "includes/gstriker.h" #include "includes/gstriker.h"
//UINT16 *gs_videoram3;
//UINT16 *gs_mixer_regs;
UINT16 *gstriker_lineram;
/*** VS920A (score tilemap) **********************************************/ /*** VS920A (score tilemap) **********************************************/
@ -28,36 +24,38 @@ t=tile, p=palette
*/ */
sVS920A VS920A[MAX_VS920A];
static sVS920A* VS920A_cur_chip;
static TILE_GET_INFO( VS920A_get_tile_info ) static TILE_GET_INFO( VS920A_get_tile_info )
{ {
gstriker_state *state = machine->driver_data<gstriker_state>();
int data; int data;
int tileno, pal; int tileno, pal;
data = VS920A_cur_chip->vram[tile_index]; data = state->VS920A_cur_chip->vram[tile_index];
tileno = data & 0xFFF; tileno = data & 0xFFF;
pal = (data >> 12) & 0xF; pal = (data >> 12) & 0xF;
SET_TILE_INFO(VS920A_cur_chip->gfx_region, tileno, VS920A_cur_chip->pal_base + pal, 0); SET_TILE_INFO(state->VS920A_cur_chip->gfx_region, tileno, state->VS920A_cur_chip->pal_base + pal, 0);
} }
WRITE16_HANDLER( VS920A_0_vram_w ) WRITE16_HANDLER( VS920A_0_vram_w )
{ {
COMBINE_DATA(&VS920A[0].vram[offset]); gstriker_state *state = space->machine->driver_data<gstriker_state>();
tilemap_mark_tile_dirty(VS920A[0].tmap, offset); COMBINE_DATA(&state->VS920A[0].vram[offset]);
tilemap_mark_tile_dirty(state->VS920A[0].tmap, offset);
} }
WRITE16_HANDLER( VS920A_1_vram_w ) WRITE16_HANDLER( VS920A_1_vram_w )
{ {
COMBINE_DATA(&VS920A[1].vram[offset]); gstriker_state *state = space->machine->driver_data<gstriker_state>();
tilemap_mark_tile_dirty(VS920A[1].tmap, offset); COMBINE_DATA(&state->VS920A[1].vram[offset]);
tilemap_mark_tile_dirty(state->VS920A[1].tmap, offset);
} }
static void VS920A_init(running_machine *machine, int numchips) static void VS920A_init(running_machine *machine, int numchips)
{ {
gstriker_state *state = machine->driver_data<gstriker_state>();
int i; int i;
if (numchips > MAX_VS920A) if (numchips > MAX_VS920A)
@ -65,32 +63,32 @@ static void VS920A_init(running_machine *machine, int numchips)
for (i=0;i<numchips;i++) for (i=0;i<numchips;i++)
{ {
VS920A[i].tmap = tilemap_create(machine, VS920A_get_tile_info,tilemap_scan_rows,8,8,64,32); state->VS920A[i].tmap = tilemap_create(machine, VS920A_get_tile_info,tilemap_scan_rows,8,8,64,32);
tilemap_set_transparent_pen(VS920A[i].tmap, 0); tilemap_set_transparent_pen(state->VS920A[i].tmap, 0);
} }
} }
static tilemap_t* VS920A_get_tilemap(int numchip) static tilemap_t* VS920A_get_tilemap(gstriker_state *state, int numchip)
{ {
return VS920A[numchip].tmap; return state->VS920A[numchip].tmap;
} }
static void VS920A_set_pal_base(int numchip, int pal_base) static void VS920A_set_pal_base(gstriker_state *state, int numchip, int pal_base)
{ {
VS920A[numchip].pal_base = pal_base; state->VS920A[numchip].pal_base = pal_base;
} }
static void VS920A_set_gfx_region(int numchip, int gfx_region) static void VS920A_set_gfx_region(gstriker_state *state, int numchip, int gfx_region)
{ {
VS920A[numchip].gfx_region = gfx_region; state->VS920A[numchip].gfx_region = gfx_region;
} }
static void VS920A_draw(int numchip, bitmap_t* screen, const rectangle* cliprect, int priority) static void VS920A_draw(gstriker_state *state, int numchip, bitmap_t* screen, const rectangle* cliprect, int priority)
{ {
VS920A_cur_chip = &VS920A[numchip]; state->VS920A_cur_chip = &state->VS920A[numchip];
tilemap_draw(screen, cliprect, VS920A_cur_chip->tmap, 0, priority); tilemap_draw(screen, cliprect, state->VS920A_cur_chip->tmap, 0, priority);
} }
@ -141,27 +139,26 @@ index is in the MSB. gstriker uses 5 bits for banking, but the chips could be ab
*/ */
tMB60553 MB60553[MAX_MB60553];
static tMB60553 *MB60553_cur_chip;
static TILE_GET_INFO( MB60553_get_tile_info ) static TILE_GET_INFO( MB60553_get_tile_info )
{ {
gstriker_state *state = machine->driver_data<gstriker_state>();
int data, bankno; int data, bankno;
int tileno, pal; int tileno, pal;
data = MB60553_cur_chip->vram[tile_index]; data = state->MB60553_cur_chip->vram[tile_index];
tileno = data & 0x1FF; tileno = data & 0x1FF;
pal = (data >> 12) & 0xF; pal = (data >> 12) & 0xF;
bankno = (data >> 9) & 0x7; bankno = (data >> 9) & 0x7;
SET_TILE_INFO(MB60553->gfx_region, tileno + MB60553_cur_chip->bank[bankno] * 0x200, pal + MB60553->pal_base, 0); SET_TILE_INFO(state->MB60553->gfx_region, tileno + state->MB60553_cur_chip->bank[bankno] * 0x200, pal + state->MB60553->pal_base, 0);
} }
static void MB60553_reg_written(int numchip, int num_reg) static void MB60553_reg_written(gstriker_state *state, int numchip, int num_reg)
{ {
tMB60553* cur = &MB60553[numchip]; tMB60553* cur = &state->MB60553[numchip];
switch (num_reg) switch (num_reg)
{ {
@ -216,6 +213,7 @@ static TILEMAP_MAPPER( twc94_scan )
static void MB60553_init(running_machine *machine, int numchips) static void MB60553_init(running_machine *machine, int numchips)
{ {
gstriker_state *state = machine->driver_data<gstriker_state>();
int i; int i;
if (numchips > MAX_MB60553) if (numchips > MAX_MB60553)
@ -223,28 +221,29 @@ static void MB60553_init(running_machine *machine, int numchips)
for (i=0;i<numchips;i++) for (i=0;i<numchips;i++)
{ {
MB60553[i].tmap = tilemap_create(machine, MB60553_get_tile_info,twc94_scan, 16,16,128,64); state->MB60553[i].tmap = tilemap_create(machine, MB60553_get_tile_info,twc94_scan, 16,16,128,64);
tilemap_set_transparent_pen(MB60553[i].tmap, 0); tilemap_set_transparent_pen(state->MB60553[i].tmap, 0);
} }
} }
static void MB60553_set_pal_base(int numchip, int pal_base) static void MB60553_set_pal_base(gstriker_state *state, int numchip, int pal_base)
{ {
MB60553[numchip].pal_base = pal_base; state->MB60553[numchip].pal_base = pal_base;
} }
static void MB60553_set_gfx_region(int numchip, int gfx_region) static void MB60553_set_gfx_region(gstriker_state *state, int numchip, int gfx_region)
{ {
MB60553[numchip].gfx_region = gfx_region; state->MB60553[numchip].gfx_region = gfx_region;
} }
/* THIS IS STILL WRONG! */ /* THIS IS STILL WRONG! */
static void MB60553_draw(running_machine *machine, int numchip, bitmap_t* screen, const rectangle* cliprect, int priority) static void MB60553_draw(running_machine *machine, int numchip, bitmap_t* screen, const rectangle* cliprect, int priority)
{ {
gstriker_state *state = machine->driver_data<gstriker_state>();
int line; int line;
rectangle clip; rectangle clip;
MB60553_cur_chip = &MB60553[numchip]; state->MB60553_cur_chip = &state->MB60553[numchip];
clip.min_x = machine->primary_screen->visible_area().min_x; clip.min_x = machine->primary_screen->visible_area().min_x;
clip.max_x = machine->primary_screen->visible_area().max_x; clip.max_x = machine->primary_screen->visible_area().max_x;
@ -258,19 +257,19 @@ static void MB60553_draw(running_machine *machine, int numchip, bitmap_t* screen
UINT32 incxx,incyy; UINT32 incxx,incyy;
startx = MB60553_cur_chip->regs[0]; startx = state->MB60553_cur_chip->regs[0];
starty = MB60553_cur_chip->regs[1]; starty = state->MB60553_cur_chip->regs[1];
startx += (24<<4); // maybe not.. startx += (24<<4); // maybe not..
startx -= gstriker_lineram[(line)*8+7]/2; startx -= state->lineram[(line)*8+7]/2;
incxx = gstriker_lineram[(line)*8+0]<<4; incxx = state->lineram[(line)*8+0]<<4;
incyy = gstriker_lineram[(line)*8+3]<<4; incyy = state->lineram[(line)*8+3]<<4;
clip.min_y = clip.max_y = line; clip.min_y = clip.max_y = line;
tilemap_draw_roz(screen,&clip,MB60553_cur_chip->tmap,startx<<12,starty<<12, tilemap_draw_roz(screen,&clip,state->MB60553_cur_chip->tmap,startx<<12,starty<<12,
incxx,0,0,incyy, incxx,0,0,incyy,
1, 1,
0,priority); 0,priority);
@ -281,44 +280,48 @@ static void MB60553_draw(running_machine *machine, int numchip, bitmap_t* screen
} }
static tilemap_t* MB60553_get_tilemap(int numchip) static tilemap_t* MB60553_get_tilemap(gstriker_state *state, int numchip)
{ {
return MB60553[numchip].tmap; return state->MB60553[numchip].tmap;
} }
WRITE16_HANDLER(MB60553_0_regs_w) WRITE16_HANDLER(MB60553_0_regs_w)
{ {
UINT16 oldreg = MB60553[0].regs[offset]; gstriker_state *state = space->machine->driver_data<gstriker_state>();
UINT16 oldreg = state->MB60553[0].regs[offset];
COMBINE_DATA(&MB60553[0].regs[offset]); COMBINE_DATA(&state->MB60553[0].regs[offset]);
if (MB60553[0].regs[offset] != oldreg) if (state->MB60553[0].regs[offset] != oldreg)
MB60553_reg_written(0, offset); MB60553_reg_written(state, 0, offset);
} }
WRITE16_HANDLER(MB60553_1_regs_w) WRITE16_HANDLER(MB60553_1_regs_w)
{ {
UINT16 oldreg = MB60553[1].regs[offset]; gstriker_state *state = space->machine->driver_data<gstriker_state>();
UINT16 oldreg = state->MB60553[1].regs[offset];
COMBINE_DATA(&MB60553[1].regs[offset]); COMBINE_DATA(&state->MB60553[1].regs[offset]);
if (MB60553[1].regs[offset] != oldreg) if (state->MB60553[1].regs[offset] != oldreg)
MB60553_reg_written(1, offset); MB60553_reg_written(state, 1, offset);
} }
WRITE16_HANDLER(MB60553_0_vram_w) WRITE16_HANDLER(MB60553_0_vram_w)
{ {
COMBINE_DATA(&MB60553[0].vram[offset]); gstriker_state *state = space->machine->driver_data<gstriker_state>();
COMBINE_DATA(&state->MB60553[0].vram[offset]);
tilemap_mark_tile_dirty(MB60553[0].tmap, offset); tilemap_mark_tile_dirty(state->MB60553[0].tmap, offset);
} }
WRITE16_HANDLER(MB60553_1_vram_w) WRITE16_HANDLER(MB60553_1_vram_w)
{ {
COMBINE_DATA(&MB60553[1].vram[offset]); gstriker_state *state = space->machine->driver_data<gstriker_state>();
COMBINE_DATA(&state->MB60553[1].vram[offset]);
tilemap_mark_tile_dirty(MB60553[1].tmap, offset); tilemap_mark_tile_dirty(state->MB60553[1].tmap, offset);
} }
@ -379,11 +382,10 @@ Abstracts the VS9210
*/ */
tCG10103 CG10103[MAX_CG10103];
static tCG10103* CG10103_cur_chip;
static void CG10103_draw_sprite(running_machine *machine, bitmap_t* screen, const rectangle* cliprect, UINT16* spr, int drawpri) static void CG10103_draw_sprite(running_machine *machine, bitmap_t* screen, const rectangle* cliprect, UINT16* spr, int drawpri)
{ {
gstriker_state *state = machine->driver_data<gstriker_state>();
int ypos = spr[0] & 0x1FF; int ypos = spr[0] & 0x1FF;
int xpos = (spr[1] & 0x1FF); int xpos = (spr[1] & 0x1FF);
UINT32 tile = (spr[3] & 0xFFFF) | ((spr[2] & 1) << 16); UINT32 tile = (spr[3] & 0xFFFF) | ((spr[2] & 1) << 16);
@ -433,7 +435,7 @@ static void CG10103_draw_sprite(running_machine *machine, bitmap_t* screen, cons
// @@@ Add here optional connection to the VS9210 for extra level of tile number indirection // @@@ Add here optional connection to the VS9210 for extra level of tile number indirection
#if 0 #if 0
if (CG10103_cur_chip->connected_vs9210) if (state->CG10103_cur_chip->connected_vs9210)
{ {
// ... // ...
} }
@ -447,8 +449,8 @@ static void CG10103_draw_sprite(running_machine *machine, bitmap_t* screen, cons
for (x=0;x<xnum;x++) for (x=0;x<xnum;x++)
{ {
// Hack to handle horizontal wrapping // Hack to handle horizontal wrapping
drawgfxzoom_transpen(screen, cliprect, machine->gfx[CG10103_cur_chip->gfx_region], tile, color+CG10103_cur_chip->pal_base, flipx, flipy, xp>>16, ypos>>16, xfact, yfact, CG10103_cur_chip->transpen); drawgfxzoom_transpen(screen, cliprect, machine->gfx[state->CG10103_cur_chip->gfx_region], tile, color+state->CG10103_cur_chip->pal_base, flipx, flipy, xp>>16, ypos>>16, xfact, yfact, state->CG10103_cur_chip->transpen);
drawgfxzoom_transpen(screen, cliprect, machine->gfx[CG10103_cur_chip->gfx_region], tile, color+CG10103_cur_chip->pal_base, flipx, flipy, (xp>>16) - 0x200, ypos>>16, xfact, yfact, CG10103_cur_chip->transpen); drawgfxzoom_transpen(screen, cliprect, machine->gfx[state->CG10103_cur_chip->gfx_region], tile, color+state->CG10103_cur_chip->pal_base, flipx, flipy, (xp>>16) - 0x200, ypos>>16, xfact, yfact, state->CG10103_cur_chip->transpen);
xp += xstep; xp += xstep;
tile++; tile++;
} }
@ -460,12 +462,13 @@ static void CG10103_draw_sprite(running_machine *machine, bitmap_t* screen, cons
static void CG10103_draw(running_machine *machine, int numchip, bitmap_t* screen, const rectangle* cliprect, int priority) static void CG10103_draw(running_machine *machine, int numchip, bitmap_t* screen, const rectangle* cliprect, int priority)
{ {
gstriker_state *state = machine->driver_data<gstriker_state>();
UINT16* splist; UINT16* splist;
int i; int i;
CG10103_cur_chip = &CG10103[numchip]; state->CG10103_cur_chip = &state->CG10103[numchip];
splist = CG10103_cur_chip->vram; splist = state->CG10103_cur_chip->vram;
// Parse the sorting list // Parse the sorting list
for (i=0;i<0x400;i++) for (i=0;i<0x400;i++)
@ -483,7 +486,7 @@ static void CG10103_draw(running_machine *machine, int numchip, bitmap_t* screen
int num = cmd & 0xFF; int num = cmd & 0xFF;
// Draw the sprite // Draw the sprite
CG10103_draw_sprite(machine, screen, cliprect, CG10103_cur_chip->vram + 0x400 + num*4, priority); CG10103_draw_sprite(machine, screen, cliprect, state->CG10103_cur_chip->vram + 0x400 + num*4, priority);
} }
} }
} }
@ -502,19 +505,19 @@ static void CG10103_init(int numchips)
} }
} }
static void CG10103_set_pal_base(int numchip, int pal_base) static void CG10103_set_pal_base(gstriker_state *state, int numchip, int pal_base)
{ {
CG10103[numchip].pal_base = pal_base; state->CG10103[numchip].pal_base = pal_base;
} }
static void CG10103_set_gfx_region(int numchip, int gfx_region) static void CG10103_set_gfx_region(gstriker_state *state, int numchip, int gfx_region)
{ {
CG10103[numchip].gfx_region = gfx_region; state->CG10103[numchip].gfx_region = gfx_region;
} }
static void CG10103_set_transpen(int numchip, int transpen) static void CG10103_set_transpen(gstriker_state *state, int numchip, int transpen)
{ {
CG10103[numchip].transpen = transpen; state->CG10103[numchip].transpen = transpen;
} }
@ -532,6 +535,7 @@ WRITE16_HANDLER( gsx_videoram3_w )
SCREEN_UPDATE(gstriker) SCREEN_UPDATE(gstriker)
{ {
gstriker_state *state = screen->machine->driver_data<gstriker_state>();
bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine)); bitmap_fill(bitmap,cliprect,get_black_pen(screen->machine));
// Sandwitched screen/sprite0/score/sprite1. Surely wrong, probably // Sandwitched screen/sprite0/score/sprite1. Surely wrong, probably
@ -540,14 +544,14 @@ SCREEN_UPDATE(gstriker)
CG10103_draw(screen->machine, 0, bitmap, cliprect, 0); CG10103_draw(screen->machine, 0, bitmap, cliprect, 0);
VS920A_draw(0, bitmap, cliprect, 0); VS920A_draw(state, 0, bitmap, cliprect, 0);
CG10103_draw(screen->machine, 0, bitmap, cliprect, 1); CG10103_draw(screen->machine, 0, bitmap, cliprect, 1);
#if 0 #if 0
popmessage("%04x %04x %04x %04x %04x %04x %04x %04x", popmessage("%04x %04x %04x %04x %04x %04x %04x %04x",
(UINT16)MB60553[0].regs[0], (UINT16)MB60553[0].regs[1], (UINT16)MB60553[0].regs[2], (UINT16)MB60553[0].regs[3], (UINT16)state->MB60553[0].regs[0], (UINT16)state->MB60553[0].regs[1], (UINT16)state->MB60553[0].regs[2], (UINT16)state->MB60553[0].regs[3],
(UINT16)MB60553[0].regs[4], (UINT16)MB60553[0].regs[5], (UINT16)MB60553[0].regs[6], (UINT16)MB60553[0].regs[7] (UINT16)state->MB60553[0].regs[4], (UINT16)state->MB60553[0].regs[5], (UINT16)state->MB60553[0].regs[6], (UINT16)state->MB60553[0].regs[7]
); );
#endif #endif
@ -562,69 +566,75 @@ SCREEN_UPDATE(gstriker)
VIDEO_START(gstriker) VIDEO_START(gstriker)
{ {
gstriker_state *state = machine->driver_data<gstriker_state>();
// Palette bases are hardcoded, but should be probably extracted from the mixer registers // Palette bases are hardcoded, but should be probably extracted from the mixer registers
// Initalize the chip for the score plane // Initalize the chip for the score plane
VS920A_init(machine, 1); VS920A_init(machine, 1);
VS920A_set_gfx_region(0, 0); VS920A_set_gfx_region(state, 0, 0);
VS920A_set_pal_base(0, 0x30); VS920A_set_pal_base(state, 0, 0x30);
tilemap_set_transparent_pen(VS920A_get_tilemap(0), 0xf); tilemap_set_transparent_pen(VS920A_get_tilemap(state, 0), 0xf);
// Initalize the chip for the screen plane // Initalize the chip for the screen plane
MB60553_init(machine, 1); MB60553_init(machine, 1);
MB60553_set_gfx_region(0, 1); MB60553_set_gfx_region(state, 0, 1);
MB60553_set_pal_base(0, 0); MB60553_set_pal_base(state, 0, 0);
tilemap_set_transparent_pen(MB60553_get_tilemap(0), 0xf); tilemap_set_transparent_pen(MB60553_get_tilemap(state, 0), 0xf);
// Initialize the sprite generator // Initialize the sprite generator
CG10103_init(1); CG10103_init(1);
CG10103_set_gfx_region(0, 2); CG10103_set_gfx_region(state, 0, 2);
CG10103_set_pal_base(0, 0x10); CG10103_set_pal_base(state, 0, 0x10);
CG10103_set_transpen(0, 0x0); CG10103_set_transpen(state, 0, 0x0);
} }
VIDEO_START(twrldc94) VIDEO_START(twrldc94)
{ {
gstriker_state *state = machine->driver_data<gstriker_state>();
// Palette bases are hardcoded, but should be probably extracted from the mixer registers // Palette bases are hardcoded, but should be probably extracted from the mixer registers
// Initalize the chip for the score plane // Initalize the chip for the score plane
VS920A_init(machine, 1); VS920A_init(machine, 1);
VS920A_set_gfx_region(0, 0); VS920A_set_gfx_region(state, 0, 0);
VS920A_set_pal_base(0, 0x40); VS920A_set_pal_base(state, 0, 0x40);
tilemap_set_transparent_pen(VS920A_get_tilemap(0), 0xf); tilemap_set_transparent_pen(VS920A_get_tilemap(state, 0), 0xf);
// Initalize the chip for the screen plane // Initalize the chip for the screen plane
MB60553_init(machine, 1); MB60553_init(machine, 1);
MB60553_set_gfx_region(0, 1); MB60553_set_gfx_region(state, 0, 1);
MB60553_set_pal_base(0, 0x50); MB60553_set_pal_base(state, 0, 0x50);
tilemap_set_transparent_pen(MB60553_get_tilemap(0), 0xf); tilemap_set_transparent_pen(MB60553_get_tilemap(state, 0), 0xf);
// Initialize the sprite generator // Initialize the sprite generator
CG10103_init(1); CG10103_init(1);
CG10103_set_gfx_region(0, 2); CG10103_set_gfx_region(state, 0, 2);
CG10103_set_pal_base(0, 0x60); CG10103_set_pal_base(state, 0, 0x60);
CG10103_set_transpen(0, 0x0); CG10103_set_transpen(state, 0, 0x0);
} }
VIDEO_START(vgoalsoc) VIDEO_START(vgoalsoc)
{ {
gstriker_state *state = machine->driver_data<gstriker_state>();
// Palette bases are hardcoded, but should be probably extracted from the mixer registers // Palette bases are hardcoded, but should be probably extracted from the mixer registers
// Initalize the chip for the score plane // Initalize the chip for the score plane
VS920A_init(machine, 1); VS920A_init(machine, 1);
VS920A_set_gfx_region(0, 0); VS920A_set_gfx_region(state, 0, 0);
VS920A_set_pal_base(0, 0x30); VS920A_set_pal_base(state, 0, 0x30);
tilemap_set_transparent_pen(VS920A_get_tilemap(0), 0xf); tilemap_set_transparent_pen(VS920A_get_tilemap(state, 0), 0xf);
// Initalize the chip for the screen plane // Initalize the chip for the screen plane
MB60553_init(machine, 1); MB60553_init(machine, 1);
MB60553_set_gfx_region(0, 1); MB60553_set_gfx_region(state, 0, 1);
MB60553_set_pal_base(0, 0x20); MB60553_set_pal_base(state, 0, 0x20);
tilemap_set_transparent_pen(MB60553_get_tilemap(0), 0xf); tilemap_set_transparent_pen(MB60553_get_tilemap(state, 0), 0xf);
// Initialize the sprite generator // Initialize the sprite generator
CG10103_init(1); CG10103_init(1);
CG10103_set_gfx_region(0, 2); CG10103_set_gfx_region(state, 0, 2);
CG10103_set_pal_base(0, 0x00); CG10103_set_pal_base(state, 0, 0x00);
CG10103_set_transpen(0, 0xf); CG10103_set_transpen(state, 0, 0xf);
} }

View File

@ -16,144 +16,113 @@ priority should be given to
#include "includes/tetrisp2.h" #include "includes/tetrisp2.h"
#include "includes/ms32.h" #include "includes/ms32.h"
static bitmap_t* temp_bitmap_tilemaps;
static bitmap_t* temp_bitmap_sprites;
static bitmap_t* temp_bitmap_sprites_pri;
//UINT32 *ms32_fce00000;
UINT32 *ms32_roz_ctrl;
UINT32 *ms32_tx_scroll;
UINT32 *ms32_bg_scroll;
//UINT32 *ms32_priram;
//UINT32 *ms32_palram;
//UINT32 *ms32_rozram;
//UINT32 *ms32_lineram;
//UINT32 *ms32_spram;
//UINT32 *ms32_bgram;
//UINT32 *ms32_txram;
UINT32 *ms32_mainram;
UINT8* ms32_priram_8;
UINT16* ms32_palram_16;
UINT16* ms32_rozram_16;
UINT16 *ms32_lineram_16;
UINT16 *ms32_sprram_16;
UINT16 *ms32_bgram_16;
UINT16 *ms32_txram_16;
UINT32 ms32_tilemaplayoutcontrol;
UINT16* f1superb_extraram_16;
// kirarast, tp2m32, and 47pie2 require the sprites in a different order // kirarast, tp2m32, and 47pie2 require the sprites in a different order
static int ms32_reverse_sprite_order;
/********** Tilemaps **********/ /********** Tilemaps **********/
tilemap_t *ms32_tx_tilemap, *ms32_roz_tilemap, *ms32_bg_tilemap, *ms32_bg_tilemap_alt;
tilemap_t *ms32_extra_tilemap;
static int flipscreen;
static TILE_GET_INFO( get_ms32_tx_tile_info ) static TILE_GET_INFO( get_ms32_tx_tile_info )
{ {
ms32_state *state = machine->driver_data<ms32_state>();
int tileno, colour; int tileno, colour;
tileno = ms32_txram_16[tile_index *2] & 0xffff; tileno = state->txram_16[tile_index *2] & 0xffff;
colour = ms32_txram_16[tile_index *2+1] & 0x000f; colour = state->txram_16[tile_index *2+1] & 0x000f;
SET_TILE_INFO(3,tileno,colour,0); SET_TILE_INFO(3,tileno,colour,0);
} }
static TILE_GET_INFO( get_ms32_roz_tile_info ) static TILE_GET_INFO( get_ms32_roz_tile_info )
{ {
ms32_state *state = machine->driver_data<ms32_state>();
int tileno,colour; int tileno,colour;
tileno = ms32_rozram_16[tile_index *2] & 0xffff; tileno = state->rozram_16[tile_index *2] & 0xffff;
colour = ms32_rozram_16[tile_index *2+1] & 0x000f; colour = state->rozram_16[tile_index *2+1] & 0x000f;
SET_TILE_INFO(1,tileno,colour,0); SET_TILE_INFO(1,tileno,colour,0);
} }
static TILE_GET_INFO( get_ms32_bg_tile_info ) static TILE_GET_INFO( get_ms32_bg_tile_info )
{ {
ms32_state *state = machine->driver_data<ms32_state>();
int tileno,colour; int tileno,colour;
tileno = ms32_bgram_16[tile_index *2] & 0xffff; tileno = state->bgram_16[tile_index *2] & 0xffff;
colour = ms32_bgram_16[tile_index *2+1] & 0x000f; colour = state->bgram_16[tile_index *2+1] & 0x000f;
SET_TILE_INFO(2,tileno,colour,0); SET_TILE_INFO(2,tileno,colour,0);
} }
static TILE_GET_INFO( get_ms32_extra_tile_info ) static TILE_GET_INFO( get_ms32_extra_tile_info )
{ {
ms32_state *state = machine->driver_data<ms32_state>();
int tileno,colour; int tileno,colour;
tileno = f1superb_extraram_16[tile_index *2] & 0xffff; tileno = state->f1superb_extraram_16[tile_index *2] & 0xffff;
colour = f1superb_extraram_16[tile_index *2+1] & 0x000f; colour = state->f1superb_extraram_16[tile_index *2+1] & 0x000f;
SET_TILE_INFO(4,tileno,colour+0x50,0); SET_TILE_INFO(4,tileno,colour+0x50,0);
} }
static UINT32 brt[4];
static int brt_r,brt_g,brt_b;
VIDEO_START( ms32 ) VIDEO_START( ms32 )
{ {
ms32_state *state = machine->driver_data<ms32_state>();
int width = machine->primary_screen->width(); int width = machine->primary_screen->width();
int height = machine->primary_screen->height(); int height = machine->primary_screen->height();
ms32_priram_8 = auto_alloc_array_clear(machine, UINT8, 0x2000); state->priram_8 = auto_alloc_array_clear(machine, UINT8, 0x2000);
ms32_palram_16 = auto_alloc_array_clear(machine, UINT16, 0x20000); state->palram_16 = auto_alloc_array_clear(machine, UINT16, 0x20000);
ms32_rozram_16 = auto_alloc_array_clear(machine, UINT16, 0x10000); state->rozram_16 = auto_alloc_array_clear(machine, UINT16, 0x10000);
ms32_lineram_16 = auto_alloc_array_clear(machine, UINT16, 0x1000); state->lineram_16 = auto_alloc_array_clear(machine, UINT16, 0x1000);
ms32_sprram_16 = auto_alloc_array_clear(machine, UINT16, 0x20000); state->sprram_16 = auto_alloc_array_clear(machine, UINT16, 0x20000);
ms32_bgram_16 = auto_alloc_array_clear(machine, UINT16, 0x4000); state->bgram_16 = auto_alloc_array_clear(machine, UINT16, 0x4000);
ms32_txram_16 = auto_alloc_array_clear(machine, UINT16, 0x4000); state->txram_16 = auto_alloc_array_clear(machine, UINT16, 0x4000);
ms32_tx_tilemap = tilemap_create(machine, get_ms32_tx_tile_info,tilemap_scan_rows,8, 8,64,64); state->tx_tilemap = tilemap_create(machine, get_ms32_tx_tile_info,tilemap_scan_rows,8, 8,64,64);
ms32_bg_tilemap = tilemap_create(machine, get_ms32_bg_tile_info,tilemap_scan_rows,16,16,64,64); state->bg_tilemap = tilemap_create(machine, get_ms32_bg_tile_info,tilemap_scan_rows,16,16,64,64);
ms32_bg_tilemap_alt = tilemap_create(machine, get_ms32_bg_tile_info,tilemap_scan_rows,16,16,256,16); // alt layout, controller by register? state->bg_tilemap_alt = tilemap_create(machine, get_ms32_bg_tile_info,tilemap_scan_rows,16,16,256,16); // alt layout, controller by register?
ms32_roz_tilemap = tilemap_create(machine, get_ms32_roz_tile_info,tilemap_scan_rows,16,16,128,128); state->roz_tilemap = tilemap_create(machine, get_ms32_roz_tile_info,tilemap_scan_rows,16,16,128,128);
/* set up tile layers */ /* set up tile layers */
temp_bitmap_tilemaps = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16); state->temp_bitmap_tilemaps = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16);
temp_bitmap_sprites = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16); state->temp_bitmap_sprites = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16);
temp_bitmap_sprites_pri = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16); // not actually being used for rendering, we embed pri info in the raw colour bitmap state->temp_bitmap_sprites_pri = auto_bitmap_alloc(machine, width, height, BITMAP_FORMAT_INDEXED16); // not actually being used for rendering, we embed pri info in the raw colour bitmap
bitmap_fill(temp_bitmap_tilemaps,0,0); bitmap_fill(state->temp_bitmap_tilemaps,0,0);
bitmap_fill(temp_bitmap_sprites,0,0); bitmap_fill(state->temp_bitmap_sprites,0,0);
bitmap_fill(temp_bitmap_sprites_pri,0,0); bitmap_fill(state->temp_bitmap_sprites_pri,0,0);
tilemap_set_transparent_pen(ms32_tx_tilemap,0); tilemap_set_transparent_pen(state->tx_tilemap,0);
tilemap_set_transparent_pen(ms32_bg_tilemap,0); tilemap_set_transparent_pen(state->bg_tilemap,0);
tilemap_set_transparent_pen(ms32_bg_tilemap_alt,0); tilemap_set_transparent_pen(state->bg_tilemap_alt,0);
tilemap_set_transparent_pen(ms32_roz_tilemap,0); tilemap_set_transparent_pen(state->roz_tilemap,0);
ms32_reverse_sprite_order = 1; state->reverse_sprite_order = 1;
/* i hate per game patches...how should priority really work? tetrisp2.c ? i can't follow it */ /* i hate per game patches...how should priority really work? tetrisp2.c ? i can't follow it */
if (!strcmp(machine->gamedrv->name,"kirarast")) ms32_reverse_sprite_order = 0; if (!strcmp(machine->gamedrv->name,"kirarast")) state->reverse_sprite_order = 0;
if (!strcmp(machine->gamedrv->name,"tp2m32")) ms32_reverse_sprite_order = 0; if (!strcmp(machine->gamedrv->name,"tp2m32")) state->reverse_sprite_order = 0;
if (!strcmp(machine->gamedrv->name,"47pie2")) ms32_reverse_sprite_order = 0; if (!strcmp(machine->gamedrv->name,"47pie2")) state->reverse_sprite_order = 0;
if (!strcmp(machine->gamedrv->name,"47pie2o")) ms32_reverse_sprite_order = 0; if (!strcmp(machine->gamedrv->name,"47pie2o")) state->reverse_sprite_order = 0;
if (!strcmp(machine->gamedrv->name,"hayaosi3")) ms32_reverse_sprite_order = 0; if (!strcmp(machine->gamedrv->name,"hayaosi3")) state->reverse_sprite_order = 0;
if (!strcmp(machine->gamedrv->name,"bnstars")) ms32_reverse_sprite_order = 0; if (!strcmp(machine->gamedrv->name,"bnstars")) state->reverse_sprite_order = 0;
if (!strcmp(machine->gamedrv->name,"wpksocv2")) ms32_reverse_sprite_order = 0; if (!strcmp(machine->gamedrv->name,"wpksocv2")) state->reverse_sprite_order = 0;
// tp2m32 doesn't set the brightness registers so we need sensible defaults // tp2m32 doesn't set the brightness registers so we need sensible defaults
brt[0] = brt[1] = 0xffff; state->brt[0] = state->brt[1] = 0xffff;
} }
VIDEO_START( f1superb ) VIDEO_START( f1superb )
{ {
ms32_state *state = machine->driver_data<ms32_state>();
VIDEO_START_CALL( ms32 ); VIDEO_START_CALL( ms32 );
f1superb_extraram_16 = auto_alloc_array_clear(machine, UINT16, 0x10000); state->f1superb_extraram_16 = auto_alloc_array_clear(machine, UINT16, 0x10000);
ms32_extra_tilemap = tilemap_create(machine, get_ms32_extra_tile_info,tilemap_scan_rows,2048,1,1,0x400); state->extra_tilemap = tilemap_create(machine, get_ms32_extra_tile_info,tilemap_scan_rows,2048,1,1,0x400);
} }
@ -162,6 +131,7 @@ VIDEO_START( f1superb )
static void update_color(running_machine *machine, int color) static void update_color(running_machine *machine, int color)
{ {
ms32_state *state = machine->driver_data<ms32_state>();
int r,g,b; int r,g,b;
/* I'm not sure how the brightness should be applied, currently I'm only /* I'm not sure how the brightness should be applied, currently I'm only
@ -170,15 +140,15 @@ static void update_color(running_machine *machine, int color)
*/ */
if (~color & 0x4000) if (~color & 0x4000)
{ {
r = ((ms32_palram_16[color*2] & 0xff00) >>8 ) * brt_r / 0x100; r = ((state->palram_16[color*2] & 0xff00) >>8 ) * state->brt_r / 0x100;
g = ((ms32_palram_16[color*2] & 0x00ff) >>0 ) * brt_g / 0x100; g = ((state->palram_16[color*2] & 0x00ff) >>0 ) * state->brt_g / 0x100;
b = ((ms32_palram_16[color*2+1] & 0x00ff) >>0 ) * brt_b / 0x100; b = ((state->palram_16[color*2+1] & 0x00ff) >>0 ) * state->brt_b / 0x100;
} }
else else
{ {
r = ((ms32_palram_16[color*2] & 0xff00) >>8 ); r = ((state->palram_16[color*2] & 0xff00) >>8 );
g = ((ms32_palram_16[color*2] & 0x00ff) >>0 ); g = ((state->palram_16[color*2] & 0x00ff) >>0 );
b = ((ms32_palram_16[color*2+1] & 0x00ff) >>0 ); b = ((state->palram_16[color*2+1] & 0x00ff) >>0 );
} }
palette_set_color(machine,color,MAKE_RGB(r,g,b)); palette_set_color(machine,color,MAKE_RGB(r,g,b));
@ -186,26 +156,27 @@ static void update_color(running_machine *machine, int color)
WRITE32_HANDLER( ms32_brightness_w ) WRITE32_HANDLER( ms32_brightness_w )
{ {
int oldword = brt[offset]; ms32_state *state = space->machine->driver_data<ms32_state>();
COMBINE_DATA(&brt[offset]); int oldword = state->brt[offset];
COMBINE_DATA(&state->brt[offset]);
if (brt[offset] != oldword) if (state->brt[offset] != oldword)
{ {
int bank = ((offset & 2) >> 1) * 0x4000; int bank = ((offset & 2) >> 1) * 0x4000;
//int i; //int i;
if (bank == 0) if (bank == 0)
{ {
brt_r = 0x100 - ((brt[0] & 0xff00) >> 8); state->brt_r = 0x100 - ((state->brt[0] & 0xff00) >> 8);
brt_g = 0x100 - ((brt[0] & 0x00ff) >> 0); state->brt_g = 0x100 - ((state->brt[0] & 0x00ff) >> 0);
brt_b = 0x100 - ((brt[1] & 0x00ff) >> 0); state->brt_b = 0x100 - ((state->brt[1] & 0x00ff) >> 0);
// for (i = 0;i < 0x3000;i++) // colors 0x3000-0x3fff are not used // for (i = 0;i < 0x3000;i++) // colors 0x3000-0x3fff are not used
// update_color(space->machine, i); // update_color(space->machine, i);
} }
} }
//popmessage("%04x %04x %04x %04x",brt[0],brt[1],brt[2],brt[3]); //popmessage("%04x %04x %04x %04x",state->brt[0],state->brt[1],state->brt[2],state->brt[3]);
} }
@ -215,13 +186,14 @@ WRITE32_HANDLER( ms32_brightness_w )
WRITE32_HANDLER( ms32_gfxctrl_w ) WRITE32_HANDLER( ms32_gfxctrl_w )
{ {
ms32_state *state = space->machine->driver_data<ms32_state>();
if (ACCESSING_BITS_0_7) if (ACCESSING_BITS_0_7)
{ {
/* bit 1 = flip screen */ /* bit 1 = flip screen */
flipscreen = data & 0x02; state->flipscreen = data & 0x02;
tilemap_set_flip(ms32_tx_tilemap,flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); tilemap_set_flip(state->tx_tilemap,state->flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0);
tilemap_set_flip(ms32_bg_tilemap,flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); tilemap_set_flip(state->bg_tilemap,state->flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0);
tilemap_set_flip(ms32_bg_tilemap_alt,flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); tilemap_set_flip(state->bg_tilemap_alt,state->flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0);
/* bit 2 used by f1superb, unknown */ /* bit 2 used by f1superb, unknown */
@ -240,11 +212,12 @@ WRITE32_HANDLER( ms32_gfxctrl_w )
static void draw_roz(bitmap_t *bitmap, const rectangle *cliprect,int priority) static void draw_roz(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect,int priority)
{ {
ms32_state *state = machine->driver_data<ms32_state>();
/* TODO: registers 0x40/4 / 0x44/4 and 0x50/4 / 0x54/4 are used, meaning unknown */ /* TODO: registers 0x40/4 / 0x44/4 and 0x50/4 / 0x54/4 are used, meaning unknown */
if (ms32_roz_ctrl[0x5c/4] & 1) /* "super" mode */ if (state->roz_ctrl[0x5c/4] & 1) /* "super" mode */
{ {
rectangle my_clip; rectangle my_clip;
int y,maxy; int y,maxy;
@ -257,21 +230,21 @@ static void draw_roz(bitmap_t *bitmap, const rectangle *cliprect,int priority)
while (y <= maxy) while (y <= maxy)
{ {
UINT16 *lineaddr = ms32_lineram_16 + 8 * (y & 0xff); UINT16 *lineaddr = state->lineram_16 + 8 * (y & 0xff);
int start2x = (lineaddr[0x00/4] & 0xffff) | ((lineaddr[0x04/4] & 3) << 16); int start2x = (lineaddr[0x00/4] & 0xffff) | ((lineaddr[0x04/4] & 3) << 16);
int start2y = (lineaddr[0x08/4] & 0xffff) | ((lineaddr[0x0c/4] & 3) << 16); int start2y = (lineaddr[0x08/4] & 0xffff) | ((lineaddr[0x0c/4] & 3) << 16);
int incxx = (lineaddr[0x10/4] & 0xffff) | ((lineaddr[0x14/4] & 1) << 16); int incxx = (lineaddr[0x10/4] & 0xffff) | ((lineaddr[0x14/4] & 1) << 16);
int incxy = (lineaddr[0x18/4] & 0xffff) | ((lineaddr[0x1c/4] & 1) << 16); int incxy = (lineaddr[0x18/4] & 0xffff) | ((lineaddr[0x1c/4] & 1) << 16);
int startx = (ms32_roz_ctrl[0x00/4] & 0xffff) | ((ms32_roz_ctrl[0x04/4] & 3) << 16); int startx = (state->roz_ctrl[0x00/4] & 0xffff) | ((state->roz_ctrl[0x04/4] & 3) << 16);
int starty = (ms32_roz_ctrl[0x08/4] & 0xffff) | ((ms32_roz_ctrl[0x0c/4] & 3) << 16); int starty = (state->roz_ctrl[0x08/4] & 0xffff) | ((state->roz_ctrl[0x0c/4] & 3) << 16);
int offsx = ms32_roz_ctrl[0x30/4]; int offsx = state->roz_ctrl[0x30/4];
int offsy = ms32_roz_ctrl[0x34/4]; int offsy = state->roz_ctrl[0x34/4];
my_clip.min_y = my_clip.max_y = y; my_clip.min_y = my_clip.max_y = y;
offsx += (ms32_roz_ctrl[0x38/4] & 1) * 0x400; // ??? gratia, hayaosi1... offsx += (state->roz_ctrl[0x38/4] & 1) * 0x400; // ??? gratia, hayaosi1...
offsy += (ms32_roz_ctrl[0x3c/4] & 1) * 0x400; // ??? gratia, hayaosi1... offsy += (state->roz_ctrl[0x3c/4] & 1) * 0x400; // ??? gratia, hayaosi1...
/* extend sign */ /* extend sign */
if (start2x & 0x20000) start2x |= ~0x3ffff; if (start2x & 0x20000) start2x |= ~0x3ffff;
@ -281,7 +254,7 @@ static void draw_roz(bitmap_t *bitmap, const rectangle *cliprect,int priority)
if (incxx & 0x10000) incxx |= ~0x1ffff; if (incxx & 0x10000) incxx |= ~0x1ffff;
if (incxy & 0x10000) incxy |= ~0x1ffff; if (incxy & 0x10000) incxy |= ~0x1ffff;
tilemap_draw_roz(bitmap, &my_clip, ms32_roz_tilemap, tilemap_draw_roz(bitmap, &my_clip, state->roz_tilemap,
(start2x+startx+offsx)<<16, (start2y+starty+offsy)<<16, (start2x+startx+offsx)<<16, (start2y+starty+offsy)<<16,
incxx<<8, incxy<<8, 0, 0, incxx<<8, incxy<<8, 0, 0,
1, // Wrap 1, // Wrap
@ -292,17 +265,17 @@ static void draw_roz(bitmap_t *bitmap, const rectangle *cliprect,int priority)
} }
else /* "simple" mode */ else /* "simple" mode */
{ {
int startx = (ms32_roz_ctrl[0x00/4] & 0xffff) | ((ms32_roz_ctrl[0x04/4] & 3) << 16); int startx = (state->roz_ctrl[0x00/4] & 0xffff) | ((state->roz_ctrl[0x04/4] & 3) << 16);
int starty = (ms32_roz_ctrl[0x08/4] & 0xffff) | ((ms32_roz_ctrl[0x0c/4] & 3) << 16); int starty = (state->roz_ctrl[0x08/4] & 0xffff) | ((state->roz_ctrl[0x0c/4] & 3) << 16);
int incxx = (ms32_roz_ctrl[0x10/4] & 0xffff) | ((ms32_roz_ctrl[0x14/4] & 1) << 16); int incxx = (state->roz_ctrl[0x10/4] & 0xffff) | ((state->roz_ctrl[0x14/4] & 1) << 16);
int incxy = (ms32_roz_ctrl[0x18/4] & 0xffff) | ((ms32_roz_ctrl[0x1c/4] & 1) << 16); int incxy = (state->roz_ctrl[0x18/4] & 0xffff) | ((state->roz_ctrl[0x1c/4] & 1) << 16);
int incyy = (ms32_roz_ctrl[0x20/4] & 0xffff) | ((ms32_roz_ctrl[0x24/4] & 1) << 16); int incyy = (state->roz_ctrl[0x20/4] & 0xffff) | ((state->roz_ctrl[0x24/4] & 1) << 16);
int incyx = (ms32_roz_ctrl[0x28/4] & 0xffff) | ((ms32_roz_ctrl[0x2c/4] & 1) << 16); int incyx = (state->roz_ctrl[0x28/4] & 0xffff) | ((state->roz_ctrl[0x2c/4] & 1) << 16);
int offsx = ms32_roz_ctrl[0x30/4]; int offsx = state->roz_ctrl[0x30/4];
int offsy = ms32_roz_ctrl[0x34/4]; int offsy = state->roz_ctrl[0x34/4];
offsx += (ms32_roz_ctrl[0x38/4] & 1) * 0x400; // ??? gratia, hayaosi1... offsx += (state->roz_ctrl[0x38/4] & 1) * 0x400; // ??? gratia, hayaosi1...
offsy += (ms32_roz_ctrl[0x3c/4] & 1) * 0x400; // ??? gratia, hayaosi1... offsy += (state->roz_ctrl[0x3c/4] & 1) * 0x400; // ??? gratia, hayaosi1...
/* extend sign */ /* extend sign */
if (startx & 0x20000) startx |= ~0x3ffff; if (startx & 0x20000) startx |= ~0x3ffff;
@ -312,7 +285,7 @@ static void draw_roz(bitmap_t *bitmap, const rectangle *cliprect,int priority)
if (incyy & 0x10000) incyy |= ~0x1ffff; if (incyy & 0x10000) incyy |= ~0x1ffff;
if (incyx & 0x10000) incyx |= ~0x1ffff; if (incyx & 0x10000) incyx |= ~0x1ffff;
tilemap_draw_roz(bitmap, cliprect, ms32_roz_tilemap, tilemap_draw_roz(bitmap, cliprect, state->roz_tilemap,
(startx+offsx)<<16, (starty+offsy)<<16, (startx+offsx)<<16, (starty+offsy)<<16,
incxx<<8, incxy<<8, incyx<<8, incyy<<8, incxx<<8, incxy<<8, incyx<<8, incyy<<8,
1, // Wrap 1, // Wrap
@ -324,6 +297,7 @@ static void draw_roz(bitmap_t *bitmap, const rectangle *cliprect,int priority)
SCREEN_UPDATE( ms32 ) SCREEN_UPDATE( ms32 )
{ {
ms32_state *state = screen->machine->driver_data<ms32_state>();
int scrollx,scrolly; int scrollx,scrolly;
int asc_pri; int asc_pri;
int scr_pri; int scr_pri;
@ -342,17 +316,17 @@ SCREEN_UPDATE( ms32 )
for (i = 0;i < 0x10000;i++) // colors 0x3000-0x3fff are not used for (i = 0;i < 0x10000;i++) // colors 0x3000-0x3fff are not used
update_color(screen->machine, i); update_color(screen->machine, i);
scrollx = ms32_tx_scroll[0x00/4] + ms32_tx_scroll[0x08/4] + 0x18; scrollx = state->tx_scroll[0x00/4] + state->tx_scroll[0x08/4] + 0x18;
scrolly = ms32_tx_scroll[0x0c/4] + ms32_tx_scroll[0x14/4]; scrolly = state->tx_scroll[0x0c/4] + state->tx_scroll[0x14/4];
tilemap_set_scrollx(ms32_tx_tilemap, 0, scrollx); tilemap_set_scrollx(state->tx_tilemap, 0, scrollx);
tilemap_set_scrolly(ms32_tx_tilemap, 0, scrolly); tilemap_set_scrolly(state->tx_tilemap, 0, scrolly);
scrollx = ms32_bg_scroll[0x00/4] + ms32_bg_scroll[0x08/4] + 0x10; scrollx = state->bg_scroll[0x00/4] + state->bg_scroll[0x08/4] + 0x10;
scrolly = ms32_bg_scroll[0x0c/4] + ms32_bg_scroll[0x14/4]; scrolly = state->bg_scroll[0x0c/4] + state->bg_scroll[0x14/4];
tilemap_set_scrollx(ms32_bg_tilemap, 0, scrollx); tilemap_set_scrollx(state->bg_tilemap, 0, scrollx);
tilemap_set_scrolly(ms32_bg_tilemap, 0, scrolly); tilemap_set_scrolly(state->bg_tilemap, 0, scrolly);
tilemap_set_scrollx(ms32_bg_tilemap_alt, 0, scrollx); tilemap_set_scrollx(state->bg_tilemap_alt, 0, scrollx);
tilemap_set_scrolly(ms32_bg_tilemap_alt, 0, scrolly); tilemap_set_scrolly(state->bg_tilemap_alt, 0, scrolly);
bitmap_fill(screen->machine->priority_bitmap,cliprect,0); bitmap_fill(screen->machine->priority_bitmap,cliprect,0);
@ -361,75 +335,75 @@ SCREEN_UPDATE( ms32 )
/* TODO: 0 is correct for gametngk, but break f1superb scrolling grid (text at /* TODO: 0 is correct for gametngk, but break f1superb scrolling grid (text at
top and bottom of the screen becomes black on black) */ top and bottom of the screen becomes black on black) */
bitmap_fill(temp_bitmap_tilemaps,cliprect,0); /* bg color */ bitmap_fill(state->temp_bitmap_tilemaps,cliprect,0); /* bg color */
/* clear our sprite bitmaps */ /* clear our sprite bitmaps */
bitmap_fill(temp_bitmap_sprites,cliprect,0); bitmap_fill(state->temp_bitmap_sprites,cliprect,0);
bitmap_fill(temp_bitmap_sprites_pri,cliprect,0); bitmap_fill(state->temp_bitmap_sprites_pri,cliprect,0);
tetrisp2_draw_sprites(screen->machine, temp_bitmap_sprites, temp_bitmap_sprites_pri, cliprect, NULL, ms32_sprram_16, 0x20000, 0, ms32_reverse_sprite_order, 0, 1 ); tetrisp2_draw_sprites(screen->machine, state->temp_bitmap_sprites, state->temp_bitmap_sprites_pri, cliprect, NULL, state->sprram_16, 0x20000, 0, state->reverse_sprite_order, 0, 1 );
asc_pri = scr_pri = rot_pri = 0; asc_pri = scr_pri = rot_pri = 0;
if((ms32_priram_8[0x2b00 / 2] & 0x00ff) == 0x0034) if((state->priram_8[0x2b00 / 2] & 0x00ff) == 0x0034)
asc_pri++; asc_pri++;
else else
rot_pri++; rot_pri++;
if((ms32_priram_8[0x2e00 / 2] & 0x00ff) == 0x0034) if((state->priram_8[0x2e00 / 2] & 0x00ff) == 0x0034)
asc_pri++; asc_pri++;
else else
scr_pri++; scr_pri++;
if((ms32_priram_8[0x3a00 / 2] & 0x00ff) == 0x000c) if((state->priram_8[0x3a00 / 2] & 0x00ff) == 0x000c)
scr_pri++; scr_pri++;
else else
rot_pri++; rot_pri++;
if (rot_pri == 0) if (rot_pri == 0)
draw_roz(temp_bitmap_tilemaps,cliprect, 1 << 1); draw_roz(screen->machine, state->temp_bitmap_tilemaps, cliprect, 1 << 1);
else if (scr_pri == 0) else if (scr_pri == 0)
if (ms32_tilemaplayoutcontrol&1) if (state->tilemaplayoutcontrol&1)
{ {
tilemap_draw(temp_bitmap_tilemaps,cliprect, ms32_bg_tilemap_alt, 0, 1 << 0); tilemap_draw(state->temp_bitmap_tilemaps,cliprect, state->bg_tilemap_alt, 0, 1 << 0);
} }
else else
{ {
tilemap_draw(temp_bitmap_tilemaps,cliprect, ms32_bg_tilemap, 0, 1 << 0); tilemap_draw(state->temp_bitmap_tilemaps,cliprect, state->bg_tilemap, 0, 1 << 0);
} }
else if (asc_pri == 0) else if (asc_pri == 0)
tilemap_draw(temp_bitmap_tilemaps,cliprect, ms32_tx_tilemap, 0, 1 << 2); tilemap_draw(state->temp_bitmap_tilemaps,cliprect, state->tx_tilemap, 0, 1 << 2);
if (rot_pri == 1) if (rot_pri == 1)
draw_roz(temp_bitmap_tilemaps,cliprect, 1 << 1); draw_roz(screen->machine, state->temp_bitmap_tilemaps, cliprect, 1 << 1);
else if (scr_pri == 1) else if (scr_pri == 1)
if (ms32_tilemaplayoutcontrol&1) if (state->tilemaplayoutcontrol&1)
{ {
tilemap_draw(temp_bitmap_tilemaps,cliprect, ms32_bg_tilemap_alt, 0, 1 << 0); tilemap_draw(state->temp_bitmap_tilemaps,cliprect, state->bg_tilemap_alt, 0, 1 << 0);
} }
else else
{ {
tilemap_draw(temp_bitmap_tilemaps,cliprect, ms32_bg_tilemap, 0, 1 << 0); tilemap_draw(state->temp_bitmap_tilemaps,cliprect, state->bg_tilemap, 0, 1 << 0);
} }
else if (asc_pri == 1) else if (asc_pri == 1)
tilemap_draw(temp_bitmap_tilemaps,cliprect, ms32_tx_tilemap, 0, 1 << 2); tilemap_draw(state->temp_bitmap_tilemaps,cliprect, state->tx_tilemap, 0, 1 << 2);
if (rot_pri == 2) if (rot_pri == 2)
draw_roz(temp_bitmap_tilemaps,cliprect, 1 << 1); draw_roz(screen->machine, state->temp_bitmap_tilemaps, cliprect, 1 << 1);
else if (scr_pri == 2) else if (scr_pri == 2)
if (ms32_tilemaplayoutcontrol&1) if (state->tilemaplayoutcontrol&1)
{ {
tilemap_draw(temp_bitmap_tilemaps,cliprect, ms32_bg_tilemap_alt, 0, 1 << 0); tilemap_draw(state->temp_bitmap_tilemaps,cliprect, state->bg_tilemap_alt, 0, 1 << 0);
} }
else else
{ {
tilemap_draw(temp_bitmap_tilemaps,cliprect, ms32_bg_tilemap, 0, 1 << 0); tilemap_draw(state->temp_bitmap_tilemaps,cliprect, state->bg_tilemap, 0, 1 << 0);
} }
else if (asc_pri == 2) else if (asc_pri == 2)
tilemap_draw(temp_bitmap_tilemaps,cliprect, ms32_tx_tilemap, 0, 1 << 2); tilemap_draw(state->temp_bitmap_tilemaps,cliprect, state->tx_tilemap, 0, 1 << 2);
/* MIX it! */ /* MIX it! */
/* this mixing isn't 100% accurate, it should be using ALL the data in /* this mixing isn't 100% accurate, it should be using ALL the data in
@ -452,10 +426,10 @@ SCREEN_UPDATE( ms32 )
for (yy=0;yy<height;yy++) for (yy=0;yy<height;yy++)
{ {
srcptr_tile = BITMAP_ADDR16(temp_bitmap_tilemaps, yy, 0); srcptr_tile = BITMAP_ADDR16(state->temp_bitmap_tilemaps, yy, 0);
srcptr_tilepri = BITMAP_ADDR8(screen->machine->priority_bitmap, yy, 0); srcptr_tilepri = BITMAP_ADDR8(screen->machine->priority_bitmap, yy, 0);
srcptr_spri = BITMAP_ADDR16(temp_bitmap_sprites, yy, 0); srcptr_spri = BITMAP_ADDR16(state->temp_bitmap_sprites, yy, 0);
//srcptr_spripri = BITMAP_ADDR8(temp_bitmap_sprites_pri, yy, 0); //srcptr_spripri = BITMAP_ADDR8(state->temp_bitmap_sprites_pri, yy, 0);
dstptr_bitmap = BITMAP_ADDR32(bitmap, yy, 0); dstptr_bitmap = BITMAP_ADDR32(bitmap, yy, 0);
for (xx=0;xx<width;xx++) for (xx=0;xx<width;xx++)
{ {
@ -468,14 +442,14 @@ SCREEN_UPDATE( ms32 )
int primask = 0; int primask = 0;
// get sprite priority value back out of bitmap/colour data (this is done in draw_sprite for standalone hw) // get sprite priority value back out of bitmap/colour data (this is done in draw_sprite for standalone hw)
if (ms32_priram_8[(spritepri | 0x0a00 | 0x1500) / 2] & 0x38) primask |= 1 << 0; if (state->priram_8[(spritepri | 0x0a00 | 0x1500) / 2] & 0x38) primask |= 1 << 0;
if (ms32_priram_8[(spritepri | 0x0a00 | 0x1400) / 2] & 0x38) primask |= 1 << 1; if (state->priram_8[(spritepri | 0x0a00 | 0x1400) / 2] & 0x38) primask |= 1 << 1;
if (ms32_priram_8[(spritepri | 0x0a00 | 0x1100) / 2] & 0x38) primask |= 1 << 2; if (state->priram_8[(spritepri | 0x0a00 | 0x1100) / 2] & 0x38) primask |= 1 << 2;
if (ms32_priram_8[(spritepri | 0x0a00 | 0x1000) / 2] & 0x38) primask |= 1 << 3; if (state->priram_8[(spritepri | 0x0a00 | 0x1000) / 2] & 0x38) primask |= 1 << 3;
if (ms32_priram_8[(spritepri | 0x0a00 | 0x0500) / 2] & 0x38) primask |= 1 << 4; if (state->priram_8[(spritepri | 0x0a00 | 0x0500) / 2] & 0x38) primask |= 1 << 4;
if (ms32_priram_8[(spritepri | 0x0a00 | 0x0400) / 2] & 0x38) primask |= 1 << 5; if (state->priram_8[(spritepri | 0x0a00 | 0x0400) / 2] & 0x38) primask |= 1 << 5;
if (ms32_priram_8[(spritepri | 0x0a00 | 0x0100) / 2] & 0x38) primask |= 1 << 6; if (state->priram_8[(spritepri | 0x0a00 | 0x0100) / 2] & 0x38) primask |= 1 << 6;
if (ms32_priram_8[(spritepri | 0x0a00 | 0x0000) / 2] & 0x38) primask |= 1 << 7; if (state->priram_8[(spritepri | 0x0a00 | 0x0000) / 2] & 0x38) primask |= 1 << 7;
if (primask == 0x00) if (primask == 0x00)

View File

@ -9,8 +9,6 @@
#include "emu.h" #include "emu.h"
#include "includes/mustache.h" #include "includes/mustache.h"
static tilemap_t *bg_tilemap;
static int control_byte;
PALETTE_INIT(mustache) PALETTE_INIT(mustache)
{ {
@ -50,11 +48,12 @@ WRITE8_HANDLER( mustache_videoram_w )
mustache_state *state = space->machine->driver_data<mustache_state>(); mustache_state *state = space->machine->driver_data<mustache_state>();
UINT8 *videoram = state->videoram; UINT8 *videoram = state->videoram;
videoram[offset] = data; videoram[offset] = data;
tilemap_mark_tile_dirty(bg_tilemap, offset / 2); tilemap_mark_tile_dirty(state->bg_tilemap, offset / 2);
} }
WRITE8_HANDLER (mustache_video_control_w) WRITE8_HANDLER (mustache_video_control_w)
{ {
mustache_state *state = space->machine->driver_data<mustache_state>();
if (flip_screen_get(space->machine) != (data & 0x01)) if (flip_screen_get(space->machine) != (data & 0x01))
{ {
flip_screen_set(space->machine, data & 0x01); flip_screen_set(space->machine, data & 0x01);
@ -63,19 +62,20 @@ WRITE8_HANDLER (mustache_video_control_w)
/* tile bank */ /* tile bank */
if ((control_byte ^ data) & 0x08) if ((state->control_byte ^ data) & 0x08)
{ {
control_byte = data; state->control_byte = data;
tilemap_mark_all_tiles_dirty_all(space->machine); tilemap_mark_all_tiles_dirty_all(space->machine);
} }
} }
WRITE8_HANDLER( mustache_scroll_w ) WRITE8_HANDLER( mustache_scroll_w )
{ {
tilemap_set_scrollx(bg_tilemap, 0, 0x100 - data); mustache_state *state = space->machine->driver_data<mustache_state>();
tilemap_set_scrollx(bg_tilemap, 1, 0x100 - data); tilemap_set_scrollx(state->bg_tilemap, 0, 0x100 - data);
tilemap_set_scrollx(bg_tilemap, 2, 0x100 - data); tilemap_set_scrollx(state->bg_tilemap, 1, 0x100 - data);
tilemap_set_scrollx(bg_tilemap, 3, 0x100); tilemap_set_scrollx(state->bg_tilemap, 2, 0x100 - data);
tilemap_set_scrollx(state->bg_tilemap, 3, 0x100);
} }
static TILE_GET_INFO( get_bg_tile_info ) static TILE_GET_INFO( get_bg_tile_info )
@ -83,7 +83,7 @@ static TILE_GET_INFO( get_bg_tile_info )
mustache_state *state = machine->driver_data<mustache_state>(); mustache_state *state = machine->driver_data<mustache_state>();
UINT8 *videoram = state->videoram; UINT8 *videoram = state->videoram;
int attr = videoram[2 * tile_index + 1]; int attr = videoram[2 * tile_index + 1];
int code = videoram[2 * tile_index] + ((attr & 0x60) << 3) + ((control_byte & 0x08) << 7); int code = videoram[2 * tile_index] + ((attr & 0x60) << 3) + ((state->control_byte & 0x08) << 7);
int color = attr & 0x0f; int color = attr & 0x0f;
SET_TILE_INFO(0, code, color, ((attr & 0x10) ? TILE_FLIPX : 0) | ((attr & 0x80) ? TILE_FLIPY : 0) ); SET_TILE_INFO(0, code, color, ((attr & 0x10) ? TILE_FLIPX : 0) | ((attr & 0x80) ? TILE_FLIPY : 0) );
@ -93,14 +93,16 @@ static TILE_GET_INFO( get_bg_tile_info )
VIDEO_START( mustache ) VIDEO_START( mustache )
{ {
bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows_flip_x, mustache_state *state = machine->driver_data<mustache_state>();
state->bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows_flip_x,
8, 8, 64, 32); 8, 8, 64, 32);
tilemap_set_scroll_rows(bg_tilemap, 4); tilemap_set_scroll_rows(state->bg_tilemap, 4);
} }
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 )
{ {
mustache_state *state = machine->driver_data<mustache_state>();
rectangle clip = *cliprect; rectangle clip = *cliprect;
const gfx_element *gfx = machine->gfx[1]; const gfx_element *gfx = machine->gfx[1];
const rectangle &visarea = machine->primary_screen->visible_area(); const rectangle &visarea = machine->primary_screen->visible_area();
@ -119,7 +121,7 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
code+=(attr&0x0c)<<6; code+=(attr&0x0c)<<6;
if ((control_byte & 0xa)) if ((state->control_byte & 0xa))
clip.max_y = visarea.max_y; clip.max_y = visarea.max_y;
else else
if (flip_screen_get(machine)) if (flip_screen_get(machine))
@ -143,7 +145,8 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
SCREEN_UPDATE( mustache ) SCREEN_UPDATE( mustache )
{ {
tilemap_draw(bitmap, cliprect, bg_tilemap, 0, 0); mustache_state *state = screen->machine->driver_data<mustache_state>();
tilemap_draw(bitmap, cliprect, state->bg_tilemap, 0, 0);
draw_sprites(screen->machine, bitmap, cliprect); draw_sprites(screen->machine, bitmap, cliprect);
return 0; return 0;
} }

View File

@ -6,10 +6,6 @@
#include "includes/namcos2.h" #include "includes/namcos2.h"
#include "includes/namcofl.h" #include "includes/namcofl.h"
//UINT32 *namcofl_spritebank32;
//UINT32 *namcofl_tilebank32;
static UINT32 namcofl_sprbank;
/* nth_word32 is a general-purpose utility function, which allows us to /* nth_word32 is a general-purpose utility function, which allows us to
* read from 32-bit aligned memory as if it were an array of 16 bit words. * read from 32-bit aligned memory as if it were an array of 16 bit words.
@ -110,12 +106,14 @@ SCREEN_UPDATE( namcofl )
WRITE32_HANDLER(namcofl_spritebank_w) WRITE32_HANDLER(namcofl_spritebank_w)
{ {
COMBINE_DATA(&namcofl_sprbank); namcofl_state *state = space->machine->driver_data<namcofl_state>();
COMBINE_DATA(&state->sprbank);
} }
static int FLobjcode2tile( int code ) static int FLobjcode2tile( running_machine *machine, int code )
{ {
if ((code & 0x2000) && (namcofl_sprbank & 2)) { code += 0x4000; } namcofl_state *state = machine->driver_data<namcofl_state>();
if ((code & 0x2000) && (state->sprbank & 2)) { code += 0x4000; }
return code; return code;
} }

View File

@ -157,7 +157,7 @@ SCREEN_UPDATE( namconb1 )
} }
static int static int
NB1objcode2tile( int code ) NB1objcode2tile( running_machine *machine, int code )
{ {
int bank = nth_word32( namconb1_spritebank32, code>>11 ); int bank = nth_word32( namconb1_spritebank32, code>>11 );
return (code&0x7ff) + bank*0x800; return (code&0x7ff) + bank*0x800;
@ -200,7 +200,7 @@ SCREEN_UPDATE( namconb2 )
} }
static int static int
NB2objcode2tile( int code ) NB2objcode2tile( running_machine *machine, int code )
{ {
int bank = nth_byte32( namconb1_spritebank32, (code>>11)&0xf ); int bank = nth_byte32( namconb1_spritebank32, (code>>11)&0xf );
code &= 0x7ff; code &= 0x7ff;

View File

@ -21,7 +21,6 @@ Namco System 1 Video Hardware
7810-7fef : fixed playfield (5) : 36*28*2 7810-7fef : fixed playfield (5) : 36*28*2
7ff0-7fff : ? 7ff0-7fff : ?
*/ */
static UINT8 *namcos1_videoram;
/* /*
paletteram map (s1ram 0x0000-0x7fff) paletteram map (s1ram 0x0000-0x7fff)
@ -34,7 +33,6 @@ static UINT8 *namcos1_videoram;
so there is just 3x0x2000 RAM, plus the CUS116 internal registers. so there is just 3x0x2000 RAM, plus the CUS116 internal registers.
*/ */
static UINT8 namcos1_cus116[0x10];
/* /*
spriteram map (s1ram 0x10000-0x10fff) spriteram map (s1ram 0x10000-0x10fff)
@ -44,17 +42,6 @@ static UINT8 namcos1_cus116[0x10];
1000-1fff : playfield control registers 1000-1fff : playfield control registers
*/ */
static UINT8 *namcos1_spriteram;
static UINT8 namcos1_playfield_control[0x20];
static tilemap_t *bg_tilemap[6];
static UINT8 *tilemap_maskdata;
static int copy_sprites;
static UINT8 drawmode_table[16];
/*************************************************************************** /***************************************************************************
@ -65,30 +52,61 @@ static UINT8 drawmode_table[16];
INLINE void bg_get_info(running_machine *machine,tile_data *tileinfo,int tile_index,UINT8 *info_vram) INLINE void bg_get_info(running_machine *machine,tile_data *tileinfo,int tile_index,UINT8 *info_vram)
{ {
namcos1_state *state = machine->driver_data<namcos1_state>();
int code; int code;
tile_index <<= 1; tile_index <<= 1;
code = info_vram[tile_index + 1] + ((info_vram[tile_index] & 0x3f) << 8); code = info_vram[tile_index + 1] + ((info_vram[tile_index] & 0x3f) << 8);
SET_TILE_INFO(0,code,0,0); SET_TILE_INFO(0,code,0,0);
tileinfo->mask_data = &tilemap_maskdata[code << 3]; tileinfo->mask_data = &state->tilemap_maskdata[code << 3];
} }
INLINE void fg_get_info(running_machine *machine,tile_data *tileinfo,int tile_index,UINT8 *info_vram) INLINE void fg_get_info(running_machine *machine,tile_data *tileinfo,int tile_index,UINT8 *info_vram)
{ {
namcos1_state *state = machine->driver_data<namcos1_state>();
int code; int code;
tile_index <<= 1; tile_index <<= 1;
code = info_vram[tile_index + 1] + ((info_vram[tile_index] & 0x3f) << 8); code = info_vram[tile_index + 1] + ((info_vram[tile_index] & 0x3f) << 8);
SET_TILE_INFO(0,code,0,0); SET_TILE_INFO(0,code,0,0);
tileinfo->mask_data = &tilemap_maskdata[code << 3]; tileinfo->mask_data = &state->tilemap_maskdata[code << 3];
} }
static TILE_GET_INFO( bg_get_info0 ) { bg_get_info(machine,tileinfo,tile_index,&namcos1_videoram[0x0000]); } static TILE_GET_INFO( bg_get_info0 )
static TILE_GET_INFO( bg_get_info1 ) { bg_get_info(machine,tileinfo,tile_index,&namcos1_videoram[0x2000]); } {
static TILE_GET_INFO( bg_get_info2 ) { bg_get_info(machine,tileinfo,tile_index,&namcos1_videoram[0x4000]); } namcos1_state *state = machine->driver_data<namcos1_state>();
static TILE_GET_INFO( bg_get_info3 ) { bg_get_info(machine,tileinfo,tile_index,&namcos1_videoram[0x6000]); } bg_get_info(machine,tileinfo,tile_index,&state->videoram[0x0000]);
static TILE_GET_INFO( fg_get_info4 ) { fg_get_info(machine,tileinfo,tile_index,&namcos1_videoram[0x7010]); } }
static TILE_GET_INFO( fg_get_info5 ) { fg_get_info(machine,tileinfo,tile_index,&namcos1_videoram[0x7810]); }
static TILE_GET_INFO( bg_get_info1 )
{
namcos1_state *state = machine->driver_data<namcos1_state>();
bg_get_info(machine,tileinfo,tile_index,&state->videoram[0x2000]);
}
static TILE_GET_INFO( bg_get_info2 )
{
namcos1_state *state = machine->driver_data<namcos1_state>();
bg_get_info(machine,tileinfo,tile_index,&state->videoram[0x4000]);
}
static TILE_GET_INFO( bg_get_info3 )
{
namcos1_state *state = machine->driver_data<namcos1_state>();
bg_get_info(machine,tileinfo,tile_index,&state->videoram[0x6000]);
}
static TILE_GET_INFO( fg_get_info4 )
{
namcos1_state *state = machine->driver_data<namcos1_state>();
fg_get_info(machine,tileinfo,tile_index,&state->videoram[0x7010]);
}
static TILE_GET_INFO( fg_get_info5 )
{
namcos1_state *state = machine->driver_data<namcos1_state>();
fg_get_info(machine,tileinfo,tile_index,&state->videoram[0x7810]);
}
@ -100,41 +118,42 @@ static TILE_GET_INFO( fg_get_info5 ) { fg_get_info(machine,tileinfo,tile_index,&
VIDEO_START( namcos1 ) VIDEO_START( namcos1 )
{ {
namcos1_state *state = machine->driver_data<namcos1_state>();
int i; int i;
tilemap_maskdata = (UINT8 *)machine->region("gfx1")->base(); state->tilemap_maskdata = (UINT8 *)machine->region("gfx1")->base();
/* allocate videoram */ /* allocate videoram */
namcos1_videoram = auto_alloc_array(machine, UINT8, 0x8000); state->videoram = auto_alloc_array(machine, UINT8, 0x8000);
namcos1_spriteram = auto_alloc_array(machine, UINT8, 0x1000); state->spriteram = auto_alloc_array(machine, UINT8, 0x1000);
/* initialize playfields */ /* initialize playfields */
bg_tilemap[0] = tilemap_create(machine, bg_get_info0,tilemap_scan_rows,8,8,64,64); state->bg_tilemap[0] = tilemap_create(machine, bg_get_info0,tilemap_scan_rows,8,8,64,64);
bg_tilemap[1] = tilemap_create(machine, bg_get_info1,tilemap_scan_rows,8,8,64,64); state->bg_tilemap[1] = tilemap_create(machine, bg_get_info1,tilemap_scan_rows,8,8,64,64);
bg_tilemap[2] = tilemap_create(machine, bg_get_info2,tilemap_scan_rows,8,8,64,64); state->bg_tilemap[2] = tilemap_create(machine, bg_get_info2,tilemap_scan_rows,8,8,64,64);
bg_tilemap[3] = tilemap_create(machine, bg_get_info3,tilemap_scan_rows,8,8,64,32); state->bg_tilemap[3] = tilemap_create(machine, bg_get_info3,tilemap_scan_rows,8,8,64,32);
bg_tilemap[4] = tilemap_create(machine, fg_get_info4,tilemap_scan_rows,8,8,36,28); state->bg_tilemap[4] = tilemap_create(machine, fg_get_info4,tilemap_scan_rows,8,8,36,28);
bg_tilemap[5] = tilemap_create(machine, fg_get_info5,tilemap_scan_rows,8,8,36,28); state->bg_tilemap[5] = tilemap_create(machine, fg_get_info5,tilemap_scan_rows,8,8,36,28);
tilemap_set_scrolldx(bg_tilemap[4],73,512-73); tilemap_set_scrolldx(state->bg_tilemap[4],73,512-73);
tilemap_set_scrolldx(bg_tilemap[5],73,512-73); tilemap_set_scrolldx(state->bg_tilemap[5],73,512-73);
tilemap_set_scrolldy(bg_tilemap[4],0x10,0x110); tilemap_set_scrolldy(state->bg_tilemap[4],0x10,0x110);
tilemap_set_scrolldy(bg_tilemap[5],0x10,0x110); tilemap_set_scrolldy(state->bg_tilemap[5],0x10,0x110);
/* register videoram to the save state system (post-allocation) */ /* register videoram to the save state system (post-allocation) */
state_save_register_global_pointer(machine, namcos1_videoram, 0x8000); state_save_register_global_pointer(machine, state->videoram, 0x8000);
state_save_register_global_array(machine, namcos1_cus116); state_save_register_global_array(machine, state->cus116);
state_save_register_global_pointer(machine, namcos1_spriteram, 0x1000); state_save_register_global_pointer(machine, state->spriteram, 0x1000);
state_save_register_global_array(machine, namcos1_playfield_control); state_save_register_global_array(machine, state->playfield_control);
/* set table for sprite color == 0x7f */ /* set table for sprite color == 0x7f */
for (i = 0;i < 15;i++) for (i = 0;i < 15;i++)
drawmode_table[i] = DRAWMODE_SHADOW; state->drawmode_table[i] = DRAWMODE_SHADOW;
drawmode_table[15] = DRAWMODE_NONE; state->drawmode_table[15] = DRAWMODE_NONE;
/* clear paletteram */ /* clear paletteram */
memset(namcos1_paletteram, 0, 0x8000); memset(state->paletteram, 0, 0x8000);
memset(namcos1_cus116, 0, 0x10); memset(state->cus116, 0, 0x10);
for (i = 0; i < 0x2000; i++) for (i = 0; i < 0x2000; i++)
palette_set_color(machine, i, MAKE_RGB(0, 0, 0)); palette_set_color(machine, i, MAKE_RGB(0, 0, 0));
@ -145,10 +164,10 @@ VIDEO_START( namcos1 )
for (i = 0x0800;i < 0x1000;i++) for (i = 0x0800;i < 0x1000;i++)
machine->shadow_table[i] = i + 0x0800; machine->shadow_table[i] = i + 0x0800;
machine->generic.spriteram.u8 = &namcos1_spriteram[0x800]; machine->generic.spriteram.u8 = &state->spriteram[0x800];
memset(namcos1_playfield_control, 0, sizeof(namcos1_playfield_control)); memset(state->playfield_control, 0, sizeof(state->playfield_control));
copy_sprites = 0; state->copy_sprites = 0;
} }
@ -161,31 +180,34 @@ VIDEO_START( namcos1 )
READ8_HANDLER( namcos1_videoram_r ) READ8_HANDLER( namcos1_videoram_r )
{ {
return namcos1_videoram[offset]; namcos1_state *state = space->machine->driver_data<namcos1_state>();
return state->videoram[offset];
} }
WRITE8_HANDLER( namcos1_videoram_w ) WRITE8_HANDLER( namcos1_videoram_w )
{ {
namcos1_videoram[offset] = data; namcos1_state *state = space->machine->driver_data<namcos1_state>();
state->videoram[offset] = data;
if (offset < 0x7000) if (offset < 0x7000)
{ /* background 0-3 */ { /* background 0-3 */
int layer = offset >> 13; int layer = offset >> 13;
int num = (offset & 0x1fff) >> 1; int num = (offset & 0x1fff) >> 1;
tilemap_mark_tile_dirty(bg_tilemap[layer],num); tilemap_mark_tile_dirty(state->bg_tilemap[layer],num);
} }
else else
{ /* foreground 4-5 */ { /* foreground 4-5 */
int layer = (offset >> 11 & 1) + 4; int layer = (offset >> 11 & 1) + 4;
int num = ((offset & 0x7ff) - 0x10) >> 1; int num = ((offset & 0x7ff) - 0x10) >> 1;
if (num >= 0 && num < 0x3f0) if (num >= 0 && num < 0x3f0)
tilemap_mark_tile_dirty(bg_tilemap[layer],num); tilemap_mark_tile_dirty(state->bg_tilemap[layer],num);
} }
} }
WRITE8_HANDLER( namcos1_paletteram_w ) WRITE8_HANDLER( namcos1_paletteram_w )
{ {
if (namcos1_paletteram[offset] == data) namcos1_state *state = space->machine->driver_data<namcos1_state>();
if (state->paletteram[offset] == data)
return; return;
if ((offset & 0x1800) != 0x1800) if ((offset & 0x1800) != 0x1800)
@ -193,26 +215,26 @@ WRITE8_HANDLER( namcos1_paletteram_w )
int r,g,b; int r,g,b;
int color = ((offset & 0x6000) >> 2) | (offset & 0x7ff); int color = ((offset & 0x6000) >> 2) | (offset & 0x7ff);
namcos1_paletteram[offset] = data; state->paletteram[offset] = data;
offset &= ~0x1800; offset &= ~0x1800;
r = namcos1_paletteram[offset]; r = state->paletteram[offset];
g = namcos1_paletteram[offset + 0x0800]; g = state->paletteram[offset + 0x0800];
b = namcos1_paletteram[offset + 0x1000]; b = state->paletteram[offset + 0x1000];
palette_set_color(space->machine,color,MAKE_RGB(r,g,b)); palette_set_color(space->machine,color,MAKE_RGB(r,g,b));
} }
else else
{ {
int i, j; int i, j;
namcos1_cus116[offset & 0x0f] = data; state->cus116[offset & 0x0f] = data;
for (i = 0x1800; i < 0x8000; i += 0x2000) for (i = 0x1800; i < 0x8000; i += 0x2000)
{ {
offset = (offset & 0x0f) | i; offset = (offset & 0x0f) | i;
for (j = 0; j < 0x80; j++, offset += 0x10) for (j = 0; j < 0x80; j++, offset += 0x10)
namcos1_paletteram[offset] = data; state->paletteram[offset] = data;
} }
} }
} }
@ -222,30 +244,32 @@ WRITE8_HANDLER( namcos1_paletteram_w )
READ8_HANDLER( namcos1_spriteram_r ) READ8_HANDLER( namcos1_spriteram_r )
{ {
namcos1_state *state = space->machine->driver_data<namcos1_state>();
/* 0000-07ff work ram */ /* 0000-07ff work ram */
/* 0800-0fff sprite ram */ /* 0800-0fff sprite ram */
if (offset < 0x1000) if (offset < 0x1000)
return namcos1_spriteram[offset]; return state->spriteram[offset];
/* 1xxx playfield control ram */ /* 1xxx playfield control ram */
else else
return namcos1_playfield_control[offset & 0x1f]; return state->playfield_control[offset & 0x1f];
} }
WRITE8_HANDLER( namcos1_spriteram_w ) WRITE8_HANDLER( namcos1_spriteram_w )
{ {
namcos1_state *state = space->machine->driver_data<namcos1_state>();
/* 0000-07ff work ram */ /* 0000-07ff work ram */
/* 0800-0fff sprite ram */ /* 0800-0fff sprite ram */
if (offset < 0x1000) if (offset < 0x1000)
{ {
namcos1_spriteram[offset] = data; state->spriteram[offset] = data;
/* a write to this offset tells the sprite chip to buffer the sprite list */ /* a write to this offset tells the sprite chip to buffer the sprite list */
if (offset == 0x0ff2) if (offset == 0x0ff2)
copy_sprites = 1; state->copy_sprites = 1;
} }
/* 1xxx playfield control ram */ /* 1xxx playfield control ram */
else else
namcos1_playfield_control[offset & 0x1f] = data; state->playfield_control[offset & 0x1f] = data;
} }
@ -278,6 +302,7 @@ sprite format:
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)
{ {
namcos1_state *state = machine->driver_data<namcos1_state>();
const UINT8 *source = &machine->generic.spriteram.u8[0x0800-0x20]; /* the last is NOT a sprite */ const UINT8 *source = &machine->generic.spriteram.u8[0x0800-0x20]; /* the last is NOT a sprite */
const UINT8 *finish = &machine->generic.spriteram.u8[0]; const UINT8 *finish = &machine->generic.spriteram.u8[0];
gfx_element *gfx = machine->gfx[1]; gfx_element *gfx = machine->gfx[1];
@ -338,7 +363,7 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
sx & 0x1ff, sx & 0x1ff,
((sy + 16) & 0xff) - 16, ((sy + 16) & 0xff) - 16,
machine->priority_bitmap, pri_mask, machine->priority_bitmap, pri_mask,
drawmode_table, machine->shadow_table); state->drawmode_table, machine->shadow_table);
source -= 0x10; source -= 0x10;
} }
@ -348,6 +373,7 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
SCREEN_UPDATE( namcos1 ) SCREEN_UPDATE( namcos1 )
{ {
namcos1_state *state = screen->machine->driver_data<namcos1_state>();
int i, j, scrollx, scrolly, priority; int i, j, scrollx, scrolly, priority;
rectangle new_clip = *cliprect; rectangle new_clip = *cliprect;
@ -361,13 +387,13 @@ SCREEN_UPDATE( namcos1 )
bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine)); bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine));
/* berabohm uses asymmetrical visibility windows to iris on the character */ /* berabohm uses asymmetrical visibility windows to iris on the character */
i = ((namcos1_cus116[0] << 8) | namcos1_cus116[1]) - 1; // min x i = ((state->cus116[0] << 8) | state->cus116[1]) - 1; // min x
if (new_clip.min_x < i) new_clip.min_x = i; if (new_clip.min_x < i) new_clip.min_x = i;
i = ((namcos1_cus116[2] << 8) | namcos1_cus116[3]) - 1 - 1; // max x i = ((state->cus116[2] << 8) | state->cus116[3]) - 1 - 1; // max x
if (new_clip.max_x > i) new_clip.max_x = i; if (new_clip.max_x > i) new_clip.max_x = i;
i = ((namcos1_cus116[4] << 8) | namcos1_cus116[5]) - 0x11; // min y i = ((state->cus116[4] << 8) | state->cus116[5]) - 0x11; // min y
if (new_clip.min_y < i) new_clip.min_y = i; if (new_clip.min_y < i) new_clip.min_y = i;
i = ((namcos1_cus116[6] << 8) | namcos1_cus116[7]) - 0x11 - 1; // max y i = ((state->cus116[6] << 8) | state->cus116[7]) - 0x11 - 1; // max y
if (new_clip.max_y > i) new_clip.max_y = i; if (new_clip.max_y > i) new_clip.max_y = i;
if (new_clip.max_x < new_clip.min_x || new_clip.max_y < new_clip.min_y) if (new_clip.max_x < new_clip.min_x || new_clip.max_y < new_clip.min_y)
@ -376,15 +402,15 @@ SCREEN_UPDATE( namcos1 )
/* set palette base */ /* set palette base */
for (i = 0;i < 6;i++) for (i = 0;i < 6;i++)
tilemap_set_palette_offset(bg_tilemap[i],(namcos1_playfield_control[i + 24] & 7) * 256); tilemap_set_palette_offset(state->bg_tilemap[i],(state->playfield_control[i + 24] & 7) * 256);
for (i = 0;i < 4;i++) for (i = 0;i < 4;i++)
{ {
static const int disp_x[] = { 25, 27, 28, 29 }; static const int disp_x[] = { 25, 27, 28, 29 };
j = i << 2; j = i << 2;
scrollx = ( namcos1_playfield_control[j+1] + (namcos1_playfield_control[j+0]<<8) ) - disp_x[i]; scrollx = ( state->playfield_control[j+1] + (state->playfield_control[j+0]<<8) ) - disp_x[i];
scrolly = ( namcos1_playfield_control[j+3] + (namcos1_playfield_control[j+2]<<8) ) + 8; scrolly = ( state->playfield_control[j+3] + (state->playfield_control[j+2]<<8) ) + 8;
if (flip_screen_get(screen->machine)) if (flip_screen_get(screen->machine))
{ {
@ -392,8 +418,8 @@ SCREEN_UPDATE( namcos1 )
scrolly = -scrolly; scrolly = -scrolly;
} }
tilemap_set_scrollx(bg_tilemap[i],0,scrollx); tilemap_set_scrollx(state->bg_tilemap[i],0,scrollx);
tilemap_set_scrolly(bg_tilemap[i],0,scrolly); tilemap_set_scrolly(state->bg_tilemap[i],0,scrolly);
} }
@ -405,8 +431,8 @@ SCREEN_UPDATE( namcos1 )
{ {
for (i = 0;i < 6;i++) for (i = 0;i < 6;i++)
{ {
if (namcos1_playfield_control[16 + i] == priority) if (state->playfield_control[16 + i] == priority)
tilemap_draw_primask(bitmap,&new_clip,bg_tilemap[i],0,priority,0); tilemap_draw_primask(bitmap,&new_clip,state->bg_tilemap[i],0,priority,0);
} }
} }
@ -417,7 +443,8 @@ SCREEN_UPDATE( namcos1 )
SCREEN_EOF( namcos1 ) SCREEN_EOF( namcos1 )
{ {
if (copy_sprites) namcos1_state *state = machine->driver_data<namcos1_state>();
if (state->copy_sprites)
{ {
UINT8 *spriteram = machine->generic.spriteram.u8; UINT8 *spriteram = machine->generic.spriteram.u8;
int i,j; int i,j;
@ -428,6 +455,6 @@ SCREEN_EOF( namcos1 )
spriteram[i+j] = spriteram[i+j - 6]; spriteram[i+j] = spriteram[i+j - 6];
} }
copy_sprites = 0; state->copy_sprites = 0;
} }
} }

View File

@ -124,11 +124,6 @@ CopyVisiblePolyFrameBuffer( bitmap_t *bitmap, const rectangle *clip, int zlo, in
} }
} /* CopyVisiblePolyFrameBuffer */ } /* CopyVisiblePolyFrameBuffer */
static int objcode2tile( int code )
{ /* callback for sprite drawing code in namcoic.c */
return code;
} /* objcode2tile */
VIDEO_START( namcos21 ) VIDEO_START( namcos21 )
{ {
namcos21_state *state = machine->driver_data<namcos21_state>(); namcos21_state *state = machine->driver_data<namcos21_state>();
@ -140,7 +135,7 @@ VIDEO_START( namcos21 )
namco_obj_init(machine, namco_obj_init(machine,
0, /* gfx bank */ 0, /* gfx bank */
0xf, /* reverse palette mapping */ 0xf, /* reverse palette mapping */
objcode2tile ); NULL );
} /* VIDEO_START( namcos21 ) */ } /* VIDEO_START( namcos21 ) */
static void static void

View File

@ -1,29 +1,6 @@
#include "emu.h" #include "emu.h"
#include "includes/ninjakd2.h" #include "includes/ninjakd2.h"
UINT8* ninjakd2_bg_videoram;
UINT8* ninjakd2_fg_videoram;
static int next_sprite_overdraw_enabled;
static int (*stencil_compare_function) (UINT16 pal);
static int sprites_updated;
static bitmap_t *sp_bitmap;
// in robokid and omegaf big sprites are laid out differently in ROM
static int robokid_sprites;
static tilemap_t* fg_tilemap;
static tilemap_t* bg_tilemap;
static tilemap_t* bg0_tilemap;
static tilemap_t* bg1_tilemap;
static tilemap_t* bg2_tilemap;
static int bank_mask;
static int robokid_bg0_bank = 0;
static int robokid_bg1_bank = 0;
static int robokid_bg2_bank = 0;
static UINT8* robokid_bg0_videoram;
static UINT8* robokid_bg1_videoram;
static UINT8* robokid_bg2_videoram;
#define TRANSPARENTCODE (15) #define TRANSPARENTCODE (15)
@ -35,8 +12,9 @@ static UINT8* robokid_bg2_videoram;
static TILE_GET_INFO( get_fg_tile_info ) static TILE_GET_INFO( get_fg_tile_info )
{ {
int const lo = ninjakd2_fg_videoram[(tile_index << 1)]; ninjakd2_state *state = machine->driver_data<ninjakd2_state>();
int const hi = ninjakd2_fg_videoram[(tile_index << 1) | 1]; int const lo = state->fg_videoram[(tile_index << 1)];
int const hi = state->fg_videoram[(tile_index << 1) | 1];
int const tile = ((hi & 0xc0) << 2) | lo; int const tile = ((hi & 0xc0) << 2) | lo;
int const flipyx = (hi & 0x30) >> 4; int const flipyx = (hi & 0x30) >> 4;
int const color = hi & 0x0f; int const color = hi & 0x0f;
@ -50,8 +28,9 @@ static TILE_GET_INFO( get_fg_tile_info )
static TILE_GET_INFO( ninjakd2_get_bg_tile_info ) static TILE_GET_INFO( ninjakd2_get_bg_tile_info )
{ {
int const lo = ninjakd2_bg_videoram[(tile_index << 1)]; ninjakd2_state *state = machine->driver_data<ninjakd2_state>();
int const hi = ninjakd2_bg_videoram[(tile_index << 1) | 1]; int const lo = state->bg_videoram[(tile_index << 1)];
int const hi = state->bg_videoram[(tile_index << 1) | 1];
int const tile = ((hi & 0xc0) << 2) | lo; int const tile = ((hi & 0xc0) << 2) | lo;
int const flipyx = (hi & 0x30) >> 4; int const flipyx = (hi & 0x30) >> 4;
int const color = hi & 0x0f; int const color = hi & 0x0f;
@ -65,8 +44,9 @@ static TILE_GET_INFO( ninjakd2_get_bg_tile_info )
static TILE_GET_INFO( mnight_get_bg_tile_info ) static TILE_GET_INFO( mnight_get_bg_tile_info )
{ {
int const lo = ninjakd2_bg_videoram[(tile_index << 1)]; ninjakd2_state *state = machine->driver_data<ninjakd2_state>();
int const hi = ninjakd2_bg_videoram[(tile_index << 1) | 1]; int const lo = state->bg_videoram[(tile_index << 1)];
int const hi = state->bg_videoram[(tile_index << 1) | 1];
int const tile = ((hi & 0x10) << 6) | ((hi & 0xc0) << 2) | lo; int const tile = ((hi & 0x10) << 6) | ((hi & 0xc0) << 2) | lo;
int const flipy = (hi & 0x20) >> 5; int const flipy = (hi & 0x20) >> 5;
int const color = hi & 0x0f; int const color = hi & 0x0f;
@ -106,17 +86,20 @@ static void robokid_get_bg_tile_info(running_machine* machine, tile_data* const
static TILE_GET_INFO( robokid_get_bg0_tile_info ) static TILE_GET_INFO( robokid_get_bg0_tile_info )
{ {
robokid_get_bg_tile_info(machine, tileinfo, tile_index, 2, robokid_bg0_videoram); ninjakd2_state *state = machine->driver_data<ninjakd2_state>();
robokid_get_bg_tile_info(machine, tileinfo, tile_index, 2, state->robokid_bg0_videoram);
} }
static TILE_GET_INFO( robokid_get_bg1_tile_info ) static TILE_GET_INFO( robokid_get_bg1_tile_info )
{ {
robokid_get_bg_tile_info(machine, tileinfo, tile_index, 3, robokid_bg1_videoram); ninjakd2_state *state = machine->driver_data<ninjakd2_state>();
robokid_get_bg_tile_info(machine, tileinfo, tile_index, 3, state->robokid_bg1_videoram);
} }
static TILE_GET_INFO( robokid_get_bg2_tile_info ) static TILE_GET_INFO( robokid_get_bg2_tile_info )
{ {
robokid_get_bg_tile_info(machine, tileinfo, tile_index, 4, robokid_bg2_videoram); ninjakd2_state *state = machine->driver_data<ninjakd2_state>();
robokid_get_bg_tile_info(machine, tileinfo, tile_index, 4, state->robokid_bg2_videoram);
} }
@ -129,15 +112,16 @@ static TILE_GET_INFO( robokid_get_bg2_tile_info )
static void videoram_alloc(running_machine* machine, int const size) static void videoram_alloc(running_machine* machine, int const size)
{ {
ninjakd2_state *state = machine->driver_data<ninjakd2_state>();
if (size) if (size)
{ {
/* create video ram */ /* create video ram */
robokid_bg0_videoram = auto_alloc_array_clear(machine, UINT8, size); state->robokid_bg0_videoram = auto_alloc_array_clear(machine, UINT8, size);
robokid_bg1_videoram = auto_alloc_array_clear(machine, UINT8, size); state->robokid_bg1_videoram = auto_alloc_array_clear(machine, UINT8, size);
robokid_bg2_videoram = auto_alloc_array_clear(machine, UINT8, size); state->robokid_bg2_videoram = auto_alloc_array_clear(machine, UINT8, size);
} }
sp_bitmap = machine->primary_screen->alloc_compatible_bitmap(); state->sp_bitmap = machine->primary_screen->alloc_compatible_bitmap();
} }
static int stencil_ninjakd2( UINT16 pal ); static int stencil_ninjakd2( UINT16 pal );
@ -148,80 +132,85 @@ static int stencil_omegaf( UINT16 pal );
VIDEO_START( ninjakd2 ) VIDEO_START( ninjakd2 )
{ {
ninjakd2_state *state = machine->driver_data<ninjakd2_state>();
videoram_alloc(machine, 0); videoram_alloc(machine, 0);
fg_tilemap = tilemap_create( machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); state->fg_tilemap = tilemap_create( machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
bg_tilemap = tilemap_create(machine, ninjakd2_get_bg_tile_info, tilemap_scan_rows, 16, 16, 32, 32); state->bg_tilemap = tilemap_create(machine, ninjakd2_get_bg_tile_info, tilemap_scan_rows, 16, 16, 32, 32);
tilemap_set_transparent_pen(fg_tilemap, TRANSPARENTCODE); tilemap_set_transparent_pen(state->fg_tilemap, TRANSPARENTCODE);
robokid_sprites = 0; state->robokid_sprites = 0;
stencil_compare_function = stencil_ninjakd2 ; state->stencil_compare_function = stencil_ninjakd2;
} }
VIDEO_START( mnight ) VIDEO_START( mnight )
{ {
ninjakd2_state *state = machine->driver_data<ninjakd2_state>();
videoram_alloc(machine, 0); videoram_alloc(machine, 0);
fg_tilemap = tilemap_create( machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); state->fg_tilemap = tilemap_create( machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
bg_tilemap = tilemap_create(machine, mnight_get_bg_tile_info, tilemap_scan_rows, 16, 16, 32, 32); state->bg_tilemap = tilemap_create(machine, mnight_get_bg_tile_info, tilemap_scan_rows, 16, 16, 32, 32);
tilemap_set_transparent_pen(fg_tilemap, TRANSPARENTCODE); tilemap_set_transparent_pen(state->fg_tilemap, TRANSPARENTCODE);
robokid_sprites = 0; state->robokid_sprites = 0;
stencil_compare_function = stencil_mnight ; state->stencil_compare_function = stencil_mnight;
} }
VIDEO_START( arkarea ) VIDEO_START( arkarea )
{ {
ninjakd2_state *state = machine->driver_data<ninjakd2_state>();
videoram_alloc(machine, 0); videoram_alloc(machine, 0);
fg_tilemap = tilemap_create( machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); state->fg_tilemap = tilemap_create( machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
bg_tilemap = tilemap_create(machine, mnight_get_bg_tile_info, tilemap_scan_rows, 16, 16, 32, 32); state->bg_tilemap = tilemap_create(machine, mnight_get_bg_tile_info, tilemap_scan_rows, 16, 16, 32, 32);
tilemap_set_transparent_pen(fg_tilemap, TRANSPARENTCODE); tilemap_set_transparent_pen(state->fg_tilemap, TRANSPARENTCODE);
robokid_sprites = 0; state->robokid_sprites = 0;
stencil_compare_function = stencil_arkarea ; state->stencil_compare_function = stencil_arkarea;
} }
VIDEO_START( robokid ) VIDEO_START( robokid )
{ {
bank_mask = 1; ninjakd2_state *state = machine->driver_data<ninjakd2_state>();
state->bank_mask = 1;
videoram_alloc(machine, 0x0800); videoram_alloc(machine, 0x0800);
fg_tilemap = tilemap_create( machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); state->fg_tilemap = tilemap_create( machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
bg0_tilemap = tilemap_create(machine, robokid_get_bg0_tile_info, robokid_bg_scan, 16, 16, 32, 32); state->bg0_tilemap = tilemap_create(machine, robokid_get_bg0_tile_info, robokid_bg_scan, 16, 16, 32, 32);
bg1_tilemap = tilemap_create(machine, robokid_get_bg1_tile_info, robokid_bg_scan, 16, 16, 32, 32); state->bg1_tilemap = tilemap_create(machine, robokid_get_bg1_tile_info, robokid_bg_scan, 16, 16, 32, 32);
bg2_tilemap = tilemap_create(machine, robokid_get_bg2_tile_info, robokid_bg_scan, 16, 16, 32, 32); state->bg2_tilemap = tilemap_create(machine, robokid_get_bg2_tile_info, robokid_bg_scan, 16, 16, 32, 32);
tilemap_set_transparent_pen(fg_tilemap, TRANSPARENTCODE); tilemap_set_transparent_pen(state->fg_tilemap, TRANSPARENTCODE);
tilemap_set_transparent_pen(bg1_tilemap, TRANSPARENTCODE); tilemap_set_transparent_pen(state->bg1_tilemap, TRANSPARENTCODE);
tilemap_set_transparent_pen(bg2_tilemap, TRANSPARENTCODE); tilemap_set_transparent_pen(state->bg2_tilemap, TRANSPARENTCODE);
robokid_sprites = 1; state->robokid_sprites = 1;
stencil_compare_function = stencil_robokid ; state->stencil_compare_function = stencil_robokid;
} }
VIDEO_START( omegaf ) VIDEO_START( omegaf )
{ {
bank_mask = 7; ninjakd2_state *state = machine->driver_data<ninjakd2_state>();
state->bank_mask = 7;
videoram_alloc(machine, 0x2000); videoram_alloc(machine, 0x2000);
fg_tilemap = tilemap_create( machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); state->fg_tilemap = tilemap_create( machine, get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
bg0_tilemap = tilemap_create(machine, robokid_get_bg0_tile_info, omegaf_bg_scan, 16, 16, 128, 32); state->bg0_tilemap = tilemap_create(machine, robokid_get_bg0_tile_info, omegaf_bg_scan, 16, 16, 128, 32);
bg1_tilemap = tilemap_create(machine, robokid_get_bg1_tile_info, omegaf_bg_scan, 16, 16, 128, 32); state->bg1_tilemap = tilemap_create(machine, robokid_get_bg1_tile_info, omegaf_bg_scan, 16, 16, 128, 32);
bg2_tilemap = tilemap_create(machine, robokid_get_bg2_tile_info, omegaf_bg_scan, 16, 16, 128, 32); state->bg2_tilemap = tilemap_create(machine, robokid_get_bg2_tile_info, omegaf_bg_scan, 16, 16, 128, 32);
tilemap_set_transparent_pen(fg_tilemap, TRANSPARENTCODE); tilemap_set_transparent_pen(state->fg_tilemap, TRANSPARENTCODE);
tilemap_set_transparent_pen(bg0_tilemap, TRANSPARENTCODE); tilemap_set_transparent_pen(state->bg0_tilemap, TRANSPARENTCODE);
tilemap_set_transparent_pen(bg1_tilemap, TRANSPARENTCODE); tilemap_set_transparent_pen(state->bg1_tilemap, TRANSPARENTCODE);
tilemap_set_transparent_pen(bg2_tilemap, TRANSPARENTCODE); tilemap_set_transparent_pen(state->bg2_tilemap, TRANSPARENTCODE);
robokid_sprites = 1; state->robokid_sprites = 1;
stencil_compare_function = stencil_omegaf ; state->stencil_compare_function = stencil_omegaf;
} }
@ -234,70 +223,81 @@ VIDEO_START( omegaf )
WRITE8_HANDLER( ninjakd2_bgvideoram_w ) WRITE8_HANDLER( ninjakd2_bgvideoram_w )
{ {
ninjakd2_bg_videoram[offset] = data; ninjakd2_state *state = space->machine->driver_data<ninjakd2_state>();
tilemap_mark_tile_dirty(bg_tilemap, offset >> 1); state->bg_videoram[offset] = data;
tilemap_mark_tile_dirty(state->bg_tilemap, offset >> 1);
} }
WRITE8_HANDLER( ninjakd2_fgvideoram_w ) WRITE8_HANDLER( ninjakd2_fgvideoram_w )
{ {
ninjakd2_fg_videoram[offset] = data; ninjakd2_state *state = space->machine->driver_data<ninjakd2_state>();
tilemap_mark_tile_dirty(fg_tilemap, offset >> 1); state->fg_videoram[offset] = data;
tilemap_mark_tile_dirty(state->fg_tilemap, offset >> 1);
} }
WRITE8_HANDLER( robokid_bg0_bank_w ) WRITE8_HANDLER( robokid_bg0_bank_w )
{ {
robokid_bg0_bank = data & bank_mask; ninjakd2_state *state = space->machine->driver_data<ninjakd2_state>();
state->robokid_bg0_bank = data & state->bank_mask;
} }
WRITE8_HANDLER( robokid_bg1_bank_w ) WRITE8_HANDLER( robokid_bg1_bank_w )
{ {
robokid_bg1_bank = data & bank_mask; ninjakd2_state *state = space->machine->driver_data<ninjakd2_state>();
state->robokid_bg1_bank = data & state->bank_mask;
} }
WRITE8_HANDLER( robokid_bg2_bank_w ) WRITE8_HANDLER( robokid_bg2_bank_w )
{ {
robokid_bg2_bank = data & bank_mask; ninjakd2_state *state = space->machine->driver_data<ninjakd2_state>();
state->robokid_bg2_bank = data & state->bank_mask;
} }
READ8_HANDLER( robokid_bg0_videoram_r ) READ8_HANDLER( robokid_bg0_videoram_r )
{ {
return robokid_bg0_videoram[(robokid_bg0_bank << 10) | offset]; ninjakd2_state *state = space->machine->driver_data<ninjakd2_state>();
return state->robokid_bg0_videoram[(state->robokid_bg0_bank << 10) | offset];
} }
READ8_HANDLER( robokid_bg1_videoram_r ) READ8_HANDLER( robokid_bg1_videoram_r )
{ {
return robokid_bg1_videoram[(robokid_bg1_bank << 10) | offset]; ninjakd2_state *state = space->machine->driver_data<ninjakd2_state>();
return state->robokid_bg1_videoram[(state->robokid_bg1_bank << 10) | offset];
} }
READ8_HANDLER( robokid_bg2_videoram_r ) READ8_HANDLER( robokid_bg2_videoram_r )
{ {
return robokid_bg2_videoram[(robokid_bg2_bank << 10) | offset]; ninjakd2_state *state = space->machine->driver_data<ninjakd2_state>();
return state->robokid_bg2_videoram[(state->robokid_bg2_bank << 10) | offset];
} }
WRITE8_HANDLER( robokid_bg0_videoram_w ) WRITE8_HANDLER( robokid_bg0_videoram_w )
{ {
int const address = (robokid_bg0_bank << 10 ) | offset; ninjakd2_state *state = space->machine->driver_data<ninjakd2_state>();
int const address = (state->robokid_bg0_bank << 10 ) | offset;
robokid_bg0_videoram[address] = data; state->robokid_bg0_videoram[address] = data;
tilemap_mark_tile_dirty(bg0_tilemap, address >> 1); tilemap_mark_tile_dirty(state->bg0_tilemap, address >> 1);
} }
WRITE8_HANDLER( robokid_bg1_videoram_w ) WRITE8_HANDLER( robokid_bg1_videoram_w )
{ {
int const address = (robokid_bg1_bank << 10 ) | offset; ninjakd2_state *state = space->machine->driver_data<ninjakd2_state>();
int const address = (state->robokid_bg1_bank << 10 ) | offset;
robokid_bg1_videoram[address] = data; state->robokid_bg1_videoram[address] = data;
tilemap_mark_tile_dirty(bg1_tilemap, address >> 1); tilemap_mark_tile_dirty(state->bg1_tilemap, address >> 1);
} }
WRITE8_HANDLER( robokid_bg2_videoram_w ) WRITE8_HANDLER( robokid_bg2_videoram_w )
{ {
int const address = (robokid_bg2_bank << 10 ) | offset; ninjakd2_state *state = space->machine->driver_data<ninjakd2_state>();
int const address = (state->robokid_bg2_bank << 10 ) | offset;
robokid_bg2_videoram[address] = data; state->robokid_bg2_videoram[address] = data;
tilemap_mark_tile_dirty(bg2_tilemap, address >> 1); tilemap_mark_tile_dirty(state->bg2_tilemap, address >> 1);
} }
@ -322,29 +322,34 @@ static void bg_ctrl(int offset, int data, tilemap_t* tilemap)
WRITE8_HANDLER( ninjakd2_bg_ctrl_w ) WRITE8_HANDLER( ninjakd2_bg_ctrl_w )
{ {
bg_ctrl(offset, data, bg_tilemap); ninjakd2_state *state = space->machine->driver_data<ninjakd2_state>();
bg_ctrl(offset, data, state->bg_tilemap);
} }
WRITE8_HANDLER( robokid_bg0_ctrl_w ) WRITE8_HANDLER( robokid_bg0_ctrl_w )
{ {
bg_ctrl(offset, data, bg0_tilemap); ninjakd2_state *state = space->machine->driver_data<ninjakd2_state>();
bg_ctrl(offset, data, state->bg0_tilemap);
} }
WRITE8_HANDLER( robokid_bg1_ctrl_w ) WRITE8_HANDLER( robokid_bg1_ctrl_w )
{ {
bg_ctrl(offset, data, bg1_tilemap); ninjakd2_state *state = space->machine->driver_data<ninjakd2_state>();
bg_ctrl(offset, data, state->bg1_tilemap);
} }
WRITE8_HANDLER( robokid_bg2_ctrl_w ) WRITE8_HANDLER( robokid_bg2_ctrl_w )
{ {
bg_ctrl(offset, data, bg2_tilemap); ninjakd2_state *state = space->machine->driver_data<ninjakd2_state>();
bg_ctrl(offset, data, state->bg2_tilemap);
} }
WRITE8_HANDLER( ninjakd2_sprite_overdraw_w ) WRITE8_HANDLER( ninjakd2_sprite_overdraw_w )
{ {
next_sprite_overdraw_enabled = data & 1; ninjakd2_state *state = space->machine->driver_data<ninjakd2_state>();
state->next_sprite_overdraw_enabled = data & 1;
} }
@ -357,9 +362,10 @@ WRITE8_HANDLER( ninjakd2_sprite_overdraw_w )
static void draw_sprites(running_machine* machine, bitmap_t* bitmap) static void draw_sprites(running_machine* machine, bitmap_t* bitmap)
{ {
ninjakd2_state *state = machine->driver_data<ninjakd2_state>();
const gfx_element* const gfx = machine->gfx[1]; const gfx_element* const gfx = machine->gfx[1];
int const big_xshift = robokid_sprites ? 1 : 0; int const big_xshift = state->robokid_sprites ? 1 : 0;
int const big_yshift = robokid_sprites ? 0 : 1; int const big_yshift = state->robokid_sprites ? 0 : 1;
UINT8* sprptr = &machine->generic.spriteram.u8[11]; UINT8* sprptr = &machine->generic.spriteram.u8[11];
int sprites_drawn = 0; int sprites_drawn = 0;
@ -452,20 +458,21 @@ static int stencil_omegaf( UINT16 pal ) { return( TRUE ); }
static void erase_sprites(running_machine* machine, bitmap_t* bitmap, const rectangle* cliprect) static void erase_sprites(running_machine* machine, bitmap_t* bitmap, const rectangle* cliprect)
{ {
ninjakd2_state *state = machine->driver_data<ninjakd2_state>();
// if sprite overdraw is disabled, clear the sprite framebuffer // if sprite overdraw is disabled, clear the sprite framebuffer
if (!next_sprite_overdraw_enabled) if (!state->next_sprite_overdraw_enabled)
bitmap_fill(sp_bitmap, cliprect, TRANSPARENTCODE); bitmap_fill(state->sp_bitmap, cliprect, TRANSPARENTCODE);
else else
{ {
int y; int y;
for (y = 0; y < sp_bitmap->height; ++y) for (y = 0; y < state->sp_bitmap->height; ++y)
{ {
int x; int x;
for (x = 0; x < sp_bitmap->width; ++x) for (x = 0; x < state->sp_bitmap->width; ++x)
{ {
UINT16* const ptr = BITMAP_ADDR16(sp_bitmap, y, x); UINT16* const ptr = BITMAP_ADDR16(state->sp_bitmap, y, x);
if ( (*stencil_compare_function)(*ptr) ) *ptr = TRANSPARENTCODE ; if ( (*state->stencil_compare_function)(*ptr) ) *ptr = TRANSPARENTCODE ;
} }
} }
} }
@ -474,8 +481,9 @@ static void erase_sprites(running_machine* machine, bitmap_t* bitmap, const rect
static void update_sprites(running_machine* machine) static void update_sprites(running_machine* machine)
{ {
erase_sprites(machine, sp_bitmap, 0); ninjakd2_state *state = machine->driver_data<ninjakd2_state>();
draw_sprites(machine, sp_bitmap); erase_sprites(machine, state->sp_bitmap, 0);
draw_sprites(machine, state->sp_bitmap);
} }
////// Before modified, this was written. ////// Before modified, this was written.
// we want to erase the sprites with the old setting and draw them with the // we want to erase the sprites with the old setting and draw them with the
@ -486,58 +494,61 @@ static void update_sprites(running_machine* machine)
SCREEN_UPDATE( ninjakd2 ) SCREEN_UPDATE( ninjakd2 )
{ {
ninjakd2_state *state = screen->machine->driver_data<ninjakd2_state>();
// updating sprites here instead than in screen_eof avoids a palette glitch // updating sprites here instead than in screen_eof avoids a palette glitch
// at the end of the "rainbow sky" screens. // at the end of the "rainbow sky" screens.
update_sprites(screen->machine); update_sprites(screen->machine);
sprites_updated = 1; state->sprites_updated = 1;
bitmap_fill(bitmap, cliprect, 0); bitmap_fill(bitmap, cliprect, 0);
tilemap_draw(bitmap, cliprect, bg_tilemap, 0, 0); tilemap_draw(bitmap, cliprect, state->bg_tilemap, 0, 0);
copybitmap_trans(bitmap, sp_bitmap, 0, 0, 0, 0, cliprect, TRANSPARENTCODE); copybitmap_trans(bitmap, state->sp_bitmap, 0, 0, 0, 0, cliprect, TRANSPARENTCODE);
tilemap_draw(bitmap, cliprect, fg_tilemap, 0, 0); tilemap_draw(bitmap, cliprect, state->fg_tilemap, 0, 0);
return 0; return 0;
} }
SCREEN_UPDATE( robokid ) SCREEN_UPDATE( robokid )
{ {
ninjakd2_state *state = screen->machine->driver_data<ninjakd2_state>();
update_sprites(screen->machine); update_sprites(screen->machine);
sprites_updated = 1; state->sprites_updated = 1;
bitmap_fill(bitmap, cliprect, 0); bitmap_fill(bitmap, cliprect, 0);
tilemap_draw(bitmap, cliprect, bg0_tilemap, 0, 0); tilemap_draw(bitmap, cliprect, state->bg0_tilemap, 0, 0);
tilemap_draw(bitmap, cliprect, bg1_tilemap, 0, 0); tilemap_draw(bitmap, cliprect, state->bg1_tilemap, 0, 0);
copybitmap_trans(bitmap, sp_bitmap, 0, 0, 0, 0, cliprect, TRANSPARENTCODE); copybitmap_trans(bitmap, state->sp_bitmap, 0, 0, 0, 0, cliprect, TRANSPARENTCODE);
tilemap_draw(bitmap, cliprect, bg2_tilemap, 0, 0); tilemap_draw(bitmap, cliprect, state->bg2_tilemap, 0, 0);
tilemap_draw(bitmap, cliprect, fg_tilemap, 0, 0); tilemap_draw(bitmap, cliprect, state->fg_tilemap, 0, 0);
return 0; return 0;
} }
SCREEN_UPDATE( omegaf ) SCREEN_UPDATE( omegaf )
{ {
ninjakd2_state *state = screen->machine->driver_data<ninjakd2_state>();
update_sprites(screen->machine); update_sprites(screen->machine);
sprites_updated = 1; state->sprites_updated = 1;
bitmap_fill(bitmap, cliprect, 0); bitmap_fill(bitmap, cliprect, 0);
tilemap_draw(bitmap, cliprect, bg0_tilemap, 0, 0); tilemap_draw(bitmap, cliprect, state->bg0_tilemap, 0, 0);
tilemap_draw(bitmap, cliprect, bg1_tilemap, 0, 0); tilemap_draw(bitmap, cliprect, state->bg1_tilemap, 0, 0);
tilemap_draw(bitmap, cliprect, bg2_tilemap, 0, 0); tilemap_draw(bitmap, cliprect, state->bg2_tilemap, 0, 0);
copybitmap_trans(bitmap, sp_bitmap, 0, 0, 0, 0, cliprect, TRANSPARENTCODE); copybitmap_trans(bitmap, state->sp_bitmap, 0, 0, 0, 0, cliprect, TRANSPARENTCODE);
tilemap_draw(bitmap, cliprect, fg_tilemap, 0, 0); tilemap_draw(bitmap, cliprect, state->fg_tilemap, 0, 0);
return 0; return 0;
} }
@ -545,8 +556,9 @@ SCREEN_UPDATE( omegaf )
SCREEN_EOF( ninjakd2 ) SCREEN_EOF( ninjakd2 )
{ {
if (!sprites_updated) ninjakd2_state *state = machine->driver_data<ninjakd2_state>();
if (!state->sprites_updated)
update_sprites(machine); update_sprites(machine);
sprites_updated = 0; state->sprites_updated = 0;
} }

View File

@ -1,10 +1,6 @@
#include "emu.h" #include "emu.h"
#include "includes/nova2001.h" #include "includes/nova2001.h"
UINT8 *nova2001_fg_videoram, *nova2001_bg_videoram;
static tilemap_t *bg_tilemap, *fg_tilemap;
/************************************* /*************************************
* *
@ -82,16 +78,18 @@ WRITE8_HANDLER( ninjakun_paletteram_w )
static TILE_GET_INFO( nova2001_get_bg_tile_info ) static TILE_GET_INFO( nova2001_get_bg_tile_info )
{ {
int code = nova2001_bg_videoram[tile_index]; nova2001_state *state = machine->driver_data<nova2001_state>();
int color = nova2001_bg_videoram[tile_index + 0x400] & 0x0f; int code = state->bg_videoram[tile_index];
int color = state->bg_videoram[tile_index + 0x400] & 0x0f;
SET_TILE_INFO(2, code, color, 0); SET_TILE_INFO(2, code, color, 0);
} }
static TILE_GET_INFO( nova2001_get_fg_tile_info ) static TILE_GET_INFO( nova2001_get_fg_tile_info )
{ {
int attr = nova2001_fg_videoram[tile_index + 0x400]; nova2001_state *state = machine->driver_data<nova2001_state>();
int code = nova2001_fg_videoram[tile_index]; int attr = state->fg_videoram[tile_index + 0x400];
int code = state->fg_videoram[tile_index];
int color = attr & 0x0f; int color = attr & 0x0f;
SET_TILE_INFO(1, code, color, 0); SET_TILE_INFO(1, code, color, 0);
@ -101,8 +99,9 @@ static TILE_GET_INFO( nova2001_get_fg_tile_info )
static TILE_GET_INFO( ninjakun_get_bg_tile_info ) static TILE_GET_INFO( ninjakun_get_bg_tile_info )
{ {
int attr = nova2001_bg_videoram[tile_index+0x400]; nova2001_state *state = machine->driver_data<nova2001_state>();
int code = nova2001_bg_videoram[tile_index] + ((attr & 0xc0) << 2); int attr = state->bg_videoram[tile_index+0x400];
int code = state->bg_videoram[tile_index] + ((attr & 0xc0) << 2);
int color = attr & 0x0f; int color = attr & 0x0f;
SET_TILE_INFO(2, code, color, 0); SET_TILE_INFO(2, code, color, 0);
@ -110,8 +109,9 @@ static TILE_GET_INFO( ninjakun_get_bg_tile_info )
static TILE_GET_INFO( ninjakun_get_fg_tile_info ) static TILE_GET_INFO( ninjakun_get_fg_tile_info )
{ {
int attr = nova2001_fg_videoram[tile_index+0x400]; nova2001_state *state = machine->driver_data<nova2001_state>();
int code = nova2001_fg_videoram[tile_index] + ((attr & 0x20) << 3); int attr = state->fg_videoram[tile_index+0x400];
int code = state->fg_videoram[tile_index] + ((attr & 0x20) << 3);
int color = attr & 0x0f; int color = attr & 0x0f;
SET_TILE_INFO(1, code, color, 0); SET_TILE_INFO(1, code, color, 0);
@ -121,8 +121,9 @@ static TILE_GET_INFO( ninjakun_get_fg_tile_info )
static TILE_GET_INFO( pkunwar_get_bg_tile_info ) static TILE_GET_INFO( pkunwar_get_bg_tile_info )
{ {
int attr = nova2001_bg_videoram[tile_index + 0x400]; nova2001_state *state = machine->driver_data<nova2001_state>();
int code = nova2001_bg_videoram[tile_index] + ((attr & 0x07) << 8); int attr = state->bg_videoram[tile_index + 0x400];
int code = state->bg_videoram[tile_index] + ((attr & 0x07) << 8);
int color = (attr & 0xf0) >> 4; int color = (attr & 0xf0) >> 4;
SET_TILE_INFO(1, code, color, 0); SET_TILE_INFO(1, code, color, 0);
@ -132,8 +133,9 @@ static TILE_GET_INFO( pkunwar_get_bg_tile_info )
static TILE_GET_INFO( raiders5_get_bg_tile_info ) static TILE_GET_INFO( raiders5_get_bg_tile_info )
{ {
int attr = nova2001_bg_videoram[tile_index+0x400]; nova2001_state *state = machine->driver_data<nova2001_state>();
int code = nova2001_bg_videoram[tile_index] + ((attr & 0x01) << 8); int attr = state->bg_videoram[tile_index+0x400];
int code = state->bg_videoram[tile_index] + ((attr & 0x01) << 8);
int color = (attr & 0xf0) >> 4; int color = (attr & 0xf0) >> 4;
SET_TILE_INFO(2, code, color, 0); SET_TILE_INFO(2, code, color, 0);
@ -141,8 +143,9 @@ static TILE_GET_INFO( raiders5_get_bg_tile_info )
static TILE_GET_INFO( raiders5_get_fg_tile_info ) static TILE_GET_INFO( raiders5_get_fg_tile_info )
{ {
int code = nova2001_fg_videoram[tile_index]; nova2001_state *state = machine->driver_data<nova2001_state>();
int color = (nova2001_fg_videoram[tile_index + 0x400] & 0xf0) >> 4; int code = state->fg_videoram[tile_index];
int color = (state->fg_videoram[tile_index + 0x400] & 0xf0) >> 4;
SET_TILE_INFO(1, code, color, 0); SET_TILE_INFO(1, code, color, 0);
} }
@ -157,32 +160,36 @@ static TILE_GET_INFO( raiders5_get_fg_tile_info )
VIDEO_START( nova2001 ) VIDEO_START( nova2001 )
{ {
bg_tilemap = tilemap_create(machine, nova2001_get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); nova2001_state *state = machine->driver_data<nova2001_state>();
fg_tilemap = tilemap_create(machine, nova2001_get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); state->bg_tilemap = tilemap_create(machine, nova2001_get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
tilemap_set_transparent_pen(fg_tilemap, 0); state->fg_tilemap = tilemap_create(machine, nova2001_get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
tilemap_set_scrolldx(bg_tilemap, 0, -7); tilemap_set_transparent_pen(state->fg_tilemap, 0);
tilemap_set_scrolldx(state->bg_tilemap, 0, -7);
} }
VIDEO_START( pkunwar ) VIDEO_START( pkunwar )
{ {
bg_tilemap = tilemap_create(machine, pkunwar_get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); nova2001_state *state = machine->driver_data<nova2001_state>();
tilemap_set_transparent_pen(bg_tilemap, 0); state->bg_tilemap = tilemap_create(machine, pkunwar_get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
tilemap_set_transparent_pen(state->bg_tilemap, 0);
} }
VIDEO_START( ninjakun ) VIDEO_START( ninjakun )
{ {
bg_tilemap = tilemap_create(machine, ninjakun_get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); nova2001_state *state = machine->driver_data<nova2001_state>();
fg_tilemap = tilemap_create(machine, ninjakun_get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); state->bg_tilemap = tilemap_create(machine, ninjakun_get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
tilemap_set_transparent_pen(fg_tilemap, 0); state->fg_tilemap = tilemap_create(machine, ninjakun_get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
tilemap_set_scrolldx(bg_tilemap, 7, 0); tilemap_set_transparent_pen(state->fg_tilemap, 0);
tilemap_set_scrolldx(state->bg_tilemap, 7, 0);
} }
VIDEO_START( raiders5 ) VIDEO_START( raiders5 )
{ {
bg_tilemap = tilemap_create(machine, raiders5_get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); nova2001_state *state = machine->driver_data<nova2001_state>();
fg_tilemap = tilemap_create(machine, raiders5_get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32); state->bg_tilemap = tilemap_create(machine, raiders5_get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
tilemap_set_transparent_pen(fg_tilemap, 0); state->fg_tilemap = tilemap_create(machine, raiders5_get_fg_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
tilemap_set_scrolldx(bg_tilemap, 7, 0); tilemap_set_transparent_pen(state->fg_tilemap, 0);
tilemap_set_scrolldx(state->bg_tilemap, 7, 0);
} }
@ -195,47 +202,53 @@ VIDEO_START( raiders5 )
WRITE8_HANDLER( nova2001_fg_videoram_w ) WRITE8_HANDLER( nova2001_fg_videoram_w )
{ {
nova2001_fg_videoram[offset] = data; nova2001_state *state = space->machine->driver_data<nova2001_state>();
tilemap_mark_tile_dirty(fg_tilemap, offset & 0x3ff); state->fg_videoram[offset] = data;
tilemap_mark_tile_dirty(state->fg_tilemap, offset & 0x3ff);
} }
WRITE8_HANDLER( nova2001_bg_videoram_w ) WRITE8_HANDLER( nova2001_bg_videoram_w )
{ {
nova2001_bg_videoram[offset] = data; nova2001_state *state = space->machine->driver_data<nova2001_state>();
tilemap_mark_tile_dirty(bg_tilemap,offset & 0x3ff); state->bg_videoram[offset] = data;
tilemap_mark_tile_dirty(state->bg_tilemap,offset & 0x3ff);
} }
WRITE8_HANDLER( ninjakun_bg_videoram_w ) WRITE8_HANDLER( ninjakun_bg_videoram_w )
{ {
int x = tilemap_get_scrollx(bg_tilemap, 0) >> 3; nova2001_state *state = space->machine->driver_data<nova2001_state>();
int y = tilemap_get_scrolly(bg_tilemap, 0) >> 3; int x = tilemap_get_scrollx(state->bg_tilemap, 0) >> 3;
int y = tilemap_get_scrolly(state->bg_tilemap, 0) >> 3;
// add scroll registers to address // add scroll registers to address
offset = ((offset + x + (y << 5)) & 0x3ff) + (offset & 0x400); offset = ((offset + x + (y << 5)) & 0x3ff) + (offset & 0x400);
nova2001_bg_videoram[offset] = data; state->bg_videoram[offset] = data;
tilemap_mark_tile_dirty(bg_tilemap,offset & 0x3ff); tilemap_mark_tile_dirty(state->bg_tilemap,offset & 0x3ff);
} }
READ8_HANDLER( ninjakun_bg_videoram_r ) READ8_HANDLER( ninjakun_bg_videoram_r )
{ {
int x = tilemap_get_scrollx(bg_tilemap, 0) >> 3; nova2001_state *state = space->machine->driver_data<nova2001_state>();
int y = tilemap_get_scrolly(bg_tilemap, 0) >> 3; int x = tilemap_get_scrollx(state->bg_tilemap, 0) >> 3;
int y = tilemap_get_scrolly(state->bg_tilemap, 0) >> 3;
// add scroll registers to address // add scroll registers to address
offset = ((offset + x + (y << 5)) & 0x3ff) + (offset & 0x400); offset = ((offset + x + (y << 5)) & 0x3ff) + (offset & 0x400);
return nova2001_bg_videoram[offset]; return state->bg_videoram[offset];
} }
WRITE8_HANDLER( nova2001_scroll_x_w ) WRITE8_HANDLER( nova2001_scroll_x_w )
{ {
tilemap_set_scrollx(bg_tilemap, 0, data); nova2001_state *state = space->machine->driver_data<nova2001_state>();
tilemap_set_scrollx(state->bg_tilemap, 0, data);
} }
WRITE8_HANDLER( nova2001_scroll_y_w ) WRITE8_HANDLER( nova2001_scroll_y_w )
{ {
tilemap_set_scrolly(bg_tilemap, 0, data); nova2001_state *state = space->machine->driver_data<nova2001_state>();
tilemap_set_scrolly(state->bg_tilemap, 0, data);
} }
WRITE8_HANDLER( nova2001_flipscreen_w ) WRITE8_HANDLER( nova2001_flipscreen_w )
@ -342,49 +355,53 @@ static void pkunwar_draw_sprites(running_machine *machine, bitmap_t *bitmap, con
SCREEN_UPDATE( nova2001 ) SCREEN_UPDATE( nova2001 )
{ {
tilemap_draw(bitmap, cliprect, bg_tilemap, 0, 0); nova2001_state *state = screen->machine->driver_data<nova2001_state>();
tilemap_draw(bitmap, cliprect, state->bg_tilemap, 0, 0);
nova2001_draw_sprites(screen->machine, bitmap, cliprect); nova2001_draw_sprites(screen->machine, bitmap, cliprect);
// according to the schematics, fg category 0 should be drawn behind sprites, // according to the schematics, fg category 0 should be drawn behind sprites,
// but it doesn't look right that way // but it doesn't look right that way
tilemap_draw(bitmap, cliprect, fg_tilemap, 0, 0); tilemap_draw(bitmap, cliprect, state->fg_tilemap, 0, 0);
tilemap_draw(bitmap, cliprect, fg_tilemap, 1, 0); tilemap_draw(bitmap, cliprect, state->fg_tilemap, 1, 0);
return 0; return 0;
} }
SCREEN_UPDATE( pkunwar ) SCREEN_UPDATE( pkunwar )
{ {
tilemap_draw(bitmap, cliprect, bg_tilemap, TILEMAP_DRAW_OPAQUE | TILEMAP_DRAW_ALL_CATEGORIES, 0); nova2001_state *state = screen->machine->driver_data<nova2001_state>();
tilemap_draw(bitmap, cliprect, state->bg_tilemap, TILEMAP_DRAW_OPAQUE | TILEMAP_DRAW_ALL_CATEGORIES, 0);
pkunwar_draw_sprites(screen->machine, bitmap, cliprect); pkunwar_draw_sprites(screen->machine, bitmap, cliprect);
tilemap_draw(bitmap, cliprect, bg_tilemap, 1, 0); tilemap_draw(bitmap, cliprect, state->bg_tilemap, 1, 0);
return 0; return 0;
} }
SCREEN_UPDATE( ninjakun ) SCREEN_UPDATE( ninjakun )
{ {
tilemap_draw(bitmap, cliprect, bg_tilemap, 0, 0); nova2001_state *state = screen->machine->driver_data<nova2001_state>();
tilemap_draw(bitmap, cliprect, state->bg_tilemap, 0, 0);
tilemap_draw(bitmap, cliprect, fg_tilemap, 1, 0); tilemap_draw(bitmap, cliprect, state->fg_tilemap, 1, 0);
nova2001_draw_sprites(screen->machine, bitmap, cliprect); nova2001_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;
} }
SCREEN_UPDATE( raiders5 ) SCREEN_UPDATE( raiders5 )
{ {
tilemap_draw(bitmap, cliprect, bg_tilemap, 0, 0); nova2001_state *state = screen->machine->driver_data<nova2001_state>();
tilemap_draw(bitmap, cliprect, state->bg_tilemap, 0, 0);
pkunwar_draw_sprites(screen->machine, bitmap, cliprect); pkunwar_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;
} }

View File

@ -15,25 +15,6 @@
#define BITMAP_XOFFSET 4 #define BITMAP_XOFFSET 4
/*************************************
*
* Statics
*
*************************************/
UINT16 *rpunch_bitmapram;
size_t rpunch_bitmapram_size;
int rpunch_sprite_palette;
static tilemap_t *background[2];
static UINT16 videoflags;
static UINT8 crtc_register;
static emu_timer *crtc_timer;
static UINT8 bins, gins;
/************************************* /*************************************
* *
* Tilemap callbacks * Tilemap callbacks
@ -46,13 +27,13 @@ static TILE_GET_INFO( get_bg0_tile_info )
UINT16 *videoram = state->videoram; UINT16 *videoram = state->videoram;
int data = videoram[tile_index]; int data = videoram[tile_index];
int code; int code;
if (videoflags & 0x0400) code = (data & 0x0fff) | 0x2000; if (state->videoflags & 0x0400) code = (data & 0x0fff) | 0x2000;
else code = (data & 0x1fff); else code = (data & 0x1fff);
SET_TILE_INFO( SET_TILE_INFO(
0, 0,
code, code,
((videoflags & 0x0010) >> 1) | ((data >> 13) & 7), ((state->videoflags & 0x0010) >> 1) | ((data >> 13) & 7),
0); 0);
} }
@ -62,13 +43,13 @@ static TILE_GET_INFO( get_bg1_tile_info )
UINT16 *videoram = state->videoram; UINT16 *videoram = state->videoram;
int data = videoram[0x2000 / 2 + tile_index]; int data = videoram[0x2000 / 2 + tile_index];
int code; int code;
if (videoflags & 0x0800) code = (data & 0x0fff) | 0x2000; if (state->videoflags & 0x0800) code = (data & 0x0fff) | 0x2000;
else code = (data & 0x1fff); else code = (data & 0x1fff);
SET_TILE_INFO( SET_TILE_INFO(
1, 1,
code, code,
((videoflags & 0x0020) >> 2) | ((data >> 13) & 7), ((state->videoflags & 0x0020) >> 2) | ((data >> 13) & 7),
0); 0);
} }
@ -81,26 +62,28 @@ static TILE_GET_INFO( get_bg1_tile_info )
static TIMER_CALLBACK( crtc_interrupt_gen ) static TIMER_CALLBACK( crtc_interrupt_gen )
{ {
rpunch_state *state = machine->driver_data<rpunch_state>();
cputag_set_input_line(machine, "maincpu", 1, HOLD_LINE); cputag_set_input_line(machine, "maincpu", 1, HOLD_LINE);
if (param != 0) if (param != 0)
crtc_timer->adjust(machine->primary_screen->frame_period() / param, 0, machine->primary_screen->frame_period() / param); state->crtc_timer->adjust(machine->primary_screen->frame_period() / param, 0, machine->primary_screen->frame_period() / param);
} }
VIDEO_START( rpunch ) VIDEO_START( rpunch )
{ {
rpunch_state *state = machine->driver_data<rpunch_state>();
/* allocate tilemaps for the backgrounds */ /* allocate tilemaps for the backgrounds */
background[0] = tilemap_create(machine, get_bg0_tile_info,tilemap_scan_cols,8,8,64,64); state->background[0] = tilemap_create(machine, get_bg0_tile_info,tilemap_scan_cols,8,8,64,64);
background[1] = tilemap_create(machine, get_bg1_tile_info,tilemap_scan_cols,8,8,64,64); state->background[1] = tilemap_create(machine, get_bg1_tile_info,tilemap_scan_cols,8,8,64,64);
/* configure the tilemaps */ /* configure the tilemaps */
tilemap_set_transparent_pen(background[1],15); tilemap_set_transparent_pen(state->background[1],15);
if (rpunch_bitmapram) if (state->bitmapram)
memset(rpunch_bitmapram, 0xff, rpunch_bitmapram_size); memset(state->bitmapram, 0xff, state->bitmapram_size);
/* reset the timer */ /* reset the timer */
crtc_timer = machine->scheduler().timer_alloc(FUNC(crtc_interrupt_gen)); state->crtc_timer = machine->scheduler().timer_alloc(FUNC(crtc_interrupt_gen));
} }
@ -118,45 +101,47 @@ WRITE16_HANDLER( rpunch_videoram_w )
int tmap = offset >> 12; int tmap = offset >> 12;
int tile_index = offset & 0xfff; int tile_index = offset & 0xfff;
COMBINE_DATA(&videoram[offset]); COMBINE_DATA(&videoram[offset]);
tilemap_mark_tile_dirty(background[tmap],tile_index); tilemap_mark_tile_dirty(state->background[tmap],tile_index);
} }
WRITE16_HANDLER( rpunch_videoreg_w ) WRITE16_HANDLER( rpunch_videoreg_w )
{ {
int oldword = videoflags; rpunch_state *state = space->machine->driver_data<rpunch_state>();
COMBINE_DATA(&videoflags); int oldword = state->videoflags;
COMBINE_DATA(&state->videoflags);
if (videoflags != oldword) if (state->videoflags != oldword)
{ {
/* invalidate tilemaps */ /* invalidate tilemaps */
if ((oldword ^ videoflags) & 0x0410) if ((oldword ^ state->videoflags) & 0x0410)
tilemap_mark_all_tiles_dirty(background[0]); tilemap_mark_all_tiles_dirty(state->background[0]);
if ((oldword ^ videoflags) & 0x0820) if ((oldword ^ state->videoflags) & 0x0820)
tilemap_mark_all_tiles_dirty(background[1]); tilemap_mark_all_tiles_dirty(state->background[1]);
} }
} }
WRITE16_HANDLER( rpunch_scrollreg_w ) WRITE16_HANDLER( rpunch_scrollreg_w )
{ {
rpunch_state *state = space->machine->driver_data<rpunch_state>();
if (ACCESSING_BITS_0_7 && ACCESSING_BITS_8_15) if (ACCESSING_BITS_0_7 && ACCESSING_BITS_8_15)
switch (offset) switch (offset)
{ {
case 0: case 0:
tilemap_set_scrolly(background[0], 0, data & 0x1ff); tilemap_set_scrolly(state->background[0], 0, data & 0x1ff);
break; break;
case 1: case 1:
tilemap_set_scrollx(background[0], 0, data & 0x1ff); tilemap_set_scrollx(state->background[0], 0, data & 0x1ff);
break; break;
case 2: case 2:
tilemap_set_scrolly(background[1], 0, data & 0x1ff); tilemap_set_scrolly(state->background[1], 0, data & 0x1ff);
break; break;
case 3: case 3:
tilemap_set_scrollx(background[1], 0, data & 0x1ff); tilemap_set_scrollx(state->background[1], 0, data & 0x1ff);
break; break;
} }
} }
@ -164,18 +149,19 @@ WRITE16_HANDLER( rpunch_scrollreg_w )
WRITE16_HANDLER( rpunch_crtc_data_w ) WRITE16_HANDLER( rpunch_crtc_data_w )
{ {
rpunch_state *state = space->machine->driver_data<rpunch_state>();
if (ACCESSING_BITS_0_7) if (ACCESSING_BITS_0_7)
{ {
data &= 0xff; data &= 0xff;
switch (crtc_register) switch (state->crtc_register)
{ {
/* only register we know about.... */ /* only register we know about.... */
case 0x0b: case 0x0b:
crtc_timer->adjust(space->machine->primary_screen->time_until_vblank_start(), (data == 0xc0) ? 2 : 1); state->crtc_timer->adjust(space->machine->primary_screen->time_until_vblank_start(), (data == 0xc0) ? 2 : 1);
break; break;
default: default:
logerror("CRTC register %02X = %02X\n", crtc_register, data & 0xff); logerror("CRTC register %02X = %02X\n", state->crtc_register, data & 0xff);
break; break;
} }
} }
@ -184,23 +170,25 @@ WRITE16_HANDLER( rpunch_crtc_data_w )
WRITE16_HANDLER( rpunch_crtc_register_w ) WRITE16_HANDLER( rpunch_crtc_register_w )
{ {
rpunch_state *state = space->machine->driver_data<rpunch_state>();
if (ACCESSING_BITS_0_7) if (ACCESSING_BITS_0_7)
crtc_register = data & 0xff; state->crtc_register = data & 0xff;
} }
WRITE16_HANDLER( rpunch_ins_w ) WRITE16_HANDLER( rpunch_ins_w )
{ {
rpunch_state *state = space->machine->driver_data<rpunch_state>();
if (ACCESSING_BITS_0_7) if (ACCESSING_BITS_0_7)
{ {
if (offset == 0) if (offset == 0)
{ {
gins = data & 0x3f; state->gins = data & 0x3f;
logerror("GINS = %02X\n", data & 0x3f); logerror("GINS = %02X\n", data & 0x3f);
} }
else else
{ {
bins = data & 0x3f; state->bins = data & 0x3f;
logerror("BINS = %02X\n", data & 0x3f); logerror("BINS = %02X\n", data & 0x3f);
} }
} }
@ -215,6 +203,7 @@ WRITE16_HANDLER( rpunch_ins_w )
static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect, int start, int stop) static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect, int start, int stop)
{ {
rpunch_state *state = machine->driver_data<rpunch_state>();
UINT16 *spriteram16 = machine->generic.spriteram.u16; UINT16 *spriteram16 = machine->generic.spriteram.u16;
int offs; int offs;
@ -233,13 +222,13 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
int y = 513 - (data0 & 0x1ff); int y = 513 - (data0 & 0x1ff);
int xflip = data1 & 0x1000; int xflip = data1 & 0x1000;
int yflip = data1 & 0x0800; int yflip = data1 & 0x0800;
int color = ((data1 >> 13) & 7) | ((videoflags & 0x0040) >> 3); int color = ((data1 >> 13) & 7) | ((state->videoflags & 0x0040) >> 3);
if (x >= BITMAP_WIDTH) x -= 512; if (x >= BITMAP_WIDTH) x -= 512;
if (y >= BITMAP_HEIGHT) y -= 512; if (y >= BITMAP_HEIGHT) y -= 512;
drawgfx_transpen(bitmap, cliprect, machine->gfx[2], drawgfx_transpen(bitmap, cliprect, machine->gfx[2],
code, color + (rpunch_sprite_palette / 16), xflip, yflip, x, y, 15); code, color + (state->sprite_palette / 16), xflip, yflip, x, y, 15);
} }
} }
@ -250,14 +239,15 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
* *
*************************************/ *************************************/
static void draw_bitmap(bitmap_t *bitmap, const rectangle *cliprect) static void draw_bitmap(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect)
{ {
rpunch_state *state = machine->driver_data<rpunch_state>();
int colourbase; int colourbase;
int xxx=512/4; int xxx=512/4;
int yyy=256; int yyy=256;
int x,y,count; int x,y,count;
colourbase = 512 + ((videoflags & 15) * 16); colourbase = 512 + ((state->videoflags & 15) * 16);
count = 0; count = 0;
@ -266,10 +256,10 @@ static void draw_bitmap(bitmap_t *bitmap, const rectangle *cliprect)
for(x=0;x<xxx;x++) for(x=0;x<xxx;x++)
{ {
int coldat; int coldat;
coldat = (rpunch_bitmapram[count]>>12)&0xf; if (coldat!=15) *BITMAP_ADDR16(bitmap, y, ((x*4+0)-4)&0x1ff) = coldat+colourbase; coldat = (state->bitmapram[count]>>12)&0xf; if (coldat!=15) *BITMAP_ADDR16(bitmap, y, ((x*4+0)-4)&0x1ff) = coldat+colourbase;
coldat = (rpunch_bitmapram[count]>>8 )&0xf; if (coldat!=15) *BITMAP_ADDR16(bitmap, y, ((x*4+1)-4)&0x1ff) = coldat+colourbase; coldat = (state->bitmapram[count]>>8 )&0xf; if (coldat!=15) *BITMAP_ADDR16(bitmap, y, ((x*4+1)-4)&0x1ff) = coldat+colourbase;
coldat = (rpunch_bitmapram[count]>>4 )&0xf; if (coldat!=15) *BITMAP_ADDR16(bitmap, y, ((x*4+2)-4)&0x1ff) = coldat+colourbase; coldat = (state->bitmapram[count]>>4 )&0xf; if (coldat!=15) *BITMAP_ADDR16(bitmap, y, ((x*4+2)-4)&0x1ff) = coldat+colourbase;
coldat = (rpunch_bitmapram[count]>>0 )&0xf; if (coldat!=15) *BITMAP_ADDR16(bitmap, y, ((x*4+3)-4)&0x1ff) = coldat+colourbase; coldat = (state->bitmapram[count]>>0 )&0xf; if (coldat!=15) *BITMAP_ADDR16(bitmap, y, ((x*4+3)-4)&0x1ff) = coldat+colourbase;
count++; count++;
} }
} }
@ -284,16 +274,17 @@ static void draw_bitmap(bitmap_t *bitmap, const rectangle *cliprect)
SCREEN_UPDATE( rpunch ) SCREEN_UPDATE( rpunch )
{ {
rpunch_state *state = screen->machine->driver_data<rpunch_state>();
int effbins; int effbins;
/* this seems like the most plausible explanation */ /* this seems like the most plausible explanation */
effbins = (bins > gins) ? gins : bins; effbins = (state->bins > state->gins) ? state->gins : state->bins;
tilemap_draw(bitmap,cliprect, background[0], 0,0); tilemap_draw(bitmap, cliprect, state->background[0], 0,0);
draw_sprites(screen->machine, bitmap, cliprect, 0, effbins); draw_sprites(screen->machine, bitmap, cliprect, 0, effbins);
tilemap_draw(bitmap,cliprect, background[1], 0,0); tilemap_draw(bitmap, cliprect, state->background[1], 0,0);
draw_sprites(screen->machine, bitmap,cliprect, effbins, gins); draw_sprites(screen->machine, bitmap, cliprect, effbins, state->gins);
if (rpunch_bitmapram) if (state->bitmapram)
draw_bitmap(bitmap,cliprect); draw_bitmap(screen->machine, bitmap, cliprect);
return 0; return 0;
} }

View File

@ -9,17 +9,6 @@
#include "emu.h" #include "emu.h"
#include "includes/slapfght.h" #include "includes/slapfght.h"
UINT8 *slapfight_videoram;
UINT8 *slapfight_colorram;
UINT8 *slapfight_fixvideoram;
UINT8 *slapfight_fixcolorram;
UINT8 *slapfight_scrollx_lo,*slapfight_scrollx_hi,*slapfight_scrolly;
static int flipscreen, slapfight_palette_bank = 0;
static tilemap_t *pf1_tilemap,*fix_tilemap;
/*************************************************************************** /***************************************************************************
@ -29,10 +18,11 @@ static tilemap_t *pf1_tilemap,*fix_tilemap;
static TILE_GET_INFO( get_pf_tile_info ) /* For Performan only */ static TILE_GET_INFO( get_pf_tile_info ) /* For Performan only */
{ {
slapfght_state *state = machine->driver_data<slapfght_state>();
int tile,color; int tile,color;
tile=slapfight_videoram[tile_index] + ((slapfight_colorram[tile_index] & 0x03) << 8); tile=state->slapfight_videoram[tile_index] + ((state->slapfight_colorram[tile_index] & 0x03) << 8);
color=(slapfight_colorram[tile_index] >> 3) & 0x0f; color=(state->slapfight_colorram[tile_index] >> 3) & 0x0f;
SET_TILE_INFO( SET_TILE_INFO(
0, 0,
tile, tile,
@ -42,10 +32,11 @@ static TILE_GET_INFO( get_pf_tile_info ) /* For Performan only */
static TILE_GET_INFO( get_pf1_tile_info ) static TILE_GET_INFO( get_pf1_tile_info )
{ {
slapfght_state *state = machine->driver_data<slapfght_state>();
int tile,color; int tile,color;
tile=slapfight_videoram[tile_index] + ((slapfight_colorram[tile_index] & 0x0f) << 8); tile=state->slapfight_videoram[tile_index] + ((state->slapfight_colorram[tile_index] & 0x0f) << 8);
color=(slapfight_colorram[tile_index] & 0xf0) >> 4; color=(state->slapfight_colorram[tile_index] & 0xf0) >> 4;
SET_TILE_INFO( SET_TILE_INFO(
1, 1,
@ -56,10 +47,11 @@ static TILE_GET_INFO( get_pf1_tile_info )
static TILE_GET_INFO( get_fix_tile_info ) static TILE_GET_INFO( get_fix_tile_info )
{ {
slapfght_state *state = machine->driver_data<slapfght_state>();
int tile,color; int tile,color;
tile=slapfight_fixvideoram[tile_index] + ((slapfight_fixcolorram[tile_index] & 0x03) << 8); tile=state->slapfight_fixvideoram[tile_index] + ((state->slapfight_fixcolorram[tile_index] & 0x03) << 8);
color=(slapfight_fixcolorram[tile_index] & 0xfc) >> 2; color=(state->slapfight_fixcolorram[tile_index] & 0xfc) >> 2;
SET_TILE_INFO( SET_TILE_INFO(
0, 0,
@ -77,17 +69,19 @@ static TILE_GET_INFO( get_fix_tile_info )
VIDEO_START( perfrman ) VIDEO_START( perfrman )
{ {
pf1_tilemap = tilemap_create(machine, get_pf_tile_info,tilemap_scan_rows,8,8,64,32); slapfght_state *state = machine->driver_data<slapfght_state>();
state->pf1_tilemap = tilemap_create(machine, get_pf_tile_info,tilemap_scan_rows,8,8,64,32);
tilemap_set_transparent_pen(pf1_tilemap,0); tilemap_set_transparent_pen(state->pf1_tilemap,0);
} }
VIDEO_START( slapfight ) VIDEO_START( slapfight )
{ {
pf1_tilemap = tilemap_create(machine, get_pf1_tile_info,tilemap_scan_rows,8,8,64,32); slapfght_state *state = machine->driver_data<slapfght_state>();
fix_tilemap = tilemap_create(machine, get_fix_tile_info,tilemap_scan_rows,8,8,64,32); state->pf1_tilemap = tilemap_create(machine, get_pf1_tile_info,tilemap_scan_rows,8,8,64,32);
state->fix_tilemap = tilemap_create(machine, get_fix_tile_info,tilemap_scan_rows,8,8,64,32);
tilemap_set_transparent_pen(fix_tilemap,0); tilemap_set_transparent_pen(state->fix_tilemap,0);
} }
@ -99,49 +93,56 @@ VIDEO_START( slapfight )
WRITE8_HANDLER( slapfight_videoram_w ) WRITE8_HANDLER( slapfight_videoram_w )
{ {
slapfight_videoram[offset]=data; slapfght_state *state = space->machine->driver_data<slapfght_state>();
tilemap_mark_tile_dirty(pf1_tilemap,offset); state->slapfight_videoram[offset]=data;
tilemap_mark_tile_dirty(state->pf1_tilemap,offset);
} }
WRITE8_HANDLER( slapfight_colorram_w ) WRITE8_HANDLER( slapfight_colorram_w )
{ {
slapfight_colorram[offset]=data; slapfght_state *state = space->machine->driver_data<slapfght_state>();
tilemap_mark_tile_dirty(pf1_tilemap,offset); state->slapfight_colorram[offset]=data;
tilemap_mark_tile_dirty(state->pf1_tilemap,offset);
} }
WRITE8_HANDLER( slapfight_fixram_w ) WRITE8_HANDLER( slapfight_fixram_w )
{ {
slapfight_fixvideoram[offset]=data; slapfght_state *state = space->machine->driver_data<slapfght_state>();
tilemap_mark_tile_dirty(fix_tilemap,offset); state->slapfight_fixvideoram[offset]=data;
tilemap_mark_tile_dirty(state->fix_tilemap,offset);
} }
WRITE8_HANDLER( slapfight_fixcol_w ) WRITE8_HANDLER( slapfight_fixcol_w )
{ {
slapfight_fixcolorram[offset]=data; slapfght_state *state = space->machine->driver_data<slapfght_state>();
tilemap_mark_tile_dirty(fix_tilemap,offset); state->slapfight_fixcolorram[offset]=data;
tilemap_mark_tile_dirty(state->fix_tilemap,offset);
} }
WRITE8_HANDLER( slapfight_flipscreen_w ) WRITE8_HANDLER( slapfight_flipscreen_w )
{ {
slapfght_state *state = space->machine->driver_data<slapfght_state>();
logerror("Writing %02x to flipscreen\n",offset); logerror("Writing %02x to flipscreen\n",offset);
if (offset==0) flipscreen=1; /* Port 0x2 is flipscreen */ if (offset==0) state->flipscreen=1; /* Port 0x2 is flipscreen */
else flipscreen=0; /* Port 0x3 is normal */ else state->flipscreen=0; /* Port 0x3 is normal */
} }
WRITE8_HANDLER( slapfight_palette_bank_w ) WRITE8_HANDLER( slapfight_palette_bank_w )
{ {
slapfight_palette_bank = offset; slapfght_state *state = space->machine->driver_data<slapfght_state>();
state->slapfight_palette_bank = offset;
} }
static void slapfght_log_vram(running_machine *machine) static void slapfght_log_vram(running_machine *machine)
{ {
#ifdef MAME_DEBUG #ifdef MAME_DEBUG
slapfght_state *state = machine->driver_data<slapfght_state>();
if ( input_code_pressed_once(machine, KEYCODE_B) ) if ( input_code_pressed_once(machine, KEYCODE_B) )
{ {
int i; int i;
for (i=0; i<0x800; i++) for (i=0; i<0x800; i++)
{ {
logerror("Offset:%03x TileRAM:%02x AttribRAM:%02x SpriteRAM:%02x\n",i, slapfight_videoram[i],slapfight_colorram[i],machine->generic.spriteram.u8[i]); logerror("Offset:%03x TileRAM:%02x AttribRAM:%02x SpriteRAM:%02x\n",i, state->slapfight_videoram[i],state->slapfight_colorram[i],machine->generic.spriteram.u8[i]);
} }
} }
#endif #endif
@ -154,6 +155,7 @@ static void slapfght_log_vram(running_machine *machine)
***************************************************************************/ ***************************************************************************/
static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect, int priority_to_display ) static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect, int priority_to_display )
{ {
slapfght_state *state = machine->driver_data<slapfght_state>();
UINT8 *buffered_spriteram = machine->generic.buffered_spriteram.u8; UINT8 *buffered_spriteram = machine->generic.buffered_spriteram.u8;
int offs; int offs;
@ -163,7 +165,7 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
if ((buffered_spriteram[offs+2] & 0x80) == priority_to_display) if ((buffered_spriteram[offs+2] & 0x80) == priority_to_display)
{ {
if (flipscreen) if (state->flipscreen)
{ {
sx = 265 - buffered_spriteram[offs+1]; sx = 265 - buffered_spriteram[offs+1];
sy = 239 - buffered_spriteram[offs+3]; sy = 239 - buffered_spriteram[offs+3];
@ -177,8 +179,8 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
drawgfx_transpen(bitmap,cliprect,machine->gfx[1], drawgfx_transpen(bitmap,cliprect,machine->gfx[1],
buffered_spriteram[offs], buffered_spriteram[offs],
((buffered_spriteram[offs+2] >> 1) & 3) | ((buffered_spriteram[offs+2] >> 1) & 3) |
((buffered_spriteram[offs+2] << 2) & 4) | (slapfight_palette_bank << 3), ((buffered_spriteram[offs+2] << 2) & 4) | (state->slapfight_palette_bank << 3),
flipscreen, flipscreen, state->flipscreen, state->flipscreen,
sx, sy,0); sx, sy,0);
} }
} }
@ -187,18 +189,19 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
SCREEN_UPDATE( perfrman ) SCREEN_UPDATE( perfrman )
{ {
tilemap_set_flip( pf1_tilemap, flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); slapfght_state *state = screen->machine->driver_data<slapfght_state>();
tilemap_set_scrolly( pf1_tilemap ,0 , 0 ); tilemap_set_flip( state->pf1_tilemap, state->flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0);
if (flipscreen) { tilemap_set_scrolly( state->pf1_tilemap ,0 , 0 );
tilemap_set_scrollx( pf1_tilemap ,0 , 264 ); if (state->flipscreen) {
tilemap_set_scrollx( state->pf1_tilemap ,0 , 264 );
} }
else { else {
tilemap_set_scrollx( pf1_tilemap ,0 , -16 ); tilemap_set_scrollx( state->pf1_tilemap ,0 , -16 );
} }
tilemap_draw(bitmap,cliprect,pf1_tilemap,TILEMAP_DRAW_OPAQUE,0); tilemap_draw(bitmap,cliprect,state->pf1_tilemap,TILEMAP_DRAW_OPAQUE,0);
draw_sprites(screen->machine, bitmap,cliprect,0); draw_sprites(screen->machine, bitmap,cliprect,0);
tilemap_draw(bitmap,cliprect,pf1_tilemap,0,0); tilemap_draw(bitmap,cliprect,state->pf1_tilemap,0,0);
draw_sprites(screen->machine, bitmap,cliprect,0x80); draw_sprites(screen->machine, bitmap,cliprect,0x80);
slapfght_log_vram(screen->machine); slapfght_log_vram(screen->machine);
@ -208,29 +211,30 @@ SCREEN_UPDATE( perfrman )
SCREEN_UPDATE( slapfight ) SCREEN_UPDATE( slapfight )
{ {
slapfght_state *state = screen->machine->driver_data<slapfght_state>();
UINT8 *buffered_spriteram = screen->machine->generic.buffered_spriteram.u8; UINT8 *buffered_spriteram = screen->machine->generic.buffered_spriteram.u8;
int offs; int offs;
tilemap_set_flip_all(screen->machine,flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); tilemap_set_flip_all(screen->machine,state->flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0);
if (flipscreen) { if (state->flipscreen) {
tilemap_set_scrollx( fix_tilemap,0,296); tilemap_set_scrollx( state->fix_tilemap,0,296);
tilemap_set_scrollx( pf1_tilemap,0,(*slapfight_scrollx_lo + 256 * *slapfight_scrollx_hi)+296 ); tilemap_set_scrollx( state->pf1_tilemap,0,(*state->slapfight_scrollx_lo + 256 * *state->slapfight_scrollx_hi)+296 );
tilemap_set_scrolly( pf1_tilemap,0, (*slapfight_scrolly)+15 ); tilemap_set_scrolly( state->pf1_tilemap,0, (*state->slapfight_scrolly)+15 );
tilemap_set_scrolly( fix_tilemap,0, -1 ); /* Glitch in Tiger Heli otherwise */ tilemap_set_scrolly( state->fix_tilemap,0, -1 ); /* Glitch in Tiger Heli otherwise */
} }
else { else {
tilemap_set_scrollx( fix_tilemap,0,0); tilemap_set_scrollx( state->fix_tilemap,0,0);
tilemap_set_scrollx( pf1_tilemap,0,(*slapfight_scrollx_lo + 256 * *slapfight_scrollx_hi) ); tilemap_set_scrollx( state->pf1_tilemap,0,(*state->slapfight_scrollx_lo + 256 * *state->slapfight_scrollx_hi) );
tilemap_set_scrolly( pf1_tilemap,0, (*slapfight_scrolly)-1 ); tilemap_set_scrolly( state->pf1_tilemap,0, (*state->slapfight_scrolly)-1 );
tilemap_set_scrolly( fix_tilemap,0, -1 ); /* Glitch in Tiger Heli otherwise */ tilemap_set_scrolly( state->fix_tilemap,0, -1 ); /* Glitch in Tiger Heli otherwise */
} }
tilemap_draw(bitmap,cliprect,pf1_tilemap,0,0); tilemap_draw(bitmap,cliprect,state->pf1_tilemap,0,0);
/* Draw the sprites */ /* Draw the sprites */
for (offs = 0;offs < screen->machine->generic.spriteram_size;offs += 4) for (offs = 0;offs < screen->machine->generic.spriteram_size;offs += 4)
{ {
if (flipscreen) if (state->flipscreen)
drawgfx_transpen(bitmap,cliprect,screen->machine->gfx[2], drawgfx_transpen(bitmap,cliprect,screen->machine->gfx[2],
buffered_spriteram[offs] + ((buffered_spriteram[offs+2] & 0xc0) << 2), buffered_spriteram[offs] + ((buffered_spriteram[offs+2] & 0xc0) << 2),
(buffered_spriteram[offs+2] & 0x1e) >> 1, (buffered_spriteram[offs+2] & 0x1e) >> 1,
@ -244,7 +248,7 @@ SCREEN_UPDATE( slapfight )
(buffered_spriteram[offs+1] + ((buffered_spriteram[offs+2] & 0x01) << 8)) - 13,buffered_spriteram[offs+3],0); (buffered_spriteram[offs+1] + ((buffered_spriteram[offs+2] & 0x01) << 8)) - 13,buffered_spriteram[offs+3],0);
} }
tilemap_draw(bitmap,cliprect,fix_tilemap,0,0); tilemap_draw(bitmap,cliprect,state->fix_tilemap,0,0);
slapfght_log_vram(screen->machine); slapfght_log_vram(screen->machine);
return 0; return 0;

View File

@ -8,16 +8,6 @@
#include "includes/suprridr.h" #include "includes/suprridr.h"
UINT8 *suprridr_bgram;
UINT8 *suprridr_fgram;
static tilemap_t *fg_tilemap;
static tilemap_t *bg_tilemap;
static tilemap_t *bg_tilemap_noscroll;
static UINT8 flipx, flipy;
/************************************* /*************************************
* *
* Tilemap callbacks * Tilemap callbacks
@ -26,14 +16,16 @@ static UINT8 flipx, flipy;
static TILE_GET_INFO( get_tile_info ) static TILE_GET_INFO( get_tile_info )
{ {
UINT8 code = suprridr_bgram[tile_index]; suprridr_state *state = machine->driver_data<suprridr_state>();
UINT8 code = state->bgram[tile_index];
SET_TILE_INFO(0, code, 0, 0); SET_TILE_INFO(0, code, 0, 0);
} }
static TILE_GET_INFO( get_tile_info2 ) static TILE_GET_INFO( get_tile_info2 )
{ {
UINT8 code = suprridr_fgram[tile_index]; suprridr_state *state = machine->driver_data<suprridr_state>();
UINT8 code = state->fgram[tile_index];
SET_TILE_INFO(1, code, 0, 0); SET_TILE_INFO(1, code, 0, 0);
} }
@ -47,11 +39,12 @@ static TILE_GET_INFO( get_tile_info2 )
VIDEO_START( suprridr ) VIDEO_START( suprridr )
{ {
fg_tilemap = tilemap_create(machine, get_tile_info2, tilemap_scan_rows, 8,8, 32,32); suprridr_state *state = machine->driver_data<suprridr_state>();
bg_tilemap = tilemap_create(machine, get_tile_info, tilemap_scan_rows, 8,8, 32,32); state->fg_tilemap = tilemap_create(machine, get_tile_info2, tilemap_scan_rows, 8,8, 32,32);
bg_tilemap_noscroll = tilemap_create(machine, get_tile_info, tilemap_scan_rows, 8,8, 32,32); state->bg_tilemap = tilemap_create(machine, get_tile_info, tilemap_scan_rows, 8,8, 32,32);
state->bg_tilemap_noscroll = tilemap_create(machine, get_tile_info, tilemap_scan_rows, 8,8, 32,32);
tilemap_set_transparent_pen(fg_tilemap, 0); tilemap_set_transparent_pen(state->fg_tilemap, 0);
} }
@ -100,39 +93,45 @@ PALETTE_INIT( suprridr )
WRITE8_HANDLER( suprridr_flipx_w ) WRITE8_HANDLER( suprridr_flipx_w )
{ {
flipx = data & 1; suprridr_state *state = space->machine->driver_data<suprridr_state>();
tilemap_set_flip_all(space->machine, (flipx ? TILEMAP_FLIPX : 0) | (flipy ? TILEMAP_FLIPY : 0)); state->flipx = data & 1;
tilemap_set_flip_all(space->machine, (state->flipx ? TILEMAP_FLIPX : 0) | (state->flipy ? TILEMAP_FLIPY : 0));
} }
WRITE8_HANDLER( suprridr_flipy_w ) WRITE8_HANDLER( suprridr_flipy_w )
{ {
flipy = data & 1; suprridr_state *state = space->machine->driver_data<suprridr_state>();
tilemap_set_flip_all(space->machine, (flipx ? TILEMAP_FLIPX : 0) | (flipy ? TILEMAP_FLIPY : 0)); state->flipy = data & 1;
tilemap_set_flip_all(space->machine, (state->flipx ? TILEMAP_FLIPX : 0) | (state->flipy ? TILEMAP_FLIPY : 0));
} }
WRITE8_HANDLER( suprridr_fgdisable_w ) WRITE8_HANDLER( suprridr_fgdisable_w )
{ {
tilemap_set_enable(fg_tilemap, ~data & 1); suprridr_state *state = space->machine->driver_data<suprridr_state>();
tilemap_set_enable(state->fg_tilemap, ~data & 1);
} }
WRITE8_HANDLER( suprridr_fgscrolly_w ) WRITE8_HANDLER( suprridr_fgscrolly_w )
{ {
tilemap_set_scrolly(fg_tilemap, 0, data); suprridr_state *state = space->machine->driver_data<suprridr_state>();
tilemap_set_scrolly(state->fg_tilemap, 0, data);
} }
WRITE8_HANDLER( suprridr_bgscrolly_w ) WRITE8_HANDLER( suprridr_bgscrolly_w )
{ {
tilemap_set_scrolly(bg_tilemap, 0, data); suprridr_state *state = space->machine->driver_data<suprridr_state>();
tilemap_set_scrolly(state->bg_tilemap, 0, data);
} }
int suprridr_is_screen_flipped(void) int suprridr_is_screen_flipped(running_machine *machine)
{ {
return flipx; /* or is it flipy? */ suprridr_state *state = machine->driver_data<suprridr_state>();
return state->flipx; /* or is it flipy? */
} }
@ -145,16 +144,18 @@ int suprridr_is_screen_flipped(void)
WRITE8_HANDLER( suprridr_bgram_w ) WRITE8_HANDLER( suprridr_bgram_w )
{ {
suprridr_bgram[offset] = data; suprridr_state *state = space->machine->driver_data<suprridr_state>();
tilemap_mark_tile_dirty(bg_tilemap, offset); state->bgram[offset] = data;
tilemap_mark_tile_dirty(bg_tilemap_noscroll, offset); tilemap_mark_tile_dirty(state->bg_tilemap, offset);
tilemap_mark_tile_dirty(state->bg_tilemap_noscroll, offset);
} }
WRITE8_HANDLER( suprridr_fgram_w ) WRITE8_HANDLER( suprridr_fgram_w )
{ {
suprridr_fgram[offset] = data; suprridr_state *state = space->machine->driver_data<suprridr_state>();
tilemap_mark_tile_dirty(fg_tilemap, offset); state->fgram[offset] = data;
tilemap_mark_tile_dirty(state->fg_tilemap, offset);
} }
@ -167,6 +168,7 @@ WRITE8_HANDLER( suprridr_fgram_w )
SCREEN_UPDATE( suprridr ) SCREEN_UPDATE( suprridr )
{ {
suprridr_state *state = screen->machine->driver_data<suprridr_state>();
UINT8 *spriteram = screen->machine->generic.spriteram.u8; UINT8 *spriteram = screen->machine->generic.spriteram.u8;
rectangle subclip; rectangle subclip;
int i; int i;
@ -174,25 +176,25 @@ SCREEN_UPDATE( suprridr )
/* render left 4 columns with no scroll */ /* render left 4 columns with no scroll */
subclip = visarea;; subclip = visarea;;
subclip.max_x = subclip.min_x + (flipx ? 1*8 : 4*8) - 1; subclip.max_x = subclip.min_x + (state->flipx ? 1*8 : 4*8) - 1;
sect_rect(&subclip, cliprect); sect_rect(&subclip, cliprect);
tilemap_draw(bitmap, &subclip, bg_tilemap_noscroll, 0, 0); tilemap_draw(bitmap, &subclip, state->bg_tilemap_noscroll, 0, 0);
/* render right 1 column with no scroll */ /* render right 1 column with no scroll */
subclip = visarea;; subclip = visarea;;
subclip.min_x = subclip.max_x - (flipx ? 4*8 : 1*8) + 1; subclip.min_x = subclip.max_x - (state->flipx ? 4*8 : 1*8) + 1;
sect_rect(&subclip, cliprect); sect_rect(&subclip, cliprect);
tilemap_draw(bitmap, &subclip, bg_tilemap_noscroll, 0, 0); tilemap_draw(bitmap, &subclip, state->bg_tilemap_noscroll, 0, 0);
/* render the middle columns normally */ /* render the middle columns normally */
subclip = visarea;; subclip = visarea;;
subclip.min_x += flipx ? 1*8 : 4*8; subclip.min_x += state->flipx ? 1*8 : 4*8;
subclip.max_x -= flipx ? 4*8 : 1*8; subclip.max_x -= state->flipx ? 4*8 : 1*8;
sect_rect(&subclip, cliprect); sect_rect(&subclip, cliprect);
tilemap_draw(bitmap, &subclip, bg_tilemap, 0, 0); tilemap_draw(bitmap, &subclip, state->bg_tilemap, 0, 0);
/* render the top layer */ /* render the top layer */
tilemap_draw(bitmap, cliprect, fg_tilemap, 0, 0); tilemap_draw(bitmap, cliprect, state->fg_tilemap, 0, 0);
/* draw the sprites */ /* draw the sprites */
for (i = 0; i < 48; i++) for (i = 0; i < 48; i++)
@ -204,12 +206,12 @@ SCREEN_UPDATE( suprridr )
int x = spriteram[i*4+3]; int x = spriteram[i*4+3];
int y = 240 - spriteram[i*4+0]; int y = 240 - spriteram[i*4+0];
if (flipx) if (state->flipx)
{ {
fx = !fx; fx = !fx;
x = 240 - x; x = 240 - x;
} }
if (flipy) if (state->flipy)
{ {
fy = !fy; fy = !fy;
y = 240 - y; y = 240 - y;

View File

@ -5,16 +5,6 @@
#include "emu.h" #include "emu.h"
#include "includes/tankbust.h" #include "includes/tankbust.h"
/*
* variables
*/
UINT8 * tankbust_videoram;
UINT8 * tankbust_colorram;
static tilemap_t *bg_tilemap;
static tilemap_t *txt_tilemap;
UINT8 * tankbust_txtram;
/*************************************************************************** /***************************************************************************
@ -38,8 +28,9 @@ note:
static TILE_GET_INFO( get_bg_tile_info ) static TILE_GET_INFO( get_bg_tile_info )
{ {
int code = tankbust_videoram[tile_index]; tankbust_state *state = machine->driver_data<tankbust_state>();
int attr = tankbust_colorram[tile_index]; int code = state->videoram[tile_index];
int attr = state->colorram[tile_index];
int color = ((attr>>4) & 0x07); int color = ((attr>>4) & 0x07);
@ -68,7 +59,8 @@ static TILE_GET_INFO( get_bg_tile_info )
static TILE_GET_INFO( get_txt_tile_info ) static TILE_GET_INFO( get_txt_tile_info )
{ {
int code = tankbust_txtram[tile_index]; tankbust_state *state = machine->driver_data<tankbust_state>();
int code = state->txtram[tile_index];
int color = ((code>>6) & 0x03); int color = ((code>>6) & 0x03);
SET_TILE_INFO( 2, SET_TILE_INFO( 2,
@ -86,14 +78,15 @@ static TILE_GET_INFO( get_txt_tile_info )
VIDEO_START( tankbust ) VIDEO_START( tankbust )
{ {
tankbust_state *state = machine->driver_data<tankbust_state>();
/* not scrollable */ /* not scrollable */
txt_tilemap = tilemap_create(machine, get_txt_tile_info, tilemap_scan_rows, 8, 8, 64, 32); state->txt_tilemap = tilemap_create(machine, get_txt_tile_info, tilemap_scan_rows, 8, 8, 64, 32);
/* scrollable */ /* scrollable */
bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 64, 32); state->bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 64, 32);
tilemap_set_transparent_pen(txt_tilemap, 0); tilemap_set_transparent_pen(state->txt_tilemap, 0);
} }
@ -105,66 +98,72 @@ VIDEO_START( tankbust )
WRITE8_HANDLER( tankbust_background_videoram_w ) WRITE8_HANDLER( tankbust_background_videoram_w )
{ {
tankbust_videoram[offset] = data; tankbust_state *state = space->machine->driver_data<tankbust_state>();
tilemap_mark_tile_dirty(bg_tilemap, offset); state->videoram[offset] = data;
tilemap_mark_tile_dirty(state->bg_tilemap, offset);
} }
READ8_HANDLER( tankbust_background_videoram_r ) READ8_HANDLER( tankbust_background_videoram_r )
{ {
return tankbust_videoram[offset]; tankbust_state *state = space->machine->driver_data<tankbust_state>();
return state->videoram[offset];
} }
WRITE8_HANDLER( tankbust_background_colorram_w ) WRITE8_HANDLER( tankbust_background_colorram_w )
{ {
tankbust_colorram[offset] = data; tankbust_state *state = space->machine->driver_data<tankbust_state>();
tilemap_mark_tile_dirty(bg_tilemap, offset); state->colorram[offset] = data;
tilemap_mark_tile_dirty(state->bg_tilemap, offset);
} }
READ8_HANDLER( tankbust_background_colorram_r ) READ8_HANDLER( tankbust_background_colorram_r )
{ {
return tankbust_colorram[offset]; tankbust_state *state = space->machine->driver_data<tankbust_state>();
return state->colorram[offset];
} }
WRITE8_HANDLER( tankbust_txtram_w ) WRITE8_HANDLER( tankbust_txtram_w )
{ {
tankbust_txtram[offset] = data; tankbust_state *state = space->machine->driver_data<tankbust_state>();
tilemap_mark_tile_dirty(txt_tilemap, offset); state->txtram[offset] = data;
tilemap_mark_tile_dirty(state->txt_tilemap, offset);
} }
READ8_HANDLER( tankbust_txtram_r ) READ8_HANDLER( tankbust_txtram_r )
{ {
return tankbust_txtram[offset]; tankbust_state *state = space->machine->driver_data<tankbust_state>();
return state->txtram[offset];
} }
static UINT8 xscroll[2];
WRITE8_HANDLER( tankbust_xscroll_w ) WRITE8_HANDLER( tankbust_xscroll_w )
{ {
if( xscroll[offset] != data ) tankbust_state *state = space->machine->driver_data<tankbust_state>();
if( state->xscroll[offset] != data )
{ {
int x; int x;
xscroll[offset] = data; state->xscroll[offset] = data;
x = xscroll[0] + 256 * (xscroll[1]&1); x = state->xscroll[0] + 256 * (state->xscroll[1]&1);
if (x>=0x100) x-=0x200; if (x>=0x100) x-=0x200;
tilemap_set_scrollx(bg_tilemap, 0, x ); tilemap_set_scrollx(state->bg_tilemap, 0, x );
} }
//popmessage("x=%02x %02x", xscroll[0], xscroll[1]); //popmessage("x=%02x %02x", state->xscroll[0], state->xscroll[1]);
} }
static UINT8 yscroll[2];
WRITE8_HANDLER( tankbust_yscroll_w ) WRITE8_HANDLER( tankbust_yscroll_w )
{ {
if( yscroll[offset] != data ) tankbust_state *state = space->machine->driver_data<tankbust_state>();
if( state->yscroll[offset] != data )
{ {
int y; int y;
yscroll[offset] = data; state->yscroll[offset] = data;
y = yscroll[0]; y = state->yscroll[0];
if (y>=0x80) y-=0x100; if (y>=0x80) y-=0x100;
tilemap_set_scrolly(bg_tilemap, 0, y ); tilemap_set_scrolly(state->bg_tilemap, 0, y );
} }
//popmessage("y=%02x %02x", yscroll[0], yscroll[1]); //popmessage("y=%02x %02x", state->yscroll[0], state->yscroll[1]);
} }
/*************************************************************************** /***************************************************************************
@ -234,24 +233,25 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
SCREEN_UPDATE( tankbust ) SCREEN_UPDATE( tankbust )
{ {
tankbust_state *state = screen->machine->driver_data<tankbust_state>();
#if 0 #if 0
int i; int i;
for (i=0; i<0x800; i++) for (i=0; i<0x800; i++)
{ {
int tile_attrib = tankbust_colorram[i]; int tile_attrib = state->colorram[i];
if ( (tile_attrib&8) || (tile_attrib&0x80) ) if ( (tile_attrib&8) || (tile_attrib&0x80) )
{ {
tilemap_mark_tile_dirty(bg_tilemap, i); tilemap_mark_tile_dirty(state->bg_tilemap, i);
} }
} }
#endif #endif
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, bg_tilemap, 1, 0); tilemap_draw(bitmap, cliprect, state->bg_tilemap, 1, 0);
tilemap_draw(bitmap, cliprect, txt_tilemap, 0,0); tilemap_draw(bitmap, cliprect, state->txt_tilemap, 0,0);
return 0; return 0;
} }

View File

@ -11,25 +11,15 @@ zooming might be wrong (only used on title logo?)
#include "emu.h" #include "emu.h"
#include "includes/taotaido.h" #include "includes/taotaido.h"
UINT16 *taotaido_spriteram;
UINT16 *taotaido_spriteram2;
UINT16 *taotaido_scrollram;
UINT16 *taotaido_bgram;
static UINT16 taotaido_sprite_character_bank_select[8];
static UINT16 taotaido_video_bank_select[8];
static tilemap_t *bg_tilemap;
static UINT16 *taotaido_spriteram_old, *taotaido_spriteram_older;
static UINT16 *taotaido_spriteram2_old, *taotaido_spriteram2_older;
/* sprite tile codes 0x4000 - 0x7fff get remapped according to the content of these registers */ /* sprite tile codes 0x4000 - 0x7fff get remapped according to the content of these registers */
WRITE16_HANDLER( taotaido_sprite_character_bank_select_w ) WRITE16_HANDLER( taotaido_sprite_character_bank_select_w )
{ {
taotaido_state *state = space->machine->driver_data<taotaido_state>();
if(ACCESSING_BITS_8_15) if(ACCESSING_BITS_8_15)
taotaido_sprite_character_bank_select[offset*2] = data >> 8; state->sprite_character_bank_select[offset*2] = data >> 8;
if(ACCESSING_BITS_0_7) if(ACCESSING_BITS_0_7)
taotaido_sprite_character_bank_select[offset*2+1] = data &0xff; state->sprite_character_bank_select[offset*2+1] = data &0xff;
} }
/* sprites are like the other video system / psikyo games, we can merge this with aerofgt and plenty of other /* sprites are like the other video system / psikyo games, we can merge this with aerofgt and plenty of other
@ -37,6 +27,7 @@ WRITE16_HANDLER( taotaido_sprite_character_bank_select_w )
static void draw_sprite(running_machine *machine, UINT16 spriteno, bitmap_t *bitmap, const rectangle *cliprect ) static void draw_sprite(running_machine *machine, UINT16 spriteno, bitmap_t *bitmap, const rectangle *cliprect )
{ {
taotaido_state *state = machine->driver_data<taotaido_state>();
/*- SPR RAM Format -** /*- SPR RAM Format -**
4 words per sprite 4 words per sprite
@ -50,7 +41,7 @@ static void draw_sprite(running_machine *machine, UINT16 spriteno, bitmap_t *bit
int x,y; int x,y;
UINT16 *source = &taotaido_spriteram_older[spriteno*4]; UINT16 *source = &state->spriteram_older[spriteno*4];
const gfx_element *gfx = machine->gfx[0]; const gfx_element *gfx = machine->gfx[0];
@ -89,7 +80,7 @@ static void draw_sprite(running_machine *machine, UINT16 spriteno, bitmap_t *bit
/* this indirection is a bit different to the other video system games */ /* this indirection is a bit different to the other video system games */
int realtile; int realtile;
realtile = taotaido_spriteram2_older[tile&0x7fff]; realtile = state->spriteram2_older[tile&0x7fff];
if (realtile > 0x3fff) if (realtile > 0x3fff)
{ {
@ -98,7 +89,7 @@ static void draw_sprite(running_machine *machine, UINT16 spriteno, bitmap_t *bit
block = (realtile & 0x3800)>>11; block = (realtile & 0x3800)>>11;
realtile &= 0x07ff; realtile &= 0x07ff;
realtile |= taotaido_sprite_character_bank_select[block] * 0x800; realtile |= state->sprite_character_bank_select[block] * 0x800;
} }
if (xflip) sx = ((xpos + xzoom * (xsize - x) / 2 + 16) & 0x1ff) - 16; if (xflip) sx = ((xpos + xzoom * (xsize - x) / 2 + 16) & 0x1ff) - 16;
@ -120,9 +111,10 @@ static void draw_sprite(running_machine *machine, UINT16 spriteno, bitmap_t *bit
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 )
{ {
taotaido_state *state = machine->driver_data<taotaido_state>();
/* first part of sprite ram is the list of sprites to draw, terminated with 0x4000 */ /* first part of sprite ram is the list of sprites to draw, terminated with 0x4000 */
UINT16 *source = taotaido_spriteram_older; UINT16 *source = state->spriteram_older;
UINT16 *finish = taotaido_spriteram_older + 0x2000/2; UINT16 *finish = state->spriteram_older + 0x2000/2;
while( source<finish ) while( source<finish )
{ {
@ -139,6 +131,7 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
WRITE16_HANDLER( taotaido_tileregs_w ) WRITE16_HANDLER( taotaido_tileregs_w )
{ {
taotaido_state *state = space->machine->driver_data<taotaido_state>();
switch (offset) switch (offset)
{ {
case 0: // would normally be x scroll? case 0: // would normally be x scroll?
@ -154,27 +147,29 @@ WRITE16_HANDLER( taotaido_tileregs_w )
case 6: case 6:
case 7: case 7:
if(ACCESSING_BITS_8_15) if(ACCESSING_BITS_8_15)
taotaido_video_bank_select[(offset-4)*2] = data >> 8; state->video_bank_select[(offset-4)*2] = data >> 8;
if(ACCESSING_BITS_0_7) if(ACCESSING_BITS_0_7)
taotaido_video_bank_select[(offset-4)*2+1] = data &0xff; state->video_bank_select[(offset-4)*2+1] = data &0xff;
tilemap_mark_all_tiles_dirty(bg_tilemap); tilemap_mark_all_tiles_dirty(state->bg_tilemap);
break; break;
} }
} }
WRITE16_HANDLER( taotaido_bgvideoram_w ) WRITE16_HANDLER( taotaido_bgvideoram_w )
{ {
COMBINE_DATA(&taotaido_bgram[offset]); taotaido_state *state = space->machine->driver_data<taotaido_state>();
tilemap_mark_tile_dirty(bg_tilemap,offset); COMBINE_DATA(&state->bgram[offset]);
tilemap_mark_tile_dirty(state->bg_tilemap,offset);
} }
static TILE_GET_INFO( taotaido_bg_tile_info ) static TILE_GET_INFO( taotaido_bg_tile_info )
{ {
int code = taotaido_bgram[tile_index]&0x01ff; taotaido_state *state = machine->driver_data<taotaido_state>();
int bank = (taotaido_bgram[tile_index]&0x0e00)>>9; int code = state->bgram[tile_index]&0x01ff;
int col = (taotaido_bgram[tile_index]&0xf000)>>12; int bank = (state->bgram[tile_index]&0x0e00)>>9;
int col = (state->bgram[tile_index]&0xf000)>>12;
code |= taotaido_video_bank_select[bank]*0x200; code |= state->video_bank_select[bank]*0x200;
SET_TILE_INFO( SET_TILE_INFO(
1, 1,
@ -191,20 +186,22 @@ static TILEMAP_MAPPER( taotaido_tilemap_scan_rows )
VIDEO_START(taotaido) VIDEO_START(taotaido)
{ {
bg_tilemap = tilemap_create(machine, taotaido_bg_tile_info,taotaido_tilemap_scan_rows, 16,16,128,64); taotaido_state *state = machine->driver_data<taotaido_state>();
state->bg_tilemap = tilemap_create(machine, taotaido_bg_tile_info,taotaido_tilemap_scan_rows, 16,16,128,64);
taotaido_spriteram_old = auto_alloc_array(machine, UINT16, 0x2000/2); state->spriteram_old = auto_alloc_array(machine, UINT16, 0x2000/2);
taotaido_spriteram_older = auto_alloc_array(machine, UINT16, 0x2000/2); state->spriteram_older = auto_alloc_array(machine, UINT16, 0x2000/2);
taotaido_spriteram2_old = auto_alloc_array(machine, UINT16, 0x10000/2); state->spriteram2_old = auto_alloc_array(machine, UINT16, 0x10000/2);
taotaido_spriteram2_older = auto_alloc_array(machine, UINT16, 0x10000/2); state->spriteram2_older = auto_alloc_array(machine, UINT16, 0x10000/2);
} }
SCREEN_UPDATE(taotaido) SCREEN_UPDATE(taotaido)
{ {
// tilemap_set_scrollx(bg_tilemap,0,(taotaido_scrollram[0x380/2]>>4)); // the values put here end up being wrong every other frame taotaido_state *state = screen->machine->driver_data<taotaido_state>();
// tilemap_set_scrolly(bg_tilemap,0,(taotaido_scrollram[0x382/2]>>4)); // the values put here end up being wrong every other frame // tilemap_set_scrollx(state->bg_tilemap,0,(state->scrollram[0x380/2]>>4)); // the values put here end up being wrong every other frame
// tilemap_set_scrolly(state->bg_tilemap,0,(state->scrollram[0x382/2]>>4)); // the values put here end up being wrong every other frame
/* not amazingly efficient however it should be functional for row select and linescroll */ /* not amazingly efficient however it should be functional for row select and linescroll */
int line; int line;
@ -220,10 +217,10 @@ SCREEN_UPDATE(taotaido)
{ {
clip.min_y = clip.max_y = line; clip.min_y = clip.max_y = line;
tilemap_set_scrollx(bg_tilemap,0,((taotaido_scrollram[(0x00+4*line)/2])>>4)+30); tilemap_set_scrollx(state->bg_tilemap,0,((state->scrollram[(0x00+4*line)/2])>>4)+30);
tilemap_set_scrolly(bg_tilemap,0,((taotaido_scrollram[(0x02+4*line)/2])>>4)-line); tilemap_set_scrolly(state->bg_tilemap,0,((state->scrollram[(0x02+4*line)/2])>>4)-line);
tilemap_draw(bitmap,&clip,bg_tilemap,0,0); tilemap_draw(bitmap,&clip,state->bg_tilemap,0,0);
} }
draw_sprites(screen->machine, bitmap,cliprect); draw_sprites(screen->machine, bitmap,cliprect);
@ -232,11 +229,12 @@ SCREEN_UPDATE(taotaido)
SCREEN_EOF( taotaido ) SCREEN_EOF( taotaido )
{ {
taotaido_state *state = machine->driver_data<taotaido_state>();
/* sprites need to be delayed by 2 frames? */ /* sprites need to be delayed by 2 frames? */
memcpy(taotaido_spriteram2_older,taotaido_spriteram2_old,0x10000); memcpy(state->spriteram2_older,state->spriteram2_old,0x10000);
memcpy(taotaido_spriteram2_old,taotaido_spriteram2,0x10000); memcpy(state->spriteram2_old,state->spriteram2,0x10000);
memcpy(taotaido_spriteram_older,taotaido_spriteram_old,0x2000); memcpy(state->spriteram_older,state->spriteram_old,0x2000);
memcpy(taotaido_spriteram_old,taotaido_spriteram,0x2000); memcpy(state->spriteram_old,state->spriteram,0x2000);
} }

View File

@ -10,20 +10,6 @@
#include "includes/thepit.h" #include "includes/thepit.h"
UINT8 *thepit_videoram;
UINT8 *thepit_colorram;
UINT8 *thepit_attributesram;
UINT8 *thepit_spriteram;
size_t thepit_spriteram_size;
static UINT8 graphics_bank;
static UINT8 thepit_flip_screen_x;
static UINT8 thepit_flip_screen_y;
static tilemap_t *thepit_solid_tilemap;
static tilemap_t *thepit_tilemap;
static UINT8 *dummy_tile;
static const rectangle spritevisiblearea = static const rectangle spritevisiblearea =
{ {
2*8+1, 32*8-1, 2*8+1, 32*8-1,
@ -123,9 +109,10 @@ PALETTE_INIT( suprmous )
static TILE_GET_INFO( solid_get_tile_info ) static TILE_GET_INFO( solid_get_tile_info )
{ {
UINT8 back_color = (thepit_colorram[tile_index] & 0x70) >> 4; thepit_state *state = machine->driver_data<thepit_state>();
int priority = (back_color != 0) && ((thepit_colorram[tile_index] & 0x80) == 0); UINT8 back_color = (state->colorram[tile_index] & 0x70) >> 4;
tileinfo->pen_data = dummy_tile; int priority = (back_color != 0) && ((state->colorram[tile_index] & 0x80) == 0);
tileinfo->pen_data = state->dummy_tile;
tileinfo->palette_base = back_color + 32; tileinfo->palette_base = back_color + 32;
tileinfo->category = priority; tileinfo->category = priority;
} }
@ -133,9 +120,10 @@ static TILE_GET_INFO( solid_get_tile_info )
static TILE_GET_INFO( get_tile_info ) static TILE_GET_INFO( get_tile_info )
{ {
UINT8 fore_color = thepit_colorram[tile_index] % machine->gfx[0]->total_colors; thepit_state *state = machine->driver_data<thepit_state>();
UINT8 code = thepit_videoram[tile_index]; UINT8 fore_color = state->colorram[tile_index] % machine->gfx[0]->total_colors;
SET_TILE_INFO(2 * graphics_bank, code, fore_color, 0); UINT8 code = state->videoram[tile_index];
SET_TILE_INFO(2 * state->graphics_bank, code, fore_color, 0);
} }
@ -148,17 +136,18 @@ static TILE_GET_INFO( get_tile_info )
VIDEO_START( thepit ) VIDEO_START( thepit )
{ {
thepit_solid_tilemap = tilemap_create(machine, solid_get_tile_info,tilemap_scan_rows,8,8,32,32); thepit_state *state = machine->driver_data<thepit_state>();
state->solid_tilemap = tilemap_create(machine, solid_get_tile_info,tilemap_scan_rows,8,8,32,32);
thepit_tilemap = tilemap_create(machine, get_tile_info,tilemap_scan_rows,8,8,32,32); state->tilemap = tilemap_create(machine, get_tile_info,tilemap_scan_rows,8,8,32,32);
tilemap_set_transparent_pen(thepit_tilemap, 0); tilemap_set_transparent_pen(state->tilemap, 0);
tilemap_set_scroll_cols(thepit_solid_tilemap, 32); tilemap_set_scroll_cols(state->solid_tilemap, 32);
tilemap_set_scroll_cols(thepit_tilemap, 32); tilemap_set_scroll_cols(state->tilemap, 32);
dummy_tile = auto_alloc_array_clear(machine, UINT8, 8*8); state->dummy_tile = auto_alloc_array_clear(machine, UINT8, 8*8);
graphics_bank = 0; /* only used in intrepid */ state->graphics_bank = 0; /* only used in intrepid */
} }
@ -171,67 +160,73 @@ VIDEO_START( thepit )
WRITE8_HANDLER( thepit_videoram_w ) WRITE8_HANDLER( thepit_videoram_w )
{ {
thepit_videoram[offset] = data; thepit_state *state = space->machine->driver_data<thepit_state>();
tilemap_mark_tile_dirty(thepit_tilemap, offset); state->videoram[offset] = data;
tilemap_mark_tile_dirty(state->tilemap, offset);
} }
WRITE8_HANDLER( thepit_colorram_w ) WRITE8_HANDLER( thepit_colorram_w )
{ {
thepit_colorram[offset] = data; thepit_state *state = space->machine->driver_data<thepit_state>();
tilemap_mark_tile_dirty(thepit_tilemap, offset); state->colorram[offset] = data;
tilemap_mark_tile_dirty(thepit_solid_tilemap, offset); tilemap_mark_tile_dirty(state->tilemap, offset);
tilemap_mark_tile_dirty(state->solid_tilemap, offset);
} }
WRITE8_HANDLER( thepit_flip_screen_x_w ) WRITE8_HANDLER( thepit_flip_screen_x_w )
{ {
thepit_state *state = space->machine->driver_data<thepit_state>();
int flip; int flip;
thepit_flip_screen_x = data & 0x01; state->flip_screen_x = data & 0x01;
flip = thepit_flip_screen_x ? TILEMAP_FLIPX : 0; flip = state->flip_screen_x ? TILEMAP_FLIPX : 0;
if (thepit_flip_screen_y) if (state->flip_screen_y)
flip |= TILEMAP_FLIPY ; flip |= TILEMAP_FLIPY ;
tilemap_set_flip(thepit_tilemap, flip); tilemap_set_flip(state->tilemap, flip);
tilemap_set_flip(thepit_solid_tilemap, flip); tilemap_set_flip(state->solid_tilemap, flip);
} }
WRITE8_HANDLER( thepit_flip_screen_y_w ) WRITE8_HANDLER( thepit_flip_screen_y_w )
{ {
thepit_state *state = space->machine->driver_data<thepit_state>();
int flip; int flip;
thepit_flip_screen_y = data & 0x01; state->flip_screen_y = data & 0x01;
flip = thepit_flip_screen_x ? TILEMAP_FLIPX : 0; flip = state->flip_screen_x ? TILEMAP_FLIPX : 0;
if (thepit_flip_screen_y) if (state->flip_screen_y)
flip |= TILEMAP_FLIPY ; flip |= TILEMAP_FLIPY ;
tilemap_set_flip(thepit_tilemap, flip); tilemap_set_flip(state->tilemap, flip);
tilemap_set_flip(thepit_solid_tilemap, flip); tilemap_set_flip(state->solid_tilemap, flip);
} }
WRITE8_HANDLER( intrepid_graphics_bank_w ) WRITE8_HANDLER( intrepid_graphics_bank_w )
{ {
if (graphics_bank != (data & 0x01)) thepit_state *state = space->machine->driver_data<thepit_state>();
if (state->graphics_bank != (data & 0x01))
{ {
graphics_bank = data & 0x01; state->graphics_bank = data & 0x01;
tilemap_mark_all_tiles_dirty(thepit_tilemap); tilemap_mark_all_tiles_dirty(state->tilemap);
} }
} }
READ8_HANDLER( thepit_input_port_0_r ) READ8_HANDLER( thepit_input_port_0_r )
{ {
thepit_state *state = space->machine->driver_data<thepit_state>();
/* Read either the real or the fake input ports depending on the /* Read either the real or the fake input ports depending on the
horizontal flip switch. (This is how the real PCB does it) */ horizontal flip switch. (This is how the real PCB does it) */
if (thepit_flip_screen_x) if (state->flip_screen_x)
{ {
return input_port_read(space->machine, "IN2"); return input_port_read(space->machine, "IN2");
} }
@ -254,32 +249,33 @@ static void draw_sprites(running_machine *machine,
const rectangle *cliprect, const rectangle *cliprect,
int priority_to_draw) int priority_to_draw)
{ {
thepit_state *state = machine->driver_data<thepit_state>();
int offs; int offs;
for (offs = thepit_spriteram_size - 4; offs >= 0; offs -= 4) for (offs = state->spriteram_size - 4; offs >= 0; offs -= 4)
{ {
if (((thepit_spriteram[offs + 2] & 0x08) >> 3) == priority_to_draw) if (((state->spriteram[offs + 2] & 0x08) >> 3) == priority_to_draw)
{ {
UINT8 y, x, flipx, flipy; UINT8 y, x, flipx, flipy;
if ((thepit_spriteram[offs + 0] == 0) || (thepit_spriteram[offs + 3] == 0)) if ((state->spriteram[offs + 0] == 0) || (state->spriteram[offs + 3] == 0))
{ {
continue; continue;
} }
y = 240 - thepit_spriteram[offs]; y = 240 - state->spriteram[offs];
x = thepit_spriteram[offs + 3] + 1; x = state->spriteram[offs + 3] + 1;
flipx = thepit_spriteram[offs + 1] & 0x40; flipx = state->spriteram[offs + 1] & 0x40;
flipy = thepit_spriteram[offs + 1] & 0x80; flipy = state->spriteram[offs + 1] & 0x80;
if (thepit_flip_screen_y) if (state->flip_screen_y)
{ {
y = 240 - y; y = 240 - y;
flipy = !flipy; flipy = !flipy;
} }
if (thepit_flip_screen_x) if (state->flip_screen_x)
{ {
x = 242 - x; x = 242 - x;
flipx = !flipx; flipx = !flipx;
@ -288,10 +284,10 @@ static void draw_sprites(running_machine *machine,
/* sprites 0-3 are drawn one pixel down */ /* sprites 0-3 are drawn one pixel down */
if (offs < 16) y++; if (offs < 16) y++;
drawgfx_transpen(bitmap, thepit_flip_screen_x ? &spritevisibleareaflipx : &spritevisiblearea, drawgfx_transpen(bitmap, state->flip_screen_x ? &spritevisibleareaflipx : &spritevisiblearea,
machine->gfx[2 * graphics_bank + 1], machine->gfx[2 * state->graphics_bank + 1],
thepit_spriteram[offs + 1] & 0x3f, state->spriteram[offs + 1] & 0x3f,
thepit_spriteram[offs + 2], state->spriteram[offs + 2],
flipx, flipy, x, y, 0); flipx, flipy, x, y, 0);
} }
} }
@ -300,29 +296,30 @@ static void draw_sprites(running_machine *machine,
SCREEN_UPDATE( thepit ) SCREEN_UPDATE( thepit )
{ {
thepit_state *state = screen->machine->driver_data<thepit_state>();
offs_t offs; offs_t offs;
for (offs = 0; offs < 32; offs++) for (offs = 0; offs < 32; offs++)
{ {
int xshift = thepit_flip_screen_x ? 128 : 0; int xshift = state->flip_screen_x ? 128 : 0;
int yshift = thepit_flip_screen_y ? -8 : 0; int yshift = state->flip_screen_y ? -8 : 0;
tilemap_set_scrollx(thepit_tilemap, offs, xshift); tilemap_set_scrollx(state->tilemap, offs, xshift);
tilemap_set_scrollx(thepit_solid_tilemap, offs, xshift); tilemap_set_scrollx(state->solid_tilemap, offs, xshift);
tilemap_set_scrolly(thepit_tilemap, offs, yshift + thepit_attributesram[offs << 1]); tilemap_set_scrolly(state->tilemap, offs, yshift + state->attributesram[offs << 1]);
tilemap_set_scrolly(thepit_solid_tilemap, offs, yshift + thepit_attributesram[offs << 1]); tilemap_set_scrolly(state->solid_tilemap, offs, yshift + state->attributesram[offs << 1]);
} }
/* low priority tiles */ /* low priority tiles */
tilemap_draw(bitmap, cliprect, thepit_solid_tilemap, 0, 0); tilemap_draw(bitmap, cliprect, state->solid_tilemap, 0, 0);
tilemap_draw(bitmap, cliprect, thepit_tilemap, 0, 0); tilemap_draw(bitmap, cliprect, state->tilemap, 0, 0);
/* low priority sprites */ /* low priority sprites */
draw_sprites(screen->machine, bitmap, cliprect, 0); draw_sprites(screen->machine, bitmap, cliprect, 0);
/* high priority tiles */ /* high priority tiles */
tilemap_draw(bitmap, cliprect, thepit_solid_tilemap, 1, 1); tilemap_draw(bitmap, cliprect, state->solid_tilemap, 1, 1);
/* high priority sprites */ /* high priority sprites */
draw_sprites(screen->machine, bitmap, cliprect, 1); draw_sprites(screen->machine, bitmap, cliprect, 1);

View File

@ -1,14 +1,6 @@
#include "emu.h" #include "emu.h"
#include "includes/timelimt.h" #include "includes/timelimt.h"
/* globals */
UINT8 *timelimt_bg_videoram;
size_t timelimt_bg_videoram_size;
/* locals */
static int scrollx, scrolly;
static tilemap_t *bg_tilemap, *fg_tilemap;
/*************************************************************************** /***************************************************************************
@ -63,7 +55,8 @@ PALETTE_INIT( timelimt ) {
static TILE_GET_INFO( get_bg_tile_info ) static TILE_GET_INFO( get_bg_tile_info )
{ {
SET_TILE_INFO(1, timelimt_bg_videoram[tile_index], 0, 0); timelimt_state *state = machine->driver_data<timelimt_state>();
SET_TILE_INFO(1, state->bg_videoram[tile_index], 0, 0);
} }
static TILE_GET_INFO( get_fg_tile_info ) static TILE_GET_INFO( get_fg_tile_info )
@ -75,13 +68,14 @@ static TILE_GET_INFO( get_fg_tile_info )
VIDEO_START( timelimt ) VIDEO_START( timelimt )
{ {
bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, timelimt_state *state = machine->driver_data<timelimt_state>();
state->bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows,
8, 8, 64, 32); 8, 8, 64, 32);
fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, state->fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows,
8, 8, 32, 32); 8, 8, 32, 32);
tilemap_set_transparent_pen(fg_tilemap, 0); tilemap_set_transparent_pen(state->fg_tilemap, 0);
} }
/***************************************************************************/ /***************************************************************************/
@ -91,30 +85,34 @@ WRITE8_HANDLER( timelimt_videoram_w )
timelimt_state *state = space->machine->driver_data<timelimt_state>(); timelimt_state *state = space->machine->driver_data<timelimt_state>();
UINT8 *videoram = state->videoram; UINT8 *videoram = state->videoram;
videoram[offset] = data; videoram[offset] = data;
tilemap_mark_tile_dirty(fg_tilemap, offset); tilemap_mark_tile_dirty(state->fg_tilemap, offset);
} }
WRITE8_HANDLER( timelimt_bg_videoram_w ) WRITE8_HANDLER( timelimt_bg_videoram_w )
{ {
timelimt_bg_videoram[offset] = data; timelimt_state *state = space->machine->driver_data<timelimt_state>();
tilemap_mark_tile_dirty(bg_tilemap, offset); state->bg_videoram[offset] = data;
tilemap_mark_tile_dirty(state->bg_tilemap, offset);
} }
WRITE8_HANDLER( timelimt_scroll_x_lsb_w ) WRITE8_HANDLER( timelimt_scroll_x_lsb_w )
{ {
scrollx &= 0x100; timelimt_state *state = space->machine->driver_data<timelimt_state>();
scrollx |= data & 0xff; state->scrollx &= 0x100;
state->scrollx |= data & 0xff;
} }
WRITE8_HANDLER( timelimt_scroll_x_msb_w ) WRITE8_HANDLER( timelimt_scroll_x_msb_w )
{ {
scrollx &= 0xff; timelimt_state *state = space->machine->driver_data<timelimt_state>();
scrollx |= ( data & 1 ) << 8; state->scrollx &= 0xff;
state->scrollx |= ( data & 1 ) << 8;
} }
WRITE8_HANDLER( timelimt_scroll_y_w ) WRITE8_HANDLER( timelimt_scroll_y_w )
{ {
scrolly = data; timelimt_state *state = space->machine->driver_data<timelimt_state>();
state->scrolly = data;
} }
@ -146,12 +144,13 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
SCREEN_UPDATE( timelimt ) SCREEN_UPDATE( timelimt )
{ {
tilemap_set_scrollx(bg_tilemap, 0, scrollx); timelimt_state *state = screen->machine->driver_data<timelimt_state>();
tilemap_set_scrolly(bg_tilemap, 0, scrolly); tilemap_set_scrollx(state->bg_tilemap, 0, state->scrollx);
tilemap_draw(bitmap, cliprect, bg_tilemap, 0, 0); tilemap_set_scrolly(state->bg_tilemap, 0, state->scrolly);
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;
} }

View File

@ -83,7 +83,7 @@ WRITE16_HANDLER( twin16_video_register_w )
case 6: COMBINE_DATA( &state->scrolly[2] ); break; case 6: COMBINE_DATA( &state->scrolly[2] ); break;
default: default:
logerror("unknown state->video_register write:%d", data ); logerror("unknown video_register write:%d", data );
break; break;
} }
} }

View File

@ -39,13 +39,6 @@ Note: if MAME_DEBUG is defined, pressing Z with:
#include "emu.h" #include "emu.h"
#include "includes/unico.h" #include "includes/unico.h"
/* Variables needed by drivers: */
UINT16 *unico_vram_0, *unico_scrollx_0, *unico_scrolly_0;
UINT16 *unico_vram_1, *unico_scrollx_1, *unico_scrolly_1;
UINT16 *unico_vram_2, *unico_scrollx_2, *unico_scrolly_2;
UINT32 *unico_vram32_0, *unico_vram32_1, *unico_vram32_2, *unico_scroll32;
/*************************************************************************** /***************************************************************************
@ -94,37 +87,40 @@ WRITE32_HANDLER( unico_palette32_w )
***************************************************************************/ ***************************************************************************/
#define LAYER( _N_ ) \
static tilemap_t *tilemap_##_N_; \ static TILE_GET_INFO( get_tile_info )
\ {
static TILE_GET_INFO( get_tile_info_##_N_ ) \ UINT16 *vram = (UINT16 *)param;
{ \ UINT16 code = vram[2 * tile_index + 0 ];
UINT16 code = unico_vram_##_N_[ 2 * tile_index + 0 ]; \ UINT16 attr = vram[2 * tile_index + 1 ];
UINT16 attr = unico_vram_##_N_[ 2 * tile_index + 1 ]; \ SET_TILE_INFO(1, code, attr & 0x1f, TILE_FLIPYX( attr >> 5 ));
SET_TILE_INFO(1, code, attr & 0x1f, TILE_FLIPYX( attr >> 5 )); \
} \
\
static TILE_GET_INFO( get_tile_info32_##_N_ ) \
{ \
UINT32 code = unico_vram32_##_N_[tile_index]; \
SET_TILE_INFO(1, code >> 16, code & 0x1f, TILE_FLIPYX( code >> 5 )); \
} \
\
WRITE16_HANDLER( unico_vram_##_N_##_w ) \
{ \
COMBINE_DATA(&unico_vram_##_N_[offset]); \
tilemap_mark_tile_dirty(tilemap_##_N_,offset/2); \
} \
\
WRITE32_HANDLER( unico_vram32_##_N_##_w ) \
{ \
COMBINE_DATA(&unico_vram32_##_N_[offset]); \
tilemap_mark_tile_dirty(tilemap_##_N_,offset); \
} }
LAYER( 0 ) static TILE_GET_INFO( get_tile_info32 )
LAYER( 1 ) {
LAYER( 2 ) UINT32 *vram = (UINT32 *)param;
UINT16 code = vram[tile_index] >> 16;
UINT16 attr = vram[tile_index] & 0xff;
SET_TILE_INFO(1, code, attr & 0x1f, TILE_FLIPYX( attr >> 5 ));
}
WRITE16_HANDLER( unico_vram_w )
{
unico_state *state = space->machine->driver_data<unico_state>();
UINT16 *vram = state->vram;
int tile = ((offset / 0x2000) + 1) % 3;
COMBINE_DATA(&vram[offset]);
tilemap_mark_tile_dirty(state->tilemap[tile],(offset & 0x3fff)/2);
}
WRITE32_HANDLER( unico_vram32_w )
{
unico_state *state = space->machine->driver_data<unico_state>();
UINT32 *vram = state->vram32;
int tile = ((offset / 0x1000) + 1) % 3;
COMBINE_DATA(&vram[offset]);
tilemap_mark_tile_dirty(state->tilemap[tile],(offset & 0x3fff));
}
@ -136,60 +132,69 @@ LAYER( 2 )
***************************************************************************/ ***************************************************************************/
static int sprites_scrolldx, sprites_scrolldy;
VIDEO_START( unico ) VIDEO_START( unico )
{ {
tilemap_0 = tilemap_create( machine, get_tile_info_0,tilemap_scan_rows, unico_state *state = machine->driver_data<unico_state>();
state->tilemap[0] = tilemap_create( machine, get_tile_info,tilemap_scan_rows,
16,16, 0x40, 0x40); 16,16, 0x40, 0x40);
tilemap_1 = tilemap_create( machine, get_tile_info_1,tilemap_scan_rows, state->tilemap[1] = tilemap_create( machine, get_tile_info,tilemap_scan_rows,
16,16, 0x40, 0x40); 16,16, 0x40, 0x40);
tilemap_2 = tilemap_create( machine, get_tile_info_2,tilemap_scan_rows, state->tilemap[2] = tilemap_create( machine, get_tile_info,tilemap_scan_rows,
16,16, 0x40, 0x40); 16,16, 0x40, 0x40);
sprites_scrolldx = -0x3f; tilemap_set_user_data(state->tilemap[0], &state->vram[0x8000/2]);
sprites_scrolldy = -0x0e; tilemap_set_user_data(state->tilemap[1], &state->vram[0x0000/2]);
tilemap_set_user_data(state->tilemap[2], &state->vram[0x4000/2]);
tilemap_set_scrolldx(tilemap_0,-0x32,0); state->sprites_scrolldx = -0x3f;
tilemap_set_scrolldx(tilemap_1,-0x30,0); state->sprites_scrolldy = -0x0e;
tilemap_set_scrolldx(tilemap_2,-0x2e,0);
tilemap_set_scrolldy(tilemap_0,-0x0f,0); tilemap_set_scrolldx(state->tilemap[0],-0x32,0);
tilemap_set_scrolldy(tilemap_1,-0x0f,0); tilemap_set_scrolldx(state->tilemap[1],-0x30,0);
tilemap_set_scrolldy(tilemap_2,-0x0f,0); tilemap_set_scrolldx(state->tilemap[2],-0x2e,0);
tilemap_set_transparent_pen(tilemap_0,0x00); tilemap_set_scrolldy(state->tilemap[0],-0x0f,0);
tilemap_set_transparent_pen(tilemap_1,0x00); tilemap_set_scrolldy(state->tilemap[1],-0x0f,0);
tilemap_set_transparent_pen(tilemap_2,0x00); tilemap_set_scrolldy(state->tilemap[2],-0x0f,0);
tilemap_set_transparent_pen(state->tilemap[0],0x00);
tilemap_set_transparent_pen(state->tilemap[1],0x00);
tilemap_set_transparent_pen(state->tilemap[2],0x00);
} }
VIDEO_START( zeropnt2 ) VIDEO_START( zeropnt2 )
{ {
tilemap_0 = tilemap_create( machine, get_tile_info32_0,tilemap_scan_rows, unico_state *state = machine->driver_data<unico_state>();
state->tilemap[0] = tilemap_create( machine, get_tile_info32,tilemap_scan_rows,
16,16, 0x40, 0x40); 16,16, 0x40, 0x40);
tilemap_1 = tilemap_create( machine, get_tile_info32_1,tilemap_scan_rows, state->tilemap[1] = tilemap_create( machine, get_tile_info32,tilemap_scan_rows,
16,16, 0x40, 0x40); 16,16, 0x40, 0x40);
tilemap_2 = tilemap_create( machine, get_tile_info32_2,tilemap_scan_rows, state->tilemap[2] = tilemap_create( machine, get_tile_info32,tilemap_scan_rows,
16,16, 0x40, 0x40); 16,16, 0x40, 0x40);
sprites_scrolldx = -0x3f; tilemap_set_user_data(state->tilemap[0], &state->vram32[0x8000/4]);
sprites_scrolldy = -0x0e; tilemap_set_user_data(state->tilemap[1], &state->vram32[0x0000/4]);
tilemap_set_user_data(state->tilemap[2], &state->vram32[0x4000/4]);
tilemap_set_scrolldx(tilemap_0,-0x32,0); state->sprites_scrolldx = -0x3f;
tilemap_set_scrolldx(tilemap_1,-0x30,0); state->sprites_scrolldy = -0x0e;
tilemap_set_scrolldx(tilemap_2,-0x2e,0);
tilemap_set_scrolldy(tilemap_0,-0x0f,0); tilemap_set_scrolldx(state->tilemap[0],-0x32,0);
tilemap_set_scrolldy(tilemap_1,-0x0f,0); tilemap_set_scrolldx(state->tilemap[1],-0x30,0);
tilemap_set_scrolldy(tilemap_2,-0x0f,0); tilemap_set_scrolldx(state->tilemap[2],-0x2e,0);
tilemap_set_transparent_pen(tilemap_0,0x00); tilemap_set_scrolldy(state->tilemap[0],-0x0f,0);
tilemap_set_transparent_pen(tilemap_1,0x00); tilemap_set_scrolldy(state->tilemap[1],-0x0f,0);
tilemap_set_transparent_pen(tilemap_2,0x00); tilemap_set_scrolldy(state->tilemap[2],-0x0f,0);
tilemap_set_transparent_pen(state->tilemap[0],0x00);
tilemap_set_transparent_pen(state->tilemap[1],0x00);
tilemap_set_transparent_pen(state->tilemap[2],0x00);
} }
@ -218,6 +223,7 @@ VIDEO_START( zeropnt2 )
static void unico_draw_sprites(running_machine *machine, bitmap_t *bitmap,const rectangle *cliprect) static void unico_draw_sprites(running_machine *machine, bitmap_t *bitmap,const rectangle *cliprect)
{ {
unico_state *state = machine->driver_data<unico_state>();
UINT16 *spriteram16 = machine->generic.spriteram.u16; UINT16 *spriteram16 = machine->generic.spriteram.u16;
int offs; int offs;
@ -248,8 +254,8 @@ static void unico_draw_sprites(running_machine *machine, bitmap_t *bitmap,const
case 3: pri_mask = 0x00; // above all case 3: pri_mask = 0x00; // above all
} }
sx += sprites_scrolldx; sx += state->sprites_scrolldx;
sy += sprites_scrolldy; sy += state->sprites_scrolldy;
sx = (sx & 0x1ff) - (sx & 0x200); sx = (sx & 0x1ff) - (sx & 0x200);
sy = (sy & 0x1ff) - (sy & 0x200); sy = (sy & 0x1ff) - (sy & 0x200);
@ -272,6 +278,7 @@ static void unico_draw_sprites(running_machine *machine, bitmap_t *bitmap,const
static void zeropnt2_draw_sprites(running_machine *machine, bitmap_t *bitmap,const rectangle *cliprect) static void zeropnt2_draw_sprites(running_machine *machine, bitmap_t *bitmap,const rectangle *cliprect)
{ {
unico_state *state = machine->driver_data<unico_state>();
UINT32 *spriteram32 = machine->generic.spriteram.u32; UINT32 *spriteram32 = machine->generic.spriteram.u32;
int offs; int offs;
@ -302,8 +309,8 @@ static void zeropnt2_draw_sprites(running_machine *machine, bitmap_t *bitmap,con
case 3: pri_mask = 0x00; // above all case 3: pri_mask = 0x00; // above all
} }
sx += sprites_scrolldx; sx += state->sprites_scrolldx;
sy += sprites_scrolldy; sy += state->sprites_scrolldy;
sx = (sx & 0x1ff) - (sx & 0x200); sx = (sx & 0x1ff) - (sx & 0x200);
sy = (sy & 0x1ff) - (sy & 0x200); sy = (sy & 0x1ff) - (sy & 0x200);
@ -336,16 +343,17 @@ static void zeropnt2_draw_sprites(running_machine *machine, bitmap_t *bitmap,con
SCREEN_UPDATE( unico ) SCREEN_UPDATE( unico )
{ {
unico_state *state = screen->machine->driver_data<unico_state>();
int layers_ctrl = -1; int layers_ctrl = -1;
tilemap_set_scrollx(tilemap_0, 0, *unico_scrollx_0); tilemap_set_scrollx(state->tilemap[0], 0, state->scroll[0x00]);
tilemap_set_scrolly(tilemap_0, 0, *unico_scrolly_0); tilemap_set_scrolly(state->tilemap[0], 0, state->scroll[0x01]);
tilemap_set_scrollx(tilemap_1, 0, *unico_scrollx_1); tilemap_set_scrollx(state->tilemap[1], 0, state->scroll[0x05]);
tilemap_set_scrolly(tilemap_1, 0, *unico_scrolly_1); tilemap_set_scrolly(state->tilemap[1], 0, state->scroll[0x0a]);
tilemap_set_scrolly(tilemap_2, 0, *unico_scrolly_2); tilemap_set_scrollx(state->tilemap[2], 0, state->scroll[0x04]);
tilemap_set_scrollx(tilemap_2, 0, *unico_scrollx_2); tilemap_set_scrolly(state->tilemap[2], 0, state->scroll[0x02]);
#ifdef MAME_DEBUG #ifdef MAME_DEBUG
if ( input_code_pressed(screen->machine, KEYCODE_Z) || input_code_pressed(screen->machine, KEYCODE_X) ) if ( input_code_pressed(screen->machine, KEYCODE_Z) || input_code_pressed(screen->machine, KEYCODE_X) )
@ -363,9 +371,9 @@ if ( input_code_pressed(screen->machine, KEYCODE_Z) || input_code_pressed(screen
bitmap_fill(bitmap,cliprect,0x1f00); bitmap_fill(bitmap,cliprect,0x1f00);
bitmap_fill(screen->machine->priority_bitmap,cliprect,0); bitmap_fill(screen->machine->priority_bitmap,cliprect,0);
if (layers_ctrl & 1) tilemap_draw(bitmap,cliprect,tilemap_0,0,1); if (layers_ctrl & 1) tilemap_draw(bitmap,cliprect,state->tilemap[0],0,1);
if (layers_ctrl & 2) tilemap_draw(bitmap,cliprect,tilemap_1,0,2); if (layers_ctrl & 2) tilemap_draw(bitmap,cliprect,state->tilemap[1],0,2);
if (layers_ctrl & 4) tilemap_draw(bitmap,cliprect,tilemap_2,0,4); if (layers_ctrl & 4) tilemap_draw(bitmap,cliprect,state->tilemap[2],0,4);
/* Sprites are drawn last, using pdrawgfx */ /* Sprites are drawn last, using pdrawgfx */
if (layers_ctrl & 8) unico_draw_sprites(screen->machine, bitmap,cliprect); if (layers_ctrl & 8) unico_draw_sprites(screen->machine, bitmap,cliprect);
@ -375,16 +383,17 @@ if ( input_code_pressed(screen->machine, KEYCODE_Z) || input_code_pressed(screen
SCREEN_UPDATE( zeropnt2 ) SCREEN_UPDATE( zeropnt2 )
{ {
unico_state *state = screen->machine->driver_data<unico_state>();
int layers_ctrl = -1; int layers_ctrl = -1;
tilemap_set_scrollx(tilemap_0, 0, unico_scroll32[0] >> 16); tilemap_set_scrollx(state->tilemap[0], 0, state->scroll32[0] >> 16);
tilemap_set_scrolly(tilemap_0, 0, unico_scroll32[0] & 0xffff); tilemap_set_scrolly(state->tilemap[0], 0, state->scroll32[0] & 0xffff);
tilemap_set_scrollx(tilemap_1, 0, unico_scroll32[2] & 0xffff); tilemap_set_scrollx(state->tilemap[1], 0, state->scroll32[2] & 0xffff);
tilemap_set_scrolly(tilemap_1, 0, unico_scroll32[5] >> 16); tilemap_set_scrolly(state->tilemap[1], 0, state->scroll32[5] >> 16);
tilemap_set_scrollx(tilemap_2, 0, unico_scroll32[2] >> 16); tilemap_set_scrollx(state->tilemap[2], 0, state->scroll32[2] >> 16);
tilemap_set_scrolly(tilemap_2, 0, unico_scroll32[1] >> 16); tilemap_set_scrolly(state->tilemap[2], 0, state->scroll32[1] >> 16);
#ifdef MAME_DEBUG #ifdef MAME_DEBUG
if ( input_code_pressed(screen->machine, KEYCODE_Z) || input_code_pressed(screen->machine, KEYCODE_X) ) if ( input_code_pressed(screen->machine, KEYCODE_Z) || input_code_pressed(screen->machine, KEYCODE_X) )
@ -402,9 +411,9 @@ if ( input_code_pressed(screen->machine, KEYCODE_Z) || input_code_pressed(screen
bitmap_fill(bitmap,cliprect,0x1f00); bitmap_fill(bitmap,cliprect,0x1f00);
bitmap_fill(screen->machine->priority_bitmap,cliprect,0); bitmap_fill(screen->machine->priority_bitmap,cliprect,0);
if (layers_ctrl & 1) tilemap_draw(bitmap,cliprect,tilemap_0,0,1); if (layers_ctrl & 1) tilemap_draw(bitmap,cliprect,state->tilemap[0],0,1);
if (layers_ctrl & 2) tilemap_draw(bitmap,cliprect,tilemap_1,0,2); if (layers_ctrl & 2) tilemap_draw(bitmap,cliprect,state->tilemap[1],0,2);
if (layers_ctrl & 4) tilemap_draw(bitmap,cliprect,tilemap_2,0,4); if (layers_ctrl & 4) tilemap_draw(bitmap,cliprect,state->tilemap[2],0,4);
/* Sprites are drawn last, using pdrawgfx */ /* Sprites are drawn last, using pdrawgfx */
if (layers_ctrl & 8) zeropnt2_draw_sprites(screen->machine, bitmap,cliprect); if (layers_ctrl & 8) zeropnt2_draw_sprites(screen->machine, bitmap,cliprect);

View File

@ -11,44 +11,39 @@ Video hardware driver by Uki
#include "emu.h" #include "emu.h"
#include "includes/xxmissio.h" #include "includes/xxmissio.h"
UINT8 *xxmissio_bgram;
UINT8 *xxmissio_fgram;
UINT8 *xxmissio_spriteram;
static tilemap_t *bg_tilemap;
static tilemap_t *fg_tilemap;
static UINT8 xscroll;
static UINT8 yscroll;
static UINT8 flipscreen;
WRITE8_DEVICE_HANDLER( xxmissio_scroll_x_w ) WRITE8_DEVICE_HANDLER( xxmissio_scroll_x_w )
{ {
xscroll = data; xxmissio_state *state = device->machine->driver_data<xxmissio_state>();
state->xscroll = data;
} }
WRITE8_DEVICE_HANDLER( xxmissio_scroll_y_w ) WRITE8_DEVICE_HANDLER( xxmissio_scroll_y_w )
{ {
yscroll = data; xxmissio_state *state = device->machine->driver_data<xxmissio_state>();
state->yscroll = data;
} }
WRITE8_HANDLER( xxmissio_flipscreen_w ) WRITE8_HANDLER( xxmissio_flipscreen_w )
{ {
flipscreen = data & 0x01; xxmissio_state *state = space->machine->driver_data<xxmissio_state>();
state->flipscreen = data & 0x01;
} }
WRITE8_HANDLER( xxmissio_bgram_w ) WRITE8_HANDLER( xxmissio_bgram_w )
{ {
int x = (offset + (xscroll >> 3)) & 0x1f; xxmissio_state *state = space->machine->driver_data<xxmissio_state>();
int x = (offset + (state->xscroll >> 3)) & 0x1f;
offset = (offset & 0x7e0) | x; offset = (offset & 0x7e0) | x;
xxmissio_bgram[offset] = data; state->bgram[offset] = data;
} }
READ8_HANDLER( xxmissio_bgram_r ) READ8_HANDLER( xxmissio_bgram_r )
{ {
int x = (offset + (xscroll >> 3)) & 0x1f; xxmissio_state *state = space->machine->driver_data<xxmissio_state>();
int x = (offset + (state->xscroll >> 3)) & 0x1f;
offset = (offset & 0x7e0) | x; offset = (offset & 0x7e0) | x;
return xxmissio_bgram[offset]; return state->bgram[offset];
} }
WRITE8_HANDLER( xxmissio_paletteram_w ) WRITE8_HANDLER( xxmissio_paletteram_w )
@ -60,54 +55,58 @@ WRITE8_HANDLER( xxmissio_paletteram_w )
static TILE_GET_INFO( get_bg_tile_info ) static TILE_GET_INFO( get_bg_tile_info )
{ {
int code = ((xxmissio_bgram[0x400 | tile_index] & 0xc0) << 2) | xxmissio_bgram[0x000 | tile_index]; xxmissio_state *state = machine->driver_data<xxmissio_state>();
int color = xxmissio_bgram[0x400 | tile_index] & 0x0f; int code = ((state->bgram[0x400 | tile_index] & 0xc0) << 2) | state->bgram[0x000 | tile_index];
int color = state->bgram[0x400 | tile_index] & 0x0f;
SET_TILE_INFO(2, code, color, 0); SET_TILE_INFO(2, code, color, 0);
} }
static TILE_GET_INFO( get_fg_tile_info ) static TILE_GET_INFO( get_fg_tile_info )
{ {
int code = xxmissio_fgram[0x000 | tile_index]; xxmissio_state *state = machine->driver_data<xxmissio_state>();
int color = xxmissio_fgram[0x400 | tile_index] & 0x07; int code = state->fgram[0x000 | tile_index];
int color = state->fgram[0x400 | tile_index] & 0x07;
SET_TILE_INFO(0, code, color, 0); SET_TILE_INFO(0, code, color, 0);
} }
VIDEO_START( xxmissio ) VIDEO_START( xxmissio )
{ {
bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 16, 8, 32, 32); xxmissio_state *state = machine->driver_data<xxmissio_state>();
fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 16, 8, 32, 32); state->bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 16, 8, 32, 32);
state->fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_rows, 16, 8, 32, 32);
tilemap_set_scroll_cols(bg_tilemap, 1); tilemap_set_scroll_cols(state->bg_tilemap, 1);
tilemap_set_scroll_rows(bg_tilemap, 1); tilemap_set_scroll_rows(state->bg_tilemap, 1);
tilemap_set_scrolldx(bg_tilemap, 2, 12); tilemap_set_scrolldx(state->bg_tilemap, 2, 12);
tilemap_set_transparent_pen(fg_tilemap, 0); tilemap_set_transparent_pen(state->fg_tilemap, 0);
} }
static void draw_sprites(bitmap_t *bitmap, const rectangle *cliprect, const gfx_element *gfx) static void draw_sprites(bitmap_t *bitmap, const rectangle *cliprect, const gfx_element *gfx)
{ {
xxmissio_state *state = gfx->machine->driver_data<xxmissio_state>();
int offs; int offs;
int chr,col; int chr,col;
int x,y,px,py,fx,fy; int x,y,px,py,fx,fy;
for (offs=0; offs<0x800; offs +=0x20) for (offs=0; offs<0x800; offs +=0x20)
{ {
chr = xxmissio_spriteram[offs]; chr = state->spriteram[offs];
col = xxmissio_spriteram[offs+3]; col = state->spriteram[offs+3];
fx = ((col & 0x10) >> 4) ^ flipscreen; fx = ((col & 0x10) >> 4) ^ state->flipscreen;
fy = ((col & 0x20) >> 5) ^ flipscreen; fy = ((col & 0x20) >> 5) ^ state->flipscreen;
x = xxmissio_spriteram[offs+1]*2; x = state->spriteram[offs+1]*2;
y = xxmissio_spriteram[offs+2]; y = state->spriteram[offs+2];
chr = chr + ((col & 0x40) << 2); chr = chr + ((col & 0x40) << 2);
col = col & 0x07; col = col & 0x07;
if (flipscreen==0) if (state->flipscreen==0)
{ {
px = x-8; px = x-8;
py = y; py = y;
@ -139,15 +138,16 @@ static void draw_sprites(bitmap_t *bitmap, const rectangle *cliprect, const gfx_
SCREEN_UPDATE( xxmissio ) SCREEN_UPDATE( xxmissio )
{ {
xxmissio_state *state = screen->machine->driver_data<xxmissio_state>();
tilemap_mark_all_tiles_dirty_all(screen->machine); tilemap_mark_all_tiles_dirty_all(screen->machine);
tilemap_set_flip_all(screen->machine, flipscreen ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0); tilemap_set_flip_all(screen->machine, state->flipscreen ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0);
tilemap_set_scrollx(bg_tilemap, 0, xscroll * 2); tilemap_set_scrollx(state->bg_tilemap, 0, state->xscroll * 2);
tilemap_set_scrolly(bg_tilemap, 0, yscroll); tilemap_set_scrolly(state->bg_tilemap, 0, state->yscroll);
tilemap_draw(bitmap, cliprect, bg_tilemap, 0, 0); tilemap_draw(bitmap, cliprect, state->bg_tilemap, 0, 0);
draw_sprites(bitmap, cliprect, screen->machine->gfx[1]); draw_sprites(bitmap, cliprect, screen->machine->gfx[1]);
tilemap_draw(bitmap, cliprect, fg_tilemap, 0, 0); tilemap_draw(bitmap, cliprect, state->fg_tilemap, 0, 0);
return 0; return 0;
} }

View File

@ -8,14 +8,6 @@
#include "sound/s2636.h" #include "sound/s2636.h"
#include "includes/zac2650.h" #include "includes/zac2650.h"
UINT8 *zac2650_s2636_0_ram;
static bitmap_t *spritebitmap;
static int CollisionBackground;
static int CollisionSprite;
static tilemap_t *bg_tilemap;
/**************************************************************/ /**************************************************************/
/* The S2636 is a standard sprite chip used by several boards */ /* The S2636 is a standard sprite chip used by several boards */
@ -28,18 +20,20 @@ WRITE8_HANDLER( tinvader_videoram_w )
zac2650_state *state = space->machine->driver_data<zac2650_state>(); zac2650_state *state = space->machine->driver_data<zac2650_state>();
UINT8 *videoram = state->videoram; UINT8 *videoram = state->videoram;
videoram[offset] = data; videoram[offset] = data;
tilemap_mark_tile_dirty(bg_tilemap, offset); tilemap_mark_tile_dirty(state->bg_tilemap, offset);
} }
READ8_HANDLER( zac_s2636_r ) READ8_HANDLER( zac_s2636_r )
{ {
if(offset!=0xCB) return zac2650_s2636_0_ram[offset]; zac2650_state *state = space->machine->driver_data<zac2650_state>();
else return CollisionSprite; if(offset!=0xCB) return state->s2636_0_ram[offset];
else return state->CollisionSprite;
} }
WRITE8_HANDLER( zac_s2636_w ) WRITE8_HANDLER( zac_s2636_w )
{ {
zac2650_s2636_0_ram[offset] = data; zac2650_state *state = space->machine->driver_data<zac2650_state>();
state->s2636_0_ram[offset] = data;
gfx_element_mark_dirty(space->machine->gfx[1], offset/8); gfx_element_mark_dirty(space->machine->gfx[1], offset/8);
gfx_element_mark_dirty(space->machine->gfx[2], offset/8); gfx_element_mark_dirty(space->machine->gfx[2], offset/8);
if (offset == 0xc7) if (offset == 0xc7)
@ -50,7 +44,8 @@ WRITE8_HANDLER( zac_s2636_w )
READ8_HANDLER( tinvader_port_0_r ) READ8_HANDLER( tinvader_port_0_r )
{ {
return input_port_read(space->machine, "1E80") - CollisionBackground; zac2650_state *state = space->machine->driver_data<zac2650_state>();
return input_port_read(space->machine, "1E80") - state->CollisionBackground;
} }
/*****************************************/ /*****************************************/
@ -59,19 +54,20 @@ READ8_HANDLER( tinvader_port_0_r )
static int SpriteCollision(running_machine *machine, int first,int second) static int SpriteCollision(running_machine *machine, int first,int second)
{ {
zac2650_state *state = machine->driver_data<zac2650_state>();
int Checksum=0; int Checksum=0;
int x,y; int x,y;
const rectangle &visarea = machine->primary_screen->visible_area(); const rectangle &visarea = machine->primary_screen->visible_area();
if((zac2650_s2636_0_ram[first * 0x10 + 10] < 0xf0) && (zac2650_s2636_0_ram[second * 0x10 + 10] < 0xf0)) if((state->s2636_0_ram[first * 0x10 + 10] < 0xf0) && (state->s2636_0_ram[second * 0x10 + 10] < 0xf0))
{ {
int fx = (zac2650_s2636_0_ram[first * 0x10 + 10] * 4)-22; int fx = (state->s2636_0_ram[first * 0x10 + 10] * 4)-22;
int fy = (zac2650_s2636_0_ram[first * 0x10 + 12] * 3)+3; int fy = (state->s2636_0_ram[first * 0x10 + 12] * 3)+3;
int expand = (first==1) ? 2 : 1; int expand = (first==1) ? 2 : 1;
/* Draw first sprite */ /* Draw first sprite */
drawgfx_opaque(spritebitmap,0, machine->gfx[expand], drawgfx_opaque(state->spritebitmap,0, machine->gfx[expand],
first * 2, first * 2,
0, 0,
0,0, 0,0,
@ -91,17 +87,17 @@ static int SpriteCollision(running_machine *machine, int first,int second)
continue; continue;
} }
Checksum += *BITMAP_ADDR16(spritebitmap, y, x); Checksum += *BITMAP_ADDR16(state->spritebitmap, y, x);
} }
} }
/* Blackout second sprite */ /* Blackout second sprite */
drawgfx_transpen(spritebitmap,0, machine->gfx[1], drawgfx_transpen(state->spritebitmap,0, machine->gfx[1],
second * 2, second * 2,
1, 1,
0,0, 0,0,
(zac2650_s2636_0_ram[second * 0x10 + 10] * 4)-22,(zac2650_s2636_0_ram[second * 0x10 + 12] * 3) + 3, 0); (state->s2636_0_ram[second * 0x10 + 10] * 4)-22,(state->s2636_0_ram[second * 0x10 + 12] * 3) + 3, 0);
/* Remove fingerprint */ /* Remove fingerprint */
@ -117,13 +113,13 @@ static int SpriteCollision(running_machine *machine, int first,int second)
continue; continue;
} }
Checksum -= *BITMAP_ADDR16(spritebitmap, y, x); Checksum -= *BITMAP_ADDR16(state->spritebitmap, y, x);
} }
} }
/* Zero bitmap */ /* Zero bitmap */
drawgfx_opaque(spritebitmap,0, machine->gfx[expand], drawgfx_opaque(state->spritebitmap,0, machine->gfx[expand],
first * 2, first * 2,
1, 1,
0,0, 0,0,
@ -144,18 +140,20 @@ static TILE_GET_INFO( get_bg_tile_info )
VIDEO_START( tinvader ) VIDEO_START( tinvader )
{ {
bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, zac2650_state *state = machine->driver_data<zac2650_state>();
state->bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows,
24, 24, 32, 32); 24, 24, 32, 32);
spritebitmap = machine->primary_screen->alloc_compatible_bitmap(); state->spritebitmap = machine->primary_screen->alloc_compatible_bitmap();
machine->generic.tmpbitmap = machine->primary_screen->alloc_compatible_bitmap(); machine->generic.tmpbitmap = machine->primary_screen->alloc_compatible_bitmap();
gfx_element_set_source(machine->gfx[1], zac2650_s2636_0_ram); gfx_element_set_source(machine->gfx[1], state->s2636_0_ram);
gfx_element_set_source(machine->gfx[2], zac2650_s2636_0_ram); gfx_element_set_source(machine->gfx[2], state->s2636_0_ram);
} }
static void draw_sprites(running_machine *machine, bitmap_t *bitmap) static void draw_sprites(running_machine *machine, bitmap_t *bitmap)
{ {
zac2650_state *state = machine->driver_data<zac2650_state>();
int offs; int offs;
const rectangle &visarea = machine->primary_screen->visible_area(); const rectangle &visarea = machine->primary_screen->visible_area();
@ -170,19 +168,19 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap)
/* does not seem to be a fault of the emulation! */ /* does not seem to be a fault of the emulation! */
/* -------------------------------------------------------------- */ /* -------------------------------------------------------------- */
CollisionBackground = 0; /* Read from 0x1e80 bit 7 */ state->CollisionBackground = 0; /* Read from 0x1e80 bit 7 */
// for collision detection checking // for collision detection checking
copybitmap(machine->generic.tmpbitmap,bitmap,0,0,0,0,&visarea); copybitmap(machine->generic.tmpbitmap,bitmap,0,0,0,0,&visarea);
for(offs=0;offs<0x50;offs+=0x10) for(offs=0;offs<0x50;offs+=0x10)
{ {
if((zac2650_s2636_0_ram[offs+10]<0xF0) && (offs!=0x30)) if((state->s2636_0_ram[offs+10]<0xF0) && (offs!=0x30))
{ {
int spriteno = (offs / 8); int spriteno = (offs / 8);
int expand = ((zac2650_s2636_0_ram[0xc0] & (spriteno*2))!=0) ? 2 : 1; int expand = ((state->s2636_0_ram[0xc0] & (spriteno*2))!=0) ? 2 : 1;
int bx = (zac2650_s2636_0_ram[offs+10] * 4) - 22; int bx = (state->s2636_0_ram[offs+10] * 4) - 22;
int by = (zac2650_s2636_0_ram[offs+12] * 3) + 3; int by = (state->s2636_0_ram[offs+12] * 3) + 3;
int x,y; int x,y;
/* Sprite->Background collision detection */ /* Sprite->Background collision detection */
@ -206,7 +204,7 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap)
if (*BITMAP_ADDR16(bitmap, y, x) != *BITMAP_ADDR16(machine->generic.tmpbitmap, y, x)) if (*BITMAP_ADDR16(bitmap, y, x) != *BITMAP_ADDR16(machine->generic.tmpbitmap, y, x))
{ {
CollisionBackground = 0x80; state->CollisionBackground = 0x80;
break; break;
} }
} }
@ -221,18 +219,19 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap)
} }
/* Sprite->Sprite collision detection */ /* Sprite->Sprite collision detection */
CollisionSprite = 0; state->CollisionSprite = 0;
// if(SpriteCollision(machine, 0,1)) CollisionSprite |= 0x20; /* Not Used */ // if(SpriteCollision(machine, 0,1)) state->CollisionSprite |= 0x20; /* Not Used */
if(SpriteCollision(machine, 0,2)) CollisionSprite |= 0x10; if(SpriteCollision(machine, 0,2)) state->CollisionSprite |= 0x10;
if(SpriteCollision(machine, 0,4)) CollisionSprite |= 0x08; if(SpriteCollision(machine, 0,4)) state->CollisionSprite |= 0x08;
if(SpriteCollision(machine, 1,2)) CollisionSprite |= 0x04; if(SpriteCollision(machine, 1,2)) state->CollisionSprite |= 0x04;
if(SpriteCollision(machine, 1,4)) CollisionSprite |= 0x02; if(SpriteCollision(machine, 1,4)) state->CollisionSprite |= 0x02;
// if(SpriteCollision(machine, 2,4)) CollisionSprite |= 0x01; /* Not Used */ // if(SpriteCollision(machine, 2,4)) state->CollisionSprite |= 0x01; /* Not Used */
} }
SCREEN_UPDATE( tinvader ) SCREEN_UPDATE( tinvader )
{ {
tilemap_draw(bitmap, cliprect, bg_tilemap, 0, 0); zac2650_state *state = screen->machine->driver_data<zac2650_state>();
tilemap_draw(bitmap, cliprect, state->bg_tilemap, 0, 0);
draw_sprites(screen->machine, bitmap); draw_sprites(screen->machine, bitmap);
return 0; return 0;
} }

View File

@ -11,13 +11,6 @@
#include "includes/zaccaria.h" #include "includes/zaccaria.h"
UINT8 *zaccaria_videoram,*zaccaria_attributesram;
static tilemap_t *bg_tilemap;
/*************************************************************************** /***************************************************************************
Convert the color PROMs into a more useable format. Convert the color PROMs into a more useable format.
@ -121,11 +114,12 @@ PALETTE_INIT( zaccaria )
static TILE_GET_INFO( get_tile_info ) static TILE_GET_INFO( get_tile_info )
{ {
UINT8 attr = zaccaria_videoram[tile_index + 0x400]; zaccaria_state *state = machine->driver_data<zaccaria_state>();
UINT8 attr = state->videoram[tile_index + 0x400];
SET_TILE_INFO( SET_TILE_INFO(
0, 0,
zaccaria_videoram[tile_index] + ((attr & 0x03) << 8), state->videoram[tile_index] + ((attr & 0x03) << 8),
((attr & 0x0c) >> 2) + ((zaccaria_attributesram[2 * (tile_index % 32) + 1] & 0x07) << 2), ((attr & 0x0c) >> 2) + ((state->attributesram[2 * (tile_index % 32) + 1] & 0x07) << 2),
0); 0);
} }
@ -139,9 +133,10 @@ static TILE_GET_INFO( get_tile_info )
VIDEO_START( zaccaria ) VIDEO_START( zaccaria )
{ {
bg_tilemap = tilemap_create(machine, get_tile_info,tilemap_scan_rows,8,8,32,32); zaccaria_state *state = machine->driver_data<zaccaria_state>();
state->bg_tilemap = tilemap_create(machine, get_tile_info,tilemap_scan_rows,8,8,32,32);
tilemap_set_scroll_cols(bg_tilemap,32); tilemap_set_scroll_cols(state->bg_tilemap,32);
} }
@ -154,26 +149,28 @@ VIDEO_START( zaccaria )
WRITE8_HANDLER( zaccaria_videoram_w ) WRITE8_HANDLER( zaccaria_videoram_w )
{ {
zaccaria_videoram[offset] = data; zaccaria_state *state = space->machine->driver_data<zaccaria_state>();
tilemap_mark_tile_dirty(bg_tilemap,offset & 0x3ff); state->videoram[offset] = data;
tilemap_mark_tile_dirty(state->bg_tilemap,offset & 0x3ff);
} }
WRITE8_HANDLER( zaccaria_attributes_w ) WRITE8_HANDLER( zaccaria_attributes_w )
{ {
zaccaria_state *state = space->machine->driver_data<zaccaria_state>();
if (offset & 1) if (offset & 1)
{ {
if (zaccaria_attributesram[offset] != data) if (state->attributesram[offset] != data)
{ {
int i; int i;
for (i = offset / 2;i < 0x400;i += 32) for (i = offset / 2;i < 0x400;i += 32)
tilemap_mark_tile_dirty(bg_tilemap,i); tilemap_mark_tile_dirty(state->bg_tilemap,i);
} }
} }
else else
tilemap_set_scrolly(bg_tilemap,offset / 2,data); tilemap_set_scrolly(state->bg_tilemap,offset / 2,data);
zaccaria_attributesram[offset] = data; state->attributesram[offset] = data;
} }
WRITE8_HANDLER( zaccaria_flip_screen_x_w ) WRITE8_HANDLER( zaccaria_flip_screen_x_w )
@ -248,7 +245,8 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap,const rectan
SCREEN_UPDATE( zaccaria ) SCREEN_UPDATE( zaccaria )
{ {
tilemap_draw(bitmap,cliprect,bg_tilemap,0,0); zaccaria_state *state = screen->machine->driver_data<zaccaria_state>();
tilemap_draw(bitmap,cliprect,state->bg_tilemap,0,0);
// 3 layers of sprites, each with their own palette and priorities // 3 layers of sprites, each with their own palette and priorities
// Not perfect yet, does spriteram(1) layer have a priority bit somewhere? // Not perfect yet, does spriteram(1) layer have a priority bit somewhere?