diff --git a/zsnes/src/video/sw_draw.asm b/zsnes/src/video/sw_draw.asm index 38d6687a..a55ce152 100644 --- a/zsnes/src/video/sw_draw.asm +++ b/zsnes/src/video/sw_draw.asm @@ -133,6 +133,141 @@ NEWSYM DrawWin256x224x16 ret EXTSYM copymaskRB,copymaskG,copymagic +EXTSYM blur_buffer,blur_temp,coef,GUIOn,newengen,SpecialLine,HalfTransB,HalfTransC + +NEWSYM DrawWin256x224x16MB + pushad + mov ax,ds + mov es,ax + xor eax,eax + mov esi, [ScreenPtr] + mov edi, [blur_temp] + or edi,edi + jnz .blur_it + mov edi, [SurfBufD] +.blur_it: + movsx edx, word[resolutn] + sub edx,2 + cmp byte[GUIOn],1 + je .Copying3 + cmp byte[newengen],0 + jne .Copying3_hi +.Copying3: + mov ecx,32 + mov ebx, [pitch] + sub ebx,512 +.CopyLoop: + movq mm0, [esi] + movq mm1, [esi+8] + movq [edi],mm0 + movq [edi+8],mm1 + add esi,16 + add edi,16 + dec ecx + jnz .CopyLoop + inc eax + sub edi,ebx + add esi,64 + cmp eax,edx + jne .Copying3 + jmp .Copying3_done +.Copying3_hi: + lea eax, [eax+2] + mov ebx, [SpecialLine] + mov edx, [pitch] + sub edx,512 +.Copying3_hi_setup: + mov ecx,32 + cmp byte[ebx],0 + ja .Copy_hi_av +.CopyLoop_hi: + movq mm0, [esi] + movq mm1, [esi+8] + movq [edi],mm0 + movq [edi+8],mm1 + add esi,16 + add edi,16 + dec ecx + jnz .CopyLoop_hi + jmp .Copying3_hi_end +.Copy_hi_av: + movq mm4, [HalfTransC] +.CopyLoop_hi_av: + movq mm0, [esi] + movq mm1, [esi+8] + movq mm2, [esi+75036*4] + movq mm3, [esi+75036*4+8] + pand mm0,mm4 + pand mm1,mm4 + pand mm2,mm4 + pand mm3,mm4 + psrlw mm0, 1 + psrlw mm1, 1 + psrlw mm2, 1 + psrlw mm3, 1 + paddw mm0,mm2 + paddw mm1,mm3 + movq [edi],mm0 + movq [edi+8],mm1 + add esi,16 + add edi,16 + dec ecx + jnz .CopyLoop_hi_av +.Copying3_hi_end: + inc eax + inc ebx + add edi,edx + add esi,64 + cmp ax,239 + jne .Copying3_hi_setup +.Copying3_done: + xor eax,eax + mov ecx,128 + rep stosd + mov esi, [blur_buffer] + or esi,esi + jz near .no_blur + mov edi, [SurfBufD] + mov ebx, [blur_temp] + add esi,256*240*2 + add edi,256*240*2 + add ebx,256*240*2 + mov ecx,-(256*60) + movq mm4, [HalfTransC] + movq mm5, [HalfTransB] +.blur_loop: + movq mm0, [esi+ecx*8] + movq mm1, [ebx+ecx*8] + movq mm2,mm0 + movq mm3,mm0 + pand mm0,mm4 + pand mm2,mm5 + psrlw mm0,1 + paddw mm0,mm2 + movq mm2,mm0 + pand mm0,mm4 + pand mm2,mm5 + psrlw mm0,1 + paddw mm0,mm2 + psubw mm3,mm0 + movq mm0,mm1 + pand mm0,mm4 + pand mm1,mm5 + psrlw mm0,1 + paddw mm0,mm1 + movq mm1,mm0 + pand mm0,mm4 + pand mm1,mm5 + psrlw mm0,1 + paddw mm0,mm1 + paddw mm0,mm3 + movq [esi+ecx*8],mm0 + movq [esi+ecx*8],mm0 + inc ecx + jnz .blur_loop +.no_blur: + emms + ret NEWSYM DrawWin256x224x32 pushad @@ -180,8 +315,6 @@ NEWSYM DrawWin256x224x32 emms ret -EXTSYM blur_buffer,blur_temp,coef - NEWSYM DrawWin256x224x32MB pushad mov ax,ds diff --git a/zsnes/src/win/winlink.cpp b/zsnes/src/win/winlink.cpp index 9ed209ae..0e381418 100644 --- a/zsnes/src/win/winlink.cpp +++ b/zsnes/src/win/winlink.cpp @@ -2051,6 +2051,7 @@ void clearwin() } extern void DrawWin256x224x16(); +extern void DrawWin256x224x16MB(); extern void DrawWin256x224x32(); extern void DrawWin256x224x32MB(); extern void DrawWin320x240x16(); @@ -2115,7 +2116,8 @@ void drawscreenwin(void) { case 16: { - DrawWin256x224x16(); + if (MotionBlur == 1) DrawWin256x224x16MB(); + else DrawWin256x224x16(); break; } case 32: