diff options
Diffstat (limited to 'src/mame/video/portrait.c')
-rw-r--r-- | src/mame/video/portrait.c | 171 |
1 files changed, 171 insertions, 0 deletions
diff --git a/src/mame/video/portrait.c b/src/mame/video/portrait.c new file mode 100644 index 00000000000..3d89a0348ec --- /dev/null +++ b/src/mame/video/portrait.c @@ -0,0 +1,171 @@ +/*************************************************************************** + + Portraits + video hardware emulation + +***************************************************************************/ + +#include "driver.h" + +int portrait_scroll; +UINT8 *portrait_bgvideoram, *portrait_fgvideoram; +static tilemap *foreground, *background; + +WRITE8_HANDLER( portrait_bgvideo_write ) +{ + tilemap_mark_tile_dirty(background,offset/2); + portrait_bgvideoram[offset] = data; +} + +WRITE8_HANDLER( portrait_fgvideo_write ) +{ + tilemap_mark_tile_dirty(foreground,offset/2); + portrait_fgvideoram[offset] = data; +} + +INLINE void get_tile_info( running_machine *machine, tile_data *tileinfo, int tile_index, const UINT8 *source ) +{ + int attr = source[tile_index*2+0]; + int tilenum = source[tile_index*2+1]; + int flags = 0; + int color = 0; + + /* or 0x10 ? */ + if( attr & 0x20 ) flags = TILE_FLIPY; + + switch( attr & 7 ) + { + case 1: + tilenum += 0x200; + break; + case 3: + tilenum += 0x300; + break; + case 5: + tilenum += 0x100; + break; + } + + SET_TILE_INFO( 0, tilenum, color, flags ); +} + +static TILE_GET_INFO( get_bg_tile_info ) +{ + get_tile_info( machine, tileinfo, tile_index, portrait_bgvideoram ); +} + +static TILE_GET_INFO( get_fg_tile_info ) +{ + get_tile_info( machine, tileinfo, tile_index, portrait_fgvideoram ); +} + +VIDEO_START( portrait ) +{ + background = tilemap_create( get_bg_tile_info, tilemap_scan_rows, TILEMAP_TYPE_PEN, 16, 16, 32, 32 ); + foreground = tilemap_create( get_fg_tile_info, tilemap_scan_rows, TILEMAP_TYPE_PEN, 16, 16, 32, 32 ); + + tilemap_set_transparent_pen( foreground, 0 ); +} + +#if 0 +/* probably not right */ +PALETTE_INIT( portrait ) +{ + int i,bit1,bit2,r,g,b; + + for (i = 0;i < 0x800;i++) + { + bit1 = (color_prom[i] >> 1) & 0x01; + bit2 = (color_prom[i] >> 0) & 0x01; + r = 0x47 * bit1 + 0x97 * bit2; + bit1 = (color_prom[i] >> 3) & 0x01; + bit2 = (color_prom[i] >> 2) & 0x01; + g = 0x47 * bit1 + 0x97 * bit2; + bit1 = (color_prom[i] >> 5) & 0x01; + bit2 = (color_prom[i] >> 4) & 0x01; + b = 0x47 * bit1 + 0x97 * bit2; + + palette_set_color(machine,i,MAKE_RGB(r,g,b)); + } +} +#endif + +static void draw_sprites(running_machine *machine, mame_bitmap *bitmap, const rectangle *cliprect) +{ + UINT8 *source = spriteram; + UINT8 *finish = source + 0x200; + + while( source < finish ) + { + int sy = source[0]; + int sx = source[1]; + int attr = source[2]; + /* xx-x---- ? + * --x----- flipy + * ----x--- msb source[0] + * -----x-- msb source[1] + */ + int tilenum = source[3]; + int color = 0; + int fy = attr & 0x20; + + if(attr & 0x04) sx |= 0x100; + + if(attr & 0x08) sy |= 0x100; + + sx += (source - spriteram) - 8; + sx &= 0x1ff; + + sy = (512 - 64) - sy; + + /* wrong! */ + switch( attr & 0xc0 ) + { + case 0: + break; + + case 0x40: + sy -= portrait_scroll; + break; + + case 0x80: + sy -= portrait_scroll; + break; + + case 0xc0: + break; + + } + + drawgfx(bitmap,machine->gfx[0], + tilenum,color, + 0,fy, + sx,sy, + cliprect,TRANSPARENCY_PEN,0); + + source += 0x10; + } +} + +VIDEO_UPDATE( portrait ) +{ + rectangle cliprect_scroll, cliprect_no_scroll; + + cliprect_scroll = cliprect_no_scroll = *cliprect; + + cliprect_no_scroll.min_x = cliprect_no_scroll.max_x - 111; + cliprect_scroll.max_x = cliprect_scroll.min_x + 319; + + tilemap_set_scrolly(background, 0, 0); + tilemap_set_scrolly(foreground, 0, 0); + tilemap_draw(bitmap, &cliprect_no_scroll, background, 0, 0); + tilemap_draw(bitmap, &cliprect_no_scroll, foreground, 0, 0); + + tilemap_set_scrolly(background, 0, portrait_scroll); + tilemap_set_scrolly(foreground, 0, portrait_scroll); + tilemap_draw(bitmap, &cliprect_scroll, background, 0, 0); + tilemap_draw(bitmap, &cliprect_scroll, foreground, 0, 0); + + draw_sprites(machine, bitmap,cliprect); + return 0; +} |