Add m68k assembly mixing routines
authorPatrice Mandin <patmandin@gmail.com>
Tue, 03 Jun 2003 19:35:10 +0000
changeset 633 873c2598f969
parent 632 85e104fe14c2
child 634 44d574ed4780
Add m68k assembly mixing routines
src/audio/Makefile.am
src/audio/SDL_mixer.c
src/audio/SDL_mixer_m68k.c
src/audio/SDL_mixer_m68k.h
--- a/src/audio/Makefile.am	Mon Jun 02 14:50:22 2003 +0000
+++ b/src/audio/Makefile.am	Tue Jun 03 19:35:10 2003 +0000
@@ -26,7 +26,9 @@
 	SDL_mixer_MMX.c         \
 	SDL_mixer_MMX.h		\
 	SDL_mixer_MMX_VC.c	\
-	SDL_mixer_MMX_VC.h
+	SDL_mixer_MMX_VC.h	\
+	SDL_mixer_m68k.c	\
+	SDL_mixer_m68k.h
 
 libaudio_la_SOURCES = $(COMMON_SRCS)
 libaudio_la_LIBADD = $(DRIVERS)
--- a/src/audio/SDL_mixer.c	Mon Jun 02 14:50:22 2003 +0000
+++ b/src/audio/SDL_mixer.c	Tue Jun 03 19:35:10 2003 +0000
@@ -37,6 +37,7 @@
 #include "SDL_sysaudio.h"
 #include "SDL_mixer_MMX.h"
 #include "SDL_mixer_MMX_VC.h"
+#include "SDL_mixer_m68k.h"
 
 /* Function to check the CPU flags */
 #define MMX_CPU		0x800000
@@ -135,6 +136,9 @@
 	switch (format) {
 
 		case AUDIO_U8: {
+#if defined(__M68000__) && defined(__GNUC__)
+			SDL_MixAudio_m68k_U8((char*)dst,(char*)src,(unsigned long)len,(long)volume,(char *)mix8);
+#else
 			Uint8 src_sample;
 
 			while ( len-- ) {
@@ -144,6 +148,7 @@
 				++dst;
 				++src;
 			}
+#endif
 		}
 		break;
 
@@ -162,6 +167,9 @@
 			}
 			else
 #endif
+#if defined(__M68000__) && defined(__GNUC__)
+			SDL_MixAudio_m68k_S8((char*)dst,(char*)src,(unsigned long)len,(long)volume);
+#else
 			{
 			Sint8 *dst8, *src8;
 			Sint8 src_sample;
@@ -187,6 +195,7 @@
 				++src8;
 			}
 			}
+#endif
 		}
 		break;
 
@@ -204,6 +213,9 @@
 			}
 			else
 #endif
+#if defined(__M68000__) && defined(__GNUC__)
+			SDL_MixAudio_m68k_S16LSB((short*)dst,(short*)src,(unsigned long)len,(long)volume);
+#else
 			{
 			Sint16 src1, src2;
 			int dst_sample;
@@ -229,10 +241,14 @@
 				dst += 2;
 			}
 			}
+#endif
 		}
 		break;
 
 		case AUDIO_S16MSB: {
+#if defined(__M68000__) && defined(__GNUC__)
+			SDL_MixAudio_m68k_S16MSB((short*)dst,(short*)src,(unsigned long)len,(long)volume);
+#else
 			Sint16 src1, src2;
 			int dst_sample;
 			const int max_audioval = ((1<<(16-1))-1);
@@ -256,6 +272,7 @@
 				dst[0] = dst_sample&0xFF;
 				dst += 2;
 			}
+#endif
 		}
 		break;
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/audio/SDL_mixer_m68k.c	Tue Jun 03 19:35:10 2003 +0000
@@ -0,0 +1,210 @@
+/*
+    SDL - Simple DirectMedia Layer
+    Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002  Sam Lantinga
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Library General Public
+    License as published by the Free Software Foundation; either
+    version 2 of the License, or (at your option) any later version.
+
+    This library 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
+    Library General Public License for more details.
+
+    You should have received a copy of the GNU Library General Public
+    License along with this library; if not, write to the Free
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+    Sam Lantinga
+    slouken@libsdl.org
+*/
+
+/*
+	m68k assembly mix routines
+
+	Patrice Mandin
+*/
+
+#if defined(__M68000__) && defined(__GNUC__)
+void SDL_MixAudio_m68k_U8(char* dst, char* src, long len, long volume, char* mix8)
+{
+    __asm__ __volatile__ (
+
+	"tstl	%2\n"
+"	beqs	stoploop_u8\n"
+"mixloop_u8:\n"
+
+	/* Mix a sample */
+
+"	moveq	#0,%%d0\n"
+"	moveq	#0,%%d1\n"
+
+"	moveb	%1@+,%%d0\n"	/* d0 = *src++ */
+"	sub	#128,%%d0\n"	/* d0 -= 128 */
+"	muls	%3,%%d0\n"	/* d0 *= volume (0<=volume<=128) */
+"	moveb	%0@,%%d1\n"	/* d1 = *dst */
+"	asr	#7,%%d0\n"	/* d0 /= 128 (SDL_MIX_MAXVOLUME) */
+"	add	#128,%%d0\n"	/* d0 += 128 */
+
+"	add	%%d1,%%d0\n"
+
+"	moveb	%4@(%%d0:w),%0@+\n"
+
+	/* Loop till done */
+
+"	subql	#1,%2\n"
+"	bhis	mixloop_u8\n"
+"stoploop_u8:\n"
+
+	 : /* no return value */
+	 : /* input */
+	 	"a"(dst), "a"(src), "d"(len), "d"(volume), "a"(mix8)	
+	 : /* clobbered registers */
+	 	"d0", "d1", "cc", "memory" 
+	 );
+}
+
+void SDL_MixAudio_m68k_S8(char* dst, char* src, long len, long volume)
+{
+    __asm__ __volatile__ (
+
+	"tstl	%2\n"
+"	beqs	stoploop_s8\n"
+"	moveq	#-128,%%d2\n"
+"	moveq	#127,%%d3\n"
+"mixloop_s8:\n"
+
+	/* Mix a sample */
+
+"	moveq	#0,%%d0\n"
+"	moveq	#0,%%d1\n"
+
+"	moveb	%1@+,%%d0\n"	/* d0 = *src++ */
+"	muls	%3,%%d0\n"	/* d0 *= volume (0<=volume<=128) */
+"	moveb	%0@,%%d1\n"	/* d1 = *dst */
+"	asr	#7,%%d0\n"	/* d0 /= 128 (SDL_MIX_MAXVOLUME) */
+
+"	add	%%d1,%%d0\n"
+
+"	cmp	%%d2,%%d0\n"
+"	bges	lower_limit_s8\n"
+"	move	%%d2,%%d0\n"
+"lower_limit_s8:\n"
+
+"	cmp	%%d3,%%d0\n"
+"	bles	upper_limit_s8\n"
+"	move	%%d3,%%d0\n"
+"upper_limit_s8:\n"
+"	moveb	%%d0,%0@+\n"
+
+	/* Loop till done */
+
+"	subql	#1,%2\n"
+"	bhis	mixloop_s8\n"
+"stoploop_s8:\n"
+
+	 : /* no return value */
+	 : /* input */
+	 	"a"(dst), "a"(src), "d"(len), "d"(volume)	
+	 : /* clobbered registers */
+	 	"d0", "d1", "d2", "d3", "cc", "memory" 
+	 );
+}
+
+void SDL_MixAudio_m68k_S16MSB(short* dst, short* src, long len, long volume)
+{
+    __asm__ __volatile__ (
+
+	"tstl	%2\n"
+"	beqs	stoploop_s16msb\n"
+"	movel	#-32768,%%d2\n"
+"	movel	#32767,%%d3\n"
+"	lsrl	#1,%2\n"
+"mixloop_s16msb:\n"
+
+	/* Mix a sample */
+
+"	move	%1@+,%%d0\n"	/* d0 = *src++ */
+"	muls	%3,%%d0\n"	/* d0 *= volume (0<=volume<=128) */
+"	move	%0@,%%d1\n"	/* d1 = *dst */
+"	extl	%%d1\n"		/* extend d1 to 32 bits */
+"	asrl	#7,%%d0\n"	/* d0 /= 128 (SDL_MIX_MAXVOLUME) */
+
+"	addl	%%d1,%%d0\n"
+
+"	cmpl	%%d2,%%d0\n"
+"	bges	lower_limit_s16msb\n"
+"	move	%%d2,%%d0\n"
+"lower_limit_s16msb:\n"
+
+"	cmpl	%%d3,%%d0\n"
+"	bles	upper_limit_s16msb\n"
+"	move	%%d3,%%d0\n"
+"upper_limit_s16msb:\n"
+"	move	%%d0,%0@+\n"
+
+	/* Loop till done */
+
+"	subql	#1,%2\n"
+"	bhis	mixloop_s16msb\n"
+"stoploop_s16msb:\n"
+
+	 : /* no return value */
+	 : /* input */
+	 	"a"(dst), "a"(src), "d"(len), "d"(volume)	
+	 : /* clobbered registers */
+	 	"d0", "d1", "d2", "d3", "cc", "memory" 
+	 );
+}
+
+void SDL_MixAudio_m68k_S16LSB(short* dst, short* src, long len, long volume)
+{
+    __asm__ __volatile__ (
+
+	"tstl	%2\n"
+"	beqs	stoploop_s16lsb\n"
+"	movel	#-32768,%%d2\n"
+"	movel	#32767,%%d3\n"
+"	lsrl	#1,%2\n"
+"mixloop_s16lsb:\n"
+
+	/* Mix a sample */
+
+"	move	%1@+,%%d0\n"	/* d0 = *src++ */
+"	rorw	#8,%%d0\n"
+"	muls	%3,%%d0\n"	/* d0 *= volume (0<=volume<=128) */
+"	move	%0@,%%d1\n"	/* d1 = *dst */
+"	rorw	#8,%%d1\n"
+"	extl	%%d1\n"		/* extend d1 to 32 bits */
+"	asrl	#7,%%d0\n"	/* d0 /= 128 (SDL_MIX_MAXVOLUME) */
+
+"	addl	%%d1,%%d0\n"
+
+"	cmpl	%%d2,%%d0\n"
+"	bges	lower_limit_s16lsb\n"
+"	move	%%d2,%%d0\n"
+"lower_limit_s16lsb:\n"
+
+"	cmpl	%%d3,%%d0\n"
+"	bles	upper_limit_s16lsb\n"
+"	move	%%d3,%%d0\n"
+"upper_limit_s16lsb:\n"
+"	rorw	#8,%%d0\n"
+"	move	%%d0,%0@+\n"
+
+	/* Loop till done */
+
+"	subql	#1,%2\n"
+"	bhis	mixloop_s16lsb\n"
+"stoploop_s16lsb:\n"
+
+	 : /* no return value */
+	 : /* input */
+	 	"a"(dst), "a"(src), "d"(len), "d"(volume)	
+	 : /* clobbered registers */
+	 	"d0", "d1", "d2", "d3", "cc", "memory" 
+	 );
+}
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/audio/SDL_mixer_m68k.h	Tue Jun 03 19:35:10 2003 +0000
@@ -0,0 +1,35 @@
+/*
+    SDL - Simple DirectMedia Layer
+    Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002  Sam Lantinga
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Library General Public
+    License as published by the Free Software Foundation; either
+    version 2 of the License, or (at your option) any later version.
+
+    This library 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
+    Library General Public License for more details.
+
+    You should have received a copy of the GNU Library General Public
+    License along with this library; if not, write to the Free
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+    Sam Lantinga
+    slouken@libsdl.org
+*/
+
+/*
+	m68k assembly mix routines
+
+	Patrice Mandin
+*/
+
+#if defined(__M68000__) && defined(__GNUC__)
+void SDL_MixAudio_m68k_U8(char* dst,char* src, long len, long volume, char* mix8);
+void SDL_MixAudio_m68k_S8(char* dst,char* src, long len, long volume);
+
+void SDL_MixAudio_m68k_S16MSB(short* dst,short* src, long len, long volume);
+void SDL_MixAudio_m68k_S16LSB(short* dst,short* src, long len, long volume);
+#endif