Skip to content

Commit

Permalink
Fix incorrect bg colours in Dynamite Duke cont (#27)
Browse files Browse the repository at this point in the history
  • Loading branch information
arcadez2003 authored and amadvance committed Jul 28, 2020
1 parent a0d7769 commit cfcfb93
Showing 1 changed file with 71 additions and 27 deletions.
98 changes: 71 additions & 27 deletions src/vidhrdw/dynduke.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
static tilemap *bg_layer,*fg_layer,*tx_layer;
UINT8 *dynduke_back_data,*dynduke_fore_data,*dynduke_scroll_ram;

static int back_bankbase,fore_bankbase,back_palbase;
static int back_enable,fore_enable,sprite_enable;
static int back_bankbase,fore_bankbase;
static int back_enable,fore_enable,sprite_enable,txt_enable;;

/******************************************************************************/

Expand All @@ -27,12 +27,6 @@ WRITE8_HANDLER( dynduke_paletteram_w )

palette_set_color(offset/2,r,g,b);

/* This is a kludge to handle 5bpp graphics but 4bpp palette data */
/* the 5th bit is actually transparency, so I should use TILEMAP_BITMASK */
if (offset<1024) {
palette_set_color(((offset&0x1f)/2) | (offset&0xffe0) | 2048,r,g,b);
palette_set_color(((offset&0x1f)/2) | (offset&0xffe0) | 2048 | 16,r,g,b);
}
}

WRITE8_HANDLER( dynduke_background_w )
Expand Down Expand Up @@ -63,7 +57,7 @@ static void get_bg_tile_info(int tile_index)
SET_TILE_INFO(
1,
tile+back_bankbase,
color+back_palbase,
color,
0)
}

Expand Down Expand Up @@ -99,7 +93,6 @@ VIDEO_START( dynduke )
fg_layer = tilemap_create(get_fg_tile_info,tilemap_scan_cols,TILEMAP_TRANSPARENT,16,16,32,32);
tx_layer = tilemap_create(get_tx_tile_info,tilemap_scan_rows,TILEMAP_TRANSPARENT, 8, 8,32,32);

tilemap_set_transmask(bg_layer,0,0x0000ffff,0xffff0000); /* 4bpp + The rest - 1bpp */

tilemap_set_transparent_pen(fg_layer,15);
tilemap_set_transparent_pen(tx_layer,15);
Expand All @@ -125,17 +118,21 @@ WRITE8_HANDLER( dynduke_gfxbank_w )

WRITE8_HANDLER( dynduke_control_w )
{
static int old_bpal;

if (data&0x1) back_enable=0; else back_enable=1;
if (data&0x2) back_palbase=16; else back_palbase=0;
if (data&0x4) fore_enable=0; else fore_enable=1;
// bit 0x80 toggles, maybe sprite buffering?
// bit 0x40 is flipscreen
// bit 0x20 not used?
// bit 0x10 not used?
// bit 0x08 is set on the title screen (sprite disable?)
// bit 0x04 unused? txt disable?
// bit 0x02 is used on the map screen (fore disable?)
// bit 0x01 set when inserting coin.. bg disable?

if (data&0x1) back_enable = 0; else back_enable = 1;
if (data&0x2) fore_enable=0; else fore_enable=1;
if (data&0x4) txt_enable = 0; else txt_enable = 1;
if (data&0x8) sprite_enable=0; else sprite_enable=1;

if (back_palbase!=old_bpal)
tilemap_mark_all_tiles_dirty(bg_layer);

old_bpal=back_palbase;
flip_screen_set(data & 0x40);
}

Expand Down Expand Up @@ -176,24 +173,71 @@ static void draw_sprites(mame_bitmap *bitmap,const rectangle *cliprect,int pri)
}
}

static void draw_background(mame_bitmap *bitmap, const rectangle *cliprect, int pri )
{
/* The transparency / palette handling on the background layer is very strange */
const mame_bitmap *bm = tilemap_get_pixmap(bg_layer);
int scrolly, scrollx;
int x,y;

/* if we're disabled, don't draw */
if (!back_enable)
{
fillbitmap(bitmap,get_black_pen(),cliprect);
return;
}


scrolly = ((dynduke_scroll_ram[0x02]&0x30)<<4)+((dynduke_scroll_ram[0x04]&0x7f)<<1)+((dynduke_scroll_ram[0x04]&0x80)>>7);
scrollx = ((dynduke_scroll_ram[0x12]&0x30)<<4)+((dynduke_scroll_ram[0x14]&0x7f)<<1)+((dynduke_scroll_ram[0x14]&0x80)>>7);

for (y=0;y<256;y++)
{
int realy = (y + scrolly) & 0x1ff;
UINT16 *src = (UINT16*)bm->line[realy];
UINT16 *dst = (UINT16*)bitmap->line[y];


for (x=0;x<256;x++)
{
int realx = (x + scrollx) & 0x1ff;
UINT16 srcdat = src[realx];

/* 0x01 - data bits
0x02
0x04
0x08
0x10 - extra colour bit? (first boss)
0x20 - priority over sprites
the old driver also had 'bg_palbase' but I don't see what it's for?
*/

if ((srcdat & 0x20) == pri)
{
if (srcdat & 0x10) srcdat += 0x400;
//if (srcdat & 0x10) srcdat += mame_rand(machine)&0x1f;

srcdat = (srcdat & 0x000f) | ((srcdat & 0xffc0) >> 2);
dst[x] = srcdat;
}


}
}
}

VIDEO_UPDATE( dynduke )
{
/* Setup the tilemaps */
tilemap_set_scrolly( bg_layer,0, ((dynduke_scroll_ram[0x02]&0x30)<<4)+((dynduke_scroll_ram[0x04]&0x7f)<<1)+((dynduke_scroll_ram[0x04]&0x80)>>7) );
tilemap_set_scrollx( bg_layer,0, ((dynduke_scroll_ram[0x12]&0x30)<<4)+((dynduke_scroll_ram[0x14]&0x7f)<<1)+((dynduke_scroll_ram[0x14]&0x80)>>7) );
tilemap_set_scrolly( fg_layer,0, ((dynduke_scroll_ram[0x22]&0x30)<<4)+((dynduke_scroll_ram[0x24]&0x7f)<<1)+((dynduke_scroll_ram[0x24]&0x80)>>7) );
tilemap_set_scrollx( fg_layer,0, ((dynduke_scroll_ram[0x32]&0x30)<<4)+((dynduke_scroll_ram[0x34]&0x7f)<<1)+((dynduke_scroll_ram[0x34]&0x80)>>7) );
tilemap_set_enable( bg_layer,back_enable);
tilemap_set_enable( fg_layer,fore_enable);
tilemap_set_enable( tx_layer,txt_enable);

if (back_enable)
tilemap_draw(bitmap,cliprect,bg_layer,TILEMAP_BACK,0);
else
fillbitmap(bitmap,get_black_pen(),cliprect);

draw_background(bitmap, cliprect,0x00);
draw_sprites(bitmap,cliprect,0); // Untested: does anything use it? Could be behind background
draw_sprites(bitmap,cliprect,1);
tilemap_draw(bitmap,cliprect,bg_layer,TILEMAP_FRONT,0);
draw_background(bitmap, cliprect,0x20);
draw_sprites(bitmap,cliprect,2);
tilemap_draw(bitmap,cliprect,fg_layer,0,0);
draw_sprites(bitmap,cliprect,3);
Expand Down

0 comments on commit cfcfb93

Please sign in to comment.