diff options
Diffstat (limited to 'src/mame/video/cps1.cpp')
-rw-r--r-- | src/mame/video/cps1.cpp | 254 |
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); |