dl-fldigi/src/mfsk/mfskvaricode.cxx

350 wiersze
11 KiB
C++

// ----------------------------------------------------------------------------
//
// MFSKvaricode.cxx -- MFSK Varicode
//
// Copyright (C) 2006-2007
// Dave Freese, W1HKJ
//
// This file is part of fldigi. Adapted from code contained in gmfsk source code
// distribution.
//
// This file is part of fldigi.
//
// Fldigi 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 3 of the License, or
// (at your option) any later version.
//
// Fldigi 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 fldigi. If not, see <http://www.gnu.org/licenses/>.
// ----------------------------------------------------------------------------
#include <config.h>
#include "mfskvaricode.h"
/*
* The IZ8BLY MFSK Varicode as defined in
* http://www.qsl.net/zl1bpu/MFSK/Varicode.html
*/
static const char *varicode[] = {
"11101011100", /* 000 - <NUL> */
"11101100000", /* 001 - <SOH> */
"11101101000", /* 002 - <STX> */
"11101101100", /* 003 - <ETX> */
"11101110000", /* 004 - <EOT> */
"11101110100", /* 005 - <ENQ> */
"11101111000", /* 006 - <ACK> */
"11101111100", /* 007 - <BEL> */
"10101000", /* 008 - <BS> */
"11110000000", /* 009 - <TAB> */
"11110100000", /* 010 - <LF> */
"11110101000", /* 011 - <VT> */
"11110101100", /* 012 - <FF> */
"10101100", /* 013 - <CR> */
"11110110000", /* 014 - <SO> */
"11110110100", /* 015 - <SI> */
"11110111000", /* 016 - <DLE> */
"11110111100", /* 017 - <DC1> */
"11111000000", /* 018 - <DC2> */
"11111010000", /* 019 - <DC3> */
"11111010100", /* 020 - <DC4> */
"11111011000", /* 021 - <NAK> */
"11111011100", /* 022 - <SYN> */
"11111100000", /* 023 - <ETB> */
"11111101000", /* 024 - <CAN> */
"11111101100", /* 025 - <EM> */
"11111110000", /* 026 - <SUB> */
"11111110100", /* 027 - <ESC> */
"11111111000", /* 028 - <FS> */
"11111111100", /* 029 - <GS> */
"100000000000", /* 030 - <RS> */
"101000000000", /* 031 - <US> */
"100", /* 032 - <SPC> */
"111000000", /* 033 - ! */
"111111100", /* 034 - '"' */
"1011011000", /* 035 - # */
"1010101000", /* 036 - $ */
"1010100000", /* 037 - % */
"1000000000", /* 038 - & */
"110111100", /* 039 - ' */
"111110100", /* 040 - ( */
"111110000", /* 041 - ) */
"1010110100", /* 042 - * */
"111100000", /* 043 - + */
"10100000", /* 044 - , */
"111011000", /* 045 - - */
"111010100", /* 046 - . */
"111101000", /* 047 - / */
"11100000", /* 048 - 0 */
"11110000", /* 049 - 1 */
"101000000", /* 050 - 2 */
"101010100", /* 051 - 3 */
"101110100", /* 052 - 4 */
"101100000", /* 053 - 5 */
"101101100", /* 054 - 6 */
"110100000", /* 055 - 7 */
"110000000", /* 056 - 8 */
"110101100", /* 057 - 9 */
"111101100", /* 058 - : */
"111111000", /* 059 - ; */
"1011000000", /* 060 - < */
"111011100", /* 061 - = */
"1010111100", /* 062 - > */
"111010000", /* 063 - ? */
"1010000000", /* 064 - @ */
"10111100", /* 065 - A */
"100000000", /* 066 - B */
"11010100", /* 067 - C */
"11011100", /* 068 - D */
"10111000", /* 069 - E */
"11111000", /* 070 - F */
"101010000", /* 071 - G */
"101011000", /* 072 - H */
"11000000", /* 073 - I */
"110110100", /* 074 - J */
"101111100", /* 075 - K */
"11110100", /* 076 - L */
"11101000", /* 077 - M */
"11111100", /* 078 - N */
"11010000", /* 079 - O */
"11101100", /* 080 - P */
"110110000", /* 081 - Q */
"11011000", /* 082 - R */
"10110100", /* 083 - S */
"10110000", /* 084 - T */
"101011100", /* 085 - U */
"110101000", /* 086 - V */
"101101000", /* 087 - W */
"101110000", /* 088 - X */
"101111000", /* 089 - Y */
"110111000", /* 090 - Z */
"1011101000", /* 091 - [ */
"1011010000", /* 092 - \ */
"1011101100", /* 093 - ] */
"1011010100", /* 094 - ^ */
"1010110000", /* 095 - _ */
"1010101100", /* 096 - ` */
"10100", /* 097 - a */
"1100000", /* 098 - b */
"111000", /* 099 - c */
"110100", /* 100 - d */
"1000", /* 101 - e */
"1010000", /* 102 - f */
"1011000", /* 103 - g */
"110000", /* 104 - h */
"11000", /* 105 - i */
"10000000", /* 106 - j */
"1110000", /* 107 - k */
"101100", /* 108 - l */
"1000000", /* 109 - m */
"11100", /* 110 - n */
"10000", /* 111 - o */
"1010100", /* 112 - p */
"1111000", /* 113 - q */
"100000", /* 114 - r */
"101000", /* 115 - s */
"1100", /* 116 - t */
"111100", /* 117 - u */
"1101100", /* 118 - v */
"1101000", /* 119 - w */
"1110100", /* 120 - x */
"1011100", /* 121 - y */
"1111100", /* 122 - z */
"1011011100", /* 123 - { */
"1010111000", /* 124 - | */
"1011100000", /* 125 - } */
"1011110000", /* 126 - ~ */
"101010000000", /* 127 - <DEL> */
"101010100000", /* 128 - */
"101010101000", /* 129 - */
"101010101100", /* 130 - */
"101010110000", /* 131 - */
"101010110100", /* 132 - */
"101010111000", /* 133 - */
"101010111100", /* 134 - */
"101011000000", /* 135 - */
"101011010000", /* 136 - */
"101011010100", /* 137 - */
"101011011000", /* 138 - */
"101011011100", /* 139 - */
"101011100000", /* 140 - */
"101011101000", /* 141 - */
"101011101100", /* 142 - */
"101011110000", /* 143 - */
"101011110100", /* 144 - */
"101011111000", /* 145 - */
"101011111100", /* 146 - */
"101100000000", /* 147 - */
"101101000000", /* 148 - */
"101101010000", /* 149 - */
"101101010100", /* 150 - */
"101101011000", /* 151 - */
"101101011100", /* 152 - */
"101101100000", /* 153 - */
"101101101000", /* 154 - */
"101101101100", /* 155 - */
"101101110000", /* 156 - */
"101101110100", /* 157 - */
"101101111000", /* 158 - */
"101101111100", /* 159 - */
"1011110100", /* 160 - */
"1011111000", /* 161 - <20> */
"1011111100", /* 162 - <20> */
"1100000000", /* 163 - <20> */
"1101000000", /* 164 - <20> */
"1101010000", /* 165 - <20> */
"1101010100", /* 166 - <20> */
"1101011000", /* 167 - <20> */
"1101011100", /* 168 - <20> */
"1101100000", /* 169 - <20> */
"1101101000", /* 170 - <20> */
"1101101100", /* 171 - <20> */
"1101110000", /* 172 - <20> */
"1101110100", /* 173 - <20> */
"1101111000", /* 174 - <20> */
"1101111100", /* 175 - <20> */
"1110000000", /* 176 - <20> */
"1110100000", /* 177 - <20> */
"1110101000", /* 178 - <20> */
"1110101100", /* 179 - <20> */
"1110110000", /* 180 - <20> */
"1110110100", /* 181 - <20> */
"1110111000", /* 182 - <20> */
"1110111100", /* 183 - <20> */
"1111000000", /* 184 - <20> */
"1111010000", /* 185 - <20> */
"1111010100", /* 186 - <20> */
"1111011000", /* 187 - <20> */
"1111011100", /* 188 - <20> */
"1111100000", /* 189 - <20> */
"1111101000", /* 190 - <20> */
"1111101100", /* 191 - <20> */
"1111110000", /* 192 - <20> */
"1111110100", /* 193 - <20> */
"1111111000", /* 194 - <20> */
"1111111100", /* 195 - <20> */
"10000000000", /* 196 - <20> */
"10100000000", /* 197 - <20> */
"10101000000", /* 198 - <20> */
"10101010000", /* 199 - <20> */
"10101010100", /* 200 - <20> */
"10101011000", /* 201 - <20> */
"10101011100", /* 202 - <20> */
"10101100000", /* 203 - <20> */
"10101101000", /* 204 - <20> */
"10101101100", /* 205 - <20> */
"10101110000", /* 206 - <20> */
"10101110100", /* 207 - <20> */
"10101111000", /* 208 - <20> */
"10101111100", /* 209 - <20> */
"10110000000", /* 210 - <20> */
"10110100000", /* 211 - <20> */
"10110101000", /* 212 - <20> */
"10110101100", /* 213 - <20> */
"10110110000", /* 214 - <20> */
"10110110100", /* 215 - <20> */
"10110111000", /* 216 - <20> */
"10110111100", /* 217 - <20> */
"10111000000", /* 218 - <20> */
"10111010000", /* 219 - <20> */
"10111010100", /* 220 - <20> */
"10111011000", /* 221 - <20> */
"10111011100", /* 222 - <20> */
"10111100000", /* 223 - <20> */
"10111101000", /* 224 - <20> */
"10111101100", /* 225 - <20> */
"10111110000", /* 226 - <20> */
"10111110100", /* 227 - <20> */
"10111111000", /* 228 - <20> */
"10111111100", /* 229 - <20> */
"11000000000", /* 230 - <20> */
"11010000000", /* 231 - <20> */
"11010100000", /* 232 - <20> */
"11010101000", /* 233 - <20> */
"11010101100", /* 234 - <20> */
"11010110000", /* 235 - <20> */
"11010110100", /* 236 - <20> */
"11010111000", /* 237 - <20> */
"11010111100", /* 238 - <20> */
"11011000000", /* 239 - <20> */
"11011010000", /* 240 - <20> */
"11011010100", /* 241 - <20> */
"11011011000", /* 242 - <20> */
"11011011100", /* 243 - <20> */
"11011100000", /* 244 - <20> */
"11011101000", /* 245 - <20> */
"11011101100", /* 246 - <20> */
"11011110000", /* 247 - <20> */
"11011110100", /* 248 - <20> */
"11011111000", /* 249 - <20> */
"11011111100", /* 250 - <20> */
"11100000000", /* 251 - <20> */
"11101000000", /* 252 - n */
"11101010000", /* 253 - <20> */
"11101010100", /* 254 - <20> */
"11101011000" /* 255 - <20> */
};
/*
* The same in a format more suitable for decoding.
*/
static const unsigned int varidecode[] = {
0x75C, 0x760, 0x768, 0x76C, 0x770, 0x774, 0x778, 0x77C,
0x0A8, 0x780, 0x7A0, 0x7A8, 0x7AC, 0x0AC, 0x7B0, 0x7B4,
0x7B8, 0x7BC, 0x7C0, 0x7D0, 0x7D4, 0x7D8, 0x7DC, 0x7E0,
0x7E8, 0x7EC, 0x7F0, 0x7F4, 0x7F8, 0x7FC, 0x800, 0xA00,
0x004, 0x1C0, 0x1FC, 0x2D8, 0x2A8, 0x2A0, 0x200, 0x1BC,
0x1F4, 0x1F0, 0x2B4, 0x1E0, 0x0A0, 0x1D8, 0x1D4, 0x1E8,
0x0E0, 0x0F0, 0x140, 0x154, 0x174, 0x160, 0x16C, 0x1A0,
0x180, 0x1AC, 0x1EC, 0x1F8, 0x2C0, 0x1DC, 0x2BC, 0x1D0,
0x280, 0x0BC, 0x100, 0x0D4, 0x0DC, 0x0B8, 0x0F8, 0x150,
0x158, 0x0C0, 0x1B4, 0x17C, 0x0F4, 0x0E8, 0x0FC, 0x0D0,
0x0EC, 0x1B0, 0x0D8, 0x0B4, 0x0B0, 0x15C, 0x1A8, 0x168,
0x170, 0x178, 0x1B8, 0x2E8, 0x2D0, 0x2EC, 0x2D4, 0x2B0,
0x2AC, 0x014, 0x060, 0x038, 0x034, 0x008, 0x050, 0x058,
0x030, 0x018, 0x080, 0x070, 0x02C, 0x040, 0x01C, 0x010,
0x054, 0x078, 0x020, 0x028, 0x00C, 0x03C, 0x06C, 0x068,
0x074, 0x05C, 0x07C, 0x2DC, 0x2B8, 0x2E0, 0x2F0, 0xA80,
0xAA0, 0xAA8, 0xAAC, 0xAB0, 0xAB4, 0xAB8, 0xABC, 0xAC0,
0xAD0, 0xAD4, 0xAD8, 0xADC, 0xAE0, 0xAE8, 0xAEC, 0xAF0,
0xAF4, 0xAF8, 0xAFC, 0xB00, 0xB40, 0xB50, 0xB54, 0xB58,
0xB5C, 0xB60, 0xB68, 0xB6C, 0xB70, 0xB74, 0xB78, 0xB7C,
0x2F4, 0x2F8, 0x2FC, 0x300, 0x340, 0x350, 0x354, 0x358,
0x35C, 0x360, 0x368, 0x36C, 0x370, 0x374, 0x378, 0x37C,
0x380, 0x3A0, 0x3A8, 0x3AC, 0x3B0, 0x3B4, 0x3B8, 0x3BC,
0x3C0, 0x3D0, 0x3D4, 0x3D8, 0x3DC, 0x3E0, 0x3E8, 0x3EC,
0x3F0, 0x3F4, 0x3F8, 0x3FC, 0x400, 0x500, 0x540, 0x550,
0x554, 0x558, 0x55C, 0x560, 0x568, 0x56C, 0x570, 0x574,
0x578, 0x57C, 0x580, 0x5A0, 0x5A8, 0x5AC, 0x5B0, 0x5B4,
0x5B8, 0x5BC, 0x5C0, 0x5D0, 0x5D4, 0x5D8, 0x5DC, 0x5E0,
0x5E8, 0x5EC, 0x5F0, 0x5F4, 0x5F8, 0x5FC, 0x600, 0x680,
0x6A0, 0x6A8, 0x6AC, 0x6B0, 0x6B4, 0x6B8, 0x6BC, 0x6C0,
0x6D0, 0x6D4, 0x6D8, 0x6DC, 0x6E0, 0x6E8, 0x6EC, 0x6F0,
0x6F4, 0x6F8, 0x6FC, 0x700, 0x740, 0x750, 0x754, 0x758
};
const char *varienc(int c)
{
if (c >= 0 && c < 256)
return varicode[c];
return varicode[0];
}
int varidec(unsigned int symbol)
{
int i;
for (i = 0; i < 256; i++)
if (symbol == varidecode[i])
return i;
return -1;
}