diff options
Diffstat (limited to 'src/mame/video/pbaction.c')
-rw-r--r-- | src/mame/video/pbaction.c | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/src/mame/video/pbaction.c b/src/mame/video/pbaction.c new file mode 100644 index 00000000000..ec68041a988 --- /dev/null +++ b/src/mame/video/pbaction.c @@ -0,0 +1,134 @@ +/*************************************************************************** + + video.c + + Functions to emulate the video hardware of the machine. + +***************************************************************************/ + +#include "driver.h" + +UINT8 *pbaction_videoram2, *pbaction_colorram2; + +static int scroll; + +static tilemap *bg_tilemap, *fg_tilemap; + +WRITE8_HANDLER( pbaction_videoram_w ) +{ + videoram[offset] = data; + tilemap_mark_tile_dirty(bg_tilemap, offset); +} + +WRITE8_HANDLER( pbaction_colorram_w ) +{ + colorram[offset] = data; + tilemap_mark_tile_dirty(bg_tilemap, offset); +} + +WRITE8_HANDLER( pbaction_videoram2_w ) +{ + pbaction_videoram2[offset] = data; + tilemap_mark_tile_dirty(fg_tilemap, offset); +} + +WRITE8_HANDLER( pbaction_colorram2_w ) +{ + pbaction_colorram2[offset] = data; + tilemap_mark_tile_dirty(fg_tilemap, offset); +} + +WRITE8_HANDLER( pbaction_scroll_w ) +{ + scroll = data - 3; + if (flip_screen) scroll = -scroll; + tilemap_set_scrollx(bg_tilemap, 0, scroll); + tilemap_set_scrollx(fg_tilemap, 0, scroll); +} + +WRITE8_HANDLER( pbaction_flipscreen_w ) +{ + flip_screen_set(data & 0x01); +} + +static TILE_GET_INFO( get_bg_tile_info ) +{ + int attr = colorram[tile_index]; + int code = videoram[tile_index] + 0x10 * (attr & 0x70); + int color = attr & 0x0f; + int flags = (attr & 0x80) ? TILE_FLIPY : 0; + + SET_TILE_INFO(1, code, color, flags); +} + +static TILE_GET_INFO( get_fg_tile_info ) +{ + int attr = pbaction_colorram2[tile_index]; + int code = pbaction_videoram2[tile_index] + 0x10 * (attr & 0x30); + int color = attr & 0x0f; + int flags = ((attr & 0x40) ? TILE_FLIPX : 0) | ((attr & 0x80) ? TILE_FLIPY : 0); + + SET_TILE_INFO(0, code, color, flags); +} + +VIDEO_START( pbaction ) +{ + bg_tilemap = tilemap_create(get_bg_tile_info, tilemap_scan_rows, + TILEMAP_TYPE_PEN, 8, 8, 32, 32); + + fg_tilemap = tilemap_create(get_fg_tile_info, tilemap_scan_rows, + TILEMAP_TYPE_PEN, 8, 8, 32, 32); + + tilemap_set_transparent_pen(fg_tilemap, 0); +} + +static void draw_sprites(running_machine *machine, mame_bitmap *bitmap, const rectangle *cliprect) +{ + int offs; + + for (offs = spriteram_size - 4;offs >= 0;offs -= 4) + { + int sx,sy,flipx,flipy; + + /* if next sprite is double size, skip this one */ + if (offs > 0 && spriteram[offs - 4] & 0x80) continue; + + sx = spriteram[offs+3]; + if (spriteram[offs] & 0x80) + sy = 225-spriteram[offs+2]; + else + sy = 241-spriteram[offs+2]; + flipx = spriteram[offs+1] & 0x40; + flipy = spriteram[offs+1] & 0x80; + if (flip_screen) + { + if (spriteram[offs] & 0x80) + { + sx = 224 - sx; + sy = 225 - sy; + } + else + { + sx = 240 - sx; + sy = 241 - sy; + } + flipx = !flipx; + flipy = !flipy; + } + + drawgfx(bitmap,machine->gfx[(spriteram[offs] & 0x80) ? 3 : 2], /* normal or double size */ + spriteram[offs], + spriteram[offs + 1] & 0x0f, + flipx,flipy, + sx + (flip_screen ? scroll : -scroll), sy, + cliprect,TRANSPARENCY_PEN,0); + } +} + +VIDEO_UPDATE( pbaction ) +{ + tilemap_draw(bitmap, cliprect, bg_tilemap, 0, 0); + draw_sprites(machine, bitmap, cliprect); + tilemap_draw(bitmap, cliprect, fg_tilemap, 0, 0); + return 0; +} |