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.c \
|
||||||
SDL_mixer_MMX.h \
|
SDL_mixer_MMX.h \
|
||||||
SDL_mixer_MMX_VC.c \
|
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_SOURCES = $(COMMON_SRCS)
|
||||||
libaudio_la_LIBADD = $(DRIVERS)
|
libaudio_la_LIBADD = $(DRIVERS)
|
||||||
|
|
|
@ -37,6 +37,7 @@ static char rcsid =
|
||||||
#include "SDL_sysaudio.h"
|
#include "SDL_sysaudio.h"
|
||||||
#include "SDL_mixer_MMX.h"
|
#include "SDL_mixer_MMX.h"
|
||||||
#include "SDL_mixer_MMX_VC.h"
|
#include "SDL_mixer_MMX_VC.h"
|
||||||
|
#include "SDL_mixer_m68k.h"
|
||||||
|
|
||||||
/* Function to check the CPU flags */
|
/* Function to check the CPU flags */
|
||||||
#define MMX_CPU 0x800000
|
#define MMX_CPU 0x800000
|
||||||
|
@ -135,6 +136,9 @@ void SDL_MixAudio (Uint8 *dst, const Uint8 *src, Uint32 len, int volume)
|
||||||
switch (format) {
|
switch (format) {
|
||||||
|
|
||||||
case AUDIO_U8: {
|
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;
|
Uint8 src_sample;
|
||||||
|
|
||||||
while ( len-- ) {
|
while ( len-- ) {
|
||||||
|
@ -144,6 +148,7 @@ void SDL_MixAudio (Uint8 *dst, const Uint8 *src, Uint32 len, int volume)
|
||||||
++dst;
|
++dst;
|
||||||
++src;
|
++src;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -162,6 +167,9 @@ void SDL_MixAudio (Uint8 *dst, const Uint8 *src, Uint32 len, int volume)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(__M68000__) && defined(__GNUC__)
|
||||||
|
SDL_MixAudio_m68k_S8((char*)dst,(char*)src,(unsigned long)len,(long)volume);
|
||||||
|
#else
|
||||||
{
|
{
|
||||||
Sint8 *dst8, *src8;
|
Sint8 *dst8, *src8;
|
||||||
Sint8 src_sample;
|
Sint8 src_sample;
|
||||||
|
@ -187,6 +195,7 @@ void SDL_MixAudio (Uint8 *dst, const Uint8 *src, Uint32 len, int volume)
|
||||||
++src8;
|
++src8;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -204,6 +213,9 @@ void SDL_MixAudio (Uint8 *dst, const Uint8 *src, Uint32 len, int volume)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(__M68000__) && defined(__GNUC__)
|
||||||
|
SDL_MixAudio_m68k_S16LSB((short*)dst,(short*)src,(unsigned long)len,(long)volume);
|
||||||
|
#else
|
||||||
{
|
{
|
||||||
Sint16 src1, src2;
|
Sint16 src1, src2;
|
||||||
int dst_sample;
|
int dst_sample;
|
||||||
|
@ -229,10 +241,14 @@ void SDL_MixAudio (Uint8 *dst, const Uint8 *src, Uint32 len, int volume)
|
||||||
dst += 2;
|
dst += 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case AUDIO_S16MSB: {
|
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;
|
Sint16 src1, src2;
|
||||||
int dst_sample;
|
int dst_sample;
|
||||||
const int max_audioval = ((1<<(16-1))-1);
|
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[0] = dst_sample&0xFF;
|
||||||
dst += 2;
|
dst += 2;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
break;
|
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