From 14f0faf7ff6172d07bd5dcfa44191a3e8d78edd4 Mon Sep 17 00:00:00 2001 From: goyuken Date: Fri, 30 May 2014 20:53:52 +0000 Subject: [PATCH] bizswan: rotated display, lag frames, stuff --- BizHawk.Client.Common/RomLoader.cs | 2 +- .../Consoles/WonderSwan/BizSwan.cs | 12 ++-- .../Consoles/WonderSwan/WonderSwan.cs | 32 +++++++--- output/dll/bizswan.dll | Bin 84480 -> 84480 bytes wonderswan/gfx.cpp | 59 +++++++++--------- wonderswan/mednafen/types.h | 2 +- wonderswan/memory.cpp | 3 +- wonderswan/memory.h | 1 + wonderswan/rtc.cpp | 11 ++-- wonderswan/sound.cpp | 6 +- wonderswan/system.cpp | 47 ++++++++------ wonderswan/system.h | 9 +-- 12 files changed, 108 insertions(+), 76 deletions(-) diff --git a/BizHawk.Client.Common/RomLoader.cs b/BizHawk.Client.Common/RomLoader.cs index 0c1bdf73a3..6a5a924e10 100644 --- a/BizHawk.Client.Common/RomLoader.cs +++ b/BizHawk.Client.Common/RomLoader.cs @@ -139,7 +139,7 @@ namespace BizHawk.Client.Common using (var file = new HawkFile()) { - var romExtensions = new[] { "SMS", "SMC", "SFC", "PCE", "SGX", "GG", "SG", "BIN", "GEN", "MD", "SMD", "GB", "NES", "FDS", "ROM", "INT", "GBC", "UNF", "A78", "CRT", "COL", "XML", "Z64", "V64", "N64" }; + var romExtensions = new[] { "SMS", "SMC", "SFC", "PCE", "SGX", "GG", "SG", "BIN", "GEN", "MD", "SMD", "GB", "NES", "FDS", "ROM", "INT", "GBC", "UNF", "A78", "CRT", "COL", "XML", "Z64", "V64", "N64", "WS", "WSC" }; // lets not use this unless we need to // file.NonArchiveExtensions = romExtensions; diff --git a/BizHawk.Emulation.Cores/Consoles/WonderSwan/BizSwan.cs b/BizHawk.Emulation.Cores/Consoles/WonderSwan/BizSwan.cs index 8de62ee32e..21a1a86e38 100644 --- a/BizHawk.Emulation.Cores/Consoles/WonderSwan/BizSwan.cs +++ b/BizHawk.Emulation.Cores/Consoles/WonderSwan/BizSwan.cs @@ -41,8 +41,9 @@ namespace BizHawk.Emulation.Cores.WonderSwan /// uint32 video output buffer /// int16 sound output buffer /// [In] max hold size of soundbuff [Out] number of samples actually deposited + /// true if lagged [DllImport(dd, CallingConvention = cc)] - public static extern void bizswan_advance(IntPtr core, Buttons buttons, bool novideo, int[] surface, short[] soundbuff, ref int soundbuffsize); + public static extern bool bizswan_advance(IntPtr core, Buttons buttons, bool novideo, int[] surface, short[] soundbuff, ref int soundbuffsize); /// /// load rom @@ -51,9 +52,10 @@ namespace BizHawk.Emulation.Cores.WonderSwan /// /// /// + /// (out) true if screen is rotated left 90 /// [DllImport(dd, CallingConvention = cc)] - public static extern bool bizswan_load(IntPtr core, byte[] data, int length, [In] ref SyncSettings settings); + public static extern bool bizswan_load(IntPtr core, byte[] data, int length, [In] ref SyncSettings settings, ref bool IsRotated); /// /// get size of saveram @@ -95,8 +97,8 @@ namespace BizHawk.Emulation.Cores.WonderSwan DownY = 0x0040, LeftY = 0x0080, Start = 0x0100, - B = 0x0200, - A = 0x0400, + A = 0x0200, + B = 0x0400, } public enum Language : byte @@ -131,8 +133,6 @@ namespace BizHawk.Emulation.Cores.WonderSwan public Gender sex; public Bloodtype blood; [MarshalAs(UnmanagedType.U1)] - public bool rotateinput; - [MarshalAs(UnmanagedType.U1)] public bool color; // true for color system [MarshalAs(UnmanagedType.U1)] public bool userealtime; // true for use real real RTC instead of emulation pegged time diff --git a/BizHawk.Emulation.Cores/Consoles/WonderSwan/WonderSwan.cs b/BizHawk.Emulation.Cores/Consoles/WonderSwan/WonderSwan.cs index ce15e8f2eb..9dc4a6c279 100644 --- a/BizHawk.Emulation.Cores/Consoles/WonderSwan/WonderSwan.cs +++ b/BizHawk.Emulation.Cores/Consoles/WonderSwan/WonderSwan.cs @@ -54,20 +54,23 @@ namespace BizHawk.Emulation.Cores.WonderSwan sex = BizSwan.Gender.Male, blood = BizSwan.Bloodtype.A, language = BizSwan.Language.Japanese, - rotateinput = false, // TODO bday = 5, bmonth = 12, byear = 1968 }; ss.SetName("LaForge"); - if (!BizSwan.bizswan_load(Core, rom, rom.Length, ref ss)) + bool rotate = false; + + if (!BizSwan.bizswan_load(Core, rom, rom.Length, ref ss, ref rotate)) throw new InvalidOperationException("bizswan_load() returned FALSE!"); CoreComm.VsyncNum = 3072000; // master CPU clock, also pixel clock CoreComm.VsyncDen = (144 + 15) * (224 + 32); // 144 vislines, 15 vblank lines; 224 vispixels, 32 hblank pixels saverambuff = new byte[BizSwan.bizswan_saveramsize(Core)]; + + InitVideo(rotate); } catch { @@ -94,12 +97,11 @@ namespace BizHawk.Emulation.Cores.WonderSwan BizSwan.bizswan_reset(Core); int soundbuffsize = sbuff.Length; - BizSwan.bizswan_advance(Core, GetButtons(), !render, vbuff, sbuff, ref soundbuffsize); + IsLagFrame = BizSwan.bizswan_advance(Core, GetButtons(), !render, vbuff, sbuff, ref soundbuffsize); if (soundbuffsize == sbuff.Length) throw new Exception(); sbuffcontains = soundbuffsize; - IsLagFrame = false; // TODO if (IsLagFrame) LagCount++; } @@ -226,6 +228,20 @@ namespace BizHawk.Emulation.Cores.WonderSwan public IVideoProvider VideoProvider { get { return this; } } + void InitVideo(bool rotate) + { + if (rotate) + { + BufferWidth = 144; + BufferHeight = 224; + } + else + { + BufferWidth = 224; + BufferHeight = 144; + } + } + private int[] vbuff = new int[224 * 144]; public int[] GetVideoBuffer() @@ -233,10 +249,10 @@ namespace BizHawk.Emulation.Cores.WonderSwan return vbuff; } - public int VirtualWidth { get { return 224; } } - public int VirtualHeight { get { return 144; } } - public int BufferWidth { get { return 224; } } - public int BufferHeight { get { return 144; } } + public int VirtualWidth { get { return BufferWidth; } } + public int VirtualHeight { get { return BufferHeight; } } + public int BufferWidth { get; private set; } + public int BufferHeight { get; private set; } public int BackgroundColor { get { return unchecked((int)0xff000000); } } #endregion diff --git a/output/dll/bizswan.dll b/output/dll/bizswan.dll index 97f73d2a6e9a17c0449478a12bd16af019763c1b..654c4169c082afb944d40095912f2330cf6c69ac 100644 GIT binary patch delta 14455 zcmaib30PCd7w?@5NE9>|2*{=&L`8AQMgk!$%Hj?I6tuY4QruCYQj3O&0^u4!M~w@j zwr;J~s+ zZVT$s__#2Mvi>zubPosAiK2vvqWmnCr*RK7kY4%&PDI0zBi@8k(dmj8NJ4k|z6YZ6 zPV!6Nxx-Y`04ns%e6PSWdATO2Kr zeGefM`f@?D?%-1#&~q*sP}xS#9hMhZcwH+8=<4InU@cNcZjLSsk6JFb1ZQ($bcUbSuB2`5l56v8Ozl5>NNX*0*X=2~?zZI;UAY|K-3ObblZ zi5jdM)1r%Uei}vrJ%7bmv)Mc`6=qw5C%Ow!5?<=ApczMe#NFHNPX}T_FpuiTw)*7{ zUz^P-YST^phkGg>=AolIDJ!mcbf>{cTfO$sfjqp`yBaO3_^{g>gl6C=KJm1t9X{Z5 z6wRra>$|&yhRrA1;#U?Dd;9CU*Jmykk6D5F3Bl&#*GRKo3uf)n9?(q(;`v zuRLmJ17!TlGP_o&%ln;QeaF`36?^npKRXc0(PKnhr1dGZ>Ou&;EztjqPV7{fE98XtHHio+VYTXUZJ2n%MvoS*0jAhMQPtsZ()@S*^M$R?>ip#!?JLU^HDsyUc zC#%MY?-sjThW7`#!?vkr^Sw#M4<^Z5v)NKG=Mx(JP^7(OHd9nja9hfu{xHd>p|ymm zt{6J0srDhVzRKM}M%9d~IrlujFXVDF7eQkH6hNMg&3xh6DTc^dY1NEkos#{_SigrDoaZ?&yo>_VcqR9qfR9UB5UXm%lQ?g-X4@ z`xmoWzf?{Pstqj^usYI~sI4~PPW`KGhOo@*z%Vj;c9bX&)A19HN}yR zi=jZ$C0xp{)CK|vM_*Fa&&spEH6370i9Es zJ~iO;j#lM>8Z!p=;gM2NjcGjII#8$~1v{eCqO+zWjbxu6SM#@GgR~FM5Ybi=vP`Gp z{N>-nAzxVj63#e6nfuB$%f2?h4T@0v!dj~zYz)hTZv280poYzSWCXDX{ljor*;--` z{K^{bZ3;|J%O@t(@x8X1 zye7W%QgsuwttDpFk@GczT%K9(WL{ zq5s)5|AsV&i@=}QCh4BW=94V2J_Hn0TJ>#SntyegL&JMCh2_L@O@m)rM9Z!v#`SLb z4jNcKso`d0ZTsi)+go7*?Q17S*^zT}%PiIs=l$0#Nu_m`B>SJU3?SxAhziTeR>I99 zpEC&(wOG6@vk&nzH_p#$aErKKAn^r4ntP|Eu)LjvvDsE)EG#FUP?+z`Jp~lPkrFoz zq}1~oIeB0RlpMf9|D_!fUqQZOa&|kYy^A@xB?)N4-Gas955O%1#ld24saFF z1o#a*Nel26=?HWjKa_e5CX<5D6i%_zX*zDTx^iOCx^iMk7H#XwiP9`01tKCLuvlU$ zX}aP7JVe%O%q!Tfhw_)7fh2c{lPiDuWyl4`@-iLOX4e&wh{-!?+ib^nV3TciF%9~d z2DN_FwFKRmD`wYHXf29m_?7i=0m*yOfnTr;`ht6Xi;XfrB*S-P3iKL#1qGuTJQ|)w zSP#zxTnkTkYz|TcHr;DK;3dY1mI&nhyDENVtg~aTwYm~dk-G^uziTXg7D+MP2T@Ei zpaf74K!Yhpi8sl8kPv?_UyG*WQiTAgD|(~;6{U*h2<^mfA;A#h#fN-}&`JD4sX_%< z9{LUX3I7%vjLIu~RD6Vr@xZWf6p!bGm7-(V943XCOT)$9-`?bATf>eN=CGrMjuTU* z=X3`59uQHlugDEArqOE5A2g=N;8CDTKqBA+z*N8tKo(#zU^!ksD7L2%?g6ZVjk8T) zyR1)0RGXS^QxuBjv9Y}UzD~)GY_cQ7uPuXmqwN*$gT;t$HR2Ib13QKT8M*Npab8sJ z!0D&V=9_j#xS{1ed>VxgolLeOQ& z(-Wb(io3C|ktQiQg>BPsCbtx})ilQsqTDL(5_RVR#0qt$6~DrPTRvnC(sU(cztuJJud2-)$kz94fnIt6#h$2cvvoKDJG#wj z_F}c>rLDt7t}X92-{FMzH?rqC)WXGX56rSQZ!bI%8^cqx7fjN#X7e&*<`XuHVY{#~ zj&N-xa!EAJ_zPn84n-XC#JW79Y4Vpk;e;dHvdHD?Zd=~NfUVSI#7Ix-qJ=`>n8e;l z(M4;7jBdQpQ8!X3&_bk%sKx&2EyECFcFndpqr?cY`beQrdd^gOvE6&LIW|oxNr|yp z{^`u{|0e$MZ{ivfYH9C)ubTByX13wt1BVlAef53Xp_8j`wv z(o9UGIo6ubg}l<5rx>bvKzrVoYWAzkCyaoEYId{aDIVlI)#YnQ1Gzr197$+RW*2q( zP%@u6r%s7}z27WPZj){tGHHd+`-nfe=H!kk8z|D5TaWOiL`ae|~7lt!(~ z-vxvw-cOvV6%BDO%s0SIEmz|Kv+!l(g_)i+sM>t;&IG+X%XDkWYmw&8mU_6+-qxDxhs^C~2Ba6kKb%3Q-eSaKA~g?l>pv<4t4{$6s?#Z=lf~&jzjNju#T$gw(O4 zo=($sCVa+C`q#T2*d&wFOM%erx(uYtW!aV)aMk?~yT^y4B{(JCuQS=$+UH`x`SG(g zuw_lS|81MuOm?mHMY3d8^&N*pe=Hl=vU!b%2_LNDTW`bVQ)}`6RdgA6O$;bhJK6O&3-F5FOcTY|3G@`xe zjvr4E(X=+BTYu2gi3zpHMXw$4$ri&z1)yjZNt{t+%T16{v20_LazQbn3N43l;Pr}gFaPp zg6bxC=>+HaXGid}V}5kX5nPzjmkvB)xX=apA$wdqrxbmHQ|2zA|2l+!n%moDFT4){ zCU8g7#qij(5Dk@KrwoCh;Qf022pSqPaY#lVdd4Bb8O7p)j6mA+5XYE)eh^>F=p`Ug zQ*O2mmFdh5<*^x#3EEm;>^v{Qc5FAq;1w%{s0Us#&mHmb_IW|{rGxl~+(=Z4yUkBS z!|<~CD)bOn&yPc!Ftb2_3USW`8AyTGE)b)8xPHMP^abvexr7#0;>`u4=pVns)wf)b z5&x0794YaFtU1J@vjWj(+~t!cC=%;G@kicx|0iPlOa-2@#T)IxXkje^09 z$24z0H;+U6xOr^D9T&}T4B1Dd83*s~jSje>bSQoA8|=BVFFJ&uE}DWC;^fcz!pkx3 zXM@lKT=Urs1g4x5PY>M7vGBw=CmU5`$HiV~I}TVJNk@Op&6UQx7whQkJ$QXl938NS zo0SXRuw*rCWCJx>M4XyH*cL8oK8A2TBzFKE^A)$^-Z(!u7WR_!xq}dxjdnUM`w}~4 zkD~AG;+Qnxo7xOC3CAssK^}PZ(p7Z+PG}e4CN_jtKo*wohuOSMXc_LaEEDl@`LaNC z2cKD1;PBZtveab%`|>Av^9CPUyqy~o=CwQ)ox``54?|0FV16K-ybV}-ulf#`eOk{<(dkr#YSm>0y+#?Luf?8bEA3{c|i!X#o8g@HuTg)`A;JWf|e zS8XA3vCrDV*)I0c`s1&jI^zXJLgb3q6~)u1HgkjQ!*7aG=&_q|{8Dc`pB(_dGi_!2 z(6`IqEfPa^feXE)9B*B%z~}RNVf_j*dW4U!n1^z(SRaVgc!GWgF+hD8J+utQb;nDJ zMfBT^cwcc}`qD=0;^g!a$il*=vj0R%6YVI9k;k4>nw}wyv7?Bu2R!i3^39tdO0L83YZ`s zhup9M#~{!mo=DGI`)*NwkOi8~c+2Xk=qqfqW)2F)^Vb9t5wFQb#T7nl&(i2NZeHgP zmqGq|CCbCY*NfpAo3ma9<9= zq1+GMz^&!I(E;qW*$+;*@XdkfLp)=%KZ?M`kaxj{A^#Zv0{I%;X^TJX5CgV|(I`B5 zOE+?|Y?09~b=>ISLQvRgDd@0ptBf9PDai3cC?HD#8~_S?3%Ne9eSI#YQ!NEh?dQYj z)&hLw^BBRN0@%un)o?`fE8Ex_2#rnavEYjUK?XEf_uOcqH+zAtF-^egFVY21^SPJ| z-alM}3xguifVF+`7EIvvsiB`0TcPl!_C# z_akE4-j}vnj^`c-qfaj5?C=}>c6%?f&F+|iZsO7%p5W`dcSL|fNWKnt*y)F&ai5*O z#5{J!ySU`Rw5yUCeF=AYUJa|j15UZ&6Fa3YRZIWT7EIczTe@POU9O(l*0#a$-Vv@+ z*6x48I`GPuuK2@UDq^a;ZXgN%?8`$a8wY(Ahx)*?FW&praP%#H@l^^Mj}vwm(HEEC z()}`e;}Yy}!JqzQ32xrs8&BF}&&%lnS45$HY{i^CHxZhGNA8Vs?v_Ku+(snHo+Z); z+uYk1fkgNACOh(8r9-2o+d)Wh!#Cl0;Wzu>)kMI)G=#e2lKnxnDVvN0cJpBWKu47y zH;6kV4%qm$FOE4707f?FKsZfh6Oq!*3$b~7Pk0S;|A5$`%tD?G39haPulTUy8KOsL zaa+1G-uPVzeJzvoX&ofsuW-IrM$*zuLO?%RfWNPlqwDx-WjMWP!8_j$ge=g4=T{9! z&G>ee2yMVF2d5(uUVJc#ew~3Y9TXAAJ2Z;O>`*8ImpU|#uFU{z71(pKFhTR-;bh-G zJPmo`io+7GI`}0JO!5#p3fZT>+4lVlF&Fj`bZ@0K9}&|S$MpjgAW`D z;XSl05`Kd`GM32wXg3svXB_oHaP}Ncpr6gcofmte>lIIrrXzuR*54*d>>G3f9&=3Q z%Cj`Mzi0T*X5vG~ltci>{Ly#V{dgd)n_&rKKEmn8{g5+ekIzO|@QdR`f<80a8NYKJ zw+e%?CoO3CxV?ol1Ty4J+;BofqJbKPAoJhNQ=r)&&#mc9L|QWtexvxhM&VkY_Afr) zrQwSwT(ING7(wd4TZiJ0P6mNVZ#+2}?Z>ZAdePra!xx{sg3C;WJ$B_OH`?watZj9t z9j4)ptvzVCn;dJEWA9pj*l;6jd!ivYt+v#;@*@!f4!Ev97T&jZIqgqxoQy~8 z^ulqcB_t?0orX?f(`i50^c~J5!n?wWXSB}eC;g8P9mP-1Y$P^yR!R=$vr_wm6V2wr zSZBO)MSl_|oC~!d%GGqiPZoB!_vi9_uJtiKc1~!2W&)viA~p7Fxx6!>B-`70DFS;q zFSK{(>RmaSyW=z_(ydWgO z(uLrT0sfp5^ZY9^E_6n)%q0z9*zSg(;qjEr-e@u&bur4*d))uX+<~hw+Fav!!|8QV z#am`!G!1vY6o!^ojJPC4XaLq+?ge4?j>~@Z-DEuTs3)q&_bv~ibCbz|NKZ}1qDD77 z^~ylnD;bYD5<%Y>^PW!~8-t(xIGA2EhC4mMeSaK8dye7gu8)4te<5u8F^c|lG)D#- z{M9G~XTa6Kj?GD6r7Mn&?TmXI^2HCX`gHvQYQVAK_fc{XS@+((iPlip2}l3rjFNH6 zPrb-V_>&i$mK%N=M;}UjZ#0O8ul0j4J?xqoh2y!9cfw`Y0y>%!;H6NL58H;BTmg35 z;9{@K5&D`gtMN=Yh`+(zuTMZ?oO9h1$+6-3FcK7AcLP^$yWRs;V9y()5IFJ;70pw_ zVBRDmzA=I>kH@)}d(sQz@y^RV=+W_<41;mj&kCA~e>bTMCeXppLlE3m8oLq2Hp=K> zaU7dKytHv58LROlI&Bmu^`WCc>V0s@O-I^k6cD-E!HN6VNL+O@RB(7C=hxm=A0iI4 z6L~a5 z;M2c7LtQG4|2`QZJ@&mnikwmRKOif*uS8#B+Xu-g5vM*-xw=M@X*O7`qHYjzG)G*$ z!v(`HPFQr*8J9k=AJ7nC@rKJ*x?Bq#TTCvn`Xr>S=Hh|rTy^LF?d~$4>)ucl>uBx& zBnqQPuI~@gufJsopkdob`6>z&!wpds+xhQNaC>K8!MX5%ZOL$|H!J9^VU}}ZF;+iR z3jF>}266DiD8bpVfAxo5^PxykU}<>&G=j7Fj|lkv=hHu;-1h-Pkdt-&DedcDkFWd@ zh{9Gq>g(YQqWF96?bM4Os+&ERQ| zSNF=~hN~w{2^PY41cyR^A4GQis)?A{>1un&)+EP@7GK*eXn-Ki1826(cd4~f=~+(S zLqH5%{KtQi@6z?3ZR=n%5dV2&)mx_PwO|YP_V~}zJrOrQ`Ko(Yt}PBe3^A%UnOt{=e2F-*-2nn zc=3xLpZ0<~)7iFi65zbJ>O4zCSaT<@CA@@<_+@qX^#e&YsOleDg$a@Pw25f7cL0$5 zhgOYx(o;9G7e~tU!nvfkK??2Vrr#~?KTdj7W)*SUHy*IWC)lkc;^(O7kUcR=v7UwzmCKuQx>a;S(`_`@93* z`1XVDRe^-Te=GP%U#o(<;t2Sn?rz`zRPgz}T$FUV4~de{zBS#@Ci>4lcsy)(=hoap zkDVI>h}_=O@ma%dgjA^5;6o!1Ix~Q1*|3vFg=mvOWP|c(k6uL0^s}CZ>o%wu#Te3U z(PrNEp6_XTsUgq~m7_a`Gj`~zi=&VX@t&?<`5P)apr^E*KWxz+h7C#n>#Rm~8;NJc^kP5HF(`_vI8*3s{p6w1C+K6mtXmehz7T zA$;wmgI~srC}t!JbO7}Vr~^C#Y|vB8++vCuT0$|grIdy_UJ8s?!gmV*dKJZF1Dr6t zxCIoih6w@E*1+cqfUavP<`Cc$1I0W9G_9kUxb+nCBfx(H#pDBC1J-P$nEqw(*#bbh z3Euw#9Lp&t2JjMaa5KeB*aF`WZH1MVY=sYrKBt&PfHJ^wz-vIr7cdZ@0?-2JzYTs! z2P_7Z0=@uL0!{-O0gnOncKCh*fC2S@H-N!AC}tsG58xIcYA3~P2iWg|g=^q(9x(7r zidhM01uWe|G1vB5L`uZ^KCXTPzv}OU&!qNK%vnIy0g7?10OMm)6tndl#mqksZ|8r2)dG?)fG8V)Il%2A#jFB+bP4j80aqyIW5Dl#0Y8Gu0L_49 zS7CJk!%r|Vz-@rrHQ)i*4Y0iqItL7gd_Le;K=5_Y|4OKQ0EoH)%mB{-b8f;ae+6r9 z0{sKNy#*_|O)>NCfbQ>7OwDgF`0wz0n+f^?==&5i1TY=&-~o8T9~85zgq~2L!$Z z6#;fyZDuXxgX|Hr#sx870!{&*x*}$bJ7Q)7mIHz|z~dXhNx*f$Di6f$KS(jWLliRz zuo`d$P!2Ey`W^-&HH5gLh#sFFp_q$+4oBgWJ-}T64Q7)7m@wy+&(%^ zG2a9J0t_=!%$I=609P=+2!Mr~lN@X;3ZMo|0JIvubVEMf4*U#G3h-zItpa8NE&`aF zgk(@x6wyun3y2S31l$7HfPP~D9{{W*OPeX?72uPHu=fDI1oQ({ssL7!gh#OL0Nw(k z9#hOXz#V`qXuEx&C*V$i-GCneEdU7^!XSW^glVN15kL*d0PF=ggN-BtEF{i9g7)qK z9s^zgWUmZgxuNcnaj!t)uR-I0b#FjHZz(3p4E{kO<`aaNA8Evlvq22c7BQ;G5 zBVw3NU^{>c2e2bY#9ZwRw!=rvAwW6x|6NeyGY zkY`u&!4H+`&K8nSe%O8F_h|AvmqF)+2L4|gFLUjV<(TN}LW%^bd_bPnDdh!=ysFR{GPGKiM>(guLuBe?09OpP_@76jP`pZz1 z!wYz$wM2p_`0ajW4_8B}47v9?7Kj+QeNaV^!aH{6t(m;2rKoe(w7tC6a8ZW5ItLC! zOgI2q%^8LlG8BlmRP_u(8e973$A%pt$gkVv@$g}NDge^Skg6eV0%S~}C}Y*V5EO5p zxJXtO{CO}8BZ6<8AfXj26s3yQigk)HA>%{VDa({wl-rcMlzWu>l;0{3Dvv6S%9F}^ z6e3cKJ{Ro~ zwTa${Y{cEg6T}~ir;AsL*NV%;G1B2uwKPbklts$!$lk~f1TB(pk?)Y7mtU4E6x$V5 zih9K*MVrE`m=gSH@Y>*?f?oz3Ltccam7|qomE)C@mD7~z8s#iyt@5%mJ+w0PWN2Gx ze-)KMk*QOwTWOp@iB;QSOlJ2>v>FPH0x>xbVs0A4E)vpo|o_DMcw2fx(jCQ=wD?DJN6Z z&d|M~G2tV_sU{1-!q6q5vEie_sTK<(rFf7SNqN#U%8SaV(BYxv>n*})x*|hyTXA1O z{^cbd-YbR52FsSoS$QvIe`VFQC^QzKqlWLJ(N>L094U?#4;7CTtHqEc=93~{D7TYOM_RBRNV6xWN-i5tXM#Mi{`5^ssGL?{W6^pl7rGD)x`TaqKml`NAK zN>)fpC95UtB-bR3k|xPriAlnfI!YO-KMiq?31tDYeln3vCJUBj%W`D7vSqSD*$P>yY_;r)?3%1m)+D;8A?s9LruUshC1jzfzMRJ)uSgw*s%A@5&<)!k~@^$huu$OJ}UGhEhhoIc2 z@;3QvIi;{w@DxK8BNb}JXvJ8?cu?*%MO^Sl!E=K%!H!CTHwGUKJ_FX&7)*yagm{O@ zLWYIJg^UiF6*4bmafm(yhinMhA5s-^Hsnsos}Q6VXp}N#j8Y9om#ZvLu28O2u2XJT zR)WbO(j$XswAoqRitW&DqfYMnxvYk%2a)-(x`N* zRjN&@FI9V0$5b_{)2a)qd#Z=3Ruu|!408_a8Kw-22}=!I5Vkn%aM z_?jeC%yG;ka0M=rxvURgb( zI?IORY+_~N{Y2AY5Q`OSM>wOxdVEa-X}w#(L@^z4c_n>c3UV?L*fiKQB#9y;t+`=u z(^y!#id7h0m@{vfGnZ&OBWJ8SX6>JgWJ!jHn8Qfz(hFUz$Y#nTa;m1?mF zC8-AS0|YOV*@Mhvb_PfLC64Od7rStKnpkcF-O;&^UTVyir7QoF%7^7<*%E7mS$j<5 zT{tcyGCS)Ii@*rPd=}fsH4We*j?MRLZddpb>Tm(aaBd^LS1+R2em(U1_2Rqgq2OjEj*l@XmSo4$=@#ohL%eWJN`x__T$+_b?CRuf6 zyx2nbb@9`SOIjV4w27A-+8i!spF%t4oNA|mh681@+dFeQ0gPr|5o6oTu}|$dCyq13 zw&^(JX6_SXTg7oL=-G)IWEj_Ch;7wzD9K!wm95#_%r)^*0Lc; zY9pt{Hs`QYc0H>qx3qR?O3EbgTYG}eaaU049?D;LpeNkDJJ&ie69N}CzuOkBxbxI( z9-nC1PM^6?B4g-84+DQGyyB)uH=b;vHs0I#C-(Gf?;0|^VnNrx2+`7c-4poRw)AlK z102k({x{(RiBSKPQQG}KDIYRQCq~!q zf6^I}Y;&q@b7}-#6Ihln8wtuOV*FFpNmIvGj0?KA<-`@z=o)gWWoWG<8;~9hvO$1* zLn7n4qm}CynT)}XRtBGE3M|jc%=5fN^bQ_`>_?1)`5UCprCb2G;+3G4o8B>U<`3Yy4D+-I)Ofe?Obn!*b8s^etMw{x9qpDV&$vL7h zlwnGsJ^J?VUwDvdWG}Ok`rJiu3y#~*8FHCV8`dzFzW?QvNwrpH=-Yh{=#-$9SLSV9 z}T9FjB%m(k&>qRPbPh6 zt$%cv$)TK3VB0RGR?L@yc11(Fr@XSH5A_J>Mtak*fS&lK1Psuh({RFNzy|aTjF+T` zx!q7FD}8oq&OvX)xb$hw9iCg@FitFTwRGRJJL2pMV1s4h=nk}+)o2>g;;z1@5CNMgwU(fE0bdRO0Tvq>iGgBsI*k^6-MK|>G zwPzLVK!3E~D1{Vn9O1%Ex^?+qW^>^(4YTbwvd~pDu(HwFHBD68-)q28Ehm^2E7A}Y zWU~QIsuiWM#w43mTaevZ$|}hAltMbSznh*7l@)chhHQ+JYO`cMkbC;^9fRhTSwzHJ2#EIUx)f42%HA0F!`JU=Hvua1po;+yPpF zr+_V_ycD4$LRY{as6@I3XaG(F5n4K2l}j@Nz1mw91(lWu_LZ?zL9J;eJsqgfztC^N zaZ~dZvpHqb#M*x=IVAh`F(&p(Mwae0T)v_bD}8?1J$N6Z%zEOMVPBWqf+TYPu;vyH zs@CP8nmjKb)bh%F*Jx%Ng}b9TL0rRZLta^%eS?D;>Kz&lQVwhFdD-!r>$2<{X66>h z43a~!QhDX^oa=H`b#RrC zB+IZA=`CfoHBB;jBkQro@S6{_|2W@O8_BVfJAD|ZTqYno$}YPl83c?dZ&V1mamY@a$V>r z!JYN2z|y2Vzl^ytOXQa^H@3u>BU@t3m07GLB$5*nfjK|{uo0D^4R8 z7AH&ZkZ5*W8AF7eBer5Yag=T0xJE;4RApZNs+%4bp_Zb>`>iYkhEaie>Y0=tY*i zGS1mC%bLCAMA-iech)A-Krbg@_^|W(j7%8eqh?Enulupq_k!V_` zD){*^ zEd#!QKM)LPfmk3O7)QSu7}wJq#{)4GqD~S!txFo6XllH{aU@PA#>u|+aY}X+lO0Vb zsn4L^xrLmnfrskW)E%Ug&TG2}_KXHpHtY_T^O&*%}T9%er~f|)HnAp6;OEcDBM zwvUBg+0WQ=obFPPJ9iKf#B+tk5?gzJHk;$JpEaN?^N1MxRMoJL^WnIZRKrl8R70Yx z<*;D&DmK8IZ8>-PeZoy8g6fE2h@y`eD;p!e=9oNQ)IUaAFiciB8b&Hyv$2IF+!94v z%P=CC-4fX(A#Xj> z5&v4?6mUN|jjb?=rmYv5!8nR}j1(hxg!v0e0kt*~Eo}GLC5WL|DmAj|g+rVkiZU_L zHdTy~p(gruPlaTCRF@5772bRMK|-qP=cm|$u?qJv*Y5=AgYF;UqCYb_DNP9qQ|w=C zJ3BgoVJ98Q{|Oewy#Rtznc>|p+1ilGrc#*S>suVYprok;FYDuG2IR>rN7+D|KJv=sE~D|`nJZx;@0=*FYKIxEaHOJNQg$u#?7AU} z7|yh=8ca%BTyZ(wdyLtw)Z$QMW^##!ye*(Jsn2tq9?C9A_Q*FHaURQB>dA?5KH?}v zy5~%;E|1-ekQZx}!N@K>nmbzZG54^fA&*^&i1qb(((MT}T$d;96;11)RFmrya4}M$ zh7+q!>?9^7ZW}DOAEJ5Vc&x!5`0NMjfggZtKr`@QJe@OYwEp?(%tA~iGtFspf{8Hw z6ZFF+CR=8e?-C1RTc>YiSz?AvtgFwRjYFw)Mby3llV>iQJQM3G1whvpIEbs!g0H4Vacpyyy*N?yrB5**q<| z!=&d)cN#b?h+cW4XNMGU9SiVk?QJN9~`-Yh2F zrMQ_sd$X8-=Lijavl~gE+f$4AL$yeBrzvk0^YU7H4be_%#r%}Rv^cdpJ&5Rz8XEmp zcRFWAF>kJ>za!dh=DX^W*_?2w8lQtL`0Oir8|G|pU7qV>o|eplsdJ6&8)GYgqCQ5J zNRQ6+8xZpjDwgAOkeiE&Q}Geas8Nj;>N%e|QjIJrkTuPr9@;>ldAa4XMwD7e#MMgeR=zW17>r0iju}uyV31$zY*ntw0Lj=_AFw&EW4g9 z@dL&BR6|OPsgV`M<9_ObSYPv#%vAk6-I!BjBi7qo!fju|95;uxQa&!Hs%>cYTo)$; z>Qs$#t!c8gsS!_^#QiknkT3t%etLASKOeE*D3=po(uKBrr-bBE<2y@v`+c;_+}zX zUN2X+N6K1c!=*cmLuKMz$E55!cRG4rlC67JEPN+cDF|-L=eZMi`t!UH{>C2KDLaOg z)7R#wVkdiKek6HH$%0YjE1I~#6*ui~E|^PRq30F^kq1$2iV3+>2!!tu$#-JpW*e)JPNUx@<0ahZZf1C4K4HWgqZsK1aDL^;sFtzk(<_3Z}<%J|?Af z#`1Ld?Z1`>ko&a5iaZB#6B}x>-!07_^xB8r`GKEFU4pL_ahSb&62*QxD1Rn&_*MQGW)p@0 zrf0(}96#0>*7Nn{Of2>*$|cjKQ?mW&?N(=6QJ^3_>4ky>{>KecAJtSRj_1=h(Bfs@ zbeA{)ho(Q?}Jy@jVJFTZJMgIJakE~K5l5Z>k^`lL9K|N2A8 zQl@<?viP2scGyckq4qM+$Yn@XpVeRS~ZIb;OgwK{-_cy$&j ztC+IpI8W};fOUT4dz!FLODHW^7erpC2iB>X%i#Mb?e*ahvWw38P)(N5a(surT$oAteZ5YC^u>wA!Kbj$idymOIM zy_L5Acre*X<3H}ojO63N{HQ{yKuJ%2oCNuIFY~j#B%00i^>uwZR|AP*CHQ6gbiTy0`)&95@kRyuZLAJ;4tSZCZJ3UBe0 zSZjKlmTXLOwPiI%DsTmHK^&rRWwZYu)NzxFT%|FaB1ksP+!W`k&HYESz3I74e$Fdu}jCFT`t+-AsV&07n@}_&m_Om#?78^_2$jd zPzZ~kr*WVAlCgBg=RV9lK2LD*%K_h2$%6Grx(VFUIp1}r{1%l<{j$H64P|BIk1lk| z7B|m)YuO-NJ>sxst4;N)eC|>ju&X!Su+3f;*#qZMMWK7e_H9=QnMYS{AMD&e zlgYV_iBdey#1Grt?oS}n9lhCvyhG~%yJXcCA)vxeY!-LyB;Qn|?Mx+P06q0}2;a7d z^#r@|-xcWi)Ixm$fx`#eedvl^eb}~TR}?QSViM(_ETqw!dy=!XZ$*&9WM8T6Fa(tB zj;h#L@qqBtGo%UKmtOuRoHwOQF1-!`+!d>9Weh(!oe}UPo&Hs+A-AZyDvB>y@WQnt z5Ctt9ziK#nLVfor$rp6Yo*5*De!FK3?>LV-?^QCt+Z)eBwl{*nqxMeZ&&`Fky4p*k zFrj$ga5n4jn@;@c{e8h+=iiY`axYs5#kN$O&4lr3ci5@xTN<-}44FYo_s8&k-eHZ% zER8t6L+|Ymmu<6*axGOIn84(Ipeufd{NjKY!P0XeiMM;3#xLJMT4}UcTRhZ+nA2yRV^>>-;d`X4Um1I-{O^(u#qlx^&X>9kwkC;XW7_c%P9Y8u$`-V8| z#YZ*x@n24*;^$tps3Dl`Ng7hgkF?J*UrhQVj*TW$XxXuB=c`lx!-r1LpyMAgqdKl) z3-bw;{m~S&IX}*so?h9X?GjEz*iVphI?AlHZT6lV}XTOR6A#*P& zquS??dp zGFuS&`N?$dmCp3jvw?g-GF`ntn!i2nC7=3!91S`*h%Xo?t)B4T9|!XO<0QIUV_$M$ zY@5yv<_%*dGEDI22IH62bLRruKN$lnU3qXqNBa6+AL@U;dzT92V6nl^rEDd#&bg*X`?e%p z6*YAi+h}5zD^32;#omyq@G#oW?FqE{hn{?10{!)e9{ltKNrpq|Hjp6r%cen zl~)M1!dJR7#a>bK6GutSM9{-mQdnPC-{jwom!v)+9#Zd1PhEB7d&Gmt%??YheLVg1 zYJ}@CJQTpH>238P=0H_6?q7!qI=B`>4$|mrVKVF)*fNnt_17k2NLQ}Chl9ZQrd`B^ zcDTMA{TE*kVlH$&3ftNnuI)`jC8682(Vz+ss<|Pwe`;yriXTn5@haP%-0*^b*WI|r zFN~vK-tZ)o=;5Ds@L$GC(`7L&x*5i6;-tlni=)qOM#?5A7!Rw%DhB=BmylI-_AgQV z=poW-prh5l43zD*5R}sPzdj({D$Ku5CFEl|^;SGvqi(&*26S7CH%dcpCzEOPquY^g zJ!2S~jaH*LKalyEBPE}^d~nB>&OP8v8*keWXo|M@!Vgxm5(}AF#7?h;V@P(5bV0pX z%I^3dwOy7;wHpiK9Ie&K5IXR#+e;nv(^)zIiTJ#aeS@JCse^*Jj{ojs<6ui&AJ;2U z|Co)jpx+7Qzt&lnh(cO&N9!8=Pcm$Q?+kXmtouiOOqjnZU5%E4mlq&UE+gLn9^oC>(kz=aIWS z?`?MctTfp6l&q{pL4UYAy4U##cvqb4Sx%fS4+kzBTAK4{usmL%2wAXT}zoV=u$wK&opdlRXVN)lsN}-9LyV?F^Yl@=_ zTYPL+paAek)o`_WAHZ{&$y1B4+5D;ozDqX18{X+M#p_00olY-LS=BQ;m4ZFYZ zfgj*5-S;Iv^soCLGrMl>$vm<3cju8IOj0i`oR}FNM6$Ep0}uYDnwHnUP4gb+^Bq;_ zYZ-3{rU?zc?|<{ zKd$MvHIQXPRew|KZi}kQ>AWXndWV7Jzi73(kkvFe_L3~1u_tYQqVq0AFaJZW7wM3v z%X_s-{ry+9hWAH<|5mFV)LI!x7qxV^ebCRU*CBt+cZsu-S;bx-WYz1nzvj5?0HL(q zw_M^yNt;DKk#ti3h*D4^y-8 zSDxgPuZ(kTNDkk(7t=Fu*URW(ONz)i;}%=8LH140msI_Mah4q^BlnFR+L3cE-U`;m zOUiao81J_ut-PBb=4THhFC#ttF8W&dsLyE%%V`Uf=k1@tGP34M8eNfyK-xO2t$I^N zz9#%HKJ@Khbo}Q&(gcnUI}i`q35)u-8CP~7-tJ?4B$?neC|%C6qayaqCY`am19^>@ ztGYRmi-fo9Chc%e83%MExn!vEn~r1Uy|lJYH?ETtEkDeYPTtUi@8wDL8#)_13B;9u>|v>O&iINz(#b&M z0fBgtp2iCTNrJrmortf#(cNsmRgjJQ{$bpKC7kf-QvC3*=Y*MAoG><<6Ka9!%Q)dX zpl=Q*`~h58&I!3I@Vjv?Xo3EDobVy)PD3cq=Y-(~PUu{KXE`G10AVHafbGDmg`5yr zgrCKWIiXz%rx)}kXm}MTqyUG3un+KV2hdYa7*z^}fL^OPAssjmEMCJ28Y3rc1IpKO zLZ@|ju>kx8#C^yK2Y_)Oal&uF=JlNL7+Cr-o~;3PWw-(c7H!~!uH~F?vm7H$_yj-P z1KLkHVKSfx4gik;%|=dG0PF;Q1N=8}f(}Ro-T>YO48VF|2XGkZ@fjX40r|kU0Kb_N zLV?-9CxFf8obV=45A@Y<;eLHz@oZz0r3C;~*5Eu(&0Be9M z-~#Xna65)}f#t`cf8%jZc>M$(C7i_DukSHhpz|q+5(sSMgmb{?)11)r4B`wwa6<31 zobWkt7nuAbCwvJEIfu~!Z)ARg?r(BJ&M)X3xc@8an!qeze+&8qzPJrf_>B|N zS~#KOJs4vvCzJtaf!~492QNYYa>5!T!mUF>)C*&QQXmC51l$HHjEmh!bdT`;oUjV010oLKQ4w$$aDwRs0#-5y)KI{Z{y(kt zJj4l0fGVJUH7CpfDDWeID}QTiP7h&cHn1}R=n7OAZ*?Z!yUxE1Cj~A7Z9u;(;0Ul1RV1$+Y30(Q``CtxKR)Qlfm0nHuEJ-`g$4)7GPk~rPPv;!OjY<}ki z4`3tkBk;VVKj2QlET9P33ETq+jKNCMh-eES+y^Nz2RH*b!#*q|&a0ul&ww4kUZC}{ z@pfm@EvC~GNF3PuloKZW1qD6h1Q#>>gCl~55Meb>1P>b`90kVO5}}_R5$s_FQ&!`} z0pV?opLh^ew@$Wp?d&^slC|&P;Mh@ZPlO@BC}09WjemHM?lE7nEEy5P+Y_M?*xi8$ z3mjlajzn0~kq8eu5n-{M2z>;U0V|z|@Rsv`^yL4yp4zz*AqIFG*aTb#y1*nC02Ris zJfWt9&P3P&+z0x0A;NHA4zLHXl7Ktmbx$IE26XmJfLcpQqVRT*d}368Jw0<=&(hsW)o8$;6K9`{Pc{-VRT*Z56w!)_W7Dc4V({ zyDzzq;8Q;`gE&?>D##q3Of$aUiv*J3sxNzyafCMVF>Cse3o@@hMDW6o@vC~c@--)_ z9`+%JJII|Zf6+Kc;4jfwuOj1|-d$5X{PHw;oOmSjW_)P*6+2^pH5u%%H;`~q!Gyyv z`m1`l8B5f}z3(@BIFRZ0Oc(2H9X6!`Z=5=*pHs6UK#d57|NA+)P&%S zW^(A%(CMLRp*_R4=I-i=LfG0E(tCTUK_kV_>169 zy6L(!-E7@lUAk_OE>oAKTdsSivx#aSC5ujto*g|u`qSvoqrZxN$RwI*;jX>XM>$`a zsXVGYsr*5CSJ^*E6%-!ydQfW6>>xLlr^-iVr|zH@)D?R5Np)_>v5?k~$05F&KALly zL80R@sQIC5LpOwyFpn@z*ut<6!^VaehTjY~h2IHp32zN=3&-Z)P} zlL>@uGOim!KG81<$_&a1S{{@iv@)n9s5EG8(1oBYK}|t7gG@npf?9%FgW7_^f+K@t zf`z}$)8#^AHT7lN+@HwE7eR;c=@`l*yEwJJ;%sftl$ zsg|qqRV!5`s#4Wj)q2$xRg>zb%A~rZYEiYS+VrY0b)-5*Jw!cJJyM;h9;+@@uT`&C zm#a6ax2U(NcdA>|t?D-QQ#BXj6QT&|6Vfk48KMpe3yBPg2^kVHG-PB*V#wH#2_fYn zn?kmPYzx^L(in0!hld=7{E~Mi%NADulX*x`%p)`h+S%JB9TO3k*|-g@+}CO$y5lD+n`& ztq(gKc0BA#SZi4O@J`{baG;=YU3h%>nDAG_=Y=l}7sEG(?+>pDKMPy4(+XO5ZH)F6 z?MQ8sc7paz?YmkEr`n@+hzQe1WJTgb;w?$S&)2>A0&va=~Z%65)K92f2sw%2mv?AI+S{XesIzIaK=%vxeqZ^}tjgEprotate) + Scanline(surface + 223 * 144 + wsLine); + else + Scanline(surface + wsLine * 224); + } } sys->memory.CheckSoundDMA(); @@ -183,7 +182,7 @@ namespace MDFN_IEN_WSWAN if(wsLine == 144) { - ret = TRUE; + ret = true; sys->interrupt.DoInterrupt(WSINT_VBLANK); //printf("VBlank: %d\n", wsLine); } @@ -201,10 +200,9 @@ namespace MDFN_IEN_WSWAN } } -// weppy = 1; + // CPU ========================== sys->cpu.execute(224); -// goto *WEP_Tab[weppy]; -//WEP1: ; + // CPU ========================== wsLine = (wsLine + 1) % 159; if(wsLine == LineCompare) @@ -213,10 +211,9 @@ namespace MDFN_IEN_WSWAN //printf("Line hit: %d\n", wsLine); } -// weppy = 2; + // CPU ========================== sys->cpu.execute(32); -// goto *WEP_Tab[weppy]; -//WEP2: ; + // CPU ========================== sys->rtc.Clock(256); @@ -236,8 +233,7 @@ namespace MDFN_IEN_WSWAN wsLine = 0; } -// weppy = 0; - return(ret); + return ret; } void GFX::SetLayerEnableMask(uint32 mask) @@ -248,7 +244,9 @@ namespace MDFN_IEN_WSWAN void GFX::SetPixelFormat() { for(int r = 0; r < 16; r++) + { for(int g = 0; g < 16; g++) + { for(int b = 0; b < 16; b++) { uint32 neo_r, neo_g, neo_b; @@ -270,6 +268,8 @@ namespace MDFN_IEN_WSWAN ColorMapG[i] = 0xff000000 | neo_r << 16 | neo_g << 8 | neo_b << 0; } + } + } } void GFX::Scanline(uint32 *target) @@ -537,15 +537,23 @@ namespace MDFN_IEN_WSWAN } // End sprite drawing + const int hinc = sys->rotate ? -144 : 1; + if(wsVMode) { for(l=0;l<224;l++) - target[l] = ColorMap[wsCols[b_bg_pal[l+7]][b_bg[(l+7)]&0xf]]; + { + target[0] = ColorMap[wsCols[b_bg_pal[l+7]][b_bg[(l+7)]&0xf]]; + target += hinc; + } } else { for(l=0;l<224;l++) - target[l] = ColorMapG[(b_bg[l+7])&15]; + { + target[0] = ColorMapG[(b_bg[l+7])&15]; + target += hinc; + } } } @@ -556,11 +564,10 @@ namespace MDFN_IEN_WSWAN void GFX::Reset() { - //weppy = 0; - wsLine=145; // all frames same length - SetVideo(0,TRUE); + wsLine = 145; // all frames same length + SetVideo(0, true); - memset(SpriteTable, 0, sizeof(SpriteTable)); + std::memset(SpriteTable, 0, sizeof(SpriteTable)); SpriteCountCache = 0; DispControl = 0; BGColor = 0; @@ -592,11 +599,7 @@ namespace MDFN_IEN_WSWAN HBCounter = 0; VBCounter = 0; - - for(int u0=0;u0<16;u0++) - for(int u1=0;u1<16;u1++) - wsCols[u0][u1]=0; - + std::memset(wsCols, 0, sizeof(wsCols)); } } diff --git a/wonderswan/mednafen/types.h b/wonderswan/mednafen/types.h index 4e2b24f631..570f96aa90 100644 --- a/wonderswan/mednafen/types.h +++ b/wonderswan/mednafen/types.h @@ -195,6 +195,6 @@ typedef unsigned char Boolean; /* 0 or 1 */ #error "Define MSB_FIRST or LSB_FIRST!" #endif -#include "error.h" +//#include "error.h" #endif diff --git a/wonderswan/memory.cpp b/wonderswan/memory.cpp index 1f76c4c576..5389f90209 100644 --- a/wonderswan/memory.cpp +++ b/wonderswan/memory.cpp @@ -23,7 +23,7 @@ #include #include #include -#include +#include namespace MDFN_IEN_WSWAN @@ -256,6 +256,7 @@ namespace MDFN_IEN_WSWAN case 0xB3: CommControl = V & 0xF0; break; case 0xb5: ButtonWhich = V >> 4; + Lagged = false; ButtonReadLatch = 0; if(ButtonWhich & 0x4) /*buttons*/ diff --git a/wonderswan/memory.h b/wonderswan/memory.h index d2e94761b5..e9d938a316 100644 --- a/wonderswan/memory.h +++ b/wonderswan/memory.h @@ -30,6 +30,7 @@ public: uint8 *wsSRAM; // = NULL; uint16 WSButtonStatus; // bitfield of buttons, indeed + bool Lagged; private: diff --git a/wonderswan/rtc.cpp b/wonderswan/rtc.cpp index b621ba0a93..4423bce87a 100644 --- a/wonderswan/rtc.cpp +++ b/wonderswan/rtc.cpp @@ -26,10 +26,13 @@ namespace MDFN_IEN_WSWAN static void GMTime(uint64 ticks, tm &time) { time_t t = ticks; - #ifdef __GNUC__ - gmtime_r(&t, &time); - #elif defined _MSC_VER + #if defined _MSC_VER gmtime_s(&time, &t); + #elif defined __MINGW32__ + tm *tmp = gmtime(&t); + time = *tmp; + #elif defined __GNUC__ + gmtime_r(&t, &time); #endif } @@ -58,7 +61,7 @@ namespace MDFN_IEN_WSWAN { tm newtime; uint64 now = userealtime ? time(0) : CurrentTime; - GMTime(CurrentTime, newtime); + GMTime(now, newtime); switch(wsCA15) { diff --git a/wonderswan/sound.cpp b/wonderswan/sound.cpp index f484d8f1e5..a94a63ee11 100644 --- a/wonderswan/sound.cpp +++ b/wonderswan/sound.cpp @@ -260,9 +260,9 @@ namespace MDFN_IEN_WSWAN int ch = (A - 0x80) >> 1; if(A & 1) - return(period[ch] >> 8); + return period[ch] >> 8; else - return(period[ch]); + return (uint8)period[ch]; } else if(A >= 0x88 && A <= 0x8B) return(volume[A - 0x88]); @@ -320,7 +320,7 @@ namespace MDFN_IEN_WSWAN sbuf[i]->bass_freq(20); } - double eff_volume = 1.0 / 4; + double eff_volume = 0.1; //TOOLOUD 1.0 / 4; WaveSynth.volume(eff_volume); NoiseSynth.volume(eff_volume); diff --git a/wonderswan/system.cpp b/wonderswan/system.cpp index b94ded841c..549a666b05 100644 --- a/wonderswan/system.cpp +++ b/wonderswan/system.cpp @@ -65,10 +65,23 @@ namespace MDFN_IEN_WSWAN cpu.set_reg(NEC_SP,0x2000); } - - void System::Advance(uint16 buttons, bool novideo, uint32 *surface, int16 *soundbuff, int &soundbuffsize) + static uint16 RotateButtons(uint16 input) { - memory.WSButtonStatus = buttons; + int groupx = input & 0xf; + groupx <<= 1; + groupx |= groupx >> 4; + groupx &= 0x0f; + int groupy = input & 0xf0; + groupy <<= 1; + groupy |= groupy >> 4; + groupy &= 0xf0; + return input & 0xff00 | groupx | groupy; + } + + bool System::Advance(uint16 buttons, bool novideo, uint32 *surface, int16 *soundbuff, int &soundbuffsize) + { + memory.WSButtonStatus = rotate ? RotateButtons(buttons) : buttons; + memory.Lagged = true; while (!gfx.ExecuteLine(surface, novideo)) { } @@ -79,11 +92,12 @@ namespace MDFN_IEN_WSWAN // how is this OK to reset? it's only used by the sound code, so once the sound for the frame has // been collected, it's OK to zero. indeed, it should be done as there's no rollover protection cpu.timestamp = 0; + return memory.Lagged; } // Source: http://graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2 // Rounds up to the nearest power of 2. - static INLINE uint64 round_up_pow2(uint64 v) + static INLINE uint32 round_up_pow2(uint32 v) { v--; v |= v >> 1; @@ -91,7 +105,6 @@ namespace MDFN_IEN_WSWAN v |= v >> 4; v |= v >> 8; v |= v >> 16; - v |= v >> 32; v++; v += (v == 0); @@ -115,7 +128,6 @@ namespace MDFN_IEN_WSWAN return false; } - real_rom_size = (length + 0xFFFF) & ~0xFFFF; memory.rom_size = round_up_pow2(real_rom_size); @@ -186,14 +198,7 @@ namespace MDFN_IEN_WSWAN memory.wsCartROM[0xfffec]=0x20; } - - if(header[6] & 0x1) - { - //MDFNGameInfo->rotated = MDFN_ROTATE90; - } - - - //MDFNMP_Init(16384, (1 << 20) / 1024); + rotate = header[6] & 1; memory.Init(settings); @@ -229,7 +234,7 @@ namespace MDFN_IEN_WSWAN { } - int System::SaveRamSize() + int System::SaveRamSize() const { return eeprom.ieeprom_size + eeprom.eeprom_size + memory.sram_size; } @@ -249,7 +254,7 @@ namespace MDFN_IEN_WSWAN return true; } - bool System::SaveRamSave(uint8 *dest, int maxsize) + bool System::SaveRamSave(uint8 *dest, int maxsize) const { if (maxsize != SaveRamSize()) return false; @@ -280,14 +285,16 @@ namespace MDFN_IEN_WSWAN s->Reset(); } - EXPORT void bizswan_advance(System *s, uint16 buttons, bool novideo, uint32 *surface, int16 *soundbuff, int *soundbuffsize) + EXPORT int bizswan_advance(System *s, uint16 buttons, bool novideo, uint32 *surface, int16 *soundbuff, int *soundbuffsize) { - s->Advance(buttons, novideo, surface, soundbuff, *soundbuffsize); + return s->Advance(buttons, novideo, surface, soundbuff, *soundbuffsize); } - EXPORT int bizswan_load(System *s, const uint8 *data, int length, const SyncSettings *settings) + EXPORT int bizswan_load(System *s, const uint8 *data, int length, const SyncSettings *settings, int *IsRotated) { - return s->Load(data, length, *settings); + bool ret = s->Load(data, length, *settings); + *IsRotated = s->rotate; + return ret; } EXPORT int bizswan_saveramsize(System *s) diff --git a/wonderswan/system.h b/wonderswan/system.h index fad4f6cb40..69d13b048a 100644 --- a/wonderswan/system.h +++ b/wonderswan/system.h @@ -30,12 +30,12 @@ public: static void* operator new(std::size_t size); void Reset(); - void Advance(uint16 buttons, bool novideo, uint32 *surface, int16 *soundbuff, int &soundbuffsize); + bool Advance(uint16 buttons, bool novideo, uint32 *surface, int16 *soundbuff, int &soundbuffsize); bool Load(const uint8 *data, int length, const SyncSettings &s); - int SaveRamSize(); + int SaveRamSize() const; bool SaveRamLoad(const uint8 *data, int size); - bool SaveRamSave(uint8 *dest, int maxsize); + bool SaveRamSave(uint8 *dest, int maxsize) const; public: GFX gfx; @@ -45,6 +45,8 @@ public: Sound sound; V30MZ cpu; Interrupt interrupt; + + bool rotate; // rotate screen and controls left 90 }; struct SyncSettings @@ -56,7 +58,6 @@ struct SyncSettings uint8 language; // 0 = J, 1 = E; only affects "Digimon Tamers - Battle Spirit" uint8 sex; // sex, 1 = male, 2 = female uint8 blood; // 1 = a, 2 = b, 3 = o, 4 = ab - bool rotateinput; // true to rotate input and dpads, sync setting because of this bool color; // true if wonderswan is in color mode bool userealtime; // true to use the system's actual clock; false to use an emulation pegged clock uint64 initialtime; // when userealtime is false, the initial time in unix format