trunk/src/mame/video/stvvdp2.c
| r20837 | r20838 | |
| 2999 | 2999 | |
| 3000 | 3000 | } |
| 3001 | 3001 | |
| 3002 | void saturn_state::draw_4bpp_bitmap(bitmap_rgb32 &bitmap, const rectangle &cliprect) |
| 3003 | { |
| 3004 | int xsize, ysize; |
| 3005 | int xsrc,ysrc,xdst,ydst; |
| 3006 | int src_offs; |
| 3007 | UINT8* vram = m_vdp2.gfx_decode; |
| 3008 | UINT32 map_offset = stv2_current_tilemap.bitmap_map * 0x20000; |
| 3009 | int scrollx = stv2_current_tilemap.scrollx; |
| 3010 | int scrolly = stv2_current_tilemap.scrolly; |
| 3011 | UINT16 dot_data; |
| 3012 | UINT16 pal_bank; |
| 3002 | 3013 | |
| 3014 | /* TODO: clean this up. */ |
| 3015 | xsize = (stv2_current_tilemap.bitmap_size & 2) ? 1024 : 512; |
| 3016 | ysize = (stv2_current_tilemap.bitmap_size & 1) ? 512 : 256; |
| 3017 | |
| 3018 | pal_bank = stv2_current_tilemap.bitmap_palette_number; |
| 3019 | pal_bank+= stv2_current_tilemap.colour_ram_address_offset; |
| 3020 | pal_bank&= 7; |
| 3021 | pal_bank<<=8; |
| 3022 | if(stv2_current_tilemap.fade_control & 1) |
| 3023 | pal_bank += ((stv2_current_tilemap.fade_control & 2) ? (2*2048) : (2048)); |
| 3024 | |
| 3025 | for(ydst=cliprect.min_y;ydst<=cliprect.max_y;ydst++) |
| 3026 | { |
| 3027 | for(xdst=cliprect.min_x;xdst<=cliprect.max_x;xdst++) |
| 3028 | { |
| 3029 | if(stv_vdp2_window_process(xdst,ydst)) |
| 3030 | continue; |
| 3031 | |
| 3032 | xsrc = (xdst + scrollx) & (xsize-1); |
| 3033 | ysrc = (ydst + scrolly) & (ysize-1); |
| 3034 | src_offs = (xsrc + (ysrc*xsize)); |
| 3035 | src_offs/= 2; |
| 3036 | src_offs += map_offset; |
| 3037 | src_offs &= 0x7ffff; |
| 3038 | |
| 3039 | dot_data = vram[src_offs] >> ((xsrc & 1) ? 0 : 4); |
| 3040 | dot_data&= 0xf; |
| 3041 | |
| 3042 | if ((dot_data != 0) || (stv2_current_tilemap.transparency == STV_TRANSPARENCY_NONE)) |
| 3043 | { |
| 3044 | dot_data += pal_bank; |
| 3045 | |
| 3046 | if ( stv2_current_tilemap.colour_calculation_enabled == 0 ) |
| 3047 | bitmap.pix32(ydst, xdst) = machine().pens[dot_data]; |
| 3048 | else |
| 3049 | bitmap.pix32(ydst, xdst) = alpha_blend_r32(bitmap.pix32(ydst, xdst), machine().pens[dot_data], stv2_current_tilemap.alpha); |
| 3050 | } |
| 3051 | } |
| 3052 | } |
| 3053 | } |
| 3054 | |
| 3055 | |
| 3056 | void saturn_state::draw_8bpp_bitmap(bitmap_rgb32 &bitmap, const rectangle &cliprect) |
| 3057 | { |
| 3058 | int xsize, ysize; |
| 3059 | int xsrc,ysrc,xdst,ydst; |
| 3060 | int src_offs; |
| 3061 | UINT8* vram = m_vdp2.gfx_decode; |
| 3062 | UINT32 map_offset = stv2_current_tilemap.bitmap_map * 0x20000; |
| 3063 | int scrollx = stv2_current_tilemap.scrollx; |
| 3064 | int scrolly = stv2_current_tilemap.scrolly; |
| 3065 | UINT16 dot_data; |
| 3066 | UINT16 pal_bank; |
| 3067 | |
| 3068 | /* TODO: clean this up. */ |
| 3069 | xsize = (stv2_current_tilemap.bitmap_size & 2) ? 1024 : 512; |
| 3070 | ysize = (stv2_current_tilemap.bitmap_size & 1) ? 512 : 256; |
| 3071 | |
| 3072 | pal_bank = stv2_current_tilemap.bitmap_palette_number; |
| 3073 | pal_bank+= stv2_current_tilemap.colour_ram_address_offset; |
| 3074 | pal_bank&= 7; |
| 3075 | pal_bank<<=8; |
| 3076 | if(stv2_current_tilemap.fade_control & 1) |
| 3077 | pal_bank += ((stv2_current_tilemap.fade_control & 2) ? (2*2048) : (2048)); |
| 3078 | |
| 3079 | for(ydst=cliprect.min_y;ydst<=cliprect.max_y;ydst++) |
| 3080 | { |
| 3081 | for(xdst=cliprect.min_x;xdst<=cliprect.max_x;xdst++) |
| 3082 | { |
| 3083 | if(stv_vdp2_window_process(xdst,ydst)) |
| 3084 | continue; |
| 3085 | |
| 3086 | xsrc = (xdst + scrollx) & (xsize-1); |
| 3087 | ysrc = (ydst + scrolly) & (ysize-1); |
| 3088 | src_offs = (xsrc + (ysrc*xsize)); |
| 3089 | src_offs += map_offset; |
| 3090 | src_offs &= 0x7ffff; |
| 3091 | |
| 3092 | dot_data = vram[src_offs]; |
| 3093 | |
| 3094 | if ((dot_data != 0) || (stv2_current_tilemap.transparency == STV_TRANSPARENCY_NONE)) |
| 3095 | { |
| 3096 | dot_data += pal_bank; |
| 3097 | |
| 3098 | if ( stv2_current_tilemap.colour_calculation_enabled == 0 ) |
| 3099 | bitmap.pix32(ydst, xdst) = machine().pens[dot_data]; |
| 3100 | else |
| 3101 | bitmap.pix32(ydst, xdst) = alpha_blend_r32(bitmap.pix32(ydst, xdst), machine().pens[dot_data], stv2_current_tilemap.alpha); |
| 3102 | } |
| 3103 | } |
| 3104 | } |
| 3105 | } |
| 3106 | |
| 3003 | 3107 | void saturn_state::draw_rgb15_bitmap(bitmap_rgb32 &bitmap, const rectangle &cliprect) |
| 3004 | 3108 | { |
| 3005 | 3109 | int xsize, ysize; |
| r20837 | r20838 | |
| 3124 | 3228 | { |
| 3125 | 3229 | switch(stv2_current_tilemap.colour_depth) |
| 3126 | 3230 | { |
| 3231 | case 0: draw_4bpp_bitmap(bitmap,cliprect); return; |
| 3232 | case 1: draw_8bpp_bitmap(bitmap,cliprect); return; |
| 3127 | 3233 | case 3: draw_rgb15_bitmap(bitmap,cliprect); return; |
| 3128 | 3234 | case 4: draw_rgb32_bitmap(bitmap,cliprect); return; |
| 3129 | 3235 | } |