/****************************************************************************** Gomoku Narabe Renju (c)1981 Nihon Bussan Co.,Ltd. Driver by Takahiro Nogi 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(); 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(); 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(); 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(); state->m_bgram[offset] = data; } WRITE8_HANDLER( gomoku_flipscreen_w ) { gomoku_state *state = space->machine().driver_data(); state->m_flipscreen = (data & 0x02) ? 0 : 1; } WRITE8_HANDLER( gomoku_bg_dispsw_w ) { gomoku_state *state = space->machine().driver_data(); state->m_bg_dispsw = (data & 0x02) ? 0 : 1; } /****************************************************************************** Start the video hardware emulation ******************************************************************************/ VIDEO_START( gomoku ) { gomoku_state *state = machine.driver_data(); 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(); 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; }