diff --git a/.gitattributes b/.gitattributes index 220f734f222..32a5c1a6bae 100644 --- a/.gitattributes +++ b/.gitattributes @@ -7103,6 +7103,8 @@ src/mame/video/deco16ic.c svneol=native#text/plain src/mame/video/deco16ic.h svneol=native#text/plain src/mame/video/deco32.c svneol=native#text/plain src/mame/video/deco_mlc.c svneol=native#text/plain +src/mame/video/deco_zoomspr.c svneol=native#text/plain +src/mame/video/deco_zoomspr.h svneol=native#text/plain src/mame/video/decocass.c svneol=native#text/plain src/mame/video/decocomn.c svneol=native#text/plain src/mame/video/decocomn.h svneol=native#text/plain diff --git a/src/mame/drivers/deco32.c b/src/mame/drivers/deco32.c index a8568b6eb24..dff54e393b7 100644 --- a/src/mame/drivers/deco32.c +++ b/src/mame/drivers/deco32.c @@ -2024,6 +2024,10 @@ static MACHINE_CONFIG_START( dragngun, dragngun_state ) MCFG_DECO16IC_GFXDECODE("gfxdecode") MCFG_DECO16IC_PALETTE("palette") + MCFG_DEVICE_ADD("spritegen_zoom", DECO_ZOOMSPR, 0) + MCFG_DECO_ZOOMSPR_GFXDECODE("gfxdecode") + MCFG_DECO_ZOOMSPR_PALETTE("palette") + MCFG_GFXDECODE_ADD("gfxdecode", "palette", dragngun) MCFG_PALETTE_ADD("palette", 2048) @@ -2139,6 +2143,10 @@ static MACHINE_CONFIG_START( lockload, dragngun_state ) MCFG_DECO16IC_GFXDECODE("gfxdecode") MCFG_DECO16IC_PALETTE("palette") + MCFG_DEVICE_ADD("spritegen_zoom", DECO_ZOOMSPR, 0) + MCFG_DECO_ZOOMSPR_GFXDECODE("gfxdecode") + MCFG_DECO_ZOOMSPR_PALETTE("palette") + MCFG_DECO146_ADD("ioprot") MCFG_DECO146_SET_SOUNDLATCH_CALLBACK(deco32_state, deco32_sound_cb) MCFG_DECO146_SET_INTERFACE_SCRAMBLE_REVERSE diff --git a/src/mame/includes/deco32.h b/src/mame/includes/deco32.h index f8ab51260f8..436095cb64d 100644 --- a/src/mame/includes/deco32.h +++ b/src/mame/includes/deco32.h @@ -6,6 +6,7 @@ #include "sound/okim6295.h" #include "machine/deco146.h" #include "machine/deco104.h" +#include "video/deco_zoomspr.h" class deco32_state : public driver_device { @@ -27,6 +28,7 @@ public: m_sprgen(*this, "spritegen"), m_sprgen1(*this, "spritegen1"), m_sprgen2(*this, "spritegen2"), + m_sprgenzoom(*this, "spritegen_zoom"), m_eeprom(*this, "eeprom"), m_oki1(*this, "oki1"), m_oki2(*this, "oki2"), @@ -55,6 +57,7 @@ public: optional_device m_sprgen; optional_device m_sprgen1; optional_device m_sprgen2; + optional_device m_sprgenzoom; optional_device m_eeprom; optional_device m_oki1; diff --git a/src/mame/mame.mak b/src/mame/mame.mak index 1b9300fa5c0..ae9c243f8b8 100644 --- a/src/mame/mame.mak +++ b/src/mame/mame.mak @@ -1027,6 +1027,7 @@ $(MAMEOBJ)/dataeast.a: \ $(DRIVERS)/deco_mlc.o $(VIDEO)/deco_mlc.o \ $(DRIVERS)/deco156.o $(MACHINE)/deco156.o \ $(DRIVERS)/deco32.o $(VIDEO)/deco32.o $(VIDEO)/dvi.o \ + $(VIDEO)/deco_zoomspr.o \ $(DRIVERS)/decocass.o $(MACHINE)/decocass.o $(MACHINE)/decocass_tape.o $(VIDEO)/decocass.o \ $(DRIVERS)/deshoros.o \ $(DRIVERS)/dietgo.o $(VIDEO)/dietgo.o \ diff --git a/src/mame/video/deco32.c b/src/mame/video/deco32.c index b07ee910556..f74ff2c5242 100644 --- a/src/mame/video/deco32.c +++ b/src/mame/video/deco32.c @@ -140,369 +140,6 @@ WRITE32_MEMBER(deco32_state::deco32_palette_dma_w) } } -/******************************************************************************/ - - -INLINE void dragngun_drawgfxzoom(dragngun_state *state, - bitmap_rgb32 &dest_bmp,const rectangle &clip,gfx_element *gfx, - UINT32 code,UINT32 color,int flipx,int flipy,int sx,int sy, - int transparent_color, - int scalex, int scaley,bitmap_ind8 *pri_buffer,UINT32 pri_mask, int sprite_screen_width, int sprite_screen_height, UINT8 alpha ) -{ - rectangle myclip; - - if (!scalex || !scaley) return; - - /* - scalex and scaley are 16.16 fixed point numbers - 1<<15 : shrink to 50% - 1<<16 : uniform scale - 1<<17 : double to 200% - */ - - /* KW 991012 -- Added code to force clip to bitmap boundary */ - myclip = clip; - myclip &= dest_bmp.cliprect(); - - { - if( gfx ) - { - const pen_t *pal = &state->m_palette->pen(gfx->colorbase() + gfx->granularity() * (color % gfx->colors())); - const UINT8 *code_base = gfx->get_data(code % gfx->elements()); - - if (sprite_screen_width && sprite_screen_height) - { - /* compute sprite increment per screen pixel */ - int dx = (gfx->width()<<16)/sprite_screen_width; - int dy = (gfx->height()<<16)/sprite_screen_height; - - int ex = sx+sprite_screen_width; - int ey = sy+sprite_screen_height; - - int x_index_base; - int y_index; - - if( flipx ) - { - x_index_base = (sprite_screen_width-1)*dx; - dx = -dx; - } - else - { - x_index_base = 0; - } - - if( flipy ) - { - y_index = (sprite_screen_height-1)*dy; - dy = -dy; - } - else - { - y_index = 0; - } - - if( sx < clip.min_x) - { /* clip left */ - int pixels = clip.min_x-sx; - sx += pixels; - x_index_base += pixels*dx; - } - if( sy < clip.min_y ) - { /* clip top */ - int pixels = clip.min_y-sy; - sy += pixels; - y_index += pixels*dy; - } - /* NS 980211 - fixed incorrect clipping */ - if( ex > clip.max_x+1 ) - { /* clip right */ - int pixels = ex-clip.max_x-1; - ex -= pixels; - } - if( ey > clip.max_y+1 ) - { /* clip bottom */ - int pixels = ey-clip.max_y-1; - ey -= pixels; - } - - if( ex>sx ) - { /* skip if inner loop doesn't draw anything */ - int y; - - /* case 1: no alpha */ - if (alpha == 0xff) - { - if (pri_buffer) - { - for( y=sy; y>16) * gfx->rowbytes(); - UINT32 *dest = &dest_bmp.pix32(y); - UINT8 *pri = &pri_buffer->pix8(y); - - int x, x_index = x_index_base; - for( x=sx; x>16]; - if( c != transparent_color ) - { - if (((1 << pri[x]) & pri_mask) == 0) - dest[x] = pal[c]; - pri[x] = 31; - } - x_index += dx; - } - - y_index += dy; - } - } - else - { - for( y=sy; y>16) * gfx->rowbytes(); - UINT32 *dest = &dest_bmp.pix32(y); - - int x, x_index = x_index_base; - for( x=sx; x>16]; - if( c != transparent_color ) dest[x] = pal[c]; - x_index += dx; - } - - y_index += dy; - } - } - } - - /* alpha-blended */ - else - { - if (pri_buffer) - { - for( y=sy; y>16) * gfx->rowbytes(); - UINT32 *dest = &dest_bmp.pix32(y); - UINT8 *pri = &pri_buffer->pix8(y); - - int x, x_index = x_index_base; - for( x=sx; x>16]; - if( c != transparent_color ) - { - if (((1 << pri[x]) & pri_mask) == 0) - dest[x] = alpha_blend_r32(dest[x], pal[c], alpha); - pri[x] = 31; - } - x_index += dx; - } - - y_index += dy; - } - } - else - { - for( y=sy; y>16) * gfx->rowbytes(); - UINT32 *dest = &dest_bmp.pix32(y); - - int x, x_index = x_index_base; - for( x=sx; x>16]; - if( c != transparent_color ) dest[x] = alpha_blend_r32(dest[x], pal[c], alpha); - x_index += dx; - } - - y_index += dy; - } - } - } - } - } - } - } -} - -void dragngun_state::dragngun_draw_sprites( bitmap_rgb32 &bitmap, const rectangle &cliprect, const UINT32 *spritedata) -{ - const UINT32 *layout_ram; - const UINT32 *lookup_ram; - int offs; - - /* - Sprites are built from main control ram, which references tile - layout ram, which finally references tile lookup ram which holds - the actual tile indices to draw and index into the banking - control. Tile lookup and tile layout ram are double buffered. - - - Main sprite control ram, 8 * 32 bit words per sprite, so - - Word 0: - 0x0400 - Banking control for tile layout RAM + tile lookup ram - 0x0200 - ? - 0x01ff - Index into tile layout RAM - Word 1 : - Word 2 : X base position - Word 3 : Y base position - Word 4 : - 0x8000: X flip - 0x03ff: X size of block in pixels (for scaling) - Word 5 : - 0x8000: Y flip - 0x03ff: Y size of block in pixels (for scaling) - Word 6 : - 0x1f - colour. - 0x20 - ? Used for background at 'frog' boss and title screen dragon. - 0x40 - ? priority? - 0x80 - Alpha blending enable - Word 7 : - - - Tile layout ram, 4 * 32 bit words per sprite, so - - Word 0: - 0x2000 - Selector for tile lookup bank!?!?!?!?!?!? - 0x1fff - Index into tile lookup ram (16 bit word based, NOT 32) - Word 1: - 0xff00 - ? - 0x00f0 - Width - 0x000f - Height - Word 2: - 0x01ff - X block offset - Word 3: - 0x01ff - Y block offset - */ - - /* Sprite global disable bit */ - if (m_dragngun_sprite_ctrl&0x40000000) - return; - - for (offs = 0;offs < 0x800;offs += 8) - { - int sx,sy,colour,fx,fy,w,h,x,y,bx,by,alpha,scalex,scaley; - int zoomx,zoomy; - int xpos,ypos; - - scalex=spritedata[offs+4]&0x3ff; - scaley=spritedata[offs+5]&0x3ff; - if (!scalex || !scaley) /* Zero pixel size in X or Y - skip block */ - continue; - - if (spritedata[offs+0]&0x400) - layout_ram = m_dragngun_sprite_layout_1_ram + ((spritedata[offs+0]&0x1ff)*4); //CHECK! - else - layout_ram = m_dragngun_sprite_layout_0_ram + ((spritedata[offs+0]&0x1ff)*4); //1ff in drag gun code?? - h = (layout_ram[1]>>0)&0xf; - w = (layout_ram[1]>>4)&0xf; - if (!h || !w) - continue; - - sx = spritedata[offs+2] & 0x3ff; - sy = spritedata[offs+3] & 0x3ff; - bx = layout_ram[2] & 0x1ff; - by = layout_ram[3] & 0x1ff; - if (bx&0x100) bx=1-(bx&0xff); - if (by&0x100) by=1-(by&0xff); /* '1 - ' is strange, but correct for Dragongun 'Winners' screen. */ - if (sx >= 512) sx -= 1024; - if (sy >= 512) sy -= 1024; - - colour = spritedata[offs+6]&0x1f; - - if (spritedata[offs+6]&0x80) - alpha=0x80; - else - alpha=0xff; - - fx = spritedata[offs+4]&0x8000; - fy = spritedata[offs+5]&0x8000; - -// if (spritedata[offs+0]&0x400) - if (layout_ram[0]&0x2000) - lookup_ram = m_dragngun_sprite_lookup_1_ram + (layout_ram[0]&0x1fff); - else - lookup_ram = m_dragngun_sprite_lookup_0_ram + (layout_ram[0]&0x1fff); - - zoomx=scalex * 0x10000 / (w*16); - zoomy=scaley * 0x10000 / (h*16); - - if (!fy) - ypos=(sy<<16) - (by*zoomy); /* The block offset scales with zoom, the base position does not */ - else - ypos=(sy<<16) + (by*zoomy) - (16*zoomy); - - for (y=0; ygfx(bank), - sprite, - colour, - fx,fy, - xpos>>16,ypos>>16, - 15,zoomx,zoomy,NULL,0, - ((xpos+(zoomx<<4))>>16) - (xpos>>16), ((ypos+(zoomy<<4))>>16) - (ypos>>16), alpha ); - else - m_gfxdecode->gfx(bank)->alpha(bitmap,cliprect, - sprite, - colour, - fx,fy, - xpos>>16,ypos>>16, - 15,alpha); - - if (fx) - xpos-=zoomx<<4; - else - xpos+=zoomx<<4; - } - if (fy) - ypos-=zoomy<<4; - else - ypos+=zoomy<<4; - } - } -} /******************************************************************************/ @@ -616,16 +253,13 @@ UINT32 dragngun_state::screen_update_dragngun(screen_device &screen, bitmap_rgb3 // multiple layers of alpha, so rendering to a buffer for layer isn't easy (maybe there are multiple sprite // chips at work?) // - // really, it needs optimizing .. the raster effects also need fixing properly, they're not correct using - // partial updates right now but the old buffering of scroll values was a hack and doesn't work properly - // with the concept of generic tilemap code. - // - // for now we only draw these 2 layers on the last update call + // really, it needs optimizing .. + // so for now we only draw these 2 layers on the last update call if (cliprect.max_y == 247) { rectangle clip(cliprect.min_x, cliprect.max_x, 8, 247); - dragngun_draw_sprites(bitmap,clip,m_spriteram->buffer()); + m_sprgenzoom->dragngun_draw_sprites(bitmap,clip,m_spriteram->buffer(), m_dragngun_sprite_layout_0_ram, m_dragngun_sprite_layout_1_ram, m_dragngun_sprite_lookup_0_ram, m_dragngun_sprite_lookup_1_ram, m_dragngun_sprite_ctrl ); m_deco_tilegen1->tilemap_1_draw(screen, bitmap, clip, 0, 0); } diff --git a/src/mame/video/deco_zoomspr.c b/src/mame/video/deco_zoomspr.c new file mode 100644 index 00000000000..dbbc16dbc65 --- /dev/null +++ b/src/mame/video/deco_zoomspr.c @@ -0,0 +1,410 @@ + +/* the sprites used by DragonGun + Lock 'n' Loaded */ + +/* probably 186 + 187 custom chips, although there is a 145 too? */ + +#include "emu.h" +#include "deco_zoomspr.h" + +const device_type DECO_ZOOMSPR = &device_creator; + +deco_zoomspr_device::deco_zoomspr_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, DECO_ZOOMSPR, "Data East Zooming Sprites", tag, owner, clock, "deco_zoomspr", __FILE__), + m_palette(*this), + m_gfxdecode(*this) +{ +} + +//------------------------------------------------- +// static_set_palette_tag: Set the tag of the +// palette device +//------------------------------------------------- + +void deco_zoomspr_device::static_set_palette_tag(device_t &device, const char *tag) +{ + downcast(device).m_palette.set_tag(tag); +} + +//------------------------------------------------- +// static_set_gfxdecode_tag: Set the tag of the +// gfx decoder +//------------------------------------------------- + +void deco_zoomspr_device::static_set_gfxdecode_tag(device_t &device, const char *tag) +{ + downcast(device).m_gfxdecode.set_tag(tag); +} + + +void deco_zoomspr_device::device_start() +{ +} + +void deco_zoomspr_device::device_reset() +{ +} + +/******************************************************************************/ + + +inline void deco_zoomspr_device::deco_zoomspr_device::dragngun_drawgfxzoom( + bitmap_rgb32 &dest_bmp,const rectangle &clip,gfx_element *gfx, + UINT32 code,UINT32 color,int flipx,int flipy,int sx,int sy, + int transparent_color, + int scalex, int scaley,bitmap_ind8 *pri_buffer,UINT32 pri_mask, int sprite_screen_width, int sprite_screen_height, UINT8 alpha ) +{ + rectangle myclip; + + if (!scalex || !scaley) return; + + /* + scalex and scaley are 16.16 fixed point numbers + 1<<15 : shrink to 50% + 1<<16 : uniform scale + 1<<17 : double to 200% + */ + + /* KW 991012 -- Added code to force clip to bitmap boundary */ + myclip = clip; + myclip &= dest_bmp.cliprect(); + + { + if( gfx ) + { + const pen_t *pal = &m_palette->pen(gfx->colorbase() + gfx->granularity() * (color % gfx->colors())); + const UINT8 *code_base = gfx->get_data(code % gfx->elements()); + + if (sprite_screen_width && sprite_screen_height) + { + /* compute sprite increment per screen pixel */ + int dx = (gfx->width()<<16)/sprite_screen_width; + int dy = (gfx->height()<<16)/sprite_screen_height; + + int ex = sx+sprite_screen_width; + int ey = sy+sprite_screen_height; + + int x_index_base; + int y_index; + + if( flipx ) + { + x_index_base = (sprite_screen_width-1)*dx; + dx = -dx; + } + else + { + x_index_base = 0; + } + + if( flipy ) + { + y_index = (sprite_screen_height-1)*dy; + dy = -dy; + } + else + { + y_index = 0; + } + + if( sx < clip.min_x) + { /* clip left */ + int pixels = clip.min_x-sx; + sx += pixels; + x_index_base += pixels*dx; + } + if( sy < clip.min_y ) + { /* clip top */ + int pixels = clip.min_y-sy; + sy += pixels; + y_index += pixels*dy; + } + /* NS 980211 - fixed incorrect clipping */ + if( ex > clip.max_x+1 ) + { /* clip right */ + int pixels = ex-clip.max_x-1; + ex -= pixels; + } + if( ey > clip.max_y+1 ) + { /* clip bottom */ + int pixels = ey-clip.max_y-1; + ey -= pixels; + } + + if( ex>sx ) + { /* skip if inner loop doesn't draw anything */ + int y; + + /* case 1: no alpha */ + if (alpha == 0xff) + { + if (pri_buffer) + { + for( y=sy; y>16) * gfx->rowbytes(); + UINT32 *dest = &dest_bmp.pix32(y); + UINT8 *pri = &pri_buffer->pix8(y); + + int x, x_index = x_index_base; + for( x=sx; x>16]; + if( c != transparent_color ) + { + if (((1 << pri[x]) & pri_mask) == 0) + dest[x] = pal[c]; + pri[x] = 31; + } + x_index += dx; + } + + y_index += dy; + } + } + else + { + for( y=sy; y>16) * gfx->rowbytes(); + UINT32 *dest = &dest_bmp.pix32(y); + + int x, x_index = x_index_base; + for( x=sx; x>16]; + if( c != transparent_color ) dest[x] = pal[c]; + x_index += dx; + } + + y_index += dy; + } + } + } + + /* alpha-blended */ + else + { + if (pri_buffer) + { + for( y=sy; y>16) * gfx->rowbytes(); + UINT32 *dest = &dest_bmp.pix32(y); + UINT8 *pri = &pri_buffer->pix8(y); + + int x, x_index = x_index_base; + for( x=sx; x>16]; + if( c != transparent_color ) + { + if (((1 << pri[x]) & pri_mask) == 0) + dest[x] = alpha_blend_r32(dest[x], pal[c], alpha); + pri[x] = 31; + } + x_index += dx; + } + + y_index += dy; + } + } + else + { + for( y=sy; y>16) * gfx->rowbytes(); + UINT32 *dest = &dest_bmp.pix32(y); + + int x, x_index = x_index_base; + for( x=sx; x>16]; + if( c != transparent_color ) dest[x] = alpha_blend_r32(dest[x], pal[c], alpha); + x_index += dx; + } + + y_index += dy; + } + } + } + } + } + } + } +} + +void deco_zoomspr_device::dragngun_draw_sprites( bitmap_rgb32 &bitmap, const rectangle &cliprect, const UINT32 *spritedata, UINT32* dragngun_sprite_layout_0_ram, UINT32* dragngun_sprite_layout_1_ram, UINT32* dragngun_sprite_lookup_0_ram, UINT32* dragngun_sprite_lookup_1_ram, UINT32 dragngun_sprite_ctrl ) +{ + const UINT32 *layout_ram; + const UINT32 *lookup_ram; + int offs; + + /* + Sprites are built from main control ram, which references tile + layout ram, which finally references tile lookup ram which holds + the actual tile indices to draw and index into the banking + control. Tile lookup and tile layout ram are double buffered. + + + Main sprite control ram, 8 * 32 bit words per sprite, so + + Word 0: + 0x0400 - Banking control for tile layout RAM + tile lookup ram + 0x0200 - ? + 0x01ff - Index into tile layout RAM + Word 1 : + Word 2 : X base position + Word 3 : Y base position + Word 4 : + 0x8000: X flip + 0x03ff: X size of block in pixels (for scaling) + Word 5 : + 0x8000: Y flip + 0x03ff: Y size of block in pixels (for scaling) + Word 6 : + 0x1f - colour. + 0x20 - ? Used for background at 'frog' boss and title screen dragon. + 0x40 - ? priority? + 0x80 - Alpha blending enable + Word 7 : + + + Tile layout ram, 4 * 32 bit words per sprite, so + + Word 0: + 0x2000 - Selector for tile lookup bank!?!?!?!?!?!? + 0x1fff - Index into tile lookup ram (16 bit word based, NOT 32) + Word 1: + 0xff00 - ? + 0x00f0 - Width + 0x000f - Height + Word 2: + 0x01ff - X block offset + Word 3: + 0x01ff - Y block offset + */ + + /* Sprite global disable bit */ + if (dragngun_sprite_ctrl&0x40000000) + return; + + for (offs = 0;offs < 0x800;offs += 8) + { + int sx,sy,colour,fx,fy,w,h,x,y,bx,by,alpha,scalex,scaley; + int zoomx,zoomy; + int xpos,ypos; + + scalex=spritedata[offs+4]&0x3ff; + scaley=spritedata[offs+5]&0x3ff; + if (!scalex || !scaley) /* Zero pixel size in X or Y - skip block */ + continue; + + if (spritedata[offs+0]&0x400) + layout_ram = dragngun_sprite_layout_1_ram + ((spritedata[offs+0]&0x1ff)*4); //CHECK! + else + layout_ram = dragngun_sprite_layout_0_ram + ((spritedata[offs+0]&0x1ff)*4); //1ff in drag gun code?? + h = (layout_ram[1]>>0)&0xf; + w = (layout_ram[1]>>4)&0xf; + if (!h || !w) + continue; + + sx = spritedata[offs+2] & 0x3ff; + sy = spritedata[offs+3] & 0x3ff; + bx = layout_ram[2] & 0x1ff; + by = layout_ram[3] & 0x1ff; + if (bx&0x100) bx=1-(bx&0xff); + if (by&0x100) by=1-(by&0xff); /* '1 - ' is strange, but correct for Dragongun 'Winners' screen. */ + if (sx >= 512) sx -= 1024; + if (sy >= 512) sy -= 1024; + + colour = spritedata[offs+6]&0x1f; + + if (spritedata[offs+6]&0x80) + alpha=0x80; + else + alpha=0xff; + + fx = spritedata[offs+4]&0x8000; + fy = spritedata[offs+5]&0x8000; + +// if (spritedata[offs+0]&0x400) + if (layout_ram[0]&0x2000) + lookup_ram = dragngun_sprite_lookup_1_ram + (layout_ram[0]&0x1fff); + else + lookup_ram = dragngun_sprite_lookup_0_ram + (layout_ram[0]&0x1fff); + + zoomx=scalex * 0x10000 / (w*16); + zoomy=scaley * 0x10000 / (h*16); + + if (!fy) + ypos=(sy<<16) - (by*zoomy); /* The block offset scales with zoom, the base position does not */ + else + ypos=(sy<<16) + (by*zoomy) - (16*zoomy); + + for (y=0; ygfx(bank), + sprite, + colour, + fx,fy, + xpos>>16,ypos>>16, + 15,zoomx,zoomy,NULL,0, + ((xpos+(zoomx<<4))>>16) - (xpos>>16), ((ypos+(zoomy<<4))>>16) - (ypos>>16), alpha ); + else + m_gfxdecode->gfx(bank)->alpha(bitmap,cliprect, + sprite, + colour, + fx,fy, + xpos>>16,ypos>>16, + 15,alpha); + + if (fx) + xpos-=zoomx<<4; + else + xpos+=zoomx<<4; + } + if (fy) + ypos-=zoomy<<4; + else + ypos+=zoomy<<4; + } + } +} + diff --git a/src/mame/video/deco_zoomspr.h b/src/mame/video/deco_zoomspr.h new file mode 100644 index 00000000000..ec3a193893c --- /dev/null +++ b/src/mame/video/deco_zoomspr.h @@ -0,0 +1,38 @@ + + +class deco_zoomspr_device : public device_t +{ +public: + deco_zoomspr_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + static void static_set_palette_tag(device_t &device, const char *tag); + static void static_set_gfxdecode_tag(device_t &device, const char *tag); + + void dragngun_draw_sprites(bitmap_rgb32 &bitmap, const rectangle &cliprect, const UINT32 *spritedata, UINT32* dragngun_sprite_layout_0_ram, UINT32* dragngun_sprite_layout_1_ram, UINT32* dragngun_sprite_lookup_0_ram, UINT32* dragngun_sprite_lookup_1_ram, UINT32 dragngun_sprite_ctrl); + + +protected: + virtual void device_start(); + virtual void device_reset(); + +private: + required_device m_palette; + required_device m_gfxdecode; + + void dragngun_drawgfxzoom( + bitmap_rgb32 &dest_bmp, const rectangle &clip, gfx_element *gfx, + UINT32 code, UINT32 color, int flipx, int flipy, int sx, int sy, + int transparent_color, + int scalex, int scaley, bitmap_ind8 *pri_buffer, UINT32 pri_mask, int sprite_screen_width, int sprite_screen_height, UINT8 alpha); + +}; + + +extern const device_type DECO_ZOOMSPR; + +#define MCFG_DECO_ZOOMSPR_PALETTE(_palette_tag) \ + deco_zoomspr_device::static_set_palette_tag(*device, "^" _palette_tag); + +#define MCFG_DECO_ZOOMSPR_GFXDECODE(_gfxtag) \ + deco_zoomspr_device::static_set_gfxdecode_tag(*device, "^" _gfxtag); +