summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/video/capbowl.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/video/capbowl.c')
-rw-r--r--src/mame/video/capbowl.c197
1 files changed, 197 insertions, 0 deletions
diff --git a/src/mame/video/capbowl.c b/src/mame/video/capbowl.c
new file mode 100644
index 00000000000..54b93f0d19e
--- /dev/null
+++ b/src/mame/video/capbowl.c
@@ -0,0 +1,197 @@
+/***************************************************************************
+
+ Coors Light Bowling/Bowl-O-Rama hardware
+
+***************************************************************************/
+
+#include "driver.h"
+#include "video/tms34061.h"
+#include "cpu/m6809/m6809.h"
+#include "capbowl.h"
+
+UINT8 *capbowl_rowaddress;
+
+static offs_t blitter_addr;
+
+
+
+/*************************************
+ *
+ * TMS34061 interfacing
+ *
+ *************************************/
+
+static void generate_interrupt(int state)
+{
+ cpunum_set_input_line(0, M6809_FIRQ_LINE, state);
+}
+
+static struct tms34061_interface tms34061intf =
+{
+ 0, /* the screen we are acting on */
+ 8, /* VRAM address is (row << rowshift) | col */
+ 0x10000, /* size of video RAM */
+ generate_interrupt /* interrupt gen callback */
+};
+
+
+
+/*************************************
+ *
+ * Video start
+ *
+ *************************************/
+
+VIDEO_START( capbowl )
+{
+ /* initialize TMS34061 emulation */
+ tms34061_start(&tms34061intf);
+}
+
+
+
+/*************************************
+ *
+ * TMS34061 I/O
+ *
+ *************************************/
+
+WRITE8_HANDLER( capbowl_tms34061_w )
+{
+ int func = (offset >> 8) & 3;
+ int col = offset & 0xff;
+
+ /* Column address (CA0-CA8) is hooked up the A0-A7, with A1 being inverted
+ during register access. CA8 is ignored */
+ if (func == 0 || func == 2)
+ col ^= 2;
+
+ /* Row address (RA0-RA8) is not dependent on the offset */
+ tms34061_w(col, *capbowl_rowaddress, func, data);
+}
+
+
+READ8_HANDLER( capbowl_tms34061_r )
+{
+ int func = (offset >> 8) & 3;
+ int col = offset & 0xff;
+
+ /* Column address (CA0-CA8) is hooked up the A0-A7, with A1 being inverted
+ during register access. CA8 is ignored */
+ if (func == 0 || func == 2)
+ col ^= 2;
+
+ /* Row address (RA0-RA8) is not dependent on the offset */
+ return tms34061_r(col, *capbowl_rowaddress, func);
+}
+
+
+
+/*************************************
+ *
+ * Bowl-o-rama blitter
+ *
+ *************************************/
+
+WRITE8_HANDLER( bowlrama_blitter_w )
+{
+ switch (offset)
+ {
+ case 0x08: /* Write address high byte (only 2 bits used) */
+ blitter_addr = (blitter_addr & ~0xff0000) | (data << 16);
+ break;
+
+ case 0x17: /* Write address mid byte (8 bits) */
+ blitter_addr = (blitter_addr & ~0x00ff00) | (data << 8);
+ break;
+
+ case 0x18: /* Write Address low byte (8 bits) */
+ blitter_addr = (blitter_addr & ~0x0000ff) | (data << 0);
+ break;
+
+ default:
+ logerror("PC=%04X Write to unsupported blitter address %02X Data=%02X\n", activecpu_get_pc(), offset, data);
+ break;
+ }
+}
+
+
+READ8_HANDLER( bowlrama_blitter_r )
+{
+ UINT8 data = memory_region(REGION_GFX1)[blitter_addr];
+ UINT8 result = 0;
+
+ switch (offset)
+ {
+ /* Read Mask: Graphics data are 4bpp (2 pixels per byte).
+ This function returns 0's for new pixel data.
+ This allows data to be read as a mask, AND the mask with
+ the screen data, then OR new data read by read data command. */
+ case 0:
+ if (!(data & 0xf0))
+ result |= 0xf0; /* High nibble is transparent */
+ if (!(data & 0x0f))
+ result |= 0x0f; /* Low nibble is transparent */
+ break;
+
+ /* Read data and increment address */
+ case 4:
+ result = data;
+ blitter_addr = (blitter_addr + 1) & 0x3ffff;
+ break;
+
+ default:
+ logerror("PC=%04X Read from unsupported blitter address %02X\n", activecpu_get_pc(), offset);
+ break;
+ }
+
+ return result;
+}
+
+
+
+/*************************************
+ *
+ * Main refresh
+ *
+ *************************************/
+
+VIDEO_UPDATE( capbowl )
+{
+ struct tms34061_display state;
+ int x, y;
+
+ /* first get the current display state */
+ tms34061_get_display_state(&state);
+
+ /* if we're blanked, just fill with black */
+ if (state.blanked)
+ {
+ fillbitmap(bitmap, get_black_pen(machine), cliprect);
+ return 0;
+ }
+
+ /* now regenerate the bitmap */
+ for (y = cliprect->min_y; y <= cliprect->max_y; y++)
+ {
+ UINT16 *dest = BITMAP_ADDR16(bitmap, y, 0);
+ UINT8 *src = &state.vram[256 * y];
+ int ybase = 16 * y;
+
+ /* first update the palette for this scanline */
+ for (x = 0; x < 16; x++)
+ {
+ palette_set_color_rgb(machine, ybase + x, pal4bit(src[0]), pal4bit(src[1] >> 4), pal4bit(src[1]));
+ src += 2;
+ }
+
+ /* expand row to 8bpp */
+ for (x = cliprect->min_x & ~1; x <= cliprect->max_x; x += 2)
+ {
+ int pix = src[x/2];
+ *dest++ = ybase + (pix >> 4);
+ *dest++ = ybase + (pix & 0x0f);
+ }
+ }
+ return 0;
+}