⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 2xsaimmx.asm

📁 著名SFC模拟器Snes9x的源代码。
💻 ASM
📖 第 1 页 / 共 4 页
字号:
;/*---------------------------------------------------------------------*; * The following (piece of) code, (part of) the 2xSaI engine,          *; * copyright (c) 1999 - 2001 by Derek Liauw Kie Fa.                    *; * Non-Commercial use of this software is allowed and is encouraged,   *; * provided that appropriate credit be given.							*; * You may freely modify this code, but I request                      *; * that any improvements to the engine be submitted to me, so          *; * that I can implement these improvements in newer versions of        *; * the software.                                                       *; * If you need more information, have any comments or suggestions,     *; * you can e-mail me. My e-mail: derek-liauw@usa.net.                  *; *---------------------------------------------------------------------*/;----------------------; 2xSaI version 0.59 WIP, soon to become version 0.60;----------------------;%define FAR_POINTER	  BITS 32%ifdef __DJGPP__          GLOBAL __2xSaILine          GLOBAL __2xSaISuperEagleLine		  GLOBAL __2xSaISuper2xSaILine	  GLOBAL _Init_2xSaIMMX%else          GLOBAL _2xSaILine          GLOBAL _2xSaISuperEagleLine		  GLOBAL _2xSaISuper2xSaILine	  GLOBAL Init_2xSaIMMX%endif	  SECTION .text ALIGN = 32%ifdef FAR_POINTER;EXTERN_C void _2xSaILine (uint8 *srcPtr, uint32 srcPitch, uint32 width,;                        uint8 *dstPtr, uint32 dstPitch, uint16 dstSegment);%else;EXTERN_C void _2xSaILine (uint8 *srcPtr, uint32 srcPitch, uint32 width,;                        uint8 *dstPtr, uint32 dstPitch);%endifsrcPtr        equ 8deltaPtr      equ 12srcPitch      equ 16width         equ 20dstOffset     equ 24dstPitch      equ 28dstSegment    equ 32colorB0   equ -2colorB1   equ 0colorB2   equ 2colorB3   equ 4color7   equ -2color8   equ 0color9   equ 2color4   equ -2color5   equ 0color6   equ 2colorS2   equ 4color1   equ -2color2   equ 0color3   equ 2colorS1   equ 4colorA0   equ -2colorA1   equ 0colorA2   equ 2colorA3   equ 4%ifdef __DJGPP____2xSaISuper2xSaILine:%else_2xSaISuper2xSaILine:%endif; Store some stuff	 push ebp	 mov ebp, esp         pushad; Prepare the destination%ifdef FAR_POINTER         ; Set the selector         mov eax, [ebp+dstSegment]         mov fs, ax%endif         mov edx, [ebp+dstOffset]         ; edx points to the screen; Prepare the source         ; eax points to colorA         mov eax, [ebp+srcPtr]				;eax points to colorA         mov ebx, [ebp+srcPitch]			;ebx contains the source pitch         mov ecx, [ebp+width]				;ecx contains the number of pixels to process         ; eax now points to colorB1         sub eax, ebx						;eax points to B1 which is the base ; Main Loop.Loop:   push ecx         ;-----Check Delta------------------         mov ecx, [ebp+deltaPtr]		;load source img         movq mm0, [eax+colorB0]         movq mm1, [eax+colorB3]         movq mm2, [eax+ebx+color4]         movq mm3, [eax+ebx+colorS2]         movq mm4, [eax+ebx+ebx+color1]         movq mm5, [eax+ebx+ebx+colorS1]         push eax         add eax, ebx         movq mm6, [eax+ebx+ebx+colorA0]         movq mm7, [eax+ebx+ebx+colorA3]         pop eax		;compare to delta         pcmpeqw mm0, [ecx+2+colorB0]         pcmpeqw mm1, [ecx+2+colorB3]         pcmpeqw mm2, [ecx+ebx+2+color4]         pcmpeqw mm3, [ecx+ebx+2+colorS2]         pcmpeqw mm4, [ecx+ebx+ebx+2+color1]         pcmpeqw mm5, [ecx+ebx+ebx+2+colorS1]         add ecx, ebx         pcmpeqw mm6, [ecx+ebx+ebx+2+colorA0]         pcmpeqw mm7, [ecx+ebx+ebx+2+colorA3]         sub ecx, ebx		;compose results         pand mm0, mm1         pand mm2, mm3         pand mm4, mm5         pand mm6, mm7         pand mm0, mm2         pand mm4, mm6         pxor mm7, mm7         pand mm0, mm4         movq mm6, [eax+colorB0]         pcmpeqw mm7, mm0			;did any compare give us a zero ?         movq [ecx+2+colorB0], mm6         packsswb mm7, mm7         movd ecx, mm7         test ecx, ecx				         jz near .SKIP_PROCESS		;no, so we can skip         ;End Delta         ;---------------------------------         movq mm0, [eax+ebx+color5]         movq mm1, [eax+ebx+color6]         movq mm2, mm0         movq mm3, mm1         movq mm4, mm0         movq mm5, mm1         pand mm0, [colorMask]         pand mm1, [colorMask]         psrlw mm0, 1         psrlw mm1, 1         pand mm3, [lowPixelMask]         paddw mm0, mm1         pand mm3, mm2         paddw mm0, mm3                ;mm0 contains the interpolated values         movq [I56Pixel], mm0         movq mm7, mm0         ;-------------------         movq mm0, mm7         movq mm1, mm4  ;5,5,5,6         movq mm2, mm0         movq mm3, mm1         pand mm0, [colorMask]         pand mm1, [colorMask]         psrlw mm0, 1         psrlw mm1, 1         pand mm3, [lowPixelMask]         paddw mm0, mm1         pand mm3, mm2         paddw mm0, mm3                ;mm0 contains the interpolated values         movq [I5556Pixel], mm0         ;--------------------         movq mm0, mm7         movq mm1, mm5  ;6,6,6,5         movq mm2, mm0         movq mm3, mm1         pand mm0, [colorMask]         pand mm1, [colorMask]         psrlw mm0, 1         psrlw mm1, 1         pand mm3, [lowPixelMask]         paddw mm0, mm1         pand mm3, mm2         paddw mm0, mm3         movq [I5666Pixel], mm0         ;-------------------------         ;-------------------------         movq mm0, [eax+ebx+ebx+color2]         movq mm1, [eax+ebx+ebx+color3]         movq mm2, mm0         movq mm3, mm1         movq mm4, mm0         movq mm5, mm1         pand mm0, [colorMask]         pand mm1, [colorMask]         psrlw mm0, 1         psrlw mm1, 1         pand mm3, [lowPixelMask]         paddw mm0, mm1         pand mm3, mm2         paddw mm0, mm3         movq [I23Pixel], mm0         movq mm7, mm0         ;---------------------         movq mm0, mm7         movq mm1, mm4  ;2,2,2,3         movq mm2, mm0         movq mm3, mm1         pand mm0, [colorMask]         pand mm1, [colorMask]         psrlw mm0, 1         psrlw mm1, 1         pand mm3, [lowPixelMask]         paddw mm0, mm1         pand mm3, mm2         paddw mm0, mm3         movq [I2223Pixel], mm0         ;----------------------         movq mm0, mm7         movq mm1, mm5  ;3,3,3,2         movq mm2, mm0         movq mm3, mm1         pand mm0, [colorMask]         pand mm1, [colorMask]         psrlw mm0, 1         psrlw mm1, 1         pand mm3, [lowPixelMask]         paddw mm0, mm1         pand mm3, mm2         paddw mm0, mm3         movq [I2333Pixel], mm0         ;--------------------;////////////////////////////////; Decide which "branch" to take;--------------------------------         movq mm0, [eax+ebx+color5]         movq mm1, [eax+ebx+color6]         movq mm6, mm0         movq mm7, mm1         pcmpeqw mm0, [eax+ebx+ebx+color3]         pcmpeqw mm1, [eax+ebx+ebx+color2]         pcmpeqw mm6, mm7         movq mm2, mm0         movq mm3, mm0         pand mm0, mm1       ;colorA == colorD && colorB == colorC         pxor mm7, mm7         pcmpeqw mm2, mm7         pand mm6, mm0         pand mm2, mm1       ;colorA != colorD && colorB == colorC         pcmpeqw mm1, mm7         pand mm1, mm3       ;colorA == colorD && colorB != colorC         pxor mm0, mm6         por mm1, mm6         movq mm7, mm0         movq [Mask26], mm2         packsswb mm7, mm7         movq [Mask35], mm1         movd ecx, mm7         test ecx, ecx         jz near .SKIP_GUESS;---------------------------------------------         movq mm6, mm0         movq mm4, [eax+ebx+colorA]         movq mm5, [eax+ebx+colorB]         pxor mm7, mm7         pand mm6, [ONE]         movq mm0, [eax+colorE]         movq mm1, [eax+ebx+colorG]         movq mm2, mm0         movq mm3, mm1         pcmpeqw mm0, mm4         pcmpeqw mm1, mm4         pcmpeqw mm2, mm5         pcmpeqw mm3, mm5         pand mm0, mm6         pand mm1, mm6         pand mm2, mm6         pand mm3, mm6         paddw mm0, mm1         paddw mm2, mm3         pxor mm3, mm3         pcmpgtw mm0, mm6         pcmpgtw mm2, mm6         pcmpeqw mm0, mm3         pcmpeqw mm2, mm3         pand mm0, mm6         pand mm2, mm6         paddw mm7, mm0         psubw mm7, mm2         movq mm0, [eax+colorF]         movq mm1, [eax+ebx+colorK]         movq mm2, mm0         movq mm3, mm1         pcmpeqw mm0, mm4         pcmpeqw mm1, mm4         pcmpeqw mm2, mm5         pcmpeqw mm3, mm5         pand mm0, mm6         pand mm1, mm6         pand mm2, mm6         pand mm3, mm6         paddw mm0, mm1         paddw mm2, mm3         pxor mm3, mm3         pcmpgtw mm0, mm6         pcmpgtw mm2, mm6         pcmpeqw mm0, mm3         pcmpeqw mm2, mm3         pand mm0, mm6         pand mm2, mm6         paddw mm7, mm0         psubw mm7, mm2         push eax         add eax, ebx         movq mm0, [eax+ebx+colorH]         movq mm1, [eax+ebx+ebx+colorN]         movq mm2, mm0         movq mm3, mm1         pcmpeqw mm0, mm4         pcmpeqw mm1, mm4         pcmpeqw mm2, mm5         pcmpeqw mm3, mm5         pand mm0, mm6         pand mm1, mm6         pand mm2, mm6         pand mm3, mm6         paddw mm0, mm1         paddw mm2, mm3         pxor mm3, mm3         pcmpgtw mm0, mm6         pcmpgtw mm2, mm6         pcmpeqw mm0, mm3         pcmpeqw mm2, mm3         pand mm0, mm6         pand mm2, mm6         paddw mm7, mm0         psubw mm7, mm2         movq mm0, [eax+ebx+colorL]         movq mm1, [eax+ebx+ebx+colorO]         movq mm2, mm0         movq mm3, mm1         pcmpeqw mm0, mm4         pcmpeqw mm1, mm4         pcmpeqw mm2, mm5         pcmpeqw mm3, mm5         pand mm0, mm6         pand mm1, mm6         pand mm2, mm6         pand mm3, mm6         paddw mm0, mm1         paddw mm2, mm3         pxor mm3, mm3         pcmpgtw mm0, mm6         pcmpgtw mm2, mm6         pcmpeqw mm0, mm3         pcmpeqw mm2, mm3         pand mm0, mm6         pand mm2, mm6         paddw mm7, mm0         psubw mm7, mm2         pop eax         movq mm1, mm7         pxor mm0, mm0         pcmpgtw mm7, mm0         pcmpgtw mm0, mm1         por mm7, [Mask35]         por mm0, [Mask26]         movq [Mask35], mm7         movq [Mask26], mm0.SKIP_GUESS:         ;Start the ASSEMBLY !!!	eh... compose all the results together to form the final image...		          movq mm0, [eax+ebx+color5]         movq mm1, [eax+ebx+ebx+color2]         movq mm2, mm0         movq mm3, mm1         movq mm4, mm0         movq mm5, mm1         pand mm0, [colorMask]         pand mm1, [colorMask]         psrlw mm0, 1         psrlw mm1, 1         pand mm3, [lowPixelMask]         paddw mm0, mm1         pand mm3, mm2         paddw mm0, mm3                ;mm0 contains the interpolated values		 ;---------------------------%ifdef dfhsdfhsdahdsfhdsfh                if (color5 == color3 && color2 != color6 && color4 == color5 && color5 != colorA2)                   product2a = INTERPOLATE (color2, color5);                else                if (color5 == color1 && color6 == color5 && color4 != color2 && color5 != colorA0)                   product2a = INTERPOLATE(color2, color5);                else                   product2a = color2;                if (color2 == color6 && color5 != color3 && color1 == color2 && color2 != colorB2)                   product1a = INTERPOLATE (color2, color5);                else                if (color4 == color2 && color3 == color2 && color1 != color5 && color2 != colorB0)                   product1a = INTERPOLATE(color2, color5);                else                   product1a = color5;%endif		 movq mm7, [Mask26]		 movq mm6, [eax+colorB2]		 movq mm5, [eax+ebx+ebx+color2]		 movq mm4, [eax+ebx+ebx+color1]		 pcmpeqw mm4, mm5		 pcmpeqw mm6, mm5		 pxor mm5, mm5		 pand mm7, mm4		 pcmpeqw mm6, mm5		 pand mm7, mm6		 movq mm6, [eax+ebx+ebx+color3]		 movq mm5, [eax+ebx+ebx+color2]		 movq mm4, [eax+ebx+ebx+color1]		 movq mm2, [eax+ebx+color5]		 movq mm1, [eax+ebx+color4]		 movq mm3, [eax+colorB0]		 pcmpeqw mm2, mm4		 pcmpeqw mm6, mm5		 pcmpeqw mm1, mm5		 pcmpeqw mm3, mm5		 pxor mm5, mm5		 pcmpeqw mm2, mm5		 pcmpeqw mm3, mm5		 pand mm6, mm1		 pand mm2, mm3		 pand mm6, mm2		 por mm7, mm6		 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -