diff options
Diffstat (limited to 'src/mame/video/exterm.c')
-rw-r--r-- | src/mame/video/exterm.c | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/src/mame/video/exterm.c b/src/mame/video/exterm.c new file mode 100644 index 00000000000..0b10161ce61 --- /dev/null +++ b/src/mame/video/exterm.c @@ -0,0 +1,114 @@ +/*************************************************************************** + + Gottlieb Exterminator hardware + +***************************************************************************/ + +#include "driver.h" +#include "cpu/tms34010/tms34010.h" +#include "exterm.h" + + +UINT16 *exterm_master_videoram, *exterm_slave_videoram; + + + +/************************************* + * + * Palette setup + * + *************************************/ + +PALETTE_INIT( exterm ) +{ + int i; + + /* initialize 555 RGB lookup */ + for (i = 0; i < 32768; i++) + palette_set_color_rgb(machine, i + 0x800, pal5bit(i >> 10), pal5bit(i >> 5), pal5bit(i >> 0)); +} + + + +/************************************* + * + * Master shift register + * + *************************************/ + +void exterm_to_shiftreg_master(UINT32 address, UINT16 *shiftreg) +{ + memcpy(shiftreg, &exterm_master_videoram[TOWORD(address)], 256 * sizeof(UINT16)); +} + + +void exterm_from_shiftreg_master(UINT32 address, UINT16 *shiftreg) +{ + memcpy(&exterm_master_videoram[TOWORD(address)], shiftreg, 256 * sizeof(UINT16)); +} + + +void exterm_to_shiftreg_slave(UINT32 address, UINT16 *shiftreg) +{ + memcpy(shiftreg, &exterm_slave_videoram[TOWORD(address)], 256 * 2 * sizeof(UINT8)); +} + + +void exterm_from_shiftreg_slave(UINT32 address, UINT16 *shiftreg) +{ + memcpy(&exterm_slave_videoram[TOWORD(address)], shiftreg, 256 * 2 * sizeof(UINT8)); +} + + + +/************************************* + * + * Main video refresh + * + *************************************/ + +void exterm_scanline_update(running_machine *machine, int screen, mame_bitmap *bitmap, int scanline, const tms34010_display_params *params) +{ + UINT16 *bgsrc = &exterm_master_videoram[(params->rowaddr << 8) & 0xff00]; + UINT16 *fgsrc = NULL; + UINT16 *dest = BITMAP_ADDR16(bitmap, scanline, 0); + tms34010_display_params fgparams; + int coladdr = params->coladdr; + int fgcoladdr = 0; + int x; + + /* get parameters for the slave CPU */ + tms34010_get_display_params(1, &fgparams); + + /* compute info about the slave vram */ + if (fgparams.enabled && scanline >= fgparams.veblnk && scanline < fgparams.vsblnk && fgparams.heblnk < fgparams.hsblnk) + { + fgsrc = &exterm_slave_videoram[((fgparams.rowaddr << 8) + (fgparams.yoffset << 7)) & 0xff80]; + fgcoladdr = (fgparams.coladdr >> 1); + } + + /* copy the non-blanked portions of this scanline */ + for (x = params->heblnk; x < params->hsblnk; x += 2) + { + UINT16 bgdata, fgdata = 0; + + if (fgsrc != NULL) + fgdata = fgsrc[fgcoladdr++ & 0x7f]; + + bgdata = bgsrc[coladdr++ & 0xff]; + if ((bgdata & 0xe000) == 0xe000) + dest[x + 0] = bgdata & 0x7ff; + else if ((fgdata & 0x00ff) != 0) + dest[x + 0] = fgdata & 0x00ff; + else + dest[x + 0] = (bgdata & 0x8000) ? (bgdata & 0x7ff) : (bgdata + 0x800); + + bgdata = bgsrc[coladdr++ & 0xff]; + if ((bgdata & 0xe000) == 0xe000) + dest[x + 1] = bgdata & 0x7ff; + else if ((fgdata & 0xff00) != 0) + dest[x + 1] = fgdata >> 8; + else + dest[x + 1] = (bgdata & 0x8000) ? (bgdata & 0x7ff) : (bgdata + 0x800); + } +} |