Add m68k assembly mixing routines
--HG-- extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40634
This commit is contained in:
parent
e83605f1b4
commit
f1d4f57390
4 changed files with 265 additions and 1 deletions
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
210
src/audio/SDL_mixer_m68k.c
Normal file
210
src/audio/SDL_mixer_m68k.c
Normal file
|
@ -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
|
||||
|
35
src/audio/SDL_mixer_m68k.h
Normal file
35
src/audio/SDL_mixer_m68k.h
Normal file
|
@ -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
|
Loading…
Add table
Add a link
Reference in a new issue