diff options
Diffstat (limited to 'src/mame/video/slapfght.c')
-rw-r--r-- | src/mame/video/slapfght.c | 254 |
1 files changed, 254 insertions, 0 deletions
diff --git a/src/mame/video/slapfght.c b/src/mame/video/slapfght.c new file mode 100644 index 00000000000..777d0989020 --- /dev/null +++ b/src/mame/video/slapfght.c @@ -0,0 +1,254 @@ +/*************************************************************************** + + video.c + + Functions to emulate the video hardware of early Toaplan hardware. + +***************************************************************************/ + +#include "driver.h" + +UINT8 *slapfight_videoram; +UINT8 *slapfight_colorram; +size_t slapfight_videoram_size; +UINT8 *slapfight_scrollx_lo,*slapfight_scrollx_hi,*slapfight_scrolly; +static int flipscreen, slapfight_palette_bank = 0; + +static tilemap *pf1_tilemap,*fix_tilemap; + + + + +/*************************************************************************** + + Callbacks for the TileMap code + +***************************************************************************/ + +static TILE_GET_INFO( get_pf_tile_info ) /* For Performan only */ +{ + int tile,color; + + tile=videoram[tile_index] + ((colorram[tile_index] & 0x03) << 8); + color=(colorram[tile_index] >> 3) & 0x0f; + SET_TILE_INFO( + 0, + tile, + color, + 0); +} + +static TILE_GET_INFO( get_pf1_tile_info ) +{ + int tile,color; + + tile=videoram[tile_index] + ((colorram[tile_index] & 0x0f) << 8); + color=(colorram[tile_index] & 0xf0) >> 4; + + SET_TILE_INFO( + 1, + tile, + color, + 0); +} + +static TILE_GET_INFO( get_fix_tile_info ) +{ + int tile,color; + + tile=slapfight_videoram[tile_index] + ((slapfight_colorram[tile_index] & 0x03) << 8); + color=(slapfight_colorram[tile_index] & 0xfc) >> 2; + + SET_TILE_INFO( + 0, + tile, + color, + 0); +} + + +/*************************************************************************** + + Start the video hardware emulation. + +***************************************************************************/ + +VIDEO_START( perfrman ) +{ + pf1_tilemap = tilemap_create(get_pf_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN,8,8,64,32); + + tilemap_set_transparent_pen(pf1_tilemap,0); +} + +VIDEO_START( slapfight ) +{ + pf1_tilemap = tilemap_create(get_pf1_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN,8,8,64,32); + fix_tilemap = tilemap_create(get_fix_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN,8,8,64,32); + + tilemap_set_transparent_pen(fix_tilemap,0); +} + + +/*************************************************************************** + + Memory handlers + +***************************************************************************/ + +WRITE8_HANDLER( slapfight_videoram_w ) +{ + videoram[offset]=data; + tilemap_mark_tile_dirty(pf1_tilemap,offset); +} + +WRITE8_HANDLER( slapfight_colorram_w ) +{ + colorram[offset]=data; + tilemap_mark_tile_dirty(pf1_tilemap,offset); +} + +WRITE8_HANDLER( slapfight_fixram_w ) +{ + slapfight_videoram[offset]=data; + tilemap_mark_tile_dirty(fix_tilemap,offset); +} + +WRITE8_HANDLER( slapfight_fixcol_w ) +{ + slapfight_colorram[offset]=data; + tilemap_mark_tile_dirty(fix_tilemap,offset); +} + +WRITE8_HANDLER( slapfight_flipscreen_w ) +{ + logerror("Writing %02x to flipscreen\n",offset); + if (offset==0) flipscreen=1; /* Port 0x2 is flipscreen */ + else flipscreen=0; /* Port 0x3 is normal */ +} + +WRITE8_HANDLER( slapfight_palette_bank_w ) +{ + slapfight_palette_bank = offset; +} + +#ifdef MAME_DEBUG +void slapfght_log_vram(void) +{ + if ( input_code_pressed_once(KEYCODE_B) ) + { + int i; + for (i=0; i<0x800; i++) + { + logerror("Offset:%03x TileRAM:%02x AttribRAM:%02x SpriteRAM:%02x\n",i, videoram[i],colorram[i],spriteram[i]); + } + } +} +#endif + +/*************************************************************************** + + Render the Sprites + +***************************************************************************/ +static void draw_sprites(running_machine *machine, mame_bitmap *bitmap, const rectangle *cliprect, int priority_to_display ) +{ + int offs; + + for (offs = 0;offs < spriteram_size;offs += 4) + { + int sx, sy; + + if ((buffered_spriteram[offs+2] & 0x80) == priority_to_display) + { + if (flipscreen) + { + sx = 265 - buffered_spriteram[offs+1]; + sy = 239 - buffered_spriteram[offs+3]; + sy &= 0xff; + } + else + { + sx = buffered_spriteram[offs+1] + 3; + sy = buffered_spriteram[offs+3] - 1; + } + drawgfx(bitmap,machine->gfx[1], + buffered_spriteram[offs], + ((buffered_spriteram[offs+2] >> 1) & 3) | + ((buffered_spriteram[offs+2] << 2) & 4) | (slapfight_palette_bank << 3), + flipscreen, flipscreen, + sx, sy, + cliprect,TRANSPARENCY_PEN,0); + } + } +} + + +VIDEO_UPDATE( perfrman ) +{ + tilemap_set_flip( pf1_tilemap, flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + tilemap_set_scrolly( pf1_tilemap ,0 , 0 ); + if (flipscreen) { + tilemap_set_scrollx( pf1_tilemap ,0 , 264 ); + } + else { + tilemap_set_scrollx( pf1_tilemap ,0 , -16 ); + } + + tilemap_draw(bitmap,cliprect,pf1_tilemap,TILEMAP_DRAW_OPAQUE,0); + draw_sprites(machine, bitmap,cliprect,0); + tilemap_draw(bitmap,cliprect,pf1_tilemap,0,0); + draw_sprites(machine, bitmap,cliprect,0x80); + +#ifdef MAME_DEBUG + slapfght_log_vram(); +#endif + return 0; +} + + +VIDEO_UPDATE( slapfight ) +{ + int offs; + + tilemap_set_flip(ALL_TILEMAPS,flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); + if (flipscreen) { + tilemap_set_scrollx( fix_tilemap,0,296); + tilemap_set_scrollx( pf1_tilemap,0,(*slapfight_scrollx_lo + 256 * *slapfight_scrollx_hi)+296 ); + tilemap_set_scrolly( pf1_tilemap,0, (*slapfight_scrolly)+15 ); + tilemap_set_scrolly( fix_tilemap,0, -1 ); /* Glitch in Tiger Heli otherwise */ + } + else { + tilemap_set_scrollx( fix_tilemap,0,0); + tilemap_set_scrollx( pf1_tilemap,0,(*slapfight_scrollx_lo + 256 * *slapfight_scrollx_hi) ); + tilemap_set_scrolly( pf1_tilemap,0, (*slapfight_scrolly)-1 ); + tilemap_set_scrolly( fix_tilemap,0, -1 ); /* Glitch in Tiger Heli otherwise */ + } + + tilemap_draw(bitmap,cliprect,pf1_tilemap,0,0); + + /* Draw the sprites */ + for (offs = 0;offs < spriteram_size;offs += 4) + { + if (flipscreen) + drawgfx(bitmap,machine->gfx[2], + buffered_spriteram[offs] + ((buffered_spriteram[offs+2] & 0xc0) << 2), + (buffered_spriteram[offs+2] & 0x1e) >> 1, + 1,1, + 288-(buffered_spriteram[offs+1] + ((buffered_spriteram[offs+2] & 0x01) << 8)) +18,240-buffered_spriteram[offs+3], + cliprect,TRANSPARENCY_PEN,0); + else + drawgfx(bitmap,machine->gfx[2], + buffered_spriteram[offs] + ((buffered_spriteram[offs+2] & 0xc0) << 2), + (buffered_spriteram[offs+2] & 0x1e) >> 1, + 0,0, + (buffered_spriteram[offs+1] + ((buffered_spriteram[offs+2] & 0x01) << 8)) - 13,buffered_spriteram[offs+3], + cliprect,TRANSPARENCY_PEN,0); + } + + tilemap_draw(bitmap,cliprect,fix_tilemap,0,0); + +#ifdef MAME_DEBUG + slapfght_log_vram(); +#endif + return 0; +} |