diff options
Diffstat (limited to 'src/mame/video/shootout.c')
-rw-r--r-- | src/mame/video/shootout.c | 175 |
1 files changed, 175 insertions, 0 deletions
diff --git a/src/mame/video/shootout.c b/src/mame/video/shootout.c new file mode 100644 index 00000000000..ee265317a8d --- /dev/null +++ b/src/mame/video/shootout.c @@ -0,0 +1,175 @@ +/* + Video Hardware for Shoot Out + prom GB09.K6 may be related to background tile-sprite priority +*/ + +#include "driver.h" + +static tilemap *background, *foreground; +extern UINT8 *shootout_textram; + + +PALETTE_INIT( shootout ) +{ + int i; + + + for (i = 0;i < machine->drv->total_colors;i++) + { + int bit0,bit1,bit2,r,g,b; + + /* red component */ + 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; + /* green component */ + 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; + /* blue component */ + 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)); + } +} + + + +static TILE_GET_INFO( get_bg_tile_info ){ + int attributes = videoram[tile_index+0x400]; /* CCCC -TTT */ + int tile_number = videoram[tile_index] + 256*(attributes&7); + int color = attributes>>4; + SET_TILE_INFO( + 2, + tile_number, + color, + 0); +} + +static TILE_GET_INFO( get_fg_tile_info ){ + int attributes = shootout_textram[tile_index+0x400]; /* CCCC --TT */ + int tile_number = shootout_textram[tile_index] + 256*(attributes&0x3); + int color = attributes>>4; + SET_TILE_INFO( + 0, + tile_number, + color, + 0); +} + +WRITE8_HANDLER( shootout_videoram_w ){ + videoram[offset] = data; + tilemap_mark_tile_dirty( background, offset&0x3ff ); +} +WRITE8_HANDLER( shootout_textram_w ){ + shootout_textram[offset] = data; + tilemap_mark_tile_dirty( foreground, offset&0x3ff ); +} + +VIDEO_START( shootout ){ + background = tilemap_create(get_bg_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN,8,8,32,32); + foreground = tilemap_create(get_fg_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN,8,8,32,32); + tilemap_set_transparent_pen( foreground, 0 ); +} + +static void draw_sprites(running_machine *machine, mame_bitmap *bitmap, const rectangle *cliprect, int bank_bits ){ + static int bFlicker; + const gfx_element *gfx = machine->gfx[1]; + const UINT8 *source = spriteram+127*4; + int count; + + bFlicker = !bFlicker; + + for( count=0; count<128; count++ ){ + int attributes = source[1]; + /* + 76543210 + xxx----- bank + ---x---- vertical size + ----x--- priority + -----x-- horizontal flip + ------x- flicker + -------x enable + */ + if ( attributes & 0x01 ){ /* visible */ + if( bFlicker || (attributes&0x02)==0 ){ + int priority_mask = (attributes&0x08)?0x2:0; + int sx = (240 - source[2])&0xff; + int sy = (240 - source[0])&0xff; + int vx, vy; + int number = source[3] | ((attributes<<bank_bits)&0x700); + int flipx = (attributes & 0x04); + int flipy = 0; + + if (flip_screen) { + flipx = !flipx; + flipy = !flipy; + } + + if( attributes & 0x10 ){ /* double height */ + number = number&(~1); + sy -= 16; + + vx = sx; + vy = sy; + if (flip_screen) { + vx = 240 - vx; + vy = 240 - vy; + } + + pdrawgfx(bitmap,gfx, + number, + 0 /*color*/, + flipx,flipy, + vx,vy, + cliprect,TRANSPARENCY_PEN,0, + priority_mask); + + number++; + sy += 16; + } + + vx = sx; + vy = sy; + if (flip_screen) { + vx = 240 - vx; + vy = 240 - vy; + } + + pdrawgfx(bitmap,gfx, + number, + 0 /*color*/, + flipx,flipy, + vx,vy, + cliprect,TRANSPARENCY_PEN,0, + priority_mask); + } + } + source -= 4; + } +} + +VIDEO_UPDATE( shootout ) +{ + fillbitmap(priority_bitmap,0,cliprect); + + tilemap_draw(bitmap,cliprect,background,0,0); + tilemap_draw(bitmap,cliprect,foreground,0,1); + draw_sprites(machine, bitmap,cliprect,3/*bank bits */); + return 0; +} + +VIDEO_UPDATE( shootouj ) +{ + fillbitmap(priority_bitmap,0,cliprect); + + tilemap_draw(bitmap,cliprect,background,0,0); + tilemap_draw(bitmap,cliprect,foreground,0,1); + draw_sprites(machine, bitmap,cliprect,2/*bank bits*/); + return 0; +} |