Skip to content

Commit

Permalink
cage.cpp: Add partially support of variable sound output channels (ma…
Browse files Browse the repository at this point in the history
  • Loading branch information
cam900 authored and wilbertpol committed May 8, 2022
1 parent f9f4245 commit d92916a
Show file tree
Hide file tree
Showing 6 changed files with 160 additions and 17 deletions.
100 changes: 86 additions & 14 deletions src/mame/audio/cage.cpp
Expand Up @@ -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)
Expand All @@ -23,7 +95,7 @@
*
*************************************/

#define DAC_BUFFER_CHANNELS 4
#define DAC_BUFFER_CHANNELS 4 // 5; 4 channel + subwoofer?
#define STACK_SOUND_BUFSIZE (1024)

/*************************************
Expand Down Expand Up @@ -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")


Expand All @@ -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"),
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);

Expand All @@ -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")


Expand Down
2 changes: 1 addition & 1 deletion src/mame/audio/cage.h
Expand Up @@ -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
Expand Down
36 changes: 34 additions & 2 deletions src/mame/drivers/atarigt.cpp
Expand Up @@ -58,6 +58,7 @@

#include "cpu/m68000/m68000.h"
#include "machine/eeprompar.h"
#include "speaker.h"


#define LOG_PROTECTION (0)
Expand Down Expand Up @@ -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);
Expand All @@ -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);
}
Expand Down
12 changes: 12 additions & 0 deletions src/mame/drivers/metalmx.cpp
Expand Up @@ -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
}


Expand Down
26 changes: 26 additions & 0 deletions src/mame/drivers/seattle.cpp
Expand Up @@ -201,6 +201,7 @@
#include "video/voodoo_pci.h"

#include "screen.h"
#include "speaker.h"

#include "calspeed.lh"
#include "vaportrx.lh"
Expand Down Expand Up @@ -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);
Expand All @@ -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);
Expand Down
1 change: 1 addition & 0 deletions src/mame/includes/atarigt.h
Expand Up @@ -39,6 +39,7 @@ class atarigt_state : public atarigen_state
{ }

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);
Expand Down

0 comments on commit d92916a

Please sign in to comment.