From 691bdc5039d7ca51a5e65c081366171f4eab5ab8 Mon Sep 17 00:00:00 2001 From: JP Cimalando Date: Sat, 29 Dec 2018 15:10:19 +0100 Subject: [PATCH 01/11] support new OPL proxy with dynamic address --- CMakeLists.txt | 1 + FMBankEdit.pro | 2 + build.bat | 4 +- opl_proxy/{ => modern}/.gitignore | 0 opl_proxy/{ => modern}/Readme.txt | 0 opl_proxy/{ => modern}/liboplproxy.dll | Bin opl_proxy/{ => modern}/liboplproxy.tgt | 0 .../{ => modern}/liboplproxy_exports.txt | 0 opl_proxy/modern/oplproxy.c | 50 ++++++ opl_proxy/modern/oplproxy.dll | Bin 0 -> 12800 bytes opl_proxy/{ => modern}/oplproxy.wpj | 0 opl_proxy/{ => modern}/update_exports.bat | 0 opl_proxy/win9x/.gitignore | 8 + opl_proxy/win9x/Readme.txt | 6 + opl_proxy/win9x/liboplproxy.dll | Bin 0 -> 27136 bytes opl_proxy/win9x/liboplproxy.tgt | 150 ++++++++++++++++++ opl_proxy/win9x/liboplproxy_exports.txt | 30 ++++ opl_proxy/{ => win9x}/oplproxy.c | 0 opl_proxy/win9x/oplproxy.wpj | 43 +++++ opl_proxy/win9x/update_exports.bat | 1 + src/bank_editor.cpp | 34 ++++ src/bank_editor.h | 11 ++ src/bank_editor.ui | 6 + src/hardware.cpp | 91 +++++++++++ src/hardware.h | 45 ++++++ src/opl/chips/win9x_opl_proxy.cpp | 23 ++- src/opl/chips/win9x_opl_proxy.h | 3 + 27 files changed, 505 insertions(+), 3 deletions(-) rename opl_proxy/{ => modern}/.gitignore (100%) rename opl_proxy/{ => modern}/Readme.txt (100%) rename opl_proxy/{ => modern}/liboplproxy.dll (100%) rename opl_proxy/{ => modern}/liboplproxy.tgt (100%) rename opl_proxy/{ => modern}/liboplproxy_exports.txt (100%) create mode 100644 opl_proxy/modern/oplproxy.c create mode 100644 opl_proxy/modern/oplproxy.dll rename opl_proxy/{ => modern}/oplproxy.wpj (100%) rename opl_proxy/{ => modern}/update_exports.bat (100%) create mode 100644 opl_proxy/win9x/.gitignore create mode 100644 opl_proxy/win9x/Readme.txt create mode 100644 opl_proxy/win9x/liboplproxy.dll create mode 100644 opl_proxy/win9x/liboplproxy.tgt create mode 100644 opl_proxy/win9x/liboplproxy_exports.txt rename opl_proxy/{ => win9x}/oplproxy.c (100%) create mode 100644 opl_proxy/win9x/oplproxy.wpj create mode 100644 opl_proxy/win9x/update_exports.bat create mode 100644 src/hardware.cpp create mode 100644 src/hardware.h diff --git a/CMakeLists.txt b/CMakeLists.txt index f4460c9..b42dc8a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -118,6 +118,7 @@ set(SOURCES "src/formats_sup.cpp" "src/importer.cpp" "src/latency.cpp" + "src/hardware.cpp" "src/ins_names.cpp" "src/main.cpp" "src/opl/generator.cpp" diff --git a/FMBankEdit.pro b/FMBankEdit.pro index 40091fb..e73b065 100644 --- a/FMBankEdit.pro +++ b/FMBankEdit.pro @@ -122,6 +122,7 @@ SOURCES += \ src/formats_sup.cpp \ src/importer.cpp \ src/latency.cpp \ + src/hardware.cpp \ src/ins_names.cpp \ src/main.cpp \ src/opl/generator.cpp \ @@ -162,6 +163,7 @@ HEADERS += \ src/formats_sup.h \ src/importer.h \ src/latency.h \ + src/hardware.h \ src/ins_names.h \ src/main.h \ src/opl/generator.h \ diff --git a/build.bat b/build.bat index b9d95de..5fcefa4 100644 --- a/build.bat +++ b/build.bat @@ -33,8 +33,10 @@ IF NOT -%1-==-win9x- ( SET DEST_ARCHIVE=opl3-bank-editor-dev-win32.zip SET DEPLOY_FILES=.\bin-release\* IF -%1-==-win9x- ( - SET DEPLOY_FILES=%DEPLOY_FILES% .\opl_proxy\liboplproxy.dll + SET DEPLOY_FILES=%DEPLOY_FILES% .\opl_proxy\win9x\liboplproxy.dll SET DEST_ARCHIVE=opl3-bank-editor-dev-win9x.zip +) ELSE ( + SET DEPLOY_FILES=%DEPLOY_FILES% .\opl_proxy\modern\liboplproxy.dll ) SET DEPLOY_FILES=%DEPLOY_FILES% Bank_Examples SET DEPLOY_FILES=%DEPLOY_FILES% .\formats_info.htm .\license.txt .\changelog.txt diff --git a/opl_proxy/.gitignore b/opl_proxy/modern/.gitignore similarity index 100% rename from opl_proxy/.gitignore rename to opl_proxy/modern/.gitignore diff --git a/opl_proxy/Readme.txt b/opl_proxy/modern/Readme.txt similarity index 100% rename from opl_proxy/Readme.txt rename to opl_proxy/modern/Readme.txt diff --git a/opl_proxy/liboplproxy.dll b/opl_proxy/modern/liboplproxy.dll similarity index 100% rename from opl_proxy/liboplproxy.dll rename to opl_proxy/modern/liboplproxy.dll diff --git a/opl_proxy/liboplproxy.tgt b/opl_proxy/modern/liboplproxy.tgt similarity index 100% rename from opl_proxy/liboplproxy.tgt rename to opl_proxy/modern/liboplproxy.tgt diff --git a/opl_proxy/liboplproxy_exports.txt b/opl_proxy/modern/liboplproxy_exports.txt similarity index 100% rename from opl_proxy/liboplproxy_exports.txt rename to opl_proxy/modern/liboplproxy_exports.txt diff --git a/opl_proxy/modern/oplproxy.c b/opl_proxy/modern/oplproxy.c new file mode 100644 index 0000000..f1ad480 --- /dev/null +++ b/opl_proxy/modern/oplproxy.c @@ -0,0 +1,50 @@ +/* + * OPL3 chip interface proxy for OPL Bank Editor by Wohlstand, + * a part of free tool for music bank editing + * + * Copyright (c) 2016-2018 Vitaly Novichkov + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/* + Can be built by mingw-w64 + */ + +#include "InpOut32Helper.h" + +#define DLLExport __declspec(dllexport) +#define STDCall __stdcall +typedef unsigned short uint16_t; + +static uint16_t OPLBase = 0x388; + +DLLExport void STDCall chipInit(void) +{ OpenInpOut32(); } + +DLLExport void STDCall chipSetPort(uint16_t port) +{ OPLBase = port; } + +DLLExport void STDCall chipUnInit(void) +{ CloseInpOut32(); } + +DLLExport void STDCall chipPoke(uint16_t index, uint16_t value) +{ + uint16_t c, o = (index >> 8), port = (OPLBase + o * 2); + outportb(port, index); + for(c = 0; c < 6; ++c) inportb(port); + outportb(port + 1, value); + for(c = 0; c < 35; ++c) inportb(port); +} + diff --git a/opl_proxy/modern/oplproxy.dll b/opl_proxy/modern/oplproxy.dll new file mode 100644 index 0000000000000000000000000000000000000000..d3ec100ec020905163234fec73bf223ff69ee1ba GIT binary patch literal 12800 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 U#EMmRx+N@hA6e_DJS{=WbUDcX?G+i8;qp zXfIr{-Q&&ATN2pPwq=Rm)nQ$1UKaGU;dl8RW*BGrnk8#s9I)I1X&0I8xniyry#A;A z$rhKM{~s1e{qIHnCdM=nneIQ-axk}})uKIb!sQF?RkZifHUQR&7C_sHMmsZ@migM- z;7gr5a$DNkSaYkVeTCN}IjnqG@7wBf*!i%*CDr@rx_H)9%mb>(1l{xXzN_gj*GzT8`?Ubvn8nw zt`2*(ywuja{HU_qoZe;^C+_mIhXkaICU2|L+tTK0sp)KXwNtHxG_VqTTxe)>x!T#Y zLZi#S&Es`Su9P|0KM9R(0f@TV*%oxMmxVt{gpCTxdXK$SyBYh}6oiY#*duJCb6eof zjjm3*_iWN^^gv|@u#L4~?Ay%PJDQEC<6GGZ?Z%*&kFFP-n~~~Ru7Km^|FcvtxN(Mz ztry(eaqJlVSip(!#eN|m`P*>6Vh3sDZQj<-J`y_I?S79}ax>PLu@Z-jTgozDC*8Gh zG5TL`->A9u=9;?vJf6cr-UuH5-L@^z(d?I03OU%{)KGKlG({5p((`9$fvo9!Gu^4X z=w5y4xnzM$7Wm7xKo-geF8wpCR%^BOHmloumvyi8ed|Zo(^e*4DVB-NqF3w`e<;2v zzAW~MN5$jfm?-Ai^B&3z=f9CZmVdSFI$MryiLJ!8%yyHl(RQ27Y4g|uwoY4@?Lph$ z+P-Id%J!^nk8Q8*UE7H5-)vvlW)xgea81F&g0B^qvPfsY+J2q=2K(RGt#-S8sr?)F zTkN;nx7v@|Puhjz%ZeW>{&De##Tg|FN*pD(mh33`c1fheKEhsH1 ztt?$xx~bG%+Ftto(x*$GFa4L&H%pI{YRl%9m6WY3bCzu>d#LPtWj`u=p=@8-K-n+L zJ}sLpTVB4Vd`o$Ic}IDuTrS^N{%ZNL@+&IL6$>kJD+($qDqIzz3c2Dt6)#rouQ*vT zr&6q}sI0AQuH07HS$SXOBb857zEJs6CEUoYmg}un$$Gz4wmxkA(E5q>oOOmcTl|vP zBsxW(*dd0*N5rSZABjH|KNL@izZXq;H{^+VrFqNpYV*FEw>xi7UQgaDdD{Hk{2%83 zL;gSK@6SJgvpAgpe*Opfo&tZt-39j-yigz%f}a(&8=YV^TC=V5t!B)bL;ZL2SFF9( c0qY^_Th?Lg5rTKA|B9~Xn3!LB{^Bk0pA$Y%@&Et; literal 0 HcmV?d00001 diff --git a/opl_proxy/oplproxy.wpj b/opl_proxy/modern/oplproxy.wpj similarity index 100% rename from opl_proxy/oplproxy.wpj rename to opl_proxy/modern/oplproxy.wpj diff --git a/opl_proxy/update_exports.bat b/opl_proxy/modern/update_exports.bat similarity index 100% rename from opl_proxy/update_exports.bat rename to opl_proxy/modern/update_exports.bat diff --git a/opl_proxy/win9x/.gitignore b/opl_proxy/win9x/.gitignore new file mode 100644 index 0000000..7597e38 --- /dev/null +++ b/opl_proxy/win9x/.gitignore @@ -0,0 +1,8 @@ +*.lib +!liboplproxy.dll +*.map +*.lk1 +*.mk1 +*.sym +*.mk +*.obj diff --git a/opl_proxy/win9x/Readme.txt b/opl_proxy/win9x/Readme.txt new file mode 100644 index 0000000..a86d744 --- /dev/null +++ b/opl_proxy/win9x/Readme.txt @@ -0,0 +1,6 @@ +OPL Proxy - a small backend tool created for OPL Bank Editor by Wohlstand +to provide ability to test instruments on real OPL3 chip by running under Windows 98. + +On Windows NT family operating system this trick will not work. + +Build this tool by OpenWatcom diff --git a/opl_proxy/win9x/liboplproxy.dll b/opl_proxy/win9x/liboplproxy.dll new file mode 100644 index 0000000000000000000000000000000000000000..0656b99e6c0f1cc5f1b3f89b36138bbd21ca3ff3 GIT binary patch literal 27136 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 PX{Q-v{^$4KR097S`#;6S literal 0 HcmV?d00001 diff --git a/opl_proxy/win9x/liboplproxy.tgt b/opl_proxy/win9x/liboplproxy.tgt new file mode 100644 index 0000000..8aaa9e9 --- /dev/null +++ b/opl_proxy/win9x/liboplproxy.tgt @@ -0,0 +1,150 @@ +40 +targetIdent +0 +MProject +1 +MComponent +0 +2 +WString +4 +NDLL +3 +WString +5 +n_2d9 +1 +0 +1 +4 +MCommand +0 +5 +MCommand +0 +6 +MItem +15 +liboplproxy.dll +7 +WString +4 +NDLL +8 +WVList +4 +9 +MRState +10 +WString +5 +WLINK +11 +WString +25 +?????No debug information +1 +1 +12 +MRState +13 +WString +5 +WLINK +14 +WString +14 +?????Debug all +1 +0 +15 +MCState +16 +WString +5 +WLINK +17 +WString +13 +?????Map file +1 +0 +18 +MCState +19 +WString +5 +WLINK +20 +WString +24 +?????Eliminate dead code +1 +1 +21 +WVList +1 +22 +ActionStates +23 +WString +5 +&Make +24 +WVList +0 +-1 +1 +1 +0 +25 +WPickList +2 +26 +MItem +3 +*.c +27 +WString +4 +COBJ +28 +WVList +0 +29 +WVList +0 +-1 +1 +1 +0 +30 +MItem +10 +oplproxy.c +31 +WString +4 +COBJ +32 +WVList +1 +33 +MCState +34 +WString +3 +WCC +35 +WString +26 +?????Force ANSI compliance +1 +1 +36 +WVList +0 +26 +1 +1 +0 diff --git a/opl_proxy/win9x/liboplproxy_exports.txt b/opl_proxy/win9x/liboplproxy_exports.txt new file mode 100644 index 0000000..2959c2e --- /dev/null +++ b/opl_proxy/win9x/liboplproxy_exports.txt @@ -0,0 +1,30 @@ +Microsoft (R) COFF/PE Dumper Version 14.00.24215.1 +Copyright (C) Microsoft Corporation. All rights reserved. + + +Dump of file liboplproxy.dll + +File Type: DLL + + Section contains the following exports for liboplproxy.dll + + 00000000 characteristics + 0 time date stamp + 0.00 version + 1 ordinal base + 3 number of functions + 3 number of names + + ordinal hint RVA name + + 1 0 00001010 _chipInit@0 + 3 1 0000104A _chipPoke@8 + 2 2 0000102D _chipUnInit@0 + + Summary + + 1000 .edata + 1000 .idata + 1000 .reloc + 6000 AUTO + 3000 DGROUP diff --git a/opl_proxy/oplproxy.c b/opl_proxy/win9x/oplproxy.c similarity index 100% rename from opl_proxy/oplproxy.c rename to opl_proxy/win9x/oplproxy.c diff --git a/opl_proxy/win9x/oplproxy.wpj b/opl_proxy/win9x/oplproxy.wpj new file mode 100644 index 0000000..5d69d5d --- /dev/null +++ b/opl_proxy/win9x/oplproxy.wpj @@ -0,0 +1,43 @@ +40 +projectIdent +0 +VpeMain +1 +WRect +232 +110 +7872 +8400 +2 +MProject +3 +MCommand +0 +4 +MCommand +0 +1 +5 +WFileName +15 +liboplproxy.tgt +6 +WVList +1 +7 +VComponent +8 +WRect +416 +410 +5712 +4360 +0 +0 +9 +WFileName +15 +liboplproxy.tgt +0 +1 +7 diff --git a/opl_proxy/win9x/update_exports.bat b/opl_proxy/win9x/update_exports.bat new file mode 100644 index 0000000..76ea25b --- /dev/null +++ b/opl_proxy/win9x/update_exports.bat @@ -0,0 +1 @@ +"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\dumpbin.exe" /exports liboplproxy.dll > liboplproxy_exports.txt diff --git a/src/bank_editor.cpp b/src/bank_editor.cpp index c141af7..6fd7801 100644 --- a/src/bank_editor.cpp +++ b/src/bank_editor.cpp @@ -34,11 +34,15 @@ #include "bank_editor.h" #include "ui_bank_editor.h" #include "latency.h" +#include "hardware.h" #include "ins_names.h" #include "main.h" #if defined(ENABLE_PLOTS) #include "delay_analysis.h" #endif +#ifdef ENABLE_WIN9X_OPL_PROXY // to set hardware port +#include "opl/chips/win9x_opl_proxy.h" +#endif #include "FileFormats/ffmt_factory.h" #include "FileFormats/ffmt_enums.h" @@ -113,6 +117,10 @@ BankEditor::BankEditor(QWidget *parent) : ui->actionWin9xOPLProxy->setVisible(false); #endif +#ifndef ENABLE_WIN9X_OPL_PROXY + ui->actionHardware_OPL->setVisible(false); +#endif + ui->instruments->installEventFilter(this); ui->pitchBendSlider->setTracking(true); @@ -1209,6 +1217,32 @@ void BankEditor::on_actionLatency_triggered() delete dlg; } +#ifdef ENABLE_WIN9X_OPL_PROXY +void BankEditor::on_actionHardware_OPL_triggered() +{ + Win9x_OPL_Proxy proxy; + bool supportsChangeAddress = proxy.canSetOplAddress(); + + HardwareDialog *dlg = new HardwareDialog; + + dlg->setOplAddress(m_proxyOplAddress); + dlg->setCanChangeOplAddress(supportsChangeAddress); + dlg->exec(); + + if(supportsChangeAddress) + { + unsigned newAddress = dlg->oplAddress(); + if(newAddress != m_proxyOplAddress) + { + proxy.setOplAddress(newAddress); + m_proxyOplAddress = newAddress; + } + } + + delete dlg; +} +#endif + void BankEditor::onActionLanguageTriggered() { QAction *act = static_cast(sender()); diff --git a/src/bank_editor.h b/src/bank_editor.h index 06c2031..250b09c 100644 --- a/src/bank_editor.h +++ b/src/bank_editor.h @@ -119,6 +119,11 @@ class BankEditor : public QMainWindow QAction *m_midiInAction = nullptr; #endif +#ifdef ENABLE_WIN9X_OPL_PROXY + /* ********** OPL proxy stuff ********** */ + unsigned m_proxyOplAddress = 0x388; +#endif + /*! * \brief Initializes audio subsystem and FM generator */ @@ -433,6 +438,12 @@ private slots: * @brief Opens the latency setting dialog */ void on_actionLatency_triggered(); +#ifdef ENABLE_WIN9X_OPL_PROXY + /** + * @brief Opens the hardware OPL dialog + */ + void on_actionHardware_OPL_triggered(); +#endif /** * @brief Changes the current language */ diff --git a/src/bank_editor.ui b/src/bank_editor.ui index bc29365..fbe15bd 100644 --- a/src/bank_editor.ui +++ b/src/bank_editor.ui @@ -3544,6 +3544,7 @@ of second voice + @@ -3763,6 +3764,11 @@ of second voice Run delay analysis + + + Hardware OPL... + + diff --git a/src/hardware.cpp b/src/hardware.cpp new file mode 100644 index 0000000..694782a --- /dev/null +++ b/src/hardware.cpp @@ -0,0 +1,91 @@ +/* + * OPL Bank Editor by Wohlstand, a free tool for music bank editing + * Copyright (c) 2018 Vitaly Novichkov + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "hardware.h" +#include "bank_editor.h" +#include +#include +#include +#include +#include + +HardwareDialog::HardwareDialog(QWidget *parent) + : QDialog(parent) +{ + setupUi(); +} + +HardwareDialog::~HardwareDialog() +{ +} + +unsigned HardwareDialog::oplAddress() const +{ + return m_ctlAddressEdit->text().toUInt(nullptr, 16); +} + +void HardwareDialog::setOplAddress(unsigned address) +{ + m_ctlAddressEdit->setText(QString::number(address, 16)); +} + +void HardwareDialog::setCanChangeOplAddress(bool can) +{ + m_ctlAddressEdit->setEnabled(can); + updateInfoLabel(); +} + +void HardwareDialog::setupUi() +{ + setWindowTitle(tr("Hardware OPL")); + + QVBoxLayout *vl = new QVBoxLayout; + setLayout(vl); + + vl->addWidget(new QLabel(tr("Define the hardware address."))); + + QLabel *infoLabel = m_infoLabel = new QLabel; + vl->addWidget(infoLabel); + updateInfoLabel(); + + QHBoxLayout *ctlBox = new QHBoxLayout; + vl->addLayout(ctlBox); + + ctlBox->addWidget(new QLabel(tr("Hexadecimal address: "))); + + QLineEdit *ctlAddressEdit = m_ctlAddressEdit = new QLineEdit; + ctlBox->addWidget(ctlAddressEdit); + ctlAddressEdit->setInputMask("hhh"); + + QDialogButtonBox *bbox = new QDialogButtonBox(QDialogButtonBox::Ok); + vl->addWidget(bbox); + connect(bbox, SIGNAL(accepted()), this, SLOT(accept())); + connect(bbox, SIGNAL(rejected()), this, SLOT(reject())); + + adjustSize(); + setFixedSize(size()); +} + +void HardwareDialog::updateInfoLabel() +{ + if(m_ctlAddressEdit && m_ctlAddressEdit->isEnabled()) + m_infoLabel->setText(tr("Usually $388, varies depending on card.")); + else + m_infoLabel->setText(tr("Impossible to set the hardware address.\n" + "Make sure you installed the latest OPL proxy.")); +} diff --git a/src/hardware.h b/src/hardware.h new file mode 100644 index 0000000..6665bfc --- /dev/null +++ b/src/hardware.h @@ -0,0 +1,45 @@ +/* + * OPL Bank Editor by Wohlstand, a free tool for music bank editing + * Copyright (c) 2018 Vitaly Novichkov + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef HARDWARE_H +#define HARDWARE_H + +#include +class QLineEdit; +class QLabel; + +class HardwareDialog : public QDialog +{ + Q_OBJECT + +public: + HardwareDialog(QWidget *parent = nullptr); + ~HardwareDialog(); + + unsigned oplAddress() const; + void setOplAddress(unsigned address); + void setCanChangeOplAddress(bool can); + +private: + void setupUi(); + void updateInfoLabel(); + QLabel *m_infoLabel = nullptr; + QLineEdit *m_ctlAddressEdit = nullptr; +}; + +#endif // HARDWARE_H diff --git a/src/opl/chips/win9x_opl_proxy.cpp b/src/opl/chips/win9x_opl_proxy.cpp index 412785b..cc202c7 100644 --- a/src/opl/chips/win9x_opl_proxy.cpp +++ b/src/opl/chips/win9x_opl_proxy.cpp @@ -28,6 +28,7 @@ extern "C" typedef void (_stdcall *opl_poke)(uint16_t index, uint16_t value); typedef void (_stdcall *opl_init)(void); typedef void (_stdcall *opl_unInit)(void); + typedef void (_stdcall *opl_setPort)(uint16_t port); } struct OPLProxyDriver @@ -35,15 +36,18 @@ struct OPLProxyDriver opl_poke chip_oplPoke = nullptr; opl_init chip_oplInit = nullptr; opl_unInit chip_oplUninit = nullptr; + opl_setPort chip_oplSetPort = nullptr; HINSTANCE chip_lib = 0; }; template -void initOplFunction(HINSTANCE &chip_lib, FunkPtr &ptr, const char *procName) +void initOplFunction(HINSTANCE &chip_lib, FunkPtr &ptr, const char *procName, bool required = true) { ptr = (FunkPtr)GetProcAddress(chip_lib, procName); - if(!ptr) + static bool shownWarning = false; + if(!ptr && required && !shownWarning) { + shownWarning = true; QMessageBox::warning(nullptr, "liboplproxy.dll error", QString("Oops... I have failed to load %1 function:\n" @@ -70,6 +74,7 @@ void Win9x_OPL_Proxy::initChip() initOplFunction(chip_r->chip_lib, chip_r->chip_oplInit, "_chipInit@0"); initOplFunction(chip_r->chip_lib, chip_r->chip_oplPoke, "_chipPoke@8"); initOplFunction(chip_r->chip_lib, chip_r->chip_oplUninit, "_chipUnInit@0"); + initOplFunction(chip_r->chip_lib, chip_r->chip_oplSetPort, "_chipSetPort@4", false); if(chip_r->chip_oplInit) chip_r->chip_oplInit(); } @@ -88,9 +93,23 @@ void Win9x_OPL_Proxy::closeChip() chip_r->chip_oplInit = nullptr; chip_r->chip_oplPoke = nullptr; chip_r->chip_oplUninit = nullptr; + chip_r->chip_oplSetPort = nullptr; } } +bool Win9x_OPL_Proxy::canSetOplAddress() const +{ + OPLProxyDriver *chip_r = reinterpret_cast(m_chip); + return chip_r->chip_oplSetPort != nullptr; +} + +void Win9x_OPL_Proxy::setOplAddress(uint16_t address) +{ + OPLProxyDriver *chip_r = reinterpret_cast(m_chip); + if(chip_r->chip_oplSetPort) + chip_r->chip_oplSetPort(address); +} + Win9x_OPL_Proxy::Win9x_OPL_Proxy() { m_chip = new OPLProxyDriver; diff --git a/src/opl/chips/win9x_opl_proxy.h b/src/opl/chips/win9x_opl_proxy.h index 86ad967..dec74b6 100644 --- a/src/opl/chips/win9x_opl_proxy.h +++ b/src/opl/chips/win9x_opl_proxy.h @@ -12,6 +12,9 @@ class Win9x_OPL_Proxy : public OPLChipBaseT Win9x_OPL_Proxy(); virtual ~Win9x_OPL_Proxy() override; + bool canSetOplAddress() const; + void setOplAddress(uint16_t address); + bool canRunAtPcmRate() const override { return false; } void setRate(uint32_t rate) override {} void reset() override {} From 1b0545552a9be855565adee684de0876afc2423a Mon Sep 17 00:00:00 2001 From: JP Cimalando Date: Sat, 29 Dec 2018 16:15:53 +0100 Subject: [PATCH 02/11] provide the hardware proxy for all Windows --- CMakeLists.txt | 6 ++++++ FMBankEdit.pro | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b42dc8a..1d0df10 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -95,8 +95,14 @@ set(CHIPS_SOURCES "src/opl/chips/dosbox/dbopl.cpp" "src/opl/chips/nuked_opl3_v174.cpp" "src/opl/chips/nuked/nukedopl3_174.c") +if(CMAKE_SYSTEM_NAME STREQUAL "Windows") + list(APPEND CHIPS_SOURCES "src/opl/chips/win9x_opl_proxy.cpp") +endif() add_library(Chips STATIC ${CHIPS_SOURCES}) target_include_directories(Chips PUBLIC "src") +if(CMAKE_SYSTEM_NAME STREQUAL "Windows") + target_compile_definitions(Chips PUBLIC "-DENABLE_WIN9X_OPL_PROXY") +endif() set(MEASURER_SOURCES "src/opl/measurer.cpp") diff --git a/FMBankEdit.pro b/FMBankEdit.pro index e73b065..45f0c0a 100644 --- a/FMBankEdit.pro +++ b/FMBankEdit.pro @@ -91,7 +91,7 @@ rtmidi { DEFINES += ENABLE_MIDI include("src/midi/midi_rtmidi.pri") } -win32: lessThan(QT_MAJOR_VERSION, 5):{ +win32 { include("src/opl/chips/win9x_opl_proxy.pri") DEFINES += ENABLE_WIN9X_OPL_PROXY } From 1319a9fea849c23f103ae154091b4ca7d444c711 Mon Sep 17 00:00:00 2001 From: JP Cimalando Date: Sat, 29 Dec 2018 16:20:30 +0100 Subject: [PATCH 03/11] fix OPL proxy build for Windows --- src/opl/chips/win9x_opl_proxy.cpp | 4 +++- src/opl/chips/win9x_opl_proxy.h | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/opl/chips/win9x_opl_proxy.cpp b/src/opl/chips/win9x_opl_proxy.cpp index cc202c7..9a48f46 100644 --- a/src/opl/chips/win9x_opl_proxy.cpp +++ b/src/opl/chips/win9x_opl_proxy.cpp @@ -3,7 +3,9 @@ #include #include "win9x_opl_proxy.h" -#ifndef _WIN32 +#ifdef _WIN32 +#include +#else /* FAKE DUMMIES FOR ABILITY TO BUILD THIS CODE ON ANY OS */ #define _stdcall typedef intptr_t HINSTANCE; diff --git a/src/opl/chips/win9x_opl_proxy.h b/src/opl/chips/win9x_opl_proxy.h index dec74b6..597b13c 100644 --- a/src/opl/chips/win9x_opl_proxy.h +++ b/src/opl/chips/win9x_opl_proxy.h @@ -16,7 +16,7 @@ class Win9x_OPL_Proxy : public OPLChipBaseT void setOplAddress(uint16_t address); bool canRunAtPcmRate() const override { return false; } - void setRate(uint32_t rate) override {} + void setRate(uint32_t /*rate*/) override {} void reset() override {} void writeReg(uint16_t addr, uint8_t data) override; void nativePreGenerate() override {} From 0bf590e58c0f2dba749f1382122cdb7a85ddb147 Mon Sep 17 00:00:00 2001 From: JP Cimalando Date: Sat, 29 Dec 2018 23:49:30 +0100 Subject: [PATCH 04/11] add InpOut32Helper sources needed for modern OPL proxy --- opl_proxy/modern/InpOut32Helper.c | 110 ++++++++++++++++++++++++++++++ opl_proxy/modern/InpOut32Helper.h | 13 ++++ 2 files changed, 123 insertions(+) create mode 100644 opl_proxy/modern/InpOut32Helper.c create mode 100644 opl_proxy/modern/InpOut32Helper.h diff --git a/opl_proxy/modern/InpOut32Helper.c b/opl_proxy/modern/InpOut32Helper.c new file mode 100644 index 0000000..844388d --- /dev/null +++ b/opl_proxy/modern/InpOut32Helper.c @@ -0,0 +1,110 @@ +/* +* inpout32.dll helper functions +* 2013 James Alan Nguyen +* http://www.codingchords.com +* +* Do whatever you want with it. Made this while trying to port the OPL passthrough +* routines on VGMPlay, since PortTalk does not work under 64-bit Windows. +*/ + +#include "InpOut32Helper.h" + +typedef void (__stdcall *lpOut32)(short, short); +typedef short (__stdcall *lpInp32)(short); +typedef BOOL (__stdcall *lpIsInpOutDriverOpen)(void); +typedef BOOL (__stdcall *lpIsXP64Bit)(void); + +static lpOut32 gfpOut32 = 0; +static lpInp32 gfpInp32 = 0; +static lpIsInpOutDriverOpen gfpIsInpOutDriverOpen = 0; +static lpIsXP64Bit gfpIsXP64Bit = 0; + +static HINSTANCE hInpOutDll ; +#ifdef _DEBUG +static FILE *hwlog; +#endif + +/* +* Returns true if inpout32 failed to open (necessary for applications checking for non-zero failures) +*/ +BOOL OpenInpOut32(void) +{ +#if defined(_X86_) + hInpOutDll = LoadLibraryW ( L"InpOut32.DLL" ) ; //The 32bit DLL. If we are building x64 C++ + //applicaiton then use InpOutx64.dll +#elif defined(_AMD64_) + hInpOutDll = LoadLibraryW ( L"InpOutX64.DLL" ) ; +#endif + if ( hInpOutDll != NULL ) + { + gfpOut32 = (lpOut32)GetProcAddress(hInpOutDll, "Out32"); + gfpInp32 = (lpInp32)GetProcAddress(hInpOutDll, "Inp32"); + gfpIsInpOutDriverOpen = (lpIsInpOutDriverOpen)GetProcAddress(hInpOutDll, "IsInpOutDriverOpen"); + gfpIsXP64Bit = (lpIsXP64Bit)GetProcAddress(hInpOutDll, "IsXP64Bit"); + + if (gfpIsInpOutDriverOpen()) +#ifdef _DEBUG + hwlog = fopen("C:\\OPLSynth\\hwlog.log", "a"); + fprintf(hwlog, "Opened driver\n"); +#endif + return FALSE; + } + +#if defined(_X86_) + MessageBoxW(NULL, L"Cannot load inpout32.dll for hardware OPL playback.", L"OPL3_HW", MB_OK | MB_ICONEXCLAMATION); +#elif defined(_AMD64_) + MessageBoxW(NULL, L"Cannot load inpoutx64.dll for hardware OPL playback.", L"OPL3_HW", MB_OK | MB_ICONEXCLAMATION); +#endif + return TRUE; +} + +void CloseInpOut32(void) +{ +#ifdef _DEBUG + fprintf(hwlog, "Closed driver\n"); + fclose(hwlog); +#endif + FreeLibrary(hInpOutDll); + gfpOut32 = NULL; + gfpInp32 = NULL; + gfpIsInpOutDriverOpen = NULL; + gfpIsXP64Bit = NULL; +} + +void outportb(unsigned short PortAddress, unsigned short Data) +{ + if (gfpOut32 == NULL) + { +#ifdef _DEBUG +#if defined(_X86_) + MessageBoxW(NULL, L"Cannot write to register; inpout32.dll not loaded.", L"DEBUG", MB_OK | MB_ICONERROR); +#elif defined(_AMD64_) + MessageBoxW(NULL, L"Cannot write to register; inpoutx64.dll not loaded.", L"DEBUG", MB_OK | MB_ICONERROR); +#endif +#endif + return; + } + gfpOut32(PortAddress, Data); +#ifdef _DEBUG + fprintf(hwlog, "Write: %x, %x\n", PortAddress, Data); +#endif +} + +unsigned char inportb(unsigned short PortAddress) +{ + if (gfpInp32 == NULL) + { +#ifdef _DEBUG +#if defined(_X86_) + MessageBoxW(NULL, L"Cannot read register; inpout32.dll not loaded.", L"DEBUG", MB_OK | MB_ICONERROR); +#elif defined(_AMD64_) + MessageBoxW(NULL, L"Cannot read register; inpoutx64.dll not loaded.", L"DEBUG", MB_OK | MB_ICONERROR); +#endif +#endif + return ~0; + } +#ifdef _DEBUG + fprintf(hwlog, "Read: %x\n", PortAddress); +#endif + return (char)gfpInp32(PortAddress); +} diff --git a/opl_proxy/modern/InpOut32Helper.h b/opl_proxy/modern/InpOut32Helper.h new file mode 100644 index 0000000..2014065 --- /dev/null +++ b/opl_proxy/modern/InpOut32Helper.h @@ -0,0 +1,13 @@ + +#ifndef INPOUT32_HELPER_H +#define INPOUT32_HELPER_H + +#include +#include + +BOOL OpenInpOut32(void); +void CloseInpOut32(void); +void outportb(unsigned short PortAddress, unsigned short Data); +unsigned char inportb(unsigned short PortAddress); + +#endif /*INPOUT32_HELPER_H*/ From 03e55bb4963e6d9ccb44c3c9dfe2aa0d696d660f Mon Sep 17 00:00:00 2001 From: JP Cimalando Date: Sun, 30 Dec 2018 00:00:54 +0100 Subject: [PATCH 05/11] fix: enable loading on any Windows, and linker convention without lead underscore --- src/opl/chips/win9x_opl_proxy.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/opl/chips/win9x_opl_proxy.cpp b/src/opl/chips/win9x_opl_proxy.cpp index 9a48f46..e035f3d 100644 --- a/src/opl/chips/win9x_opl_proxy.cpp +++ b/src/opl/chips/win9x_opl_proxy.cpp @@ -1,4 +1,4 @@ -#include +//#include #include #include #include "win9x_opl_proxy.h" @@ -46,6 +46,10 @@ template void initOplFunction(HINSTANCE &chip_lib, FunkPtr &ptr, const char *procName, bool required = true) { ptr = (FunkPtr)GetProcAddress(chip_lib, procName); + + if(!ptr && procName[0] == '_') + ptr = (FunkPtr)GetProcAddress(chip_lib, procName + 1); + static bool shownWarning = false; if(!ptr && required && !shownWarning) { @@ -63,10 +67,12 @@ void initOplFunction(HINSTANCE &chip_lib, FunkPtr &ptr, const char *procName, bo void Win9x_OPL_Proxy::initChip() { OPLProxyDriver *chip_r = reinterpret_cast(m_chip); + /* QSysInfo::WinVersion wver = QSysInfo::windowsVersion(); bool m_enableProxy = (wver == QSysInfo::WV_98) || (wver == QSysInfo::WV_Me); - if(m_enableProxy && !chip_r->chip_lib) + */ + if(/*m_enableProxy && */ !chip_r->chip_lib) { chip_r->chip_lib = LoadLibraryA("liboplproxy.dll"); if(!chip_r->chip_lib) From e187e810ddb208b2935c362cb68d95ab7f1d55d5 Mon Sep 17 00:00:00 2001 From: JP Cimalando Date: Sun, 30 Dec 2018 00:06:06 +0100 Subject: [PATCH 06/11] proxy: fix confusion in modern DLL files, update exports list --- opl_proxy/modern/liboplproxy.dll | Bin 27136 -> 12800 bytes opl_proxy/modern/liboplproxy_exports.txt | 58 +++++++++++------------ opl_proxy/modern/oplproxy.dll | Bin 12800 -> 0 bytes 3 files changed, 28 insertions(+), 30 deletions(-) delete mode 100644 opl_proxy/modern/oplproxy.dll diff --git a/opl_proxy/modern/liboplproxy.dll b/opl_proxy/modern/liboplproxy.dll index 0656b99e6c0f1cc5f1b3f89b36138bbd21ca3ff3..d3ec100ec020905163234fec73bf223ff69ee1ba 100644 GIT binary patch literal 12800 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 U#EMmRx+N@hA6e_DJS{=WbUDcX?G+i8;qp zXfIr{-Q&&ATN2pPwq=Rm)nQ$1UKaGU;dl8RW*BGrnk8#s9I)I1X&0I8xniyry#A;A z$rhKM{~s1e{qIHnCdM=nneIQ-axk}})uKIb!sQF?RkZifHUQR&7C_sHMmsZ@migM- z;7gr5a$DNkSaYkVeTCN}IjnqG@7wBf*!i%*CDr@rx_H)9%mb>(1l{xXzN_gj*GzT8`?Ubvn8nw zt`2*(ywuja{HU_qoZe;^C+_mIhXkaICU2|L+tTK0sp)KXwNtHxG_VqTTxe)>x!T#Y zLZi#S&Es`Su9P|0KM9R(0f@TV*%oxMmxVt{gpCTxdXK$SyBYh}6oiY#*duJCb6eof zjjm3*_iWN^^gv|@u#L4~?Ay%PJDQEC<6GGZ?Z%*&kFFP-n~~~Ru7Km^|FcvtxN(Mz ztry(eaqJlVSip(!#eN|m`P*>6Vh3sDZQj<-J`y_I?S79}ax>PLu@Z-jTgozDC*8Gh zG5TL`->A9u=9;?vJf6cr-UuH5-L@^z(d?I03OU%{)KGKlG({5p((`9$fvo9!Gu^4X z=w5y4xnzM$7Wm7xKo-geF8wpCR%^BOHmloumvyi8ed|Zo(^e*4DVB-NqF3w`e<;2v zzAW~MN5$jfm?-Ai^B&3z=f9CZmVdSFI$MryiLJ!8%yyHl(RQ27Y4g|uwoY4@?Lph$ z+P-Id%J!^nk8Q8*UE7H5-)vvlW)xgea81F&g0B^qvPfsY+J2q=2K(RGt#-S8sr?)F zTkN;nx7v@|Puhjz%ZeW>{&De##Tg|FN*pD(mh33`c1fheKEhsH1 ztt?$xx~bG%+Ftto(x*$GFa4L&H%pI{YRl%9m6WY3bCzu>d#LPtWj`u=p=@8-K-n+L zJ}sLpTVB4Vd`o$Ic}IDuTrS^N{%ZNL@+&IL6$>kJD+($qDqIzz3c2Dt6)#rouQ*vT zr&6q}sI0AQuH07HS$SXOBb857zEJs6CEUoYmg}un$$Gz4wmxkA(E5q>oOOmcTl|vP zBsxW(*dd0*N5rSZABjH|KNL@izZXq;H{^+VrFqNpYV*FEw>xi7UQgaDdD{Hk{2%83 zL;gSK@6SJgvpAgpe*Opfo&tZt-39j-yigz%f}a(&8=YV^TC=V5t!B)bL;ZL2SFF9( c0qY^_Th?Lg5rTKA|B9~Xn3!LB{^Bk0pA$Y%@&Et; literal 27136 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 PX{Q-v{^$4KR097S`#;6S diff --git a/opl_proxy/modern/liboplproxy_exports.txt b/opl_proxy/modern/liboplproxy_exports.txt index 2959c2e..cb39f8d 100644 --- a/opl_proxy/modern/liboplproxy_exports.txt +++ b/opl_proxy/modern/liboplproxy_exports.txt @@ -1,30 +1,28 @@ -Microsoft (R) COFF/PE Dumper Version 14.00.24215.1 -Copyright (C) Microsoft Corporation. All rights reserved. - - -Dump of file liboplproxy.dll - -File Type: DLL - - Section contains the following exports for liboplproxy.dll - - 00000000 characteristics - 0 time date stamp - 0.00 version - 1 ordinal base - 3 number of functions - 3 number of names - - ordinal hint RVA name - - 1 0 00001010 _chipInit@0 - 3 1 0000104A _chipPoke@8 - 2 2 0000102D _chipUnInit@0 - - Summary - - 1000 .edata - 1000 .idata - 1000 .reloc - 6000 AUTO - 3000 DGROUP +There is an export table in .edata at 0x6fdc6000 + +The Export Tables (interpreted .edata section contents) + +Export Flags 0 +Time/Date stamp 5c1afcbf +Major/Minor 0/0 +Name 00006050 oplproxy.dll +Ordinal Base 1 +Number in: + Export Address Table 00000004 + [Name Pointer/Ordinal] Table 00000004 +Table Addresses + Export Address Table 00006028 + Name Pointer Table 00006038 + Ordinal Table 00006048 + +Export Address Table -- Ordinal Base 1 + [ 0] +base[ 1] 15b0 Export RVA + [ 1] +base[ 2] 15e8 Export RVA + [ 2] +base[ 3] 15be Export RVA + [ 3] +base[ 4] 15da Export RVA + +[Ordinal/Name Pointer] Table + [ 0] chipInit@0 + [ 1] chipPoke@8 + [ 2] chipSetPort@4 + [ 3] chipUnInit@0 diff --git a/opl_proxy/modern/oplproxy.dll b/opl_proxy/modern/oplproxy.dll deleted file mode 100644 index d3ec100ec020905163234fec73bf223ff69ee1ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12800 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 U#EMmRx+N@hA6e_DJS{=WbUDcX?G+i8;qp zXfIr{-Q&&ATN2pPwq=Rm)nQ$1UKaGU;dl8RW*BGrnk8#s9I)I1X&0I8xniyry#A;A z$rhKM{~s1e{qIHnCdM=nneIQ-axk}})uKIb!sQF?RkZifHUQR&7C_sHMmsZ@migM- z;7gr5a$DNkSaYkVeTCN}IjnqG@7wBf*!i%*CDr@rx_H)9%mb>(1l{xXzN_gj*GzT8`?Ubvn8nw zt`2*(ywuja{HU_qoZe;^C+_mIhXkaICU2|L+tTK0sp)KXwNtHxG_VqTTxe)>x!T#Y zLZi#S&Es`Su9P|0KM9R(0f@TV*%oxMmxVt{gpCTxdXK$SyBYh}6oiY#*duJCb6eof zjjm3*_iWN^^gv|@u#L4~?Ay%PJDQEC<6GGZ?Z%*&kFFP-n~~~Ru7Km^|FcvtxN(Mz ztry(eaqJlVSip(!#eN|m`P*>6Vh3sDZQj<-J`y_I?S79}ax>PLu@Z-jTgozDC*8Gh zG5TL`->A9u=9;?vJf6cr-UuH5-L@^z(d?I03OU%{)KGKlG({5p((`9$fvo9!Gu^4X z=w5y4xnzM$7Wm7xKo-geF8wpCR%^BOHmloumvyi8ed|Zo(^e*4DVB-NqF3w`e<;2v zzAW~MN5$jfm?-Ai^B&3z=f9CZmVdSFI$MryiLJ!8%yyHl(RQ27Y4g|uwoY4@?Lph$ z+P-Id%J!^nk8Q8*UE7H5-)vvlW)xgea81F&g0B^qvPfsY+J2q=2K(RGt#-S8sr?)F zTkN;nx7v@|Puhjz%ZeW>{&De##Tg|FN*pD(mh33`c1fheKEhsH1 ztt?$xx~bG%+Ftto(x*$GFa4L&H%pI{YRl%9m6WY3bCzu>d#LPtWj`u=p=@8-K-n+L zJ}sLpTVB4Vd`o$Ic}IDuTrS^N{%ZNL@+&IL6$>kJD+($qDqIzz3c2Dt6)#rouQ*vT zr&6q}sI0AQuH07HS$SXOBb857zEJs6CEUoYmg}un$$Gz4wmxkA(E5q>oOOmcTl|vP zBsxW(*dd0*N5rSZABjH|KNL@izZXq;H{^+VrFqNpYV*FEw>xi7UQgaDdD{Hk{2%83 zL;gSK@6SJgvpAgpe*Opfo&tZt-39j-yigz%f}a(&8=YV^TC=V5t!B)bL;ZL2SFF9( c0qY^_Th?Lg5rTKA|B9~Xn3!LB{^Bk0pA$Y%@&Et; From 661033213a343a6f8bd09f92c95ec6ad6e708560 Mon Sep 17 00:00:00 2001 From: JP Cimalando Date: Sun, 30 Dec 2018 01:49:51 +0100 Subject: [PATCH 07/11] permit to enter a base address with 4 digits --- src/hardware.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hardware.cpp b/src/hardware.cpp index 694782a..f8e000d 100644 --- a/src/hardware.cpp +++ b/src/hardware.cpp @@ -70,7 +70,7 @@ void HardwareDialog::setupUi() QLineEdit *ctlAddressEdit = m_ctlAddressEdit = new QLineEdit; ctlBox->addWidget(ctlAddressEdit); - ctlAddressEdit->setInputMask("hhh"); + ctlAddressEdit->setInputMask("hhhh"); QDialogButtonBox *bbox = new QDialogButtonBox(QDialogButtonBox::Ok); vl->addWidget(bbox); From d0871049999a36e6bbd1add56a0e9ab09f017b7c Mon Sep 17 00:00:00 2001 From: JP Cimalando Date: Sun, 30 Dec 2018 17:26:51 +0100 Subject: [PATCH 08/11] make the OPL proxy singleton for access, handled another case of win9x-only --- src/bank_editor.cpp | 11 ++--------- src/bank_editor.h | 1 + src/opl/chips/win9x_opl_proxy.cpp | 8 +------- src/opl/generator.cpp | 19 ++++++++++++++++++- src/opl/generator.h | 11 ++++++++++- 5 files changed, 32 insertions(+), 18 deletions(-) diff --git a/src/bank_editor.cpp b/src/bank_editor.cpp index 6fd7801..73b2645 100644 --- a/src/bank_editor.cpp +++ b/src/bank_editor.cpp @@ -25,9 +25,6 @@ #include #include #include -#ifdef ENABLE_WIN9X_OPL_PROXY -#include -#endif #include "importer.h" #include "formats_sup.h" @@ -109,10 +106,7 @@ BankEditor::BankEditor(QWidget *parent) : connect(ui->actionWin9xOPLProxy, SIGNAL(triggered()), this, SLOT(toggleEmulator())); #ifdef ENABLE_WIN9X_OPL_PROXY - QSysInfo::WinVersion wver = QSysInfo::windowsVersion(); - bool enableOpl3Proxy = (wver == QSysInfo::WV_98) || - (wver == QSysInfo::WV_Me); - ui->actionWin9xOPLProxy->setVisible(enableOpl3Proxy); + m_proxyOpl = &Generator::oplProxy(); #else ui->actionWin9xOPLProxy->setVisible(false); #endif @@ -1220,11 +1214,10 @@ void BankEditor::on_actionLatency_triggered() #ifdef ENABLE_WIN9X_OPL_PROXY void BankEditor::on_actionHardware_OPL_triggered() { - Win9x_OPL_Proxy proxy; + Win9x_OPL_Proxy &proxy = *m_proxyOpl; bool supportsChangeAddress = proxy.canSetOplAddress(); HardwareDialog *dlg = new HardwareDialog; - dlg->setOplAddress(m_proxyOplAddress); dlg->setCanChangeOplAddress(supportsChangeAddress); dlg->exec(); diff --git a/src/bank_editor.h b/src/bank_editor.h index 250b09c..da66076 100644 --- a/src/bank_editor.h +++ b/src/bank_editor.h @@ -121,6 +121,7 @@ class BankEditor : public QMainWindow #ifdef ENABLE_WIN9X_OPL_PROXY /* ********** OPL proxy stuff ********** */ + Win9x_OPL_Proxy *m_proxyOpl = nullptr; unsigned m_proxyOplAddress = 0x388; #endif diff --git a/src/opl/chips/win9x_opl_proxy.cpp b/src/opl/chips/win9x_opl_proxy.cpp index e035f3d..ba37387 100644 --- a/src/opl/chips/win9x_opl_proxy.cpp +++ b/src/opl/chips/win9x_opl_proxy.cpp @@ -1,4 +1,3 @@ -//#include #include #include #include "win9x_opl_proxy.h" @@ -67,12 +66,7 @@ void initOplFunction(HINSTANCE &chip_lib, FunkPtr &ptr, const char *procName, bo void Win9x_OPL_Proxy::initChip() { OPLProxyDriver *chip_r = reinterpret_cast(m_chip); - /* - QSysInfo::WinVersion wver = QSysInfo::windowsVersion(); - bool m_enableProxy = (wver == QSysInfo::WV_98) || - (wver == QSysInfo::WV_Me); - */ - if(/*m_enableProxy && */ !chip_r->chip_lib) + if(!chip_r->chip_lib) { chip_r->chip_lib = LoadLibraryA("liboplproxy.dll"); if(!chip_r->chip_lib) diff --git a/src/opl/generator.cpp b/src/opl/generator.cpp index 8a0cdfd..45fc1b5 100644 --- a/src/opl/generator.cpp +++ b/src/opl/generator.cpp @@ -220,6 +220,15 @@ Generator::Generator(uint32_t sampleRate, OPL_Chips initialChip) Generator::~Generator() {} +void Generator::OPLChipDelete::operator()(OPLChipBase *x) +{ +#ifdef ENABLE_WIN9X_OPL_PROXY + if(x == &Generator::oplProxy()) + return; +#endif + delete x; +} + void Generator::initChip() { static const uint16_t data[] = @@ -242,13 +251,21 @@ void Generator::initChip() Silence(); } +#ifdef ENABLE_WIN9X_OPL_PROXY +Win9x_OPL_Proxy &Generator::oplProxy() +{ + static Win9x_OPL_Proxy proxy; + return proxy; +} +#endif + void Generator::switchChip(Generator::OPL_Chips chipId) { switch(chipId) { case CHIP_Win9xProxy: #ifdef ENABLE_WIN9X_OPL_PROXY - chip.reset(new Win9x_OPL_Proxy()); + chip.reset(&oplProxy()); #endif break; case CHIP_DosBox: diff --git a/src/opl/generator.h b/src/opl/generator.h index 1c1c2d2..10d5566 100644 --- a/src/opl/generator.h +++ b/src/opl/generator.h @@ -27,6 +27,10 @@ #include "chips/opl_chip_base.h" #include "../bank.h" +#ifdef ENABLE_WIN9X_OPL_PROXY +class Win9x_OPL_Proxy; +#endif + #define NUM_OF_CHANNELS 23 #define MAX_OPLGEN_BUFFER_SIZE 4096 @@ -152,6 +156,10 @@ class Generator static uint32_t getChipVolume( uint32_t volume, uint8_t ccvolume, uint8_t ccexpr, int volmodel); +#ifdef ENABLE_WIN9X_OPL_PROXY + static Win9x_OPL_Proxy &oplProxy(); +#endif + private: GeneratorDebugInfo m_debug; @@ -209,7 +217,8 @@ class Generator uint8_t rythmModePercussionMode; uint8_t testDrum; uint32_t m_rate = 44100; - std::unique_ptr chip; + struct OPLChipDelete { void operator()(OPLChipBase *); }; + std::unique_ptr chip; OPL_PatchSetup m_patch; uint8_t m_regBD; From c61cc82efc3598964496c2cc749f7ac112121c90 Mon Sep 17 00:00:00 2001 From: JP Cimalando Date: Sun, 30 Dec 2018 17:50:01 +0100 Subject: [PATCH 09/11] deploy inpout32.dll, version 1.5.0.1 --- build.bat | 2 +- opl_proxy/modern/inpout32.dll | Bin 0 -> 98304 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 opl_proxy/modern/inpout32.dll diff --git a/build.bat b/build.bat index 5fcefa4..d99f27e 100644 --- a/build.bat +++ b/build.bat @@ -36,7 +36,7 @@ IF -%1-==-win9x- ( SET DEPLOY_FILES=%DEPLOY_FILES% .\opl_proxy\win9x\liboplproxy.dll SET DEST_ARCHIVE=opl3-bank-editor-dev-win9x.zip ) ELSE ( - SET DEPLOY_FILES=%DEPLOY_FILES% .\opl_proxy\modern\liboplproxy.dll + SET DEPLOY_FILES=%DEPLOY_FILES% .\opl_proxy\modern\liboplproxy.dll .\opl_proxy\modern\inpout32.dll ) SET DEPLOY_FILES=%DEPLOY_FILES% Bank_Examples SET DEPLOY_FILES=%DEPLOY_FILES% .\formats_info.htm .\license.txt .\changelog.txt diff --git a/opl_proxy/modern/inpout32.dll b/opl_proxy/modern/inpout32.dll new file mode 100644 index 0000000000000000000000000000000000000000..8889280046028c78b7a379a7e284399b6e1ab0c4 GIT binary patch literal 98304 zcmeFae|S{YwLg3&Gf7Th!WlGy$S((pibg3KP~s2_k_kZxPKcQ}LIU1GI*zoZ@f^S_ zfuv_bbFvxb-qQQhZ)poR^nU3r@4d9ON?VH)1`|+Jet4A%*G8M_4ns8*OajE5?`Q2Z zlLWo(z3=nB&-4Bx4|C4hzt&!R?X}k4d+oJ%${yP$*(FJG;AfhWbO3MqS0tW)`_YNy zF*p8ZjP!iQ>r)Td7Qa6Ak>C?gx!2Zx^J{gFf8G7n$G`E7Z>sLUTkWpXzTtl28}8zV zE8JiI=Bm{*GBZczCO}{Pw;wKf`OS-ylfNAq&rbe#gm+~8X!84bZ;bxib^>GYw>d>+T24C!~cp1 zUft?7-$cf55FF4za^t-c?-BosB!7o3*q`;RH_>ux&Qs7Gpd`W>XDexr)zNEmH z6!?+?UsB-z1qJlNy**gVsZ)bHelEGp?9%;`Yd1yt%xoXNJ5ohDYKR@9f91OyK9O8H zx2eT=Xp34F=Q=}D)+WaWnDiZUL z@mHLZ)OeW69dZET)?8Y5=0|;mKq^p^m$GcCJY;Jw&K(1coW4*>t+6;aiybKsI)Kqq z3!|o}cAJ@91l)YV=Rpo+bp>G*k$l{XI`qS?$l_cX=o6J{l@}bj!$=fei^O(;L?Zco z{xRf^@<}7}2y&vmE|?L9+v`NgUllx0wTE-F(2$@54_&7`R0)3vkrfC}qHL#| z&ZrxLZ=vWgRK6DVBx(l9sD7%92dwJR-BKupo3sS4Ok zM*^5;ajvV}SK&9a=OT<3@!PWC{gOh^Bs1HQD6idOb&B4fsx1*L6hm+l@nr4pV}@B)-5R(?ZfxVwdS) z)!X^ksIlSPNkn*HIY~6QoUcJuptWeMKoJGqOG7ra+!i!#iX^&CJkS~$*vB0Z2ALH) z@$EC;@tf}e@hsrFq9*@Xew2?MM&4ov@B<|e^8+;u{LoKmhI4b09q;2l6ixC&ZZf)@ zAAv3Dzu|}AHT>`b2=fJg*p0}M{Gf!NMa<`UVmaypPf+b6dBRK4kK|5Y%I}AbO+P$I z5bUpW$8E$NxkEVo4dwt;*HV5touE4Y=bS<`1gHE6*fbs{^2T-(qp(cDDcOQkAnCh@ z8KpSaP3%$2G6koAZ(6birxfSj8j_$`7U$m4{7CK$UTBek1hSmCL2$}a{(xxsNKPrv z&Gn7s6zWjXtAC4Aa)4`sQ{G3T6UZkx#d`VKY!Z`Usd*bp?7<;<(dtPc8-zT)&7iy} z=q`t-yAr~sE~7+X0qY-hfwmZ*#I6U(;#m_T{VaHU>Bur5!iX|{Ei+MuEXg%7E07

HRkK)BNb?$D4;p@u%G#4G1NV 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 z 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 Date: Sun, 30 Dec 2018 18:02:41 +0100 Subject: [PATCH 10/11] following a change of HW address, resend the program --- src/bank_editor.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/bank_editor.cpp b/src/bank_editor.cpp index 73b2645..bbcab00 100644 --- a/src/bank_editor.cpp +++ b/src/bank_editor.cpp @@ -1229,6 +1229,7 @@ void BankEditor::on_actionHardware_OPL_triggered() { proxy.setOplAddress(newAddress); m_proxyOplAddress = newAddress; + sendPatch(); } } From 7462cf4b80bd0803bf63a402b775ae250192d00e Mon Sep 17 00:00:00 2001 From: JP Cimalando Date: Sun, 30 Dec 2018 18:19:29 +0100 Subject: [PATCH 11/11] proxy: also reinitialize the chip on port change --- src/bank_editor.cpp | 7 +++++++ src/bank_editor.h | 5 +++++ src/opl/generator_realtime.cpp | 12 ++++++++++++ src/opl/generator_realtime.h | 2 ++ 4 files changed, 26 insertions(+) diff --git a/src/bank_editor.cpp b/src/bank_editor.cpp index bbcab00..1ec4b4c 100644 --- a/src/bank_editor.cpp +++ b/src/bank_editor.cpp @@ -1076,6 +1076,12 @@ void BankEditor::displayDebugDelaysInfo() .arg(m_curInst->ms_sound_koff)); } +void BankEditor::initChip() +{ + if(!m_generator) return; + m_generator->ctl_initChip(); +} + void BankEditor::sendPatch() { if(!m_curInst) return; @@ -1229,6 +1235,7 @@ void BankEditor::on_actionHardware_OPL_triggered() { proxy.setOplAddress(newAddress); m_proxyOplAddress = newAddress; + initChip(); sendPatch(); } } diff --git a/src/bank_editor.h b/src/bank_editor.h index da66076..42dc6fa 100644 --- a/src/bank_editor.h +++ b/src/bank_editor.h @@ -231,6 +231,11 @@ class BankEditor : public QMainWindow void displayDebugDelaysInfo(); + /** + * @brief Reinitialize the OPL chip + */ + void initChip(); + /** * @brief Send current instrument to OPL chip emulator for to test */ diff --git a/src/opl/generator_realtime.cpp b/src/opl/generator_realtime.cpp index c2a7805..386d2da 100644 --- a/src/opl/generator_realtime.cpp +++ b/src/opl/generator_realtime.cpp @@ -24,6 +24,7 @@ enum MessageTag { MSG_MidiEvent, + MSG_CtlInitChip, MSG_CtlSilence, MSG_CtlNoteOffAllChans, MSG_CtlPlayNote, @@ -113,6 +114,14 @@ void RealtimeGenerator::ctl_switchChip(int chipId) m_gen->switchChip((Generator::OPL_Chips)chipId); } +void RealtimeGenerator::ctl_initChip() +{ + Ring_Buffer &rb = *m_rb_ctl; + MessageHeader hdr = {MSG_CtlInitChip, 0}; + wait_for_fifo_write_space(rb, hdr.size); + rb.put(hdr); +} + void RealtimeGenerator::ctl_silence() { Ring_Buffer &rb = *m_rb_ctl; @@ -294,6 +303,9 @@ void RealtimeGenerator::rt_message_process(int tag, const uint8_t *data, unsigne case MSG_MidiEvent: rt_midi_process(data, len); break; + case MSG_CtlInitChip: + gen.initChip(); + break; case MSG_CtlSilence: gen.Silence(); break; diff --git a/src/opl/generator_realtime.h b/src/opl/generator_realtime.h index 088bb96..166d008 100644 --- a/src/opl/generator_realtime.h +++ b/src/opl/generator_realtime.h @@ -46,6 +46,7 @@ class IRealtimeControl : public QObject IRealtimeControl(QObject *parent = nullptr); virtual ~IRealtimeControl() {} virtual void ctl_switchChip(int chipId) = 0; + virtual void ctl_initChip() = 0; public slots: void changeNote(int note) { m_note = note; } @@ -119,6 +120,7 @@ class RealtimeGenerator : public: /* Control */ void ctl_switchChip(int chipId) override; + void ctl_initChip() override; void ctl_silence() override; void ctl_noteOffAllChans() override; void ctl_playNote() override;