tecmosys.c> improved sprite priority handling.

This commit is contained in:
davidhay 2008-05-31 22:41:38 +00:00
parent dff073e459
commit 6e65b9880a

View File

@ -212,6 +212,8 @@ static UINT16* tecmosys_880000regs;
static int tecmosys_spritelist; static int tecmosys_spritelist;
static int tecmosys_spritey_hack; // should be a register.. static int tecmosys_spritey_hack; // should be a register..
static bitmap_t *sprite_bitmap;
static MACHINE_RESET( deroon ); static MACHINE_RESET( deroon );
static tilemap *bg0tilemap; static tilemap *bg0tilemap;
@ -544,6 +546,10 @@ ADDRESS_MAP_END
static VIDEO_START(deroon) static VIDEO_START(deroon)
{ {
sprite_bitmap = video_screen_auto_bitmap_alloc(machine->primary_screen);
fillbitmap(sprite_bitmap, 0x0000, NULL);
txt_tilemap = tilemap_create(get_tile_info,tilemap_scan_rows,8,8,32*2,32*2); txt_tilemap = tilemap_create(get_tile_info,tilemap_scan_rows,8,8,32*2,32*2);
tilemap_set_transparent_pen(txt_tilemap,0); tilemap_set_transparent_pen(txt_tilemap,0);
@ -561,26 +567,14 @@ static VIDEO_START(deroon)
} }
static VIDEO_UPDATE(deroon) static void tecmosys_render_sprites_to_bitmap(bitmap_t *bitmap)
{ {
int i;
//const gfx_element *gfx = Machine->gfx[0];
UINT8 *gfxsrc = memory_region ( REGION_GFX1 ); UINT8 *gfxsrc = memory_region ( REGION_GFX1 );
int i;
/* render sprites (with priority information) to temp bitmap */
fillbitmap(bitmap,0x000,cliprect); fillbitmap(sprite_bitmap, 0x0000, NULL);
// tilemap_mark_all_tiles_dirty(bg1tilemap);
tilemap_draw(bitmap,cliprect,bg1tilemap,0,0);
// tilemap_mark_all_tiles_dirty(bg0tilemap);
tilemap_draw(bitmap,cliprect,bg0tilemap,0,0);
/* there are multiple spritelists in here, to allow for buffering */ /* there are multiple spritelists in here, to allow for buffering */
for (i=(tecmosys_spritelist*0x4000)/2;i<((tecmosys_spritelist+1)*0x4000)/2;i+=8) for (i=(tecmosys_spritelist*0x4000)/2;i<((tecmosys_spritelist+1)*0x4000)/2;i+=8)
{ {
int xcnt,ycnt; int xcnt,ycnt;
@ -593,6 +587,7 @@ static VIDEO_UPDATE(deroon)
int ysize = 16; int ysize = 16;
int colour; int colour;
int flipx, flipy; int flipx, flipy;
int priority;
x = tecmosys_spriteram[i+0] & 0x3ff; x = tecmosys_spriteram[i+0] & 0x3ff;
y = tecmosys_spriteram[i+1] & 0x3ff; y = tecmosys_spriteram[i+1] & 0x3ff;
@ -619,6 +614,8 @@ static VIDEO_UPDATE(deroon)
colour = ((tecmosys_spriteram[i+4] & 0x3f00))>>8; colour = ((tecmosys_spriteram[i+4] & 0x3f00))>>8;
priority = ((tecmosys_spriteram[i+4] & 0x0030))>>4;
if (tecmosys_spriteram[i+4] & 0x8000) continue; if (tecmosys_spriteram[i+4] & 0x8000) continue;
@ -639,13 +636,13 @@ static VIDEO_UPDATE(deroon)
{ {
UINT8 data; UINT8 data;
dstptr = BITMAP_ADDR16(bitmap, drawy, drawx); dstptr = BITMAP_ADDR16(sprite_bitmap, drawy, drawx);
data = (gfxsrc[address]); data = (gfxsrc[address]);
if(data) dstptr[0] = data + (colour*0x100); if(data) dstptr[0] = (data + (colour*0x100)) | (priority << 14);
} }
@ -656,13 +653,41 @@ static VIDEO_UPDATE(deroon)
} }
} }
}
// tilemap_mark_all_tiles_dirty(bg2tilemap); static void tecmosys_copy_spritebitmap_priority(bitmap_t *bitmap, UINT16 primask)
tilemap_draw(bitmap,cliprect,bg2tilemap,0,0); {
int y,x;
UINT16 *srcptr, *dstptr;
for (y=0;y<240;y++)
{
srcptr = BITMAP_ADDR16(sprite_bitmap, y, 0);
dstptr = BITMAP_ADDR16(bitmap, y, 0);
for (x=0;x<320;x++)
{
if (srcptr[x])
if ((srcptr[x] & 0xc000) == primask)
dstptr[x] = srcptr[x]&0x3fff;
}
}
}
static VIDEO_UPDATE(deroon)
{
fillbitmap(bitmap,0x000,cliprect);
tecmosys_render_sprites_to_bitmap(bitmap);
// tilemap_mark_all_tiles_dirty(txt_tilemap); tilemap_draw(bitmap,cliprect,bg0tilemap,0,0);
tecmosys_copy_spritebitmap_priority(bitmap, 0x0000);
tilemap_draw(bitmap,cliprect,bg1tilemap,0,0);
tecmosys_copy_spritebitmap_priority(bitmap, 0x4000);
tilemap_draw(bitmap,cliprect,bg2tilemap,0,0); // should be drawn with blending / alpha in deroon?
tecmosys_copy_spritebitmap_priority(bitmap, 0x8000);
tilemap_draw(bitmap,cliprect,txt_tilemap,0,0); tilemap_draw(bitmap,cliprect,txt_tilemap,0,0);
tecmosys_copy_spritebitmap_priority(bitmap, 0xc000);
// popmessage("%04x %04x %04x | %04x %04x %04x", // popmessage("%04x %04x %04x | %04x %04x %04x",