From 19235a19a77e2da047f2d7a3d969560f8ce9e790 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Fri, 23 Dec 2022 22:36:14 -0500 Subject: [PATCH 01/25] GUI: more window debug messages --- src/gui/gui.cpp | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 6fbc1681..0149cc65 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -3101,14 +3101,32 @@ bool FurnaceGUI::loop() { scrX=ev.window.data1; scrY=ev.window.data2; updateWindow=true; + logV("window moved to %dx%d",scrX,scrY); + break; + case SDL_WINDOWEVENT_SIZE_CHANGED: + logV("window size changed to %dx%d",ev.window.data1,ev.window.data2); + break; + case SDL_WINDOWEVENT_MINIMIZED: + logV("window minimized"); break; case SDL_WINDOWEVENT_MAXIMIZED: scrMax=true; updateWindow=true; + logV("window maximized"); break; case SDL_WINDOWEVENT_RESTORED: scrMax=false; updateWindow=true; + logV("window restored"); + break; + case SDL_WINDOWEVENT_SHOWN: + logV("window shown"); + break; + case SDL_WINDOWEVENT_HIDDEN: + logV("window hidden"); + break; + case SDL_WINDOWEVENT_EXPOSED: + logV("window exposed"); break; } break; @@ -3196,7 +3214,12 @@ bool FurnaceGUI::loop() { } else { //logV("updateWindow: canvas size %dx%d",canvasW,canvasH); // and therefore window size + int prevScrW=scrW; + int prevScrH=scrH; SDL_GetWindowSize(sdlWin,&scrW,&scrH); + if (prevScrW!=scrW || prevScrH!=scrH) { + logV("size change 2: %dx%d (from %dx%d)",scrW,scrH,prevScrW,prevScrH); + } } wantCaptureKeyboard=ImGui::GetIO().WantTextInput; From 5ecc79f8b9a7dbf7153bd0cda449747513085848 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Fri, 23 Dec 2022 22:54:55 -0500 Subject: [PATCH 02/25] fix --- extern/imgui_patched/backends/imgui_impl_sdl.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extern/imgui_patched/backends/imgui_impl_sdl.cpp b/extern/imgui_patched/backends/imgui_impl_sdl.cpp index 00c55ae8..47d10bbb 100644 --- a/extern/imgui_patched/backends/imgui_impl_sdl.cpp +++ b/extern/imgui_patched/backends/imgui_impl_sdl.cpp @@ -680,8 +680,8 @@ void ImGui_ImplSDL2_NewFrame() int w, h; int display_w, display_h; SDL_GetWindowSize(bd->Window, &w, &h); - if (SDL_GetWindowFlags(bd->Window) & SDL_WINDOW_MINIMIZED) - w = h = 0; + /*if (SDL_GetWindowFlags(bd->Window) & SDL_WINDOW_MINIMIZED) + w = h = 0;*/ if (bd->Renderer != NULL) SDL_GetRendererOutputSize(bd->Renderer, &display_w, &display_h); else From 85d43a84a70796ea12bcbdb0a885bb3e1168a38f Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sat, 24 Dec 2022 00:15:15 -0500 Subject: [PATCH 03/25] make OPN channel offsets common --- src/engine/platform/fmshared_OPN.h | 9 ++++++++- src/engine/platform/genesis.h | 2 +- src/engine/platform/ym2203.h | 2 +- src/engine/platform/ym2608.h | 2 +- src/engine/platform/ym2610.cpp | 2 +- src/engine/platform/ym2610.h | 4 ++-- src/engine/platform/ym2610b.cpp | 2 +- src/engine/platform/ym2610b.h | 4 ++-- src/engine/platform/ym2610shared.h | 25 +++++++++---------------- src/gui/debug.cpp | 11 +++++------ 10 files changed, 31 insertions(+), 32 deletions(-) diff --git a/src/engine/platform/fmshared_OPN.h b/src/engine/platform/fmshared_OPN.h index 610e6160..e24b9cb3 100644 --- a/src/engine/platform/fmshared_OPN.h +++ b/src/engine/platform/fmshared_OPN.h @@ -146,6 +146,8 @@ class DivPlatformOPN: public DivPlatformFMBase { pan(3) {} }; + const int extChanOffs, psgChanOffs, adpcmAChanOffs, adpcmBChanOffs, chanNum; + double fmFreqBase; unsigned int fmDivBase; unsigned int ayDiv; @@ -157,8 +159,13 @@ class DivPlatformOPN: public DivPlatformFMBase { friend void putDispatchChip(void*,int); friend void putDispatchChan(void*,int,int); - DivPlatformOPN(double f=9440540.0, unsigned int d=72, unsigned int a=32, bool isExtSys=false, unsigned char cc=255): + DivPlatformOPN(int ext, int psg, int adpcmA, int adpcmB, int chanCount, double f=9440540.0, unsigned int d=72, unsigned int a=32, bool isExtSys=false, unsigned char cc=255): DivPlatformFMBase(), + extChanOffs(ext), + psgChanOffs(psg), + adpcmAChanOffs(adpcmA), + adpcmBChanOffs(adpcmB), + chanNum(chanCount), fmFreqBase(f), fmDivBase(d), ayDiv(a), diff --git a/src/engine/platform/genesis.h b/src/engine/platform/genesis.h index 1b017922..2a7b2c8d 100644 --- a/src/engine/platform/genesis.h +++ b/src/engine/platform/genesis.h @@ -126,7 +126,7 @@ class DivPlatformGenesis: public DivPlatformOPN { int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); DivPlatformGenesis(): - DivPlatformOPN(9440540.0, 72, 32, false, 7) {} + DivPlatformOPN(2, 6, 6, 6, 6, 9440540.0, 72, 32, false, 7) {} ~DivPlatformGenesis(); }; #endif diff --git a/src/engine/platform/ym2203.h b/src/engine/platform/ym2203.h index 2a3f292f..0e0da7e4 100644 --- a/src/engine/platform/ym2203.h +++ b/src/engine/platform/ym2203.h @@ -77,7 +77,7 @@ class DivPlatformYM2203: public DivPlatformOPN { int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); DivPlatformYM2203(): - DivPlatformOPN(4720270.0, 36, 16), + DivPlatformOPN(2, 3, 6, 6, 6, 4720270.0, 36, 16), prescale(0x2d) {} ~DivPlatformYM2203(); }; diff --git a/src/engine/platform/ym2608.h b/src/engine/platform/ym2608.h index f6dfc21a..d1100ce9 100644 --- a/src/engine/platform/ym2608.h +++ b/src/engine/platform/ym2608.h @@ -97,7 +97,7 @@ class DivPlatformYM2608: public DivPlatformOPN { int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); DivPlatformYM2608(): - DivPlatformOPN(9440540.0, 72, 32), + DivPlatformOPN(2, 6, 9, 15, 16, 9440540.0, 72, 32), prescale(0x2d) {} ~DivPlatformYM2608(); }; diff --git a/src/engine/platform/ym2610.cpp b/src/engine/platform/ym2610.cpp index 5aa13499..2a3b00ac 100644 --- a/src/engine/platform/ym2610.cpp +++ b/src/engine/platform/ym2610.cpp @@ -1275,7 +1275,7 @@ bool DivPlatformYM2610::keyOffAffectsArp(int ch) { } void DivPlatformYM2610::notifyInsChange(int ins) { - for (int i=0; i { +class DivPlatformYM2610: public DivPlatformYM2610Base { protected: const unsigned short chanOffs[4]={ 0x01, 0x02, 0x101, 0x102 @@ -60,7 +60,7 @@ class DivPlatformYM2610: public DivPlatformYM2610Base<14> { int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); DivPlatformYM2610(): - DivPlatformYM2610Base<14>(1,4,7,13) {} + DivPlatformYM2610Base(1,4,7,13,14) {} ~DivPlatformYM2610(); }; #endif diff --git a/src/engine/platform/ym2610b.cpp b/src/engine/platform/ym2610b.cpp index 00adbdd1..28c69353 100644 --- a/src/engine/platform/ym2610b.cpp +++ b/src/engine/platform/ym2610b.cpp @@ -1342,7 +1342,7 @@ bool DivPlatformYM2610B::keyOffAffectsArp(int ch) { } void DivPlatformYM2610B::notifyInsChange(int ins) { - for (int i=0; i { +class DivPlatformYM2610B: public DivPlatformYM2610Base { protected: const unsigned short chanOffs[6]={ 0x00, 0x01, 0x02, 0x100, 0x101, 0x102 @@ -56,7 +56,7 @@ class DivPlatformYM2610B: public DivPlatformYM2610Base<16> { int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); DivPlatformYM2610B(): - DivPlatformYM2610Base<16>(2,6,9,15) {} + DivPlatformYM2610Base(2,6,9,15,16) {} ~DivPlatformYM2610B(); }; #endif diff --git a/src/engine/platform/ym2610shared.h b/src/engine/platform/ym2610shared.h index 487412d5..79dde4ab 100644 --- a/src/engine/platform/ym2610shared.h +++ b/src/engine/platform/ym2610shared.h @@ -44,11 +44,11 @@ class DivYM2610Interface: public ymfm::ymfm_interface { sampleBank(0) {} }; -template class DivPlatformYM2610Base: public DivPlatformOPN { +class DivPlatformYM2610Base: public DivPlatformOPN { protected: - OPNChannelStereo chan[ChanNum]; - DivDispatchOscBuffer* oscBuf[ChanNum]; - bool isMuted[ChanNum]; + OPNChannelStereo chan[16]; + DivDispatchOscBuffer* oscBuf[16]; + bool isMuted[16]; ymfm::ym2610b* fm; ymfm::ym2610b::output_data fmout; @@ -72,9 +72,6 @@ template class DivPlatformYM2610Base: public DivPlatformOPN { unsigned char writeADPCMAOff, writeADPCMAOn; int globalADPCMAVolume; - const int extChanOffs, psgChanOffs, adpcmAChanOffs, adpcmBChanOffs; - const int chanNum=ChanNum; - double NOTE_OPNB(int ch, int note) { if (ch>=adpcmBChanOffs) { // ADPCM return NOTE_ADPCMB(note); @@ -221,7 +218,7 @@ template class DivPlatformYM2610Base: public DivPlatformOPN { CHECK_CUSTOM_CLOCK; noExtMacros=flags.getBool("noExtMacros",false); rate=chipClock/16; - for (int i=0; irate=rate; } } @@ -231,7 +228,7 @@ template class DivPlatformYM2610Base: public DivPlatformOPN { ayFlags.set("chipType",1); dumpWrites=false; skipRegisterWrites=false; - for (int i=0; i class DivPlatformYM2610Base: public DivPlatformOPN { } void quit() { - for (int i=0; iquit(); @@ -262,12 +259,8 @@ template class DivPlatformYM2610Base: public DivPlatformOPN { delete[] adpcmBMem; } - DivPlatformYM2610Base(int ext, int psg, int adpcmA, int adpcmB): - DivPlatformOPN(9440540.0, 72, 32), - extChanOffs(ext), - psgChanOffs(psg), - adpcmAChanOffs(adpcmA), - adpcmBChanOffs(adpcmB) {} + DivPlatformYM2610Base(int ext, int psg, int adpcmA, int adpcmB, int chanCount): + DivPlatformOPN(ext,psg,adpcmA,adpcmB,chanCount,9440540.0, 72, 32) {} }; #endif diff --git a/src/gui/debug.cpp b/src/gui/debug.cpp index 3a9ff950..5a612382 100644 --- a/src/gui/debug.cpp +++ b/src/gui/debug.cpp @@ -65,7 +65,11 @@ FM_CHIP_DEBUG; \ ImGui::Text("- fmFreqBase: %.f",ch->fmFreqBase); \ ImGui::Text("- fmDivBase: %d",ch->fmDivBase); \ - ImGui::Text("- ayDiv: %d",ch->ayDiv); + ImGui::Text("- ayDiv: %d",ch->ayDiv); \ + ImGui::Text("- extChanOffs: %d",ch->extChanOffs); \ + ImGui::Text("- psgChanOffs: %d",ch->psgChanOffs); \ + ImGui::Text("- adpcmAChanOffs: %d",ch->adpcmAChanOffs); \ + ImGui::Text("- adpcmBChanOffs: %d",ch->adpcmBChanOffs); \ #define COMMON_CHIP_DEBUG_BOOL \ ImGui::TextColored(ch->skipRegisterWrites?colorOn:colorOff,">> SkipRegisterWrites"); \ @@ -97,11 +101,6 @@ ImGui::Text("- writeADPCMAOff: %d",ch->writeADPCMAOff); \ ImGui::Text("- writeADPCMAOn: %d",ch->writeADPCMAOn); \ ImGui::Text("- globalADPCMAVolume: %d",ch->globalADPCMAVolume); \ - ImGui::Text("- extChanOffs: %d",ch->extChanOffs); \ - ImGui::Text("- psgChanOffs: %d",ch->psgChanOffs); \ - ImGui::Text("- adpcmAChanOffs: %d",ch->adpcmAChanOffs); \ - ImGui::Text("- adpcmBChanOffs: %d",ch->adpcmBChanOffs); \ - ImGui::Text("- chanNum: %d",ch->chanNum); \ FM_OPN_CHIP_DEBUG_BOOL; \ ImGui::TextColored(ch->extMode?colorOn:colorOff,">> ExtMode"); From 6cce918c02239252c32a85b72d840667f3c24665 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sat, 24 Dec 2022 02:29:37 -0500 Subject: [PATCH 04/25] Nuked-OPN2 + ymfm combo option for all OPN chips modified Nuked doing FM and ymfm doing SSG/ADPCM --- .gitmodules | 3 - CMakeLists.txt | 2 +- extern/Nuked-OPN2 | 1 - extern/opn/LICENSE | 504 + extern/opn/MODIFIED.md | 5 + extern/opn/README.md | 34 + extern/opn/ym3438.c | 1435 +++ extern/opn/ym3438.h | 215 + extern/opn/ym3438.svg | 16454 +++++++++++++++++++++++++++ src/engine/dispatchContainer.cpp | 8 + src/engine/platform/fmshared_OPN.h | 11 +- src/engine/platform/genesis.cpp | 4 +- src/engine/platform/genesis.h | 1 - src/engine/platform/ym2203.cpp | 79 + src/engine/platform/ym2203.h | 7 +- src/engine/platform/ym2608.cpp | 115 + src/engine/platform/ym2608.h | 7 +- src/engine/platform/ym2610.cpp | 110 +- src/engine/platform/ym2610.h | 4 + src/engine/platform/ym2610b.cpp | 114 +- src/engine/platform/ym2610b.h | 4 + src/engine/platform/ym2610shared.h | 8 +- src/gui/gui.h | 2 + src/gui/settings.cpp | 15 +- 24 files changed, 19122 insertions(+), 20 deletions(-) delete mode 160000 extern/Nuked-OPN2 create mode 100644 extern/opn/LICENSE create mode 100644 extern/opn/MODIFIED.md create mode 100644 extern/opn/README.md create mode 100644 extern/opn/ym3438.c create mode 100644 extern/opn/ym3438.h create mode 100644 extern/opn/ym3438.svg diff --git a/.gitmodules b/.gitmodules index 5f0e538d..0dcbd0c8 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,3 @@ -[submodule "extern/Nuked-OPN2"] - path = extern/Nuked-OPN2 - url = https://github.com/nukeykt/Nuked-OPN2 [submodule "extern/SDL"] path = extern/SDL url = https://github.com/libsdl-org/SDL.git diff --git a/CMakeLists.txt b/CMakeLists.txt index 6e37c88b..b705db85 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -352,7 +352,7 @@ extern/adpcm/yma_codec.c extern/adpcm/ymb_codec.c extern/adpcm/ymz_codec.c -extern/Nuked-OPN2/ym3438.c +extern/opn/ym3438.c extern/Nuked-PSG/ympsg.c extern/opm/opm.c extern/Nuked-OPLL/opll.c diff --git a/extern/Nuked-OPN2 b/extern/Nuked-OPN2 deleted file mode 160000 index b0e9de0f..00000000 --- a/extern/Nuked-OPN2 +++ /dev/null @@ -1 +0,0 @@ -Subproject commit b0e9de0f816943ad3820ddfefa0fff276d659250 diff --git a/extern/opn/LICENSE b/extern/opn/LICENSE new file mode 100644 index 00000000..8000a6fa --- /dev/null +++ b/extern/opn/LICENSE @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random + Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff --git a/extern/opn/MODIFIED.md b/extern/opn/MODIFIED.md new file mode 100644 index 00000000..33b00cb7 --- /dev/null +++ b/extern/opn/MODIFIED.md @@ -0,0 +1,5 @@ +# modification disclaimer + +this is a modified version of Nuked-OPN2 which implements high resolution output (for OPN/OPNA/OPNB). + +accuracy of OPN2 (YM2612/YM3438) should not be altered. diff --git a/extern/opn/README.md b/extern/opn/README.md new file mode 100644 index 00000000..f5fce509 --- /dev/null +++ b/extern/opn/README.md @@ -0,0 +1,34 @@ +# Nuked-OPN2 +High accuracy Yamaha YM3438(OPN2) emulator. + +The YM3438 is a CMOS variant of the YM2612 used in Sega MegaDrive(Genesis) and FM Towns. + +Genesis Plus GX fork with this core integrated is available here: https://github.com/nukeykt/Genesis-Plus-GX + +# Features: +- Based on YM3438 die shot reverse engineering and thus provides very high emulation accuracy. + +- Cycle-accurate. + +- Undocumented registers/features emulation. +- SSG-EG, CSM mode emulation. +- Compatible with the YM2612. + +# API documention +``` +void OPN2_Reset(ym3438_t *chip) - Reset emulated chip +void OPN2_Clock(ym3438_t *chip, Bit32s *buffer) - Advances emulated chip state by 1 internal clock(6 master clocks). Writes signed 9-bit MOL, MOR pin states to buffer. +void OPN2_Write(ym3438_t *chip, Bit32u port, Bit8u data) - Write 8-bit data to port. +void OPN2_SetTestPin(ym3438_t *chip, Bit32u value) - Set TEST pin value. +Bit32u OPN2_ReadTestPin(ym3438_t *chip) - Read TEST pin value. +Bit32u OPN2_ReadIRQPin(ym3438_t *chip) - Read IRQ pin value. +Bit8u OPN2_Read(ym3438_t *chip, Bit32u port) - Read chip status. +``` + +# Samples +Sonic the Hedgehog: +https://youtu.be/ImmKy_-pJ8g + +Sega CD BIOS v1.10: +https://youtu.be/s-8ASMbtojQ + diff --git a/extern/opn/ym3438.c b/extern/opn/ym3438.c new file mode 100644 index 00000000..72b9cb9b --- /dev/null +++ b/extern/opn/ym3438.c @@ -0,0 +1,1435 @@ +/* + * Copyright (C) 2017-2022 Alexey Khokholov (Nuke.YKT) + * + * This file is part of Nuked OPN2. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Nuked OPN2(Yamaha YM3438) emulator. + * Thanks: + * Silicon Pr0n: + * Yamaha YM3438 decap and die shot(digshadow). + * OPLx decapsulated(Matthew Gambrell, Olli Niemitalo): + * OPL2 ROMs. + * + * version: 1.0.11 + */ + +#include +#include "ym3438.h" + +#define SIGN_EXTEND(bit_index, value) (((value) & ((1u << (bit_index)) - 1u)) - ((value) & (1u << (bit_index)))) + +enum { + eg_num_attack = 0, + eg_num_decay = 1, + eg_num_sustain = 2, + eg_num_release = 3 +}; + +/* logsin table */ +static const Bit16u logsinrom[256] = { + 0x859, 0x6c3, 0x607, 0x58b, 0x52e, 0x4e4, 0x4a6, 0x471, + 0x443, 0x41a, 0x3f5, 0x3d3, 0x3b5, 0x398, 0x37e, 0x365, + 0x34e, 0x339, 0x324, 0x311, 0x2ff, 0x2ed, 0x2dc, 0x2cd, + 0x2bd, 0x2af, 0x2a0, 0x293, 0x286, 0x279, 0x26d, 0x261, + 0x256, 0x24b, 0x240, 0x236, 0x22c, 0x222, 0x218, 0x20f, + 0x206, 0x1fd, 0x1f5, 0x1ec, 0x1e4, 0x1dc, 0x1d4, 0x1cd, + 0x1c5, 0x1be, 0x1b7, 0x1b0, 0x1a9, 0x1a2, 0x19b, 0x195, + 0x18f, 0x188, 0x182, 0x17c, 0x177, 0x171, 0x16b, 0x166, + 0x160, 0x15b, 0x155, 0x150, 0x14b, 0x146, 0x141, 0x13c, + 0x137, 0x133, 0x12e, 0x129, 0x125, 0x121, 0x11c, 0x118, + 0x114, 0x10f, 0x10b, 0x107, 0x103, 0x0ff, 0x0fb, 0x0f8, + 0x0f4, 0x0f0, 0x0ec, 0x0e9, 0x0e5, 0x0e2, 0x0de, 0x0db, + 0x0d7, 0x0d4, 0x0d1, 0x0cd, 0x0ca, 0x0c7, 0x0c4, 0x0c1, + 0x0be, 0x0bb, 0x0b8, 0x0b5, 0x0b2, 0x0af, 0x0ac, 0x0a9, + 0x0a7, 0x0a4, 0x0a1, 0x09f, 0x09c, 0x099, 0x097, 0x094, + 0x092, 0x08f, 0x08d, 0x08a, 0x088, 0x086, 0x083, 0x081, + 0x07f, 0x07d, 0x07a, 0x078, 0x076, 0x074, 0x072, 0x070, + 0x06e, 0x06c, 0x06a, 0x068, 0x066, 0x064, 0x062, 0x060, + 0x05e, 0x05c, 0x05b, 0x059, 0x057, 0x055, 0x053, 0x052, + 0x050, 0x04e, 0x04d, 0x04b, 0x04a, 0x048, 0x046, 0x045, + 0x043, 0x042, 0x040, 0x03f, 0x03e, 0x03c, 0x03b, 0x039, + 0x038, 0x037, 0x035, 0x034, 0x033, 0x031, 0x030, 0x02f, + 0x02e, 0x02d, 0x02b, 0x02a, 0x029, 0x028, 0x027, 0x026, + 0x025, 0x024, 0x023, 0x022, 0x021, 0x020, 0x01f, 0x01e, + 0x01d, 0x01c, 0x01b, 0x01a, 0x019, 0x018, 0x017, 0x017, + 0x016, 0x015, 0x014, 0x014, 0x013, 0x012, 0x011, 0x011, + 0x010, 0x00f, 0x00f, 0x00e, 0x00d, 0x00d, 0x00c, 0x00c, + 0x00b, 0x00a, 0x00a, 0x009, 0x009, 0x008, 0x008, 0x007, + 0x007, 0x007, 0x006, 0x006, 0x005, 0x005, 0x005, 0x004, + 0x004, 0x004, 0x003, 0x003, 0x003, 0x002, 0x002, 0x002, + 0x002, 0x001, 0x001, 0x001, 0x001, 0x001, 0x001, 0x001, + 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000 +}; + +/* exp table */ +static const Bit16u exprom[256] = { + 0x000, 0x003, 0x006, 0x008, 0x00b, 0x00e, 0x011, 0x014, + 0x016, 0x019, 0x01c, 0x01f, 0x022, 0x025, 0x028, 0x02a, + 0x02d, 0x030, 0x033, 0x036, 0x039, 0x03c, 0x03f, 0x042, + 0x045, 0x048, 0x04b, 0x04e, 0x051, 0x054, 0x057, 0x05a, + 0x05d, 0x060, 0x063, 0x066, 0x069, 0x06c, 0x06f, 0x072, + 0x075, 0x078, 0x07b, 0x07e, 0x082, 0x085, 0x088, 0x08b, + 0x08e, 0x091, 0x094, 0x098, 0x09b, 0x09e, 0x0a1, 0x0a4, + 0x0a8, 0x0ab, 0x0ae, 0x0b1, 0x0b5, 0x0b8, 0x0bb, 0x0be, + 0x0c2, 0x0c5, 0x0c8, 0x0cc, 0x0cf, 0x0d2, 0x0d6, 0x0d9, + 0x0dc, 0x0e0, 0x0e3, 0x0e7, 0x0ea, 0x0ed, 0x0f1, 0x0f4, + 0x0f8, 0x0fb, 0x0ff, 0x102, 0x106, 0x109, 0x10c, 0x110, + 0x114, 0x117, 0x11b, 0x11e, 0x122, 0x125, 0x129, 0x12c, + 0x130, 0x134, 0x137, 0x13b, 0x13e, 0x142, 0x146, 0x149, + 0x14d, 0x151, 0x154, 0x158, 0x15c, 0x160, 0x163, 0x167, + 0x16b, 0x16f, 0x172, 0x176, 0x17a, 0x17e, 0x181, 0x185, + 0x189, 0x18d, 0x191, 0x195, 0x199, 0x19c, 0x1a0, 0x1a4, + 0x1a8, 0x1ac, 0x1b0, 0x1b4, 0x1b8, 0x1bc, 0x1c0, 0x1c4, + 0x1c8, 0x1cc, 0x1d0, 0x1d4, 0x1d8, 0x1dc, 0x1e0, 0x1e4, + 0x1e8, 0x1ec, 0x1f0, 0x1f5, 0x1f9, 0x1fd, 0x201, 0x205, + 0x209, 0x20e, 0x212, 0x216, 0x21a, 0x21e, 0x223, 0x227, + 0x22b, 0x230, 0x234, 0x238, 0x23c, 0x241, 0x245, 0x249, + 0x24e, 0x252, 0x257, 0x25b, 0x25f, 0x264, 0x268, 0x26d, + 0x271, 0x276, 0x27a, 0x27f, 0x283, 0x288, 0x28c, 0x291, + 0x295, 0x29a, 0x29e, 0x2a3, 0x2a8, 0x2ac, 0x2b1, 0x2b5, + 0x2ba, 0x2bf, 0x2c4, 0x2c8, 0x2cd, 0x2d2, 0x2d6, 0x2db, + 0x2e0, 0x2e5, 0x2e9, 0x2ee, 0x2f3, 0x2f8, 0x2fd, 0x302, + 0x306, 0x30b, 0x310, 0x315, 0x31a, 0x31f, 0x324, 0x329, + 0x32e, 0x333, 0x338, 0x33d, 0x342, 0x347, 0x34c, 0x351, + 0x356, 0x35b, 0x360, 0x365, 0x36a, 0x370, 0x375, 0x37a, + 0x37f, 0x384, 0x38a, 0x38f, 0x394, 0x399, 0x39f, 0x3a4, + 0x3a9, 0x3ae, 0x3b4, 0x3b9, 0x3bf, 0x3c4, 0x3c9, 0x3cf, + 0x3d4, 0x3da, 0x3df, 0x3e4, 0x3ea, 0x3ef, 0x3f5, 0x3fa +}; + +/* Note table */ +static const Bit32u fn_note[16] = { + 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 3, 3, 3, 3, 3, 3 +}; + +/* Envelope generator */ +static const Bit32u eg_stephi[4][4] = { + { 0, 0, 0, 0 }, + { 1, 0, 0, 0 }, + { 1, 0, 1, 0 }, + { 1, 1, 1, 0 } +}; + +static const Bit8u eg_am_shift[4] = { + 7, 3, 1, 0 +}; + +/* Phase generator */ +static const Bit32u pg_detune[8] = { 16, 17, 19, 20, 22, 24, 27, 29 }; + +static const Bit32u pg_lfo_sh1[8][8] = { + { 7, 7, 7, 7, 7, 7, 7, 7 }, + { 7, 7, 7, 7, 7, 7, 7, 7 }, + { 7, 7, 7, 7, 7, 7, 1, 1 }, + { 7, 7, 7, 7, 1, 1, 1, 1 }, + { 7, 7, 7, 1, 1, 1, 1, 0 }, + { 7, 7, 1, 1, 0, 0, 0, 0 }, + { 7, 7, 1, 1, 0, 0, 0, 0 }, + { 7, 7, 1, 1, 0, 0, 0, 0 } +}; + +static const Bit32u pg_lfo_sh2[8][8] = { + { 7, 7, 7, 7, 7, 7, 7, 7 }, + { 7, 7, 7, 7, 2, 2, 2, 2 }, + { 7, 7, 7, 2, 2, 2, 7, 7 }, + { 7, 7, 2, 2, 7, 7, 2, 2 }, + { 7, 7, 2, 7, 7, 7, 2, 7 }, + { 7, 7, 7, 2, 7, 7, 2, 1 }, + { 7, 7, 7, 2, 7, 7, 2, 1 }, + { 7, 7, 7, 2, 7, 7, 2, 1 } +}; + +/* Address decoder */ +static const Bit32u op_offset[12] = { + 0x000, /* Ch1 OP1/OP2 */ + 0x001, /* Ch2 OP1/OP2 */ + 0x002, /* Ch3 OP1/OP2 */ + 0x100, /* Ch4 OP1/OP2 */ + 0x101, /* Ch5 OP1/OP2 */ + 0x102, /* Ch6 OP1/OP2 */ + 0x004, /* Ch1 OP3/OP4 */ + 0x005, /* Ch2 OP3/OP4 */ + 0x006, /* Ch3 OP3/OP4 */ + 0x104, /* Ch4 OP3/OP4 */ + 0x105, /* Ch5 OP3/OP4 */ + 0x106 /* Ch6 OP3/OP4 */ +}; + +static const Bit32u ch_offset[6] = { + 0x000, /* Ch1 */ + 0x001, /* Ch2 */ + 0x002, /* Ch3 */ + 0x100, /* Ch4 */ + 0x101, /* Ch5 */ + 0x102 /* Ch6 */ +}; + +/* LFO */ +static const Bit32u lfo_cycles[8] = { + 108, 77, 71, 67, 62, 44, 8, 5 +}; + +/* FM algorithm */ +static const Bit32u fm_algorithm[4][6][8] = { + { + { 1, 1, 1, 1, 1, 1, 1, 1 }, /* OP1_0 */ + { 1, 1, 1, 1, 1, 1, 1, 1 }, /* OP1_1 */ + { 0, 0, 0, 0, 0, 0, 0, 0 }, /* OP2 */ + { 0, 0, 0, 0, 0, 0, 0, 0 }, /* Last operator */ + { 0, 0, 0, 0, 0, 0, 0, 0 }, /* Last operator */ + { 0, 0, 0, 0, 0, 0, 0, 1 } /* Out */ + }, + { + { 0, 1, 0, 0, 0, 1, 0, 0 }, /* OP1_0 */ + { 0, 0, 0, 0, 0, 0, 0, 0 }, /* OP1_1 */ + { 1, 1, 1, 0, 0, 0, 0, 0 }, /* OP2 */ + { 0, 0, 0, 0, 0, 0, 0, 0 }, /* Last operator */ + { 0, 0, 0, 0, 0, 0, 0, 0 }, /* Last operator */ + { 0, 0, 0, 0, 0, 1, 1, 1 } /* Out */ + }, + { + { 0, 0, 0, 0, 0, 0, 0, 0 }, /* OP1_0 */ + { 0, 0, 0, 0, 0, 0, 0, 0 }, /* OP1_1 */ + { 0, 0, 0, 0, 0, 0, 0, 0 }, /* OP2 */ + { 1, 0, 0, 1, 1, 1, 1, 0 }, /* Last operator */ + { 0, 0, 0, 0, 0, 0, 0, 0 }, /* Last operator */ + { 0, 0, 0, 0, 1, 1, 1, 1 } /* Out */ + }, + { + { 0, 0, 1, 0, 0, 1, 0, 0 }, /* OP1_0 */ + { 0, 0, 0, 0, 0, 0, 0, 0 }, /* OP1_1 */ + { 0, 0, 0, 1, 0, 0, 0, 0 }, /* OP2 */ + { 1, 1, 0, 1, 1, 0, 0, 0 }, /* Last operator */ + { 0, 0, 1, 0, 0, 0, 0, 0 }, /* Last operator */ + { 1, 1, 1, 1, 1, 1, 1, 1 } /* Out */ + } +}; + +static void OPN2_DoIO(ym3438_t *chip) +{ + /* Write signal check */ + chip->write_a_en = (chip->write_a & 0x03) == 0x01; + chip->write_d_en = (chip->write_d & 0x03) == 0x01; + chip->write_a <<= 1; + chip->write_d <<= 1; + /* Busy counter */ + chip->busy = chip->write_busy; + chip->write_busy_cnt += chip->write_busy; + chip->write_busy = (chip->write_busy && !(chip->write_busy_cnt >> 5)) || chip->write_d_en; + chip->write_busy_cnt &= 0x1f; +} + +static void OPN2_DoRegWrite(ym3438_t *chip) +{ + Bit32u i; + Bit32u slot = chip->cycles % 12; + Bit32u address; + Bit32u channel = chip->channel; + /* Update registers */ + if (chip->write_fm_data) + { + /* Slot */ + if (op_offset[slot] == (chip->address & 0x107)) + { + if (chip->address & 0x08) + { + /* OP2, OP4 */ + slot += 12; + } + address = chip->address & 0xf0; + switch (address) + { + case 0x30: /* DT, MULTI */ + chip->multi[slot] = chip->data & 0x0f; + if (!chip->multi[slot]) + { + chip->multi[slot] = 1; + } + else + { + chip->multi[slot] <<= 1; + } + chip->dt[slot] = (chip->data >> 4) & 0x07; + break; + case 0x40: /* TL */ + chip->tl[slot] = chip->data & 0x7f; + break; + case 0x50: /* KS, AR */ + chip->ar[slot] = chip->data & 0x1f; + chip->ks[slot] = (chip->data >> 6) & 0x03; + break; + case 0x60: /* AM, DR */ + chip->dr[slot] = chip->data & 0x1f; + chip->am[slot] = (chip->data >> 7) & 0x01; + break; + case 0x70: /* SR */ + chip->sr[slot] = chip->data & 0x1f; + break; + case 0x80: /* SL, RR */ + chip->rr[slot] = chip->data & 0x0f; + chip->sl[slot] = (chip->data >> 4) & 0x0f; + chip->sl[slot] |= (chip->sl[slot] + 1) & 0x10; + break; + case 0x90: /* SSG-EG */ + chip->ssg_eg[slot] = chip->data & 0x0f; + break; + default: + break; + } + } + + /* Channel */ + if (ch_offset[channel] == (chip->address & 0x103)) + { + address = chip->address & 0xfc; + switch (address) + { + case 0xa0: + chip->fnum[channel] = (chip->data & 0xff) | ((chip->reg_a4 & 0x07) << 8); + chip->block[channel] = (chip->reg_a4 >> 3) & 0x07; + chip->kcode[channel] = (chip->block[channel] << 2) | fn_note[chip->fnum[channel] >> 7]; + break; + case 0xa4: + chip->reg_a4 = chip->data & 0xff; + break; + case 0xa8: + chip->fnum_3ch[channel] = (chip->data & 0xff) | ((chip->reg_ac & 0x07) << 8); + chip->block_3ch[channel] = (chip->reg_ac >> 3) & 0x07; + chip->kcode_3ch[channel] = (chip->block_3ch[channel] << 2) | fn_note[chip->fnum_3ch[channel] >> 7]; + break; + case 0xac: + chip->reg_ac = chip->data & 0xff; + break; + case 0xb0: + chip->connect[channel] = chip->data & 0x07; + chip->fb[channel] = (chip->data >> 3) & 0x07; + break; + case 0xb4: + chip->pms[channel] = chip->data & 0x07; + chip->ams[channel] = (chip->data >> 4) & 0x03; + chip->pan_l[channel] = (chip->data >> 7) & 0x01; + chip->pan_r[channel] = (chip->data >> 6) & 0x01; + break; + default: + break; + } + } + } + + if (chip->write_a_en || chip->write_d_en) + { + /* Data */ + if (chip->write_a_en) + { + chip->write_fm_data = 0; + } + + if (chip->write_fm_address && chip->write_d_en) + { + chip->write_fm_data = 1; + } + + /* Address */ + if (chip->write_a_en) + { + if ((chip->write_data & 0xf0) != 0x00) + { + /* FM Write */ + chip->address = chip->write_data; + chip->write_fm_address = 1; + } + else + { + /* SSG write */ + chip->write_fm_address = 0; + } + } + + /* FM Mode */ + /* Data */ + if (chip->write_d_en && (chip->write_data & 0x100) == 0) + { + switch (chip->write_fm_mode_a) + { + case 0x21: /* LSI test 1 */ + for (i = 0; i < 8; i++) + { + chip->mode_test_21[i] = (chip->write_data >> i) & 0x01; + } + break; + case 0x22: /* LFO control */ + if ((chip->write_data >> 3) & 0x01) + { + chip->lfo_en = 0x7f; + } + else + { + chip->lfo_en = 0; + } + chip->lfo_freq = chip->write_data & 0x07; + break; + case 0x24: /* Timer A */ + chip->timer_a_reg &= 0x03; + chip->timer_a_reg |= (chip->write_data & 0xff) << 2; + break; + case 0x25: + chip->timer_a_reg &= 0x3fc; + chip->timer_a_reg |= chip->write_data & 0x03; + break; + case 0x26: /* Timer B */ + chip->timer_b_reg = chip->write_data & 0xff; + break; + case 0x27: /* CSM, Timer control */ + chip->mode_ch3 = (chip->write_data & 0xc0) >> 6; + chip->mode_csm = chip->mode_ch3 == 2; + chip->timer_a_load = chip->write_data & 0x01; + chip->timer_a_enable = (chip->write_data >> 2) & 0x01; + chip->timer_a_reset = (chip->write_data >> 4) & 0x01; + chip->timer_b_load = (chip->write_data >> 1) & 0x01; + chip->timer_b_enable = (chip->write_data >> 3) & 0x01; + chip->timer_b_reset = (chip->write_data >> 5) & 0x01; + break; + case 0x28: /* Key on/off */ + for (i = 0; i < 4; i++) + { + chip->mode_kon_operator[i] = (chip->write_data >> (4 + i)) & 0x01; + } + if ((chip->write_data & 0x03) == 0x03) + { + /* Invalid address */ + chip->mode_kon_channel = 0xff; + } + else + { + chip->mode_kon_channel = (chip->write_data & 0x03) + ((chip->write_data >> 2) & 1) * 3; + } + break; + case 0x2a: /* DAC data */ + chip->dacdata &= 0x01; + chip->dacdata |= (chip->write_data ^ 0x80) << 1; + break; + case 0x2b: /* DAC enable */ + chip->dacen = chip->write_data >> 7; + break; + case 0x2c: /* LSI test 2 */ + for (i = 0; i < 8; i++) + { + chip->mode_test_2c[i] = (chip->write_data >> i) & 0x01; + } + chip->dacdata &= 0x1fe; + chip->dacdata |= chip->mode_test_2c[3]; + chip->eg_custom_timer = !chip->mode_test_2c[7] && chip->mode_test_2c[6]; + break; + default: + break; + } + } + + /* Address */ + if (chip->write_a_en) + { + chip->write_fm_mode_a = chip->write_data & 0x1ff; + } + } + + if (chip->write_fm_data) + { + chip->data = chip->write_data & 0xff; + } +} + +static void OPN2_PhaseCalcIncrement(ym3438_t *chip) +{ + Bit32u chan = chip->channel; + Bit32u slot = chip->cycles; + Bit32u fnum = chip->pg_fnum; + Bit32u fnum_h = fnum >> 4; + Bit32u fm; + Bit32u basefreq; + Bit8u lfo = chip->lfo_pm; + Bit8u lfo_l = lfo & 0x0f; + Bit8u pms = chip->pms[chan]; + Bit8u dt = chip->dt[slot]; + Bit8u dt_l = dt & 0x03; + Bit8u detune = 0; + Bit8u block, note; + Bit8u sum, sum_h, sum_l; + Bit8u kcode = chip->pg_kcode; + + fnum <<= 1; + /* Apply LFO */ + if (lfo_l & 0x08) + { + lfo_l ^= 0x0f; + } + fm = (fnum_h >> pg_lfo_sh1[pms][lfo_l]) + (fnum_h >> pg_lfo_sh2[pms][lfo_l]); + if (pms > 5) + { + fm <<= pms - 5; + } + fm >>= 2; + if (lfo & 0x10) + { + fnum -= fm; + } + else + { + fnum += fm; + } + fnum &= 0xfff; + + basefreq = (fnum << chip->pg_block) >> 2; + + /* Apply detune */ + if (dt_l) + { + if (kcode > 0x1c) + { + kcode = 0x1c; + } + block = kcode >> 2; + note = kcode & 0x03; + sum = block + 9 + ((dt_l == 3) | (dt_l & 0x02)); + sum_h = sum >> 1; + sum_l = sum & 0x01; + detune = pg_detune[(sum_l << 2) | note] >> (9 - sum_h); + } + if (dt & 0x04) + { + basefreq -= detune; + } + else + { + basefreq += detune; + } + basefreq &= 0x1ffff; + chip->pg_inc[slot] = (basefreq * chip->multi[slot]) >> 1; + chip->pg_inc[slot] &= 0xfffff; +} + +static void OPN2_PhaseGenerate(ym3438_t *chip) +{ + Bit32u slot; + /* Mask increment */ + slot = (chip->cycles + 20) % 24; + if (chip->pg_reset[slot]) + { + chip->pg_inc[slot] = 0; + } + /* Phase step */ + slot = (chip->cycles + 19) % 24; + if (chip->pg_reset[slot] || chip->mode_test_21[3]) + { + chip->pg_phase[slot] = 0; + } + chip->pg_phase[slot] += chip->pg_inc[slot]; + chip->pg_phase[slot] &= 0xfffff; +} + +static void OPN2_EnvelopeSSGEG(ym3438_t *chip) +{ + Bit32u slot = chip->cycles; + Bit8u direction = 0; + chip->eg_ssg_pgrst_latch[slot] = 0; + chip->eg_ssg_repeat_latch[slot] = 0; + chip->eg_ssg_hold_up_latch[slot] = 0; + chip->eg_ssg_inv[slot] = 0; + if (chip->ssg_eg[slot] & 0x08) + { + direction = chip->eg_ssg_dir[slot]; + if (chip->eg_level[slot] & 0x200) + { + /* Reset */ + if ((chip->ssg_eg[slot] & 0x03) == 0x00) + { + chip->eg_ssg_pgrst_latch[slot] = 1; + } + /* Repeat */ + if ((chip->ssg_eg[slot] & 0x01) == 0x00) + { + chip->eg_ssg_repeat_latch[slot] = 1; + } + /* Inverse */ + if ((chip->ssg_eg[slot] & 0x03) == 0x02) + { + direction ^= 1; + } + if ((chip->ssg_eg[slot] & 0x03) == 0x03) + { + direction = 1; + } + } + /* Hold up */ + if (chip->eg_kon_latch[slot] + && ((chip->ssg_eg[slot] & 0x07) == 0x05 || (chip->ssg_eg[slot] & 0x07) == 0x03)) + { + chip->eg_ssg_hold_up_latch[slot] = 1; + } + direction &= chip->eg_kon[slot]; + chip->eg_ssg_inv[slot] = (chip->eg_ssg_dir[slot] ^ ((chip->ssg_eg[slot] >> 2) & 0x01)) + & chip->eg_kon[slot]; + } + chip->eg_ssg_dir[slot] = direction; + chip->eg_ssg_enable[slot] = (chip->ssg_eg[slot] >> 3) & 0x01; +} + +static void OPN2_EnvelopeADSR(ym3438_t *chip) +{ + Bit32u slot = (chip->cycles + 22) % 24; + + Bit8u nkon = chip->eg_kon_latch[slot]; + Bit8u okon = chip->eg_kon[slot]; + Bit8u kon_event; + Bit8u koff_event; + Bit8u eg_off; + Bit16s level; + Bit16s nextlevel = 0; + Bit16s ssg_level; + Bit8u nextstate = chip->eg_state[slot]; + Bit16s inc = 0; + chip->eg_read[0] = chip->eg_read_inc; + chip->eg_read_inc = chip->eg_inc > 0; + + /* Reset phase generator */ + chip->pg_reset[slot] = (nkon && !okon) || chip->eg_ssg_pgrst_latch[slot]; + + /* KeyOn/Off */ + kon_event = (nkon && !okon) || (okon && chip->eg_ssg_repeat_latch[slot]); + koff_event = okon && !nkon; + + ssg_level = level = (Bit16s)chip->eg_level[slot]; + + if (chip->eg_ssg_inv[slot]) + { + /* Inverse */ + ssg_level = 512 - level; + ssg_level &= 0x3ff; + } + if (koff_event) + { + level = ssg_level; + } + if (chip->eg_ssg_enable[slot]) + { + eg_off = level >> 9; + } + else + { + eg_off = (level & 0x3f0) == 0x3f0; + } + nextlevel = level; + if (kon_event) + { + nextstate = eg_num_attack; + /* Instant attack */ + if (chip->eg_ratemax) + { + nextlevel = 0; + } + else if (chip->eg_state[slot] == eg_num_attack && level != 0 && chip->eg_inc && nkon) + { + inc = (~level << chip->eg_inc) >> 5; + } + } + else + { + switch (chip->eg_state[slot]) + { + case eg_num_attack: + if (level == 0) + { + nextstate = eg_num_decay; + } + else if(chip->eg_inc && !chip->eg_ratemax && nkon) + { + inc = (~level << chip->eg_inc) >> 5; + } + break; + case eg_num_decay: + if ((level >> 4) == (chip->eg_sl[1] << 1)) + { + nextstate = eg_num_sustain; + } + else if (!eg_off && chip->eg_inc) + { + inc = 1 << (chip->eg_inc - 1); + if (chip->eg_ssg_enable[slot]) + { + inc <<= 2; + } + } + break; + case eg_num_sustain: + case eg_num_release: + if (!eg_off && chip->eg_inc) + { + inc = 1 << (chip->eg_inc - 1); + if (chip->eg_ssg_enable[slot]) + { + inc <<= 2; + } + } + break; + default: + break; + } + if (!nkon) + { + nextstate = eg_num_release; + } + } + if (chip->eg_kon_csm[slot]) + { + nextlevel |= chip->eg_tl[1] << 3; + } + + /* Envelope off */ + if (!kon_event && !chip->eg_ssg_hold_up_latch[slot] && chip->eg_state[slot] != eg_num_attack && eg_off) + { + nextstate = eg_num_release; + nextlevel = 0x3ff; + } + + nextlevel += inc; + + chip->eg_kon[slot] = chip->eg_kon_latch[slot]; + chip->eg_level[slot] = (Bit16u)nextlevel & 0x3ff; + chip->eg_state[slot] = nextstate; +} + +static void OPN2_EnvelopePrepare(ym3438_t *chip) +{ + Bit8u rate; + Bit8u sum; + Bit8u inc = 0; + Bit32u slot = chip->cycles; + Bit8u rate_sel; + + /* Prepare increment */ + rate = (chip->eg_rate << 1) + chip->eg_ksv; + + if (rate > 0x3f) + { + rate = 0x3f; + } + + sum = ((rate >> 2) + chip->eg_shift_lock) & 0x0f; + if (chip->eg_rate != 0 && chip->eg_quotient == 2) + { + if (rate < 48) + { + switch (sum) + { + case 12: + inc = 1; + break; + case 13: + inc = (rate >> 1) & 0x01; + break; + case 14: + inc = rate & 0x01; + break; + default: + break; + } + } + else + { + inc = eg_stephi[rate & 0x03][chip->eg_timer_low_lock] + (rate >> 2) - 11; + if (inc > 4) + { + inc = 4; + } + } + } + chip->eg_inc = inc; + chip->eg_ratemax = (rate >> 1) == 0x1f; + + /* Prepare rate & ksv */ + rate_sel = chip->eg_state[slot]; + if ((chip->eg_kon[slot] && chip->eg_ssg_repeat_latch[slot]) + || (!chip->eg_kon[slot] && chip->eg_kon_latch[slot])) + { + rate_sel = eg_num_attack; + } + switch (rate_sel) + { + case eg_num_attack: + chip->eg_rate = chip->ar[slot]; + break; + case eg_num_decay: + chip->eg_rate = chip->dr[slot]; + break; + case eg_num_sustain: + chip->eg_rate = chip->sr[slot]; + break; + case eg_num_release: + chip->eg_rate = (chip->rr[slot] << 1) | 0x01; + break; + default: + break; + } + chip->eg_ksv = chip->pg_kcode >> (chip->ks[slot] ^ 0x03); + if (chip->am[slot]) + { + chip->eg_lfo_am = chip->lfo_am >> eg_am_shift[chip->ams[chip->channel]]; + } + else + { + chip->eg_lfo_am = 0; + } + /* Delay TL & SL value */ + chip->eg_tl[1] = chip->eg_tl[0]; + chip->eg_tl[0] = chip->tl[slot]; + chip->eg_sl[1] = chip->eg_sl[0]; + chip->eg_sl[0] = chip->sl[slot]; +} + +static void OPN2_EnvelopeGenerate(ym3438_t *chip) +{ + Bit32u slot = (chip->cycles + 23) % 24; + Bit16u level; + + level = chip->eg_level[slot]; + + if (chip->eg_ssg_inv[slot]) + { + /* Inverse */ + level = 512 - level; + } + if (chip->mode_test_21[5]) + { + level = 0; + } + level &= 0x3ff; + + /* Apply AM LFO */ + level += chip->eg_lfo_am; + + /* Apply TL */ + if (!(chip->mode_csm && chip->channel == 2 + 1)) + { + level += chip->eg_tl[0] << 3; + } + if (level > 0x3ff) + { + level = 0x3ff; + } + chip->eg_out[slot] = level; +} + +static void OPN2_UpdateLFO(ym3438_t *chip) +{ + if ((chip->lfo_quotient & lfo_cycles[chip->lfo_freq]) == lfo_cycles[chip->lfo_freq]) + { + chip->lfo_quotient = 0; + chip->lfo_cnt++; + } + else + { + chip->lfo_quotient += chip->lfo_inc; + } + chip->lfo_cnt &= chip->lfo_en; +} + +static void OPN2_FMPrepare(ym3438_t *chip) +{ + Bit32u slot = (chip->cycles + 6) % 24; + Bit32u channel = chip->channel; + Bit16s mod, mod1, mod2; + Bit32u op = slot / 6; + Bit8u connect = chip->connect[channel]; + Bit32u prevslot = (chip->cycles + 18) % 24; + + /* Calculate modulation */ + mod1 = mod2 = 0; + + if (fm_algorithm[op][0][connect]) + { + mod2 |= chip->fm_op1[channel][0]; + } + if (fm_algorithm[op][1][connect]) + { + mod1 |= chip->fm_op1[channel][1]; + } + if (fm_algorithm[op][2][connect]) + { + mod1 |= chip->fm_op2[channel]; + } + if (fm_algorithm[op][3][connect]) + { + mod2 |= chip->fm_out[prevslot]; + } + if (fm_algorithm[op][4][connect]) + { + mod1 |= chip->fm_out[prevslot]; + } + mod = mod1 + mod2; + if (op == 0) + { + /* Feedback */ + mod = mod >> (10 - chip->fb[channel]); + if (!chip->fb[channel]) + { + mod = 0; + } + } + else + { + mod >>= 1; + } + chip->fm_mod[slot] = mod; + + slot = (chip->cycles + 18) % 24; + /* OP1 */ + if (slot / 6 == 0) + { + chip->fm_op1[channel][1] = chip->fm_op1[channel][0]; + chip->fm_op1[channel][0] = chip->fm_out[slot]; + } + /* OP2 */ + if (slot / 6 == 2) + { + chip->fm_op2[channel] = chip->fm_out[slot]; + } +} + +static void OPN2_ChGenerate(ym3438_t *chip) +{ + Bit32u slot = (chip->cycles + 18) % 24; + Bit32u channel = chip->channel; + Bit32u op = slot / 6; + Bit32u test_dac = chip->mode_test_2c[5]; + Bit16s acc = chip->ch_acc[channel]; + Bit16s add = test_dac; + Bit16s sum = 0; + if (op == 0 && !test_dac) + { + acc = 0; + } + if (chip->chip_type & ym3438_mode_opn) { + if (fm_algorithm[op][5][chip->connect[channel]] && !test_dac) + { + add += chip->fm_out[slot]; + } + sum = acc + add; + } else { + if (fm_algorithm[op][5][chip->connect[channel]] && !test_dac) + { + add += chip->fm_out[slot] >> 5; + } + sum = acc + add; + /* Clamp */ + if (sum > 255) + { + sum = 255; + } + else if(sum < -256) + { + sum = -256; + } + } + + if (op == 0 || test_dac) + { + chip->ch_out[channel] = chip->ch_acc[channel]; + } + chip->ch_acc[channel] = sum; +} + +static void OPN2_ChOutput(ym3438_t *chip) +{ + Bit32u cycles = chip->cycles; + Bit32u slot = chip->cycles; + Bit32u channel = chip->channel; + Bit32u test_dac = chip->mode_test_2c[5]; + Bit16s out; + Bit16s sign; + Bit32u out_en; + chip->ch_read = chip->ch_lock; + if (slot < 12) + { + /* Ch 4,5,6 */ + channel++; + } + if ((cycles & 3) == 0) + { + if (!test_dac) + { + /* Lock value */ + chip->ch_lock = chip->ch_out[channel]; + } + chip->ch_lock_l = chip->pan_l[channel]; + chip->ch_lock_r = chip->pan_r[channel]; + } + /* Ch 6 */ + if (((cycles >> 2) == 1 && chip->dacen) || test_dac) + { + out = (Bit16s)chip->dacdata; + out = SIGN_EXTEND(8, out); + } + else + { + out = chip->ch_lock; + } + chip->mol = 0; + chip->mor = 0; + + if (chip->chip_type & ym3438_mode_ym2612) + { + out_en = ((cycles & 3) == 3) || test_dac; + /* YM2612 DAC emulation(not verified) */ + sign = out >> 8; + if (out >= 0) + { + out++; + sign++; + } + if (chip->ch_lock_l && out_en) + { + chip->mol = out; + } + else + { + chip->mol = sign; + } + if (chip->ch_lock_r && out_en) + { + chip->mor = out; + } + else + { + chip->mor = sign; + } + /* Amplify signal */ + chip->mol *= 3; + chip->mor *= 3; + } + else + { + out_en = ((cycles & 3) != 0) || test_dac; + if (chip->ch_lock_l && out_en) + { + chip->mol = out; + } + if (chip->ch_lock_r && out_en) + { + chip->mor = out; + } + } +} + +static void OPN2_FMGenerate(ym3438_t *chip) +{ + Bit32u slot = (chip->cycles + 19) % 24; + /* Calculate phase */ + Bit16u phase = (chip->fm_mod[slot] + (chip->pg_phase[slot] >> 10)) & 0x3ff; + Bit16u quarter; + Bit16u level; + Bit16s output; + if (phase & 0x100) + { + quarter = (phase ^ 0xff) & 0xff; + } + else + { + quarter = phase & 0xff; + } + level = logsinrom[quarter]; + /* Apply envelope */ + level += chip->eg_out[slot] << 2; + /* Transform */ + if (level > 0x1fff) + { + level = 0x1fff; + } + output = ((exprom[(level & 0xff) ^ 0xff] | 0x400) << 2) >> (level >> 8); + if (phase & 0x200) + { + output = ((~output) ^ (chip->mode_test_21[4] << 13)) + 1; + } + else + { + output = output ^ (chip->mode_test_21[4] << 13); + } + output = SIGN_EXTEND(13, output); + chip->fm_out[slot] = output; +} + +static void OPN2_DoTimerA(ym3438_t *chip) +{ + Bit16u time; + Bit8u load; + load = chip->timer_a_overflow; + if (chip->cycles == 2) + { + /* Lock load value */ + load |= (!chip->timer_a_load_lock && chip->timer_a_load); + chip->timer_a_load_lock = chip->timer_a_load; + if (chip->mode_csm) + { + /* CSM KeyOn */ + chip->mode_kon_csm = load; + } + else + { + chip->mode_kon_csm = 0; + } + } + /* Load counter */ + if (chip->timer_a_load_latch) + { + time = chip->timer_a_reg; + } + else + { + time = chip->timer_a_cnt; + } + chip->timer_a_load_latch = load; + /* Increase counter */ + if ((chip->cycles == 1 && chip->timer_a_load_lock) || chip->mode_test_21[2]) + { + time++; + } + /* Set overflow flag */ + if (chip->timer_a_reset) + { + chip->timer_a_reset = 0; + chip->timer_a_overflow_flag = 0; + } + else + { + chip->timer_a_overflow_flag |= chip->timer_a_overflow & chip->timer_a_enable; + } + chip->timer_a_overflow = (time >> 10); + chip->timer_a_cnt = time & 0x3ff; +} + +static void OPN2_DoTimerB(ym3438_t *chip) +{ + Bit16u time; + Bit8u load; + load = chip->timer_b_overflow; + if (chip->cycles == 2) + { + /* Lock load value */ + load |= (!chip->timer_b_load_lock && chip->timer_b_load); + chip->timer_b_load_lock = chip->timer_b_load; + } + /* Load counter */ + if (chip->timer_b_load_latch) + { + time = chip->timer_b_reg; + } + else + { + time = chip->timer_b_cnt; + } + chip->timer_b_load_latch = load; + /* Increase counter */ + if (chip->cycles == 1) + { + chip->timer_b_subcnt++; + } + if ((chip->timer_b_subcnt == 0x10 && chip->timer_b_load_lock) || chip->mode_test_21[2]) + { + time++; + } + chip->timer_b_subcnt &= 0x0f; + /* Set overflow flag */ + if (chip->timer_b_reset) + { + chip->timer_b_reset = 0; + chip->timer_b_overflow_flag = 0; + } + else + { + chip->timer_b_overflow_flag |= chip->timer_b_overflow & chip->timer_b_enable; + } + chip->timer_b_overflow = (time >> 8); + chip->timer_b_cnt = time & 0xff; +} + +static void OPN2_KeyOn(ym3438_t*chip) +{ + Bit32u slot = chip->cycles; + Bit32u chan = chip->channel; + /* Key On */ + chip->eg_kon_latch[slot] = chip->mode_kon[slot]; + chip->eg_kon_csm[slot] = 0; + if (chip->channel == 2 && chip->mode_kon_csm) + { + /* CSM Key On */ + chip->eg_kon_latch[slot] = 1; + chip->eg_kon_csm[slot] = 1; + } + if (chip->cycles == chip->mode_kon_channel) + { + /* OP1 */ + chip->mode_kon[chan] = chip->mode_kon_operator[0]; + /* OP2 */ + chip->mode_kon[chan + 12] = chip->mode_kon_operator[1]; + /* OP3 */ + chip->mode_kon[chan + 6] = chip->mode_kon_operator[2]; + /* OP4 */ + chip->mode_kon[chan + 18] = chip->mode_kon_operator[3]; + } +} + +void OPN2_Reset(ym3438_t *chip) +{ + Bit32u i; + memset(chip, 0, sizeof(ym3438_t)); + chip->chip_type = ym3438_mode_readmode; + for (i = 0; i < 24; i++) + { + chip->eg_out[i] = 0x3ff; + chip->eg_level[i] = 0x3ff; + chip->eg_state[i] = eg_num_release; + chip->multi[i] = 1; + } + for (i = 0; i < 6; i++) + { + chip->pan_l[i] = 1; + chip->pan_r[i] = 1; + } +} + +void OPN2_SetChipType(ym3438_t *chip, Bit32u type) +{ + chip->chip_type = type; +} + +void OPN2_Clock(ym3438_t *chip, Bit16s *buffer) +{ + Bit32u slot = chip->cycles; + chip->lfo_inc = chip->mode_test_21[1]; + chip->pg_read >>= 1; + chip->eg_read[1] >>= 1; + chip->eg_cycle++; + /* Lock envelope generator timer value */ + if (chip->cycles == 1 && chip->eg_quotient == 2) + { + if (chip->eg_cycle_stop) + { + chip->eg_shift_lock = 0; + } + else + { + chip->eg_shift_lock = chip->eg_shift + 1; + } + chip->eg_timer_low_lock = chip->eg_timer & 0x03; + } + /* Cycle specific functions */ + switch (chip->cycles) + { + case 0: + chip->lfo_pm = chip->lfo_cnt >> 2; + if (chip->lfo_cnt & 0x40) + { + chip->lfo_am = chip->lfo_cnt & 0x3f; + } + else + { + chip->lfo_am = chip->lfo_cnt ^ 0x3f; + } + chip->lfo_am <<= 1; + break; + case 1: + chip->eg_quotient++; + chip->eg_quotient %= 3; + chip->eg_cycle = 0; + chip->eg_cycle_stop = 1; + chip->eg_shift = 0; + chip->eg_timer_inc |= chip->eg_quotient >> 1; + chip->eg_timer = chip->eg_timer + chip->eg_timer_inc; + chip->eg_timer_inc = chip->eg_timer >> 12; + chip->eg_timer &= 0xfff; + break; + case 2: + chip->pg_read = chip->pg_phase[21] & 0x3ff; + chip->eg_read[1] = chip->eg_out[0]; + break; + case 13: + chip->eg_cycle = 0; + chip->eg_cycle_stop = 1; + chip->eg_shift = 0; + chip->eg_timer = chip->eg_timer + chip->eg_timer_inc; + chip->eg_timer_inc = chip->eg_timer >> 12; + chip->eg_timer &= 0xfff; + break; + case 23: + chip->lfo_inc |= 1; + break; + } + chip->eg_timer &= ~(chip->mode_test_21[5] << chip->eg_cycle); + if (((chip->eg_timer >> chip->eg_cycle) | (chip->pin_test_in & chip->eg_custom_timer)) & chip->eg_cycle_stop) + { + chip->eg_shift = chip->eg_cycle; + chip->eg_cycle_stop = 0; + } + + OPN2_DoIO(chip); + + OPN2_DoTimerA(chip); + OPN2_DoTimerB(chip); + OPN2_KeyOn(chip); + + OPN2_ChOutput(chip); + OPN2_ChGenerate(chip); + + OPN2_FMPrepare(chip); + OPN2_FMGenerate(chip); + + OPN2_PhaseGenerate(chip); + OPN2_PhaseCalcIncrement(chip); + + OPN2_EnvelopeADSR(chip); + OPN2_EnvelopeGenerate(chip); + OPN2_EnvelopeSSGEG(chip); + OPN2_EnvelopePrepare(chip); + + /* Prepare fnum & block */ + if (chip->mode_ch3) + { + /* Channel 3 special mode */ + switch (slot) + { + case 1: /* OP1 */ + chip->pg_fnum = chip->fnum_3ch[1]; + chip->pg_block = chip->block_3ch[1]; + chip->pg_kcode = chip->kcode_3ch[1]; + break; + case 7: /* OP3 */ + chip->pg_fnum = chip->fnum_3ch[0]; + chip->pg_block = chip->block_3ch[0]; + chip->pg_kcode = chip->kcode_3ch[0]; + break; + case 13: /* OP2 */ + chip->pg_fnum = chip->fnum_3ch[2]; + chip->pg_block = chip->block_3ch[2]; + chip->pg_kcode = chip->kcode_3ch[2]; + break; + case 19: /* OP4 */ + default: + chip->pg_fnum = chip->fnum[(chip->channel + 1) % 6]; + chip->pg_block = chip->block[(chip->channel + 1) % 6]; + chip->pg_kcode = chip->kcode[(chip->channel + 1) % 6]; + break; + } + } + else + { + chip->pg_fnum = chip->fnum[(chip->channel + 1) % 6]; + chip->pg_block = chip->block[(chip->channel + 1) % 6]; + chip->pg_kcode = chip->kcode[(chip->channel + 1) % 6]; + } + + OPN2_UpdateLFO(chip); + OPN2_DoRegWrite(chip); + chip->cycles = (chip->cycles + 1) % 24; + chip->channel = chip->cycles % 6; + + buffer[0] = chip->mol; + buffer[1] = chip->mor; + + if (chip->status_time) + chip->status_time--; +} + +void OPN2_Write(ym3438_t *chip, Bit32u port, Bit8u data) +{ + port &= 3; + chip->write_data = ((port << 7) & 0x100) | data; + if (port & 1) + { + /* Data */ + chip->write_d |= 1; + } + else + { + /* Address */ + chip->write_a |= 1; + } +} + +void OPN2_SetTestPin(ym3438_t *chip, Bit32u value) +{ + chip->pin_test_in = value & 1; +} + +Bit32u OPN2_ReadTestPin(ym3438_t *chip) +{ + if (!chip->mode_test_2c[7]) + { + return 0; + } + return chip->cycles == 23; +} + +Bit32u OPN2_ReadIRQPin(ym3438_t *chip) +{ + return chip->timer_a_overflow_flag | chip->timer_b_overflow_flag; +} + +Bit8u OPN2_Read(ym3438_t *chip, Bit32u port) +{ + if ((port & 3) == 0 || (chip->chip_type & ym3438_mode_readmode)) + { + if (chip->mode_test_21[6]) + { + /* Read test data */ + Bit32u slot = (chip->cycles + 18) % 24; + Bit16u testdata = ((chip->pg_read & 0x01) << 15) + | ((chip->eg_read[chip->mode_test_21[0]] & 0x01) << 14); + if (chip->mode_test_2c[4]) + { + testdata |= chip->ch_read & 0x1ff; + } + else + { + testdata |= chip->fm_out[slot] & 0x3fff; + } + if (chip->mode_test_21[7]) + { + chip->status = testdata & 0xff; + } + else + { + chip->status = testdata >> 8; + } + } + else + { + chip->status = (chip->busy << 7) | (chip->timer_b_overflow_flag << 1) + | chip->timer_a_overflow_flag; + } + if (chip->chip_type & ym3438_mode_ym2612) + { + chip->status_time = 300000; + } + else + { + chip->status_time = 40000000; + } + } + if (chip->status_time) + { + return chip->status; + } + return 0; +} diff --git a/extern/opn/ym3438.h b/extern/opn/ym3438.h new file mode 100644 index 00000000..955b7317 --- /dev/null +++ b/extern/opn/ym3438.h @@ -0,0 +1,215 @@ +/* + * Copyright (C) 2017-2021 Alexey Khokholov (Nuke.YKT) + * + * This file is part of Nuked OPN2. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Nuked OPN2(Yamaha YM3438) emulator. + * Thanks: + * Silicon Pr0n: + * Yamaha YM3438 decap and die shot(digshadow). + * OPLx decapsulated(Matthew Gambrell, Olli Niemitalo): + * OPL2 ROMs. + * + * version: 1.0.9 + */ + +#ifndef YM3438_H +#define YM3438_H + +#ifdef __cplusplus +extern "C" { +#endif + +enum { + ym3438_mode_ym2612 = 0x01, /* Enables YM2612 emulation (MD1, MD2 VA2) */ + ym3438_mode_readmode = 0x02, /* Enables status read on any port (TeraDrive, MD1 VA7, MD2, etc) */ + ym3438_mode_opn = 0x04 /* Outputs full, unshifted signal per channel (OPN/OPNA/OPNB) */ +}; + +#include + +typedef uintptr_t Bitu; +typedef intptr_t Bits; +typedef uint64_t Bit64u; +typedef int64_t Bit64s; +typedef uint32_t Bit32u; +typedef int32_t Bit32s; +typedef uint16_t Bit16u; +typedef int16_t Bit16s; +typedef uint8_t Bit8u; +typedef int8_t Bit8s; + +typedef struct +{ + Bit32u cycles; + Bit32u channel; + Bit16s mol, mor; + /* IO */ + Bit16u write_data; + Bit8u write_a; + Bit8u write_d; + Bit8u write_a_en; + Bit8u write_d_en; + Bit8u write_busy; + Bit8u write_busy_cnt; + Bit8u write_fm_address; + Bit8u write_fm_data; + Bit16u write_fm_mode_a; + Bit16u address; + Bit8u data; + Bit8u pin_test_in; + Bit8u pin_irq; + Bit8u busy; + /* LFO */ + Bit8u lfo_en; + Bit8u lfo_freq; + Bit8u lfo_pm; + Bit8u lfo_am; + Bit8u lfo_cnt; + Bit8u lfo_inc; + Bit8u lfo_quotient; + /* Phase generator */ + Bit16u pg_fnum; + Bit8u pg_block; + Bit8u pg_kcode; + Bit32u pg_inc[24]; + Bit32u pg_phase[24]; + Bit8u pg_reset[24]; + Bit32u pg_read; + /* Envelope generator */ + Bit8u eg_cycle; + Bit8u eg_cycle_stop; + Bit8u eg_shift; + Bit8u eg_shift_lock; + Bit8u eg_timer_low_lock; + Bit16u eg_timer; + Bit8u eg_timer_inc; + Bit16u eg_quotient; + Bit8u eg_custom_timer; + Bit8u eg_rate; + Bit8u eg_ksv; + Bit8u eg_inc; + Bit8u eg_ratemax; + Bit8u eg_sl[2]; + Bit8u eg_lfo_am; + Bit8u eg_tl[2]; + Bit8u eg_state[24]; + Bit16u eg_level[24]; + Bit16u eg_out[24]; + Bit8u eg_kon[24]; + Bit8u eg_kon_csm[24]; + Bit8u eg_kon_latch[24]; + Bit8u eg_csm_mode[24]; + Bit8u eg_ssg_enable[24]; + Bit8u eg_ssg_pgrst_latch[24]; + Bit8u eg_ssg_repeat_latch[24]; + Bit8u eg_ssg_hold_up_latch[24]; + Bit8u eg_ssg_dir[24]; + Bit8u eg_ssg_inv[24]; + Bit32u eg_read[2]; + Bit8u eg_read_inc; + /* Settings */ + Bit8u chip_type; + /* FM */ + Bit16s fm_op1[6][2]; + Bit16s fm_op2[6]; + Bit16s fm_out[24]; + Bit16u fm_mod[24]; + /* Channel */ + Bit16s ch_acc[6]; + Bit16s ch_out[6]; + Bit16s ch_lock; + Bit8u ch_lock_l; + Bit8u ch_lock_r; + Bit16s ch_read; + /* Timer */ + Bit16u timer_a_cnt; + Bit16u timer_a_reg; + Bit8u timer_a_load_lock; + Bit8u timer_a_load; + Bit8u timer_a_enable; + Bit8u timer_a_reset; + Bit8u timer_a_load_latch; + Bit8u timer_a_overflow_flag; + Bit8u timer_a_overflow; + + Bit16u timer_b_cnt; + Bit8u timer_b_subcnt; + Bit16u timer_b_reg; + Bit8u timer_b_load_lock; + Bit8u timer_b_load; + Bit8u timer_b_enable; + Bit8u timer_b_reset; + Bit8u timer_b_load_latch; + Bit8u timer_b_overflow_flag; + Bit8u timer_b_overflow; + + /* Register set */ + Bit8u mode_test_21[8]; + Bit8u mode_test_2c[8]; + Bit8u mode_ch3; + Bit8u mode_kon_channel; + Bit8u mode_kon_operator[4]; + Bit8u mode_kon[24]; + Bit8u mode_csm; + Bit8u mode_kon_csm; + Bit8u dacen; + Bit16s dacdata; + + Bit8u ks[24]; + Bit8u ar[24]; + Bit8u sr[24]; + Bit8u dt[24]; + Bit8u multi[24]; + Bit8u sl[24]; + Bit8u rr[24]; + Bit8u dr[24]; + Bit8u am[24]; + Bit8u tl[24]; + Bit8u ssg_eg[24]; + + Bit16u fnum[6]; + Bit8u block[6]; + Bit8u kcode[6]; + Bit16u fnum_3ch[6]; + Bit8u block_3ch[6]; + Bit8u kcode_3ch[6]; + Bit8u reg_a4; + Bit8u reg_ac; + Bit8u connect[6]; + Bit8u fb[6]; + Bit8u pan_l[6], pan_r[6]; + Bit8u ams[6]; + Bit8u pms[6]; + Bit8u status; + Bit32u status_time; +} ym3438_t; + +void OPN2_Reset(ym3438_t *chip); +void OPN2_SetChipType(ym3438_t *chip, Bit32u type); +void OPN2_Clock(ym3438_t *chip, Bit16s *buffer); +void OPN2_Write(ym3438_t *chip, Bit32u port, Bit8u data); +void OPN2_SetTestPin(ym3438_t *chip, Bit32u value); +Bit32u OPN2_ReadTestPin(ym3438_t *chip); +Bit32u OPN2_ReadIRQPin(ym3438_t *chip); +Bit8u OPN2_Read(ym3438_t *chip, Bit32u port); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/extern/opn/ym3438.svg b/extern/opn/ym3438.svg new file mode 100644 index 00000000..d1d86667 --- /dev/null +++ b/extern/opn/ym3438.svg @@ -0,0 +1,16454 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2CLSITEST + daSSSs e + 2ADAC + + 21LSITEST + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Read En + Busy flag + + + + + + + + + + A1 + IC + RD + A0 + CS + WR + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LFO Counter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AMS + + AMS + + + + + + + + + + + + + + AM + + EG out + + TL + + + + + + + + + + + + + + + + + + + + + + + + + + + AM DR + + SL RR + + DT + MULTI + + SR + + RS KS + + AR + + SSG-EG + + AMS + + Data + + + + + + + + + + M + + GND + + D0 + + D1 + + D2 + + D3 + + D4 + + D5 + + D6 + + D7 + + TEST + + IC + + GND + + IRQ + + CS + + WR + + RD + + A0 + + A1 + + AGND + + MOR + + MOL + + AVcc + + VCC + MSB + + + + /D7 + D7 + + + + /D6 + D6 + + + /D5 + D5 + + + /D4 + D4 + /D3 + D3 + + + + + + 30 + + 40 + + + 60 + 50 + + 70 + + 80 + + 90 + + + + + + + + + + + PMS + FMS + R + L + + ALG + + Feedback + + + + + + + + + + D4 + /D4 + D3 + /D3 + D2 + /D2 + + + + + B4 + + B0 + + AC + + A8 + + A4 + + A0 + AC + + + Blck FN Hi + + CH3 Blck FN Hi + + CH3 FN Low + + FN Low + + Blck FN Hi + Data + Address + + + + + + + enable + + CS + WR + bank + IC + RD + A0 + Read Enable + write addr + IC + write data + + + + + + + + + + + + Read Mode + + + + Timer A + Timer B + Timer A + Timer B + + IRQ + Read Status + Timer A + Timer B + + + + + + + + + + + + + + + + + Write Data + Write address + + + + Write Data + + + + + + Address + Data + + + + Bank + + + 2BD EN + + 22LFO + + 24TM AMSB + + 25TM A + + MSB + MSB + MSB + + 22 + 26 + + 27 + + 25 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + + 24 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + + 28 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + + 28KeyOn + + 27CH3 + + 26TM B + + EG Rate select + + EG Rate Select + + Rate + + Rate + + KS + + KS + + + KCODE + + KCODE + + + FNUM + + NT + BLCK + + KC Latch + + MUL Latch + + MULT + + + + Feedback + + Algorithm + + + + Exponent + Sine + DACMODE + DAC EN + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 + 0 + DAC Data + + + + + + + + + + + + DACEN + + DACEn + + + + + PAN + + + + + + + + Note + + PHASE + + EG + + ReadData + Out + + MSB + + + + + + + + + + + AND + + AND + + + + + + + + + + + + + + + MSB + b0 + b2 + b1 + n0 + n1 + DT0 + DT1 + DT2 + + DT0 | DT1 + + DT0 & DT1 + + + + + + + sum0 + + N0N1S0 + + !N0N1S0 + + N0!N1S0 + + !N0!N1S0 + + N0N1!S0 + + !N0N1!S0 + + + N0!N1!S0 + + !N0!N1!S0 + MSB + d0 + d1 + d2 + + + + d3 + + + + + + + + + + + + + Rising + + + 0 + + 1 + + 2 + + 3 + + 4 + + 5 + + 6 + + 7 + + 8 + + 9 + + 10 + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 1 + 2 + 3 + 4 + + + + + + + + + + + + + + + + + + + + + + + + 1 + 2 + 3 + 4 + 1 + 2 + 3 + 4 + + + + 9 + 8 + 7 + + + + + 0 + + 1 + + 2 + + 3 + + 4 + + 5 + + 6 + + 7 + + + + + + + + FMS + MSB + + + + + + + 001 + + 100 + + 011 + + 010 + + 101 + + 111 + + 110 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A or (A << 1) (A << 1) or(A << 2) 1 + 0 + 2 + 1 + 2 + + + + + + + + + + + + + + 11X + + >=5 + + + + <=5 ==7 + ==6 + Enable + + + Repeat + + + + + + XX11 + + XX10 + + XX00 + + + + + + X101X011 + + XXX0 + + + + + + + + + + + + + + + + Enable + Inverse + XX11 + X101 X011 + XXX0 + XX10 + XX00 + + + + + + Timer A + + Timer B + KeyOn + + + 0 + + 1 + + 2 + 3 + 4 + 5 + 6 + 7 + 0 + + 2 + + 3 + + 4 + + 5 + + 6 + + 7 + + 8 + + 9 + + 10 + + 11 + + + + + + + + + + + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 1011 + 0 + 1 + 2 + 3 + 0 + 1 + 2 + 2 + 0 + 1 + + + + + + + + 0 + + 1 + + 2 + + 3 + + 4 + + 5 + + 6 + + 7 + + 5,6,7 + + 4,5,67 + + 2,5 + + 1,5 + + 0,34,5,6 + + + 0,1,3,4 + 0,1,2 + + OP2 Out + OP3 Out + + OperatorAccumulator + + Switch + + Op 1 + + Op3 + + Op2 + + Op4 + + + + + Op4Select + Op1Select + Op3Select + + Op2Select + + + + + + + + + + + + + 0 + 1 + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 6-11 + 0-5 + 12-17 + 18-23 + + 18-23 + + 0,4,8,12,16,20 + + 12-17 + + 2,8,14,20 + + 4-7 + + + Rise + + 0 + 1 + 2 + 3 + 0 + 1 + 2 + 3 + + + + + + + + + + + + + + + + + 0.5 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + + 0.5 + + + 1,3,5,7,9,1113 + + Switch + + 2,36,710,11 + + 4,5,6,7 + + 8,9,10,11,12,13 + + + 15 + 14 + + 14,15 + + 12,13 + + + Frequency + Frequency + + + + + 0 + 1 + 2 + + X00 + + X01 + + X10 + + X11 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 14,15 + Reset + + M And + + PG Reset + + TL + + + TL + + AND OR + MSB + n0 + n1 + b0 + b1 + b2 + n0 + n1 + b0 + b1 + b2 + + 11->n010->n101->b000->b1 + + 11->n110->b001->b100->b2 + + 11->b010->b101->b2 + + 11->b110->b2 + + 11->b2 + 0 + + Non Zero + + + + + + + + + + + <12 + + + + + Max Rate + + + + + + + 1111XX + + 1110XX + + 1101XX + + 1100XX + + Non zero + + Clock 0 + + + 0,12or IC + + EG LSI + IC + + + + + + + + + + + + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + + 0,2,4,6,8,10 + + 1,2,5,6,9,10 + + 3,4,5,6,11 + + 7,8,9,10,11 + + + + + + + + + + + + + + + + + + + LFO En + + + Bank + + + + + Top 4 non zero + + + AND OR + + IC + + AND OR + + + + + + + + + + + + + + + + + Exponent + + 3 + + 2 + + + 1 + 0 + + + + + + + + + + + Linear + + SSG Enable + + + + + + + + + + + + AND OR + + + + PG Reset + + 00 - AR + + 01 - DR + + 10-SR + + 11-RR + + + SL + + + + + + + + + + + + + + + + Sustain reach + 111111xxxx + + 00000xxxxx + + + Zero att + + + + AND OR + + Key on + + Key Off + + Attack!KonEvZeroAtt + Decay!KonEvSL reach + + + Release!KonEv + + + + + + CSM + CH3 mode + CH3 mode + + Load A + + Load B + + + Timer A inc + + Timer A LoadRise + + Timer AOverflow + + Timer Reset + + CSM Key + CSM + + CH select + CSM Key On + CH3 + + Is not CSM + + Key latch + + + Envelope off + + SL + + IC + + + + No Attack + + + + + LSI Test + + EG invert + + + Inverse + + Bit9xx10 + Bit9xx11 + + Non attack + Hold up + + Hold up + bit9xx00 + + Reset + + PG Reset + + bit9xxx0 + PG reset + Hold + + + Bank 1 + + Bank 2 + + + + + 2 + + 1 + + 0 + + 1 + + 2 + + + + FB ac + 3 + + 4 + + 5 + + 6 + + 7 + 7 + 6 + 5 + 4 + 3 + 2 + 1 + + + OP2 + + OP1 + + OP1 + + OP1 + + + + + cur2 + + + + 19-24 + + + OP2 + OP1 old + + OP2Mod + + Clock + + + TimerLow + Rate 11Timer 01 + + Rate 01Timer 00 + + + + Rate 1XTimer X0 + + + + IC + + A0 + + A1 + + A2 + + A8 + + + + + And OR + + + + + + + + A0 + + A1 + + A9 + + + Standard + + OP2 + + OP3 + + OP1 + + Ch3 OP1 + + + + + + + + + + LFOenable + + + + LFO0 + LFO1 + LFO2 + + + LFOfreq + L + + 0 + + 1 + + + 2 + 3 + + 4 + + 5 + + 6 + + 7 + + 0 + + 1 + + 2 + + 3 + + 4 + + 5 + 6 + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + Delay 5 + PG Freeze + + + !PG reset + + !PG reset& !TEST + + + + + Phaseread,cycle 2 + + Nonzero + Non zr<1213 + + Non zr<1212 + + Non zr<12 + 14 + + >12incr + + Inc 1 + + + Inc 2 + Inc 3 + + AttackKeyOn!ZeroAttn!RateMax + + + Key + + KONSSG en + + SSG inverse + + 1 + + 4 + + 2 + + 3 + + + Kon + + + + + + + + + + + + Cycle 2 + + 1 + + 2 + hold up + + Switchor + + Decay!KonEv!SL reach + Cur1 + + + + + Lock + + + Neg + + Load A + + Load B + + EnableA + + EnableB + + + ResetB + ResetA + Timer Test + Clock 1 + + + !ResetEnableOverflow + + + Load Up + + !ResetOvrfEnable + 0 + 1 + 2 + 3 + 4 + 5 + 6 + + 0 + 1 + 2 + 3 + OP1 Old + + Op2 + + OP1 + cur2 + cur1 + Op2 + diff --git a/src/engine/dispatchContainer.cpp b/src/engine/dispatchContainer.cpp index 0017ea23..5768bde3 100644 --- a/src/engine/dispatchContainer.cpp +++ b/src/engine/dispatchContainer.cpp @@ -248,16 +248,20 @@ void DivDispatchContainer::init(DivSystem sys, DivEngine* eng, int chanCount, do case DIV_SYSTEM_YM2610: case DIV_SYSTEM_YM2610_FULL: dispatch=new DivPlatformYM2610; + ((DivPlatformYM2610*)dispatch)->setCombo(eng->getConfInt("opnCore",1)==1); break; case DIV_SYSTEM_YM2610_EXT: case DIV_SYSTEM_YM2610_FULL_EXT: dispatch=new DivPlatformYM2610Ext; + ((DivPlatformYM2610Ext*)dispatch)->setCombo(eng->getConfInt("opnCore",1)==1); break; case DIV_SYSTEM_YM2610B: dispatch=new DivPlatformYM2610B; + ((DivPlatformYM2610B*)dispatch)->setCombo(eng->getConfInt("opnCore",1)==1); break; case DIV_SYSTEM_YM2610B_EXT: dispatch=new DivPlatformYM2610BExt; + ((DivPlatformYM2610BExt*)dispatch)->setCombo(eng->getConfInt("opnCore",1)==1); break; case DIV_SYSTEM_AMIGA: dispatch=new DivPlatformAmiga; @@ -277,15 +281,19 @@ void DivDispatchContainer::init(DivSystem sys, DivEngine* eng, int chanCount, do break; case DIV_SYSTEM_YM2203: dispatch=new DivPlatformYM2203; + ((DivPlatformYM2203*)dispatch)->setCombo(eng->getConfInt("opnCore",1)==1); break; case DIV_SYSTEM_YM2203_EXT: dispatch=new DivPlatformYM2203Ext; + ((DivPlatformYM2203Ext*)dispatch)->setCombo(eng->getConfInt("opnCore",1)==1); break; case DIV_SYSTEM_YM2608: dispatch=new DivPlatformYM2608; + ((DivPlatformYM2608*)dispatch)->setCombo(eng->getConfInt("opnCore",1)==1); break; case DIV_SYSTEM_YM2608_EXT: dispatch=new DivPlatformYM2608Ext; + ((DivPlatformYM2608Ext*)dispatch)->setCombo(eng->getConfInt("opnCore",1)==1); break; case DIV_SYSTEM_OPLL: case DIV_SYSTEM_OPLL_DRUMS: diff --git a/src/engine/platform/fmshared_OPN.h b/src/engine/platform/fmshared_OPN.h index e24b9cb3..630a4970 100644 --- a/src/engine/platform/fmshared_OPN.h +++ b/src/engine/platform/fmshared_OPN.h @@ -21,6 +21,7 @@ #define _FMSHARED_OPN_H #include "fmsharedbase.h" +#include "../../../extern/opn/ym3438.h" #define PLEASE_HELP_ME(_targetChan) \ int boundaryBottom=parent->calcBaseFreq(chipClock,CHIP_FREQBASE,0,false); \ @@ -153,7 +154,7 @@ class DivPlatformOPN: public DivPlatformFMBase { unsigned int ayDiv; unsigned char csmChan; unsigned char lfoValue; - bool extSys; + bool extSys, useCombo; DivConfig ayFlags; @@ -171,8 +172,12 @@ class DivPlatformOPN: public DivPlatformFMBase { ayDiv(a), csmChan(cc), lfoValue(0), - extSys(isExtSys) {} - + extSys(isExtSys), + useCombo(false) {} + public: + void setCombo(bool combo) { + useCombo=combo; + } }; #endif diff --git a/src/engine/platform/genesis.cpp b/src/engine/platform/genesis.cpp index 76294524..2fb6e53b 100644 --- a/src/engine/platform/genesis.cpp +++ b/src/engine/platform/genesis.cpp @@ -1150,7 +1150,7 @@ void DivPlatformGenesis::reset() { fm_ymfm->reset(); } OPN2_Reset(&fm); - OPN2_SetChipType(ladder?ym3438_mode_ym2612:0); + OPN2_SetChipType(&fm,ladder?ym3438_mode_ym2612:0); if (dumpWrites) { addWrite(0xffffffff,0); } @@ -1248,7 +1248,7 @@ void DivPlatformGenesis::setFlags(const DivConfig& flags) { } ladder=flags.getBool("ladderEffect",false); noExtMacros=flags.getBool("noExtMacros",false); - OPN2_SetChipType(ladder?ym3438_mode_ym2612:0); + OPN2_SetChipType(&fm,ladder?ym3438_mode_ym2612:0); CHECK_CUSTOM_CLOCK; if (useYMFM) { if (fm_ymfm!=NULL) delete fm_ymfm; diff --git a/src/engine/platform/genesis.h b/src/engine/platform/genesis.h index 2a7b2c8d..d6608382 100644 --- a/src/engine/platform/genesis.h +++ b/src/engine/platform/genesis.h @@ -21,7 +21,6 @@ #define _GENESIS_H #include "fmshared_OPN.h" -#include "../../../extern/Nuked-OPN2/ym3438.h" #include "sound/ymfm/ymfm_opn.h" diff --git a/src/engine/platform/ym2203.cpp b/src/engine/platform/ym2203.cpp index d31c58f4..a968d49d 100644 --- a/src/engine/platform/ym2203.cpp +++ b/src/engine/platform/ym2203.cpp @@ -157,6 +157,80 @@ const char** DivPlatformYM2203::getRegisterSheet() { } void DivPlatformYM2203::acquire(short* bufL, short* bufR, size_t start, size_t len) { + if (useCombo) { + acquire_combo(bufL,bufR,start,len); + } else { + acquire_ymfm(bufL,bufR,start,len); + } +} + +void DivPlatformYM2203::acquire_combo(short* bufL, short* bufR, size_t start, size_t len) { + static int os; + static short ignored[2]; + + for (size_t h=start; hread(0)&0x80)) { + QueuedWrite& w=writes.front(); + + if (w.addr<=0x1c || w.addr==0x2d || w.addr==0x2e || w.addr==0x2f) { + // ymfm write + fm->write(0x0,w.addr); + fm->write(0x1,w.val); + + regPool[w.addr&0xff]=w.val; + writes.pop_front(); + delay=1; + } else { + // Nuked write + if (w.addrOrVal) { + OPN2_Write(&fm_nuked,0x1,w.val); + regPool[w.addr&0xff]=w.val; + writes.pop_front(); + } else { + lastBusy++; + if (fm_nuked.write_busy==0) { + OPN2_Write(&fm_nuked,0x0,w.addr); + w.addrOrVal=true; + } + } + } + } + } + + OPN2_Clock(&fm_nuked,ignored); + } + os=( + (fm_nuked.ch_out[0])+ + (fm_nuked.ch_out[1])+ + (fm_nuked.ch_out[2]) + ); + + os&=~3; + + // ymfm part + fm->generate(&fmout); + + os+=((fmout.data[1]+fmout.data[2]+fmout.data[3])>>1); + if (os<-32768) os=-32768; + if (os>32767) os=32767; + + bufL[h]=os; + + for (int i=0; i<3; i++) { + oscBuf[i]->data[oscBuf[i]->needle++]=fm_nuked.ch_out[i]; + } + + for (int i=3; i<6; i++) { + oscBuf[i]->data[oscBuf[i]->needle++]=fmout.data[i-2]; + } + } +} + +void DivPlatformYM2203::acquire_ymfm(short* bufL, short* bufR, size_t start, size_t len) { static int os; ymfm::ym2203::fm_engine* fme=fm->debug_fm_engine(); @@ -857,6 +931,8 @@ void DivPlatformYM2203::reset() { if (dumpWrites) { addWrite(0xffffffff,0); } + OPN2_Reset(&fm_nuked); + OPN2_SetChipType(&fm_nuked,ym3438_mode_opn); fm->reset(); for (int i=0; i<6; i++) { chan[i]=DivPlatformOPN::OPNChannel(); @@ -946,18 +1022,21 @@ void DivPlatformYM2203::setFlags(const DivConfig& flags) { fmFreqBase=4720270.0/2.0, fmDivBase=18, ayDiv=8; + nukedMult=16; break; case 0x02: // /2 prescale=0x2f; fmFreqBase=4720270.0/3.0, fmDivBase=12, ayDiv=4; + nukedMult=24; break; default: // /6 prescale=0x2d; fmFreqBase=4720270.0, fmDivBase=36, ayDiv=16; + nukedMult=8; break; } CHECK_CUSTOM_CLOCK; diff --git a/src/engine/platform/ym2203.h b/src/engine/platform/ym2203.h index 0e0da7e4..3d4670f7 100644 --- a/src/engine/platform/ym2203.h +++ b/src/engine/platform/ym2203.h @@ -42,6 +42,7 @@ class DivPlatformYM2203: public DivPlatformOPN { OPNChannel chan[6]; DivDispatchOscBuffer* oscBuf[6]; bool isMuted[6]; + ym3438_t fm_nuked; ymfm::ym2203* fm; ymfm::ym2203::output_data fmout; DivYM2203Interface iface; @@ -50,9 +51,13 @@ class DivPlatformYM2203: public DivPlatformOPN { unsigned char sampleBank; bool extMode, noExtMacros; - unsigned char prescale; + unsigned char prescale, nukedMult; friend void putDispatchChip(void*,int); + + void acquire_combo(short* bufL, short* bufR, size_t start, size_t len); + void acquire_ymfm(short* bufL, short* bufR, size_t start, size_t len); + public: void acquire(short* bufL, short* bufR, size_t start, size_t len); int dispatch(DivCommand c); diff --git a/src/engine/platform/ym2608.cpp b/src/engine/platform/ym2608.cpp index 98248472..924b6dbb 100644 --- a/src/engine/platform/ym2608.cpp +++ b/src/engine/platform/ym2608.cpp @@ -298,6 +298,116 @@ double DivPlatformYM2608::NOTE_ADPCMB(int note) { } void DivPlatformYM2608::acquire(short* bufL, short* bufR, size_t start, size_t len) { + if (useCombo) { + acquire_combo(bufL,bufR,start,len); + } else { + acquire_ymfm(bufL,bufR,start,len); + } +} + +void DivPlatformYM2608::acquire_combo(short* bufL, short* bufR, size_t start, size_t len) { + static int os[2]; + static short ignored[2]; + + ymfm::ssg_engine* ssge=fm->debug_ssg_engine(); + ymfm::adpcm_a_engine* aae=fm->debug_adpcm_a_engine(); + ymfm::adpcm_b_engine* abe=fm->debug_adpcm_b_engine(); + + ymfm::ssg_engine::output_data ssgOut; + + ymfm::adpcm_a_channel* adpcmAChan[6]; + for (int i=0; i<6; i++) { + adpcmAChan[i]=aae->debug_channel(i); + } + + for (size_t h=start; hread(0)&0x80)) { + QueuedWrite& w=writes.front(); + + if (w.addr<=0x1c || w.addr==0x2d || w.addr==0x2e || w.addr==0x2f || (w.addr>=0x100 && w.addr<=0x12d)) { + // ymfm write + fm->write(0x0+((w.addr>>8)<<1),w.addr); + fm->write(0x1+((w.addr>>8)<<1),w.val); + + regPool[w.addr&0x1ff]=w.val; + writes.pop_front(); + delay=1; + } else { + // Nuked write + if (w.addrOrVal) { + OPN2_Write(&fm_nuked,0x1+((w.addr>>8)<<1),w.val); + regPool[w.addr&0x1ff]=w.val; + writes.pop_front(); + } else { + lastBusy++; + if (fm_nuked.write_busy==0) { + OPN2_Write(&fm_nuked,0x0+((w.addr>>8)<<1),w.addr); + w.addrOrVal=true; + } + } + } + } + } + + OPN2_Clock(&fm_nuked,ignored); + } + os[0]=( + (fm_nuked.pan_l[0]?fm_nuked.ch_out[0]:0)+ + (fm_nuked.pan_l[1]?fm_nuked.ch_out[1]:0)+ + (fm_nuked.pan_l[2]?fm_nuked.ch_out[2]:0)+ + (fm_nuked.pan_l[3]?fm_nuked.ch_out[3]:0)+ + (fm_nuked.pan_l[4]?fm_nuked.ch_out[4]:0)+ + (fm_nuked.pan_l[5]?fm_nuked.ch_out[5]:0) + ); + os[1]=( + (fm_nuked.pan_r[0]?fm_nuked.ch_out[0]:0)+ + (fm_nuked.pan_r[1]?fm_nuked.ch_out[1]:0)+ + (fm_nuked.pan_r[2]?fm_nuked.ch_out[2]:0)+ + (fm_nuked.pan_r[3]?fm_nuked.ch_out[3]:0)+ + (fm_nuked.pan_r[4]?fm_nuked.ch_out[4]:0)+ + (fm_nuked.pan_r[5]?fm_nuked.ch_out[5]:0) + ); + + os[0]>>=1; + os[1]>>=1; + + // ymfm part + fm->generate(&fmout); + + os[0]+=fmout.data[0]+(fmout.data[2]>>1); + if (os[0]<-32768) os[0]=-32768; + if (os[0]>32767) os[0]=32767; + + os[1]+=fmout.data[1]+(fmout.data[2]>>1); + if (os[1]<-32768) os[1]=-32768; + if (os[1]>32767) os[1]=32767; + + bufL[h]=os[0]; + bufR[h]=os[1]; + + + for (int i=0; idata[oscBuf[i]->needle++]=fm_nuked.ch_out[i]; + } + + ssge->get_last_out(ssgOut); + for (int i=psgChanOffs; idata[oscBuf[i]->needle++]=ssgOut.data[i-psgChanOffs]; + } + + for (int i=adpcmAChanOffs; idata[oscBuf[i]->needle++]=adpcmAChan[i-adpcmAChanOffs]->get_last_out(0)+adpcmAChan[i-adpcmAChanOffs]->get_last_out(1); + } + + oscBuf[adpcmBChanOffs]->data[oscBuf[adpcmBChanOffs]->needle++]=abe->get_last_out(0)+abe->get_last_out(1); + } +} + +void DivPlatformYM2608::acquire_ymfm(short* bufL, short* bufR, size_t start, size_t len) { static int os[2]; ymfm::ym2608::fm_engine* fme=fm->debug_fm_engine(); @@ -1256,6 +1366,8 @@ void DivPlatformYM2608::reset() { if (dumpWrites) { addWrite(0xffffffff,0); } + OPN2_Reset(&fm_nuked); + OPN2_SetChipType(&fm_nuked,ym3438_mode_opn); fm->reset(); for (int i=0; i<16; i++) { chan[i]=DivPlatformOPN::OPNChannelStereo(); @@ -1407,18 +1519,21 @@ void DivPlatformYM2608::setFlags(const DivConfig& flags) { fmFreqBase=9440540.0/2.0, fmDivBase=36, ayDiv=16; + nukedMult=16; break; case 0x02: // /2 prescale=0x2f; fmFreqBase=9440540.0/3.0, fmDivBase=24, ayDiv=8; + nukedMult=24; break; default: // /6 prescale=0x2d; fmFreqBase=9440540.0, fmDivBase=72, ayDiv=32; + nukedMult=8; break; } CHECK_CUSTOM_CLOCK; diff --git a/src/engine/platform/ym2608.h b/src/engine/platform/ym2608.h index d1100ce9..4e6c59b9 100644 --- a/src/engine/platform/ym2608.h +++ b/src/engine/platform/ym2608.h @@ -47,6 +47,7 @@ class DivPlatformYM2608: public DivPlatformOPN { OPNChannelStereo chan[16]; DivDispatchOscBuffer* oscBuf[16]; bool isMuted[16]; + ym3438_t fm_nuked; ymfm::ym2608* fm; ymfm::ym2608::output_data fmout; @@ -62,12 +63,16 @@ class DivPlatformYM2608: public DivPlatformOPN { int globalRSSVolume; bool extMode, noExtMacros; - unsigned char prescale; + unsigned char prescale, nukedMult; double NOTE_OPNB(int ch, int note); double NOTE_ADPCMB(int note); friend void putDispatchChip(void*,int); + + void acquire_combo(short* bufL, short* bufR, size_t start, size_t len); + void acquire_ymfm(short* bufL, short* bufR, size_t start, size_t len); + public: void acquire(short* bufL, short* bufR, size_t start, size_t len); int dispatch(DivCommand c); diff --git a/src/engine/platform/ym2610.cpp b/src/engine/platform/ym2610.cpp index 2a3b00ac..8b398a3e 100644 --- a/src/engine/platform/ym2610.cpp +++ b/src/engine/platform/ym2610.cpp @@ -233,6 +233,112 @@ const char** DivPlatformYM2610::getRegisterSheet() { } void DivPlatformYM2610::acquire(short* bufL, short* bufR, size_t start, size_t len) { + if (useCombo) { + acquire_combo(bufL,bufR,start,len); + } else { + acquire_ymfm(bufL,bufR,start,len); + } +} + +void DivPlatformYM2610::acquire_combo(short* bufL, short* bufR, size_t start, size_t len) { + static int os[2]; + static short ignored[2]; + + ymfm::ssg_engine* ssge=fm->debug_ssg_engine(); + ymfm::adpcm_a_engine* aae=fm->debug_adpcm_a_engine(); + ymfm::adpcm_b_engine* abe=fm->debug_adpcm_b_engine(); + + ymfm::ssg_engine::output_data ssgOut; + + ymfm::adpcm_a_channel* adpcmAChan[6]; + for (int i=0; i<6; i++) { + adpcmAChan[i]=aae->debug_channel(i); + } + + for (size_t h=start; hread(0)&0x80)) { + QueuedWrite& w=writes.front(); + + if (w.addr<=0x1c || (w.addr>=0x100 && w.addr<=0x12d)) { + // ymfm write + fm->write(0x0+((w.addr>>8)<<1),w.addr); + fm->write(0x1+((w.addr>>8)<<1),w.val); + + regPool[w.addr&0x1ff]=w.val; + writes.pop_front(); + delay=32; + } else { + // Nuked write + if (w.addrOrVal) { + OPN2_Write(&fm_nuked,0x1+((w.addr>>8)<<1),w.val); + regPool[w.addr&0x1ff]=w.val; + writes.pop_front(); + } else { + lastBusy++; + if (fm_nuked.write_busy==0) { + OPN2_Write(&fm_nuked,0x0+((w.addr>>8)<<1),w.addr); + w.addrOrVal=true; + } + } + } + } + } + + OPN2_Clock(&fm_nuked,ignored); + } + os[0]=( + (fm_nuked.pan_l[1]?fm_nuked.ch_out[1]:0)+ + (fm_nuked.pan_l[2]?fm_nuked.ch_out[2]:0)+ + (fm_nuked.pan_l[4]?fm_nuked.ch_out[4]:0)+ + (fm_nuked.pan_l[5]?fm_nuked.ch_out[5]:0) + ); + os[1]=( + (fm_nuked.pan_r[1]?fm_nuked.ch_out[1]:0)+ + (fm_nuked.pan_r[2]?fm_nuked.ch_out[2]:0)+ + (fm_nuked.pan_r[4]?fm_nuked.ch_out[4]:0)+ + (fm_nuked.pan_r[5]?fm_nuked.ch_out[5]:0) + ); + + os[0]>>=1; + os[1]>>=1; + + // ymfm part + fm->generate(&fmout); + + os[0]+=fmout.data[0]+(fmout.data[2]>>1); + if (os[0]<-32768) os[0]=-32768; + if (os[0]>32767) os[0]=32767; + + os[1]+=fmout.data[1]+(fmout.data[2]>>1); + if (os[1]<-32768) os[1]=-32768; + if (os[1]>32767) os[1]=32767; + + bufL[h]=os[0]; + bufR[h]=os[1]; + + + for (int i=0; idata[oscBuf[i]->needle++]=fm_nuked.ch_out[bchOffs[i]]; + } + + ssge->get_last_out(ssgOut); + for (int i=psgChanOffs; idata[oscBuf[i]->needle++]=ssgOut.data[i-psgChanOffs]; + } + + for (int i=adpcmAChanOffs; idata[oscBuf[i]->needle++]=adpcmAChan[i-adpcmAChanOffs]->get_last_out(0)+adpcmAChan[i-adpcmAChanOffs]->get_last_out(1); + } + + oscBuf[adpcmBChanOffs]->data[oscBuf[adpcmBChanOffs]->needle++]=abe->get_last_out(0)+abe->get_last_out(1); + } +} + +void DivPlatformYM2610::acquire_ymfm(short* bufL, short* bufR, size_t start, size_t len) { static int os[2]; ymfm::ym2610::fm_engine* fme=fm->debug_fm_engine(); @@ -254,13 +360,13 @@ void DivPlatformYM2610::acquire(short* bufL, short* bufR, size_t start, size_t l for (size_t h=start; hread(0)&0x80)) { QueuedWrite& w=writes.front(); fm->write(0x0+((w.addr>>8)<<1),w.addr); fm->write(0x1+((w.addr>>8)<<1),w.val); regPool[w.addr&0x1ff]=w.val; writes.pop_front(); - delay=4; + delay=1; } } diff --git a/src/engine/platform/ym2610.h b/src/engine/platform/ym2610.h index b07819f0..f2ffb9c7 100644 --- a/src/engine/platform/ym2610.h +++ b/src/engine/platform/ym2610.h @@ -37,6 +37,10 @@ class DivPlatformYM2610: public DivPlatformYM2610Base { }; friend void putDispatchChip(void*,int); + + void acquire_combo(short* bufL, short* bufR, size_t start, size_t len); + void acquire_ymfm(short* bufL, short* bufR, size_t start, size_t len); + public: void acquire(short* bufL, short* bufR, size_t start, size_t len); int dispatch(DivCommand c); diff --git a/src/engine/platform/ym2610b.cpp b/src/engine/platform/ym2610b.cpp index 28c69353..af02fd9a 100644 --- a/src/engine/platform/ym2610b.cpp +++ b/src/engine/platform/ym2610b.cpp @@ -297,6 +297,116 @@ const char** DivPlatformYM2610B::getRegisterSheet() { } void DivPlatformYM2610B::acquire(short* bufL, short* bufR, size_t start, size_t len) { + if (useCombo) { + acquire_combo(bufL,bufR,start,len); + } else { + acquire_ymfm(bufL,bufR,start,len); + } +} + +void DivPlatformYM2610B::acquire_combo(short* bufL, short* bufR, size_t start, size_t len) { + static int os[2]; + static short ignored[2]; + + ymfm::ssg_engine* ssge=fm->debug_ssg_engine(); + ymfm::adpcm_a_engine* aae=fm->debug_adpcm_a_engine(); + ymfm::adpcm_b_engine* abe=fm->debug_adpcm_b_engine(); + + ymfm::ssg_engine::output_data ssgOut; + + ymfm::adpcm_a_channel* adpcmAChan[6]; + for (int i=0; i<6; i++) { + adpcmAChan[i]=aae->debug_channel(i); + } + + for (size_t h=start; hread(0)&0x80)) { + QueuedWrite& w=writes.front(); + + if (w.addr<=0x1c || (w.addr>=0x100 && w.addr<=0x12d)) { + // ymfm write + fm->write(0x0+((w.addr>>8)<<1),w.addr); + fm->write(0x1+((w.addr>>8)<<1),w.val); + + regPool[w.addr&0x1ff]=w.val; + writes.pop_front(); + delay=32; + } else { + // Nuked write + if (w.addrOrVal) { + OPN2_Write(&fm_nuked,0x1+((w.addr>>8)<<1),w.val); + regPool[w.addr&0x1ff]=w.val; + writes.pop_front(); + } else { + lastBusy++; + if (fm_nuked.write_busy==0) { + OPN2_Write(&fm_nuked,0x0+((w.addr>>8)<<1),w.addr); + w.addrOrVal=true; + } + } + } + } + } + + OPN2_Clock(&fm_nuked,ignored); + } + os[0]=( + (fm_nuked.pan_l[0]?fm_nuked.ch_out[0]:0)+ + (fm_nuked.pan_l[1]?fm_nuked.ch_out[1]:0)+ + (fm_nuked.pan_l[2]?fm_nuked.ch_out[2]:0)+ + (fm_nuked.pan_l[3]?fm_nuked.ch_out[3]:0)+ + (fm_nuked.pan_l[4]?fm_nuked.ch_out[4]:0)+ + (fm_nuked.pan_l[5]?fm_nuked.ch_out[5]:0) + ); + os[1]=( + (fm_nuked.pan_r[0]?fm_nuked.ch_out[0]:0)+ + (fm_nuked.pan_r[1]?fm_nuked.ch_out[1]:0)+ + (fm_nuked.pan_r[2]?fm_nuked.ch_out[2]:0)+ + (fm_nuked.pan_r[3]?fm_nuked.ch_out[3]:0)+ + (fm_nuked.pan_r[4]?fm_nuked.ch_out[4]:0)+ + (fm_nuked.pan_r[5]?fm_nuked.ch_out[5]:0) + ); + + os[0]>>=1; + os[1]>>=1; + + // ymfm part + fm->generate(&fmout); + + os[0]+=fmout.data[0]+(fmout.data[2]>>1); + if (os[0]<-32768) os[0]=-32768; + if (os[0]>32767) os[0]=32767; + + os[1]+=fmout.data[1]+(fmout.data[2]>>1); + if (os[1]<-32768) os[1]=-32768; + if (os[1]>32767) os[1]=32767; + + bufL[h]=os[0]; + bufR[h]=os[1]; + + + for (int i=0; idata[oscBuf[i]->needle++]=fm_nuked.ch_out[i]; + } + + ssge->get_last_out(ssgOut); + for (int i=psgChanOffs; idata[oscBuf[i]->needle++]=ssgOut.data[i-psgChanOffs]; + } + + for (int i=adpcmAChanOffs; idata[oscBuf[i]->needle++]=adpcmAChan[i-adpcmAChanOffs]->get_last_out(0)+adpcmAChan[i-adpcmAChanOffs]->get_last_out(1); + } + + oscBuf[adpcmBChanOffs]->data[oscBuf[adpcmBChanOffs]->needle++]=abe->get_last_out(0)+abe->get_last_out(1); + } +} + +void DivPlatformYM2610B::acquire_ymfm(short* bufL, short* bufR, size_t start, size_t len) { static int os[2]; ymfm::ym2610b::fm_engine* fme=fm->debug_fm_engine(); @@ -316,13 +426,13 @@ void DivPlatformYM2610B::acquire(short* bufL, short* bufR, size_t start, size_t for (size_t h=start; hread(0)&0x80)) { QueuedWrite& w=writes.front(); fm->write(0x0+((w.addr>>8)<<1),w.addr); fm->write(0x1+((w.addr>>8)<<1),w.val); regPool[w.addr&0x1ff]=w.val; writes.pop_front(); - delay=4; + delay=1; } } diff --git a/src/engine/platform/ym2610b.h b/src/engine/platform/ym2610b.h index 26a5cdee..6052a535 100644 --- a/src/engine/platform/ym2610b.h +++ b/src/engine/platform/ym2610b.h @@ -33,6 +33,10 @@ class DivPlatformYM2610B: public DivPlatformYM2610Base { }; friend void putDispatchChip(void*,int); + + void acquire_combo(short* bufL, short* bufR, size_t start, size_t len); + void acquire_ymfm(short* bufL, short* bufR, size_t start, size_t len); + public: void acquire(short* bufL, short* bufR, size_t start, size_t len); int dispatch(DivCommand c); diff --git a/src/engine/platform/ym2610shared.h b/src/engine/platform/ym2610shared.h index 79dde4ab..9671c157 100644 --- a/src/engine/platform/ym2610shared.h +++ b/src/engine/platform/ym2610shared.h @@ -50,6 +50,7 @@ class DivPlatformYM2610Base: public DivPlatformOPN { DivDispatchOscBuffer* oscBuf[16]; bool isMuted[16]; + ym3438_t fm_nuked; ymfm::ym2610b* fm; ymfm::ym2610b::output_data fmout; DivPlatformAY8910* ay; @@ -95,6 +96,9 @@ class DivPlatformYM2610Base: public DivPlatformOPN { writeADPCMAOn=0; globalADPCMAVolume=0x3f; + OPN2_Reset(&fm_nuked); + OPN2_SetChipType(&fm_nuked,ym3438_mode_opn); + ay->reset(); ay->getRegisterWrites().clear(); ay->flushWrites(); @@ -217,7 +221,7 @@ class DivPlatformYM2610Base: public DivPlatformOPN { } CHECK_CUSTOM_CLOCK; noExtMacros=flags.getBool("noExtMacros",false); - rate=chipClock/16; + rate=fm->sample_rate(chipClock); for (int i=0; i<16; i++) { oscBuf[i]->rate=rate; } @@ -240,7 +244,7 @@ class DivPlatformYM2610Base: public DivPlatformOPN { iface.adpcmBMem=adpcmBMem; iface.sampleBank=0; fm=new ymfm::ym2610b(iface); - fm->set_fidelity(ymfm::OPN_FIDELITY_MAX); + fm->set_fidelity(ymfm::OPN_FIDELITY_MED); setFlags(flags); // YM2149, 2MHz ay=new DivPlatformAY8910(true,chipClock,32); diff --git a/src/gui/gui.h b/src/gui/gui.h index cd2c3247..88c30651 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -1179,6 +1179,7 @@ class FurnaceGUI { int fdsCore; int c64Core; int pokeyCore; + int opnCore; int pcSpeakerOutMethod; String yrw801Path; String tg100Path; @@ -1312,6 +1313,7 @@ class FurnaceGUI { fdsCore(0), c64Core(1), pokeyCore(1), + opnCore(1), pcSpeakerOutMethod(0), yrw801Path(""), tg100Path(""), diff --git a/src/gui/settings.cpp b/src/gui/settings.cpp index 41e87d19..2abcc67e 100644 --- a/src/gui/settings.cpp +++ b/src/gui/settings.cpp @@ -107,6 +107,11 @@ const char* pokeyCores[]={ "ASAP (C++ port)" }; +const char* opnCores[]={ + "ymfm only", + "Nuked-OPN2 (FM) + ymfm (SSG/ADPCM)" +}; + const char* pcspkrOutMethods[]={ "evdev SND_TONE", "KIOCSOUND on /dev/tty1", @@ -1078,6 +1083,10 @@ void FurnaceGUI::drawSettings() { ImGui::SameLine(); ImGui::Combo("##POKEYCore",&settings.pokeyCore,pokeyCores,2); + ImGui::Text("OPN/OPNA/OPNB cores"); + ImGui::SameLine(); + ImGui::Combo("##OPNCore",&settings.opnCore,opnCores,2); + ImGui::Separator(); ImGui::Text("PC Speaker strategy"); @@ -2346,6 +2355,7 @@ void FurnaceGUI::syncSettings() { settings.fdsCore=e->getConfInt("fdsCore",0); settings.c64Core=e->getConfInt("c64Core",1); settings.pokeyCore=e->getConfInt("pokeyCore",1); + settings.opnCore=e->getConfInt("opnCore",1); settings.pcSpeakerOutMethod=e->getConfInt("pcSpeakerOutMethod",0); settings.yrw801Path=e->getConfString("yrw801Path",""); settings.tg100Path=e->getConfString("tg100Path",""); @@ -2472,6 +2482,7 @@ void FurnaceGUI::syncSettings() { clampSetting(settings.fdsCore,0,1); clampSetting(settings.c64Core,0,1); clampSetting(settings.pokeyCore,0,1); + clampSetting(settings.opnCore,0,1); clampSetting(settings.pcSpeakerOutMethod,0,4); clampSetting(settings.mainFont,0,6); clampSetting(settings.patFont,0,6); @@ -2616,7 +2627,8 @@ void FurnaceGUI::commitSettings() { settings.nesCore!=e->getConfInt("nesCore",0) || settings.fdsCore!=e->getConfInt("fdsCore",0) || settings.c64Core!=e->getConfInt("c64Core",1) || - settings.pokeyCore!=e->getConfInt("pokeyCore",1) + settings.pokeyCore!=e->getConfInt("pokeyCore",1) || + settings.opnCore!=e->getConfInt("opnCore",1) ); e->setConf("mainFontSize",settings.mainFontSize); @@ -2637,6 +2649,7 @@ void FurnaceGUI::commitSettings() { e->setConf("fdsCore",settings.fdsCore); e->setConf("c64Core",settings.c64Core); e->setConf("pokeyCore",settings.pokeyCore); + e->setConf("opnCore",settings.opnCore); e->setConf("pcSpeakerOutMethod",settings.pcSpeakerOutMethod); e->setConf("yrw801Path",settings.yrw801Path); e->setConf("tg100Path",settings.tg100Path); From a27dc331a596f455d8ec175da198f2619171d697 Mon Sep 17 00:00:00 2001 From: brickblock369 <59150779+brickblock369@users.noreply.github.com> Date: Sat, 24 Dec 2022 12:17:01 -0800 Subject: [PATCH 05/25] Add one instrument to the repo --- instruments/FM/synth/Kirby SNES Synth Pad.fui | Bin 0 -> 73 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 instruments/FM/synth/Kirby SNES Synth Pad.fui diff --git a/instruments/FM/synth/Kirby SNES Synth Pad.fui b/instruments/FM/synth/Kirby SNES Synth Pad.fui new file mode 100644 index 0000000000000000000000000000000000000000..f3726834123b20d14846fcb3853c9260691ff505 GIT binary patch literal 73 zcmZ?s^b2lcU}W%f6lL(vEJ~_W2=;RgRtT=lE6Gp@NK9dH^HpK^qQJnAYc9{=@R@-j ZSOG|HWMJSl1JYj@7(y82gdAiT7yz*!5Yqqv literal 0 HcmV?d00001 From 5842aa433bfc66bc09e631aabaa397e8b4e3982f Mon Sep 17 00:00:00 2001 From: brickblock369 <59150779+brickblock369@users.noreply.github.com> Date: Sat, 24 Dec 2022 12:17:38 -0800 Subject: [PATCH 06/25] Add one demo song --- .../multichip/Fight Against the Dark Matter.fur | Bin 0 -> 17721 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 demos/multichip/Fight Against the Dark Matter.fur diff --git a/demos/multichip/Fight Against the Dark Matter.fur b/demos/multichip/Fight Against the Dark Matter.fur new file mode 100644 index 0000000000000000000000000000000000000000..156c696d02192b74efc5ec55573706fbb90c6b65 GIT binary patch literal 17721 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 Date: Sat, 24 Dec 2022 16:59:04 -0500 Subject: [PATCH 07/25] GUI: implement time in sample editor --- src/gui/sampleEdit.cpp | 53 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/src/gui/sampleEdit.cpp b/src/gui/sampleEdit.cpp index 43fdac72..a8631b2a 100644 --- a/src/gui/sampleEdit.cpp +++ b/src/gui/sampleEdit.cpp @@ -30,6 +30,16 @@ #include "sampleUtil.h" #include "util.h" +const double timeDivisors[10]={ + 1000.0, 500.0, 200.0, 100.0, 50.0, 20.0, 10.0, 5.0, 2.0, 1.0 +}; + +const double timeMultipliers[13]={ + 1.0, 2.0, 5.0, 10.0, 20.0, 30.0, + 60.0, 2*60.0, 5*60.0, 10*60.0, 20*60.0, 30*60.0, + 3600.0 +}; + #define CENTER_TEXT(text) \ ImGui::SetCursorPosX(ImGui::GetCursorPosX()+0.5*(ImGui::GetContentRegionAvail().x-ImGui::CalcTextSize(text).x)); @@ -999,7 +1009,48 @@ void FurnaceGUI::drawSampleEdit() { ImGui::ItemSize(size,style.FramePadding.y); if (ImGui::ItemAdd(rect,ImGui::GetID("SETime"))) { - dl->AddText(minArea,0xffffffff,"0"); + int targetRate=sampleCompatRate?sample->rate:sample->centerRate; + int curDivisorSel=0; + int curMultiplierSel=0; + double divisor=1000.0; + double multiplier=1.0; + while ((((double)targetRate/divisor)/sampleZoom)<60.0*dpiScale) { + if (curDivisorSel>=10) break; + divisor=timeDivisors[++curDivisorSel]; + } + if (curDivisorSel>=10) { + while ((((double)targetRate*multiplier)/sampleZoom)<60.0*dpiScale) { + if (curMultiplierSel>=13) { + multiplier+=3600.0; + } else { + multiplier=timeMultipliers[++curMultiplierSel]; + } + } + } + double timeStep=multiplier*((double)targetRate/divisor); + double timeMin=-fmod(samplePos,timeStep); + double timeMax=size.x*sampleZoom; + ImU32 color=ImGui::GetColorU32(uiColors[GUI_COLOR_SAMPLE_TIME_FG]); + + dl->AddRectFilled(minArea,maxArea,ImGui::GetColorU32(uiColors[GUI_COLOR_SAMPLE_TIME_BG])); + + for (double i=timeMin; i=9) { + if (timeMs>=3600000) { + t=fmt::sprintf("%d:%02d:%02d",timeMs/3600000,(timeMs/60000)%60,(timeMs/1000)%60); + } else if (timeMs>=60000) { + t=fmt::sprintf("%d:%02d.%02d",timeMs/60000,(timeMs/1000)%60,(timeMs%1000)/10); + } else { + t=fmt::sprintf("%d.%03d",timeMs/1000,timeMs%1000); + } + } else { + t=fmt::sprintf("%dms",timeMs); + } + dl->AddText(pos,color,t.c_str()); + } } ImVec2 avail=ImGui::GetContentRegionAvail(); // sample view size determined here From 0914359063e3c72d63cf00a282f1e532bbffde54 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sat, 24 Dec 2022 18:03:57 -0500 Subject: [PATCH 08/25] dev131 - SNES: add more sustain modes and D2 --- papers/format.md | 1 + papers/newIns.md | 9 +++- src/engine/engine.h | 4 +- src/engine/instrument.cpp | 81 ++++++++++++++++++++---------------- src/engine/instrument.h | 46 +++++++++++--------- src/engine/platform/snes.cpp | 21 ++++++++-- src/gui/insEdit.cpp | 30 +++++++++++-- 7 files changed, 125 insertions(+), 67 deletions(-) diff --git a/papers/format.md b/papers/format.md index 72122e0a..a2c962fb 100644 --- a/papers/format.md +++ b/papers/format.md @@ -32,6 +32,7 @@ these fields are 0 in format versions prior to 100 (0.6pre1). the format versions are: +- 131: Furnace dev131 - 130: Furnace dev130 - 129: Furnace dev129 - 128: Furnace dev128 diff --git a/papers/newIns.md b/papers/newIns.md index 548edbde..31dff219 100644 --- a/papers/newIns.md +++ b/papers/newIns.md @@ -440,7 +440,7 @@ size | description | - bit 0-4: release 1 | flags | - bit 4: envelope on - | - bit 3: make sustain effective + | - bit 3: make sustain effective (<131) | - bit 0-2: gain mode | - 0: direct | - 4: dec @@ -448,6 +448,13 @@ size | description | - 6: inc | - 7: bent 1 | gain + 1 | decay 2/sustain mode (>=131) + | - bit 5-6: sustain mode + | - 0: direct + | - 1: sustain (release with dec) + | - 2: sustain (release with exp) + | - 3: sustain (release with rel) + | - bit 0-4: decay 2 ``` # Namco 163 data (N1) diff --git a/src/engine/engine.h b/src/engine/engine.h index f57bd8d0..109a9abd 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -47,8 +47,8 @@ #define BUSY_BEGIN_SOFT softLocked=true; isBusy.lock(); #define BUSY_END isBusy.unlock(); softLocked=false; -#define DIV_VERSION "dev130" -#define DIV_ENGINE_VERSION 130 +#define DIV_VERSION "dev131" +#define DIV_ENGINE_VERSION 131 // for imports #define DIV_VERSION_MOD 0xff01 #define DIV_VERSION_FC 0xff02 diff --git a/src/engine/instrument.cpp b/src/engine/instrument.cpp index 384e0b78..d30e1fb9 100644 --- a/src/engine/instrument.cpp +++ b/src/engine/instrument.cpp @@ -506,6 +506,8 @@ void DivInstrument::writeFeatureSN(SafeWriter* w) { w->writeC(snes.gain); + w->writeC(((snes.sus&3)<<5)|(snes.d2&31)); + FEATURE_END; } @@ -1809,7 +1811,7 @@ void DivInstrument::putInsData(SafeWriter* w) { #define READ_FEAT_END \ if (reader.tell()=131) { + next=reader.readC(); + snes.sus=(next>>5)&3; + snes.d2=next&31; + } READ_FEAT_END; } -void DivInstrument::readFeatureN1(SafeReader& reader) { +void DivInstrument::readFeatureN1(SafeReader& reader, short version) { READ_FEAT_BEGIN; n163.wave=reader.readI(); @@ -2260,7 +2267,7 @@ void DivInstrument::readFeatureN1(SafeReader& reader) { READ_FEAT_END; } -void DivInstrument::readFeatureFD(SafeReader& reader) { +void DivInstrument::readFeatureFD(SafeReader& reader, short version) { READ_FEAT_BEGIN; fds.modSpeed=reader.readI(); @@ -2271,7 +2278,7 @@ void DivInstrument::readFeatureFD(SafeReader& reader) { READ_FEAT_END; } -void DivInstrument::readFeatureWS(SafeReader& reader) { +void DivInstrument::readFeatureWS(SafeReader& reader, short version) { READ_FEAT_BEGIN; ws.wave1=reader.readI(); @@ -2406,7 +2413,7 @@ void DivInstrument::readFeatureWL(SafeReader& reader, DivSong* song, short versi READ_FEAT_END; } -void DivInstrument::readFeatureMP(SafeReader& reader) { +void DivInstrument::readFeatureMP(SafeReader& reader, short version) { READ_FEAT_BEGIN; multipcm.ar=reader.readC(); @@ -2422,7 +2429,7 @@ void DivInstrument::readFeatureMP(SafeReader& reader) { READ_FEAT_END; } -void DivInstrument::readFeatureSU(SafeReader& reader) { +void DivInstrument::readFeatureSU(SafeReader& reader, short version) { READ_FEAT_BEGIN; su.switchRoles=reader.readC(); @@ -2430,7 +2437,7 @@ void DivInstrument::readFeatureSU(SafeReader& reader) { READ_FEAT_END; } -void DivInstrument::readFeatureES(SafeReader& reader) { +void DivInstrument::readFeatureES(SafeReader& reader, short version) { READ_FEAT_BEGIN; es5506.filter.mode=(DivInstrumentES5506::Filter::FilterMode)reader.readC(); @@ -2447,7 +2454,7 @@ void DivInstrument::readFeatureES(SafeReader& reader) { READ_FEAT_END; } -void DivInstrument::readFeatureX1(SafeReader& reader) { +void DivInstrument::readFeatureX1(SafeReader& reader, short version) { READ_FEAT_BEGIN; x1_010.bankSlot=reader.readI(); @@ -2479,47 +2486,47 @@ DivDataErrors DivInstrument::readInsDataNew(SafeReader& reader, short version, b if (memcmp(featCode,"EN",2)==0) { // end of instrument break; } else if (memcmp(featCode,"NA",2)==0) { // name - readFeatureNA(reader); + readFeatureNA(reader,version); } else if (memcmp(featCode,"FM",2)==0) { // FM - readFeatureFM(reader); + readFeatureFM(reader,version); } else if (memcmp(featCode,"MA",2)==0) { // macros - readFeatureMA(reader); + readFeatureMA(reader,version); } else if (memcmp(featCode,"64",2)==0) { // C64 - readFeature64(reader); + readFeature64(reader,version); } else if (memcmp(featCode,"GB",2)==0) { // Game Boy - readFeatureGB(reader); + readFeatureGB(reader,version); } else if (memcmp(featCode,"SM",2)==0) { // sample - readFeatureSM(reader); + readFeatureSM(reader,version); } else if (memcmp(featCode,"O1",2)==0) { // op1 macros - readFeatureOx(reader,0); + readFeatureOx(reader,0,version); } else if (memcmp(featCode,"O2",2)==0) { // op2 macros - readFeatureOx(reader,1); + readFeatureOx(reader,1,version); } else if (memcmp(featCode,"O3",2)==0) { // op3 macros - readFeatureOx(reader,2); + readFeatureOx(reader,2,version); } else if (memcmp(featCode,"O4",2)==0) { // op4 macros - readFeatureOx(reader,3); + readFeatureOx(reader,3,version); } else if (memcmp(featCode,"LD",2)==0) { // OPL drums - readFeatureLD(reader); + readFeatureLD(reader,version); } else if (memcmp(featCode,"SN",2)==0) { // SNES - readFeatureSN(reader); + readFeatureSN(reader,version); } else if (memcmp(featCode,"N1",2)==0) { // Namco 163 - readFeatureN1(reader); + readFeatureN1(reader,version); } else if (memcmp(featCode,"FD",2)==0) { // FDS/VB - readFeatureFD(reader); + readFeatureFD(reader,version); } else if (memcmp(featCode,"WS",2)==0) { // WaveSynth - readFeatureWS(reader); + readFeatureWS(reader,version); } else if (memcmp(featCode,"SL",2)==0 && fui && song!=NULL) { // sample list readFeatureSL(reader,song,version); } else if (memcmp(featCode,"WL",2)==0 && fui && song!=NULL) { // wave list readFeatureWL(reader,song,version); } else if (memcmp(featCode,"MP",2)==0) { // MultiPCM - readFeatureMP(reader); + readFeatureMP(reader,version); } else if (memcmp(featCode,"SU",2)==0) { // Sound Unit - readFeatureSU(reader); + readFeatureSU(reader,version); } else if (memcmp(featCode,"ES",2)==0) { // ES5506 - readFeatureES(reader); + readFeatureES(reader,version); } else if (memcmp(featCode,"X1",2)==0) { // X1-010 - readFeatureX1(reader); + readFeatureX1(reader,version); } else { if (song==NULL && (memcmp(featCode,"SL",2)==0 || (memcmp(featCode,"WL",2)==0))) { // nothing @@ -3134,7 +3141,7 @@ DivDataErrors DivInstrument::readInsDataOld(SafeReader &reader, short version) { snes.a=reader.readC(); snes.d=reader.readC(); snes.s=reader.readC(); - snes.sus=snes.s&8; + snes.sus=(snes.s&8)?1:0; snes.s&=7; snes.r=reader.readC(); } diff --git a/src/engine/instrument.h b/src/engine/instrument.h index 65a81f8b..23c35397 100644 --- a/src/engine/instrument.h +++ b/src/engine/instrument.h @@ -604,10 +604,15 @@ struct DivInstrumentSNES { GAIN_MODE_INC_LINEAR=6, GAIN_MODE_INC_INVLOG=7 }; - bool useEnv, sus; + bool useEnv; + // 0: no sustain (key off = cut) + // 1: sustain (R = d2; key off = dec linear to r) + // 2: sustain (R = d2; key off = dec exponential to r) + // 3: sustain (R = d2; key off = R to r) + unsigned char sus; GainMode gainMode; unsigned char gain; - unsigned char a, d, s, r; + unsigned char a, d, s, r, d2; bool operator==(const DivInstrumentSNES& other); bool operator!=(const DivInstrumentSNES& other) { @@ -616,13 +621,14 @@ struct DivInstrumentSNES { DivInstrumentSNES(): useEnv(true), - sus(false), + sus(0), gainMode(GAIN_MODE_DIRECT), gain(127), a(15), d(7), s(7), - r(0) {} + r(0), + d2(0) {} }; struct DivInstrument { @@ -665,24 +671,24 @@ struct DivInstrument { void writeFeatureES(SafeWriter* w); void writeFeatureX1(SafeWriter* w); - void readFeatureNA(SafeReader& reader); - void readFeatureFM(SafeReader& reader); - void readFeatureMA(SafeReader& reader); - void readFeature64(SafeReader& reader); - void readFeatureGB(SafeReader& reader); - void readFeatureSM(SafeReader& reader); - void readFeatureOx(SafeReader& reader, int op); - void readFeatureLD(SafeReader& reader); - void readFeatureSN(SafeReader& reader); - void readFeatureN1(SafeReader& reader); - void readFeatureFD(SafeReader& reader); - void readFeatureWS(SafeReader& reader); + void readFeatureNA(SafeReader& reader, short version); + void readFeatureFM(SafeReader& reader, short version); + void readFeatureMA(SafeReader& reader, short version); + void readFeature64(SafeReader& reader, short version); + void readFeatureGB(SafeReader& reader, short version); + void readFeatureSM(SafeReader& reader, short version); + void readFeatureOx(SafeReader& reader, int op, short version); + void readFeatureLD(SafeReader& reader, short version); + void readFeatureSN(SafeReader& reader, short version); + void readFeatureN1(SafeReader& reader, short version); + void readFeatureFD(SafeReader& reader, short version); + void readFeatureWS(SafeReader& reader, short version); void readFeatureSL(SafeReader& reader, DivSong* song, short version); void readFeatureWL(SafeReader& reader, DivSong* song, short version); - void readFeatureMP(SafeReader& reader); - void readFeatureSU(SafeReader& reader); - void readFeatureES(SafeReader& reader); - void readFeatureX1(SafeReader& reader); + void readFeatureMP(SafeReader& reader, short version); + void readFeatureSU(SafeReader& reader, short version); + void readFeatureES(SafeReader& reader, short version); + void readFeatureX1(SafeReader& reader, short version); DivDataErrors readInsDataOld(SafeReader& reader, short version); DivDataErrors readInsDataNew(SafeReader& reader, short version, bool fui, DivSong* song); diff --git a/src/engine/platform/snes.cpp b/src/engine/platform/snes.cpp index 20b9a52b..8752c08b 100644 --- a/src/engine/platform/snes.cpp +++ b/src/engine/platform/snes.cpp @@ -607,10 +607,23 @@ void DivPlatformSNES::writeEnv(int ch) { if (chan[ch].state.sus) { if (chan[ch].active) { chWrite(ch,5,chan[ch].state.a|(chan[ch].state.d<<4)|0x80); - chWrite(ch,6,chan[ch].state.s<<5); - } else { // dec linear - chWrite(ch,7,0x80|chan[ch].state.r); - chWrite(ch,5,0); + chWrite(ch,6,(chan[ch].state.s<<5)|(chan[ch].state.d2&31)); + } else { + switch (chan[ch].state.sus) { + case 1: // dec linear + chWrite(ch,7,0x80|chan[ch].state.r); + chWrite(ch,5,0); + break; + case 2: // dec exp + chWrite(ch,7,0xa0|chan[ch].state.r); + chWrite(ch,5,0); + break; + case 3: // update r + chWrite(ch,6,(chan[ch].state.s<<5)|(chan[ch].state.r&31)); + break; + default: // what? + break; + } } } else { chWrite(ch,5,chan[ch].state.a|(chan[ch].state.d<<4)|0x80); diff --git a/src/gui/insEdit.cpp b/src/gui/insEdit.cpp index b5e1cf71..6aae392d 100644 --- a/src/gui/insEdit.cpp +++ b/src/gui/insEdit.cpp @@ -4601,10 +4601,13 @@ void FurnaceGUI::drawInsEdit() { P(ImGui::Checkbox("Use envelope",&ins->snes.useEnv)); ImVec2 sliderSize=ImVec2(20.0f*dpiScale,128.0*dpiScale); if (ins->snes.useEnv) { - if (ImGui::BeginTable("SNESEnvParams",5,ImGuiTableFlags_NoHostExtendX)) { + if (ImGui::BeginTable("SNESEnvParams",ins->snes.sus?6:5,ImGuiTableFlags_NoHostExtendX)) { ImGui::TableSetupColumn("c0",ImGuiTableColumnFlags_WidthFixed,sliderSize.x); ImGui::TableSetupColumn("c1",ImGuiTableColumnFlags_WidthFixed,sliderSize.x); ImGui::TableSetupColumn("c2",ImGuiTableColumnFlags_WidthFixed,sliderSize.x); + if (ins->snes.sus) { + ImGui::TableSetupColumn("c2x",ImGuiTableColumnFlags_WidthFixed,sliderSize.x); + } ImGui::TableSetupColumn("c3",ImGuiTableColumnFlags_WidthFixed,sliderSize.x); ImGui::TableSetupColumn("c4",ImGuiTableColumnFlags_WidthStretch); @@ -4618,6 +4621,11 @@ void FurnaceGUI::drawInsEdit() { ImGui::TableNextColumn(); CENTER_TEXT("S"); ImGui::TextUnformatted("S"); + if (ins->snes.sus) { + ImGui::TableNextColumn(); + CENTER_TEXT("D2"); + ImGui::TextUnformatted("D2"); + } ImGui::TableNextColumn(); CENTER_TEXT("R"); ImGui::TextUnformatted("R"); @@ -4632,14 +4640,30 @@ void FurnaceGUI::drawInsEdit() { P(CWVSliderScalar("##Decay",sliderSize,ImGuiDataType_U8,&ins->snes.d,&_ZERO,&_SEVEN)); ImGui::TableNextColumn(); P(CWVSliderScalar("##Sustain",sliderSize,ImGuiDataType_U8,&ins->snes.s,&_ZERO,&_SEVEN)); + if (ins->snes.sus) { + ImGui::TableNextColumn(); + P(CWVSliderScalar("##Decay2",sliderSize,ImGuiDataType_U8,&ins->snes.d2,&_ZERO,&_THIRTY_ONE)); + } ImGui::TableNextColumn(); P(CWVSliderScalar("##Release",sliderSize,ImGuiDataType_U8,&ins->snes.r,&_ZERO,&_THIRTY_ONE)); ImGui::TableNextColumn(); - drawFMEnv(0,ins->snes.a+1,1+ins->snes.d*2,ins->snes.r,ins->snes.r,(14-ins->snes.s*2),(ins->snes.r==0 || ins->snes.sus),0,0,7,16,31,ImVec2(ImGui::GetContentRegionAvail().x,sliderSize.y),ins->type); + drawFMEnv(0,ins->snes.a+1,1+ins->snes.d*2,ins->snes.sus?ins->snes.d2:ins->snes.r,ins->snes.sus?ins->snes.r:31,(14-ins->snes.s*2),(ins->snes.r==0 || (ins->snes.sus && ins->snes.d2==0)),0,0,7,16,31,ImVec2(ImGui::GetContentRegionAvail().x,sliderSize.y),ins->type); ImGui::EndTable(); } - ImGui::Checkbox("Make sustain effective",&ins->snes.sus); + ImGui::Text("Sustain/release mode:"); + if (ImGui::RadioButton("Direct (cut on release)",ins->snes.sus==0)) { + ins->snes.sus=0; + } + if (ImGui::RadioButton("Effective (linear decrease)",ins->snes.sus==1)) { + ins->snes.sus=1; + } + if (ImGui::RadioButton("Effective (exponential decrease)",ins->snes.sus==2)) { + ins->snes.sus=2; + } + if (ImGui::RadioButton("Delayed (write R on release)",ins->snes.sus==3)) { + ins->snes.sus=3; + } } else { if (ImGui::BeginTable("SNESGainParams",3,ImGuiTableFlags_NoHostExtendX)) { ImGui::TableSetupColumn("c0",ImGuiTableColumnFlags_WidthFixed); From 1ac19ed61f824ea8454193601c6482f2ae153102 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sat, 24 Dec 2022 18:06:31 -0500 Subject: [PATCH 09/25] new demo songs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit by SuperJet Spade and FΛDE --- demos/misc/Optimistic_SharpX68k.fur | Bin 0 -> 227969 bytes demos/misc/sparkling_aria_pokemini.fur | Bin 0 -> 1829 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 demos/misc/Optimistic_SharpX68k.fur create mode 100644 demos/misc/sparkling_aria_pokemini.fur diff --git a/demos/misc/Optimistic_SharpX68k.fur b/demos/misc/Optimistic_SharpX68k.fur new file mode 100644 index 0000000000000000000000000000000000000000..c49e71a8fcbb65779fddff108bcd37b3f1bb51bc GIT binary patch literal 227969 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

@bQq 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 Date: Sat, 24 Dec 2022 18:29:01 -0500 Subject: [PATCH 10/25] OPLL: fix possible overflow --- src/engine/platform/opll.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/engine/platform/opll.cpp b/src/engine/platform/opll.cpp index d902e242..0136123e 100644 --- a/src/engine/platform/opll.cpp +++ b/src/engine/platform/opll.cpp @@ -248,6 +248,7 @@ void DivPlatformOPLL::tick(bool sysTick) { if (chan[i].freq<0) chan[i].freq=0; if (chan[i].freq>65535) chan[i].freq=65535; int freqt=toFreq(chan[i].freq); + if (freqt>2047) freqt=2047; chan[i].freqL=freqt&0xff; if (i>=6 && properDrums && (i<9 || !noTopHatFreq)) { immWrite(0x10+drumSlot[i],freqt&0xff); @@ -257,7 +258,7 @@ void DivPlatformOPLL::tick(bool sysTick) { immWrite(0x10+i,freqt&0xff); } } - chan[i].freqH=freqt>>8; + chan[i].freqH=(freqt>>8)&15; } if (chan[i].keyOn && i>=6 && properDrums) { if (!isMuted[i]) { From 18fed05948159a18cb35641ca08cdd09ce917533 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sat, 24 Dec 2022 18:34:27 -0500 Subject: [PATCH 11/25] Revert "update Android project template" This reverts commit 0b66595c0fdffd0156ef9131d49c5ec09e0c6f3e. --- .../java/org/libsdl/app/HIDDeviceManager.java | 4 - .../main/java/org/libsdl/app/SDLActivity.java | 161 ++---------------- .../org/libsdl/app/SDLControllerManager.java | 36 ++-- 3 files changed, 31 insertions(+), 170 deletions(-) diff --git a/android/app/src/main/java/org/libsdl/app/HIDDeviceManager.java b/android/app/src/main/java/org/libsdl/app/HIDDeviceManager.java index cf3c9267..802c7254 100644 --- a/android/app/src/main/java/org/libsdl/app/HIDDeviceManager.java +++ b/android/app/src/main/java/org/libsdl/app/HIDDeviceManager.java @@ -248,9 +248,7 @@ public class HIDDeviceManager { 0x1689, // Razer Onza 0x1949, // Lab126, Inc. 0x1bad, // Harmonix - 0x20d6, // PowerA 0x24c6, // PowerA - 0x2c22, // Qanba }; if (usbInterface.getInterfaceClass() == UsbConstants.USB_CLASS_VENDOR_SPEC && @@ -276,9 +274,7 @@ public class HIDDeviceManager { 0x0e6f, // PDP 0x0f0d, // Hori 0x1532, // Razer Wildcat - 0x20d6, // PowerA 0x24c6, // PowerA - 0x2dc8, /* 8BitDo */ 0x2e24, // Hyperkin }; diff --git a/android/app/src/main/java/org/libsdl/app/SDLActivity.java b/android/app/src/main/java/org/libsdl/app/SDLActivity.java index 55b961a4..3da07209 100644 --- a/android/app/src/main/java/org/libsdl/app/SDLActivity.java +++ b/android/app/src/main/java/org/libsdl/app/SDLActivity.java @@ -27,9 +27,7 @@ import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Message; -import android.text.Editable; import android.text.InputType; -import android.text.Selection; import android.util.DisplayMetrics; import android.util.Log; import android.util.SparseArray; @@ -65,112 +63,6 @@ import java.util.Locale; */ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityChangeListener { private static final String TAG = "SDL"; -/* - // Display InputType.SOURCE/CLASS of events and devices - // - // SDLActivity.debugSource(device.getSources(), "device[" + device.getName() + "]"); - // SDLActivity.debugSource(event.getSource(), "event"); - public static void debugSource(int sources, String prefix) { - int s = sources; - int s_copy = sources; - String cls = ""; - String src = ""; - int tst = 0; - int FLAG_TAINTED = 0x80000000; - - if ((s & InputDevice.SOURCE_CLASS_BUTTON) != 0) cls += " BUTTON"; - if ((s & InputDevice.SOURCE_CLASS_JOYSTICK) != 0) cls += " JOYSTICK"; - if ((s & InputDevice.SOURCE_CLASS_POINTER) != 0) cls += " POINTER"; - if ((s & InputDevice.SOURCE_CLASS_POSITION) != 0) cls += " POSITION"; - if ((s & InputDevice.SOURCE_CLASS_TRACKBALL) != 0) cls += " TRACKBALL"; - - - int s2 = s_copy & ~InputDevice.SOURCE_ANY; // keep class bits - s2 &= ~( InputDevice.SOURCE_CLASS_BUTTON - | InputDevice.SOURCE_CLASS_JOYSTICK - | InputDevice.SOURCE_CLASS_POINTER - | InputDevice.SOURCE_CLASS_POSITION - | InputDevice.SOURCE_CLASS_TRACKBALL); - - if (s2 != 0) cls += "Some_Unkown"; - - s2 = s_copy & InputDevice.SOURCE_ANY; // keep source only, no class; - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - tst = InputDevice.SOURCE_BLUETOOTH_STYLUS; - if ((s & tst) == tst) src += " BLUETOOTH_STYLUS"; - s2 &= ~tst; - } - - tst = InputDevice.SOURCE_DPAD; - if ((s & tst) == tst) src += " DPAD"; - s2 &= ~tst; - - tst = InputDevice.SOURCE_GAMEPAD; - if ((s & tst) == tst) src += " GAMEPAD"; - s2 &= ~tst; - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - tst = InputDevice.SOURCE_HDMI; - if ((s & tst) == tst) src += " HDMI"; - s2 &= ~tst; - } - - tst = InputDevice.SOURCE_JOYSTICK; - if ((s & tst) == tst) src += " JOYSTICK"; - s2 &= ~tst; - - tst = InputDevice.SOURCE_KEYBOARD; - if ((s & tst) == tst) src += " KEYBOARD"; - s2 &= ~tst; - - tst = InputDevice.SOURCE_MOUSE; - if ((s & tst) == tst) src += " MOUSE"; - s2 &= ~tst; - - if (Build.VERSION.SDK_INT >= 26) { - tst = InputDevice.SOURCE_MOUSE_RELATIVE; - if ((s & tst) == tst) src += " MOUSE_RELATIVE"; - s2 &= ~tst; - - tst = InputDevice.SOURCE_ROTARY_ENCODER; - if ((s & tst) == tst) src += " ROTARY_ENCODER"; - s2 &= ~tst; - } - tst = InputDevice.SOURCE_STYLUS; - if ((s & tst) == tst) src += " STYLUS"; - s2 &= ~tst; - - tst = InputDevice.SOURCE_TOUCHPAD; - if ((s & tst) == tst) src += " TOUCHPAD"; - s2 &= ~tst; - - tst = InputDevice.SOURCE_TOUCHSCREEN; - if ((s & tst) == tst) src += " TOUCHSCREEN"; - s2 &= ~tst; - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { - tst = InputDevice.SOURCE_TOUCH_NAVIGATION; - if ((s & tst) == tst) src += " TOUCH_NAVIGATION"; - s2 &= ~tst; - } - - tst = InputDevice.SOURCE_TRACKBALL; - if ((s & tst) == tst) src += " TRACKBALL"; - s2 &= ~tst; - - tst = InputDevice.SOURCE_ANY; - if ((s & tst) == tst) src += " ANY"; - s2 &= ~tst; - - if (s == FLAG_TAINTED) src += " FLAG_TAINTED"; - s2 &= ~FLAG_TAINTED; - - if (s2 != 0) src += " Some_Unkown"; - - Log.v(TAG, prefix + "int=" + s_copy + " CLASS={" + cls + " } source(s):" + src); - } -*/ public static boolean mIsResumedCalled, mHasFocus; public static final boolean mHasMultiWindow = (Build.VERSION.SDK_INT >= 24); @@ -1312,21 +1204,8 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh for (int id : ids) { InputDevice device = InputDevice.getDevice(id); - /* Allow SOURCE_TOUCHSCREEN and also Virtual InputDevices because they can send TOUCHSCREEN events */ - if (device != null && ((device.getSources() & InputDevice.SOURCE_TOUCHSCREEN) == InputDevice.SOURCE_TOUCHSCREEN - || device.isVirtual())) { - - int touchDevId = device.getId(); - /* - * Prevent id to be -1, since it's used in SDL internal for synthetic events - * Appears when using Android emulator, eg: - * adb shell input mouse tap 100 100 - * adb shell input touchscreen tap 100 100 - */ - if (touchDevId < 0) { - touchDevId -= 1; - } - nativeAddTouch(touchDevId, device.getName()); + if (device != null && (device.getSources() & InputDevice.SOURCE_TOUCHSCREEN) == InputDevice.SOURCE_TOUCHSCREEN) { + nativeAddTouch(device.getId(), device.getName()); } } } @@ -2016,7 +1895,7 @@ class SDLSurface extends SurfaceView implements SurfaceHolder.Callback, } } - if ((source & InputDevice.SOURCE_KEYBOARD) == InputDevice.SOURCE_KEYBOARD) { + if ((source & InputDevice.SOURCE_KEYBOARD) != 0) { if (event.getAction() == KeyEvent.ACTION_DOWN) { if (SDLActivity.isTextInputEvent(event)) { SDLInputConnection.nativeCommitText(String.valueOf((char) event.getUnicodeChar()), 1); @@ -2029,7 +1908,7 @@ class SDLSurface extends SurfaceView implements SurfaceHolder.Callback, } } - if ((source & InputDevice.SOURCE_MOUSE) == InputDevice.SOURCE_MOUSE) { + if ((source & InputDevice.SOURCE_MOUSE) != 0) { // on some devices key events are sent for mouse BUTTON_BACK/FORWARD presses // they are ignored here because sending them as mouse input to SDL is messy if ((keyCode == KeyEvent.KEYCODE_BACK) || (keyCode == KeyEvent.KEYCODE_FORWARD)) { @@ -2316,7 +2195,7 @@ class DummyEdit extends View implements View.OnKeyListener { public InputConnection onCreateInputConnection(EditorInfo outAttrs) { ic = new SDLInputConnection(this, true); - outAttrs.inputType = InputType.TYPE_CLASS_TEXT; + outAttrs.inputType = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD; outAttrs.imeOptions = EditorInfo.IME_FLAG_NO_EXTRACT_UI | EditorInfo.IME_FLAG_NO_FULLSCREEN /* API 11 */; @@ -2358,29 +2237,6 @@ class SDLInputConnection extends BaseInputConnection { @Override public boolean commitText(CharSequence text, int newCursorPosition) { - /* Generate backspaces for the text we're going to replace */ - final Editable content = getEditable(); - if (content != null) { - int a = getComposingSpanStart(content); - int b = getComposingSpanEnd(content); - if (a == -1 || b == -1) { - a = Selection.getSelectionStart(content); - b = Selection.getSelectionEnd(content); - } - if (a < 0) a = 0; - if (b < 0) b = 0; - if (b < a) { - int tmp = a; - a = b; - b = tmp; - } - int backspaces = (b - a); - - for (int i = 0; i < backspaces; i++) { - nativeGenerateScancodeForUnichar('\b'); - } - } - for (int i = 0; i < text.length(); i++) { char c = text.charAt(i); if (c == '\n') { @@ -2415,11 +2271,14 @@ class SDLInputConnection extends BaseInputConnection { // Workaround to capture backspace key. Ref: http://stackoverflow.com/questions/14560344/android-backspace-in-webview-baseinputconnection // and https://bugzilla.libsdl.org/show_bug.cgi?id=2265 if (beforeLength > 0 && afterLength == 0) { + boolean ret = true; // backspace(s) while (beforeLength-- > 0) { - nativeGenerateScancodeForUnichar('\b'); + boolean ret_key = sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL)) + && sendKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DEL)); + ret = ret && ret_key; } - return true; + return ret; } return super.deleteSurroundingText(beforeLength, afterLength); diff --git a/android/app/src/main/java/org/libsdl/app/SDLControllerManager.java b/android/app/src/main/java/org/libsdl/app/SDLControllerManager.java index 82373d9d..1fa32ef3 100644 --- a/android/app/src/main/java/org/libsdl/app/SDLControllerManager.java +++ b/android/app/src/main/java/org/libsdl/app/SDLControllerManager.java @@ -255,21 +255,23 @@ class SDLJoystickHandler_API16 extends SDLJoystickHandler { @Override public boolean handleMotionEvent(MotionEvent event) { - int actionPointerIndex = event.getActionIndex(); - int action = event.getActionMasked(); - if (action == MotionEvent.ACTION_MOVE) { - SDLJoystick joystick = getJoystick(event.getDeviceId()); - if (joystick != null) { - for (int i = 0; i < joystick.axes.size(); i++) { - InputDevice.MotionRange range = joystick.axes.get(i); - /* Normalize the value to -1...1 */ - float value = (event.getAxisValue(range.getAxis(), actionPointerIndex) - range.getMin()) / range.getRange() * 2.0f - 1.0f; - SDLControllerManager.onNativeJoy(joystick.device_id, i, value); - } - for (int i = 0; i < joystick.hats.size() / 2; i++) { - int hatX = Math.round(event.getAxisValue(joystick.hats.get(2 * i).getAxis(), actionPointerIndex)); - int hatY = Math.round(event.getAxisValue(joystick.hats.get(2 * i + 1).getAxis(), actionPointerIndex)); - SDLControllerManager.onNativeHat(joystick.device_id, i, hatX, hatY); + if ((event.getSource() & InputDevice.SOURCE_JOYSTICK) != 0) { + int actionPointerIndex = event.getActionIndex(); + int action = event.getActionMasked(); + if (action == MotionEvent.ACTION_MOVE) { + SDLJoystick joystick = getJoystick(event.getDeviceId()); + if (joystick != null) { + for (int i = 0; i < joystick.axes.size(); i++) { + InputDevice.MotionRange range = joystick.axes.get(i); + /* Normalize the value to -1...1 */ + float value = (event.getAxisValue(range.getAxis(), actionPointerIndex) - range.getMin()) / range.getRange() * 2.0f - 1.0f; + SDLControllerManager.onNativeJoy(joystick.device_id, i, value); + } + for (int i = 0; i < joystick.hats.size() / 2; i++) { + int hatX = Math.round(event.getAxisValue(joystick.hats.get(2 * i).getAxis(), actionPointerIndex)); + int hatY = Math.round(event.getAxisValue(joystick.hats.get(2 * i + 1).getAxis(), actionPointerIndex)); + SDLControllerManager.onNativeHat(joystick.device_id, i, hatX, hatY); + } } } } @@ -560,6 +562,8 @@ class SDLGenericMotionListener_API12 implements View.OnGenericMotionListener { switch ( event.getSource() ) { case InputDevice.SOURCE_JOYSTICK: + case InputDevice.SOURCE_GAMEPAD: + case InputDevice.SOURCE_DPAD: return SDLControllerManager.handleJoystickMotionEvent(event); case InputDevice.SOURCE_MOUSE: @@ -689,6 +693,8 @@ class SDLGenericMotionListener_API26 extends SDLGenericMotionListener_API24 { switch ( event.getSource() ) { case InputDevice.SOURCE_JOYSTICK: + case InputDevice.SOURCE_GAMEPAD: + case InputDevice.SOURCE_DPAD: return SDLControllerManager.handleJoystickMotionEvent(event); case InputDevice.SOURCE_MOUSE: From e78a8a6187df5346a87bdc433eab94909d4c5e2a Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sat, 24 Dec 2022 18:42:14 -0500 Subject: [PATCH 12/25] Revert "update SDL to 2.24.2" This reverts commit d53cc328780558dd29f40a5a3fda31a4b3bfa84a. --- .gitmodules | 1 + extern/SDL | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitmodules b/.gitmodules index 0dcbd0c8..9494f049 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,7 @@ [submodule "extern/SDL"] path = extern/SDL url = https://github.com/libsdl-org/SDL.git + branch = 2.0.22 [submodule "extern/libsndfile"] path = extern/libsndfile url = https://github.com/libsndfile/libsndfile.git diff --git a/extern/SDL b/extern/SDL index 55b03c74..f8e14ad2 160000 --- a/extern/SDL +++ b/extern/SDL @@ -1 +1 @@ -Subproject commit 55b03c7493a7abed33cf803d1380a40fa8af903f +Subproject commit f8e14ad25aa6f0b4bbed411583a9863c855ad9e6 From 78fc57b3e8a82e532bdae546e52bd968e1b2da45 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sat, 24 Dec 2022 18:53:42 -0500 Subject: [PATCH 13/25] Revert "Revert "update SDL to 2.24.2"" This reverts commit e78a8a6187df5346a87bdc433eab94909d4c5e2a. --- .gitmodules | 1 - extern/SDL | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.gitmodules b/.gitmodules index 9494f049..0dcbd0c8 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,7 +1,6 @@ [submodule "extern/SDL"] path = extern/SDL url = https://github.com/libsdl-org/SDL.git - branch = 2.0.22 [submodule "extern/libsndfile"] path = extern/libsndfile url = https://github.com/libsndfile/libsndfile.git diff --git a/extern/SDL b/extern/SDL index f8e14ad2..55b03c74 160000 --- a/extern/SDL +++ b/extern/SDL @@ -1 +1 @@ -Subproject commit f8e14ad25aa6f0b4bbed411583a9863c855ad9e6 +Subproject commit 55b03c7493a7abed33cf803d1380a40fa8af903f From 618865e5a5c74d5af02ee3b8bc4a390d3be4a774 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sat, 24 Dec 2022 18:53:55 -0500 Subject: [PATCH 14/25] Revert "Revert "update Android project template"" This reverts commit 18fed05948159a18cb35641ca08cdd09ce917533. --- .../java/org/libsdl/app/HIDDeviceManager.java | 4 + .../main/java/org/libsdl/app/SDLActivity.java | 161 ++++++++++++++++-- .../org/libsdl/app/SDLControllerManager.java | 36 ++-- 3 files changed, 170 insertions(+), 31 deletions(-) diff --git a/android/app/src/main/java/org/libsdl/app/HIDDeviceManager.java b/android/app/src/main/java/org/libsdl/app/HIDDeviceManager.java index 802c7254..cf3c9267 100644 --- a/android/app/src/main/java/org/libsdl/app/HIDDeviceManager.java +++ b/android/app/src/main/java/org/libsdl/app/HIDDeviceManager.java @@ -248,7 +248,9 @@ public class HIDDeviceManager { 0x1689, // Razer Onza 0x1949, // Lab126, Inc. 0x1bad, // Harmonix + 0x20d6, // PowerA 0x24c6, // PowerA + 0x2c22, // Qanba }; if (usbInterface.getInterfaceClass() == UsbConstants.USB_CLASS_VENDOR_SPEC && @@ -274,7 +276,9 @@ public class HIDDeviceManager { 0x0e6f, // PDP 0x0f0d, // Hori 0x1532, // Razer Wildcat + 0x20d6, // PowerA 0x24c6, // PowerA + 0x2dc8, /* 8BitDo */ 0x2e24, // Hyperkin }; diff --git a/android/app/src/main/java/org/libsdl/app/SDLActivity.java b/android/app/src/main/java/org/libsdl/app/SDLActivity.java index 3da07209..55b961a4 100644 --- a/android/app/src/main/java/org/libsdl/app/SDLActivity.java +++ b/android/app/src/main/java/org/libsdl/app/SDLActivity.java @@ -27,7 +27,9 @@ import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Message; +import android.text.Editable; import android.text.InputType; +import android.text.Selection; import android.util.DisplayMetrics; import android.util.Log; import android.util.SparseArray; @@ -63,6 +65,112 @@ import java.util.Locale; */ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityChangeListener { private static final String TAG = "SDL"; +/* + // Display InputType.SOURCE/CLASS of events and devices + // + // SDLActivity.debugSource(device.getSources(), "device[" + device.getName() + "]"); + // SDLActivity.debugSource(event.getSource(), "event"); + public static void debugSource(int sources, String prefix) { + int s = sources; + int s_copy = sources; + String cls = ""; + String src = ""; + int tst = 0; + int FLAG_TAINTED = 0x80000000; + + if ((s & InputDevice.SOURCE_CLASS_BUTTON) != 0) cls += " BUTTON"; + if ((s & InputDevice.SOURCE_CLASS_JOYSTICK) != 0) cls += " JOYSTICK"; + if ((s & InputDevice.SOURCE_CLASS_POINTER) != 0) cls += " POINTER"; + if ((s & InputDevice.SOURCE_CLASS_POSITION) != 0) cls += " POSITION"; + if ((s & InputDevice.SOURCE_CLASS_TRACKBALL) != 0) cls += " TRACKBALL"; + + + int s2 = s_copy & ~InputDevice.SOURCE_ANY; // keep class bits + s2 &= ~( InputDevice.SOURCE_CLASS_BUTTON + | InputDevice.SOURCE_CLASS_JOYSTICK + | InputDevice.SOURCE_CLASS_POINTER + | InputDevice.SOURCE_CLASS_POSITION + | InputDevice.SOURCE_CLASS_TRACKBALL); + + if (s2 != 0) cls += "Some_Unkown"; + + s2 = s_copy & InputDevice.SOURCE_ANY; // keep source only, no class; + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + tst = InputDevice.SOURCE_BLUETOOTH_STYLUS; + if ((s & tst) == tst) src += " BLUETOOTH_STYLUS"; + s2 &= ~tst; + } + + tst = InputDevice.SOURCE_DPAD; + if ((s & tst) == tst) src += " DPAD"; + s2 &= ~tst; + + tst = InputDevice.SOURCE_GAMEPAD; + if ((s & tst) == tst) src += " GAMEPAD"; + s2 &= ~tst; + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + tst = InputDevice.SOURCE_HDMI; + if ((s & tst) == tst) src += " HDMI"; + s2 &= ~tst; + } + + tst = InputDevice.SOURCE_JOYSTICK; + if ((s & tst) == tst) src += " JOYSTICK"; + s2 &= ~tst; + + tst = InputDevice.SOURCE_KEYBOARD; + if ((s & tst) == tst) src += " KEYBOARD"; + s2 &= ~tst; + + tst = InputDevice.SOURCE_MOUSE; + if ((s & tst) == tst) src += " MOUSE"; + s2 &= ~tst; + + if (Build.VERSION.SDK_INT >= 26) { + tst = InputDevice.SOURCE_MOUSE_RELATIVE; + if ((s & tst) == tst) src += " MOUSE_RELATIVE"; + s2 &= ~tst; + + tst = InputDevice.SOURCE_ROTARY_ENCODER; + if ((s & tst) == tst) src += " ROTARY_ENCODER"; + s2 &= ~tst; + } + tst = InputDevice.SOURCE_STYLUS; + if ((s & tst) == tst) src += " STYLUS"; + s2 &= ~tst; + + tst = InputDevice.SOURCE_TOUCHPAD; + if ((s & tst) == tst) src += " TOUCHPAD"; + s2 &= ~tst; + + tst = InputDevice.SOURCE_TOUCHSCREEN; + if ((s & tst) == tst) src += " TOUCHSCREEN"; + s2 &= ~tst; + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { + tst = InputDevice.SOURCE_TOUCH_NAVIGATION; + if ((s & tst) == tst) src += " TOUCH_NAVIGATION"; + s2 &= ~tst; + } + + tst = InputDevice.SOURCE_TRACKBALL; + if ((s & tst) == tst) src += " TRACKBALL"; + s2 &= ~tst; + + tst = InputDevice.SOURCE_ANY; + if ((s & tst) == tst) src += " ANY"; + s2 &= ~tst; + + if (s == FLAG_TAINTED) src += " FLAG_TAINTED"; + s2 &= ~FLAG_TAINTED; + + if (s2 != 0) src += " Some_Unkown"; + + Log.v(TAG, prefix + "int=" + s_copy + " CLASS={" + cls + " } source(s):" + src); + } +*/ public static boolean mIsResumedCalled, mHasFocus; public static final boolean mHasMultiWindow = (Build.VERSION.SDK_INT >= 24); @@ -1204,8 +1312,21 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh for (int id : ids) { InputDevice device = InputDevice.getDevice(id); - if (device != null && (device.getSources() & InputDevice.SOURCE_TOUCHSCREEN) == InputDevice.SOURCE_TOUCHSCREEN) { - nativeAddTouch(device.getId(), device.getName()); + /* Allow SOURCE_TOUCHSCREEN and also Virtual InputDevices because they can send TOUCHSCREEN events */ + if (device != null && ((device.getSources() & InputDevice.SOURCE_TOUCHSCREEN) == InputDevice.SOURCE_TOUCHSCREEN + || device.isVirtual())) { + + int touchDevId = device.getId(); + /* + * Prevent id to be -1, since it's used in SDL internal for synthetic events + * Appears when using Android emulator, eg: + * adb shell input mouse tap 100 100 + * adb shell input touchscreen tap 100 100 + */ + if (touchDevId < 0) { + touchDevId -= 1; + } + nativeAddTouch(touchDevId, device.getName()); } } } @@ -1895,7 +2016,7 @@ class SDLSurface extends SurfaceView implements SurfaceHolder.Callback, } } - if ((source & InputDevice.SOURCE_KEYBOARD) != 0) { + if ((source & InputDevice.SOURCE_KEYBOARD) == InputDevice.SOURCE_KEYBOARD) { if (event.getAction() == KeyEvent.ACTION_DOWN) { if (SDLActivity.isTextInputEvent(event)) { SDLInputConnection.nativeCommitText(String.valueOf((char) event.getUnicodeChar()), 1); @@ -1908,7 +2029,7 @@ class SDLSurface extends SurfaceView implements SurfaceHolder.Callback, } } - if ((source & InputDevice.SOURCE_MOUSE) != 0) { + if ((source & InputDevice.SOURCE_MOUSE) == InputDevice.SOURCE_MOUSE) { // on some devices key events are sent for mouse BUTTON_BACK/FORWARD presses // they are ignored here because sending them as mouse input to SDL is messy if ((keyCode == KeyEvent.KEYCODE_BACK) || (keyCode == KeyEvent.KEYCODE_FORWARD)) { @@ -2195,7 +2316,7 @@ class DummyEdit extends View implements View.OnKeyListener { public InputConnection onCreateInputConnection(EditorInfo outAttrs) { ic = new SDLInputConnection(this, true); - outAttrs.inputType = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD; + outAttrs.inputType = InputType.TYPE_CLASS_TEXT; outAttrs.imeOptions = EditorInfo.IME_FLAG_NO_EXTRACT_UI | EditorInfo.IME_FLAG_NO_FULLSCREEN /* API 11 */; @@ -2237,6 +2358,29 @@ class SDLInputConnection extends BaseInputConnection { @Override public boolean commitText(CharSequence text, int newCursorPosition) { + /* Generate backspaces for the text we're going to replace */ + final Editable content = getEditable(); + if (content != null) { + int a = getComposingSpanStart(content); + int b = getComposingSpanEnd(content); + if (a == -1 || b == -1) { + a = Selection.getSelectionStart(content); + b = Selection.getSelectionEnd(content); + } + if (a < 0) a = 0; + if (b < 0) b = 0; + if (b < a) { + int tmp = a; + a = b; + b = tmp; + } + int backspaces = (b - a); + + for (int i = 0; i < backspaces; i++) { + nativeGenerateScancodeForUnichar('\b'); + } + } + for (int i = 0; i < text.length(); i++) { char c = text.charAt(i); if (c == '\n') { @@ -2271,14 +2415,11 @@ class SDLInputConnection extends BaseInputConnection { // Workaround to capture backspace key. Ref: http://stackoverflow.com/questions/14560344/android-backspace-in-webview-baseinputconnection // and https://bugzilla.libsdl.org/show_bug.cgi?id=2265 if (beforeLength > 0 && afterLength == 0) { - boolean ret = true; // backspace(s) while (beforeLength-- > 0) { - boolean ret_key = sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL)) - && sendKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DEL)); - ret = ret && ret_key; + nativeGenerateScancodeForUnichar('\b'); } - return ret; + return true; } return super.deleteSurroundingText(beforeLength, afterLength); diff --git a/android/app/src/main/java/org/libsdl/app/SDLControllerManager.java b/android/app/src/main/java/org/libsdl/app/SDLControllerManager.java index 1fa32ef3..82373d9d 100644 --- a/android/app/src/main/java/org/libsdl/app/SDLControllerManager.java +++ b/android/app/src/main/java/org/libsdl/app/SDLControllerManager.java @@ -255,23 +255,21 @@ class SDLJoystickHandler_API16 extends SDLJoystickHandler { @Override public boolean handleMotionEvent(MotionEvent event) { - if ((event.getSource() & InputDevice.SOURCE_JOYSTICK) != 0) { - int actionPointerIndex = event.getActionIndex(); - int action = event.getActionMasked(); - if (action == MotionEvent.ACTION_MOVE) { - SDLJoystick joystick = getJoystick(event.getDeviceId()); - if (joystick != null) { - for (int i = 0; i < joystick.axes.size(); i++) { - InputDevice.MotionRange range = joystick.axes.get(i); - /* Normalize the value to -1...1 */ - float value = (event.getAxisValue(range.getAxis(), actionPointerIndex) - range.getMin()) / range.getRange() * 2.0f - 1.0f; - SDLControllerManager.onNativeJoy(joystick.device_id, i, value); - } - for (int i = 0; i < joystick.hats.size() / 2; i++) { - int hatX = Math.round(event.getAxisValue(joystick.hats.get(2 * i).getAxis(), actionPointerIndex)); - int hatY = Math.round(event.getAxisValue(joystick.hats.get(2 * i + 1).getAxis(), actionPointerIndex)); - SDLControllerManager.onNativeHat(joystick.device_id, i, hatX, hatY); - } + int actionPointerIndex = event.getActionIndex(); + int action = event.getActionMasked(); + if (action == MotionEvent.ACTION_MOVE) { + SDLJoystick joystick = getJoystick(event.getDeviceId()); + if (joystick != null) { + for (int i = 0; i < joystick.axes.size(); i++) { + InputDevice.MotionRange range = joystick.axes.get(i); + /* Normalize the value to -1...1 */ + float value = (event.getAxisValue(range.getAxis(), actionPointerIndex) - range.getMin()) / range.getRange() * 2.0f - 1.0f; + SDLControllerManager.onNativeJoy(joystick.device_id, i, value); + } + for (int i = 0; i < joystick.hats.size() / 2; i++) { + int hatX = Math.round(event.getAxisValue(joystick.hats.get(2 * i).getAxis(), actionPointerIndex)); + int hatY = Math.round(event.getAxisValue(joystick.hats.get(2 * i + 1).getAxis(), actionPointerIndex)); + SDLControllerManager.onNativeHat(joystick.device_id, i, hatX, hatY); } } } @@ -562,8 +560,6 @@ class SDLGenericMotionListener_API12 implements View.OnGenericMotionListener { switch ( event.getSource() ) { case InputDevice.SOURCE_JOYSTICK: - case InputDevice.SOURCE_GAMEPAD: - case InputDevice.SOURCE_DPAD: return SDLControllerManager.handleJoystickMotionEvent(event); case InputDevice.SOURCE_MOUSE: @@ -693,8 +689,6 @@ class SDLGenericMotionListener_API26 extends SDLGenericMotionListener_API24 { switch ( event.getSource() ) { case InputDevice.SOURCE_JOYSTICK: - case InputDevice.SOURCE_GAMEPAD: - case InputDevice.SOURCE_DPAD: return SDLControllerManager.handleJoystickMotionEvent(event); case InputDevice.SOURCE_MOUSE: From aa0b14a1f29fa116645c2a4f0e2e28c6f1a285ce Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sat, 24 Dec 2022 19:11:04 -0500 Subject: [PATCH 15/25] try fixing this minimize bug --- .../imgui_patched/backends/imgui_impl_sdl.cpp | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/extern/imgui_patched/backends/imgui_impl_sdl.cpp b/extern/imgui_patched/backends/imgui_impl_sdl.cpp index 47d10bbb..499676fc 100644 --- a/extern/imgui_patched/backends/imgui_impl_sdl.cpp +++ b/extern/imgui_patched/backends/imgui_impl_sdl.cpp @@ -680,19 +680,24 @@ void ImGui_ImplSDL2_NewFrame() int w, h; int display_w, display_h; SDL_GetWindowSize(bd->Window, &w, &h); - /*if (SDL_GetWindowFlags(bd->Window) & SDL_WINDOW_MINIMIZED) - w = h = 0;*/ - if (bd->Renderer != NULL) - SDL_GetRendererOutputSize(bd->Renderer, &display_w, &display_h); - else + if (SDL_GetWindowFlags(bd->Window) & SDL_WINDOW_MINIMIZED) + w = h = 0; + if (bd->Renderer != NULL) { + if (SDL_GetRendererOutputSize(bd->Renderer, &display_w, &display_h)!=0) { + display_w=0; + display_h=0; + } + } else { SDL_GL_GetDrawableSize(bd->Window, &display_w, &display_h); - io.DisplaySize = ImVec2((float)w, (float)h); - if (w > 0 && h > 0) + } + if (w > 0 && h > 0) { + io.DisplaySize = ImVec2((float)w, (float)h); io.DisplayFramebufferScale = ImVec2((float)display_w / w, (float)display_h / h); + } // On Apple and Wayland, The window size is reported in Low DPI, even when running in high DPI mode ImGuiPlatformIO& platform_io = ImGui::GetPlatformIO(); - if (!platform_io.Monitors.empty() /*&& platform_io.Monitors[0].DpiScale > 1.0f*/ && display_h != h && w != 0) + if (!platform_io.Monitors.empty() /*&& platform_io.Monitors[0].DpiScale > 1.0f*/ && display_h != h && w != 0 && display_w != 0) { io.DisplayFramebufferScale = ImVec2(1.0f, 1.0f); io.DisplaySize = ImVec2((float)display_w, (float)display_h); From 618ff1d393a2a291420cb0db3b8d71b75344e454 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sat, 24 Dec 2022 23:39:44 -0500 Subject: [PATCH 16/25] release v0.6pre2 --- README.md | 19 ++++++++++++++++-- TODO.md | 3 --- android/app/src/main/AndroidManifest.xml | 4 ++-- demos/snes/segacd.fur | Bin 0 -> 62733 bytes .../vgsound_emu/src/es550x/es550x.hpp | 4 ++-- papers/format.md | 1 + res/Info.plist | 6 +++--- src/engine/engine.h | 4 ++-- src/gui/about.cpp | 1 + src/gui/insEdit.cpp | 2 +- src/main.cpp | 1 + 11 files changed, 30 insertions(+), 15 deletions(-) delete mode 100644 TODO.md create mode 100644 demos/snes/segacd.fur diff --git a/README.md b/README.md index e5573b4b..710c2bab 100644 --- a/README.md +++ b/README.md @@ -36,13 +36,17 @@ check out the [Releases](https://github.com/tildearrow/furnace/releases) page. a - TI SN76489 used in Sega Master System and BBC Micro - PC Speaker - Philips SAA1099 used in SAM Coupé + - OKI MSM5232 used in some arcade boards - sample chips: + - SNES - Amiga - SegaPCM - all 16 channels - Capcom QSound - Yamaha YMZ280B (PCMD8) - Ricoh RF5C68 used in Sega CD and FM Towns - OKI MSM6258 and MSM6295 + - Konami K007232 + - Irem GA20 - wavetable chips: - HuC6280 used in PC Engine - Konami Bubble System WSG @@ -61,9 +65,12 @@ check out the [Releases](https://github.com/tildearrow/furnace/releases) page. a - SID (6581/8580) used in Commodore 64 - Mikey used in Atari Lynx - ZX Spectrum beeper (SFX-like engine) + - Pokémon Mini - Commodore PET - TIA used in Atari 2600 + - POKEY used in Atari 8-bit computers - Game Boy + - Virtual Boy - modern/fantasy: - Commander X16 VERA - tildearrow Sound Unit @@ -71,12 +78,12 @@ check out the [Releases](https://github.com/tildearrow/furnace/releases) page. a - over 200 ready to use presets from computers, game consoles and arcade boards... - ...or create your own - up to 32 of them or a total of 128 channels! - DefleMask compatibility - - loads .dmf modules from all versions (beta 1 to 1.1.3) + - loads .dmf modules from all versions (beta 1 to 1.1.5) - saves .dmf modules - both modern and legacy - Furnace doubles as a module downgrader - loads/saves .dmp instruments and .dmw wavetables as well - clean-room design (guesswork and ABX tests only, no decompilation involved) - - bug/quirk implementation for increased playback accuracy through compatibility flags + - some bug/quirk implementation for increased playback accuracy through compatibility flags - VGM export - modular layout that you may adapt to your needs - audio file export - entire song, per chip or per channel @@ -88,11 +95,15 @@ check out the [Releases](https://github.com/tildearrow/furnace/releases) page. a - additional features: - FM macros! - negative octaves + - advanced arp macros - arbitrary pitch samples - sample loop points - SSG envelopes and ADPCM-B in Neo Geo + - pitchable OPLL drums - full duty/cutoff range in C64 + - full 16-channel SegaPCM - ability to change tempo mid-song + - decimal tempo/tick rate - multiple sub-songs in a module - per-channel oscilloscope with waveform centering - built-in sample editor @@ -251,6 +262,10 @@ xattr -d com.apple.quarantine /path/to/Furnace.app you may need to log out and/or reboot after doing this. +> .spc export? + +**not yet!** coming in 0.7 though, in a future... + > how do I use C64 absolute filter/duty? on Instrument Editor in the C64 tab there are two options to toggle these. diff --git a/TODO.md b/TODO.md deleted file mode 100644 index 137e4f7b..00000000 --- a/TODO.md +++ /dev/null @@ -1,3 +0,0 @@ -# to-do for 0.6pre2 - -- bug fixes diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index b77cf32e..082cebc3 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,8 +1,8 @@ diff --git a/demos/snes/segacd.fur b/demos/snes/segacd.fur new file mode 100644 index 0000000000000000000000000000000000000000..fbf9d55da9a83ade5f7884794ae8bd79e0a7eba4 GIT binary patch literal 62733 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 z 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 literal 0 HcmV?d00001 diff --git a/extern/vgsound_emu-modified/vgsound_emu/src/es550x/es550x.hpp b/extern/vgsound_emu-modified/vgsound_emu/src/es550x/es550x.hpp index d99fdfbf..7660bd19 100644 --- a/extern/vgsound_emu-modified/vgsound_emu/src/es550x/es550x.hpp +++ b/extern/vgsound_emu-modified/vgsound_emu/src/es550x/es550x.hpp @@ -166,9 +166,9 @@ class es550x_shared_core : public vgsound_emu_core , m_start(0) , m_end(0) , m_accum(0) - , m_sample({0}) { - } + m_sample[0]=0; + m_sample[1]=0; } // configurations const u8 m_integer = 21; diff --git a/papers/format.md b/papers/format.md index a2c962fb..a192f138 100644 --- a/papers/format.md +++ b/papers/format.md @@ -32,6 +32,7 @@ these fields are 0 in format versions prior to 100 (0.6pre1). the format versions are: +- 132: Furnace 0.6pre2 - 131: Furnace dev131 - 130: Furnace dev130 - 129: Furnace dev129 diff --git a/res/Info.plist b/res/Info.plist index 7b8d0120..d7f0f98d 100644 --- a/res/Info.plist +++ b/res/Info.plist @@ -15,17 +15,17 @@ CFBundleInfoDictionaryVersion 6.0 CFBundleLongVersionString - 0.6pre1 + 0.6pre2 CFBundleName Furnace CFBundlePackageType APPL CFBundleShortVersionString - 0.6pre1 + 0.6pre2 CFBundleSignature ???? CFBundleVersion - 0.6pre1 + 0.6pre2 NSHumanReadableCopyright NSHighResolutionCapable diff --git a/src/engine/engine.h b/src/engine/engine.h index 109a9abd..faca57d9 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -47,8 +47,8 @@ #define BUSY_BEGIN_SOFT softLocked=true; isBusy.lock(); #define BUSY_END isBusy.unlock(); softLocked=false; -#define DIV_VERSION "dev131" -#define DIV_ENGINE_VERSION 131 +#define DIV_VERSION "0.6pre2" +#define DIV_ENGINE_VERSION 132 // for imports #define DIV_VERSION_MOD 0xff01 #define DIV_VERSION_FC 0xff02 diff --git a/src/gui/about.cpp b/src/gui/about.cpp index d7346638..08daa494 100644 --- a/src/gui/about.cpp +++ b/src/gui/about.cpp @@ -141,6 +141,7 @@ const char* aboutLine[]={ "MAME MSM5232 core by Jarek Burczynski and Hiromitsu Shioya", "MAME MSM6258 core by Barry Rodewald", "MAME YMZ280B core by Aaron Giles", + "MAME GA20 core by Acho A. Tang and R. Belmont", "SAASound by Dave Hooper and Simon Owen", "SameBoy by Lior Halphon", "Mednafen PCE, WonderSwan, T6W28 and Virtual Boy audio cores", diff --git a/src/gui/insEdit.cpp b/src/gui/insEdit.cpp index 6aae392d..e359fc2e 100644 --- a/src/gui/insEdit.cpp +++ b/src/gui/insEdit.cpp @@ -4319,7 +4319,7 @@ void FurnaceGUI::drawInsEdit() { } } ImGui::BeginDisabled(ins->amiga.useWave); - P(ImGui::Checkbox("Use sample map (does not work yet!)",&ins->amiga.useNoteMap)); + P(ImGui::Checkbox("Use sample map",&ins->amiga.useNoteMap)); if (ins->amiga.useNoteMap) { // TODO: frequency map? if (ImGui::BeginTable("NoteMap",2,ImGuiTableFlags_ScrollY|ImGuiTableFlags_Borders|ImGuiTableFlags_SizingStretchSame)) { diff --git a/src/main.cpp b/src/main.cpp index 6bc7d960..a16bce1c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -180,6 +180,7 @@ TAParamResult pVersion(String) { printf("- MAME MSM5232 core by Jarek Burczynski and Hiromitsu Shioya (GPLv2)\n"); printf("- MAME MSM6258 core by Barry Rodewald (BSD 3-clause)\n"); printf("- MAME YMZ280B core by Aaron Giles (BSD 3-clause)\n"); + printf("- MAME GA20 core by Acho A. Tang and R. Belmont (BSD 3-clause)\n"); printf("- QSound core by superctr (BSD 3-clause)\n"); printf("- VICE VIC-20 by Rami Rasanen and viznut (GPLv2)\n"); printf("- VERA core by Frank van den Hoef (BSD 2-clause)\n"); From 21e2b9f5689e21b681659e08b05eb48ea91902ac Mon Sep 17 00:00:00 2001 From: cam900 Date: Sun, 25 Dec 2022 14:02:01 +0900 Subject: [PATCH 17/25] Try to fix initializer --- extern/Nuked-OPN2 | 1 + .../vgsound_emu/src/es550x/es5504.hpp | 4 +-- .../vgsound_emu/src/es550x/es5505.hpp | 4 +-- .../vgsound_emu/src/es550x/es5506.hpp | 4 +-- .../vgsound_emu/src/es550x/es550x.hpp | 2 +- .../vgsound_emu/src/k007232/k007232.hpp | 4 +-- .../vgsound_emu/src/k053260/k053260.hpp | 34 +++++++++++-------- .../vgsound_emu/src/n163/n163.hpp | 8 ++--- .../vgsound_emu/src/scc/scc.hpp | 14 +++++--- .../vgsound_emu/src/template/template.hpp | 9 +++-- .../vgsound_emu/src/x1_010/x1_010.hpp | 20 +++++------ 11 files changed, 58 insertions(+), 46 deletions(-) create mode 160000 extern/Nuked-OPN2 diff --git a/extern/Nuked-OPN2 b/extern/Nuked-OPN2 new file mode 160000 index 00000000..b0e9de0f --- /dev/null +++ b/extern/Nuked-OPN2 @@ -0,0 +1 @@ +Subproject commit b0e9de0f816943ad3820ddfefa0fff276d659250 diff --git a/extern/vgsound_emu-modified/vgsound_emu/src/es550x/es5504.hpp b/extern/vgsound_emu-modified/vgsound_emu/src/es550x/es5504.hpp index d37ef36d..54baa528 100644 --- a/extern/vgsound_emu-modified/vgsound_emu/src/es550x/es5504.hpp +++ b/extern/vgsound_emu-modified/vgsound_emu/src/es550x/es5504.hpp @@ -60,7 +60,7 @@ class es5504_core : public es550x_shared_core *this, *this, *this, *this, *this, *this, *this, *this, *this, *this, *this, *this, *this, *this, *this, *this} , m_adc(0) - , m_out{0} + , m_out{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} { } @@ -111,7 +111,7 @@ class es5504_core : public es550x_shared_core private: std::array m_voice; // 25 voices u16 m_adc = 0; // ADC register - std::array m_out = {0}; // 16 channel outputs + std::array m_out = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // 16 channel outputs }; #endif diff --git a/extern/vgsound_emu-modified/vgsound_emu/src/es550x/es5505.hpp b/extern/vgsound_emu-modified/vgsound_emu/src/es550x/es5505.hpp index cfd6f88c..b537258f 100644 --- a/extern/vgsound_emu-modified/vgsound_emu/src/es550x/es5505.hpp +++ b/extern/vgsound_emu-modified/vgsound_emu/src/es550x/es5505.hpp @@ -106,7 +106,7 @@ class es5505_core : public es550x_shared_core , m_rvol(0) , m_ch(output_t()) , m_mute(false) - , m_output{0} + , m_output{0, 0} { } @@ -143,7 +143,7 @@ class es5505_core : public es550x_shared_core u8 m_rvol = 0; // Right volume output_t m_ch; // channel output bool m_mute = false; // mute flag (for debug purpose) - std::array m_output; // output preview (for debug purpose) + std::array m_output = {0, 0}; // output preview (for debug purpose) }; class sermode_t : public vgsound_emu_core diff --git a/extern/vgsound_emu-modified/vgsound_emu/src/es550x/es5506.hpp b/extern/vgsound_emu-modified/vgsound_emu/src/es550x/es5506.hpp index f5b54d4f..074519c8 100644 --- a/extern/vgsound_emu-modified/vgsound_emu/src/es550x/es5506.hpp +++ b/extern/vgsound_emu-modified/vgsound_emu/src/es550x/es5506.hpp @@ -147,7 +147,7 @@ class es5506_core : public es550x_shared_core , m_filtcount(0) , m_ch(output_t()) , m_mute(false) - , m_output{0} + , m_output{0, 0} { } @@ -211,7 +211,7 @@ class es5506_core : public es550x_shared_core u8 m_filtcount = 0; // Internal counter for slow mode output_t m_ch; // channel output bool m_mute = false; // mute flag (for debug purpose) - std::array m_output; // output preview (for debug purpose) + std::array m_output = {0, 0}; // output preview (for debug purpose) }; // 5 bit mode diff --git a/extern/vgsound_emu-modified/vgsound_emu/src/es550x/es550x.hpp b/extern/vgsound_emu-modified/vgsound_emu/src/es550x/es550x.hpp index 7660bd19..3df59a12 100644 --- a/extern/vgsound_emu-modified/vgsound_emu/src/es550x/es550x.hpp +++ b/extern/vgsound_emu-modified/vgsound_emu/src/es550x/es550x.hpp @@ -367,7 +367,7 @@ class es550x_shared_core : public vgsound_emu_core // 21 integer, 11 fraction for ES5506 u32 m_accum = 0; // Samples - std::array m_sample = {0}; + std::array m_sample = {0, 0}; }; // Filter diff --git a/extern/vgsound_emu-modified/vgsound_emu/src/k007232/k007232.hpp b/extern/vgsound_emu-modified/vgsound_emu/src/k007232/k007232.hpp index ef3af56d..ae39d269 100644 --- a/extern/vgsound_emu-modified/vgsound_emu/src/k007232/k007232.hpp +++ b/extern/vgsound_emu-modified/vgsound_emu/src/k007232/k007232.hpp @@ -87,7 +87,7 @@ class k007232_core : public vgsound_emu_core : vgsound_emu_core("k007232") , m_voice{*this, *this} , m_intf(intf) - , m_reg{0} + , m_reg{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} { } @@ -111,7 +111,7 @@ class k007232_core : public vgsound_emu_core k007232_intf &m_intf; // common memory interface - std::array m_reg = {0}; // register pool + std::array m_reg = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // register pool }; #endif diff --git a/extern/vgsound_emu-modified/vgsound_emu/src/k053260/k053260.hpp b/extern/vgsound_emu-modified/vgsound_emu/src/k053260/k053260.hpp index a616708b..10fd5016 100644 --- a/extern/vgsound_emu-modified/vgsound_emu/src/k053260/k053260.hpp +++ b/extern/vgsound_emu-modified/vgsound_emu/src/k053260/k053260.hpp @@ -57,7 +57,7 @@ class k053260_core : public vgsound_emu_core , m_bitpos(4) , m_data(0) , m_adpcm_buf(0) - , m_out{0} + , m_out{0, 0} { } @@ -112,7 +112,7 @@ class k053260_core : public vgsound_emu_core u8 m_bitpos = 4; // bit position for ADPCM decoding u8 m_data = 0; // current data s8 m_adpcm_buf = 0; // ADPCM buffer - std::array m_out = {0}; // current output + std::array m_out = {0, 0}; // current output }; class ctrl_t @@ -156,8 +156,8 @@ class k053260_core : public vgsound_emu_core { public: ym3012_t() - : m_in{0} - , m_out{0} + : m_in{0, 0} + , m_out{0, 0} { } @@ -174,8 +174,8 @@ class k053260_core : public vgsound_emu_core } private: - std::array m_in = {0}; - std::array m_out = {0}; + std::array m_in = {0, 0}; + std::array m_out = {0, 0}; }; class dac_t @@ -212,13 +212,16 @@ class k053260_core : public vgsound_emu_core : vgsound_emu_core("k053260") , m_voice{*this, *this, *this, *this} , m_intf(intf) - , m_host2snd{0} - , m_snd2host{0} + , m_host2snd{0, 0} + , m_snd2host{0, 0} , m_ctrl(ctrl_t()) , m_ym3012(ym3012_t()) , m_dac(dac_t()) - , m_reg{0} - , m_out{0} + , m_reg{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} + , m_out{0, 0} { } @@ -249,16 +252,19 @@ class k053260_core : public vgsound_emu_core std::array m_voice; k053260_intf &m_intf; // common memory interface - std::array m_host2snd = {0}; - std::array m_snd2host = {0}; + std::array m_host2snd = {0, 0}; + std::array m_snd2host = {0, 0}; ctrl_t m_ctrl; // chip control ym3012_t m_ym3012; // YM3012 output dac_t m_dac; // YM3012 interface - std::array m_reg = {0}; // register pool - std::array m_out = {0}; // stereo output + std::array m_reg = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // register pool + std::array m_out = {0, 0}; // stereo output }; #endif diff --git a/extern/vgsound_emu-modified/vgsound_emu/src/n163/n163.hpp b/extern/vgsound_emu-modified/vgsound_emu/src/n163/n163.hpp index bbf2720a..258bac43 100644 --- a/extern/vgsound_emu-modified/vgsound_emu/src/n163/n163.hpp +++ b/extern/vgsound_emu-modified/vgsound_emu/src/n163/n163.hpp @@ -58,14 +58,14 @@ class n163_core : public vgsound_emu_core n163_core() : vgsound_emu_core("namco_163") , m_disable(false) - , m_ram{0} , m_voice_cycle(0x78) , m_addr_latch(addr_latch_t()) , m_out(0) - , m_voice_out{0} + , m_voice_out{0, 0, 0, 0, 0, 0, 0, 0} , m_multiplex(true) , m_acc(0) { + m_ram.fill(0); } // accessors, getters, setters @@ -97,12 +97,12 @@ class n163_core : public vgsound_emu_core private: bool m_disable = false; - std::array m_ram = {0}; // internal 128 byte RAM + std::array m_ram ; // internal 128 byte RAM u8 m_voice_cycle = 0x78; // Voice cycle for processing addr_latch_t m_addr_latch; // address latch s16 m_out = 0; // output - std::array m_voice_out = {0}; // per-voice output, for preview only + std::array m_voice_out = {0, 0, 0, 0, 0, 0, 0, 0}; // per-voice output, for preview only // demultiplex related bool m_multiplex = true; // multiplex flag, but less noisy = inaccurate! s16 m_acc = 0; // accumulated output diff --git a/extern/vgsound_emu-modified/vgsound_emu/src/scc/scc.hpp b/extern/vgsound_emu-modified/vgsound_emu/src/scc/scc.hpp index 12322d84..9f82d797 100644 --- a/extern/vgsound_emu-modified/vgsound_emu/src/scc/scc.hpp +++ b/extern/vgsound_emu-modified/vgsound_emu/src/scc/scc.hpp @@ -29,7 +29,10 @@ class scc_core : public vgsound_emu_core voice_t(scc_core &host) : vgsound_emu_core("scc_voice") , m_host(host) - , m_wave{0} + , m_wave{0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0} , m_enable(false) , m_pitch(0) , m_volume(0) @@ -69,7 +72,10 @@ class scc_core : public vgsound_emu_core private: // registers scc_core &m_host; - std::array m_wave = {0}; // internal waveform + std::array m_wave = {0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0}; // internal waveform bool m_enable = false; // output enable flag u16 m_pitch : 12; // pitch u16 m_volume : 4; // volume @@ -138,8 +144,8 @@ class scc_core : public vgsound_emu_core , m_voice{*this, *this, *this, *this, *this} , m_test(test_t()) , m_out(0) - , m_reg{0} { + m_reg.fill(0); } // destructor @@ -173,7 +179,7 @@ class scc_core : public vgsound_emu_core test_t m_test; // test register s32 m_out = 0; // output to DA0...10 - std::array m_reg = {0}; // register pool + std::array m_reg; // register pool }; // SCC core diff --git a/extern/vgsound_emu-modified/vgsound_emu/src/template/template.hpp b/extern/vgsound_emu-modified/vgsound_emu/src/template/template.hpp index ffc6f932..97a16f65 100644 --- a/extern/vgsound_emu-modified/vgsound_emu/src/template/template.hpp +++ b/extern/vgsound_emu-modified/vgsound_emu/src/template/template.hpp @@ -64,9 +64,9 @@ class template_core : public vgsound_emu_core // anywhere, and it works as initializer. , m_voice{*this} , m_intf(intf) - , m_array{0} - , m_vector{0} { + m_array.fill(0); + m_vector.resize(1,0); } // accessors, getters, setters @@ -83,9 +83,8 @@ class template_core : public vgsound_emu_core std::array m_voice; // voice classes vgsound_emu_mem_intf &m_intf; // common memory interface - std::array m_array = { - 0}; // std::array for static size array - std::vector m_vector = {0}; // std::vector for variable size array + std::array m_array; // std::array for static size array + std::vector m_vector; // std::vector for variable size array }; #endif diff --git a/extern/vgsound_emu-modified/vgsound_emu/src/x1_010/x1_010.hpp b/extern/vgsound_emu-modified/vgsound_emu/src/x1_010/x1_010.hpp index 37a1895b..0456a9fa 100644 --- a/extern/vgsound_emu-modified/vgsound_emu/src/x1_010/x1_010.hpp +++ b/extern/vgsound_emu-modified/vgsound_emu/src/x1_010/x1_010.hpp @@ -87,8 +87,8 @@ class x1_010_core : public vgsound_emu_core , m_acc(0) , m_env_acc(0) , m_data(0) - , m_vol_out{0} - , m_out{0} + , m_vol_out{0, 0} + , m_out{0, 0} { } @@ -117,10 +117,10 @@ class x1_010_core : public vgsound_emu_core u32 m_acc = 0; u32 m_env_acc = 0; s8 m_data = 0; - std::array m_vol_out = {0}; + std::array m_vol_out = {0, 0}; // for preview only - std::array m_out = {0}; + std::array m_out = {0, 0}; }; public: @@ -144,10 +144,10 @@ class x1_010_core : public vgsound_emu_core *this, *this} , m_intf(intf) - , m_envelope{0} - , m_wave{0} - , m_out{0} + , m_out{0, 0} { + m_envelope.fill(0); + m_wave.fill(0); } // register accessor @@ -172,11 +172,11 @@ class x1_010_core : public vgsound_emu_core vgsound_emu_mem_intf &m_intf; // RAM - std::array m_envelope = {0}; - std::array m_wave = {0}; + std::array m_envelope; + std::array m_wave; // output data - std::array m_out = {0}; + std::array m_out = {0, 0}; }; #endif From 3034f33ee01f650fd8c539cba011513a749218be Mon Sep 17 00:00:00 2001 From: cam900 Date: Sun, 25 Dec 2022 14:04:37 +0900 Subject: [PATCH 18/25] Minor initializer --- .../vgsound_emu-modified/vgsound_emu/src/es550x/es550x.hpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/extern/vgsound_emu-modified/vgsound_emu/src/es550x/es550x.hpp b/extern/vgsound_emu-modified/vgsound_emu/src/es550x/es550x.hpp index 3df59a12..12e3f1af 100644 --- a/extern/vgsound_emu-modified/vgsound_emu/src/es550x/es550x.hpp +++ b/extern/vgsound_emu-modified/vgsound_emu/src/es550x/es550x.hpp @@ -167,8 +167,8 @@ class es550x_shared_core : public vgsound_emu_core , m_end(0) , m_accum(0) { - m_sample[0]=0; - m_sample[1]=0; } + m_sample.fill(0); + } // configurations const u8 m_integer = 21; @@ -367,7 +367,7 @@ class es550x_shared_core : public vgsound_emu_core // 21 integer, 11 fraction for ES5506 u32 m_accum = 0; // Samples - std::array m_sample = {0, 0}; + std::array m_sample; }; // Filter From 0414b960b81a7bd0d5a2d1bc212dc6713cea81c1 Mon Sep 17 00:00:00 2001 From: cam900 Date: Sun, 25 Dec 2022 14:14:32 +0900 Subject: [PATCH 19/25] Fix build --- extern/Nuked-OPN2 | 1 - 1 file changed, 1 deletion(-) delete mode 160000 extern/Nuked-OPN2 diff --git a/extern/Nuked-OPN2 b/extern/Nuked-OPN2 deleted file mode 160000 index b0e9de0f..00000000 --- a/extern/Nuked-OPN2 +++ /dev/null @@ -1 +0,0 @@ -Subproject commit b0e9de0f816943ad3820ddfefa0fff276d659250 From 9a19a8937080088b157a2101dd92b4dead24a478 Mon Sep 17 00:00:00 2001 From: cam900 Date: Sun, 25 Dec 2022 16:11:29 +0900 Subject: [PATCH 20/25] Possibly fix gcc 5.4 --- .../vgsound_emu/src/k007232/k007232.hpp | 4 ++-- .../vgsound_emu/src/x1_010/x1_010.hpp | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/extern/vgsound_emu-modified/vgsound_emu/src/k007232/k007232.hpp b/extern/vgsound_emu-modified/vgsound_emu/src/k007232/k007232.hpp index ae39d269..c3e2333e 100644 --- a/extern/vgsound_emu-modified/vgsound_emu/src/k007232/k007232.hpp +++ b/extern/vgsound_emu-modified/vgsound_emu/src/k007232/k007232.hpp @@ -87,8 +87,8 @@ class k007232_core : public vgsound_emu_core : vgsound_emu_core("k007232") , m_voice{*this, *this} , m_intf(intf) - , m_reg{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} { + m_reg.fill(0); } // host accessors @@ -111,7 +111,7 @@ class k007232_core : public vgsound_emu_core k007232_intf &m_intf; // common memory interface - std::array m_reg = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // register pool + std::array m_reg; // register pool }; #endif diff --git a/extern/vgsound_emu-modified/vgsound_emu/src/x1_010/x1_010.hpp b/extern/vgsound_emu-modified/vgsound_emu/src/x1_010/x1_010.hpp index 0456a9fa..85392b8b 100644 --- a/extern/vgsound_emu-modified/vgsound_emu/src/x1_010/x1_010.hpp +++ b/extern/vgsound_emu-modified/vgsound_emu/src/x1_010/x1_010.hpp @@ -87,9 +87,9 @@ class x1_010_core : public vgsound_emu_core , m_acc(0) , m_env_acc(0) , m_data(0) - , m_vol_out{0, 0} - , m_out{0, 0} { + m_vol_out.fill(0); + m_out.fill(0); } // internal state @@ -117,10 +117,10 @@ class x1_010_core : public vgsound_emu_core u32 m_acc = 0; u32 m_env_acc = 0; s8 m_data = 0; - std::array m_vol_out = {0, 0}; + std::array m_vol_out; // for preview only - std::array m_out = {0, 0}; + std::array m_out; }; public: From c754504337e70d7f5a4069b61aa873b873b9454b Mon Sep 17 00:00:00 2001 From: cam900 Date: Sun, 25 Dec 2022 16:11:47 +0900 Subject: [PATCH 21/25] Update previous commit --- .../vgsound_emu/src/es550x/es5504.hpp | 4 +- .../vgsound_emu/src/es550x/es5505.hpp | 4 +- .../vgsound_emu/src/es550x/es5506.hpp | 4 +- .../vgsound_emu/src/k053260/k053260.hpp | 38 ++++++++----------- .../vgsound_emu/src/n163/n163.hpp | 6 +-- .../vgsound_emu/src/scc/scc.hpp | 21 +++++----- 6 files changed, 34 insertions(+), 43 deletions(-) diff --git a/extern/vgsound_emu-modified/vgsound_emu/src/es550x/es5504.hpp b/extern/vgsound_emu-modified/vgsound_emu/src/es550x/es5504.hpp index 54baa528..b30bc3a9 100644 --- a/extern/vgsound_emu-modified/vgsound_emu/src/es550x/es5504.hpp +++ b/extern/vgsound_emu-modified/vgsound_emu/src/es550x/es5504.hpp @@ -60,8 +60,8 @@ class es5504_core : public es550x_shared_core *this, *this, *this, *this, *this, *this, *this, *this, *this, *this, *this, *this, *this, *this, *this, *this} , m_adc(0) - , m_out{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} { + m_out.fill(0); } // host interface @@ -111,7 +111,7 @@ class es5504_core : public es550x_shared_core private: std::array m_voice; // 25 voices u16 m_adc = 0; // ADC register - std::array m_out = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // 16 channel outputs + std::array m_out; // 16 channel outputs }; #endif diff --git a/extern/vgsound_emu-modified/vgsound_emu/src/es550x/es5505.hpp b/extern/vgsound_emu-modified/vgsound_emu/src/es550x/es5505.hpp index b537258f..ebe61b72 100644 --- a/extern/vgsound_emu-modified/vgsound_emu/src/es550x/es5505.hpp +++ b/extern/vgsound_emu-modified/vgsound_emu/src/es550x/es5505.hpp @@ -106,8 +106,8 @@ class es5505_core : public es550x_shared_core , m_rvol(0) , m_ch(output_t()) , m_mute(false) - , m_output{0, 0} { + m_output.fill(0); } // internal state @@ -143,7 +143,7 @@ class es5505_core : public es550x_shared_core u8 m_rvol = 0; // Right volume output_t m_ch; // channel output bool m_mute = false; // mute flag (for debug purpose) - std::array m_output = {0, 0}; // output preview (for debug purpose) + std::array m_output; // output preview (for debug purpose) }; class sermode_t : public vgsound_emu_core diff --git a/extern/vgsound_emu-modified/vgsound_emu/src/es550x/es5506.hpp b/extern/vgsound_emu-modified/vgsound_emu/src/es550x/es5506.hpp index 074519c8..294efff7 100644 --- a/extern/vgsound_emu-modified/vgsound_emu/src/es550x/es5506.hpp +++ b/extern/vgsound_emu-modified/vgsound_emu/src/es550x/es5506.hpp @@ -147,8 +147,8 @@ class es5506_core : public es550x_shared_core , m_filtcount(0) , m_ch(output_t()) , m_mute(false) - , m_output{0, 0} { + m_output.fill(0); } // internal state @@ -211,7 +211,7 @@ class es5506_core : public es550x_shared_core u8 m_filtcount = 0; // Internal counter for slow mode output_t m_ch; // channel output bool m_mute = false; // mute flag (for debug purpose) - std::array m_output = {0, 0}; // output preview (for debug purpose) + std::array m_output; // output preview (for debug purpose) }; // 5 bit mode diff --git a/extern/vgsound_emu-modified/vgsound_emu/src/k053260/k053260.hpp b/extern/vgsound_emu-modified/vgsound_emu/src/k053260/k053260.hpp index 10fd5016..a8668a0d 100644 --- a/extern/vgsound_emu-modified/vgsound_emu/src/k053260/k053260.hpp +++ b/extern/vgsound_emu-modified/vgsound_emu/src/k053260/k053260.hpp @@ -57,8 +57,8 @@ class k053260_core : public vgsound_emu_core , m_bitpos(4) , m_data(0) , m_adpcm_buf(0) - , m_out{0, 0} { + m_out.fill(0); } // internal state @@ -112,7 +112,7 @@ class k053260_core : public vgsound_emu_core u8 m_bitpos = 4; // bit position for ADPCM decoding u8 m_data = 0; // current data s8 m_adpcm_buf = 0; // ADPCM buffer - std::array m_out = {0, 0}; // current output + std::array m_out; // current output }; class ctrl_t @@ -156,15 +156,15 @@ class k053260_core : public vgsound_emu_core { public: ym3012_t() - : m_in{0, 0} - , m_out{0, 0} { + m_in.fill(0); + m_out.fill(0); } void reset() { - std::fill(m_in.begin(), m_in.end(), 0); - std::fill(m_out.begin(), m_out.end(), 0); + m_in.fill(0); + m_out.fill(0); } void tick(u8 ch, s32 in) @@ -174,8 +174,8 @@ class k053260_core : public vgsound_emu_core } private: - std::array m_in = {0, 0}; - std::array m_out = {0, 0}; + std::array m_in; + std::array m_out; }; class dac_t @@ -212,17 +212,14 @@ class k053260_core : public vgsound_emu_core : vgsound_emu_core("k053260") , m_voice{*this, *this, *this, *this} , m_intf(intf) - , m_host2snd{0, 0} - , m_snd2host{0, 0} , m_ctrl(ctrl_t()) , m_ym3012(ym3012_t()) , m_dac(dac_t()) - , m_reg{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , m_out{0, 0} { + m_host2snd.fill(0); + m_snd2host.fill(0); + m_reg.fill(0); + m_out.fill(0); } // communications @@ -252,19 +249,16 @@ class k053260_core : public vgsound_emu_core std::array m_voice; k053260_intf &m_intf; // common memory interface - std::array m_host2snd = {0, 0}; - std::array m_snd2host = {0, 0}; + std::array m_host2snd; + std::array m_snd2host; ctrl_t m_ctrl; // chip control ym3012_t m_ym3012; // YM3012 output dac_t m_dac; // YM3012 interface - std::array m_reg = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // register pool - std::array m_out = {0, 0}; // stereo output + std::array m_reg; // register pool + std::array m_out; // stereo output }; #endif diff --git a/extern/vgsound_emu-modified/vgsound_emu/src/n163/n163.hpp b/extern/vgsound_emu-modified/vgsound_emu/src/n163/n163.hpp index 258bac43..efda5042 100644 --- a/extern/vgsound_emu-modified/vgsound_emu/src/n163/n163.hpp +++ b/extern/vgsound_emu-modified/vgsound_emu/src/n163/n163.hpp @@ -61,11 +61,11 @@ class n163_core : public vgsound_emu_core , m_voice_cycle(0x78) , m_addr_latch(addr_latch_t()) , m_out(0) - , m_voice_out{0, 0, 0, 0, 0, 0, 0, 0} , m_multiplex(true) , m_acc(0) { m_ram.fill(0); + m_voice_out.fill(0); } // accessors, getters, setters @@ -97,12 +97,12 @@ class n163_core : public vgsound_emu_core private: bool m_disable = false; - std::array m_ram ; // internal 128 byte RAM + std::array m_ram; // internal 128 byte RAM u8 m_voice_cycle = 0x78; // Voice cycle for processing addr_latch_t m_addr_latch; // address latch s16 m_out = 0; // output - std::array m_voice_out = {0, 0, 0, 0, 0, 0, 0, 0}; // per-voice output, for preview only + std::array m_voice_out; // per-voice output, for preview only // demultiplex related bool m_multiplex = true; // multiplex flag, but less noisy = inaccurate! s16 m_acc = 0; // accumulated output diff --git a/extern/vgsound_emu-modified/vgsound_emu/src/scc/scc.hpp b/extern/vgsound_emu-modified/vgsound_emu/src/scc/scc.hpp index 9f82d797..10b153e7 100644 --- a/extern/vgsound_emu-modified/vgsound_emu/src/scc/scc.hpp +++ b/extern/vgsound_emu-modified/vgsound_emu/src/scc/scc.hpp @@ -29,10 +29,6 @@ class scc_core : public vgsound_emu_core voice_t(scc_core &host) : vgsound_emu_core("scc_voice") , m_host(host) - , m_wave{0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0} , m_enable(false) , m_pitch(0) , m_volume(0) @@ -40,6 +36,7 @@ class scc_core : public vgsound_emu_core , m_counter(0) , m_out(0) { + m_wave.fill(0); } // internal state @@ -72,10 +69,7 @@ class scc_core : public vgsound_emu_core private: // registers scc_core &m_host; - std::array m_wave = {0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0}; // internal waveform + std::array m_wave; // internal waveform bool m_enable = false; // output enable flag u16 m_pitch : 12; // pitch u16 m_volume : 4; // volume @@ -275,9 +269,12 @@ class k052539_core : public k052539_scc_core public: k052539_mapper_t() : vgsound_emu_core("k052539_mapper") - , m_bank{0, 1, 2, 3} - , m_ram_enable{false} { + m_bank[0] = 0; + m_bank[1] = 1; + m_bank[2] = 2; + m_bank[3] = 3; + m_ram_enable.fill(false); } // internal state @@ -298,8 +295,8 @@ class k052539_core : public k052539_scc_core private: // registers - std::array m_bank = {0, 1, 2, 3}; - std::array m_ram_enable = {false}; + std::array m_bank; + std::array m_ram_enable; }; public: From b8c374977c67c3351383da722e365eb97141f26b Mon Sep 17 00:00:00 2001 From: cam900 Date: Sun, 25 Dec 2022 16:15:36 +0900 Subject: [PATCH 22/25] forgot this --- extern/vgsound_emu-modified/vgsound_emu/src/x1_010/x1_010.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extern/vgsound_emu-modified/vgsound_emu/src/x1_010/x1_010.hpp b/extern/vgsound_emu-modified/vgsound_emu/src/x1_010/x1_010.hpp index 85392b8b..52843685 100644 --- a/extern/vgsound_emu-modified/vgsound_emu/src/x1_010/x1_010.hpp +++ b/extern/vgsound_emu-modified/vgsound_emu/src/x1_010/x1_010.hpp @@ -144,10 +144,10 @@ class x1_010_core : public vgsound_emu_core *this, *this} , m_intf(intf) - , m_out{0, 0} { m_envelope.fill(0); m_wave.fill(0); + m_out.fill(0); } // register accessor @@ -176,7 +176,7 @@ class x1_010_core : public vgsound_emu_core std::array m_wave; // output data - std::array m_out = {0, 0}; + std::array m_out; }; #endif From d78ffa60cc897db169717e6cbe3f0eaaefa52206 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sun, 25 Dec 2022 03:26:44 -0500 Subject: [PATCH 23/25] GUI: fix classic pattern headers --- src/gui/pattern.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/pattern.cpp b/src/gui/pattern.cpp index d14902ee..3502b8a5 100644 --- a/src/gui/pattern.cpp +++ b/src/gui/pattern.cpp @@ -619,7 +619,7 @@ void FurnaceGUI::drawPattern() { ImGui::ItemSize(size,ImGui::GetStyle().FramePadding.y); if (ImGui::ItemAdd(rect,ImGui::GetID(chanID))) { bool hovered=ImGui::ItemHoverable(rect,ImGui::GetID(chanID)); - ImU32 col=(hovered || (!mobileUI && ImGui::IsMouseDown(ImGuiMouseButton_Left)))?ImGui::GetColorU32(ImGuiCol_HeaderHovered):ImGui::GetColorU32(ImGuiCol_Header); + ImU32 col=(hovered || (mobileUI && ImGui::IsMouseDown(ImGuiMouseButton_Left)))?ImGui::GetColorU32(ImGuiCol_HeaderHovered):ImGui::GetColorU32(ImGuiCol_Header); dl->AddRectFilled(rect.Min,rect.Max,col); dl->AddText(ImVec2(minLabelArea.x,rect.Min.y),ImGui::GetColorU32(channelTextColor(i)),chanID); } From 4584b8aa82adb303aa8c3142c3a5fd0bb5646da1 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sun, 25 Dec 2022 03:36:30 -0500 Subject: [PATCH 24/25] POKEY: fix setFlags() crash with altASAP --- src/engine/platform/pokey.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/engine/platform/pokey.cpp b/src/engine/platform/pokey.cpp index a6ddb78f..a79ec453 100644 --- a/src/engine/platform/pokey.cpp +++ b/src/engine/platform/pokey.cpp @@ -455,6 +455,7 @@ void DivPlatformPOKEY::setFlags(const DivConfig& flags) { oscBuf[i]->rate=rate/2; } altASAP.init(chipClock,rate); + altASAP.reset(); } else { rate=chipClock; for (int i=0; i<4; i++) { From ca5d8eeb7260ccca30d4bf78d4f8d4c17f6408e9 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sun, 25 Dec 2022 03:38:19 -0500 Subject: [PATCH 25/25] GUI: add missing POKEY preset --- src/gui/presets.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/gui/presets.cpp b/src/gui/presets.cpp index ee957691..44d1176e 100644 --- a/src/gui/presets.cpp +++ b/src/gui/presets.cpp @@ -1542,6 +1542,12 @@ void FurnaceGUI::initSystemPresets() { CH(DIV_SYSTEM_LYNX, 64, 0, "") } ); + ENTRY( + "POKEY", { + CH(DIV_SYSTEM_POKEY, 64, 0, "clockSel=1") + }, + "tickRate=50" + ); ENTRY( "Atari TIA", { CH(DIV_SYSTEM_TIA, 64, 0, "")