mirror of
https://github.com/holub/mame
synced 2025-04-22 16:31:49 +03:00
k052109.cpp fix/cleanup tilemap scrolls, fixes fuusenpn and MT6790
This commit is contained in:
parent
f6a04074f6
commit
9c50204b23
@ -86,12 +86,11 @@ address lines), and then reading it from the 051962.
|
||||
1 = 64 (actually 40) columns
|
||||
---xx--- layer B row scroll
|
||||
--x----- layer B column scroll
|
||||
surpratk sets this register to 70 during the second boss. There is
|
||||
nothing obviously wrong so it's not clear what should happen.
|
||||
suratk sets this register to 70 during the second boss to produce rotating star field, using X and Y scroll in the same time.
|
||||
not emulated due to MAME's tilemaps restrictions, currently handled in hacky way.
|
||||
glfgreat sets it to 30 when showing the leader board
|
||||
mariorou sets it to 36 when ingame, while actually does per-row scroll for layer A and per-collumn scroll for layer B.
|
||||
such usage not supported by current implementation, hacked in game driver instead.
|
||||
fuusenpn sets this to 20 but not happy with -6 added to column index, apparently current logic is not entirely correct.
|
||||
1d00 : bits 0 & 1 might enable NMI and FIRQ, not sure
|
||||
: bit 2 = IRQ enable
|
||||
1d80 : ROM bank selector bits 0-3 = bank 0 bits 4-7 = bank 1
|
||||
@ -249,6 +248,9 @@ void k052109_device::device_start()
|
||||
m_tilemap[1]->set_transparent_pen(0);
|
||||
m_tilemap[2]->set_transparent_pen(0);
|
||||
|
||||
m_tilemap[1]->set_scrolldx(6, 6);
|
||||
m_tilemap[2]->set_scrolldx(6, 6);
|
||||
|
||||
save_pointer(NAME(m_ram), 0x6000);
|
||||
save_item(NAME(m_rmrd_line));
|
||||
save_item(NAME(m_romsubbank));
|
||||
@ -519,19 +521,21 @@ popmessage("%x %x %x %x",
|
||||
}
|
||||
#endif
|
||||
|
||||
// note: this chip can do both per-column and per-row scroll in the same time, currently not emulated.
|
||||
|
||||
if ((m_scrollctrl & 0x03) == 0x02)
|
||||
{
|
||||
uint8_t *scrollram = &m_ram[0x1a00];
|
||||
|
||||
m_tilemap[1]->set_scroll_rows(256);
|
||||
m_tilemap[1]->set_scroll_rows(32);
|
||||
m_tilemap[1]->set_scroll_cols(1);
|
||||
yscroll = m_ram[0x180c];
|
||||
m_tilemap[1]->set_scrolly(0, yscroll);
|
||||
for (offs = 0; offs < 256; offs++)
|
||||
yscroll /= 8;
|
||||
for (offs = 0; offs < 32; offs++)
|
||||
{
|
||||
xscroll = scrollram[2 * (offs & 0xfff8) + 0] + 256 * scrollram[2 * (offs & 0xfff8) + 1];
|
||||
xscroll -= 6;
|
||||
m_tilemap[1]->set_scrollx((offs + yscroll) & 0xff, xscroll);
|
||||
xscroll = scrollram[16 * offs + 0] + 256 * scrollram[16 * offs + 1];
|
||||
m_tilemap[1]->set_scrollx((offs + yscroll) & 31, xscroll);
|
||||
}
|
||||
}
|
||||
else if ((m_scrollctrl & 0x03) == 0x03)
|
||||
@ -545,7 +549,6 @@ popmessage("%x %x %x %x",
|
||||
for (offs = 0; offs < 256; offs++)
|
||||
{
|
||||
xscroll = scrollram[2 * offs + 0] + 256 * scrollram[2 * offs + 1];
|
||||
xscroll -= 6;
|
||||
m_tilemap[1]->set_scrollx((offs + yscroll) & 0xff, xscroll);
|
||||
}
|
||||
}
|
||||
@ -554,14 +557,14 @@ popmessage("%x %x %x %x",
|
||||
uint8_t *scrollram = &m_ram[0x1800];
|
||||
|
||||
m_tilemap[1]->set_scroll_rows(1);
|
||||
m_tilemap[1]->set_scroll_cols(512);
|
||||
m_tilemap[1]->set_scroll_cols(64);
|
||||
xscroll = m_ram[0x1a00] + 256 * m_ram[0x1a01];
|
||||
xscroll -= 6;
|
||||
m_tilemap[1]->set_scrollx(0, xscroll);
|
||||
for (offs = 0; offs < 512; offs++)
|
||||
xscroll /= 8;
|
||||
for (offs = 0; offs < 64; offs++)
|
||||
{
|
||||
yscroll = scrollram[offs / 8];
|
||||
m_tilemap[1]->set_scrolly((offs + xscroll) & 0x1ff, yscroll);
|
||||
yscroll = scrollram[offs];
|
||||
m_tilemap[1]->set_scrolly((offs + xscroll) & 63, yscroll);
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -571,7 +574,6 @@ popmessage("%x %x %x %x",
|
||||
m_tilemap[1]->set_scroll_rows(1);
|
||||
m_tilemap[1]->set_scroll_cols(1);
|
||||
xscroll = scrollram[0] + 256 * scrollram[1];
|
||||
xscroll -= 6;
|
||||
yscroll = m_ram[0x180c];
|
||||
m_tilemap[1]->set_scrollx(0, xscroll);
|
||||
m_tilemap[1]->set_scrolly(0, yscroll);
|
||||
@ -581,15 +583,18 @@ popmessage("%x %x %x %x",
|
||||
{
|
||||
uint8_t *scrollram = &m_ram[0x3a00];
|
||||
|
||||
m_tilemap[2]->set_scroll_rows(256);
|
||||
m_tilemap[2]->set_scroll_rows(32);
|
||||
m_tilemap[2]->set_scroll_cols(1);
|
||||
yscroll = m_ram[0x380c];
|
||||
//
|
||||
if (m_scrollctrl == 0x70) yscroll = m_ram[0x3823]; // hack for suratk 2nd boss rotating star field
|
||||
//
|
||||
m_tilemap[2]->set_scrolly(0, yscroll);
|
||||
for (offs = 0; offs < 256; offs++)
|
||||
yscroll /= 8;
|
||||
for (offs = 0; offs < 32; offs++)
|
||||
{
|
||||
xscroll = scrollram[2 * (offs & 0xfff8) + 0] + 256 * scrollram[2 * (offs & 0xfff8) + 1];
|
||||
xscroll -= 6;
|
||||
m_tilemap[2]->set_scrollx((offs + yscroll) & 0xff, xscroll);
|
||||
xscroll = scrollram[16 * offs + 0] + 256 * scrollram[16 * offs + 1];
|
||||
m_tilemap[2]->set_scrollx((offs + yscroll) & 31, xscroll);
|
||||
}
|
||||
}
|
||||
else if ((m_scrollctrl & 0x18) == 0x18)
|
||||
@ -603,7 +608,6 @@ popmessage("%x %x %x %x",
|
||||
for (offs = 0; offs < 256; offs++)
|
||||
{
|
||||
xscroll = scrollram[2 * offs + 0] + 256 * scrollram[2 * offs + 1];
|
||||
xscroll -= 6;
|
||||
m_tilemap[2]->set_scrollx((offs + yscroll) & 0xff, xscroll);
|
||||
}
|
||||
}
|
||||
@ -612,14 +616,14 @@ popmessage("%x %x %x %x",
|
||||
uint8_t *scrollram = &m_ram[0x3800];
|
||||
|
||||
m_tilemap[2]->set_scroll_rows(1);
|
||||
m_tilemap[2]->set_scroll_cols(512);
|
||||
m_tilemap[2]->set_scroll_cols(64);
|
||||
xscroll = m_ram[0x3a00] + 256 * m_ram[0x3a01];
|
||||
xscroll -= 6;
|
||||
m_tilemap[2]->set_scrollx(0, xscroll);
|
||||
for (offs = 0; offs < 512; offs++)
|
||||
xscroll /= 8;
|
||||
for (offs = 0; offs < 64; offs++)
|
||||
{
|
||||
yscroll = scrollram[offs / 8];
|
||||
m_tilemap[2]->set_scrolly((offs + xscroll) & 0x1ff, yscroll);
|
||||
yscroll = scrollram[offs];
|
||||
m_tilemap[2]->set_scrolly((offs + xscroll) & 63, yscroll);
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -629,7 +633,6 @@ popmessage("%x %x %x %x",
|
||||
m_tilemap[2]->set_scroll_rows(1);
|
||||
m_tilemap[2]->set_scroll_cols(1);
|
||||
xscroll = scrollram[0] + 256 * scrollram[1];
|
||||
xscroll -= 6;
|
||||
yscroll = m_ram[0x380c];
|
||||
m_tilemap[2]->set_scrollx(0, xscroll);
|
||||
m_tilemap[2]->set_scrolly(0, yscroll);
|
||||
|
Loading…
Reference in New Issue
Block a user