diff options
Diffstat (limited to 'src/mame/video/raiders5.c')
-rw-r--r-- | src/mame/video/raiders5.c | 233 |
1 files changed, 233 insertions, 0 deletions
diff --git a/src/mame/video/raiders5.c b/src/mame/video/raiders5.c new file mode 100644 index 00000000000..2a660b61388 --- /dev/null +++ b/src/mame/video/raiders5.c @@ -0,0 +1,233 @@ +/******************************************************************************* + +Raiders5 (c) 1985 Taito / UPL + +Video hardware driver by Uki + + 02/Jun/2001 - + +*******************************************************************************/ + +#include "driver.h" + + +UINT8 *raiders5_foreground_videoram; +UINT8 *raiders5_foreground_colorram; +UINT8 *raiders5_background_videoram; +UINT8 *raiders5_background_colorram; +UINT8 *raiders5_spriteram; +size_t raiders5_spriteram_size; + + +static UINT8 raiders5_scroll_x; +static UINT8 raiders5_scroll_y; +static UINT8 raiders5_flip_screen; + +static tilemap *background_tilemap; +static tilemap *foreground_tilemap; + + + +/************************************* + * + * Callbacks for the TileMap code + * + *************************************/ + +static TILE_GET_INFO( get_background_tile_info ) +{ + UINT8 bank = ((raiders5_background_colorram[tile_index] >> 1) & 0x01) + 3; /* ? */ + + UINT16 code = raiders5_background_videoram[tile_index] | + ((raiders5_background_colorram[tile_index] & 0x01) << 8); + + UINT8 color = raiders5_background_colorram[tile_index] >> 4; + + SET_TILE_INFO(bank, code, color, 0); +} + + +static TILE_GET_INFO( get_foreground_tile_info ) +{ + UINT16 code = raiders5_foreground_videoram[tile_index]; + + UINT8 color = raiders5_foreground_colorram[tile_index] >> 4; + + SET_TILE_INFO(2, code, color, 0); +} + + + +/************************************* + * + * Video system start + * + *************************************/ + +VIDEO_START( raiders5 ) +{ + background_tilemap = tilemap_create(get_background_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN,8,8,32,32); + foreground_tilemap = tilemap_create(get_foreground_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN,8,8,32,32); + + tilemap_set_scrolldx(background_tilemap, 7, 0); + + tilemap_set_transparent_pen(foreground_tilemap, 0); +} + + + +/************************************* + * + * Memory handlers + * + *************************************/ + +WRITE8_HANDLER( raiders5_scroll_x_w ) +{ + raiders5_scroll_x = data; +} + + +WRITE8_HANDLER( raiders5_scroll_y_w ) +{ + raiders5_scroll_y = data; +} + + +WRITE8_HANDLER( raiders5_flip_screen_w ) +{ + raiders5_flip_screen = data & 0x01; + + tilemap_set_flip(ALL_TILEMAPS, (raiders5_flip_screen ? (TILEMAP_FLIPX | TILEMAP_FLIPY) : 0)); +} + + +WRITE8_HANDLER( raiders5_foreground_videoram_w ) +{ + raiders5_foreground_videoram[offset] = data; + tilemap_mark_tile_dirty(foreground_tilemap, offset); +} + + +WRITE8_HANDLER( raiders5_foreground_colorram_w ) +{ + raiders5_foreground_colorram[offset] = data; + tilemap_mark_tile_dirty(foreground_tilemap, offset); +} + + +WRITE8_HANDLER( raiders5_background_videoram_w ) +{ + offs_t y = (offset + ((raiders5_scroll_y & 0xf8) << 2)) & 0x3e0; + offs_t x = (offset + (raiders5_scroll_x >> 3)) & 0x1f; + + raiders5_background_videoram[y | x] = data; + tilemap_mark_tile_dirty(background_tilemap, y | x); +} + + +READ8_HANDLER( raiders5_background_videoram_r ) +{ + offs_t y = (offset + ((raiders5_scroll_y & 0xf8) << 2)) & 0x3e0; + offs_t x = (offset + (raiders5_scroll_x >> 3)) & 0x1f; + + return raiders5_background_videoram[y | x]; +} + + +WRITE8_HANDLER( raiders5_background_colorram_w ) +{ + offs_t y = (offset + ((raiders5_scroll_y & 0xf8) << 2)) & 0x3e0; + offs_t x = (offset + (raiders5_scroll_x >> 3)) & 0x1f; + + raiders5_background_colorram[y | x] = data; + tilemap_mark_tile_dirty(background_tilemap, y | x); +} + + +READ8_HANDLER( raiders5_background_colorram_r ) +{ + offs_t y = (offset + ((raiders5_scroll_y & 0xf8) << 2)) & 0x3e0; + offs_t x = (offset + (raiders5_scroll_x >> 3)) & 0x1f; + + return raiders5_background_colorram[y | x]; +} + + +WRITE8_HANDLER( raiders5_paletteram_w ) +{ + paletteram_BBGGRRII_w(offset, data); + + if (offset < 0x10) + { + if (offset != 1) + { + int i; + + for (i = 0; i < 0x10; i++) + { + paletteram_BBGGRRII_w(offset + (i * 0x10) + 0x0200, data); + } + } + + paletteram_BBGGRRII_w((offset * 0x10) + 0x0201, data); + } +} + + + +/************************************* + * + * Video update + * + *************************************/ + +static void draw_sprites(running_machine *machine, mame_bitmap *bitmap, const rectangle *cliprect) +{ + offs_t offs; + + for (offs = 0; offs < raiders5_spriteram_size; offs += 32) + { + UINT8 bank = (raiders5_spriteram[offs + 3] >> 1) & 0x01; + + UINT8 code = ((raiders5_spriteram[offs + 3] << 6) & 0x40) | (raiders5_spriteram[offs + 0] >> 2); + + UINT8 color = raiders5_spriteram[offs + 3] >> 4; + + int flip_y = ((raiders5_spriteram[offs + 0] >> 1) & 0x01) ^ raiders5_flip_screen; + int flip_x = ((raiders5_spriteram[offs + 0] >> 0) & 0x01) ^ raiders5_flip_screen; + + UINT8 y = raiders5_spriteram[offs + 2]; + UINT8 x = raiders5_spriteram[offs + 1]; + + if (raiders5_flip_screen) + { + y = 240 - y; + x = 240 - x; + } + + drawgfx(bitmap,machine->gfx[bank], + code, color, flip_x, flip_y, + x, y, cliprect, TRANSPARENCY_PEN, 0); + + /* draw it wrapped around */ + drawgfx(bitmap,machine->gfx[bank], + code, color, flip_x, flip_y, + x - 0x100, y, cliprect, TRANSPARENCY_PEN, 0); + } +} + + +VIDEO_UPDATE( raiders5 ) +{ + tilemap_set_scrolly(background_tilemap, 0, raiders5_scroll_y); + tilemap_set_scrollx(background_tilemap, 0, raiders5_scroll_x); + + tilemap_draw(bitmap, cliprect, background_tilemap, 0, 0); + + draw_sprites(machine, bitmap, cliprect); + + tilemap_draw(bitmap, cliprect, foreground_tilemap, 0, 0); + + return 0; +} |