diff options
Diffstat (limited to 'src/mame/video/crgolf.c')
-rw-r--r-- | src/mame/video/crgolf.c | 236 |
1 files changed, 236 insertions, 0 deletions
diff --git a/src/mame/video/crgolf.c b/src/mame/video/crgolf.c new file mode 100644 index 00000000000..0cb3e15a805 --- /dev/null +++ b/src/mame/video/crgolf.c @@ -0,0 +1,236 @@ +/*************************************************************************** + + 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; +} |