Previous 199869 Revisions Next

r20838 Friday 8th February, 2013 at 15:12:14 UTC by Angelo Salese
Added 4bpp and 8bpp cases, fixes at least Code R crash after loading
[src/mame/includes]stv.h
[src/mame/video]stvvdp2.c

trunk/src/mame/video/stvvdp2.c
r20837r20838
29992999
30003000}
30013001
3002void 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;
30023013
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
3056void 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
30033107void saturn_state::draw_rgb15_bitmap(bitmap_rgb32 &bitmap, const rectangle &cliprect)
30043108{
30053109   int xsize, ysize;
r20837r20838
31243228   {
31253229      switch(stv2_current_tilemap.colour_depth)
31263230      {
3231         case 0: draw_4bpp_bitmap(bitmap,cliprect); return;
3232         case 1: draw_8bpp_bitmap(bitmap,cliprect); return;
31273233         case 3: draw_rgb15_bitmap(bitmap,cliprect); return;
31283234         case 4: draw_rgb32_bitmap(bitmap,cliprect); return;
31293235      }
trunk/src/mame/includes/stv.h
r20837r20838
387387
388388   void stv_vdp2_draw_basic_tilemap(bitmap_rgb32 &bitmap, const rectangle &cliprect);
389389   void stv_vdp2_draw_basic_bitmap(bitmap_rgb32 &bitmap, const rectangle &cliprect);
390   void draw_4bpp_bitmap(bitmap_rgb32 &bitmap, const rectangle &cliprect);
391   void draw_8bpp_bitmap(bitmap_rgb32 &bitmap, const rectangle &cliprect);
392//   void draw_11bpp_bitmap(bitmap_rgb32 &bitmap, const rectangle &cliprect);
390393   void draw_rgb15_bitmap(bitmap_rgb32 &bitmap, const rectangle &cliprect);
391394   void draw_rgb32_bitmap(bitmap_rgb32 &bitmap, const rectangle &cliprect);
392395

Previous 199869 Revisions Next


© 1997-2024 The MAME Team