/*************************************************************************** Portraits video hardware emulation ***************************************************************************/ #include "emu.h" #include "includes/portrait.h" WRITE8_HANDLER( portrait_bgvideo_write ) { portrait_state *state = space->machine().driver_data(); tilemap_mark_tile_dirty(state->m_background,offset/2); state->m_bgvideoram[offset] = data; } WRITE8_HANDLER( portrait_fgvideo_write ) { portrait_state *state = space->machine().driver_data(); tilemap_mark_tile_dirty(state->m_foreground,offset/2); state->m_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; } if (tilenum<0x100) color = ((tilenum&0xff)>>1)+0x00; else color = ((tilenum&0xff)>>1)+0x80; SET_TILE_INFO( 0, tilenum, color, flags ); } static TILE_GET_INFO( get_bg_tile_info ) { portrait_state *state = machine.driver_data(); get_tile_info( machine, tileinfo, tile_index, state->m_bgvideoram ); } static TILE_GET_INFO( get_fg_tile_info ) { portrait_state *state = machine.driver_data(); get_tile_info( machine, tileinfo, tile_index, state->m_fgvideoram ); } VIDEO_START( portrait ) { portrait_state *state = machine.driver_data(); state->m_background = tilemap_create( machine, get_bg_tile_info, tilemap_scan_rows, 16, 16, 32, 32 ); state->m_foreground = tilemap_create( machine, get_fg_tile_info, tilemap_scan_rows, 16, 16, 32, 32 ); tilemap_set_transparent_pen( state->m_foreground, 7 ); } PALETTE_INIT( portrait ) { int i; UINT8* lookup = machine.region("tileattr")->base(); /* allocate the colortable */ machine.colortable = colortable_alloc(machine, 0x40); /* for (i = 0;i < 0x40;i++) { int r,g,b,data; data = color_prom[0]; r = (data >> 0) & 0x7; g = (data >> 3) & 0x3; b = (data >> 5) & 0x7; colortable_palette_set_color(machine.colortable, i, MAKE_RGB(pal3bit(r), pal2bit(g), pal3bit(b))); color_prom++; } */ for (i=0;i<0x20;i++) { int r,g,b,data; data = (color_prom[0]<<0) | (color_prom[0x20]<<8); r = (data >> 0) & 0x1f; g = (data >> 5) & 0x1f; b = (data >> 10) & 0x1f; colortable_palette_set_color(machine.colortable, i, MAKE_RGB(pal5bit(r), pal5bit(g), pal5bit(b))); // ?? the lookup seems to reference 0x3f colours, unless 1 bit is priority or similar? colortable_palette_set_color(machine.colortable, i+0x20, MAKE_RGB(pal5bit(r>>1), pal5bit(g>>1), pal5bit(b>>1))); color_prom++; } for (i = 0;i < 0x800;i++) { UINT8 ctabentry = lookup[i]&0x3f; colortable_entry_set_value(machine.colortable, i, ctabentry); } } static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) { portrait_state *state = machine.driver_data(); UINT8 *source = state->m_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 = ((tilenum&0xff)>>1)+0x00; int fy = attr & 0x20; if(attr & 0x04) sx |= 0x100; if(attr & 0x08) sy |= 0x100; sx += (source - state->m_spriteram) - 8; sx &= 0x1ff; sy = (512 - 64) - sy; /* wrong! */ switch( attr & 0xc0 ) { case 0: break; case 0x40: sy -= state->m_scroll; break; case 0x80: sy -= state->m_scroll; break; case 0xc0: break; } drawgfx_transpen(bitmap,cliprect,machine.gfx[0], tilenum,color, 0,fy, sx,sy,7); source += 0x10; } } SCREEN_UPDATE( portrait ) { portrait_state *state = screen->machine().driver_data(); 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(state->m_background, 0, 0); tilemap_set_scrolly(state->m_foreground, 0, 0); tilemap_draw(bitmap, &cliprect_no_scroll, state->m_background, 0, 0); tilemap_draw(bitmap, &cliprect_no_scroll, state->m_foreground, 0, 0); tilemap_set_scrolly(state->m_background, 0, state->m_scroll); tilemap_set_scrolly(state->m_foreground, 0, state->m_scroll); tilemap_draw(bitmap, &cliprect_scroll, state->m_background, 0, 0); tilemap_draw(bitmap, &cliprect_scroll, state->m_foreground, 0, 0); draw_sprites(screen->machine(), bitmap,cliprect); return 0; }