summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/video/crgolf.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/video/crgolf.c')
-rw-r--r--src/mame/video/crgolf.c236
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;
+}