From 4fa462593d5821b945ce99bc51d48c12026d1a60 Mon Sep 17 00:00:00 2001 From: AJR Date: Fri, 13 Jan 2017 14:04:23 -0500 Subject: [PATCH 1/2] More DAC identification and Namco sound research (nw) --- src/devices/sound/dac.h | 1 + src/devices/sound/namco.cpp | 10 ++++++++++ src/mame/drivers/byvid.cpp | 4 ++-- src/mame/drivers/galaxian.cpp | 2 +- src/mame/drivers/junofrst.cpp | 2 +- src/mame/drivers/mappy.cpp | 14 +++++++------- src/mame/drivers/namcos1.cpp | 4 ++-- 7 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/devices/sound/dac.h b/src/devices/sound/dac.h index 9ffd6e3ef06..8902d752113 100644 --- a/src/devices/sound/dac.h +++ b/src/devices/sound/dac.h @@ -292,6 +292,7 @@ DAC_GENERATOR(MC3410, mc3410_device, dac_word_interface, dac_code_binary<10>, da DAC_GENERATOR(PCM54HP, pcm54hp_device, dac_word_interface, dac_code_binary<16>, dac_gain_r2r, "PCM54HP", "pcm54hp") DAC_GENERATOR(UDA1341TS, uda1341ts_device, dac_word_interface, dac_code_twos_complement<16>, dac_gain_r2r, "UDA1341TS", "uda1341ts") // I2C stereo audio codec DAC_GENERATOR(ZN425E, zn425e_device, dac_byte_interface, dac_code_binary<8>, dac_gain_r2r, "ZN425E", "zn425e") +DAC_GENERATOR(ZN429E, zn429e_device, dac_byte_interface, dac_code_binary<8>, dac_gain_r2r, "ZN429E-8", "zn429e") // DAC circuits/unidentified chips DAC_GENERATOR(DAC_1BIT, dac_1bit_device, dac_bit_interface, dac_code_binary<1>, 1.0, "1-Bit DAC", "dac") diff --git a/src/devices/sound/namco.cpp b/src/devices/sound/namco.cpp index 6bf7eba166a..9e46457e9b3 100644 --- a/src/devices/sound/namco.cpp +++ b/src/devices/sound/namco.cpp @@ -11,6 +11,16 @@ - 8-voice mono (custom 15XX: Mappy, Dig Dug 2, etc) - 8-voice stereo (System 1) + The 15XX custom does not have a DAC of its own; instead, it streams + the 4-bit PROM data directly into the 99XX custom DAC. Most pre-99XX + (and pre-15XX) Namco games use a LS273 latch (cleared when sound is + disabled), a 4.7K/2.2K/1K/470 resistor-weighted DAC, and a 4066 and + second group of resistors (10K/22K/47K/100K) for volume control. + Pole Position does more complicated sound mixing: a 4051 multiplexes + wavetable sound with four signals derived from the 52XX and 54XX, the + selected signal is distributed to four volume control sections, and + finally the engine noise is mixed into all four channels. + ***************************************************************************/ #include "emu.h" diff --git a/src/mame/drivers/byvid.cpp b/src/mame/drivers/byvid.cpp index 16cecda02b1..386a6e76bfc 100644 --- a/src/mame/drivers/byvid.cpp +++ b/src/mame/drivers/byvid.cpp @@ -13,7 +13,7 @@ board containing the video and sound cpus, and the video controller and the sound DAC and amp. Granny uses the MPU4 board, but it has a Vidiot Deluxe for the -video, and a Cheep Squeek sound board. The manual incorrectly +video, and a Cheap Squeek sound board. The manual incorrectly describes the babypac vidiot board, which is of little use. @@ -794,7 +794,7 @@ static MACHINE_CONFIG_START( babypac, by133_state ) /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("speaker") - MCFG_SOUND_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25) // unknown DAC + MCFG_SOUND_ADD("dac", ZN429E, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25) // U32 (Vidiot) or U6 (Cheap Squeak) MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0) MCFG_SOUND_ROUTE_EX(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE_EX(0, "dac", -1.0, DAC_VREF_NEG_INPUT) diff --git a/src/mame/drivers/galaxian.cpp b/src/mame/drivers/galaxian.cpp index 742be3ee011..02c29f8e765 100644 --- a/src/mame/drivers/galaxian.cpp +++ b/src/mame/drivers/galaxian.cpp @@ -6024,7 +6024,7 @@ static MACHINE_CONFIG_DERIVED( sfx, galaxian_base ) MCFG_AY8910_PORT_B_WRITE_CB(WRITE8(galaxian_state, sfx_sample_control_w)) /* DAC for the sample player */ - MCFG_SOUND_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0) // unknown DAC + MCFG_SOUND_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0) // 16-pin IC (not identified by schematics) MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0) MCFG_SOUND_ROUTE_EX(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE_EX(0, "dac", -1.0, DAC_VREF_NEG_INPUT) MACHINE_CONFIG_END diff --git a/src/mame/drivers/junofrst.cpp b/src/mame/drivers/junofrst.cpp index 4f6fa7be23e..6bde5b95a91 100644 --- a/src/mame/drivers/junofrst.cpp +++ b/src/mame/drivers/junofrst.cpp @@ -452,7 +452,7 @@ static MACHINE_CONFIG_START( junofrst, junofrst_state ) MCFG_SOUND_ROUTE(1, "filter.0.1", 0.30) MCFG_SOUND_ROUTE(2, "filter.0.2", 0.30) - MCFG_SOUND_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25) // unknown DAC + MCFG_SOUND_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25) // 100K (R56-63)/200K (R64-71) ladder network MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0) MCFG_SOUND_ROUTE_EX(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE_EX(0, "dac", -1.0, DAC_VREF_NEG_INPUT) diff --git a/src/mame/drivers/mappy.cpp b/src/mame/drivers/mappy.cpp index 1d563e22c73..64feea7e074 100644 --- a/src/mame/drivers/mappy.cpp +++ b/src/mame/drivers/mappy.cpp @@ -14,9 +14,8 @@ They can be divided in three "families": The hardware consists of two 6809, and several Namco custom ICs that provide a static tilemap and 2bpp sprites. Grobda is the only Namco game of this era that has speech (just a short - sample). At this time, it is still unknown whether the DAC used to play - the speech is part of the standard Namco sound hardware, or a quick addition - to the base board. + sample). At this time, it is still unknown how speech samples are transmitted + to the DAC (almost certainly the same resistor network used by the 15XX). 2) Phozon. This game runs on an unique board: the large number of sprites on screen at the same time required a 3rd 6809 to help with the calculations. The sprite hardware is also different from Super Pacman, featuring 8x8 sprites. @@ -44,7 +43,8 @@ CPU board: 15XX sound control 16XX I/O control 5xXX(x2) I/O -99XX sound volume (only Mappy, Super Pacman uses a standard LS273) +99XX DAC with volume control (only Mappy, Super Pacman uses LS273, CD4066 + and binary-weighted resistors R34-37 and R22-25) Video board: 00XX tilemap address generator with scrolling capability (only Super Pacman) @@ -1766,7 +1766,7 @@ static MACHINE_CONFIG_START( grobda, mappy_state ) MCFG_NAMCO56XX_OUT_0_CB(WRITE8(mappy_state, out_mux)) /* sound hardware */ - MCFG_SOUND_ADD("dac", DAC_4BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.275) // unknown DAC + MCFG_SOUND_ADD("dac", DAC_4BIT_BINARY_WEIGHTED, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.275) // alternate route to 15XX-related DAC? MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0) MCFG_SOUND_ROUTE_EX(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE_EX(0, "dac", -1.0, DAC_VREF_NEG_INPUT) MACHINE_CONFIG_END @@ -2412,13 +2412,13 @@ DRIVER_INIT_MEMBER(mappy_state,grobda) { m_type = GAME_GROBDA; - /* I think the speech in Grobda is not a standard Namco sound feature, but rather a hack. + /* The speech in Grobda might not be a standard Namco sound feature, but rather a hack. The hardware automatically cycles the bottom 6 address lines of sound RAM, so they probably added a latch loaded when the bottom 4 lines are 0010 (which corresponds to locations not used by the sound hardware). The program writes the same value to 0x02, 0x12, 0x22 and 0x32. However, removing the 15XX from the board causes sound to disappear completely, so - the DAC might be built-in after all. + the 15XX may still play some part in conveying speech to the DAC. */ m_subcpu->space(AS_PROGRAM).install_write_handler(0x0002, 0x0002, write8_delegate(FUNC(dac_byte_interface::write), (dac_byte_interface *)m_dac)); } diff --git a/src/mame/drivers/namcos1.cpp b/src/mame/drivers/namcos1.cpp index b206478d92e..3c7a6452a6c 100644 --- a/src/mame/drivers/namcos1.cpp +++ b/src/mame/drivers/namcos1.cpp @@ -1068,8 +1068,8 @@ static MACHINE_CONFIG_START( ns1, namcos1_state ) MCFG_SOUND_ROUTE(0, "lspeaker", 0.50) MCFG_SOUND_ROUTE(1, "rspeaker", 0.50) - MCFG_SOUND_ADD("dac0", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.5) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.5) // unknown DAC - MCFG_SOUND_ADD("dac1", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.5) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.5) // unknown DAC + MCFG_SOUND_ADD("dac0", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.5) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.5) // 10-pin 1Kx8R SIP with HC374 latch + MCFG_SOUND_ADD("dac1", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.5) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.5) // 10-pin 1Kx8R SIP with HC374 latch MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0) MCFG_SOUND_ROUTE_EX(0, "dac0", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE_EX(0, "dac0", -1.0, DAC_VREF_NEG_INPUT) MCFG_SOUND_ROUTE_EX(0, "dac1", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE_EX(0, "dac1", -1.0, DAC_VREF_NEG_INPUT) From 82ce45ea33130711fefb0042304a9b939e535aea Mon Sep 17 00:00:00 2001 From: AJR Date: Fri, 13 Jan 2017 19:23:30 -0500 Subject: [PATCH 2/2] Add DAC08 type for future reference (nw) --- src/devices/sound/dac.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/devices/sound/dac.h b/src/devices/sound/dac.h index 8902d752113..1e961798ee3 100644 --- a/src/devices/sound/dac.h +++ b/src/devices/sound/dac.h @@ -284,6 +284,7 @@ DAC_GENERATOR(AD7528, ad7528_device, dac_byte_interface, dac_code_binary<8>, dac DAC_GENERATOR(AD7533, ad7533_device, dac_word_interface, dac_code_binary<10>, dac_gain_r2r, "AD7533", "ad7533") DAC_GENERATOR(AD7541, ad7541_device, dac_word_interface, dac_code_binary<12>, dac_gain_r2r, "AD7541", "ad7541") DAC_GENERATOR(AM6012, am6012_device, dac_word_interface, dac_code_binary<12>, dac_gain_r2r, "AM6012", "am6012") +DAC_GENERATOR(DAC08, dac08_device, dac_byte_interface, dac_code_binary<8>, dac_gain_r2r, "DAC08", "dac08") DAC_GENERATOR(DAC0800, dac0800_device, dac_byte_interface, dac_code_binary<8>, dac_gain_r2r, "DAC0800", "dac0800") DAC_GENERATOR(DAC1200, dac1200_device, dac_word_interface, dac_code_binary<12>, dac_gain_r2r, "DAC1200", "dac1200") DAC_GENERATOR(MC1408, mc1408_device, dac_byte_interface, dac_code_binary<8>, dac_gain_r2r, "MC1408", "mc1408")