[Core/Sound] fixed MAME YM2612 core potential issue with SSG-EG inverted attenuation level on Key OFF

This commit is contained in:
ekeeke 2021-05-11 00:42:27 +02:00
parent 6d10dd30ff
commit 346935fdda
5 changed files with 6 additions and 2 deletions

View File

@ -151,6 +151,7 @@ Genesis Plus GX 1.7.5 (xx/xx/xxxx) (Eke-Eke)
* fixed YM2612 one-sample extra delay on operator1 output * fixed YM2612 one-sample extra delay on operator1 output
* fixed YM2612 LFO PM implementation: block & keyscale code should not be modified by LFO (verified on YM2612 die) * fixed YM2612 LFO PM implementation: block & keyscale code should not be modified by LFO (verified on YM2612 die)
* fixed YM2612 Timer B overflow handling * fixed YM2612 Timer B overflow handling
* fixed YM2612 potential issue with SSG-EG inverted attenuation level on Key OFF
* fixed YM2413 carrier/modulator phase reset after channel Key ON (fixes Japanese Master System BIOS music) * fixed YM2413 carrier/modulator phase reset after channel Key ON (fixes Japanese Master System BIOS music)
* fixed YM2413 intruments ROM (verified on YM2413B die) * fixed YM2413 intruments ROM (verified on YM2413B die)

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 MiB

After

Width:  |  Height:  |  Size: 3.8 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 MiB

After

Width:  |  Height:  |  Size: 4.0 MiB

View File

@ -20,6 +20,9 @@
/* /*
** CHANGELOG: ** CHANGELOG:
** **
** 11-05-2021 Eke-Eke (Genesis Plus GX):
** - fixed potential issue with SSG-EG inverted attenuation level on Key OFF
**
** 03-12-2017 Eke-Eke (Genesis Plus GX): ** 03-12-2017 Eke-Eke (Genesis Plus GX):
** - improved 9-bit DAC emulation accuracy ** - improved 9-bit DAC emulation accuracy
** - added discrete YM2612 DAC distortion emulation ("ladder effect") ** - added discrete YM2612 DAC distortion emulation ("ladder effect")
@ -684,7 +687,7 @@ INLINE void FM_KEYOFF(FM_CH *CH , int s )
{ {
/* convert EG attenuation level */ /* convert EG attenuation level */
if (SLOT->ssgn ^ (SLOT->ssg&0x04)) if (SLOT->ssgn ^ (SLOT->ssg&0x04))
SLOT->volume = (0x200 - SLOT->volume); SLOT->volume = (0x200 - SLOT->volume) & MAX_ATT_INDEX;
/* force EG attenuation level */ /* force EG attenuation level */
if (SLOT->volume >= 0x200) if (SLOT->volume >= 0x200)
@ -749,7 +752,7 @@ INLINE void FM_KEYOFF_CSM(FM_CH *CH , int s )
{ {
/* convert EG attenuation level */ /* convert EG attenuation level */
if (SLOT->ssgn ^ (SLOT->ssg&0x04)) if (SLOT->ssgn ^ (SLOT->ssg&0x04))
SLOT->volume = (0x200 - SLOT->volume); SLOT->volume = (0x200 - SLOT->volume) & MAX_ATT_INDEX;
/* force EG attenuation level */ /* force EG attenuation level */
if (SLOT->volume >= 0x200) if (SLOT->volume >= 0x200)