From 062f9852cbec2c951296f33935c2cfc01804a301 Mon Sep 17 00:00:00 2001 From: Patrice Mandin Date: Tue, 3 Jun 2003 19:35:10 +0000 Subject: [PATCH] Add m68k assembly mixing routines --- src/audio/Makefile.am | 4 +- src/audio/SDL_mixer.c | 17 +++ src/audio/SDL_mixer_m68k.c | 210 +++++++++++++++++++++++++++++++++++++ src/audio/SDL_mixer_m68k.h | 35 +++++++ 4 files changed, 265 insertions(+), 1 deletion(-) create mode 100644 src/audio/SDL_mixer_m68k.c create mode 100644 src/audio/SDL_mixer_m68k.h diff --git a/src/audio/Makefile.am b/src/audio/Makefile.am index d8aae3477..44485e13c 100644 --- a/src/audio/Makefile.am +++ b/src/audio/Makefile.am @@ -26,7 +26,9 @@ COMMON_SRCS = \ 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) diff --git a/src/audio/SDL_mixer.c b/src/audio/SDL_mixer.c index c2bfa1af5..4ab6ca3c1 100644 --- a/src/audio/SDL_mixer.c +++ b/src/audio/SDL_mixer.c @@ -37,6 +37,7 @@ static char rcsid = #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 @@ void SDL_MixAudio (Uint8 *dst, const Uint8 *src, Uint32 len, int volume) 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 @@ void SDL_MixAudio (Uint8 *dst, const Uint8 *src, Uint32 len, int volume) ++dst; ++src; } +#endif } break; @@ -162,6 +167,9 @@ void SDL_MixAudio (Uint8 *dst, const Uint8 *src, Uint32 len, int volume) } 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 @@ void SDL_MixAudio (Uint8 *dst, const Uint8 *src, Uint32 len, int volume) ++src8; } } +#endif } break; @@ -204,6 +213,9 @@ void SDL_MixAudio (Uint8 *dst, const Uint8 *src, Uint32 len, int volume) } 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 @@ void SDL_MixAudio (Uint8 *dst, const Uint8 *src, Uint32 len, int volume) 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 @@ void SDL_MixAudio (Uint8 *dst, const Uint8 *src, Uint32 len, int volume) dst[0] = dst_sample&0xFF; dst += 2; } +#endif } break; diff --git a/src/audio/SDL_mixer_m68k.c b/src/audio/SDL_mixer_m68k.c new file mode 100644 index 000000000..be5475f90 --- /dev/null +++ b/src/audio/SDL_mixer_m68k.c @@ -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 + diff --git a/src/audio/SDL_mixer_m68k.h b/src/audio/SDL_mixer_m68k.h new file mode 100644 index 000000000..0b0bbf934 --- /dev/null +++ b/src/audio/SDL_mixer_m68k.h @@ -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