diff src/audio/SDL_mixer_m68k.c @ 633:873c2598f969

Add m68k assembly mixing routines
author Patrice Mandin <patmandin@gmail.com>
date Tue, 03 Jun 2003 19:35:10 +0000
parents
children b8d311d90021
line wrap: on
line diff
--- /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
+