aica_arm.c revision 1.1.4.5 1 1.1.4.5 skrll /* $NetBSD: aica_arm.c,v 1.1.4.5 2005/03/04 16:38:13 skrll Exp $ */
2 1.1.4.2 skrll
3 1.1.4.2 skrll /*
4 1.1.4.2 skrll * Copyright (c) 2003 SHIMIZU Ryo <ryo (at) misakimix.org>
5 1.1.4.2 skrll * All rights reserved.
6 1.1.4.2 skrll *
7 1.1.4.2 skrll * Redistribution and use in source and binary forms, with or without
8 1.1.4.2 skrll * modification, are permitted provided that the following conditions
9 1.1.4.2 skrll * are met:
10 1.1.4.2 skrll *
11 1.1.4.2 skrll * 1. Redistributions of source code must retain the above copyright
12 1.1.4.2 skrll * notice, this list of conditions and the following disclaimer.
13 1.1.4.2 skrll * 2. Redistributions in binary form must reproduce the above copyright
14 1.1.4.2 skrll * notice, this list of conditions and the following disclaimer in the
15 1.1.4.2 skrll * documentation and/or other materials provided with the distribution.
16 1.1.4.2 skrll * 3. The name of the author may not be used to endorse or promote products
17 1.1.4.2 skrll * derived from this software without specific prior written permission.
18 1.1.4.2 skrll *
19 1.1.4.2 skrll * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
20 1.1.4.2 skrll * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21 1.1.4.2 skrll * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22 1.1.4.2 skrll * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
23 1.1.4.2 skrll * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
24 1.1.4.2 skrll * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 1.1.4.2 skrll * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 1.1.4.2 skrll * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 1.1.4.2 skrll * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 1.1.4.2 skrll * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 1.1.4.2 skrll */
30 1.1.4.2 skrll
31 1.1.4.5 skrll typedef unsigned char uint8_t;
32 1.1.4.5 skrll typedef unsigned short uint16_t;
33 1.1.4.5 skrll typedef unsigned long uint32_t;
34 1.1.4.2 skrll
35 1.1.4.2 skrll #include <arch/dreamcast/dev/g2/aicavar.h>
36 1.1.4.2 skrll
37 1.1.4.2 skrll #define DC_REG_ADDR 0x00800000
38 1.1.4.2 skrll
39 1.1.4.2 skrll #define REG_READ_1(off) \
40 1.1.4.5 skrll (*(volatile uint8_t *)(DC_REG_ADDR + (off)))
41 1.1.4.2 skrll #define REG_READ_2(off) \
42 1.1.4.5 skrll (*(volatile uint16_t *)(DC_REG_ADDR + (off)))
43 1.1.4.2 skrll #define REG_READ_4(off) \
44 1.1.4.5 skrll (*(volatile uint32_t *)(DC_REG_ADDR + (off)))
45 1.1.4.2 skrll #define REG_WRITE_1(off,val) \
46 1.1.4.5 skrll ((*(volatile uint8_t *)(DC_REG_ADDR + (off))) = (val))
47 1.1.4.2 skrll #define REG_WRITE_2(off,val) \
48 1.1.4.5 skrll ((*(volatile uint16_t *)(DC_REG_ADDR + (off))) = (val))
49 1.1.4.2 skrll #define REG_WRITE_4(off,val) \
50 1.1.4.5 skrll ((*(volatile uint32_t *)((DC_REG_ADDR)+(off))) = (val))
51 1.1.4.2 skrll
52 1.1.4.2 skrll #define CH_READ_1(ch,off) REG_READ_1(((ch) << 7) + (off))
53 1.1.4.2 skrll #define CH_READ_2(ch,off) REG_READ_2(((ch) << 7) + (off))
54 1.1.4.2 skrll #define CH_READ_4(ch,off) REG_READ_4(((ch) << 7) + (off))
55 1.1.4.2 skrll #define CH_WRITE_1(ch,off,val) REG_WRITE_1(((ch) << 7) + (off), val)
56 1.1.4.2 skrll #define CH_WRITE_2(ch,off,val) REG_WRITE_2(((ch) << 7) + (off), val)
57 1.1.4.2 skrll #define CH_WRITE_4(ch,off,val) REG_WRITE_4(((ch) << 7) + (off), val)
58 1.1.4.2 skrll
59 1.1.4.2 skrll void aica_init(void);
60 1.1.4.2 skrll __inline int in_first_half(unsigned int);
61 1.1.4.2 skrll __inline int in_second_half(unsigned int);
62 1.1.4.2 skrll void bzero_4(void *, unsigned int);
63 1.1.4.2 skrll void bzero(void *, unsigned int);
64 1.1.4.5 skrll uint32_t rate2reg(unsigned int);
65 1.1.4.2 skrll void aica_stop(void);
66 1.1.4.2 skrll void aica_main(void);
67 1.1.4.2 skrll
68 1.1.4.2 skrll void
69 1.1.4.2 skrll aica_init()
70 1.1.4.2 skrll {
71 1.1.4.2 skrll int ch, off;
72 1.1.4.2 skrll
73 1.1.4.2 skrll /* Initialize AICA channels */
74 1.1.4.2 skrll REG_WRITE_4(0x2800, 0x0000); /* Master volume: Min */
75 1.1.4.2 skrll
76 1.1.4.2 skrll for (ch = 0; ch < 64; ch++) {
77 1.1.4.2 skrll CH_WRITE_4(ch, 0x00, 0x8000); /* Key off */
78 1.1.4.2 skrll CH_WRITE_4(ch, 0x04, 0x0000); /* DataAddress (low) */
79 1.1.4.2 skrll CH_WRITE_4(ch, 0x08, 0x0000); /* LoopStartPosition */
80 1.1.4.2 skrll CH_WRITE_4(ch, 0x0c, 0x0000); /* LoopEndPosition */
81 1.1.4.2 skrll CH_WRITE_4(ch, 0x10, 0x001f); /* AR = 0x1f = 0 msec */
82 1.1.4.2 skrll CH_WRITE_4(ch, 0x14, 0x001f); /* RR = 0x1f = 0 msec */
83 1.1.4.2 skrll CH_WRITE_4(ch, 0x18, 0x0000); /* Pitch */
84 1.1.4.2 skrll CH_WRITE_4(ch, 0x1c, 0x0000); /* LFO Control */
85 1.1.4.2 skrll CH_WRITE_4(ch, 0x20, 0x0000); /* DSP Channel to send */
86 1.1.4.2 skrll CH_WRITE_4(ch, 0x24, 0x0000); /* Pan & Volume */
87 1.1.4.2 skrll CH_WRITE_4(ch, 0x28, 0x0024); /* Volume & LowPassFilter */
88 1.1.4.2 skrll CH_WRITE_4(ch, 0x2c, 0x0000); /* LowPassFilter for Attack */
89 1.1.4.2 skrll CH_WRITE_4(ch, 0x30, 0x0000); /* LowPassFilter for Decay */
90 1.1.4.2 skrll CH_WRITE_4(ch, 0x34, 0x0000); /* LowPassFilter for Sustain */
91 1.1.4.2 skrll CH_WRITE_4(ch, 0x38, 0x0000); /* LowPassFilter for Keyoff */
92 1.1.4.2 skrll CH_WRITE_4(ch, 0x3c, 0x0000); /* LowPassFilter for Release */
93 1.1.4.2 skrll CH_WRITE_4(ch, 0x40, 0x0000); /* LowPassFilter transition
94 1.1.4.2 skrll for Attack, Decay */
95 1.1.4.2 skrll CH_WRITE_4(ch, 0x44, 0x0000); /* LowPassFilter transition
96 1.1.4.2 skrll for Decay, Release */
97 1.1.4.2 skrll
98 1.1.4.2 skrll for (off = 0x48; off < 0x80; off+=4) {
99 1.1.4.2 skrll CH_WRITE_4(ch, off, 0x0000); /* other = 0 */
100 1.1.4.2 skrll }
101 1.1.4.2 skrll }
102 1.1.4.2 skrll
103 1.1.4.2 skrll REG_WRITE_4(0x2800, 0x000f); /* Master volume: Max */
104 1.1.4.2 skrll }
105 1.1.4.2 skrll
106 1.1.4.2 skrll
107 1.1.4.2 skrll __inline int
108 1.1.4.2 skrll in_first_half(unsigned int loophalf)
109 1.1.4.2 skrll {
110 1.1.4.2 skrll
111 1.1.4.2 skrll REG_WRITE_1(0x280d, 0); /* select channel 0 */
112 1.1.4.2 skrll return REG_READ_4(0x2814) < loophalf;
113 1.1.4.2 skrll }
114 1.1.4.2 skrll
115 1.1.4.2 skrll __inline int
116 1.1.4.2 skrll in_second_half(unsigned int loophalf)
117 1.1.4.2 skrll {
118 1.1.4.2 skrll
119 1.1.4.2 skrll REG_WRITE_1(0x280d, 0); /* select channel 0 */
120 1.1.4.2 skrll return REG_READ_4(0x2814) >= loophalf;
121 1.1.4.2 skrll }
122 1.1.4.2 skrll
123 1.1.4.2 skrll
124 1.1.4.2 skrll void
125 1.1.4.2 skrll bzero_4(void *b, unsigned int len)
126 1.1.4.2 skrll {
127 1.1.4.5 skrll uint32_t *p;
128 1.1.4.2 skrll
129 1.1.4.2 skrll p = b;
130 1.1.4.2 skrll len = (len + 3) & ~3;
131 1.1.4.2 skrll for (; len != 0; len -= 4)
132 1.1.4.2 skrll *p++ = 0;
133 1.1.4.2 skrll }
134 1.1.4.2 skrll
135 1.1.4.2 skrll void
136 1.1.4.2 skrll bzero(void *b,unsigned int len)
137 1.1.4.2 skrll {
138 1.1.4.5 skrll uint8_t *p;
139 1.1.4.2 skrll
140 1.1.4.2 skrll p = b;
141 1.1.4.2 skrll for (; len != 0; len--)
142 1.1.4.2 skrll *p++ = 0;
143 1.1.4.2 skrll }
144 1.1.4.2 skrll
145 1.1.4.2 skrll
146 1.1.4.5 skrll uint32_t
147 1.1.4.2 skrll rate2reg(unsigned int rate)
148 1.1.4.2 skrll {
149 1.1.4.5 skrll uint32_t base, fns;
150 1.1.4.2 skrll int oct;
151 1.1.4.2 skrll
152 1.1.4.2 skrll base = 44100 << 7;
153 1.1.4.2 skrll for (oct = 7; oct >= -8 && rate < base; oct--)
154 1.1.4.2 skrll base >>= 1;
155 1.1.4.2 skrll
156 1.1.4.2 skrll if (rate < base)
157 1.1.4.2 skrll return (oct << 11) & 0xf800;
158 1.1.4.2 skrll
159 1.1.4.2 skrll rate -= base;
160 1.1.4.2 skrll
161 1.1.4.2 skrll #if 0
162 1.1.4.2 skrll /* (base / 2) : round off */
163 1.1.4.2 skrll fns = (rate * 1024 + (base / 2)) / base;
164 1.1.4.2 skrll #else
165 1.1.4.2 skrll /* avoid using udivsi3() */
166 1.1.4.2 skrll {
167 1.1.4.5 skrll uint32_t tmp = (rate * 1024 + (base / 2));
168 1.1.4.2 skrll for (fns = 0; tmp >= base; tmp -= base, fns++)
169 1.1.4.2 skrll ;
170 1.1.4.2 skrll }
171 1.1.4.2 skrll #endif
172 1.1.4.2 skrll
173 1.1.4.2 skrll /* adjustment */
174 1.1.4.2 skrll if (fns == 1024) {
175 1.1.4.2 skrll oct++;
176 1.1.4.2 skrll fns = 0;
177 1.1.4.2 skrll } else {
178 1.1.4.2 skrll if ((rate > base * fns / 1024) &&
179 1.1.4.2 skrll (fns < 1023) &&
180 1.1.4.2 skrll (rate == base * (fns + 1) / 1024)) {
181 1.1.4.2 skrll fns++;
182 1.1.4.2 skrll } else if ((rate < base * fns / 1024) &&
183 1.1.4.2 skrll (fns > 0) &&
184 1.1.4.2 skrll (rate == base * (fns - 1)/ 1024)) {
185 1.1.4.2 skrll fns--;
186 1.1.4.2 skrll }
187 1.1.4.2 skrll }
188 1.1.4.2 skrll
189 1.1.4.2 skrll return ((oct << 11) & 0xf800) + fns;
190 1.1.4.2 skrll }
191 1.1.4.2 skrll
192 1.1.4.2 skrll
193 1.1.4.2 skrll
194 1.1.4.2 skrll void
195 1.1.4.2 skrll aica_stop()
196 1.1.4.2 skrll {
197 1.1.4.2 skrll
198 1.1.4.2 skrll CH_WRITE_4(0, 0x00, 0x8000);
199 1.1.4.2 skrll CH_WRITE_4(1, 0x00, 0x8000);
200 1.1.4.2 skrll bzero_4((void *)AICA_DMABUF_LEFT, AICA_DMABUF_SIZE);
201 1.1.4.2 skrll bzero_4((void *)AICA_DMABUF_RIGHT, AICA_DMABUF_SIZE);
202 1.1.4.2 skrll }
203 1.1.4.2 skrll
204 1.1.4.2 skrll void
205 1.1.4.2 skrll aica_main()
206 1.1.4.2 skrll {
207 1.1.4.2 skrll volatile aica_cmd_t *aicacmd = (volatile aica_cmd_t *)AICA_ARM_CMD;
208 1.1.4.2 skrll int play_state;
209 1.1.4.2 skrll unsigned int loopend = 0,loophalf = 0;
210 1.1.4.2 skrll unsigned int blksize = 0, ratepitch;
211 1.1.4.5 skrll uint32_t cmd, serial;
212 1.1.4.2 skrll
213 1.1.4.2 skrll aica_init();
214 1.1.4.2 skrll
215 1.1.4.2 skrll REG_WRITE_4(0x28b4, 0x0020); /* INT Enable to SH4 */
216 1.1.4.2 skrll
217 1.1.4.2 skrll bzero_4((void *)AICA_DMABUF_LEFT, AICA_DMABUF_SIZE);
218 1.1.4.2 skrll bzero_4((void *)AICA_DMABUF_RIGHT, AICA_DMABUF_SIZE);
219 1.1.4.2 skrll
220 1.1.4.2 skrll play_state = 0;
221 1.1.4.2 skrll serial = aicacmd->serial = 0;
222 1.1.4.2 skrll
223 1.1.4.2 skrll for (;;) {
224 1.1.4.2 skrll if (serial != aicacmd->serial) {
225 1.1.4.2 skrll serial = aicacmd->serial;
226 1.1.4.2 skrll cmd = aicacmd->command;
227 1.1.4.2 skrll aicacmd->command = AICA_COMMAND_NOP;
228 1.1.4.2 skrll } else {
229 1.1.4.2 skrll cmd = AICA_COMMAND_NOP;
230 1.1.4.2 skrll }
231 1.1.4.2 skrll
232 1.1.4.2 skrll switch (cmd) {
233 1.1.4.2 skrll case AICA_COMMAND_NOP:
234 1.1.4.2 skrll /*
235 1.1.4.2 skrll * AICA_COMMAND_NOP - Idle process
236 1.1.4.2 skrll */
237 1.1.4.2 skrll switch (play_state) {
238 1.1.4.2 skrll case 0: /* not playing */
239 1.1.4.2 skrll break;
240 1.1.4.2 skrll case 1: /* first half */
241 1.1.4.2 skrll if (in_second_half(loophalf)) {
242 1.1.4.2 skrll /* Send INT to SH4 */
243 1.1.4.2 skrll REG_WRITE_4(0x28b8, 0x0020);
244 1.1.4.2 skrll play_state = 2;
245 1.1.4.2 skrll }
246 1.1.4.2 skrll break;
247 1.1.4.2 skrll case 2: /* second half */
248 1.1.4.2 skrll if (in_first_half(loophalf)) {
249 1.1.4.2 skrll /* Send INT to SH4 */
250 1.1.4.2 skrll REG_WRITE_4(0x28b8, 0x0020);
251 1.1.4.2 skrll play_state = 1;
252 1.1.4.2 skrll }
253 1.1.4.2 skrll break;
254 1.1.4.2 skrll case 3:
255 1.1.4.2 skrll if (in_second_half(loophalf)) {
256 1.1.4.2 skrll aica_stop();
257 1.1.4.2 skrll play_state = 0;
258 1.1.4.2 skrll }
259 1.1.4.2 skrll break;
260 1.1.4.2 skrll case 4:
261 1.1.4.2 skrll if (in_first_half(loophalf)) {
262 1.1.4.2 skrll aica_stop();
263 1.1.4.2 skrll play_state = 0;
264 1.1.4.2 skrll }
265 1.1.4.2 skrll break;
266 1.1.4.2 skrll }
267 1.1.4.2 skrll break;
268 1.1.4.2 skrll
269 1.1.4.2 skrll case AICA_COMMAND_PLAY:
270 1.1.4.2 skrll blksize = aicacmd->blocksize;
271 1.1.4.2 skrll
272 1.1.4.2 skrll CH_WRITE_4(0, 0x00, 0x8000);
273 1.1.4.2 skrll CH_WRITE_4(1, 0x00, 0x8000);
274 1.1.4.2 skrll
275 1.1.4.2 skrll switch (aicacmd->precision) {
276 1.1.4.2 skrll case 16:
277 1.1.4.2 skrll loopend = blksize;
278 1.1.4.2 skrll break;
279 1.1.4.2 skrll case 8:
280 1.1.4.2 skrll loopend = blksize * 2;
281 1.1.4.2 skrll break;
282 1.1.4.2 skrll case 4:
283 1.1.4.2 skrll loopend = blksize * 4;
284 1.1.4.2 skrll break;
285 1.1.4.2 skrll }
286 1.1.4.2 skrll loophalf = loopend / 2;
287 1.1.4.2 skrll
288 1.1.4.2 skrll ratepitch = rate2reg(aicacmd->rate);
289 1.1.4.2 skrll
290 1.1.4.2 skrll /* setup left */
291 1.1.4.2 skrll CH_WRITE_4(0, 0x08, 0); /* loop start */
292 1.1.4.2 skrll CH_WRITE_4(0, 0x0c, loopend); /* loop end */
293 1.1.4.2 skrll CH_WRITE_4(0, 0x18, ratepitch); /* SamplingRate */
294 1.1.4.2 skrll CH_WRITE_4(0, 0x24, 0x0f1f); /* volume MAX,
295 1.1.4.2 skrll right PAN */
296 1.1.4.2 skrll
297 1.1.4.2 skrll /* setup right */
298 1.1.4.2 skrll CH_WRITE_4(1, 0x08,0); /* loop start */
299 1.1.4.2 skrll CH_WRITE_4(1, 0x0c, loopend); /* loop end */
300 1.1.4.2 skrll CH_WRITE_4(1, 0x18, ratepitch); /* SamplingRate */
301 1.1.4.2 skrll CH_WRITE_4(1, 0x24, 0x0f0f); /* volume MAX,
302 1.1.4.2 skrll right PAN */
303 1.1.4.2 skrll
304 1.1.4.2 skrll {
305 1.1.4.5 skrll uint32_t mode, lparam, rparam;
306 1.1.4.2 skrll
307 1.1.4.2 skrll if (aicacmd->precision == 4)
308 1.1.4.2 skrll mode = 3 << 7; /* 4bit ADPCM */
309 1.1.4.2 skrll else if (aicacmd->precision == 8)
310 1.1.4.2 skrll mode = 1 << 7; /* 8bit */
311 1.1.4.2 skrll else
312 1.1.4.2 skrll mode = 0; /* 16bit */
313 1.1.4.2 skrll
314 1.1.4.2 skrll switch (aicacmd->channel) {
315 1.1.4.2 skrll case 2:
316 1.1.4.2 skrll CH_WRITE_4(0, 0x04,
317 1.1.4.2 skrll AICA_DMABUF_LEFT & 0xffff);
318 1.1.4.2 skrll CH_WRITE_4(1, 0x04,
319 1.1.4.2 skrll AICA_DMABUF_RIGHT & 0xffff);
320 1.1.4.2 skrll lparam = 0xc000 /*PLAY*/ |
321 1.1.4.2 skrll 0x0200 /*LOOP*/ | mode |
322 1.1.4.2 skrll (AICA_DMABUF_LEFT >> 16);
323 1.1.4.2 skrll rparam = 0xc000 /*PLAY*/ |
324 1.1.4.2 skrll 0x0200 /*LOOP*/ | mode |
325 1.1.4.2 skrll (AICA_DMABUF_RIGHT >> 16);
326 1.1.4.2 skrll CH_WRITE_4(0, 0x00, lparam);
327 1.1.4.2 skrll CH_WRITE_4(1, 0x00, rparam);
328 1.1.4.2 skrll break;
329 1.1.4.2 skrll case 1:
330 1.1.4.2 skrll CH_WRITE_1(0, 0x24, 0); /* middle
331 1.1.4.2 skrll balance */
332 1.1.4.2 skrll CH_WRITE_4(0, 0x04,
333 1.1.4.2 skrll AICA_DMABUF_LEFT & 0xffff);
334 1.1.4.2 skrll CH_WRITE_4(0, 0x00, 0xc000 /*PLAY*/ |
335 1.1.4.2 skrll 0x0200 /*LOOP*/ | mode |
336 1.1.4.2 skrll (AICA_DMABUF_LEFT >> 16));
337 1.1.4.2 skrll break;
338 1.1.4.2 skrll }
339 1.1.4.2 skrll }
340 1.1.4.2 skrll play_state = 1;
341 1.1.4.2 skrll break;
342 1.1.4.2 skrll
343 1.1.4.2 skrll case AICA_COMMAND_STOP:
344 1.1.4.2 skrll switch (play_state) {
345 1.1.4.2 skrll case 1:
346 1.1.4.2 skrll bzero_4((void *)(AICA_DMABUF_LEFT + blksize),
347 1.1.4.2 skrll blksize);
348 1.1.4.2 skrll bzero_4((void *)(AICA_DMABUF_RIGHT + blksize),
349 1.1.4.2 skrll blksize);
350 1.1.4.2 skrll play_state = 3;
351 1.1.4.2 skrll break;
352 1.1.4.2 skrll case 2:
353 1.1.4.2 skrll bzero_4((void *)AICA_DMABUF_LEFT, blksize);
354 1.1.4.2 skrll bzero_4((void *)AICA_DMABUF_RIGHT, blksize);
355 1.1.4.2 skrll play_state = 4;
356 1.1.4.2 skrll break;
357 1.1.4.2 skrll default:
358 1.1.4.2 skrll aica_stop();
359 1.1.4.2 skrll play_state = 0;
360 1.1.4.2 skrll break;
361 1.1.4.2 skrll }
362 1.1.4.2 skrll break;
363 1.1.4.2 skrll
364 1.1.4.2 skrll case AICA_COMMAND_INIT:
365 1.1.4.2 skrll aica_stop();
366 1.1.4.2 skrll play_state = 0;
367 1.1.4.2 skrll break;
368 1.1.4.2 skrll
369 1.1.4.2 skrll case AICA_COMMAND_MVOL:
370 1.1.4.2 skrll REG_WRITE_4(0x2800, L256TO16(aicacmd->l_param));
371 1.1.4.2 skrll break;
372 1.1.4.2 skrll
373 1.1.4.2 skrll case AICA_COMMAND_VOL:
374 1.1.4.2 skrll CH_WRITE_1(0, 0x29, 0xff - (aicacmd->l_param & 0xff));
375 1.1.4.2 skrll CH_WRITE_1(1, 0x29, 0xff - (aicacmd->r_param & 0xff));
376 1.1.4.2 skrll break;
377 1.1.4.2 skrll
378 1.1.4.2 skrll }
379 1.1.4.2 skrll }
380 1.1.4.2 skrll }
381