summaryrefslogblamecommitdiffstatshomepage
path: root/src/mame/video/bking.c
blob: 7846853741117ff842e6cd908ae0537a987a7974 (plain) (tree)
1
2
3
4
5
6
7
8
9

                                                                            
         




                                                                            
                
                         
                           

















                                                                            

                     
 


                                                               
              
 





                                                               
                                                    
         
                           














                                                                                       

                                   


                                                     
                                                                  
 
                                     


                                                     
                                                                  
 
                                    

                                                     
                                                            
 
                                                                 



         
                              
 
                                                                         
                              

 
                              
 
                                                                         
                              

 
                              
 
                                                                         
                              

 
                              
 
                                                                         
                              

 
                              
 
                                                                         
                              

 
                              
 
                                                                         
                              


 
                               
 
                                                                         
 





                                                        
                                                              
 
                                                                 
 
                                                                                                                      
 
                                          
 
                                               

 
                               
 
                                                                         
 




                                                                     

                                                
 
                                 

 
                               
 
                                                                         
 



                                                                                               
                                          
 
                                                          
         
                                                                  

         
                                                   
 
                                                          


 
                             
 
                                                                         
                               


 
                                
 
                                                                         
                                 
 



                                      


 
                                   
 
                                                                         

                                                                 


 
                                     
 
                                                                         
                                                                                                

 
                                     
 
                                                                         
                                                                                                

 
                            
 
                                                                         
                                                       




                                     
                                                                

                                                                 





                                           
                                                                            


 
                    
 
                                                                


                                                                                                      
 

                                                      


 
                      
 
                                                                          
 
                                                                  
 
                            
                                                                    

                                      
                     
                                                 
 
                                                                    

                                      
                     
                                                 

                           
                                                                    



                                                                                                                                                 



                 
                   
 
                                                                
                                                      





                         
                                                      
         

                                    
 

                                                                           

                             
                              
 
                               

         
                                                      
         

                                    
 

                                                                           

                             
                              



                               

                                                                                           
 
                                                                             
 

                                                       


                       
                                                                                       





                                                          

                                                                                     







                                                                    

                                                                                                  
 



                                                                                         






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

  bking.c

  Functions to emulate the video hardware of the machine.

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

#include "emu.h"
#include "video/resnet.h"
#include "includes/bking.h"


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

  Convert the color PROMs into a more useable format.

  The palette PROM is connected to the RGB output this way:

  bit 7 -- 390 ohm resistor  -- BLUE
        -- 220 ohm resistor  -- BLUE
        -- 820 ohm resistor  -- GREEN
        -- 390 ohm resistor  -- GREEN
        -- 220 ohm resistor  -- GREEN
        -- 820 ohm resistor  -- RED
        -- 390 ohm resistor  -- RED
  bit 0 -- 220 ohm resistor  -- RED

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

PALETTE_INIT( bking )
{
	static const int resistances_rg[3] = { 220, 390, 820 };
	static const int resistances_b [2] = { 220, 390 };
	double rweights[3], gweights[3], bweights[2];
	int i;

	/* compute the color output resistor weights */
	compute_resistor_weights(0,	255, -1.0,
			3, &resistances_rg[0], rweights, 0, 0,
			3, &resistances_rg[0], gweights, 0, 0,
			2, &resistances_b[0],  bweights, 0, 0);

	for (i = 0; i < machine.total_colors(); i++)
	{
		UINT16 pen;
		int bit0, bit1, bit2, r, g, b;

		/* color PROM A7-A8 is the palette select */
		if (i < 0x20)
			/* characters - image bits go to A0-A2 of the color PROM */
			pen = (((i - 0x00) << 4) & 0x180) | ((i - 0x00) & 0x07);
		else if (i < 0x30)
			/* crow - image bits go to A5-A6. */
			pen = (((i - 0x20) << 5) & 0x180) | (((i - 0x20) & 0x03) << 5);
		else if (i < 0x38)
			/* ball #1 - image bit goes to A3 */
			pen = (((i - 0x30) << 6) & 0x180) | (((i - 0x30) & 0x01) << 3);
		else
			/* ball #2 - image bit goes to A4 */
			pen = (((i - 0x38) << 6) & 0x180) | (((i - 0x38) & 0x01) << 4);

		/* red component */
		bit0 = (color_prom[pen] >> 0) & 0x01;
		bit1 = (color_prom[pen] >> 1) & 0x01;
		bit2 = (color_prom[pen] >> 2) & 0x01;
		r = combine_3_weights(rweights, bit0, bit1, bit2);

		/* green component */
		bit0 = (color_prom[pen] >> 3) & 0x01;
		bit1 = (color_prom[pen] >> 4) & 0x01;
		bit2 = (color_prom[pen] >> 5) & 0x01;
		g = combine_3_weights(gweights, bit0, bit1, bit2);

		/* blue component */
		bit0 = (color_prom[pen] >> 6) & 0x01;
		bit1 = (color_prom[pen] >> 7) & 0x01;
		b = combine_2_weights(gweights, bit0, bit1);

		palette_set_color(machine, i, MAKE_RGB(r, g, b));
	}
}


WRITE8_HANDLER( bking_xld1_w )
{
	bking_state *state = space->machine().driver_data<bking_state>();
	state->m_xld1 = -data;
}

WRITE8_HANDLER( bking_yld1_w )
{
	bking_state *state = space->machine().driver_data<bking_state>();
	state->m_yld1 = -data;
}

WRITE8_HANDLER( bking_xld2_w )
{
	bking_state *state = space->machine().driver_data<bking_state>();
	state->m_xld2 = -data;
}

WRITE8_HANDLER( bking_yld2_w )
{
	bking_state *state = space->machine().driver_data<bking_state>();
	state->m_yld2 = -data;
}

WRITE8_HANDLER( bking_xld3_w )
{
	bking_state *state = space->machine().driver_data<bking_state>();
	state->m_xld3 = -data;
}

WRITE8_HANDLER( bking_yld3_w )
{
	bking_state *state = space->machine().driver_data<bking_state>();
	state->m_yld3 = -data;
}


WRITE8_HANDLER( bking_cont1_w )
{
	bking_state *state = space->machine().driver_data<bking_state>();

	/* D0 = COIN LOCK */
	/* D1 = BALL 5 (Controller selection) */
	/* D2 = VINV (flip screen) */
	/* D3 = Not Connected */
	/* D4-D7 = CROW0-CROW3 (selects crow picture) */

	coin_lockout_global_w(space->machine(), ~data & 0x01);

	flip_screen_set_no_update(space->machine(), data & 0x04);

	tilemap_set_flip_all(space->machine(), flip_screen_get(space->machine()) ? TILEMAP_FLIPX | TILEMAP_FLIPY : 0);

	state->m_controller = data & 0x02;

	state->m_crow_pic = (data >> 4) & 0x0f;
}

WRITE8_HANDLER( bking_cont2_w )
{
	bking_state *state = space->machine().driver_data<bking_state>();

	/* D0-D2 = BALL10 - BALL12 (Selects player 1 ball picture) */
	/* D3-D5 = BALL20 - BALL22 (Selects player 2 ball picture) */
	/* D6 = HIT1 */
	/* D7 = HIT2 */

	state->m_ball1_pic = (data >> 0) & 0x07;
	state->m_ball2_pic = (data >> 3) & 0x07;

	state->m_hit = data >> 6;
}

WRITE8_HANDLER( bking_cont3_w )
{
	bking_state *state = space->machine().driver_data<bking_state>();

	/* D0 = CROW INV (inverts Crow picture and coordinates) */
	/* D1-D2 = COLOR 0 - COLOR 1 (switches 4 color palettes, global across all graphics) */
	/* D3 = SOUND STOP */

	state->m_crow_flip = ~data & 0x01;

	if (state->m_palette_bank != ((data >> 1) & 0x03))
	{
		tilemap_mark_all_tiles_dirty(state->m_bg_tilemap);
	}

	state->m_palette_bank = (data >> 1) & 0x03;

	space->machine().sound().system_mute(data & 0x08);
}


WRITE8_HANDLER( bking_msk_w )
{
	bking_state *state = space->machine().driver_data<bking_state>();
	state->m_pc3259_mask++;
}


WRITE8_HANDLER( bking_hitclr_w )
{
	bking_state *state = space->machine().driver_data<bking_state>();
	state->m_pc3259_mask = 0;

	state->m_pc3259_output[0] = 0;
	state->m_pc3259_output[1] = 0;
	state->m_pc3259_output[2] = 0;
	state->m_pc3259_output[3] = 0;
}


WRITE8_HANDLER( bking_playfield_w )
{
	bking_state *state = space->machine().driver_data<bking_state>();
	state->m_playfield_ram[offset] = data;
	tilemap_mark_tile_dirty(state->m_bg_tilemap, offset / 2);
}


READ8_HANDLER( bking_input_port_5_r )
{
	bking_state *state = space->machine().driver_data<bking_state>();
	return input_port_read(space->machine(), state->m_controller ? "TRACK1_X" : "TRACK0_X");
}

READ8_HANDLER( bking_input_port_6_r )
{
	bking_state *state = space->machine().driver_data<bking_state>();
	return input_port_read(space->machine(), state->m_controller ? "TRACK1_Y" : "TRACK0_Y");
}

READ8_HANDLER( bking_pos_r )
{
	bking_state *state = space->machine().driver_data<bking_state>();
	return state->m_pc3259_output[offset / 8] << 4;
}


static TILE_GET_INFO( get_tile_info )
{
	bking_state *state = machine.driver_data<bking_state>();
	UINT8 code0 = state->m_playfield_ram[2 * tile_index + 0];
	UINT8 code1 = state->m_playfield_ram[2 * tile_index + 1];

	int flags = 0;

	if (code1 & 4) flags |= TILE_FLIPX;
	if (code1 & 8) flags |= TILE_FLIPY;

	SET_TILE_INFO(0, code0 + 256 * code1, state->m_palette_bank, flags);
}


VIDEO_START( bking )
{
	bking_state *state = machine.driver_data<bking_state>();
	state->m_bg_tilemap = tilemap_create(machine, get_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
	state->m_tmp_bitmap1 = machine.primary_screen->alloc_compatible_bitmap();
	state->m_tmp_bitmap2 = machine.primary_screen->alloc_compatible_bitmap();

	state->save_item(NAME(*state->m_tmp_bitmap1));
	state->save_item(NAME(*state->m_tmp_bitmap2));
}


SCREEN_UPDATE( bking )
{
	bking_state *state = screen->machine().driver_data<bking_state>();

	tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0);

	/* draw the balls */
	drawgfx_transpen(bitmap, cliprect, screen->machine().gfx[2],
		state->m_ball1_pic,
		state->m_palette_bank,
		0, 0,
		state->m_xld1, state->m_yld1, 0);

	drawgfx_transpen(bitmap, cliprect, screen->machine().gfx[3],
		state->m_ball2_pic,
		state->m_palette_bank,
		0, 0,
		state->m_xld2, state->m_yld2, 0);

	/* draw the crow */
	drawgfx_transpen(bitmap, cliprect, screen->machine().gfx[1],
		state->m_crow_pic,
		state->m_palette_bank,
		state->m_crow_flip, state->m_crow_flip,
		state->m_crow_flip ? state->m_xld3 - 16 : 256 - state->m_xld3, state->m_crow_flip ? state->m_yld3 - 16 : 256 - state->m_yld3, 0);
	return 0;
}


SCREEN_EOF( bking )
{
	bking_state *state = machine.driver_data<bking_state>();
	static const rectangle rect = { 0, 7, 0, 15 };

	int xld = 0;
	int yld = 0;

	UINT32 latch = 0;

	if (state->m_pc3259_mask == 6)	/* player 1 */
	{
		xld = state->m_xld1;
		yld = state->m_yld1;

		drawgfx_opaque(state->m_tmp_bitmap2, &rect, machine.gfx[2],
			state->m_ball1_pic,
			0,
			0, 0,
			0, 0);

		latch = 0x0c00;
	}

	if (state->m_pc3259_mask == 3)	/* player 2 */
	{
		xld = state->m_xld2;
		yld = state->m_yld2;

		drawgfx_opaque(state->m_tmp_bitmap2, &rect, machine.gfx[3],
			state->m_ball2_pic,
			0,
			0, 0,
			0, 0);

		latch = 0x0400;
	}

	tilemap_set_scrollx(state->m_bg_tilemap, 0, flip_screen_get(machine) ? -xld : xld);
	tilemap_set_scrolly(state->m_bg_tilemap, 0, flip_screen_get(machine) ? -yld : yld);

	tilemap_draw(state->m_tmp_bitmap1, &rect, state->m_bg_tilemap, 0, 0);

	tilemap_set_scrollx(state->m_bg_tilemap, 0, 0);
	tilemap_set_scrolly(state->m_bg_tilemap, 0, 0);

	if (latch != 0)
	{
		const UINT8* MASK = machine.region("user1")->base() + 8 * state->m_hit;

		int x;
		int y;

		for (y = rect.min_y; y <= rect.max_y; y++)
		{
			const UINT16* p0 = BITMAP_ADDR16(state->m_tmp_bitmap1, y, 0);
			const UINT16* p1 = BITMAP_ADDR16(state->m_tmp_bitmap2, y, 0);

			for (x = rect.min_x; x <= rect.max_x; x++)
			{
				if (MASK[p0[x] & 7] && p1[x])
				{
					int col = (xld + x) / 8 + 1;
					int row = (yld + y) / 8 + 0;

					latch |= (flip_screen_get(machine) ? 31 - col : col) << 0;
					latch |= (flip_screen_get(machine) ? 31 - row : row) << 5;

					state->m_pc3259_output[0] = (latch >> 0x0) & 0xf;
					state->m_pc3259_output[1] = (latch >> 0x4) & 0xf;
					state->m_pc3259_output[2] = (latch >> 0x8) & 0xf;
					state->m_pc3259_output[3] = (latch >> 0xc) & 0xf;

					return;
				}
			}
		}
	}
}