опять ничерта не понимаю что тут происходит... и где. это поможет?
Да, это исправляет ошибку. Забавно, что я случайно нашёл этот баг, когда сравнивал asm-код, а тут уже решено.
bit 6,(IX+CCBFLAGS) ; envelope retrigger on?
ret Z
push BC ; yes - trigger the envelope
ld C,(IX+CCBENV)
ld E,B
call TRIGENVНужно было 6-й бит выставлять if (ChnCCB[CCBFLAGS] & 0x40).
Странно, что сам автор не выложил у себя на
https://github.com/ValleyBell/.
Обновил
https://github.com/infval/GEMSPlay, добавил также if (Read24Bit(SAMP.PTR) > 0x2000000), сделал GEMSPlay тоже совместимым с XP в Release/x86, жирненькие получились файлы.
Скомпилированные файлы здесь
https://github.com/infval/GEMSPlay/releases. Нумерация версий своя, считал с 1.0.0, поэтому 1.0.3.
Ещё можно повысить точность, обновив fm2612 и sn76489, но вряд ли будет заметна разница.
В сравнении с
https://github.com/mamedev/mame/blob/master/src/devices/sound/fm2612.cppУ функций TimerAOver и TimerBOver:
ST->TAC += (1024-ST->TA);
ST->TAC = (1024-ST->TA);
У update_phase_lfo_slot и update_phase_lfo_channel
был косяк int kc = (blk<<2) | opn_fktable[fn >> 7];
ValleyBell исправил int kc = (blk<<2) | opn_fktable[fn >> 8];
но у MAME теперь int kc = (blk<<2) | opn_fktable[(fn >> 7) & 0xf];
И в этих функциях есть различия: ym2612_update_one, ym2612_write.
https://github.com/ValleyBell/libvgm/blob/master/emu/cores/sn76489.cЗдесь немного SN76489_Update