From ab0e00e3909aa47482513eadb9ff460f057b2998 Mon Sep 17 00:00:00 2001 From: Selim Mustafaev Date: Sat, 27 Sep 2025 15:46:00 +0300 Subject: [PATCH] Fix NesKit bindings --- .gitignore | 2 + .../contents.xcworkspacedata | 7 --- .../UserInterfaceState.xcuserstate | Bin 57092 -> 0 bytes .../xcschemes/xcschememanagement.plist | 32 ---------- NesKit/NesSystem.mm | 58 +++++++++--------- 5 files changed, 31 insertions(+), 68 deletions(-) delete mode 100644 .swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata delete mode 100644 .swiftpm/xcode/package.xcworkspace/xcuserdata/selim.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 .swiftpm/xcode/xcuserdata/selim.xcuserdatad/xcschemes/xcschememanagement.plist diff --git a/.gitignore b/.gitignore index fff52d5..9970017 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,5 @@ cmake-build-debug/ out/ build/ CMakeLists.txt.user +**/.DS_Store +.swiftpm/ diff --git a/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata b/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a..0000000 --- a/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/.swiftpm/xcode/package.xcworkspace/xcuserdata/selim.xcuserdatad/UserInterfaceState.xcuserstate b/.swiftpm/xcode/package.xcworkspace/xcuserdata/selim.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index f166178cd11e0ed379c0bd93bdfe6b918b8844d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57092 zcmeEPcYGAZ`<}LYx4U<@yOhu&KWsReG?b2pq70OYvQRe4LAhuc8jkYN zSTqieM-xyPnusQ$LAB#uhd|ZGFaS<-YCHOcz z2AATAcmgiRQ}9$g69@2#crmWR)wl)+aV=hkm*bQ1YJ4@`jJM!z_;!2;z6bBX58#LJ z6ZlE|EPfI1#JljT_-*_iejk5;f5pGy-|>F@2mX^Ff(ap%FybUSF^EYzkLBXeZi(_N4vk06LIn&`g>|kD>*13>{A=&@wuimec8U zHl0IHpv&lTdNMtQo=Q)nr_(bir$Eo7E9nLFLV6j!oL)<>qu0~*bPL@|>*4mU#D--@96jR2l^xZAN`5`On;%j(%Oj}qxmyO!O+wz1pU-RvHAFMEJJ$R1@+vZvT{?0NPP`2>K1=}qY^>22v9>0RkVX|J?T`d0c*`c?W( z`dwzSB+IfxHsnrn54pG8NA4>RkO#`Ca)z8K=gJf0GI^prNj_elESJkuY=xAHIYukvs5?+(e~agRdyzltHvDdNB@rC0@$L~(!l${Qz=G2|-ogJK=on4$= zomtLoXO1)1Im|iSndcng9O*pDd9-u1^El@OXPI-FbGmbe^8}~QIp0~~T9Jf6iZ>e>neCsNzuEibrX$^iX;#y_967x6(&RRnnAnWvFtL zaUWudZ22`DEjiJxkb5ExlP%w+^*cA+^O89+^yWBJgPjVJgz*Uyr8_O>{NCsdz9Ce_mvNnPn5mN zm&*6b56Vv}R*6bgrgl|(s=d^{YKl5g9i*nI>1vjmtqxc7)T7l=YQ9>amZ-<66Vx(w ziaJ%DtMQDQ^=4$>nmjbG3JMb9Hy6xca$9xsGui>l*FKcNMq_T}7^9SBdL5 z*ErW?*9_N8m(MldRpDCfs&bv>I@`6owQAu8&=xxW00I?fS;`v+EbP>2Bw4 z@9yC4=uUEXa(8xjad&lhbN6!hcc;43+_~;y?ql4?x~IEmxM#X&xo5lQxaYd(xxMZa z+&;J8UF8nB!|qeur@BvbpY2}hzRrEUd%ZjAj=49uH@Y{uZ*XsRZ*kw`zTJJV`#$%h z?#JBExu17`C(D!V$?@cQj`b9KN<3wriJs}68J=3tNuH1=?1^~lJWD)FJvW?s?AhvZulGhUZPs zhn|l-zkBw3{_y;%BOU8Rr#jOmUDj3I)H~^&^<=%bK1d&|7wCn0kzTBq=*Q_}^iqAS zK29I6PtvFBbM<-p0)3$#)NA!~_4D*q`fB}r{Q~_${UZHheT{yJeuaLmzCqup-=uHT z@6_+oU(|Q%FX=Dq4f-zq6@9n9M}Jj+O@B-OQ2$)ttAD3|um7O`uJ1QG8c9YcqqEV) z=xTH`x*I)=o<=XDuQAxjFfxr1#z^BRqtGZa<`{F0d4|_G!SEULjS8dE@EZ$^6OEIM zrN%OY8(^GgtTJN824kbK$+*GTY-};M8uiAF#!bep#@)sP#)HO_##6>l<0a!W<8x!L zvCsIz_|o{w_}ci!_}2K&_@A-gq$V?6rrY$GNoFT=sF`7AnptMHnPcXf!_47ko;kuC zWfqxZ&2eVAImMh~&NVB{O4DziVxDTAW}a@IVR949GtCv|S?1a1O7k4^T=P70m3f7^ z*1XcZ%3Nn&ZC+zuYi=;NnKzran75j@nfIGJ%m>Uz%qPs<<{tA^^ELBz^DXmj^L_JE zbD#Ou)RdaKs;XVcjXX$425OIzrk9ncFZM4F&nhcVPxz_RQYxx^;cyI@s2wMq#!v^; zkuxB#@_t?;r6fNyFE_IwJFTE(curbQ$%tWT1qC^oX?d9=vI=rW6pbh<$nzQfZ9yrh zAL@@%P%;`M{&F|>aGkrk%8mHnRIkxd)Dx(w3@$AVm(*2Nl~;uP{+fA>-zv#`oP#W&w;^eQbX&aa3BmiQabc8YI)VX!6=3RYG5Ltf*U z<~`B!Sbkn!;fN6#nQ4W2xx>LdT$E(P(b+cDz0Bz&r9J-f1)Hj|x!{Dn=zJ1&!f4@62cM*?b;% zbFUZ&qqL~Fd{J;|nQuv8p)V2)Szk4N%n$i}Uc)RcDxMk%R0Sdde|UPJGP1}@R$3FT z^;blK&5||dY?e$^(3pL0X;E=;WgwBsK9$L6CQ7{lm7^(WDw>9-qZzyl@5;OJ?z{)@ zc>|h-W}`W1E}DnDycbX7$M8~K&Zme|NS;vRMA94UPj4JpuhF+LNm(!w zsPKp5DdYb(ruQ0s8dJ3_Xo^1^NuLm`^oMG^Mz=#G8XsI3_8Mlnzsg?`@mDr0RzEHj ztgE#S1cEhT`;-@^!~U9xPqcy$ z;e#idjLo;__n1&7O*($Y%s|9n9Y0gAVO06Tk^G7Ze>m)~Eb>MC^THK^=aYirfGA{c zI5BLc5r1{~79&Y^w@d2Qvro#v!RZ+}!$ux`Y<^M6*a-~|r{bDY>x(R!8K|lBFB=o6 ziNsWGT3H-W(*rdXRdtnqgEn|{!#r56{$;hk8nM<8Z&!By6Z0#+{dna$25xXT+joqq z9m>O@3WGIt>fEJkTl0T%_f-aJa5%enjP+29U6w` zjrbegyS2gLJgRH7N5iONMzo>228VOBE7n78C@5@W@?uv^RU3{QQ`&~otugp>e1Z1yBuIhE73eqE+a8v<7WNx1$~CLG&1U z53}vm*EZgCVU&d9p8hW z!*AdZ@n?7+{)SM}j&vi*qz@TDMv_ueMvf=bNPsLOrx8xhCRdWprpEUh5AJ zPgLifR_@KtY)TiGfpXuHK+VF^N`Flxupr%ap|(O|M~w{1yJ1h-EqBw!v%k^w)^-s4S?9M1nPmLydzM z=1v1~!WowvI=j1cZRVe^=d_`FkDk2_W>u$`mFI^-zU8r=$&Kc;p|iVB-}PK-=-#7W z|9Oo-h^O1ouV->YXZOIq(Lvn7CCi^Zuq|H8!zm7hf}w`)J<`&>Mo(|iv?*4);$^~& zHX5V&8E+h#k(vCLsk}y)redauo{Qr+(Psx9i}z~$SX_3xq7*a;Wuf7y6pcs6qjEGC zRiGMFht5Rn(9LKkdKv9PyV0xYb@UGU9PLG4pl{LdSi){>;4Zi)?uC2f{x}zpz{lXx zxBwU71$Z$&AFsjN@r#xgG)hF4Ee_TX-g_8-!zR?NXuAOLZG3nX-Olq43t-`++>KVF zd;iKu88Oi$RV|^O(l7O&`zTvvm(ih9*PgwFPof>*lSI{oOJbk~w@267=1R;@^6gsF z;BcDlV`{ruqN$eZrywQjk>RDa5#Hu z(d4)f)2DA+vsQfjkvcZke^6||z=PPt!9)6v4v&tHev?g1Yj8NzwGHafj2Y$2!x4XV z`Xa9}ernjC99)oG6RfES)-D$uPc9rXBssFY)}K7UN;e=mBPmQ(f7;E3*Ah1a4)Y?^A?=-umj~Z82K4X66q7#E>u35L?hOOK0fAFc7 ztWL$Y-_gbH<;2g+c3(e@UJ$1E8T2fA4n5D0<)e8%FW87)L_5(-=tW-0i+C|F{C_jW zuc6ni8C@Gx?``z1z{xwjB#PeS$NeQvK0>R}Cx3;LF%yj~Eny-%-2WUV>$CHp@VQvl z{=qS)8dH?UfsJXdzM~_y>$~RX_`oE_bNtj9vnvTZ^fgM| zg!ZC+=nM2E`ihU`ZP;Jg%n`5_ zfW`+GHcoEi>i`AI<5Tzc@u^_t0Xh1V7PZKcSi73+uZYA=Y&>h<0}@Sc=A+oD8saO3 zzoY%@`6SDo{1c-CeF*d?#)#XlM?4Fr@ho1W(>80Ut zoj-iYimgP}@=L#iFV0v=$|Iq=ib!3^{})Ax<({@J8TB1qYnc}Nl)K{YC^d?^@i|f4 zgU=PG*1In34^0aB7x+UVe`TRB;$IjHEiYac@y8beN{hl)$M=qRe4{GaCHBLaDD_6% z9}mC-@gO`H55cK84X5LwID?tF;WJCr}?>>sVgppVf45-UQ#WKy~0`e`Or4UZdjy zb;iFAdyT%ep+L1SwA?-%zc{0^2>x8coZ?Bl;d5z>mZFNaX5YpAUIQD5SH)?FC*k8~H#;7~lM!$J#jJ_7{+iO7DZcr_?g-ZAB^aea1SKvxKA1^>Dd>LO3 zWCdRaWP=c^X5-*BOsku$CFsOpw70$+6A-KG%gZCaipAl%iS7(m`ZKeK%oY=&aesehKjZfOG>g3W$%dd<~zEFTfY#i;#{l#%u5;_)>fs zz8qhH*Wyd@Rd}7(=u(;3|FEz;zsfI~Ru69Y2oW z#E**Y(D}Zwe|A}UddOep6B~OR@r(GmR#V==?@lc%pE`Mb48J34=~oe~PWRQ;R{7H_ zBla1l)mqp|tM=6d7R0@Pv_{y9Eg?$=?OsoxVX(5%^Z5{eg;MMB zNBCp>3H}s+hCj!9@jmhaeoMf~FL@eeo~rQn}X ze|{}@$A6=I3$NyGzLo1jD!Vq-X0;~W+PVk?YrIDH)&~~_mre-O1gd?tUZeLx4~vEu z2AB9lzJ-3T(d(dTN^6!_yQtxVl~NTqsg0r}EO+Zt;`=Re8X3LosS0BK3EsxnZs@L;{QG~}xt9}v4F!nP6#uZj|xU&mKkpB21nBTBu*Tc~aLRe^tb14Tt4kH1>s^s|)Fll47JQ z>BcwmO)=7g^yD}2&Ai_{ThlG?VYWEyxGed@COyV#R0>|Tp0Dit&^Ojp#V&Io86wIY zL(Rqf2-}y>~D6?h_mF$>T5=cJf!Fb$_zwO7-_5u2pZNO+^7$e1a3i1J<$GH4`AN|; zPm!m|GvrzRDu127$=_+>^9ympz9tCUxHoAtwjqA(jf0W-Rq`6%&fns1^A+|wH$4oW z-;eY8y}!k0i^B&{S}08upWl!3`8~Vm_mUq4d-stq$d}|R@-_K}d`rF~-;*Eshx{Y{ zG5>^r%0J_u^Syi@|DvA!FTvhl6YTv1_2*wE*!xX_y+0md@4wGp>cXp{)Xl$2u$LNf z_R@CbQreC`%fF7lRvMiWBTGBet|%!=yYO$Lv>X4fZQP~3XrDNDX>Y!Xe;*?~X$s%W ze`w9!Ywdal(bPD1=@4Ge|99vdjZ|qxT$)YtXf7Rw*U~&X09IFU{5`*w%AEeq9Ngt(>l~2u(*WL&E0_80q!K6a=@LB zF!VoQ=nBEmvj7`5MbE*jHqvv+W#R?cvjJ(RHLJ;G~1N<|cc*algT?HA**Hl-!@NmA;(2b6X(Pk=hp`<9&0FQ_=H{g+Nqd7BK2b2_J?F7w_ z;+tZuqoDcG2cx-rt6f<))-%p-)B8FItq3l-HP4K_~SJUi%cU&T7L%)YQ=Td zpX9NDY!F_{hOkt@^$KC9Cjc%GRIda){s5}8p)8|`>SF;HwxBv2hF5K1!&x310k{b8 zaezx3sm_jOqXdzQ0hd@4=LFkrUz_C%hZ^vhW*+sSO*R{Ak$s#+_Pn-{J>gK7`I}YV z=u5M)7U9R)Jzvh|q11Xdg-vDC*mO37&1AFKY&M6@1zZMrBH&4Yj|V&%a5>;9fTseU z26%cs^ID{46_#7g779|&ut`0~a;yRSj&S@>i$ zcs1ZzfM@fShTG_15B8btEWzm&fagZp*?{M@k<;g~^Wz>iTg^8C_6mAlDCl`YD|#Al z+jU*auCOS5xuEp?!{iY&WSb{b(*iYtNNXBj$F67VSro5j8`wrc<8uI?1ULkEf#C7E zfNKxr@n*KAiN`g77q;Z_&4S0buv^(}fENK?47j?9$9Lc*f~EnnYqnxeQ~Ro`4U*t1 zyU(I>Rokfim__BFMdcCykjmB7&5SpD%;IuT?B7}oUDo|cfhGR5ibI)k_5yoNF#bih zlfA@VW({l?dxh<0d)TXh!+;}z>i{nSycF;%j4EPklr`EIA6O4a5!T9$D<4?00 z&uzw^eT4D<0pq_GjQ^=x$>BVjjsQ>2bbG9>MpOhso4}Pfg@Mi1n5_kvyr3 z)D^FlI!QgGo`5e9)_X1BRf6>w0KN?H6)iSkrDUmh6YVbnyt)PLr2%-=25F!)NE!_I ze83k0Ueic>sgsm0Xnz6V3;Bu}iR&^K8Crt!Qnux%U;Nj8x^%R~_e=lwY}>B28PTOe zi|Cho|IW1CF39`Ow$`NMq{%3?UK%5nN@JyQ(s*ftR3=T7CP~Kwz7p_NAY}Mzz}Eo2 z7Vvd|uLryyaI{`3w{$|9Zs~+HTj)g0)`^X_P8`{1`ww(N3gA^y=|sRA5;`GO#~0n0 zL@s3#e^&VU@wb%;m5?IR5|k8`>Hu$wN=pIX&_0#*+=~3x1 z>2c`^=}GA+>1n|C0lpvb4!{opeh~0OfFB0@2;fHnKUOb2n~;PTtrY;NK}f>mwj?~& zxB~F}5#Qn8_Z_77geJTX_z7DRJ`%ozBz+=YfQJKq(t77BjlnimzmUEXy6`37r=!x> zfS+ljE_^Tj4<*HIn39bxsq&uV!FUKN#R0{$$)YIzP`wNaic&l4}ep99`&z4MhO zPBwbl1MZg>qNJ$20Pq)4c@f|*+eU1;N)Do=m|QK0{T1I7lWPUBzdjhT13&j2?X<3; zF>z^K^4aoAyjDI} zJ`b-0(uMB;LID57w*l!21Ru!e^W_Vg*!(BppIfr|Qo-iS(h*3K__xy$CjSRa-X)m)3J{OY~J)) zm-GSBqXl~%ZoF!P!{g8$29TaWl7aMYV()%N@b-8u!}tpOw#kF~@rU-}9my7T`~Gb+ zoVZQ1nHhEru*lob`*+N_U5*u>$T8TFi&EBw?qJ92;w05TBB zARvQ*3;~h~Bn?P9kfA^_>K(%@!aGJfj&dB0QXIz!!e=H-H^~7q0?0@~_@j;x{@*9O zV?16JbxZ(~l_0!h5?-~@alCY+cmc@Y$7~?O+QxW? z*D*iNc!y6get3-ZbW{q)=e1^h{)E1xnQgeQvMXNfsEJeFQ7tHc^kE8UMRZ4mj+KscfQ$xG2&AZy z=Z=VDwdlKiAO(EIRKb@;hVgfKex=3plD}=D@eBWk4nZnFQo`Ad`WV*E?=baD2PtcE=qk z#c`M5_!OJt(}BzZGFNbX-Vu)f2ONJ~aQq1%Q*DkvEja#++)KQGOar{zdgm(*J5rV7 zB}apx_{%_ML>;?;%xojYUv<1;QT%m5@mYeQZwZReZcTB+*LUhc{Pyvg5_rdIT1)zi={co{~SLx zv3wDbik2+jFIfJE<4-37QVC=MkcEvbchb1KP5i>$p3@Xcu5q8e#Y+954Z72?h#s(r zKJ0J!;*H_!TDauSP8Q!6d;e)+|8Qx}+0EG>rPe#UJ9{{LI(s>joxPoXoPC`s&VE2@ zfCPcm0yzmt2uK)61V|l_B|w(eI|o=Y;T&Qu%{hk(nOJ7a#L4#39695NO8omO;T(lm zMV-e0S)Nb{XMW>GKF+o`^10ZWw(Nm(jB_kXiaJYyoDy}819EEH6v8>tIXSKn&f|qb zoE9TJol}HDoZea?NO!xkna(+JS#Zu4vcM0MsRavXHPIt}vx&13?TOvuZO~mTgX7|JZIU7i{ncgj359Wzr3RuW?@Myv}*ObGU;*sb#0{Z3(l7;3hxvYzW&hHt=kptalUTR_ccM^=%F*jZ{2jh>wM1&7u$l6 z@f*`)&iBP#Y9f|w>w{iHw{KMUT1Q)0dgn*ZkDGXS6Oc_UdALvT@C)ac&aa$b1Gxdn z79d-J+}Om!?<^i}ZYvLevv^qlPkE>~6&0mM6$Qx6QAGoCi?|`wESff@G4etD*7>-& zDLUF8Qw+rfax0L#8e<129hA-}X@k;HNm4oixeds6Ah&N&x}g3_Hz0R#9mt)$-`t{U zQ<`qDo+Car1+O)VrcDuX7AE)>)&wGTmHwHH1JHML;Doprml$lNuQK3Z)eS@`%3vUO z3rGJR0W>`xj=>7#AVM+p9X;pactKvHT_R+|c>jXPl;GsR!bNsKVkJY#MX4K=OeIUn zR&s#c4`c_B2Y@`dQ5mKTXQPx6Kpq0}IN%Z>FYweEq7c#cnelSOf3vLOt*{jWN{zkQ z7#G4mnbAtIs4ibAPzseIAP)n11jwU69@~gga5m|Q`g1q0=9?`&>o(073W(dD!=fG$ zAt5~3w=^CSBJ4G~wmg~$Kw4fA6andyTO5pM4~8N|{%}PoP#cNg`kK@tNxXCsi@m zTC=s{n(8%%h|aNts8kjPYr?@QzZk6Xf%zd3r^5=2mk1;wLN^~Y^%VO~_?GDhA1eK% z(xNG)MJ*Gj9xCw!f5cbmi}+e57dMq3ye-RX{VkIovf1Tz^TY9AVJ*`SJyg+?LO~I4 zR)leAnd6XcZwwC8tRL;+tWs(O_p5=t7*&Emb{>xVVZr@~QU~NEAiJ8lzf3vxU}QWE z^;gaS^0MH51Mkj%h*Wvy^iWmj67|Us(<06_I~8@7F}FzN1$bwJ6|XWerMQ zzn-Vsr*)aK9;M!>T&`T9tW~a5u2R-1S1Z>j*DBX3*8_PC$m>Af0P-e~w}8A2B8(USxp6QN%$TVchZDG7$AP97hgV?_!tuUO<4LCHH(H&ea~7dzA;oSl_4Iuj~Nw5s;68e6m4#P`?c8T_LcID5TCDs zd>>W51@eR7(BErsyt98yblsrdukvPH_p|alO5LFRqWr4-2IPN0egg9I24%nUhw>+o zUx4-mI!shK;Be76#s?SLIQAMN50^3#x1%f`z144B1gdUT4b@cJsqNJcYDYCm?WA@F>H_KkY5;8q zv^~%cKsy3W0@|6UHe170dsu5azj=+UWohxyENNB2g(HU!9X70ZcvenUVOnu+VSZXp zR(^I`L3Vy&T1n=J;Uk9S<`(PE5Ep4 zL~&kGM&5|R<^`q3TSRfIf=UVt@<-(4WToX77Y|R%Dap@C%gf3ck(Qg8my?y1lUbCX z-J(UARzb8?K}DG*dAWrnhNTr{6qTgqO}Q;k!uoA z{cq%&rp^$#rUNzqMy|Q4_kb4KZLd)Mhd2^Y7a!tCP(A4oN9xq2;>Z%9o&HAaPE}7A zxlRMxC90kQwCmwJFh0Xm#a*)MSwOq-mAggIDfJxuuzId~9)29x@^J&CUaYS18c9|>$^(aagL;X2shFN0;`qViRN13) zxw=;L$Q3|)Mb#^T_HL;k@>dFD6k+FJt!h2cK0x~d zO##{uXn&vsfDQyY2>br@E7G2AbJw{k$E* ztKRK9x?g-ghKy1hHG5QRHBJ?)aWwZZCD=LMRsV-lZ!wb8_vG`~M)gCoL;YC&ME#VE zqTAKI>OPjLeo05DU#s7!-{Py(@6{h<576O2FyLCCBl!D3j{-Uh=&}5MzypBh11$tR z9%wOO3iLRjr9j8=3xQ4mIuY=jqPCyZpVeQ~U)A5#-_`x+S~9;hGaa-in}T@UnjpicpP1L#-4Ft8551^^ogYyz+ofQ5mr1hx*?&A=W3 z_6o4iTBwa?T56N$HPYL*87HD79&mNMmShz&@*iDV({!(_*3ByC=)YA?nLm7Bdy=hk zj`@dI>o;#wKdY$G-nNFzIv~8xn0Oql7JHW3V5`i6e{^?I^TrLe3M%p%BilB3&0~2T ztYtY?fhFF5eD8Df`z5szR&oF2VvJ^}IL0bv>_0k7YdBi=zjb#P9q;}7w}pyOiE%^P zyn$n^2A2KfJ?Q3zO|S}^fOZpi_ZP13De(44^ZC&H_5SUYlbXP3;70hgz!?MstpBH0Rkn)U@J= z&HPtwX59JJLU>hF3j>{-*xb^V;8h!Ow)M-a6TkN6mUfzU21<%*rvvpyH4gNIw%J$h zEbW}QebrV9`|694p4xfBzRquDUrourB2K$dTNB^l(k>Pzwem2TY!t55VgiL%YFBCN zw5zpiv}?8NwClC?S`_F4pbLR60vZ5%BGAP^tAJJmtpOUW*ES?jxY@c!TDwu8u+~Ol zsPP(Uy7UMP{{tA_D`0pZ(35N!K5)our0ubOTzgVL@d=>esP+`lNE@N}oc5vx#TNt= z>tfnYc^}Xv2fIYtqR1=pu%ULfuWIpYu?A_c3s5dQTy{Ild)hvM%J;Pov=6n9w2!q< zv`@9qw9mD@Ku-pG3eZ!5o(A-Epl1N(Kmq8PKv&djUnEfZjkWKu{UA_zmW|4liG6>% z>If$PeN4ItUKMpwpl2sA>5>m|Pkv&YU2d0-lAu%RQu6tegx$bxE za6JI@4xo1ey$k5wK<@#1FVOpd-VbyK&lnZV#jT>gLW6la^Nx6G6eQX}Ei29ER=@0*0@*A;)OCz;-9drC8lay=-L*hJZzBRD?xhw2mk0#zjcGgG%f*a??rWuM z##uH9Pj`a_LM}k~<>4~fS|O)(YoOl%{TAqV zK)(n21JECV{txI+K!2`xUz$MS+5`%(7AXA1M&WNZ3jaKU!v6q;TLlX1f&OZva9i9f zJn&f#_9)-szDuC+PN2U>-FE}s-$oSP?|u*^#oRlDMgBuP0A{nclfQHruh9Lt`zZ^8 zPx5+TD5mWsn??H8Pk*r6_JUi4P;|fO-syhH{j$5kz03WId$)U!`&D2B7zM_FNx)=a z4q#4T3NRIzR_{)PP;|eYFvlWA;br9r4>pbl}JyB}Cr-P@XC&|;v)7jI-)78_>)7{epSVv$kh03u%7jvUX~Ji`dUip86a@j%f?~vgc7oTM_~Bx!_bq9S4BO;fF&nj=ot}L!b67W z^NjWsproiLA6TELrw~}*Hlpx2&sc%NF#?4tV%d<3h&@{lGCQ#mHOW(MfpD?_VgJL# z=d*Ln^i&EA&hpIm%<;_i%=36XCwP3G`JM`31Az?!HW=6tV5z{;fTaT)3M>OyX1&Ls zz+fPO!D@lQEE|J4HU{&KVDLY{;3)!wrvl5iF?hz|d_vDk&$$AD=K#x%dd>sZ#?TX< z3p^JKJazM2#5VyGp(otS#ZV1o(-Oj zo=u(`JexgRJX?Vs1?*^GqktU)>{wu}x)Yck zNnh9E#u#UlOK~=TmRHALHU{-}x_Bt1-X7TOsNNCSoVH<5@1n;aOW95DCNMbnuVqc| zqxXwLP)`vM6d^hOLOS&!`Y@DQuczv1db&PT&(JgVEInJ#(Q|?MfXxS10jv_3AJ_t5 z3xO>H765i)y*}JRpnjA!Ezyq^2wZFnVRhrQQP{Ae8hmh zN#BB!V)_kYX0k$TBfllKk!K%zW}@G$-(~^vRsqDb4-=utZrk1ZqXLKb==bXP>G$h9 z^au0@^@sF_^+$l61MFO2=K)&% z4X|s0T?g!XVC#WJfyIDr0JgE-P%Ru99t(#?JAuPZHV!x2IK1fy4*z`|8p(K7)aVWD zh6E0clsFD)JN5%@C!V$Pb^NW-H8h48X(%abqypO#HPV4?Z5s}aEF(9LLnBAvP&^aC z7|u5XyRkJ4?FXhAM;ph+VQ3s9V7Totc@iizij7GqwcaQ(jx)v>rN&reoH5>*V3ZjX zf!zY^R$#XQ+Yan@V0Qq!6WCqA?gn;Gy>Wa3g;NtKoGDOvuZ_a{Z4^Fq1cm?vSR1A7M8v%sFKH`XQ)c(pY>F|HQ~eBMUji;dHhh9eOC4q>@FC+-loT@_7Ea;Id{fLhML310AKEE2o;IGd zK=`Zx;jY8Pr?X-EvhkJxVS};Dc*WRl>@i+7UNc@d-Z0(-wj0x(hgp4u=T2I_CQw0XUw=wu*;}bX7FGo=L@1xKhiC0Cv4Q;cVK$J>spbp|h|>iSe--zg)W%nL zT0dXIZrwcd1kpM#u-~Jm57>U*Z*FN(v52H)g|taT^Rd$}Fl$lLR&$}b$PAb#nv2aU zv)ZgNgTVd-34w$`A|O$a7)TOGGDwcCsJ|IPDQ3j1Gnbf4&1I;+2o>ezZjcm^RFE`~ zTp)=EX#Hjd!o^jAg@O51BKT9p7h33#6#16~D*ThGe31pgP_@@cYW{U;czPh@ukwe( zUc;~sloySQ$7`#J98iQE6~k+^vr^`VDi#GI{)$Ll$Un0&v)Aa@yao}iuBtFt>2FnY zVX&qm#{YPYK9x%%mGL&GRRt@2RcRH$>e{-9KQuD_aZxZFnHrBQG^;5N z!HfyMip-qU%q+X3SDP23)Q#r(<^|@3=0zasAQ>Q;Ahp|Qt}!n$FEuX%sXa&?KIPDKac&|&Rm*d0QTL=!AQ*~=-x7iI4wJCJ zSFyOiowi+at5xyz3xsHt#m?G4BPb2S`0Z>cvz09{Y`T z|9=Ha?nh8^gZUuR&4&dR+b_lOrACE*e&cEDW8AtFEf9PeWG9?rYMmWC3=%TsWcj(?@(BO=b zM;+aFRDS8$apNbHPoFWzJ2j=IuBvL6+oKz1yBTGPs8!QaDyn?p@SL*p{757em|qw1 zhdJS$Ih|QvS5e{jSNbb=bxiVf>e5ZLeX)Oecve|?;!(5VXlKr%UAe^DPb(`g3D!jR z^z4<~yN{=DO27UC22Lw0FAtpTpHWu6prp#TP*h^a3JHd0m6eb2g{KE9Ba5b$l?%=3 zJG#HsY38{GcR0DsJ9&+ybP*OL5j<*Ysi>nMSXH^pGbA-FeW=&yWYybLZX<-d9(bhL z2`07U_$G9ll&D0-l0;HZdM~D*larj}q{sB$-#I7u zcjujV?%a3(v(~fbJI~DCd+oKK*|VPyf%0T{zEqVhkIACJ()~Q!6p6cGZtI@>gzv){%==iad--qv3T+SJG$yL z;{Onx#o=l6|H=(DjW~sY1vmpZ2e<;b3wR884fp|E1Y8VU z3A6(`03CtOKv!T0Fak&eRs#7z0k9s}0+ayTft|oDKsitW>;-NE_5pVRZvx)|KLfu4 zzXN|7%{N+PWM*VxwAg5gk&V$ZBVQw&QKAviD8-0nlxtLORAtm)Br=j4^%`l6b{Xw8 zI&XBz=)TbtqgO_6jXoJ$7%%>n*G9l!7Lfj5_P?63yTHWhU(k>BVe2Eb|DKIVW(jk< z^{i?bHzEiPKjT3oTXW^u#ftEICg#xldQ+_J^8+p^D6ZK<&wwA^8-x16+` zw%lzwW4YII*7Bj{Ppef{o>pE~-d12MU#l>y7%P$$)hgYp+DdFCv1+%HTFI=sttPDY zTHUbv-RjoT`%9nOEVHqeZ_6 zs{yNxR-3F|uzJyIx7BM_V^_zo#@Vg6%dy*NS7KLcS8i8nS8vy7*JLNM6Wg`fY3%mc zU9y|A`)v2c?yKE*`xW-?_FncN`!)73`?dD*_9Xj__9gbE4$clxhad-}L#RWTL%2hP z1I{7Qf#{IzKz2xVpgI&ev^i{dIO*`h;iJPRhcAxCj!PU@IyyUo9Knuj9HSjMj%ALu zj&+U=jzY&~#|}rSqs+0}ajRpG;~~etoy?q|PRUL*CyrCTQ=!vFrxK@9Cxz2?Cympf z)0opfr^`-Povu6Gbo#^TPp3Ohcb)!rdf@cP>4`JI*~odG^L*!p&Zf@h&Q{J#oNb*~ zIIniLcV6e5?_A^D;=I*a?|j|)nTw^1n@hAyvP-s0mCGiV8W({}i%XYFkBio2!ez>3 zzsn()!!Ac%F1g%x`OD>=%YB!JE{|QFx_or`?DEy+hbzF<*ww^!f$I`i57!V^tSi~I z)V18T(Y3|3)m7pub(OiwT@|ilu7_RExIT7$>N@B8!u6HwTh|Y+pIyJX{&X{PGjUt! zX69z;w%Bd0TY_7WTfJMq+qBznZg<@7y8Z3;!0nOS6Srq>&)r_SFLYn+4su7kliZ8k zi`{wdW$qR3RqmVI$K3b0?{`1w{+s&|_lxd-xZidE+x>z2Blq|2KRoO`Ts*=(a2|;s zM2}>TR1c;{mPfHijfcoX?9t}2+2feUd5`-ZPdt8lF7#aLY3sS%GukuJbG;|iGvBk+ zv)^;j^OEOn&xf9GJl}bK@ciTj^jhF$?&a&1;Z@`%^lJ8M@oM#wc(r?VdTsIQ@{)Tg zyvDrrUXxzaUc0?!y!LwS_d4kHo7WMqV_x^Xf!^-k(cZb<9p2O4SG?bX7K2uT>_846 zCy+M?4)O*0g91Uppb!uWv<{R2N(2!>Bv1;70xAX7gPK7tpjJ=^ND7jHxTnH`#7lV1=GH?aB z3cLl}1(t&q;9l@Ha36RGJOQ2p?*i`u8^HU(r@&{x=fD@he}Er@pMvMWFTful#t;+8 z0>~nW1;h$s2XTNnL0lj($XW;j;s@bD>L3jeA*30ifM_B6AO|3aAcrAGA;%#nA*Uf{ zA?G0%ArByrAWtCAAkQH$A+I5CA@3m{A)g^%*Q{6*uqJKIrZxR*PONzbHHCUZF;F~| z2u+5Pp$up?lmpF!7C^bsjnEQkDYPCcgf>IP&^G91s17;WrC?BFvvJcrO)hE-Z(ueO;?NjSh=hNUL^lA2K@oDvu_-ywX@X`7V`HcAN z^cnNf`%L;w`|S3a@ww*ne(lP&$hC~MjcbS2o?QC~J`ZjIUkqOYw}IQkJ>Xt&5F7%B z!hPUyco-ZFkAz3VW8rb|Y&Z{I3FpJB;q~xFcoSR%m%|lsEnEj5g^$Ch;k)58@V)TU z@XPRb@Q?7%@Ne)R2mrzuF(0uI;f!!Ycp$tGAOr*fMFb#Fh;;}wA_@_WNJfwmsR$|} z9g&IHh$umnBFYhbga{!`SldJ!r_KVm!L2I2wY5#kAA4)NL7(%0J8#&@~zDqnkF zCtp`z4_|Lzh;O)Wq%X!d#uw|G;G5`6^iB3n@um2t`Ih^3`|kDq(+}w9=@;k6@e}zC z`i=Qb_)Yum_B-Tv%I~b-dB013m;J8#UH7~1_sH+5-*dlLesBD({O$am{oVXM{K5WE ze;gI*RKUf6KLg$bybt&k@HOB^ATV%V;DSKYK#Rb|f$o7` zfuKN0AT)4opl_gmU|=9JFf=eMaD8A^pepdUzz0EQL9ifPP<~KLkTj?(XlqbUkS1tn z(0I^9&~(tAAVbi;paVf?g3bqB3c3<>J?Li8hhXF2g~4XQ7Qst`ZG)EwuMGAI1_uWQ zhX#iQql2S^V}s*^aly3U?BJ^4-e6U5f3PN48$1-O3myyB2cHf;7kn{zHuy^Lwcs1U zcY_}XKMQ^l{5tq85`Z*D&POgp+8~{gZb%QL7ZQdHL86fBkZ2?xNkk?i$;b}mHe?@C zjT}HuAWtAqBhMi(A}=GaA#WmYA@3mXAs-;WAipDjh5$p1L*|Dp3^5Hc53vfd4p|!F z6M_#Z4v~e-gxm==4s{6)52c5)Lph=Op@pI4p@PtcP+_Pjv^7)`+8){&stQ$y4utLq z9SPkTdOGxa=&jJ(p?5y$g0@aCNy!n?y2;l1HA;m5K?k9!Xd0SUL!UrjM9-q{pzopYqaUK5qCcWPqralRN0>%f zL|8>wM_?k7B1jP_5!8sy5eFmAM%<0KAMq&SX~gr0R}pU`K16(u_!jXq(k60wJQRk=V$b$hOF_$jgzRqwJ$XqSB(uqXbb6QB6^zsLrUKC}mV% zlsal4N*gs5wL8iXwLj`m)ZwT*QFBqRquxe+i254!9Rt7^VXQGW7-x(J#tQ?+_+a1| zKTH4ygJEMhn0yQuQ;gwZ$}v@#YD_mqfl*>qn10N5%m8K-GmY7U*^4=VIfOZfxrn)p zxr+Gi(Yev;=-KEy(eI)^ zMt_O^9s`Imj+q~`D8@X-DrQNHXACF?5(AC#i9y8p#{|X%$Ard&#e~PuV>ZR~#~g`y z6l)Q?Ha0P~Ft#;T7AueKiB-l9#*W2K#7@WViQOB!KlWhk+1LxQv$0oWZ^Zr{`w=@2 zy9jHJwZtyPF2k6t^bMCk`Ix8y6TC z6&D>B8y6Rs8kZJFi(|w|^I^iwO2xo$` z#98AUaIQFaoEL5l4u*r{d~p%DI9v*@99M2RaCaohxM z3b!A36n6r58g~wN0e1^`2X_y5ANLeDhx?5ChWmjB;OF73@k{Zx_~m#vyeHlp5608* z9DE+W0AGZ!#!K;C_^tR}yb7NuEjGN#G=C5-X`NsUfK;sU@i`sXa-W)RnX~sW(ZL zq)ytMWJubVbRg+a(vhU&NvD#|B%M#Xm^7R8GTAa2o}8Rqp1dvjaPnOefMiedAbFD@ zBq%9>w2l-(!jNJ~@gy9HK%$eFqzn?9#3AL8M5HcK4@pVtBMp$Wq+ybdw3l>%bb@r6 zbe(jIbenXS^pNzJ^o;bJ^o?v!b|Slw-N{~L5P1#Rhm0V{lksFCIhjl*r;@4UbTWsW zPv(+~$vko$xslvVZXvgmJIN}tnmj<(lBdYK$a}~J@(J>3@>%lv6hMkaidBkricJb8 zB`GC4B{!uYr6{E&r7Wc~Wm8IRN_~njr6*-uN?(dPMU$dU8BW=mGL|xtGL^C`<#NiK z)McrGsq0hgQU_CyrQW9iDW(()%3{hA%4&)m#ghV}tfBZ&;1pjSF3r>N4s|DxB&^4WtHBL#Qa~I%+I6k(xv$Qz_ImYBn{OnoljH@~I+fD^)^mrz)u` zYCm;5b(}g$ou=-lzM_7o{!9a=%}WbS%TKFJ+nm;!CQFm2^`vb}>rd09Y14+&cBUOp zJC=4L?Nr*CwDW0~(k`c6O}mlyd)lqE&+AvL4_QxNU$=h8`m^hw(M)NcG#?s*=1&Wx zh10OK1R9=3q$ShHv~*e)Er*szE2I_CB(xq{A5BdgpbgV>v@x2Vc8GR_c9C|KcAfS+ z?GEiO?LO@x?LFOyZb4s0UrD#4JJ3DpXnGVqhMq&urRUSR^kO=XUPiB=SJAi7yXgvg zFMS)mkFKVV(5L9T=?40K`XTyZ`UUzd{R;gW{SJMO{(}CB{)YaOVZ@lnn9s0atYX+P z92icFH4GSIEd#+=#~?9M8EFhUgUQHXuo)aiK7-3BW;8Rzj5fw*Mh9aHql+PDC>TnH ziqX$F!1!|maD(fH=neTBIyQ`NxUgYv!}|@NHhkUiojIRr#k6KFW!f^AGgmS_nBGhX z6UKxyeVGI%ote(eWM(t-nT5Wu>sFto1B9i_I!wm9olNm8>RK3#*kSVaZr( zmWDOR+QFJ;?Pkre_Oed0&alq2F0rn#uCbo7-m*TizOsI#1JW(hZPJ&guS&O1cT4w7 z_fChTL(@ajW7F5CXQdaW^V93oh3TU7)^urlSGqjCCtaC7mcA$bT>9_nf2Ti8f090z z{xbbj`q%Uy8NiHr8S^u&GFE1|WrSqJW)L$-8L1g*8T1TxMovaB zjK>-8Gv{Y6$~4ck%3P9Zo4F!$b*4imEOTupBGWH3ATuZvnHicHmKmN|n5oJ_zOw?4|5w?3HXMwkzA6?ZpPM z5$q6lEIW~%#3r*T><#R6b|yQU&0&|YH?dpTVsTh|{L%dJ{K@>s`S0^T=6}xrRO%WMr$SO8t1z=LyD+yfzp$`STqrN>Dcn}rU%0(+ zpzycC^M#iRuM}P{yjl21;YaQ~?gFkU*Me)swdOi-ow;sYPp&r?%njrsxhQTpH-a0* zC2~pJRBjrV#$|BxxP{z}TpqWKTfvoa)!YH@4(R(z=-S5LH$K|6dC$YNA+cyUBArZ}b;Tg)yN77rJnEq+z9 ztR%REQc_+bE9olPUNTrRRH7>xE76ynFZrY7uabKu4@#bv%$2+>dCddxOn8>O#XNhS z3(t+`$%F8qytO<856#2#s(Aul1FwnK!fWMi=5_L9yl$R?r{wkVw(|ygLp&XCj5ooX z;_c=cc>8&CyqCN;y!X6Mysx|;rNGj8r3*?;OD#$lmo6<`R=Tp(uGF#ArPRIDs}x)c zE%hl4Ee$ITFO4kamDZIulnP5lrTa@ym!2&>UwWy`q-;rHJQESoOdQ}(>MI&6nk#;*IA3wGVz%OHrB$U}<=RT$%7Dt?%FxPnl@XPg%Gk>I zN_=HTCA%`GGPg3nl3Q6^$*U}@tgPf$R#)~^8Y*vB0jk`puvGuK9rB-uj8ZnQG6^vo{#4f_#61?d@i5I zFXLD8Yxn|w17FCO@zwm@d;@zylkp~#O)i_lH)U>W+BCB1(x&&-Hr0sg#A-_Q`f5fsvzk*~TwPjSQO&QesTNdA zsynK;RCiY^s(Y(vs*hKnsXkYIvHEKDjp{$D|E!*?eqa5e`csWbjcJW}ja7|J&GMR6 zHFh=Nn!uWbn#7u<8gdP#W_=B#hE9I;*-Rb+&aY>Q>d+*E!ZX*P-fYb%MI>btmec*IU>7)Z^>( z>Us6$^;Pwo>V@^2>pSaZ_44|jdS(4^{m%OF`pNoT^?T~C*59jtRR6SouKsoXyZR6H zpBff4EN-xGaA|OB@N9rIKpWOJAR5pO_=b!Ib_1s&zk%CO+)&z3(ZFx0X{c-HZcsGz zHf(F?YuMf}(4cJ?YS1-|HjFo%YnW?X+z4+ZH}V_%8V@$!Zu}~oCtM&j6`Bieg$_a| zp^MN>=ppnH`UwMtNFhoXE{qUv5atUv3VFgZAzxT66bS2uokEpRBODYC2}gx`;iPa{ zcvN^v_)z#nI4685d?S1>{3QG;{Lut#n%A_l$*#$v$*IYu$-T*|3Dg8>f;FveLNp~d z6*ftmrkidy{cLt^MmIB?tDBpeTbkRNH#f_h`W6=hnscHGtK*&4>lieKGuAq z`F`{3<`2!Eo4<+xB4d$>Xn|;%Xr;(Q1Qx9k`H1{P0is}0h$v2!D#{meMa800QH6*v zsu9(R8b!?_v8Ye9T{IxliiSiw(U?dtniTC4?GYJ7*F_&%R<(q*Y-ka-47Z$Wc`P;& zTZ*m4HsWPsN3oX}EQX5LihafY;s`ND94n3&)v9$#t7j{y719cA^=U=4 z`n3kM2DOH?qFUFr(pvegeXWOEAGVpd`LyBN3fjbNTiUwY6m7k218t*i<82ddQ*FE2 z_Ou;qJK1)o?R?v%w##j=+P+JSB=aN-B<2z;$r6c;#8u)hflC4;L6Q(jxFk{%Es2$+ zN-`ytl1-9YNxeiU5lLDlnst#BOyu-J{zay{%*@5a<*MaVc>WJ=$?a1nA>=^1e)A6#?wlk{q zOQ*84uXB6nK<8-Z?oLDJzRrW4hdYmUUh2HkdA;-Z&ObZvbbgaAl3GfwrAwtNq^qS4 zQYR@)8X^ssMo2NzI4Mp_kS0l4(n4v2v`N|`ZIiZ3rP40xR%x$PB~?pzOAXR}(gV^% z(j(Gi(i75C(zDX@(u>mPTgay>0>T>P!=t6d(y4H1}yCS=yyJEZIx)Qn)yNF%MT}55( zT~l4xy1sNfbw_rmch_~Rx_5MsbdPqAch7Vm?mpUmy!&ML>F%@LH@k0j-|4>B{h<4i ze4gA|zD&MCzFO`icagixJ>~xL2ziVgD^HLU<;n6CIYpi==gC{-ZSr=xRNf`uD({u6 zyoYhTT{34x2m@u-}*o?PvNWp zDb^@_6mSJn5vhn)#46$ycm+X0S1=VB3buly$Ww?EU5XxsQqiXvQ0!2QD0V9LDNZTQ zD=sQ7D{d(MP~2AhrFg0M)??jc)3dy1RgZm-Q;%zpM~`<8qzBd$*%RFp+Y{H5(399h z>`Cq+_fUG$dT2eBJzIPB_uT03_gU|Y-d9QsmW87tUQo^|uPU!AZz^voZ!7;&e&1%dZQVB3 zHsLniwu{?dsw`Dtm9Hv56|4$TMX7Kqf+|TxR;8+_Dz=KF%2#n!#VVevQ>9XARD-G^ z)u>9Zno{jj9aGJ!uB&dUZmI67?yDZDo~SHvfsBqwZE*ttADb8U;n}W!~IA5 z&-GvHzuAAQ|4#qC{`>u}```6{?EljLz5l1$PVKFRs@JL!>OeJ89jXpfRNT1TCE;X?@*7ZN7Z`ulzO+?px&=Oq`s=Yq5fTcOMP2?SN*s8f%=j9 zsd`TRV!PRP(01H*?)EL)4cl*T|E{sq1ZmKkC{2t8t4Y$V*Dy3pO@<~*lda)t$~9G* zYK=fsuj$k5)J$lmG`ltXGzT?@HAgjc1F8Tdr*5=drW&$dq#U+ z`?vO?_ObS0-l5)ca>v||*$`+bdMI%yX^1?O zI>a2}4CM_K3~`4x4wVcEh8l*NhFXT&hBgoBhGvEi3>_LeGIVn2%+R@^3q!Yuo(;Vk zdNcHX=*!Uep`XLR;l;!D!|-9h;lN?!Flsn_IC4087(1LWoH(30oIT7L&KoWmE*dTw zE*&l(t{UDnTr=D|ym$D{2yn!GByOZ|L^85-r`GM( z8Fc$~hjd4D$91Q4XLT2Jv%0Igr@H65m%7)wx4I9yPr5Itp7{@R{uf&S^rJ{bHZrCWMbij z*@WeU^Mvb!$As4ecmg`HcEWceU?OM&If0p=O_WZECi*6(Ck{?rpLjL#apL==%cR#N zVlrehc9J+rnoONco1{;&CpnY(libPTN#3Mna%l4CD2S7S5t4NzD#|e222}In@n3y z+fF-7d(8OF1kQxd;AhA)v>DD!*-YikrkUEA`WfMjXr^ms>rC&AYDPUXFtcN3c;>>) zJA;EE#y~Jo4KzcZfoCW;R2ujOk)hQfF?1NV7`hB9gW8}m3>wA^tUc*Jhtl_HR khT#vxZNpu|eZxb;6T{rEds{|EzpVAw|6Jty)eJBG57Po`TmS$7 diff --git a/.swiftpm/xcode/xcuserdata/selim.xcuserdatad/xcschemes/xcschememanagement.plist b/.swiftpm/xcode/xcuserdata/selim.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index 470db35..0000000 --- a/.swiftpm/xcode/xcuserdata/selim.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,32 +0,0 @@ - - - - - SchemeUserState - - NesKit.xcscheme_^#shared#^_ - - orderHint - 0 - - nes-Package.xcscheme_^#shared#^_ - - orderHint - 1 - - - SuppressBuildableAutocreation - - NesKit - - primary - - - nes - - primary - - - - - diff --git a/NesKit/NesSystem.mm b/NesKit/NesSystem.mm index a248a86..98a3988 100644 --- a/NesKit/NesSystem.mm +++ b/NesKit/NesSystem.mm @@ -25,34 +25,6 @@ _system = std::make_unique(); _condition = [NSCondition new]; _runEmulation = YES; - - size_t frameBufferSize = nes::Ppu::SCREEN_WIDTH * nes::Ppu::SCREEN_HEIGHT * sizeof(nes::Pixel); - - _system->setNewFrameCallback([frameBufferSize, self](auto frameBuffer) { - _runEmulation = NO; - - CGImageRelease(_frame); - - CGDataProviderRef dataProvider = CGDataProviderCreateWithData(NULL, (void*)frameBuffer, frameBufferSize, NULL); - CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB(); - CGImageRef image = CGImageCreate(nes::Ppu::SCREEN_WIDTH, - nes::Ppu::SCREEN_HEIGHT, - 8, - sizeof(nes::Pixel)*8, - nes::Ppu::SCREEN_WIDTH * sizeof(nes::Pixel), - colorspace, - kCGImageAlphaPremultipliedLast, - dataProvider, - NULL, - false, - kCGRenderingIntentDefault); - CGDataProviderRelease(dataProvider); - CGColorSpaceRelease(colorspace); - - dispatch_async(dispatch_get_main_queue(), ^{ - _frame = image; - }); - }); } return self; } @@ -67,7 +39,11 @@ } while(_runEmulation) { - _system->tick(); + auto frameBuffer = _system->tick(); + if(frameBuffer) { + _runEmulation = NO; + [self generateFrame:frameBuffer]; + } } [_condition unlock]; @@ -75,6 +51,30 @@ }); } +- (void)generateFrame:(const nes::Pixel*)buffer { + size_t frameBufferSize = nes::Ppu::SCREEN_WIDTH * nes::Ppu::SCREEN_HEIGHT * sizeof(nes::Pixel); + CGDataProviderRef dataProvider = CGDataProviderCreateWithData(NULL, (void*)buffer, frameBufferSize, NULL); + CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB(); + CGImageRef image = CGImageCreate(nes::Ppu::SCREEN_WIDTH, + nes::Ppu::SCREEN_HEIGHT, + 8, + sizeof(nes::Pixel)*8, + nes::Ppu::SCREEN_WIDTH * sizeof(nes::Pixel), + colorspace, + kCGImageAlphaPremultipliedLast, + dataProvider, + NULL, + false, + kCGRenderingIntentDefault); + CGDataProviderRelease(dataProvider); + CGColorSpaceRelease(colorspace); + + dispatch_async(dispatch_get_main_queue(), ^{ + CGImageRelease(_frame); + _frame = image; + }); +} + - (void)stepToNextFrame { [_condition lock]; _runEmulation = YES;