teleterra: Add PWM audio system
authorKeith Packard <keithp@keithp.com>
Sun, 31 Oct 2010 07:38:39 +0000 (00:38 -0700)
committerKeith Packard <keithp@keithp.com>
Sun, 31 Oct 2010 07:38:39 +0000 (00:38 -0700)
This uses timers 3 and 4 to emit 8-bit 11025Hz audio using a 93.8kHz
carrier. A simple low-pass filter to eliminate the 93.8kHz signal
results in credible 8-bit audio.

There is a giant sample for testing in the ao_audio code which shouldn't
be included in a product.

Signed-off-by: Keith Packard <keithp@keithp.com>
src/Makefile.proto
src/ao.h
src/ao_audio.c [new file with mode: 0644]
src/ao_teleterra.c
src/ao_terraui.c
src/cc1111.h
src/teleterra-v0.1/Makefile.defs [new file with mode: 0644]

index 2365030b2a0ac1b6f1197b1b85d4088a39aacce9..1a59096941b90295279e810e37baf36bc3295f77 100644 (file)
@@ -149,6 +149,7 @@ TT_MAIN_SRC = \
        ao_teleterra.c
 
 TT_TASK_SRC = \
+       ao_audio.c \
        ao_terraui.c
 
 #
index a952c50dadb49561211b58cfab2252df30877353..a3519150823a87763b441e25bd0ed57854397584 100644 (file)
--- a/src/ao.h
+++ b/src/ao.h
@@ -31,6 +31,9 @@
 /* Convert a __data pointer into an __xdata pointer */
 #define DATA_TO_XDATA(a)       ((void __xdata *) ((uint8_t) (a) | 0xff00))
 
+/* Convert a __code pointer into an __xdata pointer */
+#define CODE_TO_XDATA(a)       ((void __xdata *) ((uint16_t) (a)))
+
 /* Stack runs from above the allocated __data space to 0xfe, which avoids
  * writing to 0xff as that triggers the stack overflow indicator
  */
@@ -1112,4 +1115,15 @@ ao_terraui(void);
 void
 ao_terraui_init(void);
 
+/* ao_audio.c */
+
+void
+ao_audio_test(void);
+
+void
+ao_audio_send(__xdata uint8_t *samples, uint16_t nsamples) __reentrant;
+
+void
+ao_audio_init(void);
+
 #endif /* _AO_H_ */
diff --git a/src/ao_audio.c b/src/ao_audio.c
new file mode 100644 (file)
index 0000000..7015755
--- /dev/null
@@ -0,0 +1,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]);
+}
index 422bd06a4b6ce5b9a88f3136d8572c0b5fece5a9..c697b5df2eb3cfc3bd75fa8fcdadf752b373a8c2 100644 (file)
@@ -27,7 +27,7 @@ main(void)
        ao_led_init(AO_LED_RED|AO_LED_GREEN);
        ao_led_on(AO_LED_RED);
        ao_timer_init();
-       ao_beep_init();
+       ao_audio_init();
        ao_cmd_init();
        ao_usb_init();
        ao_serial_init();
index 4837273d691929b9289c967441d092b029cdcd96..714a7579be74be91187f24f0e076fc6a1a0899ff 100644 (file)
 
 #include "ao.h"
 
-static __code uint8_t ready_beeps[] = {
-       AO_BEEP_g,      AO_MS_TO_TICKS(100),
-       AO_BEEP_bb,     AO_MS_TO_TICKS(100),
-       AO_BEEP_dd,     AO_MS_TO_TICKS(100),
-       AO_BEEP_gg,     AO_MS_TO_TICKS(200),
-       AO_BEEP_dd,     AO_MS_TO_TICKS(100),
-       AO_BEEP_gg,     AO_MS_TO_TICKS(400),
-};
-
-#define NUM_READY      (sizeof(ready_beeps) / 2)
-
 __xdata uint8_t        ao_terraui_wakeup;
 
 void
 ao_terraui(void)
 {
-       uint8_t i;
-
-       for (i = 0; i < sizeof(ready_beeps); i += 2)
-               ao_beep_for(ready_beeps[i], ready_beeps[i+1]);
+       ao_audio_test();
        for (;;)
                ao_sleep(&ao_terraui_wakeup);
 }
index 20ed052a1d5cf600dd1eabd7c6078b9542cc0781..5d1e2b06885dfa67b0b5ef5ec4e838575213ce59 100644 (file)
@@ -329,9 +329,13 @@ sfr __at 0xEE T4CCTL1;
 
 /* Timer compare value */
 sfr __at 0xCD T3CC0;
+__xdata __at (0xDFCD) volatile uint8_t T3CC0XADDR;
 sfr __at 0xCF T3CC1;
+__xdata __at (0xDFCF) volatile uint8_t T3CC1XADDR;
 sfr __at 0xED T4CC0;
+__xdata __at (0xDFED) volatile uint8_t T4CC0XADDR;
 sfr __at 0xEF T4CC1;
+__xdata __at (0xDFEF) volatile uint8_t T4CC1XADDR;
 
 /*
  * Peripheral control
diff --git a/src/teleterra-v0.1/Makefile.defs b/src/teleterra-v0.1/Makefile.defs
new file mode 100644 (file)
index 0000000..f347743
--- /dev/null
@@ -0,0 +1,10 @@
+PROG = teleterra-v0.1-$(VERSION).ihx
+
+SRC = \
+       $(TT_SRC) \
+       $(SKY_DRIVER_SRC) \
+       $(DBG_SRC)
+
+PRODUCT=TeleTerra-v0.1
+PRODUCT_DEF=-DTELETERRA_V_0_1
+IDPRODUCT=0x000d