diff --git a/src/engine/dispatchContainer.cpp b/src/engine/dispatchContainer.cpp index 8d8db5c5..f116b1ca 100644 --- a/src/engine/dispatchContainer.cpp +++ b/src/engine/dispatchContainer.cpp @@ -179,8 +179,7 @@ void DivDispatchContainer::init(DivSystem sys, DivEngine* eng, int chanCount, do switch (sys) { case DIV_SYSTEM_YMU759: - dispatch=new DivPlatformOPL; - ((DivPlatformOPL*)dispatch)->setOPLType(759,false); + dispatch=new DivPlatformOPL(759,false); break; case DIV_SYSTEM_YM2612: dispatch=new DivPlatformGenesis; @@ -278,36 +277,20 @@ void DivDispatchContainer::init(DivSystem sys, DivEngine* eng, int chanCount, do ((DivPlatformOPLL*)dispatch)->setProperDrums(sys==DIV_SYSTEM_OPLL_DRUMS); break; case DIV_SYSTEM_OPL: - dispatch=new DivPlatformOPL; - ((DivPlatformOPL*)dispatch)->setOPLType(1,false); - break; case DIV_SYSTEM_OPL_DRUMS: - dispatch=new DivPlatformOPL; - ((DivPlatformOPL*)dispatch)->setOPLType(1,true); + dispatch=new DivPlatformOPL(1,sys==DIV_SYSTEM_OPL_DRUMS); break; case DIV_SYSTEM_OPL2: - dispatch=new DivPlatformOPL; - ((DivPlatformOPL*)dispatch)->setOPLType(2,false); - break; case DIV_SYSTEM_OPL2_DRUMS: - dispatch=new DivPlatformOPL; - ((DivPlatformOPL*)dispatch)->setOPLType(2,true); + dispatch=new DivPlatformOPL(2,sys==DIV_SYSTEM_OPL2_DRUMS); break; case DIV_SYSTEM_OPL3: - dispatch=new DivPlatformOPL; - ((DivPlatformOPL*)dispatch)->setOPLType(3,false); - break; case DIV_SYSTEM_OPL3_DRUMS: - dispatch=new DivPlatformOPL; - ((DivPlatformOPL*)dispatch)->setOPLType(3,true); + dispatch=new DivPlatformOPL(3,sys==DIV_SYSTEM_OPL3_DRUMS); break; case DIV_SYSTEM_Y8950: - dispatch=new DivPlatformOPL; - ((DivPlatformOPL*)dispatch)->setOPLType(8950,false); - break; case DIV_SYSTEM_Y8950_DRUMS: - dispatch=new DivPlatformOPL; - ((DivPlatformOPL*)dispatch)->setOPLType(8950,true); + dispatch=new DivPlatformOPL(8950,sys==DIV_SYSTEM_Y8950_DRUMS); break; case DIV_SYSTEM_OPZ: dispatch=new DivPlatformTX81Z; diff --git a/src/engine/platform/opl.cpp b/src/engine/platform/opl.cpp index 78ef25a2..a808ab62 100644 --- a/src/engine/platform/opl.cpp +++ b/src/engine/platform/opl.cpp @@ -1580,6 +1580,14 @@ void DivPlatformOPL::setOPLType(int type, bool drums) { pretendYMU=false; downsample=false; adpcmChan=-1; + // Vaild type value: + // 1 (YM3526) + // 2 (YM3812) + // 3 (YMF262) + // 4 (YMF278; Not implemented) + // 289 (YMF289; Not implemented) + // 759 (YMU759) + // 8950 (Y8950) switch (type) { case 1: case 2: case 8950: slotsNonDrums=slotsOPL2; @@ -1595,7 +1603,7 @@ void DivPlatformOPL::setOPLType(int type, bool drums) { adpcmChan=drums?11:9; } break; - case 3: case 4: case 759: + case 3: case 4: case 289: case 759: slotsNonDrums=slotsOPL3; slotsDrums=slotsOPL3Drums; slots=drums?slotsDrums:slotsNonDrums; @@ -1608,14 +1616,14 @@ void DivPlatformOPL::setOPLType(int type, bool drums) { if (type==759) { pretendYMU=true; adpcmChan=16; - } else if (type==4) { + } else if (type==4 || type==289) { chipFreqBase=32768*684; downsample=true; } break; } chipType=type; - if (type==759 || type==4) { + if (type==759 || type==289 || type==4) { oplType=3; } else if (type==8950) { oplType=1; @@ -1698,6 +1706,7 @@ void DivPlatformOPL::setFlags(unsigned int flags) { chipRateBase=rate; break; case 4: + case 289: switch (flags&0xff) { case 0x01: chipClock=COLOR_PAL*32.0/5.0; diff --git a/src/engine/platform/opl.h b/src/engine/platform/opl.h index e3b16679..a885814a 100644 --- a/src/engine/platform/opl.h +++ b/src/engine/platform/opl.h @@ -151,6 +151,10 @@ class DivPlatformOPL: public DivDispatch { void renderSamples(); int init(DivEngine* parent, int channels, int sugRate, unsigned int flags); void quit(); + DivPlatformOPL(int type, bool drums): + DivDispatch() { + setOPLType(type,drums); + } ~DivPlatformOPL(); }; #endif