text: /***************************************************************************
  
                                -= Blomby Car =-
  
                      driver by   Luca Elia (l.elia@tin.it)
  
  
  Note:   if MAME_DEBUG is defined, pressing Z with:
  
          Q       shows the background
          W       shows the foreground
          A       shows the sprites
  
          Keys can be used together!
  
  
      [ 2 Scrolling Layers ]
  
      The Tilemaps are 64 x 32 tiles in size (1024 x 512).
      Tiles are 16 x 16 x 4, with 32 color codes and 2 priority
      leves (wrt sprites). Each tile needs 4 bytes.
  
      [ 1024? Sprites ]
  
      They use the same graphics the tilemaps use (16 x 16 x 4 tiles)
      with 16 color codes and 2 levels of priority
  
  
  ***************************************************************************/
  
  #include "driver.h"
  
  /* Variables needed by driver: */
  
  UINT16 *blmbycar_vram_0, *blmbycar_scroll_0;
  UINT16 *blmbycar_vram_1, *blmbycar_scroll_1;
  
  
  /***************************************************************************
  
  
                                  Palette
  
  
  ***************************************************************************/
  
  /* xxxxBBBBGGGGRRRR */
  
  WRITE16_HANDLER( blmbycar_palette_w )
  {
  	data = COMBINE_DATA(&paletteram16[offset]);
  	palette_set_color_rgb( Machine, offset, pal4bit(data >> 4), pal4bit(data >> 0), pal4bit(data >> 8));
  }
  
  
  
  /***************************************************************************
  
  
                                  Tilemaps
  
      Offset:     Bits:                   Value:
  
          0.w                             Code
          2.w     fedc ba98 ---- ----
                  ---- ---- 7--- ----     Flip Y
                  ---- ---- -6-- ----     Flip X
                  ---- ---- --5- ----     Priority (0 = Low)
                  ---- ---- ---4 3210     Color
  
  ***************************************************************************/
  
  static tilemap *tilemap_0, *tilemap_1;
  
  #define DIM_NX		(0x40)
  #define DIM_NY		(0x20)
  
  static TILE_GET_INFO( get_tile_info_0 )
  {
  	UINT16 code = blmbycar_vram_0[ tile_index * 2 + 0 ];
  	UINT16 attr = blmbycar_vram_0[ tile_index * 2 + 1 ];
  	SET_TILE_INFO(
  			0,
  			code,
  			attr & 0x1f,
  			TILE_FLIPYX((attr >> 6) & 3));
  
  	tileinfo->category = (attr >> 5) & 1;
  }
  
  static TILE_GET_INFO( get_tile_info_1 )
  {
  	UINT16 code = blmbycar_vram_1[ tile_index * 2 + 0 ];
  	UINT16 attr = blmbycar_vram_1[ tile_index * 2 + 1 ];
  	SET_TILE_INFO(
  			0,
  			code,
  			attr & 0x1f,
  			TILE_FLIPYX((attr >> 6) & 3));
  
  	tileinfo->category = (attr >> 5) & 1;
  }
  
  
  WRITE16_HANDLER( blmbycar_vram_0_w )
  {
  	COMBINE_DATA(&blmbycar_vram_0[offset]);
  	tilemap_mark_tile_dirty(tilemap_0, offset/2);
  }
  
  WRITE16_HANDLER( blmbycar_vram_1_w )
  {
  	COMBINE_DATA(&blmbycar_vram_1[offset]);
  	tilemap_mark_tile_dirty(tilemap_1, offset/2);
  }
  
  
  /***************************************************************************
  
  
                                  Video Init
  
  
  ***************************************************************************/
  
  VIDEO_START( blmbycar )
  {
  	tilemap_0 = tilemap_create(	get_tile_info_0, tilemap_scan_rows,
  								TILEMAP_TYPE_PEN, 16,16, DIM_NX, DIM_NY );
  
  	tilemap_1 = tilemap_create(	get_tile_info_1, tilemap_scan_rows,
  								TILEMAP_TYPE_PEN, 16,16, DIM_NX, DIM_NY );
  
  		tilemap_set_scroll_rows(tilemap_0,1);
  		tilemap_set_scroll_cols(tilemap_0,1);
  
  		tilemap_set_scroll_rows(tilemap_1,1);
  		tilemap_set_scroll_cols(tilemap_1,1);
  		tilemap_set_transparent_pen(tilemap_1,0);
  }
  
  
  /***************************************************************************
  
  
                                  Sprites Drawing
  
      Offset:     Bits:                   Value:
  
          0.w     f--- ---- ---- ----     End Of Sprites
                  -edc ba9- ---- ----
                  ---- ---8 7654 3210     Y (Signed)
  
          2.w                             Code
  
          4.w     f--- ---- ---- ----     Flip Y
                  -e-- ---- ---- ----     Flip X
                  --dc ba98 7654 ----
                  ---- ---- ---- 3210     Color (Bit 3 = Priority)
  
          6.w     f--- ---- ---- ----     ? Is this ever used ?
                  -e-- ---- ---- ----     ? 1 = Don't Draw ?
                  --dc ba9- ---- ----
                  ---- ---8 7654 3210     X (Signed)
  
  
  ***************************************************************************/
  
  static void draw_sprites(running_machine *machine, mame_bitmap *bitmap, const rectangle *cliprect)
  {
  	UINT16 *source, *finish;
  
  	source = spriteram16 + 0x6/2;				// !
  	finish = spriteram16 + spriteram_size/2 - 8/2;
  
  	/* Find "the end of sprites" marker */
  
  	for ( ; source < finish; source += 8/2 )
  		if (source[0] & 0x8000)	break;
  
  	/* Draw sprites in reverse order for pdrawfgfx */
  
  	source -= 8/2;
  	finish = spriteram16;
  
  	for ( ; source >= finish; source -= 8/2 )
  	{
  		int	y			=	source[0];
  		int	code		=	source[1];
  		int	attr		=	source[2];
  		int	x			=	source[3];
  
  		int	flipx		=	attr & 0x4000;
  		int	flipy		=	attr & 0x8000;
  		int	pri			=	(~attr >> 3) & 0x1;		// Priority (1 = Low)
  		int pri_mask	=	~((1 << (pri+1)) - 1);	// Above the first "pri" levels
  
  		if (x & 0x4000)	continue;	// ? To get rid of the "shadow" blocks
  
  		x	=	(x & 0x1ff) - 0x10;
  		y	=	0xf0 - ((y & 0xff)  - (y & 0x100));
  
  		pdrawgfx(	bitmap, machine->gfx[0],
  					code,
  					0x20 + (attr & 0xf),
  					flipx, flipy,
  					x, y,
  					cliprect, TRANSPARENCY_PEN,0,
  					pri_mask	);
  	}
  }
  
  
  /***************************************************************************
  
  
                                  Screen Drawing
  
  
  ***************************************************************************/
  
  VIDEO_UPDATE( blmbycar )
  {
  	int i,layers_ctrl = -1;
  
  	tilemap_set_scrolly( tilemap_0, 0, blmbycar_scroll_0[ 0 ]);
  	tilemap_set_scrollx( tilemap_0, 0, blmbycar_scroll_0[ 1 ]);
  
  	tilemap_set_scrolly( tilemap_1, 0, blmbycar_scroll_1[ 0 ]+1);
  	tilemap_set_scrollx( tilemap_1, 0, blmbycar_scroll_1[ 1 ]+5);
  
  #ifdef MAME_DEBUG
  if (input_code_pressed(KEYCODE_Z))
  {
  	int msk = 0;
  
  	if (input_code_pressed(KEYCODE_Q))	msk |= 1;
  	if (input_code_pressed(KEYCODE_W))	msk |= 2;
  //  if (input_code_pressed(KEYCODE_E))    msk |= 4;
  	if (input_code_pressed(KEYCODE_A))	msk |= 8;
  	if (msk != 0) layers_ctrl &= msk;
  }
  #endif
  
  	fillbitmap(priority_bitmap,0,cliprect);
  
  	if (layers_ctrl&1)
  		for (i = 0; i <= 1; i++)
  			tilemap_draw(bitmap, cliprect, tilemap_0, i, i);
  	else	fillbitmap(bitmap,machine->pens[0],cliprect);
  
  	if (layers_ctrl&2)
  		for (i = 0; i <= 1; i++)
  			tilemap_draw(bitmap, cliprect, tilemap_1, i, i);
  
  	if (layers_ctrl&8)
  		draw_sprites(machine, bitmap, cliprect);
  	return 0;
  }
  