trunk/src/mame/drivers/coolridr.c
| r21423 | r21424 | |
| 478 | 478 | UINT8 *m_h1_pcg; |
| 479 | 479 | UINT16 *m_h1_pal; |
| 480 | 480 | void flush_pal_data( UINT16 offset ); |
| 481 | void apply_rgb_control(int screen_num,int *r, int *g, int *b); |
| 481 | 482 | int m_gfx_index; |
| 482 | 483 | int m_color_bank; |
| 483 | | UINT32 m_rgb_ctrl[2]; |
| 484 | struct { |
| 485 | UINT32 setting; |
| 486 | UINT8 gradient; |
| 487 | }m_rgb_ctrl[2]; |
| 484 | 488 | UINT32 m_pen_fill[2]; |
| 485 | 489 | |
| 486 | 490 | osd_work_queue * m_work_queue[2]; // work queue, one per screen |
| r21423 | r21424 | |
| 554 | 558 | |
| 555 | 559 | UINT32 coolridr_state::screen_update_coolridr(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, int which) |
| 556 | 560 | { |
| 557 | | /* planes seems to basically be at 0x8000 and 0x28000... */ |
| 561 | int bg_r,bg_g,bg_b; |
| 558 | 562 | |
| 559 | 563 | if(m_pen_fill[which]) |
| 560 | 564 | { |
| 561 | | int bg_r,bg_g,bg_b; |
| 562 | 565 | /* logic here is a bit of a guess. */ |
| 563 | 566 | bg_r = (((m_pen_fill[which] >> 16) & 0x7f) << 1) | (((m_pen_fill[which] >> 16) & 0x80) >> 7); |
| 564 | 567 | bg_g = (((m_pen_fill[which] >> 8) & 0x7f) << 1) | (((m_pen_fill[which] >> 8) & 0x80) >> 7); |
| r21423 | r21424 | |
| 583 | 586 | m_color_bank = which * 2; |
| 584 | 587 | /* TODO: the whole transpen logic might be incorrect */ |
| 585 | 588 | transpen_setting = (VREG(0x3c) & 0x80000000) >> 31; |
| 589 | bg_r = (VREG(0x3c) >> 10) & 0x1f; |
| 590 | bg_g = (VREG(0x3c) >> 5) & 0x1f; |
| 591 | bg_b = (VREG(0x3c) >> 0) & 0x1f; |
| 592 | apply_rgb_control(which,&bg_r,&bg_g,&bg_b); |
| 586 | 593 | |
| 587 | | bitmap.fill(MAKE_ARGB(0xff,(VREG(0x3c) >> 16) & 0xff,(VREG(0x3c) >> 8) & 0xff,VREG(0x3c) & 0xff),cliprect); |
| 594 | bitmap.fill(MAKE_ARGB(0xff,pal5bit(bg_r),pal5bit(bg_g),pal5bit(bg_b)),cliprect); |
| 588 | 595 | |
| 589 | 596 | for (int y=0;y<64;y++) |
| 590 | 597 | { |
| r21423 | r21424 | |
| 1815 | 1822 | } |
| 1816 | 1823 | } |
| 1817 | 1824 | |
| 1818 | | void coolridr_state::flush_pal_data( UINT16 offset ) |
| 1825 | void coolridr_state::apply_rgb_control(int screen_num,int *r, int *g, int *b) |
| 1819 | 1826 | { |
| 1820 | | int r,g,b; |
| 1821 | | int screen_type = (offset & 0x400) >> 10; |
| 1822 | | int rgb_setting = m_rgb_ctrl[screen_type] & ~0x1f; |
| 1823 | | int rgb_gradient = m_rgb_ctrl[screen_type] & 0x1f; |
| 1827 | if(!m_rgb_ctrl[screen_num].gradient) |
| 1828 | return; |
| 1824 | 1829 | |
| 1825 | | r = ((m_h1_pal[offset] & 0x7c00) >> 10); |
| 1826 | | g = ((m_h1_pal[offset] & 0x03e0) >> 5); |
| 1827 | | b = ((m_h1_pal[offset] & 0x001f) >> 0); |
| 1828 | | if(rgb_setting == 0x1240) /* fade-in / outs */ |
| 1830 | if(m_rgb_ctrl[screen_num].setting == 0x1240) /* fade-in / outs */ |
| 1829 | 1831 | { |
| 1830 | | r -= rgb_gradient; |
| 1831 | | g -= rgb_gradient; |
| 1832 | | b -= rgb_gradient; |
| 1833 | | if(r < 0) { r = 0; } |
| 1834 | | if(g < 0) { g = 0; } |
| 1835 | | if(b < 0) { b = 0; } |
| 1832 | *r -= m_rgb_ctrl[screen_num].gradient; |
| 1833 | *g -= m_rgb_ctrl[screen_num].gradient; |
| 1834 | *b -= m_rgb_ctrl[screen_num].gradient; |
| 1835 | if(*r < 0) { *r = 0; } |
| 1836 | if(*g < 0) { *g = 0; } |
| 1837 | if(*b < 0) { *b = 0; } |
| 1836 | 1838 | } |
| 1837 | | else if(rgb_setting == 0x920) /* at bike select / outside tunnels, addition */ |
| 1839 | else if(m_rgb_ctrl[screen_num].setting == 0x920) /* at bike select / outside tunnels, addition */ |
| 1838 | 1840 | { |
| 1839 | | r += rgb_gradient; |
| 1840 | | g += rgb_gradient; |
| 1841 | | b += rgb_gradient; |
| 1842 | | if(r > 0x1f) { r = 0x1f; } |
| 1843 | | if(g > 0x1f) { g = 0x1f; } |
| 1844 | | if(b > 0x1f) { b = 0x1f; } |
| 1841 | *r += m_rgb_ctrl[screen_num].gradient; |
| 1842 | *g += m_rgb_ctrl[screen_num].gradient; |
| 1843 | *b += m_rgb_ctrl[screen_num].gradient; |
| 1844 | if(*r > 0x1f) { *r = 0x1f; } |
| 1845 | if(*g > 0x1f) { *g = 0x1f; } |
| 1846 | if(*b > 0x1f) { *b = 0x1f; } |
| 1845 | 1847 | } |
| 1846 | | else if(rgb_setting == 0x800) /* when you get hit TODO: algo might be different. */ |
| 1848 | else if(m_rgb_ctrl[screen_num].setting == 0x800) /* when you get hit TODO: algo might be different. */ |
| 1847 | 1849 | { |
| 1848 | | g &= (0x1f - rgb_gradient); |
| 1849 | | b &= (0x1f - rgb_gradient); |
| 1850 | *g &= (0x1f - m_rgb_ctrl[screen_num].gradient); |
| 1851 | *b &= (0x1f - m_rgb_ctrl[screen_num].gradient); |
| 1850 | 1852 | } |
| 1851 | | else if(rgb_gradient) |
| 1853 | else |
| 1852 | 1854 | { |
| 1853 | | popmessage("%08x %08x",rgb_setting,rgb_gradient); |
| 1855 | popmessage("%08x %08x",m_rgb_ctrl[screen_num].setting,m_rgb_ctrl[screen_num].gradient); |
| 1854 | 1856 | } |
| 1857 | } |
| 1855 | 1858 | |
| 1859 | void coolridr_state::flush_pal_data( UINT16 offset ) |
| 1860 | { |
| 1861 | int r,g,b; |
| 1862 | int screen_type = (offset & 0x400) >> 10; |
| 1863 | |
| 1864 | r = ((m_h1_pal[offset] & 0x7c00) >> 10); |
| 1865 | g = ((m_h1_pal[offset] & 0x03e0) >> 5); |
| 1866 | b = ((m_h1_pal[offset] & 0x001f) >> 0); |
| 1867 | apply_rgb_control(screen_type,&r,&g,&b); |
| 1868 | |
| 1856 | 1869 | palette_set_color_rgb(machine(),offset,pal5bit(r),pal5bit(g),pal5bit(b)); |
| 1857 | 1870 | } |
| 1858 | 1871 | |
| r21423 | r21424 | |
| 1948 | 1961 | break; |
| 1949 | 1962 | case 0x40: /* screen 1 - almost certainly RGB brightness (at least bits 4 - 0) */ |
| 1950 | 1963 | case 0x44: /* screen 2 / */ |
| 1951 | | m_rgb_ctrl[(cmd & 4) >> 2] = m_framebuffer_vram[(0+dma_index)/4] & 0xffffff; |
| 1964 | m_rgb_ctrl[(cmd & 4) >> 2].setting = m_framebuffer_vram[(0+dma_index)/4] & 0xffffe0; |
| 1965 | m_rgb_ctrl[(cmd & 4) >> 2].gradient = m_framebuffer_vram[(0+dma_index)/4] & 0x1f; |
| 1952 | 1966 | for(int i=((cmd & 4) * 0x100);i<((cmd & 4) * 0x100)+0x400;i++) |
| 1953 | 1967 | flush_pal_data( i ); |
| 1954 | 1968 | dma_index+=4; |