From fee2bc8c28b66659ec3397f3582bf8128ce678a3 Mon Sep 17 00:00:00 2001 From: EkeEke Date: Sun, 7 Jan 2018 16:44:14 +0100 Subject: [PATCH] [Core/Sound] added accurate YM2612 status & BUSY flag emulation for MAME core (verified on discrete and ASIC-integrated chips) --- HISTORY.txt | 5 +- builds/genesis_plus_gx_libretro.dll | Bin 2736276 -> 2737419 bytes builds/genplus_cube.dol | Bin 3396544 -> 3422944 bytes builds/genplus_wii.dol | Bin 3590432 -> 3638688 bytes core/sound/sound.c | 329 +++++++++++++++++----------- core/sound/sound.h | 8 +- core/sound/ym2612.c | 7 +- core/sound/ym2612.h | 2 +- 8 files changed, 215 insertions(+), 136 deletions(-) diff --git a/HISTORY.txt b/HISTORY.txt index 74dc370fc..b8ce8aca6 100644 --- a/HISTORY.txt +++ b/HISTORY.txt @@ -121,7 +121,10 @@ Genesis Plus GX 1.7.5 (xx/xx/xxxx) (Eke-Eke) [Core/Sound] --------------- -* added discrete YM2612 DAC distortion emulation (optional) +* replaced configurable YM2612 DAC quantization by configurable YM2612 chip model emulation (discrete, ASIC-integrated or enhanced) +* added DAC distortion emulation for discrete YM2612 chip model +* added accurate status & BUSY flag emulation for discrete and ASIC-integrated YM2612 chip models (verified on real hardware) +* improved 9-bit DAC quantization accuracy for discrete and ASIC-integrated YM2612 chip models (verified on YM2612 die) * rewrote optimized & more accurate PSG core from scratch * removed PSG boost noise feature & added optional high-quality PSG resampling * fixed YM2612 self-feedback regression introduced in 1.7.1 diff --git a/builds/genesis_plus_gx_libretro.dll b/builds/genesis_plus_gx_libretro.dll index 11df31ee7c3114c523b5d2523bc2cce9de0af7d2..42ea4b98d79f50fe55591bf2ee30d37fc58a31ff 100644 GIT binary patch delta 152054 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