patch-2.1.17 linux/drivers/net/sm_fsk9600.h

Next file: linux/drivers/net/sm_sbc.h
Previous file: linux/drivers/net/sm_afsk1200.h
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v2.1.16/linux/drivers/net/sm_fsk9600.h linux/drivers/net/sm_fsk9600.h
@@ -0,0 +1,552 @@
+/*****************************************************************************/
+
+/*
+ *	sm_fsk9600.h  --  soundcard radio modem driver, 
+ *                        9600 baud G3RUH compatible FSK modem
+ *
+ *	Copyright (C) 1996  Thomas Sailer (sailer@ife.ee.ethz.ch)
+ *
+ *	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; either version 2 of the License, or
+ *	(at your option) any later version.
+ *
+ *	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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  Please note that the GPL allows you to use the driver, NOT the radio.
+ *  In order to use the radio, you need a license from the communications
+ *  authority of your country.
+ *
+ */
+
+/* --------------------------------------------------------------------- */
+
+struct demod_state_fsk96 {
+	unsigned int shreg;
+	unsigned long descram;
+	unsigned int bit_pll;
+	unsigned char last_sample;
+	unsigned int dcd_shreg;
+	int dcd_sum0, dcd_sum1, dcd_sum2;
+	unsigned int dcd_time;
+};
+
+struct mod_state_fsk96 {
+	unsigned int shreg;
+	unsigned long scram;
+	unsigned char tx_bit;
+};
+
+#define DEMOD_STATE ((struct demod_state_fsk96 *)(&sm->d))
+#define MOD_STATE ((struct mod_state_fsk96 *)(&sm->m))
+
+/* --------------------------------------------------------------------- */
+
+#define DESCRAM_TAP1 0x20000
+#define DESCRAM_TAP2 0x01000
+#define DESCRAM_TAP3 0x00001
+
+#define DESCRAM_TAPSH1 17
+#define DESCRAM_TAPSH2 12
+#define DESCRAM_TAPSH3 0
+
+#define SCRAM_TAP1 0x20000 /* X^17 */
+#define SCRAM_TAPN 0x00021 /* X^0+X^5 */
+
+/* --------------------------------------------------------------------- */
+
+static unsigned char tx_filter_9k6_4[] = {
+	  65,  66,  63,  63,  76,  76,  73,  73,
+	  54,  54,  51,  51,  64,  65,  61,  62,
+	 214, 214, 211, 211, 224, 225, 221, 222,
+	 202, 202, 199, 200, 213, 213, 210, 210,
+	  38,  38,  35,  35,  48,  49,  45,  46,
+	  26,  27,  23,  24,  37,  37,  34,  34,
+	 186, 187, 183, 184, 197, 197, 194, 194,
+	 175, 175, 172, 172, 185, 185, 182, 182,
+	  73,  74,  70,  71,  84,  84,  81,  81,
+	  62,  62,  59,  59,  72,  72,  69,  69,
+	 221, 222, 218, 219, 232, 232, 229, 229,
+	 210, 210, 207, 207, 220, 221, 217, 218,
+	  46,  46,  43,  43,  56,  56,  53,  53,
+	  34,  34,  31,  31,  44,  45,  41,  42,
+	 194, 194, 191, 191, 204, 205, 201, 202,
+	 182, 183, 179, 180, 193, 193, 190, 190,
+	  65,  65,  62,  62,  75,  76,  72,  73,
+	  53,  54,  50,  51,  64,  64,  61,  61,
+	 213, 214, 210, 211, 224, 224, 221, 221,
+	 202, 202, 199, 199, 212, 212, 209, 209,
+	  37,  38,  34,  35,  48,  48,  45,  45,
+	  26,  26,  23,  23,  36,  37,  33,  34,
+	 186, 186, 183, 183, 196, 196, 193, 193,
+	 174, 174, 171, 171, 184, 185, 181, 182,
+	  73,  73,  70,  70,  83,  83,  80,  80,
+	  61,  61,  58,  58,  71,  72,  68,  69,
+	 221, 221, 218, 218, 231, 232, 228, 229,
+	 209, 210, 206, 207, 220, 220, 217, 217,
+	  45,  45,  42,  42,  55,  56,  53,  53,
+	  33,  34,  30,  31,  44,  44,  41,  41,
+	 193, 194, 190, 191, 204, 204, 201, 201,
+	 182, 182, 179, 179, 192, 192, 189, 190,
+	  65,  66,  62,  63,  67,  68,  64,  64,
+	 103, 104, 100, 101, 105, 106, 101, 102,
+	 168, 169, 164, 165, 169, 170, 166, 167,
+	 205, 206, 202, 203, 207, 208, 204, 205,
+	  49,  50,  46,  46,  51,  51,  47,  48,
+	  87,  88,  83,  84,  88,  89,  85,  86,
+	 151, 152, 148, 149, 153, 154, 149, 150,
+	 189, 190, 186, 187, 191, 192, 187, 188,
+	  66,  67,  63,  64,  68,  69,  64,  65,
+	 104, 105, 100, 101, 105, 106, 102, 103,
+	 168, 169, 165, 166, 170, 171, 167, 167,
+	 206, 207, 203, 204, 208, 209, 204, 205,
+	  50,  51,  46,  47,  51,  52,  48,  49,
+	  87,  88,  84,  85,  89,  90,  85,  86,
+	 152, 153, 149, 149, 154, 154, 150, 151,
+	 190, 191, 186, 187, 191, 192, 188, 189,
+	  66,  67,  63,  64,  68,  69,  64,  65,
+	 104, 105, 101, 101, 106, 106, 102, 103,
+	 169, 170, 165, 166, 170, 171, 167, 168,
+	 206, 207, 203, 204, 208, 209, 204, 205,
+	  50,  51,  46,  47,  51,  52,  48,  49,
+	  88,  88,  84,  85,  89,  90,  86,  87,
+	 152, 153, 149, 150, 154, 155, 150, 151,
+	 190, 191, 186, 187, 191, 192, 188, 189,
+	  67,  68,  63,  64,  68,  69,  65,  66,
+	 105, 106, 101, 102, 106, 107, 103, 104,
+	 169, 170, 166, 167, 171, 172, 167, 168,
+	 207, 208, 204, 204, 209, 209, 205, 206,
+	  50,  51,  47,  48,  52,  53,  49,  50,
+	  88,  89,  85,  86,  90,  91,  86,  87,
+	 153, 154, 149, 150, 154, 155, 151, 152,
+	 191, 191, 187, 188, 192, 193, 189, 190,
+	  65,  66,  66,  67,  49,  50,  50,  50,
+	 168, 169, 168, 169, 151, 152, 152, 153,
+	 103, 104, 104, 105,  87,  88,  87,  88,
+	 205, 206, 206, 207, 189, 190, 190, 191,
+	  67,  68,  68,  68,  51,  51,  51,  52,
+	 169, 170, 170, 171, 153, 154, 154, 154,
+	 105, 106, 105, 106,  88,  89,  89,  90,
+	 207, 208, 208, 209, 191, 191, 191, 192,
+	  62,  63,  63,  63,  46,  46,  46,  47,
+	 164, 165, 165, 166, 148, 149, 149, 149,
+	 100, 101, 100, 101,  83,  84,  84,  85,
+	 202, 203, 203, 204, 186, 186, 186, 187,
+	  64,  64,  64,  65,  47,  48,  48,  49,
+	 166, 167, 167, 167, 149, 150, 150, 151,
+	 101, 102, 102, 103,  85,  86,  85,  86,
+	 204, 204, 204, 205, 187, 188, 188, 189,
+	  66,  67,  67,  68,  50,  51,  51,  51,
+	 169, 170, 169, 170, 152, 153, 153, 154,
+	 104, 105, 105, 106,  88,  88,  88,  89,
+	 206, 207, 207, 208, 190, 191, 191, 191,
+	  68,  69,  69,  69,  51,  52,  52,  53,
+	 170, 171, 171, 172, 154, 155, 154, 155,
+	 106, 106, 106, 107,  89,  90,  90,  91,
+	 208, 209, 209, 209, 192, 192, 192, 193,
+	  63,  64,  64,  64,  46,  47,  47,  48,
+	 165, 166, 166, 167, 149, 150, 149, 150,
+	 101, 101, 101, 102,  84,  85,  85,  86,
+	 203, 204, 204, 204, 187, 187, 187, 188,
+	  64,  65,  65,  66,  48,  49,  49,  50,
+	 167, 168, 167, 168, 150, 151, 151, 152,
+	 102, 103, 103, 104,  86,  87,  86,  87,
+	 205, 205, 205, 206, 188, 189, 189, 190,
+	  65,  65,  73,  73,  38,  37,  46,  45,
+	 214, 213, 221, 221, 186, 186, 194, 193,
+	  54,  53,  62,  61,  26,  26,  34,  33,
+	 202, 202, 210, 209, 175, 174, 182, 182,
+	  76,  75,  84,  83,  48,  48,  56,  55,
+	 224, 224, 232, 231, 197, 196, 204, 204,
+	  64,  64,  72,  71,  37,  36,  44,  44,
+	 213, 212, 220, 220, 185, 184, 193, 192,
+	  63,  62,  70,  70,  35,  34,  43,  42,
+	 211, 210, 218, 218, 183, 183, 191, 190,
+	  51,  50,  59,  58,  23,  23,  31,  30,
+	 199, 199, 207, 206, 172, 171, 179, 179,
+	  73,  72,  81,  80,  45,  45,  53,  53,
+	 221, 221, 229, 228, 194, 193, 201, 201,
+	  61,  61,  69,  68,  34,  33,  41,  41,
+	 210, 209, 217, 217, 182, 181, 190, 189,
+	  66,  65,  74,  73,  38,  38,  46,  45,
+	 214, 214, 222, 221, 187, 186, 194, 194,
+	  54,  54,  62,  61,  27,  26,  34,  34,
+	 202, 202, 210, 210, 175, 174, 183, 182,
+	  76,  76,  84,  83,  49,  48,  56,  56,
+	 225, 224, 232, 232, 197, 196, 205, 204,
+	  65,  64,  72,  72,  37,  37,  45,  44,
+	 213, 212, 221, 220, 185, 185, 193, 192,
+	  63,  62,  71,  70,  35,  35,  43,  42,
+	 211, 211, 219, 218, 184, 183, 191, 191,
+	  51,  51,  59,  58,  24,  23,  31,  31,
+	 200, 199, 207, 207, 172, 171, 180, 179,
+	  73,  73,  81,  80,  46,  45,  53,  53,
+	 222, 221, 229, 229, 194, 193, 202, 201,
+	  62,  61,  69,  69,  34,  34,  42,  41,
+	 210, 209, 218, 217, 182, 182, 190, 190
+};
+
+static unsigned char tx_filter_9k6_5[] = {
+	  78,  78,  75,  76,  85,  85,  82,  83,
+	  71,  72,  69,  69,  78,  78,  76,  76,
+	 193, 193, 190, 191, 199, 200, 197, 198,
+	 186, 187, 184, 184, 193, 193, 190, 191,
+	  58,  59,  56,  57,  65,  66,  63,  63,
+	  52,  52,  49,  50,  58,  59,  56,  57,
+	 173, 174, 171, 171, 180, 180, 177, 178,
+	 166, 167, 164, 165, 173, 174, 171, 171,
+	  85,  86,  83,  83,  92,  92,  89,  90,
+	  79,  79,  76,  77,  85,  86,  83,  83,
+	 200, 200, 198, 198, 207, 207, 204, 205,
+	 193, 194, 191, 191, 200, 201, 198, 198,
+	  66,  66,  63,  64,  72,  73,  70,  70,
+	  59,  60,  57,  57,  66,  66,  63,  64,
+	 180, 181, 178, 179, 187, 188, 185, 185,
+	 174, 174, 171, 172, 180, 181, 178, 179,
+	  76,  77,  74,  75,  83,  84,  81,  81,
+	  70,  70,  67,  68,  76,  77,  74,  75,
+	 191, 192, 189, 189, 198, 198, 195, 196,
+	 185, 185, 182, 183, 191, 192, 189, 189,
+	  57,  57,  54,  55,  64,  64,  61,  62,
+	  50,  51,  48,  48,  57,  57,  55,  55,
+	 172, 172, 169, 170, 178, 179, 176, 177,
+	 165, 166, 163, 163, 172, 172, 169, 170,
+	  84,  84,  81,  82,  90,  91,  88,  89,
+	  77,  78,  75,  75,  84,  84,  81,  82,
+	 198, 199, 196, 197, 205, 206, 203, 203,
+	 192, 192, 189, 190, 198, 199, 196, 197,
+	  64,  65,  62,  62,  71,  71,  68,  69,
+	  57,  58,  55,  56,  64,  65,  62,  62,
+	 179, 179, 177, 177, 186, 186, 183, 184,
+	 172, 173, 170, 170, 179, 180, 177, 177,
+	  78,  79,  76,  77,  79,  79,  77,  77,
+	  99, 100,  97,  98, 100, 100,  98,  98,
+	 171, 172, 169, 170, 172, 173, 170, 171,
+	 192, 193, 190, 191, 193, 194, 191, 192,
+	  59,  60,  57,  58,  60,  61,  58,  59,
+	  81,  81,  79,  79,  81,  82,  79,  80,
+	 153, 153, 151, 151, 153, 154, 151, 152,
+	 174, 175, 172, 173, 175, 175, 173, 173,
+	  82,  83,  80,  81,  83,  83,  81,  81,
+	 103, 104, 101, 102, 104, 105, 102, 103,
+	 175, 176, 173, 174, 176, 177, 174, 175,
+	 197, 197, 195, 195, 197, 198, 195, 196,
+	  64,  64,  62,  62,  64,  65,  62,  63,
+	  85,  85,  83,  83,  85,  86,  83,  84,
+	 157, 158, 155, 156, 158, 158, 156, 156,
+	 178, 179, 176, 177, 179, 179, 177, 177,
+	  78,  78,  76,  76,  78,  79,  76,  77,
+	  99,  99,  97,  97,  99, 100,  97,  98,
+	 171, 172, 169, 170, 172, 172, 170, 170,
+	 192, 193, 190, 191, 193, 193, 191, 191,
+	  59,  60,  57,  58,  60,  60,  58,  58,
+	  80,  81,  78,  79,  81,  82,  79,  80,
+	 152, 153, 150, 151, 153, 154, 151, 152,
+	 174, 174, 172, 172, 174, 175, 172, 173,
+	  82,  82,  80,  80,  82,  83,  80,  81,
+	 103, 104, 101, 102, 104, 104, 102, 102,
+	 175, 176, 173, 174, 176, 176, 174, 174,
+	 196, 197, 194, 195, 197, 198, 195, 196,
+	  63,  64,  61,  62,  64,  65,  62,  63,
+	  84,  85,  82,  83,  85,  86,  83,  84,
+	 157, 157, 155, 155, 157, 158, 155, 156,
+	 178, 178, 176, 176, 178, 179, 176, 177,
+	  78,  78,  78,  79,  69,  69,  69,  69,
+	 136, 136, 136, 137, 127, 127, 127, 128,
+	 136, 136, 136, 137, 127, 127, 127, 128,
+	 194, 195, 195, 195, 185, 185, 185, 186,
+	  69,  69,  69,  69,  59,  60,  60,  60,
+	 127, 127, 127, 128, 117, 118, 118, 118,
+	 127, 127, 127, 128, 117, 118, 118, 118,
+	 185, 185, 185, 186, 175, 176, 176, 176,
+	  78,  79,  79,  79,  69,  69,  69,  70,
+	 136, 137, 137, 137, 127, 128, 127, 128,
+	 136, 137, 137, 137, 127, 128, 127, 128,
+	 195, 195, 195, 195, 185, 186, 186, 186,
+	  69,  69,  69,  70,  60,  60,  60,  60,
+	 127, 128, 127, 128, 118, 118, 118, 119,
+	 127, 128, 127, 128, 118, 118, 118, 119,
+	 185, 186, 186, 186, 176, 176, 176, 177,
+	  78,  79,  79,  79,  69,  69,  69,  70,
+	 136, 137, 137, 137, 127, 128, 128, 128,
+	 136, 137, 137, 137, 127, 128, 128, 128,
+	 195, 195, 195, 195, 185, 186, 186, 186,
+	  69,  69,  69,  70,  60,  60,  60,  60,
+	 127, 128, 128, 128, 118, 118, 118, 119,
+	 127, 128, 128, 128, 118, 118, 118, 119,
+	 185, 186, 186, 186, 176, 176, 176, 177,
+	  79,  79,  79,  80,  69,  70,  70,  70,
+	 137, 137, 137, 138, 128, 128, 128, 128,
+	 137, 137, 137, 138, 128, 128, 128, 128,
+	 195, 195, 195, 196, 186, 186, 186, 186,
+	  69,  70,  70,  70,  60,  60,  60,  61,
+	 128, 128, 128, 128, 118, 119, 119, 119,
+	 128, 128, 128, 128, 118, 119, 119, 119,
+	 186, 186, 186, 186, 176, 177, 177, 177,
+	  78,  78,  82,  82,  59,  59,  64,  63,
+	 171, 171, 175, 175, 153, 152, 157, 157,
+	  99,  99, 103, 103,  81,  80,  85,  84,
+	 192, 192, 197, 196, 174, 174, 178, 178,
+	  79,  78,  83,  82,  60,  60,  64,  64,
+	 172, 172, 176, 176, 153, 153, 158, 157,
+	 100,  99, 104, 104,  81,  81,  85,  85,
+	 193, 193, 197, 197, 175, 174, 179, 178,
+	  76,  76,  80,  80,  57,  57,  62,  61,
+	 169, 169, 173, 173, 151, 150, 155, 155,
+	  97,  97, 101, 101,  79,  78,  83,  82,
+	 190, 190, 195, 194, 172, 172, 176, 176,
+	  77,  76,  81,  80,  58,  58,  62,  62,
+	 170, 170, 174, 174, 151, 151, 156, 155,
+	  98,  97, 102, 102,  79,  79,  83,  83,
+	 191, 191, 195, 195, 173, 172, 177, 176,
+	  79,  78,  83,  82,  60,  60,  64,  64,
+	 172, 172, 176, 176, 153, 153, 158, 157,
+	 100,  99, 104, 104,  81,  81,  85,  85,
+	 193, 193, 197, 197, 175, 174, 179, 178,
+	  79,  79,  83,  83,  61,  60,  65,  65,
+	 173, 172, 177, 176, 154, 154, 158, 158,
+	 100, 100, 105, 104,  82,  82,  86,  86,
+	 194, 193, 198, 198, 175, 175, 179, 179,
+	  77,  76,  81,  80,  58,  58,  62,  62,
+	 170, 170, 174, 174, 151, 151, 156, 155,
+	  98,  97, 102, 102,  79,  79,  83,  83,
+	 191, 191, 195, 195, 173, 172, 177, 176,
+	  77,  77,  81,  81,  59,  58,  63,  63,
+	 171, 170, 175, 174, 152, 152, 156, 156,
+	  98,  98, 103, 102,  80,  80,  84,  84,
+	 192, 191, 196, 196, 173, 173, 177, 177,
+	  78,  76,  85,  84,  58,  57,  66,  64,
+	 193, 191, 200, 198, 173, 172, 180, 179,
+	  71,  70,  79,  77,  52,  50,  59,  57,
+	 186, 185, 193, 192, 166, 165, 174, 172,
+	  85,  83,  92,  90,  65,  64,  72,  71,
+	 199, 198, 207, 205, 180, 178, 187, 186,
+	  78,  76,  85,  84,  58,  57,  66,  64,
+	 193, 191, 200, 198, 173, 172, 180, 179,
+	  75,  74,  83,  81,  56,  54,  63,  62,
+	 190, 189, 198, 196, 171, 169, 178, 177,
+	  69,  67,  76,  75,  49,  48,  57,  55,
+	 184, 182, 191, 189, 164, 163, 171, 170,
+	  82,  81,  89,  88,  63,  61,  70,  68,
+	 197, 195, 204, 203, 177, 176, 185, 183,
+	  76,  74,  83,  81,  56,  55,  63,  62,
+	 190, 189, 198, 196, 171, 169, 178, 177,
+	  78,  77,  86,  84,  59,  57,  66,  65,
+	 193, 192, 200, 199, 174, 172, 181, 179,
+	  72,  70,  79,  78,  52,  51,  60,  58,
+	 187, 185, 194, 192, 167, 166, 174, 173,
+	  85,  84,  92,  91,  66,  64,  73,  71,
+	 200, 198, 207, 206, 180, 179, 188, 186,
+	  78,  77,  86,  84,  59,  57,  66,  65,
+	 193, 192, 201, 199, 174, 172, 181, 180,
+	  76,  75,  83,  82,  57,  55,  64,  62,
+	 191, 189, 198, 197, 171, 170, 179, 177,
+	  69,  68,  77,  75,  50,  48,  57,  56,
+	 184, 183, 191, 190, 165, 163, 172, 170,
+	  83,  81,  90,  89,  63,  62,  70,  69,
+	 198, 196, 205, 203, 178, 177, 185, 184,
+	  76,  75,  83,  82,  57,  55,  64,  62,
+	 191, 189, 198, 197, 171, 170, 179, 177
+};
+
+/* --------------------------------------------------------------------- */
+
+static void modulator_9600_4(struct sm_state *sm, unsigned char *buf, int buflen)
+{
+	int j;
+	const unsigned char *cp;
+
+	for (; buflen >= 4; buflen -= 4) {
+		if (MOD_STATE->shreg <= 1)
+			MOD_STATE->shreg = hdlcdrv_getbits(&sm->hdrv) | 0x10000;
+		MOD_STATE->scram = ((MOD_STATE->scram << 1) |
+				     (MOD_STATE->scram & 1));
+		MOD_STATE->scram ^= (!(MOD_STATE->shreg & 1));
+		MOD_STATE->shreg >>= 1;
+		if (MOD_STATE->scram & (SCRAM_TAP1 << 1))
+			MOD_STATE->scram ^= (SCRAM_TAPN << 1);
+		MOD_STATE->tx_bit = (MOD_STATE->tx_bit << 1) | 
+			(!!(MOD_STATE->scram & (SCRAM_TAP1 << 2)));
+		cp = tx_filter_9k6_4 + (MOD_STATE->tx_bit & 0xff);
+		for (j = 0; j < 4; j++) {
+			*buf++ = *cp;
+			cp += 0x100;
+		}
+	}
+}
+
+/* --------------------------------------------------------------------- */
+
+static void demodulator_9600_4(struct sm_state *sm, unsigned char *buf, int buflen)
+{
+	static const int pll_corr[2] = { -0x1000, 0x1000 };
+	unsigned char curbit;
+	unsigned int descx;
+
+	for (; buflen > 0; buflen--, buf++) {
+		DEMOD_STATE->dcd_shreg <<= 1;
+		DEMOD_STATE->bit_pll += 0x4000;
+		curbit = (*buf >= 0x80);
+		if (DEMOD_STATE->last_sample ^ curbit) {
+			DEMOD_STATE->dcd_shreg |= 1;
+			DEMOD_STATE->bit_pll += pll_corr
+				[DEMOD_STATE->bit_pll < 0xa000];
+			DEMOD_STATE->dcd_sum0 += 8 * 
+				hweight8(DEMOD_STATE->dcd_shreg & 0x0c) - 
+				!!(DEMOD_STATE->dcd_shreg & 0x10);
+		}
+		DEMOD_STATE->last_sample = curbit;
+		hdlcdrv_channelbit(&sm->hdrv, DEMOD_STATE->last_sample);
+		if ((--DEMOD_STATE->dcd_time) <= 0) {
+			hdlcdrv_setdcd(&sm->hdrv, (DEMOD_STATE->dcd_sum0 + 
+						   DEMOD_STATE->dcd_sum1 + 
+						   DEMOD_STATE->dcd_sum2) < 0);
+			DEMOD_STATE->dcd_sum2 = DEMOD_STATE->dcd_sum1;
+			DEMOD_STATE->dcd_sum1 = DEMOD_STATE->dcd_sum0;
+			DEMOD_STATE->dcd_sum0 = 2; /* slight bias */
+			DEMOD_STATE->dcd_time = 240;
+		}
+		if (DEMOD_STATE->bit_pll >= 0x10000) {
+			DEMOD_STATE->bit_pll &= 0xffff;
+			DEMOD_STATE->descram = (DEMOD_STATE->descram << 1) | curbit;
+			descx = DEMOD_STATE->descram ^ (DEMOD_STATE->descram >> 1);
+			descx ^= ((descx >> DESCRAM_TAPSH1) ^
+				  (descx >> DESCRAM_TAPSH2));
+			DEMOD_STATE->shreg >>= 1;
+			DEMOD_STATE->shreg |= (!(descx & 1)) << 16;
+			if (DEMOD_STATE->shreg & 1) {
+				hdlcdrv_putbits(&sm->hdrv, DEMOD_STATE->shreg >> 1);
+				DEMOD_STATE->shreg = 0x10000;
+			}
+			diag_trigger(sm);
+		}
+		diag_add_one(sm, ((short)(*buf - 0x80)) << 8);
+	}
+}
+
+/* --------------------------------------------------------------------- */
+
+static void modulator_9600_5(struct sm_state *sm, unsigned char *buf, int buflen)
+{
+	int j;
+	const unsigned char *cp;
+
+	for (; buflen >= 5; buflen -= 5) {
+		if (MOD_STATE->shreg <= 1)
+			MOD_STATE->shreg = hdlcdrv_getbits(&sm->hdrv) | 0x10000;
+		MOD_STATE->scram = ((MOD_STATE->scram << 1) |
+				     (MOD_STATE->scram & 1));
+		MOD_STATE->scram ^= (!(MOD_STATE->shreg & 1));
+		MOD_STATE->shreg >>= 1;
+		if (MOD_STATE->scram & (SCRAM_TAP1 << 1))
+			MOD_STATE->scram ^= (SCRAM_TAPN << 1);
+		MOD_STATE->tx_bit = (MOD_STATE->tx_bit << 1) | 
+			(!!(MOD_STATE->scram & (SCRAM_TAP1 << 2)));
+		cp = tx_filter_9k6_5 + (MOD_STATE->tx_bit & 0xff);
+		for (j = 0; j < 5; j++) {
+			*buf++ = *cp;
+			cp += 0x100;
+		}
+	}
+}
+
+/* --------------------------------------------------------------------- */
+
+static void demodulator_9600_5(struct sm_state *sm, unsigned char *buf, int buflen)
+{
+	static const int pll_corr[2] = { -0x1000, 0x1000 };
+	unsigned char curbit;
+	unsigned int descx;
+
+	for (; buflen > 0; buflen--, buf++) {
+		DEMOD_STATE->dcd_shreg <<= 1;
+		DEMOD_STATE->bit_pll += 0x3333;
+		curbit = (*buf >= 0x80);
+		if (DEMOD_STATE->last_sample ^ curbit) {
+			DEMOD_STATE->dcd_shreg |= 1;
+			DEMOD_STATE->bit_pll += pll_corr
+				[DEMOD_STATE->bit_pll < 0x9999];
+			DEMOD_STATE->dcd_sum0 += 16 * 
+				hweight8(DEMOD_STATE->dcd_shreg & 0x0c) - 
+				hweight8(DEMOD_STATE->dcd_shreg & 0x70);
+		}
+		DEMOD_STATE->last_sample = curbit;
+		hdlcdrv_channelbit(&sm->hdrv, DEMOD_STATE->last_sample);
+		if ((--DEMOD_STATE->dcd_time) <= 0) {
+			hdlcdrv_setdcd(&sm->hdrv, (DEMOD_STATE->dcd_sum0 + 
+						   DEMOD_STATE->dcd_sum1 + 
+						   DEMOD_STATE->dcd_sum2) < 0);
+			DEMOD_STATE->dcd_sum2 = DEMOD_STATE->dcd_sum1;
+			DEMOD_STATE->dcd_sum1 = DEMOD_STATE->dcd_sum0;
+			DEMOD_STATE->dcd_sum0 = 2; /* slight bias */
+			DEMOD_STATE->dcd_time = 240;
+		}
+		if (DEMOD_STATE->bit_pll >= 0x10000) {
+			DEMOD_STATE->bit_pll &= 0xffff;
+			DEMOD_STATE->descram = (DEMOD_STATE->descram << 1) | curbit;
+			descx = DEMOD_STATE->descram ^ (DEMOD_STATE->descram >> 1);
+			descx ^= ((descx >> DESCRAM_TAPSH1) ^
+				  (descx >> DESCRAM_TAPSH2));
+			DEMOD_STATE->shreg >>= 1;
+			DEMOD_STATE->shreg |= (!(descx & 1)) << 16;
+			if (DEMOD_STATE->shreg & 1) {
+				hdlcdrv_putbits(&sm->hdrv, DEMOD_STATE->shreg >> 1);
+				DEMOD_STATE->shreg = 0x10000;
+			}
+			diag_trigger(sm);
+		}
+		diag_add_one(sm, ((short)(*buf - 0x80)) << 8);
+	}
+}
+
+/* --------------------------------------------------------------------- */
+
+static void demod_init_9600(struct sm_state *sm)
+{
+	DEMOD_STATE->dcd_time = 240;
+	DEMOD_STATE->dcd_sum0 = 2;	
+}
+
+/* --------------------------------------------------------------------- */
+
+static const struct modem_tx_info fsk9600_4_tx = {
+	NEXT_TX_INFO, "fsk9600", sizeof(struct mod_state_fsk96), 38400, 9600, 4,
+	modulator_9600_4, NULL
+};
+#undef NEXT_TX_INFO
+#define NEXT_TX_INFO (&fsk9600_4_tx)
+
+static const struct modem_rx_info fsk9600_4_rx = {
+	NEXT_RX_INFO, "fsk9600", sizeof(struct demod_state_fsk96), 38400, 9600, 4, 4,
+	demodulator_9600_4, demod_init_9600
+};
+#undef NEXT_RX_INFO
+#define NEXT_RX_INFO (&fsk9600_4_rx)
+
+/* --------------------------------------------------------------------- */
+
+static const struct modem_tx_info fsk9600_5_tx = {
+	NEXT_TX_INFO, "fsk9600", sizeof(struct mod_state_fsk96), 48000, 9600, 5, 
+	modulator_9600_5, NULL
+};
+#undef NEXT_TX_INFO
+#define NEXT_TX_INFO (&fsk9600_5_tx)
+
+static const struct modem_rx_info fsk9600_5_rx = {
+	NEXT_RX_INFO, "fsk9600", sizeof(struct demod_state_fsk96), 48000, 9600, 5, 5, 
+	demodulator_9600_5, demod_init_9600
+};
+#undef NEXT_RX_INFO
+#define NEXT_RX_INFO (&fsk9600_5_rx)
+
+/* --------------------------------------------------------------------- */
+
+#undef DEMOD_STATE
+#undef MOD_STATE

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov