mirror of
https://github.com/holub/mame
synced 2025-07-01 16:19:38 +03:00
cps modernisation part 1
This commit is contained in:
parent
d63986040f
commit
db6b7972f7
@ -640,7 +640,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(cps_state::cps2_interrupt)
|
|||||||
{
|
{
|
||||||
m_cps_b_regs[0x10/2] = 0;
|
m_cps_b_regs[0x10/2] = 0;
|
||||||
m_maincpu->set_input_line(4, HOLD_LINE);
|
m_maincpu->set_input_line(4, HOLD_LINE);
|
||||||
cps2_set_sprite_priorities(timer.machine());
|
cps2_set_sprite_priorities();
|
||||||
timer.machine().primary_screen->update_partial(param);
|
timer.machine().primary_screen->update_partial(param);
|
||||||
m_scancalls++;
|
m_scancalls++;
|
||||||
// popmessage("IRQ4 scancounter = %04i", param);
|
// popmessage("IRQ4 scancounter = %04i", param);
|
||||||
@ -651,7 +651,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(cps_state::cps2_interrupt)
|
|||||||
{
|
{
|
||||||
m_cps_b_regs[0x12 / 2] = 0;
|
m_cps_b_regs[0x12 / 2] = 0;
|
||||||
m_maincpu->set_input_line(4, HOLD_LINE);
|
m_maincpu->set_input_line(4, HOLD_LINE);
|
||||||
cps2_set_sprite_priorities(timer.machine());
|
cps2_set_sprite_priorities();
|
||||||
timer.machine().primary_screen->update_partial(param);
|
timer.machine().primary_screen->update_partial(param);
|
||||||
m_scancalls++;
|
m_scancalls++;
|
||||||
// popmessage("IRQ4 scancounter = %04i", param);
|
// popmessage("IRQ4 scancounter = %04i", param);
|
||||||
@ -664,10 +664,10 @@ TIMER_DEVICE_CALLBACK_MEMBER(cps_state::cps2_interrupt)
|
|||||||
m_maincpu->set_input_line(2, HOLD_LINE);
|
m_maincpu->set_input_line(2, HOLD_LINE);
|
||||||
if(m_scancalls)
|
if(m_scancalls)
|
||||||
{
|
{
|
||||||
cps2_set_sprite_priorities(timer.machine());
|
cps2_set_sprite_priorities();
|
||||||
timer.machine().primary_screen->update_partial(256);
|
timer.machine().primary_screen->update_partial(256);
|
||||||
}
|
}
|
||||||
cps2_objram_latch(timer.machine());
|
cps2_objram_latch();
|
||||||
}
|
}
|
||||||
// popmessage("Raster calls = %i", m_scancalls);
|
// popmessage("Raster calls = %i", m_scancalls);
|
||||||
}
|
}
|
||||||
|
@ -258,6 +258,24 @@ public:
|
|||||||
DECLARE_WRITE16_MEMBER(sf2mdta_layer_w);
|
DECLARE_WRITE16_MEMBER(sf2mdta_layer_w);
|
||||||
UINT32 screen_update_fcrash(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
UINT32 screen_update_fcrash(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||||
void cps1_get_video_base();
|
void cps1_get_video_base();
|
||||||
|
void cps1_gfx_decode();
|
||||||
|
void unshuffle(UINT64 *buf, int len);
|
||||||
|
void cps2_gfx_decode();
|
||||||
|
int gfxrom_bank_mapper(int type, int code);
|
||||||
|
void cps1_update_transmasks();
|
||||||
|
void cps1_build_palette(const UINT16* const palette_base);
|
||||||
|
void cps1_find_last_sprite();
|
||||||
|
void cps1_render_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||||
|
void cps2_find_last_sprite();
|
||||||
|
void cps2_render_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, int *primasks);
|
||||||
|
void cps1_render_stars(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||||
|
void cps1_render_layer(bitmap_ind16 &bitmap, const rectangle &cliprect, int layer, int primask);
|
||||||
|
void cps1_render_high_layer(bitmap_ind16 &bitmap, const rectangle &cliprect, int layer);
|
||||||
|
void cps2_set_sprite_priorities();
|
||||||
|
void cps2_objram_latch();
|
||||||
|
UINT16 *cps2_objbase();
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/*----------- defined in drivers/cps1.c -----------*/
|
/*----------- defined in drivers/cps1.c -----------*/
|
||||||
|
@ -1493,9 +1493,6 @@ CPS1 VIDEO RENDERER
|
|||||||
#define CPS2_OBJ_YOFFS 0x0a /* Y offset (always 0x0010) */
|
#define CPS2_OBJ_YOFFS 0x0a /* Y offset (always 0x0010) */
|
||||||
|
|
||||||
|
|
||||||
static void cps1_build_palette(running_machine &machine, const UINT16* const palette_base);
|
|
||||||
|
|
||||||
|
|
||||||
MACHINE_RESET_MEMBER(cps_state,cps)
|
MACHINE_RESET_MEMBER(cps_state,cps)
|
||||||
{
|
{
|
||||||
const char *gamename = machine().system().name;
|
const char *gamename = machine().system().name;
|
||||||
@ -1581,7 +1578,7 @@ WRITE16_MEMBER(cps_state::cps1_cps_a_w)
|
|||||||
fixes glitches in the ghouls intro, but it might happen at next vblank.
|
fixes glitches in the ghouls intro, but it might happen at next vblank.
|
||||||
*/
|
*/
|
||||||
if (offset == CPS1_PALETTE_BASE)
|
if (offset == CPS1_PALETTE_BASE)
|
||||||
cps1_build_palette(machine(), cps1_base(machine(), CPS1_PALETTE_BASE, m_palette_align));
|
cps1_build_palette(cps1_base(machine(), CPS1_PALETTE_BASE, m_palette_align));
|
||||||
|
|
||||||
// pzloop2 write to register 24 on startup. This is probably just a bug.
|
// pzloop2 write to register 24 on startup. This is probably just a bug.
|
||||||
if (offset == 0x24 / 2 && m_cps_version == 2)
|
if (offset == 0x24 / 2 && m_cps_version == 2)
|
||||||
@ -1702,18 +1699,11 @@ WRITE16_MEMBER(cps_state::cps1_cps_b_w)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
INLINE int cps2_port( running_machine &machine, int offset )
|
void cps_state::cps1_gfx_decode()
|
||||||
{
|
{
|
||||||
cps_state *state = machine.driver_data<cps_state>();
|
int size = memregion("gfx")->bytes();
|
||||||
return state->m_output[offset / 2];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void cps1_gfx_decode( running_machine &machine )
|
|
||||||
{
|
|
||||||
int size = machine.root_device().memregion("gfx")->bytes();
|
|
||||||
int i, j, gfxsize;
|
int i, j, gfxsize;
|
||||||
UINT8 *cps1_gfx = machine.root_device().memregion("gfx")->base();
|
UINT8 *cps1_gfx = memregion("gfx")->base();
|
||||||
|
|
||||||
gfxsize = size / 4;
|
gfxsize = size / 4;
|
||||||
|
|
||||||
@ -1741,7 +1731,7 @@ static void cps1_gfx_decode( running_machine &machine )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void unshuffle( UINT64 *buf, int len )
|
void cps_state::unshuffle( UINT64 *buf, int len )
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
UINT64 t;
|
UINT64 t;
|
||||||
@ -1764,22 +1754,22 @@ static void unshuffle( UINT64 *buf, int len )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cps2_gfx_decode( running_machine &machine )
|
void cps_state::cps2_gfx_decode()
|
||||||
{
|
{
|
||||||
const int banksize = 0x200000;
|
const int banksize = 0x200000;
|
||||||
int size = machine.root_device().memregion("gfx")->bytes();
|
int size = memregion("gfx")->bytes();
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < size; i += banksize)
|
for (i = 0; i < size; i += banksize)
|
||||||
unshuffle((UINT64 *)(machine.root_device().memregion("gfx")->base() + i), banksize / 8);
|
unshuffle((UINT64 *)(memregion("gfx")->base() + i), banksize / 8);
|
||||||
|
|
||||||
cps1_gfx_decode(machine);
|
cps1_gfx_decode();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
DRIVER_INIT_MEMBER(cps_state,cps1)
|
DRIVER_INIT_MEMBER(cps_state,cps1)
|
||||||
{
|
{
|
||||||
cps1_gfx_decode(machine());
|
cps1_gfx_decode();
|
||||||
|
|
||||||
m_scanline1 = 0;
|
m_scanline1 = 0;
|
||||||
m_scanline2 = 0;
|
m_scanline2 = 0;
|
||||||
@ -1793,7 +1783,7 @@ DRIVER_INIT_MEMBER(cps_state,cps1)
|
|||||||
|
|
||||||
DRIVER_INIT_MEMBER(cps_state,cps2_video)
|
DRIVER_INIT_MEMBER(cps_state,cps2_video)
|
||||||
{
|
{
|
||||||
cps2_gfx_decode(machine());
|
cps2_gfx_decode();
|
||||||
|
|
||||||
m_scanline1 = 262;
|
m_scanline1 = 262;
|
||||||
m_scanline2 = 262;
|
m_scanline2 = 262;
|
||||||
@ -1914,10 +1904,9 @@ WRITE16_MEMBER(cps_state::cps1_gfxram_w)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
static int gfxrom_bank_mapper( running_machine &machine, int type, int code )
|
int cps_state::gfxrom_bank_mapper( int type, int code )
|
||||||
{
|
{
|
||||||
cps_state *state = machine.driver_data<cps_state>();
|
const struct gfx_range *range = m_game_config->bank_mapper;
|
||||||
const struct gfx_range *range = state->m_game_config->bank_mapper;
|
|
||||||
int shift = 0;
|
int shift = 0;
|
||||||
|
|
||||||
assert(range);
|
assert(range);
|
||||||
@ -1942,9 +1931,9 @@ static int gfxrom_bank_mapper( running_machine &machine, int type, int code )
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < range->bank; ++i)
|
for (i = 0; i < range->bank; ++i)
|
||||||
base += state->m_game_config->bank_sizes[i];
|
base += m_game_config->bank_sizes[i];
|
||||||
|
|
||||||
return (base + (code & (state->m_game_config->bank_sizes[range->bank] - 1))) >> shift;
|
return (base + (code & (m_game_config->bank_sizes[range->bank] - 1))) >> shift;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1989,7 +1978,7 @@ TILE_GET_INFO_MEMBER(cps_state::get_tile0_info)
|
|||||||
int attr = m_scroll1[2 * tile_index + 1];
|
int attr = m_scroll1[2 * tile_index + 1];
|
||||||
int gfxset;
|
int gfxset;
|
||||||
|
|
||||||
code = gfxrom_bank_mapper(machine(), GFXTYPE_SCROLL1, code);
|
code = gfxrom_bank_mapper(GFXTYPE_SCROLL1, code);
|
||||||
|
|
||||||
/* allows us to reproduce a problem seen with a ffight board where USA and Japanese
|
/* allows us to reproduce a problem seen with a ffight board where USA and Japanese
|
||||||
roms have been mixed to be reproduced (ffightub) -- it looks like each column
|
roms have been mixed to be reproduced (ffightub) -- it looks like each column
|
||||||
@ -2014,7 +2003,7 @@ TILE_GET_INFO_MEMBER(cps_state::get_tile1_info)
|
|||||||
int code = m_scroll2[2 * tile_index];
|
int code = m_scroll2[2 * tile_index];
|
||||||
int attr = m_scroll2[2 * tile_index + 1];
|
int attr = m_scroll2[2 * tile_index + 1];
|
||||||
|
|
||||||
code = gfxrom_bank_mapper(machine(), GFXTYPE_SCROLL2, code);
|
code = gfxrom_bank_mapper(GFXTYPE_SCROLL2, code);
|
||||||
|
|
||||||
SET_TILE_INFO_MEMBER(
|
SET_TILE_INFO_MEMBER(
|
||||||
2,
|
2,
|
||||||
@ -2033,7 +2022,7 @@ TILE_GET_INFO_MEMBER(cps_state::get_tile2_info)
|
|||||||
int code = m_scroll3[2 * tile_index] & 0x3fff;
|
int code = m_scroll3[2 * tile_index] & 0x3fff;
|
||||||
int attr = m_scroll3[2 * tile_index + 1];
|
int attr = m_scroll3[2 * tile_index + 1];
|
||||||
|
|
||||||
code = gfxrom_bank_mapper(machine(), GFXTYPE_SCROLL3, code);
|
code = gfxrom_bank_mapper(GFXTYPE_SCROLL3, code);
|
||||||
|
|
||||||
SET_TILE_INFO_MEMBER(
|
SET_TILE_INFO_MEMBER(
|
||||||
3,
|
3,
|
||||||
@ -2050,9 +2039,8 @@ TILE_GET_INFO_MEMBER(cps_state::get_tile2_info)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void cps1_update_transmasks( running_machine &machine )
|
void cps_state::cps1_update_transmasks()
|
||||||
{
|
{
|
||||||
cps_state *state = machine.driver_data<cps_state>();
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < 4; i++)
|
for (i = 0; i < 4; i++)
|
||||||
@ -2060,14 +2048,14 @@ static void cps1_update_transmasks( running_machine &machine )
|
|||||||
int mask;
|
int mask;
|
||||||
|
|
||||||
/* Get transparency registers */
|
/* Get transparency registers */
|
||||||
if (state->m_game_config->priority[i] != -1)
|
if (m_game_config->priority[i] != -1)
|
||||||
mask = state->m_cps_b_regs[state->m_game_config->priority[i] / 2] ^ 0xffff;
|
mask = m_cps_b_regs[m_game_config->priority[i] / 2] ^ 0xffff;
|
||||||
else
|
else
|
||||||
mask = 0xffff; /* completely transparent if priority masks not defined (qad) */
|
mask = 0xffff; /* completely transparent if priority masks not defined (qad) */
|
||||||
|
|
||||||
state->m_bg_tilemap[0]->set_transmask(i, mask, 0x8000);
|
m_bg_tilemap[0]->set_transmask(i, mask, 0x8000);
|
||||||
state->m_bg_tilemap[1]->set_transmask(i, mask, 0x8000);
|
m_bg_tilemap[1]->set_transmask(i, mask, 0x8000);
|
||||||
state->m_bg_tilemap[2]->set_transmask(i, mask, 0x8000);
|
m_bg_tilemap[2]->set_transmask(i, mask, 0x8000);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2095,7 +2083,7 @@ VIDEO_START_MEMBER(cps_state,cps)
|
|||||||
memset(m_empty_tile, 0x0f, sizeof(m_empty_tile));
|
memset(m_empty_tile, 0x0f, sizeof(m_empty_tile));
|
||||||
|
|
||||||
/* front masks will change at runtime to handle sprite occluding */
|
/* front masks will change at runtime to handle sprite occluding */
|
||||||
cps1_update_transmasks(machine());
|
cps1_update_transmasks();
|
||||||
|
|
||||||
for (i = 0; i < cps1_palette_entries * 16; i++)
|
for (i = 0; i < cps1_palette_entries * 16; i++)
|
||||||
palette_set_color(machine(), i, MAKE_RGB(0,0,0));
|
palette_set_color(machine(), i, MAKE_RGB(0,0,0));
|
||||||
@ -2188,12 +2176,11 @@ VIDEO_START_MEMBER(cps_state,cps2)
|
|||||||
|
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
static void cps1_build_palette( running_machine &machine, const UINT16* const palette_base )
|
void cps_state::cps1_build_palette( const UINT16* const palette_base )
|
||||||
{
|
{
|
||||||
cps_state *state = machine.driver_data<cps_state>();
|
|
||||||
int offset, page;
|
int offset, page;
|
||||||
const UINT16 *palette_ram = palette_base;
|
const UINT16 *palette_ram = palette_base;
|
||||||
int ctrl = state->m_cps_b_regs[state->m_game_config->palette_control/2];
|
int ctrl = m_cps_b_regs[m_game_config->palette_control/2];
|
||||||
|
|
||||||
/*
|
/*
|
||||||
The palette is copied only for pages that are enabled in the ctrl
|
The palette is copied only for pages that are enabled in the ctrl
|
||||||
@ -2218,7 +2205,7 @@ static void cps1_build_palette( running_machine &machine, const UINT16* const pa
|
|||||||
g = ((palette >> 4) & 0x0f) * 0x11 * bright / 0x2d;
|
g = ((palette >> 4) & 0x0f) * 0x11 * bright / 0x2d;
|
||||||
b = ((palette >> 0) & 0x0f) * 0x11 * bright / 0x2d;
|
b = ((palette >> 0) & 0x0f) * 0x11 * bright / 0x2d;
|
||||||
|
|
||||||
palette_set_color (machine, 0x200 * page + offset, MAKE_RGB(r, g, b));
|
palette_set_color (machine(), 0x200 * page + offset, MAKE_RGB(r, g, b));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -2266,58 +2253,56 @@ static void cps1_build_palette( running_machine &machine, const UINT16* const pa
|
|||||||
|
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
static void cps1_find_last_sprite( running_machine &machine ) /* Find the offset of last sprite */
|
void cps_state::cps1_find_last_sprite() /* Find the offset of last sprite */
|
||||||
{
|
{
|
||||||
cps_state *state = machine.driver_data<cps_state>();
|
|
||||||
int offset = 0;
|
int offset = 0;
|
||||||
/* Locate the end of table marker */
|
/* Locate the end of table marker */
|
||||||
while (offset < state->m_obj_size / 2)
|
while (offset < m_obj_size / 2)
|
||||||
{
|
{
|
||||||
int colour = state->m_buffered_obj[offset + 3];
|
int colour = m_buffered_obj[offset + 3];
|
||||||
if ((colour & 0xff00) == 0xff00)
|
if ((colour & 0xff00) == 0xff00)
|
||||||
{
|
{
|
||||||
/* Marker found. This is the last sprite. */
|
/* Marker found. This is the last sprite. */
|
||||||
state->m_last_sprite_offset = offset - 4;
|
m_last_sprite_offset = offset - 4;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
offset += 4;
|
offset += 4;
|
||||||
}
|
}
|
||||||
/* Sprites must use full sprite RAM */
|
/* Sprites must use full sprite RAM */
|
||||||
state->m_last_sprite_offset = state->m_obj_size / 2 - 4;
|
m_last_sprite_offset = m_obj_size / 2 - 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void cps1_render_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect )
|
void cps_state::cps1_render_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect )
|
||||||
{
|
{
|
||||||
cps_state *state = machine.driver_data<cps_state>();
|
|
||||||
|
|
||||||
#define DRAWSPRITE(CODE,COLOR,FLIPX,FLIPY,SX,SY) \
|
#define DRAWSPRITE(CODE,COLOR,FLIPX,FLIPY,SX,SY) \
|
||||||
{ \
|
{ \
|
||||||
if (state->flip_screen()) \
|
if (flip_screen()) \
|
||||||
pdrawgfx_transpen(bitmap,\
|
pdrawgfx_transpen(bitmap,\
|
||||||
cliprect,machine.gfx[2], \
|
cliprect,machine().gfx[2], \
|
||||||
CODE, \
|
CODE, \
|
||||||
COLOR, \
|
COLOR, \
|
||||||
!(FLIPX),!(FLIPY), \
|
!(FLIPX),!(FLIPY), \
|
||||||
511-16-(SX),255-16-(SY), machine.priority_bitmap,0x02,15); \
|
511-16-(SX),255-16-(SY), machine().priority_bitmap,0x02,15); \
|
||||||
else \
|
else \
|
||||||
pdrawgfx_transpen(bitmap,\
|
pdrawgfx_transpen(bitmap,\
|
||||||
cliprect,machine.gfx[2], \
|
cliprect,machine().gfx[2], \
|
||||||
CODE, \
|
CODE, \
|
||||||
COLOR, \
|
COLOR, \
|
||||||
FLIPX,FLIPY, \
|
FLIPX,FLIPY, \
|
||||||
SX,SY, machine.priority_bitmap,0x02,15); \
|
SX,SY, machine().priority_bitmap,0x02,15); \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int i, baseadd;
|
int i, baseadd;
|
||||||
UINT16 *base = state->m_buffered_obj;
|
UINT16 *base = m_buffered_obj;
|
||||||
|
|
||||||
/* some sf2 hacks draw the sprites in reverse order */
|
/* some sf2 hacks draw the sprites in reverse order */
|
||||||
if (state->m_game_config->bootleg_kludge == 1)
|
if (m_game_config->bootleg_kludge == 1)
|
||||||
{
|
{
|
||||||
base += state->m_last_sprite_offset;
|
base += m_last_sprite_offset;
|
||||||
baseadd = -4;
|
baseadd = -4;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -2325,7 +2310,7 @@ static void cps1_render_sprites( running_machine &machine, bitmap_ind16 &bitmap,
|
|||||||
baseadd = 4;
|
baseadd = 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = state->m_last_sprite_offset; i >= 0; i -= 4)
|
for (i = m_last_sprite_offset; i >= 0; i -= 4)
|
||||||
{
|
{
|
||||||
int x = *(base + 0);
|
int x = *(base + 0);
|
||||||
int y = *(base + 1);
|
int y = *(base + 1);
|
||||||
@ -2336,7 +2321,7 @@ static void cps1_render_sprites( running_machine &machine, bitmap_ind16 &bitmap,
|
|||||||
// x -= 0x20;
|
// x -= 0x20;
|
||||||
// y += 0x20;
|
// y += 0x20;
|
||||||
|
|
||||||
code = gfxrom_bank_mapper(machine, GFXTYPE_SPRITES, code);
|
code = gfxrom_bank_mapper(GFXTYPE_SPRITES, code);
|
||||||
|
|
||||||
if (code != -1)
|
if (code != -1)
|
||||||
{
|
{
|
||||||
@ -2485,81 +2470,78 @@ WRITE16_MEMBER(cps_state::cps2_objram2_w)
|
|||||||
COMBINE_DATA(&m_objram2[offset]);
|
COMBINE_DATA(&m_objram2[offset]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static UINT16 *cps2_objbase( running_machine &machine )
|
UINT16 *cps_state::cps2_objbase()
|
||||||
{
|
{
|
||||||
cps_state *state = machine.driver_data<cps_state>();
|
|
||||||
int baseptr;
|
int baseptr;
|
||||||
baseptr = 0x7000;
|
baseptr = 0x7000;
|
||||||
|
|
||||||
if (state->m_objram_bank & 1)
|
if (m_objram_bank & 1)
|
||||||
baseptr ^= 0x0080;
|
baseptr ^= 0x0080;
|
||||||
|
|
||||||
//popmessage("%04x %d", cps2_port(machine, CPS2_OBJ_BASE), state->m_objram_bank & 1);
|
//popmessage("%04x %d", cps2_port(machine, CPS2_OBJ_BASE), state->m_objram_bank & 1);
|
||||||
|
|
||||||
if (baseptr == 0x7000)
|
if (baseptr == 0x7000)
|
||||||
return state->m_objram1;
|
return m_objram1;
|
||||||
else //if (baseptr == 0x7080)
|
else //if (baseptr == 0x7080)
|
||||||
return state->m_objram2;
|
return m_objram2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void cps2_find_last_sprite( running_machine &machine ) /* Find the offset of last sprite */
|
void cps_state::cps2_find_last_sprite() /* Find the offset of last sprite */
|
||||||
{
|
{
|
||||||
cps_state *state = machine.driver_data<cps_state>();
|
|
||||||
int offset = 0;
|
int offset = 0;
|
||||||
UINT16 *base = state->m_cps2_buffered_obj;
|
UINT16 *base = m_cps2_buffered_obj;
|
||||||
|
|
||||||
/* Locate the end of table marker */
|
/* Locate the end of table marker */
|
||||||
while (offset < state->m_cps2_obj_size / 2)
|
while (offset < m_cps2_obj_size / 2)
|
||||||
{
|
{
|
||||||
if (base[offset + 1] >= 0x8000 || base[offset + 3] >= 0xff00)
|
if (base[offset + 1] >= 0x8000 || base[offset + 3] >= 0xff00)
|
||||||
{
|
{
|
||||||
/* Marker found. This is the last sprite. */
|
/* Marker found. This is the last sprite. */
|
||||||
state->m_cps2_last_sprite_offset = offset - 4;
|
m_cps2_last_sprite_offset = offset - 4;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
offset += 4;
|
offset += 4;
|
||||||
}
|
}
|
||||||
/* Sprites must use full sprite RAM */
|
/* Sprites must use full sprite RAM */
|
||||||
state->m_cps2_last_sprite_offset = state->m_cps2_obj_size / 2 - 4;
|
m_cps2_last_sprite_offset = m_cps2_obj_size / 2 - 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cps2_render_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int *primasks )
|
void cps_state::cps2_render_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect, int *primasks )
|
||||||
{
|
{
|
||||||
cps_state *state = machine.driver_data<cps_state>();
|
|
||||||
|
|
||||||
#define DRAWSPRITE(CODE,COLOR,FLIPX,FLIPY,SX,SY) \
|
#define DRAWSPRITE(CODE,COLOR,FLIPX,FLIPY,SX,SY) \
|
||||||
{ \
|
{ \
|
||||||
if (state->flip_screen()) \
|
if (flip_screen()) \
|
||||||
pdrawgfx_transpen(bitmap,\
|
pdrawgfx_transpen(bitmap,\
|
||||||
cliprect,machine.gfx[2], \
|
cliprect,machine().gfx[2], \
|
||||||
CODE, \
|
CODE, \
|
||||||
COLOR, \
|
COLOR, \
|
||||||
!(FLIPX),!(FLIPY), \
|
!(FLIPX),!(FLIPY), \
|
||||||
511-16-(SX),255-16-(SY), machine.priority_bitmap,primasks[priority],15); \
|
511-16-(SX),255-16-(SY), machine().priority_bitmap,primasks[priority],15); \
|
||||||
else \
|
else \
|
||||||
pdrawgfx_transpen(bitmap,\
|
pdrawgfx_transpen(bitmap,\
|
||||||
cliprect,machine.gfx[2], \
|
cliprect,machine().gfx[2], \
|
||||||
CODE, \
|
CODE, \
|
||||||
COLOR, \
|
COLOR, \
|
||||||
FLIPX,FLIPY, \
|
FLIPX,FLIPY, \
|
||||||
SX,SY, machine.priority_bitmap,primasks[priority],15); \
|
SX,SY, machine().priority_bitmap,primasks[priority],15); \
|
||||||
}
|
}
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
UINT16 *base = state->m_cps2_buffered_obj;
|
UINT16 *base = m_cps2_buffered_obj;
|
||||||
int xoffs = 64 - cps2_port(machine, CPS2_OBJ_XOFFS);
|
int xoffs = 64 - m_output[CPS2_OBJ_XOFFS /2];
|
||||||
int yoffs = 16 - cps2_port(machine, CPS2_OBJ_YOFFS);
|
int yoffs = 16 - m_output[CPS2_OBJ_YOFFS /2];
|
||||||
|
|
||||||
#ifdef MAME_DEBUG
|
#ifdef MAME_DEBUG
|
||||||
if (machine.input().code_pressed(KEYCODE_Z) && machine.input().code_pressed(KEYCODE_R))
|
if (machine().input().code_pressed(KEYCODE_Z) && machine().input().code_pressed(KEYCODE_R))
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
for (i = state->m_cps2_last_sprite_offset; i >= 0; i -= 4)
|
for (i = m_cps2_last_sprite_offset; i >= 0; i -= 4)
|
||||||
{
|
{
|
||||||
int x = base[i + 0];
|
int x = base[i + 0];
|
||||||
int y = base[i + 1];
|
int y = base[i + 1];
|
||||||
@ -2570,8 +2552,8 @@ static void cps2_render_sprites( running_machine &machine, bitmap_ind16 &bitmap,
|
|||||||
|
|
||||||
if (colour & 0x80)
|
if (colour & 0x80)
|
||||||
{
|
{
|
||||||
x += cps2_port(machine, CPS2_OBJ_XOFFS); /* fix the offset of some games */
|
x += m_output[CPS2_OBJ_XOFFS /2]; /* fix the offset of some games */
|
||||||
y += cps2_port(machine, CPS2_OBJ_YOFFS); /* like Marvel vs. Capcom ending credits */
|
y += m_output[CPS2_OBJ_YOFFS /2]; /* like Marvel vs. Capcom ending credits */
|
||||||
}
|
}
|
||||||
|
|
||||||
if (colour & 0xff00)
|
if (colour & 0xff00)
|
||||||
@ -2674,13 +2656,12 @@ static void cps2_render_sprites( running_machine &machine, bitmap_ind16 &bitmap,
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void cps1_render_stars( screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect )
|
void cps_state::cps1_render_stars( screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect )
|
||||||
{
|
{
|
||||||
cps_state *state = screen.machine().driver_data<cps_state>();
|
|
||||||
int offs;
|
int offs;
|
||||||
UINT8 *stars_rom = state->memregion("stars")->base();
|
UINT8 *stars_rom = memregion("stars")->base();
|
||||||
|
|
||||||
if (!stars_rom && (state->m_stars_enabled[0] || state->m_stars_enabled[1]))
|
if (!stars_rom && (m_stars_enabled[0] || m_stars_enabled[1]))
|
||||||
{
|
{
|
||||||
#ifdef MAME_DEBUG
|
#ifdef MAME_DEBUG
|
||||||
// popmessage("stars enabled but no stars ROM");
|
// popmessage("stars enabled but no stars ROM");
|
||||||
@ -2688,18 +2669,18 @@ static void cps1_render_stars( screen_device &screen, bitmap_ind16 &bitmap, cons
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (state->m_stars_enabled[0])
|
if (m_stars_enabled[0])
|
||||||
{
|
{
|
||||||
for (offs = 0; offs < state->m_stars_rom_size / 2; offs++)
|
for (offs = 0; offs < m_stars_rom_size / 2; offs++)
|
||||||
{
|
{
|
||||||
int col = stars_rom[8 * offs + 4];
|
int col = stars_rom[8 * offs + 4];
|
||||||
if (col != 0x0f)
|
if (col != 0x0f)
|
||||||
{
|
{
|
||||||
int sx = (offs / 256) * 32;
|
int sx = (offs / 256) * 32;
|
||||||
int sy = (offs % 256);
|
int sy = (offs % 256);
|
||||||
sx = (sx - state->m_stars2x + (col & 0x1f)) & 0x1ff;
|
sx = (sx - m_stars2x + (col & 0x1f)) & 0x1ff;
|
||||||
sy = (sy - state->m_stars2y) & 0xff;
|
sy = (sy - m_stars2y) & 0xff;
|
||||||
if (state->flip_screen())
|
if (flip_screen())
|
||||||
{
|
{
|
||||||
sx = 511 - sx;
|
sx = 511 - sx;
|
||||||
sy = 255 - sy;
|
sy = 255 - sy;
|
||||||
@ -2713,18 +2694,18 @@ static void cps1_render_stars( screen_device &screen, bitmap_ind16 &bitmap, cons
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (state->m_stars_enabled[1])
|
if (m_stars_enabled[1])
|
||||||
{
|
{
|
||||||
for (offs = 0; offs < state->m_stars_rom_size / 2; offs++)
|
for (offs = 0; offs < m_stars_rom_size / 2; offs++)
|
||||||
{
|
{
|
||||||
int col = stars_rom[8*offs];
|
int col = stars_rom[8*offs];
|
||||||
if (col != 0x0f)
|
if (col != 0x0f)
|
||||||
{
|
{
|
||||||
int sx = (offs / 256) * 32;
|
int sx = (offs / 256) * 32;
|
||||||
int sy = (offs % 256);
|
int sy = (offs % 256);
|
||||||
sx = (sx - state->m_stars1x + (col & 0x1f)) & 0x1ff;
|
sx = (sx - m_stars1x + (col & 0x1f)) & 0x1ff;
|
||||||
sy = (sy - state->m_stars1y) & 0xff;
|
sy = (sy - m_stars1y) & 0xff;
|
||||||
if (state->flip_screen())
|
if (flip_screen())
|
||||||
{
|
{
|
||||||
sx = 511 - sx;
|
sx = 511 - sx;
|
||||||
sy = 255 - sy;
|
sy = 255 - sy;
|
||||||
@ -2740,25 +2721,23 @@ static void cps1_render_stars( screen_device &screen, bitmap_ind16 &bitmap, cons
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void cps1_render_layer( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int layer, int primask )
|
void cps_state::cps1_render_layer( bitmap_ind16 &bitmap, const rectangle &cliprect, int layer, int primask )
|
||||||
{
|
{
|
||||||
cps_state *state = machine.driver_data<cps_state>();
|
|
||||||
switch (layer)
|
switch (layer)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
cps1_render_sprites(machine, bitmap, cliprect);
|
cps1_render_sprites(bitmap, cliprect);
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
case 2:
|
case 2:
|
||||||
case 3:
|
case 3:
|
||||||
state->m_bg_tilemap[layer - 1]->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1, primask);
|
m_bg_tilemap[layer - 1]->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1, primask);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cps1_render_high_layer( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int layer )
|
void cps_state::cps1_render_high_layer( bitmap_ind16 &bitmap, const rectangle &cliprect, int layer )
|
||||||
{
|
{
|
||||||
cps_state *state = machine.driver_data<cps_state>();
|
|
||||||
bitmap_ind16 dummy_bitmap;
|
bitmap_ind16 dummy_bitmap;
|
||||||
switch (layer)
|
switch (layer)
|
||||||
{
|
{
|
||||||
@ -2768,7 +2747,7 @@ static void cps1_render_high_layer( running_machine &machine, bitmap_ind16 &bitm
|
|||||||
case 1:
|
case 1:
|
||||||
case 2:
|
case 2:
|
||||||
case 3:
|
case 3:
|
||||||
state->m_bg_tilemap[layer - 1]->draw(dummy_bitmap, cliprect, TILEMAP_DRAW_LAYER0, 1);
|
m_bg_tilemap[layer - 1]->draw(dummy_bitmap, cliprect, TILEMAP_DRAW_LAYER0, 1);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2793,14 +2772,12 @@ UINT32 cps_state::screen_update_cps1(screen_device &screen, bitmap_ind16 &bitmap
|
|||||||
cps1_get_video_base();
|
cps1_get_video_base();
|
||||||
|
|
||||||
/* Find the offset of the last sprite in the sprite table */
|
/* Find the offset of the last sprite in the sprite table */
|
||||||
cps1_find_last_sprite(machine());
|
cps1_find_last_sprite();
|
||||||
|
|
||||||
if (m_cps_version == 2)
|
if (m_cps_version == 2)
|
||||||
{
|
cps2_find_last_sprite();
|
||||||
cps2_find_last_sprite(machine());
|
|
||||||
}
|
|
||||||
|
|
||||||
cps1_update_transmasks(machine());
|
cps1_update_transmasks();
|
||||||
|
|
||||||
m_bg_tilemap[0]->set_scrollx(0, m_scroll1x);
|
m_bg_tilemap[0]->set_scrollx(0, m_scroll1x);
|
||||||
m_bg_tilemap[0]->set_scrolly(0, m_scroll1y);
|
m_bg_tilemap[0]->set_scrolly(0, m_scroll1y);
|
||||||
@ -2856,22 +2833,22 @@ UINT32 cps_state::screen_update_cps1(screen_device &screen, bitmap_ind16 &bitmap
|
|||||||
|
|
||||||
if (m_cps_version == 1)
|
if (m_cps_version == 1)
|
||||||
{
|
{
|
||||||
cps1_render_layer(machine(), bitmap, cliprect, l0, 0);
|
cps1_render_layer(bitmap, cliprect, l0, 0);
|
||||||
|
|
||||||
if (l1 == 0)
|
if (l1 == 0)
|
||||||
cps1_render_high_layer(machine(), bitmap, cliprect, l0); /* prepare mask for sprites */
|
cps1_render_high_layer(bitmap, cliprect, l0); /* prepare mask for sprites */
|
||||||
|
|
||||||
cps1_render_layer(machine(), bitmap, cliprect, l1, 0);
|
cps1_render_layer(bitmap, cliprect, l1, 0);
|
||||||
|
|
||||||
if (l2 == 0)
|
if (l2 == 0)
|
||||||
cps1_render_high_layer(machine(), bitmap, cliprect, l1); /* prepare mask for sprites */
|
cps1_render_high_layer(bitmap, cliprect, l1); /* prepare mask for sprites */
|
||||||
|
|
||||||
cps1_render_layer(machine(), bitmap, cliprect, l2, 0);
|
cps1_render_layer(bitmap, cliprect, l2, 0);
|
||||||
|
|
||||||
if (l3 == 0)
|
if (l3 == 0)
|
||||||
cps1_render_high_layer(machine(), bitmap, cliprect, l2); /* prepare mask for sprites */
|
cps1_render_high_layer(bitmap, cliprect, l2); /* prepare mask for sprites */
|
||||||
|
|
||||||
cps1_render_layer(machine(), bitmap, cliprect, l3, 0);
|
cps1_render_layer(bitmap, cliprect, l3, 0);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -2883,13 +2860,13 @@ UINT32 cps_state::screen_update_cps1(screen_device &screen, bitmap_ind16 &bitmap
|
|||||||
l3pri = (m_pri_ctrl >> 4 * l3) & 0x0f;
|
l3pri = (m_pri_ctrl >> 4 * l3) & 0x0f;
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
if ( (cps2_port(machine(), CPS2_OBJ_BASE) != 0x7080 && cps2_port(machine(), CPS2_OBJ_BASE) != 0x7000) ||
|
if ( (m_output[CPS2_OBJ_BASE /2] != 0x7080 && m_output[CPS2_OBJ_BASE /2] != 0x7000) ||
|
||||||
cps2_port(machine(), CPS2_OBJ_UK1) != 0x807d ||
|
m_output[CPS2_OBJ_UK1 /2] != 0x807d ||
|
||||||
(cps2_port(machine(), CPS2_OBJ_UK2) != 0x0000 && cps2_port(machine(), CPS2_OBJ_UK2) != 0x1101 && cps2_port(machine(), CPS2_OBJ_UK2) != 0x0001))
|
(m_output[CPS2_OBJ_UK2 /2] != 0x0000 && m_output[CPS2_OBJ_UK2 /2] != 0x1101 && m_output[CPS2_OBJ_UK2 /2] != 0x0001))
|
||||||
popmessage("base %04x uk1 %04x uk2 %04x",
|
popmessage("base %04x uk1 %04x uk2 %04x",
|
||||||
cps2_port(machine(), CPS2_OBJ_BASE),
|
m_output[CPS2_OBJ_BASE /2],
|
||||||
cps2_port(machine(), CPS2_OBJ_UK1),
|
m_output[CPS2_OBJ_UK1 /2],
|
||||||
cps2_port(machine(), CPS2_OBJ_UK2));
|
m_output[CPS2_OBJ_UK2 /2]);
|
||||||
|
|
||||||
if (0 && machine().input().code_pressed(KEYCODE_Z))
|
if (0 && machine().input().code_pressed(KEYCODE_Z))
|
||||||
popmessage("order: %d (%d) %d (%d) %d (%d) %d (%d)",l0,l0pri,l1,l1pri,l2,l2pri,l3,l3pri);
|
popmessage("order: %d (%d) %d (%d) %d (%d) %d (%d)",l0,l0pri,l1,l1pri,l2,l2pri,l3,l3pri);
|
||||||
@ -2922,10 +2899,10 @@ if (0 && machine().input().code_pressed(KEYCODE_Z))
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cps1_render_layer(machine(), bitmap, cliprect, l0, 1);
|
cps1_render_layer(bitmap, cliprect, l0, 1);
|
||||||
cps1_render_layer(machine(), bitmap, cliprect, l1, 2);
|
cps1_render_layer(bitmap, cliprect, l1, 2);
|
||||||
cps1_render_layer(machine(), bitmap, cliprect, l2, 4);
|
cps1_render_layer(bitmap, cliprect, l2, 4);
|
||||||
cps2_render_sprites(machine(), bitmap, cliprect, primasks);
|
cps2_render_sprites(bitmap, cliprect, primasks);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -2947,15 +2924,13 @@ void cps_state::screen_eof_cps1(screen_device &screen, bool state)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void cps2_set_sprite_priorities( running_machine &machine )
|
void cps_state::cps2_set_sprite_priorities()
|
||||||
{
|
{
|
||||||
cps_state *state = machine.driver_data<cps_state>();
|
m_pri_ctrl = m_output[CPS2_OBJ_PRI /2];
|
||||||
state->m_pri_ctrl = cps2_port(machine, CPS2_OBJ_PRI);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void cps2_objram_latch( running_machine &machine )
|
void cps_state::cps2_objram_latch()
|
||||||
{
|
{
|
||||||
cps_state *state = machine.driver_data<cps_state>();
|
cps2_set_sprite_priorities();
|
||||||
cps2_set_sprite_priorities(machine);
|
memcpy(m_cps2_buffered_obj, cps2_objbase(), m_cps2_obj_size);
|
||||||
memcpy(state->m_cps2_buffered_obj, cps2_objbase(machine), state->m_cps2_obj_size);
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user