/* Aquarium */
#include "driver.h"
extern UINT16 *aquarium_scroll;
static tilemap *aquarium_txt_tilemap;
extern UINT16 *aquarium_txt_videoram;
static tilemap *aquarium_mid_tilemap;
extern UINT16 *aquarium_mid_videoram;
static tilemap *aquarium_bak_tilemap;
extern UINT16 *aquarium_bak_videoram;
/* gcpinbal.c modified */
static void draw_sprites(running_machine *machine, mame_bitmap *bitmap,const rectangle *cliprect,int y_offs)
{
int offs,chain_pos;
int x,y,curx,cury;
UINT8 col,flipx,flipy,chain;
UINT16 code;
for (offs = 0;offs < spriteram_size/2;offs += 8)
{
code = ((spriteram16[offs+5])&0xff) + (((spriteram16[offs+6]) &0xff) << 8);
code &= 0x3fff;
if (!(spriteram16[offs+4] &0x80)) /* active sprite ? */
{
x = ((spriteram16[offs+0]) &0xff) + (((spriteram16[offs+1]) &0xff) << 8);
y = ((spriteram16[offs+2]) &0xff) + (((spriteram16[offs+3]) &0xff) << 8);
/* Treat coords as signed */
if (x & 0x8000) x -= 0x10000;
if (y & 0x8000) y -= 0x10000;
col = ((spriteram16[offs+7]) &0x0f);
chain = (spriteram16[offs+4]) &0x07;
flipy = (spriteram16[offs+4]) &0x10;
flipx = (spriteram16[offs+4]) &0x20;
curx = x;
cury = y;
if (((spriteram16[offs+4]) &0x08) && flipy)
cury += (chain * 16);
if (!(((spriteram16[offs+4]) &0x08)) && flipx)
curx += (chain * 16);
for (chain_pos = chain;chain_pos >= 0;chain_pos--)
{
drawgfx(bitmap, machine->gfx[0],
code,
col,
flipx, flipy,
curx,cury,
cliprect,TRANSPARENCY_PEN,0);
/* wrap around y */
drawgfx(bitmap, machine->gfx[0],
code,
col,
flipx, flipy,
curx,cury+256,
cliprect,TRANSPARENCY_PEN,0);
code++;
if ((spriteram16[offs+4]) &0x08) /* Y chain */
{
if (flipy) cury -= 16;
else cury += 16;
}
else /* X chain */
{
if (flipx) curx -= 16;
else curx += 16;
}
}
}
}
#if 0
if (rotate)
{
char buf[80];
sprintf(buf,"sprite rotate offs %04x ?",rotate);
popmessage(buf);
}
#endif
}
/* TXT Layer */
static TILE_GET_INFO( get_aquarium_txt_tile_info )
{
int tileno,colour;
tileno = (aquarium_txt_videoram[tile_index] & 0x0fff);
colour = (aquarium_txt_videoram[tile_index] & 0xf000) >> 12;
SET_TILE_INFO(2,tileno,colour,0);
}
WRITE16_HANDLER( aquarium_txt_videoram_w )
{
aquarium_txt_videoram[offset] = data;
tilemap_mark_tile_dirty(aquarium_txt_tilemap,offset);
}
/* MID Layer */
static TILE_GET_INFO( get_aquarium_mid_tile_info )
{
int tileno,colour,flag;
tileno = (aquarium_mid_videoram[tile_index*2] & 0x0fff);
colour = (aquarium_mid_videoram[tile_index*2+1] & 0x001f);
flag = TILE_FLIPYX((aquarium_mid_videoram[tile_index*2+1] & 0x300) >> 8);
SET_TILE_INFO(1,tileno,colour,flag);
tileinfo->category = (aquarium_mid_videoram[tile_index*2+1] & 0x20) >> 5;
}
WRITE16_HANDLER( aquarium_mid_videoram_w )
{
aquarium_mid_videoram[offset] = data;
tilemap_mark_tile_dirty(aquarium_mid_tilemap,offset/2);
}
/* BAK Layer */
static TILE_GET_INFO( get_aquarium_bak_tile_info )
{
int tileno,colour,flag;
tileno = (aquarium_bak_videoram[tile_index*2] & 0x0fff);
colour = (aquarium_bak_videoram[tile_index*2+1] & 0x001f);
flag = TILE_FLIPYX((aquarium_bak_videoram[tile_index*2+1] & 0x300) >> 8);
SET_TILE_INFO(3,tileno,colour,flag);
tileinfo->category = (aquarium_bak_videoram[tile_index*2+1] & 0x20) >> 5;
}
WRITE16_HANDLER( aquarium_bak_videoram_w )
{
aquarium_bak_videoram[offset] = data;
tilemap_mark_tile_dirty(aquarium_bak_tilemap,offset/2);
}
VIDEO_START(aquarium)
{
aquarium_txt_tilemap = tilemap_create(get_aquarium_txt_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN, 8, 8,64,64);
tilemap_set_transparent_pen(aquarium_txt_tilemap,0);
aquarium_bak_tilemap = tilemap_create(get_aquarium_bak_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN, 16, 16,32,32);
aquarium_mid_tilemap = tilemap_create(get_aquarium_mid_tile_info,tilemap_scan_rows,TILEMAP_TYPE_PEN, 16, 16,32,32);
tilemap_set_transparent_pen(aquarium_mid_tilemap,0);
}
VIDEO_UPDATE(aquarium)
{
tilemap_set_scrollx(aquarium_mid_tilemap, 0, aquarium_scroll[0]);
tilemap_set_scrolly(aquarium_mid_tilemap, 0, aquarium_scroll[1]);
tilemap_set_scrollx(aquarium_bak_tilemap, 0, aquarium_scroll[2]);
tilemap_set_scrolly(aquarium_bak_tilemap, 0, aquarium_scroll[3]);
tilemap_set_scrollx(aquarium_txt_tilemap, 0, aquarium_scroll[4]);
tilemap_set_scrolly(aquarium_txt_tilemap, 0, aquarium_scroll[5]);
tilemap_draw(bitmap,cliprect,aquarium_bak_tilemap,0,0);
tilemap_draw(bitmap,cliprect,aquarium_mid_tilemap,0,0);
draw_sprites(machine, bitmap,cliprect,16);
tilemap_draw(bitmap,cliprect,aquarium_bak_tilemap,1,0);
tilemap_draw(bitmap,cliprect,aquarium_mid_tilemap,1,0);
tilemap_draw(bitmap,cliprect,aquarium_txt_tilemap,0,0);
return 0;
}