Merge pull request #5156 from cam900/excellent_spr

excellent_spr.cpp : Updates
This commit is contained in:
R. Belmont 2019-06-05 09:31:58 -04:00 committed by GitHub
commit d4f2a2c19a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 347 additions and 324 deletions

View File

@ -59,16 +59,16 @@ Notes:
#include "speaker.h"
WRITE8_MEMBER(aquarium_state::aquarium_watchdog_w)
void aquarium_state::watchdog_w(u8 data)
{
m_watchdog->write_line_ck(BIT(data, 7));
// bits 0 & 1 also used
}
WRITE8_MEMBER(aquarium_state::aquarium_z80_bank_w)
void aquarium_state::z80_bank_w(u8 data)
{
// uses bits ---x --xx
data = bitswap<8>(data, 7, 6, 5, 2, 3, 1, 4, 0);
data = bitswap<8>(data, 7, 6, 5, 2, 3, 1, 4, 0);
//printf("aquarium bank %04x %04x\n", data, mem_mask);
// aquarium bank 0003 00ff - correct (title) 011
@ -76,35 +76,32 @@ WRITE8_MEMBER(aquarium_state::aquarium_z80_bank_w)
// aquarium bank 0005 00ff - level 1 (correct)
// (all music seems correct w/regards the reference video)
membank("bank1")->set_entry(data & 0x7);
m_audiobank->set_entry(data & 0x7);
}
uint8_t aquarium_state::aquarium_snd_bitswap( uint8_t scrambled_data )
u8 aquarium_state::snd_bitswap(u8 scrambled_data)
{
return bitswap<8>(scrambled_data, 0, 1, 2, 3, 4, 5, 6, 7);
}
READ8_MEMBER(aquarium_state::aquarium_oki_r)
u8 aquarium_state::oki_r()
{
return aquarium_snd_bitswap(m_oki->read());
return snd_bitswap(m_oki->read());
}
WRITE8_MEMBER(aquarium_state::aquarium_oki_w)
void aquarium_state::oki_w(u8 data)
{
logerror("%s:Writing %04x to the OKI M6295\n", machine().describe_context(), aquarium_snd_bitswap(data));
m_oki->write(aquarium_snd_bitswap(data));
logerror("%s:Writing %04x to the OKI M6295\n", machine().describe_context(), snd_bitswap(data));
m_oki->write(snd_bitswap(data));
}
void aquarium_state::main_map(address_map &map)
{
map(0x000000, 0x07ffff).rom();
map(0xc00000, 0xc00fff).ram().w(FUNC(aquarium_state::aquarium_mid_videoram_w)).share("mid_videoram");
map(0xc01000, 0xc01fff).ram().w(FUNC(aquarium_state::aquarium_bak_videoram_w)).share("bak_videoram");
map(0xc02000, 0xc03fff).ram().w(FUNC(aquarium_state::aquarium_txt_videoram_w)).share("txt_videoram");
map(0xc00000, 0xc00fff).ram().w(FUNC(aquarium_state::mid_videoram_w)).share("mid_videoram");
map(0xc01000, 0xc01fff).ram().w(FUNC(aquarium_state::bak_videoram_w)).share("bak_videoram");
map(0xc02000, 0xc03fff).ram().w(FUNC(aquarium_state::txt_videoram_w)).share("txt_videoram");
map(0xc80000, 0xc81fff).rw(m_sprgen, FUNC(excellent_spr_device::read), FUNC(excellent_spr_device::write)).umask16(0x00ff);
map(0xd00000, 0xd00fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette");
map(0xd80014, 0xd8001f).writeonly().share("scroll");
@ -113,7 +110,7 @@ void aquarium_state::main_map(address_map &map)
map(0xd80082, 0xd80083).nopr(); /* stored but not read back ? check code at 0x01f440 */
map(0xd80084, 0xd80085).portr("INPUTS");
map(0xd80086, 0xd80087).portr("SYSTEM");
map(0xd80088, 0xd80088).w(FUNC(aquarium_state::aquarium_watchdog_w));
map(0xd80088, 0xd80088).w(FUNC(aquarium_state::watchdog_w));
map(0xd8008b, 0xd8008b).w(m_soundlatch, FUNC(generic_latch_8_device::write));
map(0xff0000, 0xffffff).ram();
}
@ -129,10 +126,10 @@ void aquarium_state::snd_portmap(address_map &map)
{
map.global_mask(0xff);
map(0x00, 0x01).rw("ymsnd", FUNC(ym2151_device::read), FUNC(ym2151_device::write));
map(0x02, 0x02).rw(FUNC(aquarium_state::aquarium_oki_r), FUNC(aquarium_state::aquarium_oki_w));
map(0x02, 0x02).rw(FUNC(aquarium_state::oki_r), FUNC(aquarium_state::oki_w));
map(0x04, 0x04).r(m_soundlatch, FUNC(generic_latch_8_device::read));
map(0x06, 0x06).w(m_soundlatch, FUNC(generic_latch_8_device::acknowledge_w)); // only written with 0 for some reason
map(0x08, 0x08).w(FUNC(aquarium_state::aquarium_z80_bank_w));
map(0x08, 0x08).w(FUNC(aquarium_state::z80_bank_w));
}
static INPUT_PORTS_START( aquarium )
@ -208,9 +205,9 @@ static const gfx_layout char5bpplayout =
16,16, /* 16*16 characters */
RGN_FRAC(1,2),
5, /* 4 bits per pixel */
{ RGN_FRAC(1,2), 0, 1, 2, 3 },
{ 2*4, 3*4, 0*4, 1*4, 6*4, 7*4, 4*4, 5*4, 2*4+32, 3*4+32, 0*4+32, 1*4+32, 6*4+32, 7*4+32, 4*4+32, 5*4+32 },
{ 0*64, 1*64, 2*64, 3*64, 4*64, 5*64, 6*64, 7*64, 8*64, 9*64, 10*64, 11*64, 12*64, 13*64, 14*64, 15*64 },
{ RGN_FRAC(1,2), STEP4(0,1) },
{ STEP16(0,4) },
{ STEP16(0,4*16) },
128*8 /* every sprite takes 128 consecutive bytes */
};
@ -219,44 +216,33 @@ static const gfx_layout char_8x8_layout =
8,8, /* 8*8 characters */
RGN_FRAC(1,1),
4, /* 4 bits per pixel */
{ 0, 1, 2, 3 },
{ 2*4, 3*4, 0*4, 1*4, 6*4, 7*4, 4*4, 5*4 },
{ 0*32, 1*32, 2*32, 3*32, 4*32, 5*32, 6*32, 7*32 },
{ STEP4(0,1) },
{ STEP8(0,4) },
{ STEP8(0,4*8) },
32*8 /* every sprite takes 32 consecutive bytes */
};
static const gfx_layout tilelayout =
{
16,16, /* 16*16 sprites */
RGN_FRAC(1,1),
4, /* 4 bits per pixel */
{ 48, 16, 32, 0 },
{ 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7 },
{ 0*64, 1*64, 2*64, 3*64, 4*64, 5*64, 6*64, 7*64, 8*64, 9*64, 10*64, 11*64, 12*64, 13*64, 14*64, 15*64 },
128*8 /* every sprite takes 128 consecutive bytes */
};
void aquarium_state::init_aquarium()
{
uint8_t *Z80 = memregion("audiocpu")->base();
u8 *Z80 = memregion("audiocpu")->base();
/* The BG tiles are 5bpp, this rearranges the data from
the roms containing the 1bpp data so we can decode it
correctly */
uint8_t *DAT2 = memregion("gfx1")->base() + 0x080000;
uint8_t *DAT = memregion("user1")->base();
u8 *DAT2 = memregion("gfx1")->base() + 0x080000;
u8 *DAT = memregion("user1")->base();
int len = 0x0200000;
for (len = 0; len < 0x020000; len++)
{
DAT2[len * 4 + 1] = (DAT[len] & 0x80) << 0;
DAT2[len * 4 + 1] |= (DAT[len] & 0x40) >> 3;
DAT2[len * 4 + 0] = (DAT[len] & 0x20) << 2;
DAT2[len * 4 + 0] |= (DAT[len] & 0x10) >> 1;
DAT2[len * 4 + 3] = (DAT[len] & 0x08) << 4;
DAT2[len * 4 + 3] |= (DAT[len] & 0x04) << 1;
DAT2[len * 4 + 2] = (DAT[len] & 0x02) << 6;
DAT2[len * 4 + 2] |= (DAT[len] & 0x01) << 3;
DAT2[len * 4 + 0] = (DAT[len] & 0x80) << 0;
DAT2[len * 4 + 0] |= (DAT[len] & 0x40) >> 3;
DAT2[len * 4 + 1] = (DAT[len] & 0x20) << 2;
DAT2[len * 4 + 1] |= (DAT[len] & 0x10) >> 1;
DAT2[len * 4 + 2] = (DAT[len] & 0x08) << 4;
DAT2[len * 4 + 2] |= (DAT[len] & 0x04) << 1;
DAT2[len * 4 + 3] = (DAT[len] & 0x02) << 6;
DAT2[len * 4 + 3] |= (DAT[len] & 0x01) << 3;
}
DAT2 = memregion("gfx4")->base() + 0x080000;
@ -264,27 +250,26 @@ void aquarium_state::init_aquarium()
for (len = 0; len < 0x020000; len++)
{
DAT2[len * 4 + 1] = (DAT[len] & 0x80) << 0;
DAT2[len * 4 + 1] |= (DAT[len] & 0x40) >> 3;
DAT2[len * 4 + 0] = (DAT[len] & 0x20) << 2;
DAT2[len * 4 + 0] |= (DAT[len] & 0x10) >> 1;
DAT2[len * 4 + 3] = (DAT[len] & 0x08) << 4;
DAT2[len * 4 + 3] |= (DAT[len] & 0x04) << 1;
DAT2[len * 4 + 2] = (DAT[len] & 0x02) << 6;
DAT2[len * 4 + 2] |= (DAT[len] & 0x01) << 3;
DAT2[len * 4 + 0] = (DAT[len] & 0x80) << 0;
DAT2[len * 4 + 0] |= (DAT[len] & 0x40) >> 3;
DAT2[len * 4 + 1] = (DAT[len] & 0x20) << 2;
DAT2[len * 4 + 1] |= (DAT[len] & 0x10) >> 1;
DAT2[len * 4 + 2] = (DAT[len] & 0x08) << 4;
DAT2[len * 4 + 2] |= (DAT[len] & 0x04) << 1;
DAT2[len * 4 + 3] = (DAT[len] & 0x02) << 6;
DAT2[len * 4 + 3] |= (DAT[len] & 0x01) << 3;
}
/* configure and set up the sound bank */
membank("bank1")->configure_entries(0, 0x8, &Z80[0x00000], 0x8000);
membank("bank1")->set_entry(0x00);
m_audiobank->configure_entries(0, 0x8, &Z80[0x00000], 0x8000);
m_audiobank->set_entry(0x00);
}
static GFXDECODE_START( gfx_aquarium )
GFXDECODE_ENTRY( "gfx3", 0, tilelayout, 0x300, 32 )
GFXDECODE_ENTRY( "gfx1", 0, char5bpplayout, 0x400, 32 )
GFXDECODE_ENTRY( "gfx2", 0, char_8x8_layout, 0x200, 32 )
GFXDECODE_ENTRY( "gfx4", 0, char5bpplayout, 0x400, 32 )
GFXDECODE_ENTRY( "gfx1", 0, char5bpplayout, 0x400, 32 )
GFXDECODE_ENTRY( "gfx2", 0, char_8x8_layout, 0x200, 16 )
GFXDECODE_ENTRY( "gfx4", 0, char5bpplayout, 0x400, 32 )
GFXDECODE_END
void aquarium_state::aquarium(machine_config &config)
@ -307,13 +292,16 @@ void aquarium_state::aquarium(machine_config &config)
m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
m_screen->set_size(64*8, 64*8);
m_screen->set_visarea(2*8, 42*8-1, 2*8, 34*8-1);
m_screen->set_screen_update(FUNC(aquarium_state::screen_update_aquarium));
m_screen->set_screen_update(FUNC(aquarium_state::screen_update));
m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_aquarium);
PALETTE(config, m_palette).set_format(palette_device::RRRRGGGGBBBBRGBx, 0x1000/2);
EXCELLENT_SPRITE(config, m_sprgen, 0);
m_sprgen->set_palette(m_palette);
m_sprgen->set_color_base(0x300);
m_sprgen->set_colpri_callback(FUNC(aquarium_state::aquarium_colpri_cb), this);
/* sound hardware */
SPEAKER(config, "lspeaker").front_left();
@ -341,22 +329,22 @@ ROM_START( aquarium )
ROM_LOAD( "excellent_5.10c", 0x000000, 0x40000, CRC(fa555be1) SHA1(07236f2b2ba67e92984b9ddf4a8154221d535245) )
ROM_REGION( 0x100000, "gfx1", 0 ) /* BG Tiles */
ROM_LOAD( "excellent_1.15b", 0x000000, 0x080000, CRC(575df6ac) SHA1(071394273e512666fe124facdd8591a767ad0819) ) // 4bpp
ROM_LOAD16_WORD_SWAP( "excellent_1.15b", 0x000000, 0x080000, CRC(575df6ac) SHA1(071394273e512666fe124facdd8591a767ad0819) ) // 4bpp
/* data is expanded here from USER1 */
ROM_REGION( 0x100000, "user1", 0 ) /* BG Tiles */
ROM_LOAD( "excellent_6.15d", 0x000000, 0x020000, CRC(9065b146) SHA1(befc218bbcd63453ea7eb8f976796d36f2b2d552) ) // 1bpp
ROM_REGION( 0x100000, "gfx4", 0 ) /* BG Tiles */
ROM_LOAD( "excellent_8.14g", 0x000000, 0x080000, CRC(915520c4) SHA1(308207cb20f1ed6df365710c808644a6e4f07614) ) // 4bpp
ROM_LOAD16_WORD_SWAP( "excellent_8.14g", 0x000000, 0x080000, CRC(915520c4) SHA1(308207cb20f1ed6df365710c808644a6e4f07614) ) // 4bpp
/* data is expanded here from USER2 */
ROM_REGION( 0x100000, "user2", 0 ) /* BG Tiles */
ROM_LOAD( "excellent_7.17g", 0x000000, 0x020000, CRC(b96b2b82) SHA1(2b719d0c185d1eca4cd9ea66bed7842b74062288) ) // 1bpp
ROM_REGION( 0x060000, "gfx2", 0 ) /* FG Tiles */
ROM_LOAD( "excellent_2.17e", 0x000000, 0x020000, CRC(aa071b05) SHA1(517415bfd8e4dd51c6eb03a25c706f8613d34a09) )
ROM_LOAD16_WORD_SWAP( "excellent_2.17e", 0x000000, 0x020000, CRC(aa071b05) SHA1(517415bfd8e4dd51c6eb03a25c706f8613d34a09) )
ROM_REGION( 0x200000, "gfx3", 0 ) /* Sprites? */
ROM_LOAD( "d23c8000.1f", 0x000000, 0x0100000, CRC(14758b3c) SHA1(b372ccb42acb55a3dd15352a9d4ed576878a6731) ) // PCB denotes 23C16000 but a 23C8000 MASK is used
ROM_REGION( 0x200000, "spritegen", 0 ) /* Sprites? */
ROM_LOAD16_WORD_SWAP( "d23c8000.1f", 0x000000, 0x0100000, CRC(14758b3c) SHA1(b372ccb42acb55a3dd15352a9d4ed576878a6731) ) // PCB denotes 23C16000 but a 23C8000 MASK is used
ROM_REGION( 0x100000, "oki", 0 ) /* Samples */
ROM_LOAD( "excellent_4.7d", 0x000000, 0x80000, CRC(9a4af531) SHA1(bb201b7a6c9fd5924a0d79090257efffd8d4aba1) )
@ -370,22 +358,22 @@ ROM_START( aquariumj )
ROM_LOAD( "excellent_5.10c", 0x000000, 0x40000, CRC(fa555be1) SHA1(07236f2b2ba67e92984b9ddf4a8154221d535245) )
ROM_REGION( 0x100000, "gfx1", 0 ) /* BG Tiles */
ROM_LOAD( "excellent_1.15b", 0x000000, 0x080000, CRC(575df6ac) SHA1(071394273e512666fe124facdd8591a767ad0819) ) // 4bpp
ROM_LOAD16_WORD_SWAP( "excellent_1.15b", 0x000000, 0x080000, CRC(575df6ac) SHA1(071394273e512666fe124facdd8591a767ad0819) ) // 4bpp
/* data is expanded here from USER1 */
ROM_REGION( 0x100000, "user1", 0 ) /* BG Tiles */
ROM_LOAD( "excellent_6.15d", 0x000000, 0x020000, CRC(9065b146) SHA1(befc218bbcd63453ea7eb8f976796d36f2b2d552) ) // 1bpp
ROM_REGION( 0x100000, "gfx4", 0 ) /* BG Tiles */
ROM_LOAD( "excellent_8.14g", 0x000000, 0x080000, CRC(915520c4) SHA1(308207cb20f1ed6df365710c808644a6e4f07614) ) // 4bpp
ROM_LOAD16_WORD_SWAP( "excellent_8.14g", 0x000000, 0x080000, CRC(915520c4) SHA1(308207cb20f1ed6df365710c808644a6e4f07614) ) // 4bpp
/* data is expanded here from USER2 */
ROM_REGION( 0x100000, "user2", 0 ) /* BG Tiles */
ROM_LOAD( "excellent_7.17g", 0x000000, 0x020000, CRC(b96b2b82) SHA1(2b719d0c185d1eca4cd9ea66bed7842b74062288) ) // 1bpp
ROM_REGION( 0x060000, "gfx2", 0 ) /* FG Tiles */
ROM_LOAD( "excellent_2.17e", 0x000000, 0x020000, CRC(aa071b05) SHA1(517415bfd8e4dd51c6eb03a25c706f8613d34a09) )
ROM_LOAD16_WORD_SWAP( "excellent_2.17e", 0x000000, 0x020000, CRC(aa071b05) SHA1(517415bfd8e4dd51c6eb03a25c706f8613d34a09) )
ROM_REGION( 0x200000, "gfx3", 0 ) /* Sprites? */
ROM_LOAD( "d23c8000.1f", 0x000000, 0x0100000, CRC(14758b3c) SHA1(b372ccb42acb55a3dd15352a9d4ed576878a6731) ) // PCB denotes 23C16000 but a 23C8000 MASK is used
ROM_REGION( 0x200000, "spritegen", 0 ) /* Sprites? */
ROM_LOAD16_WORD_SWAP( "d23c8000.1f", 0x000000, 0x0100000, CRC(14758b3c) SHA1(b372ccb42acb55a3dd15352a9d4ed576878a6731) ) // PCB denotes 23C16000 but a 23C8000 MASK is used
ROM_REGION( 0x100000, "oki", 0 ) /* Samples */
ROM_LOAD( "excellent_4.7d", 0x000000, 0x80000, CRC(9a4af531) SHA1(bb201b7a6c9fd5924a0d79090257efffd8d4aba1) )

View File

@ -94,13 +94,12 @@ NOTE: Mask ROMs from Power Flipper Pinball Shooting have not been dumped, but as
TIMER_DEVICE_CALLBACK_MEMBER(gcpinbal_state::scanline_cb)
{
if (param >= 16)
m_screen->update_partial(m_screen->vpos() - 1);
if (param>=16)
m_screen->update_partial(m_screen->vpos()-1);
if (param==240)
if (param == 240)
m_maincpu->set_input_line(1, HOLD_LINE); // V-blank
else if ((param>=16) && (param<240))
else if ((param >= 16) && (param < 240))
m_maincpu->set_input_line(4, HOLD_LINE); // H-blank? (or programmable, used for raster effects)
// IRQ level 3 is sound related, hooked up to MSM6585
@ -110,24 +109,24 @@ TIMER_DEVICE_CALLBACK_MEMBER(gcpinbal_state::scanline_cb)
IOC
***********************************************************/
WRITE16_MEMBER(gcpinbal_state::d80010_w)
void gcpinbal_state::d80010_w(offs_t offset, u16 data, u16 mem_mask)
{
//logerror("CPU #0 PC %06x: warning - write ioc offset %06x with %04x\n", m_maincpu->pc(), offset, data);
COMBINE_DATA(&m_d80010_ram[offset]);
}
WRITE8_MEMBER(gcpinbal_state::d80040_w)
void gcpinbal_state::d80040_w(offs_t offset, u8 data)
{
logerror("Writing byte value %02X to offset %X\n", data, offset);
}
WRITE16_MEMBER(gcpinbal_state::d80060_w)
void gcpinbal_state::d80060_w(offs_t offset, u16 data, u16 mem_mask)
{
//logerror("CPU #0 PC %06x: warning - write ioc offset %06x with %04x\n", m_maincpu->pc(), offset, data);
COMBINE_DATA(&m_d80060_ram[offset]);
}
WRITE8_MEMBER(gcpinbal_state::bank_w)
void gcpinbal_state::bank_w(u8 data)
{
// MSM6585 bank, coin LEDs, maybe others?
if (m_msm_bank != ((data & 0x10) >> 4))
@ -138,8 +137,21 @@ WRITE8_MEMBER(gcpinbal_state::bank_w)
}
m_oki->set_rom_bank((data & 0x20) >> 5);
m_bg0_gfxset = (data & 0x04) ? 0x1000 : 0;
m_bg1_gfxset = (data & 0x08) ? 0x1000 : 0;
u32 old = m_bg0_gfxset;
u32 newbank = (data & 0x04) ? 0x1000 : 0;
if (old != newbank)
{
m_bg0_gfxset = (data & 0x04) ? 0x1000 : 0;
m_tilemap[0]->mark_all_dirty();
}
old = m_bg1_gfxset;
newbank = (data & 0x08) ? 0x1000 : 0;
if (old != newbank)
{
m_bg1_gfxset = (data & 0x04) ? 0x1000 : 0;
m_tilemap[1]->mark_all_dirty();
}
m_watchdog->write_line_ck(BIT(data, 7));
@ -147,7 +159,7 @@ WRITE8_MEMBER(gcpinbal_state::bank_w)
// machine().bookkeeping().coin_lockout_w(1, ~data & 0x02);
}
WRITE8_MEMBER(gcpinbal_state::eeprom_w)
void gcpinbal_state::eeprom_w(u8 data)
{
// 93C46 serial EEPROM (status read at D80087)
m_eeprom->di_write(BIT(data, 2));
@ -155,7 +167,7 @@ WRITE8_MEMBER(gcpinbal_state::eeprom_w)
m_eeprom->cs_write(BIT(data, 0));
}
WRITE8_MEMBER(gcpinbal_state::es8712_reset_w)
void gcpinbal_state::es8712_reset_w(u8 data)
{
// This probably works by resetting the ES-8712
m_essnd->reset();
@ -169,7 +181,7 @@ WRITE8_MEMBER(gcpinbal_state::es8712_reset_w)
void gcpinbal_state::gcpinbal_map(address_map &map)
{
map(0x000000, 0x1fffff).rom();
map(0xc00000, 0xc03fff).rw(FUNC(gcpinbal_state::gcpinbal_tilemaps_word_r), FUNC(gcpinbal_state::gcpinbal_tilemaps_word_w)).share("tilemapram");
map(0xc00000, 0xc03fff).ram().w(FUNC(gcpinbal_state::tilemaps_word_w)).share("tilemapram");
map(0xc80000, 0xc81fff).rw(m_sprgen, FUNC(excellent_spr_device::read), FUNC(excellent_spr_device::write)).umask16(0x00ff);
map(0xd00000, 0xd00fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette");
map(0xd80010, 0xd8002f).ram().w(FUNC(gcpinbal_state::d80010_w)).share("d80010");
@ -305,22 +317,9 @@ static const gfx_layout char_8x8_layout =
8*8*4 /* every sprite takes 32 consecutive bytes */
};
static const gfx_layout tilelayout =
{
16,16, /* 16*16 sprites */
RGN_FRAC(1,1),
4, /* 4 bits per pixel */
// { 16, 48, 0, 32 },
{ 48, 16, 32, 0 },
{ STEP16(0,1) },
{ STEP16(0,16*4) },
16*16*4 /* every sprite takes 128 consecutive bytes */
};
static GFXDECODE_START( gfx_gcpinbal )
GFXDECODE_ENTRY( "sprite", 0, tilelayout, 0, 256 ) // sprites & playfield
GFXDECODE_ENTRY( "bg0", 0, charlayout, 0, 256 ) // sprites & playfield
GFXDECODE_ENTRY( "fg0", 0, char_8x8_layout, 0, 256 ) // sprites & playfield
GFXDECODE_ENTRY( "bg0", 0, charlayout, 0, 0x60 ) // playfield
GFXDECODE_ENTRY( "fg0", 0, char_8x8_layout, 0x700, 0x10 ) // playfield
GFXDECODE_END
@ -339,9 +338,7 @@ void gcpinbal_state::machine_start()
void gcpinbal_state::machine_reset()
{
int i;
for (i = 0; i < 3; i++)
for (int i = 0; i < 3; i++)
{
m_scrollx[i] = 0;
m_scrolly[i] = 0;
@ -370,13 +367,16 @@ void gcpinbal_state::gcpinbal(machine_config &config)
m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0) /* frames per second, vblank duration */);
m_screen->set_size(40*8, 32*8);
m_screen->set_visarea(0*8, 40*8-1, 2*8, 30*8-1);
m_screen->set_screen_update(FUNC(gcpinbal_state::screen_update_gcpinbal));
m_screen->set_screen_update(FUNC(gcpinbal_state::screen_update));
m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_gcpinbal);
PALETTE(config, m_palette).set_format(palette_device::RRRRGGGGBBBBRGBx, 4096);
PALETTE(config, m_palette).set_format(palette_device::RRRRGGGGBBBBRGBx, 0x1000/2);
EXCELLENT_SPRITE(config, m_sprgen, 0);
m_sprgen->set_palette(m_palette);
m_sprgen->set_color_base(0x600);
m_sprgen->set_colpri_callback(FUNC(gcpinbal_state::gcpinbal_colpri_cb), this);
/* sound hardware */
SPEAKER(config, "mono").front_center();
@ -414,7 +414,7 @@ ROM_START( pwrflip ) /* Updated version of Grand Cross Pinball or semi-sequel? *
ROM_REGION( 0x020000, "fg0", 0 ) /* FG0 (8 x 8) */
ROM_LOAD16_WORD_SWAP( "p.f.u10", 0x000000, 0x020000, CRC(50e34549) SHA1(ca1808513ff3feb8bcd34d9aafd7b374e4244732) )
ROM_REGION( 0x200000, "sprite", 0 ) /* Sprites (16 x 16) */
ROM_REGION( 0x200000, "spritegen", 0 ) /* Sprites (16 x 16) */
ROM_LOAD16_WORD_SWAP( "u13", 0x000000, 0x200000, CRC(62f3952f) SHA1(7dc9ccb753d46b6aaa791bcbf6e18e6d872f6b79) ) /* 23C16000 mask ROM */
ROM_REGION( 0x080000, "oki", 0 ) /* M6295 acc to Raine */
@ -442,7 +442,7 @@ ROM_START( gcpinbal )
ROM_REGION( 0x020000, "fg0", 0 ) /* FG0 (8 x 8) */
ROM_LOAD16_WORD_SWAP( "1_excellent.u10", 0x000000, 0x020000, CRC(79321550) SHA1(61f1b772ed8cf95bfee9df8394b0c3ff727e8702) )
ROM_REGION( 0x200000, "sprite", 0 ) /* Sprites (16 x 16) */
ROM_REGION( 0x200000, "spritegen", 0 ) /* Sprites (16 x 16) */
ROM_LOAD16_WORD_SWAP( "u13", 0x000000, 0x200000, CRC(62f3952f) SHA1(7dc9ccb753d46b6aaa791bcbf6e18e6d872f6b79) ) /* 23C16000 mask ROM */
ROM_REGION( 0x080000, "oki", 0 ) /* M6295 acc to Raine */

View File

@ -21,6 +21,7 @@ public:
m_bak_videoram(*this, "bak_videoram"),
m_txt_videoram(*this, "txt_videoram"),
m_scroll(*this, "scroll"),
m_audiobank(*this, "bank1"),
m_maincpu(*this, "maincpu"),
m_audiocpu(*this, "audiocpu"),
m_oki(*this, "oki"),
@ -32,11 +33,20 @@ public:
m_watchdog(*this, "watchdog")
{ }
void init_aquarium();
void aquarium(machine_config &config);
protected:
virtual void video_start() override;
private:
/* memory pointers */
required_shared_ptr<uint16_t> m_mid_videoram;
required_shared_ptr<uint16_t> m_bak_videoram;
required_shared_ptr<uint16_t> m_txt_videoram;
required_shared_ptr<uint16_t> m_scroll;
required_shared_ptr<u16> m_mid_videoram;
required_shared_ptr<u16> m_bak_videoram;
required_shared_ptr<u16> m_txt_videoram;
required_shared_ptr<u16> m_scroll;
required_memory_bank m_audiobank;
/* video-related */
tilemap_t *m_txt_tilemap;
@ -54,23 +64,21 @@ public:
required_device<generic_latch_8_device> m_soundlatch;
required_device<mb3773_device> m_watchdog;
DECLARE_WRITE8_MEMBER(aquarium_watchdog_w);
DECLARE_WRITE8_MEMBER(aquarium_z80_bank_w);
DECLARE_READ8_MEMBER(aquarium_oki_r);
DECLARE_WRITE8_MEMBER(aquarium_oki_w);
DECLARE_WRITE16_MEMBER(aquarium_txt_videoram_w);
DECLARE_WRITE16_MEMBER(aquarium_mid_videoram_w);
DECLARE_WRITE16_MEMBER(aquarium_bak_videoram_w);
void init_aquarium();
TILE_GET_INFO_MEMBER(get_aquarium_txt_tile_info);
TILE_GET_INFO_MEMBER(get_aquarium_mid_tile_info);
TILE_GET_INFO_MEMBER(get_aquarium_bak_tile_info);
virtual void video_start() override;
uint32_t screen_update_aquarium(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
uint8_t aquarium_snd_bitswap( uint8_t scrambled_data );
void mix_sprite_bitmap(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int priority_mask, int priority_value);
bitmap_ind16 m_temp_sprite_bitmap;
void aquarium(machine_config &config);
void watchdog_w(u8 data);
void z80_bank_w(u8 data);
u8 oki_r();
void oki_w(u8 data);
void txt_videoram_w(offs_t offset, u16 data, u16 mem_mask = ~0);
void mid_videoram_w(offs_t offset, u16 data, u16 mem_mask = ~0);
void bak_videoram_w(offs_t offset, u16 data, u16 mem_mask = ~0);
TILE_GET_INFO_MEMBER(get_txt_tile_info);
TILE_GET_INFO_MEMBER(get_mid_tile_info);
TILE_GET_INFO_MEMBER(get_bak_tile_info);
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
u8 snd_bitswap(u8 scrambled_data);
void aquarium_colpri_cb(u32 &colour, u32 &pri_mask);
void main_map(address_map &map);
void snd_map(address_map &map);
void snd_portmap(address_map &map);

View File

@ -19,45 +19,39 @@ class gcpinbal_state : public driver_device
public:
gcpinbal_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
, m_tilemapram(*this, "tilemapram")
, m_d80010_ram(*this, "d80010")
, m_d80060_ram(*this, "d80060")
, m_maincpu(*this, "maincpu")
, m_eeprom(*this, "eeprom")
, m_watchdog(*this, "watchdog")
, m_oki(*this, "oki")
, m_essnd(*this, "essnd")
, m_tilemapram(*this, "tilemapram")
, m_d80010_ram(*this, "d80010")
, m_d80060_ram(*this, "d80060")
, m_gfxdecode(*this, "gfxdecode")
, m_palette(*this, "palette")
, m_sprgen(*this, "spritegen")
, m_screen(*this, "screen")
, m_gfxdecode(*this, "gfxdecode")
, m_palette(*this, "palette")
{ }
void gcpinbal(machine_config &config);
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
virtual void video_start() override;
private:
/* devices */
required_device<cpu_device> m_maincpu;
required_device<eeprom_serial_93cxx_device> m_eeprom;
required_device<mb3773_device> m_watchdog;
required_device<okim6295_device> m_oki;
required_device<es8712_device> m_essnd;
/* memory pointers */
required_shared_ptr<uint16_t> m_tilemapram;
required_shared_ptr<uint16_t> m_d80010_ram;
required_shared_ptr<uint16_t> m_d80060_ram;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
required_shared_ptr<u16> m_tilemapram;
required_shared_ptr<u16> m_d80010_ram;
required_shared_ptr<u16> m_d80060_ram;
/* video-related */
tilemap_t *m_tilemap[3];
uint16_t m_scrollx[3];
uint16_t m_scrolly[3];
uint16_t m_bg0_gfxset;
uint16_t m_bg1_gfxset;
u16 m_scrollx[3];
u16 m_scrolly[3];
u16 m_bg0_gfxset;
u16 m_bg1_gfxset;
#ifdef MAME_DEBUG
uint8_t m_dislayer[4];
#endif
@ -65,27 +59,32 @@ private:
/* sound-related */
uint32_t m_msm_bank;
/* devices */
required_device<cpu_device> m_maincpu;
required_device<eeprom_serial_93cxx_device> m_eeprom;
required_device<mb3773_device> m_watchdog;
required_device<okim6295_device> m_oki;
required_device<es8712_device> m_essnd;
required_device<excellent_spr_device> m_sprgen;
required_device<screen_device> m_screen;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
void d80010_w(offs_t offset, u16 data, u16 mem_mask = ~0);
void d80040_w(offs_t offset, u8 data);
void d80060_w(offs_t offset, u16 data, u16 mem_mask = ~0);
void bank_w(u8 data);
void eeprom_w(u8 data);
void es8712_reset_w(u8 data);
void tilemaps_word_w(offs_t offset, u16 data, u16 mem_mask = ~0);
DECLARE_WRITE16_MEMBER(d80010_w);
DECLARE_WRITE8_MEMBER(d80040_w);
DECLARE_WRITE16_MEMBER(d80060_w);
DECLARE_WRITE8_MEMBER(bank_w);
DECLARE_WRITE8_MEMBER(eeprom_w);
DECLARE_WRITE8_MEMBER(es8712_reset_w);
DECLARE_READ16_MEMBER(gcpinbal_tilemaps_word_r);
DECLARE_WRITE16_MEMBER(gcpinbal_tilemaps_word_w);
TILE_GET_INFO_MEMBER(get_bg0_tile_info);
TILE_GET_INFO_MEMBER(get_bg1_tile_info);
TILE_GET_INFO_MEMBER(get_fg_tile_info);
virtual void machine_start() override;
virtual void machine_reset() override;
virtual void video_start() override;
uint32_t screen_update_gcpinbal(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void gcpinbal_colpri_cb(u32 &colour, u32 &pri_mask);
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
TIMER_DEVICE_CALLBACK_MEMBER(scanline_cb);
void gcpinbal_core_vh_start( );
DECLARE_WRITE_LINE_MEMBER(gcp_adpcm_int);
required_device<excellent_spr_device> m_sprgen;
required_device<screen_device> m_screen;
void gcpinbal_map(address_map &map);
};

View File

@ -7,59 +7,53 @@
/* TXT Layer */
TILE_GET_INFO_MEMBER(aquarium_state::get_aquarium_txt_tile_info)
TILE_GET_INFO_MEMBER(aquarium_state::get_txt_tile_info)
{
int tileno, colour;
tileno = (m_txt_videoram[tile_index] & 0x0fff);
colour = (m_txt_videoram[tile_index] & 0xf000) >> 12;
SET_TILE_INFO_MEMBER(2, tileno, colour, 0);
const u32 tileno = (m_txt_videoram[tile_index] & 0x0fff);
const u32 colour = (m_txt_videoram[tile_index] & 0xf000) >> 12;
SET_TILE_INFO_MEMBER(1, tileno, colour, 0);
tileinfo.category = (m_txt_videoram[tile_index] & 0x8000) >> 15;
}
WRITE16_MEMBER(aquarium_state::aquarium_txt_videoram_w)
void aquarium_state::txt_videoram_w(offs_t offset, u16 data, u16 mem_mask)
{
COMBINE_DATA(&m_txt_videoram[offset]);
m_txt_tilemap->mark_tile_dirty(offset);
}
/* MID Layer */
TILE_GET_INFO_MEMBER(aquarium_state::get_aquarium_mid_tile_info)
TILE_GET_INFO_MEMBER(aquarium_state::get_mid_tile_info)
{
int tileno, colour, flag;
const u32 tileno = (m_mid_videoram[tile_index * 2] & 0x0fff);
const u32 colour = (m_mid_videoram[tile_index * 2 + 1] & 0x001f);
const int flag = TILE_FLIPYX((m_mid_videoram[tile_index * 2 + 1] & 0x300) >> 8);
tileno = (m_mid_videoram[tile_index * 2] & 0x0fff);
colour = (m_mid_videoram[tile_index * 2 + 1] & 0x001f);
flag = TILE_FLIPYX((m_mid_videoram[tile_index * 2 + 1] & 0x300) >> 8);
SET_TILE_INFO_MEMBER(1, tileno, colour, flag);
SET_TILE_INFO_MEMBER(0, tileno, colour, flag);
tileinfo.category = (m_mid_videoram[tile_index * 2 + 1] & 0x20) >> 5;
}
WRITE16_MEMBER(aquarium_state::aquarium_mid_videoram_w)
void aquarium_state::mid_videoram_w(offs_t offset, u16 data, u16 mem_mask)
{
COMBINE_DATA(&m_mid_videoram[offset]);
m_mid_tilemap->mark_tile_dirty(offset / 2);
}
/* BAK Layer */
TILE_GET_INFO_MEMBER(aquarium_state::get_aquarium_bak_tile_info)
TILE_GET_INFO_MEMBER(aquarium_state::get_bak_tile_info)
{
int tileno, colour, flag;
const u32 tileno = (m_bak_videoram[tile_index * 2] & 0x0fff);
const u32 colour = (m_bak_videoram[tile_index * 2 + 1] & 0x001f);
const int flag = TILE_FLIPYX((m_bak_videoram[tile_index * 2 + 1] & 0x300) >> 8);
tileno = (m_bak_videoram[tile_index * 2] & 0x0fff);
colour = (m_bak_videoram[tile_index * 2 + 1] & 0x001f);
flag = TILE_FLIPYX((m_bak_videoram[tile_index * 2 + 1] & 0x300) >> 8);
SET_TILE_INFO_MEMBER(3, tileno, colour, flag);
SET_TILE_INFO_MEMBER(2, tileno, colour, flag);
tileinfo.category = (m_bak_videoram[tile_index * 2 + 1] & 0x20) >> 5;
}
WRITE16_MEMBER(aquarium_state::aquarium_bak_videoram_w)
void aquarium_state::bak_videoram_w(offs_t offset, u16 data, u16 mem_mask)
{
COMBINE_DATA(&m_bak_videoram[offset]);
m_bak_tilemap->mark_tile_dirty(offset / 2);
@ -67,37 +61,23 @@ WRITE16_MEMBER(aquarium_state::aquarium_bak_videoram_w)
void aquarium_state::video_start()
{
m_txt_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(aquarium_state::get_aquarium_txt_tile_info),this), TILEMAP_SCAN_ROWS, 8, 8, 64, 64);
m_bak_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(aquarium_state::get_aquarium_bak_tile_info),this), TILEMAP_SCAN_ROWS, 16, 16, 32, 32);
m_mid_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(aquarium_state::get_aquarium_mid_tile_info),this), TILEMAP_SCAN_ROWS, 16, 16, 32, 32);
m_txt_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(aquarium_state::get_txt_tile_info),this), TILEMAP_SCAN_ROWS, 8, 8, 64, 64);
m_bak_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(aquarium_state::get_bak_tile_info),this), TILEMAP_SCAN_ROWS, 16, 16, 32, 32);
m_mid_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(aquarium_state::get_mid_tile_info),this), TILEMAP_SCAN_ROWS, 16, 16, 32, 32);
m_txt_tilemap->set_transparent_pen(0);
m_mid_tilemap->set_transparent_pen(0);
m_bak_tilemap->set_transparent_pen(0);
m_screen->register_screen_bitmap(m_temp_sprite_bitmap);
}
void aquarium_state::mix_sprite_bitmap(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int priority_mask, int priority_value)
void aquarium_state::aquarium_colpri_cb(u32 &colour, u32 &pri_mask)
{
for (int y = cliprect.top();y <= cliprect.bottom();y++)
{
uint16_t* srcline = &m_temp_sprite_bitmap.pix16(y);
uint16_t* dstline = &bitmap.pix16(y);
for (int x = cliprect.left();x <= cliprect.right();x++)
{
uint16_t pixel = srcline[x];
if (pixel & 0xf)
if ((pixel & priority_mask) == priority_value)
dstline[x] = pixel;
}
}
pri_mask = 0;
if (colour & 8)
pri_mask |= (GFX_PMASK_2 | GFX_PMASK_4 | GFX_PMASK_8);
}
uint32_t aquarium_state::screen_update_aquarium(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
uint32_t aquarium_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_mid_tilemap->set_scrollx(0, m_scroll[0]);
m_mid_tilemap->set_scrolly(0, m_scroll[1]);
@ -106,19 +86,15 @@ uint32_t aquarium_state::screen_update_aquarium(screen_device &screen, bitmap_in
m_txt_tilemap->set_scrollx(0, m_scroll[4]);
m_txt_tilemap->set_scrolly(0, m_scroll[5]);
screen.priority().fill(0, cliprect);
bitmap.fill(0, cliprect); // WDUD logo suggests this
m_temp_sprite_bitmap.fill(0, cliprect);
m_sprgen->aquarium_draw_sprites(m_temp_sprite_bitmap, cliprect, m_gfxdecode, 16);
m_bak_tilemap->draw(screen, bitmap, cliprect, 0, 1);
m_mid_tilemap->draw(screen, bitmap, cliprect, 0, 2);
m_txt_tilemap->draw(screen, bitmap, cliprect, 1, 4);
m_bak_tilemap->draw(screen, bitmap, cliprect, 0, 0);
mix_sprite_bitmap(screen, bitmap, cliprect, 0x80, 0x80);
m_mid_tilemap->draw(screen, bitmap, cliprect, 0, 0);
m_txt_tilemap->draw(screen, bitmap, cliprect, 1, 0);
m_bak_tilemap->draw(screen, bitmap, cliprect, 1, 0);
mix_sprite_bitmap(screen, bitmap, cliprect, 0x80, 0x00);
m_bak_tilemap->draw(screen, bitmap, cliprect, 1, 8);
m_sprgen->aquarium_draw_sprites(screen, bitmap, cliprect, 16);
m_mid_tilemap->draw(screen, bitmap, cliprect, 1, 0);
m_txt_tilemap->draw(screen, bitmap, cliprect, 0, 0);

View File

@ -24,24 +24,45 @@ DEFINE_DEVICE_TYPE(EXCELLENT_SPRITE, excellent_spr_device, "excellent_spr", "Exc
excellent_spr_device::excellent_spr_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, EXCELLENT_SPRITE, tag, owner, clock)
, device_gfx_interface(mconfig, *this, nullptr)
, device_video_interface(mconfig, *this)
, m_gfx_region(*this, DEVICE_SELF)
, m_colbase(0)
{
}
void excellent_spr_device::device_start()
{
m_ram = make_unique_clear<uint8_t[]>(0x1000);
/* 16x16x4 */
gfx_layout layout_16x16x4 =
{
16,16, /* 16*16 sprites */
0,
4, /* 4 bits per pixel */
// { 16, 48, 0, 32 },
{ 48, 16, 32, 0 },
{ STEP16(0,1) },
{ STEP16(0,16*4) },
16*16*4 /* every sprite takes 128 consecutive bytes */
};
layout_16x16x4.total = m_gfx_region->bytes() / ((16*16*4) / 8);
m_colpri_cb.bind_relative_to(*owner());
m_ram = make_unique_clear<u8[]>(0x1000);
save_pointer(NAME(m_ram), 0x1000);
set_gfx(0, std::make_unique<gfx_element>(&palette(), layout_16x16x4, m_gfx_region->base(), 0, 0x10, m_colbase));
}
READ8_MEMBER(excellent_spr_device::read)
u8 excellent_spr_device::read(offs_t offset)
{
return m_ram[offset];
}
WRITE8_MEMBER(excellent_spr_device::write)
void excellent_spr_device::write(offs_t offset, u8 data)
{
m_ram[offset] = data;
}
@ -72,34 +93,38 @@ void excellent_spr_device::device_reset()
****************************************************************/
void excellent_spr_device::aquarium_draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect, gfxdecode_device *gfxdecode, int y_offs )
void excellent_spr_device::aquarium_draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int y_offs)
{
int offs, chain_pos;
int x, y, curx, cury;
uint8_t col, flipx, flipy, chain;
uint16_t code;
const bool priority = !m_colpri_cb.isnull();
for (offs = 0; offs < 0x1000; offs += 8)
int start, end, inc;
if (priority) { start = 0x1000 - 8; end = -8; inc = -8; }
else { start = 0; end = 0x1000; inc = +8; }
for (int offs = start; offs != end; offs += inc)
{
code = ((m_ram[offs + 5]) & 0xff) + (((m_ram[offs + 6]) & 0xff) << 8);
u32 code = ((m_ram[offs + 5]) & 0xff) + (((m_ram[offs + 6]) & 0xff) << 8);
code &= 0x3fff;
if (!(m_ram[offs + 4] &0x80)) /* active sprite ? */
if (!(m_ram[offs + 4] & 0x80)) /* active sprite ? */
{
x = ((m_ram[offs + 0]) &0xff) + (((m_ram[offs + 1]) & 0xff) << 8);
y = ((m_ram[offs + 2]) &0xff) + (((m_ram[offs + 3]) & 0xff) << 8);
int x = ((m_ram[offs + 0]) & 0xff) + (((m_ram[offs + 1]) & 0xff) << 8);
int y = ((m_ram[offs + 2]) & 0xff) + (((m_ram[offs + 3]) & 0xff) << 8);
/* Treat coords as signed */
if (x & 0x8000) x -= 0x10000;
if (y & 0x8000) y -= 0x10000;
col = ((m_ram[offs + 7]) & 0x0f);
chain = (m_ram[offs + 4]) & 0x07;
flipy = (m_ram[offs + 4]) & 0x10;
flipx = (m_ram[offs + 4]) & 0x20;
u32 pri_mask = 0;
u32 colour = ((m_ram[offs + 7]) & 0x0f);
const u8 chain = (m_ram[offs + 4]) & 0x07;
const bool flipy = (m_ram[offs + 4]) & 0x10;
const bool flipx = (m_ram[offs + 4]) & 0x20;
if (priority)
m_colpri_cb(colour, pri_mask);
curx = x;
cury = y;
int curx = x;
int cury = y;
if (((m_ram[offs + 4]) & 0x08) && flipy)
cury += (chain * 16);
@ -107,25 +132,44 @@ void excellent_spr_device::aquarium_draw_sprites( bitmap_ind16 &bitmap, const re
if (!(((m_ram[offs + 4]) & 0x08)) && flipx)
curx += (chain * 16);
for (chain_pos = chain; chain_pos >= 0; chain_pos--)
for (int chain_pos = chain; chain_pos >= 0; chain_pos--)
{
gfxdecode->gfx(0)->transpen(bitmap,cliprect,
code,
col,
flipx, flipy,
curx,cury,0);
if (priority)
{
gfx(0)->prio_transpen(bitmap,cliprect,
code,
colour,
flipx, flipy,
curx,cury,
screen.priority(),pri_mask,0);
/* wrap around y */
gfxdecode->gfx(0)->transpen(bitmap,cliprect,
code,
col,
flipx, flipy,
curx,cury + 256,0);
/* wrap around y */
gfx(0)->prio_transpen(bitmap,cliprect,
code,
colour,
flipx, flipy,
curx,cury + 256,
screen.priority(),pri_mask,0);
}
else
{
gfx(0)->transpen(bitmap,cliprect,
code,
colour,
flipx, flipy,
curx,cury,0);
/* wrap around y */
gfx(0)->transpen(bitmap,cliprect,
code,
colour,
flipx, flipy,
curx,cury + 256,0);
}
code++;
if ((m_ram[offs + 4]) &0x08) /* Y chain */
if ((m_ram[offs + 4]) & 0x08) /* Y chain */
{
if (flipy)
cury -= 16;
@ -153,54 +197,66 @@ void excellent_spr_device::aquarium_draw_sprites( bitmap_ind16 &bitmap, const re
#endif
}
void excellent_spr_device::gcpinbal_draw_sprites( screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, gfxdecode_device *gfxdecode, int y_offs, int priority )
void excellent_spr_device::gcpinbal_draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int y_offs)
{
uint8_t *spriteram = m_ram.get();
int offs, chain_pos;
int x, y, curx, cury;
// int priority = 0;
uint8_t col, flipx, flipy, chain;
uint16_t code;
const bool priority = !m_colpri_cb.isnull();
int start, end, inc;
if (priority) { start = 0x1000 - 8; end = -8; inc = -8; }
else { start = 0; end = 0x1000; inc = +8; }
for (offs = 0x1000 - 8; offs >= 0; offs -= 8)
for (int offs = start; offs != end; offs += inc)
{
code = ((spriteram[offs + 5]) & 0xff) + (((spriteram[offs + 6]) & 0xff) << 8);
u32 code = ((m_ram[offs + 5]) & 0xff) + (((m_ram[offs + 6]) & 0xff) << 8);
code &= 0x3fff;
if (!(spriteram[offs + 4] &0x80)) /* active sprite ? */
if (!(m_ram[offs + 4] & 0x80)) /* active sprite ? */
{
x = ((spriteram[offs + 0]) & 0xff) + (((spriteram[offs + 1]) & 0xff) << 8);
y = ((spriteram[offs + 2]) & 0xff) + (((spriteram[offs + 3]) & 0xff) << 8);
int x = ((m_ram[offs + 0]) & 0xff) + (((m_ram[offs + 1]) & 0xff) << 8);
int y = ((m_ram[offs + 2]) & 0xff) + (((m_ram[offs + 3]) & 0xff) << 8);
/* Treat coords as signed */
if (x & 0x8000) x -= 0x10000;
if (y & 0x8000) y -= 0x10000;
col = ((spriteram[offs + 7]) & 0x0f) | 0x60;
chain = (spriteram[offs + 4]) & 0x07;
flipy = (spriteram[offs + 4]) & 0x10;
flipx = 0;
u32 pri_mask = 0;
u32 colour = ((m_ram[offs + 7]) & 0x0f);
const u8 chain = (m_ram[offs + 4]) & 0x07;
const bool flipy = (m_ram[offs + 4]) & 0x10;
const bool flipx = 0;
if (priority)
m_colpri_cb(colour, pri_mask);
curx = x;
cury = y;
int curx = x;
int cury = y;
if (((spriteram[offs + 4]) & 0x08) && flipy)
if (((m_ram[offs + 4]) & 0x08) && flipy)
cury += (chain * 16);
for (chain_pos = chain; chain_pos >= 0; chain_pos--)
for (int chain_pos = chain; chain_pos >= 0; chain_pos--)
{
gfxdecode->gfx(0)->prio_transpen(bitmap,cliprect,
code,
col,
flipx, flipy,
curx,cury,
screen.priority(),
priority ? 0xfc : 0xf0,0);
if (priority)
{
gfx(0)->prio_transpen(bitmap,cliprect,
code,
colour,
flipx, flipy,
curx,cury,
screen.priority(),pri_mask,0);
}
else
{
gfx(0)->transpen(bitmap,cliprect,
code,
colour,
flipx, flipy,
curx,cury,
0);
}
code++;
if ((spriteram[offs + 4]) & 0x08) /* Y chain */
if ((m_ram[offs + 4]) & 0x08) /* Y chain */
{
if (flipy) cury -= 16;
else cury += 16;

View File

@ -5,24 +5,32 @@
#pragma once
typedef device_delegate<void (u32 &colour, u32 &pri_mask)> excellent_spr_colpri_cb_delegate;
class excellent_spr_device : public device_t, public device_video_interface
class excellent_spr_device : public device_t, public device_gfx_interface, public device_video_interface
{
public:
excellent_spr_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
DECLARE_READ8_MEMBER(read);
DECLARE_WRITE8_MEMBER(write);
void set_color_base(u16 base) { m_colbase = base; }
template <typename... T> void set_colpri_callback(T &&... args) { m_colpri_cb = excellent_spr_colpri_cb_delegate(std::forward<T>(args)...); }
void aquarium_draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, gfxdecode_device *gfxdecode, int y_offs);
void gcpinbal_draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, gfxdecode_device *gfxdecode, int y_offs, int priority);
u8 read(offs_t offset);
void write(offs_t offset, u8 data);
void aquarium_draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int y_offs);
void gcpinbal_draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int y_offs);
protected:
std::unique_ptr<uint8_t[]> m_ram;
std::unique_ptr<u8[]> m_ram;
virtual void device_start() override;
virtual void device_reset() override;
private:
excellent_spr_colpri_cb_delegate m_colpri_cb;
required_memory_region m_gfx_region;
u16 m_colbase;
};
DECLARE_DEVICE_TYPE(EXCELLENT_SPRITE, excellent_spr_device)

View File

@ -10,44 +10,40 @@
TILE_GET_INFO_MEMBER(gcpinbal_state::get_bg0_tile_info)
{
uint16_t tilenum = m_tilemapram[0 + tile_index * 2];
uint16_t attr = m_tilemapram[1 + tile_index * 2];
const u16 tile = m_tilemapram[0 + tile_index * 2];
const u16 attr = m_tilemapram[1 + tile_index * 2];
SET_TILE_INFO_MEMBER(1,
(tilenum & 0xfff) + m_bg0_gfxset,
SET_TILE_INFO_MEMBER(0,
(tile & 0xfff) + m_bg0_gfxset,
(attr & 0x1f),
TILE_FLIPYX( (attr & 0x300) >> 8));
TILE_FLIPYX((attr & 0x300) >> 8));
}
TILE_GET_INFO_MEMBER(gcpinbal_state::get_bg1_tile_info)
{
uint16_t tilenum = m_tilemapram[0x800 + tile_index * 2];
uint16_t attr = m_tilemapram[0x801 + tile_index * 2];
const u16 tile = m_tilemapram[0x800 + tile_index * 2];
const u16 attr = m_tilemapram[0x801 + tile_index * 2];
SET_TILE_INFO_MEMBER(1,
(tilenum & 0xfff) + 0x2000 + m_bg1_gfxset,
SET_TILE_INFO_MEMBER(0,
(tile & 0xfff) + 0x2000 + m_bg1_gfxset,
(attr & 0x1f) + 0x30,
TILE_FLIPYX( (attr & 0x300) >> 8));
TILE_FLIPYX((attr & 0x300) >> 8));
}
TILE_GET_INFO_MEMBER(gcpinbal_state::get_fg_tile_info)
{
uint16_t tilenum = m_tilemapram[0x1000 + tile_index];
SET_TILE_INFO_MEMBER(2,
(tilenum & 0xfff),
(tilenum >> 12) | 0x70,
0);
const u16 tile = m_tilemapram[0x1000 + tile_index];
SET_TILE_INFO_MEMBER(1, (tile & 0xfff), (tile >> 12), 0);
}
void gcpinbal_state::gcpinbal_core_vh_start( )
void gcpinbal_state::video_start()
{
int xoffs = 0;
int yoffs = 0;
m_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(gcpinbal_state::get_bg0_tile_info),this),TILEMAP_SCAN_ROWS,16,16,32,32);
m_tilemap[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(gcpinbal_state::get_bg1_tile_info),this),TILEMAP_SCAN_ROWS,16,16,32,32);
m_tilemap[2] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(gcpinbal_state::get_fg_tile_info),this), TILEMAP_SCAN_ROWS,8,8,64,64);
m_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(gcpinbal_state::get_bg0_tile_info),this),TILEMAP_SCAN_ROWS, 16, 16, 32, 32);
m_tilemap[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(gcpinbal_state::get_bg1_tile_info),this),TILEMAP_SCAN_ROWS, 16, 16, 32, 32);
m_tilemap[2] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(gcpinbal_state::get_fg_tile_info),this), TILEMAP_SCAN_ROWS, 8, 8, 64, 64);
m_tilemap[0]->set_transparent_pen(0);
m_tilemap[1]->set_transparent_pen(0);
@ -62,9 +58,9 @@ void gcpinbal_state::gcpinbal_core_vh_start( )
m_tilemap[2]->set_scrolldy(-yoffs, 0);
}
void gcpinbal_state::video_start()
void gcpinbal_state::gcpinbal_colpri_cb(u32 &colour, u32 &pri_mask)
{
gcpinbal_core_vh_start();
pri_mask = (m_d80060_ram[0x8 / 2] & 0x8800) ? 0xf0 : 0xfc;
}
@ -72,12 +68,7 @@ void gcpinbal_state::video_start()
TILEMAP READ AND WRITE HANDLERS
*******************************************************************/
READ16_MEMBER(gcpinbal_state::gcpinbal_tilemaps_word_r)
{
return m_tilemapram[offset];
}
WRITE16_MEMBER(gcpinbal_state::gcpinbal_tilemaps_word_w)
void gcpinbal_state::tilemaps_word_w(offs_t offset, u16 data, u16 mem_mask)
{
COMBINE_DATA(&m_tilemapram[offset]);
@ -90,14 +81,12 @@ WRITE16_MEMBER(gcpinbal_state::gcpinbal_tilemaps_word_w)
}
/**************************************************************
SCREEN REFRESH
**************************************************************/
uint32_t gcpinbal_state::screen_update_gcpinbal(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
uint32_t gcpinbal_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
int i;
uint8_t layer[3];
#ifdef MAME_DEBUG
@ -127,7 +116,7 @@ uint32_t gcpinbal_state::screen_update_gcpinbal(screen_device &screen, bitmap_in
m_scrollx[2] = m_d80010_ram[0xc / 2];
m_scrolly[2] = m_d80010_ram[0xe / 2];
for (i = 0; i < 3; i++)
for (int i = 0; i < 3; i++)
{
m_tilemap[i]->set_scrollx(0, m_scrollx[i]);
m_tilemap[i]->set_scrolly(0, m_scrolly[i]);
@ -156,8 +145,7 @@ uint32_t gcpinbal_state::screen_update_gcpinbal(screen_device &screen, bitmap_in
#endif
m_tilemap[layer[2]]->draw(screen, bitmap, cliprect, 0, 4);
int sprpri = (m_d80060_ram[0x8 / 2] & 0x8800) ? 0 : 1;
m_sprgen->gcpinbal_draw_sprites(screen, bitmap, cliprect, m_gfxdecode, 16, sprpri);
m_sprgen->gcpinbal_draw_sprites(screen, bitmap, cliprect, 16);
#if 0
{