summaryrefslogtreecommitdiff
path: root/src/ao_audio.c
blob: 70157557eb80bf02717415f719984b26774056e4 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
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
107
108
109
110
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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
/*
 * Copyright © 2010 Keith Packard <keithp@keithp.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; version 2 of the License.
 *
 * This program 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
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
 */

#include "ao.h"

__xdata uint8_t ao_audio_dma;
__xdata uint8_t ao_audio_dma_done;
__xdata uint8_t ao_audio_mutex;

__code uint8_t ao_audio_sound[] = {
	 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 126, 125, 125, 123, 123, 123,
	 125, 125, 123, 123, 123, 125, 125, 123, 123, 125, 125, 125, 125, 125, 126, 126,
	 128, 126, 126, 126, 126, 126, 126, 128, 128, 128, 128, 128, 128, 130, 130, 130,
	 130, 131, 131, 131, 130, 130, 130, 128, 130, 128, 128, 128, 128, 128, 130, 130,
	 130, 130, 131, 131, 130, 130, 128, 128, 130, 131, 130, 130, 130, 131, 133, 131,
	 128, 128, 128, 131, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 128,
	 130, 128, 126, 126, 126, 128, 128, 126, 128, 130, 128, 126, 126, 128, 128, 126,
	 125, 125, 128, 128, 128, 128, 125, 128, 130, 130, 130, 128, 128, 126, 128, 126,
	 126, 126, 125, 126, 128, 126, 126, 125, 125, 128, 130, 128, 123, 122, 123, 128,
	 126, 123, 125, 126, 128, 128, 125, 123, 122, 123, 125, 125, 125, 125, 125, 126,
	 126, 125, 123, 125, 128, 128, 126, 126, 125, 123, 123, 125, 126, 125, 125, 126,
	 126, 126, 128, 128, 126, 126, 128, 130, 128, 128, 126, 126, 128, 126, 126, 126,
	 126, 128, 130, 130, 128, 126, 125, 126, 130, 130, 128, 125, 126, 128, 130, 128,
	 126, 125, 126, 130, 133, 131, 128, 126, 130, 131, 131, 128, 128, 130, 133, 133,
	 133, 130, 130, 133, 134, 134, 133, 130, 131, 131, 131, 131, 130, 128, 128, 128,
	 130, 128, 125, 125, 126, 130, 128, 125, 125, 126, 126, 126, 126, 125, 126, 125,
	 130, 130, 128, 126, 126, 128, 128, 126, 126, 128, 126, 126, 128, 128, 130, 128,
	 126, 128, 128, 131, 130, 130, 128, 128, 128, 125, 126, 126, 125, 125, 125, 125,
	 125, 125, 126, 126, 126, 126, 125, 123, 123, 123, 125, 123, 123, 125, 125, 125,
	 125, 125, 126, 126, 125, 123, 123, 126, 126, 128, 128, 128, 128, 128, 128, 128,
	 131, 126, 126, 128, 130, 128, 128, 126, 126, 126, 126, 126, 126, 126, 126, 128,
	 126, 126, 126, 126, 125, 125, 123, 125, 125, 125, 125, 125, 125, 125, 125, 126,
	 126, 126, 126, 126, 126, 126, 126, 128, 128, 126, 126, 128, 130, 130, 131, 133,
	 133, 131, 130, 130, 128, 128, 126, 128, 128, 128, 128, 130, 130, 131, 130, 131,
	 131, 128, 131, 128, 130, 130, 130, 130, 130, 130, 131, 133, 133, 131, 131, 130,
	 130, 131, 133, 131, 130, 130, 131, 134, 133, 130, 128, 126, 128, 130, 131, 131,
	 128, 126, 128, 130, 128, 126, 125, 125, 125, 125, 126, 126, 126, 125, 125, 126,
	 126, 125, 126, 126, 125, 125, 123, 125, 125, 125, 123, 123, 123, 123, 123, 123,
	 123, 123, 123, 123, 125, 125, 126, 126, 125, 123, 123, 125, 125, 123, 123, 122,
	 122, 122, 123, 126, 126, 125, 126, 126, 128, 126, 125, 126, 125, 126, 125, 126,
	 126, 126, 128, 128, 126, 125, 125, 125, 126, 126, 130, 130, 130, 128, 128, 130,
	 130, 126, 126, 125, 123, 123, 123, 125, 123, 122, 122, 120, 122, 125, 125, 125,
	 123, 125, 126, 128, 128, 126, 128, 125, 126, 128, 130, 131, 130, 131, 131, 133,
	 133, 130, 130, 131, 131, 131, 131, 133, 133, 134, 133, 133, 133, 131, 131, 130,
	 131, 131, 131, 130, 128, 130, 130, 131, 131, 133, 131, 133, 131, 133, 133, 133,
	 134, 134, 136, 134, 134, 134, 134, 133, 133, 133, 133, 131, 128, 128, 125, 120,
	 119, 116, 112, 111, 108, 106, 106, 108, 109, 109, 109, 108, 106, 106, 106, 109,
	 111, 114, 116, 120, 123, 125, 128, 131, 133, 136, 139, 139, 140, 139, 139, 137,
	 137, 139, 140, 139, 137, 140, 142, 144, 145, 144, 142, 142, 142, 142, 142, 140,
	 139, 139, 137, 137, 137, 136, 136, 136, 134, 133, 130, 128, 126, 125, 123, 120,
	 116, 112, 108, 103,  98,  95,  91,  86,  83,  80,  77,  70,  66,  61,  61,  67,
	  78,  95, 105, 117, 123, 130, 140, 145, 151, 161, 164, 161, 161, 159, 156, 156,
	 156, 159, 161, 158, 159, 162, 162, 165, 169, 167, 165, 159, 153, 148, 142, 136,
	 131, 125, 122, 120, 120, 122, 126, 130, 133, 137, 140, 144, 144, 140, 137, 130,
	 125, 123, 119, 116, 114, 108, 101,  94,  89,  87,  86,  81,  75,  70,  64,  61,
	  66,  83, 101, 126, 144, 153, 173, 184, 172, 162, 162, 151, 140, 134, 130, 128,
	 123, 119, 126, 133, 134, 144, 151, 153, 158, 159, 162, 164, 158, 151, 145, 133,
	 116, 105,  98,  95,  92,  95, 105, 109, 114, 122, 131, 142, 151, 155, 158, 159,
	 156, 151, 150, 145, 139, 136, 137, 140, 142, 145, 151, 159, 162, 165, 165, 161,
	 153, 139, 126, 114,  97,  81,  67,  55,  42,  31,  23,  19,  20,  25,  34,  50,
	  66,  86, 117, 147, 169, 186, 184, 176, 172, 159, 153, 151, 147, 144, 137, 131,
	 130, 128, 126, 136, 147, 158, 161, 159, 158, 156, 156, 156, 156, 151, 139, 128,
	 119, 109, 108, 111, 112, 119, 125, 125, 130, 133, 134, 142, 145, 147, 148, 144,
	 139, 134, 130, 123, 122, 119, 112, 105,  95,  89,  81,  77,  69,  55,  45,  44,
	  55,  86, 128, 164, 189, 189, 170, 158, 147, 137, 148, 158, 159, 156, 140, 123,
	 117, 116, 126, 145, 156, 159, 151, 137, 133, 136, 147, 161, 164, 156, 139, 117,
	 101,  94,  94, 105, 116, 122, 123, 120, 119, 123, 131, 147, 162, 169, 169, 158,
	 145, 136, 133, 137, 145, 144, 139, 131, 123, 123, 126, 134, 139, 136, 125, 114,
	 101,  91,  81,  70,  61,  47,  30,  14,   0,   8,  44,  86, 126, 158, 161, 155,
	 151, 144, 151, 172, 187, 198, 195, 175, 156, 140, 130, 137, 150, 158, 156, 140,
	 123, 114, 116, 131, 147, 156, 162, 151, 136, 122, 114, 120, 131, 137, 145, 142,
	 130, 122, 116, 119, 133, 144, 151, 147, 133, 120, 112, 117, 130, 142, 148, 145,
	 134, 120, 112, 108, 108, 108, 105,  91,  72,  50,  33,  27,  33,  56,  89, 119,
	 144, 156, 145, 139, 140, 139, 150, 165, 173, 178, 172, 158, 148, 140, 139, 147,
	 155, 158, 156, 147, 139, 136, 136, 145, 153, 158, 153, 140, 130, 116, 108, 112,
	 125, 134, 142, 140, 136, 133, 128, 133, 144, 153, 161, 162, 155, 145, 134, 133,
	 137, 139, 139, 134, 123, 112, 105, 101, 105, 105, 105, 100,  89,  72,  58,  44,
	  34,  34,  42,  58,  84, 111, 128, 134, 131, 131, 134, 131, 140, 155, 162, 172,
	 172, 165, 159, 148, 145, 150, 150, 150, 148, 140, 133, 125, 120, 125, 131, 133,
	 136, 130, 125, 117, 112, 117, 126, 133, 139, 142, 140, 137, 134, 136, 140, 147,
	 147, 148, 140, 133, 126, 126, 131, 134, 139, 140, 137, 133, 125, 119, 116, 111,
	 108, 101,  91,  75,  58,  41,  30,  28,  39,  66, 101, 131, 147, 145, 142, 140,
	 136, 142, 159, 172, 179, 181, 172, 162, 148, 139, 140, 147, 150, 153, 148, 139,
	 131, 125, 128, 136, 144, 150, 151, 144, 133, 122, 117, 123, 134, 142, 147, 147,
	 144, 136, 130, 134, 144, 155, 162, 162, 155, 145, 137, 137, 140, 144, 147, 145,
	 136, 123, 114, 106, 103, 100,  98,  94,  84,  66,  48,  31,  23,  30,  48,  84,
	 123, 150, 158, 151, 147, 142, 133, 142, 158, 167, 173, 172, 159, 145, 131, 123,
	 130, 136, 140, 145, 139, 126, 120, 117, 123, 133, 139, 145, 144, 131, 120, 111,
	 108, 117, 130, 142, 145, 144, 136, 130, 126, 133, 148, 158, 161, 158, 144, 133,
	 126, 126, 133, 140, 144, 142, 131, 122, 114, 109, 108, 105,  98,  91,  75,  56,
	  39,  25,  20,  28,  52,  87, 126, 155, 165, 161, 156, 151, 142, 147, 161, 167,
	 172, 169, 156, 142, 128, 122, 126, 136, 144, 148, 145, 136, 130, 131, 137, 144,
	 151, 156, 156, 139, 123, 114, 108, 116, 128, 139, 148, 147, 137, 134, 133, 139,
	 156, 165, 169, 165, 151, 136, 128, 125, 131, 139, 140, 137, 130, 122, 116, 109,
	 105, 101,  97,  86,  70,  50,  31,  19,  17,  33,  67, 114, 158, 186, 184, 173,
	 164, 144, 136, 148, 159, 165, 169, 156, 139, 123, 109, 114, 126, 139, 151, 153,
	 145, 134, 133, 137, 147, 151, 155, 155, 144, 120,  98,  95,  94, 106, 126, 139,
	 145, 142, 133, 134, 139, 148, 167, 175, 169, 155, 134, 119, 112, 114, 126, 137,
	 140, 137, 131, 126, 123, 122, 119, 116, 108,  91,  69,  44,  22,  11,  13,  27,
	  56,  98, 137, 170, 179, 169, 167, 161, 145, 151, 159, 158, 159, 153, 139, 131,
	 120, 116, 128, 137, 145, 156, 156, 148, 148, 148, 153, 155, 151, 148, 142, 130,
	 105,  95,  98, 105, 120, 136, 145, 150, 145, 142, 148, 156, 165, 175, 173, 159,
	 139, 123, 114, 112, 119, 131, 144, 144, 140, 137, 133, 126, 122, 117, 109,  97,
	  73,  50,  28,  13,   9,  20,  45,  91, 134, 173, 190, 179, 172, 169, 155, 147,
	 159, 159, 156, 155, 134, 119, 112, 108, 119, 134, 145, 155, 159, 150, 147, 151,
	 151, 158, 158, 150, 137, 122, 100,  89,  87,  95, 112, 131, 140, 144, 144, 139,
	 140, 150, 162, 173, 172, 161, 140, 120, 109, 111, 117, 128, 139, 145, 145, 142,
	 139, 136, 131, 126, 114,  98,  80,  58,  38,  20,  11,  11,  16,  33,  70, 109,
	 148, 184, 189, 183, 184, 165, 144, 148, 148, 142, 145, 131, 116, 112, 106, 106,
	 125, 140, 151, 167, 164, 153, 155, 155, 155, 156, 150, 137, 125, 101,  86,  89,
	  87,  95, 125, 140, 144, 150, 148, 145, 155, 164, 172, 176, 165, 148, 133, 117,
	 112, 122, 131, 142, 151, 155, 153, 151, 147, 142, 139, 126, 108,  91,  70,  48,
	  28,  17,  13,  17,  25,  47,  86, 126, 170, 198, 198, 194, 187, 164, 145, 147,
	 140, 136, 137, 123, 111, 111, 106, 114, 134, 150, 164, 173, 169, 161, 161, 156,
	 153, 150, 140, 130, 112,  87,  69,  72,  86,  98, 112, 137, 151, 153, 148, 150,
	 161, 170, 170, 173, 165, 142, 125, 116, 111, 117, 130, 140, 147, 151, 151, 153,
	 153, 145, 139, 130, 109,  86,  67,  48,  31,  22,  14,  11,  17,  28,  56,  95,
	 139, 184, 204, 197, 195, 181, 148, 139, 137, 134, 136, 134, 120, 112, 109, 105,
	 119, 137, 153, 170, 175, 161, 151, 148, 139, 137, 137, 131, 122, 105,  80,  66,
	  69,  86, 111, 125, 145, 164, 162, 155, 156, 164, 169, 169, 164, 156, 142, 122,
	 114, 117, 126, 139, 155, 162, 162, 165, 161, 150, 140, 130, 120, 109,  89,  67,
	  52,  36,  22,  14,  14,  22,  39,  70, 108, 153, 194, 208, 200, 198, 181, 151,
	 144, 144, 140, 147, 144, 130, 125, 117, 112, 126, 144, 158, 172, 175, 159, 153,
	 150, 142, 142, 142, 134, 123, 109,  84,  72,  72,  78, 100, 126, 142, 153, 164,
	 167, 162, 162, 165, 165, 161, 150, 137, 125, 116, 114, 122, 136, 150, 161, 165,
	 164, 162, 155, 147, 139, 128, 116, 100,  81,  61,  45,  28,  16,  11,   5,   9,
	  25,  55,  91, 137, 186, 206, 204, 204, 192, 164, 148, 147, 142, 145, 145, 133,
	 125, 117, 106, 108, 122, 134, 148, 158, 151, 148, 147, 139, 137, 140, 139, 133,
	 123, 105,  87,  80,  77,  86, 100, 120, 137, 150, 161, 167, 170, 169, 167, 165,
	 158, 147, 137, 133, 130, 133, 139, 145, 155, 159, 164, 165, 167, 161, 151, 140,
	 126, 114, 101,  84,  67,  53,  38,  22,   9,   2,   2,  17,  41,  80, 125, 172,
	 208, 215, 209, 204, 187, 165, 159, 158, 153, 153, 144, 130, 120, 111, 103, 111,
	 126, 139, 151, 155, 148, 148, 148, 147, 150, 153, 148, 142, 130, 108,  94,  86,
	  81,  86,  97, 111, 125, 134, 144, 161, 169, 169, 169, 169, 162, 151, 140, 136,
	 140, 140, 145, 153, 159, 164, 169, 167, 162, 161, 150, 137, 126, 114,  98,  80,
	  62,  44,  30,  17,   6,   0,   2,   9,  27,  58, 100, 144, 190, 212, 211, 206,
	 195, 167, 147, 144, 137, 137, 139, 128, 119, 109,  95,  92, 103, 116, 131, 148,
	 151, 153, 156, 150, 147, 148, 147, 142, 137, 120, 101,  87,  77,  72,  77,  89,
	 100, 109, 123, 134, 151, 169, 175, 179, 181, 175, 159, 150, 144, 142, 145, 153,
	 161, 167, 172, 169, 164, 161, 156, 150, 142, 134, 123, 111,  94,  75,  59,  45,
	  36,  28,  22,  20,  20,  27,  47,  80, 117, 159, 198, 214, 211, 208, 189, 162,
	 150, 144, 139, 148, 150, 144, 136, 123, 106, 101, 106, 117, 137, 151, 159, 164,
	 162, 150, 140, 134, 131, 130, 128, 120, 109, 100,  86,  81,  81,  87, 100, 111,
	 117, 130, 150, 162, 165, 173, 179, 181, 175, 165, 159, 156, 151, 148, 155, 162,
	 169, 172, 170, 165, 161, 153, 140, 130, 122, 112, 100,  84,  70,  56,  45,  31,
	  22,  19,  16,  17,  27,  44,  70, 105, 139, 175, 198, 203, 200, 192, 169, 151,
	 142, 137, 144, 153, 155, 148, 139, 119, 106, 103, 103, 120, 134, 144, 148, 148,
	 140, 130, 122, 117, 120, 123, 123, 119, 112, 101,  91,  84,  84,  87,  92,  98,
	 105, 114, 134, 158, 169, 181, 190, 189, 183, 173, 165, 162, 165, 164, 170, 178,
	 179, 173, 165, 158, 150, 147, 140, 133, 126, 119, 108,  95,  83,  72,  64,  55,
	  44,  34,  25,  22,  20,  28,  48,  75, 106, 140, 178, 197, 200, 204, 195, 181,
	 169, 164, 161, 165, 169, 162, 158, 144, 122, 106,  97,  98, 108, 120, 128, 140,
	 147, 142, 136, 130, 125, 126, 126, 126, 126, 123, 111, 100,  89,  83,  81,  83,
	  91, 101, 114, 125, 148, 170, 179, 187, 194, 192, 187, 179, 170, 169, 170, 169,
	 172, 175, 173, 167, 159, 151, 145, 142, 133, 125, 122, 114, 105,  92,  81,  67,
	  56,  45,  33,  28,  22,  19,  19,  27,  41,  64,  97, 126, 164, 195, 204, 208,
	 208, 192, 169, 159, 150, 150, 156, 151, 147, 140, 125, 106,  97,  91,  94, 108,
	 119, 131, 142, 144, 137, 131, 123, 116, 112, 112, 112, 114, 112, 106, 100,  94,
	  92,  91,  95, 106, 122, 136, 147, 155, 162, 169, 172, 178, 187, 195, 200, 200,
	 198, 190, 183, 175, 167, 164, 162, 161, 158, 156, 151, 142, 130, 116, 105,  94,
	  86,  81,  75,  73,  69,  64,  56,  48,  42,  36,  36,  42,  53,  70,  94, 117,
	 140, 167, 183, 187, 189, 187, 175, 164, 158, 153, 151, 153, 150, 148, 145, 133,
	 122, 111, 105, 101, 105, 109, 116, 122, 123, 120, 116, 109, 108, 105, 103, 105,
	 108, 109, 111, 111, 111, 114, 114, 116, 123, 131, 139, 148, 161, 172, 181, 189,
	 194, 197, 195, 189, 183, 178, 172, 167, 165, 164, 165, 164, 161, 158, 155, 148,
	 139, 131, 122, 112, 103,  92,  83,  70,  61,  53,  48,  45,  44,  42,  39,  39,
	  41,  44,  53,  66,  87, 111, 133, 156, 178, 183, 181, 178, 164, 148, 142, 136,
	 136, 144, 147, 147, 150, 142, 126, 119, 105,  97, 100, 100, 103, 111, 116, 114,
	 112, 108, 100, 101, 103, 106, 116, 125, 134, 140, 147, 147, 142, 140, 140, 142,
	 147, 150, 156, 162, 165, 164, 164, 167, 172, 179, 187, 197, 201, 203, 200, 190,
	 181, 170, 161, 156, 156, 155, 151, 145, 134, 120, 105,  89,  78,  70,  67,  67,
	  72,  75,  75,  73,  67,  61,  52,  48,  45,  52,  58,  70,  87, 103, 120, 134,
	 148, 155, 155, 159, 156, 148, 148, 147, 147, 151, 153, 151, 150, 144, 130, 120,
	 111, 103, 101, 103, 106, 111, 117, 119, 117, 117, 114, 112, 111, 114, 119, 125,
	 133, 137, 140, 144, 144, 140, 137, 139, 140, 147, 156, 162, 170, 175, 175, 175,
	 176, 178, 181, 187, 192, 194, 192, 187, 178, 170, 158, 150, 142, 139, 137, 134,
	 130, 122, 111, 100,  87,  77,  69,  62,  62,  61,  62,  61,  58,  52,  44,  38,
	  30,  27,  30,  39,  53,  72,  94, 114, 134, 151, 156, 158, 161, 156, 151, 151,
	 153, 156, 162, 164, 164, 162, 153, 139, 128, 117, 109, 108, 108, 111, 120, 123,
	 123, 123, 122, 117, 112, 112, 114, 122, 131, 140, 147, 153, 156, 155, 151, 148,
	 145, 147, 150, 159, 172, 179, 183, 190, 192, 189, 186, 184, 186, 187, 189, 190,
	 192, 187, 181, 172, 162, 153, 144, 136, 128, 122, 116, 106,  95,  84,  72,  59,
	  52,  42,  36,  36,  33,  34,  33,  34,  31,  30,  30,  33,  42,  56,  73,  95,
	 119, 139, 156, 167, 172, 172, 167, 159, 158, 155, 158, 164, 167, 170, 169, 164,
	 150, 142, 128, 116, 112, 109, 109, 114, 117, 119, 119, 116, 111, 106, 105, 103,
	 108, 117, 130, 140, 153, 161, 165, 167, 164, 161, 158, 159, 162, 167, 176, 181,
	 184, 187, 187, 186, 181, 178, 175, 176, 176, 176, 176, 173, 169, 159, 150, 139,
	 128, 119, 109, 101,  92,  83,  75,  66,  55,  45,  38,  31,  28,  28,  28,  31,
	  33,  34,  38,  41,  44,  50,  62,  73,  92, 112, 131, 153, 170, 179, 186, 186,
	 178, 172, 167, 164, 165, 170, 173, 176, 175, 167, 156, 142, 128, 116, 108, 105,
	 105, 111, 117, 122, 125, 123, 120, 119, 116, 116, 120, 128, 140, 155, 167, 176,
	 181, 181, 176, 172, 167, 164, 165, 170, 176, 183, 189, 192, 190, 187, 179, 173,
	 169, 165, 162, 162, 161, 159, 156, 148, 140, 128, 116, 101,  89,  80,  72,  66,
	  61,  56,  50,  45,  39,  31,  25,  23,  22,  23,  27,  33,  38,  45,  53,  61,
	  72,  86, 103, 120, 140, 159, 172, 183, 187, 183, 176, 170, 162, 159, 161, 161,
	 162, 167, 165, 161, 151, 137, 125, 114, 105, 100, 101, 106, 112, 120, 125, 125,
	 123, 120, 117, 117, 120, 128, 139, 153, 165, 175, 184, 184, 183, 179, 173, 169,
	 169, 172, 176, 183, 187, 189, 187, 184, 178, 169, 161, 155, 150, 148, 147, 147,
	 145, 144, 136, 125, 112,  97,  84,  72,  62,  56,  55,  52,  48,  47,  42,  38,
	  33,  30,  28,  28,  31,  34,  44,  53,  64,  75,  87, 101, 116, 130, 145, 158,
	 169, 178, 184, 186, 186, 184, 181, 181, 179, 176, 178, 176, 175, 167, 159, 148,
	 136, 126, 116, 109, 106, 106, 108, 112, 114, 117, 117, 119, 119, 123, 128, 134,
	 144, 155, 167, 175, 181, 184, 187, 186, 183, 181, 178, 176, 176, 178, 178, 178,
	 178, 175, 170, 165, 158, 150, 145, 140, 136, 134, 131, 128, 122, 114, 103,  91,
	  78,  67,  58,  50,  44,  39,  36,  34,  33,  30,  27,  25,  25,  23,  27,  30,
	  36,  45,  58,  72,  84, 101, 119, 136, 151, 164, 175, 184, 187, 189, 189, 187,
	 187, 186, 187, 184, 184, 181, 175, 167, 156, 142, 131, 120, 112, 106, 103, 101,
	 103, 106, 108, 109, 111, 111, 114, 117, 122, 131, 140, 153, 165, 176, 184, 190,
	 194, 194, 192, 189, 184, 183, 181, 179, 178, 178, 178, 175, 172, 165, 159, 151,
	 147, 137, 133, 130, 125, 122, 117, 111, 101,  92,  81,  70,  62,  55,  47,  42,
	  39,  39,  38,  39,  39,  39,  41,  41,  42,  45,  48,  56,  64,  73,  84,  98,
	 112, 126, 142, 156, 169, 179, 187, 190, 192, 192, 192, 192, 194, 195, 195, 195,
	 190, 186, 176, 164, 151, 139, 128, 117, 109, 105, 101, 101, 101, 103, 106, 106,
	 108, 108, 111, 114, 122, 131, 139, 151, 162, 173, 181, 187, 189, 189, 189, 187,
	 186, 184, 181, 179, 176, 175, 172, 169, 162, 156, 148, 140, 131, 122, 114, 106,
	 100,  95,  89,  83,  77,  70,  66,  59,  53,  48,  45,  44,  44,  45,  45,  50,
	  53,  58,  59,  64,  67,  72,  75,  80,  84,  91,  98, 106, 116, 126, 137, 147,
	 156, 162, 170, 172, 176, 178, 181, 183, 183, 186, 186, 187, 187, 184, 181, 176,
	 170, 162, 153, 145, 137, 130, 125, 120, 119, 117, 117, 117, 117, 117, 116, 117,
	 117, 122, 126, 131, 137, 142, 150, 155, 159, 164, 169, 172, 173, 173, 173, 173,
	 173, 170, 169, 164, 159, 155, 151, 147, 140, 134, 128, 120, 111, 103,  97,  91,
	  86,  81,  78,  75,  72,  69,  67,  64,  64,  62,  62,  66,  69,  72,  77,  83,
	  89,  94,  98, 101, 105, 108, 109, 111, 112, 116, 120, 123, 128, 130, 134, 137,
	 140, 144, 145, 147, 147, 148, 148, 148, 148, 150, 153, 155, 155, 155, 155, 155,
	 155, 153, 151, 150, 150, 150, 151, 151, 151, 150, 150, 148, 147, 145, 144, 142,
	 140, 139, 137, 134, 133, 131, 130, 128, 126, 126, 126, 126, 125, 125, 123, 123,
	 123, 123, 123, 122, 122, 123, 123, 123, 123, 122, 122, 122, 122, 120, 119, 119,
	 119, 117, 116, 114, 114, 112, 111, 109, 108, 106, 105, 105, 105, 103, 103, 101,
	 101, 101, 103, 103, 103, 105, 106, 109, 111, 112, 116, 119, 122, 125, 125, 128,
	 131, 133, 134, 137, 140, 144, 145, 147, 150, 151, 155, 155, 158, 159, 159, 161,
	 161, 161, 162, 161, 159, 159, 158, 156, 153, 151, 150, 148, 145, 142, 139, 136,
	 133, 130, 128, 126, 123, 122, 119, 117, 116, 114, 112, 112, 112, 112, 109, 111,
	 111, 111, 111, 112, 112, 114, 116, 117, 119, 119, 122, 123, 125, 125, 126, 126,
	 126, 128, 128, 128, 128, 126, 126, 125, 123, 122, 120, 119, 117, 116, 114, 114,
	 111, 112, 109, 109, 112, 111, 111, 111, 111, 112, 116, 116, 117, 117, 117, 119,
	 119, 120, 122, 123, 126, 128, 130, 131, 133, 136, 137, 137, 140, 140, 142, 144,
	 145, 147, 148, 148, 150, 150, 150, 150, 148, 148, 147, 145, 144, 140, 140, 139,
	 137, 136, 134, 131, 130, 126, 125, 122, 120, 120, 117, 117, 116, 116, 117, 117,
	 117, 117, 119, 122, 122, 123, 126, 126, 128, 128, 130, 131, 131, 131, 131, 131,
	 131, 131, 131, 131, 131, 131, 131, 130, 130, 128, 128, 126, 126, 125, 123, 123,
	 122, 122, 119, 119, 119, 117, 117, 117, 117, 116, 116, 116, 117, 117, 117, 119,
	 119, 119, 120, 122, 123, 125, 126, 128, 130, 131, 133, 134, 136, 137, 137, 140,
	 140, 142, 142, 142, 142, 144, 140, 140, 142, 140, 140, 139, 139, 137, 136, 134,
	 133, 131, 130, 128, 126, 125, 125, 122, 120, 119, 119, 117, 116, 116, 117, 119,
	 120, 120, 120, 122, 122, 125, 125, 125, 126, 128, 128, 128, 128, 128, 130, 131,
	 131, 130, 130, 128, 130, 130, 128, 128, 126, 126, 126, 123, 122, 120, 119, 119,
	 117, 117, 117, 117, 117, 117, 116, 116, 114, 116, 117, 117, 119, 119, 120, 120,
	 122, 123, 125, 125, 126, 126, 128, 128, 130, 131, 131, 133, 134, 136, 136, 137,
	 137, 139, 137, 139, 140, 140, 140, 140, 139, 139, 137, 137, 136, 136, 136, 136,
	 134, 133, 133, 133, 133, 131, 131, 130, 130, 130, 130, 128, 128, 128, 128, 128,
	 128, 128, 128, 128, 130, 130, 128, 130, 128, 131, 131, 131, 131, 130, 131, 131,
	 131, 131, 131, 131, 131, 131, 130, 128, 126, 125, 125, 122, 122, 122, 120, 120,
	 117, 117, 116, 116, 117, 116, 116, 117, 117, 117, 117, 117, 117, 119, 119, 119,
	 120, 120, 120, 122, 122, 122, 123, 123, 126, 126, 128, 130, 130, 130, 131, 133,
	 133, 133, 133, 133, 133, 133, 131, 131, 131, 133, 133, 133, 133, 131, 131, 130,
	 131, 130, 130, 130, 130, 128, 128, 126, 126, 126, 126, 126, 126, 126, 126, 128,
	 126, 126, 126, 128, 128, 128, 128, 128, 130, 130, 128, 128, 128, 130, 130, 128,
	 128, 128, 128, 126, 126, 125, 125, 125, 126, 126, 126, 125, 125, 123, 125, 125,
	 125, 123, 123, 125, 123, 123, 122, 122, 123, 125, 125, 125, 125, 126, 128, 128,
	 130, 128, 131, 133, 131, 134, 133, 134, 136, 134, 134, 134, 134, 134, 134, 136,
	 133, 133, 133, 133, 133, 133, 133, 133, 131, 131, 131, 130, 130, 130, 131, 131,
	 131, 131, 131, 130, 128, 128, 126, 126, 126, 125, 125, 125, 125, 125, 125, 125,
	 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 123, 123, 122, 123, 122, 122,
	 120, 122, 120, 120, 122, 122, 120, 122, 122, 122, 122, 122, 122, 122, 122, 123,
	 123, 123, 123, 125, 125, 125, 125, 126, 126, 126, 126, 126, 128, 128, 128, 130,
	 130, 130, 130, 130, 131, 131, 131, 130, 131, 131, 131, 130, 130, 131, 131, 131,
	 131, 130, 130, 131, 131, 131, 133, 131, 133, 133, 131, 131, 131, 133, 131, 131,
	 131, 130, 130, 131, 131, 131, 131, 130, 131, 131, 130, 130, 130, 130, 130, 130,
	 130, 130, 128, 128, 126, 126, 125, 126, 126, 125, 125, 123, 125, 125, 125, 125,
	 125, 126, 126, 126, 126, 125, 125, 125, 126, 126, 126, 128, 128, 128, 128, 126,
	 126, 128, 130, 130, 130, 130, 130, 130, 133, 139, 140, 136, 133, 133, 131, 131,
	 130, 131, 133, 133, 134, 131, 128, 123, 125, 123, 122, 125, 126, 126, 125, 125,
	 125, 125, 123, 122, 120, 125, 128, 126, 126, 130, 134, 134, 128, 123, 125, 128,
	 130, 130, 128, 128, 128, 128, 125, 122, 122, 122, 122, 122, 122, 122, 117, 116,
	 116, 119, 119, 117, 117, 117, 120, 120, 120, 120, 122, 123, 125, 126, 126, 126,
	 126, 126, 128, 128, 130, 130, 130, 128, 128, 128, 130, 130, 130, 133, 131, 131,
	 131, 131, 131, 133, 133, 131, 131, 133, 133, 130, 128, 126, 128, 130, 130, 130,
	 130, 128, 128, 128, 128, 130, 130, 128, 130, 130, 130, 128, 128, 128, 128, 126,
	 126, 128, 128, 125, 125, 125, 125, 126, 123, 122, 122, 122, 123, 125, 123, 123,
	 123, 123, 123, 122, 123, 123, 122, 122, 122, 122, 125, 123, 123, 123, 122, 123,
	 122, 125, 125, 125, 123, 125, 126, 128, 126, 125, 126, 126, 126, 126, 126, 126,
	 126, 126, 128, 128, 128, 126, 128, 128, 130, 131, 130, 130, 130, 130, 131, 133,
	 131, 131, 130, 130, 130, 130, 128, 128, 128, 128, 130, 130, 128, 128, 130, 128,
	 128, 126, 128, 126, 125, 123, 125, 125, 125, 123, 123, 123, 123, 122, 122, 122,
	 123, 122, 119, 120, 120, 120, 117, 116, 117, 117, 116, 112, 112, 112, 111, 109,
	 108, 108, 106, 105, 106, 105, 105, 105, 105, 105, 108, 112, 116, 117, 122, 125,
	 128, 130, 133, 137, 142, 145, 147, 150, 151, 155, 156, 158, 161, 161, 161, 159,
	 159, 159, 158, 158, 156, 155, 155, 153, 150, 147, 145, 144, 144, 140, 139, 139,
	 137, 136, 134, 134, 131, 133, 133, 133, 133, 133, 133, 131, 130, 128, 126, 126,
	 123, 122, 120, 119, 117, 116, 114, 111, 109, 108, 105, 101,  98,  97,  94,  91,
	  86,  84,  83,  78,  73,  70,  73,  81,  83,  78,  83, 100, 108, 103, 105, 123,
	 137, 139, 142, 150, 167, 179, 178, 175, 183, 194, 194, 181, 173, 178, 181, 167,
	 153, 148, 147, 142, 123, 112, 109, 111, 100,  87,  86,  91,  92,  86,  81,  91,
	 100, 103, 103, 111, 125, 134, 137, 145, 158, 167, 175, 178, 184, 192, 197, 197,
	 198, 201, 200, 194, 189, 186, 179, 172, 159, 151, 144, 131, 120, 109, 100,  89,
	  80,  70,  64,  59,  52,  48,  47,  47,  47,  47,  47,  50,  55,  56,  58,  61,
	  69,  77,  78,  81,  91, 105, 111, 114, 119, 137, 150, 142, 148, 165, 173, 170,
	 173, 181, 192, 194, 187, 183, 187, 192, 183, 169, 162, 167, 162, 147, 136, 131,
	 131, 123, 111, 103, 105, 105,  98,  91,  91,  97,  98,  97,  97, 105, 112, 117,
	 120, 126, 144, 151, 142, 155, 181, 184, 176, 179, 192, 209, 204, 190, 198, 209,
	 204, 194, 179, 179, 184, 169, 150, 144, 140, 133, 116, 100,  94,  92,  81,  64,
	  56,  53,  55,  50,  41,  41,  47,  48,  47,  45,  45,  58,  67,  67,  67,  72,
	  81,  89,  91,  87,  97, 111, 122, 122, 123, 134, 145, 147, 151, 159, 162, 169,
	 176, 176, 176, 181, 184, 184, 183, 178, 176, 172, 165, 159, 151, 145, 140, 134,
	 125, 119, 112, 108, 105, 100,  97,  97,  97,  97,  97,  98, 101, 108, 112, 116,
	 123, 130, 142, 153, 155, 150, 170, 189, 186, 178, 183, 201, 209, 194, 184, 197,
	 200, 194, 179, 167, 170, 170, 151, 134, 130, 125, 119, 101,  84,  81,  81,  70,
	  55,  47,  47,  52,  45,  36,  39,  50,  52,  48,  48,  56,  70,  70,  69,  77,
	  87,  94,  95,  98, 106, 119, 123, 128, 136, 145, 151, 155, 161, 170, 169, 172,
	 181, 189, 189, 186, 189, 190, 187, 183, 178, 173, 169, 162, 156, 147, 139, 133,
	 123, 116, 109, 105, 100,  95,  91,  89,  89,  89,  91,  91,  94, 100, 105, 109,
	 116, 122, 131, 144, 151, 150, 158, 173, 181, 179, 176, 184, 197, 194, 183, 184,
	 189, 186, 178, 164, 158, 158, 147, 131, 119, 112, 108,  98,  81,  72,  70,  66,
	  56,  48,  44,  47,  48,  42,  41,  50,  55,  59,  61,  66,  77,  80,  81,  87,
	  97, 100, 101, 108, 117, 123, 128, 134, 142, 150, 151, 150, 159, 173, 170, 167,
	 176, 189, 189, 183, 183, 189, 190, 184, 178, 172, 169, 165, 156, 144, 139, 136,
	 130, 120, 111, 108, 106, 103,  97,  94,  95,  97,  97,  97,  98, 106, 112, 116,
	 120, 130, 137, 145, 150, 156, 165, 170, 175, 178, 181, 184, 189, 187, 187, 187,
	 183, 176, 172, 167, 161, 151, 145, 140, 130, 120, 112, 105,  97,  91,  84,  78,
	  72,  67,  62,  61,  59,  59,  59,  61,  64,  67,  69,  73,  78,  84,  84,  84,
	  91, 101, 101,  98, 100, 111, 120, 122, 120, 126, 140, 151, 144, 139, 159, 170,
	 164, 161, 172, 184, 184, 176, 176, 179, 183, 176, 167, 159, 158, 158, 144, 140,
	 128, 123, 116, 109, 105, 100,  94,  89,  87,  86,  87,  86,  86,  89,  95, 100,
	 106, 112, 120, 128, 134, 142, 151, 158, 164, 169, 178, 183, 183, 183, 186, 187,
	 186, 183, 178, 176, 172, 164, 155, 147, 142, 136, 126, 117, 111, 105,  95,  89,
	  81,  75,  69,  66,  64,  62,  62,  61,  62,  66,  72,  70,  73,  81,  86,  91,
	  91,  95, 103, 109, 111, 109, 116, 123, 130, 133, 133, 137, 148, 153, 147, 151,
	 164, 167, 165, 167, 175, 181, 179, 175, 175, 176, 178, 169, 159, 156, 155, 145,
	 136, 131, 128, 125, 117, 109, 106, 105, 100,  97,  95,  95,  95,  94,  97, 101,
	 105, 108, 112, 120, 128, 133, 137, 145, 151, 155, 159, 164, 170, 170, 172, 172,
	 173, 172, 170, 167, 164, 159, 155, 148, 140, 136, 130, 125, 119, 116, 111, 105,
	  98,  94,  89,  86,  81,  78,  78,  77,  78,  80,  81,  86,  87,  91,  95, 100,
	 103, 108, 112, 117, 122, 123, 126, 131, 133, 133, 133, 133, 131, 131, 131, 131,
	 130, 130, 130, 130, 128, 128, 126, 128, 128, 130, 130, 130, 130, 130, 133, 134,
	 136, 134, 137, 139, 140, 142, 144, 147, 148, 150, 151, 150, 151, 151, 151, 150,
	 150, 148, 147, 144, 140, 139, 137, 134, 133, 133, 130, 126, 125, 125, 125, 125,
	 123, 125, 125, 123, 125, 123, 123, 126, 128, 130, 131, 133, 133, 136, 136, 136,
	 137, 139, 139, 139, 139, 139, 139, 137, 136, 133, 131, 130, 126, 126, 125, 120,
	 119, 116, 114, 112, 109, 111, 109, 108, 106, 106, 105, 105, 103, 103, 105, 105,
	 105, 105, 106, 108, 109, 109, 111, 112, 116, 116, 117, 120, 123, 125, 128, 130,
	 131, 134, 136, 139, 142, 142, 142, 142, 144, 144, 144, 142, 144, 142, 140, 139,
	 139, 139, 139, 137, 136, 136, 136, 134, 131, 130, 130, 128, 126, 126, 128, 126,
	 125, 123, 123, 125, 126, 125, 125, 126, 126, 126, 126, 125, 126, 128, 128, 128,
	 128, 128, 130, 131, 131, 131, 133, 133, 133, 133, 131, 131, 131, 131, 131, 130,
	 130, 128, 130, 128, 126, 125, 123, 123, 122, 120, 119, 119, 117, 116, 112, 111,
	 111, 109, 111, 111, 112, 111, 112, 112, 114, 114, 114, 116, 119, 120, 122, 123,
	 125, 126, 128, 131, 133, 134, 136, 137, 137, 140, 140, 140, 140, 140, 142, 142,
	 142, 142, 140, 140, 139, 136, 137, 136, 136, 134, 133, 131, 130, 130, 130, 128,
	 128, 131, 134, 136, 134, 134, 134, 134, 133, 131, 128, 128, 128, 130, 133, 131,
	 131, 131, 133, 131, 130, 128, 125, 123, 125, 125, 123, 125, 125, 125, 126, 125,
	 125, 123, 123, 123, 123, 123, 123, 122, 122, 120, 119, 119, 117, 116, 114, 112,
	 112, 114, 114, 112, 111, 111, 112, 112, 112, 111, 112, 114, 114, 116, 116, 116,
	 116, 117, 119, 120, 122, 125, 128, 130, 133, 134, 136, 136, 137, 139, 139, 140,
	 142, 142, 142, 142, 140, 140, 140, 139, 137, 137, 136, 134, 134, 133, 134, 133,
	 133, 133, 133, 131, 133, 131, 137, 144, 139, 137, 140, 145, 144, 142, 139, 142,
	 144, 144, 145, 139, 137, 137, 137, 139, 134, 131, 130, 130, 133, 131, 126, 123,
	 122, 122, 123, 123, 119, 114, 114, 117, 119, 114, 109, 108, 109, 111, 108, 105,
	 100,  98,  98,  98,  97,  94,  91,  91,  94,  95,  92,  91,  97, 105, 109, 109,
	 114, 122, 130, 136, 142, 145, 148, 156, 164, 165, 167, 165, 167, 169, 167, 165,
	 159, 155, 151, 148, 142, 134, 128, 122, 120, 117, 112, 108, 105, 105, 108, 109,
	 108, 109, 112, 119, 123, 125, 130, 136, 140, 148, 155, 159, 162, 164, 167, 170,
	 167, 164, 164, 165, 165, 161, 156, 151, 147, 142, 139, 133, 128, 122, 119, 114,
	 109, 105, 100,  98,  94,  91,  87,  86,  84,  80,  78,  78,  77,  77,  75,  75,
	  75,  72,  72,  77,  77,  77,  78,  80,  86,  97, 109, 117, 119, 134, 159, 162,
	 153, 167, 187, 189, 186, 189, 198, 200, 194, 190, 189, 179, 172, 162, 151, 144,
	 133, 120, 112, 108, 103,  97,  91,  87,  87,  91,  95,  97, 100, 109, 122, 131,
	 134, 139, 151, 164, 170, 172, 175, 181, 184, 186, 187, 184, 178, 176, 176, 173,
	 165, 159, 158, 156, 151, 148, 144, 137, 137, 134, 133, 128, 120, 112, 111, 111,
	 103,  94,  87,  86,  83,  78,  70,  66,  62,  61,  62,  62,  59,  58,  62,  69,
	  69,  69,  75,  81,  86,  89,  92,  98, 108, 122, 133, 136, 144, 169, 175, 158,
	 165, 190, 186, 169, 172, 183, 181, 167, 164, 164, 155, 145, 139, 130, 122, 117,
	 109, 106, 103, 101,  98, 101,  98, 100, 106, 111, 117, 117, 126, 137, 145, 144,
	 147, 159, 167, 165, 164, 169, 173, 170, 164, 169, 169, 161, 159, 161, 158, 153,
	 153, 155, 153, 150, 148, 148, 147, 140, 137, 136, 131, 123, 114, 111, 108,  98,
	  89,  84,  80,  75,  69,  69,  67,  64,  64,  67,  70,  69,  73,  81,  89,  89,
	  87,  94, 101, 101,  97, 100, 108, 112, 123, 139, 136, 133, 161, 176, 158, 150,
	 178, 187, 169, 167, 183, 183, 170, 169, 173, 164, 155, 153, 145, 137, 134, 126,
	 119, 112, 111, 111, 111, 108, 106, 112, 119, 120, 119, 125, 137, 144, 147, 147,
	 150, 159, 164, 162, 162, 164, 161, 158, 158, 159, 155, 148, 151, 151, 147, 145,
	 147, 145, 144, 145, 144, 140, 137, 136, 134, 130, 123, 116, 109, 103,  98,  89,
	  83,  80,  72,  69,  67,  67,  67,  67,  69,  72,  73,  78,  83,  86,  92,  95,
	  95,  97, 100, 103, 103, 103, 105, 106, 106, 117, 130, 131, 130, 147, 167, 156,
	 145, 167, 183, 170, 164, 175, 179, 169, 167, 170, 161, 150, 148, 142, 131, 126,
	 122, 116, 112, 109, 108, 111, 111, 108, 112, 122, 126, 125, 128, 140, 148, 147,
	 147, 153, 158, 156, 153, 156, 170, 173, 145, 139, 164, 169, 150, 136, 139, 151,
	 150, 144, 150, 142, 133, 145, 150, 140, 134, 126, 128, 126, 119, 112, 108,  95,
	  89,  94,  94,  84,  69,  67,  80,  84,  75,  70,  78,  86,  89,  92,  95, 101,
	 100, 100, 108, 109, 101,  98, 106, 111, 108, 105, 119, 131, 133, 137, 158, 162,
	 145, 150, 179, 179, 161, 159, 176, 176, 164, 161, 162, 151, 142, 144, 134, 123,
	 119, 114, 109, 109, 105, 103, 105, 109, 111, 116, 122, 122, 122, 130, 142, 147,
	 142, 144, 155, 159, 145, 140, 155, 155, 140, 134, 140, 145, 136, 130, 142, 144,
	 134, 139, 147, 147, 145, 145, 148, 147, 142, 142, 137, 130, 123, 122, 117, 108,
	  97,  92,  97,  92,  84,  78,  81,  84,  83,  84,  87,  91,  91,  95, 105, 109,
	 108, 108, 108, 109, 109, 105, 103, 103, 105, 108, 109, 114, 125, 131, 136, 156,
	 165, 153, 158, 179, 184, 170, 169, 178, 176, 164, 162, 164, 147, 134, 137, 131,
	 119, 114, 111, 108, 109, 112, 111, 112, 114, 117, 125, 133, 133, 130, 134, 144,
	 148, 144, 145, 151, 151, 137, 140, 150, 145, 134, 131, 142, 148, 140, 139, 150,
	 148, 147, 151, 156, 155, 151, 150, 151, 148, 142, 139, 133, 123, 119, 119, 111,
	 103,  92,  87,  91,  87,  80,  77,  78,  81,  84,  86,  89,  94,  92,  95, 103,
	 106, 105, 103, 103, 103, 100,  94,  92,  92,  94,  94, 100, 112, 123, 126, 139,
	 162, 165, 153, 162, 184, 178, 161, 164, 175, 162, 150, 148, 145, 133, 126, 126,
	 117, 111, 111, 111, 111, 114, 116, 117, 120, 123, 128, 136, 140, 136, 131, 134,
	 140, 142, 137, 136, 142, 145, 136, 133, 144, 148, 140, 137, 147, 153, 151, 150,
	 159, 159, 155, 156, 159, 159, 155, 150, 147, 145, 142, 137, 131, 125, 120, 119,
	 116, 111, 103,  97,  98,  97,  91,  86,  87,  86,  89,  91,  95, 100,  97,  98,
	 101, 109, 109, 101,  95, 100, 103,  97,  91,  91,  95, 101, 109, 120, 130, 136,
	 156, 173, 165, 158, 173, 183, 164, 153, 162, 164, 147, 136, 139, 134, 125, 123,
	 120, 116, 117, 122, 117, 119, 125, 128, 128, 130, 130, 131, 134, 133, 126, 123,
	 125, 130, 130, 125, 125, 130, 137, 140, 139, 140, 148, 148, 150, 155, 158, 155,
	 151, 155, 155, 155, 150, 145, 145, 145, 145, 140, 133, 130, 131, 130, 126, 120,
	 114, 109, 106, 100,  94,  89,  84,  81,  81,  83,  86,  86,  86,  89,  94,  97,
	  97,  98, 101, 105, 103,  97,  95,  97,  94,  91,  91,  92, 100, 112, 128, 137,
	 144, 162, 178, 167, 161, 176, 181, 161, 150, 158, 156, 142, 139, 140, 133, 125,
	 128, 128, 120, 128, 130, 126, 130, 137, 139, 136, 134, 133, 134, 136, 134, 126,
	 122, 125, 128, 131, 131, 136, 139, 145, 156, 156, 153, 159, 161, 159, 161, 159,
	 158, 156, 153, 155, 153, 147, 145, 145, 145, 145, 139, 134, 136, 136, 133, 131,
	 122, 111, 105, 101,  97,  92,  86,  81,  81,  83,  86,  89,  91,  92,  95,  97,
	 100, 100, 100, 101,  97,  95,  92,  92,  94,  92,  92,  91,  97, 109, 125, 137,
	 142, 153, 172, 178, 167, 165, 172, 165, 151, 145, 148, 142, 128, 128, 130, 126,
	 126, 130, 128, 126, 131, 136, 133, 134, 137, 136, 131, 130, 128, 126, 125, 122,
	 116, 114, 119, 125, 125, 128, 134, 142, 155, 162, 158, 155, 158, 156, 156, 155,
	 153, 148, 144, 140, 144, 144, 139, 140, 139, 140, 142, 140, 137, 134, 133, 130,
	 125, 114, 106, 101,  97,  89,  84,  81,  80,  81,  84,  89,  94,  97,  97,  97,
	  98, 103, 101, 100, 101, 100,  94,  92,  94,  95,  94,  91,  97, 114, 134, 147,
	 153, 169, 183, 176, 164, 170, 176, 159, 145, 145, 144, 136, 131, 136, 136, 131,
	 133, 139, 140, 139, 144, 144, 142, 144, 142, 142, 136, 128, 120, 120, 120, 117,
	 112, 116, 120, 126, 131, 136, 140, 144, 147, 150, 164, 192, 190, 155, 140, 145,
	 147, 147, 145, 144, 137, 122, 122, 142, 151, 150, 148, 140, 139, 139, 137, 133,
	 125, 109,  98,  95,  83,  75,  78,  81,  83,  77,  75,  83,  92,  97, 101, 108,
	 103, 101,  98, 100, 103, 100,  92,  89,  83,  73,  75,  86,  97, 106, 119, 131,
	 147, 165, 189, 194, 176, 165, 162, 153, 145, 150, 145, 131, 120, 119, 122, 125,
	 133, 140, 139, 136, 140, 144, 145, 151, 150, 144, 136, 126, 120, 120, 122, 119,
	 114, 111, 116, 123, 130, 136, 145, 159, 170, 165, 156, 159, 161, 153, 147, 144,
	 142, 140, 136, 137, 142, 142, 140, 147, 148, 150, 151, 148, 145, 144, 137, 133,
	 128, 114, 103,  98,  92,  86,  84,  87,  91,  91,  91,  95, 105, 106, 108, 109,
	 111, 109, 109, 108, 105,  98,  91,  86,  86,  84,  83,  86,  92, 101, 116, 134,
	 151, 167, 184, 190, 179, 169, 165, 158, 144, 137, 136, 130, 120, 120, 123, 122,
	 125, 134, 140, 145, 148, 148, 144, 142, 140, 139, 136, 131, 120, 111, 106, 105,
	 103, 106, 114, 120, 126, 130, 134, 142, 147, 151, 155, 161, 175, 176, 153, 137,
	 131, 123, 119, 125, 133, 139, 137, 139, 144, 145, 147, 150, 153, 148, 140, 134,
	 123, 109,  98,  95,  95,  87,  80,  80,  84,  86,  89,  97, 108, 112, 111, 111,
	 112, 109, 103,  98,  97,  97,  94,  92,  89,  87,  84,  86,  91, 101, 112, 128,
	 142, 156, 170, 187, 197, 184, 173, 162, 148, 131, 126, 130, 131, 130, 130, 126,
	 125, 131, 142, 150, 155, 159, 158, 150, 144, 139, 134, 134, 130, 122, 116, 112,
	 108, 105, 108, 120, 130, 139, 147, 151, 153, 153, 161, 169, 165, 159, 153, 140,
	 126, 117, 119, 126, 134, 142, 150, 151, 148, 147, 148, 151, 155, 155, 148, 137,
	 123, 114, 105,  97,  94,  95,  95,  92,  94,  94,  95, 101, 105, 111, 116, 117,
	 116, 109, 105,  98,  94,  94,  95,  95,  92,  89,  86,  84,  84,  89,  98, 111,
	 123, 137, 151, 164, 176, 183, 176, 167, 156, 142, 128, 120, 122, 123, 125, 130,
	 131, 130, 133, 139, 142, 145, 151, 153, 147, 140, 134, 131, 128, 122, 116, 112,
	 112, 109, 108, 111, 117, 123, 131, 139, 147, 150, 151, 148, 145, 144, 140, 139,
	 147, 158, 150, 142, 139, 136, 130, 128, 133, 144, 153, 158, 164, 159, 150, 144,
	 134, 126, 123, 122, 116, 105,  95,  89,  89,  87,  91, 103, 116, 120, 120, 119,
	 116, 112, 108, 109, 112, 112, 108, 103,  97,  92,  91,  91,  94,  95,  97, 101,
	 106, 114, 123, 137, 151, 165, 181, 190, 186, 173, 161, 140, 126, 116, 116, 123,
	 130, 136, 134, 134, 134, 134, 134, 137, 145, 151, 151, 148, 144, 136, 123, 116,
	 111, 111, 116, 116, 117, 116, 116, 119, 122, 130, 137, 147, 153, 155, 159, 161,
	 153, 142, 137, 130, 122, 122, 123, 128, 134, 139, 144, 145, 145, 148, 147, 144,
	 144, 144, 137, 128, 120, 114, 105,  97,  92,  94,  97,  98, 103, 105, 109, 111,
	 111, 114, 116, 116, 116, 114, 109, 106, 100,  95,  95,  97,  97,  95,  95,  97,
	  97,  98, 101, 105, 112, 123, 134, 147, 161, 173, 176, 172, 165, 158, 144, 131,
	 128, 126, 128, 133, 137, 139, 137, 136, 134, 133, 133, 139, 142, 140, 142, 140,
	 139, 133, 125, 119, 116, 114, 116, 117, 122, 126, 130, 133, 136, 137, 142, 145,
	 148, 155, 164, 164, 156, 150, 140, 130, 123, 122, 128, 137, 144, 151, 155, 153,
	 153, 148, 140, 139, 139, 137, 133, 130, 123, 117, 106,  98,  95,  94,  97, 101,
	 106, 109, 109, 111, 112, 112, 111, 111, 109, 108, 108, 108, 103,  97,  94,  89,
	  84,  83,  86,  92,  98, 106, 116, 125, 136, 147, 159, 169, 175, 173, 169, 159,
	 147, 133, 125, 120, 119, 126, 130, 134, 137, 136, 131, 126, 126, 128, 130, 131,
	 136, 137, 136, 131, 125, 119, 112, 109, 108, 111, 117, 123, 128, 133, 137, 140,
	 139, 139, 144, 151, 158, 159, 161, 158, 147, 136, 131, 128, 128, 134, 142, 151,
	 156, 161, 156, 148, 142, 134, 128, 123, 120, 120, 120, 116, 111, 105,  98,  95,
	  94,  94,  97, 101, 109, 112, 114, 116, 109, 106, 101, 100,  98,  97,  97,  98,
	  98,  95,  94,  95,  98, 105, 112, 123, 134, 147, 158, 167, 169, 169, 167, 162,
	 155, 148, 142, 136, 136, 137, 137, 139, 139, 139, 136, 131, 128, 128, 130, 128,
	 131, 133, 133, 131, 128, 125, 120, 119, 117, 116, 119, 123, 126, 131, 136, 139,
	 144, 148, 155, 156, 159, 158, 158, 155, 145, 144, 139, 139, 140, 144, 147, 150,
	 150, 147, 145, 142, 137, 130, 123, 119, 117, 112, 108, 105, 101,  97,  92,  89,
	  89,  91,  91,  94,  97,  98, 100,  98, 100, 101, 100,  98,  95,  92,  89,  89,
	  87,  87,  91,  97, 103, 111, 119, 128, 139, 151, 159, 164, 165, 162, 158, 150,
	 144, 136, 134, 134, 137, 140, 142, 144, 142, 139, 134, 133, 128, 126, 126, 130,
	 131, 131, 131, 130, 128, 125, 122, 119, 119, 120, 123, 130, 139, 151, 158, 162,
	 164, 161, 156, 148, 144, 142, 142, 145, 151, 156, 159, 159, 155, 151, 147, 145,
	 140, 139, 139, 140, 139, 134, 130, 122, 114, 105,  97,  91,  87,  86,  87,  92,
	  95,  95,  94,  95,  94,  92,  92,  94,  98, 101, 105, 105, 105, 105, 100, 101,
	 103, 106, 112, 120, 130, 139, 150, 158, 162, 164, 162, 158, 151, 147, 142, 139,
	 137, 139, 140, 142, 142, 140, 137, 133, 131, 128, 125, 123, 123, 123, 125, 126,
	 126, 126, 123, 122, 120, 119, 119, 120, 128, 137, 145, 153, 159, 162, 162, 158,
	 151, 145, 140, 137, 139, 140, 145, 150, 153, 155, 153, 148, 142, 134, 130, 126,
	 122, 120, 117, 114, 112, 108, 103,  97,  91,  86,  80,  78,  77,  78,  80,  81,
	  83,  84,  86,  87,  89,  91,  91,  91,  94,  95, 100, 103, 108, 116, 122, 126,
	 133, 137, 145, 151, 158, 161, 164, 164, 161, 156, 151, 145, 140, 139, 137, 137,
	 137, 139, 139, 140, 140, 140, 137, 133, 131, 130, 128, 126, 128, 130, 133, 134,
	 136, 139, 140, 145, 148, 150, 153, 155, 156, 158, 158, 159, 161, 161, 161, 159,
	 158, 155, 151, 151, 150, 147, 144, 142, 139, 136, 131, 128, 123, 119, 114, 109,
	 105, 100,  98,  95,  92,  89,  87,  86,  84,  84,  83,  81,  81,  83,  84,  86,
	  87,  91,  94,  98, 100, 103, 108, 112, 117, 125, 134, 142, 148, 150, 148, 147,
	 144, 139, 134, 131, 131, 136, 142, 145, 151, 153, 151, 148, 142, 134, 128, 123,
	 120, 122, 126, 131, 136, 140, 144, 145, 144, 140, 136, 134, 133, 134, 137, 142,
	 145, 150, 151, 153, 151, 151, 148, 145, 144, 142, 142, 140, 142, 140, 140, 139,
	 136, 133, 130, 123, 119, 114, 111, 108, 105, 103, 100,  97,  95,  92,  91,  87,
	  86,  89,  89,  91,  92,  95,  97,  98, 101, 100, 103, 103, 106, 109, 111, 114,
	 119, 122, 125, 128, 130, 133, 133, 134, 136, 137, 137, 139, 140, 140, 140, 140,
	 140, 140, 140, 140, 142, 140, 142, 142, 142, 142, 144, 145, 147, 147, 147, 148,
	 148, 150, 151, 151, 153, 155, 156, 158, 158, 156, 155, 151, 150, 148, 147, 145,
	 144, 144, 144, 142, 140, 137, 136, 134, 131, 128, 125, 122, 120, 116, 114, 111,
	 109, 108, 105, 105, 103, 101, 100,  98,  97,  97,  97,  98, 100, 100, 101, 103,
	 105, 105, 105, 105, 105, 105, 105, 106, 109, 111, 111, 112, 114, 117, 119, 120,
	 119, 120, 120, 122, 122, 125, 126, 130, 133, 134, 137, 136, 136, 137, 137, 137,
	 137, 139, 139, 139, 139, 139, 137, 140, 140, 140, 139, 139, 139, 137, 140, 137,
	 139, 140, 140, 142, 140, 140, 139, 140, 139, 139, 137, 137, 137, 137, 137, 137,
	 137, 137, 137, 137, 136, 134, 133, 130, 128, 125, 123, 123, 123, 122, 120, 117,
	 116, 112, 112, 111, 109, 109, 108, 108, 108, 106, 106, 106, 108, 108, 106, 106,
	 106, 108, 109, 112, 114, 119, 122, 123, 125, 128, 130, 131, 133, 133, 134, 136,
	 140, 142, 145, 147, 147, 147, 145, 144, 142, 139, 137, 137, 139, 140, 139, 139,
	 139, 137, 136, 131, 128, 125, 123, 123, 123, 125, 126, 128, 130, 130, 130, 128,
	 126, 126, 130, 130, 131, 133, 133, 133, 133, 131, 130, 130, 128, 126, 126, 126,
	 126, 126, 125, 123, 120, 119, 116, 112, 111, 109, 109, 109, 111, 111, 111, 111,
	 111, 111, 112, 111, 111, 111, 111, 114, 114, 116, 119, 120, 122, 123, 123, 125,
	 126, 128, 130, 131, 133, 134, 134, 136, 136, 136, 134, 136, 136, 137, 139, 137,
	 139, 137, 139, 137, 137, 137, 136, 136, 136, 136, 134, 134, 136, 134, 136, 137,
	 137, 139, 137, 137, 136, 134, 133, 133, 131, 131, 131, 133, 133, 133, 134, 133,
	 134, 133, 133, 128, 128, 125, 123, 126, 125, 126, 126, 126, 125, 123, 123, 122,
	 120, 120, 120, 120, 120, 120, 122, 122, 122, 123, 122, 122, 122, 122, 122, 123,
	 125, 126, 126, 126, 126, 126, 126, 128, 128, 128, 128, 130, 131, 131, 131, 131,
	 131, 131, 131, 133, 134, 134, 134, 134, 134, 133, 131, 131, 131, 133, 133, 133,
	 133, 134, 136, 134, 134, 131, 133, 131, 130, 130, 128, 130, 128, 128, 126, 125,
	 123, 122, 122, 120, 120, 122, 122, 122, 122, 120, 122, 120, 120, 119, 117, 117,
	 117, 117, 117, 117, 117, 119, 120, 119, 119, 117, 119, 120, 120, 120, 120, 120,
	 120, 122, 122, 122, 122, 122, 122, 122, 123, 125, 125, 126, 126, 125, 126, 126,
	 126, 126, 128, 128, 131, 131, 133, 133, 133, 133, 134, 137, 134, 137, 137, 137,
	 139, 137, 137, 137, 137, 137, 137, 139, 137, 137, 136, 136, 137, 136, 134, 134,
	 131, 130, 130, 131, 131, 131, 131, 131, 128, 128, 126, 125, 123, 125, 125, 125,
	 125, 126, 126, 126, 126, 126, 125, 125, 123, 122, 122, 122, 122, 122, 122, 122,
	 123, 123, 123, 122, 122, 122, 123, 123, 122, 122, 122, 123, 125, 126, 125, 128,
	 126, 126, 125, 123, 122, 122, 123, 125, 126, 128, 130, 131, 133, 133, 133, 131,
	 131, 131, 131, 131, 131, 131, 133, 131, 133, 133, 133, 131, 130, 128, 128, 130,
	 130, 131, 130, 130, 128, 128, 128, 126, 126, 126, 128, 128, 126, 126, 123, 123,
	 123, 123, 123, 123, 125, 125, 125, 125, 125, 123, 123, 123, 123, 123, 125, 125,
	 123, 123, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 123, 123, 123, 122,
	 123, 125, 125, 126, 126, 126, 126, 126, 128, 128, 130, 130, 130, 131, 131, 133,
	 134, 134, 134, 134, 134, 134, 136, 136, 137, 137, 137, 137, 136, 136, 136, 134,
	 134, 133, 131, 133, 133, 134, 134, 133, 133, 133, 133, 133, 133, 131, 128, 128,
	 128, 130, 128, 130, 131, 130, 130, 128, 126, 125, 125, 125, 123, 123, 123, 125,
	 125, 125, 125, 123, 123, 123, 125, 125, 125, 125, 125, 123, 123, 122, 122, 123,
	 123, 125, 123, 123, 122, 122, 120, 120, 120, 120, 122, 123, 125, 125, 126, 126,
	 125, 123, 123, 122, 123, 123, 123, 125, 126, 126, 128, 128, 128, 128, 128, 130,
	 130, 130, 126, 130, 128, 130, 130, 128, 131, 128, 128, 126, 126, 126, 130, 130,
	 130, 130, 128, 130, 130, 128, 128, 126, 126, 126, 126, 128, 126, 126, 125, 125,
	 125, 126, 125, 125, 125, 125, 125, 123, 123, 123, 125, 126, 126, 126, 126, 128,
	 128, 126, 125, 125, 125, 123, 125, 125, 125, 126, 126, 126, 128, 126, 126, 126,
	 126, 126, 126, 128, 128, 131, 131, 131, 131, 131, 133, 131, 131, 131, 131, 133,
	 133, 134, 133, 134, 134, 134, 134, 133, 134, 136, 136, 136, 136, 134, 134, 134,
	 133, 133, 131, 133, 133, 131, 133, 130, 130, 130, 130, 131, 130, 128, 126, 126,
	 126, 126, 126, 126, 128, 126, 125, 125, 123, 123, 123, 123, 125, 125, 123, 123,
	 122, 120, 122, 123, 122, 123, 123, 125, 125, 125, 123, 123, 123, 123, 123, 123,
	 123, 123, 123, 123, 125, 123, 125, 123, 125, 125, 123, 123, 123, 125, 125, 125,
	 125, 254,
};

#define nop()	_asm nop _endasm;

static void
ao_audio_delay(uint8_t n) {
	while (--n != 0)
		nop();
}

void
ao_audio_send(__xdata uint8_t *samples, uint16_t nsamples) __reentrant
{
	ao_mutex_get(&ao_audio_mutex);

	/*
	 * Turn on timer 4. Free running from 0 to 0xff, with P2_0
	 * on interval controlled by data written to T4CC0
	 */
	T4CCTL0 = TxCCTLy_CMP_SET_UP_CLEAR_DOWN | TxCCTLy_CMP_MODE_ENABLE;
	T4CC0 = 0x7f;
	T4CCTL1 = 0;
	T4CTL = TxCTL_DIV_1|TxCTL_START|TxCTL_CLR|TxCTL_MODE_FREE;
	P2SEL = (P2SEL & ~P2SEL_SELP2_0_MASK) | P2SEL_SELP2_0_PERIPHERAL;

	/*
	 * Turn on timer 3 to clock data to the PWM output
	 */
	T3CCTL0 = TxCCTLy_CMP_SET_UP_CLEAR_DOWN|TxCCTLy_CMP_MODE_ENABLE;
	T3CC0 = 17;
	T3CTL = TxCTL_DIV_128|TxCTL_START|TxCTL_CLR|TxCTL_MODE_MODULO;
	while (nsamples) {
		uint16_t	this_samples;

		if ((this_samples = nsamples) > 0x1fff)
			this_samples = 0x1fff;
		/*
		 * Set up DMA from the samples to T4CC0, triggered by T3 CH0
		 */
		ao_dma_set_transfer(ao_audio_dma,
				    samples,
				    &T4CC0XADDR,
				    this_samples,
				    DMA_CFG0_WORDSIZE_8 |
				    DMA_CFG0_TMODE_SINGLE |
				    DMA_CFG0_TRIGGER_T3_CH0,
				    DMA_CFG1_SRCINC_1 |
				    DMA_CFG1_DESTINC_0 |
				    DMA_CFG1_PRIORITY_HIGH);
		samples += this_samples;
		nsamples -= this_samples;
		ao_dma_start(ao_audio_dma);

		__critical while (!ao_audio_dma_done)
				   ao_sleep(&ao_audio_dma_done);
	}

	/* Turn the timers back off */
	T3CTL = 0;
	T4CTL = 0;

	/* And pull the GPIO to ground */
	P2_0 = 0;
	P2SEL = (P2SEL & ~P2SEL_SELP2_0_MASK) | P2SEL_SELP2_0_GPIO;

	ao_mutex_put(&ao_audio_mutex);
}

void
ao_audio_test(void)
{
	ao_audio_send(CODE_TO_XDATA(ao_audio_sound), sizeof (ao_audio_sound));
}

__code struct ao_cmds ao_audio_cmds[] = {
	{ 'A', ao_audio_test, "A                                  Audio system test" },
	{ 0,   ao_audio_test, NULL },
};

void
ao_audio_init(void)
{
	/* The audio amplifier is connected to P2_0, which can
	 * be hooked to timer 4 using configuration alternative 2
	 */
	P2_0 = 0;
	P2SEL = (P2SEL & ~P2SEL_SELP2_0_MASK) | P2SEL_SELP2_0_GPIO;
	PERCFG = (PERCFG & ~PERCFG_T4CFG_ALT_MASK) | PERCFG_T4CFG_ALT_2;

	/* Timer 3 is used to clock the DMA transfers from the audio data buffer
	 * to the timer 4
	 */
	ao_audio_dma = ao_dma_alloc(&ao_audio_dma_done);
	ao_cmd_register(&ao_audio_cmds[0]);
}