summaryrefslogblamecommitdiffstatshomepage
path: root/src/mame/video/vicdual.cpp
blob: b3c80d2d677da19f5407bd314a06f52419e9aa08 (plain) (tree)
1
2
3
4
5
6
7
8
9
                       
                                  





                                                                             
                


                             
                                           
 
                       





                                
                      


  
                                            
 
                                                   
                                  


 
                                                                                                                
 


                                   







                                    
                                          


                                                        
                                                     


                                                                            
                                                          


                                            
                                                                            
                                         








                                                      
                                                












                                      
                                                                                                                   
 



                                                         









                                    
                                          


                                                        
                                                     


                                                                            
                                                          

                                                                                    
                                                                        



                                                                                        

                                                                                
 

                                                                
                                         








                                                      
                                                












                                      
                                                                                                                         
 

                                                              
            
                                                           


                 











                                                                     
// license:BSD-3-Clause
// copyright-holders:Zsolt Vasvari
/***************************************************************************

    VIC Dual Game board

****************************************************************************/

#include "emu.h"
#include "includes/vicdual.h"


static const pen_t pens_from_color_prom[] =
{
	rgb_t::black(),
	rgb_t(0x00, 0xff, 0x00),
	rgb_t(0x00, 0x00, 0xff),
	rgb_t(0x00, 0xff, 0xff),
	rgb_t(0xff, 0x00, 0x00),
	rgb_t(0xff, 0xff, 0x00),
	rgb_t(0xff, 0x00, 0xff),
	rgb_t::white()
};


WRITE8_MEMBER(vicdual_state::palette_bank_w)
{
	m_screen->update_partial(m_screen->vpos());
	m_palette_bank = data & 3;
}


uint32_t vicdual_state::screen_update_bw(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
	uint8_t x = 0;
	uint8_t y = cliprect.min_y;
	uint8_t video_data = 0;

	while (1)
	{
		pen_t pen;

		if ((x & 0x07) == 0)
		{
			offs_t offs;
			uint8_t char_code;

			/* read the character code */
			offs = (y >> 3 << 5) | (x >> 3);
			char_code = m_videoram[offs];

			/* read the appropriate line of the character ram */
			offs = (char_code << 3) | (y & 0x07);
			video_data = m_characterram[offs];
		}

		/* plot the current pixel */
		pen = (video_data & 0x80) ? rgb_t::white() : rgb_t::black();
		bitmap.pix32(y, x) = pen;

		/* next pixel */
		video_data = video_data << 1;
		x = x + 1;

		/* end of line? */
		if (x == 0)
		{
			/* end of region to update? */
			if (y == cliprect.max_y)
			{
				break;
			}

			/* next row */
			y = y + 1;
		}
	}

	return 0;
}


uint32_t vicdual_state::screen_update_color(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
	uint8_t *color_prom = (uint8_t *)m_proms->base();
	uint8_t x = 0;
	uint8_t y = cliprect.min_y;
	uint8_t video_data = 0;
	pen_t back_pen = 0;
	pen_t fore_pen = 0;

	while (1)
	{
		pen_t pen;

		if ((x & 0x07) == 0)
		{
			offs_t offs;
			uint8_t char_code;

			/* read the character code */
			offs = (y >> 3 << 5) | (x >> 3);
			char_code = m_videoram[offs];

			/* read the appropriate line of the character ram */
			offs = (char_code << 3) | (y & 0x07);
			video_data = m_characterram[offs];

			/* get the foreground and background colors from the PROM */
			offs = (char_code >> 5) | (m_palette_bank << 3);
			back_pen = pens_from_color_prom[(color_prom[offs] >> 1) & 0x07];
			fore_pen = pens_from_color_prom[(color_prom[offs] >> 5) & 0x07];
		}

		// this does nothing by default, but is used to enable overrides
		back_pen = choose_pen(x, y, back_pen);

		/* plot the current pixel */
		pen = (video_data & 0x80) ? fore_pen : back_pen;
		bitmap.pix32(y, x) = pen;

		/* next pixel */
		video_data = video_data << 1;
		x = x + 1;

		/* end of line? */
		if (x == 0)
		{
			/* end of region to update? */
			if (y == cliprect.max_y)
			{
				break;
			}

			/* next row */
			y = y + 1;
		}
	}

	return 0;
}


uint32_t vicdual_state::screen_update_bw_or_color(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
	if (is_cabinet_color())
		screen_update_color(screen, bitmap, cliprect);
	else
		screen_update_bw(screen, bitmap, cliprect);

	return 0;
}


pen_t vicdual_state::choose_pen(uint8_t x, uint8_t y, pen_t back_pen)
{
	return back_pen;
}


pen_t nsub_state::choose_pen(uint8_t x, uint8_t y, pen_t back_pen)
{
	return m_s97269pb->choose_pen(x, y, back_pen);
}