mirror of
https://github.com/holub/mame
synced 2025-04-22 00:11:58 +03:00
senjyo: improve dac sound
This commit is contained in:
parent
bcaed268fb
commit
7083b88569
@ -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
|
||||
|
||||
|
@ -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<cpu_device> m_maincpu;
|
||||
required_device<z80pio_device> m_pio;
|
||||
required_device<dac_byte_interface> m_dac;
|
||||
required_device<dac_8bit_r2r_device> m_dac;
|
||||
required_memory_region m_dac_prom;
|
||||
required_device<filter_volume_device> m_volume;
|
||||
required_device<generic_latch_8_device> m_soundlatch;
|
||||
required_device<gfxdecode_device> m_gfxdecode;
|
||||
required_device<palette_device> m_palette;
|
||||
required_device<palette_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;
|
||||
|
@ -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;
|
||||
}
|
Loading…
Reference in New Issue
Block a user