From 7083b885691589853e6b268a9defbedaf8aea51a Mon Sep 17 00:00:00 2001 From: hap Date: Wed, 24 Aug 2022 23:22:21 +0200 Subject: [PATCH] senjyo: improve dac sound --- src/mame/tecmo/senjyo.cpp | 73 +++++++++++++++++++------------------ src/mame/tecmo/senjyo.h | 27 ++++++++------ src/mame/tecmo/senjyo_a.cpp | 26 ------------- 3 files changed, 54 insertions(+), 72 deletions(-) delete mode 100644 src/mame/tecmo/senjyo_a.cpp diff --git a/src/mame/tecmo/senjyo.cpp b/src/mame/tecmo/senjyo.cpp index 998d8b87730..9c602f6df64 100644 --- a/src/mame/tecmo/senjyo.cpp +++ b/src/mame/tecmo/senjyo.cpp @@ -63,7 +63,7 @@ write 9000 sound chip channel 2 1st 9f,bf,df,ff a000 sound chip channel 3 1st 9f,bf,df,ff d000 bit 0-3 single sound volume ( freq = ctc2 ) -e000 ? ( initialize only ) +e000 assume DAC enable (senjyo attract mode) f000 ? ( initialize only ) I/O read/write @@ -78,8 +78,6 @@ I/O read/write ***************************************************************************/ -/* 26.February 2012 Tsuyoshi Hasegawa fixed palette intensity */ - #include "emu.h" #include "senjyo.h" @@ -93,16 +91,7 @@ I/O read/write void senjyo_state::machine_start() { - save_item(NAME(m_sound_cmd)); - save_item(NAME(m_single_volume)); - save_item(NAME(m_sound_state)); -} - -void senjyo_state::machine_reset() -{ - m_sound_cmd = 0; - m_single_volume = 0; - m_sound_state = 0; + save_item(NAME(m_dac_clock)); } void senjyo_state::irq_ctrl_w(uint8_t data) @@ -116,12 +105,21 @@ void senjyo_state::flip_screen_w(uint8_t data) flip_screen_set(data); } -void senjyo_state::sound_cmd_w(uint8_t data) +WRITE_LINE_MEMBER(senjyo_state::dac_clock_w) { - m_sound_cmd = data; + if (state) + m_dac->write(m_dac_prom->base()[m_dac_clock++ & 0xf]); +} - m_pio->strobe_a(0); - m_pio->strobe_a(1); +void senjyo_state::dac_volume_w(uint8_t data) +{ + m_volume->flt_volume_set_volume((data & 0xf) / 15.0); +} + +void senjyo_state::dac_enable_w(uint8_t data) +{ + // it writes 0xff or 0x00 + m_dac->set_output_gain(0, (data & 1) ? 1.0 : 0.0); } void senjyo_state::senjyo_map(address_map &map) @@ -159,7 +157,7 @@ void senjyo_state::senjyo_map(address_map &map) map(0xd001, 0xd001).portr("P2"); map(0xd002, 0xd002).portr("SYSTEM").w(FUNC(senjyo_state::irq_ctrl_w)); map(0xd003, 0xd003).nopr(); // debug cheat port? (i.e. bit 0 in starforc: invincibility, bit 3-0 in senyjo: disables enemy fire) - map(0xd004, 0xd004).portr("DSW1").w(FUNC(senjyo_state::sound_cmd_w)); + map(0xd004, 0xd004).portr("DSW1").w(m_soundlatch, FUNC(generic_latch_8_device::write)); map(0xd005, 0xd005).portr("DSW2"); } @@ -175,7 +173,8 @@ void senjyo_state::senjyo_sound_map(address_map &map) map(0x8000, 0x8000).w("sn1", FUNC(sn76496_device::write)); map(0x9000, 0x9000).w("sn2", FUNC(sn76496_device::write)); map(0xa000, 0xa000).w("sn3", FUNC(sn76496_device::write)); - map(0xd000, 0xd000).w(FUNC(senjyo_state::volume_w)); + map(0xd000, 0xd000).w(FUNC(senjyo_state::dac_volume_w)); + map(0xe000, 0xe000).w(FUNC(senjyo_state::dac_enable_w)); } void senjyo_state::senjyo_sound_io_map(address_map &map) @@ -222,7 +221,8 @@ void senjyo_state::starforb_map(address_map &map) map(0xd000, 0xd000).portr("P1").w(FUNC(senjyo_state::flip_screen_w)); map(0xd001, 0xd001).portr("P2"); map(0xd002, 0xd002).portr("SYSTEM").w(FUNC(senjyo_state::irq_ctrl_w)); - map(0xd004, 0xd004).portr("DSW1").w(FUNC(senjyo_state::sound_cmd_w)); + map(0xd003, 0xd003).nopr(); + map(0xd004, 0xd004).portr("DSW1").w(m_soundlatch, FUNC(generic_latch_8_device::write)); map(0xd005, 0xd005).portr("DSW2"); /* these aren't used / written, left here to make sure memory is allocated */ @@ -240,7 +240,8 @@ void senjyo_state::starforb_sound_map(address_map &map) map(0x8000, 0x8000).w("sn1", FUNC(sn76496_device::write)); map(0x9000, 0x9000).w("sn2", FUNC(sn76496_device::write)); map(0xa000, 0xa000).w("sn3", FUNC(sn76496_device::write)); - map(0xd000, 0xd000).w(FUNC(senjyo_state::volume_w)); + map(0xd000, 0xd000).w(FUNC(senjyo_state::dac_volume_w)); + map(0xe000, 0xe000).w(FUNC(senjyo_state::dac_enable_w)); map(0xf000, 0xffff).ram(); } @@ -398,7 +399,7 @@ static INPUT_PORTS_START( starforc ) PORT_DIPSETTING( 0x18, DEF_STR( Difficult ) ) PORT_DIPSETTING( 0x20, DEF_STR( Hard ) ) PORT_DIPSETTING( 0x28, DEF_STR( Hardest ) ) - /* 0x30 and x038 are unused */ + /* 0x30 and 0x38 are unused */ PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unknown ) ) PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x40, DEF_STR( On ) ) @@ -576,12 +577,12 @@ void senjyo_state::senjyo(machine_config &config) Z80PIO(config, m_pio, 2000000); m_pio->out_int_callback().set_inputline("sub", INPUT_LINE_IRQ0); - m_pio->in_pa_callback().set(FUNC(senjyo_state::pio_pa_r)); + m_pio->in_pa_callback().set(m_soundlatch, FUNC(generic_latch_8_device::read)); z80ctc_device& ctc(Z80CTC(config, "z80ctc", 2000000 /* same as "sub" */)); ctc.intr_callback().set_inputline("sub", INPUT_LINE_IRQ0); ctc.zc_callback<0>().set("z80ctc", FUNC(z80ctc_device::trg1)); - ctc.zc_callback<2>().set(FUNC(senjyo_state::sound_line_clock)); + ctc.zc_callback<2>().set(FUNC(senjyo_state::dac_clock_w)); /* video hardware */ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); @@ -600,12 +601,14 @@ void senjyo_state::senjyo(machine_config &config) SPEAKER(config, "speaker").front_center(); SN76496(config, "sn1", 2000000).add_route(ALL_OUTPUTS, "speaker", 0.5); - SN76496(config, "sn2", 2000000).add_route(ALL_OUTPUTS, "speaker", 0.5); - SN76496(config, "sn3", 2000000).add_route(ALL_OUTPUTS, "speaker", 0.5); - DAC_4BIT_R2R(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.05); // unknown DAC + GENERIC_LATCH_8(config, m_soundlatch); + m_soundlatch->data_pending_callback().set(m_pio, FUNC(z80pio_device::strobe_a)).invert(); + + DAC_8BIT_R2R(config, m_dac).add_route(ALL_OUTPUTS, "volume", 0.05); + FILTER_VOLUME(config, m_volume).add_route(ALL_OUTPUTS, "speaker", 1.0); } @@ -685,7 +688,7 @@ ROM_START( senjyo ) ROM_LOAD( "08j_09b.bin", 0x08000, 0x2000, CRC(1ee63b5c) SHA1(14dea762446cc3c0d4e407dc1e68c2010999fd58) ) ROM_LOAD( "08k_10b.bin", 0x0a000, 0x2000, CRC(a9f41ec9) SHA1(c24f9d54593e764a0b4530b1a2550b999916992c) ) - ROM_REGION( 0x0020, "proms", 0 ) /* PROMs */ + ROM_REGION( 0x0020, "dac", 0 ) ROM_LOAD( "07b.bin", 0x0000, 0x0020, CRC(68db8300) SHA1(33cd6b5ed92d7b73a708f2e4b12b6e7f6496d0c6) ) /* waveform */ ROM_END @@ -722,7 +725,7 @@ ROM_START( starforc ) ROM_LOAD( "5.9lm", 0x04000, 0x4000, CRC(f71717f8) SHA1(bf673571f772d8e0eddae89c00f31390c49a25d2) ) ROM_LOAD( "4.8lm", 0x08000, 0x4000, CRC(dd9d68a4) SHA1(34c60d2b34c7980bf65a5ebadb9c73f89128141f) ) - ROM_REGION( 0x0020, "proms", 0 ) /* PROMs */ + ROM_REGION( 0x0020, "dac", 0 ) ROM_LOAD( "07b.bin", 0x0000, 0x0020, CRC(68db8300) SHA1(33cd6b5ed92d7b73a708f2e4b12b6e7f6496d0c6) ) /* waveform */ ROM_END @@ -764,7 +767,7 @@ ROM_START( starforcb ) ROM_LOAD( "b9.8j", 0x08000, 0x2000, CRC(e7d51959) SHA1(34d9afb0f31dc1d02e7b85aa69345fc66cf0f554) ) ROM_LOAD( "b10.8l", 0x0a000, 0x2000, CRC(6ea27bec) SHA1(30da81a99d5920107751afda359576e426c497c4) ) - ROM_REGION( 0x0020, "proms", 0 ) /* PROMs */ + ROM_REGION( 0x0020, "dac", 0 ) ROM_LOAD( "a18s030.7b", 0x0000, 0x0020, CRC(68db8300) SHA1(33cd6b5ed92d7b73a708f2e4b12b6e7f6496d0c6) ) /* waveform */ ROM_END @@ -806,7 +809,7 @@ ROM_START( starforca ) ROM_LOAD( "9.bin", 0x08000, 0x2000, CRC(e7d51959) SHA1(34d9afb0f31dc1d02e7b85aa69345fc66cf0f554) ) ROM_LOAD( "10.bin", 0x0a000, 0x2000, CRC(6ea27bec) SHA1(30da81a99d5920107751afda359576e426c497c4) ) - ROM_REGION( 0x0020, "proms", 0 ) /* PROMs */ + ROM_REGION( 0x0020, "dac", 0 ) ROM_LOAD( "prom.bin", 0x0000, 0x0020, CRC(68db8300) SHA1(33cd6b5ed92d7b73a708f2e4b12b6e7f6496d0c6) ) /* waveform */ ROM_END @@ -845,7 +848,7 @@ ROM_START( starforce ) ROM_LOAD( "5.9lm", 0x04000, 0x4000, CRC(f71717f8) SHA1(bf673571f772d8e0eddae89c00f31390c49a25d2) ) ROM_LOAD( "4.8lm", 0x08000, 0x4000, CRC(dd9d68a4) SHA1(34c60d2b34c7980bf65a5ebadb9c73f89128141f) ) - ROM_REGION( 0x0020, "proms", 0 ) /* PROMs */ + ROM_REGION( 0x0020, "dac", 0 ) ROM_LOAD( "07b.bin", 0x0000, 0x0020, CRC(68db8300) SHA1(33cd6b5ed92d7b73a708f2e4b12b6e7f6496d0c6) ) /* waveform */ ROM_END @@ -882,7 +885,7 @@ ROM_START( megaforc ) ROM_LOAD( "5.9lm", 0x04000, 0x4000, CRC(f71717f8) SHA1(bf673571f772d8e0eddae89c00f31390c49a25d2) ) ROM_LOAD( "4.8lm", 0x08000, 0x4000, CRC(dd9d68a4) SHA1(34c60d2b34c7980bf65a5ebadb9c73f89128141f) ) - ROM_REGION( 0x0020, "proms", 0 ) /* PROMs */ + ROM_REGION( 0x0020, "dac", 0 ) ROM_LOAD( "07b.bin", 0x0000, 0x0020, CRC(68db8300) SHA1(33cd6b5ed92d7b73a708f2e4b12b6e7f6496d0c6) ) /* waveform */ ROM_END @@ -919,7 +922,7 @@ ROM_START( megaforcu ) /* While no "For use in the United States" notice, it's l ROM_LOAD( "5.9lm", 0x04000, 0x4000, CRC(f71717f8) SHA1(bf673571f772d8e0eddae89c00f31390c49a25d2) ) ROM_LOAD( "4.8lm", 0x08000, 0x4000, CRC(dd9d68a4) SHA1(34c60d2b34c7980bf65a5ebadb9c73f89128141f) ) - ROM_REGION( 0x0020, "proms", 0 ) /* PROMs */ + ROM_REGION( 0x0020, "dac", 0 ) ROM_LOAD( "07b.bin", 0x0000, 0x0020, CRC(68db8300) SHA1(33cd6b5ed92d7b73a708f2e4b12b6e7f6496d0c6) ) /* waveform */ ROM_END @@ -956,7 +959,7 @@ ROM_START( baluba ) ROM_LOAD( "4", 0x04000, 0x4000, CRC(dd954124) SHA1(f37687197d1564331dc27dace23dec462d02202c) ) ROM_LOAD( "3", 0x08000, 0x4000, CRC(7ac24983) SHA1(4ac32d95af3147af5b9b1af1f292bb629c5d4fb9) ) - ROM_REGION( 0x0020, "proms", 0 ) /* PROMs */ + ROM_REGION( 0x0020, "dac", 0 ) ROM_LOAD( "07b.bin", 0x0000, 0x0020, CRC(68db8300) SHA1(33cd6b5ed92d7b73a708f2e4b12b6e7f6496d0c6) ) /* waveform */ ROM_END diff --git a/src/mame/tecmo/senjyo.h b/src/mame/tecmo/senjyo.h index 659dc6a715f..f174eac36ac 100644 --- a/src/mame/tecmo/senjyo.h +++ b/src/mame/tecmo/senjyo.h @@ -5,10 +5,13 @@ #pragma once -#include "sound/dac.h" +#include "machine/gen_latch.h" #include "machine/z80daisy.h" -#include "machine/z80pio.h" #include "machine/z80ctc.h" +#include "machine/z80pio.h" +#include "sound/dac.h" +#include "sound/flt_vol.h" + #include "emupal.h" #include "tilemap.h" @@ -20,6 +23,9 @@ public: m_maincpu(*this, "maincpu"), m_pio(*this, "z80pio"), m_dac(*this, "dac"), + m_dac_prom(*this, "dac"), + m_volume(*this, "volume"), + m_soundlatch(*this, "soundlatch"), m_gfxdecode(*this, "gfxdecode"), m_palette(*this, "palette"), m_radar_palette(*this, "radar_palette"), @@ -53,14 +59,16 @@ public: protected: virtual void machine_start() override; - virtual void machine_reset() override; virtual void video_start() override; private: /* devices */ required_device m_maincpu; required_device m_pio; - required_device m_dac; + required_device m_dac; + required_memory_region m_dac_prom; + required_device m_volume; + required_device m_soundlatch; required_device m_gfxdecode; required_device m_palette; required_device m_radar_palette; @@ -87,9 +95,7 @@ private: int m_is_senjyo = 0; int m_scrollhack = 0; - uint8_t m_sound_cmd = 0; - int m_single_volume = 0; - int m_sound_state = 0; + int m_dac_clock = 0; tilemap_t *m_fg_tilemap = nullptr; tilemap_t *m_bg1_tilemap = nullptr; tilemap_t *m_bg2_tilemap = nullptr; @@ -103,11 +109,10 @@ private: void bg1videoram_w(offs_t offset, uint8_t data); void bg2videoram_w(offs_t offset, uint8_t data); void bg3videoram_w(offs_t offset, uint8_t data); - void volume_w(uint8_t data); - DECLARE_WRITE_LINE_MEMBER(sound_line_clock); - void sound_cmd_w(uint8_t data); + void dac_volume_w(uint8_t data); + void dac_enable_w(uint8_t data); + DECLARE_WRITE_LINE_MEMBER(dac_clock_w); void irq_ctrl_w(uint8_t data); - uint8_t pio_pa_r(); static rgb_t IIBBGGRR(uint32_t raw); void radar_palette(palette_device &palette) const; diff --git a/src/mame/tecmo/senjyo_a.cpp b/src/mame/tecmo/senjyo_a.cpp deleted file mode 100644 index d387fd2e304..00000000000 --- a/src/mame/tecmo/senjyo_a.cpp +++ /dev/null @@ -1,26 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Mirko Buffoni -#include "emu.h" -#include "senjyo.h" - - -/* z80 pio */ - -uint8_t senjyo_state::pio_pa_r() -{ - return m_sound_cmd; -} - -WRITE_LINE_MEMBER(senjyo_state::sound_line_clock) -{ - if (state != 0) - { - m_dac->write((m_sound_state & 8) ? m_single_volume : 0); - m_sound_state++; - } -} - -void senjyo_state::volume_w(uint8_t data) -{ - m_single_volume = data & 0x0f; -}