diff options
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 |
commit | 71e84b82e33a68a091239080f15da85e95dafe76 (patch) | |
tree | 9012aac8b591a601b4e00cd7d99524d7e5c2bdcf | |
parent | 6abbb73744f8ccd387b23dd7095bf49ff2988e1d (diff) |
document used register read/writes (nw)
-rw-r--r-- | src/emu/sound/l7a1045_l6028_dsp_a.c | 190 | ||||
-rw-r--r-- | src/emu/sound/l7a1045_l6028_dsp_a.h | 5 | ||||
-rw-r--r-- | src/mame/audio/hng64.c | 2 |
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) |