From 83bb16b28bb04e779fc242e57b703e73697d7450 Mon Sep 17 00:00:00 2001 From: Selim Mustafaev Date: Wed, 27 Sep 2023 23:38:52 +0300 Subject: [PATCH] Fixing SPM targets. Adding example project --- .../contents.xcworkspacedata | 7 + .../UserInterfaceState.xcuserstate | Bin 0 -> 57092 bytes .../xcschemes/xcschememanagement.plist | 32 ++ CMakeLists.txt | 4 +- NesKit/NesSystem.h | 18 + NesKit/NesSystem.mm | 28 ++ NesKit/include/NesKit.h | 13 + Package.swift | 13 +- .../NesApp/NesApp.xcodeproj/project.pbxproj | 390 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../UserInterfaceState.xcuserstate | Bin 0 -> 15885 bytes .../xcschemes/xcschememanagement.plist | 14 + examples/NesApp/NesApp/AppDelegate.swift | 36 ++ .../AccentColor.colorset/Contents.json | 11 + .../AppIcon.appiconset/Contents.json | 13 + .../NesApp/Assets.xcassets/Contents.json | 6 + .../NesApp/Base.lproj/LaunchScreen.storyboard | 25 ++ .../NesApp/NesApp/Base.lproj/Main.storyboard | 24 ++ examples/NesApp/NesApp/Info.plist | 25 ++ examples/NesApp/NesApp/SceneDelegate.swift | 52 +++ examples/NesApp/NesApp/ViewController.swift | 21 + examples/sdl/main.cpp | 4 +- src/Cpu.cpp | 110 ++--- src/Cpu.h | 10 +- src/Dma.cpp | 4 +- src/Dma.h | 6 +- src/Logger.h | 1 + src/{Nes.cpp => System.cpp} | 20 +- src/{Nes.h => System.h} | 10 +- src/include/NesKitCpp.h | 15 + 31 files changed, 836 insertions(+), 91 deletions(-) create mode 100644 .swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata create mode 100644 .swiftpm/xcode/package.xcworkspace/xcuserdata/selim.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 .swiftpm/xcode/xcuserdata/selim.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 NesKit/NesSystem.h create mode 100644 NesKit/NesSystem.mm create mode 100644 NesKit/include/NesKit.h create mode 100644 examples/NesApp/NesApp.xcodeproj/project.pbxproj create mode 100644 examples/NesApp/NesApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 examples/NesApp/NesApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 examples/NesApp/NesApp.xcodeproj/project.xcworkspace/xcuserdata/selim.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 examples/NesApp/NesApp.xcodeproj/xcuserdata/selim.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 examples/NesApp/NesApp/AppDelegate.swift create mode 100644 examples/NesApp/NesApp/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 examples/NesApp/NesApp/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 examples/NesApp/NesApp/Assets.xcassets/Contents.json create mode 100644 examples/NesApp/NesApp/Base.lproj/LaunchScreen.storyboard create mode 100644 examples/NesApp/NesApp/Base.lproj/Main.storyboard create mode 100644 examples/NesApp/NesApp/Info.plist create mode 100644 examples/NesApp/NesApp/SceneDelegate.swift create mode 100644 examples/NesApp/NesApp/ViewController.swift rename src/{Nes.cpp => System.cpp} (85%) rename src/{Nes.h => System.h} (91%) create mode 100644 src/include/NesKitCpp.h diff --git a/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata b/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/.swiftpm/xcode/package.xcworkspace/xcuserdata/selim.xcuserdatad/UserInterfaceState.xcuserstate b/.swiftpm/xcode/package.xcworkspace/xcuserdata/selim.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..f166178cd11e0ed379c0bd93bdfe6b918b8844d9 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/.swiftpm/xcode/xcuserdata/selim.xcuserdatad/xcschemes/xcschememanagement.plist b/.swiftpm/xcode/xcuserdata/selim.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..470db35 --- /dev/null +++ b/.swiftpm/xcode/xcuserdata/selim.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,32 @@ + + + + + SchemeUserState + + NesKit.xcscheme_^#shared#^_ + + orderHint + 0 + + nes-Package.xcscheme_^#shared#^_ + + orderHint + 1 + + + SuppressBuildableAutocreation + + NesKit + + primary + + + nes + + primary + + + + + diff --git a/CMakeLists.txt b/CMakeLists.txt index 0233603..c59e851 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,8 +9,8 @@ add_executable(nes examples/sdl/main.cpp src/Cartridge.cpp src/Cartridge.h - src/Nes.cpp - src/Nes.h + src/System.cpp + src/System.h src/Cpu.cpp src/Cpu.h src/Mapper/Mapper.cpp diff --git a/NesKit/NesSystem.h b/NesKit/NesSystem.h new file mode 100644 index 0000000..73e0f99 --- /dev/null +++ b/NesKit/NesSystem.h @@ -0,0 +1,18 @@ +// +// NesSystem.h +// +// +// Created by Selim Mustafaev on 27.09.2023. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface NesSystem : NSObject + +- (instancetype)init; + +@end + +NS_ASSUME_NONNULL_END diff --git a/NesKit/NesSystem.mm b/NesKit/NesSystem.mm new file mode 100644 index 0000000..88a6bb9 --- /dev/null +++ b/NesKit/NesSystem.mm @@ -0,0 +1,28 @@ +// +// NesSystem.m +// +// +// Created by Selim Mustafaev on 27.09.2023. +// + +#import "NesSystem.h" +#import +#import + + +@interface NesSystem() + +@end + +@implementation NesSystem { + std::unique_ptr _system; +} + +- (instancetype)init { + if(self = [super init]) { + _system = std::make_unique(); + } + return self; +} + +@end diff --git a/NesKit/include/NesKit.h b/NesKit/include/NesKit.h new file mode 100644 index 0000000..2088bce --- /dev/null +++ b/NesKit/include/NesKit.h @@ -0,0 +1,13 @@ +// +// Header.h +// +// +// Created by Selim Mustafaev on 27.09.2023. +// + +#ifndef NesKit_h +#define NesKit_h + +#import "../NesSystem.h" + +#endif /* Header_h */ diff --git a/Package.swift b/Package.swift index 7b44676..aec3978 100644 --- a/Package.swift +++ b/Package.swift @@ -10,18 +10,17 @@ let package = Package( .iOS(.v16) ], products: [ - // Products define the executables and libraries a package produces, making them visible to other packages. - .library( - name: "NesKit", - targets: ["NesKit"]), + .library(name: "NesKit", targets: ["NesKit"]), ], targets: [ // Targets are the basic building blocks of a package, defining a module or a test suite. // Targets can depend on other targets in this package and products from dependencies. + .target(name: "NesKitCpp", + path: "src", + exclude: ["Logger.cpp", "Logger.h"]), .target(name: "NesKit", - path: "./src", - exclude: ["Logger.cpp", "Logger.h"], - publicHeadersPath: ".") + dependencies: [.target(name: "NesKitCpp")], + path: "NesKit") ], cxxLanguageStandard: .cxx20 ) diff --git a/examples/NesApp/NesApp.xcodeproj/project.pbxproj b/examples/NesApp/NesApp.xcodeproj/project.pbxproj new file mode 100644 index 0000000..69d1cad --- /dev/null +++ b/examples/NesApp/NesApp.xcodeproj/project.pbxproj @@ -0,0 +1,390 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 60; + objects = { + +/* Begin PBXBuildFile section */ + 7AF4D40F2AC4A97B00717C81 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AF4D40E2AC4A97B00717C81 /* AppDelegate.swift */; }; + 7AF4D4112AC4A97B00717C81 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AF4D4102AC4A97B00717C81 /* SceneDelegate.swift */; }; + 7AF4D4132AC4A97B00717C81 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AF4D4122AC4A97B00717C81 /* ViewController.swift */; }; + 7AF4D4162AC4A97B00717C81 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7AF4D4142AC4A97B00717C81 /* Main.storyboard */; }; + 7AF4D4182AC4A97D00717C81 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 7AF4D4172AC4A97D00717C81 /* Assets.xcassets */; }; + 7AF4D41B2AC4A97D00717C81 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7AF4D4192AC4A97D00717C81 /* LaunchScreen.storyboard */; }; + 7AF4D4242AC4A9D300717C81 /* NesKit in Frameworks */ = {isa = PBXBuildFile; productRef = 7AF4D4232AC4A9D300717C81 /* NesKit */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 7AF4D40B2AC4A97B00717C81 /* NesApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = NesApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 7AF4D40E2AC4A97B00717C81 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7AF4D4102AC4A97B00717C81 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; + 7AF4D4122AC4A97B00717C81 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 7AF4D4152AC4A97B00717C81 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 7AF4D4172AC4A97D00717C81 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 7AF4D41A2AC4A97D00717C81 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 7AF4D41C2AC4A97D00717C81 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 7AF4D4082AC4A97B00717C81 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 7AF4D4242AC4A9D300717C81 /* NesKit in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 7AF4D4022AC4A97B00717C81 = { + isa = PBXGroup; + children = ( + 7AF4D40D2AC4A97B00717C81 /* NesApp */, + 7AF4D40C2AC4A97B00717C81 /* Products */, + ); + sourceTree = ""; + }; + 7AF4D40C2AC4A97B00717C81 /* Products */ = { + isa = PBXGroup; + children = ( + 7AF4D40B2AC4A97B00717C81 /* NesApp.app */, + ); + name = Products; + sourceTree = ""; + }; + 7AF4D40D2AC4A97B00717C81 /* NesApp */ = { + isa = PBXGroup; + children = ( + 7AF4D40E2AC4A97B00717C81 /* AppDelegate.swift */, + 7AF4D4102AC4A97B00717C81 /* SceneDelegate.swift */, + 7AF4D4122AC4A97B00717C81 /* ViewController.swift */, + 7AF4D4142AC4A97B00717C81 /* Main.storyboard */, + 7AF4D4172AC4A97D00717C81 /* Assets.xcassets */, + 7AF4D4192AC4A97D00717C81 /* LaunchScreen.storyboard */, + 7AF4D41C2AC4A97D00717C81 /* Info.plist */, + ); + path = NesApp; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 7AF4D40A2AC4A97B00717C81 /* NesApp */ = { + isa = PBXNativeTarget; + buildConfigurationList = 7AF4D41F2AC4A97D00717C81 /* Build configuration list for PBXNativeTarget "NesApp" */; + buildPhases = ( + 7AF4D4072AC4A97B00717C81 /* Sources */, + 7AF4D4082AC4A97B00717C81 /* Frameworks */, + 7AF4D4092AC4A97B00717C81 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = NesApp; + packageProductDependencies = ( + 7AF4D4232AC4A9D300717C81 /* NesKit */, + ); + productName = NesApp; + productReference = 7AF4D40B2AC4A97B00717C81 /* NesApp.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 7AF4D4032AC4A97B00717C81 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1500; + LastUpgradeCheck = 1500; + TargetAttributes = { + 7AF4D40A2AC4A97B00717C81 = { + CreatedOnToolsVersion = 15.0; + }; + }; + }; + buildConfigurationList = 7AF4D4062AC4A97B00717C81 /* Build configuration list for PBXProject "NesApp" */; + compatibilityVersion = "Xcode 14.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 7AF4D4022AC4A97B00717C81; + packageReferences = ( + 7AF4D4222AC4A9D300717C81 /* XCLocalSwiftPackageReference "../.." */, + ); + productRefGroup = 7AF4D40C2AC4A97B00717C81 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 7AF4D40A2AC4A97B00717C81 /* NesApp */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 7AF4D4092AC4A97B00717C81 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 7AF4D41B2AC4A97D00717C81 /* LaunchScreen.storyboard in Resources */, + 7AF4D4182AC4A97D00717C81 /* Assets.xcassets in Resources */, + 7AF4D4162AC4A97B00717C81 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 7AF4D4072AC4A97B00717C81 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 7AF4D4132AC4A97B00717C81 /* ViewController.swift in Sources */, + 7AF4D40F2AC4A97B00717C81 /* AppDelegate.swift in Sources */, + 7AF4D4112AC4A97B00717C81 /* SceneDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 7AF4D4142AC4A97B00717C81 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 7AF4D4152AC4A97B00717C81 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 7AF4D4192AC4A97D00717C81 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 7AF4D41A2AC4A97D00717C81 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 7AF4D41D2AC4A97D00717C81 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 7AF4D41E2AC4A97D00717C81 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 7AF4D4202AC4A97D00717C81 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 46DTTB8X4S; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = NesApp/Info.plist; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; + INFOPLIST_KEY_UIMainStoryboardFile = Main; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = pro.aliencat.NesApp; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 7AF4D4212AC4A97D00717C81 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 46DTTB8X4S; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = NesApp/Info.plist; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; + INFOPLIST_KEY_UIMainStoryboardFile = Main; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = pro.aliencat.NesApp; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 7AF4D4062AC4A97B00717C81 /* Build configuration list for PBXProject "NesApp" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 7AF4D41D2AC4A97D00717C81 /* Debug */, + 7AF4D41E2AC4A97D00717C81 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 7AF4D41F2AC4A97D00717C81 /* Build configuration list for PBXNativeTarget "NesApp" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 7AF4D4202AC4A97D00717C81 /* Debug */, + 7AF4D4212AC4A97D00717C81 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCLocalSwiftPackageReference section */ + 7AF4D4222AC4A9D300717C81 /* XCLocalSwiftPackageReference "../.." */ = { + isa = XCLocalSwiftPackageReference; + relativePath = ../..; + }; +/* End XCLocalSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + 7AF4D4232AC4A9D300717C81 /* NesKit */ = { + isa = XCSwiftPackageProductDependency; + productName = NesKit; + }; +/* End XCSwiftPackageProductDependency section */ + }; + rootObject = 7AF4D4032AC4A97B00717C81 /* Project object */; +} diff --git a/examples/NesApp/NesApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/examples/NesApp/NesApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/examples/NesApp/NesApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/examples/NesApp/NesApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/examples/NesApp/NesApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/examples/NesApp/NesApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/examples/NesApp/NesApp.xcodeproj/project.xcworkspace/xcuserdata/selim.xcuserdatad/UserInterfaceState.xcuserstate b/examples/NesApp/NesApp.xcodeproj/project.xcworkspace/xcuserdata/selim.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..d7ba2824495261c99ee335e71b5a46f64fc57652 GIT binary patch literal 15885 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 literal 0 HcmV?d00001 diff --git a/examples/NesApp/NesApp.xcodeproj/xcuserdata/selim.xcuserdatad/xcschemes/xcschememanagement.plist b/examples/NesApp/NesApp.xcodeproj/xcuserdata/selim.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..ec04092 --- /dev/null +++ b/examples/NesApp/NesApp.xcodeproj/xcuserdata/selim.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SchemeUserState + + NesApp.xcscheme_^#shared#^_ + + orderHint + 0 + + + + diff --git a/examples/NesApp/NesApp/AppDelegate.swift b/examples/NesApp/NesApp/AppDelegate.swift new file mode 100644 index 0000000..9f995da --- /dev/null +++ b/examples/NesApp/NesApp/AppDelegate.swift @@ -0,0 +1,36 @@ +// +// AppDelegate.swift +// NesApp +// +// Created by Selim Mustafaev on 27.09.2023. +// + +import UIKit + +@main +class AppDelegate: UIResponder, UIApplicationDelegate { + + + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + // Override point for customization after application launch. + return true + } + + // MARK: UISceneSession Lifecycle + + func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { + // Called when a new scene session is being created. + // Use this method to select a configuration to create the new scene with. + return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) + } + + func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) { + // Called when the user discards a scene session. + // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions. + // Use this method to release any resources that were specific to the discarded scenes, as they will not return. + } + + +} + diff --git a/examples/NesApp/NesApp/Assets.xcassets/AccentColor.colorset/Contents.json b/examples/NesApp/NesApp/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/examples/NesApp/NesApp/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/examples/NesApp/NesApp/Assets.xcassets/AppIcon.appiconset/Contents.json b/examples/NesApp/NesApp/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..13613e3 --- /dev/null +++ b/examples/NesApp/NesApp/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,13 @@ +{ + "images" : [ + { + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/examples/NesApp/NesApp/Assets.xcassets/Contents.json b/examples/NesApp/NesApp/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/examples/NesApp/NesApp/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/examples/NesApp/NesApp/Base.lproj/LaunchScreen.storyboard b/examples/NesApp/NesApp/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..865e932 --- /dev/null +++ b/examples/NesApp/NesApp/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/NesApp/NesApp/Base.lproj/Main.storyboard b/examples/NesApp/NesApp/Base.lproj/Main.storyboard new file mode 100644 index 0000000..25a7638 --- /dev/null +++ b/examples/NesApp/NesApp/Base.lproj/Main.storyboard @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/NesApp/NesApp/Info.plist b/examples/NesApp/NesApp/Info.plist new file mode 100644 index 0000000..dd3c9af --- /dev/null +++ b/examples/NesApp/NesApp/Info.plist @@ -0,0 +1,25 @@ + + + + + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneConfigurationName + Default Configuration + UISceneDelegateClassName + $(PRODUCT_MODULE_NAME).SceneDelegate + UISceneStoryboardFile + Main + + + + + + diff --git a/examples/NesApp/NesApp/SceneDelegate.swift b/examples/NesApp/NesApp/SceneDelegate.swift new file mode 100644 index 0000000..a8b7d69 --- /dev/null +++ b/examples/NesApp/NesApp/SceneDelegate.swift @@ -0,0 +1,52 @@ +// +// SceneDelegate.swift +// NesApp +// +// Created by Selim Mustafaev on 27.09.2023. +// + +import UIKit + +class SceneDelegate: UIResponder, UIWindowSceneDelegate { + + var window: UIWindow? + + + func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { + // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`. + // If using a storyboard, the `window` property will automatically be initialized and attached to the scene. + // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead). + guard let _ = (scene as? UIWindowScene) else { return } + } + + func sceneDidDisconnect(_ scene: UIScene) { + // Called as the scene is being released by the system. + // This occurs shortly after the scene enters the background, or when its session is discarded. + // Release any resources associated with this scene that can be re-created the next time the scene connects. + // The scene may re-connect later, as its session was not necessarily discarded (see `application:didDiscardSceneSessions` instead). + } + + func sceneDidBecomeActive(_ scene: UIScene) { + // Called when the scene has moved from an inactive state to an active state. + // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive. + } + + func sceneWillResignActive(_ scene: UIScene) { + // Called when the scene will move from an active state to an inactive state. + // This may occur due to temporary interruptions (ex. an incoming phone call). + } + + func sceneWillEnterForeground(_ scene: UIScene) { + // Called as the scene transitions from the background to the foreground. + // Use this method to undo the changes made on entering the background. + } + + func sceneDidEnterBackground(_ scene: UIScene) { + // Called as the scene transitions from the foreground to the background. + // Use this method to save data, release shared resources, and store enough scene-specific state information + // to restore the scene back to its current state. + } + + +} + diff --git a/examples/NesApp/NesApp/ViewController.swift b/examples/NesApp/NesApp/ViewController.swift new file mode 100644 index 0000000..4ae6ebc --- /dev/null +++ b/examples/NesApp/NesApp/ViewController.swift @@ -0,0 +1,21 @@ +// +// ViewController.swift +// NesApp +// +// Created by Selim Mustafaev on 27.09.2023. +// + +import UIKit +import NesKit + +class ViewController: UIViewController { + + var system = NesSystem() + + override func viewDidLoad() { + super.viewDidLoad() + } + + +} + diff --git a/examples/sdl/main.cpp b/examples/sdl/main.cpp index bb023d7..f0ddcb5 100644 --- a/examples/sdl/main.cpp +++ b/examples/sdl/main.cpp @@ -1,4 +1,4 @@ -#include "../../src/Nes.h" +#include "../../src/System.h" #include "Window.h" #include "SdlKeyboardController.h" @@ -9,7 +9,7 @@ int main() { using namespace std::placeholders; - nes::Nes device; + nes::System device; nes::SdlWindow window(nes::Ppu::SCREEN_WIDTH, nes::Ppu::SCREEN_HEIGHT); window.setSize(nes::Ppu::SCREEN_WIDTH * 4, nes::Ppu::SCREEN_HEIGHT * 4); diff --git a/src/Cpu.cpp b/src/Cpu.cpp index 445677d..32a3dfe 100644 --- a/src/Cpu.cpp +++ b/src/Cpu.cpp @@ -3,7 +3,7 @@ // #include "Cpu.h" -#include "Nes.h" +#include "System.h" #include #ifdef NES_LOGGING @@ -12,27 +12,27 @@ namespace nes { - Cpu::Cpu(Nes* system): _ticks{}, A{}, X{}, Y{}, PC{}, SP{}, flags{} { + Cpu::Cpu(System* system): _ticks{}, A{}, X{}, Y{}, PC{}, SP{}, flags{} { _system = system; _instructions = std::vector(256); - _instructions[0x00] = {"BRK", &Cpu::BRK, &Cpu::IMP, 7, false}; + _instructions[0x00] = {"BRK", &Cpu::BRK, &Cpu::IMPL, 7, false}; _instructions[0x01] = {"ORA", &Cpu::ORA, &Cpu::IZX, 6, false}; _instructions[0x05] = {"ORA", &Cpu::ORA, &Cpu::ZP0, 3, false}; _instructions[0x06] = {"ASL", &Cpu::ASL, &Cpu::ZP0, 5, false}; _instructions[0x09] = {"ORA", &Cpu::ORA, &Cpu::IMM, 2, false}; - _instructions[0x0A] = {"ASL", &Cpu::ASL_ACC, &Cpu::IMP, 2, false}; - _instructions[0x0D] = {"ORA", &Cpu::ORA, &Cpu::ABS, 4, false}; + _instructions[0x0A] = {"ASL", &Cpu::ASL_ACC, &Cpu::IMPL, 2, false}; + _instructions[0x0D] = {"ORA", &Cpu::ORA, &Cpu::ABSL, 4, false}; _instructions[0x11] = {"ORA", &Cpu::ORA, &Cpu::IZY, 5, true}; _instructions[0x19] = {"ORA", &Cpu::ORA, &Cpu::ABY, 4, true}; _instructions[0x15] = {"ORA", &Cpu::ORA, &Cpu::ZPX, 4, false}; _instructions[0x1D] = {"ORA", &Cpu::ORA, &Cpu::ABX, 4, true}; - _instructions[0x0E] = {"ASL", &Cpu::ASL, &Cpu::ABS, 6, false}; + _instructions[0x0E] = {"ASL", &Cpu::ASL, &Cpu::ABSL, 6, false}; _instructions[0x16] = {"ASL", &Cpu::ASL, &Cpu::ZPX, 6, false}; _instructions[0x1E] = {"ASL", &Cpu::ASL, &Cpu::ABX, 7, false}; _instructions[0x21] = {"AND", &Cpu::AND, &Cpu::IZX, 6, false}; _instructions[0x25] = {"AND", &Cpu::AND, &Cpu::ZP0, 3, false}; _instructions[0x29] = {"AND", &Cpu::AND, &Cpu::IMM, 2, false}; - _instructions[0x2D] = {"AND", &Cpu::AND, &Cpu::ABS, 4, false}; + _instructions[0x2D] = {"AND", &Cpu::AND, &Cpu::ABSL, 4, false}; _instructions[0x31] = {"AND", &Cpu::AND, &Cpu::IZY, 5, true}; _instructions[0x35] = {"AND", &Cpu::AND, &Cpu::ZPX, 4, false}; _instructions[0x39] = {"AND", &Cpu::AND, &Cpu::ABY, 4, true}; @@ -40,14 +40,14 @@ namespace nes { _instructions[0x41] = {"EOR", &Cpu::EOR, &Cpu::IZX, 6, false}; _instructions[0x45] = {"EOR", &Cpu::EOR, &Cpu::ZP0, 3, false}; _instructions[0x49] = {"EOR", &Cpu::EOR, &Cpu::IMM, 2, false}; - _instructions[0x4D] = {"EOR", &Cpu::EOR, &Cpu::ABS, 4, false}; + _instructions[0x4D] = {"EOR", &Cpu::EOR, &Cpu::ABSL, 4, false}; _instructions[0x51] = {"EOR", &Cpu::EOR, &Cpu::IZY, 5, true}; _instructions[0x55] = {"EOR", &Cpu::EOR, &Cpu::ZPX, 4, false}; _instructions[0x59] = {"EOR", &Cpu::EOR, &Cpu::ABY, 4, true}; _instructions[0x5D] = {"EOR", &Cpu::EOR, &Cpu::ABX, 4, true}; _instructions[0x61] = {"ADC", &Cpu::ADC, &Cpu::IZX, 6, false}; _instructions[0x65] = {"ADC", &Cpu::ADC, &Cpu::ZP0, 3, false}; - _instructions[0x6D] = {"ADC", &Cpu::ADC, &Cpu::ABS, 4, false}; + _instructions[0x6D] = {"ADC", &Cpu::ADC, &Cpu::ABSL, 4, false}; _instructions[0x69] = {"ADC", &Cpu::ADC, &Cpu::IMM, 2, false}; _instructions[0x71] = {"ADC", &Cpu::ADC, &Cpu::IZY, 5, true}; _instructions[0x75] = {"ADC", &Cpu::ADC, &Cpu::ZPX, 4, false}; @@ -55,114 +55,114 @@ namespace nes { _instructions[0x7D] = {"ADC", &Cpu::ADC, &Cpu::ABX, 4, true}; _instructions[0xA2] = {"LDX", &Cpu::LDX, &Cpu::IMM, 2, false}; _instructions[0xA6] = {"LDX", &Cpu::LDX, &Cpu::ZP0, 3, false}; - _instructions[0xAE] = {"LDX", &Cpu::LDX, &Cpu::ABS, 4, false}; + _instructions[0xAE] = {"LDX", &Cpu::LDX, &Cpu::ABSL, 4, false}; _instructions[0xB6] = {"LDX", &Cpu::LDX, &Cpu::ZPY, 4, false}; _instructions[0xBE] = {"LDX", &Cpu::LDX, &Cpu::ABY, 4, true}; _instructions[0x86] = {"STX", &Cpu::STX, &Cpu::ZP0, 3, false}; - _instructions[0x8E] = {"STX", &Cpu::STX, &Cpu::ABS, 4, false}; + _instructions[0x8E] = {"STX", &Cpu::STX, &Cpu::ABSL, 4, false}; _instructions[0x96] = {"STX", &Cpu::STX, &Cpu::ZPY, 4, false}; _instructions[0xA4] = {"LDY", &Cpu::LDY, &Cpu::ZP0, 3, false}; - _instructions[0xAC] = {"LDY", &Cpu::LDY, &Cpu::ABS, 4, false}; + _instructions[0xAC] = {"LDY", &Cpu::LDY, &Cpu::ABSL, 4, false}; _instructions[0xA0] = {"LDY", &Cpu::LDY, &Cpu::IMM, 2, false}; _instructions[0xB4] = {"LDY", &Cpu::LDY, &Cpu::ZPX, 4, false}; _instructions[0xBC] = {"LDY", &Cpu::LDY, &Cpu::ABX, 4, true}; _instructions[0xA1] = {"LDA", &Cpu::LDA, &Cpu::IZX, 6, false}; _instructions[0xA5] = {"LDA", &Cpu::LDA, &Cpu::ZP0, 3, false}; _instructions[0xA9] = {"LDA", &Cpu::LDA, &Cpu::IMM, 2, false}; - _instructions[0xAD] = {"LDA", &Cpu::LDA, &Cpu::ABS, 4, false}; + _instructions[0xAD] = {"LDA", &Cpu::LDA, &Cpu::ABSL, 4, false}; _instructions[0xB1] = {"LDA", &Cpu::LDA, &Cpu::IZY, 5, true}; _instructions[0xB5] = {"LDA", &Cpu::LDA, &Cpu::ZPX, 4, false}; _instructions[0xB9] = {"LDA", &Cpu::LDA, &Cpu::ABY, 4, true}; _instructions[0xBD] = {"LDA", &Cpu::LDA, &Cpu::ABX, 4, true}; - _instructions[0x18] = {"CLC", &Cpu::CLC, &Cpu::IMP, 2, false}; - _instructions[0x88] = {"DEY", &Cpu::DEY, &Cpu::IMP, 2, false}; + _instructions[0x18] = {"CLC", &Cpu::CLC, &Cpu::IMPL, 2, false}; + _instructions[0x88] = {"DEY", &Cpu::DEY, &Cpu::IMPL, 2, false}; _instructions[0xD0] = {"BNE", &Cpu::BNE, &Cpu::REL, 2, false}; _instructions[0x81] = {"STA", &Cpu::STA, &Cpu::IZX, 6, false}; - _instructions[0x8D] = {"STA", &Cpu::STA, &Cpu::ABS, 4, false}; + _instructions[0x8D] = {"STA", &Cpu::STA, &Cpu::ABSL, 4, false}; _instructions[0x91] = {"STA", &Cpu::STA, &Cpu::IZY, 6, false}; _instructions[0x95] = {"STA", &Cpu::STA, &Cpu::ZPX, 4, false}; _instructions[0x99] = {"STA", &Cpu::STA, &Cpu::ABY, 5, false}; _instructions[0x9D] = {"STA", &Cpu::STA, &Cpu::ABX, 5, false}; - _instructions[0xEA] = {"NOP", &Cpu::NOP, &Cpu::IMP, 2, false}; - _instructions[0x78] = {"SEI", &Cpu::SEI, &Cpu::IMP, 2, false}; - _instructions[0xD8] = {"CLD", &Cpu::CLD, &Cpu::IMP, 2, false}; - _instructions[0x9A] = {"TXS", &Cpu::TXS, &Cpu::IMP, 2, false}; + _instructions[0xEA] = {"NOP", &Cpu::NOP, &Cpu::IMPL, 2, false}; + _instructions[0x78] = {"SEI", &Cpu::SEI, &Cpu::IMPL, 2, false}; + _instructions[0xD8] = {"CLD", &Cpu::CLD, &Cpu::IMPL, 2, false}; + _instructions[0x9A] = {"TXS", &Cpu::TXS, &Cpu::IMPL, 2, false}; _instructions[0x10] = {"BPL", &Cpu::BPL, &Cpu::REL, 2, false}; - _instructions[0x4C] = {"JMP", &Cpu::JMP, &Cpu::ABS, 3, false}; + _instructions[0x4C] = {"JMP", &Cpu::JMP, &Cpu::ABSL, 3, false}; _instructions[0x6C] = {"JMP", &Cpu::JMP, &Cpu::IND, 5, false}; - _instructions[0x20] = {"JSR", &Cpu::JSR, &Cpu::ABS, 6, false}; - _instructions[0x38] = {"SEC", &Cpu::SEC, &Cpu::IMP, 2, false}; + _instructions[0x20] = {"JSR", &Cpu::JSR, &Cpu::ABSL, 6, false}; + _instructions[0x38] = {"SEC", &Cpu::SEC, &Cpu::IMPL, 2, false}; _instructions[0xB0] = {"BCS", &Cpu::BCS, &Cpu::REL, 2, false}; _instructions[0x90] = {"BCC", &Cpu::BCC, &Cpu::REL, 2, false}; _instructions[0xF0] = {"BEQ", &Cpu::BEQ, &Cpu::REL, 2, false}; _instructions[0x85] = {"STA", &Cpu::STA, &Cpu::ZP0, 3, false}; _instructions[0x24] = {"BIT", &Cpu::BIT, &Cpu::ZP0, 3, false}; - _instructions[0x2C] = {"BIT", &Cpu::BIT, &Cpu::ABS, 4, false}; + _instructions[0x2C] = {"BIT", &Cpu::BIT, &Cpu::ABSL, 4, false}; _instructions[0x70] = {"BVS", &Cpu::BVS, &Cpu::REL, 2, false}; _instructions[0x50] = {"BVC", &Cpu::BVC, &Cpu::REL, 2, false}; - _instructions[0x60] = {"RTS", &Cpu::RTS, &Cpu::IMP, 6, false}; - _instructions[0xF8] = {"SED", &Cpu::SED, &Cpu::IMP, 2, false}; - _instructions[0x08] = {"PHP", &Cpu::PHP, &Cpu::IMP, 3, false}; - _instructions[0x68] = {"PLA", &Cpu::PLA, &Cpu::IMP, 4, false}; + _instructions[0x60] = {"RTS", &Cpu::RTS, &Cpu::IMPL, 6, false}; + _instructions[0xF8] = {"SED", &Cpu::SED, &Cpu::IMPL, 2, false}; + _instructions[0x08] = {"PHP", &Cpu::PHP, &Cpu::IMPL, 3, false}; + _instructions[0x68] = {"PLA", &Cpu::PLA, &Cpu::IMPL, 4, false}; _instructions[0xC1] = {"CMP", &Cpu::CMP, &Cpu::IZX, 6, false}; _instructions[0xC5] = {"CMP", &Cpu::CMP, &Cpu::ZP0, 3, false}; _instructions[0xC9] = {"CMP", &Cpu::CMP, &Cpu::IMM, 2, false}; - _instructions[0xCD] = {"CMP", &Cpu::CMP, &Cpu::ABS, 4, false}; + _instructions[0xCD] = {"CMP", &Cpu::CMP, &Cpu::ABSL, 4, false}; _instructions[0xD1] = {"CMP", &Cpu::CMP, &Cpu::IZY, 5, true}; _instructions[0xD5] = {"CMP", &Cpu::CMP, &Cpu::ZPX, 4, false}; _instructions[0xD9] = {"CMP", &Cpu::CMP, &Cpu::ABY, 4, true}; _instructions[0xDD] = {"CMP", &Cpu::CMP, &Cpu::ABX, 4, true}; _instructions[0x30] = {"BMI", &Cpu::BMI, &Cpu::REL, 2, false}; - _instructions[0x48] = {"PHA", &Cpu::PHA, &Cpu::IMP, 3, false}; - _instructions[0x28] = {"PLP", &Cpu::PLP, &Cpu::IMP, 4, false}; - _instructions[0xB8] = {"CLV", &Cpu::CLV, &Cpu::IMP, 2, false}; + _instructions[0x48] = {"PHA", &Cpu::PHA, &Cpu::IMPL, 3, false}; + _instructions[0x28] = {"PLP", &Cpu::PLP, &Cpu::IMPL, 4, false}; + _instructions[0xB8] = {"CLV", &Cpu::CLV, &Cpu::IMPL, 2, false}; _instructions[0xC0] = {"CPY", &Cpu::CPY, &Cpu::IMM, 2, false}; _instructions[0xC4] = {"CPY", &Cpu::CPY, &Cpu::ZP0, 3, false}; - _instructions[0xCC] = {"CPY", &Cpu::CPY, &Cpu::ABS, 4, false}; + _instructions[0xCC] = {"CPY", &Cpu::CPY, &Cpu::ABSL, 4, false}; _instructions[0xE0] = {"CPX", &Cpu::CPX, &Cpu::IMM, 2, false}; _instructions[0xE4] = {"CPX", &Cpu::CPX, &Cpu::ZP0, 3, false}; - _instructions[0xEC] = {"CPX", &Cpu::CPX, &Cpu::ABS, 4, false}; + _instructions[0xEC] = {"CPX", &Cpu::CPX, &Cpu::ABSL, 4, false}; _instructions[0xE1] = {"SBC", &Cpu::SBC, &Cpu::IZX, 6, false}; _instructions[0xE5] = {"SBC", &Cpu::SBC, &Cpu::ZP0, 3, false}; _instructions[0xE9] = {"SBC", &Cpu::SBC, &Cpu::IMM, 2, false}; - _instructions[0xED] = {"SBC", &Cpu::SBC, &Cpu::ABS, 4, false}; + _instructions[0xED] = {"SBC", &Cpu::SBC, &Cpu::ABSL, 4, false}; _instructions[0xF1] = {"SBC", &Cpu::SBC, &Cpu::IZY, 5, true}; _instructions[0xF5] = {"SBC", &Cpu::SBC, &Cpu::ZPX, 4, false}; _instructions[0xF9] = {"SBC", &Cpu::SBC, &Cpu::ABY, 4, true}; _instructions[0xFD] = {"SBC", &Cpu::SBC, &Cpu::ABX, 4, true}; _instructions[0x84] = {"STY", &Cpu::STY, &Cpu::ZP0, 3, false}; - _instructions[0x8C] = {"STY", &Cpu::STY, &Cpu::ABS, 4, false}; + _instructions[0x8C] = {"STY", &Cpu::STY, &Cpu::ABSL, 4, false}; _instructions[0x94] = {"STY", &Cpu::STY, &Cpu::ZPX, 4, false}; - _instructions[0xC8] = {"INY", &Cpu::INY, &Cpu::IMP, 2, false}; - _instructions[0xE8] = {"INX", &Cpu::INX, &Cpu::IMP, 2, false}; - _instructions[0xCA] = {"DEX", &Cpu::DEX, &Cpu::IMP, 2, false}; - _instructions[0xA8] = {"TAY", &Cpu::TAY, &Cpu::IMP, 2, false}; - _instructions[0xAA] = {"TAX", &Cpu::TAX, &Cpu::IMP, 2, false}; - _instructions[0x98] = {"TYA", &Cpu::TYA, &Cpu::IMP, 2, false}; - _instructions[0x8A] = {"TXA", &Cpu::TXA, &Cpu::IMP, 2, false}; - _instructions[0xBA] = {"TSX", &Cpu::TSX, &Cpu::IMP, 2, false}; - _instructions[0x40] = {"RTI", &Cpu::RTI, &Cpu::IMP, 6, false}; + _instructions[0xC8] = {"INY", &Cpu::INY, &Cpu::IMPL, 2, false}; + _instructions[0xE8] = {"INX", &Cpu::INX, &Cpu::IMPL, 2, false}; + _instructions[0xCA] = {"DEX", &Cpu::DEX, &Cpu::IMPL, 2, false}; + _instructions[0xA8] = {"TAY", &Cpu::TAY, &Cpu::IMPL, 2, false}; + _instructions[0xAA] = {"TAX", &Cpu::TAX, &Cpu::IMPL, 2, false}; + _instructions[0x98] = {"TYA", &Cpu::TYA, &Cpu::IMPL, 2, false}; + _instructions[0x8A] = {"TXA", &Cpu::TXA, &Cpu::IMPL, 2, false}; + _instructions[0xBA] = {"TSX", &Cpu::TSX, &Cpu::IMPL, 2, false}; + _instructions[0x40] = {"RTI", &Cpu::RTI, &Cpu::IMPL, 6, false}; _instructions[0x46] = {"LSR", &Cpu::LSR, &Cpu::ZP0, 5, false}; - _instructions[0x4E] = {"LSR", &Cpu::LSR, &Cpu::ABS, 6, false}; - _instructions[0x4A] = {"LSR", &Cpu::LSR_ACC, &Cpu::IMP, 2, false}; + _instructions[0x4E] = {"LSR", &Cpu::LSR, &Cpu::ABSL, 6, false}; + _instructions[0x4A] = {"LSR", &Cpu::LSR_ACC, &Cpu::IMPL, 2, false}; _instructions[0x56] = {"LSR", &Cpu::LSR, &Cpu::ZPX, 6, false}; _instructions[0x5E] = {"LSR", &Cpu::LSR, &Cpu::ABX, 7, false}; _instructions[0x66] = {"ROR", &Cpu::ROR, &Cpu::ZP0, 5, false}; - _instructions[0x6A] = {"ROR", &Cpu::ROR_ACC, &Cpu::IMP, 2, false}; - _instructions[0x6E] = {"ROR", &Cpu::ROR, &Cpu::ABS, 6, false}; + _instructions[0x6A] = {"ROR", &Cpu::ROR_ACC, &Cpu::IMPL, 2, false}; + _instructions[0x6E] = {"ROR", &Cpu::ROR, &Cpu::ABSL, 6, false}; _instructions[0x76] = {"ROR", &Cpu::ROR, &Cpu::ZPX, 6, false}; _instructions[0x7E] = {"ROR", &Cpu::ROR, &Cpu::ABX, 7, false}; _instructions[0x26] = {"ROL", &Cpu::ROL, &Cpu::ZP0, 5, false}; - _instructions[0x2A] = {"ROL", &Cpu::ROL_ACC, &Cpu::IMP, 2, false}; - _instructions[0x2E] = {"ROL", &Cpu::ROL, &Cpu::ABS, 6, false}; + _instructions[0x2A] = {"ROL", &Cpu::ROL_ACC, &Cpu::IMPL, 2, false}; + _instructions[0x2E] = {"ROL", &Cpu::ROL, &Cpu::ABSL, 6, false}; _instructions[0x36] = {"ROL", &Cpu::ROL, &Cpu::ZPX, 6, false}; _instructions[0x3E] = {"ROL", &Cpu::ROL, &Cpu::ABX, 7, false}; _instructions[0xE6] = {"INC", &Cpu::INC, &Cpu::ZP0, 5, false}; - _instructions[0xEE] = {"INC", &Cpu::INC, &Cpu::ABS, 6, false}; + _instructions[0xEE] = {"INC", &Cpu::INC, &Cpu::ABSL, 6, false}; _instructions[0xF6] = {"INC", &Cpu::INC, &Cpu::ZPX, 6, false}; _instructions[0xFE] = {"INC", &Cpu::INC, &Cpu::ABX, 7, false}; _instructions[0xC6] = {"DEC", &Cpu::DEC, &Cpu::ZP0, 5, false}; - _instructions[0xCE] = {"DEC", &Cpu::DEC, &Cpu::ABS, 6, false}; + _instructions[0xCE] = {"DEC", &Cpu::DEC, &Cpu::ABSL, 6, false}; _instructions[0xD6] = {"DEC", &Cpu::DEC, &Cpu::ZPX, 6, false}; _instructions[0xDE] = {"DEC", &Cpu::DEC, &Cpu::ABX, 7, false}; } @@ -279,14 +279,14 @@ namespace nes { return {PC++, 0}; } - Cpu::InstructionArgs Cpu::ABS() { + Cpu::InstructionArgs Cpu::ABSL() { uint8_t lo = _system->read(PC++); uint8_t hi = _system->read(PC++); uint16_t address = (hi << 8) | lo; return {address, 0}; } - Cpu::InstructionArgs Cpu::IMP() { + Cpu::InstructionArgs Cpu::IMPL() { return {0, 0}; } diff --git a/src/Cpu.h b/src/Cpu.h index ff84c0b..e013372 100644 --- a/src/Cpu.h +++ b/src/Cpu.h @@ -11,7 +11,7 @@ namespace nes { - class Nes; + class System; enum CpuFlags: uint8_t { Carry = (1 << 0), @@ -42,7 +42,7 @@ namespace nes { static constexpr uint16_t STACK_BASE = 0x0100; public: - explicit Cpu(Nes* system); + explicit Cpu(System* system); void reset(); bool tick(); void setFlag(CpuFlags flag, bool value); @@ -56,7 +56,7 @@ namespace nes { private: size_t _ticks; - Nes* _system; + System* _system; std::vector _instructions; private: @@ -78,8 +78,8 @@ namespace nes { private: InstructionArgs IMM(); - InstructionArgs ABS(); - InstructionArgs IMP(); + InstructionArgs ABSL(); + InstructionArgs IMPL(); InstructionArgs REL(); InstructionArgs ZP0(); InstructionArgs IZX(); diff --git a/src/Dma.cpp b/src/Dma.cpp index cb07d40..e96eca5 100644 --- a/src/Dma.cpp +++ b/src/Dma.cpp @@ -4,11 +4,11 @@ #include "Dma.h" #include "Ppu.h" -#include "Nes.h" +#include "System.h" namespace nes { - Dma::Dma(Nes *system, Ppu *ppu): _system{system}, _ppu{ppu} { + Dma::Dma(System *system, Ppu *ppu): _system{system}, _ppu{ppu} { } diff --git a/src/Dma.h b/src/Dma.h index 0becb15..f4b298e 100644 --- a/src/Dma.h +++ b/src/Dma.h @@ -9,18 +9,18 @@ namespace nes { - class Nes; + class System; class Ppu; class Dma { public: - Dma(Nes* system, Ppu* ppu); + Dma(System* system, Ppu* ppu); [[nodiscard]] bool active() const; void tick(uint64_t cycles); void start(uint8_t page); private: - Nes* _system; + System* _system; Ppu* _ppu; private: diff --git a/src/Logger.h b/src/Logger.h index fbd5adb..9159872 100644 --- a/src/Logger.h +++ b/src/Logger.h @@ -8,6 +8,7 @@ #include #include #include +#include namespace nes { diff --git a/src/Nes.cpp b/src/System.cpp similarity index 85% rename from src/Nes.cpp rename to src/System.cpp index 8a286d2..c54bb96 100644 --- a/src/Nes.cpp +++ b/src/System.cpp @@ -2,7 +2,7 @@ // Created by Selim Mustafaev on 11.08.2023. // -#include "Nes.h" +#include "System.h" #include "Cartridge.h" #include "Cpu.h" #include "Ppu.h" @@ -13,7 +13,7 @@ namespace nes { - Nes::Nes(): + System::System(): _cycles{} #ifdef NES_LOGGING ,_logger(500*1024*1024) @@ -25,17 +25,17 @@ namespace nes { _dma = std::make_unique(this, _ppu.get()); } - void Nes::insertCartridge(const fs::path &path, std::optional address) { + void System::insertCartridge(const fs::path &path, std::optional address) { _cartridge = std::make_unique(path); _ppu->connect(_cartridge.get()); reset(address); } - void Nes::connect(std::shared_ptr controller) { + void System::connect(std::shared_ptr controller) { _controller1 = std::move(controller); } - void Nes::reset(std::optional address) { + void System::reset(std::optional address) { _cpu->reset(); _ppu->reset(); if(address) { @@ -43,11 +43,11 @@ namespace nes { } } - void Nes::setNewFrameCallback(std::function onNewFrame) { + void System::setNewFrameCallback(std::function onNewFrame) { _ppu->onNewFrame = std::move(onNewFrame); } - void Nes::tick() { + void System::tick() { bool needInterrupt = _ppu->tick(); #ifdef NES_LOGGING @@ -84,7 +84,7 @@ namespace nes { _cycles++; } - uint8_t Nes::read(uint16_t address) { + uint8_t System::read(uint16_t address) { if(address < 0x2000) { return _ram[address & 0x07FF]; } @@ -105,7 +105,7 @@ namespace nes { return 0; } - void Nes::write(uint16_t address, uint8_t value) { + void System::write(uint16_t address, uint8_t value) { if(address < 0x2000) { _ram[address & 0x07FF] = value; } @@ -129,7 +129,7 @@ namespace nes { // For debug // Calc "hash" - just sum of the bytes of RAM // Can be useful for detecting changes in memory - uint32_t Nes::zpHash() const { + uint32_t System::zpHash() const { uint32_t sum = 0; for(size_t i = 0; i < 2048; ++i) { sum += _ram[i]; diff --git a/src/Nes.h b/src/System.h similarity index 91% rename from src/Nes.h rename to src/System.h index 38759f6..f99a334 100644 --- a/src/Nes.h +++ b/src/System.h @@ -2,8 +2,8 @@ // Created by Selim Mustafaev on 11.08.2023. // -#ifndef NES_NES_H -#define NES_NES_H +#ifndef NES_SYSTEM_H +#define NES_SYSTEM_H #include "Logger.h" #include "Cpu.h" @@ -21,9 +21,9 @@ namespace nes { namespace fs = std::filesystem; - class Nes { + class System { public: - Nes(); + System(); void insertCartridge(const fs::path& path, std::optional address = std::nullopt); void connect(std::shared_ptr controller); void reset(std::optional address = std::nullopt); @@ -50,4 +50,4 @@ namespace nes { } -#endif //NES_NES_H +#endif //NES_SYSTEM_H diff --git a/src/include/NesKitCpp.h b/src/include/NesKitCpp.h new file mode 100644 index 0000000..2defb5b --- /dev/null +++ b/src/include/NesKitCpp.h @@ -0,0 +1,15 @@ +// +// Header.h +// +// +// Created by Selim Mustafaev on 27.09.2023. +// +// This is umbrella header for SPM module +// + +#ifndef NesKitCpp_h +#define NesKitCpp_h + +#include "../System.h" + +#endif /* Header_h */