diff options
Diffstat (limited to 'src/mame/video/capbowl.c')
-rw-r--r-- | src/mame/video/capbowl.c | 197 |
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; +} |