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









                                                                               
                
                            

 










                                                                               
                                                    






























                                                                               
                                                                  

                                                   











                                             
                                                                           

                                                            



                                   
                                                                           

                                                            



                                
                                                                           
                                      



                                     
                                                                           
                                                    



                                    
                                                                           
                                                   










                                                                               



                                                                  



                   
                                                                               
 
                                                                                                     
 
                                                           

                                    
                                                 












                                                                                                        
                                                                                                               










                                                                               
                       
 



                                                                            






                                   
                               

                                    
                                                                             








                                                                                                        
                                                               


























                                                                                                           
                                                               




















                                                                                                           
                                             

         
                                                                  

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

    Gomoku Narabe Renju
    (c)1981 Nihon Bussan Co.,Ltd.

    Driver by Takahiro Nogi <nogi@kt.rim.or.jp> 1999/11/06 -
    Updated to compile again by David Haywood 19th Oct 2002

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

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


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

    palette RAM

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

PALETTE_INIT( gomoku )
{
	int i;
	int bit0, bit1, bit2, r, g, b;

	for (i = 0; i < machine.total_colors(); i++)
	{
		/* red component */
		bit0 = (*color_prom >> 0) & 0x01;
		bit1 = (*color_prom >> 1) & 0x01;
		bit2 = (*color_prom >> 2) & 0x01;
		r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
		/* green component */
		bit0 = (*color_prom >> 3) & 0x01;
		bit1 = (*color_prom >> 4) & 0x01;
		bit2 = (*color_prom >> 5) & 0x01;
		g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
		/* blue component */
		bit0 = 0;
		bit1 = (*color_prom >> 6) & 0x01;
		bit2 = (*color_prom >> 7) & 0x01;
		b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;

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


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

    Tilemap callbacks

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

static TILE_GET_INFO( get_fg_tile_info )
{
	gomoku_state *state = machine.driver_data<gomoku_state>();
	int code = (state->m_videoram[tile_index]);
	int attr = (state->m_colorram[tile_index]);
	int color = (attr& 0x0f);
	int flipyx = (attr & 0xc0) >> 6;

	SET_TILE_INFO(
			0,
			code,
			color,
			TILE_FLIPYX(flipyx));
}

WRITE8_HANDLER( gomoku_videoram_w )
{
	gomoku_state *state = space->machine().driver_data<gomoku_state>();
	state->m_videoram[offset] = data;
	tilemap_mark_tile_dirty(state->m_fg_tilemap,offset);
}

WRITE8_HANDLER( gomoku_colorram_w )
{
	gomoku_state *state = space->machine().driver_data<gomoku_state>();
	state->m_colorram[offset] = data;
	tilemap_mark_tile_dirty(state->m_fg_tilemap,offset);
}

WRITE8_HANDLER( gomoku_bgram_w )
{
	gomoku_state *state = space->machine().driver_data<gomoku_state>();
	state->m_bgram[offset] = data;
}

WRITE8_HANDLER( gomoku_flipscreen_w )
{
	gomoku_state *state = space->machine().driver_data<gomoku_state>();
	state->m_flipscreen = (data & 0x02) ? 0 : 1;
}

WRITE8_HANDLER( gomoku_bg_dispsw_w )
{
	gomoku_state *state = space->machine().driver_data<gomoku_state>();
	state->m_bg_dispsw = (data & 0x02) ? 0 : 1;
}


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

    Start the video hardware emulation

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

VIDEO_START( gomoku )
{
	gomoku_state *state = machine.driver_data<gomoku_state>();
	UINT8 *GOMOKU_BG_X = machine.region( "user1" )->base();
	UINT8 *GOMOKU_BG_Y = machine.region( "user2" )->base();
	UINT8 *GOMOKU_BG_D = machine.region( "user3" )->base();
	int x, y;
	int bgdata;
	int color;

	state->m_bg_bitmap = machine.primary_screen->alloc_compatible_bitmap();

	state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info,tilemap_scan_rows,8,8,32, 32);

	tilemap_set_transparent_pen(state->m_fg_tilemap,0);

	/* make background bitmap */
	bitmap_fill(state->m_bg_bitmap, 0, 0x20);

	// board
	for (y = 0; y < 256; y++)
	{
		for (x = 0; x < 256; x++)
		{
			bgdata = GOMOKU_BG_D[ GOMOKU_BG_X[x] + (GOMOKU_BG_Y[y] << 4) ];

			color = 0x20;						// outside frame (black)

			if (bgdata & 0x01) color = 0x21;	// board (brown)
			if (bgdata & 0x02) color = 0x20;	// frame line (while)

			*BITMAP_ADDR16(state->m_bg_bitmap, (255 - y - 1) & 0xff, (255 - x + 7) & 0xff) = color;
		}
	}
}


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

    Display refresh

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

SCREEN_UPDATE( gomoku )
{
	gomoku_state *state = screen->machine().driver_data<gomoku_state>();
	UINT8 *GOMOKU_BG_X = screen->machine().region( "user1" )->base();
	UINT8 *GOMOKU_BG_Y = screen->machine().region( "user2" )->base();
	UINT8 *GOMOKU_BG_D = screen->machine().region( "user3" )->base();
	int x, y;
	int bgram;
	int bgoffs;
	int bgdata;
	int color;

	/* draw background layer */
	if (state->m_bg_dispsw)
	{
		/* copy bg bitmap */
		copybitmap(bitmap, state->m_bg_bitmap, 0, 0, 0, 0, cliprect);

		// stone
		for (y = 0; y < 256; y++)
		{
			for (x = 0; x < 256; x++)
			{
				bgoffs = ((((255 - x - 2) / 14) | (((255 - y - 10) / 14) << 4)) & 0xff);

				bgdata = GOMOKU_BG_D[ GOMOKU_BG_X[x] + (GOMOKU_BG_Y[y] << 4) ];
				bgram = state->m_bgram[bgoffs];

				if (bgdata & 0x04)
				{
					if (bgram & 0x01)
					{
						color = 0x2f;	// stone (black)
					}
					else if (bgram & 0x02)
					{
						color = 0x22;	// stone (white)
					}
					else continue;
				}
				else continue;

				*BITMAP_ADDR16(bitmap, (255 - y - 1) & 0xff, (255 - x + 7) & 0xff) = color;
			}
		}

		// cursor
		for (y = 0; y < 256; y++)
		{
			for (x = 0; x < 256; x++)
			{
				bgoffs = ((((255 - x - 2) / 14) | (((255 - y - 10) / 14) << 4)) & 0xff);

				bgdata = GOMOKU_BG_D[ GOMOKU_BG_X[x] + (GOMOKU_BG_Y[y] << 4) ];
				bgram = state->m_bgram[bgoffs];

				if (bgdata & 0x08)
				{
					if (bgram & 0x04)
					{
							color = 0x2f;	// cursor (black)
					}
					else if (bgram & 0x08)
					{
						color = 0x22;		// cursor (white)
					}
					else continue;
				}
				else continue;

				*BITMAP_ADDR16(bitmap, (255 - y - 1) & 0xff, (255 - x + 7) & 0xff) = color;
			}
		}
	}
	else
	{
		bitmap_fill(bitmap, 0, 0x20);
	}

	tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0);
	return 0;
}