Color table removal

This commit is contained in:
Zsolt Vasvari 2008-02-10 23:56:10 +00:00
parent e49ffe3289
commit c35974fbdc
2 changed files with 137 additions and 104 deletions

View File

@ -12,12 +12,16 @@ Ikki (c) 1985 Sun Electronics
#include "deprecat.h"
#include "sound/sn76496.h"
extern UINT8 *ikki_scroll;
PALETTE_INIT( ikki );
VIDEO_START( ikki );
VIDEO_UPDATE( ikki );
/****************************************************************************/
WRITE8_HANDLER( ikki_scroll_w );
WRITE8_HANDLER( ikki_scrn_ctrl_w );
static READ8_HANDLER( ikki_e000_r )
@ -50,7 +54,7 @@ static ADDRESS_MAP_START( ikki_cpu1, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0xe005, 0xe005) AM_READ(input_port_3_r) /* player2 */
AM_RANGE(0xe008, 0xe008) AM_WRITE(ikki_scrn_ctrl_w)
AM_RANGE(0xe009, 0xe009) AM_WRITE(ikki_coin_counters)
AM_RANGE(0xe00a, 0xe00b) AM_WRITE(ikki_scroll_w)
AM_RANGE(0xe00a, 0xe00b) AM_WRITE(MWA8_RAM) AM_BASE(&ikki_scroll)
ADDRESS_MAP_END
static ADDRESS_MAP_START( ikki_cpu2, ADDRESS_SPACE_PROGRAM, 8 )
@ -208,11 +212,10 @@ static MACHINE_DRIVER_START( ikki )
MDRV_SCREEN_SIZE(32*8, 32*8)
MDRV_SCREEN_VISIBLE_AREA(1*8, 31*8-1, 2*8, 30*8-1)
MDRV_GFXDECODE(ikki)
MDRV_PALETTE_LENGTH(256+1)
MDRV_COLORTABLE_LENGTH(1024)
MDRV_PALETTE_LENGTH(1024)
MDRV_PALETTE_INIT(ikki)
MDRV_VIDEO_START(generic)
MDRV_VIDEO_START(ikki)
MDRV_VIDEO_UPDATE(ikki)
/* sound hardware */

View File

@ -10,41 +10,53 @@ Video hardware driver by Uki
#include "driver.h"
static UINT8 ikki_flipscreen, ikki_scroll[2];
UINT8 *ikki_scroll;
static mame_bitmap *sprite_bitmap;
static UINT8 ikki_flipscreen;
static int punch_through_pen;
PALETTE_INIT( ikki )
{
int i;
for (i = 0; i<256; i++)
{
palette_set_color_rgb(machine,i,pal4bit(color_prom[0]),pal4bit(color_prom[256]),pal4bit(color_prom[2*256]));
/* allocate the colortable - extra pen for the punch through pen */
machine->colortable = colortable_alloc(machine, 0x101);
color_prom++;
/* create a lookup table for the palette */
for (i = 0; i < 0x100; i++)
{
int r = pal4bit(color_prom[i + 0x000]);
int g = pal4bit(color_prom[i + 0x100]);
int b = pal4bit(color_prom[i + 0x200]);
colortable_palette_set_color(machine->colortable, i, MAKE_RGB(r, g, b));
}
/* 256th color is not drawn on screen */
/* this is used for special transparent function */
palette_set_color(machine,256,MAKE_RGB(0,0,1));
color_prom += 2*256;
/* color_prom now points to the beginning of the lookup table */
color_prom += 0x300;
/* sprites lookup table */
for (i=0; i<512; i++)
for (i = 0; i < 0x200; i++)
{
int d = 255-*(color_prom++);
if ( ((i % 8) == 7) && (d == 0) )
*(colortable++) = 256; /* special transparent */
else
*(colortable++) = d; /* normal color */
UINT16 ctabentry = color_prom[i] ^ 0xff;
if (((i & 0x07) == 0x07) && (ctabentry == 0))
{
/* punch through */
punch_through_pen = i;
ctabentry = 0x100;
}
colortable_entry_set_value(machine->colortable, i, ctabentry);
}
/* bg lookup table */
for (i=0; i<512; i++)
*(colortable++) = *(color_prom++);
for (i = 0x200; i < 0x400; i++)
{
UINT8 ctabentry = color_prom[i];
colortable_entry_set_value(machine->colortable, i, ctabentry);
}
}
WRITE8_HANDLER( ikki_scroll_w )
@ -57,35 +69,91 @@ WRITE8_HANDLER( ikki_scrn_ctrl_w )
ikki_flipscreen = (data >> 2) & 1;
}
static void draw_sprites(running_machine *machine, mame_bitmap *bitmap, const rectangle *cliprect)
{
int y;
offs_t offs;
fillbitmap(sprite_bitmap, punch_through_pen, cliprect);
for (offs = 0; offs < 0x800; offs += 4)
{
int code = (spriteram[offs + 2] & 0x80) | (spriteram[offs + 1] >> 1);
int color = spriteram[offs + 2] & 0x3f;
int x = spriteram[offs + 3];
y = spriteram[offs + 0];
if (ikki_flipscreen)
x = 240 - x;
else
y = 224 - y;
x = x & 0xff;
y = y & 0xff;
if (x > 248)
x = x - 256;
if (y > 240)
y = y - 256;
drawgfx(sprite_bitmap,machine->gfx[1],
code, color,
ikki_flipscreen,ikki_flipscreen,
x,y,
cliprect, TRANSPARENCY_PENS,
colortable_get_transpen_mask(machine->colortable, machine->gfx[1], color, 0));
}
/* copy the sprite bitmap into the main bitmap, skipping the transparent pixels */
for (y = cliprect->min_y; y <= cliprect->max_y; y++)
{
int x;
for (x = cliprect->min_x; x <= cliprect->max_x; x++)
{
UINT16 pen = *BITMAP_ADDR16(sprite_bitmap, y, x);
if (colortable_entry_get_value(machine->colortable, pen) != 0x100)
*BITMAP_ADDR16(bitmap, y, x) = pen;
}
}
}
VIDEO_START( ikki )
{
sprite_bitmap = auto_bitmap_alloc(machine->screen[0].width, machine->screen[0].height, machine->screen[0].format);
}
VIDEO_UPDATE( ikki )
{
int offs,chr,col,px,py,f,bank,d;
offs_t offs;
UINT8 *VIDEOATTR = memory_region( REGION_USER1 );
f = ikki_flipscreen;
/* draw bg layer */
for (offs=0; offs<(videoram_size/2); offs++)
{
int sx,sy;
int color, bank;
sx = offs / 32;
sy = offs % 32;
int sx = offs / 32;
int sy = offs % 32;
int y = sy*8;
int x = sx*8;
py = sy*8;
px = sx*8;
d = VIDEOATTR[ sx ];
int d = VIDEOATTR[ sx ];
switch (d)
{
case 0x02: /* scroll area */
px = sx*8 - ikki_scroll[1];
if (px<0)
px=px+8*22;
py = (sy*8 + ~ikki_scroll[0]) & 0xff;
x = sx*8 - ikki_scroll[1];
if (x<0)
x=x+8*22;
y = (sy*8 + ~ikki_scroll[0]) & 0xff;
break;
case 0x03: /* non-scroll area */
@ -104,95 +172,57 @@ VIDEO_UPDATE( ikki )
break;
}
if (f != 0)
if (ikki_flipscreen)
{
px = 248-px;
py = 248-py;
x = 248-x;
y = 248-y;
}
col = videoram[offs*2];
bank = (col & 0xe0) << 3;
col = ((col & 0x1f)<<0) | ((col & 0x80) >> 2);
color = videoram[offs*2];
bank = (color & 0xe0) << 3;
color = ((color & 0x1f)<<0) | ((color & 0x80) >> 2);
drawgfx(bitmap,machine->gfx[0],
videoram[offs*2+1] + bank,
col,
f,f,
px,py,
color,
ikki_flipscreen,ikki_flipscreen,
x,y,
cliprect,TRANSPARENCY_NONE,0);
}
/* draw sprites */
fillbitmap(tmpbitmap, machine->pens[256], 0);
/* c060 - c0ff */
for (offs=0x00; offs<0x800; offs +=4)
{
chr = spriteram[offs+1] >> 1 ;
col = spriteram[offs+2];
px = spriteram[offs+3];
py = spriteram[offs+0];
chr += (col & 0x80);
col = (col & 0x3f) >> 0 ;
if (f==0)
py = 224-py;
else
px = 240-px;
px = px & 0xff;
py = py & 0xff;
if (px>248)
px = px-256;
if (py>240)
py = py-256;
drawgfx(tmpbitmap,machine->gfx[1],
chr,
col,
f,f,
px,py,
cliprect,TRANSPARENCY_COLOR,0);
}
copybitmap_trans(bitmap,tmpbitmap,0,0,0,0,cliprect,machine->pens[256]);
draw_sprites(machine, bitmap, cliprect);
/* mask sprites */
for (offs=0; offs<(videoram_size/2); offs++)
{
int sx,sy;
int sx = offs / 32;
int sy = offs % 32;
sx = offs / 32;
sy = offs % 32;
d = VIDEOATTR[ sx ];
int d = VIDEOATTR[ sx ];
if ( (d == 0) || (d == 0x0d) )
{
py = sy*8;
px = sx*8;
int color, bank;
if (f != 0)
int y = sy*8;
int x = sx*8;
if (ikki_flipscreen)
{
px = 248-px;
py = 248-py;
x = 248-x;
y = 248-y;
}
col = videoram[offs*2];
bank = (col & 0xe0) << 3;
col = ((col & 0x1f)<<0) | ((col & 0x80) >> 2);
color = videoram[offs*2];
bank = (color & 0xe0) << 3;
color = ((color & 0x1f)<<0) | ((color & 0x80) >> 2);
drawgfx(bitmap,machine->gfx[0],
videoram[offs*2+1] + bank,
col,
f,f,
px,py,
color,
ikki_flipscreen,ikki_flipscreen,
x,y,
cliprect,TRANSPARENCY_NONE,0);
}
}