From d4f42d9f32026bd70a47ff40805f5fb9425af579 Mon Sep 17 00:00:00 2001 From: MrWint Date: Tue, 28 May 2019 17:42:30 +0200 Subject: [PATCH] Make BG layer mask work properly for CGB --- libgambatte/src/video/ppu.cpp | 18 +++++++++--------- output/dll/libgambatte.dll | Bin 168448 -> 168448 bytes 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/libgambatte/src/video/ppu.cpp b/libgambatte/src/video/ppu.cpp index 38a1b03790..514beee00c 100644 --- a/libgambatte/src/video/ppu.cpp +++ b/libgambatte/src/video/ppu.cpp @@ -557,8 +557,8 @@ static void doFullTilesUnrolledCgb(PPUPriv &p, int const xend, uint_least32_t *c n = (p.cycles & ~7) < n ? p.cycles & ~7 : n; p.cycles -= n; - unsigned ntileword = p.ntileword; - unsigned nattrib = p.nattrib; + unsigned ntileword = -(p.layersMask & layer_mask_bg) & p.ntileword; + unsigned nattrib = -(p.layersMask & layer_mask_bg) & p.nattrib; uint_least32_t * dst = dbufline + xpos - 8; uint_least32_t *const dstend = dst + n; xpos += n; @@ -576,7 +576,7 @@ static void doFullTilesUnrolledCgb(PPUPriv &p, int const xend, uint_least32_t *c dst += 8; unsigned const tno = tileMapLine[ tileMapXpos & 0x1F ]; - nattrib = tileMapLine[(tileMapXpos & 0x1F) + 0x2000]; + nattrib = -(p.layersMask & layer_mask_bg) & tileMapLine[(tileMapXpos & 0x1F) + 0x2000]; tileMapXpos = (tileMapXpos & 0x1F) + 1; unsigned const tdo = tdoffset & ~(tno << 5); @@ -584,7 +584,7 @@ static void doFullTilesUnrolledCgb(PPUPriv &p, int const xend, uint_least32_t *c + (nattrib & attr_yflip ? tdo ^ 14 : tdo) + (nattrib << 10 & 0x2000); unsigned short const *const explut = expand_lut + (nattrib << 3 & 0x100); - ntileword = explut[td[0]] + explut[td[1]] * 2; + ntileword = -(p.layersMask & layer_mask_bg) & (explut[td[0]] + explut[td[1]] * 2); } while (dst != dstend); p.ntileword = ntileword; @@ -601,8 +601,8 @@ static void doFullTilesUnrolledCgb(PPUPriv &p, int const xend, uint_least32_t *c { uint_least32_t *const dst = dbufline + (xpos - 8); - unsigned const tileword = p.ntileword; - unsigned const attrib = p.nattrib; + unsigned const tileword = -(p.layersMask & layer_mask_bg) & p.ntileword; + unsigned const attrib = -(p.layersMask & layer_mask_bg) & p.nattrib; unsigned long const *const bgPalette = p.bgPalette + (attrib & 7) * 4; dst[0] = bgPalette[ tileword & 0x0003 ]; @@ -624,7 +624,7 @@ static void doFullTilesUnrolledCgb(PPUPriv &p, int const xend, uint_least32_t *c } while (i >= 0 && int(p.spriteList[i].spx) > xpos - 8); } else { unsigned char idtab[8] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; - unsigned const bgprioritymask = (p.lcdc & p.layersMask & layer_mask_bg) << 7; + unsigned const bgprioritymask = p.lcdc << 7; do { int n; @@ -804,8 +804,8 @@ static void plotPixel(PPUPriv &p) { p.winDrawState |= win_draw_start; } - unsigned const twdata = tileword & ((p.lcdc & 1 & p.layersMask) | p.cgb) * 3; - unsigned long pixel = p.bgPalette[twdata + (p.attrib & 7) * 4]; + unsigned const twdata = tileword & (((p.lcdc & 1) | p.cgb) & p.layersMask) * 3; + unsigned long pixel = p.bgPalette[twdata + (p.attrib & 7 & -(p.layersMask & layer_mask_bg)) * 4]; int i = static_cast(p.nextSprite) - 1; if (i >= 0 && int(p.spriteList[i].spx) > xpos - 8) { diff --git a/output/dll/libgambatte.dll b/output/dll/libgambatte.dll index 76b0b4b77da81c4ed49c88dfa2ce6ad6275bb08f..2d96928fd030cb9b9bd00955371f0b3847f7a58e 100644 GIT binary patch delta 9345 zcmZ`<3s_WD*FNhoBLe~h%AlqO$e^ZV7~YCh28TM-ko1LRqDkSc%v*w&`fSkAU_6eR zW9=_XQ_H+$sbP$1DToS~7ep;kOVr9iypWcHrSrf0oTKvj|3A;OSZlp&?c3UGud~mA zyw3vjJ_}q)(FcZH8ZKx*4ML}=mSTuexJ-huP6Zp>(R7|ZDGU&AQVZuL66!v72k1J} zad*6K3T3-j>zYF5og!ho0sfNwgLj5|z5c0=@qpw*-YH~#k zQy9@q_sFTwkdlC-aTqp_59?YK>MsaZS8}M=T3C{kLsaJOGwpfGaL=DsKv&(Z zr}t|A{R|T7#e|bKd9UQ06q+g@lbqAr@)=KazdF4S6}Uf~zR|R6I-kbdZ4;^_`LJc1 zkR%A+FA9gv=tPw1o;5R?#<)M3Ih`)M+r0H#gdrCb@F^2mC?I5*0C}&uTfN<_Re28j zaVcn;yf2~3>v2E(b~KGEocy+dXhGr3f6ogPJ7q4(A3$f_1M>&cYPUTMY}yCAE!wH^e@lhK{PldV#R#nPS_XT4f_#K zuYb`%k=|oD859-Kwc!8o$z&Tc=n6SJ%ZAXgK)TH)Wzp;8_MFI~A$scXi62Aw8Si;? zEKL{b8jE|K1~Bhy6xX)kRY6F)zAq|gEZ?saH+{bP5%N#oDcog9KzmpvdAK>r{p^+q z&&t+$u%gd;Dz|5C! z`_R3vD$eR9E8j~{qi_6?Zkdicne#689ZoqRr@j8)kX>V7=l>DB^edG!ev zhmVYN2I$b5uk0Tz)s@niSZ-X{4VawIm*(&qj0Ga1;8aw35l$~mR{X}4^G6wkK8Q2j zsFt#i$CO)RiY;<6LMu6H{jCUZQc0~SId(Tnu5h=6C`Z{`=6t!tQR~M>e?*hJ9Cjvm zu(+P`*|HnFSFZSc^NMqa*<4E81{sTjHV<~`HcKwX{`rU!?71S=WGpf$leF)v8x0+E z;Ja^gDI3Gvcm}(k@L;!Xu1!2Jn1pq(>y2DNDzlo$As9YmQHfP9w_&S?TDu>#$Tc(d zDG3$zI{D}B)#(03Kbs4lDaN9aB=2vTVNPnVwnT)h^hW>?t! zN^Guh7Xl~D%P?Dw^M+tV*E2pxlfN;a=a9`6+~LLBJ}JAxA}@7XneSujLJL`!<b*);a2#eFe1{GE{iSh=mx{&0KWq)}0JMf-7ktzhREU%$^%^+b8dH{2uA3 zjYJ~q+PdBqqLiErZ)=e&OU~+j`)*WO56t!mDs$dwky*+%2sqdWpgzJ9K!{Vjm`Ha z>M$E;O)y5z<=Y}4AJbf!QOG!pTrQQ=g*iRTgR0>pA(HS>fm14= zy9?B+Knwd_lB{=mvQ|+q3hs9u^*u20s?qkNcL7_qnxg1B+r66l z7>@k~i{AV22cJ^kr`HTXtJ!;aW6R4gXO`aWIO#=8hUG=caS=uPTXm90P}@iF(=ERz zfm!8mM`3ZiP#bK{3^w~y`q(bdS3^lCN6W^-%hIwmrUWs)QDb$*B^it6WCM&TPl>sL zbL`S7ht=Y@*D9Omz^E2_$(J&(!dT!$@BDet&*oaft6`cee2&f8%Pd!0UDF$p_M#to7$K8aJDnpVMMP=3s=)rSHJP z){=`>cs^N6FOm3b8oRlUI+%Y+6NI`jw(5r#D5vCico&>JxBMuME4###XMS zPVD0iWEaoaSjR7jQ5O5=3pxxoZzE;VVfOn*suX`uW!t`_5-MeHeML{u=gjjJ*{KEV zy9srC6MK0ReME!U%}um}@;ybHDUN79JGX^irGf0puW3@Nz9;UR_(E3pHBA(+3}Sr? zDX-->HGJmfHkbY*w!4tt7JZl5z^#->OW506=^+}&)@-F*n#0WEmgG?t9G)Wz0||Lqz6j=f;mDp?zw*ZeP<+B?<+kK z-ZjV&$gLlR{GlpGa+#kN;ODr{Y*k(hxqb$~ceyYLLVtMHkAX0X3nL&*Kvk(#V+lqFKIvf=m+Zk!dpj3co(z; zv;wpNR0!&dml;mqLEZ~G1o{b73#tR%v0sJ!H%JHHU{C}ovdYu>0JSIaT364YgEW%F z3nlEcL-d$C^!E{H7{ZzN2pEr{8)A70a$k{Sn9{4 z=he-?)*O5R;2M^Ggu>&pn%PX;76)7VW?%#d+W@?5W{ZzdTlzO!e}p3G4MtTsU_T!r ze;TUD27Wol&e^!uo|05>oC@~hT5Hkt2z$1QBAy(V%XfaI9fVuU=I&vtdoA3>TgnVt2k=J)CiI7pLi4N@FN*%6^r{3kEW$86)ZA;5)UU& zGi7rPY8BAl6yBP|R-Hf~v~xd!t^5%Wtx2rtM>5;zMg0Bxu}SGOEiF|6u?gb zBo6dZ0G$GK;Z0%{K(7EjI1sJ?EfgR)3IKm?#0!f8#Bty%rsrrfC_n-S&Ip1XNPvP| z<(*V2E`bWLg#)`3prry7aNsKi2vUH)yp!b$5Uc<%aDeBoqbVde0E-y`p#B|4lTpzk zxi;C+6sl-v&|SU#RYy~pqVC{ohNG#KqJ94$v?m=+trhJw*ZMh{!WFHKYuy}8CPn*# zYaJX-5sEf}Yaxy%9Cm#wWXYIPDmk^v`him8lympn1U3KJi`8TjD<`n$swq4`JN%`p z%08(^3KVHJtp==D)Yg8cPbaX!Rb+}jr5wj*RUlp6{X1o#oQ2hpDQqX)njicZSl=4F z7e3B1Ymi2>m-04y~^965cL)@=x zXFi>oPGHCk_SgvwIf(Tb}v=*PNry6wX|OVabW zj7CXvO+tmwbS{hs^ar1*3WCpcN>R(V2k3-i$+0IYQ}V@DhOr)JDaKyE4xhF*V1p#t zitjN_ebsu%_~6hFZ?p#JuX0`1@8Ha-kApk+OoAK_s7&7i2=BN|FF?Z41s14D+YG$p z@x|ycSOg}O>4?|md-!lUIB*pVPMa?34oZ?7d}*ZyqNNkhQm=pyC763Z{(goRKK@>o zgw^^?rFalaav^_?C-_nliX~TuIZKic`Ah*U?i}^$`W75~We%VC?=9#cX{7p&SC<{t zJZ>(1OE&);J&gzF@pDvzoB5_+@pUta{q`$8(dusmXkNt*zBr?`v_N0KfhGJ#kI`l} z;WvtnT>`T=6Soa~EegeimvQ|WMbDY~XfZCQvZ*uk{6>AKFT4C3weQ#+9#@T_Hgmi& zOy5~i!h(B%@6$J~XPtki*s$5bw|%)YrEL9H2zW3~VZ(o?4_bHP`@r|GRNe8s{%x54 zJjI24@iC7>jl5q}C2H>^(1~1U?JI;ydEg=dxNa#gmnV)lp=3 zGsf^v#V6II`Hcn09!LL*&jmru?d^RRoqD(6YT@mQ>zuRW*DSM+Uh1(DX1jkvaa{wZ zu7ZN5Y?6wV&fmfQ~4(EXPFnMbI0~t zs{q$f!V7bJeK=g?pA?sTw&DWK2tI_%8c)6ir0Pxf44y#N^BFD`Y&I@!^SG`Pdp2#q8!_rghX zyB zWiu!FOy~8?cZqtZu6rNQjz?FYe)vQF4w6`!n9ZMT-Ht+)< zCAm5#j7MWv|2VMvR+8+8RLQ|8-?7)O;8NnRT7~hXNSBb9GG zzS!-Ewl8+0@_V21yFmH9p&8x+J@{f9736~QJ6u6jyj(%H>)PJy=obaz7gb;ESwCiO zAg8|v$>EFrmThgIO+k;PVopx|g(X;_`w#JzqN_9%#qky!c8w;YvQ%87wN%Nb{7G%> zNrx$qAB8(Vq5o0!y!-HmZ&ZBq0hMECl%K^Ko}}SRH9UT+>X*J><%=~uPxG(*LBZ{U zTQekSh6b&{dm5gu;aO?}0gF<8ii_2bH&6DhHsrrS;OYk|E;Q-nAD==#eveMvi#`?reh4@DB-i z8sEjt@$rIqiv)hdQ~hQLi#;P=5Z!+GRQ1P8VqdU_hKUZaFNcX^!AzOr(cp%^Nl3~N z`9s}z-SbzbSVs6m+V>;G?*8qvFveu`*X}{R5JcgEzSb{Gj2DC~Mx(_@`{Xb2^%vCe zrYJI5}D`3i@N{Y7+?`f}WTP|8SiU{wr#6FMkDdZN_IOj+=CX zX;grq&oBraI|v%iarA$m9`WA|`2_d??3>ZzBPL-F2^F9{T3bbDO_+AO&u-}T{tlJEoQ0hstt$G`B62=u@$HejsyVDufo$-owZdTM@OLH?HOY}Qz@&E1jy z0913GgfzI-c-D^c|>`nledtN z1AopVzQ*Dqa~=))7&7N6pp8>SyO33gjNFPzj1dJ?9bp=1&sb4Fi4!hqvQUJ{cvK%8 zcwrlEZdvdt21kWa+H#KKq2PJoe!J9uP?>}s#hO3(o4YlC@N1>`d(U^6QS*J~`~CSo z5~_i7z8%y686`}JE5k-$D^Z<;VVr>xfDW>EWB;=#2I7< zn7p5aP#8EL3^GGT0T<4J`awo*7XI}Ez7k@^sK>%?O-3;n9zCGqcn}DyH5m^Jq18bZ zj{@Hb;{8M&!dFKSmn*^h9wx!gSC6NWfG3X<3Ck{Uq17a0K+XbR0peS^5A*?%;5guySyYc^6m4IU6@p_HfVlQ_=(BB zNWxMy;N0&L_8f93cpZoj!2cN~8dMHE4m^t!j}UmzD<~>YL zzk(w^7jgsm!#7AshkrbHT_Xuwfg75TPd5=c$o32f0*ZGv6wYHne1LTD@tT|iz8S>B z&iO@6=7oJ0i2LV(p9E#Sj($*Ics28)PtKL{1(|bRqO6cPM;!`O6kd=Vo`Va-1pWU2 DuZ9u( delta 9370 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