カテゴリ 重要度 ステータス 解決状況 登録日時 最終更新
サウンド仮承認未処理2015-11-16 00:142017-08-30 19:58
 
テスターNRS担当者 ソースnemesis.cpp
バージョン0.167発生バージョン修正バージョン
フラグ実機・資料検証済み
セット gwarrior, salamand
セット詳細
gwarrior - ギャラクティックウォリアーズ
salamand - 沙羅曼蛇 (version D)
 
概 要音声の不具合多数。
詳 細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: <
?t=19m54s>)
再現手順gwarrior: Start a new game, listen to the music pausing while letters appear.
salamand: Destroy the red planet at the end of level 6.
追加情報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:
---
WRITE8_MEMBER(nemesis_state::salamand_speech_start_w)
{
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 (
?t=3m39s;
)


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;
---
add:
---
m_latch_data = 0;
 
添付ファイル