This repository has been archived by the owner on Feb 11, 2021. It is now read-only.
/
SDL_mixer_m68k.c
140 lines (130 loc) · 6.64 KB
1
2
/*
SDL - Simple DirectMedia Layer
3
Copyright (C) 1997-2011 Sam Lantinga
4
5
This library is free software; you can redistribute it and/or
6
modify it under the terms of the GNU Lesser General Public
7
License as published by the Free Software Foundation; either
8
version 2.1 of the License, or (at your option) any later version.
9
10
11
12
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
13
Lesser General Public License for more details.
14
15
16
17
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18
19
20
21
Sam Lantinga
slouken@libsdl.org
*/
22
#include "SDL_config.h"
23
24
25
26
27
28
29
/*
m68k assembly mix routines
Patrice Mandin
*/
30
#if defined(__M68000__) && !defined(__mcoldfire__) && defined(__GNUC__)
31
32
void
SDL_MixAudio_m68k_U8(char *dst, char *src, long len, long volume, char *mix8)
33
{
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
__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");
49
50
}
51
52
void
SDL_MixAudio_m68k_S8(char *dst, char *src, long len, long volume)
53
{
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
__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");
77
78
}
79
80
void
SDL_MixAudio_m68k_S16MSB(short *dst, short *src, long len, long volume)
81
{
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
__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");
107
108
}
109
110
void
SDL_MixAudio_m68k_S16LSB(short *dst, short *src, long len, long volume)
111
{
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
__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");
138
139
}
#endif
140
/* vi: set ts=4 sw=4 expandtab: */