/***************************************************************************
Functions to emulate similar video hardware on these Taito games:
- rastan
- operation wolf
- rainbow islands
- jumping (bootleg)
***************************************************************************/
#include "driver.h"
#include "video/taitoic.h"
static UINT16 sprite_ctrl = 0;
static UINT16 sprites_flipscreen = 0;
/***************************************************************************/
VIDEO_START( rastan )
{
/* (chips, gfxnum, x_offs, y_offs, y_invert, opaque, dblwidth) */
PC080SN_vh_start(1,0,0,0,0,0,0);
PC090OJ_vh_start(1,0,0,0);
}
VIDEO_START( opwolf )
{
PC080SN_vh_start(1,1,0,0,0,0,0);
PC090OJ_vh_start(0,0,0,0);
}
VIDEO_START( rainbow )
{
/* (chips, gfxnum, x_offs, y_offs, y_invert, opaque, dblwidth) */
PC080SN_vh_start(1,1,0,0,0,0,0);
PC090OJ_vh_start(0,0,0,0);
}
VIDEO_START( jumping )
{
PC080SN_vh_start(1,1,0,0,1,0,0);
PC080SN_set_trans_pen(0,1,15);
/* not 100% sure Jumping needs to save both... */
state_save_register_global(sprite_ctrl);
state_save_register_global(sprites_flipscreen);
}
WRITE16_HANDLER( rastan_spritectrl_w )
{
/* bits 5-7 are the sprite palette bank */
PC090OJ_sprite_ctrl = (data & 0xe0) >> 5;
/* bit 4 unused */
/* bits 0 and 1 are coin lockout */
coin_lockout_w(1,~data & 0x01);
coin_lockout_w(0,~data & 0x02);
/* bits 2 and 3 are the coin counters */
coin_counter_w(1,data & 0x04);
coin_counter_w(0,data & 0x08);
}
WRITE16_HANDLER( rainbow_spritectrl_w )
{
if (offset == 0)
{
/* bits 0 and 1 always set */
/* bits 5-7 are the sprite palette bank */
/* other bits unknown */
PC090OJ_sprite_ctrl = (data & 0xe0) >> 5;
}
}
WRITE16_HANDLER( jumping_spritectrl_w )
{
if (offset == 0)
{
/* bits 0 and 1 are set after 15 seconds */
/* bits 5-7 are the sprite palette bank */
/* other bits unknown */
sprite_ctrl = data;
}
}
/***************************************************************************/
VIDEO_UPDATE( rastan )
{
int layer[2];
PC080SN_tilemap_update();
layer[0] = 0;
layer[1] = 1;
fillbitmap(priority_bitmap,0,cliprect);
PC080SN_tilemap_draw(bitmap,cliprect,0,layer[0],TILEMAP_DRAW_OPAQUE,1);
PC080SN_tilemap_draw(bitmap,cliprect,0,layer[1],0,2);
PC090OJ_draw_sprites(machine,bitmap,cliprect,0);
return 0;
}
/***************************************************************************/
VIDEO_UPDATE( opwolf )
{
int layer[2];
PC080SN_tilemap_update();
layer[0] = 0;
layer[1] = 1;
fillbitmap(priority_bitmap,0,cliprect);
PC080SN_tilemap_draw(bitmap,cliprect,0,layer[0],TILEMAP_DRAW_OPAQUE,1);
PC080SN_tilemap_draw(bitmap,cliprect,0,layer[1],0,2);
PC090OJ_draw_sprites(machine,bitmap,cliprect,1);
// if (input_port_5_word_r(0,0xffff))
// popmessage("%d %d",input_port_5_word_r(0,0xffff),input_port_6_word_r(0,0xffff));
return 0;
}
/***************************************************************************/
VIDEO_UPDATE( rainbow )
{
int layer[2];
PC080SN_tilemap_update();
layer[0] = 0;
layer[1] = 1;
fillbitmap(priority_bitmap,0,cliprect);
PC080SN_tilemap_draw(bitmap,cliprect,0,layer[0],TILEMAP_DRAW_OPAQUE,1);
PC080SN_tilemap_draw(bitmap,cliprect,0,layer[1],0,2);
PC090OJ_draw_sprites(machine,bitmap,cliprect,1);
return 0;
}
/***************************************************************************
Jumping uses different sprite controller
than rainbow island. - values are remapped
at address 0x2EA in the code. Apart from
physical layout, the main change is that
the Y settings are active low.
*/
VIDEO_UPDATE( jumping )
{
int offs,layer[2];
int sprite_colbank = (sprite_ctrl & 0xe0) >> 1;
PC080SN_tilemap_update();
/* Override values, or foreground layer is in wrong position */
PC080SN_set_scroll(0,1,16,0);
layer[0] = 0;
layer[1] = 1;
fillbitmap(priority_bitmap,0,cliprect);
PC080SN_tilemap_draw(bitmap,cliprect,0,layer[0],TILEMAP_DRAW_OPAQUE,0);
/* Draw the sprites. 128 sprites in total */
for (offs = spriteram_size/2-8; offs >= 0; offs -= 8)
{
int tile = spriteram16[offs];
if (tile < machine->gfx[1]->total_elements)
{
int sx,sy,color,data1;
sy = ((spriteram16[offs+1] - 0xfff1) ^ 0xffff) & 0x1ff;
if (sy > 400) sy = sy - 512;
sx = (spriteram16[offs+2] - 0x38) & 0x1ff;
if (sx > 400) sx = sx - 512;
data1 = spriteram16[offs+3];
color = (spriteram16[offs+4] & 0x0f) | sprite_colbank;
drawgfx(bitmap,machine->gfx[0],
tile,
color,
data1 & 0x40, data1 & 0x80,
sx,sy+1,
cliprect,TRANSPARENCY_PEN,15);
}
}
PC080SN_tilemap_draw(bitmap,cliprect,0,layer[1],0,0);
#if 0
{
char buf[80];
sprintf(buf,"sprite_ctrl: %04x",sprite_ctrl);
popmessage(buf);
}
#endif
return 0;
}