$OpenBSD: patch-src_linux_sw_draw_c,v 1.1.1.1 2002/03/04 00:58:00 naddy Exp $
--- src/linux/sw_draw.c.orig	Thu Sep 20 15:08:10 2001
+++ src/linux/sw_draw.c	Sun Mar  3 06:36:18 2002
@@ -67,7 +67,7 @@ BOOL sw_start(int width, int height, int
     // Grab mouse in fullscreen mode
     FullScreen ? SDL_WM_GrabInput(SDL_GRAB_ON) : SDL_WM_GrabInput(SDL_GRAB_OFF);
 
-    SDL_WM_SetCaption ("ZSNES Linux","ZSNES");
+    SDL_WM_SetCaption ("ZSNES","ZSNES");
     SDL_ShowCursor(0);
 
     BitDepth = surface->format->BitsPerPixel;
@@ -102,17 +102,23 @@ 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 ClearWin32(void);
+extern void DrawWin256x224x16(void);
+extern void DrawWin256x224x32(void);
+extern void DrawWin320x240x16(void);
+extern void DrawWin512x448x32(void);
+extern void DrawWin640x480x32(void);
 
 /* FIXME: Figure out how to make these locals */
-static DWORD ScreenPtr;
-static DWORD SurfBufD;
-static DWORD *SURFDW;
-static DWORD pitch;
+DWORD ScreenPtr;
+DWORD SurfBufD;
+DWORD *SURFDW;
+DWORD pitch;
 
 void sw_clearwin()
 {
@@ -122,41 +128,10 @@ void sw_clearwin()
     LockSurface();
     switch (BitDepth) {
 	case 16:
-	    __asm__ __volatile__ (
-	"	xorl %%eax, %%eax\n"				\
-	"	movl SurfBufD, %%edi\n"				\
-	"	xorl %%ebx, %%ebx\n"				\
-        "Blank2:\n"						\
-	"	movl SurfaceX, %%ecx\n"				\
-	"	rep\n"						\
-	"	stosw\n"					\
-	"	movl SurfaceX, %%edx\n"				\
-	"	addl pitch, %%edi\n"				\
-	"	shll $1, %%edx\n"				\
-	"	addl $1, %%ebx\n"				\
-	"	subl %%edx, %%edi\n"				\
-	"	cmpl SurfaceY, %%ebx\n"				\
-	"	jne Blank2\n"					\
-	: : : "cc", "memory", "eax", "ebx", "edx", "ecx", "edi");
+	    ClearWin16();
 	    break;
 	case 32:
-	    __asm__ __volatile__ (
-	"	xorl %%eax, %%eax\n"				\
-	"	movl SurfBufD, %%edi\n"				\
-	"	xorl %%ebx, %%ebx\n"				\
-	"Blank3:\n"						\
-	"	movl SurfaceX, %%ecx\n"				\
-	"	rep\n"						\
-	"	stosl\n"					\
-	"	addl pitch, %%edi\n"				\
-	"	subl SurfaceX, %%edi\n"				\
-	"	subl SurfaceX, %%edi\n"				\
-	"	subl SurfaceX, %%edi\n"				\
-	"	subl SurfaceX, %%edi\n"				\
-	"	addl $1, %%ebx\n"				\
-	"	cmpl SurfaceY, %%ebx\n"				\
-	"	jne Blank3\n"					\
-	: : : "cc", "memory", "eax", "ebx", "ecx","edi");
+	    ClearWin32();
 	    break;
     }
     UnlockSurface();
@@ -196,97 +171,11 @@ void sw_drawwin()
     if (SurfaceX == 256 && SurfaceY == 224) {
 	switch(BitDepth) {
 	    case 16:
-		if (MMXSupport){
-		    __asm__ __volatile__ (
-		"	pushw %%es\n"					\
-		"	movw %%ds, %%ax\n"				\
-		"	movw %%ax, %%es\n"				\
-		"	xorl %%eax, %%eax\n"				\
-		"	movl ScreenPtr, %%esi\n"			\
-		"	movl SurfBufD, %%edi\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 pitch, %%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"					\
-		"	popw %%es\n"					\
-		"	emms\n"						\
-		: : : "cc", "memory", "eax", "ebx", "ecx","edi", "esi");
-		} else {
-		    // Doesn't seem to work - DDOI
-		    __asm__ __volatile__ (
-		"	pushw %%es\n"					\
-		"	movw %%ds, %%ax\n"				\
-		"	movw %%ax, %%es\n"				\
-		"	xorl %%eax, %%eax\n"				\
-		"	movl ScreenPtr, %%esi\n"			\
-		"	movl SurfBufD, %%edi\n"				\
-		"Copying:\n"						\
-		"	movl $128, %%ecx\n"				\
-		"	rep\n"						\
-		"	movsl\n"					\
-		"	incl %%eax\n"					\
-		"	addl pitch, %%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"					\
-		"	popw %%es\n"					\
-		: : : "cc", "memory", "eax", "ebx", "ecx","edi", "esi");
-		}
+		DrawWin256x224x16();
 		break;
 
 	    case 32:
-		__asm__ __volatile__ (
-		"	pushw %%es\n"					\
-		"	movw %%ds, %%ax\n"				\
-		"	movw %%ax, %%es\n"				\
-		"	xorl %%eax, %%eax\n"				\
-		"	movl BitConv32Ptr, %%ebx\n"			\
-		"	movl ScreenPtr, %%esi\n"			\
-		"	movl SurfBufD, %%edi\n"				\
-		"Copying32b:\n"						\
-		"	movl $256, %%ecx\n"				\
-		"	pushl %%eax\n"					\
-		"	xorl %%eax, %%eax\n"				\
-		"CopyLoop32b:\n"					\
-		"	movw (%%esi), %%ax\n"				\
-		"	addl $2, %%esi\n"				\
-		"	movl (%%ebx, %%eax, 4), %%edx\n"		\
-		"	movl %%edx, (%%edi)\n"				\
-		"	addl $4, %%edi\n"				\
-		"	decl %%ecx\n"					\
-		"	jnz CopyLoop32b\n"				\
-		"	popl %%eax\n"					\
-		"	incl %%eax\n"					\
-		"	addl pitch, %%edi\n"				\
-		"	subl $1024, %%edi\n"				\
-		"	addl $64, %%esi\n"				\
-		"	cmpl $223, %%eax\n"				\
-		"	jne Copying32b\n"				\
-		"	popw %%es\n"					\
-		: : : "cc", "memory", "eax", "ebx", "ecx","edi", "esi");
+	    	DrawWin256x224x32();
 		SURFDW = (DWORD *) SurfBufD + 222*pitch;
 		color32 = 0x7F000000;
 	
@@ -329,108 +218,7 @@ void sw_drawwin()
     } else if (SurfaceX == 320 && SurfaceY == 240) {
 	switch(BitDepth) {
 	    case 16:
-		if (MMXSupport) {
-		    __asm__ __volatile__ (
-		"	pushw %%es\n"					\
-		"	movw %%ds, %%ax\n"				\
-		"	movw %%ax, %%es\n"				\
-		"	xor %%eax, %%eax\n"				\
-		"	xor %%ebx, %%ebx\n"				\
-		"	movl ScreenPtr, %%esi\n"			\
-		"	movl SurfBufD, %%edi\n"				\
-		"Blank1MMX:\n"						\
-		"	mov $160, %%ecx\n"				\
-		"	rep\n"						\
-		"	stosl\n"					\
-		"	subl $160, %%edi\n"				\
-		"	addl pitch, %%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 pitch, %%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"					\
-		"	pop %%es\n"					\
-		"	emms\n"						\
-		: : : "cc", "memory", "eax", "ebx", "ecx","edi", "esi");
-
-		} else {
-		    __asm__ __volatile__ (
-		"	push %%es\n"					\
-		"	movw %%ds, %%ax\n"				\
-		"	movw %%ax, %%es\n"				\
-		"	xorl %%eax, %%eax\n"				\
-		"	xorl %%ebx, %%ebx\n"				\
-		"	movl ScreenPtr, %%esi\n"			\
-		"	movl SurfBufD, %%edi\n"				\
-		"Blank1:\n"						\
-		"	movl $160, %%ecx\n"				\
-		"	rep\n"						\
-		"	stosl\n"					\
-		"	subl $640, %%edi\n"				\
-		"	addl pitch, %%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 pitch, %%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"					\
-		"	pop %%es\n"					\
-		: : : "cc", "memory", "eax", "ebx", "ecx","edi", "esi");
-
-		}
+		DrawWin320x240x16();
 		break;
 
 	    case 32:
@@ -505,40 +293,7 @@ void sw_drawwin()
 		break;
 
 	    case 32:
-		__asm__ __volatile__ (
-		"	pushw %%es\n"					\
-		"	movw %%ds, %%ax\n"				\
-		"	movw %%ax, %%es\n"				\
-		"	xorl %%eax, %%eax\n"				\
-		"	movl BitConv32Ptr, %%ebx\n"			\
-		"	movl ScreenPtr, %%esi\n"			\
-		"	movl SurfBufD, %%edi\n"				\
-		"Copying32c:\n"						\
-		"	movl $256, %%ecx\n"				\
-		"	pushl %%eax\n"					\
-		"	xorl %%eax, %%eax\n"				\
-		"CopyLoop32c:\n"					\
-		"	movw (%%esi), %%ax\n"				\
-		"	addl $2, %%esi\n"				\
-		"	movl (%%ebx, %%eax, 4), %%edx\n"		\
-		"	movl %%edx, (%%edi)\n"				\
-		"	movl %%edx, 4(%%edi)\n"				\
-		"	addl $8, %%edi\n"				\
-		"	loop CopyLoop32c\n"				\
-		"	pushl %%esi\n"					\
-		"	movl %%edi, %%esi\n"				\
-		"	subl pitch, %%esi\n"				\
-		"	movl $512, %%ecx\n"				\
-		"	rep\n"						\
-		"	movsl\n"					\
-		"	popl %%esi\n"					\
-		"	popl %%eax\n"					\
-		"	incl %%eax\n"					\
-		"	addl $64, %%esi\n"				\
-		"	cmpl $223, %%eax\n"				\
-		"	jne Copying32c\n"				\
-		"	popw %%es\n"					\
-		: : : "cc", "memory","eax","ebx","ecx","edx","edi","esi");
+	    	DrawWin512x448x32();
 		break;
 		/*
 		  addl pitch, %%edi
@@ -567,43 +322,7 @@ void sw_drawwin()
 		break;
 
 	    case 32:
-		__asm__ __volatile__ (
-		"	pushw %%es\n"					\
-		"	movw %%ds, %%ax\n"				\
-		"	movw %%ax, %%es\n"				\
-		"	xorl %%eax, %%eax\n"				\
-		"	movl BitConv32Ptr, %%ebx\n"			\
-		"	movl ScreenPtr, %%esi\n"			\
-		"	movl SurfBufD, %%edi\n"				\
-		"	addl $20608, %%edi\n"				\
-		"Copying32d:\n"						\
-		"	movl $256, %%ecx\n"				\
-		"	pushl %%eax\n"					\
-		"	xorl %%eax, %%eax\n"				\
-		"CopyLoop32d:\n"					\
-		"	movw (%%esi), %%ax\n"				\
-		"	addl $2, %%esi\n"				\
-		"	movl (%%ebx, %%eax, 4), %%edx\n"		\
-		"	movl %%edx, (%%edi)\n"				\
-		"	movl %%edx, 4(%%edi)\n"				\
-		"	addl $8, %%edi\n"				\
-		"	loop CopyLoop32d\n"				\
-		"	addl $512, %%edi\n"				\
-		"	pushl %%esi\n"					\
-		"	movl %%edi, %%esi\n"				\
-		"	subl pitch, %%esi\n"				\
-		"	movl $512, %%ecx\n"				\
-		"	rep\n"						\
-		"	movsl\n"					\
-		"	popl %%esi\n"					\
-		"	popl %%eax\n"					\
-		"	incl %%eax\n"					\
-		"	addl $512, %%edi\n"				\
-		"	addl $64, %%esi\n"				\
-		"	cmpl $223, %%eax\n"				\
-		"	jne Copying32d\n"				\
-		"	popw %%es\n"					\
-		: : : "cc", "memory","eax","ebx","ecx","edx","edi","esi");
+	    	DrawWin640x480x32();
 		break;
 		/*
 		  addl pitch, %%edi
