1 // ----------------------------------------------------------------------------
2 // Copyright (C) 2014
3 //              David Freese, W1HKJ
4 //
5 // This file is part of flrig.
6 //
7 // flrig is free software; you can redistribute it and/or modify
8 // it under the terms of the GNU General Public License as published by
9 // the Free Software Foundation; either version 3 of the License, or
10 // (at your option) any later version.
11 //
12 // flrig is distributed in the hope that it will be useful,
13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 // GNU General Public License for more details.
16 //
17 // You should have received a copy of the GNU General Public License
18 // aunsigned long int with this program.  If not, see <http://www.gnu.org/licenses/>.
19 // ----------------------------------------------------------------------------
20 /*
21  * Driver for PCR-1000 April 2012, Brian Miezejewski, k5hfi
22  * patched 1/23/2017, Dave, G0WBX
23  */
24 
25 /* Todo:
26  *
27  *	1) Need on/off button to turn the radio on and off?
28  *	2) Up the baud rate to 37800 after connect
29  *	3) Support for fast mode.
30  *	4) Scan support for scanning between a frequency pair
31  *	5) Scan support for scanning a list of frequencies stored in flrig.
32  *	6) Implement band scope.
33  *	7) BFO support?
34  *
35  */
36 
37 /* Notes:
38  *	The Icom PCR-1000 differs for most of the other rigs controlled by flrig in
39  *	that settings do not change at the rig, they are all controlled by flrig. There is
40  *	no reason to poll for frequency, volume, mode, etc., they simply can't change on their own.
41  *	On the other hand, things like s-meter reading do change, but the PCR-1000 will send these
42  *	with no poll needed when the receiver is in "fast" mode.
43  *
44  *	Note that while the PCR-1000 does not have a second VFO, we have virtualized a second
45  *	vfo in the PCR-1000 flrig implementation. Each VFO stores its frequency, mode, and bandwidth.
46  *	The XCVR_STATE variable is used to store the VFO states.
47  */
48 
49 
50 #include "config.h"
51 #include "PCR1000.h"
52 #include "support.h"
53 
54 //----------------------------------------------------------------------
str(string s)55 inline string str(string s)
56 {
57 	size_t p;
58 	while((p = s.find('\r')) != string::npos)
59 		s.replace(p, 1, "<cr>");
60 	while((p = s.find('\n')) != string::npos)
61 		s.replace(p, 1, "<lf>");
62 	return s;
63 }
64 
65 #define strace(s, s1) set_trace(3, s, str(s1).c_str(), str(replystr).c_str());
66 #define gtrace(s, s1) get_trace(3, s, str(s1).c_str(), str(replystr).c_str());
67 
68 //----------------------------------------------------------------------
69 
70 const char RIG_PCR1000::name[] = "PCR-1000";
71 
72 //	   mode array Index Values :-         0      1      2     3     4     5
73 const char *RIG_PCR1000::modes[] =    { "LSB", "USB", "AM", "CW", "NFM", "WFM", NULL};
74 const char RIG_PCR1000::mode_chr[] =  { '0',   '1',   '2',  '3',  '5',   '6' };
75 const char RIG_PCR1000::mode_type[] = { 'L',   'U',   'U',  'U',  'U',   'U' };
76 
77 //	   band width array Index Values :-    0      1    2     3     4
78 const char *RIG_PCR1000::band_widths[] = { "2.8k","6k","15k","50k","230k",NULL};
79 static int PCR1000_bw_vals[] = {1,2,3,4,5,WVALS_LIMIT};
80 
81 //----------------------------------------------------------------------
82 
83 // Array used for the conversion of hex values to a character string
84 const char RIG_PCR1000::hex_chars[] = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' } ;
85 
86 //----------------------------------------------------------------------
87 
88 char 		RIG_PCR1000::volume_command[] 		= 		"J40XX\r\n" ;
89 char 		RIG_PCR1000::squelch_command[] 		= 		"J41XX\r\n" ;
90 char 		RIG_PCR1000::if_shift_command[] 	= 		"J43XX\r\n" ;
91 const char  RIG_PCR1000::noise_off_command[] 	= 		"J4600\r\n" ;
92 const char  RIG_PCR1000::noise_on_command[] 	= 		"J4601\r\n" ;
93 const char  RIG_PCR1000::att_off_command[] 		= 		"J4700\r\n" ;
94 const char  RIG_PCR1000::att_on_command[] 		= 		"J4701\r\n" ;
95 char 		RIG_PCR1000::check_power_command[] 	= 		"H1?" ;
96 char 		RIG_PCR1000::power_on_command[] 	= 		"H101\r\n" ;
97 char 		RIG_PCR1000::power_off_command[] 	= 		"H100\r\n" ;
98 const char 	RIG_PCR1000::get_smeter_command[] 	= 		"I1?" ;
99 
100 //----------------------------------------------------------------------
101 
102 //----------------------------------------------------------------------
103 
104 static GUI rig_widgets[]= {
105 	{ (Fl_Widget *)btnVol,        2, 125,  50 },
106 	{ (Fl_Widget *)sldrVOLUME,   54, 125, 156 },
107 	{ (Fl_Widget *)NULL,          0,   0,   0 }
108 };
109 
110 //----------------------------------------------------------------------
111 
112 
113 /*
114  * A PCR-1000 will start issuing repeating H100<cr><lf> to indicate its status as
115  * off as soon as you connect to it. It will start at 9600-n-1 and uses rts/cts for
116  * transaction control.
117  */
initialize()118 void RIG_PCR1000::initialize()
119 {
120 	rig_widgets[0].W = btnVol;
121 	rig_widgets[1].W = sldrVOLUME;
122 	modes_ = modes;
123 	bandwidths_ = band_widths;
124 	bw_vals_ = PCR1000_bw_vals;
125 
126 	selectA();
127 
128 	// Lets see if the radio is turned on.
129 
130 	sendCommand(check_power_command,6);
131 
132 	showresp(WARN, ASC, "Check Power", check_power_command , replystr);
133 	gtrace("Check Power", check_power_command);
134 
135 	// If the radio is turned off, turn it on.
136 
137 	if (replystr.rfind("H100") != std::string::npos) {
138 		sendCommand(power_on_command,6);
139 		showresp(WARN, ASC, "Power ON", power_on_command , replystr);
140 		strace("Power ON", power_on_command);
141 	}
142 
143 	// Set the radio with the default values
144 	set_volume_control(current_volume) ;
145 	set_squelch(sql);
146 	set_if_shift(if_shift);	// mid = off					// wbx
147 
148 }
149 
check()150 bool RIG_PCR1000::check()
151 {
152 	return true;
153 }
154 
155 //----------------------------------------------------------------------
RIG_PCR1000()156 RIG_PCR1000::RIG_PCR1000() : current_vfo(A) {
157 
158 	// current_vfo = A ;
159 	name_ = name;
160 	modes_ = modes;
161 	bandwidths_ = band_widths;
162 
163 	widgets = rig_widgets;
164 
165 	comm_baudrate 	= BR9600;
166 	stopbits 		= 1;
167 	comm_retries 	= 2;
168 	comm_wait 		= 50;
169 	comm_timeout 	= 50;
170 	comm_rtscts 	= true;
171 	comm_rtsplus 	= false;
172 	comm_dtrplus 	= false;
173 	comm_catptt 	= false;
174 	comm_rtsptt 	= false;
175 	comm_dtrptt 	= false;
176 
177 //	Defaults.
178 
179 	A.imode = 1;
180 	A.freq = 14070000L;
181 	A.iBW = 0 ;
182 
183 	B.imode = 1;
184 	B.freq = 14070000L;
185 	B.iBW = 0 ;
186 
187 	sql 				= 127 ;		// Set squelch to a reasonable value
188 	if_shift 			= 0 ;		// IF shift off
189 	attenuator 			= 0 ;		// Attenuator is set to off
190 	noise 				= 0 ;		// Noise blanker to off
191 	current_volume 		= 25 ;		// Set volume to make at least a little noise, otherwise there is no
192 									// indication when the radio is switched on.
193 
194 
195 	has_micgain_control =
196 	has_notch_control =
197 	has_swr_control = false;
198 
199 	has_smeter =
200 	has_bandwidth_control =
201 	has_volume_control =
202 	has_mode_control =
203 	has_sql_control =
204 	has_noise_control =
205 	has_attenuator_control =
206 	has_ifshift_control = true;
207 
208 	precision = 10 ;
209 	ndigits = 9 ;
210 
211 }
212 
213 //----------------------------------------------------------------------
shutdown()214 void RIG_PCR1000::shutdown() {
215 	// Turn off the radio
216 	sendCommand(power_off_command,6);
217 	strace("Power OFF", power_off_command);
218 	showresp(WARN, ASC, "Power OFF", power_off_command , replystr);
219 }
220 //----------------------------------------------------------------------
221 
222 /*
223  * Set the frequency in the current mode command
224  */
225 
setFreqModeBW(XCVR_STATE & freqMode)226 void RIG_PCR1000::setFreqModeBW(XCVR_STATE &freqMode) {
227 
228 	RIG_PCR1000::freq_cmd myComm = {
229 			{'K','0'},
230 			{'0','0','0','7','2','0','0','0','0','0'},
231 			{'0','0'},
232 			{'0','0'},
233 			{'0','0','\r','\n','\0'}
234 		} ;
235 
236 	// Set the mode
237 
238 	myComm.mode[1] = mode_chr[ freqMode.imode ] ;
239 
240 	// Set the frequency in the selected mode command
241 
242 	unsigned long int freq = freqMode.freq ;
243 	for( int pos = 9 ; pos >= 0 ; pos--,freq /= 10 ) {
244 		myComm.frequency[pos] = '0'+(freq%10) ;
245 	}
246 
247 	// Set the band width
248 
249 	myComm.band_width[1] = '0'+ freqMode.iBW ;
250 
251 
252 	// printf("Freq:%s",myComm.command);
253 
254 	sendCommand(myComm.command,5);
255 	showresp(WARN, ASC, "set vfo", myComm.command, replystr);
256 	strace("set vfo", myComm.command);
257 }
258 
259 //----------------------------------------------------------------------
260 
261 /*
262  * The PCR-1000 cannot change its frequency so it is always whatever we last set it to
263  */
264 
265 //----------------------------------------------------------------------
set_vfoA(unsigned long int freq)266 void RIG_PCR1000::set_vfoA (unsigned long int freq)
267 {
268 	freqA = A.freq = freq;
269 	setFreqModeBW(A) ;
270 }
271 
get_vfoA()272 unsigned long int RIG_PCR1000::get_vfoA ()
273 {
274 	return A.freq;
275 }
276 
277 
278 //----------------------------------------------------------------------
set_vfoB(unsigned long int freq)279 void RIG_PCR1000::set_vfoB (unsigned long int freq)
280 {
281 	freqB = B.freq = freq;
282 	setFreqModeBW(B) ;
283 }
284 
get_vfoB()285 unsigned long int RIG_PCR1000::get_vfoB ()
286 {
287 	return B.freq;
288 }
289 
290 //======================================================================
291 // Some utility functions
292 //======================================================================
293 /*
294  * This method converts a character to its hex values, i.e.
295  * '0' = 0
296  * '5' = 5
297  * 'A' = 10
298  *
299  */
hexTo(const char c) const300 int RIG_PCR1000::hexTo(const char c) const {
301 	return ( c <= '9') ? c - '0' :  c - 'A' + 10 ;
302 }
303 
304 /*
305  * This method sets the value of ival into the first 2 characters in cptr, i.e.
306  * 17 is converted to "11"
307  * 37 is converted to "25"
308  *
309  */
310 
set2Hex(int ival,char * cptr)311 void RIG_PCR1000::set2Hex(int ival, char *cptr) {
312 	cptr[0] = hex_chars[ival / 16] ;
313 	cptr[1] = hex_chars[ival % 16] ;
314 }
315 
316 //----------------------------------------------------------------------
get_smeter()317 int RIG_PCR1000::get_smeter() {	 // returns 0-100
318 
319 	int ret = sendCommand(get_smeter_command,6) ;
320 
321 	showresp(WARN, ASC, "S meter", get_smeter_command, replystr);
322 	gtrace("S meter", get_smeter_command);
323 
324 	ret = hexTo(replystr.c_str()[3]) * 16 + hexTo(replystr.c_str()[4]) ;
325 
326 	return (int)((float)ret * ( 100.0 / 255.0 ) ) ;
327 }
328 
329 //----------------------------------------------------------------------
330 // Volume control return (rig sends back 0 .. 255)
331 
get_volume_control()332 int RIG_PCR1000::get_volume_control()
333 {
334 	return current_volume ;
335 }
336 
337 //----------------------------------------------------------------------
set_volume_control(int val)338 void RIG_PCR1000::set_volume_control(int val) // 0 .. 100
339 {
340 	current_volume = val ;
341 
342 	int ival = (int)(val * 2.55); // 0 .. 255
343 
344 	set2Hex( ival, &(volume_command[3])) ;
345 
346 	sendCommand(volume_command, 5);
347 	showresp(WARN, ASC, "set volume", volume_command, replystr);
348 	strace("set volume", volume_command);
349 }
350 
351 //======================================================================
352 // Band width commands
353 //======================================================================
set_bwA(int val)354 void RIG_PCR1000::set_bwA(int val) {
355 	A.iBW = bwA = val;
356 	setFreqModeBW(A);
357 }
358 
get_bwA()359 int  RIG_PCR1000::get_bwA() {
360 	return A.iBW ;
361 }
362 
set_bwB(int val)363 void RIG_PCR1000::set_bwB(int val) {
364 	B.iBW = bwB = val;
365 	setFreqModeBW(B);
366 }
367 
get_bwB()368 int  RIG_PCR1000::get_bwB() {
369 	return B.iBW ;
370 }
371 
372 //======================================================================
373 // mode commands
374 //======================================================================
set_modeA(int val)375 void RIG_PCR1000::set_modeA(int val)
376 {
377 	modeA = A.imode = val ;
378 	setFreqModeBW(A);
379 }
380 
381 //----------------------------------------------------------------------
get_modeA()382 int RIG_PCR1000::get_modeA()
383 {
384 	return A.imode;
385 }
386 
387 //----------------------------------------------------------------------
set_modeB(int val)388 void RIG_PCR1000::set_modeB(int val)
389 {
390 	modeB = B.imode = val ;
391 	setFreqModeBW(B);
392 }
393 
394 //----------------------------------------------------------------------
get_modeB()395 int RIG_PCR1000::get_modeB()
396 {
397 	return B.imode;
398 }
399 
400 //----------------------------------------------------------------------
get_modetype(int n)401 int RIG_PCR1000::get_modetype(int n)
402 {
403 	return mode_type[n];
404 }
405 
406 
407 //======================================================================
408 // mode commands
409 //======================================================================
410 //----------------------------------------------------------------------
selectA()411 void RIG_PCR1000::selectA() {
412 	current_vfo = A ;
413 }
414 //----------------------------------------------------------------------
selectB()415 void RIG_PCR1000::selectB() {
416 	current_vfo = B ;
417 }
418 //----------------------------------------------------------------------
A2B()419 void RIG_PCR1000::A2B() {
420 	B.freq = A.freq ;
421 	B.iBW = A.iBW ;
422 	B.imode = A.imode ;
423 	B.src = A.src ;
424 }
425 //----------------------------------------------------------------------
swapAB()426 void RIG_PCR1000::swapAB() {
427 	XCVR_STATE T ;
428 
429 	T.freq = B.freq ;
430 	T.iBW = B.iBW ;
431 	T.imode = B.imode ;
432 	T.src = B.src ;
433 
434 	B.freq = A.freq ;
435 	B.iBW = A.iBW ;
436 	B.imode = A.imode ;
437 	B.src = A.src ;
438 
439 	A.freq = T.freq ;
440 	A.iBW = T.iBW ;
441 	A.imode = T.imode ;
442 	A.src = T.src ;
443 }
444 
445 //======================================================================
446 // Squelch commands
447 //======================================================================
448 //----------------------------------------------------------------------
set_squelch(int val)449 void RIG_PCR1000::set_squelch(int val) {
450 
451 	sql = val ;
452 	set2Hex( val, &(squelch_command[3])) ;
453 	sendCommand(squelch_command, 5);
454 	showresp(WARN, ASC, "Set Squelch", squelch_command, replystr);
455 	strace("set squelch", squelch_command);
456 }
457 
get_squelch()458 int  RIG_PCR1000::get_squelch() {
459 	return sql ;
460 }
461 
462 //======================================================================
463 // IF shift commands
464 //======================================================================
465 //----------------------------------------------------------------------
466 
467 /*
468  * Since the PCR1000 IF shift shifts in 10 hertz increments we display and store
469 + * the actual shift. Just divide by 10 and add 80 before its set.
470  *
471  * The "and add 80" above is decimal, it should be in Hex, so that's 128 Decimal
472  * The showresp text lable was wrong too, it's been corrected.
473  *
474  */
set_if_shift(int val)475 void RIG_PCR1000::set_if_shift(int val) {
476 
477 	if_shift = val ;
478 	set2Hex( val/10 + 128, &(if_shift_command[3])) ;
479 	sendCommand(if_shift_command, 5);
480 	showresp(WARN, ASC, "IF Shift", if_shift_command, replystr);
481 	strace("if shift", if_shift_command);
482 }
483 
484 
get_if_shift(int & val)485 bool RIG_PCR1000::get_if_shift(int &val) {
486 	val = if_shift ;
487 	return (if_shift == if_shift_mid)?false:true ;
488 }
489 
490 //======================================================================
491 // Attenuator commands
492 //======================================================================
493 //----------------------------------------------------------------------
494 
495 
set_attenuator(int val)496 void RIG_PCR1000::set_attenuator(int val) {
497 	if( val != attenuator ) {
498 		if( val ) {
499 			// Turn att on
500 			sendCommand(att_on_command, 5);
501 			showresp(WARN, ASC, "Set Attenuator ON", att_on_command, replystr);		// wbx
502 			strace("set att ON", att_on_command);
503 			attenuator = 1 ;
504 		} else {
505 			// Turn att off
506 			sendCommand(att_off_command, 5);
507 			showresp(WARN, ASC, "Set Attenuator OFF", att_off_command, replystr);	// wbx
508 			strace("set att OFF", att_off_command);
509 			attenuator = 0 ;
510 		}
511 	}
512 }
513 
get_attenuator()514 int  RIG_PCR1000::get_attenuator() {
515 	return attenuator ;
516 }
517 
518 
519 //======================================================================
520 // Noise reduction commands (Doesn't do much on PCR-1000 :-( )
521 //======================================================================
522 //----------------------------------------------------------------------
523 
set_noise(bool on)524 void RIG_PCR1000::set_noise(bool on) {
525 	if( on ) {
526 		// Turn on
527 		sendCommand(noise_on_command, 5);
528 		showresp(WARN, ASC, "Noise Reduction ON", noise_on_command, replystr);
529 		strace("nr ON", noise_on_command);
530 		noise = 1 ;
531 	} else {
532 		// Turn off
533 		sendCommand(noise_off_command, 5);
534 		showresp(WARN, ASC, "Noise Reduction OFF", noise_off_command, replystr);
535 		strace("nr OFF", noise_off_command);
536 		noise = 0 ;
537 	}
538 }
539 
get_noise()540 int  RIG_PCR1000::get_noise() {
541 	return noise ;
542 }
543 
544 //======================================================================
545 // Command structures for the PCR1000
546 //
547 // From http://www.gm4jjj.co.uk/PCR1000.html
548 //======================================================================
549 /*
550 PCR1000 Command List
551 
552 The ICOM PCR1000 Computer Controlled Radio Command Protocol has not been
553 published by ICOM, however I have compiled this list from various sources.
554 
555 Warning: I take no responsibility for the accuracy of any of the following,
556 you use it at your own risk! - Make sure you have a backup of your EEPROM
557 before trying any experimentation!
558 
559 Updated 10 JAN 2002
560 
561 All commands are sent is ASCII in the format: Command + CR + LF
562 CR = chr$(13)
563 LF = chr$(10)
564 
565 EXCEPT when in AUTOUPDATE mode (see G3xx command), when NO CR + LF
566 IS REQUIRED after the Command
567 
568 Note that no G0XX is returned in autoupdate mode
569 
570 Some responses from the PCR1000 have an added character at the end
571 of the response string. It is usually a duplicate of the last
572 character of the string and can be discarded. (A bug, I suppose)
573 
574 DTR and RTS set high by software.
575 
576 When radio is first turned on, the software send the following commands:
577 initial boot up at 9600 Baud.
578 
579 H101		Turn Radio ON
580 G105		Set Baud rate to 38400 Baud
581 G300		Set Autoupdate to OFF
582 H1?			Is radio still ON? Responds H100 for OFF, H101 for ON
583 H101		Radio ON command
584 G4?			Possible Inquire Firmware Revision? US and UK version
585 			returns G410
586 G301		Auto Update ON
587 GE?			Inquire Country/Region returns GE09 in FCC USA version
588 			and GE02 in EUR/AUS version
589 GD?			Is DSP Installed?
590 			Returns GD00 if NO, GD01 if Yes
591 
592 K00857937500050200	Set Frequency and mode and filter
593 
594 J4100		Set Squelch
595 J5100		See Tone Squelch
596 J5000		Set VSC off
597 J4380		Set IF Shift to mid range
598 J4500		Set AGC OFF
599 J4600		Set Noise Blanker OFF
600 J4700		Set Attenuator OFF
601 J4A80		Not known
602 LD82000		Set Tracking Filter to Automatic
603 
604 J8001J8101J8200J8301 DSP Packet. See DSP commands below
605 
606 J4000	Set Volume
607 
608 ME0000120050100012500	Set Bandscope ON to +- 200 Khz and 12.5 Khz step
609 
610 ' This is returned when Bandscope first turned ON
611 NE100000000000000000000000000000000000
612 NE110000000000000000000000000000000000
613 NE120000000000000000000000000000000000
614 NE130000000000000000000000000000000000
615 NE140000000000000000000000000000000000
616 NE150000000000000000000000000000000000
617 NE160000000000000000000000000000000000
618 NE170000000000000000000000000000000000
619 NE190000000000000000000000000000000000
620 NE1A0000000000000000000000000000000000
621 NE1B0000000000000000000000000000000000
622 NE1C0000000000000000000000000000000000
623 NE1D0000000000000000000000000000000000
624 NE1E0000000000000000000000000000000000
625 NE1F0000000000000000000000000000000000
626 ___________________________________________________
627 
628 Command Status:
629 G0xx
630 where xx = 00 when command is Good, 01 when command is Bad
631 
632 Signal Update:
633 G3xx
634 00 = off (Program needs to Poll status) See I1? to I3? below
635 01 = on (Radio sends Status when a parameter changes) See Ix? commands
636 02 = binary mode (Update off)
637 03 = binary mode (Update on)
638 
639 Inquire signal information. These commands can be Polled or are
640 returned as a packet if Autoupdate is ON (See G301) and one of the
641 values changes.
642 
643 I0? Squelch Status returns 04 = Closed, 07 = Open
644 I1? Signal Strength returns 00 to FF
645 I2? Signal Centering returns 00 = Low, 80 = Centered, FF = High
646 I3? DTMF Tone
647 returns I300 if NO DTMF tone present
648 returns I31 + ASCII digit 0 to F (* = E, # = F)
649 
650 Alive:
651 H1? Is radio alive? Radio responds H101 (on) or H100 (off)
652 
653 Volume:
654 J40xx xx Range 00 to FF
655 
656 Squelch:
657 J41xx xx Range 00 to FF
658 
659 IF Shift:
660 J43xx xx Range 00 to FF
661 
662 AGC:
663 J45xx xx = 01 for ON, 00 for OFF
664 
665 NB:
666 J46xx xx = 01 for ON, 00 for OFF
667 
668 Attenuator:
669 J47xx xx = 01 for ON, 00 for OFF
670 
671 VSC:
672 J50xx xx = 01 for ON, 00 for OFF
673 
674 T Squelch on = J51tt (tt=tone , 01=67Hz, 33=254.1Hz)
675 T Squelch off = J5100
676 
677 Frequency: K0GMMMKKKHHHmmff00
678 where K0 G MMM KKK HHH mm ff 00
679 G=GHz
680 MMM=MHz
681 KKK=KHz
682 HHH=Hz
683 mm = mode
684 ff = Filter
685 00 = Padding Bytes (always there)
686 Mode Settings:
687 00 = LSB
688 01 = USB
689 02 = AM
690 03 = CW
691 04 = Not used or Unknown
692 05 = NFM
693 06 = WFM
694 
695 Filter Settings:
696 00 = 3 Khz (actually 2.8 Khz) (CW USB LSB AM)
697 01 = 6 Khz (CW USB LSB AM NFM)
698 02 = 15 Khz (AM NFM)
699 03 = 50 Khz (AM NFM WFM)
700 04 = 230 Khz (WFM)
701 
702 Radio Replies
703 I0xx Squelch Status xx=04 Closed, 07 Open
704 I1ss ss is Signal Strength 00 to FF
705 I200 Signal Frequency < Display Frequency
706 I280 Signal Frequency = Display Frequency
707 I2FF Signal Frequency > Display Frequency
708 I300 No DTMF Present
709 I31t t is DTMF tone (* = E, # = F)
710 
711 Baud Rate
712 G1xx
713 where xx is:
714 00 = 300
715 01 = 1200
716 02 = 4800
717 03 = 9600
718 04 = 19200
719 05 = 38400
720 
721 Signal Update
722 G3xx
723 00 = off (Program needs to inquire signal strength, DTMF tone, Center, etc)
724 01 = on (Radio sends signal strength, DTMF tone, etc as needed)
725 02 = binary mode (Update off)
726 03 = binary mode (Update on)
727 
728 
729 __________________________________________________________
730 Icom PCR1000 Band Scope commands.
731 
732 The basic command to turn the bandscope function On is:
733 
734 ME0000120050100012500 + CR + LF
735 
736 The command breaks down this way:
737 
738 ME00001 20050100012500
739 ME00001 is the preamble. It's always the same.
740 
741 ME00001 20 050100012500
742 20 is the number of samples. It must be a 2 digit HEX number
743 represented in ASCII. Add leading 0 if necessary. Calculate
744 this number by dividing the Scope Bandwidth by the step size. For
745 example in the +- 200 Khz span the total bandwidth is 400 Khz. If the
746 step size is 12.5 khz then 400/12.5 is 32 or 20 Hex. If you get a non
747 integer answer for the initial division then increment the sample
748 number by 1 or 2 (sample should be an EVEN number). You can
749 arbitrarily set the sample higher(SLIGHTLY) to allow the display to
750 be moved inward from the edges of the scope display.
751 
752 ME0000120 05 0100012500
753 05 is a sample rate value that determines how fast the
754 scope is swept and in the Icom software is either 05 or 28. This is
755 interpreted as a hex number and must be 2 digits. The practical values
756 for this runs from 01 (very fast and resource intensive) to about
757 70 (very slow and nearly useless). Putting 00 here locks the PCR1000
758 and software up. In the Icom software the number of samples
759 determine this value. Sample numbers above 10 hex use 05 and those
760 10 Hex or lower use 28 Hex.
761 
762 ME000012005 01 00012500
763 01 This is the On/Off characters. If they are 00 then
764 the bandscope is OFF. If they are 01 the bandscope is ON
765 
766 ME00001200501 00 012500
767 00 is a padding value and must be there.
768 
769 ME0000120050100 012500
770 012500 is the step size expressed in HERTZ. It must
771 be 6 digits unsigned long int, padded with LEADING ZEROS. Examples are 001000 for
772 1000 hertz (1 Khz), 030000 for 30 Khz and 100000 for 100 Khz. The
773 bandscope accepts values down to at least 10 hertz but the Icom
774 software displays a LIMIT warning at 1 Khz and at 100 Khz.
775 
776 The Band Scope commands appear to be insensitive to mode and bandwidth
777 except for the fact that it doesn't work in USB, LSB or CW. It has
778 been hypothesized that the product detector circuitry is used by the
779 Band Scope.
780 
781 Typical Band Scope Commands:
782 
783 ME00001C8050100001000 +- 100 Khz @ 1 Khz
784 ME0000164050100001000 +- 50
785 ME0000132050100001000 +- 25
786 
787 ME00001A0050100002500 +- 200 Khz @ 2.5 Khz
788 ME0000150050100002500 +- 100
789 ME0000128050100002500 +- 50
790 ME0000114050100002500 +- 25
791 
792 ME0000150050100005000 +- 200 Khz @ 5.0 Khz
793 ME0000128050100005000 +- 100
794 ME0000114050100005000 +- 50
795 ME000010A280100005000 +- 25
796 
797 ME0000140050100006250 +- 200 Khz @ 6.25 Khz
798 ME0000120050100006250 +- 100
799 ME0000110280100006250 +- 50
800 ME0000108280100006250 +- 25
801 
802 ME000012E050100009000 +- 200 Khz @ 9.0 Khz
803 ME0000118050100009000 +- 100
804 ME000010C280100009000 +- 50
805 ME0000106280100009000 +- 25
806 
807 ME0000128050100010000 +- 200 Khz @ 10.0 Khz
808 ME0000114050100010000 +- 100
809 ME000010A280100010000 +- 50
810 ME0000106280100010000 +- 25
811 
812 ME0000120050100012500 +- 200 Khz @ 12.5 Khz
813 ME0000110280100012500 +- 100
814 ME0000110280100012500 +- 50
815 ME0000108280100012500 +- 25
816 
817 ME0000114050100020000 +- 200 Khz @ 20.0 Khz
818 ME000010A280100020000 +- 100
819 ME0000106280100020000 +- 50
820 ME0000104280100020000 +- 25
821 
822 ME0000110280100025000 +- 200 Khz @ 25.0 Khz
823 ME0000108280100025000 +- 100
824 ME0000104280100025000 +- 50
825 ME0000100280100025000 +- 25
826 
827 ME000010E280100030000 +- 200 Khz @ 30.0 Khz
828 ME0000108280100030000 +- 100
829 ME0000104280100030000 +- 50
830 ME0000100280100030000 +- 25
831 
832 ME0000108280100050000 +- 200 Khz @ 50.0 Khz
833 ME0000104280100050000 +- 100
834 ME0000100280100050000 +- 50 Note 00 sample size This is invalid!
835 
836 ME0000104280100100000 +- 200 Khz @ 100.0 Khz
837 ME0000100280100100000 +- 100 Invalid
838 ME0000100280100100000 +- 50 Invalid
839 
840 **********************************************************************
841 
842 The data is returned in 37 byte packets. The packets begin with the
843 Letters NE1 followed by the 2 digit hex packet number. The Packet
844 numbers run from 00 to F0 (must be 2 digits). Typical packet numbers
845 would be NE100, NE170, NE180 and NE1F0.
846 These numbers are followed by 32 bytes that contain signal level
847 information for EACH sample (16 per packet).
848 
849 Each byte is a hex number (in ascii) that can run from 00 to FF. The
850 bytes in packet NE180 represent the first 16 samples UP from the
851 displayed frequency in ascending order. The bytes in packet NE170
852 represent the 16 samples BELOW the displayed frequency in descending
853 order. For example the following:
854 
855 NE18020202020202020202020202020202020
856 
857 NE1 80 20202020202020202020202020202020
858 NE1 is the fixed preamble
859 
860 NE1 80 20202020202020202020202020202020
861 80 is the packet number
862 
863 NE180 20 202020202020202020202020202020
864 20 is the sample signal level (20 Hex) at the displayed frequency
865 
866 NE18020 20 2020202020202020202020202020
867 This is the next sample level UP from the displayed freq
868 
869 The next 14 values represent the next 14 sample levels. If less samples
870 are needed, the higher sample levels are set to 00. If more then 16
871 sanple levels are needed Up from the center freq, then the next packet
872 NE190 hold the values.
873 
874 For the following:
875 NE17000000000000000001111111111111111
876 
877 NE1 7000000000000000001111111111111111
878 NE1 is the fixed preamble
879 
880 NE1 70 00000000000000001111111111111111
881 70 is the packet number. Packet 70 is the first packet BELOW the
882 center frequency.
883 
884 NE170000000000000000011111111111111 11
885 11 This is the first sample level
886 BELOW the center frequency.
887 
888 NE1700000000000000000111111111111 11 11
889 11 This is the next LOWER sample
890 level and so on. In this example, only 16 (10 Hex) samples were
891 specified. 8 samples are provided here below center freq and the
892 corresponding 8 above center freq would be in the NE180 packet.
893 
894 If more then the 32 samples that can be displayed with NE170 and NE180
895 were specified then additional packets would be sent. For example if
896 48(decimal) samples were specified then the following packets would be
897 returned: NE160 would have 8 samples (in the UPPER 8)
898 NE170 would have 16 samples
899 NE180 would have 16 samples
900 NE190 would have 8 samples (in the LOWER 8)
901 
902 Note that they are sent in ascending order from NE160 to NE190.
903 A rough indication of the number of packets needed for a given sample
904 size is (Number of samples)/16 plus 1. If the number is ODD then add
905 1 more packet.
906 
907 Sample in order sent (This is a continous string):
908 NE1600000000000000000000030180FA61F14
909 NE1701F2B0C0F7E030C2B85088E080F2B4314
910 NE1801B8E181830085FEC6603083001143003
911 NE19001030101012701000000000000000000
912 
913 When Band Scope is first turned ON or is turned OFF, ALL 16 packets
914 are returned with ALL samples set to 00.
915 
916 
917 ___________________________________________________________
918 The DSP commands below have to be sent as a packet
919 followed by a Cr + Lf
920 
921 sample packet
922 
923 J8001J8101J820FJ8301
924 | | is always there and never changes
925 
926 J8001J8101J820FJ8301
927 | | DSP ON J8100 is DSP Off
928 
929 J8001J8101J820FJ8301
930 | | ANR on and set to max would be J8200 if off
931 
932 J8001J8101J820FJ8301
933 | | Notch turned ON J8301 turns notch ON
934 
935 
936 With this in mind here is the DSP Command Set:
937 
938 On startup the software sends GD?
939 Returns GD00 if NO DSP installed
940 Returns GD01 if DSP Installed
941 
942 Autoupdate must be ON (send G301 + cr + lf):
943 
944 J8001 Always the same
945 
946 J81xx where xx is 00 if DSP is OFF and 01 if ON
947 
948 J82xx This is the ANR function (Automatic Noise Reduction)
949 xx is 00 if ANR is OFF. If ON, xx varies from 01 to 0F
950 when you turn a knob on the new DSP Popup panel.
951 
952 J83xx is the Automatic Notch filter. xx is 00 if notch
953 is OFF and 01 if ON.
954 
955 The following data is written to the PCR1000.ini file.
956 
957 DSPON with either 0 or 1 for Off/On
958 DSPANF with either 0 or 1 for Off/On
959 DSPNR with either 0 or 1 for Off/On
960 DSPNRLEVEL with value 0 to 15 for Noise Reduction level
961 
962 ----------------------------------------------------------
963 
964 COUNTRY/REGION Table
965 GE? (Returns contents of Address 7E of the EEPROM)
966 
967 JAPAN 00
968 USA 01
969 EUR/AUS 02
970 FRA 03
971 DEN 04
972 CAN 05
973 GENE1 06
974 GENE2 07
975 FCC JPN 08
976 FCC USA 09
977 FCC EUR/AUS 0A
978 FCC FRA 0B
979 FCC DEN 0C
980 FCC CAN 0D
981 FCC GENE1 0E
982 FCC GENE2 OF
983 
984 TRACKING FILTER
985 LD820x xx=00 automatic tracking, Range 01 to FF manual setting of filter
986 
987 EEPROM UNLOCKING
988 
989 Don't play with these unless you have a verified backup of your own PCR-1000 EEPROM contents
990 
991 You need to unlock the protection even to READ the EEPROM contents.
992 
993 The Unlock Codes are:
994 GC01
995 GCF0
996 
997 Note the response to both the above commands is G001
998 
999 Read Command:
1000 LD0xx? xx= eeprom address 00 to 7F
1001 Replies LD0xxyy yy = data in location xx
1002 
1003 Write Command:
1004 LD0xxyy xx = address yy = data to write
1005 Replies G000 if OK
1006 
1007 
1008 To put protection back on again turn the PCR-1000 off and on again.
1009 Use the software command H100 or the switch.
1010 The baud rate will then return to 9600.
1011 
1012 
1013 Average Values
1014 Use these if you have a corrupted EEPROM and no backup
1015 
1016 
1017 Crash Pattern
1018 This is what the PCR-1000 produces if it crashes and corrupts the EEPROM
1019 
1020 EEPROM Locations (DATA IN DECIMAL)
1021 
1022 ADDRESS AVERAGE CRASHED COMMENTS
1023 (HEX) (DEC) (DEC)
1024 00 0 0 RESERVED
1025 01 0 0 RESERVED
1026 02 82 82 CHECK PATTERN
1027 03 88 88 CHECK PATTERN
1028 04 99 128 REFERENCE XTAL SHIFT (CENTRE =128)
1029 05 0 0 RESERVED
1030 06 0 0 RESERVED
1031 07 0 0 RESERVED
1032 08 63 0 FM LEVEL S0 REF-VOLT
1033 09 79 48 FM LEVEL S3 REF-VOLT
1034 0A 95 80 FM LEVEL S5 REF-VOLT
1035 0B 117 112 FM LEVEL S7 REF-VOLT
1036 0C 140 144 FM LEVEL S9 REF-VOLT
1037 0D 166 176 FM LEVEL S9+20 REF-VOLT
1038 0E 188 208 FM LEVEL S9+40 REF-VOLT
1039 0F 210 240 FM LEVEL S9+60 REF-VOLT
1040 10 54 0 WFM LEVEL S0 REF-VOLT
1041 11 67 48 WFM LEVEL S3 REF-VOLT
1042 12 80 80 WFM LEVEL S5 REF-VOLT
1043 13 103 112 WFM LEVEL S7 REF-VOLT
1044 14 126 144 WFM LEVEL S9 REF-VOLT
1045 15 152 176 WFM LEVEL S9+20 REF-VOLT
1046 16 177 208 WFM LEVEL S9+40 REF-VOLT
1047 17 199 240 WFM LEVEL S9+60 REF-VOLT
1048 18 21 0 SCOPE LEVEL S0 REF-VOLT
1049 19 39 48 SCOPE LEVEL S3 REF-VOLT
1050 1A 45 80 SCOPE LEVEL S5 REF-VOLT
1051 1B 55 112 SCOPE LEVEL S7 REF-VOLT
1052 1C 57 144 SCOPE LEVEL S9 REF-VOLT
1053 1D 61 176 SCOPE LEVEL S9+20 REF-VOLT
1054 1E 64 208 SCOPE LEVEL S9+40 REF-VOLT
1055 1F 67 240 SCOPE LEVEL S9+60 REF-VOLT
1056 20 21 115 FM CENTERMETER LOW
1057 21 57 46 FM CENTERMETER HIGH
1058 22 115 115 RESERVED
1059 23 146 146 RESERVED
1060 24 11 166 FM NOISESQL THRESHOLD LEVEL
1061 25 11 36 FM NOISESQL TIGHT LEVEL
1062 26 2 0 FM NOISESQL SETTING T2
1063 27 4 0 FM NOISESQL SETTING T3
1064 28 0 0 RESERVED
1065 29 0 0 RESERVED
1066 2A 96 96 CTCSS-DET JUDGEMENT LEVEL (CLOSE)
1067 2B 160 160 CTCSS-DET JUDGEMENT LEVEL (OPEN)
1068 2C 98 144 BPF0 LEVEL S9 REFERENCE
1069 2D 137 144 BPF1 LEVEL S9 REFERENCE
1070 2E 111 144 BPF2 LEVEL S9 REFERENCE
1071 2F 106 144 BPF3 LEVEL S9 REFERENCE
1072 30 125 144 BPF4 LEVEL S9 REFERENCE 50.02MHZ
1073 31 130 144 BPF4 LEVEL S9 REFERENCE 58.28MHZ
1074 32 129 144 BPF4 LEVEL S9 REFERENCE 58.32MHZ
1075 33 135 144 BPF4 LEVEL S9 REFERENCE 88.02MHZ
1076 34 138 144 BPF4 LEVEL S9 REFERENCE 108.28MHZ
1077 35 138 144 BPF4 LEVEL S9 REFERENCE 108.32MHZ
1078 36 141 144 BPF4 LEVEL S9 REFERENCE 130.02MHZ
1079 37 140 144 BPF4 LEVEL S9 REFERENCE 149.98MHZ
1080 38 118 144 BPF5 LEVEL S9 REFERENCE 150.02MHZ
1081 39 122 144 BPF5 LEVEL S9 REFERENCE 183.28MHZ
1082 3A 121 144 BPF5 LEVEL S9 REFERENCE 183.32MHZ
1083 3B 122 144 BPF5 LEVEL S9 REFERENCE 216.02MHZ
1084 3C 119 144 BPF5 LEVEL S9 REFERENCE 265.68MHZ
1085 3D 117 144 BPF5 LEVEL S9 REFERENCE 265.72MHZ
1086 3E 117 144 BPF5 LEVEL S9 REFERENCE 300.02MHZ
1087 3F 110 144 BPF5 LEVEL S9 REFERENCE 349.98HZ
1088 40 124 144 BPF6 LEVEL S9 REFERENCE 350.02HZ
1089 41 123 144 BPF6 LEVEL S9 REFERENCE 383.28MHZ
1090 42 123 144 BPF6 LEVEL S9 REFERENCE 383.32MHZ
1091 43 125 144 BPF6 LEVEL S9 REFERENCE 433.32MHZ
1092 44 123 144 BPF6 LEVEL S9 REFERENCE 483.28MHZ
1093 45 123 144 BPF6 LEVEL S9 REFERENCE 483.32MHZ
1094 46 121 144 BPF6 LEVEL S9 REFERENCE 558.32MHZ
1095 47 119 144 BPF6 LEVEL S9 REFERENCE 633.28MHZ
1096 48 119 144 BPF6 LEVEL S9 REFERENCE 633.32MHZ
1097 49 116 144 BPF6 LEVEL S9 REFERENCE 699.98MHZ
1098 4A 103 144 BPF7 LEVEL S9 REFERENCE 700.02MHZ
1099 4B 107 144 BPF7 LEVEL S9 REFERENCE 750.02MHZ
1100 4C 110 144 BPF7 LEVEL S9 REFERENCE 799.98MHZ
1101 4D 110 144 BPF7 LEVEL S9 REFERENCE 800.02MHZ
1102 4E 120 144 BPF7 LEVEL S9 REFERENCE 916.68MHZ
1103 4F 119 144 BPF7 LEVEL S9 REFERENCE 916.72MHZ
1104 50 123 144 BPF7 LEVEL S9 REFERENCE 1016.68MHZ
1105 51 122 144 BPF7 LEVEL S9 REFERENCE 1016.72MHZ
1106 52 112 144 BPF7 LEVEL S9 REFERENCE 1166.68MHZ
1107 53 111 144 BPF7 LEVEL S9 REFERENCE 1166.72MHZ
1108 54 110 144 BPF7 LEVEL S9 REFERENCE 1299.98MHZ
1109 55 0 0 RESERVED
1110 56 0 0 RESERVED
1111 57 0 0 RESERVED
1112 58 35 128 BPF4 TUNING PEAK-POINT 50.02MHZ
1113 59 35 128 BPF4 TUNING PEAK-POINT 58.28MHZ
1114 5A 117 128 BPF4 TUNING PEAK-POINT 58.32MHZ
1115 5B 110 128 BPF4 TUNING PEAK-POINT 88.02MHZ
1116 5C 114 128 BPF4 TUNING PEAK-POINT 108.28MHZ
1117 5D 188 128 BPF4 TUNING PEAK-POINT 108.32MHZ
1118 5E 191 128 BPF4 TUNING PEAK-POINT 130.02MHZ
1119 5F 204 128 BPF4 TUNING PEAK-POINT 149.98MHZ
1120 60 70 128 BPF5 TUNING PEAK-POINT 150.02MHZ
1121 61 43 128 BPF5 TUNING PEAK-POINT 183.28MHZ
1122 62 118 128 BPF5 TUNING PEAK-POINT 183.32MHZ
1123 63 101 28 BPF5 TUNING PEAK-POINT 216.02MHZ
1124 64 92 128 BPF5 TUNING PEAK-POINT 265.68MHZ
1125 65 180 128 BPF5 TUNING PEAK-POINT 265.72MHZ
1126 66 173 128 BPF5 TUNING PEAK-POINT 300.02MHZ
1127 67 177 128 BPF5 TUNING PEAK-POINT 349.98MHZ
1128 68 46 128 BPF6 TUNING PEAK-POINT 350.02MHZ
1129 69 32 128 BPF6 TUNING PEAK-POINT 383.28MHZ
1130 6A 113 128 BPF6 TUNING PEAK-POINT 383.32MHZ
1131 6B 95 128 BPF6 TUNING PEAK-POINT 433.32MHZ
1132 6C 83 128 BPF6 TUNING PEAK-POINT 483.28MHZ
1133 6D 156 128 BPF6 TUNING PEAK-POINT 483.32MHZ
1134 6E 132 128 BPF6 TUNING PEAK-POINT 558.32MHZ
1135 6F 112 128 BPF6 TUNING PEAK-POINT 633.28MHZ
1136 70 187 128 BPF6 TUNING PEAK-POINT 633.32MHZ
1137 71 185 128 BPF6 TUNING PEAK-POINT 699.98MHZ
1138 72 75 128 BPF7 TUNING PEAK-POINT 700.02MHZ
1139 73 66 128 BPF7 TUNING PEAK-POINT 750.02MHZ
1140 74 57 128 BPF7 TUNING PEAK-POINT 799.98MHZ
1141 75 146 128 BPF7 TUNING PEAK-POINT 800.02MHZ
1142 76 79 128 BPF7 TUNING PEAK-POINT 916.68MHZ
1143 77 160 128 BPF7 TUNING PEAK-POINT 916.72MHZ
1144 78 122 128 BPF7 TUNING PEAK-POINT 1016.68MHZ
1145 79 194 128 BPF7 TUNING PEAK-POINT 1016.72MHZ
1146 7A 127 128 BPF7 TUNING PEAK-POINT 1166.68MHZ
1147 7B 202 128 BPF7 TUNING PEAK-POINT 1166.72MHZ
1148 7C 170 128 BPF7 TUNING PEAK-POINT 1299.98MHZ
1149 7D 0 0 RESERVED
1150 7E * 7 COUNTRY/REGION (*See Table of values)
1151 7F 2 7 RESERVED
1152 
1153 
1154 
1155 Unknowns
1156 ---------
1157 Still looking for the purpose of the following PCR commands:-
1158 
1159 LE20050
1160 LE20040
1161 
1162 Above used by icom in their EEPROM routines in their software for setting up
1163 the radio and also some third party software I have seen. Is this understood or
1164 is it just being copied?
1165 
1166 
1167 GCD0
1168 GE07
1169 
1170 H800 * see below
1171 
1172 LD840?
1173 LD846?
1174 LD84A? * see below
1175 
1176 
1177 LD842 * see below
1178 LD844 * see below
1179 LD848
1180 LD860
1181 LD862
1182 
1183 
1184 G4? returns G410
1185 
1186 J4A80
1187 
1188 If anyone fill in the gaps that would be great!
1189 Update:- Some more info has come in! - Thanks to the guys on the PCR-1000 list.
1190 There are some questions about the following commands:
1191 
1192 
1193 
1194 LD840? (always 0)
1195 
1196 LD842? (current signal strength)
1197 
1198 LD844? (centering info?)
1199 
1200 LD846? (usually 0x60)
1201 
1202 LD848? (always 0)
1203 
1204 LD84A? (old LD842?)
1205 
1206 LD84C? (always 0)
1207 
1208 LD84E? (always 0)
1209 
1210 LD860? (always 0)
1211 
1212 LD862? (always 0)
1213 
1214 LD864? (always 0)
1215 
1216 LD842? returns the current signal strength level, same as for I1?
1217 
1218 LD84A? returns the previous signal strength. I believe this is what the radio uses to determine if the signal strength level has changed (as you probably noticed, it only kicks out a new I1xx message in G301 mode when the signal strength changes).
1219 
1220 LD844? returns something relevant to frequency. If I set the PCR-1000 to 144.35, NBFM, 6Khz filter, and set my HT for 144.35 Mhz, when I transmit on the HT, this value goes to 0x25. Moving the HT to 144.355 causes the value to increase to a nominal 0x37, and moving the HT to 144.345 causes the value to decrease to a nominal 0x15. Interesting relationship between these values: 0x37 - 0x25 = 0x12, and 0x25 - 0x15 = 0x10. This is 18 decimal and 16 decimal respectively. Two pretty close numbers for shifting +/- 5Khz. I expect this register has something to do with the centering information.
1221 
1222 I'm not completely sure about this, but every document except 1 has the auto tracking register mis-coded. It's generally listed as LD8200 to turn off, and LD8201 to set to manual. It's actually LD82000 (note three 0's) to turn off, and can be varied from LD82001 to LD820FF. I don't know exactly what the tracking thingie does, but it has a pronounced affect turning it off or on. - Editor's note this has now been corrected in this document, it is the tracking of the RF stage with frequency I believe.
1223 
1224 There's also a mention of H800 in the documents. H8 will accept values from 00 to FF, and has an odd effect on the audio. Values greater than or equal to 0x81 cause a very brief (100ms or so) drop out on the audio. Values 0x80 and below don't do this. Interestingly enough, when G301 is in effect, changing H8 causes an H9 message to be output. H9 can be read with the H9? command. I've only seen 0x00, 0x01, and 0x10 be reported back.
1225 
1226 The following command sequence seems to have something to do with squelch and signal strength. H800; J4180; H881; H9? (reports H901), J4100. Now the squelch should be open, but isn't. Setting H800 will open the squelch again. Now do H8FF; H9? Audio opens, and H9? reports H910. Curious. All my experimenting is in NBFM mode, so perhaps some of these other registers come into play in other modes.
1227 
1228 Something else that's not mentioned in any of the documentation is that when G301 mode is on, commands don't generate a response unless they're interrogative (i.e. GD? or H1?).
1229 */
1230