diff --git a/src/engine/platform/nes.cpp b/src/engine/platform/nes.cpp index 8ca8d1f1..6f71cad5 100644 --- a/src/engine/platform/nes.cpp +++ b/src/engine/platform/nes.cpp @@ -53,6 +53,10 @@ const char* regCheatSheetNES[]={ NULL }; +unsigned char _readDMC(void* user, unsigned short addr) { + return ((DivPlatformNES*)user)->readDMC(addr); +} + const char** DivPlatformNES::getRegisterSheet() { return regCheatSheetNES; } @@ -633,6 +637,11 @@ void DivPlatformNES::setNSFPlay(bool use) { useNP=use; } +unsigned char DivPlatformNES::readDMC(unsigned short addr) { + printf("read from DMC! %x\n",addr); + return 0; +} + int DivPlatformNES::init(DivEngine* p, int channels, int sugRate, unsigned int flags) { parent=p; apuType=flags; @@ -643,12 +652,14 @@ int DivPlatformNES::init(DivEngine* p, int channels, int sugRate, unsigned int f nes1_NP->SetOption(xgm::NES_APU::OPT_NONLINEAR_MIXER,1); nes2_NP=new xgm::NES_DMC; nes2_NP->SetOption(xgm::NES_DMC::OPT_NONLINEAR_MIXER,1); - nes2_NP->SetMemory([](unsigned short addr, unsigned int& data) { - data=0; + nes2_NP->SetMemory([this](unsigned short addr, unsigned int& data) { + data=readDMC(addr); }); nes2_NP->SetAPU(nes1_NP); } else { nes=new struct NESAPU; + nes->readDMC=_readDMC; + nes->readDMCUser=this; } writeOscBuf=0; for (int i=0; i<5; i++) { diff --git a/src/engine/platform/nes.h b/src/engine/platform/nes.h index 8b898c7f..cb58c386 100644 --- a/src/engine/platform/nes.h +++ b/src/engine/platform/nes.h @@ -93,6 +93,7 @@ class DivPlatformNES: public DivDispatch { void muteChannel(int ch, bool mute); bool keyOffAffectsArp(int ch); float getPostAmp(); + unsigned char readDMC(unsigned short addr); void setNSFPlay(bool use); void setFlags(unsigned int flags); void notifyInsDeletion(void* ins); diff --git a/src/engine/platform/sound/nes/apu.h b/src/engine/platform/sound/nes/apu.h index 224ea2a0..d0f9c31f 100644 --- a/src/engine/platform/sound/nes/apu.h +++ b/src/engine/platform/sound/nes/apu.h @@ -207,7 +207,7 @@ enum apu_mode { APU_60HZ, APU_48HZ }; break;\ }\ {\ - a->DMC.buffer = 0;\ + a->DMC.buffer = a->readDMC(a->readDMCUser,a->DMC.address);\ }\ /* incremento gli hwtick da compiere */\ if (hwtick) { hwtick[0] += tick; }\ @@ -525,6 +525,8 @@ EXTERNC struct NESAPU { _apuTriangle TR; _apuNoise NS; _apuDMC DMC; + void* readDMCUser; + unsigned char (*readDMC)(void*,unsigned short); unsigned char muted[5]; };