text: #include "emu.h"
  #include "includes/rollrace.h"
  
  
  
  #define	RA_FGCHAR_BASE	0
  #define RA_BGCHAR_BASE	4
  #define RA_SP_BASE	5
  
  /***************************************************************************
  
    Convert the color PROMs into a more useable format.
  
    Stinger has three 256x4 palette PROMs (one per gun).
    The palette PROMs are connected to the RGB output this way:
  
    bit 3 -- 100 ohm resistor  -- RED/GREEN/BLUE
          -- 220 ohm resistor  -- RED/GREEN/BLUE
          -- 470 ohm resistor  -- RED/GREEN/BLUE
    bit 0 -- 1  kohm resistor  -- RED/GREEN/BLUE
  
  ***************************************************************************/
  PALETTE_INIT( rollrace )
  {
  	int i;
  
  
  	for (i = 0;i < machine.total_colors();i++)
  	{
  		int bit0,bit1,bit2,bit3,r,g,b;
  
  
  		bit0 = (color_prom[0] >> 0) & 0x01;
  		bit1 = (color_prom[0] >> 1) & 0x01;
  		bit2 = (color_prom[0] >> 2) & 0x01;
  		bit3 = (color_prom[0] >> 3) & 0x01;
  		r = 0x0e * bit0 + 0x1f * bit1 + 0x42 * bit2 + 0x90 * bit3;
  		bit0 = (color_prom[machine.total_colors()] >> 0) & 0x01;
  		bit1 = (color_prom[machine.total_colors()] >> 1) & 0x01;
  		bit2 = (color_prom[machine.total_colors()] >> 2) & 0x01;
  		bit3 = (color_prom[machine.total_colors()] >> 3) & 0x01;
  		g = 0x0e * bit0 + 0x1f * bit1 + 0x42 * bit2 + 0x90 * bit3;
  		bit0 = (color_prom[2*machine.total_colors()] >> 0) & 0x01;
  		bit1 = (color_prom[2*machine.total_colors()] >> 1) & 0x01;
  		bit2 = (color_prom[2*machine.total_colors()] >> 2) & 0x01;
  		bit3 = (color_prom[2*machine.total_colors()] >> 3) & 0x01;
  		b = 0x0e * bit0 + 0x1f * bit1 + 0x42 * bit2 + 0x90 * bit3;
  
  		palette_set_color(machine,i,MAKE_RGB(r,g,b));
  
  		color_prom++;
  	}
  }
  
  WRITE8_HANDLER( rollrace_charbank_w)
  {
  	rollrace_state *state = space->machine().driver_data<rollrace_state>();
  
  	state->m_ra_charbank[offset&1] = data;
  	state->m_ra_chrbank = state->m_ra_charbank[0] | (state->m_ra_charbank[1] << 1) ;
  }
  
  
  WRITE8_HANDLER( rollrace_bkgpen_w)
  {
  	rollrace_state *state = space->machine().driver_data<rollrace_state>();
  	state->m_ra_bkgpen = data;
  }
  
  WRITE8_HANDLER(rollrace_spritebank_w)
  {
  	rollrace_state *state = space->machine().driver_data<rollrace_state>();
  	state->m_ra_spritebank = data;
  }
  
  WRITE8_HANDLER(rollrace_backgroundpage_w)
  {
  	rollrace_state *state = space->machine().driver_data<rollrace_state>();
  
  	state->m_ra_bkgpage = data & 0x1f;
  	state->m_ra_bkgflip = ( data & 0x80 ) >> 7;
  
  	/* 0x80 flip vertical */
  }
  
  WRITE8_HANDLER( rollrace_backgroundcolor_w )
  {
  	rollrace_state *state = space->machine().driver_data<rollrace_state>();
  	state->m_ra_bkgcol = data;
  }
  
  WRITE8_HANDLER( rollrace_flipy_w )
  {
  	rollrace_state *state = space->machine().driver_data<rollrace_state>();
  	state->m_ra_flipy = data & 0x01;
  }
  
  WRITE8_HANDLER( rollrace_flipx_w )
  {
  	rollrace_state *state = space->machine().driver_data<rollrace_state>();
  	state->m_ra_flipx = data & 0x01;
  }
  
  SCREEN_UPDATE( rollrace )
  {
  	rollrace_state *state = screen->machine().driver_data<rollrace_state>();
  	UINT8 *spriteram = state->m_spriteram;
  	int offs;
  	int sx, sy;
  	int scroll;
  	int col;
  	const UINT8 *mem = screen->machine().region("user1")->base();
  
  	/* fill in background colour*/
  	bitmap_fill(bitmap,cliprect,state->m_ra_bkgpen);
  
  	/* draw road */
  	for (offs = 0x3ff; offs >= 0; offs--)
  		{
  			if(!(state->m_ra_bkgflip))
  				{
  				sy = ( 31 - offs / 32 ) ;
  				}
  			else
  				sy = ( offs / 32 ) ;
  
  			sx = ( offs%32 ) ;
  
  			if(state->m_ra_flipx)
  				sx = 31-sx ;
  
  			if(state->m_ra_flipy)
  				sy = 31-sy ;
  
  			drawgfx_transpen(bitmap,
  				cliprect,screen->machine().gfx[RA_BGCHAR_BASE],
  				mem[offs + ( state->m_ra_bkgpage * 1024 )]
  				+ ((( mem[offs + 0x4000 + ( state->m_ra_bkgpage * 1024 )] & 0xc0 ) >> 6 ) * 256 ) ,
  				state->m_ra_bkgcol,
  				state->m_ra_flipx,(state->m_ra_bkgflip^state->m_ra_flipy),
  				sx*8,sy*8,0);
  
  
  		}
  
  
  
  
  	/* sprites */
  	for ( offs = 0x80-4 ; offs >=0x0 ; offs -= 4)
  	{
  		int s_flipy = 0;
  		int bank = 0;
  
  		sy=spriteram[offs] - 16;
  		sx=spriteram[offs+3] - 16;
  
  		if(sx && sy)
  		{
  
  		if(state->m_ra_flipx)
  			sx = 224 - sx;
  		if(state->m_ra_flipy)
  			sy = 224 - sy;
  
  		if(spriteram[offs+1] & 0x80)
  			s_flipy = 1;
  
  		bank = (( spriteram[offs+1] & 0x40 ) >> 6 ) ;
  
  		if(bank)
  			bank += state->m_ra_spritebank;
  
  		drawgfx_transpen(bitmap, cliprect,screen->machine().gfx[ RA_SP_BASE + bank ],
  			spriteram[offs+1] & 0x3f ,
  			spriteram[offs+2] & 0x1f,
  			state->m_ra_flipx,!(s_flipy^state->m_ra_flipy),
  			sx,sy,0);
  		}
  	}
  
  
  
  
  	/* draw foreground characters */
  	for (offs = 0x3ff; offs >= 0; offs--)
  	{
  
  		sx =  offs % 32;
  		sy =  offs / 32;
  
  		scroll = ( 8 * sy + state->m_colorram[2 * sx] ) % 256;
  		col = state->m_colorram[ sx * 2 + 1 ]&0x1f;
  
  		if (!state->m_ra_flipy)
  		{
  		   scroll = (248 - scroll) % 256;
  		}
  
  		if (state->m_ra_flipx) sx = 31 - sx;
  
  		drawgfx_transpen(bitmap,cliprect,screen->machine().gfx[RA_FGCHAR_BASE + state->m_ra_chrbank]  ,
  			state->m_videoram[ offs ]  ,
  			col,
  			state->m_ra_flipx,state->m_ra_flipy,
  			8*sx,scroll,0);
  
  	}
  
  
  
  	return 0;
  }
  