diff options
Diffstat (limited to 'src/mame/video/darius.c')
-rw-r--r-- | src/mame/video/darius.c | 155 |
1 files changed, 155 insertions, 0 deletions
diff --git a/src/mame/video/darius.c b/src/mame/video/darius.c new file mode 100644 index 00000000000..27edc7c3687 --- /dev/null +++ b/src/mame/video/darius.c @@ -0,0 +1,155 @@ +#include "driver.h" +#include "video/taitoic.h" + + +static tilemap *fg_tilemap; +UINT16 *darius_fg_ram; + +struct tempsprite +{ + int gfx; + int code,color; + int flipx,flipy; + int x,y; + int zoomx,zoomy; + int primask; +}; +static struct tempsprite *spritelist; + + +/***************************************************************************/ + +INLINE void actual_get_fg_tile_info(running_machine *machine, tile_data *tileinfo, int tile_index, UINT16 *ram,int gfxnum) +{ + UINT16 code = (ram[tile_index + 0x2000] & 0x7ff); + UINT16 attr = ram[tile_index]; + + SET_TILE_INFO( + gfxnum, + code, + ((attr & 0xff) << 2), + TILE_FLIPYX((attr & 0xc000) >> 14)); +} + +static TILE_GET_INFO( get_fg_tile_info ) +{ + actual_get_fg_tile_info(machine, tileinfo, tile_index, darius_fg_ram, 2); +} + +static void dirty_fg_tilemap(void) +{ + tilemap_mark_all_tiles_dirty(fg_tilemap); +} + +/***************************************************************************/ + +VIDEO_START( darius ) +{ + fg_tilemap = tilemap_create(get_fg_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN,8,8,128,64); + + spritelist = auto_malloc(0x800 * sizeof(*spritelist)); + + /* (chips, gfxnum, x_offs, y_offs, y_invert, opaque, dblwidth) */ + PC080SN_vh_start(1,1,-16,8,0,1,1); + + tilemap_set_transparent_pen(fg_tilemap,0); + + /* colors from saved states are often screwy (and this doesn't help...) */ + state_save_register_func_postload(dirty_fg_tilemap); +} + +/***************************************************************************/ + +READ16_HANDLER( darius_fg_layer_r ) +{ + return darius_fg_ram[offset]; +} + +WRITE16_HANDLER( darius_fg_layer_w ) +{ + COMBINE_DATA(&darius_fg_ram[offset]); + if (offset < 0x4000) + tilemap_mark_tile_dirty(fg_tilemap,(offset & 0x1fff)); +} + +/***************************************************************************/ + +static void draw_sprites(running_machine *machine, mame_bitmap *bitmap,const rectangle *cliprect,int primask, int x_offs, int y_offs) +{ + int offs,curx,cury; + UINT16 code,data,sx,sy; + UINT8 flipx,flipy,color,priority; + + /* pdrawgfx() needs us to draw sprites front to back, so we have to build a list + while processing sprite ram and then draw them all at the end */ + struct tempsprite *sprite_ptr = spritelist; + + for (offs = spriteram_size/2-4; offs >= 0; offs -= 4) + { + code = spriteram16[offs+2] &0x1fff; + + if (code) + { + data = spriteram16[offs]; + sy = (256-data) & 0x1ff; + + data = spriteram16[offs+1]; + sx = data & 0x3ff; + + data = spriteram16[offs+2]; + flipx = ((data & 0x4000) >> 14); + flipy = ((data & 0x8000) >> 15); + + data = spriteram16[offs+3]; + priority = (data &0x80) >> 7; // 0 = low + if (priority != primask) continue; + color = (data & 0x7f); + + curx = sx - x_offs; + cury = sy + y_offs; + + if (curx > 900) curx -= 1024; + if (cury > 400) cury -= 512; + + sprite_ptr->code = code; + sprite_ptr->color = color; + sprite_ptr->flipx = flipx; + sprite_ptr->flipy = flipy; + sprite_ptr->x = curx; + sprite_ptr->y = cury; + + drawgfx(bitmap,machine->gfx[0], + sprite_ptr->code, + sprite_ptr->color, + sprite_ptr->flipx,sprite_ptr->flipy, + sprite_ptr->x,sprite_ptr->y, + cliprect,TRANSPARENCY_PEN,0); + } + } +} + + + +VIDEO_UPDATE( darius ) +{ + int xoffs = 36*8*screen; + + PC080SN_tilemap_update(); + + // draw bottom layer(always active) + PC080SN_tilemap_draw_offset(bitmap,cliprect,0,0,TILEMAP_DRAW_OPAQUE,0,-xoffs,0); + + /* Sprites can be under/over the layer below text layer */ + draw_sprites(machine,bitmap,cliprect,0,xoffs,-8); // draw sprites with priority 0 which are under the mid layer + + // draw middle layer + PC080SN_tilemap_draw_offset(bitmap,cliprect,0,1,0,0,-xoffs,0); + + draw_sprites(machine,bitmap,cliprect,1,xoffs,-8); // draw sprites with priority 1 which are over the mid layer + + /* top(text) layer is in fixed position */ + tilemap_set_scrollx(fg_tilemap,0,0+xoffs); + tilemap_set_scrolly(fg_tilemap,0,-8); + tilemap_draw(bitmap,cliprect,fg_tilemap,0,0); + return 0; +} |