diff --git a/zsnes/src/Makefile.in b/zsnes/src/Makefile.in index 91d525a1..f0f50275 100644 --- a/zsnes/src/Makefile.in +++ b/zsnes/src/Makefile.in @@ -41,7 +41,7 @@ VIDEOBJ=${VIDEODIR}/makev16b.o ${VIDEODIR}/makev16t.o ${VIDEODIR}/makevid.o\ ${VIDEODIR}/mode7ext.o ${VIDEODIR}/mv16tms.o ${VIDEODIR}/newg162.o\ ${VIDEODIR}/newgfx16.o ${VIDEODIR}/newgfx2.o ${VIDEODIR}/newgfx.o\ ${VIDEODIR}/m716text.o ${VIDEODIR}/2xsaiw.o\ - ${VIDEODIR}/procvid.o + ${VIDEODIR}/procvid.o ${VIDEODIR}/sw_draw.o WINOBJ=${WINDIR}/copyvwin.o ${WINDIR}/sdlintrf.o ${WINDIR}/sdllink.o \ @GL_DRAW@ ${WINDIR}/sw_draw.o \ diff --git a/zsnes/src/linux/sw_draw.c b/zsnes/src/linux/sw_draw.c index cecd22a9..440fd36b 100644 --- a/zsnes/src/linux/sw_draw.c +++ b/zsnes/src/linux/sw_draw.c @@ -101,16 +101,17 @@ static void UnlockSurface(void) extern DWORD AddEndBytes; extern DWORD NumBytesPerLine; extern unsigned char *WinVidMemStart; -extern unsigned char MMXSupport; extern unsigned char NGNoTransp; extern unsigned char newengen; extern unsigned short resolutn; extern void copy640x480x16bwin(void); +extern void ClearWin16 (void); +extern void DrawWin256x224x16(void); +extern void DrawWin320x240x16(void); -/* FIXME: Figure out how to make these locals */ -static DWORD ScreenPtr; -static DWORD SurfBufD; -static DWORD pitch; +DWORD ScreenPtr; +DWORD SurfBufD; +DWORD pitch; void sw_clearwin() { @@ -118,22 +119,7 @@ void sw_clearwin() SurfBufD = (DWORD) surface->pixels; LockSurface(); - __asm__ __volatile__ ( - " xorl %%eax, %%eax\n" \ - " xorl %%ebx, %%ebx\n" \ - "Blank2:\n" \ - " movl %1, %%ecx\n" \ - " rep\n" \ - " stosw\n" \ - " movl %1, %%edx\n" \ - " addl %0, %%edi\n" \ - " shll $1, %%edx\n" \ - " addl $1, %%ebx\n" \ - " subl %%edx, %%edi\n" \ - " cmpl %2, %%ebx\n" \ - " jne Blank2\n" \ - : : "g" (pitch), "g" (SurfaceX), "g" (SurfaceY), "D" (SurfBufD) - : "cc", "memory", "eax", "ebx", "edx", "ecx"); + ClearWin16(); UnlockSurface(); } @@ -165,144 +151,9 @@ void sw_drawwin() } if (SurfaceX == 256 && SurfaceY == 224) { - if (MMXSupport){ - __asm__ __volatile__ ( - " xorl %%eax, %%eax\n" \ - "Copying3:\n" \ - " movl $32, %%ecx\n" \ - "CopyLoop:\n" \ - " movq (%%esi), %%mm0\n" \ - " movq 8(%%esi), %%mm1\n" \ - " movq %%mm0, (%%edi)\n" \ - " movq %%mm1, 8(%%edi)\n" \ - " addl $16, %%esi\n" \ - " addl $16, %%edi\n" \ - " decl %%ecx\n" \ - " jnz CopyLoop\n" \ - " incl %%eax\n" \ - " addl %0, %%edi\n" \ - " subl $512, %%edi\n" \ - " addl $64, %%esi\n" \ - " cmpl $223, %%eax\n" \ - " jne Copying3\n" \ - - " xorl %%eax, %%eax\n" \ - " movl $128, %%ecx\n" \ - " rep\n" \ - " stosl\n" \ - " emms\n" \ - : : "g" (pitch), "S" (ScreenPtr), "D" (SurfBufD) : "cc", "memory", "eax", "ecx"); - } else { - __asm__ __volatile__ ( - " xorl %%eax, %%eax\n" \ - "Copying:\n" \ - " movl $128, %%ecx\n" \ - " rep\n" \ - " movsl\n" \ - " incl %%eax\n" \ - " addl %0, %%edi\n" \ - " subl $512, %%edi\n" \ - " addl $64, %%esi\n" \ - " cmpl $223, %%eax\n" \ - " jne Copying\n" \ - " xorl %%eax, %%eax\n" \ - " movl $128, %%ecx\n" \ - " rep\n" \ - " stosl\n" \ - : : "g" (pitch), "S" (ScreenPtr), "D" (SurfBufD) - : "cc", "memory", "eax", "ecx"); - } + DrawWin256x224x16(); } else if (SurfaceX == 320 && SurfaceY == 240) { - if (MMXSupport) { - __asm__ __volatile__ ( - " xor %%eax, %%eax\n" \ - " xor %%ebx, %%ebx\n" \ - "Blank1MMX:\n" \ - " mov $160, %%ecx\n" \ - " rep\n" \ - " stosl\n" \ - " subl $160, %%edi\n" \ - " addl %0, %%edi\n" \ - " addl $1, %%ebx\n" \ - " cmpl $8, %%ebx\n" \ - " jne Blank1MMX\n" \ - " xor %%ebx, %%ebx\n" \ - " pxor %%mm0, %%mm0\n" \ - "Copying2MMX:\n" \ - " mov $4, %%ecx\n" \ - "MMXLoopA:\n" \ - " movq %%mm0, 0(%%edi)\n" \ - " movq %%mm0, 8(%%edi)\n" \ - " addl $16, %%edi\n" \ - " dec %%ecx\n" \ - " jnz MMXLoopA\n" \ - " mov $32, %%ecx\n" \ - "MMXLoopB:\n" \ - " movq 0(%%esi), %%mm1\n" \ - " movq 8(%%esi), %%mm2\n" \ - " movq %%mm1, 0(%%edi)\n" \ - " movq %%mm2, 8(%%edi)\n" \ - " addl $16, %%esi\n" \ - " addl $16, %%edi\n" \ - " decl %%ecx\n" \ - " jnz MMXLoopB\n" \ - " mov $4, %%ecx\n" \ - "MMXLoopC:\n" \ - " movq %%mm0, 0(%%edi)\n" \ - " movq %%mm0, 8(%%edi)\n" \ - " addl $16, %%edi\n" \ - " decl %%ecx\n" \ - " jnz MMXLoopC\n" \ - " incl %%ebx\n" \ - " addl %0, %%edi\n" \ - " subl $640, %%edi\n" \ - " addl $64, %%esi\n" \ - " cmpl $223, %%ebx\n" \ - " jne Copying2MMX\n" \ - - " movl $128, %%ecx\n" \ - " rep\n" \ - " stosl\n" \ - " emms\n" \ - : : "g" (pitch), "S" (ScreenPtr), "D" (SurfBufD) - : "cc", "memory", "eax", "ebx", "ecx"); - } else { - __asm__ __volatile__ ( - " xorl %%eax, %%eax\n" \ - " xorl %%ebx, %%ebx\n" \ - "Blank1:\n" \ - " movl $160, %%ecx\n" \ - " rep\n" \ - " stosl\n" \ - " subl $640, %%edi\n" \ - " addl %0, %%edi\n" \ - " addl $1, %%ebx\n" \ - " cmpl $8, %%ebx\n" \ - "jne Blank1\n" \ - " xor %%ebx, %%ebx\n" \ - "Copying2:\n" \ - " movl $16, %%ecx\n" \ - " rep\n" \ - " stosl\n" \ - " movl $128, %%ecx\n" \ - " rep\n" \ - " movsl\n" \ - " movl $16, %%ecx\n" \ - " rep\n" \ - " stosl\n" \ - " incl %%ebx\n" \ - " addl %0, %%edi\n" \ - " subl $640, %%edi\n" \ - " addl $64, %%esi\n" \ - " cmpl $223, %%ebx\n" \ - " jne Copying2\n" \ - - " movl $128, %%ecx\n" \ - " rep\n" \ - " stosl\n" \ - : : "g" (pitch), "S" (ScreenPtr), "D" (SurfBufD) - : "cc", "memory", "eax", "ebx", "ecx"); - } + DrawWin320x240x16(); } else if(SurfaceX == 512 && SurfaceY == 448) { AddEndBytes = pitch-1024; NumBytesPerLine = pitch; diff --git a/zsnes/src/video/sw_draw.asm b/zsnes/src/video/sw_draw.asm new file mode 100644 index 00000000..82517b01 --- /dev/null +++ b/zsnes/src/video/sw_draw.asm @@ -0,0 +1,136 @@ +;Copyright (C) 1997-2001 ZSNES Team ( zsknight@zsnes.com / _demo_@zsnes.com ) +; +;This program is free software; you can redistribute it and/or +;modify it under the terms of the GNU General Public License +;as published by the Free Software Foundation; either +;version 2 of the License, or (at your option) any later +;version. +; +;This program is distributed in the hope that it will be useful, +;but WITHOUT ANY WARRANTY; without even the implied warranty of +;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;GNU General Public License for more details. +; +;You should have received a copy of the GNU General Public License +;along with this program; if not, write to the Free Software +;Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +; This file compiles to zero if not OpenBSD, thus it can be +; left in the Makefile. +%include "macros.mac" + +ALIGN 32 + +EXTSYM SurfaceX,SurfaceY +EXTSYM ScreenPtr,SurfBufD +EXTSYM pitch + +SECTION .text + +NEWSYM ClearWin16 + pushad + xor eax,eax + mov edi, [SurfBufD] + xor ebx,ebx +.Blank2: + mov ecx, [SurfaceX] + rep stosw + mov edx, [SurfaceX] + add edi, [pitch] + shl edx,1 + add ebx,1 + sub edi,edx + cmp ebx, [SurfaceY] + jne .Blank2 + popad + ret + +NEWSYM DrawWin256x224x16 + pushad + push es + mov ax,ds + mov es,ax + xor eax,eax + mov esi, [ScreenPtr] + mov edi, [SurfBufD] +.Copying3: + mov ecx,32 +.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 + add edi, [pitch] + sub edi,512 + add esi,64 + cmp eax,223 + jne .Copying3 + xor eax,eax + mov ecx,128 + rep stosd + pop es + emms + popad + ret + +NEWSYM DrawWin320x240x16 + pushad + push es + mov ax,ds + mov es,ax + xor eax,eax + xor ebx,ebx + mov esi, [ScreenPtr] + mov edi, [SurfBufD] +.Blank1MMX: + mov ecx,160 + rep stosd + sub edi,160 + add edi, [pitch] + add ebx,1 + cmp ebx,8 + jne .Blank1MMX + xor ebx,ebx + pxor mm0,mm0 +.Copying2MMX: + mov ecx,4 +.MMXLoopA: + movq [edi+0],mm0 + movq [edi+8],mm0 + add edi,16 + dec ecx + jnz .MMXLoopA + mov ecx,32 +.MMXLoopB: + movq mm1,[esi+0] + movq mm2,[esi+8] + movq [edi+0],mm1 + movq [edi+8],mm2 + add esi,16 + add edi,16 + dec ecx + jnz .MMXLoopB + mov ecx,4 +.MMXLoopC: + movq [edi+0],mm0 + movq [edi+8],mm0 + add edi,16 + dec ecx + jnz .MMXLoopC + inc ebx + add edi, [pitch] + sub edi,640 + add esi,64 + cmp ebx,223 + jne .Copying2MMX + mov ecx,128 + rep stosd + pop es + emms + popad + ret