Browse Source

Add code

master
Simon 3 months ago
parent
commit
e53c129ff7
2 changed files with 968 additions and 0 deletions
  1. 56
    0
      Program.cs
  2. 912
    0
      Reciter.cs

+ 56
- 0
Program.cs View File

@@ -0,0 +1,56 @@
1
+using System.IO;
2
+using System.Text;
3
+
4
+using static SAMSharp.Sam;
5
+using static SAMSharp.Reciter;
6
+using System;
7
+using System.Media;
8
+
9
+namespace SAMSharp
10
+{
11
+    class Program
12
+    {
13
+        static Stream Wave(byte[] buffer, int bufferlength)
14
+        {
15
+            var strm = new MemoryStream();
16
+            var writer = new BinaryWriter(strm);
17
+
18
+            writer.Write("RIFF".ToCharArray());
19
+            writer.Write(bufferlength + 28);
20
+            writer.Write("WAVEfmt ".ToCharArray());
21
+
22
+            writer.Write(16);
23
+            writer.Write((short)1);
24
+            writer.Write((short)1);
25
+
26
+            writer.Write(22050);
27
+            writer.Write(22050);
28
+
29
+            writer.Write((short)1);
30
+            writer.Write((short)8);
31
+
32
+            //data chunk
33
+            writer.Write("data".ToCharArray());
34
+            writer.Write(bufferlength);
35
+
36
+            writer.Write(buffer, 0, bufferlength);
37
+
38
+            return strm;
39
+        }
40
+
41
+        static void Main(string[] args)
42
+        {
43
+            string txt = null;
44
+            foreach (var arg in args)
45
+                txt += $"{arg} ";
46
+            byte[] text = Encoding.ASCII.GetBytes(txt);
47
+            Array.Resize(ref text, 256);
48
+            TextToPhonemes(text);
49
+            SetInput(text);
50
+            SAMMain();
51
+            var strm = Wave(GetBuffer(), GetBufferLength() / 50);
52
+            strm.Position = 0;
53
+            new SoundPlayer(strm).PlaySync();
54
+        }
55
+    }
56
+}

+ 912
- 0
Reciter.cs View File

@@ -0,0 +1,912 @@
1
+namespace SAMSharp
2
+{
3
+    class Reciter
4
+    {
5
+        //some flags
6
+        static byte[] tab36376 =
7
+        {
8
+            0, 0, 0, 0, 0, 0, 0, 0, // 0-7
9
+	        0, 0, 0, 0, 0, 0, 0, 0, // 8-15
10
+	        0, 0, 0, 0, 0, 0, 0, 0,
11
+            0, 0, 0, 0, 0, 0, 0, 0,
12
+            0, 2, 2, 2, 2, 2, 2, 130, // ' ', '!'
13
+	        0, 0, 2, 2, 2, 2, 2, 2,
14
+            3, 3, 3, 3, 3, 3, 3, 3,
15
+            3, 3, 2, 2, 2, 2, 2, 2,
16
+            2, 192, 168, 176, 172, 192, 160, 184, // '@', 'A'
17
+	        160, 192, 188, 160, 172, 168, 172, 192,
18
+            160, 160, 172, 180, 164, 192, 168, 168,
19
+            176, 192, 188, 0, 0, 0, 2, 0, // 'X', 'Y', 'Z', '[', 
20
+	        32, 32, 155, 32, 192, 185, 32, 205,
21
+            163, 76, 138, 142
22
+        };
23
+
24
+        static char[] rules =
25
+        {
26
+            ']',(char)('A'|0x80),
27
+            ' ','(','A','.',')',                    '=','E','H','4','Y','.',(char)(' '|0x80),
28
+            '(','A',')',' ',                        '=','A',(char)('H'|0x80),
29
+            ' ','(','A','R','E',')',' ',            '=','A','A',(char)('R'|0x80),
30
+            ' ','(','A','R',')','O',                '=','A','X',(char)('R'|0x80),
31
+            '(','A','R',')','#',                    '=','E','H','4',(char)('R'|0x80),
32
+            ' ','^','(','A','S',')','#',            '=','E','Y','4',(char)('S'|0x80),
33
+            '(','A',')','W','A',                    '=','A',(char)('X'|0x80),
34
+            '(','A','W',')',                        '=','A','O',(char)('5'|0x80),
35
+            ' ',':','(','A','N','Y',')',            '=','E','H','4','N','I',(char)('Y'|0x80),
36
+            '(','A',')','^','+','#',                '=','E','Y',(char)('5'|0x80),
37
+            '#',':','(','A','L','L','Y',')',        '=','U','L','I',(char)('Y'|0x80),
38
+            ' ','(','A','L',')','#',                '=','U',(char)('L'|0x80),
39
+            '(','A','G','A','I','N',')',            '=','A','X','G','E','H','4',(char)('N'|0x80),
40
+            '#',':','(','A','G',')','E',            '=','I','H',(char)('J'|0x80),
41
+            '(','A',')','^','%',                    '=','E',(char)('Y'|0x80),
42
+            '(','A',')','^','+',':','#',            '=','A',(char)('E'|0x80),
43
+            ' ',':','(','A',')','^','+',' ',        '=','E','Y',(char)('4'|0x80),
44
+            ' ','(','A','R','R',')',                '=','A','X',(char)('R'|0x80),
45
+            '(','A','R','R',')',                    '=','A','E','4',(char)('R'|0x80),
46
+            ' ','^','(','A','R',')',' ',            '=','A','A','5',(char)('R'|0x80),
47
+            '(','A','R',')',                        '=','A','A','5',(char)('R'|0x80),
48
+            '(','A','I','R',')',                    '=','E','H','4',(char)('R'|0x80),
49
+            '(','A','I',')',                        '=','E','Y',(char)('4'|0x80),
50
+            '(','A','Y',')',                        '=','E','Y',(char)('5'|0x80),
51
+            '(','A','U',')',                        '=','A','O',(char)('4'|0x80),
52
+            '#',':','(','A','L',')',' ',            '=','U',(char)('L'|0x80),
53
+            '#',':','(','A','L','S',')',' ',        '=','U','L',(char)('Z'|0x80),
54
+            '(','A','L','K',')',                    '=','A','O','4',(char)('K'|0x80),
55
+            '(','A','L',')','^',                    '=','A','O',(char)('L'|0x80),
56
+            ' ',':','(','A','B','L','E',')',        '=','E','Y','4','B','U',(char)('L'|0x80),
57
+            '(','A','B','L','E',')',                '=','A','X','B','U',(char)('L'|0x80),
58
+            '(','A',')','V','O',                    '=','E','Y',(char)('4'|0x80),
59
+            '(','A','N','G',')','+',                '=','E','Y','4','N',(char)('J'|0x80),
60
+            '(','A','T','A','R','I',')',            '=','A','H','T','A','A','4','R','I',(char)('Y'|0x80),
61
+            '(','A',')','T','O','M',                '=','A',(char)('E'|0x80),
62
+            '(','A',')','T','T','I',                '=','A',(char)('E'|0x80),
63
+            ' ','(','A','T',')',' ',                '=','A','E',(char)('T'|0x80),
64
+            ' ','(','A',')','T',                    '=','A',(char)('H'|0x80),
65
+            '(','A',')',                            '=','A',(char)('E'|0x80),
66
+
67
+            ']',(char)('B'|0x80),
68
+            ' ','(','B',')',' ',                    '=','B','I','Y',(char)('4'|0x80),
69
+            ' ','(','B','E',')','^','#',            '=','B','I',(char)('H'|0x80),
70
+            '(','B','E','I','N','G',')',            '=','B','I','Y','4','I','H','N',(char)('X'|0x80),
71
+            ' ','(','B','O','T','H',')',' ',        '=','B','O','W','4','T',(char)('H'|0x80),
72
+            ' ','(','B','U','S',')','#',            '=','B','I','H','4',(char)('Z'|0x80),
73
+            '(','B','R','E','A','K',')',            '=','B','R','E','Y','5',(char)('K'|0x80),
74
+            '(','B','U','I','L',')',                '=','B','I','H','4',(char)('L'|0x80),
75
+            '(','B',')',                            '=',(char)('B'|0x80),
76
+
77
+            ']',(char)('C'|0x80),
78
+            ' ','(','C',')',' ',                    '=','S','I','Y',(char)('4'|0x80),
79
+            ' ','(','C','H',')','^',                '=',(char)('K'|0x80),
80
+            '^','E','(','C','H',')',                '=',(char)('K'|0x80),
81
+            '(','C','H','A',')','R','#',            '=','K','E','H',(char)('5'|0x80),
82
+            '(','C','H',')',                        '=','C',(char)('H'|0x80),
83
+            ' ','S','(','C','I',')','#',            '=','S','A','Y',(char)('4'|0x80),
84
+            '(','C','I',')','A',                    '=','S',(char)('H'|0x80),
85
+            '(','C','I',')','O',                    '=','S',(char)('H'|0x80),
86
+            '(','C','I',')','E','N',                '=','S',(char)('H'|0x80),
87
+            '(','C','I','T','Y',')',                '=','S','I','H','T','I',(char)('Y'|0x80),
88
+            '(','C',')','+',                        '=',(char)('S'|0x80),
89
+            '(','C','K',')',                        '=',(char)('K'|0x80),
90
+            '(','C','O','M','M','O','D','O','R','E',')','=','K','A','A','4','M','A','H','D','O','H',(char)('R'|0x80),
91
+            '(','C','O','M',')',                    '=','K','A','H',(char)('M'|0x80),
92
+            '(','C','U','I','T',')',                '=','K','I','H',(char)('T'|0x80),
93
+            '(','C','R','E','A',')',                '=','K','R','I','Y','E',(char)('Y'|0x80),
94
+            '(','C',')',                            '=',(char)('K'|0x80),
95
+
96
+            ']',(char)('D'|0x80),
97
+            ' ','(','D',')',' ',                    '=','D','I','Y',(char)('4'|0x80),
98
+            ' ','(','D','R','.',')',' ',            '=','D','A','A','4','K','T','E',(char)('R'|0x80),
99
+            '#',':','(','D','E','D',')',' ',        '=','D','I','H',(char)('D'|0x80),
100
+            '.','E','(','D',')',' ',                '=',(char)('D'|0x80),
101
+            '#',':','^','E','(','D',')',' ',        '=',(char)('T'|0x80),
102
+            ' ','(','D','E',')','^','#',            '=','D','I',(char)('H'|0x80),
103
+            ' ','(','D','O',')',' ',                '=','D','U',(char)('W'|0x80),
104
+            ' ','(','D','O','E','S',')',            '=','D','A','H',(char)('Z'|0x80),
105
+            '(','D','O','N','E',')',' ',            '=','D','A','H','5',(char)('N'|0x80),
106
+            '(','D','O','I','N','G',')',            '=','D','U','W','4','I','H','N',(char)('X'|0x80),
107
+            ' ','(','D','O','W',')',                '=','D','A',(char)('W'|0x80),
108
+            '#','(','D','U',')','A',                '=','J','U',(char)('W'|0x80),
109
+            '#','(','D','U',')','^','#',            '=','J','A',(char)('X'|0x80),
110
+            '(','D',')',                            '=',(char)('D'|0x80),
111
+
112
+            ']',(char)('E'|0x80),
113
+            ' ','(','E',')',' ',                    '=','I','Y','I','Y',(char)('4'|0x80),
114
+            '#',':','(','E',')',' ',(char)('='|0x80),
115
+            '\'',':','^','(','E',')',' ',(char)('='|0x80),
116
+            ' ',':','(','E',')',' ',                '=','I',(char)('Y'|0x80),
117
+            '#','(','E','D',')',' ',                '=',(char)('D'|0x80),
118
+            '#',':','(','E',')','D',' ',(char)('='|0x80),
119
+            '(','E','V',')','E','R',                '=','E','H','4',(char)('V'|0x80),
120
+            '(','E',')','^','%',                    '=','I','Y',(char)('4'|0x80),
121
+            '(','E','R','I',')','#',                '=','I','Y','4','R','I',(char)('Y'|0x80),
122
+            '(','E','R','I',')',                    '=','E','H','4','R','I',(char)('H'|0x80),
123
+            '#',':','(','E','R',')','#',            '=','E',(char)('R'|0x80),
124
+            '(','E','R','R','O','R',')',            '=','E','H','4','R','O','H',(char)('R'|0x80),
125
+            '(','E','R','A','S','E',')',            '=','I','H','R','E','Y','5',(char)('S'|0x80),
126
+            '(','E','R',')','#',                    '=','E','H',(char)('R'|0x80),
127
+            '(','E','R',')',                        '=','E',(char)('R'|0x80),
128
+            ' ','(','E','V','E','N',')',            '=','I','Y','V','E','H',(char)('N'|0x80),
129
+            '#',':','(','E',')','W',(char)('='|0x80),
130
+            '@','(','E','W',')',                    '=','U',(char)('W'|0x80),
131
+            '(','E','W',')',                        '=','Y','U',(char)('W'|0x80),
132
+            '(','E',')','O',                        '=','I',(char)('Y'|0x80),
133
+            '#',':','&','(','E','S',')',' ',        '=','I','H',(char)('Z'|0x80),
134
+            '#',':','(','E',')','S',' ',(char)('='|0x80),
135
+            '#',':','(','E','L','Y',')',' ',        '=','L','I',(char)('Y'|0x80),
136
+            '#',':','(','E','M','E','N','T',')',    '=','M','E','H','N',(char)('T'|0x80),
137
+            '(','E','F','U','L',')',                '=','F','U','H',(char)('L'|0x80),
138
+            '(','E','E',')',                        '=','I','Y',(char)('4'|0x80),
139
+            '(','E','A','R','N',')',                '=','E','R','5',(char)('N'|0x80),
140
+            ' ','(','E','A','R',')','^',            '=','E','R',(char)('5'|0x80),
141
+            '(','E','A','D',')',                    '=','E','H',(char)('D'|0x80),
142
+            '#',':','(','E','A',')',' ',            '=','I','Y','A',(char)('X'|0x80),
143
+            '(','E','A',')','S','U',                '=','E','H',(char)('5'|0x80),
144
+            '(','E','A',')',                        '=','I','Y',(char)('5'|0x80),
145
+            '(','E','I','G','H',')',                '=','E','Y',(char)('4'|0x80),
146
+            '(','E','I',')',                        '=','I','Y',(char)('4'|0x80),
147
+            ' ','(','E','Y','E',')',                '=','A','Y',(char)('4'|0x80),
148
+            '(','E','Y',')',                        '=','I',(char)('Y'|0x80),
149
+            '(','E','U',')',                        '=','Y','U','W',(char)('5'|0x80),
150
+            '(','E','Q','U','A','L',')',            '=','I','Y','4','K','W','U',(char)('L'|0x80),
151
+            '(','E',')',                            '=','E',(char)('H'|0x80),
152
+
153
+            ']',(char)('F'|0x80),
154
+            ' ','(','F',')',' ',                    '=','E','H','4',(char)('F'|0x80),
155
+            '(','F','U','L',')',                    '=','F','U','H',(char)('L'|0x80),
156
+            '(','F','R','I','E','N','D',')',        '=','F','R','E','H','5','N',(char)('D'|0x80),
157
+            '(','F','A','T','H','E','R',')',        '=','F','A','A','4','D','H','E',(char)('R'|0x80),
158
+            '(','F',')','F',(char)('='|0x80),
159
+            '(','F',')',                            '=',(char)('F'|0x80),
160
+
161
+            ']',(char)('G'|0x80),
162
+            ' ','(','G',')',' ',                    '=','J','I','Y',(char)('4'|0x80),
163
+            '(','G','I','V',')',                    '=','G','I','H','5',(char)('V'|0x80),
164
+            ' ','(','G',')','I','^',                '=',(char)('G'|0x80),
165
+            '(','G','E',')','T',                    '=','G','E','H',(char)('5'|0x80),
166
+            'S','U','(','G','G','E','S',')',        '=','G','J','E','H','4',(char)('S'|0x80),
167
+            '(','G','G',')',                        '=',(char)('G'|0x80),
168
+            ' ','B','#','(','G',')',                '=',(char)('G'|0x80),
169
+            '(','G',')','+',                        '=',(char)('J'|0x80),
170
+            '(','G','R','E','A','T',')',            '=','G','R','E','Y','4',(char)('T'|0x80),
171
+            '(','G','O','N',')','E',                '=','G','A','O','5',(char)('N'|0x80),
172
+            '#','(','G','H',')',(char)('='|0x80),
173
+            ' ','(','G','N',')',                    '=',(char)('N'|0x80),
174
+            '(','G',')',                            '=',(char)('G'|0x80),
175
+
176
+            ']',(char)('H'|0x80),
177
+            ' ','(','H',')',' ',                    '=','E','Y','4','C',(char)('H'|0x80),
178
+            ' ','(','H','A','V',')',                '=','/','H','A','E','6',(char)('V'|0x80),
179
+            ' ','(','H','E','R','E',')',            '=','/','H','I','Y',(char)('R'|0x80),
180
+            ' ','(','H','O','U','R',')',            '=','A','W','5','E',(char)('R'|0x80),
181
+            '(','H','O','W',')',                    '=','/','H','A',(char)('W'|0x80),
182
+            '(','H',')','#',                        '=','/',(char)('H'|0x80),
183
+            '(','H',')',(char)('='|0x80),
184
+
185
+            ']',(char)('I'|0x80),
186
+            ' ','(','I','N',')',                    '=','I','H',(char)('N'|0x80),
187
+            ' ','(','I',')',' ',                    '=','A','Y',(char)('4'|0x80),
188
+            '(','I',')',' ',                        '=','A',(char)('Y'|0x80),
189
+            '(','I','N',')','D',                    '=','A','Y','5',(char)('N'|0x80),
190
+            'S','E','M','(','I',')',                '=','I',(char)('Y'|0x80),
191
+            ' ','A','N','T','(','I',')',            '=','A',(char)('Y'|0x80),
192
+            '(','I','E','R',')',                    '=','I','Y','E',(char)('R'|0x80),
193
+            '#',':','R','(','I','E','D',')',' ',    '=','I','Y',(char)('D'|0x80),
194
+            '(','I','E','D',')',' ',                '=','A','Y','5',(char)('D'|0x80),
195
+            '(','I','E','N',')',                    '=','I','Y','E','H',(char)('N'|0x80),
196
+            '(','I','E',')','T',                    '=','A','Y','4','E',(char)('H'|0x80),
197
+            '(','I','\'',')',                        '=','A','Y',(char)('5'|0x80),
198
+            ' ',':','(','I',')','^','%',            '=','A','Y',(char)('5'|0x80),
199
+            ' ',':','(','I','E',')',' ',            '=','A','Y',(char)('4'|0x80),
200
+            '(','I',')','%',                        '=','I',(char)('Y'|0x80),
201
+            '(','I','E',')',                        '=','I','Y',(char)('4'|0x80),
202
+            ' ','(','I','D','E','A',')',            '=','A','Y','D','I','Y','5','A',(char)('H'|0x80),
203
+            '(','I',')','^','+',':','#',            '=','I',(char)('H'|0x80),
204
+            '(','I','R',')','#',                    '=','A','Y',(char)('R'|0x80),
205
+            '(','I','Z',')','%',                    '=','A','Y',(char)('Z'|0x80),
206
+            '(','I','S',')','%',                    '=','A','Y',(char)('Z'|0x80),
207
+            'I','^','(','I',')','^','#',            '=','I',(char)('H'|0x80),
208
+            '+','^','(','I',')','^','+',            '=','A',(char)('Y'|0x80),
209
+            '#',':','^','(','I',')','^','+',        '=','I',(char)('H'|0x80),
210
+            '(','I',')','^','+',                    '=','A',(char)('Y'|0x80),
211
+            '(','I','R',')',                        '=','E',(char)('R'|0x80),
212
+            '(','I','G','H',')',                    '=','A','Y',(char)('4'|0x80),
213
+            '(','I','L','D',')',                    '=','A','Y','5','L',(char)('D'|0x80),
214
+            ' ','(','I','G','N',')',                '=','I','H','G',(char)('N'|0x80),
215
+            '(','I','G','N',')',' ',                '=','A','Y','4',(char)('N'|0x80),
216
+            '(','I','G','N',')','^',                '=','A','Y','4',(char)('N'|0x80),
217
+            '(','I','G','N',')','%',                '=','A','Y','4',(char)('N'|0x80),
218
+            '(','I','C','R','O',')',                '=','A','Y','4','K','R','O',(char)('H'|0x80),
219
+            '(','I','Q','U','E',')',                '=','I','Y','4',(char)('K'|0x80),
220
+            '(','I',')',                            '=','I',(char)('H'|0x80),
221
+
222
+            ']',(char)('J'|0x80),
223
+            ' ','(','J',')',' ',                    '=','J','E','Y',(char)('4'|0x80),
224
+            '(','J',')',                            '=',(char)('J'|0x80),
225
+
226
+            ']',(char)('K'|0x80),
227
+            ' ','(','K',')',' ',                    '=','K','E','Y',(char)('4'|0x80),
228
+            ' ','(','K',')','N',(char)('='|0x80),
229
+            '(','K',')',                            '=',(char)('K'|0x80),
230
+
231
+            ']',(char)('L'|0x80),
232
+            ' ','(','L',')',' ',                    '=','E','H','4',(char)('L'|0x80),
233
+            '(','L','O',')','C','#',                '=','L','O',(char)('W'|0x80),
234
+            'L','(','L',')',(char)('='|0x80),
235
+            '#',':','^','(','L',')','%',            '=','U',(char)('L'|0x80),
236
+            '(','L','E','A','D',')',                '=','L','I','Y',(char)('D'|0x80),
237
+            ' ','(','L','A','U','G','H',')',        '=','L','A','E','4',(char)('F'|0x80),
238
+            '(','L',')',                            '=',(char)('L'|0x80),
239
+
240
+            ']',(char)('M'|0x80),
241
+            ' ','(','M',')',' ',                    '=','E','H','4',(char)('M'|0x80),
242
+            ' ','(','M','R','.',')',' ',            '=','M','I','H','4','S','T','E',(char)('R'|0x80),
243
+            ' ','(','M','S','.',')',                '=','M','I','H','5',(char)('Z'|0x80),
244
+            ' ','(','M','R','S','.',')',' ',        '=','M','I','H','4','S','I','X',(char)('Z'|0x80),
245
+            '(','M','O','V',')',                    '=','M','U','W','4',(char)('V'|0x80),
246
+            '(','M','A','C','H','I','N',')',        '=','M','A','H','S','H','I','Y','5',(char)('N'|0x80),
247
+            'M','(','M',')',(char)('='|0x80),
248
+            '(','M',')',                            '=',(char)('M'|0x80),
249
+
250
+            ']',(char)('N'|0x80),
251
+            ' ','(','N',')',' ',                    '=','E','H','4',(char)('N'|0x80),
252
+            'E','(','N','G',')','+',                '=','N',(char)('J'|0x80),
253
+            '(','N','G',')','R',                    '=','N','X',(char)('G'|0x80),
254
+            '(','N','G',')','#',                    '=','N','X',(char)('G'|0x80),
255
+            '(','N','G','L',')','%',                '=','N','X','G','U',(char)('L'|0x80),
256
+            '(','N','G',')',                        '=','N',(char)('X'|0x80),
257
+            '(','N','K',')',                        '=','N','X',(char)('K'|0x80),
258
+            ' ','(','N','O','W',')',' ',            '=','N','A','W',(char)('4'|0x80),
259
+            'N','(','N',')',(char)('='|0x80),
260
+            '(','N','O','N',')','E',                '=','N','A','H','4',(char)('N'|0x80),
261
+            '(','N',')',                            '=',(char)('N'|0x80),
262
+
263
+            ']',(char)('O'|0x80),
264
+            ' ','(','O',')',' ',                    '=','O','H','4',(char)('W'|0x80),
265
+            '(','O','F',')',' ',                    '=','A','H',(char)('V'|0x80),
266
+            ' ','(','O','H',')',' ',                '=','O','W',(char)('5'|0x80),
267
+            '(','O','R','O','U','G','H',')',        '=','E','R','4','O',(char)('W'|0x80),
268
+            '#',':','(','O','R',')',' ',            '=','E',(char)('R'|0x80),
269
+            '#',':','(','O','R','S',')',' ',        '=','E','R',(char)('Z'|0x80),
270
+            '(','O','R',')',                        '=','A','O',(char)('R'|0x80),
271
+            ' ','(','O','N','E',')',                '=','W','A','H',(char)('N'|0x80),
272
+            '#','(','O','N','E',')',' ',            '=','W','A','H',(char)('N'|0x80),
273
+            '(','O','W',')',                        '=','O',(char)('W'|0x80),
274
+            ' ','(','O','V','E','R',')',            '=','O','W','5','V','E',(char)('R'|0x80),
275
+            'P','R','(','O',')','V',                '=','U','W',(char)('4'|0x80),
276
+            '(','O','V',')',                        '=','A','H','4',(char)('V'|0x80),
277
+            '(','O',')','^','%',                    '=','O','W',(char)('5'|0x80),
278
+            '(','O',')','^','E','N',                '=','O',(char)('W'|0x80),
279
+            '(','O',')','^','I','#',                '=','O','W',(char)('5'|0x80),
280
+            '(','O','L',')','D',                    '=','O','W','4',(char)('L'|0x80),
281
+            '(','O','U','G','H','T',')',            '=','A','O','5',(char)('T'|0x80),
282
+            '(','O','U','G','H',')',                '=','A','H','5',(char)('F'|0x80),
283
+            ' ','(','O','U',')',                    '=','A',(char)('W'|0x80),
284
+            'H','(','O','U',')','S','#',            '=','A','W',(char)('4'|0x80),
285
+            '(','O','U','S',')',                    '=','A','X',(char)('S'|0x80),
286
+            '(','O','U','R',')',                    '=','O','H',(char)('R'|0x80),
287
+            '(','O','U','L','D',')',                '=','U','H','5',(char)('D'|0x80),
288
+            '(','O','U',')','^','L',                '=','A','H',(char)('5'|0x80),
289
+            '(','O','U','P',')',                    '=','U','W','5',(char)('P'|0x80),
290
+            '(','O','U',')',                        '=','A',(char)('W'|0x80),
291
+            '(','O','Y',')',                        '=','O',(char)('Y'|0x80),
292
+            '(','O','I','N','G',')',                '=','O','W','4','I','H','N',(char)('X'|0x80),
293
+            '(','O','I',')',                        '=','O','Y',(char)('5'|0x80),
294
+            '(','O','O','R',')',                    '=','O','H','5',(char)('R'|0x80),
295
+            '(','O','O','K',')',                    '=','U','H','5',(char)('K'|0x80),
296
+            'F','(','O','O','D',')',                '=','U','W','5',(char)('D'|0x80),
297
+            'L','(','O','O','D',')',                '=','A','H','5',(char)('D'|0x80),
298
+            'M','(','O','O','D',')',                '=','U','W','5',(char)('D'|0x80),
299
+            '(','O','O','D',')',                    '=','U','H','5',(char)('D'|0x80),
300
+            'F','(','O','O','T',')',                '=','U','H','5',(char)('T'|0x80),
301
+            '(','O','O',')',                        '=','U','W',(char)('5'|0x80),
302
+            '(','O','\'',')',                        '=','O',(char)('H'|0x80),
303
+            '(','O',')','E',                        '=','O',(char)('W'|0x80),
304
+            '(','O',')',' ',                        '=','O',(char)('W'|0x80),
305
+            '(','O','A',')',                        '=','O','W',(char)('4'|0x80),
306
+            ' ','(','O','N','L','Y',')',            '=','O','W','4','N','L','I',(char)('Y'|0x80),
307
+            ' ','(','O','N','C','E',')',            '=','W','A','H','4','N',(char)('S'|0x80),
308
+            '(','O','N','\'','T',')',                '=','O','W','4','N',(char)('T'|0x80),
309
+            'C','(','O',')','N',                    '=','A',(char)('A'|0x80),
310
+            '(','O',')','N','G',                    '=','A',(char)('O'|0x80),
311
+            ' ',':','^','(','O',')','N',            '=','A',(char)('H'|0x80),
312
+            'I','(','O','N',')',                    '=','U',(char)('N'|0x80),
313
+            '#',':','(','O','N',')',                '=','U',(char)('N'|0x80),
314
+            '#','^','(','O','N',')',                '=','U',(char)('N'|0x80),
315
+            '(','O',')','S','T',                    '=','O',(char)('W'|0x80),
316
+            '(','O','F',')','^',                    '=','A','O','4',(char)('F'|0x80),
317
+            '(','O','T','H','E','R',')',            '=','A','H','5','D','H','E',(char)('R'|0x80),
318
+            'R','(','O',')','B',                    '=','R','A',(char)('A'|0x80),
319
+            '^','R','(','O',')',':','#',            '=','O','W',(char)('5'|0x80),
320
+            '(','O','S','S',')',' ',                '=','A','O','5',(char)('S'|0x80),
321
+            '#',':','^','(','O','M',')',            '=','A','H',(char)('M'|0x80),
322
+            '(','O',')',                            '=','A',(char)('A'|0x80),
323
+
324
+            ']',(char)('P'|0x80),
325
+            ' ','(','P',')',' ',                    '=','P','I','Y',(char)('4'|0x80),
326
+            '(','P','H',')',                        '=',(char)('F'|0x80),
327
+            '(','P','E','O','P','L',')',            '=','P','I','Y','5','P','U',(char)('L'|0x80),
328
+            '(','P','O','W',')',                    '=','P','A','W',(char)('4'|0x80),
329
+            '(','P','U','T',')',' ',                '=','P','U','H',(char)('T'|0x80),
330
+            '(','P',')','P',(char)('='|0x80),
331
+            '(','P',')','S',(char)('='|0x80),
332
+            '(','P',')','N',(char)('='|0x80),
333
+            '(','P','R','O','F','.',')',            '=','P','R','O','H','F','E','H','4','S','E',(char)('R'|0x80),
334
+            '(','P',')',                            '=',(char)('P'|0x80),
335
+
336
+            ']',(char)('Q'|0x80),
337
+            ' ','(','Q',')',' ',                    '=','K','Y','U','W',(char)('4'|0x80),
338
+            '(','Q','U','A','R',')',                '=','K','W','O','H','5',(char)('R'|0x80),
339
+            '(','Q','U',')',                        '=','K',(char)('W'|0x80),
340
+            '(','Q',')',                            '=',(char)('K'|0x80),
341
+            ']',(char)('R'|0x80),
342
+            ' ','(','R',')',' ',                    '=','A','A','5',(char)('R'|0x80),
343
+            ' ','(','R','E',')','^','#',            '=','R','I',(char)('Y'|0x80),
344
+            '(','R',')','R',(char)('='|0x80),
345
+            '(','R',')',                            '=',(char)('R'|0x80),
346
+
347
+            ']',(char)('S'|0x80),
348
+            ' ','(','S',')',' ',                    '=','E','H','4',(char)('S'|0x80),
349
+            '(','S','H',')',                        '=','S',(char)('H'|0x80),
350
+            '#','(','S','I','O','N',')',            '=','Z','H','U',(char)('N'|0x80),
351
+            '(','S','O','M','E',')',                '=','S','A','H',(char)('M'|0x80),
352
+            '#','(','S','U','R',')','#',            '=','Z','H','E',(char)('R'|0x80),
353
+            '(','S','U','R',')','#',                '=','S','H','E',(char)('R'|0x80),
354
+            '#','(','S','U',')','#',                '=','Z','H','U',(char)('W'|0x80),
355
+            '#','(','S','S','U',')','#',            '=','S','H','U',(char)('W'|0x80),
356
+            '#','(','S','E','D',')',                '=','Z',(char)('D'|0x80),
357
+            '#','(','S',')','#',                    '=',(char)('Z'|0x80),
358
+            '(','S','A','I','D',')',                '=','S','E','H',(char)('D'|0x80),
359
+            '^','(','S','I','O','N',')',            '=','S','H','U',(char)('N'|0x80),
360
+            '(','S',')','S',(char)('='|0x80),
361
+            '.','(','S',')',' ',                    '=',(char)('Z'|0x80),
362
+            '#',':','.','E','(','S',')',' ',        '=',(char)('Z'|0x80),
363
+            '#',':','^','#','(','S',')',' ',        '=',(char)('S'|0x80),
364
+            'U','(','S',')',' ',                    '=',(char)('S'|0x80),
365
+            ' ',':','#','(','S',')',' ',            '=',(char)('Z'|0x80),
366
+            '#','#','(','S',')',' ',                '=',(char)('Z'|0x80),
367
+            ' ','(','S','C','H',')',                '=','S',(char)('K'|0x80),
368
+            '(','S',')','C','+',(char)('='|0x80),
369
+            '#','(','S','M',')',                    '=','Z','U',(char)('M'|0x80),
370
+            '#','(','S','N',')','\'',                '=','Z','U',(char)('M'|0x80),
371
+            '(','S','T','L','E',')',                '=','S','U',(char)('L'|0x80),
372
+            '(','S',')',                            '=',(char)('S'|0x80),
373
+
374
+            ']',(char)('T'|0x80),
375
+            ' ','(','T',')',' ',                    '=','T','I','Y',(char)('4'|0x80),
376
+            ' ','(','T','H','E',')',' ','#',        '=','D','H','I',(char)('Y'|0x80),
377
+            ' ','(','T','H','E',')',' ',            '=','D','H','A',(char)('X'|0x80),
378
+            '(','T','O',')',' ',                    '=','T','U',(char)('X'|0x80),
379
+            ' ','(','T','H','A','T',')',            '=','D','H','A','E',(char)('T'|0x80),
380
+            ' ','(','T','H','I','S',')',' ',        '=','D','H','I','H',(char)('S'|0x80),
381
+            ' ','(','T','H','E','Y',')',            '=','D','H','E',(char)('Y'|0x80),
382
+            ' ','(','T','H','E','R','E',')',        '=','D','H','E','H',(char)('R'|0x80),
383
+            '(','T','H','E','R',')',                '=','D','H','E',(char)('R'|0x80),
384
+            '(','T','H','E','I','R',')',            '=','D','H','E','H',(char)('R'|0x80),
385
+            ' ','(','T','H','A','N',')',' ',        '=','D','H','A','E',(char)('N'|0x80),
386
+            ' ','(','T','H','E','M',')',' ',        '=','D','H','A','E',(char)('N'|0x80),
387
+            '(','T','H','E','S','E',')',' ',        '=','D','H','I','Y',(char)('Z'|0x80),
388
+            ' ','(','T','H','E','N',')',            '=','D','H','E','H',(char)('N'|0x80),
389
+            '(','T','H','R','O','U','G','H',')',    '=','T','H','R','U','W',(char)('4'|0x80),
390
+            '(','T','H','O','S','E',')',            '=','D','H','O','H',(char)('Z'|0x80),
391
+            '(','T','H','O','U','G','H',')',' ',    '=','D','H','O',(char)('W'|0x80),
392
+            '(','T','O','D','A','Y',')',            '=','T','U','X','D','E',(char)('Y'|0x80),
393
+            '(','T','O','M','O',')','R','R','O','W','=','T','U','M','A','A',(char)('5'|0x80),
394
+            '(','T','O',')','T','A','L',            '=','T','O','W',(char)('5'|0x80),
395
+            ' ','(','T','H','U','S',')',            '=','D','H','A','H','4',(char)('S'|0x80),
396
+            '(','T','H',')',                        '=','T',(char)('H'|0x80),
397
+            '#',':','(','T','E','D',')',            '=','T','I','X',(char)('D'|0x80),
398
+            'S','(','T','I',')','#','N',            '=','C',(char)('H'|0x80),
399
+            '(','T','I',')','O',                    '=','S',(char)('H'|0x80),
400
+            '(','T','I',')','A',                    '=','S',(char)('H'|0x80),
401
+            '(','T','I','E','N',')',                '=','S','H','U',(char)('N'|0x80),
402
+            '(','T','U','R',')','#',                '=','C','H','E',(char)('R'|0x80),
403
+            '(','T','U',')','A',                    '=','C','H','U',(char)('W'|0x80),
404
+            ' ','(','T','W','O',')',                '=','T','U',(char)('W'|0x80),
405
+            '&','(','T',')','E','N',' ',(char)('='|0x80),
406
+            '(','T',')',                            '=',(char)('T'|0x80),
407
+
408
+            ']',(char)('U'|0x80),
409
+            ' ','(','U',')',' ',                    '=','Y','U','W',(char)('4'|0x80),
410
+            ' ','(','U','N',')','I',                '=','Y','U','W',(char)('N'|0x80),
411
+            ' ','(','U','N',')',                    '=','A','H',(char)('N'|0x80),
412
+            ' ','(','U','P','O','N',')',            '=','A','X','P','A','O',(char)('N'|0x80),
413
+            '@','(','U','R',')','#',                '=','U','H','4',(char)('R'|0x80),
414
+            '(','U','R',')','#',                    '=','Y','U','H','4',(char)('R'|0x80),
415
+            '(','U','R',')',                        '=','E',(char)('R'|0x80),
416
+            '(','U',')','^',' ',                    '=','A',(char)('H'|0x80),
417
+            '(','U',')','^','^',                    '=','A','H',(char)('5'|0x80),
418
+            '(','U','Y',')',                        '=','A','Y',(char)('5'|0x80),
419
+            ' ','G','(','U',')','#',(char)('='|0x80),
420
+            'G','(','U',')','%',(char)('='|0x80),
421
+            'G','(','U',')','#',                    '=',(char)('W'|0x80),
422
+            '#','N','(','U',')',                    '=','Y','U',(char)('W'|0x80),
423
+            '@','(','U',')',                        '=','U',(char)('W'|0x80),
424
+            '(','U',')',                            '=','Y','U',(char)('W'|0x80),
425
+
426
+            ']',(char)('V'|0x80),
427
+            ' ','(','V',')',' ',                    '=','V','I','Y',(char)('4'|0x80),
428
+            '(','V','I','E','W',')',                '=','V','Y','U','W',(char)('5'|0x80),
429
+            '(','V',')',                            '=',(char)('V'|0x80),
430
+
431
+            ']',(char)('W'|0x80),
432
+            ' ','(','W',')',' ',                    '=','D','A','H','4','B','U','L','Y','U',(char)('W'|0x80),
433
+            ' ','(','W','E','R','E',')',            '=','W','E',(char)('R'|0x80),
434
+            '(','W','A',')','S','H',                '=','W','A',(char)('A'|0x80),
435
+            '(','W','A',')','S','T',                '=','W','E',(char)('Y'|0x80),
436
+            '(','W','A',')','S',                    '=','W','A',(char)('H'|0x80),
437
+            '(','W','A',')','T',                    '=','W','A',(char)('A'|0x80),
438
+            '(','W','H','E','R','E',')',            '=','W','H','E','H',(char)('R'|0x80),
439
+            '(','W','H','A','T',')',                '=','W','H','A','H',(char)('T'|0x80),
440
+            '(','W','H','O','L',')',                '=','/','H','O','W',(char)('L'|0x80),
441
+            '(','W','H','O',')',                    '=','/','H','U',(char)('W'|0x80),
442
+            '(','W','H',')',                        '=','W',(char)('H'|0x80),
443
+            '(','W','A','R',')','#',                '=','W','E','H',(char)('R'|0x80),
444
+            '(','W','A','R',')',                    '=','W','A','O',(char)('R'|0x80),
445
+            '(','W','O','R',')','^',                '=','W','E',(char)('R'|0x80),
446
+            '(','W','R',')',                        '=',(char)('R'|0x80),
447
+            '(','W','O','M',')','A',                '=','W','U','H',(char)('M'|0x80),
448
+            '(','W','O','M',')','E',                '=','W','I','H',(char)('M'|0x80),
449
+            '(','W','E','A',')','R',                '=','W','E',(char)('H'|0x80),
450
+            '(','W','A','N','T',')',                '=','W','A','A','5','N',(char)('T'|0x80),
451
+            'A','N','S','(','W','E','R',')',        '=','E',(char)('R'|0x80),
452
+            '(','W',')',                            '=',(char)('W'|0x80),
453
+
454
+            ']',(char)('X'|0x80),
455
+            ' ','(','X',')',' ',                    '=','E','H','4','K',(char)('R'|0x80),
456
+            ' ','(','X',')',                        '=',(char)('Z'|0x80),
457
+            '(','X',')',                            '=','K',(char)('S'|0x80),
458
+
459
+            ']',(char)('Y'|0x80),
460
+            ' ','(','Y',')',' ',                    '=','W','A','Y',(char)('4'|0x80),
461
+            '(','Y','O','U','N','G',')',            '=','Y','A','H','N',(char)('X'|0x80),
462
+            ' ','(','Y','O','U','R',')',            '=','Y','O','H',(char)('R'|0x80),
463
+            ' ','(','Y','O','U',')',                '=','Y','U',(char)('W'|0x80),
464
+            ' ','(','Y','E','S',')',                '=','Y','E','H',(char)('S'|0x80),
465
+            ' ','(','Y',')',                        '=',(char)('Y'|0x80),
466
+            'F','(','Y',')',                        '=','A',(char)('Y'|0x80),
467
+            'P','S','(','Y','C','H',')',            '=','A','Y',(char)('K'|0x80),
468
+            '#',':','^','(','Y',')',                '=','I',(char)('Y'|0x80),
469
+            '#',':','^','(','Y',')','I',            '=','I',(char)('Y'|0x80),
470
+            ' ',':','(','Y',')',' ',                '=','A',(char)('Y'|0x80),
471
+            ' ',':','(','Y',')','#',                '=','A',(char)('Y'|0x80),
472
+            ' ',':','(','Y',')','^','+',':','#',    '=','I',(char)('H'|0x80),
473
+            ' ',':','(','Y',')','^','#',            '=','A',(char)('Y'|0x80),
474
+            '(','Y',')',                            '=','I',(char)('H'|0x80),
475
+
476
+            ']',(char)('Z'|0x80),
477
+            ' ','(','Z',')',' ',                    '=','Z','I','Y',(char)('4'|0x80),
478
+            '(','Z',')',                            '=',(char)('Z'|0x80),
479
+            (char)('j'|0x80)
480
+        };
481
+
482
+        static char[] rules2 =
483
+        {
484
+            '(','A',')',                            (char)('='|0x80),
485
+            '(','!',')',                            '=',(char)('.'|0x80),
486
+            '(','"',')',' ',                        '=','-','A','H','5','N','K','W','O','W','T',(char)('-'|0x80),
487
+            '(','"',')',                            '=','K','W','O','W','4','T',(char)('-'|0x80),
488
+            '(','#',')',                            '=',' ','N','A','H','4','M','B','E',(char)('R'|0x80),
489
+            '(','$',')',                            '=',' ','D','A','A','4','L','E',(char)('R'|0x80),
490
+            '(','%',')',                            '=',' ','P','E','R','S','E','H','4','N',(char)('T'|0x80),
491
+            '(','&',')',                            '=',' ','A','E','N',(char)('D'|0x80),
492
+            '(','\'',')',                           (char)('='|0x80),
493
+            '(','*',')',                            '=',' ','A','E','4','S','T','E','R','I','H','S',(char)('K'|0x80),
494
+            '(','+',')',                            '=',' ','P','L','A','H','4',(char)('S'|0x80),
495
+            '(',',',')',                            '=',(char)(','|0x80),
496
+            ' ','(','-',')',' ',                    '=',(char)('-'|0x80),
497
+            '(','-',')',                            (char)('='|0x80),
498
+            '(','.',')',                            '=',' ','P','O','Y','N',(char)('T'|0x80),
499
+            '(','/',')',                            '=',' ','S','L','A','E','4','S',(char)('H'|0x80),
500
+            '(','0',')',                            '=',' ','Z','I','Y','4','R','O',(char)('W'|0x80),
501
+            ' ','(','1','S','T',')',                '=','F','E','R','4','S',(char)('T'|0x80),
502
+            ' ','(','1','0','T','H',')',            '=','T','E','H','4','N','T',(char)('H'|0x80),
503
+            '(','1',')',                            '=',' ','W','A','H','4',(char)('N'|0x80),
504
+            ' ','(','2','N','D',')',                '=','S','E','H','4','K','U','N',(char)('D'|0x80),
505
+            '(','2',')',                            '=',' ','T','U','W',(char)('4'|0x80),
506
+            ' ','(','3','R','D',')',                '=','T','H','E','R','4',(char)('D'|0x80),
507
+            '(','3',')',                            '=',' ','T','H','R','I','Y',(char)('4'|0x80),
508
+            '(','4',')',                            '=',' ','F','O','H','4',(char)('R'|0x80),
509
+            ' ','(','5','T','H',')',                '=','F','I','H','4','F','T',(char)('H'|0x80),
510
+            '(','5',')',                            '=',' ','F','A','Y','4',(char)('V'|0x80),
511
+            ' ','(','6','4',')',' ',                '=','S','I','H','4','K','S','T','I','Y',' ','F','O','H',(char)('R'|0x80),
512
+            '(','6',')',                            '=',' ','S','I','H','4','K',(char)('S'|0x80),
513
+            '(','7',')',                            '=',' ','S','E','H','4','V','U',(char)('N'|0x80),
514
+            ' ','(','8','T','H',')',                '=','E','Y','4','T',(char)('H'|0x80),
515
+            '(','8',')',                            '=',' ','E','Y','4',(char)('T'|0x80),
516
+            '(','9',')',                            '=',' ','N','A','Y','4',(char)('N'|0x80),
517
+            '(',':',')',                            '=',(char)('.'|0x80),
518
+            '(',';',')',                            '=',(char)('.'|0x80),
519
+            '(','<',')',                            '=',' ','L','E','H','4','S',' ','D','H','A','E',(char)('N'|0x80),
520
+            '(','=',')',                            '=',' ','I','Y','4','K','W','U','L',(char)('Z'|0x80),
521
+            '(','>',')',                            '=',' ','G','R','E','Y','4','T','E','R',' ','D','H','A','E',(char)('N'|0x80),
522
+            '(','?',')',                            '=',(char)('?'|0x80),
523
+            '(','@',')',                            '=',' ','A','E','6',(char)('T'|0x80),
524
+            '(','^',')',                            '=',' ','K','A','E','4','R','I','X',(char)('T'|0x80),
525
+            ']',(char)('A'|0x80)
526
+        };
527
+
528
+        //26 items. From 'A' to 'Z'
529
+        // positions for mem62 and mem63 for each character
530
+        static byte[] tab37489 =
531
+        {
532
+            0, 149, 247, 162, 57, 197, 6, 126,
533
+            199, 38, 55, 78, 145, 241, 85, 161,
534
+            254, 36, 69, 45, 167, 54, 83, 46,
535
+            71, 218
536
+        };
537
+
538
+        static byte[] tab37515 =
539
+        {
540
+            125, 126, 126, 127, 128, 129, 130, 130,
541
+            130, 132, 132, 132, 132, 132, 133, 135,
542
+            135, 136, 136, 137, 138, 139, 139, 140,
543
+            140, 140
544
+        };
545
+
546
+        static byte A, X;
547
+
548
+        static byte[] inputtemp = new byte[256];   // secure copy of input tab36096
549
+
550
+        /* Retrieve flags for character at mem59-1 */
551
+        static byte Code37055(byte npos, byte mask)
552
+        {
553
+            X = npos;
554
+            return (byte)(tab36376[inputtemp[X]] & mask);
555
+        }
556
+
557
+        static uint match(string str)
558
+        {
559
+            int pos = 0;
560
+            while (pos < str.Length)
561
+            {
562
+                char ch = str[pos];
563
+                A = inputtemp[X++];
564
+                if (A != ch) return 0;
565
+                ++pos;
566
+            }
567
+            return 1;
568
+        }
569
+
570
+        static byte GetRuleByte(ushort mem62, byte Y)
571
+        {
572
+            uint address = mem62;
573
+            if (mem62 >= 37541)
574
+            {
575
+                address -= 37541;
576
+                return (byte)rules2[address + Y];
577
+            }
578
+            address -= 32000;
579
+            return (byte)rules[address + Y];
580
+        }
581
+
582
+        static int handle_ch2(byte ch, byte mem)
583
+        {
584
+            byte tmp;
585
+            X = mem;
586
+            tmp = tab36376[inputtemp[mem]];
587
+            if (ch == ' ')
588
+            {
589
+                if ((tmp & 128) != 0) return 1;
590
+            }
591
+            else if (ch == '#')
592
+            {
593
+                if ((tmp & 64) == 0) return 1;
594
+            }
595
+            else if (ch == '.')
596
+            {
597
+                if ((tmp & 8) == 0) return 1;
598
+            }
599
+            else if (ch == '^')
600
+            {
601
+                if ((tmp & 32) == 0) return 1;
602
+            }
603
+            else return -1;
604
+            return 0;
605
+        }
606
+
607
+
608
+        static int handle_ch(byte ch, byte mem)
609
+        {
610
+            byte tmp;
611
+            X = mem;
612
+            tmp = tab36376[inputtemp[X]];
613
+            if (ch == ' ')
614
+            {
615
+                if ((tmp & 128) != 0) return 1;
616
+            }
617
+            else if (ch == '#')
618
+            {
619
+                if ((tmp & 64) == 0) return 1;
620
+            }
621
+            else if (ch == '.')
622
+            {
623
+                if ((tmp & 8) == 0) return 1;
624
+            }
625
+            else if (ch == '&')
626
+            {
627
+                if ((tmp & 16) == 0)
628
+                {
629
+                    if (inputtemp[X] != 72) return 1;
630
+                    ++X;
631
+                }
632
+            }
633
+            else if (ch == '^')
634
+            {
635
+                if ((tmp & 32) == 0) return 1;
636
+            }
637
+            else if (ch == '+')
638
+            {
639
+                X = mem;
640
+                ch = inputtemp[X];
641
+                if ((ch != 69) && (ch != 73) && (ch != 89)) return 1;
642
+            }
643
+            else return -1;
644
+            return 0;
645
+        }
646
+
647
+        public static int TextToPhonemes(byte[] input)
648
+        {
649
+            byte mem56;      //output position for phonemes
650
+            byte mem57;
651
+            byte mem58;
652
+            byte mem59;
653
+            byte mem60;
654
+            byte mem61;
655
+            ushort mem62;     // memory position of current rule
656
+
657
+            byte mem64;      // position of '=' or current character
658
+            byte mem65;     // position of ')'
659
+            byte mem66;     // position of '('
660
+
661
+            byte Y;
662
+
663
+            int r;
664
+
665
+            inputtemp[0] = (byte)' ';
666
+
667
+            // secure copy of input
668
+            // because input will be overwritten by phonemes
669
+            X = 0;
670
+            do
671
+            {
672
+                A = (byte)(input[X] & 127);
673
+                if (A >= 112) A = (byte)(A & 95);
674
+                else if (A >= 96) A = (byte)(A & 79);
675
+                inputtemp[++X] = A;
676
+            } while (X < 255);
677
+            inputtemp[255] = 27;
678
+            mem56 = mem61 = 255;
679
+
680
+            pos36554:
681
+            while (true)
682
+            {
683
+                while (true)
684
+                {
685
+                    X = ++mem61;
686
+                    mem64 = inputtemp[X];
687
+                    if (mem64 == '[')
688
+                    {
689
+                        X = ++mem56;
690
+                        input[X] = 155;
691
+                        return 1;
692
+                    }
693
+
694
+                    if (mem64 != '.') break;
695
+                    X++;
696
+                    A = (byte)(tab36376[inputtemp[X]] & 1);
697
+                    if (A != 0) break;
698
+                    mem56++;
699
+                    X = mem56;
700
+                    A = (byte)'.';
701
+                    input[X] = (byte)'.';
702
+                }
703
+                mem57 = tab36376[mem64];
704
+                if ((mem57 & 2) != 0)
705
+                {
706
+                    mem62 = 37541;
707
+                    goto pos36700;
708
+                }
709
+
710
+                if (mem57 != 0) break;
711
+                inputtemp[X] = (byte)' ';
712
+                X = ++mem56;
713
+                if (X > 120)
714
+                {
715
+                    input[X] = 155;
716
+                    return 1;
717
+                }
718
+                input[X] = 32;
719
+            }
720
+
721
+            if ((mem57 & 128) == 0) return 0;
722
+
723
+            // go to the right rules for this character.
724
+            X = (byte)(mem64 - 'A');
725
+            mem62 = (ushort)(tab37489[X] | (tab37515[X] << 8));
726
+
727
+            pos36700:
728
+            // find next rule
729
+            while ((GetRuleByte(++mem62, 0) & 128) == 0) ;
730
+            Y = 0;
731
+            while (GetRuleByte(mem62, ++Y) != '(') ;
732
+            mem66 = Y;
733
+            while (GetRuleByte(mem62, ++Y) != ')') ;
734
+            mem65 = Y;
735
+            while ((GetRuleByte(mem62, ++Y) & 127) != '=') ;
736
+            mem64 = Y;
737
+
738
+
739
+            mem60 = X = mem61;
740
+            // compare the string within the bracket
741
+            Y = (byte)(mem66 + 1);
742
+
743
+            while (true)
744
+            {
745
+                if (GetRuleByte(mem62, Y) != inputtemp[X]) goto pos36700;
746
+                if (++Y == mem65) break;
747
+                mem60 = ++X;
748
+            }
749
+
750
+            // the string in the bracket is correct
751
+
752
+            mem59 = mem61;
753
+
754
+            while (true)
755
+            {
756
+                byte ch;
757
+                while (true)
758
+                {
759
+                    mem66--;
760
+                    mem57 = GetRuleByte(mem62, mem66);
761
+                    if ((mem57 & 128) != 0)
762
+                    {
763
+                        mem58 = mem60;
764
+                        goto pos37184;
765
+                    }
766
+                    X = (byte)(mem57 & 127);
767
+                    if ((tab36376[X] & 128) == 0) break;
768
+                    if (inputtemp[mem59 - 1] != mem57) goto pos36700;
769
+                    --mem59;
770
+                }
771
+
772
+                ch = mem57;
773
+
774
+                r = handle_ch2(ch, (byte)(mem59 - 1));
775
+                if (r == -1)
776
+                {
777
+                    switch (ch)
778
+                    {
779
+                        case (byte)'&':
780
+                            if (Code37055((byte)(mem59 - 1), 16) == 0)
781
+                            {
782
+                                if (inputtemp[X] != 'H') r = 1;
783
+                                else
784
+                                {
785
+                                    A = inputtemp[--X];
786
+                                    if ((A != 'C') && (A != 'S')) r = 1;
787
+                                }
788
+                            }
789
+                            break;
790
+
791
+                        case (byte)'@':
792
+                            if (Code37055((byte)(mem59 - 1), 4) == 0)
793
+                            {
794
+                                A = inputtemp[X];
795
+                                if (A != 72) r = 1;
796
+                                if ((A != 84) && (A != 67) && (A != 83)) r = 1;
797
+                            }
798
+                            break;
799
+                        case (byte)'+':
800
+                            X = mem59;
801
+                            A = inputtemp[--X];
802
+                            if ((A != 'E') && (A != 'I') && (A != 'Y')) r = 1;
803
+                            break;
804
+                        case (byte)':':
805
+                            while (Code37055((byte)(mem59 - 1), 32) != 0) --mem59;
806
+                            continue;
807
+                        default:
808
+                            return 0;
809
+                    }
810
+                }
811
+
812
+                if (r == 1) goto pos36700;
813
+
814
+                mem59 = X;
815
+            }
816
+
817
+            pos37184:
818
+            do
819
+            {
820
+                bool first = false;
821
+
822
+                if (first)
823
+                {
824
+                    X = (byte)(mem58 + 1);
825
+                    if (inputtemp[X] == 'E')
826
+                    {
827
+                        if ((tab36376[inputtemp[X + 1]] & 128) != 0)
828
+                        {
829
+                            A = inputtemp[++X];
830
+                            if (A == 'L')
831
+                            {
832
+                                if (inputtemp[++X] != 'Y') goto pos36700;
833
+                            }
834
+                            else if ((A != 'R') && (A != 'S') && (A != 'D') && match("FUL") == 0) goto pos36700;
835
+                        }
836
+                    }
837
+                    else
838
+                    {
839
+                        if (match("ING") == 0) goto pos36700;
840
+                        mem58 = X;
841
+                    }
842
+                }
843
+
844
+                first = true;
845
+
846
+                r = 0;
847
+                do
848
+                {
849
+                    while (true)
850
+                    {
851
+                        Y = (byte)(mem65 + 1);
852
+                        if (Y == mem64)
853
+                        {
854
+                            mem61 = mem60;
855
+
856
+                            while (true)
857
+                            {
858
+                                mem57 = A = GetRuleByte(mem62, Y);
859
+                                A = (byte)(A & 127);
860
+                                if (A != '=') input[++mem56] = A;
861
+                                if ((mem57 & 128) != 0) goto pos36554;
862
+                                Y++;
863
+                            }
864
+                        }
865
+                        mem65 = Y;
866
+                        mem57 = GetRuleByte(mem62, Y);
867
+                        if ((tab36376[mem57] & 128) == 0) break;
868
+                        if (inputtemp[mem58 + 1] != mem57)
869
+                        {
870
+                            r = 1;
871
+                            break;
872
+                        }
873
+                        ++mem58;
874
+                    }
875
+
876
+                    if (r == 0)
877
+                    {
878
+                        A = mem57;
879
+                        if (A == '@')
880
+                        {
881
+                            if (Code37055((byte)(mem58 + 1), 4) == 0)
882
+                            {
883
+                                A = inputtemp[X];
884
+                                if ((A != 82) && (A != 84) &&
885
+                                    (A != 67) && (A != 83)) r = 1;
886
+                            }
887
+                            else
888
+                            {
889
+                                r = -2;
890
+                            }
891
+                        }
892
+                        else if (A == ':')
893
+                        {
894
+                            while (Code37055((byte)(mem58 + 1), 32) != 0) mem58 = X;
895
+                            r = -2;
896
+                        }
897
+                        else r = handle_ch(A, (byte)(mem58 + 1));
898
+                    }
899
+
900
+                    if (r == 1) goto pos36700;
901
+                    if (r == -2)
902
+                    {
903
+                        r = 0;
904
+                        continue;
905
+                    }
906
+                    if (r == 0) mem58 = X;
907
+                } while (r == 0);
908
+            } while (A == '%');
909
+            return 0;
910
+        }
911
+    }
912
+}

Loading…
Cancel
Save