Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Add m68k assembly mixing routines
  • Loading branch information
pmandin committed Jun 3, 2003
1 parent 97bd158 commit 062f985
Show file tree
Hide file tree
Showing 4 changed files with 265 additions and 1 deletion.
4 changes: 3 additions & 1 deletion src/audio/Makefile.am
Expand Up @@ -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)
Expand Down
17 changes: 17 additions & 0 deletions src/audio/SDL_mixer.c
Expand Up @@ -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
Expand Down Expand Up @@ -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-- ) {
Expand All @@ -144,6 +148,7 @@ void SDL_MixAudio (Uint8 *dst, const Uint8 *src, Uint32 len, int volume)
++dst;
++src;
}
#endif
}
break;

Expand All @@ -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;
Expand All @@ -187,6 +195,7 @@ void SDL_MixAudio (Uint8 *dst, const Uint8 *src, Uint32 len, int volume)
++src8;
}
}
#endif
}
break;

Expand All @@ -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;
Expand All @@ -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);
Expand All @@ -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;

Expand Down
210 changes: 210 additions & 0 deletions 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

35 changes: 35 additions & 0 deletions 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

0 comments on commit 062f985

Please sign in to comment.