Previous 199869 Revisions Next

r30770 Monday 2nd June, 2014 at 03:30:04 UTC by Carl
(mess) x68k: experiments in layer blending (nw)
[src/mess/drivers]x68k.c
[src/mess/includes]x68k.h
[src/mess/video]x68k.c

trunk/src/mess/includes/x68k.h
r30769r30770
339339   void x68k_crtc_text_copy(int src, int dest);
340340   void x68k_crtc_refresh_mode();
341341   void x68k_draw_text(bitmap_rgb32 &bitmap, int xscr, int yscr, rectangle rect);
342   void x68k_draw_gfx_scanline(bitmap_ind16 &bitmap, rectangle cliprect, UINT8 priority);
342   bool x68k_draw_gfx_scanline(bitmap_ind16 &bitmap, rectangle cliprect, UINT8 priority);
343343   void x68k_draw_gfx(bitmap_rgb32 &bitmap,rectangle cliprect);
344344   void x68k_draw_sprites(bitmap_ind16 &bitmap, int priority, rectangle cliprect);
345345
trunk/src/mess/video/x68k.c
r30769r30770
733733   }
734734}
735735
736void x68k_state::x68k_draw_gfx_scanline( bitmap_ind16 &bitmap, rectangle cliprect, UINT8 priority)
736bool x68k_state::x68k_draw_gfx_scanline( bitmap_ind16 &bitmap, rectangle cliprect, UINT8 priority)
737737{
738738   int pixel;
739739   int page;
r30769r30770
743743   UINT16 colour = 0;
744744   int shift;
745745   int scanline;
746   bool blend, ret = false;
747   UINT16 *pal = (UINT16 *)m_gfxpalette->basemem().base();
746748
747749   for(scanline=cliprect.min_y;scanline<=cliprect.max_y;scanline++)  // per scanline
748750   {
r30769r30770
793795               lineoffset = (((scanline - m_crtc.vbegin) + yscr) & 0x1ff) * 512;
794796               loc = xscr & 0x1ff;
795797               shift = 4;
798               if((m_video.reg[2] & 0x1a00) == 0x1a00)
799                  ret = true;
796800               for(pixel=m_crtc.hbegin;pixel<=m_crtc.hend;pixel++)
797801               {
798802                  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;
799810                  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                  }
801822                  loc++;
802823                  loc &= 0x1ff;
803824               }
r30769r30770
810831                  lineoffset = (((scanline - m_crtc.vbegin) + yscr) & 0x1ff) * 512;
811832                  loc = xscr & 0x1ff;
812833                  shift = 4;
834                  if((m_video.reg[2] & 0x1a00) == 0x1a00)
835                     ret = true;
813836                  for(pixel=m_crtc.hbegin;pixel<=m_crtc.hend;pixel++)
814837                  {
815838                     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;
816846                     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                     }
818858                     loc++;
819859                     loc &= 0x1ff;
820860                  }
r30769r30770
838878         }
839879      }
840880   }
881   return ret;
841882}
842883
843884void x68k_state::x68k_draw_gfx(bitmap_rgb32 &bitmap,rectangle cliprect)
844885{
845886   int priority, scanline, pixel;
887   bool gfxblend;
846888   //rectangle rect;
847889   //int xscr,yscr;
848890   //int gpage;
r30769r30770
854896
855897   for(priority=3;priority>=0;priority--)
856898   {
857      x68k_draw_gfx_scanline(*m_gfxbitmap,cliprect,priority);
899      gfxblend = x68k_draw_gfx_scanline(*m_gfxbitmap,cliprect,priority);
858900   }
859901
860902   for(scanline=cliprect.min_y;scanline<=cliprect.max_y;scanline++)
861903   {
862904      UINT16 colour;
905      bool blend = false;
863906      for(pixel=m_crtc.hbegin;pixel<=m_crtc.hend;pixel++)
864907      {
865908         if((m_video.reg[0] & 0x03) == 3)
r30769r30770
868911            if(colour || (m_video.gfx_pri == 2))
869912               bitmap.pix32(scanline, pixel) = pal555(colour, 6, 11, 1);
870913         }
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         }
871929         else
872930         {
873931            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;
874939            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            }
876946         }
877947      }
878948   }
r30769r30770
11381208            for(pixel=m_crtc.hbegin;pixel<=m_crtc.hend;pixel++)
11391209            {
11401210               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))
11421212                  bitmap.pix32(scanline, pixel) = m_pcgpalette->pen(colour);
11431213            }
11441214         }
trunk/src/mess/drivers/x68k.c
r30769r30770
108108      Tetris:        Black dots over screen (text layer).
109109      Parodius Da!:  Black squares in areas.
110110      PacLand:       Leftover garbage on title screen
111      Akumajo Drac:  Missing transparency, no sfx starting on second stage (m68000 only, 030 is fine), text layer not being cleared properly
111      Akumajo Drac:  no sfx starting on second stage (m68000 only, 030 is fine), text layer not being cleared properly
112112
113113
114114    More detailed documentation at http://x68kdev.emuvibes.com/iomap.html - if you can stand broken english :)

Previous 199869 Revisions Next


© 1997-2024 The MAME Team