trunk/src/mame/video/stvvdp1.c
| r20807 | r20808 | |
| 16 | 16 | #include "emu.h" |
| 17 | 17 | #include "includes/stv.h" |
| 18 | 18 | |
| 19 | | #define VDP1_LOG 1 |
| 19 | #define VDP1_LOG 0 |
| 20 | 20 | |
| 21 | 21 | |
| 22 | 22 | enum { FRAC_SHIFT = 16 }; |
| r20807 | r20808 | |
| 311 | 311 | |
| 312 | 312 | WRITE32_MEMBER ( saturn_state::saturn_vdp1_vram_w ) |
| 313 | 313 | { |
| 314 | | COMBINE_DATA(&m_vdp1_vram[offset]); |
| 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; |
| 315 | 329 | } |
| 316 | 330 | |
| 317 | 331 | WRITE32_MEMBER ( saturn_state::saturn_vdp1_framebuffer0_w ) |
| r20807 | r20808 | |
| 824 | 838 | |
| 825 | 839 | void saturn_state::drawpixel_8bpp_trans(int x, int y, int patterndata, int offsetcnt) |
| 826 | 840 | { |
| 827 | | UINT8 *vdp1_vram = (UINT8 *)m_vdp1_vram; |
| 828 | 841 | UINT16 pix; |
| 829 | 842 | |
| 830 | | pix = vdp1_vram[((patterndata+offsetcnt)^3) & 0x7ffff]; |
| 843 | pix = m_vdp1.gfx_decode[patterndata+offsetcnt]; |
| 831 | 844 | if ( pix & 0xff ) |
| 832 | 845 | { |
| 833 | 846 | m_vdp1.framebuffer_draw_lines[y][x] = pix | m_sprite_colorbank; |
| r20807 | r20808 | |
| 836 | 849 | |
| 837 | 850 | void saturn_state::drawpixel_4bpp_notrans(int x, int y, int patterndata, int offsetcnt) |
| 838 | 851 | { |
| 839 | | UINT8 *vdp1_vram = (UINT8 *)m_vdp1_vram; |
| 840 | 852 | UINT16 pix; |
| 841 | 853 | |
| 842 | | pix = vdp1_vram[((patterndata+offsetcnt)^3) & 0x7ffff]; |
| 843 | | pix = offsetcnt&1 ? (pix & 0x0f):((pix & 0xf0)>>4) ; |
| 854 | pix = m_vdp1.gfx_decode[patterndata+offsetcnt/2]; |
| 855 | pix = offsetcnt&1 ? (pix & 0x0f) : ((pix & 0xf0)>>4); |
| 844 | 856 | m_vdp1.framebuffer_draw_lines[y][x] = pix | m_sprite_colorbank; |
| 845 | 857 | } |
| 846 | 858 | |
| 847 | 859 | void saturn_state::drawpixel_4bpp_trans(int x, int y, int patterndata, int offsetcnt) |
| 848 | 860 | { |
| 849 | | UINT8 *vdp1_vram = (UINT8 *)m_vdp1_vram; |
| 850 | 861 | UINT16 pix; |
| 851 | 862 | |
| 852 | | pix = vdp1_vram[((patterndata+offsetcnt)^3) & 0x7ffff]; |
| 853 | | pix = offsetcnt&1 ? (pix & 0x0f):((pix & 0xf0)>>4) ; |
| 863 | pix = m_vdp1.gfx_decode[patterndata+offsetcnt/2]; |
| 864 | pix = offsetcnt&1 ? (pix & 0x0f) : ((pix & 0xf0)>>4); |
| 854 | 865 | if ( pix ) |
| 855 | 866 | m_vdp1.framebuffer_draw_lines[y][x] = pix | m_sprite_colorbank; |
| 856 | 867 | } |
| 857 | 868 | |
| 858 | 869 | void saturn_state::drawpixel_generic(int x, int y, int patterndata, int offsetcnt) |
| 859 | 870 | { |
| 860 | | UINT8 *vdp1_vram = (UINT8 *)m_vdp1_vram; |
| 861 | 871 | int pix,mode,transmask, spd = stv2_current_sprite.CMDPMOD & 0x40; |
| 862 | 872 | int mesh = stv2_current_sprite.CMDPMOD & 0x100; |
| 863 | 873 | int pix2; |
| r20807 | r20808 | |
| 887 | 897 | { |
| 888 | 898 | case 0x0000: // mode 0 16 colour bank mode (4bits) (hanagumi blocks) |
| 889 | 899 | // most of the shienryu sprites use this mode |
| 890 | | pix = vdp1_vram[((patterndata+offsetcnt)^3) & 0x7ffff]; |
| 891 | | pix = offsetcnt&1 ? (pix & 0x0f):((pix & 0xf0)>>4) ; |
| 900 | pix = m_vdp1.gfx_decode[(patterndata+offsetcnt/2) & 0xfffff]; |
| 901 | pix = offsetcnt&1 ? (pix & 0x0f) : ((pix & 0xf0)>>4); |
| 892 | 902 | pix = pix+((stv2_current_sprite.CMDCOLR&0xfff0)); |
| 893 | 903 | mode = 0; |
| 894 | 904 | transmask = 0xf; |
| 895 | 905 | break; |
| 896 | 906 | case 0x0008: // mode 1 16 colour lookup table mode (4bits) |
| 897 | 907 | // shienryu explosisons (and some enemies) use this mode |
| 898 | | pix2 = vdp1_vram[((patterndata+offsetcnt)^3) & 0x7ffff]; |
| 899 | | pix2 = offsetcnt&1 ? (pix2 & 0x0f):((pix2 & 0xf0)>>4); |
| 908 | pix2 = m_vdp1.gfx_decode[(patterndata+offsetcnt/2) & 0xfffff]; |
| 909 | pix = offsetcnt&1 ? (pix & 0x0f) : ((pix & 0xf0)>>4); |
| 900 | 910 | pix = pix2&1 ? |
| 901 | 911 | ((((m_vdp1_vram[(((stv2_current_sprite.CMDCOLR&0xffff)*8)>>2)+((pix2&0xfffe)/2)])) & 0x0000ffff) >> 0): |
| 902 | 912 | ((((m_vdp1_vram[(((stv2_current_sprite.CMDCOLR&0xffff)*8)>>2)+((pix2&0xfffe)/2)])) & 0xffff0000) >> 16); |
| r20807 | r20808 | |
| 917 | 927 | } |
| 918 | 928 | break; |
| 919 | 929 | case 0x0010: // mode 2 64 colour bank mode (8bits) (character select portraits on hanagumi) |
| 920 | | pix = vdp1_vram[((patterndata+offsetcnt)^3) & 0x7ffff]; |
| 930 | pix = m_vdp1.gfx_decode[(patterndata+offsetcnt) & 0xfffff]; |
| 921 | 931 | mode = 2; |
| 922 | 932 | pix = pix+(stv2_current_sprite.CMDCOLR&0xffc0); |
| 923 | 933 | transmask = 0x3f; |
| 924 | 934 | break; |
| 925 | 935 | case 0x0018: // mode 3 128 colour bank mode (8bits) (little characters on hanagumi use this mode) |
| 926 | | pix = vdp1_vram[((patterndata+offsetcnt)^3) & 0x7ffff]; |
| 936 | pix = m_vdp1.gfx_decode[(patterndata+offsetcnt) & 0xfffff]; |
| 927 | 937 | pix = pix+(stv2_current_sprite.CMDCOLR&0xff80); |
| 928 | 938 | transmask = 0x7f; |
| 929 | 939 | mode = 3; |
| 930 | 940 | break; |
| 931 | 941 | case 0x0020: // mode 4 256 colour bank mode (8bits) (hanagumi title) |
| 932 | | pix = vdp1_vram[((patterndata+offsetcnt)^3) & 0x7ffff]; |
| 942 | pix = m_vdp1.gfx_decode[(patterndata+offsetcnt) & 0xfffff]; |
| 933 | 943 | pix = pix+(stv2_current_sprite.CMDCOLR&0xff00); |
| 934 | 944 | transmask = 0xff; |
| 935 | 945 | mode = 4; |
| 936 | 946 | break; |
| 937 | 947 | case 0x0028: // mode 5 32,768 colour RGB mode (16bits) |
| 938 | | pix = vdp1_vram[((patterndata+offsetcnt*2+1)^3) & 0x7ffff] | (vdp1_vram[((patterndata+offsetcnt*2)^3) & 0x7ffff]<<8) ; |
| 948 | pix = m_vdp1.gfx_decode[(patterndata+offsetcnt*2+1) & 0xfffff] | (m_vdp1.gfx_decode[(patterndata+offsetcnt*2) & 0xfffff]<<8) ; |
| 939 | 949 | mode = 5; |
| 940 | 950 | transmask = -1; /* TODO: check me */ |
| 941 | 951 | break; |
| r20807 | r20808 | |
| 2039 | 2049 | |
| 2040 | 2050 | void saturn_state::stv_vdp1_state_save_postload( void ) |
| 2041 | 2051 | { |
| 2052 | UINT8 *vdp1 = m_vdp1.gfx_decode; |
| 2053 | int offset; |
| 2054 | UINT32 data; |
| 2055 | |
| 2042 | 2056 | m_vdp1.framebuffer_mode = -1; |
| 2043 | 2057 | m_vdp1.framebuffer_double_interlace = -1; |
| 2044 | 2058 | |
| 2045 | 2059 | 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 | } |
| 2046 | 2070 | } |
| 2047 | 2071 | |
| 2048 | 2072 | int saturn_state::stv_vdp1_start ( void ) |
| 2049 | 2073 | { |
| 2050 | 2074 | m_vdp1_regs = auto_alloc_array_clear(machine(), UINT16, 0x020/2 ); |
| 2051 | 2075 | m_vdp1_vram = auto_alloc_array_clear(machine(), UINT32, 0x100000/4 ); |
| 2076 | m_vdp1.gfx_decode = auto_alloc_array(machine(), UINT8, 0x100000 ); |
| 2052 | 2077 | |
| 2053 | 2078 | stv_vdp1_shading_data = auto_alloc(machine(), struct stv_vdp1_poly_scanline_data); |
| 2054 | 2079 | |