trunk/src/mess/video/x68k.c
| r30769 | r30770 | |
| 733 | 733 | } |
| 734 | 734 | } |
| 735 | 735 | |
| 736 | | void x68k_state::x68k_draw_gfx_scanline( bitmap_ind16 &bitmap, rectangle cliprect, UINT8 priority) |
| 736 | bool x68k_state::x68k_draw_gfx_scanline( bitmap_ind16 &bitmap, rectangle cliprect, UINT8 priority) |
| 737 | 737 | { |
| 738 | 738 | int pixel; |
| 739 | 739 | int page; |
| r30769 | r30770 | |
| 743 | 743 | UINT16 colour = 0; |
| 744 | 744 | int shift; |
| 745 | 745 | int scanline; |
| 746 | bool blend, ret = false; |
| 747 | UINT16 *pal = (UINT16 *)m_gfxpalette->basemem().base(); |
| 746 | 748 | |
| 747 | 749 | for(scanline=cliprect.min_y;scanline<=cliprect.max_y;scanline++) // per scanline |
| 748 | 750 | { |
| r30769 | r30770 | |
| 793 | 795 | lineoffset = (((scanline - m_crtc.vbegin) + yscr) & 0x1ff) * 512; |
| 794 | 796 | loc = xscr & 0x1ff; |
| 795 | 797 | shift = 4; |
| 798 | if((m_video.reg[2] & 0x1a00) == 0x1a00) |
| 799 | ret = true; |
| 796 | 800 | for(pixel=m_crtc.hbegin;pixel<=m_crtc.hend;pixel++) |
| 797 | 801 | { |
| 798 | 802 | colour = ((m_gvram[lineoffset + loc] >> page*shift) & 0x000f); |
| 803 | if(ret && (colour & 1)) |
| 804 | { |
| 805 | blend = true; |
| 806 | colour &= 0xfe; |
| 807 | } |
| 808 | else |
| 809 | blend = false; |
| 799 | 810 | if(colour || (priority == 3)) |
| 800 | | bitmap.pix16(scanline, pixel) = colour; |
| 811 | { |
| 812 | if(ret) |
| 813 | { |
| 814 | if(blend) |
| 815 | bitmap.pix16(scanline, pixel) = ((bitmap.pix16(scanline, pixel) >> 1) & 0x7bde) + ((pal[colour] >> 1) & 0x7bde) + 1; |
| 816 | else |
| 817 | bitmap.pix16(scanline, pixel) = pal[colour] & 0xfffe; |
| 818 | } |
| 819 | else |
| 820 | bitmap.pix16(scanline, pixel) = colour; |
| 821 | } |
| 801 | 822 | loc++; |
| 802 | 823 | loc &= 0x1ff; |
| 803 | 824 | } |
| r30769 | r30770 | |
| 810 | 831 | lineoffset = (((scanline - m_crtc.vbegin) + yscr) & 0x1ff) * 512; |
| 811 | 832 | loc = xscr & 0x1ff; |
| 812 | 833 | shift = 4; |
| 834 | if((m_video.reg[2] & 0x1a00) == 0x1a00) |
| 835 | ret = true; |
| 813 | 836 | for(pixel=m_crtc.hbegin;pixel<=m_crtc.hend;pixel++) |
| 814 | 837 | { |
| 815 | 838 | colour = ((m_gvram[lineoffset + loc] >> page*shift) & 0x00ff); |
| 839 | if(ret && (colour & 1)) |
| 840 | { |
| 841 | blend = true; |
| 842 | colour &= 0xfe; |
| 843 | } |
| 844 | else |
| 845 | blend = false; |
| 816 | 846 | if(colour || (priority == 3)) |
| 817 | | bitmap.pix16(scanline, pixel) = colour; |
| 847 | { |
| 848 | if(ret) |
| 849 | { |
| 850 | if(blend) |
| 851 | bitmap.pix16(scanline, pixel) = ((bitmap.pix16(scanline, pixel) >> 1) & 0x7bde) + ((pal[colour] >> 1) & 0x7bde) + 1; |
| 852 | else |
| 853 | bitmap.pix16(scanline, pixel) = pal[colour] & 0xfffe; |
| 854 | } |
| 855 | else |
| 856 | bitmap.pix16(scanline, pixel) = colour; |
| 857 | } |
| 818 | 858 | loc++; |
| 819 | 859 | loc &= 0x1ff; |
| 820 | 860 | } |
| r30769 | r30770 | |
| 838 | 878 | } |
| 839 | 879 | } |
| 840 | 880 | } |
| 881 | return ret; |
| 841 | 882 | } |
| 842 | 883 | |
| 843 | 884 | void x68k_state::x68k_draw_gfx(bitmap_rgb32 &bitmap,rectangle cliprect) |
| 844 | 885 | { |
| 845 | 886 | int priority, scanline, pixel; |
| 887 | bool gfxblend; |
| 846 | 888 | //rectangle rect; |
| 847 | 889 | //int xscr,yscr; |
| 848 | 890 | //int gpage; |
| r30769 | r30770 | |
| 854 | 896 | |
| 855 | 897 | for(priority=3;priority>=0;priority--) |
| 856 | 898 | { |
| 857 | | x68k_draw_gfx_scanline(*m_gfxbitmap,cliprect,priority); |
| 899 | gfxblend = x68k_draw_gfx_scanline(*m_gfxbitmap,cliprect,priority); |
| 858 | 900 | } |
| 859 | 901 | |
| 860 | 902 | for(scanline=cliprect.min_y;scanline<=cliprect.max_y;scanline++) |
| 861 | 903 | { |
| 862 | 904 | UINT16 colour; |
| 905 | bool blend = false; |
| 863 | 906 | for(pixel=m_crtc.hbegin;pixel<=m_crtc.hend;pixel++) |
| 864 | 907 | { |
| 865 | 908 | if((m_video.reg[0] & 0x03) == 3) |
| r30769 | r30770 | |
| 868 | 911 | if(colour || (m_video.gfx_pri == 2)) |
| 869 | 912 | bitmap.pix32(scanline, pixel) = pal555(colour, 6, 11, 1); |
| 870 | 913 | } |
| 914 | else if(gfxblend) |
| 915 | { |
| 916 | colour = m_gfxbitmap->pix16(scanline, pixel); |
| 917 | if(((m_video.reg[2] & 0x1900) == 0x1900) && (m_video.gfx_pri != 2) && (colour & 1)) |
| 918 | blend = true; |
| 919 | else |
| 920 | blend = false; |
| 921 | if(colour || (m_video.gfx_pri == 2)) |
| 922 | { |
| 923 | if(blend) |
| 924 | bitmap.pix32(scanline, pixel) = ((bitmap.pix32(scanline, pixel) >> 1) & 0xff7f7f7f) + ((pal555(colour, 6, 11, 1) >> 1) & 0x7f7f7f); |
| 925 | else |
| 926 | bitmap.pix32(scanline, pixel) = pal555(colour, 6, 11, 1); |
| 927 | } |
| 928 | } |
| 871 | 929 | else |
| 872 | 930 | { |
| 873 | 931 | colour = m_gfxbitmap->pix16(scanline, pixel) & 0xff; |
| 932 | if(((m_video.reg[2] & 0x1900) == 0x1900) && (m_video.gfx_pri != 2) && (colour & 1)) |
| 933 | { |
| 934 | blend = true; |
| 935 | colour &= 0xfe; |
| 936 | } |
| 937 | else |
| 938 | blend = false; |
| 874 | 939 | if((colour && (m_gfxpalette->pen(colour) & 0xffffff)) || (m_video.gfx_pri == 2)) |
| 875 | | bitmap.pix32(scanline, pixel) = m_gfxpalette->pen(colour); |
| 940 | { |
| 941 | if(blend) |
| 942 | bitmap.pix32(scanline, pixel) = ((bitmap.pix32(scanline, pixel) >> 1) & 0xff7f7f7f) + ((m_gfxpalette->pen(colour) >> 1) & 0x7f7f7f); |
| 943 | else |
| 944 | bitmap.pix32(scanline, pixel) = m_gfxpalette->pen(colour); |
| 945 | } |
| 876 | 946 | } |
| 877 | 947 | } |
| 878 | 948 | } |
| r30769 | r30770 | |
| 1138 | 1208 | for(pixel=m_crtc.hbegin;pixel<=m_crtc.hend;pixel++) |
| 1139 | 1209 | { |
| 1140 | 1210 | UINT8 colour = m_pcgbitmap->pix16(scanline, pixel) & 0xff; |
| 1141 | | if((colour && (m_pcgpalette->pen(colour) & 0xffffff)) || (priority == 2)) |
| 1211 | if(colour && (m_pcgpalette->pen(colour) & 0xffffff)) |
| 1142 | 1212 | bitmap.pix32(scanline, pixel) = m_pcgpalette->pen(colour); |
| 1143 | 1213 | } |
| 1144 | 1214 | } |