From f17c9dbb2265374afd4df52f44bffbbafaeb7886 Mon Sep 17 00:00:00 2001 From: TomW Date: Tue, 24 Nov 2015 20:47:49 +0000 Subject: [PATCH] PSG noise latch only reset on change of noise type, not on any noise control write (not sure if this change is strictly correct). Tweaked noise frequency. Fixes noise in Zak McKracken. --- src/sound_sn76489.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/sound_sn76489.c b/src/sound_sn76489.c index 5d3ed0f..63006aa 100644 --- a/src/sound_sn76489.c +++ b/src/sound_sn76489.c @@ -58,7 +58,7 @@ void sn76489_poll(void *p) sn76489->count[0] -= (512 * PSGCONST); while ((int)sn76489->count[0] < 0 && sn76489->latch[0]) { - sn76489->count[0] += (sn76489->latch[0] * 2); + sn76489->count[0] += (sn76489->latch[0] * 4); if (!(sn76489->noise & 4)) { if (sn76489->shift & 1) @@ -135,8 +135,8 @@ void sn76489_write(uint16_t addr, uint8_t data, void *p) sn76489->vol[1] = 0xf - data; break; case 0x60: - sn76489->shift = 0x4000; - if ((data & 3) != (sn76489->noise & 3)) sn76489->count[0] = 0; + if ((data & 4) != (sn76489->noise & 4)) + sn76489->shift = 0x4000; sn76489->noise = data & 0xf; if ((data & 3) == 3) sn76489->latch[0] = sn76489->latch[1]; else sn76489->latch[0] = 0x400 << (data & 3); @@ -153,9 +153,8 @@ void sn76489_write(uint16_t addr, uint8_t data, void *p) { if ((sn76489->firstdat & 0x70) == 0x60) { - sn76489->shift = 0x4000; - if ((data & 3) != (sn76489->noise & 3)) - sn76489->count[0] = 0; + if ((data & 4) != (sn76489->noise & 4)) + sn76489->shift = 0x4000; sn76489->noise = data & 0xf; if ((data & 3) == 3) sn76489->latch[0] = sn76489->latch[1]; else sn76489->latch[0] = 0x400 << (data & 3);