From 691bdc5039d7ca51a5e65c081366171f4eab5ab8 Mon Sep 17 00:00:00 2001 From: JP Cimalando Date: Sat, 29 Dec 2018 15:10:19 +0100 Subject: [PATCH] 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 zcmeHv3wTsTw(jmuCp4i$2TVgmkOmtE1hJnplq2GTLXkird=>_4|nPtUA zo}w_1;8h@AmJLEe&?yMbv*r{mTAGi*WB`1)h}O-x2K}5!p6Qb5aqu48Nl3TySpUrl zk~7_|^2)VgP&1xtTx-Jd@WUwx*+U`!6Z`*70&fJr-GN^}+og#JO0VHoxNP}S_Qkg2 zq)6=e&u>|MQ$SAq-9Je*P|n&xiSY<)|CXE3(x+y*m&Dvlislkgr}8-kMJro+M*Fv= z2}nL8bpWqDw-0xr#Q)2_nCg)n+=6&0w=Wn3Vj@AD(i1~5uL)y56v34FY=y1{?wMs! zNyCsJBG9T5^3(QJkDI>lT-UPvkWLRC#NHKYF{?MkNMu<8D;m{+HIXTl5^>KjL_W>l zOQBGRjUT@)NPYBry4}@#(+VOd9YIol!z_b(y2|i?=v0NekylvETIxF4!LL>ZD28s$ zTBkQ3Ulr)N26BvwcM6NDTowA|MV_^l>-9M|G#G3yJw71u8*Tkq0WZ?5*Z*3Z=E zSGqlAl@-?tYNn~g^EOt~cazIfSk z|8X^IWAB>|u@Ec7VSPO@QG(FmqY?^HL3Vii5h)5rv$ok2weqF_JHk37Kg5A>1h3&f!WNrlSx0|` zNT6YsUf4ArVwOoY6bRzcKse0N8=M08XYK6c-Rd1qf$0cYx)QAz(#-<5yPFUnl-%-}dYv%5b@v+pFkL6^AzeO-Yl{ChG0+}e2M{4j&w;u2=m!v`q>wHJ zSW+?+khRt)?p6WCcX6_3g6U9w{MozTxymUhJyQoqCOd<@&eTND2w#feiE;W;CVRi3 z;8AC=tLBjBU1xCL?iyZxIw;pRYio+Yxin@tl~5uk?iNr)i63Q598A_aIFjsdRtCSq ztt2hcqb>1+{BVl-QP@cyeTOjK;K4QuzSx*Q8sgr8f@?$G;f>TSZdtuDz=d3zc)wFv z#zh>K%J>H$rr!4G?ZBr*={Fdq+M^#vl#=?hqkRh(7c5)4i{w(Kp^aT!jo}8T|7`o3Iy$! zj$I)@yFHOwH2HZ$qJ`oxqosQu2)f#a?MR9*vVos$V079KdKK{g6IE9M!%l zqNGbE3#>)5L(}~ZQc%J3Gr!|jpbK8D>F8oMf%G+`GoZ*OEeM#JLpn+hekQ%E6CyCF zix;zm5)M4Ca|$!ZKzneF91Hot>WUsig1FU?D3%+>`$JJ1*RZ~jq1Fe?rOTH|7m&M& z*kgf4vak{Z!0$LiY-nqjqp75azC%T22Bh1O${Rqs<0?V!eh}t^<51H$1NxEN$ygT| z_*RWz>XXhR4L$oSDy#vyA-zcIF3REDO?Q8v;?6OU-c46?>=CA;{aA8wze9~7^rKf& zx_59oJIz{UoRP4vDC(G`<7E!PYNQHCH-m~a2b_m%=$Q<*LOQA~sOoqvrF*ETLFMzt zn@l+yz@6NpRGZfTVgYobS`FHe3sJg}V3GO}(xV(n<}U+m4NjB`?)hJkFPNjB&rwW* z_ePnT1G1?p$bTakvwT_JtlUMMh<~3tJQff>^q;k)MVBJe#^Jl@LFygS%}0oJh`Mq- zTe_9Chr9-DYi;>VsW{?n zSE8CBf2+#g;XcJC5N#GmWuo5>rZUJLQ~wkv5DsgTxsqe1L$yaYj1=RDhN;<~t_XQE z?MK{8Sm!%^icTlvS){8`oQ$6~A$}XGIE8h}c~B?&k?JXw(KFHCtjZ4dX5#@8e+m8# zHBg}ja?aoz0AAfhoXb>YX2VQ%a&sWlWSz{qEqG+`2(km??Jh3E&y?*dUj0>(-g_U( ze^9!pQmzWXUO>O!^Y-6VmNK4^HD%s=k_&!w_fP!Mey6K^ImaE3PNC!lnhmv+x z;g05$%xHZXwwpjqv!fwfv72xP=UQB_iv%q_3EQ^rtUPYBR`jW8e_zNOEtP{m>1WVa zsum6Wl<1uzEg`s;;Nb}Y&y;{n9<6i^#8#~gP~^Sf2hvo+Jto6QKbCWmfXrOKgIE(h zcGFS6gIE*poM1Z3t01PwEcdsmazZ){7bc}{{emY+_bACU@M_%>G4IuYF|Pi>X9nrx zZc@ca3&Q@Q{ldLxnA`~h(lan31SL6ah?bhh6CuhLMi|ulFh8SN?SA$i`$V2VVCGQb z5PWW3qZ$lI>#4(2OI-nbxH3?JP#m`01}DyVuE$&cPMBV`Z7l#r5yAl@nZaHpMD_E(tPUqbMNG3 zVRH2zj3{roVXTuR7GUkm#g>*H<>{yDJA9u;oqqC`aDt$S{G#X=i3~hrHA8m^V*Z;RaGO(>uHabtk3WWlLg7gTMG^~ZXgp@%RwS#(Fgh|q8 z)`kX;=8727S)n*$oE0Nn?E!5~HSp{wH_j0iiVl14hRjA4lx+JE+0wJuG5+l(k{mxR zPL0Iscrhy>En0)%hUne&2LP(M2;=Z*(ZBXgv^XB|4HIFBd{0T&WDj<`k2*ufcS`Xc5bgSTf8XAyZUEzB*j zm}kzKKVMi<>e820RD0aswX_(~7kTu?O~&v~zqZI*?JCw6>5I!YlvPvun$7wxE_bEA zq`b1oQ&w@CzN)gU!V~M-wANKc1ZKtxvkUc(K{SLceU%&8%U!pD)Znr<7FFwAn_O$X z9xB75FDfo}yQ-@PF#u{C-DMt+i|BqoSzlC99J{utqN38HUt3uLe!MOq{?t0TDk|OU zi^}ztRW3Iu{aBrHE~}HqB;r~o)&X9V=qOGbuMQd*#$jjTP0=22|xZFR|Oof*b%FW9k zsst5idJj~<&2_2R)vrlEwS*t9w%b(#{wmgj#c&GiZ>i;PrWc_X1uVjOIAoa_itiELxu1!U2J^BqrlZSTVGPnJs6$*`XrR*B+?zxp_C^R$d4jsZ2X9!Ms!iD)2EuTLz9f)`%1n-50s^RtH>Jn>? zdJPy##D{iJtAu4j%MvQEc*l!%kA< z-{ca+L$tnyPZ84u@i{{xJr)S!dX>-Nz=$h&w5H~5`zRH2qnqGnYl|khLegQ-LJ6Nr zH)AlTdFlIYDuW;@96R9C*7_Tjg5YT2!PqDSF(zY?HyXjFF_Td3ZgHhXngkl~chwk( zetyGNc<%ZqS&QNS(!l=}c6{xvGLT5gL)P@at|03+~^Ivj>PNsw&>DF{QJBS=tH1gX}`1RDu*fxIMV!;ofzNCe5ADC4|BkoO3( zHjL9jkbQulP!$zAw<#1Z^kGVRhLC?2F7yF{JVcNRXe}D%akL=Z#snD`Cb*p-)qwnG zWKGr9);tIjO@EwBCA^B(M#m8U$m=^EWY6uV<-4}_DWo(VJQ_E)#KB z{smy~O-;_p0G&o19PlLokHp@zUzRvJhYBf8E9Ev`nJ9g85q^Ws34(WCQvnB>j`ol< zyeS#t=y{GpU!(ncen+9JDD*Ie-U4pVy%gF;p&AOcQo&m&^a^irP`ZO+cT%o36uOSM zT|pr&aG?`dN?w%T)J7Oiz?szaYosKJF74sO>A>Gqp z2>u0atq%y8vvVh5#6N_sm9w)aDLuoQ>QP4U(I$}|_c!_JvAyY6^r&sB!K3FFFk(%$ z6uN`v@w2Cvi0YiqgdR&6@J$3T8Gw4V z@BC5k>iW3~-={|3`FL-16O5{GRsi4g5vX@6490Y$wl)(HaiM*S<76G-_6X^SMz|5YiCO;hnmb?a@c^YnoUJ!D z`#!&`gw58&akWnkVWY{kwRa&k0vI&@!96FthuPdEre@QjVkn)0b+l)x1gK0gQ$nr6 z=(K+UZ;u{Di_RrbKCK*ScP>FKgjE4iKz^pY3`%MJKlq>g$MxibS~s3=(cor)0>21- z5fcowc~v6D(MCqp5`zY9D)_3$L<>eis6FaYvM9L7_5OW&a!k47eU4@zs;Y-Y3wnhR z{0Mk>yvN3bF;FU;|6WBP6d$g`4qE@#wY~b}-SByD$Bmt=J7sU%FwU2v^o*$Aq)55o zR$)u)g12}eL1@(sU=+I67gd#3 zx?NZ>VFUYidDgViU5WK*<;Dt^TUc6Aw5Hsp_f+bO%7Ibj!M0m}CcZfyZeH#$jI=e6 zz{5xK+O_j>>dekx>TmB#Y^YLf3*@8oGaG>mL%MP_9bAPp_i9Q6XS|n7hsk1)XGzO9 z85>W{a0=4%pQ8`!o|u<8st&cJq!)jOQI%=3wr{X5!a$ z*6$$RggX=W5~qc;L%Q)~j{=EloawD6IJe>XB*!P7ggd93j`G69gs1|4KqY6BA+w?` z&6ZyMDilhy5$@La#R;70quw|oCUYSk!rp=OFtB8CQ15Q+q?*5Y3^lLTEM(OhPmH{O zBTiq+s$nXtz*_%~PNNeH_xv9DWQuY;2886ezgyeVt%~+N1}q=22FJS*Z}fq=o)Uz@ z`FXr;AYO%>!8|z;JCcnQA6(w8ls;`Bo#H)Yk;C+MfPR0fc$DP5l)<6zBrRx5%Taq$ z{l8EN-l>iG$SHjYwdV1W(w{Isx98AgRA5nZ>P&)uB7jR%l0J{IE$(B>>qusW(Va=d*- zI7e83SbqRB*0-quCV$QGP$)qBiW7)W|HY6;hg)Q6!#I>WSxEOVuRzH*2iZwDbGssj z@NLR<(0@_6aleco!43Wc^?nT5+M|g$8igF*=--PA{0>KYK1`>79E1bK&DHZH#bld=r4A3(YJ2zO<;R)f%a`)_m5 zkkxxbzZI9R#dJ&LyY21KOQ5Etlem z5_oDlLcJX3L@1ua<|E|fp?rk)@KB_tvf!wFmvIx)L>42Yqe2?$slKxKcCb!=YrG7% zAM~E&-A#^4pI*Q=$b2*rwl2n_04X0~ZeL^sZaTt2vJy@D>mx<*-u>!8oav~>Oh>h4 zoC#*5S~45eklCnq%tken(x}vH(ScEe0FJ|PPvYQ1B=8sD2#FhBI66TRK3}IVu5?v% zA7iz*stTt`;H-i3q?FvUa6)4ED=mT>u)+lgY~@<=tkQU>pA|l;H=mB`&6khr5vpf^ zUTM(=7ci?`RYh(ZJ88t!S63CSg;%H2t#_f2a9J37!^FAc6~_X9kUSk1EGMVwX1Hkd za4N&iks2Fm53;ArS@__=bFj6vqelBL@==66PhdEEwbbeqUVHJkByCD+i>9!!9LxJX z!l~yM)yLEgOBX!x^|KZJHf7x$g}+^yE_kI|UL}G*0d0@vr=YD9N{OB2#Gwjo@UAKE zZ=nx`e`vxXKVHA3{^Kgv4s)=~-}mmu#SNt+{9p9>zm2bs{x@_tkR#n7UxMjS+Vy;A zVNU-J!3}Wa=lRkNm_Yl0%lf2ev}B&NH4IV86nvegxhi;6$Xc>EA|P)K1Oui6L*joC z??_;L@4^0^d;H~_9evW(DwIGQh{iMQ!~#HpvYJ5_PudLTA(NNhM_jYKRkD6@LiV42eS4~)O;9Y}Lt z?IF)1={g#L+As|zMLOL?F17a5A zXkV1YJ-G|UL4f0BwD20DRt0;lC53qgy{r%@Y^8U*E z>qkr{Q0H43R*bL*+$-4ozGHo2c7p#R4BB2)K(GfkW{ZpB#W@=L>l-o~HtNNA`{9ia zwkUqukET((Mu|BZdyCe809>cdRc%-aiejqbeep{B+uGVAfJTjDGS21U* zy~Vv#ymP!bJJEEg;TFZY(=1@`tNt0{)A|%g?R^`HXwz4WKii7wFkD*hojDcxQ>MsmXt`xPT7H(cIDRC`C69c@q4Navr#WQfMxTi4VqB9|~L-g(EeJ zQiOb^bJNMXBw(Q3O&Nn7gK?CE<1BR!;1JD01m)Hj4@u-u+eHLu_AefgZl^dQ2S7m( zj(#RTc?35)|LX4>M#pPZUL8DDnm4O}%o6tV2U#DoPEqoBCeDvq5gz20M6KYq=Q8_< zF4j+OxTyL&QHhL(;;haULr*V>&6neQhT`9RIX>8xI#4Bhs|Q082AvLxAsX>v?H~se z%%#VSUVs%3wp<#?c1guR;@0eh9RD0sWd8-F=R^O6DDOlW5l3G!KMf;#qbM(df`@o3 zBMONY$k}QC28aH5j^PLssc0ezo_s|pzLt|5Edp52QcXJ9PD7|aPSzPz)*VF zUXwm4wi^9?n!BdAM}Llb=rf%HKW~Krr9-MmcImGu3l$wN9j8LOkh^g>@$k2^pdEz} zAW}RDnbJUcy3;AF#bx}7ms~sS&r$uP5|r7nm}+-n#KwY<;lVDjL@kwx`gz7-K}~D% zC{Mgx#}4TW8t6JghxvXIhMj214@PAb(L|3?j4*i463mo8VpAb-DM!c4sQs3L;!_r`W#E{5)NZ8x+6=^3;vBOTzTdCj! zKo_gk>}&B}^7~vq*=*0@hsN0L>RsJv@TG0J1q#{a)0SH(6tY^%Bs&>GI&vBCai2Pn zcolZBYnMUmdsg8l^C0G^rE{mlY&5ROuWLx_ZBUO@h1 z+F&4Yi#+pQF6~2}tJCJGyw~`*XatX1%vMWlK|_Rt9|mLvf^rE|Yj#*1jh)HP0m$G6 z#eM|Q=G?(x#9`XhmR+b2iT~5#ED;Tm$6uKZ%%&%Zu>-|_-UVrNN*~eVAZCxpNO7=! zDd3cG8o1drOcb&~^*nrj0fL-s9RfK2Y8(QJK z^gw=jxw}gRWk4z8M76lW;P07%nxu_@VWBND)(HvxLtazLMn;waw_oIcEfsv^O3N3k z;85Npj}obA6X<}RHx@oM8?#Y33{jiTM&fkv&#N|_VAoR!$2R$*ncJ)2Y0i_p(%ntj zgRh}KigRgh%HMxMy+@$y#bTlg{^B7rys$vkIK=lQF>?ioYB})3oM<3|5X9HYi=qDQ zQQ2Fo^N|hnM9^JKbep{e4fFK=)*0>DXDDZT_UH2Bxcum)2b+fp_q%M~CBHO-&Ff~7 zv(Vf<%UUo21fAW%r)2hm&tejaQ@7#u18Wu44Ot@$eK<8fnJN9v>1j&$mEwdmsENI+ zTE)5y-!Wx$NQ)`4vN}eVKkc#gG9}jigN~knBK)cFZKw>p`bZAVo)LbB5Bm8XWK2#8 z5>dBw50nFGU$1kP(koWj*-j&{l4`WzB-XfGbNOLJ8P$iWp7{0?p zZWq2kr-I2iEURVMCt_-5pO)bK`6&snCZJy0TCyc!Cr2;JBc}oN7kDH5$Kx4xt=RkQ z&4wHjYnRslEOK$BYFK`WVViF>X7Tn;?XR?;g0=UwPQ_uCD~Kcf=R?|>9Y8+Yf<4${ z2*AF9no7)3Z9js5nln_Ah8;0)qG%&+^WUi!aKiMvjb&ntqL(ilmTByVy)k08ip|!f zEfA_#VcMt0E}DvARn>_AEkhtfFXQB)GkQQ@ItIcgqTK@SyMp`s1W zTr91z=l3EO*b!>sP2e!?X|1##%tI@WH~0=H*oX#Al<%N|*PD%k5HyA#uKuKO^{+(5 z@Tx&*cA_-$T^cz13yQFPDEMK-mV}!Qm6Lyq*$4Ucr|>>l{d@c-jffJ26$8B(_6qa9 zU+Tb~?4gsjPx@BAPNccop!Go%{(D z7JQGwABe(rM1lIiPoXjVdo*qX4JfGwZ&CC~^WLH%iS>b`^f5%nPWB{_YCcExUjR&5 zZ^9!C+9&J^fkP6KfN_J7@|gV&a;{(-8*j%1kF&$mC&(TVg0@^#`qHlya9;f5cd$iA znl1$259jd2a(Yq#NwU|?{-r!O=PsUhLKdKIyNMF^8N+j6aEKkIn*v$c3l|kE$eOQT zl3TDKZ(-JwyhRIzZ4R3DKXfBpdodv$g$wx0NsUziNq7-wz)oSj7(CqX2BonrFN5VDhtXauD#bWT+f6qXi#eVSJ_?MsHp%!Dye{6^a!{S;J-rz3C2+I2(*J3cXJlP`9ulh*d7h}c zd}V;%Hr}xV*=~D!qDRf*8=R^4YpPNwFG3qPaza|pW_kEHXjr3ky{I;3AC zReA$AEaN&QKgC|f%^vW+i#g>nIiUqfT@-Bfr3v0Y1Yb5a%LKwQrs*o?;?cfT!5c>} zVR^20-Uw%4@Ed1+YoC0R#gsv*4i+GNy0-QO5Xz>h``;1prQ$r%Ul4%N^j+Mft$hMv zZiFbM<`cx)@NP0ZECxE5+Vby8A}txnX0~A{-A+W(5)57y6Y%D5;A}<5iX%=YhOl?E+35)2{gc^U$3pn zLyAo*&({dP3}h_r!mLv4uKrlKMs(ck+z0*8un8gmis^uq0veHJ;bK1cN>exp%<}$# z@g;%nZ&w+}6gD|MG9QyNP}h+p)@<1h}F)q+aJR9TXIs4-3T z#vq&DVWjaxTQd?7q`ioN2QM6nDuecgfOIV}ORpT6v@g&Rz%QkJG%(=+fE``Gj>_Qb z*9W}IN|VQwPrjdkj1!@11KjfYti0dV&i*c2EOAWjA^Bt|J5SpciM+G?JN0$+qK*%s-zixK<`Z{Oxp4%spZn#=29?%XA3q1i%YJU_ zH}V^Cm?Y0p$Xje#*)(0Ly^)05rs|7;sGL%sqA zlB}e|YogE;96lFd+O;o9oCvU?d*0Qs4_Es4X~ONzMIZb+n~dweV7u&6TSr?UvZ{W< zhjf3lnw9pk(o1|uXA(BUqL2<f{A`t{oUiW!;eM-H9gw^13^d~ajCH*V zrbE(W?I=pl!22t?H^{Fj1^!M(ME;7v2r6nSNMkw77p&5LFg*y!n}Xj8NZ+UX9eZ{; z;S--mpLwXi@2`mXK2ykFwV+d63c)*)yPPp>lbM#i>O_G23uF@_6s|EHsB5WboWiFH zoZSVEXJmarm{?1{FqOAPK*Yn0hbxRBiTuSztG!B*x62!q5l1;btD5{NBR5%lk zQ^~CAe~8r)#43zYGrYAcFS0@ z+Z6E}5XeHe?39?C66DTPe!Kt=g*s(ym zgv>Z}G6%f8OGYeELOZ;ykB48SJe2!ud=lXx9J{N-S^o~UTalBp(F|zd7qNfw;avzm z8j~%AQ9-6Zf&f2Bf>-|gyE`q>`S7-X+MDlut2oh+tCVWc8PHE;JNG_%|3PUI3`N6o zcvVW;RWs2`zJo%eiq(o{plQ%X(jv;#&JPgG!I^nY6sAkkmq06Nhs&F+4Mw_o#DZ*k ze!CC&lJqbh7P+q*aeJjPR0JP!e?>+B1fZgk!sPC|{`(1N%ZBrV zG5PpI=S%o_OA`Qjy!E1e*!dDa2HdMm_{Nb^nnj%gT2>+|q!ffpB4h4bC4P)iNvwBz zH08(8h9Suyj%2-9TEt=9C}O#DiB4&sMjclNNLr*THwB!*bN&`3W{D*<6hBPMjcvP# z#-IUGK5s}aC-fP#os)0hYa8;B38P{RFWk(-Q%d|>lr%(&d?urPsTW^*$%AY3YTh@( zD#Jw;{F;}FLGra=pb=xbAmze7aXtHZH?hEsI44r2!W7He7*D9@ob^7B zflxCS3K~v)0>N`#cw1g&X!$~kmHbk*G>bPMk?dF7$cZIU$BPI`zE4o7jUw%{WR za=f&jd1z0H;^*%xBKxrg_Cq535jn3Azy|2l>g({vb?XL$qNBkbYS#^DlJS;KSj$+B*`gqLE(G7k4&dQ!52(8?`dl8 zxi4xE27NB6^X&c*PRJgto2zK~Qe79nGEf&AF{u&rIKE!sB!bbai!*VzZyG6);karIAdD}GF&ed#pXF&3|Jz|v zV?8;RWjI4%1hOG_2JLWd$cEP0iu0fk=I2 zbw*3SKXAhL7U@>>S4DHfT&#?wzjZ+|TDe_vK#S*_&cd^ZxAP@w0&E7^;-A-^)z-Q} zkv`}kuMChHdX4lGlh|JA41$rLov?C{T6&&KmqroaDFP6pO)*D{6n#LWpN|>9&tW+hKqDc2&Pm1H~~sr z0DAEcDqAH&(+lFfdHGzNu5fG=}kq&(6G%} zRan4}H_#iTo)SOK6K=Q}A7jI0U?C2pz_ORXtt&lGlQbMy2ziX;i%)I9yG@vZ!q{BC zt2Zsd;NP!ou#SZf*ke!y|0vJ8;b1~ZZJ^Q>JW&GYZwZP!Z8}uKTB#6eLAbr%L1slD z_)&?Yh#w!>g5x99p$n(AHmp)azlc7^xAvUUP4K?m6euj%t3XzIVP`kZH+GZeH4>VX z3WQa_SX|JNKt>tdd+~uYBh6LNKN*E7IB6TE9MOD}u_5<(K3>zXq7>*( zET5DepfOp>MtFEoYbuAwP3ISx&sDRXEF^|8>Dx%^Js zIH4)D3m2L~CpJP;=+sVVii+Q#`}ll~Z0>?V5{^o0PkdmV;9%9#`%LSA_?-QQ`P(e3~UoP=#ai zDHTD87G}B1T^?5szQ0nowy3<&#Xk@u#0a_cDUi#-!Z3Wwpv;pmzi5CD$x~qsH#ggSGj~y6q{dE?a6h!E1{jEDZZex*jw%* zoP|Z}QK)dm_o2%LAz=V2OBR?qf-TBjKs6adVG=}^{5=~%7)y{sPjR>*ghYxjbGhk@ zI)ZSekXHd2~SrrTwYe} zBBc-}2nDWc?|N6H9j+D%A!B@Uw6ffl<8hbE{J4dQ1Ro@|Wkv2XdVexY(EpQ^<-#ON z86?5U6dzQ_Ybd_7qLk}iasOv7AYEvWU=Ws+S7*_ynSwBd!lWR=wG<-J(Dy@xpHU1% z(`3DbmSWp0nRs60&Zx=5T;ogRrT_PX4g1!0B|5zvy#eyIu93(KMDy!B1&Z#9v_D;OpCNDbDEyGFrQf~BQbw-M*&O%A z8*gYd0i&i#`rU{b#gj&WPVDX~M=X21YxwHyUknGy;d?$jti~tf)HU(hYUCfbwYO#1 zJ@?!*Y?wEH7>XK3{0RE4cyOnWxAS`z-Scn4eWHJTzIdrvZ@^K^KIHZv$(umh>yqjuyM`9wG8QNa8=-<-l7n0!JCFv zG;}$QayY;8c9%0n4lk_;rx5o4{Qe(H0PQymozHDNYm7CmH=QwEG$ooRn%9``Fh6X5 z!u*W+dGlY*d(ExpPV+}*$$ZNEtvT8fXBlm|+G4O=XSu8STUJ}vTeeu9 zv^;BRvAkpX*pg_SV6|GE)?DiX>tgH8)?2L`tUl}g)<>*+tb463)=#Y`t>>&)*zC4! z+d|tCTaj&x&1b8z)!DY&p0ypY_1eC*MJ3&kWJ~%((%+K4NHQj8CvQx?Gr2B#NAjPO z|Can_^6}(T$$iP+CXY$EI>nG;Ovy`GlCmnLIOX1y-=;j3@`sehly_6kq>QnTw_jsl zYF}%=!@kMxvv0TGXWwam%D%_`l09JWw4bm?rzWL3Q*TUNnz}Z%EVU|iYwEwG?n?b@ z>MN36|+;*pJhwXQ^7j12}Pi?1d(Me;IrX{5%ElVm*+LE+A z>9wS`qz{u6$&-@vlb0tymHb|EPx5!kaVe8gtJIWPDGO6pq^wCPPuY@EgW5fo@^nfd zHh$nlh8kK?b7W=Fe2a`Za- z9Eyy@jL8`{WLPt1Wz5g0&bU8gSH_<*+B4qI_%!2Wh9YxR=A=whW>)6P%-b_r=0ll( z$~=&HHuKv|!6*n1LoO=gSfkB&ld;_RlyR?dzws?&moaEOX}n}qni5PmnhH#}nKqdo zG(BeegXys8tm%SDV;*h3%KS6)baRr~VV-54XI^MtVqRfh4ZSQimz&+@4d$(8pZQnj zdh-tR1LjAesZW}phOYkE+-QCU+S+D*0~-6D`G~pO{JHsz`Mfz~9&6ECu7$p4S>{;g zTM8`8EjL@%SZ=eFTiljSmOCvqmU_z$%Wo`?S^jAKtMxVOe(OPNr}aJSch)J;&*iq? z+x~28Lff5(Rt`@}NSct8nlvwIUD91i^+^vW{XXfHq{8G|ldGYjPbB|q@}A_w$;Z%& z7m~;06RVDt9JJqUXhBcPT`9FG46XP8bo7Okwv@9eW9)zCZor^v~0K(od$xIL0_~9P=Ej9L0_u(7$F!hvUhN=QA2JUd`yp z=*;*$<3vU%BRW%?xg+y|%&yE2GrKcC&y+HcXZB{E$?VI#lnHy|6of7^J4Ti9XU6-C zj~Smc?lHb(Y%-2EjWLZk=}p&~t}`7lb(+2~sm&wJ3FaHjd60brEW$J97tC*(zkoaw zEvXi#Wv=DtmW`HQTJA=#f5mdx(q;MDqOzK;>#Yx3AGN+}{oMMM^@3Hf#oFR+<7_i+ zR`m8F+k-YCX?jvwQgzbfNi&j7$%~R(liyBmN_i_K);`}}Z9ix~nEH9@h1A%z__P^m z*0lL)tJ3aC6VvWbdm^nh?Sr(>(!NWJN>4~1mws*f^z;kqS2|W_Jf11!3&KuR>xePc z^tvh5Y&73!UTj_q-8g2RXt^Hk{tL@PmcLqFweb#yec4(sQ z2Ajurm#yCRTU(=TzwLr;SkjG2Ym=&y9!p8H|HA&7U6q=h`c&$lQ?t|VPP;E{U)q~# z*Q6WMSEswu_oSamzsm6&$4eQ9GrBT9$~d2)&YY9EII|+NA@jA&eVK2N+;7D=iigTL z!kA<-LdFKu)uu$#Xp_biV-idkjAx8r871Rq#t)6}89R*!jr)wR8XJv&M*IBUxYPKk z@d4w##yaEO#;wK;#wz1FW3h3yafPwKINvzi=rpDpt;U(gsm96ZcY+W87d-AY>x~A$ zX5hQ6R$~gj-sCjSGR{SgeB%=2z1jGC^Sj0e%+Hzo&>#P77EHyaM)ao-O`n@2({WR; 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 {}