From 6412d6d93e3a1c6eee63a5ec11f169d793e2bfff Mon Sep 17 00:00:00 2001 From: goyuken Date: Fri, 30 Nov 2012 05:16:37 +0000 Subject: [PATCH] gb gpu view: fix bug due to scroll bar hilarity. gba gpu view: implement scanline callbacks --- .../Consoles/Nintendo/GBA/LibMeteor.cs | 14 +++ .../Consoles/Nintendo/GBA/Meteor.cs | 38 ++++++++ .../GBAtools/GBAGPUView.Designer.cs | 85 ++++++++++++++++++ BizHawk.MultiClient/GBAtools/GBAGPUView.cs | 80 ++++++++++++++++- .../GBtools/GBGPUView.Designer.cs | 2 +- BizHawk.MultiClient/output/dll/libmeteor.dll | Bin 140288 -> 140288 bytes libmeteor/cinterface.cpp | 18 ++++ libmeteor/source/debug.hpp | 2 + libmeteor/source/lcd.cpp | 3 +- 9 files changed, 239 insertions(+), 3 deletions(-) diff --git a/BizHawk.Emulation/Consoles/Nintendo/GBA/LibMeteor.cs b/BizHawk.Emulation/Consoles/Nintendo/GBA/LibMeteor.cs index 921fb8917d..8e6b134d63 100644 --- a/BizHawk.Emulation/Consoles/Nintendo/GBA/LibMeteor.cs +++ b/BizHawk.Emulation/Consoles/Nintendo/GBA/LibMeteor.cs @@ -250,5 +250,19 @@ namespace BizHawk.Emulation.Consoles.Nintendo.GBA /// [DllImport("libmeteor.dll", CallingConvention = CallingConvention.Cdecl)] public static extern void libmeteor_writebus(uint addr, byte val); + + /// + /// type of the scanline callback + /// + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + public delegate void ScanlineCallback(); + + /// + /// set a callback to coincide with vcount interrupts + /// + /// null to clear + /// 0-227, 160 occurring first in a frame + [DllImport("libmeteor.dll", CallingConvention = CallingConvention.Cdecl)] + public static extern void libmeteor_setscanlinecallback(ScanlineCallback callback, int scanline); } } diff --git a/BizHawk.Emulation/Consoles/Nintendo/GBA/Meteor.cs b/BizHawk.Emulation/Consoles/Nintendo/GBA/Meteor.cs index f0bef366ab..0e624d6883 100644 --- a/BizHawk.Emulation/Consoles/Nintendo/GBA/Meteor.cs +++ b/BizHawk.Emulation/Consoles/Nintendo/GBA/Meteor.cs @@ -25,6 +25,8 @@ namespace BizHawk.Emulation.Consoles.Nintendo.GBA { if (bios.Length != 16384) throw new Exception("GBA bios must be exactly 16384 bytes!"); + if (rom.Length > 32 * 1024 * 1024) + throw new Exception("Rom is too big!"); Init(); LibMeteor.libmeteor_hardreset(); LibMeteor.libmeteor_loadbios(bios, (uint)bios.Length); @@ -46,6 +48,8 @@ namespace BizHawk.Emulation.Consoles.Nintendo.GBA LibMeteor.libmeteor_frameadvance(); if (IsLagFrame) LagCount++; + if (EndOfFrameCallback != null) + EndOfFrameCallback(); } public int Frame { get; private set; } @@ -376,6 +380,40 @@ namespace BizHawk.Emulation.Consoles.Nintendo.GBA CoreInputComm.Tracer.Put(msg); } + Action EndOfFrameCallback = null; + LibMeteor.ScanlineCallback scanlinecb = null; + + /// + /// + /// + /// null to cancel + /// 0-227, null = end of frame + public void SetScanlineCallback(Action callback, int? scanline) + { + if (callback == null) + { + LibMeteor.libmeteor_setscanlinecallback(null, 400); + EndOfFrameCallback = null; + scanlinecb = null; + } + else if (scanline == null) + { + LibMeteor.libmeteor_setscanlinecallback(null, 400); + EndOfFrameCallback = callback; + scanlinecb = null; + } + else if (scanline >= 0 && scanline <= 227) + { + scanlinecb = new LibMeteor.ScanlineCallback(callback); + LibMeteor.libmeteor_setscanlinecallback(scanlinecb, (int)scanline); + EndOfFrameCallback = null; + } + else + { + throw new ArgumentOutOfRangeException("Scanline must be in [0, 227]!"); + } + } + void Init() { if (attachedcore != null) diff --git a/BizHawk.MultiClient/GBAtools/GBAGPUView.Designer.cs b/BizHawk.MultiClient/GBAtools/GBAGPUView.Designer.cs index 70422c79ae..2b7ab296d1 100644 --- a/BizHawk.MultiClient/GBAtools/GBAGPUView.Designer.cs +++ b/BizHawk.MultiClient/GBAtools/GBAGPUView.Designer.cs @@ -32,6 +32,13 @@ this.panel1 = new System.Windows.Forms.Panel(); this.label1 = new System.Windows.Forms.Label(); this.buttonShowWidget = new System.Windows.Forms.Button(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.radioButtonFrame = new System.Windows.Forms.RadioButton(); + this.radioButtonScanline = new System.Windows.Forms.RadioButton(); + this.radioButtonManual = new System.Windows.Forms.RadioButton(); + this.hScrollBar1 = new System.Windows.Forms.HScrollBar(); + this.buttonRefresh = new System.Windows.Forms.Button(); + this.groupBox1.SuspendLayout(); this.SuspendLayout(); // // listBoxWidgets @@ -72,11 +79,80 @@ this.buttonShowWidget.UseVisualStyleBackColor = true; this.buttonShowWidget.Click += new System.EventHandler(this.buttonShowWidget_Click); // + // groupBox1 + // + this.groupBox1.Controls.Add(this.buttonRefresh); + this.groupBox1.Controls.Add(this.hScrollBar1); + this.groupBox1.Controls.Add(this.radioButtonManual); + this.groupBox1.Controls.Add(this.radioButtonScanline); + this.groupBox1.Controls.Add(this.radioButtonFrame); + this.groupBox1.Location = new System.Drawing.Point(15, 220); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(117, 173); + this.groupBox1.TabIndex = 4; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Refresh"; + // + // radioButtonFrame + // + this.radioButtonFrame.AutoSize = true; + this.radioButtonFrame.Location = new System.Drawing.Point(6, 19); + this.radioButtonFrame.Name = "radioButtonFrame"; + this.radioButtonFrame.Size = new System.Drawing.Size(54, 17); + this.radioButtonFrame.TabIndex = 0; + this.radioButtonFrame.Text = "Frame"; + this.radioButtonFrame.UseVisualStyleBackColor = true; + this.radioButtonFrame.CheckedChanged += new System.EventHandler(this.radioButtonFrame_CheckedChanged); + // + // radioButtonScanline + // + this.radioButtonScanline.AutoSize = true; + this.radioButtonScanline.Location = new System.Drawing.Point(6, 42); + this.radioButtonScanline.Name = "radioButtonScanline"; + this.radioButtonScanline.Size = new System.Drawing.Size(66, 17); + this.radioButtonScanline.TabIndex = 1; + this.radioButtonScanline.Text = "Scanline"; + this.radioButtonScanline.UseVisualStyleBackColor = true; + this.radioButtonScanline.CheckedChanged += new System.EventHandler(this.radioButtonScanline_CheckedChanged); + // + // radioButtonManual + // + this.radioButtonManual.AutoSize = true; + this.radioButtonManual.Location = new System.Drawing.Point(6, 81); + this.radioButtonManual.Name = "radioButtonManual"; + this.radioButtonManual.Size = new System.Drawing.Size(60, 17); + this.radioButtonManual.TabIndex = 2; + this.radioButtonManual.TabStop = true; + this.radioButtonManual.Text = "Manual"; + this.radioButtonManual.UseVisualStyleBackColor = true; + this.radioButtonManual.CheckedChanged += new System.EventHandler(this.radioButtonManual_CheckedChanged); + // + // hScrollBar1 + // + this.hScrollBar1.LargeChange = 20; + this.hScrollBar1.Location = new System.Drawing.Point(3, 62); + this.hScrollBar1.Maximum = 246; + this.hScrollBar1.Name = "hScrollBar1"; + this.hScrollBar1.Size = new System.Drawing.Size(111, 16); + this.hScrollBar1.TabIndex = 3; + this.hScrollBar1.ValueChanged += new System.EventHandler(this.hScrollBar1_ValueChanged); + // + // buttonRefresh + // + this.buttonRefresh.Location = new System.Drawing.Point(6, 104); + this.buttonRefresh.Name = "buttonRefresh"; + this.buttonRefresh.Size = new System.Drawing.Size(75, 23); + this.buttonRefresh.TabIndex = 4; + this.buttonRefresh.Text = "Refresh"; + this.buttonRefresh.UseVisualStyleBackColor = true; + this.buttonRefresh.Click += new System.EventHandler(this.buttonRefresh_Click); + // // GBAGPUView // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(636, 405); + this.Controls.Add(this.groupBox1); this.Controls.Add(this.buttonShowWidget); this.Controls.Add(this.label1); this.Controls.Add(this.panel1); @@ -84,7 +160,10 @@ this.Name = "GBAGPUView"; this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Show; this.Text = "GBA GPU Viewer"; + this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.GBAGPUView_FormClosed); this.Load += new System.EventHandler(this.GBAGPUView_Load); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); this.ResumeLayout(false); this.PerformLayout(); @@ -96,6 +175,12 @@ private System.Windows.Forms.Panel panel1; private System.Windows.Forms.Label label1; private System.Windows.Forms.Button buttonShowWidget; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.Button buttonRefresh; + private System.Windows.Forms.HScrollBar hScrollBar1; + private System.Windows.Forms.RadioButton radioButtonManual; + private System.Windows.Forms.RadioButton radioButtonScanline; + private System.Windows.Forms.RadioButton radioButtonFrame; } } \ No newline at end of file diff --git a/BizHawk.MultiClient/GBAtools/GBAGPUView.cs b/BizHawk.MultiClient/GBAtools/GBAGPUView.cs index 734f49fc49..31559a97a4 100644 --- a/BizHawk.MultiClient/GBAtools/GBAGPUView.cs +++ b/BizHawk.MultiClient/GBAtools/GBAGPUView.cs @@ -35,6 +35,9 @@ namespace BizHawk.MultiClient.GBAtools Buffer.BlockCopy(tmp, 0, ColorConversion, sizeof(int) * tmp.Length, sizeof(int) * tmp.Length); GenerateWidgets(); + radioButtonFrame.Checked = true; + hScrollBar1_ValueChanged(null, null); + RecomputeRefresh(); } #region drawing primitives @@ -659,7 +662,22 @@ namespace BizHawk.MultiClient.GBAtools return; if (gba != null) { - DrawEverything(); + if (cbscanline_emu != cbscanline) + { + cbscanline_emu = cbscanline; + if (cbscanline == -2) // manual, do nothing + { + gba.SetScanlineCallback(null, null); + } + else if (cbscanline == -1) // end of frame + { + gba.SetScanlineCallback(DrawEverything, null); + } + else + { + gba.SetScanlineCallback(DrawEverything, cbscanline); + } + } } } @@ -688,5 +706,65 @@ namespace BizHawk.MultiClient.GBAtools { ShowSelectedWidget(); } + + int cbscanline; + int cbscanline_emu = 500; + + void RecomputeRefresh() + { + if (radioButtonFrame.Checked) + { + hScrollBar1.Enabled = false; + buttonRefresh.Enabled = false; + cbscanline = -1; + } + else if (radioButtonScanline.Checked) + { + hScrollBar1.Enabled = true; + buttonRefresh.Enabled = false; + cbscanline = (hScrollBar1.Value + 160) % 228; + } + else if (radioButtonManual.Checked) + { + hScrollBar1.Enabled = false; + buttonRefresh.Enabled = true; + cbscanline = -2; + } + } + + private void radioButtonFrame_CheckedChanged(object sender, EventArgs e) + { + RecomputeRefresh(); + } + + private void radioButtonScanline_CheckedChanged(object sender, EventArgs e) + { + RecomputeRefresh(); + } + + private void hScrollBar1_ValueChanged(object sender, EventArgs e) + { + cbscanline = (hScrollBar1.Value + 160) % 228; + radioButtonScanline.Text = "Scanline " + cbscanline; + } + + private void radioButtonManual_CheckedChanged(object sender, EventArgs e) + { + RecomputeRefresh(); + } + + private void buttonRefresh_Click(object sender, EventArgs e) + { + DrawEverything(); + } + + private void GBAGPUView_FormClosed(object sender, FormClosedEventArgs e) + { + if (gba != null) + { + gba.SetScanlineCallback(null, null); + gba = null; + } + } } } diff --git a/BizHawk.MultiClient/GBtools/GBGPUView.Designer.cs b/BizHawk.MultiClient/GBtools/GBGPUView.Designer.cs index 70e64e6ff3..c471265e2c 100644 --- a/BizHawk.MultiClient/GBtools/GBGPUView.Designer.cs +++ b/BizHawk.MultiClient/GBtools/GBGPUView.Designer.cs @@ -211,7 +211,7 @@ // hScrollBarScanline // this.hScrollBarScanline.Location = new System.Drawing.Point(76, 45); - this.hScrollBarScanline.Maximum = 153; + this.hScrollBarScanline.Maximum = 162; this.hScrollBarScanline.Name = "hScrollBarScanline"; this.hScrollBarScanline.Size = new System.Drawing.Size(192, 16); this.hScrollBarScanline.TabIndex = 21; diff --git a/BizHawk.MultiClient/output/dll/libmeteor.dll b/BizHawk.MultiClient/output/dll/libmeteor.dll index 1f05942894e1414fde4337bed5d3383f375ac2a9..75ccb90052dbc05d1bedf3510dfaef3b288741c6 100644 GIT binary patch delta 43486 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 aN526@RzcAuV~(G}Q}m*tzefaaUiyE5rR3-U delta 43463 zcmbrn3tUuH*FS#tFuEwQZ5gcX&KVw&^+u6@n`n!TU*_x|Ct&f0sewb$DBvu|fl z#wk zI5Tu%dw4fI$MOWj1olQzfngW3?cQLp7Vf3TK0H$L%=-oMEzx{Oh*L_B6B_-LMz7L* z)xLRf<~{=e3yx%(&LIouOn1=70>c2@y9ET(+!UX6m@i;%>v)>l_c4e^I=*G znaS}+=jVmqc7wIHS*5!--{uh*d`9q-n+j})DiYYffxqJ6$7?NUg@FdTWc2*&p?wyx@E2lKQRjL#tN$SiD zCS{#47Fs#?Z0{dW;YscgF&n~1@+!}8Gtp<27x)OouX}cE6J6x^#|!v}JRt$OhR=J|xS8bXylP=jR1AvcX#E9>Kph%?oJZ zCQ0_#FsmBZ29EV%yO9RrKgp+hJ<59V6JFh!AOFp3e(PPUOuhXdh*ET9fG>}A?GKDnJfqDJQ~Wi2)v*)l$*^)?TG4~SIq-ex~;_3>aqyp7K> zcA@A?pE%a4hDp+la=D_%xg@y~QLSdYmtP0NRwJM2*O%?%Iexv2NZ@Yn*(N!t^0w0% zS(+DjOTJw>!pDLf${S&o|IBq$qi^%fHp4qCgg|B7E$EaQL@GyE;g#e+E8HaYD}K36 z6x+$$`uAwobBV~t<3@?E@!w~7_Q|4%wk?=p`AQxWATtNA3dlF4tl-Ik{)V~&zA|tZ zE99X;KF!XVVK>gZEDGv+^#1tZ5M3#>p zd{r}Mgt3BpxMfo-GI6DZ7^*)7@U7>ELwYcO{!_^8zI#0l))J@FX-morJ^^=L@ILW8 zg=b+YJ&w?$gdY3xP=DYnLxYR~%b3Jx-VC;>NiR!MraJ{HMTJ)%7$He1dBHoW${j}a zjQl*ZH1fj_oG9CrJm1?8%L|rF)SVdVnP>i0km~RR|0OiG@?quLK{HVihiOViF4MDdmFL)%2D!n;?UF@+JmaG|s?9u@AL_Wo0R&k@g( z{UnmCZkbDbOZFmoN^X(Tr1=_UI#I3=C03`5BFY7#^wlZ-iBd(B(D}SwhaAhE`!(IQ zR5{I2{Jjog?MMEk(MpJRTiqpMWXawGuO6%G9omhUGFn7*wff2&;YibBvt*v|rD!pE zNb^nAVli3sjnQH-avq=Bad2x3qDK9QJnq))$WQu~CaZt**E-%dG+$iwTG%H><4Z8h zmv?)K@AHc_El$;hi@dvgvQfXH%VzF1;(1v-RXhi|U&V8|shhyH0U6Qt@Jnf)748?v zQ7P!qDiu`2FPqQt89f4Rq~@SxLYMnd*(J}&&#(Vpa0a9)WxpD;e)KH+v1OhwiCBsU z%9UlRDXYe_tfo~?Y1+_1?qqd&)b&aVoz^lVx{ltFqwn|vG6ia2QM^=qnR=wMbXlGc?R_-4@*mQ-IAMmZ?)5C*1k*5|3 zBaGleS=xe}YiaWb^`jhFK1()N^R3|nVg*b7y5JnBDYEI1RFBHt@uQUHAE)G*x(VUg z$>;-}hX+X3Q-J>fE&-?`nS^p@sTX*gp6yu;U)s}`=SR33QZJL!^8}d2R2A+(c7-VJ z>q(qH-qVjC?b)1N1z2s+;0fDD5Dc zseC%~l7unR^{)ax>|myHmd|E>M_tGDuLC~s;5(3?9oPpWZPTD39VwA1mJc>k;w{Br z*BTtTz2hyHhn(ooJbawKz@)D8KzSoGBcBMol zDEo%+eS3@)s%L)_zUpIC4b)S--{AK5y?zfJJMPdCg-n4)UB|UMbf|pu;J${nQ~2}q z2W%YT?;jN|Nkt)*?sM?A-)@uK)Q%v~YbIjIFk7z?=*y$0f@L3RR6~Vtrtq26R>C(= z_`Fpkdl`Tv`!hw^Q==Lh2&9(bcZ=1s~O5F zub2PK`tg=rq3&yOKbhA|7}Xv8=8#D?(yi`+*1{+Rw~sfL2#NwqmPmxDsC6L)QO`hg zr8^n<0tVHbZZOo3B1PIyYr*D_q9sigjVFpo@pzLaGn6PI)#JTOJcYIHG5pNX4lR}= zNm-@F!c-`5Ea1lI&MC`=Q@QH|yG^t6#H&F1r)ltHy<)&2~EPPs0ebjLH z4&Fj(h!|*DS?NyP2vk({F`geCJV(T2%zcPlIH`2y#6Y5m2)Gi^nJ8Lrd231XA&Q8| zc&kP+5JgL*k4CBE=3!k71H1G7!`fS}PonvccgbIf6N;Co3>)OxGa5-X`}5a_b!8d+ z(_sO&D9l^b4WUe07feyQR?gCV#Y8Aol8hLb#H%ATJ=e+&X?_R``BVwjVWE_uc6G6g zVEG0K7KWP(rHQK9#WF!(s1}F`eSc0A@w!%SO>C#*^-j)Mp!5(X_5Hkr zxk=JNk-`(f3>AwCeJE)9)D>MXLcyw~cwM~>Rh^0;N&Y>jE*bA-6MB>MKrMKuyYxBI zpznHh$1=fA$$N%^tIl>z!oWw=*GspwB3ZAC*T2L3Z)HohS)z-!V3$?6Me&)5q!zcmmNS>x&z$59=kY&(yLdQT8R% z9eN70LC5XJ7`t~_Q{$IlQZw%9GM>yYKG43?`x7N=6d(q0cMfetELs9Wc&AYbGelL( zMDxpwyI`N7_tZ<_w@)yAK+L?jbLyo?CRvJ4<&C>+pU_PGLinof6TI^hYt)nQ*(bEH z6rWQM2}Y@X0s>u8_wvt1t$1+BG?DG|fRLvNdaY>ZhYZNjGvMjQ3>XIfJalU5(eR z&GWstwe`Hu7+-dTvj>A&6%To^ecR4Ww7;>fLHm6|d)#hK`&Oa7&ZYegpL=Wnyt^wc zqqkaVIomCBoPhm$ACm_crF=Xza?pjlD+(bYuM+ zjeX2pjU6_yMi{f7A!Dc2VQufxGDdgPTSnpqtza5j#w%l6cDYB(_!+AMTIICDC0fQK z{49*!(u~z<#-8%Ohq0WlE@S8Zcg8w57#oY3t}s@}Um6!MOG!k30B8fayCozfN!FvF ze|8UE^C^;b1^6=H?rjQ}6EyuU+oHtdnHV60s?v@;fG=2*Dxv6~2_^~0Pv0ds( z4aPtX<}93+VzeYZu=4Q8upS? zv~8{z)>K!Wu4r*@YrpbOU#NN zS*^ePacth5|>e)3#VPO(7is^v;;D3IO^#f0t$129_rmeL25BqpM*4XID> zESqVm-u^r$gluAo7dm$J#~w87GvYOGEHc)56uH$JiriHxkOrg?yl7I_*m+PdN7Gt- zj?k#i)gdA4K? z1+3r&iLFOI2NzM_04~wp6~Jcz^#Bj>S^)0GT@m+P{D*f<>Y+K) z__U;;K&?hh!BB~6#Avi-+B}G>Q-^ip`AL&B(aYSC)W?=PUsQlqKo~5=CurF+ma=6A zYJgnU2`iv9da-OLl({JBhM9Ui&CyQI77S9FseVVsxibcx{3h z&bqnNM4~oUuFm`pSt@1zCGi)hv}`9zwSz9A7pgl|Gp$fhO$qZ91B2)){^yj9-o?-9 zP4r83EPsCLDE24+dTP{z7eq>OswsLHe@xL*GS%a*F6UEi%$*VB>J{!a{+KpxP}=}9 zqjy2CY-s2eA~*0ir?pRxore{_ha{^5(9n`mkMNf-JuF#?-v&5LclQAv2ABhQ43K^g zJPT3(5aGU=$GcCDOc0&GOPDaMJB2g#Ea^RFb zZM=tkTCP+VAOL!eyf`&4{jywM8Fv*?%8>t5L)-JWr;pLf{!@N?dd!geN5l*03XnEX z9*2hikAd=3jO)?1?>$hy*Kpv*dSsRuD2Ko$-q6c=<&0h(C_xo*wv{uz8gm0S}Y-kn2kId}& z(A0$@38R44C0>;)v_k($LZPolx?Qb$z(K78`~99B*i_20e>Cc4Ewv78_$+_DJ^S-H zvnFdDYHN(^FaY0g{`W8v{^H#C~di07V8e+W@~W;1$W?7E!U> zkpl5*spEZ;I{W_g_6w@leWWe1` z{EtPFbvj@%e{pW0vNMZ?^L=x(n$t#G(v*}T?r(eYVGp&j(FU8PxW0gP&U#cvevaKQ z5-B8qPN}Vh`no4dJDR-Gnm-C?Z>~pWAt7-6)%r6|ry#o1;<`>>qZZH}T{QY-TUtAa zlMmvpKM=cHXQ(nq6HQuU`=x;P^fb{95G5Z(+t4WD1F`k>x)3M2wC0xr+6L65!yrvQ zNVm0P$Sp}9h>fx3LY_DzPkV=r^5knGU*(BKYIURtKr94M{h=tOfbu|O5^^W&KiK`H z_1CHtkxiI=rWC#nfk9?U#A@#pkz9?2A@m?$iY$={yU3>onJG?0CajZ_NSsU)ov=&1 zbdWn`^6C~TvY8y%nIMymt4Fj2@{d2-)iI>*_2mBZLJe2Bfs=6QHg;`ObZd2NkkmXGh#W(aiX^iqZmT{*#+J=5Tw?$UTK zo=ZRPHNOu|k<6Ljo7sx;=fA>CrZlZ*=lvh4Xxr@x$+{4*8n6zq18@ZJIrmLXZ8kGq zLX~xf*<<+H)DPP}g^))87Xg0&+`;w-4CV_KbZeHjTocZj%C|14YWo}*g@AH^3NVA+ z7ciM;F8r(?4H2X?cgIH5)U0~n6{D~cc5Ve;na_XjbUMPna5|eVWamW&`E{UIvWT zAszTBz*ay3;B~;8fPDaxdmnH}cegwS#|glPfYX34c=V!3o{`(1J;T>7s=zT3Tb>`E z_gEjpidXsHtNIw`y~-n2_vJm;wdR(^1K3plz~blFOGRHUUe4Gz9k&Vo4p1P8d~BJBu*As4{(!f%$T_GL9|a z53EcwIJfdwSB_>U_~TDT@}MUtvSD!LuoBLm?#sJ8HHr0wE0Vwc)I`JHSNW1B`|!x8 zR~deJk-z)2FL;$tf5f`-jjI;0mi*SLzJ}Y+A?nYvEMC0&IW~zuu*L>=<(lX4oML<2 zaHWu+vMpviiUwrtVmQxoF|#iVa>k@~755!>s)8wfzi#W%H=qq0N@!O@jFq z9qw4TC`jb?+W~8Ta5@)Cc6%&TFEk}Meb=LfWS#Iy6~z!aZ%qC^&Wi}e8Bv!0D#^&+?^1G}pcgQcZ zQ9Nh;B*Rd59?`Z9{~ZPc`Fr*_7R>AI)rS3B_(vN$8lKz2f7{T7tHx&I&dWMuV=L+Nq zcKcO5T>FN4sD8ik+!ux$zW;?kzbSm+Dx!-# z>!f~&uE3Rpoz+0h*6f>!KM|HXiFnxK^2uzNx|sJ?7O_5js}jHt@M0y3mGLXe1h$k9 z-7?%T;TayfJ(Rz?Wv1b?OgIPfelI2(?k6Wv19|0(afZ?ic-!;dFCEoNyA5}Lxq@Bd zRWHBo8SjqQzZ%Xnx9$sgxdySKA|9aDp>wh)=2Lw7s~x}N@9y#8v$xF)_979z=m)Da z8l?uQ8!ic{tJ@-34)6NPx9oN9`D&S`RT%h|fBNbK!`n|4g>IkA3_ZRk(NJ&6K3dwf z4ZYkeSoPg5S$7v`XA!iH#9CBb(1M|tsMxU#IXtK^l#Sri3zxGC{4==U{RK;I^XB7K@|Mt#o&j=4H%c(qZ-)heo;XcE^+Lyte z;M3n7iQ!(syWOeO-?bZBALH-7)rK#7ud~7DL;lix-+IJDUhU1-6m3CQ&}RP>>Z12Q z$o}Am_rJ;}@)_?BvHDe@>_0AZn6fTeWTSl!fBpT3aKg>&z#jG&FFG*F@Y%!s?*nCq z78Sg-*w>&`^5;w1^19+cR=~YW76v4pbUIO=hRCPn>*^l7CGCk@Cg#q%rGCTnOS&4a z9_Qwgj{KXFrwx;jBYJ-3uMT4A=@2HDfV`sB2m3HogLe*v*%n|{mUM_Vxa~`=ZpVk5 zexl2yjA%L%5&A?>H0`J_b1xzGy0*Fgx7~>`JZ8x0W#?yfKfZ$kCpQ^3VW)jPNJ)oi zi@d2mIzB=AXdfQ>h^^@hB~GJ43f)v;$v(d9a3@3k2L9sVp6zJIFK=>~x24!;aLOQ` z_e&sc$;P^}blv!V3BP=}I}RUOjs*McBSvult^3o$cgGoKCP_Ws_+UZYJ=B&&0I2{>Z)a>Yb#zu1GgJ+u`JAgsb3GaCIzyY36 z+K!JrHjC|3miA%3%{#hS0UGPOV^ee%v-9}UM_GG*q%^Z9B5 zx{vZ14K)hY=?Jf^xF4N*v&uxK@Hv(7W_h?t9&L=L{rpKE@!*fU7M-m8*}%H+eIL!? z`z-Ff-^Z&ASI_aHkC&OcekE#*5ARv^Ivc{zR7Lc8?Mw8)fIk7`9&=8zE&${L&H+LJ zy#PZ29}yJw`{X$mSn@g|TZf}J*W?L7a#@+`pH**O;VrjOUn#nHdacpmw}YpC(T-g! zTKmN$#&+=YXR6qLigy2JB*OsUx3ep-Pxr`|^Uc%0m#hy176Hjirgo?6JQaM3zbrTb2}^dP(8 zq#%2N^UV9~1~04HAEVI{$*#0d#f16YUn85f1T*VO{9t!0|Ml14-sIJW{Yg_&Gd!`U z@D+BKgiEelC?(~kSF0CyfFe#GALWC8>)fpm!fa2(W1aa)JaZE-e~%DRyrq zXg{sBm3lWrYQ->N_hLac9>qp)CElzYMQ&m zjA@awuY`~?_5(+SS&HLB3#cL`$Yvj)i8#NlSvgE4qZVO~i@04o4)xm*Ekt`tJk;;2 z3+N)WFld05m{1(tq42UVsfkaRXn&R>8-I8S|GmzyQ8o&)5wbZ{lcmZlWVhq2c>Li_ zyw~sTAP?QoTBL6=9J?ch;RzgO)Ve(QU#h{63%F}v49WVJK!bFKq>sBD~x<9Z9#)JM`%Zz;I zpF>z!QO%#;#y-NR$#N{A0~6&Vle;tXr3@18zRZ`(LY6GYM)harP##<#8Ar__=EZ~f z6hyjyLpFQEo9jzNe1_sJw=6JGh*t5=&$Tv_|Kd%&xo%0;w*bBV#%USAS-!dc1@=7; zzY%~oN9U0J>8LR+SMj(Tt(1(F%w0c;9EwxMoxG@^8c!HQSUX|NPu^(d-DD*yl(+vY zk(Kfle~oGxjPw39u|6eNU?|GeqrCdB37AfX-VFBm4Ev}!sz2i963*N8^u?g3fckA5 z_b{b+<rZ;vVZ4Q=EJ<)2^{DE-&ZG@{ox&9%MKMK6M)G~Z}ClV-{Jl6Wy#D0O^7u91V_ zDu>HHN^~vIw46G#!5D6U{Hs|hC-dL!dbYs!%km6=!kFiC{QX>ms?<(t!Y&=`0 zoHw$Q7!ww_vl%|6sduIIJ=LsOJ=h4gK$#5GvJ(j)wPVA=@TpR)dQ#c#!B!e>xhow! zS-8iVE{Nib%4APAi}g_6^JEiR&>|(4NNG^0UYw>_Oe~Z|D-kBvzvZJgG%oQ~lQz%H zS5|;*aAp?2V`83+4N{7|7#6KsD3)fdeTyTRSi=cDjLebLI)7zYGd4YNGHCjTL9VZU zaO#x4`&pMKQo(z}*nKePlv9Mtnfh#91ESBvnZf0fA zGIP%$X2mX()d`rYY-`EvtfaU{EB2`yGblHGQK#z_KR@<;&!X9AI1Q=DsxZvX>qq60 zOk-ZG532XiApvc!qI7Pn86W&LK= zbP}mQ17tZMnuT7n)H?4>cGF27ab20vSOcUqt_l|D6sFYZTM!Oj}7!P)jO-kVmV;Up|j`lI3xMwbiCmz^l5AhSYEGL z&Tgu(B|fkV(EshN|h3b+c(aR#(K5|#<@?HZh}Zyw}nG&rq;tulu)D3~?3iO{e+ zRD`cCAYMc2J4qPQM$;p`iyTcI;vv*-N&Zwd3vt)lO;)8bPq1sJ7m$>itZCD8s5Vwh zr#w_76NklKK`MpiZZLg(5=BaT{kamLC2BV~4ZZHZj%-e!4n3K5B;X-{9Wc0;23S9l z1R#3Q=1c+oX~0X$@G#ce{UV$fm1$wDfUQz)hOtmv=2Sff^2cg=!oNkJ`NYNupv*Xo z$RCT-BbEbyslih)2{0a|qO(7!A93~q?GTzSp0pY+M)>Kx^0Cl+Fhp@?b ztb5%NsoK%<$65@MC2siz4$Y3TGBnU z@Lh=VQdid17N$kQAE@cLt4aIZ2*r2B>YU*`{>xn>w}zsi?xm>~dY?8h$B0_f@N%TC zDrUeq?d?d`#jClAJdR1;qpxaEM_-gT_Ej2L+0YGTKT{-Wb9_URuGRiyjrU%;THEyX z-(+|jj^m&!HJytZbk?@JGf(sq!qTl+nS`q1#9Iv=!hr6qFDp_Oc4rTDN{V9EIe;~Q zJ6{K~^Ka1n`!VYX<@fG*uRI0kbAY#nx6>s!YXP39F?WaT2U;{>k`mX0>5HeQl$;)H zXqyL7>ublz-lAe_=gD@X0xNxjS!<=X2kXErN{ev3WyTH?6*2}$E5(0LB+VD@%&swR zG!>w{N)>80&-{N;LoYKMT7HVFPSe|LAm0DknzEHZcaGlvhoRd&#%=fiZoADQYmYehhpbPz$&TXbxH+pa&oZ zkO-I$SPsZn-tWZ*+p42QwLbyms`jo|w=l|vIzEM2b$mGm}dRm^ZOTZ zxIt|H|uR>=Mg_aHtF%`K7?6^10Dk0U9=pukfA6J9R>i80Av9s0KNqOd%$mi zn}Cl2twHw$94-E(59a7&N@GNM?FT}Yq?G7ge?uii-K0sRYtD$iO_LH!1LgT^5Yi6V zS!|DDFR+Qb?-vTU0^O;w>4e};oy56QEm4x8VF_TJlHQ+18^Ys?_xERiGux;*VPGiG z|33q=^GB%n8-dvwAR?AouK;cX{Gt2K%x)acDiMRwt;|#=4Px_Xs(Ww{dz5hJ!R!=p zaou3{9V5q?p=_0bI1}$<&)Ig5)v^WX|8K0HMeN=OTm~eJM2mcYS&so88U+)86{DGT zGvFHF$uUUbgUsq1jmKWVCx9SCq8DJ4k{-h*u{!0$7#7)kdp{ZvxL!h-eK(nWmurKJ zZ-j_G|L!rIy=D#v1@mZ~^v!TKy!V%Y*3-L#py;o+!{~U=)7G0eNf}r*f$abpnDF^AMD$t0BEVC97-$)w4vTa469!n z*r=u*glmiSv9nq?07`vns*&}br}APfv$WX>0mmTpZ(`Jm{*Cvi!c-#SnE&LHeeN}2 zv}h5~3ey#Vl*VK{*TjAnG&tH~8t+oyLFs`5R(&SlQ}ZjJqHZ>AW&D^JF;c75DM zusetJR&|0F%vF);z7BmX+)p`$U=JLK&?y%Vr92RspY zKk#v|8WmUWI-C-5T?4sJ34NhE8JE7nQFbV12d2@>fV( zu{M*XYhY^q_31}49T>-yS`JGTJz@~hx|gZZ=*`e_;0xFM%t{S$4cb(UCL0BG=N!MW zdWecY1r_fRZF*a-HbW-K<(S0JCN(sRpQ@>eCzJY^yrJ=H%g8RtC7NVvQ%U{BIHNrO zvB}K(nDYB5*1EkHBwmD<@ZBx^BIp-|mG_O#`@*CB+7)%RY2=R z&w>8x&c$180lU_uu?-(KJD1r188g?yvK~iQW_Hz7g_0^)wriQ$9p`>z=NV+q1;C&8 z$iosOq!XY-DI0@n!((u!1J(<#J8?^t|BhjgJy@d|IRo^+>#LE*rd_q{+=ifg0p-eD z53;diS56ffun6e?q!2HwD1;pWn6AW)WlzS1&m@gGp+F6@;{S&eI@1w4)m+>spmLb&SqyhaOvcdJT*3K*GRV;st(78FE zblx@Fj{Goh+||msdRl$KX%Lh0)p*ve>wXcyz8gqyH< zfejl_trx%l~1~Mwyi0s-TjxIsu(rs!(j733O+@aqY#((KHHa9DF+PNxwvM zZj7fgv$bfgY#OcqeXBur2^VY0ch;A!Lh0sBr1XyZqC7Z}4d_}T*!I0ZqIRrnb&uMy zxr0_ax+y0nva!P-n1!((;Bmm+#Z?R1c>v+Nd2N%KwIkp@C1Db49r+lX1b3I+bJ}0DUzKAXl)A^qI{Nw zMWpy7)^F@p&7cbOe|;6~L)c@0v!r&}`27!45;pG!`qy%4*qHv8xaQ|0^kP81^86Im zZ|bRecvVXNv{!&fy1U~)^ySRXBBiC6T+gr5%0nrGsOrk~x)ivHgsQONfL!pa&oVFdQ%+uoKV*5CmwigKGv( zE77L3=5$R?T_GJ{DaRMcPEXAVp*#3==0@iWXCq(vX(}5OQV@o5XN7xLJaM?nlv3ts zfzwC1X1d`G2d5Ovc3|1{taD)ejGec-|MzIY-AxLFAYc<@0V zePSwZdx{ZLMmp4UkPa>4Y9}0n#AJskCG^pLN?v9JO&`VePZiJ5l}%2ajk7Oc4>yW4 zL5CzrrR2qj${%U6DS2Z$%lg@ENJYri+S#GJcw>J^D1I|oCl;j)oq>gYvR09y=@y0} zKSWF@LYgUDOp4Q#;^41PGBMQ%p7=~SB`=?Df>P%rVw&NDT1>`-HnHBh(Rzd{g0m6B z{>kM@a-H)14Az!iQU0F6y3N>`D*B>)po6z?_9EGFxhrg45zep3c|kZ&le0=V%i+{) zXZ|RzPnC^+$>sS8P%#tm2w)jtwURj#2Q98BM`yBbkESgUcIE&HJ8CCr!M0Lzxv-`B zHF(LM>e=8Wn`%AI_Xy#pc7<8l*%B&40lfjk0OJ(A#m02JwNMzW29jIk`j{|KCv@$2 zoh9c_6lH~bo$|pf){FTlzYrR#;Qri>Y_$@T%$9VkfTGg~`U&u5z%4*)_|}iT zd)rg_X)fzA!Mc>8k;M_Q@K=()g;Dc?|1`iWJWKsDeh zpg(Boz{Hb0Jw08Zj7?!CB|e2!umGjaBUq%4QU*W50>w4ed1kt-y08w9yy#naI?v)1 z{E$jZHl435qzk3AV;dE|dnnh~-ZA5v1IyzIm%}E%eWe_Qr6%K|=xR zW}yibXb=b*G;E?ftjFRc>ogzPmq@wOeet~#X$Wf6kal08zZO~`gx0W0;M}P`IPOeg zr}>s#Q9@H$f3{VblFGu^3S|{g&xzfnCii*c7C|__it9(Nf1YzZZLla-d@hBa#w%Als;YP`V8b41{QAdFoS$$TT%PW|P}05t zN}YrXQHAbGv(Z$7X%ZtzqUN3w22CQ2B(5rNFJNuPh|h`)AkYSgc%e5uLT%R&~28h{Qrz*C&_9UiXqS;%~tzcLpz z7No3N$bvjVsk^i&ufT2iBTG55koB{TI!N#8=4DX1JJgb`z$2_T|A=^rmeY_ zLGM$RmYxy40)-@{FRF0=1rA0lsGV+#p4)@m%^PD#UoEIVUcc?U=3!0itE=9kWja(V zwns5OeC==1o0eBiN}7Vz$sg@>qiVX5RLT9QcSaVZ6w+br6gkrlBH^ zG^EH$#`qL`@e`tKSj2iYCvi*hXH(?pBTD5W%$Xm0nvyd4tRdO)(^KR$o=tYFhO6m^ za=7r40^(${bOURPL;yxVXTSF8fjY zG;rybAGL$<;`^#Xy5~o24R6*7|E$x_Lb~rqb)f!;t$RwD_)&)>xnEp;DfV|t(>&ru zH&Z}X;nZ#{O@Kq(Pdd?gR@_D^IHX)~NGmwFIz{QZm~~_8l_`rcKaNmVEM`4AQF4%9 zQmwoAQ3uO`kF##LTh<;xoy4Kqy{j1g&Vy39n2kn=mXEVBKrl=m_`{XkGnb#H)rE-n)oUZ-TRrRm^Jrl zY|R7yfIAvE5HVTa0PZc^2+hMlNx z2C1OQjj-`*773ZDd{ZS`2Hgdlpe_*ssT@*Khs4FPvp~u^F%)q}rsM8dDjP&hGSFSL zF@otmsqcA}BTr{wx%*$ykE~KHtu;0Hh~Nk)I9czbzM%Y+#s>9169iUv z*g25%1|Y8X{X!(qP5u0Z+fJOr_o>VdQ^BRWq>fi6q>FRV3)9(}nX5CI^}m1(fERW5 zPT+R{rvYC9F6#K_CVu+(wL0rNw{;u6QLMSXRP^gUEB)Dc?emQ9SO(6*`!-i%m$NW0 zDrfmruCKSUbU9APxWk)krrNP?od|076ci6UcX-i*Dhs`k${hZ*F4qI=azR;QxMc;x zc_G|{L{(3GY^v|>kFmUS+^q~d`{D!`JXl?EgY=KjV9gV_VVOtqUBUdirwV=cnLu|g zIO*$B<%!^o1SBenD_H087leFHHBb{1_l}Bvax3TEv2iO!d|p840zjGa;R@Da@W5;_ z4+#g-7F`l(8#O37acRRx*FAY~`(FJ%Nf> zq66|#z9gQ%a+6Sy67nSL*o<1xLh4$XQnQlz8gAcK0-t0ZntgqnF2KOW#o?sN$IFs) z2o&nm_CCq_wWAowpW?Rx&=ZJ@V~RY)2RqY~7P_T2SDcW6*?v#40iq`t{U@10!-~Hn zoc5Vd0d?ad8u&EqpZuMo?Gqo(`X2mj(F<$IxSOw7o@VY!-BWnH`xFcIw&V;&jn|Xb z?r9d}O`W4^{!>fc$fwzREopdmP%I}zVh~~|h*G>(u}t=mBClfk?0F?;A=eiPhez%oF#^44nBt#iye5iSbIb&YW(*1<5YpoRN- zec@iYwVHKp_BVq44v^LowxG8W?P2(cd!ZGhjTQKcH&pr{asT3^lp%HE$}r`S4K*o3QEk|C zZl!o;upO+U@g`Va;*76S^$csyUW3!G{Y4z6e(At%3{deCQn=Ns z$|XpO=odVcW6v=E;MZJUSEIcaYw-3+r_gU4P-3%istCQ=WsKV2&t|g>xJ1e)2cKX7 zkI7*J31{c9j=ogh>F(+VET#?=I^juBj^waDB=TDh^X*EvXw`;cY$N;F$({KZ+MF%j z3x|*e%ge1gk2p&Bvn)jaR=(8rt-Lv^c;>TMb7$R@57x2`hPrLa_*{H)HcHu+i=#TD zP-UHG^WrW$`^73}L1`{1={3%?g|SMDJeJUv2!*kDDz7L-az{SE~*4dWxTGu@ixOgA}wW0Y;{uqrc9`E(s?6F_m1`wc}ninMnQ zeikT;Uc3EbUy#`lFD*5clvtTXnkmwSM8ksaz~XF~t#-rbY=-C90>giK@ng?n6M_vY zUX#zRF_x;NZ)6kLZsp`gjPzD2{{?DYavpE@xO4I9eQ=b+<#=5gz**1MD+QxEUUi~t z2cz1NqO1VJXP{uz#H+_NMvbHMc?CB+g(C$&aExK9X!j_5y?rJGqt^SQG`G7-uAr&6#Pky};#`(_+1^j6alEqhnwyW=rsj>2NS zwtyn1*Evd+w-mP4psrW?Z()7AUVav_6MFsQ)h{*A6~`;%CBSYX4$4ceo7WQz9FfH8WtWqdxqx64~4QqC486_LC$CNcMvc)a)mr&3W$0*Q= z9HadGB5T9CD!wnVG@m~o*QjqU)o>xOGUr81UuEUJm)Hv9BnT)m+nA5x<`QMZ%WOC+ zQF2~p^W6C2+sflFGha4DF>HmP+hSdiy{T;6iti{td0`uy%v2?D8|!VW{{s5sE;vGK z3Ga9K3w*?3B|L76bOS7=X6}H<5M~=)p3cA_Yt;1@ot^4UB_E=oUh|t9cSoxrNBoVO9V!02DqY}taFld z$?+};UzfyCofDG# zm@Hl`|AF!>XC~2$i5^$wct`LT34Wo*UqyUH@Yg$@6ZnW@t&j@^D_(v22b)k7MS_nD zfxV7Lguo`DXojX}Eb%7@{sqSaf`3HthX{V$8Ao5i-0J8qnBGErJ1sDcz8tLt|AeEN z;Ma@5w~-hdl0o;SIsW*GlCj_MGvS9iIs1Zow=Q%p9Cub~@e{ z{A|Ztf}bJy1sY%E=w`vc?63>|RKd?AzO3{qz}m-D!B-veIvyo3x(Ia0$JG+C%>tC>m_o(tcINMCTc2?=}#?R3=tNQv9&s3V+X0x4d-{JqF}x;@PnukLb% zIxR$&P^fYdYQN*KAfZMf)H_-zN_D)t%oXTGAu*K#Z4iNuIGzC3DvPx z$D4G#Uf>gsY~8;~U|1ZXX{vH8)Hx3coCH=kmyviuI^h_li^S-7ppGMS+*QY+I`-GG zRmY|ul-CPcFRxTo3wqtmQNAf;>E2JF<=Njqhb(ejRFZeH?8u)(KuIrkOnij$=|a4k z2Mwt9r6}!(op8M`+Ib|g-ycW;@ydFQO^$q61l;8KIE4c4i&qU=z)kULS1q8Zv3rUA z{;69CSfFfujm6nMmT%+w#D+hy*{WJ`83^4|Lo1!?hx?t*)VlXDa%zWrIK%+6LA**0 zOaxad0$2Jcx2j5guo8SM<6G4lD7`CmRaIa0=B(S!3io;pE5&c=sPagsv&mZWts}Rc zsi73UK!nG1Y~$-}kgaS3=oz5n2gtNJh&t{c2Gkj)u)du_M+j!>Yvc}d35wNUeMyU= zR_WdqtH)i-aSTr+(Q&?lE|+ZhD==bNQ^*@Jb3dYt-^Kg_y+NyVrv*=p>~J*=t;uSx z6N+sY>)3NU(uRvPyy$mqP4t7VnsQyMRI;w&%(@b=udQUw2$ZbL;I0N<1e^kx1BeNdtaZV-gc$D0fbjse3g>7L zp3F@J#KT_`qWLKfCitzeMX;}%WG($zxVs2K4G3u<%mI!7kU&@6p801tRl{G^FUgET_Nrq488OV&!(_-w!k$xj*!kx5AEWSyCj2gAzm zZ?TSE@$2A}aig;m{5I>|*7`j1Wg}Dr27a!oig*F$is!%0YFWa*&$WD;1Cw*U03Xrc z{sr<35Q@vN>VPxOARGRJ*&4&LQH8{gyT$0N|?37cKCCV)s(gL z#{gU4->%cPyD2S-n4eMtVMCRh@=*y^RDgdiVfaB3#rGhVuO#KOgRG4be-JaGaAhu$ z!Zp%XBBd&C5h;~OUDy`o2KlyV0#S#c_MA}}c?f%y=QLUd(P})DjfdF%?%Q#dqDhPI zl|yW*dky?vnt$eDD34GcI}CLZ%JYYzJYG3SzIgJrQLd7}BE|g(NQ*R5%n^|Cl?0HK z{KNQ)a_SjOB41`ww^x`n6_5eg4LAn~c$G=h0WSeg0qOza+nKZ;a2Rj};9tO`Nq{WC zcEA}x9Uy22la>LF16ma_X(AvWa0GA#;J*|6oouAE8;%QrfY+Eb7vTOnlXd|5?qbpc z0Nc%^X8_*=2JK?f9XoW zF?OFhMwcAbC^_*i$*W4sQb=a#lDUnN8}E`Fu4F=zl`3VWtcRiQRpr-G)*V^Vwv6>? zAHQ9T(@Y(w>Nriu8OnT!;cL6+febaq~-x_70La2$DX zMA>|t-RD)RQ>&D3j@Fjpkh7&a*a;@TPJ%dqd{&PQK%^y2uvC7!Xp$r*j^brJ69=#7is$i$WT+L1e_FU zi#v&oiP@>?7za!dnXdaE0w$dcmFFSWGGF&@(eZZW6Od8jH-NmP*EA(&rDp}@m+qaW z%!PMwjqc3{CKGP~(@XH6PCp5ZC1j}@n077C>GT_~DHRp0*Pzv}YuY1#Df}2<3ZJCY z9|ETEkLfsFr@x@|tYkg9nRjWyt3jsVKLbAB@nB*^LxTW*5PPn3DWzmOhavXNEq_J->D-N+slYuEnGH?j|DZrt? zi*@=+9cSn`SI7B^`$sHm9KOnt{NKbm7T{1|Qq^6@eSz`Wn=}}BF!234eXNcr>v*P) z=PCdF2$`0zd$;I#yN=%krc65kOqo`u(@z6qF;e;pm@@5>PXATMH-IVA*j_Euynrd1 ze!!Gz?SWeWchl%LXMZ@T{~Qk75_q)6a3%p`k5Ebm#+IX$qSK!M#s>$|8sIj-&+2pz z+!p>-1{i5UHaiorfb7jPG?u9dHNuZvulYxhZi~$f$_7 zw1f=Qag2^f={O#kGHNO?RrQB~DWe_*ri@w%Oc{{_>;=Cam@;Y$Fx9T@!1U^P3z*~% z0aHdD2gXq>oAe1Blu`cyri}Uym;`?Vri{7{Oc`Z(8=rUrHv^`OY6DDiVZb=tEQJG8 zMhyU_jJgjv5O^#w$xQ>MjG7DF4tN1@h%{4@mckJV!Wv)_lz}OuI51_@%fMm4g}|MF z-vTDNL%?0&KMvd#_#>TuM#mT4R>uE-Wn2e*P3Pagi6CZ!7_~?2(Q}^j%rjN3qJ)~Y ziBWiM^g^sbRQfgj+gq>(pS}-kup*A7KR%B&SP|FLA3wwz{O8ls*UYd=!HTGWHCPcG zYw-Kkum)S_GpxaiX!7slf`PX9OYjwZnf`=Ctid1fH*7l|mOrXQt#mJSC=I#@&kI&X z@Jf3b7O01>&71!GkFW+U0>NrRWt_*C{=yaUDlAY4mw~Gmu2#6Z;~Ii%BCaL4Hsd;i z>pHH$KVgArTpF$#xZ2L?XV|jv=`nZ0XiV^i%HV7K&!6B8nE&~Ea1GwDxj`=!{w8cg%1>1@wMgYO8(QtG)%IZLuv6GA<4LcX*V_Bq`_7x{E%a`C z&%Ho#fGGaU{2JG4XpOYt+7fNOc3yjk>3ojQm-2o5JU7J`qOIsA#);h`qvW!NY%Swtf}AE7%WZOxJRzUTa8+29 zR6bYuab}_#(N1Kz(x#m*y7jv_@+dOVwH1C*yoA1r67Po3x{j6!$ z0&AJI(pqC}w6ksRp<-fGvTiNZxwqYyVvuoP*?9c5Mc3Zo%-NWu{53ncO zi|t?R{q{Ngot??ioll%5P8VmCGuc`0>~+H2Ty9ObzWcR1!kyyIcQ?Dmy>?z_Z;&_4 z!=`JvutPVrOnPy>jQ**SWQ;Uc(AD$|{gWoL?^&|Xeq`I&750kd;tp@a2k=RJ4d29n z<9qpGewtt6H~D@3jQ_*)iSj~;hN3-osgD>ahKf;QyqF~xhz;VYcqQ`7VzP`hq$T^x zfpW5(Bj?FQa+zE&x6AYLs(dEj$S74nRZ>*dRHPfKT)k$+tqn>RXtO0RFql3 ztYlKNwi#=7H50I{6U|Q6W$UVS)4FQ~?2@))H^;tAz@D72pV~Q`a@dhJ&R}Pnv){Sx zK5^UOozL|)dZ)cd!5yd?2-wgNIkZYzT`fVIto@=L&~9k&v?98#x75G#^?~|#`V@Vp zzD!@GZ`Jqd$MjVF5B-k*K!2jY&|m8Tl96O3ACPGBAt_2qk#eLmAw&?Hd`xPRx+In~ zB`rxi(us5HB`e4(vYu=qyT~DOf}ABc$X)V~JS8vj ziD43EWHPcDQAS>)pi#_-G0GcN48xFyV^lM08TE|MjW3LLMkk}2@s%;k7;h{velgY< z2aMCk1>-Lx%_v1{(e|`29YHtHzv*k5gXLw-**dnHon(Koyu1|GxyRSxNKf!T_#OV3 zXBN>SMi7Bt)Z>dLqNV6128B*@f!HK|6KBOG@l3oEkupjalBHx7>Bw5Lp==>L%I@+j zIarRC-=j0;%aw9BI^(K*gtN_xv#p>s#nq?kbJbdPQN7dvHB^mNQ`B6wSpBLts9oxy zI4lrk$i_DegLGz~h&MakpY}K`5t=3jYE72Ng zeP=DUR$IHRW7c)+kri&|u}h$9Ec8r$yQ$sY?qc_{huWj<@%9vZuD#aYjIMcRhdaHU z(auEYq;t-><~(s;IN97HZYj62>$y$bfxesUE^@cH$J`6-U@GT zuz+HbhoFUWYI(GxT6wLp)>7-FeWR_@wrJ6`>6ZQW3Abp~qtk2L_ z=qdVI{fvH5e~cQ+K*|%1)FBAdd%zKjrAsZtGylGG4HA8V~g7%CBzm7 zv`8&V8>LOqW@yW_t=a?Ncy+zDUQdtJ0WxA-l5?vk`0PrNo@G^9tFco z`7hafmV=k$%lISyoPQw7iCD2%>=X~gW3)p-SrW8RGgSEVWC{xZvCM+q_0>rAz4}qD zMp3_3wat1!uExNwc%WCJIm=vNt~O7b%(AVTRvT-8NExjR>`UA zRQH|Q*vmf7Fy|*{lk=zZ%E^O0WUk}Zc0Y4lxp8iHcYyn?JI)k!>N%u1L z_Ng1@W%r`7ySit4b-aeyZ-D2ck|%o8ydS-#-Y?#IZ@ah0JL;u+zk7iMgd70I zOj=H@oTh2jHNT$LPV1@-3i0SlpyUbdCe9$BN9u+37=5RHKtHNq0w})JbC5iw3ZX=i zPe^UjfV3vP$uR8tQb62s@&Jfd)F^FKFsd3gj7COtqm2<~BmljJ7{iTm#w24p&S8=9 zvyoz~H?|qOjf2K9O@HmYwBh1z9mxnpI>v<~M_&aunvI`i+bzu0s3hK2FW`~x1%3-S`Y46no~SHRC2ybh1$&3P-{ zj>qw?=)nX&i_hbW(S<>5-OG>gv-}>=HH~KwSw%rnOq3PXL{kwDvK$tI*XiQCxGb)U zo8oSIRi%kH=-LPwDYH*M{wge&-$=#-VW-KT&Grpdgj5Ky%V@U*)cr}nA4D6+C3 z$fjmT(>KSOx6L%Orgg}AVwJZW+O0v1v+bpJVW)=E4X`&2BH=Kg@41s39a+}>**)#v zafw&e>*FPP_k;MBgwGOU$)c6isMglkdTGO;qtJ`ic+achOI;d6@WG3>T^5 zPmxXLLMJtYz={Wj9F>(+ebqiBsrD)Vw0a6|Xlllp1I;;Tp5=h|zG}a>qnu(+87IM+>dbL2IUl&XTixyFj&}2U@!kUO z3f}KO!FN0{5Lk<)oi;+7gtxjzJFewJfm?bvy|1rN(--O+^&5I7l9yBj!A~R0$T{+R zsHS7U%cJoLyBmf^Kc}7PWV(cIrkCk;8W}1$lXYf2*&sF-CH0DB=Ym(~oq^S}c{Wi- zF!7C8D`I2?`HB1#7~M%GsD3!q$tsgo$m(qkwkBBqb}N@{+XL-Uc8Z;9S9caVr=2x! z7cVd`5EzG7T}OMXUD3yohQ@ZZO{(#y@gWGK2CYk*(>8QBJ&2CDOdFxrJF)KU47Dl z*_q)iake<;oxbimx4t(V+B=XE2&}-1u|R_NwaJn6SakH%1 z+WZ<7@RJ#^vRS39`c@O`dut(d^FzypNcQbr_8I$?T@jf1le6AA=sb4%0Uwjyo$h0| zl-Jek52JA03+xC4DCi|jE26c~dT5KaRay=F+MS{LRIv2l`g^@7nFyV>gX|-zKDkUR zqa(KUg^`&Wv^rf#*U}3#KNz?ji(_3`JR1QJ`GehpU@p&l@-ch@pUHRggZu)&hFX8h z10s+35Mo&u68#?w!8{7vzE7OSyDcnB%a6b!^+T?wryL?j$e9qyzsld`P5DatIn_$F zM;%e8)MJ&&%wrY>C&!w7%pv9~^Pc$>vM4iT(KpsGYrHkZnvMPV-O6W|vdh~#3`7^0 zg#-5Ac4?=v)82XLJahhWvZM2hyH&u&pSmsG9&VyL3>=c|&U4p7_Z$QwTypP2`IPsR z*ULf^BjFpRmC~HL2NJEQC*UEglLwQ5&s|(&Y74m^2)-n18ESA0TrPlRdyAnq9Gp( zE5Epkfg!l8@|kup1iOl;083M2E81=kL@yoyt|D-r4EkvUdY~XU;v_vs%dlx;nK&-0 zz=OEZs<-6}nOWsgAF6VyvNDvV>Z*pYmaSDs)fdXtS0m7Tlhiad8?tDLS^-(K%U1`~ zF=(SJ>ZZDfGJK6g$QcrxVBa@j`;Z5p;;hURn!18?oQ$qp6XUyNt*JdnAw58R_ z>Sgt}rUI&VT9>TnR+Rk_TwPncr~MTG>qqF)Lm|L=X=iqFIz=4MiFH~#9pGWUb^ImH zDrdWM!}%L0m(9)NR&YOYTj0bdxIel}-Sh4rZZ>a9u&Uwfun~dFFt*RYmDy=NT9r1S zO=vrsKoeDJ~AglKDMyCL7}g<_W-JMJN2BlAgEo=EhpM70c!HxHSRXo z-;MWp)xGUz@?yLS9`Ra2Cm#0B1{Dk9g#?^?cC9c(%1|w@-d^vm?|@%Bt>=R)YfXBP z`S4k1$a_-BXaa5B)ffQ5@trXlhG~WTmj3w4Yuf_ye1!p_9v?XGu_ zsqAJxsPT`$@e)1I#B7D~nrr?BQ*_#VY-YD&tf~-_iPjKngf+vOW6eXMZ9t~54>tLR zl>xS>ylq0KueC4PA2`(c%9-h;IBT7a&Q@&qLFmd1z=Jw&Q@5?#-yI4h*zdk|qr4Bj zN?u#vON3|~?``%TdaseNAUuLdjL`CG)wHjm%_nLLwN&kv_7b`B|Kd7V{j~$s75K3IGn1`8N=xqIuVjD7RB71^#QAlViO?cmf~!-v4bGG z^UxhHfXT&qSx&gkKjsa13*Mf0fg{~Q$2`{B3fFtcI%i#h@Ofmtwldq%b^&BY#qAiooL$M* zY-&r$hFH5XL{Yq*U?;){kFzJ*i|l3g3VR27?tuNoF6vZ)(`e-M1lG(3tFMM_JLNAM}=u5KUrwn^?BcNtjX3^?K%l;aaOqgU7~>rt;ZTt-JYjA7mw zZwB1O4(|{Y)(!8K7tq22aVVOM+6P)8#4cQ`3U^Uks}~}Xt|1Z`4iZ_aT|goIrB%=w zY+h@<3zC>oppqYSf0e#n-w)M!OHb1yNJ%ueOBy0z=}877Seb*0+C&b(;oT%@&}C6Z z0VF0CvXaJddA*H6NV$eXr;Rfv8p*~oc#J*9DYX7QaC%+Z2tuhF;4umHw2E${2Vftb zhRnkUtR&Nz$!hql8S4n?(hrz9lFej`SqdafD*K(?fUFJUS$KY4lvhBkB6uzS8E?Wn zL0={FTN$CU0bR$RSY>mCFGcOt!7r7l>iks&Dvq@x7yfU?f&)% zk(VnGe1QBkeo865{&kE*) z*`B$Xkr9-D5|Lh2AJCuRje>cd>n-wjdKbNW-e1A;LZ%lMkSMT#mIb&}2IiG%o>o(9 zptaWGw7v*uhN8S?Xg{LFR%&atjmQ$tX#Z%@dP%*KZX!cipl{N5gE%hgS%^cbL%V!I z+LNxptYKt4Nk)auBmN@5)^+kHd4U)q1M-?;Mj6QekBvSE;bx<(el>nGj)F-H08}m7 zf_9=aV1>@YkKUz!(H97AqF5o6R3#J@WfCDy(2K^wgC?`tAe9w}a}FV*y99;)0>MKx z%%%pz(3p4R-|(S69}j=|3*W%^^NT2|hx{$iA##hN$a`u5x0;GJ;Oed@r-5MUMJTBC zVwX56Ziq*sDBM*KnFv1G2>uCIxztCfix%oj)l&_F=$QwRxdTz$9n{4;l?~BPMTqU8 z<^))-pUn$q4v>sr(IQrDtAUk-;BCIO1RS%|Iu8K)3jh>h=K=r~v&%qpR<-NejqFwk zG~!SX|AJ3{gd0f^JO6@EvOU9|W6uK^?XlAk$Ypo(J7paX;Zw(H;e6@zb%r9&-i_LL z4b2k+t*YEleYd&W-i>z$y5GBtAys#{2LMAiAnl*IY3>_00|KS|h&+hrdNsVdUMqwi z-MoHauW=Aav%LAn934Ps-l2u zlX}R38(q4!>hS3RhDqP4fa8zgLC6w2F;MF^tk!3^9TbLD3FRoy~ z5p*X*!Ho0Ra=5O8h&EC~_U}1+$Fhd z1U~~0^8hJ^9|5tG9rzU^J{I+1V!jl<7%3)$BIk*v$o#j%(j0{}3`QDHM7Ycv;>z+; zLjdW*;4}$MP~rh!iE_65Nv;KBK9bK7O6GtjFQIfLVf>px2n~e_pMhX*|%S-m9!3DO53}y6Zv;wKKoNm}NRF;W~4hdDuJ^qRso}b2ALZs;ovR*45S~YrAy< zQs^m?wtpGYMv+zrGX{$^5s)a`+|359Ap$Ajaoj|;s`h6sL z@4&0kB!*N%0XyWg^wRAO^qWj(lEoNU_-n}KP>gzkT!pQB0Qr_1M5~2{5)F)IFv;DZ zuZJ3AQOyg0hbs{0okW6{2ZM;Ipw%Pv1Pb;%(uk`FhwdVydyJGW2P?oT0}Vfekn6$v zhst#Z`vK#MUF<9*+%@)q{ms%?n2!`LiWlJquLhE>2PM}9iQ8bL2lMz6z6#Zvib{PB zEfc8l_^ppB+ z45_k`LKsTf{|Ab=QQK$%AO4jwFf{j@0iC@RhqM{6bJ4iwBjk8$yhdD;pB6=iRD}xa zVUX0B_NF80SUQa^rzrrPQ#iQ@mY3`)8#(7_M7rd|j;gJD#vEU9dm@*(P5 zxT5(gMg0aJeg$#o6O1P^n^ES6W(l(bRs#o4AR_z|;<>n0+M))Z5N|jFOaF7rFcCVT&b20xB?BN!e$XQH0T8usFje#;NF>QlqR@v0NMTYO-B=F&XyOz< zC;dqh28i>>5_IBfvXN{jyPI>R|`g9b8%CB^vkEHN6bV^p_eNeUPuup>R^KSEn@6QSpc$iD^UJ(^#ugzI2_{I z(6H$?WX3aq`M-{~Gi2vTh)qAJHcuhg&24>dt+NhVFA-#wvuk0R*BIyI;gF1qan6_kNMt*ycn#7&1+-c&<4#lh!5k_ z_)6TUa0C!q5bC~kv-*HM4voxoo|X4@b9DfzS%N!Qsf}*P%DgpeHgKIWar0j~U+rWC_PWMDL6W$PM;@f*#RIY%p5} zlGzEsioqC)31!H%`OI;3%&Y+jp2?+T+eT{wvIx!O|Lu!#`c(J`n3fVwX z(ZEmeV#6`=&r`xEhb+WG8d3+&wT&^%Sh68=ba>fJbqW|11(smU!(2Fk5^9A|FAgcl z47{8FA=W4s4KfWXz!-q@|F#+b8F@_~9UWeBdP2eQ;Zaw)1{WGHCSv%MhHeesjB`A4 Il9u_u0QE>YtN;K2 diff --git a/libmeteor/cinterface.cpp b/libmeteor/cinterface.cpp index 66b2f93df8..5421b44bb5 100644 --- a/libmeteor/cinterface.cpp +++ b/libmeteor/cinterface.cpp @@ -217,3 +217,21 @@ EXPORT void libmeteor_writebus(uint32_t addr, uint8_t val) { AMeteor::_memory.Write8(addr, val); } + +int slcallbackline = 400; +void (*slcallback)() = NULL; + +EXPORT void libmeteor_setscanlinecallback(void (*callback)(), int scanline) +{ + if (!callback) + slcallbackline = 400; + else + slcallbackline = scanline; + slcallback = callback; +} + +void scanlinecallback_bizhawk() +{ + if (slcallback) + slcallback(); +} diff --git a/libmeteor/source/debug.hpp b/libmeteor/source/debug.hpp index c47e0813a3..64d0973709 100644 --- a/libmeteor/source/debug.hpp +++ b/libmeteor/source/debug.hpp @@ -32,6 +32,8 @@ void abort_bizhawk(const char *msg); void keyupdate_bizhawk(); extern bool traceenabled; void trace_bizhawk(std::string msg); +extern int slcallbackline; +void scanlinecallback_bizhawk(); #if 0 #define met_abort(str) \ diff --git a/libmeteor/source/lcd.cpp b/libmeteor/source/lcd.cpp index a8d045c80c..74c5b4c7ba 100644 --- a/libmeteor/source/lcd.cpp +++ b/libmeteor/source/lcd.cpp @@ -94,7 +94,8 @@ namespace AMeteor else // no vcount match dispstat &= ~(uint16_t)0x4; // scanline callback for frontend - // ... + if (slcallbackline == vcount) + scanlinecallback_bizhawk(); } else // if we were not H-Blanking {