/*************************************************************************** video.c Functions to emulate the video hardware of the machine. ***************************************************************************/ #include "driver.h" static int gfx_bank; static tilemap *bg_tilemap; /*************************************************************************** Convert the color PROMs into a more useable format. ***************************************************************************/ PALETTE_INIT( exctsccr ) { int i,idx; #define COLOR(gfxn,offs) (colortable[machine->drv->gfxdecodeinfo[gfxn].color_codes_start + offs]) for (i = 0;i < machine->drv->total_colors;i++) { int bit0,bit1,bit2,r,g,b; bit0 = (color_prom[i] >> 0) & 0x01; bit1 = (color_prom[i] >> 1) & 0x01; bit2 = (color_prom[i] >> 2) & 0x01; r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; bit0 = (color_prom[i] >> 3) & 0x01; bit1 = (color_prom[i] >> 4) & 0x01; bit2 = (color_prom[i] >> 5) & 0x01; g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; bit0 = 0; bit1 = (color_prom[i] >> 6) & 0x01; bit2 = (color_prom[i] >> 7) & 0x01; b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; palette_set_color(machine,i,MAKE_RGB(r,g,b)); } color_prom += machine->drv->total_colors; /* characters */ idx = 0; for (i = 0;i < 32;i++) { COLOR(0,idx++) = color_prom[256+0+(i*4)]; COLOR(0,idx++) = color_prom[256+1+(i*4)]; COLOR(0,idx++) = color_prom[256+2+(i*4)]; COLOR(0,idx++) = color_prom[256+3+(i*4)]; COLOR(0,idx++) = color_prom[256+128+0+(i*4)]; COLOR(0,idx++) = color_prom[256+128+1+(i*4)]; COLOR(0,idx++) = color_prom[256+128+2+(i*4)]; COLOR(0,idx++) = color_prom[256+128+3+(i*4)]; } /* sprites */ idx=0; for (i = 0;i < 15*16;i++) { if ( (i%16) < 8 ) { COLOR(2,idx) = color_prom[i]+16; idx++; } } for (i = 15*16;i < 16*16;i++) { if ( (i%16) > 7 ) { COLOR(2,idx) = color_prom[i]+16; idx++; } } for (i = 16;i < 32;i++) { COLOR(2,idx++) = color_prom[256+0+(i*4)]+16; COLOR(2,idx++) = color_prom[256+1+(i*4)]+16; COLOR(2,idx++) = color_prom[256+2+(i*4)]+16; COLOR(2,idx++) = color_prom[256+3+(i*4)]+16; COLOR(2,idx++) = color_prom[256+128+0+(i*4)]+16; COLOR(2,idx++) = color_prom[256+128+1+(i*4)]+16; COLOR(2,idx++) = color_prom[256+128+2+(i*4)]+16; COLOR(2,idx++) = color_prom[256+128+3+(i*4)]+16; } /* Patch for goalkeeper */ COLOR(2,29*8+7) = 16; } static TIMER_CALLBACK( exctsccr_fm_callback ) { cpunum_set_input_line_and_vector( 1, 0, HOLD_LINE, 0xff ); } WRITE8_HANDLER( exctsccr_videoram_w ) { videoram[offset] = data; tilemap_mark_tile_dirty(bg_tilemap, offset); } WRITE8_HANDLER( exctsccr_colorram_w ) { colorram[offset] = data; tilemap_mark_tile_dirty(bg_tilemap, offset); } WRITE8_HANDLER( exctsccr_gfx_bank_w ) { if (gfx_bank != (data & 0x01)) { gfx_bank = data & 0x01; tilemap_mark_all_tiles_dirty(ALL_TILEMAPS); } } WRITE8_HANDLER( exctsccr_flipscreen_w ) { if (flip_screen != data) { flip_screen_set(data); tilemap_mark_all_tiles_dirty(ALL_TILEMAPS); } } static TILE_GET_INFO( get_bg_tile_info ) { int code = videoram[tile_index]; int color = colorram[tile_index] & 0x1f; SET_TILE_INFO(gfx_bank, code, color, 0); } VIDEO_START( exctsccr ) { bg_tilemap = tilemap_create(get_bg_tile_info, tilemap_scan_rows, TILEMAP_TYPE_PEN, 8, 8, 32, 32); mame_timer_pulse(MAME_TIME_IN_HZ(75), 0, exctsccr_fm_callback); /* updates fm */ } static void draw_sprites(running_machine *machine, mame_bitmap *bitmap, const rectangle *cliprect) { int offs; UINT8 *OBJ1, *OBJ2; OBJ1 = videoram; OBJ2 = &(spriteram[0x20]); for ( offs = 0x0e; offs >= 0; offs -= 2 ) { int sx,sy,code,bank,flipx,flipy,color; sx = 256 - OBJ2[offs+1]; sy = OBJ2[offs] - 16; code = ( OBJ1[offs] >> 2 ) & 0x3f; flipx = ( OBJ1[offs] ) & 0x01; flipy = ( OBJ1[offs] ) & 0x02; color = ( OBJ1[offs+1] ) & 0x1f; bank = 2; bank += ( ( OBJ1[offs+1] >> 4 ) & 1 ); drawgfx(bitmap,machine->gfx[bank], code, color, flipx, flipy, sx,sy, cliprect, TRANSPARENCY_PEN,0); } OBJ1 = spriteram_2; OBJ2 = spriteram; for ( offs = 0x0e; offs >= 0; offs -= 2 ) { int sx,sy,code,bank,flipx,flipy,color; sx = 256 - OBJ2[offs+1]; sy = OBJ2[offs] - 16; code = ( OBJ1[offs] >> 2 ) & 0x3f; flipx = ( OBJ1[offs] ) & 0x01; flipy = ( OBJ1[offs] ) & 0x02; color = ( OBJ1[offs+1] ) & 0x1f; bank = 3; if ( color == 0 ) continue; if ( color < 0x10 ) bank++; if ( color > 0x10 && color < 0x17 ) { drawgfx(bitmap,machine->gfx[4], code, 0x0e, flipx, flipy, sx,sy, cliprect, TRANSPARENCY_PEN,0); color += 6; } if ( color==0x1d && gfx_bank==1 ) { drawgfx(bitmap,machine->gfx[3], code, color, flipx, flipy, sx,sy, cliprect, TRANSPARENCY_PEN,0); drawgfx(bitmap,machine->gfx[4], code, color, flipx, flipy, sx,sy, cliprect, TRANSPARENCY_COLOR, 16); } else { drawgfx(bitmap,machine->gfx[bank], code, color, flipx, flipy, sx,sy, cliprect, TRANSPARENCY_PEN,0); } } } VIDEO_UPDATE( exctsccr ) { tilemap_draw(bitmap, cliprect, bg_tilemap, 0, 0); draw_sprites(machine, bitmap, cliprect); return 0; }