summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/video/cps1.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/video/cps1.cpp')
-rw-r--r--src/mame/video/cps1.cpp254
1 files changed, 123 insertions, 131 deletions
diff --git a/src/mame/video/cps1.cpp b/src/mame/video/cps1.cpp
index d623581d9a9..8cec2c8ee30 100644
--- a/src/mame/video/cps1.cpp
+++ b/src/mame/video/cps1.cpp
@@ -1887,7 +1887,7 @@ WRITE16_MEMBER(cps_state::cps1_cps_b_w)
}
-void cps_state::unshuffle( uint64_t *buf, int len )
+void cps2_state::unshuffle( uint64_t *buf, int len )
{
int i;
uint64_t t;
@@ -1911,7 +1911,7 @@ void cps_state::unshuffle( uint64_t *buf, int len )
}
-void cps_state::cps2_gfx_decode()
+void cps2_state::cps2_gfx_decode()
{
const int banksize = 0x200000;
int size = memregion("gfx")->bytes();
@@ -1928,13 +1928,11 @@ void cps_state::init_cps1()
m_scanline2 = 0;
m_scancalls = 0;
m_last_sprite_offset = 0;
- m_pri_ctrl = 0;
- m_objram_bank = 0;
}
-void cps_state::init_cps2_video()
+void cps2_state::init_cps2_video()
{
cps2_gfx_decode();
@@ -2243,7 +2241,7 @@ void cps_state::cps1_update_transmasks()
}
}
-VIDEO_START_MEMBER(cps_state,cps)
+void cps_state::video_start()
{
int i;
@@ -2274,20 +2272,11 @@ VIDEO_START_MEMBER(cps_state,cps)
m_buffered_obj = make_unique_clear<uint16_t[]>(m_obj_size / 2);
- if (m_cps_version == 2)
- m_cps2_buffered_obj = make_unique_clear<uint16_t[]>(m_cps2_obj_size / 2);
-
/* clear RAM regions */
memset(m_gfxram, 0, m_gfxram.bytes()); /* Clear GFX RAM */
memset(m_cps_a_regs, 0, 0x40); /* Clear CPS-A registers */
memset(m_cps_b_regs, 0, 0x40); /* Clear CPS-B registers */
- if (m_cps_version == 2)
- {
- memset(m_objram1, 0, m_cps2_obj_size);
- memset(m_objram2, 0, m_cps2_obj_size);
- }
-
/* Put in some defaults */
m_cps_a_regs[CPS1_OBJ_BASE] = 0x9200;
m_cps_a_regs[CPS1_SCROLL1_BASE] = 0x9000;
@@ -2327,29 +2316,25 @@ VIDEO_START_MEMBER(cps_state,cps)
save_item(NAME(m_stars_enabled));
#endif
save_item(NAME(m_last_sprite_offset));
- save_item(NAME(m_pri_ctrl));
- save_item(NAME(m_objram_bank));
save_pointer(NAME(m_buffered_obj.get()), m_obj_size / 2);
- if (m_cps_version == 2)
- {
- save_item(NAME(m_cps2_last_sprite_offset));
- save_pointer(NAME(m_cps2_buffered_obj.get()), m_cps2_obj_size / 2);
- }
machine().save().register_postload(save_prepost_delegate(FUNC(cps_state::cps1_get_video_base), this));
}
-VIDEO_START_MEMBER(cps_state,cps1)
+void cps2_state::video_start()
{
- m_cps_version = 1;
- VIDEO_START_CALL_MEMBER(cps);
-}
+ cps_state::video_start();
-VIDEO_START_MEMBER(cps_state,cps2)
-{
- m_cps_version = 2;
- VIDEO_START_CALL_MEMBER(cps);
+ m_cps2_buffered_obj = make_unique_clear<uint16_t[]>(m_cps2_obj_size / 2);
+
+ memset(m_objram1, 0, m_cps2_obj_size);
+ memset(m_objram2, 0, m_cps2_obj_size);
+
+ save_item(NAME(m_cps2_last_sprite_offset));
+ save_pointer(NAME(m_cps2_buffered_obj.get()), m_cps2_obj_size / 2);
+ save_item(NAME(m_pri_ctrl));
+ save_item(NAME(m_objram_bank));
}
/***************************************************************************
@@ -2437,7 +2422,7 @@ void cps_state::cps1_build_palette( const uint16_t* const palette_base )
***************************************************************************/
-void cps_state::cps1_find_last_sprite() /* Find the offset of last sprite */
+void cps_state::find_last_sprite() /* Find the offset of last sprite */
{
int offset = 0;
/* Locate the end of table marker */
@@ -2628,13 +2613,13 @@ void cps_state::cps1_render_sprites( screen_device &screen, bitmap_ind16 &bitmap
-WRITE16_MEMBER(cps_state::cps2_objram_bank_w)
+WRITE16_MEMBER(cps2_state::cps2_objram_bank_w)
{
if (ACCESSING_BITS_0_7)
m_objram_bank = data & 1;
}
-READ16_MEMBER(cps_state::cps2_objram1_r)
+READ16_MEMBER(cps2_state::cps2_objram1_r)
{
if (m_objram_bank & 1)
return m_objram2[offset];
@@ -2642,7 +2627,7 @@ READ16_MEMBER(cps_state::cps2_objram1_r)
return m_objram1[offset];
}
-READ16_MEMBER(cps_state::cps2_objram2_r)
+READ16_MEMBER(cps2_state::cps2_objram2_r)
{
if (m_objram_bank & 1)
return m_objram1[offset];
@@ -2650,7 +2635,7 @@ READ16_MEMBER(cps_state::cps2_objram2_r)
return m_objram2[offset];
}
-WRITE16_MEMBER(cps_state::cps2_objram1_w)
+WRITE16_MEMBER(cps2_state::cps2_objram1_w)
{
if (m_objram_bank & 1)
COMBINE_DATA(&m_objram2[offset]);
@@ -2658,7 +2643,7 @@ WRITE16_MEMBER(cps_state::cps2_objram1_w)
COMBINE_DATA(&m_objram1[offset]);
}
-WRITE16_MEMBER(cps_state::cps2_objram2_w)
+WRITE16_MEMBER(cps2_state::cps2_objram2_w)
{
if (m_objram_bank & 1)
COMBINE_DATA(&m_objram1[offset]);
@@ -2666,7 +2651,7 @@ WRITE16_MEMBER(cps_state::cps2_objram2_w)
COMBINE_DATA(&m_objram2[offset]);
}
-uint16_t *cps_state::cps2_objbase()
+uint16_t *cps2_state::cps2_objbase()
{
int baseptr;
baseptr = 0x7000;
@@ -2683,8 +2668,10 @@ uint16_t *cps_state::cps2_objbase()
}
-void cps_state::cps2_find_last_sprite() /* Find the offset of last sprite */
+void cps2_state::find_last_sprite() /* Find the offset of last sprite */
{
+ cps_state::find_last_sprite();
+
int offset = 0;
uint16_t *base = m_cps2_buffered_obj.get();
@@ -2704,7 +2691,7 @@ void cps_state::cps2_find_last_sprite() /* Find the offset of last sprite */
m_cps2_last_sprite_offset = m_cps2_obj_size / 2 - 4;
}
-void cps_state::cps2_render_sprites( screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int *primasks )
+void cps2_state::cps2_render_sprites( screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int *primasks )
{
#define DRAWSPRITE(CODE,COLOR,FLIPX,FLIPY,SX,SY) \
{ \
@@ -2954,23 +2941,110 @@ void cps_state::cps1_render_high_layer( screen_device &screen, bitmap_ind16 &bit
***************************************************************************/
+void cps_state::render_layers(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+{
+ /* Draw layers (0 = sprites, 1-3 = tilemaps) */
+ int layercontrol = m_cps_b_regs[m_game_config->layer_control / 2];
+ int l0 = (layercontrol >> 0x06) & 03;
+ int l1 = (layercontrol >> 0x08) & 03;
+ int l2 = (layercontrol >> 0x0a) & 03;
+ int l3 = (layercontrol >> 0x0c) & 03;
+ screen.priority().fill(0, cliprect);
+
+ if (BIT(m_game_config->bootleg_kludge, 7))
+ cps1_build_palette(cps1_base(CPS1_PALETTE_BASE, m_palette_align));
+
+ cps1_render_layer(screen, bitmap, cliprect, l0, 0);
+
+ if (l1 == 0)
+ cps1_render_high_layer(screen, bitmap, cliprect, l0); /* prepare mask for sprites */
+
+ cps1_render_layer(screen, bitmap, cliprect, l1, 0);
+
+ if (l2 == 0)
+ cps1_render_high_layer(screen, bitmap, cliprect, l1); /* prepare mask for sprites */
+
+ cps1_render_layer(screen, bitmap, cliprect, l2, 0);
+
+ if (l3 == 0)
+ cps1_render_high_layer(screen, bitmap, cliprect, l2); /* prepare mask for sprites */
+
+ cps1_render_layer(screen, bitmap, cliprect, l3, 0);
+}
+
+void cps2_state::render_layers(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+{
+ /* Draw layers (0 = sprites, 1-3 = tilemaps) */
+ int layercontrol = m_cps_b_regs[m_game_config->layer_control / 2];
+ int l0 = (layercontrol >> 0x06) & 03;
+ int l1 = (layercontrol >> 0x08) & 03;
+ int l2 = (layercontrol >> 0x0a) & 03;
+ int l3 = (layercontrol >> 0x0c) & 03;
+ screen.priority().fill(0, cliprect);
+
+ int primasks[8], i;
+ int l0pri = (m_pri_ctrl >> 4 * l0) & 0x0f;
+ int l1pri = (m_pri_ctrl >> 4 * l1) & 0x0f;
+ int l2pri = (m_pri_ctrl >> 4 * l2) & 0x0f;
+ int l3pri = (m_pri_ctrl >> 4 * l3) & 0x0f;
+
+#if 0
+if ( (m_output[CPS2_OBJ_BASE /2] != 0x7080 && m_output[CPS2_OBJ_BASE /2] != 0x7000) ||
+ m_output[CPS2_OBJ_UK1 /2] != 0x807d ||
+ (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",
+ m_output[CPS2_OBJ_BASE /2],
+ m_output[CPS2_OBJ_UK1 /2],
+ m_output[CPS2_OBJ_UK2 /2]);
+
+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);
+#endif
+
+ /* take out the CPS1 sprites layer */
+ if (l0 == 0) { l0 = l1; l1 = 0; l0pri = l1pri; }
+ if (l1 == 0) { l1 = l2; l2 = 0; l1pri = l2pri; }
+ if (l2 == 0) { l2 = l3; l3 = 0; l2pri = l3pri; }
+
+ {
+ int mask0 = 0xaa;
+ int mask1 = 0xcc;
+ if (l0pri > l1pri) mask0 &= ~0x88;
+ if (l0pri > l2pri) mask0 &= ~0xa0;
+ if (l1pri > l2pri) mask1 &= ~0xc0;
+
+ primasks[0] = 0xff;
+ for (i = 1; i < 8; i++)
+ {
+ if (i <= l0pri && i <= l1pri && i <= l2pri)
+ {
+ primasks[i] = 0xfe;
+ continue;
+ }
+ primasks[i] = 0;
+ if (i <= l0pri) primasks[i] |= mask0;
+ if (i <= l1pri) primasks[i] |= mask1;
+ if (i <= l2pri) primasks[i] |= 0xf0;
+ }
+ }
+
+ cps1_render_layer(screen, bitmap, cliprect, l0, 1);
+ cps1_render_layer(screen, bitmap, cliprect, l1, 2);
+ cps1_render_layer(screen, bitmap, cliprect, l2, 4);
+ cps2_render_sprites(screen, bitmap, cliprect, primasks);
+}
+
uint32_t cps_state::screen_update_cps1(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
- int layercontrol, l0, l1, l2, l3;
int videocontrol = m_cps_a_regs[CPS1_VIDEOCONTROL];
flip_screen_set(videocontrol & 0x8000);
- layercontrol = m_cps_b_regs[m_game_config->layer_control / 2];
-
/* Get video memory base registers */
cps1_get_video_base();
/* Find the offset of the last sprite in the sprite table */
- cps1_find_last_sprite();
-
- if (m_cps_version == 2)
- cps2_find_last_sprite();
+ find_last_sprite();
cps1_update_transmasks();
@@ -3020,89 +3094,7 @@ uint32_t cps_state::screen_update_cps1(screen_device &screen, bitmap_ind16 &bitm
cps1_render_stars(screen, bitmap, cliprect);
}
- /* Draw layers (0 = sprites, 1-3 = tilemaps) */
- l0 = (layercontrol >> 0x06) & 03;
- l1 = (layercontrol >> 0x08) & 03;
- l2 = (layercontrol >> 0x0a) & 03;
- l3 = (layercontrol >> 0x0c) & 03;
- screen.priority().fill(0, cliprect);
-
- if (m_cps_version == 1)
- {
- if (BIT(m_game_config->bootleg_kludge, 7))
- cps1_build_palette(cps1_base(CPS1_PALETTE_BASE, m_palette_align));
-
- cps1_render_layer(screen, bitmap, cliprect, l0, 0);
-
- if (l1 == 0)
- cps1_render_high_layer(screen, bitmap, cliprect, l0); /* prepare mask for sprites */
-
- cps1_render_layer(screen, bitmap, cliprect, l1, 0);
-
- if (l2 == 0)
- cps1_render_high_layer(screen, bitmap, cliprect, l1); /* prepare mask for sprites */
-
- cps1_render_layer(screen, bitmap, cliprect, l2, 0);
-
- if (l3 == 0)
- cps1_render_high_layer(screen, bitmap, cliprect, l2); /* prepare mask for sprites */
-
- cps1_render_layer(screen, bitmap, cliprect, l3, 0);
- }
- else
- {
- int l0pri, l1pri, l2pri, l3pri;
- int primasks[8], i;
- l0pri = (m_pri_ctrl >> 4 * l0) & 0x0f;
- l1pri = (m_pri_ctrl >> 4 * l1) & 0x0f;
- l2pri = (m_pri_ctrl >> 4 * l2) & 0x0f;
- l3pri = (m_pri_ctrl >> 4 * l3) & 0x0f;
-
-#if 0
-if ( (m_output[CPS2_OBJ_BASE /2] != 0x7080 && m_output[CPS2_OBJ_BASE /2] != 0x7000) ||
- m_output[CPS2_OBJ_UK1 /2] != 0x807d ||
- (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",
- m_output[CPS2_OBJ_BASE /2],
- m_output[CPS2_OBJ_UK1 /2],
- m_output[CPS2_OBJ_UK2 /2]);
-
-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);
-#endif
-
- /* take out the CPS1 sprites layer */
- if (l0 == 0) { l0 = l1; l1 = 0; l0pri = l1pri; }
- if (l1 == 0) { l1 = l2; l2 = 0; l1pri = l2pri; }
- if (l2 == 0) { l2 = l3; l3 = 0; l2pri = l3pri; }
-
- {
- int mask0 = 0xaa;
- int mask1 = 0xcc;
- if (l0pri > l1pri) mask0 &= ~0x88;
- if (l0pri > l2pri) mask0 &= ~0xa0;
- if (l1pri > l2pri) mask1 &= ~0xc0;
-
- primasks[0] = 0xff;
- for (i = 1; i < 8; i++)
- {
- if (i <= l0pri && i <= l1pri && i <= l2pri)
- {
- primasks[i] = 0xfe;
- continue;
- }
- primasks[i] = 0;
- if (i <= l0pri) primasks[i] |= mask0;
- if (i <= l1pri) primasks[i] |= mask1;
- if (i <= l2pri) primasks[i] |= 0xf0;
- }
- }
-
- cps1_render_layer(screen, bitmap, cliprect, l0, 1);
- cps1_render_layer(screen, bitmap, cliprect, l1, 2);
- cps1_render_layer(screen, bitmap, cliprect, l2, 4);
- cps2_render_sprites(screen, bitmap, cliprect, primasks);
- }
+ render_layers(screen, bitmap, cliprect);
return 0;
}
@@ -3123,12 +3115,12 @@ WRITE_LINE_MEMBER(cps_state::screen_vblank_cps1)
}
}
-void cps_state::cps2_set_sprite_priorities()
+void cps2_state::cps2_set_sprite_priorities()
{
m_pri_ctrl = m_output[CPS2_OBJ_PRI /2];
}
-void cps_state::cps2_objram_latch()
+void cps2_state::cps2_objram_latch()
{
cps2_set_sprite_priorities();
memcpy(m_cps2_buffered_obj.get(), cps2_objbase(), m_cps2_obj_size);