/*
* Beatmania DJ Main Board (GX753)
* emulate video hardware
*/
#include "driver.h"
#include "video/konamiic.h"
#define NUM_SPRITES (0x800 / 16)
#define NUM_LAYERS 2
UINT32 *djmain_obj_ram;
static void draw_sprites(running_machine* machine, mame_bitmap *bitmap, const rectangle *cliprect)
{
int offs, pri_code;
int sortedlist[NUM_SPRITES];
machine->gfx[0]->color_base = K055555_read_register(K55_PALBASE_SUB2) * 0x400;
for (offs = 0; offs < NUM_SPRITES; offs++)
sortedlist[offs] = -1;
/* prebuild a sorted table */
for (offs = 0; offs < NUM_SPRITES * 4; offs += 4)
{
if (djmain_obj_ram[offs] & 0x00008000)
{
if (djmain_obj_ram[offs] & 0x80000000)
continue;
pri_code = djmain_obj_ram[offs] & (NUM_SPRITES - 1);
sortedlist[pri_code] = offs;
}
}
for (pri_code = NUM_SPRITES - 1; pri_code >= 0; pri_code--)
{
static int xoffset[8] = { 0, 1, 4, 5, 16, 17, 20, 21 };
static int yoffset[8] = { 0, 2, 8, 10, 32, 34, 40, 42 };
static int sizetab[4] = { 1, 2, 4, 8 };
int x, y;
int ox, oy;
int flipx, flipy;
int xscale, yscale;
int code;
int color;
int size;
offs = sortedlist[pri_code];
if (offs == -1) continue;
code = djmain_obj_ram[offs] >> 16;
flipx = (djmain_obj_ram[offs] >> 10) & 1;
flipy = (djmain_obj_ram[offs] >> 11) & 1;
size = sizetab[(djmain_obj_ram[offs] >> 8) & 3];
ox = (INT16)(djmain_obj_ram[offs + 1] & 0xffff);
oy = (INT16)(djmain_obj_ram[offs + 1] >> 16);
xscale = djmain_obj_ram[offs + 2] >> 16;
yscale = djmain_obj_ram[offs + 2] & 0xffff;
if (!xscale || !yscale)
continue;
xscale = (0x40 << 16) / xscale;
yscale = (0x40 << 16) / yscale;
ox -= (size * xscale) >> 13;
oy -= (size * yscale) >> 13;
color = (djmain_obj_ram[offs + 3] >> 16) & 15;
for (x = 0; x < size; x++)
for (y = 0; y < size; y++)
{
int c = code;
if (flipx)
c += xoffset[size - x - 1];
else
c += xoffset[x];
if (flipy)
c += yoffset[size - y - 1];
else
c += yoffset[y];
if (xscale != 0x10000 || yscale != 0x10000)
{
int sx = ox + ((x * xscale + (1 << 11)) >> 12);
int sy = oy + ((y * yscale + (1 << 11)) >> 12);
int zw = ox + (((x + 1) * xscale + (1 << 11)) >> 12) - sx;
int zh = oy + (((y + 1) * yscale + (1 << 11)) >> 12) - sy;
drawgfxzoom(bitmap,
machine->gfx[0],
c,
color,
flipx,
flipy,
sx,
sy,
cliprect,
TRANSPARENCY_PEN,
0,
(zw << 16) / 16,
(zh << 16) / 16);
}
else
{
int sx = ox + (x << 4);
int sy = oy + (y << 4);
drawgfx(bitmap,
machine->gfx[0],
c,
color,
flipx,
flipy,
sx,
sy,
cliprect,
TRANSPARENCY_PEN,
0);
}
}
}
}
static void game_tile_callback(int layer, int *code, int *color, int *flags)
{
}
VIDEO_START( djmain )
{
static int scrolld[NUM_LAYERS][4][2] = {
{{ 0, 0}, {0, 0}, {0, 0}, {0, 0}},
{{ 0, 0}, {0, 0}, {0, 0}, {0, 0}}
};
K056832_vh_start(machine, REGION_GFX2, K056832_BPP_4dj, 1, scrolld, game_tile_callback, 1);
K055555_vh_start();
K056832_set_LayerOffset(0, -92, -27);
// K056832_set_LayerOffset(1, -87, -27);
K056832_set_LayerOffset(1, -88, -27);
}
VIDEO_UPDATE( djmain )
{
int enables = K055555_read_register(K55_INPUT_ENABLES);
int pri[NUM_LAYERS + 1];
int order[NUM_LAYERS + 1];
int i, j;
for (i = 0; i < NUM_LAYERS; i++)
pri[i] = K055555_read_register(K55_PRIINP_0 + i * 3);
pri[i] = K055555_read_register(K55_PRIINP_10);
for (i = 0; i < NUM_LAYERS + 1; i++)
order[i] = i;
for (i = 0; i < NUM_LAYERS; i++)
for (j = i + 1; j < NUM_LAYERS + 1; j++)
if (pri[order[i]] > pri[order[j]])
{
int temp = order[i];
order[i] = order[j];
order[j] = temp;
}
fillbitmap(bitmap, machine->remapped_colortable[0], cliprect);
for (i = 0; i < NUM_LAYERS + 1; i++)
{
int layer = order[i];
if (layer == NUM_LAYERS)
{
if (enables & K55_INP_SUB2)
draw_sprites(machine, bitmap, cliprect);
}
else
{
if (enables & (K55_INP_VRAM_A << layer))
K056832_tilemap_draw_dj(machine, bitmap, cliprect, layer, 0, 1 << i);
}
}
return 0;
}