diff options
Diffstat (limited to 'src/mame/video/pitnrun.c')
-rw-r--r-- | src/mame/video/pitnrun.c | 291 |
1 files changed, 291 insertions, 0 deletions
diff --git a/src/mame/video/pitnrun.c b/src/mame/video/pitnrun.c new file mode 100644 index 00000000000..87ee099612b --- /dev/null +++ b/src/mame/video/pitnrun.c @@ -0,0 +1,291 @@ +/*************************************************************************** + + - BG layer 32x128 , 8x8 tiles 4bpp , 2 palettes (2nd is black ) + - TXT layer 32x32 , 8x8 tiles 4bpp , 2 palettes (2nd is black) + - Sprites 16x16 3bpp, 8 palettes (0-3 are black) + + 'Special' effects : + + - spotlight - gfx(BG+Sprites) outside spotlight is using black pals + spotlight masks are taken from ROM pr8 + simulated using bitmaps and custom clipping rect + + - lightning - BG color change (darkening ?) - simple analog circ. + simulated by additional palette + +In debug build press 'w' for spotlight and 'e' for lightning + +***************************************************************************/ +#include "driver.h" + +static int pitnrun_h_heed; +static int pitnrun_v_heed; +static int pitnrun_ha; +static int pitnrun_scroll; +static int pitnrun_char_bank; +static int pitnrun_color_select; +static mame_bitmap *tmp_bitmap[4]; +static tilemap *bg, *fg; +UINT8* pitnrun_videoram2; + + +static TILE_GET_INFO( get_tile_info1 ) +{ + int code; + code = videoram[tile_index]; + SET_TILE_INFO( + 0, + code, + 0, + 0); +} + +static TILE_GET_INFO( get_tile_info2 ) +{ + int code; + code = pitnrun_videoram2[tile_index]; + SET_TILE_INFO( + 1, + code + (pitnrun_char_bank<<8), + pitnrun_color_select&1, + 0); +} + +WRITE8_HANDLER( pitnrun_videoram_w ) +{ + videoram[offset] = data; + tilemap_mark_all_tiles_dirty( fg ); +} + +WRITE8_HANDLER( pitnrun_videoram2_w ) +{ + pitnrun_videoram2[offset] = data; + tilemap_mark_all_tiles_dirty( bg ); +} + + +READ8_HANDLER( pitnrun_videoram_r ) +{ + return videoram[offset]; +} + +READ8_HANDLER( pitnrun_videoram2_r ) +{ + return pitnrun_videoram2[offset]; +} + +WRITE8_HANDLER( pitnrun_char_bank_select ) +{ + if(pitnrun_char_bank!=data) + { + tilemap_mark_all_tiles_dirty( bg ); + pitnrun_char_bank=data; + } +} + + +WRITE8_HANDLER( pitnrun_scroll_w ) +{ + pitnrun_scroll = (pitnrun_scroll & (0xff<<((offset)?0:8))) |( data<<((offset)?8:0)); + tilemap_set_scrollx( bg, 0, pitnrun_scroll); +} + +WRITE8_HANDLER(pitnrun_ha_w) +{ + pitnrun_ha=data; +} + +WRITE8_HANDLER(pitnrun_h_heed_w) +{ + pitnrun_h_heed=data; +} + +WRITE8_HANDLER(pitnrun_v_heed_w) +{ + pitnrun_v_heed=data; +} + +WRITE8_HANDLER(pitnrun_color_select_w) +{ + pitnrun_color_select=data; + tilemap_mark_all_tiles_dirty(ALL_TILEMAPS); +} + +static void pitnrun_spotlights(void) +{ + int x,y,i,b,datapix; + UINT8 *ROM = memory_region(REGION_USER1); + for(i=0;i<4;i++) + for(y=0;y<128;y++) + for(x=0;x<16;x++) + { + datapix=ROM[128*16*i+x+y*16]; + for(b=0;b<8;b++) + { + *BITMAP_ADDR16(tmp_bitmap[i], y, x*8+(7-b)) = (datapix&1); + datapix>>=1; + } + } +} + + +PALETTE_INIT (pitnrun) +{ + int i; + int bit0,bit1,bit2,r,g,b; + for (i = 0;i < 32*3; i++) + { + 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)); + } + + /* fake bg palette for lightning effect*/ + for(i=2*16;i<2*16+16;i++) + { + 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; + r/=3; + g/=3; + b/=3; + + palette_set_color_rgb(machine,i+16,(r>0xff)?0xff:r,(g>0xff)?0xff:g,(b>0xff)?0xff:b); + + } +} + +VIDEO_START(pitnrun) +{ + fg = tilemap_create( get_tile_info1,tilemap_scan_rows,TILEMAP_TYPE_PEN,8,8,32,32 ); + bg = tilemap_create( get_tile_info2,tilemap_scan_rows,TILEMAP_TYPE_PEN,8,8,32*4,32 ); + tilemap_set_transparent_pen( fg, 0 ); + tmp_bitmap[0] = auto_bitmap_alloc(128,128,machine->screen[0].format); + tmp_bitmap[1] = auto_bitmap_alloc(128,128,machine->screen[0].format); + tmp_bitmap[2] = auto_bitmap_alloc(128,128,machine->screen[0].format); + tmp_bitmap[3] = auto_bitmap_alloc(128,128,machine->screen[0].format); + pitnrun_spotlights(); + video_start_generic(machine); +} + +static void draw_sprites(running_machine *machine, mame_bitmap *bitmap, const rectangle *cliprect ) +{ + int sx, sy, flipx, flipy, offs,pal; + + for (offs = 0 ; offs < 0x100; offs+=4) + { + + pal=spriteram[offs+2]&0x3; + + sy = 256-spriteram[offs+0]-16; + sx = spriteram[offs+3]; + flipy = (spriteram[offs+1]&0x80)>>7; + flipx = (spriteram[offs+1]&0x40)>>6; + + if (flip_screen_x) + { + sx = 256 - sx; + flipx = !flipx; + } + if (flip_screen_y) + { + sy = 240 - sy; + flipy = !flipy; + } + + drawgfx(bitmap,machine->gfx[2], + (spriteram[offs+1]&0x3f)+((spriteram[offs+2]&0x80)>>1)+((spriteram[offs+2]&0x40)<<1), + pal, + flipx,flipy, + sx,sy, + cliprect,TRANSPARENCY_PEN,0); + } +} + +VIDEO_UPDATE( pitnrun ) +{ + int dx=0,dy=0; + rectangle myclip=*cliprect; + +#ifdef MAME_DEBUG + if (input_code_pressed_once(KEYCODE_Q)) + { + UINT8 *ROM = memory_region(REGION_CPU1); + ROM[0x84f6]=0; /* lap 0 - normal */ + } + + if (input_code_pressed_once(KEYCODE_W)) + { + UINT8 *ROM = memory_region(REGION_CPU1); + ROM[0x84f6]=6; /* lap 6 = spotlight */ + } + + if (input_code_pressed_once(KEYCODE_E)) + { + UINT8 *ROM = memory_region(REGION_CPU1); + ROM[0x84f6]=2; /* lap 3 (trial 2)= lightnings */ + ROM[0x8102]=1; + } +#endif + + fillbitmap(bitmap,0,cliprect); + + if(!(pitnrun_ha&4)) + tilemap_draw(bitmap,cliprect,bg, 0,0); + else + { + dx=128-pitnrun_h_heed+((pitnrun_ha&8)<<5)+3; + dy=128-pitnrun_v_heed+((pitnrun_ha&0x10)<<4); + + if (flip_screen_x) + dx=128-dx+16; + + if (flip_screen_y) + dy=128-dy; + + myclip.min_x=dx; + myclip.min_y=dy; + myclip.max_x=dx+127; + myclip.max_y=dy+127; + + + if(myclip.min_y<cliprect->min_y)myclip.min_y=cliprect->min_y; + if(myclip.min_x<cliprect->min_x)myclip.min_x=cliprect->min_x; + + if(myclip.max_y>cliprect->max_y)myclip.max_y=cliprect->max_y; + if(myclip.max_x>cliprect->max_x)myclip.max_x=cliprect->max_x; + + tilemap_draw(bitmap,&myclip,bg, 0,0); + } + + draw_sprites(machine,bitmap,&myclip); + + if(pitnrun_ha&4) + copybitmap(bitmap,tmp_bitmap[pitnrun_ha&3],flip_screen_x,flip_screen_y,dx,dy,&myclip,TRANSPARENCY_PEN, 1); + tilemap_draw(bitmap,cliprect,fg, 0,0); + return 0; +} + + + + |