From 3493b456399bcc0ea43d28fd4105928bd8793cff Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sun, 31 Oct 2010 00:38:39 -0700 Subject: [PATCH] teleterra: Add PWM audio system 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 --- src/Makefile.proto | 1 + src/ao.h | 14 + src/ao_audio.c | 666 +++++++++++++++++++++++++++++++ src/ao_teleterra.c | 2 +- src/ao_terraui.c | 16 +- src/cc1111.h | 4 + src/teleterra-v0.1/Makefile.defs | 10 + 7 files changed, 697 insertions(+), 16 deletions(-) create mode 100644 src/ao_audio.c create mode 100644 src/teleterra-v0.1/Makefile.defs diff --git a/src/Makefile.proto b/src/Makefile.proto index 2365030b..1a590969 100644 --- a/src/Makefile.proto +++ b/src/Makefile.proto @@ -149,6 +149,7 @@ TT_MAIN_SRC = \ ao_teleterra.c TT_TASK_SRC = \ + ao_audio.c \ ao_terraui.c # diff --git a/src/ao.h b/src/ao.h index a952c50d..a3519150 100644 --- 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 index 00000000..70157557 --- /dev/null +++ b/src/ao_audio.c @@ -0,0 +1,666 @@ +/* + * Copyright © 2010 Keith Packard + * + * 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]); +} diff --git a/src/ao_teleterra.c b/src/ao_teleterra.c index 422bd06a..c697b5df 100644 --- a/src/ao_teleterra.c +++ b/src/ao_teleterra.c @@ -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(); diff --git a/src/ao_terraui.c b/src/ao_terraui.c index 4837273d..714a7579 100644 --- a/src/ao_terraui.c +++ b/src/ao_terraui.c @@ -17,26 +17,12 @@ #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); } diff --git a/src/cc1111.h b/src/cc1111.h index 20ed052a..5d1e2b06 100644 --- a/src/cc1111.h +++ b/src/cc1111.h @@ -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 index 00000000..f347743e --- /dev/null +++ b/src/teleterra-v0.1/Makefile.defs @@ -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 -- 2.30.2