#include "driver.h" #include "video/ppu2c0x.h" /* from machine */ extern int pc10_sdcs; /* ShareD Chip Select */ extern int pc10_dispmask; /* Display Mask */ extern int pc10_gun_controller; /* whether we need to draw a crosshair or not */ extern int pc10_int_detect; extern int pc10_game_mode; extern int pc10_dispmask_old; /* from common.c */ extern int system_bios; static tilemap *bg_tilemap; WRITE8_HANDLER( playch10_videoram_w ) { if (pc10_sdcs) { videoram[offset] = data; tilemap_mark_tile_dirty(bg_tilemap, offset / 2); } } PALETTE_INIT( playch10 ) { int i; for (i = 0; i < 256; i++) { int bit0, bit1, bit2, bit3, r, g, b; /* red component */ bit0 = ~(color_prom[0] >> 0) & 0x01; bit1 = ~(color_prom[0] >> 1) & 0x01; bit2 = ~(color_prom[0] >> 2) & 0x01; bit3 = ~(color_prom[0] >> 3) & 0x01; r = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; /* green component */ bit0 = ~(color_prom[256] >> 0) & 0x01; bit1 = ~(color_prom[256] >> 1) & 0x01; bit2 = ~(color_prom[256] >> 2) & 0x01; bit3 = ~(color_prom[256] >> 3) & 0x01; g = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; /* blue component */ bit0 = ~(color_prom[2*256] >> 0) & 0x01; bit1 = ~(color_prom[2*256] >> 1) & 0x01; bit2 = ~(color_prom[2*256] >> 2) & 0x01; bit3 = ~(color_prom[2*256] >> 3) & 0x01; b = 0x0e * bit0 + 0x1f * bit1 + 0x43 * bit2 + 0x8f * bit3; palette_set_color(machine,i,MAKE_RGB(r,g,b)); color_prom++; } ppu2c0x_init_palette(machine, 256 ); } static void ppu_irq( int num, int *ppu_regs ) { cpunum_set_input_line(1, INPUT_LINE_NMI, PULSE_LINE ); pc10_int_detect = 1; } /* our ppu interface */ /* things like mirroring and whether to use vrom or vram */ /* can be set by calling 'ppu2c0x_override_hardware_options' */ static const ppu2c0x_interface ppu_interface = { PPU_2C03B, /* type */ 1, /* num */ { REGION_GFX2 }, /* vrom gfx region */ { 1 }, /* gfxlayout num */ { 256 }, /* color base */ { PPU_MIRROR_NONE }, /* mirroring */ { ppu_irq } /* irq */ }; static TILE_GET_INFO( get_bg_tile_info ) { int offs = tile_index * 2; int code = videoram[offs] + ((videoram[offs + 1] & 0x07) << 8); int color = (videoram[offs + 1] >> 3) & 0x1f; SET_TILE_INFO(0, code, color, 0); } VIDEO_START( playch10 ) { bg_tilemap = tilemap_create(get_bg_tile_info, tilemap_scan_rows, TILEMAP_TYPE_PEN, 8, 8, 32, 32); ppu2c0x_init(machine, &ppu_interface ); } /*************************************************************************** Display refresh ***************************************************************************/ VIDEO_UPDATE( playch10 ) { /* Dual monitor version */ if(system_bios == 1) { /* On Playchoice 10 single monitor, this bit toggles */ /* between PPU and BIOS display. */ /* We support the multi-monitor layout. In this case, */ /* if the bit is not set, then we should display */ /* the PPU portion. */ if ( screen == 0 ) { if ( !pc10_dispmask ) { /* render the ppu */ ppu2c0x_render( 0, bitmap, 0, 0, 0, 0 ); } else fillbitmap(bitmap, 0, cliprect); } else { /* When the bios is accessing vram, the video circuitry can't access it */ if ( !pc10_sdcs ) tilemap_draw(bitmap, cliprect, bg_tilemap, 0, 0); else fillbitmap(bitmap, 0, cliprect); } } else /* Single Monitor version */ { rectangle top_monitor = machine->screen[0].visarea; top_monitor.max_y = ( top_monitor.max_y - top_monitor.min_y ) / 2; if(pc10_dispmask_old != pc10_dispmask) { pc10_dispmask_old = pc10_dispmask; if(pc10_dispmask) pc10_game_mode ^= 1; } if ( pc10_game_mode ) { /* render the ppu */ ppu2c0x_render( 0, bitmap, 0, 0, 0, 0 ); } else { /* When the bios is accessing vram, the video circuitry can't access it */ if ( !pc10_sdcs ) { tilemap_draw(bitmap, &top_monitor, bg_tilemap, 0, 0); } } } return 0; }