2 * Copyright © 2010 Keith Packard <keithp@keithp.com>
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; version 2 of the License.
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 * General Public License for more details.
13 * You should have received a copy of the GNU General Public License along
14 * with this program; if not, write to the Free Software Foundation, Inc.,
15 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
20 __xdata uint8_t ao_audio_dma;
21 __xdata uint8_t ao_audio_dma_done;
22 __xdata uint8_t ao_audio_mutex;
24 __code uint8_t ao_audio_sound[] = {
25 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 126, 125, 125, 123, 123, 123,
26 125, 125, 123, 123, 123, 125, 125, 123, 123, 125, 125, 125, 125, 125, 126, 126,
27 128, 126, 126, 126, 126, 126, 126, 128, 128, 128, 128, 128, 128, 130, 130, 130,
28 130, 131, 131, 131, 130, 130, 130, 128, 130, 128, 128, 128, 128, 128, 130, 130,
29 130, 130, 131, 131, 130, 130, 128, 128, 130, 131, 130, 130, 130, 131, 133, 131,
30 128, 128, 128, 131, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 128,
31 130, 128, 126, 126, 126, 128, 128, 126, 128, 130, 128, 126, 126, 128, 128, 126,
32 125, 125, 128, 128, 128, 128, 125, 128, 130, 130, 130, 128, 128, 126, 128, 126,
33 126, 126, 125, 126, 128, 126, 126, 125, 125, 128, 130, 128, 123, 122, 123, 128,
34 126, 123, 125, 126, 128, 128, 125, 123, 122, 123, 125, 125, 125, 125, 125, 126,
35 126, 125, 123, 125, 128, 128, 126, 126, 125, 123, 123, 125, 126, 125, 125, 126,
36 126, 126, 128, 128, 126, 126, 128, 130, 128, 128, 126, 126, 128, 126, 126, 126,
37 126, 128, 130, 130, 128, 126, 125, 126, 130, 130, 128, 125, 126, 128, 130, 128,
38 126, 125, 126, 130, 133, 131, 128, 126, 130, 131, 131, 128, 128, 130, 133, 133,
39 133, 130, 130, 133, 134, 134, 133, 130, 131, 131, 131, 131, 130, 128, 128, 128,
40 130, 128, 125, 125, 126, 130, 128, 125, 125, 126, 126, 126, 126, 125, 126, 125,
41 130, 130, 128, 126, 126, 128, 128, 126, 126, 128, 126, 126, 128, 128, 130, 128,
42 126, 128, 128, 131, 130, 130, 128, 128, 128, 125, 126, 126, 125, 125, 125, 125,
43 125, 125, 126, 126, 126, 126, 125, 123, 123, 123, 125, 123, 123, 125, 125, 125,
44 125, 125, 126, 126, 125, 123, 123, 126, 126, 128, 128, 128, 128, 128, 128, 128,
45 131, 126, 126, 128, 130, 128, 128, 126, 126, 126, 126, 126, 126, 126, 126, 128,
46 126, 126, 126, 126, 125, 125, 123, 125, 125, 125, 125, 125, 125, 125, 125, 126,
47 126, 126, 126, 126, 126, 126, 126, 128, 128, 126, 126, 128, 130, 130, 131, 133,
48 133, 131, 130, 130, 128, 128, 126, 128, 128, 128, 128, 130, 130, 131, 130, 131,
49 131, 128, 131, 128, 130, 130, 130, 130, 130, 130, 131, 133, 133, 131, 131, 130,
50 130, 131, 133, 131, 130, 130, 131, 134, 133, 130, 128, 126, 128, 130, 131, 131,
51 128, 126, 128, 130, 128, 126, 125, 125, 125, 125, 126, 126, 126, 125, 125, 126,
52 126, 125, 126, 126, 125, 125, 123, 125, 125, 125, 123, 123, 123, 123, 123, 123,
53 123, 123, 123, 123, 125, 125, 126, 126, 125, 123, 123, 125, 125, 123, 123, 122,
54 122, 122, 123, 126, 126, 125, 126, 126, 128, 126, 125, 126, 125, 126, 125, 126,
55 126, 126, 128, 128, 126, 125, 125, 125, 126, 126, 130, 130, 130, 128, 128, 130,
56 130, 126, 126, 125, 123, 123, 123, 125, 123, 122, 122, 120, 122, 125, 125, 125,
57 123, 125, 126, 128, 128, 126, 128, 125, 126, 128, 130, 131, 130, 131, 131, 133,
58 133, 130, 130, 131, 131, 131, 131, 133, 133, 134, 133, 133, 133, 131, 131, 130,
59 131, 131, 131, 130, 128, 130, 130, 131, 131, 133, 131, 133, 131, 133, 133, 133,
60 134, 134, 136, 134, 134, 134, 134, 133, 133, 133, 133, 131, 128, 128, 125, 120,
61 119, 116, 112, 111, 108, 106, 106, 108, 109, 109, 109, 108, 106, 106, 106, 109,
62 111, 114, 116, 120, 123, 125, 128, 131, 133, 136, 139, 139, 140, 139, 139, 137,
63 137, 139, 140, 139, 137, 140, 142, 144, 145, 144, 142, 142, 142, 142, 142, 140,
64 139, 139, 137, 137, 137, 136, 136, 136, 134, 133, 130, 128, 126, 125, 123, 120,
65 116, 112, 108, 103, 98, 95, 91, 86, 83, 80, 77, 70, 66, 61, 61, 67,
66 78, 95, 105, 117, 123, 130, 140, 145, 151, 161, 164, 161, 161, 159, 156, 156,
67 156, 159, 161, 158, 159, 162, 162, 165, 169, 167, 165, 159, 153, 148, 142, 136,
68 131, 125, 122, 120, 120, 122, 126, 130, 133, 137, 140, 144, 144, 140, 137, 130,
69 125, 123, 119, 116, 114, 108, 101, 94, 89, 87, 86, 81, 75, 70, 64, 61,
70 66, 83, 101, 126, 144, 153, 173, 184, 172, 162, 162, 151, 140, 134, 130, 128,
71 123, 119, 126, 133, 134, 144, 151, 153, 158, 159, 162, 164, 158, 151, 145, 133,
72 116, 105, 98, 95, 92, 95, 105, 109, 114, 122, 131, 142, 151, 155, 158, 159,
73 156, 151, 150, 145, 139, 136, 137, 140, 142, 145, 151, 159, 162, 165, 165, 161,
74 153, 139, 126, 114, 97, 81, 67, 55, 42, 31, 23, 19, 20, 25, 34, 50,
75 66, 86, 117, 147, 169, 186, 184, 176, 172, 159, 153, 151, 147, 144, 137, 131,
76 130, 128, 126, 136, 147, 158, 161, 159, 158, 156, 156, 156, 156, 151, 139, 128,
77 119, 109, 108, 111, 112, 119, 125, 125, 130, 133, 134, 142, 145, 147, 148, 144,
78 139, 134, 130, 123, 122, 119, 112, 105, 95, 89, 81, 77, 69, 55, 45, 44,
79 55, 86, 128, 164, 189, 189, 170, 158, 147, 137, 148, 158, 159, 156, 140, 123,
80 117, 116, 126, 145, 156, 159, 151, 137, 133, 136, 147, 161, 164, 156, 139, 117,
81 101, 94, 94, 105, 116, 122, 123, 120, 119, 123, 131, 147, 162, 169, 169, 158,
82 145, 136, 133, 137, 145, 144, 139, 131, 123, 123, 126, 134, 139, 136, 125, 114,
83 101, 91, 81, 70, 61, 47, 30, 14, 0, 8, 44, 86, 126, 158, 161, 155,
84 151, 144, 151, 172, 187, 198, 195, 175, 156, 140, 130, 137, 150, 158, 156, 140,
85 123, 114, 116, 131, 147, 156, 162, 151, 136, 122, 114, 120, 131, 137, 145, 142,
86 130, 122, 116, 119, 133, 144, 151, 147, 133, 120, 112, 117, 130, 142, 148, 145,
87 134, 120, 112, 108, 108, 108, 105, 91, 72, 50, 33, 27, 33, 56, 89, 119,
88 144, 156, 145, 139, 140, 139, 150, 165, 173, 178, 172, 158, 148, 140, 139, 147,
89 155, 158, 156, 147, 139, 136, 136, 145, 153, 158, 153, 140, 130, 116, 108, 112,
90 125, 134, 142, 140, 136, 133, 128, 133, 144, 153, 161, 162, 155, 145, 134, 133,
91 137, 139, 139, 134, 123, 112, 105, 101, 105, 105, 105, 100, 89, 72, 58, 44,
92 34, 34, 42, 58, 84, 111, 128, 134, 131, 131, 134, 131, 140, 155, 162, 172,
93 172, 165, 159, 148, 145, 150, 150, 150, 148, 140, 133, 125, 120, 125, 131, 133,
94 136, 130, 125, 117, 112, 117, 126, 133, 139, 142, 140, 137, 134, 136, 140, 147,
95 147, 148, 140, 133, 126, 126, 131, 134, 139, 140, 137, 133, 125, 119, 116, 111,
96 108, 101, 91, 75, 58, 41, 30, 28, 39, 66, 101, 131, 147, 145, 142, 140,
97 136, 142, 159, 172, 179, 181, 172, 162, 148, 139, 140, 147, 150, 153, 148, 139,
98 131, 125, 128, 136, 144, 150, 151, 144, 133, 122, 117, 123, 134, 142, 147, 147,
99 144, 136, 130, 134, 144, 155, 162, 162, 155, 145, 137, 137, 140, 144, 147, 145,
100 136, 123, 114, 106, 103, 100, 98, 94, 84, 66, 48, 31, 23, 30, 48, 84,
101 123, 150, 158, 151, 147, 142, 133, 142, 158, 167, 173, 172, 159, 145, 131, 123,
102 130, 136, 140, 145, 139, 126, 120, 117, 123, 133, 139, 145, 144, 131, 120, 111,
103 108, 117, 130, 142, 145, 144, 136, 130, 126, 133, 148, 158, 161, 158, 144, 133,
104 126, 126, 133, 140, 144, 142, 131, 122, 114, 109, 108, 105, 98, 91, 75, 56,
105 39, 25, 20, 28, 52, 87, 126, 155, 165, 161, 156, 151, 142, 147, 161, 167,
106 172, 169, 156, 142, 128, 122, 126, 136, 144, 148, 145, 136, 130, 131, 137, 144,
107 151, 156, 156, 139, 123, 114, 108, 116, 128, 139, 148, 147, 137, 134, 133, 139,
108 156, 165, 169, 165, 151, 136, 128, 125, 131, 139, 140, 137, 130, 122, 116, 109,
109 105, 101, 97, 86, 70, 50, 31, 19, 17, 33, 67, 114, 158, 186, 184, 173,
110 164, 144, 136, 148, 159, 165, 169, 156, 139, 123, 109, 114, 126, 139, 151, 153,
111 145, 134, 133, 137, 147, 151, 155, 155, 144, 120, 98, 95, 94, 106, 126, 139,
112 145, 142, 133, 134, 139, 148, 167, 175, 169, 155, 134, 119, 112, 114, 126, 137,
113 140, 137, 131, 126, 123, 122, 119, 116, 108, 91, 69, 44, 22, 11, 13, 27,
114 56, 98, 137, 170, 179, 169, 167, 161, 145, 151, 159, 158, 159, 153, 139, 131,
115 120, 116, 128, 137, 145, 156, 156, 148, 148, 148, 153, 155, 151, 148, 142, 130,
116 105, 95, 98, 105, 120, 136, 145, 150, 145, 142, 148, 156, 165, 175, 173, 159,
117 139, 123, 114, 112, 119, 131, 144, 144, 140, 137, 133, 126, 122, 117, 109, 97,
118 73, 50, 28, 13, 9, 20, 45, 91, 134, 173, 190, 179, 172, 169, 155, 147,
119 159, 159, 156, 155, 134, 119, 112, 108, 119, 134, 145, 155, 159, 150, 147, 151,
120 151, 158, 158, 150, 137, 122, 100, 89, 87, 95, 112, 131, 140, 144, 144, 139,
121 140, 150, 162, 173, 172, 161, 140, 120, 109, 111, 117, 128, 139, 145, 145, 142,
122 139, 136, 131, 126, 114, 98, 80, 58, 38, 20, 11, 11, 16, 33, 70, 109,
123 148, 184, 189, 183, 184, 165, 144, 148, 148, 142, 145, 131, 116, 112, 106, 106,
124 125, 140, 151, 167, 164, 153, 155, 155, 155, 156, 150, 137, 125, 101, 86, 89,
125 87, 95, 125, 140, 144, 150, 148, 145, 155, 164, 172, 176, 165, 148, 133, 117,
126 112, 122, 131, 142, 151, 155, 153, 151, 147, 142, 139, 126, 108, 91, 70, 48,
127 28, 17, 13, 17, 25, 47, 86, 126, 170, 198, 198, 194, 187, 164, 145, 147,
128 140, 136, 137, 123, 111, 111, 106, 114, 134, 150, 164, 173, 169, 161, 161, 156,
129 153, 150, 140, 130, 112, 87, 69, 72, 86, 98, 112, 137, 151, 153, 148, 150,
130 161, 170, 170, 173, 165, 142, 125, 116, 111, 117, 130, 140, 147, 151, 151, 153,
131 153, 145, 139, 130, 109, 86, 67, 48, 31, 22, 14, 11, 17, 28, 56, 95,
132 139, 184, 204, 197, 195, 181, 148, 139, 137, 134, 136, 134, 120, 112, 109, 105,
133 119, 137, 153, 170, 175, 161, 151, 148, 139, 137, 137, 131, 122, 105, 80, 66,
134 69, 86, 111, 125, 145, 164, 162, 155, 156, 164, 169, 169, 164, 156, 142, 122,
135 114, 117, 126, 139, 155, 162, 162, 165, 161, 150, 140, 130, 120, 109, 89, 67,
136 52, 36, 22, 14, 14, 22, 39, 70, 108, 153, 194, 208, 200, 198, 181, 151,
137 144, 144, 140, 147, 144, 130, 125, 117, 112, 126, 144, 158, 172, 175, 159, 153,
138 150, 142, 142, 142, 134, 123, 109, 84, 72, 72, 78, 100, 126, 142, 153, 164,
139 167, 162, 162, 165, 165, 161, 150, 137, 125, 116, 114, 122, 136, 150, 161, 165,
140 164, 162, 155, 147, 139, 128, 116, 100, 81, 61, 45, 28, 16, 11, 5, 9,
141 25, 55, 91, 137, 186, 206, 204, 204, 192, 164, 148, 147, 142, 145, 145, 133,
142 125, 117, 106, 108, 122, 134, 148, 158, 151, 148, 147, 139, 137, 140, 139, 133,
143 123, 105, 87, 80, 77, 86, 100, 120, 137, 150, 161, 167, 170, 169, 167, 165,
144 158, 147, 137, 133, 130, 133, 139, 145, 155, 159, 164, 165, 167, 161, 151, 140,
145 126, 114, 101, 84, 67, 53, 38, 22, 9, 2, 2, 17, 41, 80, 125, 172,
146 208, 215, 209, 204, 187, 165, 159, 158, 153, 153, 144, 130, 120, 111, 103, 111,
147 126, 139, 151, 155, 148, 148, 148, 147, 150, 153, 148, 142, 130, 108, 94, 86,
148 81, 86, 97, 111, 125, 134, 144, 161, 169, 169, 169, 169, 162, 151, 140, 136,
149 140, 140, 145, 153, 159, 164, 169, 167, 162, 161, 150, 137, 126, 114, 98, 80,
150 62, 44, 30, 17, 6, 0, 2, 9, 27, 58, 100, 144, 190, 212, 211, 206,
151 195, 167, 147, 144, 137, 137, 139, 128, 119, 109, 95, 92, 103, 116, 131, 148,
152 151, 153, 156, 150, 147, 148, 147, 142, 137, 120, 101, 87, 77, 72, 77, 89,
153 100, 109, 123, 134, 151, 169, 175, 179, 181, 175, 159, 150, 144, 142, 145, 153,
154 161, 167, 172, 169, 164, 161, 156, 150, 142, 134, 123, 111, 94, 75, 59, 45,
155 36, 28, 22, 20, 20, 27, 47, 80, 117, 159, 198, 214, 211, 208, 189, 162,
156 150, 144, 139, 148, 150, 144, 136, 123, 106, 101, 106, 117, 137, 151, 159, 164,
157 162, 150, 140, 134, 131, 130, 128, 120, 109, 100, 86, 81, 81, 87, 100, 111,
158 117, 130, 150, 162, 165, 173, 179, 181, 175, 165, 159, 156, 151, 148, 155, 162,
159 169, 172, 170, 165, 161, 153, 140, 130, 122, 112, 100, 84, 70, 56, 45, 31,
160 22, 19, 16, 17, 27, 44, 70, 105, 139, 175, 198, 203, 200, 192, 169, 151,
161 142, 137, 144, 153, 155, 148, 139, 119, 106, 103, 103, 120, 134, 144, 148, 148,
162 140, 130, 122, 117, 120, 123, 123, 119, 112, 101, 91, 84, 84, 87, 92, 98,
163 105, 114, 134, 158, 169, 181, 190, 189, 183, 173, 165, 162, 165, 164, 170, 178,
164 179, 173, 165, 158, 150, 147, 140, 133, 126, 119, 108, 95, 83, 72, 64, 55,
165 44, 34, 25, 22, 20, 28, 48, 75, 106, 140, 178, 197, 200, 204, 195, 181,
166 169, 164, 161, 165, 169, 162, 158, 144, 122, 106, 97, 98, 108, 120, 128, 140,
167 147, 142, 136, 130, 125, 126, 126, 126, 126, 123, 111, 100, 89, 83, 81, 83,
168 91, 101, 114, 125, 148, 170, 179, 187, 194, 192, 187, 179, 170, 169, 170, 169,
169 172, 175, 173, 167, 159, 151, 145, 142, 133, 125, 122, 114, 105, 92, 81, 67,
170 56, 45, 33, 28, 22, 19, 19, 27, 41, 64, 97, 126, 164, 195, 204, 208,
171 208, 192, 169, 159, 150, 150, 156, 151, 147, 140, 125, 106, 97, 91, 94, 108,
172 119, 131, 142, 144, 137, 131, 123, 116, 112, 112, 112, 114, 112, 106, 100, 94,
173 92, 91, 95, 106, 122, 136, 147, 155, 162, 169, 172, 178, 187, 195, 200, 200,
174 198, 190, 183, 175, 167, 164, 162, 161, 158, 156, 151, 142, 130, 116, 105, 94,
175 86, 81, 75, 73, 69, 64, 56, 48, 42, 36, 36, 42, 53, 70, 94, 117,
176 140, 167, 183, 187, 189, 187, 175, 164, 158, 153, 151, 153, 150, 148, 145, 133,
177 122, 111, 105, 101, 105, 109, 116, 122, 123, 120, 116, 109, 108, 105, 103, 105,
178 108, 109, 111, 111, 111, 114, 114, 116, 123, 131, 139, 148, 161, 172, 181, 189,
179 194, 197, 195, 189, 183, 178, 172, 167, 165, 164, 165, 164, 161, 158, 155, 148,
180 139, 131, 122, 112, 103, 92, 83, 70, 61, 53, 48, 45, 44, 42, 39, 39,
181 41, 44, 53, 66, 87, 111, 133, 156, 178, 183, 181, 178, 164, 148, 142, 136,
182 136, 144, 147, 147, 150, 142, 126, 119, 105, 97, 100, 100, 103, 111, 116, 114,
183 112, 108, 100, 101, 103, 106, 116, 125, 134, 140, 147, 147, 142, 140, 140, 142,
184 147, 150, 156, 162, 165, 164, 164, 167, 172, 179, 187, 197, 201, 203, 200, 190,
185 181, 170, 161, 156, 156, 155, 151, 145, 134, 120, 105, 89, 78, 70, 67, 67,
186 72, 75, 75, 73, 67, 61, 52, 48, 45, 52, 58, 70, 87, 103, 120, 134,
187 148, 155, 155, 159, 156, 148, 148, 147, 147, 151, 153, 151, 150, 144, 130, 120,
188 111, 103, 101, 103, 106, 111, 117, 119, 117, 117, 114, 112, 111, 114, 119, 125,
189 133, 137, 140, 144, 144, 140, 137, 139, 140, 147, 156, 162, 170, 175, 175, 175,
190 176, 178, 181, 187, 192, 194, 192, 187, 178, 170, 158, 150, 142, 139, 137, 134,
191 130, 122, 111, 100, 87, 77, 69, 62, 62, 61, 62, 61, 58, 52, 44, 38,
192 30, 27, 30, 39, 53, 72, 94, 114, 134, 151, 156, 158, 161, 156, 151, 151,
193 153, 156, 162, 164, 164, 162, 153, 139, 128, 117, 109, 108, 108, 111, 120, 123,
194 123, 123, 122, 117, 112, 112, 114, 122, 131, 140, 147, 153, 156, 155, 151, 148,
195 145, 147, 150, 159, 172, 179, 183, 190, 192, 189, 186, 184, 186, 187, 189, 190,
196 192, 187, 181, 172, 162, 153, 144, 136, 128, 122, 116, 106, 95, 84, 72, 59,
197 52, 42, 36, 36, 33, 34, 33, 34, 31, 30, 30, 33, 42, 56, 73, 95,
198 119, 139, 156, 167, 172, 172, 167, 159, 158, 155, 158, 164, 167, 170, 169, 164,
199 150, 142, 128, 116, 112, 109, 109, 114, 117, 119, 119, 116, 111, 106, 105, 103,
200 108, 117, 130, 140, 153, 161, 165, 167, 164, 161, 158, 159, 162, 167, 176, 181,
201 184, 187, 187, 186, 181, 178, 175, 176, 176, 176, 176, 173, 169, 159, 150, 139,
202 128, 119, 109, 101, 92, 83, 75, 66, 55, 45, 38, 31, 28, 28, 28, 31,
203 33, 34, 38, 41, 44, 50, 62, 73, 92, 112, 131, 153, 170, 179, 186, 186,
204 178, 172, 167, 164, 165, 170, 173, 176, 175, 167, 156, 142, 128, 116, 108, 105,
205 105, 111, 117, 122, 125, 123, 120, 119, 116, 116, 120, 128, 140, 155, 167, 176,
206 181, 181, 176, 172, 167, 164, 165, 170, 176, 183, 189, 192, 190, 187, 179, 173,
207 169, 165, 162, 162, 161, 159, 156, 148, 140, 128, 116, 101, 89, 80, 72, 66,
208 61, 56, 50, 45, 39, 31, 25, 23, 22, 23, 27, 33, 38, 45, 53, 61,
209 72, 86, 103, 120, 140, 159, 172, 183, 187, 183, 176, 170, 162, 159, 161, 161,
210 162, 167, 165, 161, 151, 137, 125, 114, 105, 100, 101, 106, 112, 120, 125, 125,
211 123, 120, 117, 117, 120, 128, 139, 153, 165, 175, 184, 184, 183, 179, 173, 169,
212 169, 172, 176, 183, 187, 189, 187, 184, 178, 169, 161, 155, 150, 148, 147, 147,
213 145, 144, 136, 125, 112, 97, 84, 72, 62, 56, 55, 52, 48, 47, 42, 38,
214 33, 30, 28, 28, 31, 34, 44, 53, 64, 75, 87, 101, 116, 130, 145, 158,
215 169, 178, 184, 186, 186, 184, 181, 181, 179, 176, 178, 176, 175, 167, 159, 148,
216 136, 126, 116, 109, 106, 106, 108, 112, 114, 117, 117, 119, 119, 123, 128, 134,
217 144, 155, 167, 175, 181, 184, 187, 186, 183, 181, 178, 176, 176, 178, 178, 178,
218 178, 175, 170, 165, 158, 150, 145, 140, 136, 134, 131, 128, 122, 114, 103, 91,
219 78, 67, 58, 50, 44, 39, 36, 34, 33, 30, 27, 25, 25, 23, 27, 30,
220 36, 45, 58, 72, 84, 101, 119, 136, 151, 164, 175, 184, 187, 189, 189, 187,
221 187, 186, 187, 184, 184, 181, 175, 167, 156, 142, 131, 120, 112, 106, 103, 101,
222 103, 106, 108, 109, 111, 111, 114, 117, 122, 131, 140, 153, 165, 176, 184, 190,
223 194, 194, 192, 189, 184, 183, 181, 179, 178, 178, 178, 175, 172, 165, 159, 151,
224 147, 137, 133, 130, 125, 122, 117, 111, 101, 92, 81, 70, 62, 55, 47, 42,
225 39, 39, 38, 39, 39, 39, 41, 41, 42, 45, 48, 56, 64, 73, 84, 98,
226 112, 126, 142, 156, 169, 179, 187, 190, 192, 192, 192, 192, 194, 195, 195, 195,
227 190, 186, 176, 164, 151, 139, 128, 117, 109, 105, 101, 101, 101, 103, 106, 106,
228 108, 108, 111, 114, 122, 131, 139, 151, 162, 173, 181, 187, 189, 189, 189, 187,
229 186, 184, 181, 179, 176, 175, 172, 169, 162, 156, 148, 140, 131, 122, 114, 106,
230 100, 95, 89, 83, 77, 70, 66, 59, 53, 48, 45, 44, 44, 45, 45, 50,
231 53, 58, 59, 64, 67, 72, 75, 80, 84, 91, 98, 106, 116, 126, 137, 147,
232 156, 162, 170, 172, 176, 178, 181, 183, 183, 186, 186, 187, 187, 184, 181, 176,
233 170, 162, 153, 145, 137, 130, 125, 120, 119, 117, 117, 117, 117, 117, 116, 117,
234 117, 122, 126, 131, 137, 142, 150, 155, 159, 164, 169, 172, 173, 173, 173, 173,
235 173, 170, 169, 164, 159, 155, 151, 147, 140, 134, 128, 120, 111, 103, 97, 91,
236 86, 81, 78, 75, 72, 69, 67, 64, 64, 62, 62, 66, 69, 72, 77, 83,
237 89, 94, 98, 101, 105, 108, 109, 111, 112, 116, 120, 123, 128, 130, 134, 137,
238 140, 144, 145, 147, 147, 148, 148, 148, 148, 150, 153, 155, 155, 155, 155, 155,
239 155, 153, 151, 150, 150, 150, 151, 151, 151, 150, 150, 148, 147, 145, 144, 142,
240 140, 139, 137, 134, 133, 131, 130, 128, 126, 126, 126, 126, 125, 125, 123, 123,
241 123, 123, 123, 122, 122, 123, 123, 123, 123, 122, 122, 122, 122, 120, 119, 119,
242 119, 117, 116, 114, 114, 112, 111, 109, 108, 106, 105, 105, 105, 103, 103, 101,
243 101, 101, 103, 103, 103, 105, 106, 109, 111, 112, 116, 119, 122, 125, 125, 128,
244 131, 133, 134, 137, 140, 144, 145, 147, 150, 151, 155, 155, 158, 159, 159, 161,
245 161, 161, 162, 161, 159, 159, 158, 156, 153, 151, 150, 148, 145, 142, 139, 136,
246 133, 130, 128, 126, 123, 122, 119, 117, 116, 114, 112, 112, 112, 112, 109, 111,
247 111, 111, 111, 112, 112, 114, 116, 117, 119, 119, 122, 123, 125, 125, 126, 126,
248 126, 128, 128, 128, 128, 126, 126, 125, 123, 122, 120, 119, 117, 116, 114, 114,
249 111, 112, 109, 109, 112, 111, 111, 111, 111, 112, 116, 116, 117, 117, 117, 119,
250 119, 120, 122, 123, 126, 128, 130, 131, 133, 136, 137, 137, 140, 140, 142, 144,
251 145, 147, 148, 148, 150, 150, 150, 150, 148, 148, 147, 145, 144, 140, 140, 139,
252 137, 136, 134, 131, 130, 126, 125, 122, 120, 120, 117, 117, 116, 116, 117, 117,
253 117, 117, 119, 122, 122, 123, 126, 126, 128, 128, 130, 131, 131, 131, 131, 131,
254 131, 131, 131, 131, 131, 131, 131, 130, 130, 128, 128, 126, 126, 125, 123, 123,
255 122, 122, 119, 119, 119, 117, 117, 117, 117, 116, 116, 116, 117, 117, 117, 119,
256 119, 119, 120, 122, 123, 125, 126, 128, 130, 131, 133, 134, 136, 137, 137, 140,
257 140, 142, 142, 142, 142, 144, 140, 140, 142, 140, 140, 139, 139, 137, 136, 134,
258 133, 131, 130, 128, 126, 125, 125, 122, 120, 119, 119, 117, 116, 116, 117, 119,
259 120, 120, 120, 122, 122, 125, 125, 125, 126, 128, 128, 128, 128, 128, 130, 131,
260 131, 130, 130, 128, 130, 130, 128, 128, 126, 126, 126, 123, 122, 120, 119, 119,
261 117, 117, 117, 117, 117, 117, 116, 116, 114, 116, 117, 117, 119, 119, 120, 120,
262 122, 123, 125, 125, 126, 126, 128, 128, 130, 131, 131, 133, 134, 136, 136, 137,
263 137, 139, 137, 139, 140, 140, 140, 140, 139, 139, 137, 137, 136, 136, 136, 136,
264 134, 133, 133, 133, 133, 131, 131, 130, 130, 130, 130, 128, 128, 128, 128, 128,
265 128, 128, 128, 128, 130, 130, 128, 130, 128, 131, 131, 131, 131, 130, 131, 131,
266 131, 131, 131, 131, 131, 131, 130, 128, 126, 125, 125, 122, 122, 122, 120, 120,
267 117, 117, 116, 116, 117, 116, 116, 117, 117, 117, 117, 117, 117, 119, 119, 119,
268 120, 120, 120, 122, 122, 122, 123, 123, 126, 126, 128, 130, 130, 130, 131, 133,
269 133, 133, 133, 133, 133, 133, 131, 131, 131, 133, 133, 133, 133, 131, 131, 130,
270 131, 130, 130, 130, 130, 128, 128, 126, 126, 126, 126, 126, 126, 126, 126, 128,
271 126, 126, 126, 128, 128, 128, 128, 128, 130, 130, 128, 128, 128, 130, 130, 128,
272 128, 128, 128, 126, 126, 125, 125, 125, 126, 126, 126, 125, 125, 123, 125, 125,
273 125, 123, 123, 125, 123, 123, 122, 122, 123, 125, 125, 125, 125, 126, 128, 128,
274 130, 128, 131, 133, 131, 134, 133, 134, 136, 134, 134, 134, 134, 134, 134, 136,
275 133, 133, 133, 133, 133, 133, 133, 133, 131, 131, 131, 130, 130, 130, 131, 131,
276 131, 131, 131, 130, 128, 128, 126, 126, 126, 125, 125, 125, 125, 125, 125, 125,
277 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 123, 123, 122, 123, 122, 122,
278 120, 122, 120, 120, 122, 122, 120, 122, 122, 122, 122, 122, 122, 122, 122, 123,
279 123, 123, 123, 125, 125, 125, 125, 126, 126, 126, 126, 126, 128, 128, 128, 130,
280 130, 130, 130, 130, 131, 131, 131, 130, 131, 131, 131, 130, 130, 131, 131, 131,
281 131, 130, 130, 131, 131, 131, 133, 131, 133, 133, 131, 131, 131, 133, 131, 131,
282 131, 130, 130, 131, 131, 131, 131, 130, 131, 131, 130, 130, 130, 130, 130, 130,
283 130, 130, 128, 128, 126, 126, 125, 126, 126, 125, 125, 123, 125, 125, 125, 125,
284 125, 126, 126, 126, 126, 125, 125, 125, 126, 126, 126, 128, 128, 128, 128, 126,
285 126, 128, 130, 130, 130, 130, 130, 130, 133, 139, 140, 136, 133, 133, 131, 131,
286 130, 131, 133, 133, 134, 131, 128, 123, 125, 123, 122, 125, 126, 126, 125, 125,
287 125, 125, 123, 122, 120, 125, 128, 126, 126, 130, 134, 134, 128, 123, 125, 128,
288 130, 130, 128, 128, 128, 128, 125, 122, 122, 122, 122, 122, 122, 122, 117, 116,
289 116, 119, 119, 117, 117, 117, 120, 120, 120, 120, 122, 123, 125, 126, 126, 126,
290 126, 126, 128, 128, 130, 130, 130, 128, 128, 128, 130, 130, 130, 133, 131, 131,
291 131, 131, 131, 133, 133, 131, 131, 133, 133, 130, 128, 126, 128, 130, 130, 130,
292 130, 128, 128, 128, 128, 130, 130, 128, 130, 130, 130, 128, 128, 128, 128, 126,
293 126, 128, 128, 125, 125, 125, 125, 126, 123, 122, 122, 122, 123, 125, 123, 123,
294 123, 123, 123, 122, 123, 123, 122, 122, 122, 122, 125, 123, 123, 123, 122, 123,
295 122, 125, 125, 125, 123, 125, 126, 128, 126, 125, 126, 126, 126, 126, 126, 126,
296 126, 126, 128, 128, 128, 126, 128, 128, 130, 131, 130, 130, 130, 130, 131, 133,
297 131, 131, 130, 130, 130, 130, 128, 128, 128, 128, 130, 130, 128, 128, 130, 128,
298 128, 126, 128, 126, 125, 123, 125, 125, 125, 123, 123, 123, 123, 122, 122, 122,
299 123, 122, 119, 120, 120, 120, 117, 116, 117, 117, 116, 112, 112, 112, 111, 109,
300 108, 108, 106, 105, 106, 105, 105, 105, 105, 105, 108, 112, 116, 117, 122, 125,
301 128, 130, 133, 137, 142, 145, 147, 150, 151, 155, 156, 158, 161, 161, 161, 159,
302 159, 159, 158, 158, 156, 155, 155, 153, 150, 147, 145, 144, 144, 140, 139, 139,
303 137, 136, 134, 134, 131, 133, 133, 133, 133, 133, 133, 131, 130, 128, 126, 126,
304 123, 122, 120, 119, 117, 116, 114, 111, 109, 108, 105, 101, 98, 97, 94, 91,
305 86, 84, 83, 78, 73, 70, 73, 81, 83, 78, 83, 100, 108, 103, 105, 123,
306 137, 139, 142, 150, 167, 179, 178, 175, 183, 194, 194, 181, 173, 178, 181, 167,
307 153, 148, 147, 142, 123, 112, 109, 111, 100, 87, 86, 91, 92, 86, 81, 91,
308 100, 103, 103, 111, 125, 134, 137, 145, 158, 167, 175, 178, 184, 192, 197, 197,
309 198, 201, 200, 194, 189, 186, 179, 172, 159, 151, 144, 131, 120, 109, 100, 89,
310 80, 70, 64, 59, 52, 48, 47, 47, 47, 47, 47, 50, 55, 56, 58, 61,
311 69, 77, 78, 81, 91, 105, 111, 114, 119, 137, 150, 142, 148, 165, 173, 170,
312 173, 181, 192, 194, 187, 183, 187, 192, 183, 169, 162, 167, 162, 147, 136, 131,
313 131, 123, 111, 103, 105, 105, 98, 91, 91, 97, 98, 97, 97, 105, 112, 117,
314 120, 126, 144, 151, 142, 155, 181, 184, 176, 179, 192, 209, 204, 190, 198, 209,
315 204, 194, 179, 179, 184, 169, 150, 144, 140, 133, 116, 100, 94, 92, 81, 64,
316 56, 53, 55, 50, 41, 41, 47, 48, 47, 45, 45, 58, 67, 67, 67, 72,
317 81, 89, 91, 87, 97, 111, 122, 122, 123, 134, 145, 147, 151, 159, 162, 169,
318 176, 176, 176, 181, 184, 184, 183, 178, 176, 172, 165, 159, 151, 145, 140, 134,
319 125, 119, 112, 108, 105, 100, 97, 97, 97, 97, 97, 98, 101, 108, 112, 116,
320 123, 130, 142, 153, 155, 150, 170, 189, 186, 178, 183, 201, 209, 194, 184, 197,
321 200, 194, 179, 167, 170, 170, 151, 134, 130, 125, 119, 101, 84, 81, 81, 70,
322 55, 47, 47, 52, 45, 36, 39, 50, 52, 48, 48, 56, 70, 70, 69, 77,
323 87, 94, 95, 98, 106, 119, 123, 128, 136, 145, 151, 155, 161, 170, 169, 172,
324 181, 189, 189, 186, 189, 190, 187, 183, 178, 173, 169, 162, 156, 147, 139, 133,
325 123, 116, 109, 105, 100, 95, 91, 89, 89, 89, 91, 91, 94, 100, 105, 109,
326 116, 122, 131, 144, 151, 150, 158, 173, 181, 179, 176, 184, 197, 194, 183, 184,
327 189, 186, 178, 164, 158, 158, 147, 131, 119, 112, 108, 98, 81, 72, 70, 66,
328 56, 48, 44, 47, 48, 42, 41, 50, 55, 59, 61, 66, 77, 80, 81, 87,
329 97, 100, 101, 108, 117, 123, 128, 134, 142, 150, 151, 150, 159, 173, 170, 167,
330 176, 189, 189, 183, 183, 189, 190, 184, 178, 172, 169, 165, 156, 144, 139, 136,
331 130, 120, 111, 108, 106, 103, 97, 94, 95, 97, 97, 97, 98, 106, 112, 116,
332 120, 130, 137, 145, 150, 156, 165, 170, 175, 178, 181, 184, 189, 187, 187, 187,
333 183, 176, 172, 167, 161, 151, 145, 140, 130, 120, 112, 105, 97, 91, 84, 78,
334 72, 67, 62, 61, 59, 59, 59, 61, 64, 67, 69, 73, 78, 84, 84, 84,
335 91, 101, 101, 98, 100, 111, 120, 122, 120, 126, 140, 151, 144, 139, 159, 170,
336 164, 161, 172, 184, 184, 176, 176, 179, 183, 176, 167, 159, 158, 158, 144, 140,
337 128, 123, 116, 109, 105, 100, 94, 89, 87, 86, 87, 86, 86, 89, 95, 100,
338 106, 112, 120, 128, 134, 142, 151, 158, 164, 169, 178, 183, 183, 183, 186, 187,
339 186, 183, 178, 176, 172, 164, 155, 147, 142, 136, 126, 117, 111, 105, 95, 89,
340 81, 75, 69, 66, 64, 62, 62, 61, 62, 66, 72, 70, 73, 81, 86, 91,
341 91, 95, 103, 109, 111, 109, 116, 123, 130, 133, 133, 137, 148, 153, 147, 151,
342 164, 167, 165, 167, 175, 181, 179, 175, 175, 176, 178, 169, 159, 156, 155, 145,
343 136, 131, 128, 125, 117, 109, 106, 105, 100, 97, 95, 95, 95, 94, 97, 101,
344 105, 108, 112, 120, 128, 133, 137, 145, 151, 155, 159, 164, 170, 170, 172, 172,
345 173, 172, 170, 167, 164, 159, 155, 148, 140, 136, 130, 125, 119, 116, 111, 105,
346 98, 94, 89, 86, 81, 78, 78, 77, 78, 80, 81, 86, 87, 91, 95, 100,
347 103, 108, 112, 117, 122, 123, 126, 131, 133, 133, 133, 133, 131, 131, 131, 131,
348 130, 130, 130, 130, 128, 128, 126, 128, 128, 130, 130, 130, 130, 130, 133, 134,
349 136, 134, 137, 139, 140, 142, 144, 147, 148, 150, 151, 150, 151, 151, 151, 150,
350 150, 148, 147, 144, 140, 139, 137, 134, 133, 133, 130, 126, 125, 125, 125, 125,
351 123, 125, 125, 123, 125, 123, 123, 126, 128, 130, 131, 133, 133, 136, 136, 136,
352 137, 139, 139, 139, 139, 139, 139, 137, 136, 133, 131, 130, 126, 126, 125, 120,
353 119, 116, 114, 112, 109, 111, 109, 108, 106, 106, 105, 105, 103, 103, 105, 105,
354 105, 105, 106, 108, 109, 109, 111, 112, 116, 116, 117, 120, 123, 125, 128, 130,
355 131, 134, 136, 139, 142, 142, 142, 142, 144, 144, 144, 142, 144, 142, 140, 139,
356 139, 139, 139, 137, 136, 136, 136, 134, 131, 130, 130, 128, 126, 126, 128, 126,
357 125, 123, 123, 125, 126, 125, 125, 126, 126, 126, 126, 125, 126, 128, 128, 128,
358 128, 128, 130, 131, 131, 131, 133, 133, 133, 133, 131, 131, 131, 131, 131, 130,
359 130, 128, 130, 128, 126, 125, 123, 123, 122, 120, 119, 119, 117, 116, 112, 111,
360 111, 109, 111, 111, 112, 111, 112, 112, 114, 114, 114, 116, 119, 120, 122, 123,
361 125, 126, 128, 131, 133, 134, 136, 137, 137, 140, 140, 140, 140, 140, 142, 142,
362 142, 142, 140, 140, 139, 136, 137, 136, 136, 134, 133, 131, 130, 130, 130, 128,
363 128, 131, 134, 136, 134, 134, 134, 134, 133, 131, 128, 128, 128, 130, 133, 131,
364 131, 131, 133, 131, 130, 128, 125, 123, 125, 125, 123, 125, 125, 125, 126, 125,
365 125, 123, 123, 123, 123, 123, 123, 122, 122, 120, 119, 119, 117, 116, 114, 112,
366 112, 114, 114, 112, 111, 111, 112, 112, 112, 111, 112, 114, 114, 116, 116, 116,
367 116, 117, 119, 120, 122, 125, 128, 130, 133, 134, 136, 136, 137, 139, 139, 140,
368 142, 142, 142, 142, 140, 140, 140, 139, 137, 137, 136, 134, 134, 133, 134, 133,
369 133, 133, 133, 131, 133, 131, 137, 144, 139, 137, 140, 145, 144, 142, 139, 142,
370 144, 144, 145, 139, 137, 137, 137, 139, 134, 131, 130, 130, 133, 131, 126, 123,
371 122, 122, 123, 123, 119, 114, 114, 117, 119, 114, 109, 108, 109, 111, 108, 105,
372 100, 98, 98, 98, 97, 94, 91, 91, 94, 95, 92, 91, 97, 105, 109, 109,
373 114, 122, 130, 136, 142, 145, 148, 156, 164, 165, 167, 165, 167, 169, 167, 165,
374 159, 155, 151, 148, 142, 134, 128, 122, 120, 117, 112, 108, 105, 105, 108, 109,
375 108, 109, 112, 119, 123, 125, 130, 136, 140, 148, 155, 159, 162, 164, 167, 170,
376 167, 164, 164, 165, 165, 161, 156, 151, 147, 142, 139, 133, 128, 122, 119, 114,
377 109, 105, 100, 98, 94, 91, 87, 86, 84, 80, 78, 78, 77, 77, 75, 75,
378 75, 72, 72, 77, 77, 77, 78, 80, 86, 97, 109, 117, 119, 134, 159, 162,
379 153, 167, 187, 189, 186, 189, 198, 200, 194, 190, 189, 179, 172, 162, 151, 144,
380 133, 120, 112, 108, 103, 97, 91, 87, 87, 91, 95, 97, 100, 109, 122, 131,
381 134, 139, 151, 164, 170, 172, 175, 181, 184, 186, 187, 184, 178, 176, 176, 173,
382 165, 159, 158, 156, 151, 148, 144, 137, 137, 134, 133, 128, 120, 112, 111, 111,
383 103, 94, 87, 86, 83, 78, 70, 66, 62, 61, 62, 62, 59, 58, 62, 69,
384 69, 69, 75, 81, 86, 89, 92, 98, 108, 122, 133, 136, 144, 169, 175, 158,
385 165, 190, 186, 169, 172, 183, 181, 167, 164, 164, 155, 145, 139, 130, 122, 117,
386 109, 106, 103, 101, 98, 101, 98, 100, 106, 111, 117, 117, 126, 137, 145, 144,
387 147, 159, 167, 165, 164, 169, 173, 170, 164, 169, 169, 161, 159, 161, 158, 153,
388 153, 155, 153, 150, 148, 148, 147, 140, 137, 136, 131, 123, 114, 111, 108, 98,
389 89, 84, 80, 75, 69, 69, 67, 64, 64, 67, 70, 69, 73, 81, 89, 89,
390 87, 94, 101, 101, 97, 100, 108, 112, 123, 139, 136, 133, 161, 176, 158, 150,
391 178, 187, 169, 167, 183, 183, 170, 169, 173, 164, 155, 153, 145, 137, 134, 126,
392 119, 112, 111, 111, 111, 108, 106, 112, 119, 120, 119, 125, 137, 144, 147, 147,
393 150, 159, 164, 162, 162, 164, 161, 158, 158, 159, 155, 148, 151, 151, 147, 145,
394 147, 145, 144, 145, 144, 140, 137, 136, 134, 130, 123, 116, 109, 103, 98, 89,
395 83, 80, 72, 69, 67, 67, 67, 67, 69, 72, 73, 78, 83, 86, 92, 95,
396 95, 97, 100, 103, 103, 103, 105, 106, 106, 117, 130, 131, 130, 147, 167, 156,
397 145, 167, 183, 170, 164, 175, 179, 169, 167, 170, 161, 150, 148, 142, 131, 126,
398 122, 116, 112, 109, 108, 111, 111, 108, 112, 122, 126, 125, 128, 140, 148, 147,
399 147, 153, 158, 156, 153, 156, 170, 173, 145, 139, 164, 169, 150, 136, 139, 151,
400 150, 144, 150, 142, 133, 145, 150, 140, 134, 126, 128, 126, 119, 112, 108, 95,
401 89, 94, 94, 84, 69, 67, 80, 84, 75, 70, 78, 86, 89, 92, 95, 101,
402 100, 100, 108, 109, 101, 98, 106, 111, 108, 105, 119, 131, 133, 137, 158, 162,
403 145, 150, 179, 179, 161, 159, 176, 176, 164, 161, 162, 151, 142, 144, 134, 123,
404 119, 114, 109, 109, 105, 103, 105, 109, 111, 116, 122, 122, 122, 130, 142, 147,
405 142, 144, 155, 159, 145, 140, 155, 155, 140, 134, 140, 145, 136, 130, 142, 144,
406 134, 139, 147, 147, 145, 145, 148, 147, 142, 142, 137, 130, 123, 122, 117, 108,
407 97, 92, 97, 92, 84, 78, 81, 84, 83, 84, 87, 91, 91, 95, 105, 109,
408 108, 108, 108, 109, 109, 105, 103, 103, 105, 108, 109, 114, 125, 131, 136, 156,
409 165, 153, 158, 179, 184, 170, 169, 178, 176, 164, 162, 164, 147, 134, 137, 131,
410 119, 114, 111, 108, 109, 112, 111, 112, 114, 117, 125, 133, 133, 130, 134, 144,
411 148, 144, 145, 151, 151, 137, 140, 150, 145, 134, 131, 142, 148, 140, 139, 150,
412 148, 147, 151, 156, 155, 151, 150, 151, 148, 142, 139, 133, 123, 119, 119, 111,
413 103, 92, 87, 91, 87, 80, 77, 78, 81, 84, 86, 89, 94, 92, 95, 103,
414 106, 105, 103, 103, 103, 100, 94, 92, 92, 94, 94, 100, 112, 123, 126, 139,
415 162, 165, 153, 162, 184, 178, 161, 164, 175, 162, 150, 148, 145, 133, 126, 126,
416 117, 111, 111, 111, 111, 114, 116, 117, 120, 123, 128, 136, 140, 136, 131, 134,
417 140, 142, 137, 136, 142, 145, 136, 133, 144, 148, 140, 137, 147, 153, 151, 150,
418 159, 159, 155, 156, 159, 159, 155, 150, 147, 145, 142, 137, 131, 125, 120, 119,
419 116, 111, 103, 97, 98, 97, 91, 86, 87, 86, 89, 91, 95, 100, 97, 98,
420 101, 109, 109, 101, 95, 100, 103, 97, 91, 91, 95, 101, 109, 120, 130, 136,
421 156, 173, 165, 158, 173, 183, 164, 153, 162, 164, 147, 136, 139, 134, 125, 123,
422 120, 116, 117, 122, 117, 119, 125, 128, 128, 130, 130, 131, 134, 133, 126, 123,
423 125, 130, 130, 125, 125, 130, 137, 140, 139, 140, 148, 148, 150, 155, 158, 155,
424 151, 155, 155, 155, 150, 145, 145, 145, 145, 140, 133, 130, 131, 130, 126, 120,
425 114, 109, 106, 100, 94, 89, 84, 81, 81, 83, 86, 86, 86, 89, 94, 97,
426 97, 98, 101, 105, 103, 97, 95, 97, 94, 91, 91, 92, 100, 112, 128, 137,
427 144, 162, 178, 167, 161, 176, 181, 161, 150, 158, 156, 142, 139, 140, 133, 125,
428 128, 128, 120, 128, 130, 126, 130, 137, 139, 136, 134, 133, 134, 136, 134, 126,
429 122, 125, 128, 131, 131, 136, 139, 145, 156, 156, 153, 159, 161, 159, 161, 159,
430 158, 156, 153, 155, 153, 147, 145, 145, 145, 145, 139, 134, 136, 136, 133, 131,
431 122, 111, 105, 101, 97, 92, 86, 81, 81, 83, 86, 89, 91, 92, 95, 97,
432 100, 100, 100, 101, 97, 95, 92, 92, 94, 92, 92, 91, 97, 109, 125, 137,
433 142, 153, 172, 178, 167, 165, 172, 165, 151, 145, 148, 142, 128, 128, 130, 126,
434 126, 130, 128, 126, 131, 136, 133, 134, 137, 136, 131, 130, 128, 126, 125, 122,
435 116, 114, 119, 125, 125, 128, 134, 142, 155, 162, 158, 155, 158, 156, 156, 155,
436 153, 148, 144, 140, 144, 144, 139, 140, 139, 140, 142, 140, 137, 134, 133, 130,
437 125, 114, 106, 101, 97, 89, 84, 81, 80, 81, 84, 89, 94, 97, 97, 97,
438 98, 103, 101, 100, 101, 100, 94, 92, 94, 95, 94, 91, 97, 114, 134, 147,
439 153, 169, 183, 176, 164, 170, 176, 159, 145, 145, 144, 136, 131, 136, 136, 131,
440 133, 139, 140, 139, 144, 144, 142, 144, 142, 142, 136, 128, 120, 120, 120, 117,
441 112, 116, 120, 126, 131, 136, 140, 144, 147, 150, 164, 192, 190, 155, 140, 145,
442 147, 147, 145, 144, 137, 122, 122, 142, 151, 150, 148, 140, 139, 139, 137, 133,
443 125, 109, 98, 95, 83, 75, 78, 81, 83, 77, 75, 83, 92, 97, 101, 108,
444 103, 101, 98, 100, 103, 100, 92, 89, 83, 73, 75, 86, 97, 106, 119, 131,
445 147, 165, 189, 194, 176, 165, 162, 153, 145, 150, 145, 131, 120, 119, 122, 125,
446 133, 140, 139, 136, 140, 144, 145, 151, 150, 144, 136, 126, 120, 120, 122, 119,
447 114, 111, 116, 123, 130, 136, 145, 159, 170, 165, 156, 159, 161, 153, 147, 144,
448 142, 140, 136, 137, 142, 142, 140, 147, 148, 150, 151, 148, 145, 144, 137, 133,
449 128, 114, 103, 98, 92, 86, 84, 87, 91, 91, 91, 95, 105, 106, 108, 109,
450 111, 109, 109, 108, 105, 98, 91, 86, 86, 84, 83, 86, 92, 101, 116, 134,
451 151, 167, 184, 190, 179, 169, 165, 158, 144, 137, 136, 130, 120, 120, 123, 122,
452 125, 134, 140, 145, 148, 148, 144, 142, 140, 139, 136, 131, 120, 111, 106, 105,
453 103, 106, 114, 120, 126, 130, 134, 142, 147, 151, 155, 161, 175, 176, 153, 137,
454 131, 123, 119, 125, 133, 139, 137, 139, 144, 145, 147, 150, 153, 148, 140, 134,
455 123, 109, 98, 95, 95, 87, 80, 80, 84, 86, 89, 97, 108, 112, 111, 111,
456 112, 109, 103, 98, 97, 97, 94, 92, 89, 87, 84, 86, 91, 101, 112, 128,
457 142, 156, 170, 187, 197, 184, 173, 162, 148, 131, 126, 130, 131, 130, 130, 126,
458 125, 131, 142, 150, 155, 159, 158, 150, 144, 139, 134, 134, 130, 122, 116, 112,
459 108, 105, 108, 120, 130, 139, 147, 151, 153, 153, 161, 169, 165, 159, 153, 140,
460 126, 117, 119, 126, 134, 142, 150, 151, 148, 147, 148, 151, 155, 155, 148, 137,
461 123, 114, 105, 97, 94, 95, 95, 92, 94, 94, 95, 101, 105, 111, 116, 117,
462 116, 109, 105, 98, 94, 94, 95, 95, 92, 89, 86, 84, 84, 89, 98, 111,
463 123, 137, 151, 164, 176, 183, 176, 167, 156, 142, 128, 120, 122, 123, 125, 130,
464 131, 130, 133, 139, 142, 145, 151, 153, 147, 140, 134, 131, 128, 122, 116, 112,
465 112, 109, 108, 111, 117, 123, 131, 139, 147, 150, 151, 148, 145, 144, 140, 139,
466 147, 158, 150, 142, 139, 136, 130, 128, 133, 144, 153, 158, 164, 159, 150, 144,
467 134, 126, 123, 122, 116, 105, 95, 89, 89, 87, 91, 103, 116, 120, 120, 119,
468 116, 112, 108, 109, 112, 112, 108, 103, 97, 92, 91, 91, 94, 95, 97, 101,
469 106, 114, 123, 137, 151, 165, 181, 190, 186, 173, 161, 140, 126, 116, 116, 123,
470 130, 136, 134, 134, 134, 134, 134, 137, 145, 151, 151, 148, 144, 136, 123, 116,
471 111, 111, 116, 116, 117, 116, 116, 119, 122, 130, 137, 147, 153, 155, 159, 161,
472 153, 142, 137, 130, 122, 122, 123, 128, 134, 139, 144, 145, 145, 148, 147, 144,
473 144, 144, 137, 128, 120, 114, 105, 97, 92, 94, 97, 98, 103, 105, 109, 111,
474 111, 114, 116, 116, 116, 114, 109, 106, 100, 95, 95, 97, 97, 95, 95, 97,
475 97, 98, 101, 105, 112, 123, 134, 147, 161, 173, 176, 172, 165, 158, 144, 131,
476 128, 126, 128, 133, 137, 139, 137, 136, 134, 133, 133, 139, 142, 140, 142, 140,
477 139, 133, 125, 119, 116, 114, 116, 117, 122, 126, 130, 133, 136, 137, 142, 145,
478 148, 155, 164, 164, 156, 150, 140, 130, 123, 122, 128, 137, 144, 151, 155, 153,
479 153, 148, 140, 139, 139, 137, 133, 130, 123, 117, 106, 98, 95, 94, 97, 101,
480 106, 109, 109, 111, 112, 112, 111, 111, 109, 108, 108, 108, 103, 97, 94, 89,
481 84, 83, 86, 92, 98, 106, 116, 125, 136, 147, 159, 169, 175, 173, 169, 159,
482 147, 133, 125, 120, 119, 126, 130, 134, 137, 136, 131, 126, 126, 128, 130, 131,
483 136, 137, 136, 131, 125, 119, 112, 109, 108, 111, 117, 123, 128, 133, 137, 140,
484 139, 139, 144, 151, 158, 159, 161, 158, 147, 136, 131, 128, 128, 134, 142, 151,
485 156, 161, 156, 148, 142, 134, 128, 123, 120, 120, 120, 116, 111, 105, 98, 95,
486 94, 94, 97, 101, 109, 112, 114, 116, 109, 106, 101, 100, 98, 97, 97, 98,
487 98, 95, 94, 95, 98, 105, 112, 123, 134, 147, 158, 167, 169, 169, 167, 162,
488 155, 148, 142, 136, 136, 137, 137, 139, 139, 139, 136, 131, 128, 128, 130, 128,
489 131, 133, 133, 131, 128, 125, 120, 119, 117, 116, 119, 123, 126, 131, 136, 139,
490 144, 148, 155, 156, 159, 158, 158, 155, 145, 144, 139, 139, 140, 144, 147, 150,
491 150, 147, 145, 142, 137, 130, 123, 119, 117, 112, 108, 105, 101, 97, 92, 89,
492 89, 91, 91, 94, 97, 98, 100, 98, 100, 101, 100, 98, 95, 92, 89, 89,
493 87, 87, 91, 97, 103, 111, 119, 128, 139, 151, 159, 164, 165, 162, 158, 150,
494 144, 136, 134, 134, 137, 140, 142, 144, 142, 139, 134, 133, 128, 126, 126, 130,
495 131, 131, 131, 130, 128, 125, 122, 119, 119, 120, 123, 130, 139, 151, 158, 162,
496 164, 161, 156, 148, 144, 142, 142, 145, 151, 156, 159, 159, 155, 151, 147, 145,
497 140, 139, 139, 140, 139, 134, 130, 122, 114, 105, 97, 91, 87, 86, 87, 92,
498 95, 95, 94, 95, 94, 92, 92, 94, 98, 101, 105, 105, 105, 105, 100, 101,
499 103, 106, 112, 120, 130, 139, 150, 158, 162, 164, 162, 158, 151, 147, 142, 139,
500 137, 139, 140, 142, 142, 140, 137, 133, 131, 128, 125, 123, 123, 123, 125, 126,
501 126, 126, 123, 122, 120, 119, 119, 120, 128, 137, 145, 153, 159, 162, 162, 158,
502 151, 145, 140, 137, 139, 140, 145, 150, 153, 155, 153, 148, 142, 134, 130, 126,
503 122, 120, 117, 114, 112, 108, 103, 97, 91, 86, 80, 78, 77, 78, 80, 81,
504 83, 84, 86, 87, 89, 91, 91, 91, 94, 95, 100, 103, 108, 116, 122, 126,
505 133, 137, 145, 151, 158, 161, 164, 164, 161, 156, 151, 145, 140, 139, 137, 137,
506 137, 139, 139, 140, 140, 140, 137, 133, 131, 130, 128, 126, 128, 130, 133, 134,
507 136, 139, 140, 145, 148, 150, 153, 155, 156, 158, 158, 159, 161, 161, 161, 159,
508 158, 155, 151, 151, 150, 147, 144, 142, 139, 136, 131, 128, 123, 119, 114, 109,
509 105, 100, 98, 95, 92, 89, 87, 86, 84, 84, 83, 81, 81, 83, 84, 86,
510 87, 91, 94, 98, 100, 103, 108, 112, 117, 125, 134, 142, 148, 150, 148, 147,
511 144, 139, 134, 131, 131, 136, 142, 145, 151, 153, 151, 148, 142, 134, 128, 123,
512 120, 122, 126, 131, 136, 140, 144, 145, 144, 140, 136, 134, 133, 134, 137, 142,
513 145, 150, 151, 153, 151, 151, 148, 145, 144, 142, 142, 140, 142, 140, 140, 139,
514 136, 133, 130, 123, 119, 114, 111, 108, 105, 103, 100, 97, 95, 92, 91, 87,
515 86, 89, 89, 91, 92, 95, 97, 98, 101, 100, 103, 103, 106, 109, 111, 114,
516 119, 122, 125, 128, 130, 133, 133, 134, 136, 137, 137, 139, 140, 140, 140, 140,
517 140, 140, 140, 140, 142, 140, 142, 142, 142, 142, 144, 145, 147, 147, 147, 148,
518 148, 150, 151, 151, 153, 155, 156, 158, 158, 156, 155, 151, 150, 148, 147, 145,
519 144, 144, 144, 142, 140, 137, 136, 134, 131, 128, 125, 122, 120, 116, 114, 111,
520 109, 108, 105, 105, 103, 101, 100, 98, 97, 97, 97, 98, 100, 100, 101, 103,
521 105, 105, 105, 105, 105, 105, 105, 106, 109, 111, 111, 112, 114, 117, 119, 120,
522 119, 120, 120, 122, 122, 125, 126, 130, 133, 134, 137, 136, 136, 137, 137, 137,
523 137, 139, 139, 139, 139, 139, 137, 140, 140, 140, 139, 139, 139, 137, 140, 137,
524 139, 140, 140, 142, 140, 140, 139, 140, 139, 139, 137, 137, 137, 137, 137, 137,
525 137, 137, 137, 137, 136, 134, 133, 130, 128, 125, 123, 123, 123, 122, 120, 117,
526 116, 112, 112, 111, 109, 109, 108, 108, 108, 106, 106, 106, 108, 108, 106, 106,
527 106, 108, 109, 112, 114, 119, 122, 123, 125, 128, 130, 131, 133, 133, 134, 136,
528 140, 142, 145, 147, 147, 147, 145, 144, 142, 139, 137, 137, 139, 140, 139, 139,
529 139, 137, 136, 131, 128, 125, 123, 123, 123, 125, 126, 128, 130, 130, 130, 128,
530 126, 126, 130, 130, 131, 133, 133, 133, 133, 131, 130, 130, 128, 126, 126, 126,
531 126, 126, 125, 123, 120, 119, 116, 112, 111, 109, 109, 109, 111, 111, 111, 111,
532 111, 111, 112, 111, 111, 111, 111, 114, 114, 116, 119, 120, 122, 123, 123, 125,
533 126, 128, 130, 131, 133, 134, 134, 136, 136, 136, 134, 136, 136, 137, 139, 137,
534 139, 137, 139, 137, 137, 137, 136, 136, 136, 136, 134, 134, 136, 134, 136, 137,
535 137, 139, 137, 137, 136, 134, 133, 133, 131, 131, 131, 133, 133, 133, 134, 133,
536 134, 133, 133, 128, 128, 125, 123, 126, 125, 126, 126, 126, 125, 123, 123, 122,
537 120, 120, 120, 120, 120, 120, 122, 122, 122, 123, 122, 122, 122, 122, 122, 123,
538 125, 126, 126, 126, 126, 126, 126, 128, 128, 128, 128, 130, 131, 131, 131, 131,
539 131, 131, 131, 133, 134, 134, 134, 134, 134, 133, 131, 131, 131, 133, 133, 133,
540 133, 134, 136, 134, 134, 131, 133, 131, 130, 130, 128, 130, 128, 128, 126, 125,
541 123, 122, 122, 120, 120, 122, 122, 122, 122, 120, 122, 120, 120, 119, 117, 117,
542 117, 117, 117, 117, 117, 119, 120, 119, 119, 117, 119, 120, 120, 120, 120, 120,
543 120, 122, 122, 122, 122, 122, 122, 122, 123, 125, 125, 126, 126, 125, 126, 126,
544 126, 126, 128, 128, 131, 131, 133, 133, 133, 133, 134, 137, 134, 137, 137, 137,
545 139, 137, 137, 137, 137, 137, 137, 139, 137, 137, 136, 136, 137, 136, 134, 134,
546 131, 130, 130, 131, 131, 131, 131, 131, 128, 128, 126, 125, 123, 125, 125, 125,
547 125, 126, 126, 126, 126, 126, 125, 125, 123, 122, 122, 122, 122, 122, 122, 122,
548 123, 123, 123, 122, 122, 122, 123, 123, 122, 122, 122, 123, 125, 126, 125, 128,
549 126, 126, 125, 123, 122, 122, 123, 125, 126, 128, 130, 131, 133, 133, 133, 131,
550 131, 131, 131, 131, 131, 131, 133, 131, 133, 133, 133, 131, 130, 128, 128, 130,
551 130, 131, 130, 130, 128, 128, 128, 126, 126, 126, 128, 128, 126, 126, 123, 123,
552 123, 123, 123, 123, 125, 125, 125, 125, 125, 123, 123, 123, 123, 123, 125, 125,
553 123, 123, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 123, 123, 123, 122,
554 123, 125, 125, 126, 126, 126, 126, 126, 128, 128, 130, 130, 130, 131, 131, 133,
555 134, 134, 134, 134, 134, 134, 136, 136, 137, 137, 137, 137, 136, 136, 136, 134,
556 134, 133, 131, 133, 133, 134, 134, 133, 133, 133, 133, 133, 133, 131, 128, 128,
557 128, 130, 128, 130, 131, 130, 130, 128, 126, 125, 125, 125, 123, 123, 123, 125,
558 125, 125, 125, 123, 123, 123, 125, 125, 125, 125, 125, 123, 123, 122, 122, 123,
559 123, 125, 123, 123, 122, 122, 120, 120, 120, 120, 122, 123, 125, 125, 126, 126,
560 125, 123, 123, 122, 123, 123, 123, 125, 126, 126, 128, 128, 128, 128, 128, 130,
561 130, 130, 126, 130, 128, 130, 130, 128, 131, 128, 128, 126, 126, 126, 130, 130,
562 130, 130, 128, 130, 130, 128, 128, 126, 126, 126, 126, 128, 126, 126, 125, 125,
563 125, 126, 125, 125, 125, 125, 125, 123, 123, 123, 125, 126, 126, 126, 126, 128,
564 128, 126, 125, 125, 125, 123, 125, 125, 125, 126, 126, 126, 128, 126, 126, 126,
565 126, 126, 126, 128, 128, 131, 131, 131, 131, 131, 133, 131, 131, 131, 131, 133,
566 133, 134, 133, 134, 134, 134, 134, 133, 134, 136, 136, 136, 136, 134, 134, 134,
567 133, 133, 131, 133, 133, 131, 133, 130, 130, 130, 130, 131, 130, 128, 126, 126,
568 126, 126, 126, 126, 128, 126, 125, 125, 123, 123, 123, 123, 125, 125, 123, 123,
569 122, 120, 122, 123, 122, 123, 123, 125, 125, 125, 123, 123, 123, 123, 123, 123,
570 123, 123, 123, 123, 125, 123, 125, 123, 125, 125, 123, 123, 123, 125, 125, 125,
574 #define nop() _asm nop _endasm;
577 ao_audio_delay(uint8_t n) {
583 ao_audio_send(__xdata uint8_t *samples, uint16_t nsamples) __reentrant
585 ao_mutex_get(&ao_audio_mutex);
588 * Turn on timer 4. Free running from 0 to 0xff, with P2_0
589 * on interval controlled by data written to T4CC0
591 T4CCTL0 = TxCCTLy_CMP_SET_UP_CLEAR_DOWN | TxCCTLy_CMP_MODE_ENABLE;
594 T4CTL = TxCTL_DIV_1|TxCTL_START|TxCTL_CLR|TxCTL_MODE_FREE;
595 P2SEL = (P2SEL & ~P2SEL_SELP2_0_MASK) | P2SEL_SELP2_0_PERIPHERAL;
598 * Turn on timer 3 to clock data to the PWM output
600 T3CCTL0 = TxCCTLy_CMP_SET_UP_CLEAR_DOWN|TxCCTLy_CMP_MODE_ENABLE;
602 T3CTL = TxCTL_DIV_128|TxCTL_START|TxCTL_CLR|TxCTL_MODE_MODULO;
604 uint16_t this_samples;
606 if ((this_samples = nsamples) > 0x1fff)
607 this_samples = 0x1fff;
609 * Set up DMA from the samples to T4CC0, triggered by T3 CH0
611 ao_dma_set_transfer(ao_audio_dma,
615 DMA_CFG0_WORDSIZE_8 |
616 DMA_CFG0_TMODE_SINGLE |
617 DMA_CFG0_TRIGGER_T3_CH0,
620 DMA_CFG1_PRIORITY_HIGH);
621 samples += this_samples;
622 nsamples -= this_samples;
623 ao_dma_start(ao_audio_dma);
625 __critical while (!ao_audio_dma_done)
626 ao_sleep(&ao_audio_dma_done);
629 /* Turn the timers back off */
633 /* And pull the GPIO to ground */
635 P2SEL = (P2SEL & ~P2SEL_SELP2_0_MASK) | P2SEL_SELP2_0_GPIO;
637 ao_mutex_put(&ao_audio_mutex);
643 ao_audio_send(CODE_TO_XDATA(ao_audio_sound), sizeof (ao_audio_sound));
646 __code struct ao_cmds ao_audio_cmds[] = {
647 { 'A', ao_audio_test, "A Audio system test" },
648 { 0, ao_audio_test, NULL },
654 /* The audio amplifier is connected to P2_0, which can
655 * be hooked to timer 4 using configuration alternative 2
658 P2SEL = (P2SEL & ~P2SEL_SELP2_0_MASK) | P2SEL_SELP2_0_GPIO;
659 PERCFG = (PERCFG & ~PERCFG_T4CFG_ALT_MASK) | PERCFG_T4CFG_ALT_2;
661 /* Timer 3 is used to clock the DMA transfers from the audio data buffer
664 ao_audio_dma = ao_dma_alloc(&ao_audio_dma_done);
665 ao_cmd_register(&ao_audio_cmds[0]);