trunk/src/mame/video/cps1.c
| r20722 | r20723 | |
| 1493 | 1493 | #define CPS2_OBJ_YOFFS 0x0a /* Y offset (always 0x0010) */ |
| 1494 | 1494 | |
| 1495 | 1495 | |
| 1496 | | static void cps1_build_palette(running_machine &machine, const UINT16* const palette_base); |
| 1497 | | |
| 1498 | | |
| 1499 | 1496 | MACHINE_RESET_MEMBER(cps_state,cps) |
| 1500 | 1497 | { |
| 1501 | 1498 | const char *gamename = machine().system().name; |
| r20722 | r20723 | |
| 1581 | 1578 | fixes glitches in the ghouls intro, but it might happen at next vblank. |
| 1582 | 1579 | */ |
| 1583 | 1580 | if (offset == CPS1_PALETTE_BASE) |
| 1584 | | cps1_build_palette(machine(), cps1_base(machine(), CPS1_PALETTE_BASE, m_palette_align)); |
| 1581 | cps1_build_palette(cps1_base(machine(), CPS1_PALETTE_BASE, m_palette_align)); |
| 1585 | 1582 | |
| 1586 | 1583 | // pzloop2 write to register 24 on startup. This is probably just a bug. |
| 1587 | 1584 | if (offset == 0x24 / 2 && m_cps_version == 2) |
| r20722 | r20723 | |
| 1702 | 1699 | |
| 1703 | 1700 | |
| 1704 | 1701 | |
| 1705 | | INLINE int cps2_port( running_machine &machine, int offset ) |
| 1702 | void cps_state::cps1_gfx_decode() |
| 1706 | 1703 | { |
| 1707 | | cps_state *state = machine.driver_data<cps_state>(); |
| 1708 | | return state->m_output[offset / 2]; |
| 1709 | | } |
| 1710 | | |
| 1711 | | |
| 1712 | | static void cps1_gfx_decode( running_machine &machine ) |
| 1713 | | { |
| 1714 | | int size = machine.root_device().memregion("gfx")->bytes(); |
| 1704 | int size = memregion("gfx")->bytes(); |
| 1715 | 1705 | int i, j, gfxsize; |
| 1716 | | UINT8 *cps1_gfx = machine.root_device().memregion("gfx")->base(); |
| 1706 | UINT8 *cps1_gfx = memregion("gfx")->base(); |
| 1717 | 1707 | |
| 1718 | 1708 | gfxsize = size / 4; |
| 1719 | 1709 | |
| r20722 | r20723 | |
| 1741 | 1731 | } |
| 1742 | 1732 | } |
| 1743 | 1733 | |
| 1744 | | static void unshuffle( UINT64 *buf, int len ) |
| 1734 | void cps_state::unshuffle( UINT64 *buf, int len ) |
| 1745 | 1735 | { |
| 1746 | 1736 | int i; |
| 1747 | 1737 | UINT64 t; |
| r20722 | r20723 | |
| 1764 | 1754 | } |
| 1765 | 1755 | } |
| 1766 | 1756 | |
| 1767 | | static void cps2_gfx_decode( running_machine &machine ) |
| 1757 | void cps_state::cps2_gfx_decode() |
| 1768 | 1758 | { |
| 1769 | 1759 | const int banksize = 0x200000; |
| 1770 | | int size = machine.root_device().memregion("gfx")->bytes(); |
| 1760 | int size = memregion("gfx")->bytes(); |
| 1771 | 1761 | int i; |
| 1772 | 1762 | |
| 1773 | 1763 | for (i = 0; i < size; i += banksize) |
| 1774 | | unshuffle((UINT64 *)(machine.root_device().memregion("gfx")->base() + i), banksize / 8); |
| 1764 | unshuffle((UINT64 *)(memregion("gfx")->base() + i), banksize / 8); |
| 1775 | 1765 | |
| 1776 | | cps1_gfx_decode(machine); |
| 1766 | cps1_gfx_decode(); |
| 1777 | 1767 | } |
| 1778 | 1768 | |
| 1779 | 1769 | |
| 1780 | 1770 | DRIVER_INIT_MEMBER(cps_state,cps1) |
| 1781 | 1771 | { |
| 1782 | | cps1_gfx_decode(machine()); |
| 1772 | cps1_gfx_decode(); |
| 1783 | 1773 | |
| 1784 | 1774 | m_scanline1 = 0; |
| 1785 | 1775 | m_scanline2 = 0; |
| r20722 | r20723 | |
| 1793 | 1783 | |
| 1794 | 1784 | DRIVER_INIT_MEMBER(cps_state,cps2_video) |
| 1795 | 1785 | { |
| 1796 | | cps2_gfx_decode(machine()); |
| 1786 | cps2_gfx_decode(); |
| 1797 | 1787 | |
| 1798 | 1788 | m_scanline1 = 262; |
| 1799 | 1789 | m_scanline2 = 262; |
| r20722 | r20723 | |
| 1914 | 1904 | |
| 1915 | 1905 | |
| 1916 | 1906 | |
| 1917 | | static int gfxrom_bank_mapper( running_machine &machine, int type, int code ) |
| 1907 | int cps_state::gfxrom_bank_mapper( int type, int code ) |
| 1918 | 1908 | { |
| 1919 | | cps_state *state = machine.driver_data<cps_state>(); |
| 1920 | | const struct gfx_range *range = state->m_game_config->bank_mapper; |
| 1909 | const struct gfx_range *range = m_game_config->bank_mapper; |
| 1921 | 1910 | int shift = 0; |
| 1922 | 1911 | |
| 1923 | 1912 | assert(range); |
| r20722 | r20723 | |
| 1942 | 1931 | int i; |
| 1943 | 1932 | |
| 1944 | 1933 | for (i = 0; i < range->bank; ++i) |
| 1945 | | base += state->m_game_config->bank_sizes[i]; |
| 1934 | base += m_game_config->bank_sizes[i]; |
| 1946 | 1935 | |
| 1947 | | return (base + (code & (state->m_game_config->bank_sizes[range->bank] - 1))) >> shift; |
| 1936 | return (base + (code & (m_game_config->bank_sizes[range->bank] - 1))) >> shift; |
| 1948 | 1937 | } |
| 1949 | 1938 | } |
| 1950 | 1939 | |
| r20722 | r20723 | |
| 1989 | 1978 | int attr = m_scroll1[2 * tile_index + 1]; |
| 1990 | 1979 | int gfxset; |
| 1991 | 1980 | |
| 1992 | | code = gfxrom_bank_mapper(machine(), GFXTYPE_SCROLL1, code); |
| 1981 | code = gfxrom_bank_mapper(GFXTYPE_SCROLL1, code); |
| 1993 | 1982 | |
| 1994 | 1983 | /* allows us to reproduce a problem seen with a ffight board where USA and Japanese |
| 1995 | 1984 | roms have been mixed to be reproduced (ffightub) -- it looks like each column |
| r20722 | r20723 | |
| 2014 | 2003 | int code = m_scroll2[2 * tile_index]; |
| 2015 | 2004 | int attr = m_scroll2[2 * tile_index + 1]; |
| 2016 | 2005 | |
| 2017 | | code = gfxrom_bank_mapper(machine(), GFXTYPE_SCROLL2, code); |
| 2006 | code = gfxrom_bank_mapper(GFXTYPE_SCROLL2, code); |
| 2018 | 2007 | |
| 2019 | 2008 | SET_TILE_INFO_MEMBER( |
| 2020 | 2009 | 2, |
| r20722 | r20723 | |
| 2033 | 2022 | int code = m_scroll3[2 * tile_index] & 0x3fff; |
| 2034 | 2023 | int attr = m_scroll3[2 * tile_index + 1]; |
| 2035 | 2024 | |
| 2036 | | code = gfxrom_bank_mapper(machine(), GFXTYPE_SCROLL3, code); |
| 2025 | code = gfxrom_bank_mapper(GFXTYPE_SCROLL3, code); |
| 2037 | 2026 | |
| 2038 | 2027 | SET_TILE_INFO_MEMBER( |
| 2039 | 2028 | 3, |
| r20722 | r20723 | |
| 2050 | 2039 | |
| 2051 | 2040 | |
| 2052 | 2041 | |
| 2053 | | static void cps1_update_transmasks( running_machine &machine ) |
| 2042 | void cps_state::cps1_update_transmasks() |
| 2054 | 2043 | { |
| 2055 | | cps_state *state = machine.driver_data<cps_state>(); |
| 2056 | 2044 | int i; |
| 2057 | 2045 | |
| 2058 | 2046 | for (i = 0; i < 4; i++) |
| r20722 | r20723 | |
| 2060 | 2048 | int mask; |
| 2061 | 2049 | |
| 2062 | 2050 | /* Get transparency registers */ |
| 2063 | | if (state->m_game_config->priority[i] != -1) |
| 2064 | | mask = state->m_cps_b_regs[state->m_game_config->priority[i] / 2] ^ 0xffff; |
| 2051 | if (m_game_config->priority[i] != -1) |
| 2052 | mask = m_cps_b_regs[m_game_config->priority[i] / 2] ^ 0xffff; |
| 2065 | 2053 | else |
| 2066 | 2054 | mask = 0xffff; /* completely transparent if priority masks not defined (qad) */ |
| 2067 | 2055 | |
| 2068 | | state->m_bg_tilemap[0]->set_transmask(i, mask, 0x8000); |
| 2069 | | state->m_bg_tilemap[1]->set_transmask(i, mask, 0x8000); |
| 2070 | | state->m_bg_tilemap[2]->set_transmask(i, mask, 0x8000); |
| 2056 | m_bg_tilemap[0]->set_transmask(i, mask, 0x8000); |
| 2057 | m_bg_tilemap[1]->set_transmask(i, mask, 0x8000); |
| 2058 | m_bg_tilemap[2]->set_transmask(i, mask, 0x8000); |
| 2071 | 2059 | } |
| 2072 | 2060 | } |
| 2073 | 2061 | |
| r20722 | r20723 | |
| 2095 | 2083 | memset(m_empty_tile, 0x0f, sizeof(m_empty_tile)); |
| 2096 | 2084 | |
| 2097 | 2085 | /* front masks will change at runtime to handle sprite occluding */ |
| 2098 | | cps1_update_transmasks(machine()); |
| 2086 | cps1_update_transmasks(); |
| 2099 | 2087 | |
| 2100 | 2088 | for (i = 0; i < cps1_palette_entries * 16; i++) |
| 2101 | 2089 | palette_set_color(machine(), i, MAKE_RGB(0,0,0)); |
| r20722 | r20723 | |
| 2188 | 2176 | |
| 2189 | 2177 | ***************************************************************************/ |
| 2190 | 2178 | |
| 2191 | | static void cps1_build_palette( running_machine &machine, const UINT16* const palette_base ) |
| 2179 | void cps_state::cps1_build_palette( const UINT16* const palette_base ) |
| 2192 | 2180 | { |
| 2193 | | cps_state *state = machine.driver_data<cps_state>(); |
| 2194 | 2181 | int offset, page; |
| 2195 | 2182 | const UINT16 *palette_ram = palette_base; |
| 2196 | | int ctrl = state->m_cps_b_regs[state->m_game_config->palette_control/2]; |
| 2183 | int ctrl = m_cps_b_regs[m_game_config->palette_control/2]; |
| 2197 | 2184 | |
| 2198 | 2185 | /* |
| 2199 | 2186 | The palette is copied only for pages that are enabled in the ctrl |
| r20722 | r20723 | |
| 2218 | 2205 | g = ((palette >> 4) & 0x0f) * 0x11 * bright / 0x2d; |
| 2219 | 2206 | b = ((palette >> 0) & 0x0f) * 0x11 * bright / 0x2d; |
| 2220 | 2207 | |
| 2221 | | palette_set_color (machine, 0x200 * page + offset, MAKE_RGB(r, g, b)); |
| 2208 | palette_set_color (machine(), 0x200 * page + offset, MAKE_RGB(r, g, b)); |
| 2222 | 2209 | } |
| 2223 | 2210 | } |
| 2224 | 2211 | else |
| r20722 | r20723 | |
| 2266 | 2253 | |
| 2267 | 2254 | ***************************************************************************/ |
| 2268 | 2255 | |
| 2269 | | static void cps1_find_last_sprite( running_machine &machine ) /* Find the offset of last sprite */ |
| 2256 | void cps_state::cps1_find_last_sprite() /* Find the offset of last sprite */ |
| 2270 | 2257 | { |
| 2271 | | cps_state *state = machine.driver_data<cps_state>(); |
| 2272 | 2258 | int offset = 0; |
| 2273 | 2259 | /* Locate the end of table marker */ |
| 2274 | | while (offset < state->m_obj_size / 2) |
| 2260 | while (offset < m_obj_size / 2) |
| 2275 | 2261 | { |
| 2276 | | int colour = state->m_buffered_obj[offset + 3]; |
| 2262 | int colour = m_buffered_obj[offset + 3]; |
| 2277 | 2263 | if ((colour & 0xff00) == 0xff00) |
| 2278 | 2264 | { |
| 2279 | 2265 | /* Marker found. This is the last sprite. */ |
| 2280 | | state->m_last_sprite_offset = offset - 4; |
| 2266 | m_last_sprite_offset = offset - 4; |
| 2281 | 2267 | return; |
| 2282 | 2268 | } |
| 2283 | 2269 | |
| 2284 | 2270 | offset += 4; |
| 2285 | 2271 | } |
| 2286 | 2272 | /* Sprites must use full sprite RAM */ |
| 2287 | | state->m_last_sprite_offset = state->m_obj_size / 2 - 4; |
| 2273 | m_last_sprite_offset = m_obj_size / 2 - 4; |
| 2288 | 2274 | } |
| 2289 | 2275 | |
| 2290 | 2276 | |
| 2291 | | static void cps1_render_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect ) |
| 2277 | void cps_state::cps1_render_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect ) |
| 2292 | 2278 | { |
| 2293 | | cps_state *state = machine.driver_data<cps_state>(); |
| 2294 | 2279 | |
| 2295 | 2280 | #define DRAWSPRITE(CODE,COLOR,FLIPX,FLIPY,SX,SY) \ |
| 2296 | 2281 | { \ |
| 2297 | | if (state->flip_screen()) \ |
| 2282 | if (flip_screen()) \ |
| 2298 | 2283 | pdrawgfx_transpen(bitmap,\ |
| 2299 | | cliprect,machine.gfx[2], \ |
| 2284 | cliprect,machine().gfx[2], \ |
| 2300 | 2285 | CODE, \ |
| 2301 | 2286 | COLOR, \ |
| 2302 | 2287 | !(FLIPX),!(FLIPY), \ |
| 2303 | | 511-16-(SX),255-16-(SY), machine.priority_bitmap,0x02,15); \ |
| 2288 | 511-16-(SX),255-16-(SY), machine().priority_bitmap,0x02,15); \ |
| 2304 | 2289 | else \ |
| 2305 | 2290 | pdrawgfx_transpen(bitmap,\ |
| 2306 | | cliprect,machine.gfx[2], \ |
| 2291 | cliprect,machine().gfx[2], \ |
| 2307 | 2292 | CODE, \ |
| 2308 | 2293 | COLOR, \ |
| 2309 | 2294 | FLIPX,FLIPY, \ |
| 2310 | | SX,SY, machine.priority_bitmap,0x02,15); \ |
| 2295 | SX,SY, machine().priority_bitmap,0x02,15); \ |
| 2311 | 2296 | } |
| 2312 | 2297 | |
| 2313 | 2298 | |
| 2314 | 2299 | int i, baseadd; |
| 2315 | | UINT16 *base = state->m_buffered_obj; |
| 2300 | UINT16 *base = m_buffered_obj; |
| 2316 | 2301 | |
| 2317 | 2302 | /* some sf2 hacks draw the sprites in reverse order */ |
| 2318 | | if (state->m_game_config->bootleg_kludge == 1) |
| 2303 | if (m_game_config->bootleg_kludge == 1) |
| 2319 | 2304 | { |
| 2320 | | base += state->m_last_sprite_offset; |
| 2305 | base += m_last_sprite_offset; |
| 2321 | 2306 | baseadd = -4; |
| 2322 | 2307 | } |
| 2323 | 2308 | else |
| r20722 | r20723 | |
| 2325 | 2310 | baseadd = 4; |
| 2326 | 2311 | } |
| 2327 | 2312 | |
| 2328 | | for (i = state->m_last_sprite_offset; i >= 0; i -= 4) |
| 2313 | for (i = m_last_sprite_offset; i >= 0; i -= 4) |
| 2329 | 2314 | { |
| 2330 | 2315 | int x = *(base + 0); |
| 2331 | 2316 | int y = *(base + 1); |
| r20722 | r20723 | |
| 2336 | 2321 | // x -= 0x20; |
| 2337 | 2322 | // y += 0x20; |
| 2338 | 2323 | |
| 2339 | | code = gfxrom_bank_mapper(machine, GFXTYPE_SPRITES, code); |
| 2324 | code = gfxrom_bank_mapper(GFXTYPE_SPRITES, code); |
| 2340 | 2325 | |
| 2341 | 2326 | if (code != -1) |
| 2342 | 2327 | { |
| r20722 | r20723 | |
| 2485 | 2470 | COMBINE_DATA(&m_objram2[offset]); |
| 2486 | 2471 | } |
| 2487 | 2472 | |
| 2488 | | static UINT16 *cps2_objbase( running_machine &machine ) |
| 2473 | UINT16 *cps_state::cps2_objbase() |
| 2489 | 2474 | { |
| 2490 | | cps_state *state = machine.driver_data<cps_state>(); |
| 2491 | 2475 | int baseptr; |
| 2492 | 2476 | baseptr = 0x7000; |
| 2493 | 2477 | |
| 2494 | | if (state->m_objram_bank & 1) |
| 2478 | if (m_objram_bank & 1) |
| 2495 | 2479 | baseptr ^= 0x0080; |
| 2496 | 2480 | |
| 2497 | 2481 | //popmessage("%04x %d", cps2_port(machine, CPS2_OBJ_BASE), state->m_objram_bank & 1); |
| 2498 | 2482 | |
| 2499 | 2483 | if (baseptr == 0x7000) |
| 2500 | | return state->m_objram1; |
| 2484 | return m_objram1; |
| 2501 | 2485 | else //if (baseptr == 0x7080) |
| 2502 | | return state->m_objram2; |
| 2486 | return m_objram2; |
| 2503 | 2487 | } |
| 2504 | 2488 | |
| 2505 | 2489 | |
| 2506 | | static void cps2_find_last_sprite( running_machine &machine ) /* Find the offset of last sprite */ |
| 2490 | void cps_state::cps2_find_last_sprite() /* Find the offset of last sprite */ |
| 2507 | 2491 | { |
| 2508 | | cps_state *state = machine.driver_data<cps_state>(); |
| 2509 | 2492 | int offset = 0; |
| 2510 | | UINT16 *base = state->m_cps2_buffered_obj; |
| 2493 | UINT16 *base = m_cps2_buffered_obj; |
| 2511 | 2494 | |
| 2512 | 2495 | /* Locate the end of table marker */ |
| 2513 | | while (offset < state->m_cps2_obj_size / 2) |
| 2496 | while (offset < m_cps2_obj_size / 2) |
| 2514 | 2497 | { |
| 2515 | 2498 | if (base[offset + 1] >= 0x8000 || base[offset + 3] >= 0xff00) |
| 2516 | 2499 | { |
| 2517 | 2500 | /* Marker found. This is the last sprite. */ |
| 2518 | | state->m_cps2_last_sprite_offset = offset - 4; |
| 2501 | m_cps2_last_sprite_offset = offset - 4; |
| 2519 | 2502 | return; |
| 2520 | 2503 | } |
| 2521 | 2504 | |
| 2522 | 2505 | offset += 4; |
| 2523 | 2506 | } |
| 2524 | 2507 | /* Sprites must use full sprite RAM */ |
| 2525 | | state->m_cps2_last_sprite_offset = state->m_cps2_obj_size / 2 - 4; |
| 2508 | m_cps2_last_sprite_offset = m_cps2_obj_size / 2 - 4; |
| 2526 | 2509 | } |
| 2527 | 2510 | |
| 2528 | | static void cps2_render_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int *primasks ) |
| 2511 | void cps_state::cps2_render_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect, int *primasks ) |
| 2529 | 2512 | { |
| 2530 | | cps_state *state = machine.driver_data<cps_state>(); |
| 2531 | 2513 | |
| 2532 | 2514 | #define DRAWSPRITE(CODE,COLOR,FLIPX,FLIPY,SX,SY) \ |
| 2533 | 2515 | { \ |
| 2534 | | if (state->flip_screen()) \ |
| 2516 | if (flip_screen()) \ |
| 2535 | 2517 | pdrawgfx_transpen(bitmap,\ |
| 2536 | | cliprect,machine.gfx[2], \ |
| 2518 | cliprect,machine().gfx[2], \ |
| 2537 | 2519 | CODE, \ |
| 2538 | 2520 | COLOR, \ |
| 2539 | 2521 | !(FLIPX),!(FLIPY), \ |
| 2540 | | 511-16-(SX),255-16-(SY), machine.priority_bitmap,primasks[priority],15); \ |
| 2522 | 511-16-(SX),255-16-(SY), machine().priority_bitmap,primasks[priority],15); \ |
| 2541 | 2523 | else \ |
| 2542 | 2524 | pdrawgfx_transpen(bitmap,\ |
| 2543 | | cliprect,machine.gfx[2], \ |
| 2525 | cliprect,machine().gfx[2], \ |
| 2544 | 2526 | CODE, \ |
| 2545 | 2527 | COLOR, \ |
| 2546 | 2528 | FLIPX,FLIPY, \ |
| 2547 | | SX,SY, machine.priority_bitmap,primasks[priority],15); \ |
| 2529 | SX,SY, machine().priority_bitmap,primasks[priority],15); \ |
| 2548 | 2530 | } |
| 2549 | 2531 | |
| 2550 | 2532 | int i; |
| 2551 | | UINT16 *base = state->m_cps2_buffered_obj; |
| 2552 | | int xoffs = 64 - cps2_port(machine, CPS2_OBJ_XOFFS); |
| 2553 | | int yoffs = 16 - cps2_port(machine, CPS2_OBJ_YOFFS); |
| 2533 | UINT16 *base = m_cps2_buffered_obj; |
| 2534 | int xoffs = 64 - m_output[CPS2_OBJ_XOFFS /2]; |
| 2535 | int yoffs = 16 - m_output[CPS2_OBJ_YOFFS /2]; |
| 2554 | 2536 | |
| 2555 | 2537 | #ifdef MAME_DEBUG |
| 2556 | | if (machine.input().code_pressed(KEYCODE_Z) && machine.input().code_pressed(KEYCODE_R)) |
| 2538 | if (machine().input().code_pressed(KEYCODE_Z) && machine().input().code_pressed(KEYCODE_R)) |
| 2557 | 2539 | { |
| 2558 | 2540 | return; |
| 2559 | 2541 | } |
| 2560 | 2542 | #endif |
| 2561 | 2543 | |
| 2562 | | for (i = state->m_cps2_last_sprite_offset; i >= 0; i -= 4) |
| 2544 | for (i = m_cps2_last_sprite_offset; i >= 0; i -= 4) |
| 2563 | 2545 | { |
| 2564 | 2546 | int x = base[i + 0]; |
| 2565 | 2547 | int y = base[i + 1]; |
| r20722 | r20723 | |
| 2570 | 2552 | |
| 2571 | 2553 | if (colour & 0x80) |
| 2572 | 2554 | { |
| 2573 | | x += cps2_port(machine, CPS2_OBJ_XOFFS); /* fix the offset of some games */ |
| 2574 | | y += cps2_port(machine, CPS2_OBJ_YOFFS); /* like Marvel vs. Capcom ending credits */ |
| 2555 | x += m_output[CPS2_OBJ_XOFFS /2]; /* fix the offset of some games */ |
| 2556 | y += m_output[CPS2_OBJ_YOFFS /2]; /* like Marvel vs. Capcom ending credits */ |
| 2575 | 2557 | } |
| 2576 | 2558 | |
| 2577 | 2559 | if (colour & 0xff00) |
| r20722 | r20723 | |
| 2674 | 2656 | |
| 2675 | 2657 | |
| 2676 | 2658 | |
| 2677 | | static void cps1_render_stars( screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect ) |
| 2659 | void cps_state::cps1_render_stars( screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect ) |
| 2678 | 2660 | { |
| 2679 | | cps_state *state = screen.machine().driver_data<cps_state>(); |
| 2680 | 2661 | int offs; |
| 2681 | | UINT8 *stars_rom = state->memregion("stars")->base(); |
| 2662 | UINT8 *stars_rom = memregion("stars")->base(); |
| 2682 | 2663 | |
| 2683 | | if (!stars_rom && (state->m_stars_enabled[0] || state->m_stars_enabled[1])) |
| 2664 | if (!stars_rom && (m_stars_enabled[0] || m_stars_enabled[1])) |
| 2684 | 2665 | { |
| 2685 | 2666 | #ifdef MAME_DEBUG |
| 2686 | 2667 | // popmessage("stars enabled but no stars ROM"); |
| r20722 | r20723 | |
| 2688 | 2669 | return; |
| 2689 | 2670 | } |
| 2690 | 2671 | |
| 2691 | | if (state->m_stars_enabled[0]) |
| 2672 | if (m_stars_enabled[0]) |
| 2692 | 2673 | { |
| 2693 | | for (offs = 0; offs < state->m_stars_rom_size / 2; offs++) |
| 2674 | for (offs = 0; offs < m_stars_rom_size / 2; offs++) |
| 2694 | 2675 | { |
| 2695 | 2676 | int col = stars_rom[8 * offs + 4]; |
| 2696 | 2677 | if (col != 0x0f) |
| 2697 | 2678 | { |
| 2698 | 2679 | int sx = (offs / 256) * 32; |
| 2699 | 2680 | int sy = (offs % 256); |
| 2700 | | sx = (sx - state->m_stars2x + (col & 0x1f)) & 0x1ff; |
| 2701 | | sy = (sy - state->m_stars2y) & 0xff; |
| 2702 | | if (state->flip_screen()) |
| 2681 | sx = (sx - m_stars2x + (col & 0x1f)) & 0x1ff; |
| 2682 | sy = (sy - m_stars2y) & 0xff; |
| 2683 | if (flip_screen()) |
| 2703 | 2684 | { |
| 2704 | 2685 | sx = 511 - sx; |
| 2705 | 2686 | sy = 255 - sy; |
| r20722 | r20723 | |
| 2713 | 2694 | } |
| 2714 | 2695 | } |
| 2715 | 2696 | |
| 2716 | | if (state->m_stars_enabled[1]) |
| 2697 | if (m_stars_enabled[1]) |
| 2717 | 2698 | { |
| 2718 | | for (offs = 0; offs < state->m_stars_rom_size / 2; offs++) |
| 2699 | for (offs = 0; offs < m_stars_rom_size / 2; offs++) |
| 2719 | 2700 | { |
| 2720 | 2701 | int col = stars_rom[8*offs]; |
| 2721 | 2702 | if (col != 0x0f) |
| 2722 | 2703 | { |
| 2723 | 2704 | int sx = (offs / 256) * 32; |
| 2724 | 2705 | int sy = (offs % 256); |
| 2725 | | sx = (sx - state->m_stars1x + (col & 0x1f)) & 0x1ff; |
| 2726 | | sy = (sy - state->m_stars1y) & 0xff; |
| 2727 | | if (state->flip_screen()) |
| 2706 | sx = (sx - m_stars1x + (col & 0x1f)) & 0x1ff; |
| 2707 | sy = (sy - m_stars1y) & 0xff; |
| 2708 | if (flip_screen()) |
| 2728 | 2709 | { |
| 2729 | 2710 | sx = 511 - sx; |
| 2730 | 2711 | sy = 255 - sy; |
| r20722 | r20723 | |
| 2740 | 2721 | } |
| 2741 | 2722 | |
| 2742 | 2723 | |
| 2743 | | static void cps1_render_layer( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int layer, int primask ) |
| 2724 | void cps_state::cps1_render_layer( bitmap_ind16 &bitmap, const rectangle &cliprect, int layer, int primask ) |
| 2744 | 2725 | { |
| 2745 | | cps_state *state = machine.driver_data<cps_state>(); |
| 2746 | 2726 | switch (layer) |
| 2747 | 2727 | { |
| 2748 | 2728 | case 0: |
| 2749 | | cps1_render_sprites(machine, bitmap, cliprect); |
| 2729 | cps1_render_sprites(bitmap, cliprect); |
| 2750 | 2730 | break; |
| 2751 | 2731 | case 1: |
| 2752 | 2732 | case 2: |
| 2753 | 2733 | case 3: |
| 2754 | | state->m_bg_tilemap[layer - 1]->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1, primask); |
| 2734 | m_bg_tilemap[layer - 1]->draw(bitmap, cliprect, TILEMAP_DRAW_LAYER1, primask); |
| 2755 | 2735 | break; |
| 2756 | 2736 | } |
| 2757 | 2737 | } |
| 2758 | 2738 | |
| 2759 | | static void cps1_render_high_layer( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, int layer ) |
| 2739 | void cps_state::cps1_render_high_layer( bitmap_ind16 &bitmap, const rectangle &cliprect, int layer ) |
| 2760 | 2740 | { |
| 2761 | | cps_state *state = machine.driver_data<cps_state>(); |
| 2762 | 2741 | bitmap_ind16 dummy_bitmap; |
| 2763 | 2742 | switch (layer) |
| 2764 | 2743 | { |
| r20722 | r20723 | |
| 2768 | 2747 | case 1: |
| 2769 | 2748 | case 2: |
| 2770 | 2749 | case 3: |
| 2771 | | state->m_bg_tilemap[layer - 1]->draw(dummy_bitmap, cliprect, TILEMAP_DRAW_LAYER0, 1); |
| 2750 | m_bg_tilemap[layer - 1]->draw(dummy_bitmap, cliprect, TILEMAP_DRAW_LAYER0, 1); |
| 2772 | 2751 | break; |
| 2773 | 2752 | } |
| 2774 | 2753 | } |
| r20722 | r20723 | |
| 2793 | 2772 | cps1_get_video_base(); |
| 2794 | 2773 | |
| 2795 | 2774 | /* Find the offset of the last sprite in the sprite table */ |
| 2796 | | cps1_find_last_sprite(machine()); |
| 2775 | cps1_find_last_sprite(); |
| 2797 | 2776 | |
| 2798 | 2777 | if (m_cps_version == 2) |
| 2799 | | { |
| 2800 | | cps2_find_last_sprite(machine()); |
| 2801 | | } |
| 2778 | cps2_find_last_sprite(); |
| 2802 | 2779 | |
| 2803 | | cps1_update_transmasks(machine()); |
| 2780 | cps1_update_transmasks(); |
| 2804 | 2781 | |
| 2805 | 2782 | m_bg_tilemap[0]->set_scrollx(0, m_scroll1x); |
| 2806 | 2783 | m_bg_tilemap[0]->set_scrolly(0, m_scroll1y); |
| r20722 | r20723 | |
| 2856 | 2833 | |
| 2857 | 2834 | if (m_cps_version == 1) |
| 2858 | 2835 | { |
| 2859 | | cps1_render_layer(machine(), bitmap, cliprect, l0, 0); |
| 2836 | cps1_render_layer(bitmap, cliprect, l0, 0); |
| 2860 | 2837 | |
| 2861 | 2838 | if (l1 == 0) |
| 2862 | | cps1_render_high_layer(machine(), bitmap, cliprect, l0); /* prepare mask for sprites */ |
| 2839 | cps1_render_high_layer(bitmap, cliprect, l0); /* prepare mask for sprites */ |
| 2863 | 2840 | |
| 2864 | | cps1_render_layer(machine(), bitmap, cliprect, l1, 0); |
| 2841 | cps1_render_layer(bitmap, cliprect, l1, 0); |
| 2865 | 2842 | |
| 2866 | 2843 | if (l2 == 0) |
| 2867 | | cps1_render_high_layer(machine(), bitmap, cliprect, l1); /* prepare mask for sprites */ |
| 2844 | cps1_render_high_layer(bitmap, cliprect, l1); /* prepare mask for sprites */ |
| 2868 | 2845 | |
| 2869 | | cps1_render_layer(machine(), bitmap, cliprect, l2, 0); |
| 2846 | cps1_render_layer(bitmap, cliprect, l2, 0); |
| 2870 | 2847 | |
| 2871 | 2848 | if (l3 == 0) |
| 2872 | | cps1_render_high_layer(machine(), bitmap, cliprect, l2); /* prepare mask for sprites */ |
| 2849 | cps1_render_high_layer(bitmap, cliprect, l2); /* prepare mask for sprites */ |
| 2873 | 2850 | |
| 2874 | | cps1_render_layer(machine(), bitmap, cliprect, l3, 0); |
| 2851 | cps1_render_layer(bitmap, cliprect, l3, 0); |
| 2875 | 2852 | } |
| 2876 | 2853 | else |
| 2877 | 2854 | { |
| r20722 | r20723 | |
| 2883 | 2860 | l3pri = (m_pri_ctrl >> 4 * l3) & 0x0f; |
| 2884 | 2861 | |
| 2885 | 2862 | #if 0 |
| 2886 | | if ( (cps2_port(machine(), CPS2_OBJ_BASE) != 0x7080 && cps2_port(machine(), CPS2_OBJ_BASE) != 0x7000) || |
| 2887 | | cps2_port(machine(), CPS2_OBJ_UK1) != 0x807d || |
| 2888 | | (cps2_port(machine(), CPS2_OBJ_UK2) != 0x0000 && cps2_port(machine(), CPS2_OBJ_UK2) != 0x1101 && cps2_port(machine(), CPS2_OBJ_UK2) != 0x0001)) |
| 2863 | if ( (m_output[CPS2_OBJ_BASE /2] != 0x7080 && m_output[CPS2_OBJ_BASE /2] != 0x7000) || |
| 2864 | m_output[CPS2_OBJ_UK1 /2] != 0x807d || |
| 2865 | (m_output[CPS2_OBJ_UK2 /2] != 0x0000 && m_output[CPS2_OBJ_UK2 /2] != 0x1101 && m_output[CPS2_OBJ_UK2 /2] != 0x0001)) |
| 2889 | 2866 | popmessage("base %04x uk1 %04x uk2 %04x", |
| 2890 | | cps2_port(machine(), CPS2_OBJ_BASE), |
| 2891 | | cps2_port(machine(), CPS2_OBJ_UK1), |
| 2892 | | cps2_port(machine(), CPS2_OBJ_UK2)); |
| 2867 | m_output[CPS2_OBJ_BASE /2], |
| 2868 | m_output[CPS2_OBJ_UK1 /2], |
| 2869 | m_output[CPS2_OBJ_UK2 /2]); |
| 2893 | 2870 | |
| 2894 | 2871 | if (0 && machine().input().code_pressed(KEYCODE_Z)) |
| 2895 | 2872 | popmessage("order: %d (%d) %d (%d) %d (%d) %d (%d)",l0,l0pri,l1,l1pri,l2,l2pri,l3,l3pri); |
| r20722 | r20723 | |
| 2922 | 2899 | } |
| 2923 | 2900 | } |
| 2924 | 2901 | |
| 2925 | | cps1_render_layer(machine(), bitmap, cliprect, l0, 1); |
| 2926 | | cps1_render_layer(machine(), bitmap, cliprect, l1, 2); |
| 2927 | | cps1_render_layer(machine(), bitmap, cliprect, l2, 4); |
| 2928 | | cps2_render_sprites(machine(), bitmap, cliprect, primasks); |
| 2902 | cps1_render_layer(bitmap, cliprect, l0, 1); |
| 2903 | cps1_render_layer(bitmap, cliprect, l1, 2); |
| 2904 | cps1_render_layer(bitmap, cliprect, l2, 4); |
| 2905 | cps2_render_sprites(bitmap, cliprect, primasks); |
| 2929 | 2906 | } |
| 2930 | 2907 | |
| 2931 | 2908 | return 0; |
| r20722 | r20723 | |
| 2947 | 2924 | } |
| 2948 | 2925 | } |
| 2949 | 2926 | |
| 2950 | | void cps2_set_sprite_priorities( running_machine &machine ) |
| 2927 | void cps_state::cps2_set_sprite_priorities() |
| 2951 | 2928 | { |
| 2952 | | cps_state *state = machine.driver_data<cps_state>(); |
| 2953 | | state->m_pri_ctrl = cps2_port(machine, CPS2_OBJ_PRI); |
| 2929 | m_pri_ctrl = m_output[CPS2_OBJ_PRI /2]; |
| 2954 | 2930 | } |
| 2955 | 2931 | |
| 2956 | | void cps2_objram_latch( running_machine &machine ) |
| 2932 | void cps_state::cps2_objram_latch() |
| 2957 | 2933 | { |
| 2958 | | cps_state *state = machine.driver_data<cps_state>(); |
| 2959 | | cps2_set_sprite_priorities(machine); |
| 2960 | | memcpy(state->m_cps2_buffered_obj, cps2_objbase(machine), state->m_cps2_obj_size); |
| 2934 | cps2_set_sprite_priorities(); |
| 2935 | memcpy(m_cps2_buffered_obj, cps2_objbase(), m_cps2_obj_size); |
| 2961 | 2936 | } |