summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/audio/dcs.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/audio/dcs.cpp')
-rw-r--r--src/mame/audio/dcs.cpp73
1 files changed, 53 insertions, 20 deletions
diff --git a/src/mame/audio/dcs.cpp b/src/mame/audio/dcs.cpp
index 876393c13f8..f71e0ba27c4 100644
--- a/src/mame/audio/dcs.cpp
+++ b/src/mame/audio/dcs.cpp
@@ -246,6 +246,7 @@ enum
#define DSIO_DM_PG ((m_dsio.reg[2] >> 0) & 0x7ff)
+#define DSIO_BANK_END 0x7ff
/* these macros are used to reference the DENVER ASIC */
#define DENV_DSP_SPEED ((m_dsio.reg[1] >> 2) & 3) /* read only: 1=33.33MHz */
@@ -256,6 +257,7 @@ enum
#define DENV_DM_PG ((m_dsio.reg[2] >> 0) & 0x7ff)
+#define DENV_BANK_END 0xfff
/*************************************
*
@@ -384,11 +386,15 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( dsio_data_map, AS_DATA, 16, dcs_audio_device )
ADDRESS_MAP_UNMAP_HIGH
- AM_RANGE(0x0000, 0x03ff) AM_RAMBANK("databank")
- AM_RANGE(0x0400, 0x3fdf) AM_RAM
+ AM_RANGE(0x0000, 0x1fff) AM_DEVICE("data_map_bank", address_map_bank_device, amap16)
+ AM_RANGE(0x2000, 0x3fdf) AM_RAM AM_SHARE("dcsint_data")
AM_RANGE(0x3fe0, 0x3fff) AM_READWRITE(adsp_control_r, adsp_control_w)
ADDRESS_MAP_END
+static ADDRESS_MAP_START( dsio_rambank_map, AS_PROGRAM, 16, dcs_audio_device )
+ AM_RANGE(0x0000, 0x1fff) AM_RAM
+ AM_RANGE(0x2000, 0x2000 + DSIO_BANK_END) AM_RAMBANK("databank")
+ADDRESS_MAP_END
static ADDRESS_MAP_START( dsio_io_map, AS_IO, 16, dcs_audio_device )
ADDRESS_MAP_UNMAP_HIGH
@@ -416,11 +422,16 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( denver_data_map, AS_DATA, 16, dcs_audio_device )
ADDRESS_MAP_UNMAP_HIGH
- AM_RANGE(0x0000, 0x07ff) AM_RAMBANK("databank")
- AM_RANGE(0x0800, 0x3fdf) AM_RAM
+ AM_RANGE(0x0000, 0x1fff) AM_DEVICE("data_map_bank", address_map_bank_device, amap16)
+ AM_RANGE(0x2000, 0x3fdf) AM_RAM AM_SHARE("dcsint_data")
AM_RANGE(0x3fe0, 0x3fff) AM_READWRITE(adsp_control_r, adsp_control_w)
ADDRESS_MAP_END
+static ADDRESS_MAP_START(denver_rambank_map, AS_PROGRAM, 16, dcs_audio_device)
+ AM_RANGE(0x0000, 0x1fff) AM_RAM
+ AM_RANGE(0x2000, 0x2000 + DENV_BANK_END) AM_RAMBANK("databank")
+ADDRESS_MAP_END
+
static ADDRESS_MAP_START( denver_io_map, AS_IO, 16, dcs_audio_device )
ADDRESS_MAP_UNMAP_HIGH
@@ -528,10 +539,18 @@ MACHINE_CONFIG_FRAGMENT( dcs2_audio_dsio )
MCFG_CPU_ADD("dsio", ADSP2181, XTAL_32MHz)
MCFG_ADSP21XX_SPORT_TX_CB(WRITE32(dcs_audio_device, sound_tx_callback)) /* callback for serial transmit */
MCFG_ADSP21XX_TIMER_FIRED_CB(WRITELINE(dcs_audio_device,timer_enable_callback)) /* callback for timer fired */
+ MCFG_ADSP21XX_DMOVLAY_CB(WRITE32(dcs_audio_device, dmovlay_callback)) // callback for adsp 2181 dmovlay instruction
MCFG_CPU_PROGRAM_MAP(dsio_program_map)
MCFG_CPU_DATA_MAP(dsio_data_map)
MCFG_CPU_IO_MAP(dsio_io_map)
+ MCFG_DEVICE_ADD("data_map_bank", ADDRESS_MAP_BANK, 0)
+ MCFG_DEVICE_PROGRAM_MAP(dsio_rambank_map)
+ MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_LITTLE)
+ MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(16)
+ MCFG_ADDRESS_MAP_BANK_ADDRBUS_WIDTH(14)
+ MCFG_ADDRESS_MAP_BANK_STRIDE(0x2000)
+
MCFG_TIMER_DEVICE_ADD("dcs_reg_timer", DEVICE_SELF, dcs_audio_device, dcs_irq)
MCFG_TIMER_DEVICE_ADD("dcs_int_timer", DEVICE_SELF, dcs_audio_device, internal_timer_callback)
MCFG_TIMER_DEVICE_ADD("dcs_sport_timer", DEVICE_SELF, dcs_audio_device, sport0_irq) // roadburn needs this to pass harware test
@@ -562,6 +581,13 @@ MACHINE_CONFIG_FRAGMENT( dcs2_audio_denver )
MCFG_CPU_DATA_MAP(denver_data_map)
MCFG_CPU_IO_MAP(denver_io_map)
+ MCFG_DEVICE_ADD("data_map_bank", ADDRESS_MAP_BANK, 0)
+ MCFG_DEVICE_PROGRAM_MAP(denver_rambank_map)
+ MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_LITTLE)
+ MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(16)
+ MCFG_ADDRESS_MAP_BANK_ADDRBUS_WIDTH(14)
+ MCFG_ADDRESS_MAP_BANK_STRIDE(0x2000)
+
MCFG_TIMER_DEVICE_ADD("dcs_reg_timer", DEVICE_SELF, dcs_audio_device, dcs_irq)
MCFG_TIMER_DEVICE_ADD("dcs_int_timer", DEVICE_SELF, dcs_audio_device, internal_timer_callback)
MCFG_TIMER_DEVICE_ADD("dcs_sport_timer", DEVICE_SELF, dcs_audio_device, sport0_irq) // Atlantis driver waits for sport0 rx interrupts
@@ -689,8 +715,6 @@ TIMER_CALLBACK_MEMBER( dcs_audio_device::dcs_reset )
/* rev 4: reset the Denver ASIC */
case 4:
- m_dmovlay_val = 0;
- dmovlay_remap_memory();
denver_reset();
break;
}
@@ -822,6 +846,7 @@ dcs_audio_device::dcs_audio_device(const machine_config &mconfig, device_type ty
m_sounddata_words(0),
m_sounddata_banks(0),
m_sounddata_bank(0),
+ m_ram_map(*this, "data_map_bank"),
m_data_bank(*this, "databank"),
m_rom_page(nullptr),
m_dram_page(nullptr),
@@ -845,6 +870,7 @@ dcs_audio_device::dcs_audio_device(const machine_config &mconfig, device_type ty
m_polling_base(nullptr),
m_internal_program_ram(nullptr),
m_external_program_ram(nullptr),
+ m_internal_data_ram(nullptr),
m_dram_in_mb(0),
m_iram(*this, "iram")
{
@@ -928,6 +954,11 @@ void dcs2_audio_device::device_start()
{
m_external_program_ram = (uint32_t *)external_ram->ptr();
}
+ memory_share *internal_data_ram = memshare("dcsint_data");
+ if (internal_data_ram != nullptr)
+ {
+ m_internal_data_ram = (uint32_t *)internal_ram->ptr();
+ }
/* find the DCS CPU and the sound ROMs */
m_cpu = subdevice<adsp21xx_device>("dcs2");
@@ -937,13 +968,13 @@ void dcs2_audio_device::device_start()
{
m_cpu = subdevice<adsp21xx_device>("dsio");
m_rev = 3;
- soundbank_words = 0x400;
+ soundbank_words = DSIO_BANK_END + 1;
}
if (m_cpu == nullptr)
{
m_cpu = subdevice<adsp21xx_device>("denver");
m_rev = 4;
- soundbank_words = 0x800;
+ soundbank_words = DENV_BANK_END + 1;
}
if (m_cpu != nullptr && !m_cpu->started())
throw device_missing_dependencies();
@@ -965,13 +996,9 @@ void dcs2_audio_device::device_start()
/* supports both RAM and ROM variants */
if (m_dram_in_mb != 0)
{
- uint32_t ramSize = m_dram_in_mb << (20 - 1);
- // Add one extra bank for internal ram in ADSP 2181
- if (m_rev == 4)
- ramSize += soundbank_words;
- m_sounddata = auto_alloc_array(machine(), uint16_t, ramSize);
- save_pointer(NAME(m_sounddata), ramSize);
m_sounddata_words = (m_dram_in_mb << 20) / 2;
+ m_sounddata = auto_alloc_array(machine(), uint16_t, m_sounddata_words);
+ save_pointer(NAME(m_sounddata), m_sounddata_words);
}
else
{
@@ -981,7 +1008,9 @@ void dcs2_audio_device::device_start()
m_sounddata_banks = m_sounddata_words / soundbank_words;
if (m_rev != 2)
{
- m_data_bank->configure_entries(0, m_sounddata_banks, m_sounddata, soundbank_words*2);
+ if (m_ram_map)
+ m_ram_map->set_bank(0);
+ m_data_bank->configure_entries(0, m_sounddata_banks, m_sounddata, soundbank_words * 2);
}
@@ -1303,6 +1332,8 @@ WRITE16_MEMBER( dcs_audio_device::sdrc_w )
void dcs_audio_device::dsio_reset()
{
memset(&m_dsio, 0, sizeof(m_dsio));
+ m_dmovlay_val = 0;
+ dmovlay_remap_memory();
}
@@ -1342,7 +1373,7 @@ WRITE16_MEMBER( dcs_audio_device::dsio_w )
/* offset 2 controls RAM pages */
case 2:
dsio.reg[2] = data;
- dmovlay_remap_memory();
+ m_data_bank->set_entry(DSIO_DM_PG % m_sounddata_banks);
break;
}
}
@@ -1358,6 +1389,8 @@ WRITE16_MEMBER( dcs_audio_device::dsio_w )
void dcs_audio_device::denver_reset()
{
memset(&m_dsio, 0, sizeof(m_dsio));
+ m_dmovlay_val = 0;
+ dmovlay_remap_memory();
}
@@ -1370,6 +1403,7 @@ READ16_MEMBER( dcs_audio_device::denver_r )
/* returns 1 for DRAM, 2 for EPROM-based */
result = 0x0001;
}
+ if (LOG_DCS_IO) logerror("denver: denver_r 0x%x = %04x\n", offset, result);
return result;
}
@@ -1417,6 +1451,7 @@ WRITE16_MEMBER( dcs_audio_device::denver_w )
m_fifo_reset_w(1);
break;
}
+ if (LOG_DCS_IO) logerror("denver: denver_w 0x%x = %04x\n", offset, data);
}
@@ -1477,11 +1512,9 @@ void dcs_audio_device::dmovlay_remap_memory()
// Internal ram is bank 0
int bankSel;
if (m_dmovlay_val == 0) {
- bankSel = 0;
- m_data_bank->set_entry(bankSel);
+ m_ram_map->set_bank(0);
} else {
- bankSel = 1 + (DSIO_DM_PG % m_sounddata_banks);
- m_data_bank->set_entry(bankSel);
+ m_ram_map->set_bank(1);
}
if (LOG_DCS_IO)
logerror("%s dmovlay_remap_memory: Switching data ram location bankSel = %i\n", machine().describe_context(), bankSel);