From b1fa17ffcfe152b98fb04978a503adcfd3464d48 Mon Sep 17 00:00:00 2001 From: Nicholas Orlowsky Date: Wed, 31 Jan 2024 13:09:58 -0600 Subject: [PATCH] mostly complete --- 5-quirks.ch8 | Bin 0 -> 3232 bytes 6-keypad.ch8 | Bin 0 -> 913 bytes README.md | 13 ++++--- screenshots/quirks.png | Bin 0 -> 7996 bytes screenshots/tetris.png | Bin 0 -> 5122 bytes tests/5-quirks.ch8 | Bin 0 -> 3232 bytes tests/6-keypad.ch8 | Bin 0 -> 913 bytes tests/tetris.ch8 | Bin 0 -> 494 bytes yayacemu.cpp | 57 +++++++++++++++++++++++++++- yayacemu.sv | 82 ++++++++++++++++++++++++++++++++++++++--- 10 files changed, 139 insertions(+), 13 deletions(-) create mode 100644 5-quirks.ch8 create mode 100644 6-keypad.ch8 create mode 100644 screenshots/quirks.png create mode 100644 screenshots/tetris.png create mode 100644 tests/5-quirks.ch8 create mode 100644 tests/6-keypad.ch8 create mode 100644 tests/tetris.ch8 diff --git a/5-quirks.ch8 b/5-quirks.ch8 new file mode 100644 index 0000000000000000000000000000000000000000..5206652fb54edd895e0511c8381d3e97f599a9ab GIT binary patch literal 3232 zcmeHHZ)h9m8Gr6xSu&22Q_hy;CXOSd3@d+H&ao5RMVU^Dy*im#OsI+n-gqyS9Ff+J z9GuOAbX@Aj$yiCv@P-*qrvy55`%nf8BOmtXKwaApS}aCCY@vl?WON^fIahAT2hG~^ zoFvZ+-M;MW-XD5@&%Mw4{GLB|cBhwvbw_sP1=R;@vMURB!|Un0udk=&@F}4phed$T zdmC8Kz6@3WhG!7u;o`xHoaxx`XN37vnO%?Gmd}lVeC|qJ?#W2_#D5f$`4vI#Ss2T7 zJh~(68MrLW3h0?zP`_Q5^%q0(tC#EYQPO|h+dxL#=v~ide0t*UPu9}_wQNL80Icc0 zh?pb}MZ{CYN<6tNi* zVXgSA-TTR-*IclMgQ(kCRp``JvGbReP==kk<$S}guKyfW1>-BJA1VX0_4+*SNX zcqNkOMePsgMcD@y-VqH6ee$%|*z53a~~iD|?MQ5AR+4vhmKtdzihO z3wFBmZDg^@t|l`(jnlD;-F8+HIzQ}7a$x{CTynqlrLzt0Lv|ORvD018_2rvh*7UNs zw!BaWtMAtuMr&}%@jHxujiR%vyDQr7?(%VD1-g0?z*$1zZHmwpMcak8NLgSLEMt-P zX!|Mw9?-;!eBI{Zio9Su=O?u`JZGA#BHysJj*5H}&-t`=6i=ht?uz_ncRG(hox7iRaZhoNoud2!@vC#ii^vZ9yrWll+NHMs_QFH~v4zu7PI!C3w zjuKXkDtp2!c1Kw3^!62uA3x3-w?Fr1dn>!+5d0QD{@AlHxiG0`uhfr0@awM+&u?sc zz5>A%tTk?5e`(wOTRik{_rJGw|0=BUb`8!;hEdu7S#Q2w84CW2x6erZy}=^-eCP}P z{F@aY`g}@0_($%W@%5|0_oyP>b*&5Y{InutTrBt(<2G7?q6Yttl}Z&k4&844DrIig z`D82aWBgzE^fJwYsTb6ORVY}ds#;dav@9O73RWm&nfRbvc!oBfpkdKXlWbkL%mSLG zj<%_Dy};2`uuy}CLa16O=y(U?$aGwIsH+8wlarISs;cPX_(R5zy5-c_*j4uq zrn`MC<@U4XTx#&erQG1nf#kDl$y=0ym2Ho2ZQ6OTrS0j zVRkg7&XF;8b;3EwaLA}C%#LT?fN_k5QQDNu+$iu2k3lS-Z>P;mn-4af)v+HyxCgpk zuXntAH|bM+_a%`Q!2bA*^;hd}g`J0@(I`Oo{rf{h@!!ES@BHS@Z2<4SeZtOtw}lT5 z9z56w@TB(OeOz$*%<0h+I4OZKCfLd%fR0a_AI#6szhCIju4Rs!;Wo5$3T}IuvxVMz*?zSdZHd^)lGz5x9u7t_7w1}Q3S?Op)H^ejTK8{^;*3~{kKvR zlS)g|sg>$&g8HC-D3r9fYHkW_?}hwMk^f;MKjonwuuZ5c2)kAiq;{92|J@ zy~Ge+$tzJE^*>J_3qe;_ H2)h0WvV#A3 literal 0 HcmV?d00001 diff --git a/6-keypad.ch8 b/6-keypad.ch8 new file mode 100644 index 0000000000000000000000000000000000000000..88250bfb537215aa54279829c7942c34d66e7674 GIT binary patch literal 913 zcmZ9IPfQa*6vk(#jkGJmFbmQsX*Rq5>7fTi4vpEv0!2}XA=oC3UIy4E1nq{9VmPRo zh#{C@!eR7a8nVURtMS0WgCTqKO5%;gI0tSfO{-u$5b8`DFU(};_s#p>yqSGkCjq>Q zqf3g7Kn+KWV8>|WcV0H~*cemxu>k=%PPS*GI1hgJ9d!%?ob}Cp?5Ib5jx#T!2|2lj(S+d)B(#%SrN|ay8X0?X->yamYaA;*8h`iPX`_) z8$}1vk)8LAJOC#}6OI5-qsWA#lDY}UBnM5Hm9$MbE;((&+mghDcO;igI3Y<*cvo`E zg!d#p6HZEgGU1eDXhKl)uh)~`51&UtO*EoeFWQQhv!Pb7Bidd`b)o;wsFY%^>i=l5 z+yB{OuYYV*7Ka{R4qhMZF5U{>9PAQ*_UjzPXm(qBI9nyP58L7|cyO~>^l>v^!fqrO z6KAoj29quJ1P@wF1doi03(R*fl>5j9+NO_Bll9`9Qmf8^EnWLUIqeGO>!Lfs+Wtl9 zQoWv+FD{*PF9Z>zLL&9Py4vWt0kmJds{IArze>0~_qeX}P;4j{F`-372re^2sVU{5 zCuB&44k@7?5theA4WjF!s^?LWBhE?LvP6*D9w*WyvbJs8!Xn}m6q#ZbQWT)P_0INc zN6$xcQ4}de`yzV_Q^PstEDSpt3&fbUk+N9Ec||~{(CHX^wg3>bH==2lwN`W1CRkXq z%4L=&n@sM~g#ybuP6iNXl})4zt5YP~(o0ssN|&w7+4hJ#IvHZapqC}s0LuWKU12F^ ufi#PA^!Xo<=TQ{^ literal 0 HcmV?d00001 diff --git a/README.md b/README.md index 7ca6d05..5fe96cb 100644 --- a/README.md +++ b/README.md @@ -33,13 +33,14 @@ yayacemu [PATH_TO_YOUR_ROM] - [x] Graphics - [x] Corax+ Required Instructions - [x] Proper Flag Handling -- [ ] Working Input -- [ ] More Instructions -- [ ] Tetris Working Running -- [ ] Pass Quirks Test +- [x] Working Input +- [x] More Instructions +- [x] Tetris Working Running +- [x] Pass Quirks Test - [ ] Add beeper (instead of sound, screen becomes red) +- [ ] Implement a real random module - [ ] Code cleanup -- [ ] All Instructions +- [x] All Instructions ### Screenshots @@ -47,3 +48,5 @@ yayacemu [PATH_TO_YOUR_ROM] ![IBM Logo Demo](https://github.com/nickorlow/yayacemu/blob/main/screenshots/ibm-logo.png?raw=true) ![CORAX+ Test Demo](https://github.com/nickorlow/yayacemu/blob/main/screenshots/corax.png?raw=true) ![Flag Test Demo](https://github.com/nickorlow/yayacemu/blob/main/screenshots/flags.png?raw=true) +![Quirk Test Demo](https://github.com/nickorlow/yayacemu/blob/main/screenshots/quirks.png?raw=true) +![Tetris Demo](https://github.com/nickorlow/yayacemu/blob/main/screenshots/tetris.png?raw=true) diff --git a/screenshots/quirks.png b/screenshots/quirks.png new file mode 100644 index 0000000000000000000000000000000000000000..6a24f15da5b4c4b792c861eda33cc62cf1b319d7 GIT binary patch literal 7996 zcmZu$XFwC_+8t#T3!tnbAWdPm~WAPQvZy@q0?3QCu*(go=?K#&@w zg^rK}M1;^o4-m@t4(#1~e|&!?LzwoQ=bZDLcM|xQx)STLv&SF^V!i(-LKA`x20_q) z$43r=Z+50^v%m+F)7|^pM~)mJjcR;{ApVv6h&$Tu33C)|g4+1bmqnUBw*8#n`84v6 z^}vsU9HPuhfqr*i+)%!sF!?^*;OgDfEJMfZM=N-bUSxN{sp>viX|+ z44t5Fp3Yswvo@yIDCNjD!foay3=Hj^J*?n+Iy z`{|{f?K8e+>?@s@0X>bg?9CZ>;V_*c-bbSjcsL#y&C~tt`9dkA7+GXfU}Mm8i=BI8 z<$d*6?C<<3!2tmbS@r@O*&0h0$fRXi<1SI?>059}*DbYqhR9~W?LyA2JVnB~?8fM$rXaLzznDhKIKa@GXUXa3$K5!aJ)+n=4=_yVq&_fg- zc32eAc=w33_D33(<6;+PbC9B0mDc7a=>iuhVD zr8*aR=gL#D_Rj(56|rg_-tK<}v)%h?$OH*S-w^aOFUhhf^+#$#J`iNqvB@ug-J z3yAH^s_XIa@ztrVowvCMUE#t7AdpBiRRv<=a_y)>sI%`1KQ%cdp8T+8$0g;S`q#OQ zGKn|X_f90Td7gl$)F?^KfPX&j`_BuNH=hNUKMHe77t|~?4ICFrAF#7GieY9pbiMy# zCb#0rQfft|8?AM2(V*0tw4#RYSv=v5ce9=fM-5o(6?l4#g)OU*^ zz=L0R^jRjI9oI!@M=mzSi~L5@D{|ZA9J?$Rv$&EV?i|E(Gn27gzd5T=?$aBrVWxe- zu|pey+h)v%rz!td%pm%$jwH)@c<$m~(5~-D$y1UI*tt^(^?r1Zs|CA&HFUm*Wma?y zQH~@=rN8<1?cH^S9nY=xqdmp=q5KL!3~9v_8&bN(=63psU0nJ&ug8kY_Hfej5}s+M zlxEns8pcK+9@r!#NAoFfdyZcgONfZuY+8sh=KINer>FR$O2$qGok{P6!F*xiaZU{~ z-l=bR+c;;-^j_a54kw8*X#-h%rvp!^&g=z^r5DABYjH&U&W~U?V@eFYva#|eI?rRZuMBTkmSw(rhVPUoMx{UTZKvQA z!MKL8mVu<@PIi}g_Zz$Tt_&lOqqK#0iM|pzdWS^2{z#W9VyCBa**kH*YP&RdyhVa* zZR;hsn9@KNc2zpKTpmC5+$|cF`>ovMMd)XJ$?CBV1IO$ST83}<>3Y#RGoMKQC*t3h zoMm@R$K{T=8jydy5_-eO5TkO~cL)|vcb9CpaR-Zt3@n7|QUp9w>zNWsrr0mJiq_s|JlN+w4 zJs?a&PSSlgOAF(5d;3|3O@?Y*e7NJ6Tc5MEcCg;n`W)8`&wMWjj2j<)DVcFSU)XBm zb)(zGTOu4h5sM_&nHmGUb%+g#R64h5SwFFxjUJ@-(5lP&QjZpu*=dy8U>lXJ6tS6Z5Dvz0}3Kg2QlT~TQ;u{6)L`jSVF)8tq8b9s{VP4z{-=Wu1GSDyO zvxLRWdyM`F>|pQr-JlGK^B_$(3N^NUoLYW*5JI;-el%o72`S`hmfU?RL3|q>z0%F^y&bVB!*}xY_k@y1QmMHDQ~8GE2dM%t&k1W<*3S> z+3y&E8B$($z~6DM6DzUd7lWCl=G9j7vbE^bSGD}r;^edu%8k)gGr6SUIDF^E9Ia+I ztU#B1OU-D&`?m3*N=xdj^jn9Q@|E^m};Ge<-DDiaU%B?ykHUT?h} z?pbVDQ3#+QF==YOF_$}c(QLP!b*4Y_!D_bM86=Y1!eVN`kYWiq(-_QIi8EJW=f0WG zXwew9+$5?K-Xu4BzHN^$ld$aUqDdC*Pz8KbWt1e;S_^Y}d!JykO{U_KoLZd{*Vp@ZWK{vM=VMt{LqRMlTqY z?dTS|^HIx?L5MP|fhy$kjmzo@zlM$0Un-@!W2<>AW%=g6?3Di9S}3NAoW!{< zPlx@gZcg*+s-^Uu?atcz-AvsIZEMwjE@R+Oi;HT*38m*Qjz3+-tj%6T89q2qjgHSj zwj~ryb|ukuvNZ1?;wX+zJ?X2|c7r$rc8|PKkE=Nt8IL9MM`UnYEZs5@hvF2{O>Ju| zV71MSARs5eN6(7!Dl*k|ZkkReZB`=%Fu}e+6;`C&3bEboJablMLiCmmA<3HAL34!5 zk9gCITWs9dim~=H-WFF1JXo;%N-lcNDz|NulzAmZJ1cy|dJFVgrLn2l2AjRSs~0c& zhZWP)78a@qsT6t8yFr6XL1m!i6-}*br8`(7S*FN-G>C@Z{#rVBBF4uP#W-`{AlhcQ zs>H=hGNaYqI71e{yF)ehr9>^RT*x8}`|d{MzH$DRzr!F0xsR>71)aWL=rz95U2xIu zB5kgJHP%kjhCR$0nPA6CEJGd}kLBOmwqG_s!RCPwshU>Az=|@4KTi$yqZl?yNc!-@A_Psd~1w%^lF*!j>l3(?UN=A_qA_b z3McrKy)iq5U<60=w!brgL4iZqScY2vEt_5fnZ`ZH$}^myIo?_+C)GI<1pP6}sbIdb z7s_N`km`7O9Tj~}Kv_c%yR^s+K{`@S#12h9!CQsc`9TK|Dj~tJ^MV-ELfkU} z5R{MkVQVlFPY*)x*%T3~J;lN*h+u&t^2{cP%A$w{8a=qVJ!6<7%x8Pk!|(zG32Hok z{4u~1L6lD=!Tnuj;ANCY!%eY z{SFKMD?Lvx8t4Om#wIKXn^1g1i-&zD3yTgZwpTs+a7wkp692qexxLEHkY}SYo8=v~ zk(=C+mjdeZdYhpQBJTTh>`4cpzt~0r_~R%4-(9KELGu|<==4nlqJeG3Su8C2{$<|f z=db3QKUjs-xs5~3$B~bN&I{g7exo4>LA@pce>!VNn(3hjeu1EJas|dHgANeC#=}e~)zDxU7u5C=G~2aX1V%QMPRWTcU@>DEwr_ngpC)(!TYI_OniO?BOVu$T7+cP~OwoeY&l{6j8s|VI$KC^Y`SQKDZ9U zC5DE*A!v#b)hFFu@aUsPxx7fn73k@eJTX`JHbo1h@L<*{~`s$TOb+at?J)u$uNHLmn>56>EX% z2(gLX9`EcJ?jXB^8xPS97dR z_Lp(bz7F(JFMMsW&Ln!ozACBDOTgnIukkB;YfM5-=5)x}vpmNANW_2(+698DFort2 z>4GDl8A-*z!7W2oe`Q71=kBoV{agKspL1Csq!bEj=WL?ZD= zG#5BwY|a*RrMVP_sk__9&8HI>m`xMhaetnq>#a-sn9XC?aAyJCBS5X!jdlHB-KdO+ z^GG>(oZ|Hi_4&cNd(`K)Y}8w!%e3CMnkK7AJ7 z20VtIFMf$1OBDFFXB@-xL!^y6oa{ZfreLhu9AVGooqu=;7IuivKh}*UMk8TTam=^a zG?fysI&%|xdXS1#_d+M(`E{@@b3Y zoOHfYYn-T`eGTYIZ)dvi2u}7CmPMl<*&w0z11LMGGR?F5d0GFwOnJ{qb~P$&G46Rk zMiak^F4q4#23}&k3W$e@Vr$Sg*I>P*`%CGLcQH$eKbcf5|sm>;>>B~!uMRUP&@4a&y_);WT zVdu^WvoZmMZE3N^!1^;^Wd5rff>fRow&Y8^qt0LJOYaY9@xa)GSf$^Gh9G)(X2_s~u zN%JfwU*r)(P%t{v0}q@#-(FbqrZ`FZrnr^Px_#dr2UGYNrE_3smQKBR0Bmu-n;QTd-BbBCOx5;D4{EHvM%S+-o@4@^|N{w^9_- zc~DB!x}?TzZ(a3=-wd+r0#LCpnjfYfL?1fWd)gz$fdER5tnUWa898Ro`eYLv?^0e3 zW+2ahjHYLQ@O5ep*SErksgR*agXOY9Nre$jfc9o_M;r3`Fo-_2IQZc4Ur&Xt&m;m^Ajw@KH zTGOQSNrX9J4~$p7wCRFs-8U}bo}c87oq+!MMNkhoQpeDAi>gIT!SV&xm^%Z5ehPxVKOTpPFI|&kQu~XexRd&;3y$i@-_hH3 z?b!n{GuMQW`Y&Ynlsdns3bL$j7u*~^T)?+dHP{{a`~vpSPb+66?VG8j)w_Sv7gYpy z^#!zc#0M4shN(+DurLCBmmActgGu@Gx(xHF#(D=&*>}sU*HrYSG>Z}yFLy7IUtP#U zAIi&pC_Zu({UB8w96CSN1j0vVU3odCrNMXkbj(w@l zR;j)c#YnNQaEBn5{|afm+=-}sqJarI$^Cjs4a+v$RcQYDydW;O2+kYClBtoh`Hlwu z`UqASZCE|~_D&s`S1w@%FQ!A_>`1-FKOD<@NjJk1=H*d{en3F2> zA6qv7W35=&4+ehd6JLp}vxQ-ap^hQ~F%Srd;cmN_iMqz(Y27``wa2{wXrjG*WdGi= zaC8Y~1M_RT6N%`#wU^8OA;G`!KCA%Va1nlBw`|<$n88iUnSB5<7lzN>6 zh;0U@$|5`k?r3Vj*5`-W3x)opTV{IEWvfS&(Bm9}15wA^IZhr!8=(w|dRM#8?#JML zE*J^geFsyyac?~mdVWtWqJD2-l{MzW{TiPX{3x~o69dfr*LH9akhFTp&mh(!79Zgz z(c@Ij2;jxfJ#yoiZW*GQLr{5m6z#P5$Oo8~`x9#~|JFCb7Cp9>6bNV7dZUUt7jf{i z|I!}7Y-J5#U)pbvMTmc-kbXlj+AKDG$|VFO;edTbiNM{hET z=e4~ssvRXTeVmXj&)ce_^|1J`6CA_+z4x{uAS_%Vuo7_{@J#u%pFd3O;o9~q1aksT zBGZrH@BSGBU(cEcckUVUR5Ghgmug{~d_*(=MF(WZskn|SlE4r^=bxCurE8#^|Ken`N&j3aRzO%Vy(~wXg)iy!uh&aR!+{RjST7s#hGX|w;E zV)i-}^lyZ*Gi4yb()uz7=-9u$zJH94tfkvzce!Q7Cv}?MsRE&1%S;RK3yk0sW3I5s zm39xl0{vB?vfWLUBcJr`iwk#Wx9hZQW^{y5-G8c3N<8|i90H5*($;|w>^d(O*?R3R zmIb*?50;|Sg4Jn*<)%LZVidl)DkHr5cI0vr&0XMz_-&x5eoC zf||vi{w68>c6ws{$x9={pZ$H4Zs1kyeDdijd~s+uWUSy+*4O(p!+esCLw*-HshZEM zgZloK{2r@hU}U`bu?LGsuTN(R#1Xx(t#%n0uMdgbtG<(5MVZ`YvuXM*79(IJKRR`O z*Fq;_3u(dZyXibJsi!|OvBE+<^(q6jYr9~~!9mcGn-`)0-a+)v@JKTP37RTuks(VOT^HRT0eE4P^|OZb;l zu6}In^;mz!iIdz=T8y}_g`>!iDrxO3k%R53cE6(CBrE5Gx|_ak-xt7t!>%hau7^!3 zx8qjlJWz)1j!5;it$fR!@)(S*l>1s148!Cin!c6o+W2FN*=NVA>u1B)YEq7| zievGIGx0ZFDEU3xwv*eVS4FQ4_uDm`a-+B-Uq|7_THVn6@s9KaSL5NuFR$gJ1JDw= z11gF#eR*8o&J-28OLApTZ_vQslp+*Wm-UnJnUqAS{O$PNYH`m7X3}^|rP7J1vu-+R z-N?C9%szt)qrEYggm>qhL#=-QGNmN$zT?|7(_uxjT@o=b#q?$B&4_Ti#@^GoH0*0W z{Uy+tuLK#?KY43ua47i%f8pO4{m_FV39b)HqA8V^d-Dtp)#oWIwZ&IyyUye@i&52h z?*WEgb?IFPin?sE%iMFxVRX@DY=wcZddnse;_MzlhdhX~omsX{c9ld4jgQo9)CY=q zX)c!(nBAlF(g|#0G4vq@qUb=j#!lKK*+7a^DOG75lJI~YG^Yf9Gh1ig#uC3x*W^dH z8Qlo6FdXpK9JwTl3wV%&DE3$~jWfGcBfB2^ssFNx8MrtRf88dY_&nZQ{;_&<2I!0+SNW zo$Yv(D%PQwED*}EG(U3aWsQExw2SXFcm2)o?r!mRz4xE1ca{PYNfO-Sk~&-~-%A+zLW8cDP~qn z_&1I}F31`uh2tdo!&j{wekspi*rNGpSjCx>N-xD-FAY#t%=;kc6@%*<;8u!;Nqw(@xe@CI*8L#=b{2 zma!zuBw-k45@wiT=KDEwzu)`%{r)k=`JDIiJkR@ipW|<9%d=wJ<+no+BzFGX>5CAw zDGq`Jt_p7gfBBkAWrGjFAk*`ggoTAiCak_e&@STn(JE)?_bly-O{65A@*OnWG**k-CUJqe)GYO=HUL!!9$w4 zgdLAg?^U694o7q=QI0-Q?bO}2^x;Ydh0&=*T4PqSYAS>3S%oVE^FYevt~A`i`*uhv zl+zFjy(%Gr`PCWU9A7&4l~$|g)fXQw0!8)}XgKMUs`L2P_yB7-^+VRp*4C`| zR@#BspJcaW%*vGg{Td~7j#t_d`t0K3X%R@{`8&1yA@}RoI`rR&Z-t2YO`b^)%#c!M zkMwpzRJyD1$qQSfe_U9Tg>Fmcxgkg26s_{gt(uyOlJKSXyGhq9Ej}D#g z;&S`81Ia}wY<idgnfg8} z#hyx)ZO?ZbZ_F1BCFy$C`}9}3FvjA2LcbVi*OG|dm|1i0&l_C8XV&ex2^pvLvhz?4N3$k&?3377^EwO5s?&y%d3cd!tV{p4g*QzdDrVVO8E^(28JBD~z6nl7 ztjtwk)ALEg;ql4I_}8!Tcp`e*CJNKq;IxNL21r$7ld)No#{XaF7L#E~j}Dh~M0l_I=;znPcaYS!k!6{*(jg3$icbr5S4W}HlO;T*xJZ3$`NXf@0x?CMrT&*tyOpz7{9 zyT&&;!m}`7KXz-$g0;#_c4U+<>F6hxpsS-+#j`)4t z-JXu)lA8P4|8g~NS|81MDJZ^5GUCv+DFU7uM&Ve7xY1l{OvspT z&%w8fnEoAaE1qoZ6*CUNikx+-yUqKIHCUf%Fqllu3|*U^PM=>~v#rGA=X#VFl_xw? zbtgZ=$Hs{x#ii^)e^NLt;kEeHp9sxmuh7LRXy<)1(Kdra**GuD6WqeOhRToUjX8^p z9o)G(meI|M@1TruZneE-+R+O9oCt}>dT?Cv#I?o?P8sC`_gk1szi5esA{x7|S7+YH z-I{`_o2h3vZeWw^)<`(7tO&p67>OiaL5014#rLcT3}>`VD~h|8l8&ohd0s=Wn*0l7 zTr#!7@X*-NlrEwNv$h!OY6+5ek~M5!Ow%pdW2_9iC!a zWEuD(v`QNVu;YsqiCD>YY}7Pf-Tx~fY{q-D@#5+cd#6BhlMn+<4^yrE+1#qnSZ}#& zzt&|xh^CEoe69F_(8(YhwQR5q!-q1XL{*aN){>Kx=hl}9X@Hi{@i702Fe1o+e=wjK(TX%?}3+ zx-dr0Dg^b+7!7&XY56Ico|vP?w2xsr2VE$fqRR0Xto@T6#$|1|h~VH$OPHmVAMWHrq4O zj{CMJ$@z1qc9o?W`L;WFI)}7P>5xJ%dzQUrDj6-;1`$py*{1;W_hp^rNGOF5=jxOj z3&=#;+u9aepwR;Z++suG*E#hD?Z7Tm31{jE7_3C)n$FBY6dF)B>iZ$&ZPx9kyPuoP zNKua0?|HZ-EhH}w*g3AP$oU&AeM&?dRbJ-|WErM>^{qTfkv}@089FYalC&p~)MFU( zWwp3r)bDbr@1qm~?FL;fUN&*+IZcOAU>Ko^8WZz$IWd z>UbAEN+_;BaB&GNpWw+`IG(OaF78g$s@0~P|N61_sYii^V~{!}ad~}7 zD{8^pWp<#zQ}}w~Asy~7HtiGV7FN-NQjb<-PwrAsumz(XI))lyvS!dpP6ocwqR%Fx z(nXxmh1uvq4}`QECWv%jU6aL)P)d>uqP@nh=X<5`YG;$j;xV+&w|J!VlVjnD`6T#6~R&>X$DT@d52?gGhYH_v_Q47DK3Tqt5%9( ztND`6ktwSsJ1}257V~S#Ud5kf%RjStQ>~{k5tCsbi%UM$FzTZyb=diOT2tbZiC^6m zVM0iBqw=E_jhaU?=HbedF;93Rv)j_w25g`l#SJ6Ub;| zYc}HeAj;b2^^w6*=(4M8Z!GTd69MH??O0~OZig3Z3Q?mk@=rn3GhGcywMEi_%Fxfi z`)0`0m)oGuXSTKjC4Pr+9qL~KcF`X&KLDf``P{HqBk z=;0OJxA^VoA@GaCP~25PlW>osA$dsKI?h^ld<)dshTEo~@cyq&(XFq1UqZ@4rC##t z4T2`Okw#mi_dK;AQ)|EztSkAbVfgYng{@F+^WAA+kQ7quaG_)%EnTqpGKo~)_cEp2GO>hIuOmtBF! z%r@v8;VS+tmPoLP7l6i`M05T|s>?w;)j#fSzd3pg+Hd#%ipQKR6m3n)FX%@=P)?G? z6TPjF@>A4~Kksge{?T;?9M`r!ZgEq73FIqfE~_elj#K48x-AFgpm&m|gwNa&FuCn< z*7n6_(6z%idFY+>AgX9m9(tUpvRTXnI!F4c`QMs*Jj5V}1PgL1eDwT3CFkM)K*>Tq zV{!mAhr_iZ{Ft}EwTxtMaGM?IFvlkiuH$hcX!nP5R|oVk=CYKTFns8;PnxMdxI_*F zk=0hN2%3n)2$>eru24XK_Hnp;@P2Tvs668U^y6i}w-}^bvalI)SK&uV)q^1A%@yE= zSbmUeSi$NXPs}5KtCG z#9oV)f%fx>_-wk0TH0p%G`P zsZaDo`L8+_1-Z{ep}#9+`k#Vi2)G21uKheH-09T#m z-1^S}g>_w)Y9j1{9;Suy;dU$6-3RUW%$EfDBOZ7c0c`#(J_hjMw`^?=q|}P@T6O|) zO1;wlr<)`s0P~G!D}3;{goNvH3h)h%Z~t363lXdvihFDAWXwL=d&H5ss_Zkv+Pe{P++^P7z0SxRk%qTNHxR# z|ISL&el^gzSJg4-he-$MCg-T&cJK;$N|*>p(}jg#>M(@jPehskoDNo;$ssu-1d;2z zGIK1l&!G+|^d%s~q2v;r4M;r)F5H3)k6?x~tl3;sNLd6%g+C(Jab}0MZPq|wA zjWz)*&;!XtLSPJT!Y%MM^zZR&cVxg!9|E%l#_n~dXtprB{2Tc*AI+8;5V%xr`xJ~$ zoTO{N-PY*VE+XM#2L#3TQDJ3i!Ug>64<2(+G|z2TkxD9u5d*3O%%9WTiuQmW3IOt9 z5#mZ-9ss&cd?gImkOoBTt|D!Q1TY+iUe=KRb(fo4rJx^;%c}p4pRgUA7KCH)(;eQn z9ZYWGD_HE+U^;DW^IM>3y5?~U@~w)CeD@hX`d~{fq+ESbMGm@sZKo9E-ZTePvxTo{ zP#S2QFDv-fo{vedo(dTCyoaKI2-G0}RXAcZ;JNPz-z8#_L?O8npnO1i^Gh&DT6VU% z8Gws6SvRL4es&U=uMe<#-2YJ{2Zr0VV4x390lXKmyWjpFq7i9ATcFuCJf4rGtZ7fE z7}N<{nnQw0tnxlVlUs;bNyiWi7;u~yTwb-TDcm%0xmZ~g@PF4c;D_{l3Xnzu;tWic zuKvFk0ejUJayFpvU(3#ei+MG06gWyL{twtFHKon2!~9sn>`NYd1g?0HFI(?|`Vwtz zhqPgLIh6!H_S@sZz2Zq#U|OG|oV?ZGX;s_K_u5TB^Y`B2@vt+%1u1sDx|#obOMKr- zaguS+U)Te2JyQ38KK^ba5>EX*YY5yf?$rRS-LwH%U4REgDZoQI4q+k%n!AoXq6ePk z8tLA=M(7Eqc zus5Em#M%`+(-Wm?E}IKvB4Nu)g+c#Efv1EKb6~T!@-2o6BP0v^ctX?Z^U#NAzVFJJ z?gDE?L*=;uq(>(F&Pjp*r+cN5EZ}j{B6VQZ3V_8ARwynXxXU>pVK-;k)mGp&#xIy} z9aXpH$IOs_My`+dKY~mualn_}f#o0DBPv@JhK!ZGzc6tNi* zVXgSA-TTR-*IclMgQ(kCRp``JvGbReP==kk<$S}guKyfW1>-BJA1VX0_4+*SNX zcqNkOMePsgMcD@y-VqH6ee$%|*z53a~~iD|?MQ5AR+4vhmKtdzihO z3wFBmZDg^@t|l`(jnlD;-F8+HIzQ}7a$x{CTynqlrLzt0Lv|ORvD018_2rvh*7UNs zw!BaWtMAtuMr&}%@jHxujiR%vyDQr7?(%VD1-g0?z*$1zZHmwpMcak8NLgSLEMt-P zX!|Mw9?-;!eBI{Zio9Su=O?u`JZGA#BHysJj*5H}&-t`=6i=ht?uz_ncRG(hox7iRaZhoNoud2!@vC#ii^vZ9yrWll+NHMs_QFH~v4zu7PI!C3w zjuKXkDtp2!c1Kw3^!62uA3x3-w?Fr1dn>!+5d0QD{@AlHxiG0`uhfr0@awM+&u?sc zz5>A%tTk?5e`(wOTRik{_rJGw|0=BUb`8!;hEdu7S#Q2w84CW2x6erZy}=^-eCP}P z{F@aY`g}@0_($%W@%5|0_oyP>b*&5Y{InutTrBt(<2G7?q6Yttl}Z&k4&844DrIig z`D82aWBgzE^fJwYsTb6ORVY}ds#;dav@9O73RWm&nfRbvc!oBfpkdKXlWbkL%mSLG zj<%_Dy};2`uuy}CLa16O=y(U?$aGwIsH+8wlarISs;cPX_(R5zy5-c_*j4uq zrn`MC<@U4XTx#&erQG1nf#kDl$y=0ym2Ho2ZQ6OTrS0j zVRkg7&XF;8b;3EwaLA}C%#LT?fN_k5QQDNu+$iu2k3lS-Z>P;mn-4af)v+HyxCgpk zuXntAH|bM+_a%`Q!2bA*^;hd}g`J0@(I`Oo{rf{h@!!ES@BHS@Z2<4SeZtOtw}lT5 z9z56w@TB(OeOz$*%<0h+I4OZKCfLd%fR0a_AI#6szhCIju4Rs!;Wo5$3T}IuvxVMz*?zSdZHd^)lGz5x9u7t_7w1}Q3S?Op)H^ejTK8{^;*3~{kKvR zlS)g|sg>$&g8HC-D3r9fYHkW_?}hwMk^f;MKjonwuuZ5c2)kAiq;{92|J@ zy~Ge+$tzJE^*>J_3qe;_ H2)h0WvV#A3 literal 0 HcmV?d00001 diff --git a/tests/6-keypad.ch8 b/tests/6-keypad.ch8 new file mode 100644 index 0000000000000000000000000000000000000000..88250bfb537215aa54279829c7942c34d66e7674 GIT binary patch literal 913 zcmZ9IPfQa*6vk(#jkGJmFbmQsX*Rq5>7fTi4vpEv0!2}XA=oC3UIy4E1nq{9VmPRo zh#{C@!eR7a8nVURtMS0WgCTqKO5%;gI0tSfO{-u$5b8`DFU(};_s#p>yqSGkCjq>Q zqf3g7Kn+KWV8>|WcV0H~*cemxu>k=%PPS*GI1hgJ9d!%?ob}Cp?5Ib5jx#T!2|2lj(S+d)B(#%SrN|ay8X0?X->yamYaA;*8h`iPX`_) z8$}1vk)8LAJOC#}6OI5-qsWA#lDY}UBnM5Hm9$MbE;((&+mghDcO;igI3Y<*cvo`E zg!d#p6HZEgGU1eDXhKl)uh)~`51&UtO*EoeFWQQhv!Pb7Bidd`b)o;wsFY%^>i=l5 z+yB{OuYYV*7Ka{R4qhMZF5U{>9PAQ*_UjzPXm(qBI9nyP58L7|cyO~>^l>v^!fqrO z6KAoj29quJ1P@wF1doi03(R*fl>5j9+NO_Bll9`9Qmf8^EnWLUIqeGO>!Lfs+Wtl9 zQoWv+FD{*PF9Z>zLL&9Py4vWt0kmJds{IArze>0~_qeX}P;4j{F`-372re^2sVU{5 zCuB&44k@7?5theA4WjF!s^?LWBhE?LvP6*D9w*WyvbJs8!Xn}m6q#ZbQWT)P_0INc zN6$xcQ4}de`yzV_Q^PstEDSpt3&fbUk+N9Ec||~{(CHX^wg3>bH==2lwN`W1CRkXq z%4L=&n@sM~g#ybuP6iNXl})4zt5YP~(o0ssN|&w7+4hJ#IvHZapqC}s0LuWKU12F^ ufi#PA^!Xo<=TQ{^ literal 0 HcmV?d00001 diff --git a/tests/tetris.ch8 b/tests/tetris.ch8 new file mode 100644 index 0000000000000000000000000000000000000000..9f5e0874dbd03b5e99d32a1d81fe3cb343904cb4 GIT binary patch literal 494 zcmYk2yGsK>5XNWCX+%VlyR+~?lv`40X#skLaSFO}dqV`E0DV;L4@g-?2y(W#Fx1@3Mc&ZNDkgLrFV^Cm-+M2rg zjM!iiTd~UQN-JPj=OW-q-SKIcNeUgIT_rCjxXUNY#8M`~7%h>@zU5Ei75S|TQ{~eY zGs<{VJTwsmk7WRuU;r5gjH4KbX3PZ3XD-eHy%{*pF6KkV))=4 z`JzkR?q2g_p!I^6O7DgGA{(S6IyO{AmyQH@i$ojd4RavFCM58G9nu!nCcxtj#eU@= zw4d4X3(SKF+M#^Vj^%BF6v*8n(9SpgEx(^=+fcommandArgs(argc, argv); Vyayacemu* top = new Vyayacemu{contextp}; //while (!contextp->gotFinish()) { - for (int i = 0; i < 2000; i++) { + for (int i = 0; ; i++) { top->clk_in ^= 1; top->eval(); usleep(1000000/EMULATION_HZ); diff --git a/yayacemu.sv b/yayacemu.sv index 57ad06c..9cbbae7 100644 --- a/yayacemu.sv +++ b/yayacemu.sv @@ -10,17 +10,27 @@ module yayacemu ( wire [15:0] stack [0:15]; logic [7:0] delay_timer; logic [7:0] sound_timer; + bit keyboard [15:0]; int cycle_counter; + bit halt; + int watch_key; logic [15:0] index_reg; logic rom_ready; logic [15:0] program_counter; + keyboard kb(clk_in, keyboard); rom_loader rl (memory, rom_ready); - chip8_cpu cpu (memory, clk_in, vram, stack, index_reg, stack_pointer, registers, delay_timer, sound_timer, cycle_counter, program_counter); + chip8_cpu cpu (memory, clk_in, keyboard, vram, stack, index_reg, stack_pointer, registers, delay_timer, sound_timer, cycle_counter, program_counter, halt, watch_key); chip8_gpu gpu (vram); + int i; initial begin + watch_key = 255; + halt = 0; + for(i = 0; i < 15; i++) begin + keyboard[i] = 0; + end sound_timer = 0; delay_timer = 0; cycle_counter = 0; @@ -31,9 +41,29 @@ module yayacemu ( endmodule +module keyboard ( + input wire clk_in, + output bit keyboard [15:0] + ); + int i; + import "DPI-C" function bit [7:0] get_key(); + bit[7:0] keyval; + always_ff @(posedge clk_in) begin + keyval = get_key(); + if (keyval != 8'b11111111) begin + keyboard[keyval[3:0]] = keyval[7]; + end + $display("%b", keyval); + for (i = 0; i < 16; i++) begin + $display("%0d %b", i, keyboard[i]); + end + end +endmodule + module chip8_cpu( output bit [7:0] memory [0:4095], input wire clk_in, + input wire keyboard [15:0], output wire [31:0] vram [0:2047], output wire [15:0] stack [0:15], output wire [15:0] index_reg, @@ -42,7 +72,9 @@ module chip8_cpu( output logic [7:0] delay_timer, output logic [7:0] sound_timer, output int cycle_counter, - output wire [15:0] program_counter + output wire [15:0] program_counter, + output bit halt, + output int watch_key ); logic [15:0] opcode; @@ -70,7 +102,7 @@ module chip8_cpu( $display("HW : PC %0d 0x%h", program_counter, program_counter); // 480Hz / 8 = 60 Hz - if (cycle_counter % 8 == 0) begin + if (cycle_counter % 20 == 0) begin if (delay_timer > 0) delay_timer--; if (sound_timer > 0) @@ -137,14 +169,17 @@ module chip8_cpu( 'h8??1: begin $display("HW : INSTR OR Vx, Vy"); registers[(opcode & 'h0F00) >> 8] |= registers[(opcode & 'h00F0) >> 4]; + registers[15] = 0; end 'h8??2: begin $display("HW : INSTR AND Vx, Vy"); registers[(opcode & 'h0F00) >> 8] &= registers[(opcode & 'h00F0) >> 4]; + registers[15] = 0; end 'h8??3: begin $display("HW : INSTR XOR Vx, Vy"); registers[(opcode & 'h0F00) >> 8] ^= registers[(opcode & 'h00F0) >> 4]; + registers[15] = 0; end 'h8??4: begin $display("HW : INSTR ADD Vx, Vy"); @@ -200,6 +235,10 @@ module chip8_cpu( registers[(opcode & 'h0F00) >> 8] = scratch[7:0] & scratch2[7:0]; end 'hD???: begin + if (cycle_counter % 20 != 0) begin + halt = 1; + end else begin + halt = 0; $display("HW : INSTR DRW Vx, Vy, nibble"); x_cord = {24'h000000, registers[(opcode & 'h0F00) >> 8]}; y_cord = {24'h000000, registers[(opcode & 'h00F0) >> 4]}; @@ -213,9 +252,11 @@ module chip8_cpu( for (r = 0; r < size; r++) begin for ( c = 0; c < 8; c++) begin + if (r + y_cord >= 32 || x_cord + c >= 64) + continue; screen_pixel = vram[((r + y_cord) * 64) + (x_cord + c)]; sprite_pixel = memory[{16'h0000, index_reg} + r] & ('h80 >> c); - + if (|sprite_pixel) begin if (screen_pixel == 32'hFFFFFFFF) begin registers[15] = 1; @@ -225,10 +266,39 @@ module chip8_cpu( end end end + end + 'hE?9E: begin + $display("HW : INSTR SKP Vx"); + if (keyboard[{registers[(opcode & 'h0F00) >> 8]}[3:0]] == 1) begin + program_counter += 2; + end + end + 'hE?A1: begin + $display("HW : INSTR SNE Vx"); + if (keyboard[{registers[(opcode & 'h0F00) >> 8]}[3:0]] != 1) begin + program_counter += 2; + end + end 'hF?07: begin $display("HW : INSTR LD Vx, DT"); registers[(opcode & 'h0F00) >> 8] = delay_timer; end + 'hF?0A: begin + $display("HW : INSTR LD Vx, K"); + halt = 1; + for(i = 0; i < 16; i++) begin + if (watch_key == 255) begin + if (keyboard[i]) begin + watch_key = i; + end + end else begin + if (!keyboard[watch_key]) begin + halt = 0; + watch_key = 255; + end + end + end + end 'hF?15: begin $display("HW : INSTR LD DT, Vx"); delay_timer = registers[(opcode & 'h0F00) >> 8]; @@ -273,8 +343,8 @@ module chip8_cpu( end default: $display("HW : ILLEGAL INSTRUCTION"); endcase - - program_counter += 2; + if (!halt) + program_counter += 2; cycle_counter++; end endmodule