From a8a21b39436af0944ac9735d8dd87ed727848ff7 Mon Sep 17 00:00:00 2001 From: pagefault <> Date: Sun, 23 Feb 2003 16:02:05 +0000 Subject: [PATCH] Finished moving video code to ASM --- zsnes/src/video/sw_draw.asm | 98 ++++++++++++++++++++++-- zsnes/src/win/winlink.cpp | 145 +++--------------------------------- 2 files changed, 101 insertions(+), 142 deletions(-) diff --git a/zsnes/src/video/sw_draw.asm b/zsnes/src/video/sw_draw.asm index f5cde9a4..42a9e782 100644 --- a/zsnes/src/video/sw_draw.asm +++ b/zsnes/src/video/sw_draw.asm @@ -24,6 +24,9 @@ ALIGN 32 EXTSYM SurfaceX,SurfaceY EXTSYM ScreenPtr,SurfBufD EXTSYM pitch,MMXSupport,resolutn +%ifdef __WIN32__ +EXTSYM BitConv32Ptr +%endif SECTION .text @@ -46,7 +49,7 @@ NEWSYM ClearWin16 ret NEWSYM ClearWin32 - push es + pushad mov ax,ds mov es,ax xor eax,eax @@ -64,13 +67,13 @@ NEWSYM ClearWin32 add ebx,1 cmp ebx, [SurfaceY] jne .Blank3 - pop es + popad ret NEWSYM DrawWin256x224x16 pushad - cmp byte[MMXSupport],0 - je .nommx + cmp byte [MMXSupport],0 + je .noMMX mov esi, [ScreenPtr] mov edi, [SurfBufD] xor eax,eax @@ -101,7 +104,7 @@ NEWSYM DrawWin256x224x16 emms popad ret -.nommx +.noMMX: mov ax,ds mov es,ax xor eax,eax @@ -122,15 +125,52 @@ NEWSYM DrawWin256x224x16 %else cmp eax,223 %endif - jne .Copying + jne .Copying xor eax,edx mov ecx,128 rep stosd popad ret +NEWSYM DrawWin256x224x32 + pushad + mov ax,ds + mov es,ax + xor eax,eax + mov ebx, [BitConv32Ptr] + mov esi, [ScreenPtr] + mov edi, [SurfBufD] +.Copying32b: + mov ecx,256 + push eax + xor eax,eax +.CopyLoop32b: + mov ax,[esi] + add esi,2 + mov edx,[ebx+eax*4] + mov [edi],edx + add edi,4 + dec ecx + jnz .CopyLoop32b + pop eax + inc eax + add edi, [pitch] + sub edi,1024 + sub esi,512 + add esi,576 +%ifdef __WIN32__ + cmp eax,239 +%else + cmp eax,223 +%endif + jne .Copying32b + popad + ret + NEWSYM DrawWin320x240x16 pushad + cmp byte [MMXSupport],0 + je near .noMMX xor eax,eax xor ebx,ebx mov esi, [ScreenPtr] @@ -174,10 +214,54 @@ NEWSYM DrawWin320x240x16 add edi, [pitch] sub edi,640 add esi,64 - cmp ebx,223 +%ifdef __WIN32__ + cmp eax,239 +%else + cmp eax,223 +%endif jne .Copying2MMX mov ecx,128 rep stosd emms popad ret +.noMMX: + mov ax,ds + mov es,ax + xor eax,eax + xor ebx,ebx + mov esi, [ScreenPtr] + mov edi, [SurfBufD] + movsx edx, word[resolutn] + sub edx,2 +.Blank1: + xor eax,eax + mov ecx,160 + rep stosd + sub edi,640 + add edi, [pitch] + add ebx,1 + cmp ebx,8 + jne .Blank1 + xor ebx,ebx +.Copying2: + xor eax,eax + mov ecx,16 + rep stosd + mov ecx,128 + rep movsd + xor eax,eax + mov ecx,16 + rep stosd + inc ebx + add edi, [pitch] + sub edi,640 + sub esi,512 + add esi,576 + cmp ebx,edx + jne .Copying2 + xor eax,eax + mov ecx,128 + rep stosd + popad + ret diff --git a/zsnes/src/win/winlink.cpp b/zsnes/src/win/winlink.cpp index a10f92fb..44905575 100644 --- a/zsnes/src/win/winlink.cpp +++ b/zsnes/src/win/winlink.cpp @@ -2044,6 +2044,7 @@ void clearwin() extern void DrawWin256x224x16(); extern void DrawWin256x224x32(); +extern void DrawWin320x240x16(); void drawscreenwin(void) { @@ -2098,40 +2099,14 @@ void drawscreenwin(void) { case 16: { - DrawWin256x224x16(); - } + DrawWin256x224x16(); break; + } case 32: - _asm { - push es - mov ax,ds - mov es,ax - xor eax,eax - mov ebx,BitConv32Ptr - mov esi,ScreenPtr - mov edi,SurfBufD - Copying32b: - mov ecx,256 - push eax - xor eax,eax - CopyLoop32b: - mov ax,[esi] - add esi,2 - mov edx,[ebx+eax*4] - mov [edi],edx - add edi,4 - dec ecx - jnz CopyLoop32b - pop eax - inc eax - add edi,pitch - sub edi,1024 - sub esi,512 - add esi,576 - cmp eax,239 - jne Copying32b - pop es - } + { + DrawWin256x224x32(); + break; + } SURFDW=(DWORD *) &SurfBuf[(resolutn-1)*pitch]; color32=0x7F000000; @@ -2172,110 +2147,10 @@ void drawscreenwin(void) switch (BitDepth) { case 16: - if (MMXSupport == 1) { - _asm { - push es - mov ax,ds - mov es,ax - xor eax,eax - xor ebx,ebx - mov esi,ScreenPtr - mov edi,SurfBufD - movsx edx,resolutn - sub edx,2 - Blank1MMX: - xor eax,eax - mov ecx,160 - rep stosd - sub edi,640 - add edi,pitch - add ebx,1 - cmp ebx,8 - jne Blank1MMX - xor ebx,ebx - pxor mm0,mm0 - Copying2MMX: - mov ecx,4 - MMXLoopA: - movq [edi],mm0 - movq [edi+8],mm0 - add edi,16 - dec ecx - jnz MMXLoopA - mov ecx,32 - MMXLoopB: - movq mm1,[esi] - movq mm2,[esi+8] - movq [edi],mm1 - movq [edi+8],mm2 - add esi,16 - add edi,16 - dec ecx - jnz MMXLoopB - mov ecx,4 - MMXLoopC: - movq [edi],mm0 - movq [edi+8],mm0 - add edi,16 - dec ecx - jnz MMXLoopC - inc ebx - add edi,pitch - sub edi,640 - sub esi,512 - add esi,576 - cmp ebx,edx - jne Copying2MMX - xor eax,eax - mov ecx,128 - rep stosd - pop es - emms - } - } else { - _asm { - push es - mov ax,ds - mov es,ax - xor eax,eax - xor ebx,ebx - mov esi,ScreenPtr - mov edi,SurfBufD - movsx edx,resolutn - sub edx,2 - Blank1: - xor eax,eax - mov ecx,160 - rep stosd - sub edi,640 - add edi,pitch - add ebx,1 - cmp ebx,8 - jne Blank1 - xor ebx,ebx - Copying2: - xor eax,eax - mov ecx,16 - rep stosd - mov ecx,128 - rep movsd - xor eax,eax - mov ecx,16 - rep stosd - inc ebx - add edi,pitch - sub edi,640 - sub esi,512 - add esi,576 - cmp ebx,edx - jne Copying2 - xor eax,eax - mov ecx,128 - rep stosd - pop es - } - } + { + DrawWin320x240x16(); break; + } case 32: for(j=0;j<8;j++) {