/*************************************************************************** JPM IMPACT with Video hardware ****************************************************************************/ #include "driver.h" #include "cpu/tms34010/tms34010.h" #include "jpmimpct.h" UINT16 *tms_vram; /************************************* * * Brooktree Bt477 RAMDAC * *************************************/ static struct { UINT8 address; UINT8 addr_cnt; UINT8 pixmask; UINT8 command; rgb_t color; } bt477; /* * 0 0 0 Address register (RAM write mode) * 0 0 1 Color palette RAMs * 0 1 0 Pixel read mask register * 0 1 1 Address register (RAM read mode) * 1 0 0 Address register (overlay write mode) * 1 1 1 Address register (overlay read mode) * 1 0 1 Overlay register * 1 1 0 Command register */ WRITE16_HANDLER( bt477_w ) { UINT8 val = data & 0xff; switch (offset) { case 0x0: { bt477.address = val; bt477.addr_cnt = 0; break; } case 0x1: { UINT8 *addr_cnt = &bt477.addr_cnt; rgb_t *color = &bt477.color; color[*addr_cnt] = val; if (++*addr_cnt == 3) { palette_set_color(Machine, bt477.address, MAKE_RGB(color[0], color[1], color[2])); *addr_cnt = 0; /* Address register increments */ bt477.address++; } break; } case 0x2: { bt477.pixmask = val; break; } case 0x6: { bt477.command = val; break; } default: { popmessage("Bt477: Unhandled write access (offset:%x, data:%x)", offset, val); } } } READ16_HANDLER( bt477_r ) { popmessage("Bt477: Unhandled read access (offset:%x)", offset); return 0; } /************************************* * * VRAM shift register callbacks * *************************************/ void jpmimpct_to_shiftreg(UINT32 address, UINT16 *shiftreg) { memcpy(shiftreg, &tms_vram[TOWORD(address)], 512 * sizeof(UINT16)); } void jpmimpct_from_shiftreg(UINT32 address, UINT16 *shiftreg) { memcpy(&tms_vram[TOWORD(address)], shiftreg, 512 * sizeof(UINT16)); } /************************************* * * Main video refresh * *************************************/ void jpmimpct_scanline_update(running_machine *machine, int screen, mame_bitmap *bitmap, int scanline, const tms34010_display_params *params) { UINT16 *vram = &tms_vram[(params->rowaddr << 8) & 0x3ff00]; UINT32 *dest = BITMAP_ADDR32(bitmap, scanline, 0); int coladdr = params->coladdr; int x; for (x = params->heblnk; x < params->hsblnk; x += 2) { UINT16 pixels = vram[coladdr++ & 0xff]; dest[x + 0] = machine->pens[pixels & 0xff]; dest[x + 1] = machine->pens[pixels >> 8]; } } /************************************* * * Video emulation start * *************************************/ VIDEO_START( jpmimpct ) { memset(&bt477, 0, sizeof(bt477)); state_save_register_global(bt477.address); state_save_register_global(bt477.addr_cnt); state_save_register_global(bt477.pixmask); state_save_register_global(bt477.command); state_save_register_global(bt477.color); video_start_generic_bitmapped(machine); }