deckarn.cpp : Updates (#4975)

Remove unnecessary configuration values, Use callback for color, priority behavior, Use shorter/correct type values, Reduce unnecessary lines
dec8.cpp : Fix notes
This commit is contained in:
cam900 2019-05-08 22:51:46 +09:00 committed by R. Belmont
parent 3d16b045b9
commit 32f782fe40
7 changed files with 74 additions and 65 deletions

View File

@ -1958,8 +1958,6 @@ void dec8_state::lastmisn(machine_config &config)
BUFFERED_SPRITERAM8(config, m_spriteram);
DECO_KARNOVSPRITES(config, m_spritegen_krn, 0);
m_spritegen_krn->set_gfx_region(1);
m_spritegen_krn->set_gfxdecode_tag(m_gfxdecode);
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
// m_screen->set_refresh_hz(58);
@ -2020,8 +2018,6 @@ void dec8_state::shackled(machine_config &config)
BUFFERED_SPRITERAM8(config, m_spriteram);
DECO_KARNOVSPRITES(config, m_spritegen_krn, 0);
m_spritegen_krn->set_gfx_region(1);
m_spritegen_krn->set_gfxdecode_tag(m_gfxdecode);
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
// m_screen->set_refresh_hz(58);
@ -2074,8 +2070,7 @@ void dec8_state::gondo(machine_config &config)
BUFFERED_SPRITERAM8(config, m_spriteram);
DECO_KARNOVSPRITES(config, m_spritegen_krn, 0);
m_spritegen_krn->set_gfx_region(1);
m_spritegen_krn->set_gfxdecode_tag(m_gfxdecode);
m_spritegen_krn->set_colpri_callback(FUNC(dec8_state::gondo_colpri_cb), this);
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
// m_screen->set_refresh_hz(58);
@ -2132,8 +2127,6 @@ void dec8_state::garyoret(machine_config &config)
BUFFERED_SPRITERAM8(config, m_spriteram);
DECO_KARNOVSPRITES(config, m_spritegen_krn, 0);
m_spritegen_krn->set_gfx_region(1);
m_spritegen_krn->set_gfxdecode_tag(m_gfxdecode);
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
// m_screen->set_refresh_hz(58);
@ -2194,8 +2187,6 @@ void dec8_state::ghostb(machine_config &config)
m_tilegen[0]->set_gfxdecode_tag(m_gfxdecode);
DECO_KARNOVSPRITES(config, m_spritegen_krn, 0);
m_spritegen_krn->set_gfx_region(1);
m_spritegen_krn->set_gfxdecode_tag(m_gfxdecode);
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
// m_screen->set_refresh_hz(58);
@ -2255,8 +2246,6 @@ void dec8_state::csilver(machine_config &config)
BUFFERED_SPRITERAM8(config, m_spriteram);
DECO_KARNOVSPRITES(config, m_spritegen_krn, 0);
m_spritegen_krn->set_gfx_region(1);
m_spritegen_krn->set_gfxdecode_tag(m_gfxdecode);
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
// m_screen->set_refresh_hz(58);

View File

@ -793,8 +793,6 @@ void karnov_state::karnov(machine_config &config)
m_palette->set_init("palette", FUNC(deco_rmc3_device::palette_init_proms));
DECO_KARNOVSPRITES(config, m_spritegen, 0);
m_spritegen->set_gfx_region(2);
m_spritegen->set_gfxdecode_tag(m_gfxdecode);
MCFG_VIDEO_START_OVERRIDE(karnov_state,karnov)
@ -870,8 +868,6 @@ void karnov_state::wndrplnt(machine_config &config)
m_palette->set_init("palette", FUNC(deco_rmc3_device::palette_init_proms));
DECO_KARNOVSPRITES(config, m_spritegen, 0);
m_spritegen->set_gfx_region(2);
m_spritegen->set_gfxdecode_tag(m_gfxdecode);
MCFG_VIDEO_START_OVERRIDE(karnov_state,wndrplnt)

View File

@ -201,6 +201,7 @@ private:
DECLARE_WRITE8_MEMBER(oscar_coin_clear_w);
DECLARE_WRITE_LINE_MEMBER(shackled_coin_irq);
void srdarwin_draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, bitmap_ind8 &primap);
void gondo_colpri_cb(u32 &colour, u32 &pri_mask);
DECLARE_WRITE_LINE_MEMBER(csilver_adpcm_int);
void set_screen_raw_params_data_east(machine_config &config);

View File

@ -254,7 +254,7 @@ VIDEO_START_MEMBER(dec8_state,cobracom)
uint32_t dec8_state::screen_update_ghostb(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_tilegen[0]->deco_bac06_pf_draw(bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00);
m_spritegen_krn->draw_sprites(bitmap, cliprect, m_buffered_spriteram16.get(), 0x400, 0);
m_spritegen_krn->draw_sprites(screen, bitmap, cliprect, m_gfxdecode->gfx(1), m_buffered_spriteram16.get(), 0x400);
m_fix_tilemap->draw(screen, bitmap, cliprect, 0, 0);
return 0;
}
@ -293,7 +293,7 @@ uint32_t dec8_state::screen_update_oscar(screen_device &screen, bitmap_ind16 &bi
m_spritegen_mxc->set_flip_screen(flip);
m_fix_tilemap->set_flip(flip ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0);
// we mimic the priority scheme in dec0.c, this was originally a bit different, so this could be wrong
// we mimic the priority scheme in dec0.cpp, this was originally a bit different, so this could be wrong
m_tilegen[0]->deco_bac06_pf_draw(bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0x00, 0x00, 0x00, 0x00);
m_spritegen_mxc->draw_sprites(bitmap, cliprect, m_buffered_spriteram16.get(), 0x00, 0x00, 0x0f);
m_tilegen[0]->deco_bac06_pf_draw(bitmap,cliprect,0, 0x08,0x08,0x08,0x08);
@ -332,7 +332,7 @@ uint32_t dec8_state::screen_update_lastmisn(screen_device &screen, bitmap_ind16
m_bg_tilemap->set_scrolly(0, ((m_scroll2[2] << 8)+ m_scroll2[3]));
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
m_spritegen_krn->draw_sprites(bitmap, cliprect, m_buffered_spriteram16.get(), 0x400, 0);
m_spritegen_krn->draw_sprites(screen, bitmap, cliprect, m_gfxdecode->gfx(1), m_buffered_spriteram16.get(), 0x400);
m_fix_tilemap->draw(screen, bitmap, cliprect, 0, 0);
return 0;
}
@ -345,7 +345,7 @@ uint32_t dec8_state::screen_update_shackled(screen_device &screen, bitmap_ind16
m_bg_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_LAYER1 | 0, 0);
m_bg_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_LAYER1 | 1, 0);
m_bg_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_LAYER0 | 0, 0);
m_spritegen_krn->draw_sprites(bitmap, cliprect, m_buffered_spriteram16.get(), 0x400, 0);
m_spritegen_krn->draw_sprites(screen, bitmap, cliprect, m_gfxdecode->gfx(1), m_buffered_spriteram16.get(), 0x400);
m_bg_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_LAYER0 | 1, 0);
m_fix_tilemap->draw(screen, bitmap, cliprect, 0, 0);
return 0;
@ -464,15 +464,22 @@ VIDEO_START_MEMBER(dec8_state,srdarwin)
/******************************************************************************/
void dec8_state::gondo_colpri_cb(u32 &colour, u32 &pri_mask)
{
pri_mask = 0; // above foreground, background
if (colour & 8)
pri_mask |= GFX_PMASK_2; // behind foreground, above background
}
uint32_t dec8_state::screen_update_gondo(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
screen.priority().fill(0, cliprect);
m_bg_tilemap->set_scrollx(0, ((m_scroll2[0] << 8) + m_scroll2[1]));
m_bg_tilemap->set_scrolly(0, ((m_scroll2[2] << 8) + m_scroll2[3]));
m_bg_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_LAYER1, 0);
m_spritegen_krn->draw_sprites(bitmap, cliprect, m_buffered_spriteram16.get(), 0x400, 2);
m_bg_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_LAYER0, 0);
m_spritegen_krn->draw_sprites(bitmap, cliprect, m_buffered_spriteram16.get(), 0x400, 1);
m_bg_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_LAYER1, 1);
m_bg_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_LAYER0, 2);
m_spritegen_krn->draw_sprites(screen, bitmap, cliprect, m_gfxdecode->gfx(1), m_buffered_spriteram16.get(), 0x400);
m_fix_tilemap->draw(screen, bitmap, cliprect, 0, 0);
return 0;
}
@ -483,7 +490,7 @@ uint32_t dec8_state::screen_update_garyoret(screen_device &screen, bitmap_ind16
m_bg_tilemap->set_scrolly(0, ((m_scroll2[2] << 8) + m_scroll2[3]));
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
m_spritegen_krn->draw_sprites(bitmap, cliprect, m_buffered_spriteram16.get(), 0x400, 0);
m_spritegen_krn->draw_sprites(screen, bitmap, cliprect, m_gfxdecode->gfx(1), m_buffered_spriteram16.get(), 0x400);
m_bg_tilemap->draw(screen, bitmap, cliprect, 1, 0);
m_fix_tilemap->draw(screen, bitmap, cliprect, 0, 0);
return 0;

View File

@ -8,16 +8,15 @@
DEFINE_DEVICE_TYPE(DECO_KARNOVSPRITES, deco_karnovsprites_device, "deco_karnovsprites", "DECO Karnov Sprites")
deco_karnovsprites_device::deco_karnovsprites_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
deco_karnovsprites_device::deco_karnovsprites_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, DECO_KARNOVSPRITES, tag, owner, clock)
, m_gfxregion(0)
, m_gfxdecode(*this, finder_base::DUMMY_TAG)
{
}
void deco_karnovsprites_device::device_start()
{
m_flip_screen = false;
m_colpri_cb.bind_relative_to(*owner());
save_item(NAME(m_flip_screen));
}
@ -26,37 +25,40 @@ void deco_karnovsprites_device::device_reset()
{
}
void deco_karnovsprites_device::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect, uint16_t* spriteram, int size, int priority )
void deco_karnovsprites_device::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, gfx_element *gfx, u16* spriteram, int size)
{
int offs;
const bool priority = !m_colpri_cb.isnull();
int start, end, inc;
if (priority) { start = size - 4; end = -4; inc = -4; }
else { start = 0; end = size; inc = +4; }
for (offs = 0; offs < size; offs += 4)
for (int offs = start; offs != end; offs += inc)
{
int x, y, sprite, sprite2, colour, fx, fy, extra;
int sprite2;
u32 pri_mask = 0;
y = spriteram[offs];
if (!(y & 0x8000))
const u16 data0 = spriteram[offs];
if (!(data0 & 0x8000))
continue;
y = y & 0x1ff;
sprite = spriteram[offs + 3];
colour = sprite >> 12;
int y = data0 & 0x1ff;
const u16 data3 = spriteram[offs + 3];
u32 colour = data3 >> 12;
if (priority)
m_colpri_cb(colour, pri_mask);
if (priority == 1 && (colour & 8)) continue;
if (priority == 2 && !(colour & 8)) continue;
u32 sprite = data3 & 0xfff;
int x = spriteram[offs + 2] & 0x1ff;
sprite = sprite & 0xfff;
x = spriteram[offs + 2] & 0x1ff;
fx = spriteram[offs + 1];
const u16 data1 = spriteram[offs + 1];
/* the 8-bit implementation had this.
illustrated by enemy projectile explosions in Shackled being left on screen. */
if ((fx & 0x1) == 0) continue;
if ((data1 & 0x1) == 0) continue;
extra = (fx & 0x10) ? 1 : 0;
fy = fx & 0x2;
fx = fx & 0x4;
const bool extra = (data1 & 0x10) ? 1 : 0;
int fy = data1 & 0x2;
int fx = data1 & 0x4;
if (extra)
{
@ -87,14 +89,29 @@ void deco_karnovsprites_device::draw_sprites( bitmap_ind16 &bitmap, const rectan
else
sprite2 = sprite + 1;
m_gfxdecode->gfx(m_gfxregion)->transpen(bitmap,cliprect,
sprite,
colour,fx,fy,x,y,0);
if (priority)
{
gfx->prio_transpen(bitmap,cliprect,
sprite,
colour,fx,fy,x,y,screen.priority(),pri_mask,0);
/* 1 more sprite drawn underneath */
if (extra)
m_gfxdecode->gfx(m_gfxregion)->transpen(bitmap,cliprect,
sprite2,
colour,fx,fy,x,y+16,0);
/* 1 more sprite drawn underneath */
if (extra)
gfx->prio_transpen(bitmap,cliprect,
sprite2,
colour,fx,fy,x,y+16,screen.priority(),pri_mask,0);
}
else
{
gfx->transpen(bitmap,cliprect,
sprite,
colour,fx,fy,x,y,0);
/* 1 more sprite drawn underneath */
if (extra)
gfx->transpen(bitmap,cliprect,
sprite2,
colour,fx,fy,x,y+16,0);
}
}
}

View File

@ -5,27 +5,26 @@
#pragma once
#include "screen.h"
typedef device_delegate<void (u32 &colour, u32 &pri_mask)> deckarn_colpri_cb_delegate;
class deco_karnovsprites_device : public device_t
{
public:
deco_karnovsprites_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
void set_gfxregion(int region) { m_gfxregion = region; }
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, uint16_t* spriteram, int size, int priority);
deco_karnovsprites_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, gfx_element *gfx, u16* spriteram, int size);
void set_flip_screen(bool flip) { m_flip_screen = flip; }
// configuration
template <typename T> void set_gfxdecode_tag(T &&tag) { m_gfxdecode.set_tag(std::forward<T>(tag)); }
void set_gfx_region(int region) { m_gfxregion = region; }
template <typename... T> void set_colpri_callback(T &&... args) { m_colpri_cb = deckarn_colpri_cb_delegate(std::forward<T>(args)...); }
protected:
virtual void device_start() override;
virtual void device_reset() override;
uint8_t m_gfxregion;
bool m_flip_screen;
private:
required_device<gfxdecode_device> m_gfxdecode;
deckarn_colpri_cb_delegate m_colpri_cb;
bool m_flip_screen;
};
DECLARE_DEVICE_TYPE(DECO_KARNOVSPRITES, deco_karnovsprites_device)

View File

@ -22,7 +22,7 @@ uint32_t karnov_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap
m_bg_tilemap->set_scrollx(m_scroll[0]);
m_bg_tilemap->set_scrolly(m_scroll[1]);
m_bg_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0);
m_spritegen->draw_sprites(bitmap, cliprect, m_spriteram->buffer(), 0x800, 0);
m_spritegen->draw_sprites(screen, bitmap, cliprect, m_gfxdecode->gfx(2), m_spriteram->buffer(), 0x800);
m_fix_tilemap->draw(screen, bitmap, cliprect, 0, 0);
return 0;
}