summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author cam900 <dbtlrchl@naver.com>2022-04-23 11:34:28 +0900
committer GitHub <noreply@github.com>2022-04-23 12:34:28 +1000
commit05c700c3f001c8cafc088da614ddf834a25e9ae3 (patch)
tree3f413f16d6f1825b22f8dc821d4a195065d0c833
parent2bbf6fb06fb518aad720754d777a700a1120659f (diff)
cage.cpp: Add partially support of variable sound output channels (#9105)
-rw-r--r--src/mame/audio/cage.cpp100
-rw-r--r--src/mame/audio/cage.h2
-rw-r--r--src/mame/drivers/atarigt.cpp36
-rw-r--r--src/mame/drivers/metalmx.cpp12
-rw-r--r--src/mame/drivers/seattle.cpp26
-rw-r--r--src/mame/includes/atarigt.h1
6 files changed, 160 insertions, 17 deletions
diff --git a/src/mame/audio/cage.cpp b/src/mame/audio/cage.cpp
index d295b690b0f..9276b8b6dfc 100644
--- a/src/mame/audio/cage.cpp
+++ b/src/mame/audio/cage.cpp
@@ -4,12 +4,84 @@
Atari CAGE Audio Board
+ Atari CH31.2 sound board layout:
+ --------------------------------
+
+ ATARI GAMES (C) 93 MADE IN U.S.A.
+ |-----------------------------------------------------------|
+ | JXBUS|---------------------------------| |
+ | |---------------------------------| JPWR |
+ | |---------| |
+ |JROMBUS| 11A | |
+ | |--| |---------| |
+ | | ||-----------| |
+ | | || 11B | |
+ | | ||-----------| |
+ | | ||-----------| 3B |
+ | | || 11C | RAM RAM RAM RAM |
+ | | ||-----------| |
+ | | ||-----------| |
+ | | || 11D | |
+ | | ||-----------| 3D |
+ | | ||-----------| |-----------| |
+ | | || 11E | | | |
+ | | ||-----------| | DSP | |
+ | | | | | AMP |
+ | |--|OSC |-----------| JSPKR |
+ | |
+ |-----------------------------------------------------------|
+
+ DSP: TMS320C31 33.8688MHz
+ OSC: 33.8688MHz
+ 11A: DIP32 EPROM for Boot
+ 11B, 11C, 11D, 11E: DIP42 Mask ROM for Data
+ RAM: 32Kx8 bit SRAM
+ 3B: AK4316-VS DAC, Not populated in primal rage (no quad channel sound support)
+ 3D: AK4316-VS DAC
+ AMP: TDA1554Q Audio amplifier for connect speaker directly
+ JROMBUS: ROM expansion connector
+ JXBUS: X-Bus host interface
+ JSPKR: Audio output connector, Connect to external speaker or motherboard/AMP board
+ JPWR: Power supply connector, Connect to external power distribution board or motherboard
+
+ Pinouts:
+
+ JSPKR:
+ ---------------
+ 01 Channel 1 +
+ 02 Channel 1 -
+ 03 Channel 2 +
+ 04 Channel 2 -
+ 05 Key
+ 06 Channel 3 +
+ 07 Channel 3 -
+ 08 Channel 4 +
+ 09 Channel 4 -
+ 10 Subwoofer +
+ 11 Subwoofer -
+
+ JPWR:
+ ----------------
+ 01 +5V
+ 02 +5V
+ 03 Key
+ 04 GND
+ 05 GND
+ 06 +12V
+ 07 +12V
+ 08 -5V
+ 09 GND
+
+ TODO:
+ - Move DSP internal functions into tms32031.cpp
+ - Further support for variable sound output channel
+ - Support subwoofer output
+
****************************************************************************/
#include "emu.h"
#include "cage.h"
-#include "speaker.h"
#define LOG_COMM (0)
@@ -23,7 +95,7 @@
*
*************************************/
-#define DAC_BUFFER_CHANNELS 4
+#define DAC_BUFFER_CHANNELS 4 // 5; 4 channel + subwoofer?
#define STACK_SOUND_BUFSIZE (1024)
/*************************************
@@ -105,6 +177,7 @@ static const char *const register_names[] =
*
*************************************/
+// uses Atari CH31(.2) external sound board
DEFINE_DEVICE_TYPE(ATARI_CAGE, atari_cage_device, "atari_cage", "Atari CAGE")
@@ -119,6 +192,7 @@ atari_cage_device::atari_cage_device(const machine_config &mconfig, const char *
atari_cage_device::atari_cage_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) :
device_t(mconfig, type, tag, owner, clock),
+ device_mixer_interface(mconfig, *this, 5), // 5 output routines in JSPKR
m_cpu(*this, "cpu"),
m_cageram(*this, "cageram"),
m_soundlatch(*this, "soundlatch"),
@@ -337,7 +411,7 @@ void atari_cage_device::update_serial()
freq = m_serial_period_per_word.as_hz() / DAC_BUFFER_CHANNELS;
if (freq > 0 && freq < 100000)
{
- for (int i = 0; i < 4; i++)
+ for (int i = 0; i < DAC_BUFFER_CHANNELS; i++)
{
m_dmadac[i]->set_frequency(freq);
m_dmadac[i]->enable(1);
@@ -617,7 +691,7 @@ void atari_cage_seattle_device::cage_map_seattle(address_map &map)
void atari_cage_device::device_add_mconfig(machine_config &config)
{
/* basic machine hardware */
- TMS32031(config, m_cpu, 33868800);
+ TMS32031(config, m_cpu, XTAL(33'868'800));
m_cpu->set_addrmap(AS_PROGRAM, &atari_cage_device::cage_map);
m_cpu->set_mcbl_mode(true);
@@ -626,27 +700,25 @@ void atari_cage_device::device_add_mconfig(machine_config &config)
TIMER(config, m_timer[1]).configure_generic(DEVICE_SELF, FUNC(atari_cage_device::cage_timer_callback));
/* sound hardware */
- SPEAKER(config, "lspeaker").front_left();
- SPEAKER(config, "rspeaker").front_right();
-
GENERIC_LATCH_16(config, m_soundlatch);
#if (DAC_BUFFER_CHANNELS == 4)
- DMADAC(config, m_dmadac[0]).add_route(ALL_OUTPUTS, "rspeaker", 0.50);
+ DMADAC(config, m_dmadac[0]).add_route(ALL_OUTPUTS, *this, 0.50, AUTO_ALLOC_INPUT, 0);
- DMADAC(config, m_dmadac[1]).add_route(ALL_OUTPUTS, "lspeaker", 0.50);
+ DMADAC(config, m_dmadac[1]).add_route(ALL_OUTPUTS, *this, 0.50, AUTO_ALLOC_INPUT, 1);
- DMADAC(config, m_dmadac[2]).add_route(ALL_OUTPUTS, "lspeaker", 0.50);
+ DMADAC(config, m_dmadac[2]).add_route(ALL_OUTPUTS, *this, 0.50, AUTO_ALLOC_INPUT, 2);
- DMADAC(config, m_dmadac[3]).add_route(ALL_OUTPUTS, "rspeaker", 0.50);
+ DMADAC(config, m_dmadac[3]).add_route(ALL_OUTPUTS, *this, 0.50, AUTO_ALLOC_INPUT, 3);
#else
- DMADAC(config, m_dmadac[0]).add_route(ALL_OUTPUTS, "lspeaker", 1.0);
+ DMADAC(config, m_dmadac[0]).add_route(ALL_OUTPUTS, *this, 1.0, AUTO_ALLOC_INPUT, 0);
- DMADAC(config, m_dmadac[1]).add_route(ALL_OUTPUTS, "rspeaker", 1.0);
+ DMADAC(config, m_dmadac[1]).add_route(ALL_OUTPUTS, *this, 1.0, AUTO_ALLOC_INPUT, 1);
#endif
+ //add_route(ALL_OUTPUTS, *this, 0.50, AUTO_ALLOC_INPUT, 4); Subwoofer output
}
-
+// Embedded in San francisco Rush Motherboard, 4 channel output connected to Quad Amp PCB and expanded to 5 channel (4 channel + subwoofer)
DEFINE_DEVICE_TYPE(ATARI_CAGE_SEATTLE, atari_cage_seattle_device, "atari_cage_seattle", "Atari CAGE Seattle")
diff --git a/src/mame/audio/cage.h b/src/mame/audio/cage.h
index 39f9ca54393..c93bc4419ea 100644
--- a/src/mame/audio/cage.h
+++ b/src/mame/audio/cage.h
@@ -17,7 +17,7 @@
#include "sound/dmadac.h"
-class atari_cage_device : public device_t
+class atari_cage_device : public device_t, public device_mixer_interface
{
public:
enum
diff --git a/src/mame/drivers/atarigt.cpp b/src/mame/drivers/atarigt.cpp
index 38132e9b1ef..be775512aae 100644
--- a/src/mame/drivers/atarigt.cpp
+++ b/src/mame/drivers/atarigt.cpp
@@ -58,6 +58,7 @@
#include "cpu/m68000/m68000.h"
#include "machine/eeprompar.h"
+#include "speaker.h"
#define LOG_PROTECTION (0)
@@ -854,6 +855,26 @@ void atarigt_state::atarigt(machine_config &config)
m_cage->irq_handler().set(FUNC(atarigt_state::cage_irq_callback));
}
+// for stereo + subwoofer output configuration
+void atarigt_state::atarigt_stereo(machine_config &config)
+{
+ atarigt(config);
+
+ // 3 Channel output directly from CAGE or through motherboard JAMMA output
+ // based on dedicated cabinet configuration;
+ // 'universal' kit supports mono and stereo, with/without subwoofer.
+ SPEAKER(config, "lspeaker").front_left();
+ SPEAKER(config, "rspeaker").front_right();
+ SPEAKER(config, "subwoofer").front_floor(); // Next to the coin door at dedicated cabinet, just silence for now (not implemented)
+
+ // TODO: correct? sound board has only 1 DAC populated.
+ m_cage->add_route(0, "rspeaker", 1.0);
+ m_cage->add_route(1, "lspeaker", 1.0);
+ m_cage->add_route(2, "lspeaker", 1.0);
+ m_cage->add_route(3, "rspeaker", 1.0);
+ m_cage->add_route(4, "subwoofer", 1.0);
+}
+
void atarigt_state::tmek(machine_config &config)
{
atarigt(config);
@@ -864,19 +885,30 @@ void atarigt_state::tmek(machine_config &config)
m_adc->in_callback<6>().set_ioport("AN2");
m_adc->in_callback<7>().set_ioport("AN3");
+ // 5 Channel output (4 Channel input connected to Quad Amp PCB)
+ SPEAKER(config, "flspeaker").front_left();
+ SPEAKER(config, "frspeaker").front_right();
+ SPEAKER(config, "rlspeaker").headrest_left();
+ SPEAKER(config, "rrspeaker").headrest_right();
+ //SPEAKER(config, "subwoofer").seat(); Not implemented, Quad Amp PCB output;
+
m_cage->set_speedup(0x4fad);
+ m_cage->add_route(0, "frspeaker", 1.0); // Foward Right
+ m_cage->add_route(1, "rlspeaker", 1.0); // Back Left
+ m_cage->add_route(2, "flspeaker", 1.0); // Foward Left
+ m_cage->add_route(3, "rrspeaker", 1.0); // Back Right
}
void atarigt_state::primrage(machine_config &config)
{
- atarigt(config);
+ atarigt_stereo(config);
m_cage->set_speedup(0x42f2);
}
void atarigt_state::primrage20(machine_config &config)
{
- atarigt(config);
+ atarigt_stereo(config);
m_cage->set_speedup(0x48a4);
}
diff --git a/src/mame/drivers/metalmx.cpp b/src/mame/drivers/metalmx.cpp
index e1c5acfb595..266fed2f80b 100644
--- a/src/mame/drivers/metalmx.cpp
+++ b/src/mame/drivers/metalmx.cpp
@@ -690,9 +690,21 @@ void metalmx_state::metalmx(machine_config &config)
PALETTE(config, "palette", palette_device::RGB_565);
+ // TODO: copied from atarigt.cpp; Same configurations as T-Mek?
+ // 5 Channel output (4 Channel input connected to Quad Amp PCB)
+ SPEAKER(config, "flspeaker").front_left();
+ SPEAKER(config, "frspeaker").front_right();
+ SPEAKER(config, "rlspeaker").headrest_left();
+ SPEAKER(config, "rrspeaker").headrest_right();
+ //SPEAKER(config, "subwoofer").seat(); Not implemented, Quad Amp PCB output;
+
ATARI_CAGE(config, m_cage, 0);
m_cage->set_speedup(0); // TODO: speedup address
m_cage->irq_handler().set(FUNC(metalmx_state::cage_irq_callback));
+ m_cage->add_route(0, "frspeaker", 1.0); // Foward Right
+ m_cage->add_route(1, "rlspeaker", 1.0); // Back Left
+ m_cage->add_route(2, "flspeaker", 1.0); // Foward Left
+ m_cage->add_route(3, "rrspeaker", 1.0); // Back Right
}
diff --git a/src/mame/drivers/seattle.cpp b/src/mame/drivers/seattle.cpp
index 06f2022cd01..ada85cdf584 100644
--- a/src/mame/drivers/seattle.cpp
+++ b/src/mame/drivers/seattle.cpp
@@ -201,6 +201,7 @@
#include "video/voodoo_pci.h"
#include "screen.h"
+#include "speaker.h"
#include "calspeed.lh"
#include "vaportrx.lh"
@@ -2153,9 +2154,21 @@ void seattle_state::mace(machine_config &config)
void seattle_state::sfrush(machine_config &config)
{
flagstaff(config);
+ // 5 Channel output (4 Channel input connected to Quad Amp PCB)
+ SPEAKER(config, "flspeaker").front_left();
+ SPEAKER(config, "frspeaker").front_right();
+ SPEAKER(config, "rlspeaker").headrest_left();
+ SPEAKER(config, "rrspeaker").headrest_right();
+ //SPEAKER(config, "subwoofer").seat(); Not implemented, Quad Amp PCB output;
+
atari_cage_seattle_device &cage(ATARI_CAGE_SEATTLE(config, "cage", 0));
cage.set_speedup(0x5236);
cage.irq_handler().set(m_ioasic, FUNC(midway_ioasic_device::cage_irq_handler));
+ // TODO: copied from atarigt.cpp; Same configurations as T-Mek?
+ cage.add_route(0, "frspeaker", 1.0); // Foward Right
+ cage.add_route(1, "rlspeaker", 1.0); // Back Left
+ cage.add_route(2, "flspeaker", 1.0); // Foward Left
+ cage.add_route(3, "rrspeaker", 1.0); // Back Right
MIDWAY_IOASIC(config, m_ioasic, 0);
m_ioasic->set_shuffle(MIDWAY_IOASIC_STANDARD);
@@ -2168,9 +2181,22 @@ void seattle_state::sfrush(machine_config &config)
void seattle_state::sfrushrk(machine_config &config)
{
flagstaff(config);
+ // 5 Channel output (4 Channel input connected to Quad Amp PCB)
+ SPEAKER(config, "flspeaker").front_left();
+ SPEAKER(config, "frspeaker").front_right();
+ SPEAKER(config, "rlspeaker").headrest_left();
+ SPEAKER(config, "rrspeaker").headrest_right();
+ //SPEAKER(config, "subwoofer").seat(); Not implemented, Quad Amp PCB output;
+
atari_cage_seattle_device &cage(ATARI_CAGE_SEATTLE(config, "cage", 0));
cage.set_speedup(0x5329);
cage.irq_handler().set(m_ioasic, FUNC(midway_ioasic_device::cage_irq_handler));
+ // TODO: copied from atarigt.cpp; Same configurations as T-Mek?
+ cage.add_route(0, "frspeaker", 1.0); // Foward Right
+ cage.add_route(1, "rlspeaker", 1.0); // Back Left
+ cage.add_route(2, "flspeaker", 1.0); // Foward Left
+ cage.add_route(3, "rrspeaker", 1.0); // Back Right
+
MIDWAY_IOASIC(config, m_ioasic, 0);
m_ioasic->set_shuffle(MIDWAY_IOASIC_SFRUSHRK);
diff --git a/src/mame/includes/atarigt.h b/src/mame/includes/atarigt.h
index 9147f475ca5..73eb1015662 100644
--- a/src/mame/includes/atarigt.h
+++ b/src/mame/includes/atarigt.h
@@ -39,6 +39,7 @@ public:
{ }
void atarigt(machine_config &config);
+ void atarigt_stereo(machine_config &config);
void tmek(machine_config &config);
void primrage20(machine_config &config);
void primrage(machine_config &config);