From f8db64484a25b6970acb75b35188efd7089e572a Mon Sep 17 00:00:00 2001
From: Joshua Wise <joshua@rebirth.joshuawise.com>
Date: Sat, 5 Apr 2008 00:34:42 -0400
Subject: [PATCH] Cut 1 at interrupt support for CPU

---
 FPGABoy.ise | Bin 240410 -> 240439 bytes
 GBZ80Core.v |  60 +++++++++++++++++++++++++++++++++++++++++++++++++---
 System.v    |  18 ++++++++++------
 3 files changed, 69 insertions(+), 9 deletions(-)

diff --git a/FPGABoy.ise b/FPGABoy.ise
index 227845500b0c7f94cfbe06aa62cec21e47c4f84e..3562e2939347135378f2138caa6b9fb7e0726134 100644
GIT binary patch
delta 12997
zcma)Cdt6ji*PgwBnKO(B#Y^L$pfI4wZ5Wj6h>8d!0wN+RDk3P}5E11f3SKiSue>W<
znp#<}rIi(0jihK=<`wVP%v)w<rAei}-tyaLhCOqp_x<DZ_nTp#wV(CuwVu7t-s>Fa
z_46K<^B$l0d$}%aYHACCUdzS1!bOciA^ju41onAp$uPL&^*Wv11<E^xdF3bwXnI=v
z747;7XY5!FG<MR87uBORMw@pmz>Q9NU94)SCeCJYpRewsG1=OaBf-0Km`5L?I<5(`
znWlGzoX!Sas<OPrLGc5+PvryTHNmFNTJd$&MLvLO798ko7K=5m98(nrI`2GUgeq@6
zse+B(2G(w3?cLDqttBTw?PDf)A=Agi+ADngXpIZh`<TQ6;gBZQ7R0Re@W`i<R6}VO
ztu9~j9nV#>LDi9C(wD)eE?QCt4P6Z6B;4*|2>3%OYQn7yiVKT{NS<YKv-=YsT;*Db
z?>dwg5~%IEnEVDEe9dGK<oaskyOPeD-ZtlBDE!PFf-8kyoG2;IeLc5NS|V)Vp^W#0
zdfzOP1a5vN-4jiFj;VS_c*=F1I|Fk3^rRGO*mnbL^3&>OyH4XHg1>N|dxcDdQ-0cj
zm+6n17+X9;n}t9=mieCWA3Jg!h<dHA!tFj!`^*|)9iN$rk04&JB~6g6H<6#9R&OQ+
za7nKx_u(0{m>|}FD2;vrR`^Skvf2MVagh+KiMP$bz&4N*U?zKEQ-GF~Lqk9oSp#A>
zldc;*!Us#gFMP<;i~Jb!yP1uCu4YZ7E$G#4H3AQ`YL}`P4{Pit<w~B+^k3joH$C|f
zo^><p{v)j6Yg8Yret~1khe2+4Eh&WZ?)rdPs_UA5wg`m>s*QYN`mNEp+sCp%WA`wc
zqJ=x%{b*V{@C?-J0+q-koiSTD$+5vzkRGTf??7pwR%}oV<CwW;pf1plX1PKG>;4I@
z1Zqho+z&L690=%<MYcm#4?P(N8+$A!55PA_OR^v~D2`V6KzWcpU@CdcRR~ZiI;w5U
zigbNZ70e?J{stO@-Xrx;7_8T=cU#Z#2ezr)dFI2H!lqyY`4&zw%qR4LCe)^EcBXnT
zk2HQgh#`711dJhO-88a_-zn`jsNUf`2`Nw;Vi2DT_R**4peZDeEP>F_B3&QlY(6)W
zma6-3=Dzo!K2%F)!{Ja9`4Zg14CH%=4AbkPTx$3Vm^MW1#qmY=p)^cOPQfc-W)cIZ
z!t`VX+z&Gu4MHovsuJ8(p&Va5!u3U-(VCvZA|CC8ILJ2`NKdFW<dH4VY|tA2bPeVs
zzWj=62#+@6xbhiqk5UL0-kz8WvEh1h6>`J1;%Id^*F1YZEDYC@Utt~VJr9lHTHRl6
z$eF*ot=hnm34w5jVGQ7D^rNLd5NV8~U0k5ls1?@<J$R&(heMsw&ugN_)uQQTo0>QF
zE86qv?r|JWF^33MJ5D={ts$e{xXAqhUw{?AC|}}&^zN_n=E$rJMGEKXPIsh41Q8nP
z0_8pP#2Lbm+&kzN+~}z_)+k@&A(fm}{)@M#7YY;j&7%85i0AgH1<<3HiTnkHz4W@B
z%FTSA|2;)Dm&cO&2W;xa78HHLcc|fCDMxUI{LVlk_s~Q&?2FWjPlYM`zU_1yZbeGF
zMrf3tY=X?FqioH1N9)D+1p69`Y76PnVKmYWYNB_DcT_6QI{ZC|kI@nz$c`x@!(m@c
zmTsi$UVdY2dQaHTv*|GwLSyqtG^~g<5HmE!YRPyw7i%KZz%x!yRzqZ*Ui?Ls$+MZu
za*Z2GgGFdy-DPk^x=@4B6h;TMg?!TmU4qLhK2Yha$|k;&(!PPr-dZvPru5Du3*m5Y
z1F3*Vy-nl?h>X{hV#s0N_n;=;Aik&c<C9mM0uAvd-4}uvPi^uVWgp(oe;dR;S!536
z_t7$qs`^yWqSnydXQf9)XJH^$vi(6=(N{0VDgWZJjEsfGzGm@TA%c%H7QwThK^(2J
zPfX%zNbk2w94A!p)W@}f+x_$bwaVd~XWSEVhv({dPzd5|<`ZB{(34}3ouJp%3v)O_
zU$roRx2MEGZGx7h!PW!=35H7vCfy?Xj;60|@h4qXcjRnk_aL;tLHEqfgD;?MpQ}o^
z20c4Kd4GLCx;yfvJn^CH6MhqIeJ+G^WYQjJ>~CO;^$z>41@A;Xc^MKC4P-NvCThh-
zWerCbtbn@2FxuY>4kYTuZ`Bq~Z5|8v6HR0-7zdaLLh%50VhY!JZ&0&3mrE0?hK&OZ
zWF#~V$P$y(+c_rrcL+@?(oJ_Q;ljO!>M6Xp=g&}|q}A<pyPyfN3DNYI@>3qxpiXcj
zNgoj58pAi5SC6SWaG8chs<m9)a!=@ytS4h3Jvob{z@}ua_^vvI_x3pm2a?Cq{+%Jf
zoJT%_CFVRaS83)%y}p2Evq8MBXshXO4T1!zAatPC*yL_Mg)?WkU*SQ|N_IKJ1FE{9
z^5Hy#J)nG`LF}n^<CfV!LH$52`5X=pG>NrBB2R2!Pw-4x%&LOA6ti?srDTyqU>sCL
z9>T^!S~3|v8)RZ-Uh^QWZoTU@zSD1BtlZ608gvDGQ}w!9mp8bqvks_7@yUqm1G%YL
ztbD0YHIW3klWHI};GL#t#biR7UiZKyhL=a<s)WBe=iF9Mlcpupp)Sp&3lvm*%V?t%
z&hgxXRd74aL=Hnhx>@`|Sk5tBA3#<5%5FnDDYSg=4cM({)I`~4RoO%6$CID32SNwy
zNi$>)*0L>O%3uTe9o7vtF`3S>_7C8eA#F50GR$NLlx7&nQP`AGN!|k8kSunf7Z1^r
z2v{=2B>qR$mJ2<s0h)$r#e>RoT!P#c&^$yhu2tJ_UXuvEnI>Jj@SG<+=diMYGYtA0
z$}<gY@7$beVu#m_Op|z7y_%=pza#V*Djmw{L$%}?6b{WJ6X3v5lde$}!}A*ZSY2z!
zzW}-{133UGS&Qhf_Rz%sB)CB4Fl|6jg{LObw#-6i3$;AnsB+;l_YQgjD~4&s3+|tB
z%hbbAKWs7i86vau*zsGJJ(l+Kg!|e0_;*!r@&FQ+xeVp=I^n*`jobTGs9N#%@Fd|Q
z-i~?z*~7EQKG-^Z6&VAuBg||H7LG8GIH+gsH{lU$4~HHjD`=SyY#M1I8E|E!R`<X?
zk;j$ux6qy|nCk{&j#jJ?G`wW#mj%Wgv(D&J&Tp3@vnq;bocS1PbM)e4jR$9|`WW`*
z=-H6Ba`ZZ1m5~RU@r7~+Z>Kx~-%;9tQM80_j!}ozk$l7<x$gTpTk&g<JIWx&D?jG*
z-7^x_jhafm-N9{im`9{aXv1Sq?gt5@4Qx%8jxJ*Jdu4PU*#_}r3}hn|kEzt1Cq_P6
z$r6<-=gT?`&&GsBWOo+s@<BspDt$R=@NgQ=@6M24)dAdX)Q^yxYak)8f_-0x#$2;*
zyQ?clE_$qv<_v@D!F#M(OjB0z^b1m<bgWi4Sy|a~=P7>pM)@l5o$&%}8fy}V3WvF6
z)-Jd`HjAA)@p%Ta6N=gQBiP8k7eiB?R=1qi^QlR=s{|fl$qsmyS0o-)D>%=brBFUj
zFV0r3wPR+$=5a+N3Ow^o?37Q>H;DCu{boq=f>-hvlRrT$(36>9EHD^<6Z|>bz|Ym)
z`IL=%+r14}Z|Gafe4cyEdZ;bXi!UiM_=e(h1oknu5V*y@dxLsBi$~Fk_qKl#V#kNk
zJTI6s-k=*UbmD_0cU8^iq-mR>e!QPYu$x-V^Qim|Zj3J?sgOQFOLjrwge>DYbyptU
z<hH^)e2?=#sr-U3-a&KKvw74pKf>(^LurN<;tTT_(Z<3oR^Buh>d9#6FtJkHsrrzQ
zpAik~Cg$bGt19{Msi){0ngrV}*>9`L!0pu?)H!^xxW%f~e7c`^Q@L<V_FIZHp1$AT
z8oP{DA3)9|y>5xJnrkrrGxs7MZr)L-n`9uD;J_pkyY0zjQ+%mV%sKlcsv>whFHTW!
z-@)HgUEuK)yDDor^Nf*DHQA8zT(L?MVap=?f!c-lR_zlKINOxbE<t>e=dDq8<(dSy
zR?X!2)Ou*1Y$p96c8Vz=N^Rc}Q&ZG~I8UDmf*;2ZXn=K7^yDlwPSLVw&2v)>?7nrI
zY9RX|a;ll+L(NnZ$%TfgCh?(qDOVtY04dUvi=ZnqiDT96d0yof$S=~1O@f)1k{xzI
zZIMBou8QU(X1oqfMR{zG2%V-C-&c*~z9YIr<}@?gyVgz1B8%Y8v^<gy>BU;I01Asu
z<OyslHi-j;Z5$sp3~m?ebs6*)*CfkVwUXx;=M4eV^{hZhnVv`Xz}D$z(g@AdO(YUR
zOQiEMw?xY}=<*VSE=ZWg7pQlc(3Zz(-U^Kj$qxULO7<*3`2MwUp+>`XsQL_QW|&yb
z-!Q|ZTdOGKGx(8Cxt;S2+5lpyp4C*wQj@eBmTK9lyrfhg@Vl^<kE<_p8^^biFK!8*
zd}fo6KvSt7EpUbAQZsuRj-8puDu;D5rNkO%n#2vlK`uvGUvQfhM`K=qgjsssUb>eT
z#)HlY_QEUZA=Jz&(#;X<CqvR`<q)n}<VqlATHQmHCyzb7hoIy!wwVCNGP9WB-j`>e
z^C~PU)3aiDYne$rsA$LUq>g)_xlFG!y7l6k?f6~@;2Xj~fY5TY*j0F&GY7=M!g4L~
zhjr!a$=eWFp=XafITa@M#;A_93!tGQi;M!X(iAX9IKf8`p6go4HG6Hgay}QLKncZ_
zCf&ajPx$Ky4}-9nXH>vW$jUG}#|4@zvvk{uhJ#v7SMTA}=EIOXThBJ4g|ny9;Vy7z
zwplkz?ayarv`Y0aKH9XskY1%X2C9d06?-pri{UHs^H)_GKJo~a#*+_FwG}p1>BUsx
zMc!M`45zBH#M`QET&KaO!8k`x!XbOkV)okL(j2|GO*xK_8#@@(a}DGv#Lkso739v<
zipPcTIDgP1SU5L}y}~><*N?_~!XpOS2;S9Naji0e4_P<>5~{WADapcRJoJ}vfl~yt
zHxAWWR_nh~ZDQ}{>|18_J~+kfS#Z1BARZHj@JZ}&7XoUMX-GRLuF;b_P+OxV*|3$h
zdqPu99ytP`^YkPhGUsVUlkzOjBX=5<&x@nU3aFo#rMsq1<}&sTQrS<kObXuf&8&DU
zoNq8TsGjo-#zYDBS|Mqpu!C<p-Q$J+e1Iv>cO00%=2LOWnf$0OHAEqO!olbjZdu!l
ztO{{?sMvu)`J_(68rJPs6Wte&<dc=2c0<%gg`%H=8t`O3@y8Vfq`(1=JZpJeK<cT>
zLoyUUDkSSXACh5Ko>p(Ytx$AT&{XujK=e3wA{p=Kd-H&`Z;-98?Ie<~vHQJo$ue&e
z>7#Oa@O(b*olbt#u!fbgb#yv@QbM|t4S1@AOeLrA)GXqKc{7PSj+;Te$zhw}lN!<%
z-=9G`kbRh0NkZ^9*2W7pq!UiBBAyspN?st_C2TO3NbRlYyO8)f#)<kAca)M^vcf(<
zce2FJt;Y9f5+5?pW?+nM@%~IUSa}OVGDOc}h9a9`(k#-QjJLJ7O6@UHJAq_LqlRGL
zG7=*jx(hBUBjX%~$YFTL$<XU<99d3&b|4~dVrm6fr2{UkAgTY9M!-iEEFif)rb@0)
zf=rq{m3C>?%>EzBL=46Ov&k}<GHvncY{n#)C$h>(p6)Vby30gqi>`B+r$d>xm@FBr
z@`T{aQoBW?BXi^$8F!&LmyGhXuM1-j>vCF%&la*3x?wH}cl3orOW)XX)<>$zPKR=a
z6ZmztL%GM*B<H`CTTsK|a46TEFDlo0PKzpOo?SUyDz*Q)s0<1`I*%-Ml5YNd#x0j_
z=X@vW+M>$>hLEqUB+1}dS)TaP0ydaj#KRJzMMTX)*0zc`!I5^@WL&+FjByx3kK;pT
zaJLH@in)u(Otv|c;ps)BuIocZx%Cbdaz3)E*<`(%r&y|>omq1<HUnvo>lc$Ewl#2Q
zEA)Jkv?nc{aW9fW2hT|MA7X5CIQqYMEN5OMY8Cz71FtS48#NE+S*$46iZ=Mta<bfE
zD4&JiE68$BJEH7_b*FlU%a^mczPf@W5hMDqB(FPsX0^k^E9E3JD{$N@IZ5dmiNvK9
zo>)ozExxPC{Pt2TZ~vRDbkLOep=q<+YkG~<Yc(cpW<x*SObQ%f6`!^Ct+Mu6;9Wvg
z^ky&`$GWt`t=q^l_nX1i4Ari?u+K+ih5g#)7d+>5-3h0COs3PDLHOOrWDUm&7p`FS
zCuEi5+7CO_J9vcisrX^N&9C!zncvo3xO=<IZ_8uM-XZhb(iwl-A^8R1m``PXlSbmx
zPi1}+*J9mgGQYxu81lK~=Z70UCmY(_^t0yYe*L&4gsU4~voMjSS;%;Idsj!iWRWOZ
zpx4rH#!ef>^_|ktE%wi+;(`Vl?z0b3`-K!rOaG^5@slrXeqDFT{Fc9kU+$9mEqjO~
zcFX*hMdQ8QlAjNbYb5L4Z~9n6_6X>SZhIuZmTUiIxPe`_;n(_O)|5g}vxlXWyO#{0
zH@)$lz2tT7B0gS#<}V!-;-iar^-F1J8>RS2kCpqRp}p~^eKNn(U*WR-<eD9K<})n&
ziuAQ#pYDi_Uy&R3>oc2h%h$60Q~B8ZwcNi3zdb;@N+~`);7C#Y$OkulBa3faHO3s2
zU4M8GPaL#K)Ax`hX-nL%-o<N&WVlyTvEs1o`jzD<9<k+BbA+ttl8KW#S|wwL`%xxY
z+EHm0v`|i*g$+l^Dm%3BQ!BK_2CY6Osq2ILkC8QYNYWT9WCb2S!Pu5Jk<aXG$<s0Q
zIO%JL4tUoJU2cQ!IZiAN=rEjrLZ)5fcX;T8OuOU&tUoDf=Z$Ah%0}<T0%t3FGqyR+
zM&Ec!mP^1~bU!VV!+$q!I&G8D^NdVJm-ASEhAgv3=@KYyjjlVS+Q=VgoRv}1FuZb>
zOp`Q7Jx4b1=rz-R#pZJk3eB|sR*Jngicijyd^@x#4Le;RMXX-S!dEV^osrjF9><4Z
z*hRK8+6_(b;sGbav0FIi5-GOUddDu2_4azsW2>iChHtU;Wft>>Z>18kr4IDiG9J~J
z<-G5$$G0w9X)>_Qce0YvV}6n~?w>K^3ZuFD9jk-vH1p~(<%*o9CK0b+v1XEqgRe>z
zEU!Gj>4JB!%Al<dl;M(VZ2Pt&zWxAxu3JOM!j;#_>-J1E{ePD-adX3yH&_U{H)NS;
z5<bKuH)On;euFXp`xcs0-;;Ir0W@w=SbkFub@>fj{U8fLL#uJ~4_4oSm=WpH0fTOl
zR~bQyb>C5VJ;uGatOVRJ5{LgNH|VzDogb|P$(Z|-m3pAnw{?6seDISM+G6Pa60Z1}
zomLM?i@|ionq@FP{fT8c_%=yolR6MzyKP+%Eg=7%82gKyM*kX~{6#*H-(8&YYfBE7
zezi_Pi?8NStolvvt6_6}NABzXHg3Js;;XwW^Yysrg$;MDTG+@uelNknzsth+xVuDJ
zCvL-V?_Cyt>wBa>{r)e^x<}q{oX`_K#;5mK1oq-!{0)R=7J<Xi14I6hB4Cd|8~%_o
zZ+Qgr@F$q?rxZOm=zHQtCxhPtEcwgoTZz~HlGZSXx|*%hF2Jr2SZv$w%bu1zTsEWE
z1352kw$wi$@36-w#S$FxNcI>e9xlR%k0cdZh{Z!+;PS_k3fyqeT8p{8j?W&kk<y=#
z1V*zRYoEwyTA3Ts_*6#I%IuEcJe9@JD!Du6K9lYvMI|16CiB&-EWo0_Wg}`<?6v0B
zfTe%45ksDn3HI<bD>~r%=QcI#G*tFHS$3!H1L_D{Q)UzBKwUj$H2|S9j#+5AOz1XA
zj!InSDrZUChQV%fnl!aFmK$hvV?4jP$$3&oTShDCu{MqhH|9%>(9%d|u$8Xr#MwAg
zOIOGcjTZNgG>&Q>JhJ_sfDVes3@^GtW*C4EyeL~icEtC%suPXr$BU2a9f|dqT;}`y
zKx3QvFVaoPEG-4fvWJRaoh__{QFW%(GTLjnvNN41Gkk;3JJZQB!x5b6?S$BgrvfN@
zY_x~gh=YBc5L<As4-?6O_z=UoI3d>Jn_Xy`46y-yx;i12;wopuvNgU=fGRBYrBh`T
zHTa`5V#YsHDZ?XvP8<dQOl1<jt9L>S`zIm?7x_CO!thUjS|E!f0>=e7A$<SI5rDnB
zIU!o(wr);>wa3og=}ZS{$}L>iolY3qQoge?oOEcJT3bOcY~4lLIa?-;{O={=a@q+a
zJqBb1(mm`j7$9{hTyG!5jy>cvlX4uf2VEo!<qY}<(W##H*-hEU90_|u&Fo8Kuyr@e
zUT^TVk@5|?2FqtD<x{K*mgk<b6Mu0=Y{tA0Czto}th3=YObL~*(Uf(#JCu<=B-z$1
z6kek+G>m524@vfh2ww?fH<%q^&c$#8Q`m0s>V?~!4Y3#$P7Byc#z}pxc?L>(4wpH0
z!@n6$W)QK+$ZimaV|zSrlp}O^FfoFzaUgV$@P`Qbo{>$_zbAbp+cOSeU@v-DX4sEU
zd&x<?GI2^I&7aRJ4^~5vKuHcWw=fl4zjv~*iizl3EcO%7l|4hsygZuTCEcAY8kgTl
zfRn{zUY+8h)$%8%L{U$c*)Zu+A=N{LQEd5eLu-$P_(v4mg6!qT;D=ZhZI!E~{22Tc
ze~7kb#tnBcGsX$=2kwq>Lfph2u}+4cagDR#OLU2&t7XF;!Z+gNl4po`HO@)$qxika
zN%BMZd2c$QwIlTRS&9TR`qGgy;+?oWo=%b(KE}V}oq~H4i~3lXD^Kv>_+1|-#6s-S
zkB*gbEXD18oe<goL`=n(`#B-{{1Y(%$0o=T8Ex=r0!^9Ek9l@r|MzMj(yEu%P)oU`
ze~nm=7l%cYL9EYI=D%jLgOdFdul?p`J=h$W-Y@a>L2N&>@VL3xtz}iY+Y8Z=xUoN-
z=g2zk9qg9KZgd`?$MAc&E|I<{Gd#e+0o3R?Y*YS?69&+(-YzT-H}(<Or!D)i40zcz
z!o#*xof<%2U`&-#uYxZ85B@QLmSESR#MN8!bZ4J7?86=*t==4W1m`5t2MP8USP_Fs
zQVYcXI*LfIsvJYILWFRdmRH|tYOGJDx&(Vv`kutg$w`_Goz-%$X`J*|A-ZoRU8IIR
z7wHYU#>{B!(S(EBD^3tr3EHO4Y{wXP5mp#68i%C^7Mf|WH;;x@fW+I0h81L%ZDu-@
zIJ6%z2;EcYG?|2TxG+V!we6a&M`4h((Cvm_{-^XW<LN=PMg}XvQK@vOw>`f9r7<2(
zrNIU}Bpm)<Y3kExnrt8+oRdc59m{9TVaxtBI^KmrS|)SUOP25<G+WA>TWT$<Giiw&
zv&!P0P17k}8O9Dj2e8gkJ%aWn0n&2fOR6<%JC>FG38CU^%f*p2Lq5zamWWaGB~cdK
zLCaT@=oUAJC9%R%QA~q~!;(!bA53?$WN0kcOX!3I2PWlh%&4b1u5*K$Kel{WPX(2-
zXH;x#cr^N6q3!YbPI_C}GdesxD$3H>!0J?~H!?OBJsWATC2%+Oadl&sm|m9DFX=gg
z*AG&64BAiMpixH4k^QvJ)oQX#IY<MkYgCNUh;@hQ%Tg;GeUH#Jw$`pAbP;QXM`FTJ
zt1UbNFCV4Fk}U$$j?p)4t-HtQJFZdDu`yWJL`$SrGz!P*7F+An<MfcNcfko-Yio5l
zNtfDs-#RHVOTKZZ=nk8$`4oNGO|n(vslzk^KRHc1+b}0j(;>FRqp{l=HkKp;t~<kG
zx3&V#(yBIAVIr#)$th_`c|#JD*PLdO?LSK=aZjdUJM4dsPUePB&e6AQ1jEkL>9*E4
z=jlXSEBpeJ!Ak%61-jbS8g!9XVAut!!J`-HY(6<DmuRunj_DPRyD!n7tnDZxZvB=P
z+AvYr{xY4zG1kf4a+&6|w#{x!%p<dK-*M`NLEq8l7N~_m=QXI;wR(4p^wY)=OkeEM
b5x-pH($Qr`{!Gi&H7-%@mA)THd+PrIDXio;

delta 12992
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
ZT5HA>Ov}%kWP4WY7SlrG{)yDT{|BAbpe6tS

diff --git a/GBZ80Core.v b/GBZ80Core.v
index 095d9e8..57c22d2 100644
--- a/GBZ80Core.v
+++ b/GBZ80Core.v
@@ -46,6 +46,9 @@
 `define INSN_JR_imm			8'b00011000
 `define INSN_JRCC_imm		8'b001xx000
 `define INSN_INCDEC16		8'b00xxx011
+`define INSN_VOP_INTR		8'b11111100	// 0xFC is grabbed by the fetch if there is an interrupt pending.
+`define INSN_DI				8'b11110011
+`define INSN_EI				8'b11111011
 
 `define INSN_cc_NZ			2'b00
 `define INSN_cc_Z				2'b01
@@ -89,7 +92,8 @@ module GBZ80Core(
 	input clk,
 	output reg [15:0] busaddress = 0,	/* BUS_* is latched on STATE_FETCH. */
 	inout [7:0] busdata,
-	output reg buswr = 0, output reg busrd = 0);
+	output reg buswr = 0, output reg busrd = 0,
+	input irq, input [7:0] jaddr);
 	
 	reg [1:0] state = 0;					/* State within this bus cycle (see STATE_*). */
 	reg [2:0] cycle = 0;					/* Cycle for instructions. */
@@ -108,7 +112,7 @@ module GBZ80Core(
 	reg [7:0] buswdata;
 	assign busdata = buswr ? buswdata : 8'bzzzzzzzz;
 	
-	reg ie = 0;
+	reg ie = 0, iedelay = 0;
 	
 	initial begin
 		registers[ 0] <= 0;
@@ -129,6 +133,10 @@ module GBZ80Core(
 		newcycle <= 1;
 		state <= 0;
 		cycle <= 0;
+		busrd <= 0;
+		buswr <= 0;
+		busaddress <= 0;
+		iedelay <= 0;
 	end
 
 	always @(posedge clk)
@@ -149,7 +157,10 @@ module GBZ80Core(
 		end
 		`STATE_DECODE: begin
 			if (newcycle) begin
-				opcode <= busdata;
+				if (ie && irq)
+					opcode <= `INSN_VOP_INTR;
+				else
+					opcode <= busdata;
 				rdata <= busdata;
 				newcycle <= 0;
 				cycle <= 0;
@@ -157,6 +168,10 @@ module GBZ80Core(
 				if (rd) rdata <= busdata;
 				cycle <= cycle + 1;
 			end
+			if (iedelay) begin
+				ie <= 1;
+				iedelay <= 0;
+			end
 			buswr <= 0;
 			busrd <= 0;
 			wr <= 0;
@@ -552,6 +567,31 @@ module GBZ80Core(
 					end
 				endcase
 			end
+			`INSN_VOP_INTR: begin
+				case (cycle)
+				0:	begin
+						address <= {registers[`REG_SPH],registers[`REG_SPL]} - 1;
+						wdata <= registers[`REG_PCH];
+						wr <= 1;
+					end
+				1:	begin
+						address <= {registers[`REG_SPH],registers[`REG_SPL]} - 2;
+						wdata <= registers[`REG_PCL];
+						wr <= 1;
+					end
+				2:	begin
+						`EXEC_NEWCYCLE;
+					end
+				endcase
+			end
+			`INSN_DI: begin
+				`EXEC_NEWCYCLE;
+				`EXEC_INC_PC;
+			end
+			`INSN_EI: begin
+				`EXEC_NEWCYCLE;
+				`EXEC_INC_PC;
+			end
 			default:
 				$stop;
 			endcase
@@ -896,6 +936,20 @@ module GBZ80Core(
 					end
 				endcase
 			end
+			`INSN_VOP_INTR: begin
+				case (cycle)
+				0:	begin end
+				1:	{registers[`REG_SPH],registers[`REG_SPL]}
+						<= {registers[`REG_SPH],registers[`REG_SPL]} - 2;
+				2:	begin
+						ie <= 0;
+						{registers[`REG_PCH],registers[`REG_PCL]} <=
+							{8'b0,jaddr};
+					end
+				endcase
+			end
+			`INSN_DI: ie <= 0;
+			`INSN_EI: iedelay <= 1;
 			default:
 				$stop;
 			endcase
diff --git a/System.v b/System.v
index 8b8d613..7319ebf 100644
--- a/System.v
+++ b/System.v
@@ -76,13 +76,18 @@ module CoreTop(
 	wire [15:0] addr;	
 	wire [7:0] data;
 	wire wr, rd;
+	
+	wire irq, tmrirq;
+	wire [7:0] jaddr;
 
 	GBZ80Core core(
 		.clk(clk),
 		.busaddress(addr),
 		.busdata(data),
 		.buswr(wr),
-		.busrd(rd));
+		.busrd(rd),
+		.irq(irq),
+		.jaddr(jaddr));
 	
 	ROM rom(
 		.address(addr),
@@ -125,8 +130,6 @@ module CoreTop(
 		.wr(wr),
 		.rd(rd));
 
-	wire irq, tmrirq;
-	wire [7:0] jaddr;
 	Timer tmr(
 		.clk(clk),
 		.wr(wr),
@@ -156,6 +159,9 @@ module TestBench();
 	wire [7:0] data;
 	wire wr, rd;
 	
+	wire irq, tmrirq;
+	wire [7:0] jaddr;
+	
 //	wire [7:0] leds;
 //	wire [7:0] switches;
 	
@@ -165,7 +171,9 @@ module TestBench();
 		.busaddress(addr),
 		.busdata(data),
 		.buswr(wr),
-		.busrd(rd));
+		.busrd(rd),
+		.irq(irq),
+		.jaddr(jaddr));
 	
 	ROM rom(
 		.clk(clk),
@@ -190,8 +198,6 @@ module TestBench();
 		.rd(rd),
 		.serial(serio));
 	
-	wire irq, tmrirq;
-	wire [7:0] jaddr;
 	Timer tmr(
 		.clk(clk),
 		.wr(wr),
-- 
2.43.0