/***************************************************************************
Functions to emulate the video hardware of the machine.
Video hardware of this hardware is almost similar with "mexico86". So,
most routines are derived from mexico86 driver.
***************************************************************************/
#include "driver.h"
UINT8 *exzisus_videoram0;
UINT8 *exzisus_videoram1;
UINT8 *exzisus_objectram0;
UINT8 *exzisus_objectram1;
size_t exzisus_objectram_size0;
size_t exzisus_objectram_size1;
/***************************************************************************
Memory handlers
***************************************************************************/
READ8_HANDLER ( exzisus_videoram_0_r )
{
return exzisus_videoram0[offset];
}
READ8_HANDLER ( exzisus_videoram_1_r )
{
return exzisus_videoram1[offset];
}
READ8_HANDLER ( exzisus_objectram_0_r )
{
return exzisus_objectram0[offset];
}
READ8_HANDLER ( exzisus_objectram_1_r )
{
return exzisus_objectram1[offset];
}
WRITE8_HANDLER( exzisus_videoram_0_w )
{
exzisus_videoram0[offset] = data;
}
WRITE8_HANDLER( exzisus_videoram_1_w )
{
exzisus_videoram1[offset] = data;
}
WRITE8_HANDLER( exzisus_objectram_0_w )
{
exzisus_objectram0[offset] = data;
}
WRITE8_HANDLER( exzisus_objectram_1_w )
{
exzisus_objectram1[offset] = data;
}
/***************************************************************************
Screen refresh
***************************************************************************/
VIDEO_UPDATE( exzisus )
{
int offs;
int sx, sy, xc, yc;
int gfx_num, gfx_attr, gfx_offs;
/* Is this correct ? */
fillbitmap(bitmap, machine->pens[1023], cliprect);
/* ---------- 1st TC0010VCU ---------- */
sx = 0;
for (offs = 0 ; offs < exzisus_objectram_size0 ; offs += 4)
{
int height;
/* Skip empty sprites. */
if ( !(*(UINT32 *)(&exzisus_objectram0[offs])) )
{
continue;
}
gfx_num = exzisus_objectram0[offs + 1];
gfx_attr = exzisus_objectram0[offs + 3];
if ((gfx_num & 0x80) == 0) /* 16x16 sprites */
{
gfx_offs = ((gfx_num & 0x7f) << 3);
height = 2;
sx = exzisus_objectram0[offs + 2];
sx |= (gfx_attr & 0x40) << 2;
}
else /* tilemaps (each sprite is a 16x256 column) */
{
gfx_offs = ((gfx_num & 0x3f) << 7) + 0x0400;
height = 32;
if (gfx_num & 0x40) /* Next column */
{
sx += 16;
}
else
{
sx = exzisus_objectram0[offs + 2];
sx |= (gfx_attr & 0x40) << 2;
}
}
sy = 256 - (height << 3) - (exzisus_objectram0[offs]);
for (xc = 0 ; xc < 2 ; xc++)
{
int goffs = gfx_offs;
for (yc = 0 ; yc < height ; yc++)
{
int code, color, x, y;
code = (exzisus_videoram0[goffs + 1] << 8) | exzisus_videoram0[goffs];
color = (exzisus_videoram0[goffs + 1] >> 6) | (gfx_attr & 0x0f);
x = (sx + (xc << 3)) & 0xff;
y = (sy + (yc << 3)) & 0xff;
if (flip_screen)
{
x = 248 - x;
y = 248 - y;
}
drawgfx(bitmap, machine->gfx[0],
code & 0x3fff,
color,
flip_screen, flip_screen,
x, y,
cliprect, TRANSPARENCY_PEN, 15);
goffs += 2;
}
gfx_offs += height << 1;
}
}
/* ---------- 2nd TC0010VCU ---------- */
sx = 0;
for (offs = 0 ; offs < exzisus_objectram_size1 ; offs += 4)
{
int height;
/* Skip empty sprites. */
if ( !(*(UINT32 *)(&exzisus_objectram1[offs])) )
{
continue;
}
gfx_num = exzisus_objectram1[offs + 1];
gfx_attr = exzisus_objectram1[offs + 3];
if ((gfx_num & 0x80) == 0) /* 16x16 sprites */
{
gfx_offs = ((gfx_num & 0x7f) << 3);
height = 2;
sx = exzisus_objectram1[offs + 2];
sx |= (gfx_attr & 0x40) << 2;
}
else /* tilemaps (each sprite is a 16x256 column) */
{
gfx_offs = ((gfx_num & 0x3f) << 7) + 0x0400; ///
height = 32;
if (gfx_num & 0x40) /* Next column */
{
sx += 16;
}
else
{
sx = exzisus_objectram1[offs + 2];
sx |= (gfx_attr & 0x40) << 2;
}
}
sy = 256 - (height << 3) - (exzisus_objectram1[offs]);
for (xc = 0 ; xc < 2 ; xc++)
{
int goffs = gfx_offs;
for (yc = 0 ; yc < height ; yc++)
{
int code, color, x, y;
code = (exzisus_videoram1[goffs + 1] << 8) | exzisus_videoram1[goffs];
color = (exzisus_videoram1[goffs + 1] >> 6) | (gfx_attr & 0x0f);
x = (sx + (xc << 3)) & 0xff;
y = (sy + (yc << 3)) & 0xff;
if (flip_screen)
{
x = 248 - x;
y = 248 - y;
}
drawgfx(bitmap, machine->gfx[1],
code & 0x3fff,
color,
flip_screen, flip_screen,
x, y,
cliprect, TRANSPARENCY_PEN, 15);
goffs += 2;
}
gfx_offs += height << 1;
}
}
return 0;
}