shared/decobsmt.cpp: Implement device_mixer_interface for sound output. (#12266)

* Also removed root device references in tags and added data members to save states.
* dataeast/deco32.cpp: Moved tattass to its own state class, use C++ line comments for singleline comments.
* pinball/de_3.cpp, pinball/whitestar.cpp: Use C++ line comments for single line comments.
This commit is contained in:
cam900 2024-04-18 02:38:05 +09:00 committed by GitHub
parent 4aabcb5c73
commit 9dabdeb086
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 1182 additions and 1129 deletions

File diff suppressed because it is too large Load Diff

View File

@ -39,7 +39,6 @@ public:
, m_screen(*this, "screen")
, m_palette(*this, "palette")
, m_deco_irq(*this, "irq")
, m_decobsmt(*this, "decobsmt")
, m_eeprom(*this, "eeprom")
, m_ioprot(*this, "ioprot")
, m_ym2151(*this, "ymsnd")
@ -85,7 +84,6 @@ protected:
required_device<screen_device> m_screen;
optional_device<palette_device> m_palette;
optional_device<deco_irq_device> m_deco_irq;
optional_device<decobsmt_device> m_decobsmt;
optional_device<eeprom_serial_93cxx_device> m_eeprom;
required_device<deco_146_base_device> m_ioprot;
optional_device<ym2151_device> m_ym2151;
@ -123,13 +121,14 @@ public:
void init_captaven();
protected:
virtual void video_start() override;
private:
required_ioport_array<3> m_io_dsw;
u32 _71_r();
u8 captaven_soundcpu_status_r();
virtual void video_start() override;
u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void tile_callback(u32 &tile, u32 &colour, int layer, bool is_8x8);
@ -153,13 +152,14 @@ public:
void init_fghthist();
protected:
virtual void video_start() override;
private:
required_ioport_array<2> m_io_in;
// void sound_w(u32 data);
u32 unk_status_r();
virtual void video_start() override;
u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
DECO16IC_BANK_CB_MEMBER(bank_callback);
@ -170,7 +170,7 @@ private:
private:
};
// nslasher, tattass
// nslasher
class nslasher_state : public deco32_state
{
public:
@ -180,38 +180,58 @@ public:
{ }
void nslasheru(machine_config &config);
void tattass(machine_config &config);
void nslasher(machine_config &config);
void init_tattass();
void init_nslasher();
private:
protected:
virtual void video_start() override;
required_device<deco_ace_device> m_deco_ace;
void tilemap_color_bank_w(u8 data);
void sprite1_color_bank_w(u8 data);
void sprite2_color_bank_w(u8 data);
void tattass_control_w(offs_t offset, u32 data, u32 mem_mask = ~0);
void tattass_sound_irq_w(int state);
u16 nslasher_debug_r();
virtual void video_start() override;
u32 screen_update_nslasher(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
u32 screen_update_tattass(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
u16 port_b_tattass();
DECO16IC_BANK_CB_MEMBER(bank_callback);
u16 mix_callback(u16 p, u16 p2);
void nslasher_map(address_map &map);
void tattass_map(address_map &map);
void mix_nslasher(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, gfx_element *gfx0, gfx_element *gfx1, int mixAlphaTilemap);
void mix_tattass(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, gfx_element *gfx0, gfx_element *gfx1, int mixAlphaTilemap);
std::unique_ptr<bitmap_ind16> m_tilemap_alpha_bitmap;
};
// tattass
class tattass_state : public nslasher_state
{
public:
tattass_state(const machine_config &mconfig, device_type type, const char *tag)
: nslasher_state(mconfig, type, tag)
, m_decobsmt(*this, "decobsmt")
{ }
void tattass(machine_config &config);
void init_tattass();
private:
required_device<decobsmt_device> m_decobsmt;
void tattass_control_w(offs_t offset, u32 data, u32 mem_mask = ~0);
void tattass_sound_irq_w(int state);
u32 screen_update_tattass(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
u16 port_b_tattass();
void tattass_map(address_map &map);
void mix_tattass(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, gfx_element *gfx0, gfx_element *gfx1, int mixAlphaTilemap);
int m_tattass_eprom_bit = 0;
int m_last_clock = 0;
@ -251,6 +271,9 @@ public:
DECLARE_INPUT_CHANGED_MEMBER(lockload_gun_trigger);
protected:
virtual void video_start() override;
private:
required_device<namco_c355spr_device> m_sprgenzoom;
required_device<buffered_spriteram32_device> m_spriteram;
@ -289,8 +312,6 @@ private:
void lockload_okibank_lo_w(u8 data);
void lockload_okibank_hi_w(u8 data); // lockload
virtual void video_start() override;
int sprite_bank_callback(int sprite);
u16 read_spritetile(int lookupram_offset);
u16 read_spriteformat(int spriteformatram_offset, u8 attr);

View File

@ -509,7 +509,7 @@ u32 nslasher_state::screen_update_nslasher(screen_device &screen, bitmap_rgb32 &
// different alpha blending behavior, priority? TODO : verify behavior from real hardware
// reference : https://www.youtube.com/watch?v=ax-_P3meUiA (review)
void nslasher_state::mix_tattass(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, gfx_element *gfx0, gfx_element *gfx1, int mixAlphaTilemap)
void tattass_state::mix_tattass(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect, gfx_element *gfx0, gfx_element *gfx1, int mixAlphaTilemap)
{
const pen_t *pens = m_deco_ace->pens();
const pen_t *pal0 = &pens[gfx0->colorbase()];
@ -649,7 +649,7 @@ void nslasher_state::mix_tattass(screen_device &screen, bitmap_rgb32 &bitmap, co
}
}
u32 nslasher_state::screen_update_tattass(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
u32 tattass_state::screen_update_tattass(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
bool alphaTilemap = false;
m_deco_tilegen[0]->pf_update(m_pf_rowscroll[0].get(), m_pf_rowscroll[1].get());

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -13,13 +13,10 @@
#include "decobsmt.h"
#include "speaker.h"
#define M6809_TAG "soundcpu"
#define BSMT_TAG "bsmt"
void decobsmt_device::decobsmt_map(address_map &map)
{
map(0x0000, 0x1fff).ram();
map(0x2000, 0xffff).rom().region(":soundcpu", 0x2000);
map(0x2000, 0xffff).rom().region("soundcpu", 0x2000);
map(0x2000, 0x2001).w(FUNC(decobsmt_device::bsmt_reset_w));
map(0x2002, 0x2003).r(FUNC(decobsmt_device::bsmt_comms_r));
map(0x2006, 0x2007).r(FUNC(decobsmt_device::bsmt_status_r));
@ -29,12 +26,12 @@ void decobsmt_device::decobsmt_map(address_map &map)
void decobsmt_device::bsmt_map(address_map &map)
{
map(0x000000, 0xffffff).rom().region(":bsmt", 0);
map(0x000000, 0xffffff).rom().region("bsmt", 0);
}
void decobsmt_device::bsmt_ready_callback()
{
m_ourcpu->set_input_line(M6809_IRQ_LINE, ASSERT_LINE); /* BSMT is ready */
m_ourcpu->set_input_line(M6809_IRQ_LINE, ASSERT_LINE); // BSMT is ready
}
//**************************************************************************
@ -52,15 +49,13 @@ void decobsmt_device::device_add_mconfig(machine_config &config)
{
MC6809E(config, m_ourcpu, XTAL(24'000'000) / 12); // 68B09E U6 (E & Q = 2 MHz according to manual)
m_ourcpu->set_addrmap(AS_PROGRAM, &decobsmt_device::decobsmt_map);
m_ourcpu->set_periodic_int(FUNC(decobsmt_device::decobsmt_firq_interrupt), attotime::from_hz(489)); /* Fixed FIRQ of 489Hz as measured on real (pinball) machine */
m_ourcpu->set_periodic_int(FUNC(decobsmt_device::decobsmt_firq_interrupt), attotime::from_hz(489)); // Fixed FIRQ of 489Hz as measured on real (pinball) machine
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
BSMT2000(config, m_bsmt, XTAL(24'000'000));
m_bsmt->set_addrmap(0, &decobsmt_device::bsmt_map);
m_bsmt->set_ready_callback(FUNC(decobsmt_device::bsmt_ready_callback));
m_bsmt->add_route(0, "lspeaker", 1.0);
m_bsmt->add_route(1, "rspeaker", 1.0);
m_bsmt->add_route(0, *this, 1.0, AUTO_ALLOC_INPUT, 0);
m_bsmt->add_route(1, *this, 1.0, AUTO_ALLOC_INPUT, 1);
}
//**************************************************************************
@ -73,8 +68,12 @@ void decobsmt_device::device_add_mconfig(machine_config &config)
decobsmt_device::decobsmt_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, DECOBSMT, tag, owner, clock)
, m_ourcpu(*this, M6809_TAG)
, m_bsmt(*this, BSMT_TAG)
, device_mixer_interface(mconfig, *this, 2)
, m_ourcpu(*this, "soundcpu")
, m_bsmt(*this, "bsmt")
, m_bsmt_latch(0)
, m_bsmt_reset(0)
, m_bsmt_comms(0)
{
}
@ -84,6 +83,9 @@ decobsmt_device::decobsmt_device(const machine_config &mconfig, const char *tag,
void decobsmt_device::device_start()
{
save_item(NAME(m_bsmt_latch));
save_item(NAME(m_bsmt_reset));
save_item(NAME(m_bsmt_comms));
}
//-------------------------------------------------
@ -99,7 +101,7 @@ void decobsmt_device::device_reset()
void decobsmt_device::bsmt_reset_w(u8 data)
{
uint8_t diff = data ^ m_bsmt_reset;
uint8_t const diff = data ^ m_bsmt_reset;
m_bsmt_reset = data;
if ((diff & 0x80) && !(data & 0x80))
m_bsmt->reset();
@ -114,7 +116,7 @@ void decobsmt_device::bsmt1_w(offs_t offset, u8 data)
{
m_bsmt->write_reg(offset ^ 0xff);
m_bsmt->write_data((m_bsmt_latch << 8) | data);
m_ourcpu->set_input_line(M6809_IRQ_LINE, CLEAR_LINE); /* BSMT is not ready */
m_ourcpu->set_input_line(M6809_IRQ_LINE, CLEAR_LINE); // BSMT is not ready
}
u8 decobsmt_device::bsmt_status_r()

View File

@ -8,47 +8,47 @@
#include "cpu/m6809/m6809.h"
#include "sound/bsmt2000.h"
#define DECOBSMT_TAG "decobsmt"
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
class decobsmt_device : public device_t
class decobsmt_device : public device_t, public device_mixer_interface
{
public:
// construction/destruction
decobsmt_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
void bsmt_reset_w(u8 data);
u8 bsmt_status_r();
void bsmt0_w(u8 data);
void bsmt1_w(offs_t offset, u8 data);
u8 bsmt_comms_r();
void bsmt_comms_w(u8 data);
void bsmt_reset_line(int state);
void bsmt_map(address_map &map);
void decobsmt_map(address_map &map);
protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
virtual void device_add_mconfig(machine_config &config) override;
// device_t implementation
virtual void device_start() override ATTR_COLD;
virtual void device_reset() override ATTR_COLD;
virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
private:
required_device<cpu_device> m_ourcpu;
required_device<bsmt2000_device> m_bsmt;
uint8_t m_bsmt_latch = 0;
uint8_t m_bsmt_reset = 0;
uint8_t m_bsmt_comms = 0;
uint8_t m_bsmt_latch;
uint8_t m_bsmt_reset;
uint8_t m_bsmt_comms;
INTERRUPT_GEN_MEMBER(decobsmt_firq_interrupt);
void bsmt_reset_w(u8 data);
u8 bsmt_status_r();
void bsmt0_w(u8 data);
void bsmt1_w(offs_t offset, u8 data);
void bsmt_ready_callback();
void bsmt_map(address_map &map) ATTR_COLD;
void decobsmt_map(address_map &map) ATTR_COLD;
};