diff --git a/src/synth.c b/src/synth.c index 0fe3539..ddd857d 100644 --- a/src/synth.c +++ b/src/synth.c @@ -44,10 +44,11 @@ static u8 volumeAdjustedTotalLevel(u8 channel, u8 totalLevel); static void channelParameterUpdated(u8 channel); static void otherParameterUpdated(u8 channel, ParameterUpdated parameterUpdated); static void writeRegSafe(u8 part, u8 reg, u8 data); +static void releaseZ80Bus(void); void synth_init(const FmChannel* initialPreset) { - // Z80_loadDriver(Z80_DRIVER_PCM, true); + Z80_loadDriver(Z80_DRIVER_PCM, true); Z80_requestBus(TRUE); writeSpecialModeReg(); for (u8 chan = 0; chan < MAX_FM_CHANS; chan++) { @@ -57,7 +58,7 @@ void synth_init(const FmChannel* initialPreset) updateChannel(chan); } writeGlobalLfo(); - Z80_releaseBus(); + releaseZ80Bus(); } static void updateChannel(u8 chan) @@ -454,6 +455,12 @@ static void writeRegSafe(u8 part, u8 reg, u8 data) bool takenAlready = Z80_getAndRequestBus(TRUE); YM2612_writeReg(part, reg, data); if (!takenAlready) { - Z80_releaseBus(); + releaseZ80Bus(); } } + +static void releaseZ80Bus(void) +{ + YM2612_write(0, 0x2A); // Latch reg address for PCM driver + Z80_releaseBus(); +} diff --git a/tests/Makefile b/tests/Makefile index f392053..1201cfa 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -107,6 +107,7 @@ MOCKS=midi_process \ MD_MOCKS=SYS_setVIntCallback \ VDP_setTextPalette \ YM2612_writeReg \ + YM2612_write \ VDP_drawText \ VDP_clearText \ VDP_setBackgroundColor \ diff --git a/tests/asserts.c b/tests/asserts.c index effeded..c97bd01 100644 --- a/tests/asserts.c +++ b/tests/asserts.c @@ -81,9 +81,14 @@ void _expect_ym2612_write_reg_any_data(u8 part, u8 reg, const char* const file, #endif expect_value_with_pos(__wrap_Z80_getAndRequestBus, wait, TRUE, file, line); will_return_with_pos(__wrap_Z80_getAndRequestBus, false, file, line); + expect_any_with_pos(__wrap_YM2612_writeReg, part, file, line); expect_any_with_pos(__wrap_YM2612_writeReg, reg, file, line); expect_any_with_pos(__wrap_YM2612_writeReg, data, file, line); + + expect_value_with_pos(__wrap_YM2612_write, port, 0, file, line); + expect_value_with_pos(__wrap_YM2612_write, data, 0x2A, file, line); + expect_function_call(__wrap_Z80_releaseBus); } @@ -96,6 +101,9 @@ void expect_ym2612_write_operator_any_data(u8 chan, u8 op, u8 baseReg) expect_value(__wrap_YM2612_writeReg, reg, baseReg + REG_OFFSET(chan) + (regOpIndex(op) * 4)); expect_any(__wrap_YM2612_writeReg, data); + expect_value(__wrap_YM2612_write, port, 0); + expect_value(__wrap_YM2612_write, data, 0x2A); + expect_function_call(__wrap_Z80_releaseBus); } @@ -138,9 +146,14 @@ void _expect_ym2612_write_reg(u8 part, u8 reg, u8 data, const char* const file, #endif expect_value(__wrap_Z80_getAndRequestBus, wait, TRUE); will_return(__wrap_Z80_getAndRequestBus, false); + expect_value_with_pos(__wrap_YM2612_writeReg, part, part, file, line); expect_value_with_pos(__wrap_YM2612_writeReg, reg, reg, file, line); expect_value_with_pos(__wrap_YM2612_writeReg, data, data, file, line); + + expect_value_with_pos(__wrap_YM2612_write, port, 0, file, line); + expect_value_with_pos(__wrap_YM2612_write, data, 0x2A, file, line); + expect_function_call(__wrap_Z80_releaseBus); } diff --git a/tests/unit/test_synth.c b/tests/unit/test_synth.c index 62523f1..9825b45 100644 --- a/tests/unit/test_synth.c +++ b/tests/unit/test_synth.c @@ -20,6 +20,8 @@ static void set_initial_registers(void) expect_any(__wrap_YM2612_writeReg, data); } + expect_value(__wrap_YM2612_write, port, 0); + expect_value(__wrap_YM2612_write, data, 0x2A); expect_function_call(__wrap_Z80_releaseBus); const FmChannel M_BANK_0_INST_0_GRANDPIANO = { 0, 0, 3, 0, 0, 0, 0, @@ -37,14 +39,14 @@ static void loads_pcm_driver(void) static int test_synth_setup(UNUSED void** state) { updated = false; - // loads_pcm_driver(); + loads_pcm_driver(); set_initial_registers(); return 0; } static void test_synth_init_sets_initial_registers(UNUSED void** state) { - // loads_pcm_driver(); + loads_pcm_driver(); set_initial_registers(); } @@ -744,6 +746,8 @@ static void test_requests_Z80_bus_if_not_already_taken(UNUSED void** state) expect_value(__wrap_YM2612_writeReg, reg, 0x2B); expect_value(__wrap_YM2612_writeReg, data, 0); + expect_value(__wrap_YM2612_write, port, 0); + expect_value(__wrap_YM2612_write, data, 0x2A); expect_function_call(__wrap_Z80_releaseBus); __real_synth_directWriteYm2612(0, 0x2B, 0); diff --git a/tests/wraps.c b/tests/wraps.c index 1ef315b..c19a8bc 100644 --- a/tests/wraps.c +++ b/tests/wraps.c @@ -406,6 +406,14 @@ void __wrap_YM2612_writeReg(const u16 part, const u8 reg, const u8 data) check_expected(data); } +void __wrap_YM2612_write(const u16 port, const u8 data) +{ + if (disableChecks) + return; + check_expected(port); + check_expected(data); +} + void __wrap_VDP_drawText(const char* str, u16 x, u16 y) { } diff --git a/tests/wraps.h b/tests/wraps.h index db88198..e3293e6 100644 --- a/tests/wraps.h +++ b/tests/wraps.h @@ -179,6 +179,7 @@ extern void __real_scheduler_addFrameHandler(HandlerFunc* onFrame); /* SDGK wraps */ void __wrap_YM2612_writeReg(const u16 part, const u8 reg, const u8 data); +void __wrap_YM2612_write(const u16 port, const u8 data); void __wrap_VDP_drawText(const char* str, u16 x, u16 y); void __wrap_SYS_setVIntCallback(VoidCallback* CB); void __wrap_VDP_setTextPalette(u16 palette);