/***************************************************************************
Kitco Crowns Golf hardware
***************************************************************************/
#include "driver.h"
#include "crgolf.h"
/* globals */
UINT8 *crgolf_color_select;
UINT8 *crgolf_screen_flip;
UINT8 *crgolf_screen_select;
UINT8 *crgolf_screenb_enable;
UINT8 *crgolf_screena_enable;
/* local variables */
static mame_bitmap *screena;
static mame_bitmap *screenb;
static mame_bitmap *highbit;
/*************************************
*
* Video RAM writes
*
*************************************/
WRITE8_HANDLER( crgolf_videoram_bit0_w )
{
mame_bitmap *screen = (*crgolf_screen_select & 1) ? screenb : screena;
int x = (offset % 32) * 8;
int y = offset / 32;
UINT16 *dest = (UINT16 *)screen->base + screen->rowpixels * y + x;
dest[0] = (dest[0] & ~0x01) | ((data >> 7) & 0x01);
dest[1] = (dest[1] & ~0x01) | ((data >> 6) & 0x01);
dest[2] = (dest[2] & ~0x01) | ((data >> 5) & 0x01);
dest[3] = (dest[3] & ~0x01) | ((data >> 4) & 0x01);
dest[4] = (dest[4] & ~0x01) | ((data >> 3) & 0x01);
dest[5] = (dest[5] & ~0x01) | ((data >> 2) & 0x01);
dest[6] = (dest[6] & ~0x01) | ((data >> 1) & 0x01);
dest[7] = (dest[7] & ~0x01) | ((data >> 0) & 0x01);
}
WRITE8_HANDLER( crgolf_videoram_bit1_w )
{
mame_bitmap *screen = (*crgolf_screen_select & 1) ? screenb : screena;
int x = (offset % 32) * 8;
int y = offset / 32;
UINT16 *dest = (UINT16 *)screen->base + screen->rowpixels * y + x;
dest[0] = (dest[0] & ~0x02) | ((data >> 6) & 0x02);
dest[1] = (dest[1] & ~0x02) | ((data >> 5) & 0x02);
dest[2] = (dest[2] & ~0x02) | ((data >> 4) & 0x02);
dest[3] = (dest[3] & ~0x02) | ((data >> 3) & 0x02);
dest[4] = (dest[4] & ~0x02) | ((data >> 2) & 0x02);
dest[5] = (dest[5] & ~0x02) | ((data >> 1) & 0x02);
dest[6] = (dest[6] & ~0x02) | ((data >> 0) & 0x02);
dest[7] = (dest[7] & ~0x02) | ((data << 1) & 0x02);
}
WRITE8_HANDLER( crgolf_videoram_bit2_w )
{
mame_bitmap *screen = (*crgolf_screen_select & 1) ? screenb : screena;
int x = (offset % 32) * 8;
int y = offset / 32;
UINT16 *dest = (UINT16 *)screen->base + screen->rowpixels * y + x;
dest[0] = (dest[0] & ~0x04) | ((data >> 5) & 0x04);
dest[1] = (dest[1] & ~0x04) | ((data >> 4) & 0x04);
dest[2] = (dest[2] & ~0x04) | ((data >> 3) & 0x04);
dest[3] = (dest[3] & ~0x04) | ((data >> 2) & 0x04);
dest[4] = (dest[4] & ~0x04) | ((data >> 1) & 0x04);
dest[5] = (dest[5] & ~0x04) | ((data >> 0) & 0x04);
dest[6] = (dest[6] & ~0x04) | ((data << 1) & 0x04);
dest[7] = (dest[7] & ~0x04) | ((data << 2) & 0x04);
}
/*************************************
*
* Video RAM reads
*
*************************************/
READ8_HANDLER( crgolf_videoram_bit0_r )
{
mame_bitmap *screen = (*crgolf_screen_select & 1) ? screenb : screena;
int x = (offset % 32) * 8;
int y = offset / 32;
UINT16 *source = (UINT16 *)screen->base + screen->rowpixels * y + x;
return ((source[0] & 0x01) << 7) |
((source[1] & 0x01) << 6) |
((source[2] & 0x01) << 5) |
((source[3] & 0x01) << 4) |
((source[4] & 0x01) << 3) |
((source[5] & 0x01) << 2) |
((source[6] & 0x01) << 1) |
((source[7] & 0x01) << 0);
}
READ8_HANDLER( crgolf_videoram_bit1_r )
{
mame_bitmap *screen = (*crgolf_screen_select & 1) ? screenb : screena;
int x = (offset % 32) * 8;
int y = offset / 32;
UINT16 *source = (UINT16 *)screen->base + screen->rowpixels * y + x;
return ((source[0] & 0x02) << 6) |
((source[1] & 0x02) << 5) |
((source[2] & 0x02) << 4) |
((source[3] & 0x02) << 3) |
((source[4] & 0x02) << 2) |
((source[5] & 0x02) << 1) |
((source[6] & 0x02) << 0) |
((source[7] & 0x02) >> 1);
}
READ8_HANDLER( crgolf_videoram_bit2_r )
{
mame_bitmap *screen = (*crgolf_screen_select & 1) ? screenb : screena;
int x = (offset % 32) * 8;
int y = offset / 32;
UINT16 *source = (UINT16 *)screen->base + screen->rowpixels * y + x;
return ((source[0] & 0x04) << 5) |
((source[1] & 0x04) << 4) |
((source[2] & 0x04) << 3) |
((source[3] & 0x04) << 2) |
((source[4] & 0x04) << 1) |
((source[5] & 0x04) << 0) |
((source[6] & 0x04) >> 1) |
((source[7] & 0x04) >> 2);
}
/*************************************
*
* Color PROM decoding
*
*************************************/
PALETTE_INIT( crgolf )
{
int i;
for (i = 0; i < 32; i++)
{
int bit0, bit1, bit2, r, g, b;
/* 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 = (*color_prom >> 6) & 0x01;
bit1 = (*color_prom >> 7) & 0x01;
b = 0x4f * bit0 + 0xa8 * bit1;
palette_set_color(machine, i, MAKE_RGB(r, g, b));
color_prom++;
}
}
/*************************************
*
* Video startup
*
*************************************/
VIDEO_START( crgolf )
{
/* allocate temporary bitmaps */
screena = auto_bitmap_alloc(256, 256, machine->screen[0].format);
screenb = auto_bitmap_alloc(256, 256, machine->screen[0].format);
highbit = auto_bitmap_alloc(256, 256, machine->screen[0].format);
/* initialize the "high bit" bitmap */
fillbitmap(screena, 0, NULL);
fillbitmap(screenb, 8, NULL);
fillbitmap(highbit, 16, NULL);
/* register for save states */
state_save_register_bitmap("video", 0, "screena", screena);
state_save_register_bitmap("video", 0, "screenb", screenb);
state_save_register_bitmap("video", 0, "highbit", highbit);
}
/*************************************
*
* Video update
*
*************************************/
VIDEO_UPDATE( crgolf )
{
int flip = *crgolf_screen_flip & 1;
/* draw screen b if enabled */
if (~*crgolf_screenb_enable & 1)
copybitmap(bitmap, screenb, flip, flip, 0, 0, cliprect, TRANSPARENCY_NONE, 0);
else
fillbitmap(bitmap, 8, cliprect);
/* draw screen a if enabled */
if (~*crgolf_screena_enable & 1)
copybitmap(bitmap, screena, flip, flip, 0, 0, cliprect, TRANSPARENCY_PEN, 0);
/* apply the color select bit */
if (*crgolf_color_select)
copybitmap(bitmap, highbit, 0, 0, 0, 0, cliprect, TRANSPARENCY_BLEND, 0);
return 0;
}