Merge pull request #6525 from cam900/nmk16_scrolldx

Use scrolldx for tilemap shifting in some NMK hardwares
This commit is contained in:
R. Belmont 2020-04-08 10:52:50 -04:00 committed by GitHub
commit d2da768f1f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 26 additions and 71 deletions

View File

@ -205,6 +205,7 @@ TILE_GET_INFO_MEMBER(ddealer_state::get_back_tile_info)
void ddealer_state::video_start()
{
m_back_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(ddealer_state::get_back_tile_info)), TILEMAP_SCAN_COLS, 8, 8, 64, 32);
m_back_tilemap->set_scrolldx(64,64);
}
void ddealer_state::draw_video_layer(uint16_t* vreg_base, uint16_t* top, uint16_t* bottom, bitmap_ind16 &bitmap, const rectangle &cliprect, int flipy)
@ -292,7 +293,6 @@ void ddealer_state::draw_video_layer(uint16_t* vreg_base, uint16_t* top, uint16_
uint32_t ddealer_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_back_tilemap->set_scrollx(0, -64);
m_back_tilemap->draw(screen, bitmap, cliprect, 0, 0);
/* the fg tilemap handling is a little hacky right now,
@ -586,33 +586,9 @@ static INPUT_PORTS_START( ddealer )
PORT_BIT( 0xff00, IP_ACTIVE_LOW, IPT_UNUSED )
INPUT_PORTS_END
static const gfx_layout charlayout =
{
8,8,
RGN_FRAC(1,1),
4,
{ 0, 1, 2, 3 },
{ 0*4, 1*4, 2*4, 3*4, 4*4, 5*4, 6*4, 7*4 },
{ 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32 },
32*8
};
static const gfx_layout tilelayout =
{
16,16,
RGN_FRAC(1,1),
4,
{ 0, 1, 2, 3 },
{ 0*4, 1*4, 2*4, 3*4, 4*4, 5*4, 6*4, 7*4,
16*32+0*4, 16*32+1*4, 16*32+2*4, 16*32+3*4, 16*32+4*4, 16*32+5*4, 16*32+6*4, 16*32+7*4 },
{ 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32,
8*32, 9*32, 10*32, 11*32, 12*32, 13*32, 14*32, 15*32 },
32*32
};
static GFXDECODE_START( gfx_ddealer )
GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0x000, 16 )
GFXDECODE_ENTRY( "gfx2", 0, tilelayout, 0x100, 16 )
GFXDECODE_ENTRY( "gfx1", 0, gfx_8x8x4_packed_msb, 0x000, 16 )
GFXDECODE_ENTRY( "gfx2", 0, gfx_8x8x4_col_2x2_group_packed_msb, 0x100, 16 )
GFXDECODE_END
void ddealer_state::machine_start()

View File

@ -383,7 +383,7 @@ void nmk16_state::scroll_w(offs_t offset, u8 data)
}
}
m_bg_tilemap[Layer]->set_scrollx(0,((m_scroll[Layer][0] << 8) | m_scroll[Layer][1]) - m_videoshift);
m_bg_tilemap[Layer]->set_scrollx(0,(m_scroll[Layer][0] << 8) | m_scroll[Layer][1]);
}
}

View File

@ -262,22 +262,9 @@ static INPUT_PORTS_START( patapata )
INPUT_PORTS_END
static const gfx_layout tilelayout =
{
16,16,
RGN_FRAC(1,1),
4,
{ 0, 1, 2, 3 },
{ 0*4, 1*4, 2*4, 3*4, 4*4, 5*4, 6*4, 7*4,
16*32+0*4, 16*32+1*4, 16*32+2*4, 16*32+3*4, 16*32+4*4, 16*32+5*4, 16*32+6*4, 16*32+7*4 },
{ 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32,
8*32, 9*32, 10*32, 11*32, 12*32, 13*32, 14*32, 15*32 },
32*32
};
static GFXDECODE_START( gfx_patapata )
GFXDECODE_ENTRY( "tilesa", 0, tilelayout, 0x000, 16 )
GFXDECODE_ENTRY( "tilesb", 0, tilelayout, 0x100, 16 )
GFXDECODE_ENTRY( "tilesa", 0, gfx_8x8x4_col_2x2_group_packed_msb, 0x000, 16 )
GFXDECODE_ENTRY( "tilesb", 0, gfx_8x8x4_col_2x2_group_packed_msb, 0x100, 16 )
GFXDECODE_END
TIMER_DEVICE_CALLBACK_MEMBER(patapata_state::scanline)

View File

@ -196,7 +196,7 @@ void quizpani_state::quizpani(machine_config &config)
screen.set_refresh_hz(60);
screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
screen.set_size(64*8, 32*8);
screen.set_visarea(0*8, 48*8-1, 0*8, 28*8-1);
screen.set_visarea(0*8, 48*8-1, 2*8, 30*8-1);
screen.set_screen_update(FUNC(quizpani_state::screen_update));
screen.set_palette("palette");

View File

@ -117,15 +117,12 @@ protected:
optional_ioport_array<2> m_dsw_io;
optional_ioport_array<3> m_in_io;
int m_sprclk;
int m_sprlimit;
int m_tilerambank;
int m_sprdma_base;
int mask[4*2];
std::unique_ptr<u16[]> m_spriteram_old;
std::unique_ptr<u16[]> m_spriteram_old2;
int m_bgbank;
int m_videoshift;
int m_bioship_background_bank;
tilemap_t *m_bg_tilemap[2];
tilemap_t *m_tx_tilemap;

View File

@ -77,9 +77,7 @@ void nmk16_state::video_init()
m_spriteram_old = make_unique_clear<u16[]>(0x1000/2);
m_spriteram_old2 = make_unique_clear<u16[]>(0x1000/2);
m_videoshift = 0; /* 256x224 screen, no shift */
m_tilerambank = 0;
m_sprclk = 0;
save_pointer(NAME(m_spriteram_old), 0x1000/2);
save_pointer(NAME(m_spriteram_old2), 0x1000/2);
@ -89,13 +87,11 @@ void nmk16_state::video_init()
save_item(NAME(m_scroll[1]));
save_item(NAME(m_vscroll));
save_item(NAME(m_tilerambank));
save_item(NAME(m_sprclk));
}
VIDEO_START_MEMBER(nmk16_state, bioship)
{
m_sprlimit = 384 * 263;
// ROM Based Tilemap
m_bg_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(nmk16_state::bioship_get_bg_tile_info)), tilemap_mapper_delegate(*this, FUNC(nmk16_state::tilemap_scan_pages)), 16, 16, 256, 32);
m_bg_tilemap[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, NAME((&nmk16_state::common_get_bg_tile_info<1, 1>))), tilemap_mapper_delegate(*this, FUNC(nmk16_state::tilemap_scan_pages)), 16, 16, 256, 32);
@ -111,7 +107,6 @@ VIDEO_START_MEMBER(nmk16_state, bioship)
VIDEO_START_MEMBER(nmk16_state,macross)
{
m_sprlimit = 384 * 263;
m_bg_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, NAME((&nmk16_state::common_get_bg_tile_info<0, 1>))), tilemap_mapper_delegate(*this, FUNC(nmk16_state::tilemap_scan_pages)), 16, 16, 256, 32);
m_tx_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(nmk16_state::common_get_tx_tile_info)), TILEMAP_SCAN_COLS, 8, 8, 32, 32);
@ -131,14 +126,15 @@ VIDEO_START_MEMBER(nmk16_state,strahl)
VIDEO_START_MEMBER(nmk16_state,macross2)
{
m_sprlimit = 512 * 263; // not verified
m_bg_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, NAME((&nmk16_state::common_get_bg_tile_info<0, 1>))), tilemap_mapper_delegate(*this, FUNC(nmk16_state::tilemap_scan_pages)), 16, 16, 256, 32);
m_tx_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(nmk16_state::common_get_tx_tile_info)), TILEMAP_SCAN_COLS, 8, 8, 64, 32);
m_tx_tilemap->set_transparent_pen(15);
video_init();
m_videoshift = 64; // 384x224 screen, leftmost 64 pixels have to be retrieved from the other side of the tilemap (!)
// 384x224 screen, leftmost 64 pixels have to be retrieved from the other side of the tilemap (!)
m_bg_tilemap[0]->set_scrolldx(64,64);
m_tx_tilemap->set_scrolldx(64,64);
}
VIDEO_START_MEMBER(nmk16_state,gunnail)
@ -149,11 +145,11 @@ VIDEO_START_MEMBER(nmk16_state,gunnail)
VIDEO_START_MEMBER(nmk16_state, bjtwin)
{
m_sprlimit = 512 * 263; // not verified
m_bg_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(nmk16_state::bjtwin_get_bg_tile_info)), TILEMAP_SCAN_COLS, 8, 8, 64, 32);
video_init();
m_videoshift = 64; // 384x224 screen, leftmost 64 pixels have to be retrieved from the other side of the tilemap (!)
// 384x224 screen, leftmost 64 pixels have to be retrieved from the other side of the tilemap (!)
m_bg_tilemap[0]->set_scrolldx(64,64);
}
void nmk16_state::mustang_scroll_w(u16 data)
@ -180,7 +176,7 @@ void nmk16_state::mustang_scroll_w(u16 data)
break;
}
m_bg_tilemap[0]->set_scrollx(0,m_mustang_bg_xscroll - m_videoshift);
m_bg_tilemap[0]->set_scrollx(0,m_mustang_bg_xscroll);
}
void nmk16_state::bjtwin_scroll_w(offs_t offset, u8 data)
@ -214,7 +210,7 @@ void nmk16_state::manybloc_scroll_w(offs_t offset, u16 data, u16 mem_mask)
{
COMBINE_DATA(&m_gunnail_scrollram[offset]);
m_bg_tilemap[0]->set_scrollx(0,m_gunnail_scrollram[0x82/2]-m_videoshift);
m_bg_tilemap[0]->set_scrollx(0,m_gunnail_scrollram[0x82/2]);
m_bg_tilemap[0]->set_scrolly(0,m_gunnail_scrollram[0xc2/2]);
}
@ -321,7 +317,7 @@ void nmk16_state::bg_update(screen_device &screen, bitmap_ind16 &bitmap, const r
m_bg_tilemap[layer]->set_scroll_rows(512);
m_bg_tilemap[layer]->set_scrolly(0, yscroll);
m_bg_tilemap[layer]->set_scrollx((i + yscroll) & 0x1ff, m_gunnail_scrollram[0] + m_gunnail_scrollram[i] - m_videoshift);
m_bg_tilemap[layer]->set_scrollx((i + yscroll) & 0x1ff, m_gunnail_scrollram[0] + m_gunnail_scrollram[i]);
m_bg_tilemap[layer]->draw(screen, bitmap, bgclip, 0, 1);
@ -337,7 +333,6 @@ void nmk16_state::bg_update(screen_device &screen, bitmap_ind16 &bitmap, const r
void nmk16_state::tx_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_tx_tilemap->set_scrollx(0,-m_videoshift);
m_tx_tilemap->draw(screen, bitmap, cliprect, 0, 2);
}
@ -385,8 +380,6 @@ u32 nmk16_state::screen_update_strahl(screen_device &screen, bitmap_ind16 &bitma
u32 nmk16_state::screen_update_bjtwin(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
screen.priority().fill(0, cliprect);
m_bg_tilemap[0]->set_scrollx(0,-m_videoshift);
bg_update(screen, bitmap, cliprect, 0);
draw_sprites(screen, bitmap, cliprect);
return 0;
@ -409,7 +402,6 @@ TILE_GET_INFO_MEMBER(afega_state::get_bg_tile_info_8bit)
VIDEO_START_MEMBER(afega_state,grdnstrm)
{
m_sprlimit = 384 * 263;
// 8bpp Tilemap
m_bg_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(afega_state::get_bg_tile_info_8bit)), tilemap_mapper_delegate(*this, FUNC(afega_state::tilemap_scan_pages)), 16, 16, 256, 32);
m_tx_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(afega_state::common_get_tx_tile_info)), TILEMAP_SCAN_COLS, 8, 8, 32, 32);

View File

@ -157,6 +157,9 @@ void powerins_state::video_start()
save_item(NAME(m_tile_bank));
save_pointer(NAME(m_spritebuffer[0]), 0x1000/2);
save_pointer(NAME(m_spritebuffer[1]), 0x1000/2);
// fixed offset
m_tilemap[0]->set_scrolldx(32,32);
m_tilemap[1]->set_scrolldx(32,32);
}
@ -231,10 +234,8 @@ uint32_t powerins_state::screen_update(screen_device &screen, bitmap_ind16 &bitm
int scrollx = (m_vctrl_0[2/2]&0xff) | ((m_vctrl_0[0/2]&0xff)<<8);
int scrolly = (m_vctrl_0[6/2]&0xff) | ((m_vctrl_0[4/2]&0xff)<<8);
m_tilemap[0]->set_scrollx(0, scrollx - 0x20);
m_tilemap[0]->set_scrolly(0, scrolly );
m_tilemap[1]->set_scrollx(0, -0x20); // fixed offset
m_tilemap[0]->set_scrollx(0, scrollx);
m_tilemap[0]->set_scrolly(0, scrolly);
#ifdef MAME_DEBUG
if (machine().input().code_pressed(KEYCODE_Z))

View File

@ -74,14 +74,16 @@ void quizpani_state::video_start()
save_item(NAME(m_bgbank));
save_item(NAME(m_txtbank));
m_bg_tilemap->set_scrolldx(64,64);
m_txt_tilemap->set_scrolldx(64,64);
}
uint32_t quizpani_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_bg_tilemap->set_scrollx(0, m_scrollreg[0] - 64);
m_bg_tilemap->set_scrolly(0, m_scrollreg[1] + 16);
m_txt_tilemap->set_scrollx(0, m_scrollreg[2] - 64);
m_txt_tilemap->set_scrolly(0, m_scrollreg[3] + 16);
m_bg_tilemap->set_scrollx(0, m_scrollreg[0]);
m_bg_tilemap->set_scrolly(0, m_scrollreg[1]);
m_txt_tilemap->set_scrollx(0, m_scrollreg[2]);
m_txt_tilemap->set_scrolly(0, m_scrollreg[3]);
m_bg_tilemap->draw(screen, bitmap, cliprect, 0,0);
m_txt_tilemap->draw(screen, bitmap, cliprect, 0,0);