Viewing Issue Advanced Details
ID Category [?] Severity [?] Reproducibility Date Submitted Last Update
06077 Sound Minor Always Nov 15, 2015, 15:14 Jul 5, 2023, 21:35
Tester NRS View Status Public Platform MAME (Official Binary)
Assigned To Resolution Open OS Windows Vista/7/8 (64-bit)
Status [?] Acknowledged Driver
Version 0.167 Fixed in Version Build Normal
Fixed in Git Commit Github Pull Request #
Summary 06077: gwarrior, salamand: Various speech problems in nemesis.c games
Description gwarrior: Music freezes when letters appear. The "lettering" sound effect is not played for every letter.
salamand: The "waaah" speech played when the red planet in level 6 combusts is played too slowly (compared to: <
Steps To Reproduce gwarrior: Start a new game, listen to the music pausing while letters appear.
salamand: Destroy the red planet at the end of level 6.
Additional Information These are all caused by not properly connecting the RST line to the VLM5030. Based on debugging the sound code, the following changes fix these issues while not introducing new ones, to my knowledge. In mame/drivers/nemesis.c:

1. In "gx400_sound_map", change the line containing gx400_speech_start_w from this:
AM_RANGE(0xe030, 0xe030) AM_WRITE(gx400_speech_start_w)
to this:
AM_RANGE(0xe010, 0xe07f) AM_WRITE(gx400_speech_start_w)

2. Replace gx400_speech_start_w with this:
WRITE8_MEMBER(nemesis_state::gx400_speech_start_w) {
switch ((offset+0x10) & 0xF8) {
case 0x10: m_vlm->st (0); break;
case 0x20: m_vlm->st (1); break;
case 0x30: m_vlm->vcu(0); break;
case 0x40: m_vlm->vcu(1); break;
case 0x48: m_vlm->rst(0); break;
case 0x58: m_vlm->rst(1); break;
default: break;

3. Replace nemesis_state::nemesis_portA_r with this:
READ8_MEMBER(nemesis_state::nemesis_portA_r) {
/* bit 0-3: timer
        bit 4 6: unused (always high)
        bit 5: vlm5030 busy
        bit 7: unused by this software version. Bubble Memory version uses this bit. */

int result;
result = (m_audiocpu->total_cycles() >> 10) & 0x0F;
if (m_vlm != NULL) result |= (m_vlm->bsy())? 0x20: 0x00;
result |= 0xD0;
return result;

4. Replace salamand_speech_start_w with this:
switch (data) {
case 5: m_vlm->rst(1); break;
case 1: m_vlm->rst(0); break;
case 2: m_vlm->st (1); break;
case 0: m_vlm->st (0); break;
default: break;
This also removes the stray "speed up" sample during reset, which is not heard in a real board (

5. Replace wd_r with this:
READ8_MEMBER(nemesis_state::wd_r) // Read by sound CPU after raising VLM5030's RST or ST line
if (m_vlm != NULL) return (m_vlm->bsy()); else return 0;

6. This exposes the problem that twinbee raises the reset line without first updating the VLM5030's latch. This means that when RST is raised, the latch must be set to 0 in the VLM5030 emulation. This seems to be okay with other games which use RST for setup information because they first raise RST, then write to the latch, then lower RST which processes the latch data. Therefore, in emu/sound/vlm5030.c:

In vlm5030_device::rst, after
if( state )
{ /* L -> H : reset chip */
m_pin_RST = 1;
m_latch_data = 0;
Github Commit
Flags Verified with Original
Regression Version
Affected Sets / Systems gwarrior, salamand
Attached Files
There are no relationship linked to this issue.
User avatar
Nov 17, 2015, 17:17
I can quickly confirm the gwarrior audio issues and I thought it was a known bug. I'll assign as direction needed for now to have someone capable look over the code/changes who might know more about the speech side of things.
User avatar
Aug 30, 2017, 10:58
> salamand: The "waaah" speech played when the red planet in level 6 combusts is played too slowly

The waaaah voice is fixed in 0.189 by AJR.
User avatar
Jan 6, 2022, 19:18
Fixed in version 239 ?
User avatar
Jul 5, 2023, 21:35
edited on: Jul 5, 2023, 21:47
Yeah, gwarrior was also fixed a while ago. I think over here:
with typo correction right after:

Though I'm pretty sure RST is on bit 6, not 4, which is done here: