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





                                                                            
                
                            

 





                                       
                                                                
 
                                    
                                       
                                                                                                     









                                       
                                                                
 
                                                                                   


 
                                                                    
 
                                                                                   


 
                                                               
 
                                                                                     


 
                                                                   
 
                                                                                     









                                       
                                                                
 


                                                                              
                                                 

                                      

                                              
                                               



                                                                                                                               
                                                                                                        



                                                            
                                                                
         
                                            
 
                                     


















                                                                                              
// license:BSD-3-Clause
// copyright-holders:Alex Pasadyn,Zsolt Vasvari,Aaron Giles
/***************************************************************************

    Gottlieb Exterminator hardware

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

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


/*************************************
 *
 *  Palette setup
 *
 *************************************/

void exterm_state::exterm_palette(palette_device &palette) const
{
	// initialize 555 RGB lookup
	for (int i = 0; i < 32768; i++)
		palette.set_pen_color(i + 0x800, pal5bit(i >> 10), pal5bit(i >> 5), pal5bit(i >> 0));
}



/*************************************
 *
 *  Master shift register
 *
 *************************************/

TMS340X0_TO_SHIFTREG_CB_MEMBER(exterm_state::to_shiftreg_master)
{
	memcpy(shiftreg, &m_master_videoram[address >> 4], 256 * sizeof(uint16_t));
}


TMS340X0_FROM_SHIFTREG_CB_MEMBER(exterm_state::from_shiftreg_master)
{
	memcpy(&m_master_videoram[address >> 4], shiftreg, 256 * sizeof(uint16_t));
}


TMS340X0_TO_SHIFTREG_CB_MEMBER(exterm_state::to_shiftreg_slave)
{
	memcpy(shiftreg, &m_slave_videoram[address >> 4], 256 * 2 * sizeof(uint8_t));
}


TMS340X0_FROM_SHIFTREG_CB_MEMBER(exterm_state::from_shiftreg_slave)
{
	memcpy(&m_slave_videoram[address >> 4], shiftreg, 256 * 2 * sizeof(uint8_t));
}



/*************************************
 *
 *  Main video refresh
 *
 *************************************/

TMS340X0_SCANLINE_IND16_CB_MEMBER(exterm_state::scanline_update)
{
	uint16_t *bgsrc = &m_master_videoram[(params->rowaddr << 8) & 0xff00];
	uint16_t *fgsrc = nullptr;
	uint16_t *dest = &bitmap.pix16(scanline);
	tms340x0_device::display_params fgparams;
	int coladdr = params->coladdr;
	int fgcoladdr = 0;

	/* get parameters for the slave CPU */
	m_slave->get_display_params(&fgparams);

	/* compute info about the slave vram */
	if (fgparams.enabled && scanline >= fgparams.veblnk && scanline < fgparams.vsblnk && fgparams.heblnk < fgparams.hsblnk)
	{
		fgsrc = &m_slave_videoram[((fgparams.rowaddr << 8) + (fgparams.yoffset << 7)) & 0xff80];
		fgcoladdr = (fgparams.coladdr >> 1);
	}

	/* copy the non-blanked portions of this scanline */
	for (int x = params->heblnk; x < params->hsblnk; x += 2)
	{
		uint16_t bgdata, fgdata = 0;

		if (fgsrc != nullptr)
			fgdata = fgsrc[fgcoladdr++ & 0x7f];

		bgdata = bgsrc[coladdr++ & 0xff];
		if ((bgdata & 0xe000) == 0xe000)
			dest[x + 0] = bgdata & 0x7ff;
		else if ((fgdata & 0x00ff) != 0)
			dest[x + 0] = fgdata & 0x00ff;
		else
			dest[x + 0] = (bgdata & 0x8000) ? (bgdata & 0x7ff) : (bgdata + 0x800);

		bgdata = bgsrc[coladdr++ & 0xff];
		if ((bgdata & 0xe000) == 0xe000)
			dest[x + 1] = bgdata & 0x7ff;
		else if ((fgdata & 0xff00) != 0)
			dest[x + 1] = fgdata >> 8;
		else
			dest[x + 1] = (bgdata & 0x8000) ? (bgdata & 0x7ff) : (bgdata + 0x800);
	}
}