trunk/src/mame/video/stvvdp1.c
| r20805 | r20806 | |
| 311 | 311 | |
| 312 | 312 | WRITE32_MEMBER ( saturn_state::saturn_vdp1_vram_w ) |
| 313 | 313 | { |
| 314 | | UINT8 *vdp1 = m_vdp1.gfx_decode; |
| 315 | | |
| 316 | | COMBINE_DATA (&m_vdp1_vram[offset]); |
| 317 | | |
| 318 | | // if (((offset * 4) > 0xdf) && ((offset * 4) < 0x140)) |
| 319 | | // { |
| 320 | | // logerror("cpu %s (PC=%08X): VRAM dword write to %08X = %08X & %08X\n", space.device().tag(), space.device().safe_pc(), offset*4, data, mem_mask); |
| 321 | | // } |
| 322 | | |
| 323 | | data = m_vdp1_vram[offset]; |
| 324 | | /* put in gfx region for easy decoding */ |
| 325 | | vdp1[offset*4+0] = (data & 0xff000000) >> 24; |
| 326 | | vdp1[offset*4+1] = (data & 0x00ff0000) >> 16; |
| 327 | | vdp1[offset*4+2] = (data & 0x0000ff00) >> 8; |
| 328 | | vdp1[offset*4+3] = (data & 0x000000ff) >> 0; |
| 314 | COMBINE_DATA(&m_vdp1_vram[offset]); |
| 329 | 315 | } |
| 330 | 316 | |
| 331 | 317 | WRITE32_MEMBER ( saturn_state::saturn_vdp1_framebuffer0_w ) |
| r20805 | r20806 | |
| 838 | 824 | |
| 839 | 825 | void saturn_state::drawpixel_8bpp_trans(int x, int y, int patterndata, int offsetcnt) |
| 840 | 826 | { |
| 827 | UINT8 *vdp1_vram = (UINT8 *)m_vdp1_vram; |
| 841 | 828 | UINT16 pix; |
| 842 | 829 | |
| 843 | | pix = m_vdp1.gfx_decode[patterndata+offsetcnt]; |
| 830 | pix = vdp1_vram[(patterndata+offsetcnt/2)^3]; |
| 844 | 831 | if ( pix & 0xff ) |
| 845 | 832 | { |
| 846 | 833 | m_vdp1.framebuffer_draw_lines[y][x] = pix | m_sprite_colorbank; |
| r20805 | r20806 | |
| 849 | 836 | |
| 850 | 837 | void saturn_state::drawpixel_4bpp_notrans(int x, int y, int patterndata, int offsetcnt) |
| 851 | 838 | { |
| 839 | UINT8 *vdp1_vram = (UINT8 *)m_vdp1_vram; |
| 852 | 840 | UINT16 pix; |
| 853 | 841 | |
| 854 | | pix = m_vdp1.gfx_decode[patterndata+offsetcnt/2]; |
| 842 | pix = vdp1_vram[(patterndata+offsetcnt/2)^3]; |
| 855 | 843 | pix = offsetcnt&1 ? (pix & 0x0f):((pix & 0xf0)>>4) ; |
| 856 | 844 | m_vdp1.framebuffer_draw_lines[y][x] = pix | m_sprite_colorbank; |
| 857 | 845 | } |
| 858 | 846 | |
| 859 | 847 | void saturn_state::drawpixel_4bpp_trans(int x, int y, int patterndata, int offsetcnt) |
| 860 | 848 | { |
| 849 | UINT8 *vdp1_vram = (UINT8 *)m_vdp1_vram; |
| 861 | 850 | UINT16 pix; |
| 862 | 851 | |
| 863 | | pix = m_vdp1.gfx_decode[patterndata+offsetcnt/2]; |
| 852 | pix = vdp1_vram[(patterndata+offsetcnt/2)^3]; |
| 864 | 853 | pix = offsetcnt&1 ? (pix & 0x0f):((pix & 0xf0)>>4) ; |
| 865 | 854 | if ( pix ) |
| 866 | 855 | m_vdp1.framebuffer_draw_lines[y][x] = pix | m_sprite_colorbank; |
| r20805 | r20806 | |
| 868 | 857 | |
| 869 | 858 | void saturn_state::drawpixel_generic(int x, int y, int patterndata, int offsetcnt) |
| 870 | 859 | { |
| 860 | UINT8 *vdp1_vram = (UINT8 *)m_vdp1_vram; |
| 871 | 861 | int pix,mode,transmask, spd = stv2_current_sprite.CMDPMOD & 0x40; |
| 872 | 862 | int mesh = stv2_current_sprite.CMDPMOD & 0x100; |
| 873 | 863 | int pix2; |
| r20805 | r20806 | |
| 897 | 887 | { |
| 898 | 888 | case 0x0000: // mode 0 16 colour bank mode (4bits) (hanagumi blocks) |
| 899 | 889 | // most of the shienryu sprites use this mode |
| 900 | | pix = m_vdp1.gfx_decode[(patterndata+offsetcnt/2) & 0xfffff]; |
| 890 | pix = vdp1_vram[((patterndata+offsetcnt/2)^3) & 0xfffff]; |
| 901 | 891 | pix = offsetcnt&1 ? (pix & 0x0f):((pix & 0xf0)>>4) ; |
| 902 | 892 | pix = pix+((stv2_current_sprite.CMDCOLR&0xfff0)); |
| 903 | 893 | mode = 0; |
| r20805 | r20806 | |
| 905 | 895 | break; |
| 906 | 896 | case 0x0008: // mode 1 16 colour lookup table mode (4bits) |
| 907 | 897 | // shienryu explosisons (and some enemies) use this mode |
| 908 | | pix2 = m_vdp1.gfx_decode[(patterndata+offsetcnt/2) & 0xfffff]; |
| 898 | pix2 = vdp1_vram[((patterndata+offsetcnt/2)^3) & 0xfffff]; |
| 909 | 899 | pix2 = offsetcnt&1 ? (pix2 & 0x0f):((pix2 & 0xf0)>>4); |
| 910 | 900 | pix = pix2&1 ? |
| 911 | 901 | ((((m_vdp1_vram[(((stv2_current_sprite.CMDCOLR&0xffff)*8)>>2)+((pix2&0xfffe)/2)])) & 0x0000ffff) >> 0): |
| r20805 | r20806 | |
| 927 | 917 | } |
| 928 | 918 | break; |
| 929 | 919 | case 0x0010: // mode 2 64 colour bank mode (8bits) (character select portraits on hanagumi) |
| 930 | | pix = m_vdp1.gfx_decode[(patterndata+offsetcnt) & 0xfffff]; |
| 920 | pix = vdp1_vram[((patterndata+offsetcnt)^3) & 0xfffff]; |
| 931 | 921 | mode = 2; |
| 932 | 922 | pix = pix+(stv2_current_sprite.CMDCOLR&0xffc0); |
| 933 | 923 | transmask = 0x3f; |
| 934 | 924 | break; |
| 935 | 925 | case 0x0018: // mode 3 128 colour bank mode (8bits) (little characters on hanagumi use this mode) |
| 936 | | pix = m_vdp1.gfx_decode[(patterndata+offsetcnt) & 0xfffff]; |
| 926 | pix = vdp1_vram[((patterndata+offsetcnt)^3) & 0xfffff]; |
| 937 | 927 | pix = pix+(stv2_current_sprite.CMDCOLR&0xff80); |
| 938 | 928 | transmask = 0x7f; |
| 939 | 929 | mode = 3; |
| 940 | 930 | break; |
| 941 | 931 | case 0x0020: // mode 4 256 colour bank mode (8bits) (hanagumi title) |
| 942 | | pix = m_vdp1.gfx_decode[(patterndata+offsetcnt) & 0xfffff]; |
| 932 | pix = vdp1_vram[((patterndata+offsetcnt)^3) & 0xfffff]; |
| 943 | 933 | pix = pix+(stv2_current_sprite.CMDCOLR&0xff00); |
| 944 | 934 | transmask = 0xff; |
| 945 | 935 | mode = 4; |
| 946 | 936 | break; |
| 947 | 937 | case 0x0028: // mode 5 32,768 colour RGB mode (16bits) |
| 948 | | pix = m_vdp1.gfx_decode[(patterndata+offsetcnt*2+1) & 0xfffff] | (m_vdp1.gfx_decode[(patterndata+offsetcnt*2) & 0xfffff]<<8) ; |
| 938 | pix = vdp1_vram[((patterndata+offsetcnt*2+1)^3) & 0xfffff] | (vdp1_vram[((patterndata+offsetcnt*2)^3) & 0xfffff]<<8) ; |
| 949 | 939 | mode = 5; |
| 950 | 940 | transmask = -1; /* TODO: check me */ |
| 951 | 941 | break; |
| r20805 | r20806 | |
| 2049 | 2039 | |
| 2050 | 2040 | void saturn_state::stv_vdp1_state_save_postload( void ) |
| 2051 | 2041 | { |
| 2052 | | UINT8 *vdp1 = m_vdp1.gfx_decode; |
| 2053 | | int offset; |
| 2054 | | UINT32 data; |
| 2055 | | |
| 2056 | 2042 | m_vdp1.framebuffer_mode = -1; |
| 2057 | 2043 | m_vdp1.framebuffer_double_interlace = -1; |
| 2058 | 2044 | |
| 2059 | 2045 | stv_set_framebuffer_config(); |
| 2060 | | |
| 2061 | | for (offset = 0; offset < 0x80000/4; offset++ ) |
| 2062 | | { |
| 2063 | | data = m_vdp1_vram[offset]; |
| 2064 | | /* put in gfx region for easy decoding */ |
| 2065 | | vdp1[offset*4+0] = (data & 0xff000000) >> 24; |
| 2066 | | vdp1[offset*4+1] = (data & 0x00ff0000) >> 16; |
| 2067 | | vdp1[offset*4+2] = (data & 0x0000ff00) >> 8; |
| 2068 | | vdp1[offset*4+3] = (data & 0x000000ff) >> 0; |
| 2069 | | } |
| 2070 | 2046 | } |
| 2071 | 2047 | |
| 2072 | 2048 | int saturn_state::stv_vdp1_start ( void ) |
| 2073 | 2049 | { |
| 2074 | 2050 | m_vdp1_regs = auto_alloc_array_clear(machine(), UINT16, 0x020/2 ); |
| 2075 | 2051 | m_vdp1_vram = auto_alloc_array_clear(machine(), UINT32, 0x100000/4 ); |
| 2076 | | m_vdp1.gfx_decode = auto_alloc_array(machine(), UINT8, 0x100000 ); |
| 2077 | 2052 | |
| 2078 | 2053 | stv_vdp1_shading_data = auto_alloc(machine(), struct stv_vdp1_poly_scanline_data); |
| 2079 | 2054 | |