summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author mamehaze <mamehaze@users.noreply.github.com>2015-03-30 21:08:15 +0100
committer mamehaze <mamehaze@users.noreply.github.com>2015-03-30 21:08:15 +0100
commit71e84b82e33a68a091239080f15da85e95dafe76 (patch)
tree9012aac8b591a601b4e00cd7d99524d7e5c2bdcf
parent6abbb73744f8ccd387b23dd7095bf49ff2988e1d (diff)
document used register read/writes (nw)
-rw-r--r--src/emu/sound/l7a1045_l6028_dsp_a.c190
-rw-r--r--src/emu/sound/l7a1045_l6028_dsp_a.h5
-rw-r--r--src/mame/audio/hng64.c2
3 files changed, 162 insertions, 35 deletions
diff --git a/src/emu/sound/l7a1045_l6028_dsp_a.c b/src/emu/sound/l7a1045_l6028_dsp_a.c
index 1178132cb98..f845435caae 100644
--- a/src/emu/sound/l7a1045_l6028_dsp_a.c
+++ b/src/emu/sound/l7a1045_l6028_dsp_a.c
@@ -52,6 +52,21 @@
Registers are not yet understood.
+ probably sample start, end, loop positions, panning etc.
+ like CPS3, Qsound etc.
+
+ case 0x00:
+ case 0x01:
+ case 0x02:
+ case 0x03: // 00003fffffff (startup only?)
+ case 0x04: // doesn't use 6
+ case 0x05: // 00003fffffff (mostly, often)
+ case 0x06: // 00007ff0ffff mostly
+ case 0x07: // 0000000f0708 etc. (low values)
+ case 0x08: // doesn't write to 2/4/6 with this set??
+ case 0x09: // doesn't write to 2/4/6 with this set??
+ case 0x0a: // random looking values
+
Some of the other ports on the HNG64 sound CPU may also be tied
to this chip, this isn't yet clear.
@@ -148,70 +163,179 @@ WRITE16_MEMBER(l7a1045_sound_device::l7a1045_sound_select_w)
// ---- ---- 000c cccc
// c = channel
- if (data & 0x00e0) printf("%08x: l7a1045_sound_select_w unknown channel %02x\n", space.device().safe_pc(), data & 0x00ff);
+ if (ACCESSING_BITS_0_7)
+ {
+ m_audiochannel = data;
+ if (m_audiochannel & 0xe0) printf("%08x: l7a1045_sound_select_w unknown channel %01x\n", space.device().safe_pc(), m_audiochannel & 0xff);
+ m_audiochannel &= 0x1f;
+ }
+
+ if (ACCESSING_BITS_8_15)
+ {
+ m_audioregister = (data >> 8);
+ if (m_audioregister >0x0a) printf("%08x: l7a1045_sound_select_w unknown register %01x\n", space.device().safe_pc(), m_audioregister & 0xff);
+ m_audioregister &= 0x0f;
+ }
+
+}
+
+WRITE16_MEMBER(l7a1045_sound_device::l7a1045_sound_data_02_w) // upper? word of various registers?
+{
+ m_audiodat[m_audioregister][m_audiochannel].dat[2] = data;
- UINT8 command = data >> 8;
+ // write with registers 00, 01, 04, 06, 05, 03, 07, 02 on startup
+ // groups writes of register 0a per channel
- switch (command)
+ // register 08 / 09 not written?
+ switch (m_audioregister)
{
+ default:
+
+ case 0x08:
+ case 0x09:
+ printf("%08x: unexpected write port 0x0002 register %02x chansel %02x data %04x (%04x%04x%04x)\n", space.device().safe_pc(), m_audioregister, m_audiochannel, data, m_audiodat[m_audioregister][m_audiochannel].dat[0], m_audiodat[m_audioregister][m_audiochannel].dat[1], m_audiodat[m_audioregister][m_audiochannel].dat[2]);
+ break;
+
case 0x00:
case 0x01:
+ case 0x04:
+ case 0x06:
+ case 0x05:
+ case 0x03:
case 0x02:
- case 0x03: // 00003fffffff (startup only?)
- case 0x04: // doesn't use 6
- case 0x05: // 00003fffffff (mostly, often)
- case 0x06: // 00007ff0ffff mostly
- case 0x07: // 0000000f0708 etc. (low values)
- case 0x08: // doesn't write to 2/4/6 with this set??
- case 0x09: // doesn't write to 2/4/6 with this set??
- case 0x0a: // random looking values
+ case 0x07:
+ case 0x0a:
+ // printf("%08x: write port 0x0002 register %02x chansel %02x data %04x (%04x%04x%04x)\n", space.device().safe_pc(), m_audioregister, m_audiochannel, data, m_audiodat[m_audioregister][m_audiochannel].dat[0], m_audiodat[m_audioregister][m_audiochannel].dat[1], m_audiodat[m_audioregister][m_audiochannel].dat[2]);
break;
- default:
- printf("%08x: l7a1045_sound_select_w unrecognized command %02x\n", space.device().safe_pc(), command);
- break;
}
- COMBINE_DATA(&m_audiochannel);
}
-WRITE16_MEMBER(l7a1045_sound_device::l7a1045_sound_data_02_w)
+WRITE16_MEMBER(l7a1045_sound_device::l7a1045_sound_data_04_w) // lower? word of various registers?
{
- m_audiodat[m_audiochannel].dat[2] = data;
+ m_audiodat[m_audioregister][m_audiochannel].dat[1] = data;
-// if ((m_audiochannel & 0xff00) == 0x0a00)
-// printf("%08x: write port 0x0002 chansel %04x data %04x (%04x%04x%04x)\n", space.device().safe_pc(), m_audiochannel, data, m_audiodat[m_audiochannel].dat[0], m_audiodat[m_audiochannel].dat[1], m_audiodat[m_audiochannel].dat[2]);
-}
+ // write with registers 00, 04, 06, 05, 03, 07, 02, 01 on startup
+ // groups writes of register 0a per channel
-WRITE16_MEMBER(l7a1045_sound_device::l7a1045_sound_data_04_w)
-{
- m_audiodat[m_audiochannel].dat[1] = data;
+ // register 08 / 09 not written?
+
+ switch (m_audioregister)
+ {
+ default:
+
+ case 0x08:
+ case 0x09:
+ printf("%08x: unexpected write port 0x0004 register %02x chansel %02x data %04x (%04x%04x%04x)\n", space.device().safe_pc(), m_audioregister, m_audiochannel, data, m_audiodat[m_audioregister][m_audiochannel].dat[0], m_audiodat[m_audioregister][m_audiochannel].dat[1], m_audiodat[m_audioregister][m_audiochannel].dat[2]);
+ break;
+
+ case 0x00:
+ case 0x04:
+ case 0x06:
+ case 0x05:
+ case 0x03:
+ case 0x07:
+ case 0x01:
+ case 0x02:
+
+ case 0x0a:
+ //printf("%08x: write port 0x0004 register %02x chansel %02x data %04x (%04x%04x%04x)\n", space.device().safe_pc(), m_audioregister, m_audiochannel, data, m_audiodat[m_audioregister][m_audiochannel].dat[0], m_audiodat[m_audioregister][m_audiochannel].dat[1], m_audiodat[m_audioregister][m_audiochannel].dat[2]);
+ break;
+ }
-// if ((m_audiochannel & 0xff00) == 0x0a00)
-// printf("%08x: write port 0x0004 chansel %04x data %04x (%04x%04x%04x)\n", space.device().safe_pc(), m_audiochannel, data, m_audiodat[m_audiochannel].dat[0], m_audiodat[m_audiochannel].dat[1], m_audiodat[m_audiochannel].dat[2]);
}
-WRITE16_MEMBER(l7a1045_sound_device::l7a1045_sound_data_06_w)
+WRITE16_MEMBER(l7a1045_sound_device::l7a1045_sound_data_06_w) // other part? of various registers.. less used than 02/04, maybe flags?
{
- m_audiodat[m_audiochannel].dat[0] = data;
+ // 00 / 01 written at startup
+ // nothing else used?
+
+ m_audiodat[m_audioregister][m_audiochannel].dat[0] = data;
+ switch (m_audioregister)
+ {
+ default:
+
+ case 0x02:
+ case 0x03:
+ case 0x04:
+ case 0x05:
+ case 0x06:
+ case 0x07:
+ case 0x08:
+ case 0x09:
+ case 0x0a:
+ printf("%08x: unexpected write port 0x0006 register %02x chansel %02x data %04x (%04x%04x%04x)\n", space.device().safe_pc(), m_audioregister, m_audiochannel, data, m_audiodat[m_audioregister][m_audiochannel].dat[0], m_audiodat[m_audioregister][m_audiochannel].dat[1], m_audiodat[m_audioregister][m_audiochannel].dat[2]);
+ break;
+
+ case 0x00:
+ case 0x01:
+ //printf("%08x: unexpected write port 0x0006 register %02x chansel %02x data %04x (%04x%04x%04x)\n", space.device().safe_pc(), m_audioregister, m_audiochannel, data, m_audiodat[m_audioregister][m_audiochannel].dat[0], m_audiodat[m_audioregister][m_audiochannel].dat[1], m_audiodat[m_audioregister][m_audiochannel].dat[2]);
+ break;
-// if ((m_audiochannel & 0xff00) == 0x0a00)
-// printf("%08x: write port 0x0006 chansel %04x data %04x (%04x%04x%04x)\n", space.device().safe_pc(), m_audiochannel, data, m_audiodat[m_audiochannel].dat[0], m_audiodat[m_audiochannel].dat[1], m_audiodat[m_audiochannel].dat[2]);
+ }
}
READ16_MEMBER(l7a1045_sound_device::l7a1045_sound_port_0004_r)
{
// it writes the channel select before reading this.. so either it works on channels, or the command..
- // read in irq5
- printf("%08x: l7a1045_sound_port_0004_r mask (%04x) chn %04x\n", space.device().safe_pc(), mem_mask, m_audiochannel);
+
+ // buriki reads registers 03/05/00 these at the moment, others don't
+ // also reads 06
+
+ switch (m_audioregister)
+ {
+ default:
+
+ case 0x01:
+ case 0x02:
+ case 0x04:
+ case 0x07:
+ case 0x08:
+ case 0x09:
+ case 0x0a:
+ printf("%08x: unexpected read port 0x0004 register %02x chansel %02x (%04x%04x%04x)\n", space.device().safe_pc(), m_audioregister, m_audiochannel, m_audiodat[m_audioregister][m_audiochannel].dat[0], m_audiodat[m_audioregister][m_audiochannel].dat[1], m_audiodat[m_audioregister][m_audiochannel].dat[2]);
+ break;
+
+ case 0x03:
+ case 0x05:
+ case 0x00:
+ case 0x06:
+ //printf("%08x: read port 0x0004 register %02x chansel %02x (%04x%04x%04x)\n", space.device().safe_pc(), m_audioregister, m_audiochannel, m_audiodat[m_audioregister][m_audiochannel].dat[0], m_audiodat[m_audioregister][m_audiochannel].dat[1], m_audiodat[m_audioregister][m_audiochannel].dat[2]);
+ break;
+
+
+ }
return rand();
}
READ16_MEMBER(l7a1045_sound_device::l7a1045_sound_port_0006_r)
{
// it writes the channel select before reading this.. so either it works on channels, or the command..
- // read in irq5
- printf("%08x: l7a1045_sound_port_0006_r mask (%04x) chn %04x\n", space.device().safe_pc(), mem_mask, m_audiochannel);
+
+ // buriki reads register 00
+
+ switch (m_audioregister)
+ {
+ default:
+
+ case 0x01:
+ case 0x02:
+ case 0x03:
+ case 0x04:
+ case 0x05:
+ case 0x06:
+ case 0x07:
+ case 0x08:
+ case 0x09:
+ case 0x0a:
+ printf("%08x: unexpected read port 0x0006 register %02x chansel %02x (%04x%04x%04x)\n", space.device().safe_pc(), m_audioregister, m_audiochannel, m_audiodat[m_audioregister][m_audiochannel].dat[0], m_audiodat[m_audioregister][m_audiochannel].dat[1], m_audiodat[m_audioregister][m_audiochannel].dat[2]);
+ break;
+
+ case 0x00:
+ //printf("%08x: read port 0x0006 register %02x chansel %02x (%04x%04x%04x)\n", space.device().safe_pc(), m_audioregister, m_audiochannel, m_audiodat[m_audioregister][m_audiochannel].dat[0], m_audiodat[m_audioregister][m_audiochannel].dat[1], m_audiodat[m_audioregister][m_audiochannel].dat[2]);
+ break;
+ }
return rand();
}
diff --git a/src/emu/sound/l7a1045_l6028_dsp_a.h b/src/emu/sound/l7a1045_l6028_dsp_a.h
index f2dabc5bc95..d37b7945346 100644
--- a/src/emu/sound/l7a1045_l6028_dsp_a.h
+++ b/src/emu/sound/l7a1045_l6028_dsp_a.h
@@ -45,13 +45,14 @@ private:
// UINT16 m_key;
// INT8* m_base;
- UINT16 m_audiochannel;
+ UINT8 m_audiochannel;
+ UINT8 m_audioregister;
struct l7a1045_48bit_data {
UINT16 dat[3];
};
- l7a1045_48bit_data m_audiodat[0x10000];
+ l7a1045_48bit_data m_audiodat[0x10][0x20];
DECLARE_WRITE16_MEMBER(l7a1045_sound_select_w);
DECLARE_WRITE16_MEMBER(l7a1045_sound_data_02_w);
diff --git a/src/mame/audio/hng64.c b/src/mame/audio/hng64.c
index 40ec0810572..c09258d3539 100644
--- a/src/mame/audio/hng64.c
+++ b/src/mame/audio/hng64.c
@@ -371,6 +371,8 @@ MACHINE_CONFIG_FRAGMENT( hng64_audio )
MCFG_V53_TCU_OUT1_HANDLER(WRITELINE(hng64_state, tcu_tm1_cb))
MCFG_V53_TCU_OUT2_HANDLER(WRITELINE(hng64_state, tcu_tm2_cb))
+ MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
+
MCFG_SOUND_ADD("l7a1045", L7A1045, 16000000 ) // ??
MCFG_SOUND_ROUTE(1, "lspeaker", 1.0)
MCFG_SOUND_ROUTE(0, "rspeaker", 1.0)