Merge pull request #5044 from cam900/kaneko16_bufspr

kaneko16.cpp : Updates
This commit is contained in:
R. Belmont 2019-05-14 16:08:11 -04:00 committed by GitHub
commit 0c86462c1f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 45 additions and 33 deletions

View File

@ -161,7 +161,7 @@ void kaneko16_state::bloodwar_coin_lockout_w(u8 data)
/* Two identically mapped YM2149 chips */
template<unsigned Chip>
READ16_MEMBER(kaneko16_state::ym2149_r)
u16 kaneko16_state::ym2149_r(offs_t offset)
{
/* Each 2149 register is mapped to a different address */
m_ym2149[Chip]->address_w(offset);
@ -170,7 +170,7 @@ READ16_MEMBER(kaneko16_state::ym2149_r)
template<unsigned Chip>
WRITE16_MEMBER(kaneko16_state::ym2149_w)
void kaneko16_state::ym2149_w(offs_t offset, u16 data, u16 mem_mask)
{
/* Each 2149 register is mapped to a different address */
m_ym2149[Chip]->address_w(offset);
@ -228,7 +228,7 @@ void kaneko16_state::eeprom_cs_w(u8 data)
The Berlin Wall
***************************************************************************/
WRITE16_MEMBER(kaneko16_berlwall_state::berlwall_oki_w)
void kaneko16_berlwall_state::berlwall_oki_w(offs_t offset, u16 data, u16 mem_mask)
{
if (mem_mask == 0xff00) // reads / writes to the upper byte only appear to act as a mirror to the lower byte, 16-bit reads/writes only access the lower byte.
{
@ -243,17 +243,17 @@ u16 kaneko16_berlwall_state::berlwall_spriteram_r(offs_t offset)
{
offset = bitswap<16>(offset, 15, 14, 13, 12, 2, 11, 10, 9, 8, 7, 6, 5, 4, 3, 1, 0);
offset ^= 0x800;
return m_spriteram[offset];
return m_spriteram->live()[offset];
}
void kaneko16_berlwall_state::berlwall_spriteram_w(offs_t offset, u16 data, u16 mem_mask)
{
offset = bitswap<16>(offset, 15, 14, 13, 12, 2, 11, 10, 9, 8, 7, 6, 5, 4, 3, 1, 0);
offset ^= 0x800;
COMBINE_DATA(&m_spriteram[offset]);
COMBINE_DATA(&m_spriteram->live()[offset]);
}
READ16_MEMBER(kaneko16_berlwall_state::berlwall_spriteregs_r)
u16 kaneko16_berlwall_state::berlwall_spriteregs_r(offs_t offset)
{
if (offset & 0x4)
return 0;
@ -261,7 +261,7 @@ READ16_MEMBER(kaneko16_berlwall_state::berlwall_spriteregs_r)
return m_kaneko_spr->regs_r(offset);
}
WRITE16_MEMBER(kaneko16_berlwall_state::berlwall_spriteregs_w)
void kaneko16_berlwall_state::berlwall_spriteregs_w(offs_t offset, u16 data, u16 mem_mask)
{
if (offset & 0x4)
return;
@ -461,7 +461,7 @@ void kaneko16_gtmr_state::gtmr_map(address_map &map)
map(0x300000, 0x30ffff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); // Palette
map(0x310000, 0x327fff).ram(); //
map(0x400000, 0x401fff).ram().share(m_spriteram); // Sprites
map(0x400000, 0x401fff).ram().share("spriteram"); // Sprites
map(0x500000, 0x503fff).m(m_view2[0], FUNC(kaneko_view2_tilemap_device::vram_map));
map(0x580000, 0x583fff).m(m_view2[1], FUNC(kaneko_view2_tilemap_device::vram_map));
@ -531,7 +531,7 @@ void kaneko16_gtmr_state::gtmr2_map(address_map &map)
map(0x300000, 0x30ffff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); // Palette
map(0x310000, 0x327fff).ram(); //
map(0x400000, 0x401fff).ram().share(m_spriteram); // Sprites
map(0x400000, 0x401fff).ram().share("spriteram"); // Sprites
map(0x500000, 0x503fff).m(m_view2[0], FUNC(kaneko_view2_tilemap_device::vram_map));
map(0x580000, 0x583fff).m(m_view2[1], FUNC(kaneko_view2_tilemap_device::vram_map));
@ -1655,15 +1655,18 @@ TIMER_DEVICE_CALLBACK_MEMBER(kaneko16_state::interrupt)
int scanline = param;
// main vblank interrupt
if(scanline == 224)
if (scanline == 224)
{
m_spriteram->copy();
m_maincpu->set_input_line(5, HOLD_LINE);
}
// each of these 2 int are responsible of translating a part of sprite buffer
// from work ram to sprite ram. How these are scheduled is unknown.
if(scanline == 64)
if (scanline == 64)
m_maincpu->set_input_line(4, HOLD_LINE);
if(scanline == 144)
if (scanline == 144)
m_maincpu->set_input_line(3, HOLD_LINE);
}
@ -1690,8 +1693,9 @@ void kaneko16_berlwall_state::berlwall(machine_config &config)
WATCHDOG_TIMER(config, m_watchdog);
/* video hardware */
BUFFERED_SPRITERAM16(config, m_spriteram);
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
// m_screen->set_video_attributes(VIDEO_UPDATE_AFTER_VBLANK); // mangled sprites otherwise
m_screen->set_refresh_hz(60);
m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
m_screen->set_size(256, 256);
@ -1751,8 +1755,9 @@ void kaneko16_state::bakubrkr(machine_config &config)
WATCHDOG_TIMER(config, m_watchdog);
/* video hardware */
BUFFERED_SPRITERAM16(config, m_spriteram);
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_video_attributes(VIDEO_UPDATE_AFTER_VBLANK); // mangled sprites otherwise
m_screen->set_refresh_hz(59);
m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
m_screen->set_size(256, 256);
@ -1820,8 +1825,9 @@ void kaneko16_state::blazeon(machine_config &config)
m_audiocpu->set_addrmap(AS_IO, &kaneko16_state::blazeon_soundport);
/* video hardware */
BUFFERED_SPRITERAM16(config, m_spriteram);
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_video_attributes(VIDEO_UPDATE_AFTER_VBLANK);
m_screen->set_refresh_hz(60);
m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
m_screen->set_size(320, 240);
@ -1873,8 +1879,9 @@ void kaneko16_state::wingforc(machine_config &config)
m_audiocpu->set_addrmap(AS_IO, &kaneko16_state::wingforc_soundport);
/* video hardware */
BUFFERED_SPRITERAM16(config, m_spriteram);
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_video_attributes(VIDEO_UPDATE_AFTER_VBLANK);
m_screen->set_refresh_hz(59.1854);
m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
m_screen->set_size(320, 240);
@ -1951,8 +1958,9 @@ void kaneko16_gtmr_state::gtmr(machine_config &config)
WATCHDOG_TIMER(config, m_watchdog);
/* video hardware */
BUFFERED_SPRITERAM16(config, m_spriteram);
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_video_attributes(VIDEO_UPDATE_AFTER_VBLANK);
m_screen->set_refresh_hz(60);
m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
m_screen->set_size(320, 240);
@ -2062,8 +2070,9 @@ void kaneko16_state::mgcrystl(machine_config &config)
WATCHDOG_TIMER(config, m_watchdog);
/* video hardware */
BUFFERED_SPRITERAM16(config, m_spriteram);
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_video_attributes(VIDEO_UPDATE_AFTER_VBLANK);
m_screen->set_refresh_hz(60);
m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
m_screen->set_size(256, 256);
@ -2126,16 +2135,17 @@ TIMER_DEVICE_CALLBACK_MEMBER(kaneko16_shogwarr_state::shogwarr_interrupt)
{
int scanline = param;
if(scanline == 224)
if (scanline == 224)
{
m_spriteram->copy(); // TODO : shogwarr sprites are 1 frame delayed? reference : https://youtu.be/aj4ayOc4MuI
// the code for this interrupt is provided by the MCU..
m_maincpu->set_input_line(4, HOLD_LINE);
}
if(scanline == 64)
if (scanline == 64)
m_maincpu->set_input_line(3, HOLD_LINE);
if(scanline == 144)
if (scanline == 144)
m_maincpu->set_input_line(2, HOLD_LINE);
}
@ -2178,6 +2188,8 @@ void kaneko16_shogwarr_state::shogwarr(machine_config &config)
WATCHDOG_TIMER(config, m_watchdog);
/* video hardware */
BUFFERED_SPRITERAM16(config, m_spriteram);
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_refresh_hz(59.1854);
m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
@ -2185,7 +2197,6 @@ void kaneko16_shogwarr_state::shogwarr(machine_config &config)
m_screen->set_visarea(40, 296-1, 16, 240-1);
m_screen->set_screen_update(FUNC(kaneko16_shogwarr_state::screen_update));
m_screen->set_palette(m_palette);
m_screen->set_video_attributes(VIDEO_UPDATE_AFTER_VBLANK);
PALETTE(config, m_palette).set_format(palette_device::xGRB_555, 2048);

View File

@ -23,6 +23,7 @@
#include "sound/ay8910.h"
#include "sound/okim6295.h"
#include "sound/ym2151.h"
#include "video/bufsprite.h"
#include "video/kaneko_spr.h"
#include "video/kaneko_tmap.h"
#include "emupal.h"
@ -47,8 +48,8 @@ public:
m_eeprom(*this, "eeprom"),
m_soundlatch(*this, "soundlatch"),
m_watchdog(*this, "watchdog"),
m_mainregion(*this, "maincpu"),
m_spriteram(*this, "spriteram"),
m_mainregion(*this, "maincpu"),
m_mainram(*this, "mainram"),
m_mcuram(*this, "mcuram"),
m_okiregion(*this, "oki%u", 1),
@ -85,9 +86,9 @@ protected:
optional_device<eeprom_serial_93cxx_device> m_eeprom;
optional_device<generic_latch_8_device> m_soundlatch;
optional_device<watchdog_timer_device> m_watchdog;
optional_device<buffered_spriteram16_device> m_spriteram;
required_region_ptr<u16> m_mainregion;
optional_shared_ptr<u16> m_spriteram;
optional_shared_ptr<u16> m_mainram;
optional_shared_ptr<u16> m_mcuram;
@ -108,10 +109,10 @@ protected:
void coin_lockout_w(u8 data);
void bloodwar_coin_lockout_w(u8 data);
void display_enable_w(offs_t offset, u16 data, u16 mem_mask); // (u16 data, u16 mem_mask);
void display_enable_w(offs_t offset, u16 data, u16 mem_mask = ~0); // (u16 data, u16 mem_mask = ~0);
template<unsigned Chip> DECLARE_READ16_MEMBER(ym2149_r);
template<unsigned Chip> DECLARE_WRITE16_MEMBER(ym2149_w);
template<unsigned Chip> u16 ym2149_r(offs_t offset);
template<unsigned Chip> void ym2149_w(offs_t offset, u16 data, u16 mem_mask = ~0);
template<unsigned Mask> void oki_bank0_w(u8 data);
template<unsigned Mask> void oki_bank1_w(u8 data);
@ -207,12 +208,12 @@ private:
u8 bg15_bright_r();
void bg15_bright_w(u8 data);
DECLARE_WRITE16_MEMBER(berlwall_oki_w);
void berlwall_oki_w(offs_t offset, u16 data, u16 mem_mask = ~0);
u16 berlwall_spriteram_r(offs_t offset);
void berlwall_spriteram_w(offs_t offset, u16 data, u16 mem_mask);
DECLARE_READ16_MEMBER(berlwall_spriteregs_r);
DECLARE_WRITE16_MEMBER(berlwall_spriteregs_w);
void berlwall_spriteram_w(offs_t offset, u16 data, u16 mem_mask = ~0);
u16 berlwall_spriteregs_r(offs_t offset);
void berlwall_spriteregs_w(offs_t offset, u16 data, u16 mem_mask = ~0);
u8 m_bg15_select;
u8 m_bg15_bright;

View File

@ -83,7 +83,7 @@ u32 kaneko16_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, c
if (!m_disp_enable) return 0;
screen_update_common(screen, bitmap, cliprect);
m_kaneko_spr->render_sprites(bitmap,cliprect, screen.priority(), m_spriteram, m_spriteram.bytes());
m_kaneko_spr->render_sprites(bitmap,cliprect, screen.priority(), m_spriteram->buffer(), m_spriteram->bytes());
return 0;
}
@ -229,6 +229,6 @@ u32 kaneko16_berlwall_state::screen_update(screen_device &screen, bitmap_rgb32 &
if (!m_disp_enable) return 0;
screen_update_common(screen, bitmap, cliprect);
m_kaneko_spr->render_sprites(bitmap,cliprect, screen.priority(), m_spriteram, m_spriteram.bytes()/2);
m_kaneko_spr->render_sprites(bitmap,cliprect, screen.priority(), m_spriteram->buffer(), m_spriteram->bytes()/2);
return 0;
}