Date: Mon, 10 Nov 1997 10:49:35 GMT
From: Jesper Skov <jskov@cygnus.co.uk>
To: linux-m68k@lists.linux-m68k.org
Subject: L68K: Video replacement code
Sender: owner-linux-m68k@phil.uni-sb.de

Hi

I've rewritten the m68k assembler code in the video driver in C (guess
why :). Please have a look and verify that I didn't do something
stupid.

Diff relative to 2.1.61.

Thanks
JEsper

--- amifb.c.dist	Sun Nov  9 11:25:39 1997
+++ amifb.c	Sun Nov  9 11:36:23 1997
@@ -3041,7 +3041,11 @@
 {
 	struct amiga_fb_par *par = &currentpar;
 	register u_short *lspr, *sspr;
+#ifdef __mc68000__
 	register u_long datawords asm ("d2");
+#else
+	register u_long datawords;
+#endif
 	register short delta;
 	register u_char color;
 	short height, width, bits, words;
@@ -3068,14 +3072,24 @@
 		for (width = (short)var->width-1; width >= 0; width--) {
 			if (bits == 0) {
 				bits = 16; --words;
+#ifdef __mc68000__
 				asm volatile ("movew %1@(%3:w:2),%0 ; swap %0 ; movew %1@+,%0"
 					: "=d" (datawords), "=a" (lspr) : "1" (lspr), "d" (delta));
+#else
+				datawords = (*(lspr+delta) << 16) | (*lspr++);
+#endif
 			}
 			--bits;
+#ifdef __mc68000__
 			asm volatile (
 				"clrb %0 ; swap %1 ; lslw #1,%1 ; roxlb #1,%0 ; "
 				"swap %1 ; lslw #1,%1 ; roxlb #1,%0"
 				: "=d" (color), "=d" (datawords) : "1" (datawords));
+#else
+			color = (((datawords >> 30) & 2) 
+				 | ((datawords >> 15) & 1));
+			datawords <<= 1;
+#endif
 			put_user(color, data++);
 		}
 		if (bits > 0) {
@@ -3083,8 +3097,17 @@
 		}
 		while (--words >= 0)
 			++lspr;
+#ifdef __mc68000__
 		asm volatile ("lea %0@(%4:w:2),%0 ; tstl %1 ; jeq 1f ; exg %0,%1\n1:"
 			: "=a" (lspr), "=a" (sspr) : "0" (lspr), "1" (sspr), "d" (delta));
+#else
+		lspr += delta;
+		if (sspr) {
+			u_short *tmp = lspr;
+			lspr = sspr;
+			sspr = tmp;
+		}
+#endif
 	}
 	return 0;
 }
@@ -3093,7 +3116,11 @@
 {
 	struct amiga_fb_par *par = &currentpar;
 	register u_short *lspr, *sspr;
+#ifdef __mc68000__
 	register u_long datawords asm ("d2");
+#else
+	register u_long datawords;
+#endif
 	register short delta;
 	u_short fmode;
 	short height, width, bits, words;
@@ -3136,29 +3163,60 @@
 			unsigned long tdata = 0;
 			get_user(tdata, (char *)data);
 			data++;
+#ifdef __mc68000__
 			asm volatile (
 				"lsrb #1,%2 ; roxlw #1,%0 ; swap %0 ; "
 				"lsrb #1,%2 ; roxlw #1,%0 ; swap %0"
 				: "=d" (datawords)
 				: "0" (datawords), "d" (tdata));
+#else
+			datawords = ((datawords << 1) & 0xfffefffe);
+			datawords |= tdata & 1;
+			datawords |= (tdata & 2) << (16-1);
+#endif
 			if (--bits == 0) {
 				bits = 16; --words;
+#ifdef __mc68000__
 				asm volatile ("swap %2 ; movew %2,%0@(%3:w:2) ; swap %2 ; movew %2,%0@+"
 					: "=a" (lspr) : "0" (lspr), "d" (datawords), "d" (delta));
+#else
+				*(lspr+delta) = (u_short) (datawords >> 16);
+				*lspr++ = (u_short) (datawords & 0xffff);
+#endif
 			}
 		}
 		if (bits < 16) {
 			--words;
+#ifdef __mc68000__
 			asm volatile (
 				"swap %2 ; lslw %4,%2 ; movew %2,%0@(%3:w:2) ; "
 				"swap %2 ; lslw %4,%2 ; movew %2,%0@+"
 				: "=a" (lspr) : "0" (lspr), "d" (datawords), "d" (delta), "d" (bits));
+#else
+			*(lspr+delta) = (u_short) (datawords >> (16+bits));
+			*lspr++ = (u_short) ((datawords & 0x0000ffff) >> bits);
+#endif
 		}
-		while (--words >= 0)
+		while (--words >= 0) {
+#ifdef __mc68000__
 			asm volatile ("moveql #0,%%d0 ; movew %%d0,%0@(%2:w:2) ; movew %%d0,%0@+"
 				: "=a" (lspr) : "0" (lspr), "d" (delta) : "d0");
+#else
+			*(lspr+delta) = 0;
+			*lspr++ = 0;
+#endif
+		}
+#ifdef __mc68000__
 		asm volatile ("lea %0@(%4:w:2),%0 ; tstl %1 ; jeq 1f ; exg %0,%1\n1:"
 			: "=a" (lspr), "=a" (sspr) : "0" (lspr), "1" (sspr), "d" (delta));
+#else
+		lspr += delta;
+		if (sspr) {
+			u_short *tmp = lspr;
+			lspr = sspr;
+			sspr = tmp;
+		}
+#endif
 	}
 	par->crsr.height = var->height;
 	par->crsr.width = var->width;
