#endif /* LIB_CONFIG_H */])
AC_OUTPUT(Makefile)
srecord-1.58/etc/crc16-ccitt.html 644 0 0 136164 11673330631 15124 0 ustar Peter Miller .hy 0
.nf
CRC-CCITT -- 16-bit
CRC16-CCITT
Copyright © 2001-2007 Joe Geluso
Document Original
This page was originally available as
http://www.joegeluso.com/software/articles/ccitt.htm,
but has since disappeared. The Internet Archive Wayback Machine was used to retrieve
the latest version before it disappeared.
Overview
This page presents accurate implementations (long-hand and programmed)
of the 16-bit CRC-CCITT specification, which is:
- Width = 16 bits
- Truncated polynomial = 0x1021
- Initial value = 0xFFFF
- Input data is NOT reflected
- Output CRC is NOT reflected
- No XOR is performed on the output CRC
A C-language program is included which produces CRC values which conform
to this specification. The program also includes a routine
which demonstrates how an incorrect “check
value” which has been found on the web may be generated.
General
Why yet another document on calculating CRCs?
Because this one:
-
Indicates that some common implementations of the 16-bit CRC-CCITT may
produce incorrect values.
-
Provides source code for the 16-bit CRC-CCITT without using tables or
reversed polynomials. The program below
implements the concepts presented in the first 8 sections of “A Painless Guide to CRC
Error Detection Algorithms” by Ross Williams. Things become
significantly more complex in progressing beyond section 8 of that
document. If a table-driven implementation of the 16-bit CRC-CCITT
is to be developed, a solid reference is needed to ensure that it is
working correctly. The source code in this document may fill
that role.
Important features of a standard CRC are that it:
Can be used to validate data
Is reproducible by others
The first feature above is easy to realize in a closed system if
corruption of data is infrequent (but substantial when it occurs).
The term “closed system” refers to a situation where the
CRC need not be communicated to others. A correct implementation
of a 16-bit CRC will detect a change in a single bit in a message of
over 8000 bytes. An erroneous CRC implementation may not be able
to detect such subtle errors. If errors are usually both rare and
large (affecting several bits), then a faulty 16-bit CRC implementation
may still be adequate in a closed system.
The second feature above — that the CRC is reproducible by others
— is crucial in an open system; that is, when the CRC must be
communicated to others. If the integrity of data passed between
two applications is to be verified using a CRC defined by a particular
standard, then the implementation of that standard must produce the
same result in both applications — otherwise, valid data will be
reported as corrupt.
Reproducibility may be satisfied by even a botched implementation of a
standard CRC in most cases — if everyone uses the same erroneous
implementation of the standard. But this approach:
-
Modifies the standard in ways that are both unofficial and undocumented.
-
Creates confusion when communicating with others who have not adopted the
botched implementation as the implied standard.
It appears that some CRC implementations available on the web produce
incorrect values for the 16-bit CRC-CCITT. How to tell if a
CRC16-CCITT implementation was botched? By calculating the CRC for
a reference string.
The CRC value for the 9-byte reference string, “123456789”
is 0xE5CC. Some web pages report that the value for
reference string should be 0x29B1 — but this value
is returned by an implementation which does NOT conform to the
specification above. CRC values for other reference strings are
listed elsewhere in this document.
The bolding and italics above are used to emphasize the
correct value and distort the incorrect value in the hope that it will
discourage propagation of the incorrect value.
Why focus on the 16-bit CRC-CCITT (polynomial 0x1021) and not CRC16
(polynomial 0x8005), which appears to have wider use? Because the
16-bit CRC-CCITT:
-
Is a straightforward 16-bit CRC implementation in that it doesn't involve:
-
reflection of data
-
reflection of the final CRC value
-
Starts with a non-zero initial value — leading zero bits can't affect
the CRC16 used by LHA, ARC, etc., because its initial value is zero.
-
It requires no additional XOR operation after everything else is done.
The CRC32 implementation used by Ethernet, Pkzip, etc., requires this operation;
less common 16-bit CRCs may require it as well.
Why use a 16-bit CRC instead of a 32-bit CRC? Because it:
-
Can be calculated faster than a 32-bit CRC.
-
Requires less space than a 32-bit CRC for storage, display or printing.
-
Is usually long enough if the data being safeguarded is fewer than several
thousand bytes in length, e.g., individual records in a database.
Results from the C-language Implementations
The following CRC values were produced by the program whose source
code is listed elsewhere in this document.
The “Good_CRC” values are in accordance with the CRC-CCITT
specification as defined at the top of this
document. The “Bad_CRC” values are produced by an
implementation which reports the incorrect check value that is reported
on some web pages for the reference string “123456789”.
The validity of the “Good_CRC” values below is demonstrated
elsewhere in this document.
Message
|
Good_CRC
|
Bad_CRC
|
Message Length (bytes)
|
-None-
|
0x1D0F
|
0xFFFF
|
0
|
A
|
0x9479
|
0xB915
|
1
|
123456789
|
0xE5CC
|
0x29B1
|
9
|
A string of 256 upper case “A”
characters with no line breaks |
0xE938
|
0xEA0B
|
256
|
Among the problems with the “Bad_CRC” implementation is
that it does not augment a zero-length message with 16 zero bits, as
is required (either implicitly or explicitly) when calculating the
standard CRC. Thus, it reports a CRC of 0xFFFF — not
0x1D0F — for a zero-length message.
Long-hand Calculation for a One-byte Message
The purpose of this section is to demonstrate that the
“Good_CRC” values listed in the previous section do, in
fact, conform to the CRC-CCITT specification as defined at the top of this document.
Calculation of the 16-bit CRC-CCITT for a one-byte message consisting
of the letter “A”:
Quotient= 111100001110111101011001
poly=
------------------------------------------
10001000000100001 ) 1111111111111111010000010000000000000000
10001000000100001
----------------- red
bits are initial value
11101111110111111 bold bits are message
10001000000100001 blue
bits are augmentation
-----------------
11001111100111100
10001000000100001
-----------------
10001111000111010
10001000000100001
-----------------
00001110000110110
00000000000000000
-----------------
00011100001101100
00000000000000000
-----------------
00111000011011000
00000000000000000
-----------------
01110000110110001
00000000000000000
-----------------
11100001101100010
10001000000100001
-----------------
11010011010000110
10001000000100001
-----------------
10110110101001110
10001000000100001
-----------------
01111101011011110
00000000000000000
-----------------
11111010110111100
10001000000100001
-----------------
11100101100111010
10001000000100001
-----------------
11011011000110110
10001000000100001
-----------------
10100110000101110
10001000000100001
-----------------
01011100000011110
00000000000000000
-----------------
10111000000111100
10001000000100001
-----------------
01100000000111010
00000000000000000
-----------------
11000000001110100
10001000000100001
-----------------
10010000010101010
10001000000100001
-----------------
00110000100010110
00000000000000000
-----------------
01100001000101100
00000000000000000
-----------------
11000010001011000
10001000000100001
-----------------
1001010001111001 = CRC
|
Conversion of the binary value above to hexadecimal by segmenting
the bits to nibbles:
binary nibbles 1001 0100 0111 1001
hexadecimal 9
4 7 9 |
Source Code for the C-language Implementations
/*
demonstrates how the incorrect check value of 0x29B1 may be reported
for the test string “123456789” when it should be 0xE5CC.
*/
#include <stdio.h>
#include <string.h>
#define
poly 0x1021
/* crc-ccitt mask */
/* global variables */
char text[1000];
unsigned short good_crc;
unsigned short bad_crc;
unsigned short text_length;
int main(void)
{
void go();
void repeat_character(unsigned char, unsigned
short);
sprintf(text, "%s", "");
go();
sprintf(text, "%s", "A");
go();
sprintf(text, "%s", "123456789");
go();
repeat_character(65, 256);
go();
return 0;
}
void go(void)
{
void update_good_crc(unsigned short);
void augment_message_for_good_crc();
void update_bad_crc(unsigned short);
unsigned short ch, i;
good_crc = 0xffff;
bad_crc = 0xffff;
i = 0;
text_length= 0;
while((ch=text[i])!=0)
{
update_good_crc(ch);
update_bad_crc(ch);
i++;
text_length++;
}
augment_message_for_good_crc();
printf(
"\nGood_CRC = %04X, Bad_CRC = %04X,
Length = %u, Text = \"%s\"",
good_crc,
bad_crc, text_length,
text
);
}
void repeat_character(unsigned char ch, unsigned short n)
{
unsigned short i;
for (i=0; i<n; i++)
{
text[i] = ch;
}
text[n] = 0;
}
void update_good_crc(unsigned short ch)
{
unsigned short i, v, xor_flag;
/*
Align test bit with leftmost bit of the message
byte.
*/
v = 0x80;
for (i=0; i<8; i++)
{
if (good_crc & 0x8000)
{
xor_flag= 1;
}
else
{
xor_flag= 0;
}
good_crc = good_crc
<< 1;
if (ch & v)
{
/*
Append next bit of message to end of CRC if it is not zero.
The zero bit placed there by the shift above need not be
changed if the next bit of the message is zero.
*/
good_crc= good_crc + 1;
}
if (xor_flag)
{
good_crc = good_crc ^ poly;
}
/*
Align test bit with
next bit of the message byte.
*/
v = v >> 1;
}
}
void augment_message_for_good_crc()
{
unsigned short i, xor_flag;
for (i=0; i<16; i++)
{
if (good_crc & 0x8000)
{
xor_flag= 1;
}
else
{
xor_flag= 0;
}
good_crc = good_crc
<< 1;
if (xor_flag)
{
good_crc = good_crc ^ poly;
}
}
}
void update_bad_crc(unsigned short ch)
{
/* based on code found at
http://www.programmingparadise.com/utility/crc.html
*/
unsigned short i, xor_flag;
/*
Why are they shifting this byte left by 8 bits??
How do the low bits of the poly ever see it?
*/
ch<<=8;
for(i=0; i<8; i++)
{
if ((bad_crc ^ ch) &
0x8000)
{
xor_flag = 1;
}
else
{
xor_flag = 0;
}
bad_crc = bad_crc <<
1;
if (xor_flag)
{
bad_crc = bad_crc ^ poly;
}
ch = ch << 1;
}
} |
References
The following web page contains a javascript calculator that is handy for
what-if comparisons in calculating various CRCs by slightly different methods
and with any initial value — very well done:
The following web pages were among those which were helpful in developing
the text and program in this document:
Style Notes
-
Why are the long-hand example and source code embedded in HTML
tables? Because they are in fixed-width font and confining the
font tags within tables aids in editing the document.
-
Why isn't the source code written using more of the compact forms
allowed by the C-language? To make it more accessible to BASIC
programmers. Note that the variables in these C-language routines
hold 16-bit values. Shifting the value 0x8000 (32,768 decimal) by
left one bit is equivalent to multiplying by two; but a 16-bit variable
cannot hold 0x10000 — it becomes zero, not 65,536.
Addendum
This addendum is a quick attempt to address “the rest of the
story” as it has become more clear to me after several e-mail
exchanges with Sven Reifegerste, whose web page is linked above.
To begin with, I have yet to see a specific reference to an ITU (formerly CCITT) document that clearly
identifies exactly where “the” algorithm for the CRC16-CCITT
is given. If anyone can cite “chapter
and verse”, please let me know where the official specification
may be found.
At this point, I'm left with what I can find on the web and what
seems most credible to me. The article by Ross Williams, cited
above, seems to have stood the test of time and
explains things in a way that (eventually) make sense to me.
I count it as very credible.
The snippets of C code scattered around the web which claim to produce a
CRC16-CCITT have taken on a life of their own, whether they are actually
doing what they advertise or not.
I have not yet made a thorough investigation into everything that will
be said below, so it may be subject to extensive revision once I find
time to do so.
It seems that most of the CRC code on the web actually does implement
some form of CRC algorithm — as opposed to some less-robust kind
of checksum. It is questionable in some cases whether their
algorithm actually implements the CRC that they claim it does.
Assuming that an algorithm is actually implementing some kind of
CRC, certain features of that algorithm are crucial when accurately
implementing a particular CRC:
- The polynomial
- The initial value
- Whether or not “zero” bits are explicitly appended to
the message
There seems to be no controversy that the “correct”
(truncated) polynomial is for the CRC16-CCITT is 0x1021.
According to the document by Ross Williams, the initial value for
“the” CRC16-CCITT is 0xFFFF. There seems to be little
controversy over this, either.
It is usually the case that no one really wants to explicitly append
“zero” bits to the end of a message to calculate a
CRC. The mathematics of calculating a CRC do allow a shortcut to
avoid this time-wasting exercise — but if the shortcut is taken
without making a corresponding change in the initial value, then the
result is a different CRC.
The question at this point is:
Does the official specification for the CRC16-CCITT say that initial
value of 0xFFFF applies to a message with or without
“zero” bits explicitly appended to the message?
It makes sense to me that the initial value of 0xFFFF applies to a
message with “zero” bits explicitly appended to the
message. Why? Because the purpose of a CRC is to detect
errors, not necessarily to be implemented in a compact algorithm or to
have parameters that are easy to remember.
Whatever clever technique is used to calculate a CRC, it is always
emulating a simple implementation in which “zero” bit
are explicitly appended to the message. I think it unlikely
that the official specification for the CRC16-CCITT would be in terms of
anything but the most basic implementation.
The paper by Ross Williams says:
“In theory (i.e. with no assumptions about the message), the
initial value has no affect on the strength of the CRC algorithm”
But did the committee that designed the CRC16-CCITT make no
assumptions about the message? I suspect that they made one or
more assumptions about the kinds of messages that were important to
them. If the “correct” check value for message,
“123456789”, using “the” CRC16-CCITT is 0x29B1,
why would they choose an initial value of 0x84CF (see table below) for
the initial value? Remember, the ultimate definition of a CRC
requires “zero” bits to be explicitly added to the end
of the message — all other implementations use tricks (clever
techniques) to accomplish an equivalent calculation. Why would
the CCITT (now ITU) want to specify an initial value of 0x84CF to
error-check the kinds of messages that were important to them?
It seems that the same CRC can be calculated using the parameters below:
Initial Value |
“Zero” bits explicitly
appended to message |
CRC for the test message,
“123456789” |
0xFFFF
|
Yes
|
0xE5CC
|
0x1D0F
|
No
|
0xE5CC
|
---
|
---
|
---
|
0x84CF
|
Yes
|
0x29B1
|
0xFFFF
|
No
|
0x29B1
|
Which is “the” CRC16-CCITT? I think it is 0xE5CC.
Because I haven't seen “chapter and
verse” from an ITU document clearly calling for some
“shortcut” algorithm using the 0xFFFF initial value, I
remain convinced that the “correct” check value for message,
“123456789”, using “the” CRC16-CCITT is 0xE5CC
— not 0x29B1, as is more widely claimed.
Is this spitting into the wind? Probably so. I don't imagine
that publishing this page is going to cause the
“incorrect” implementations to disappear. It is
offered mainly to help others avoid the frustration that I experienced
— what almost everyone else said was the “correct”
check value doesn't seem to be correct when trying to calculate the
CRC16-CCITT from first principles. This page attempts to provide
information which may be helpful in resolving this issue.
As Sven Reifegerste pointed out to me, the “correct” check
value for the CRC32 seems to be calculated in a way that is similar
to most implementations of the CRC16-CCITT — everyone seems to
calculate CRC32 with an initial value of 0xFFFFFFFF but without
“zero” bits explicitly appended to the message. The
CRC32 is much more widely used — it is calculated and stored
for each file that is archived in a .zip (compressed) file.
I'm not prepared to spit into that hurricane. And I think that
those who are trying to come to grips with exactly how to implement a
CRC calculation will find that beginning with a 16-bit CRC, such as
CRC16-CCITT, may be more manageable than wrestling with a 32-bit CRC
algorithm.
Addendum #2 — ITU/CCITT publications
and “the” CRC16-CCITT
Thank you to the several people who responded to the request for
“chapter and verse” where the official specification may be
found for “the” CRC16-CCITT.
The ITU (formerly CCITT) documents that have come to my attention so
far are:
-
Recommendation V.41 — “Code-Independent Error Control
System.”
-
Recommendation X.25 — “Interface between Data Terminal
Equipment (DTE) and Data Circuit-terminating Equipment (DCE) for terminals
operating in the packet mode and connected to public data networks by
dedicated circuit”
-
Recommendation T.30 — “Procedures for document facsimile
transmission in the general switched telephone network”
ITU allows three free downloads (another page on their site says three
free downloads per year?) of their standards, as mentioned here:
http://www.itu.int/publications/index.html
Do be careful to follow the instructions as they are presented — I
wasted a free download by not doing so.
All three documents mentioned above use the same truncated polynomial
— 0x1021.
Recommendation V.41 seems to specify an initial value of
“zero” — which differs from the usual implementations
of CRC16-CCITT.
Recommendation X.25 seems to:
- Use an initial value of 0xFFFF, but
- Require the step of performing one's complement, and
- Be composed of the sum of two remainders obtained from two separate
polynomial divisions.
The result from the X.25 calculation may be mathematically equivalent to
a usual implementation of CRC16-CCITT, but that isn't clear to me at this
point.
Recommendation T.30 seems to:
- Use an initial value of 0xFFFF, but
- Require the step of performing one's complement
Thus, T.30 seems to depart from usual implementations of CRC16-CCITT in
that it requires performing one's complement.
There seems to be relatively good agreement among the routines found on
the web concerning some parts of “the” CRC16-CCITT
specification. But at this point (July 2003), I am not aware of
an ITU/CCITT document that agrees with other parts of “the”
CRC16-CCITT specification (as it is normally rendered in routines found
on the web), and:
- Requires a non-zero initial value
- Does not require the step of performing one's complement
Perhaps I missed something in one of the documents mentioned above?
It is also becoming less clear to me that the ITU/CCITT intended or
documented the calculation of a stand-alone CRC. Their documents
seem to be more focused on a FCS (Frame Check Sequence) that can be used
to validate a serial transmission immediately upon receipt rather than
being concerned about ensuring that disk files (static data) are intact
or unmodified (to the extent that a CRC is good for such a purpose)
after a period of months or years.
Copyright © 2001-2007 Joe Geluso
All disclaimers apply — use at your own risk.
This page may reproduced only if it is not altered and it is reproduced
in its entirety — including the link to the author's web site (now gone).
srecord-1.58/etc/debian.png.uue 644 0 0 10643 11673330631 14712 0 ustar Peter Miller #
# srecord - Manipulate EPROM load files
# Copyright (C) 2010, 2011 Peter Miller
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or (at
# your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
#
begin 644 debian.png
MB5!.1PT*&@H````-24A$4@```$````!`"`8```"J:7'>```*8$E$051XG.6;
M>W!4]17'/^?>?24D((^$`('L@E);4-'1%K&(%E%KK;5L"*2`BH\*6M%6.HK3
MBHR.+8I640KX!!DD"0D^$"N^L$*U6!U$Q">PF_`P(J\`FV0WV7OZ1X!L8$/N
M;C81A^_,SNSO=W_G>\[OW'-_]]S?0U25$QG&]VW`]XT3W@&.]E2VM=?U[OI=
M56<):JIJMM$Y;87GU)-K0Q]L.%73'!5]Y_SE``4#VO69E/88`S9GCNDNX;J)
MJ$X2Z'ZPNEQ!@9T"*Q0ZB>!6R!7E&TPI,[.RWNR]96ZD+6UK4P<$T@OZ2UW]
M5*`0<"]>XIV']DHV*FPFX8C9Q#5D0(C@9QC
M<$8P9;2WMNS%9&QOM0."[OSA6-;+0'IS;12V"11+FO.1O'W%6Q+AWW'!/6;H
M_4^NP>)A@8[--*O'E''>VK+B1+BAE0X(N/U#Q=+7:*;S"IM$I$2%#W$X5_E"
M14F/Y!498_I8DN2(0W:0<$NH[/E'VA330WV`F/9)Z9
M.Z7KFEG1I!3$P[02"=Y?]#AP4S,M*M7E/,,7*MYAES+Y5'A_Z#'B=[X>6(;3
M^;>4=AY@>H&FGW?Z9&!),RURB-0]3W'85N$PK_56
MEVY,F#0!;.LUP1W94;5<8'C&O+FG-2$]B.@&":?_#A0I0I1UY781X]
MLRYJZ\X#]-KV;%C27?G`]K@-HCK9+I=M!ZA%!X"`>]1`T"N;7!/N\$663O0&
MGVC3O#T6WJJBO1CRASB7]@-#RCW^@79X;#O`%RY[*^CQ#Q8K^GH3.>$^7V3I
M`W9Y4@EON.P%A34Q5?NTBSM7A866F/5V.!(;!"V]'>@14S//N^*6NQ/B2#'$
ME!DQQ8[LJ?NU.,Q[P+(E;^]#95J)E,\L[8D2&_H?.;*[W,J%%R:=2`2]OW>Q
M?6>A*F,$!@!9H)4@GV+*,V;?/LMZ?_:/8]Y),RMK>7WECBHYF(6*6@O!VS%3ZZ(3B7684)J[[:FP'27QL-GC_RG;=GZ%\C3@46&F
M.HQ?X'048AH/JJ4#ZC=6/%2>-NK'Q^+IO65N1"`V^1&)1@=9(GOLV-%R!%B6
MX1E\]H':-U9?%UNMAIE0QA6+H#M_A&'IR\#GXC2O\%8O^21.LWJ\+5[1:&SNJ^"R*VLK`@2J8@K+F5Z0W,BO.A%8FG=@R3=)R3<#`VD2
M(6+IU,K+'K;5-[MYP.'Y-VDN_6P!0;?_?&"0BCR;C#Q`T%-P>KQZ"VWR.:[P
M,/(`8&C?5%HMN,<6](AS]H=8,[#H@YA$S
MDG(`:%=`M5_VWN3D(:]ZR1=Q+XAF'-8BO('I7&V7,V$'J*%).4#`!*+R^9:A
MR<@?ZQM?&^8@&O2(\::1YK25!(%-!VAL!#@<248`>P`'JC]*5'!3]PD=@M?=
MV_S$J.I%A_YAFN]$ZZ*VUR+LO@4.#RCB=H?LDL="X3,`508D*FONK1J&51^W
M4Q498W)$&=N@0Y9[JXN_,AQ.V]QV(Z#Q+1");TB+,,U5@"5H87G.#9Y$1,7M
M_L@;*CUJ-GGS.5--*QQ9SZ&I.9,'F%8B5J>,&KO<=B.@\:X[L._>A'#MT.
ML@RDJ[5[=V%S[8(>_Y"@>^2DH#O_LD-U>?L6?QNOK;'^JP%`-Z!.X5'KUHM7
M?_W::L,7_*?MB1F[@^"!P_^JPZ?8)8]%[J+)EIH\!.Q'=68@8U2O>.W2!Y^V
M1@WC?T:Z^9]C\55T&MT92Q\'4&&QKV[I;?UFW*BGW'ZCO8F`@[#W"$AC!*CJ
M58DH`-@[Z#9'T.TOD,P.:Q&Y5J"+A*.+@CW&'K6>D/W./5%?3>F'??845\7C
M`@AT&-7'JJY;A3(4*,>0Q8/U&.11G5M#SW)
M_9H*]P/#V%GS=GE&H>U%U(K.A9T"+O]HB=2O!08HK,-C#F;,Y:\G:M,AV'.`
MR/N'_BH-DZ.)PG7)P(5J6>E2%1F&:92JR&W`V1H.KPVX_%>WE+L'//G#K0/A
M=:):!-(%X55)=U_@W;^DTC=_0D)A'PM;ZP);NXSK6+^_>C<-R8SB*K;3V%X8"3A'KI5#1C2LQI:T1G'`[;\42_\HL!'(5CA?(/L8
M(NL0>8Z.GB>\.Q<=.$:[A`4&7?S:J-P$HK,D\M_]YW=[]>ZN6O@+9O\M@
M;^TMP"DXS1FBZB!JG4/#][PT_*02A_F1-U22T*JR7=B/`)=_A*CC;E&'*7
M-USV?&N-^*;_9&>X8MNE1'60&EBH?"<0PN%XSUM='&B9(7G8=\`USQJR:-D7
M0$P>H'LTS76R;U_Q49LPV
M]@<9!4DYH.$#K-TJZ_`^@^N>&DNY1,:;X(F7/I,"V=D&K3XQX+CKO3H67&DK2
M652G;.TY/JVUO.V%E.P5WIP]KH.QM_H5#J[^J/"+'T4:`SL$I-\V9?[9+U*5>4`K39F:%@AU'=B40?
M`L8"JE"&(2]0>'E1:^;P4HTV/S46\/B'2U1G`3\!4.$9HTO7F_,JGZQM4\4V
MT>8')WVU96]Y%]T[$-,X'Y@ORFC=M6M->5K^X$UWS/O>DZ9V.3<8BT#7\9GL
M#UV!^`_P-S(.;?A6#;
-*0````!)14Y$KD)@@@``
`
end
# vim: set ts=8 sw=4 et :
srecord-1.58/etc/doc_cat.png.uue 644 0 0 61217 11673330631 15067 0 ustar Peter Miller #
# srecord - Manipulate EPROM load files
# Copyright (C) 2009 Peter Miller
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or (at
# your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
#
begin 644 doc_cat.png
MB5!.1PT*&@H````-24A$4@```&(```"`"`8```#P*;R'`````7-21T(`KLX<
MZ0````9B2T=$`/\`_P#_H+VGDP````EP2%ES```+$P``"Q,!`)J<&`````=T
M24U%!]D"$PL8#JA_%ND``"``241!5'C:[+UIL&77==_W6WOO,]SA#?UZ0J-!
M-`B`($$2%("F)LJBJ%0DQP.IT$Y9B4,[E7(*3O*)Y8^.4Y6DRG2E;)64I"H5
MJ^0/=LHN.[8#A;$5RRP-UDA2($63`DF!I`#^CAS7,??""`!N*+*`2/JB($D``AK/Z,HO$&:$`U$'Q`@X>F1JLEH:K1JB)4#=K4A-!"
M4"7HC>KPZ.]][;=?^>O_^.WWO?-W_LF7_D`)PJU))3=(D:$J!(EB$@7U`6E#
MO$,%Q*`"B$G/C,LC(F`=BD01"Q@40D"T!574M_&VURB8;BOX@'H/(6!05$.W
MY/%YH7M)C;]K0!1,B,\+OD%:CVD#PW
M.^/"JS'T>UOC1M>@^*8A-`W:-M`V^*8EA!8-`?6*M@H:A1[775`51"5]($%,
M?("JHIJ464%4,,9B7`ZV0"3#.H>Q%C$&L18C#F,=DCE1*^<#_K\N9.\7?O&O
M_>"O7;Y\^0^6((!HBV1HL+K]WET:S85V$NO^+F@P<4$;1;PBOD7;&E\MH*G0
MID+;"@TMXKM=[%'OT39>_>:N$-5T^71MB:T-5055$N"K\%[M/&H;U`"!%U)6)2`X!$\AB!1
M"]78SA@EOV1`NTN&.R2Z'R5JAW6(L1C)(#C`(F*ATQ)C$2OXMN']Y\SE?_ZY
M[W_A#XH@3*\1:=/)RLPC"*+=3E1"Z-9=DSYT.]6CH2%H"]XC&NV]2`"C@]<,
M&`/&=.]HXCL%>A\4'RA@#=)]3.F>%"\1Z756C&",8(Q!G$.,`9L67TSZ#M'4
M:?I>BA#:ALI&FK$P"B%M,BL=EY_VZ#]CC1I\:*S
M#C[$W8Z/-D8":LQJH0U@5PY^M:C)YQA!)2Z\=,]!XJ(:Z86C(JAHE%F2&Z*]
MH*+/R##.8IQ-$:")`A$8FO;R`$CVVK\=./G;K\U_Z3Z0M?^3@>-.RJHHMH2"'@"A#89E^BN530Z]A1HQ446%`/6H,9$
MJR*Z/D+/_'[+PPS-$D*!!&"&`+=
M)2NAJ*08WJ,$%`^=%DB*/[N=J?$^P2!BDW;8WOQHLO/0[?A.>Z(@8RS;)7F*
MAA0,,%QTB9K5:07Q_OY*9DTRB^0.R2QD%G&=_XAF4=73-A7SO3MDY83+'[IX
M^0M__3_X?16&60]3S>!:N6!5816X=$Y7Z74G"4`&";MVCK1WK-%ITN4&@]T<
M30[1KY@H0#6*6D4E";S30*+)ZWT&2;#]EAI\$&/`NNBP;8;8##46R3,D,RDN
MZ'P3S&Z_@YM,L:,)EY]Z\/(7?N+W3QCF;L2CL]U=:-$M:%JD5="2K%;T!WU(
MK]WZI_`4GW9W>AT["(^-C0(S&J_>B0J]570"5OJ`KE]\!+!]B-W'%H,D%&(4
M96P6G#-9[STTDN_CSZBL\!=
M9MO;_)4&=%H0-U-GN]/R&(F7I"C)1[RH>^5!S-K[D2[6BIB%KM+ZSG=(>IZU
M*U/6J8`85*)`5$_HMH!@L!)S!V,MUN6(R_K?U=JD81#P-/-CLO$(5TZBF7KJ
M8J\9G_[TIW_/A+$N")%^#3J_:(0DC%48;ZRDN)T^=C=&$&A*2;^UT3`FJ*YN7I*-TKRWK0=10(-V6T8GX"%9J6H__\I-//G=FLSS[
M=W[Z)S][Y7_YT+P]P+W9-D
M1OJ:@,2=&Y%/37E$#&=EA7>D,#/].HBXNN>*2D)T/2H>HXK5Y&>,)H1UA;A&
MU'4087=A:6\_5_F.I"A")86T"2WNA!OCB1@(B+'1>=L8S45_$\U:?7P$DH,;
M88H25Y:XT0@WGN`F$W[LAQ__].73K__43WSN+S_\W'//<>7*E=^#>H1JCZI*
MM^!T\#.]0U[M_D&^I<,`*Z&Q*$9U%8$%4&LP'>"78(_.AX@2$RV-CK?/14S*
MAG7UOI)J%!U8'^L3G9E)>8U)$5?0_G&BT2RI2>;)FBALB1NKJ:JD/05D(;HO
M#`33;XI/_=#CG^:77^&O_,QO?_;6K5MO7KERA7];[7!W1TV#G$"5@658P0.]
M@$*_."L`CE4$HP(:!E%P$J/8WGYW&%__.AIC^FC:I$^XZ3W-RH$+L=XQ]"UK
MGEX,V+013`!OHJ8GR$4ZY-%V.)00ZBH]UX*48&W,R@&,[3?"IW[X\4\#_)6?
M^6>?_>QG/_MO+0QWEV52UA*U_KMUQ9H5`MC?ZOQ[AVOJ8/'V=@NNOU;ALIQ+
M3P2*<=O[%QWD%ROG+%$3NM?255#=6:S.576R5QG<,/33BO;"^)5?^14^_O&/_SO0B,Z&
M)#2UVV9=!A'];LPM.B"N?ZPFJ%RB+T!@=ICQTF_L<[IL*:WCZ@L9%[^[(!\U
M48SF).QK^AHWZV'`:M'3[5H?)N?-I$U"'PV+C9_#=$#R0$UZ+*K3@.B?AF%Q
M:.KT@=+NMT3-2,]SFH*(Y$,_]4./?AI5_ON?^6>?_>]NW_XW%H8Y&36M!8W=
M=PB:_$>(5_>0(#W.W\=/`]/PUFMCQEIS]O2#G#_S(*>SC&]_L:5:EBLBP@#(
MZ^&L]6)(6J/X#LO%#B]^98<7OG"=:S>FJPR\2_HDYA08&W_OX316\$H'$O9:
MML*N@O?I\7:U,8V-%3]7(%F!R0IL7F+S$E>,^.0/OO?3?^Z//OH7;[SVM2=_
M^J=_^M\HZ5MWUETT$L(J9.TK:3JH&W4)FZZLAB1,JO.I6F#JBE/3$1H<8G/*
M\2;YS6]P]<5'>/3[[%K.IEU.+TH/OTHG@/BHHX,);WQC!K/;F"4LY@_V@0(F
M9MO2.S739^H:3(+75[Y%C"#V9(0FZ_NSSY$`XWIXQ2BXY"=CT"C\I3_[D;_\
MT+G)PS_U?_T_G_NK\-)++[W$DT\^^6_NK/L,%"+0EB*H5;"4,MM>TZ7W#[V9
M4*B70M&V7#R]0UNX^N8UCM[W))MG#E>$`=$8]_=0>$?#B4G:
M[1LE;WQUG\)4*`6N+#AW/NL74CNH15>F5<0E4]FN-&X]:TPA<5*^+L\PJ^T1
M,9@$2(F+IBH#(XJ5*(CNY\_\R!.?486?^H?_^L*X*Z&+H9S&-\^?(U=LH)>;E%\,KV9DX],MB\BK"&2,2,
M50?5.^TW#6+HB%J2(/K5/_I$L1/HG=_Y,I6'NHV9_Z0TJPHB(,;B"A=Q.!M#
M8%N4D90@RH__T?=]!A'^EW\-,W671N@@BT5,RJ)7CDX8V,W>EFMR;LEE&\!E
M+(SE3'N,,PZ9GL7I&&M;PN@ZUW9O<^,7OLF'_\B'F?M=U#J*Z2:/G+W3)VS?
M^/997O_JU[BTN?*M!-'A^#&1$]2
M3;RK/G;U;,0@B>'XYK]XGL-%X'"A^$;9FMC$6HFFVSA'/MT@*T<4DS'%9$(Y
MF9#G&2ZS6)?QX__AXY\1$7ZW/L/=!7$,ZA(,3,T*MC:L95FJ?8@K@SC=Y8:#
M>LYCYT<$OX^&0\PD([09!\>!W9FG6;S*\1=N\_*U70XK8;?.N/#`0UP\?PZK
M2W;T5=KC74X]_&%VMDYS%';9S`VM9)2;M^,.UE52UV?/HAB36"%"@CIB=DRB
MCHKI(JN876--)*59BUA'Z6H:!W,/MV<>'Y)C!HRTR%Z%,Y`Y(7.0.V$Z*=G8
MVF2T=8I\8Y,__8,/?H80?E=FZBYG?;>A[@"[E#9TOF1@C#5E`-$\Q6C+R`&3
MB6&V?YO";3$[#FR][U'JW5VN7GV#45ER=#AC_[5;;(PF;&WM8&ZW'%Y]FU%]
M2%@>$3+%2(W24M=WV-P8,=K<8'\.X_%K@\]'SZU:!X@E0>,IO\&!#8BWB`EQ
MT?LZA2-8AW$9UF44KL7G$>+($D,T:,=823P3(08A#G)K\'7-_,YMJOU=\LF4
MT93_]6>?_]Q?A9?>+<]8#U\3!ZE/T/J0,F6[L@HS>QADX+"1
MM12,-A]Q>'2+Z:VW:,V,^?)-KE]_A;K>)RR7A":P=?H\UD5RPGL?FK!;M>29
M87;<Y-
MFODQ?_+IS<^H?X3_[?//?^[*E2OW%(:[-[E2^J!TE;U)G]XKJPQ;^APC](_M
MGCT]5_/BBW=X>'2;IKW"(Y?B97(C;61Z6&S#&U:0MXF.,1@3$,>`B&$9.ET`+'(JDR><*N>22CQ=FAJ
MZN,C/O4].Y^YNEN]\G=_\;?^YD_^Y$_>.(E-K6--B3B\HK]+#SUT4#A=C4(&
MCK&CUZ="?E04`5MR\[!FU"P8;VWPM3=>YM6;-YFU2TYMG^)H<<2#TW/D/L#(
MLG-VAV^^_@H'>T<\<7I$:&:PF%GC'UUQH&K(LK""73OQ]L2EY
M+5F9I2X@\Q)A^44+'O._Q)YCMSJCRG(.C??;+"UPHWEEC2FO/
M'#GIOZ*9Z'Q8(!'64LZ`BXS`T+;8+".$(M8LK(W_;L24'H"@8(*0KJ
M;*)9"TQ6=3H%HRL&70^6$M@^U=*(H]C8H@T6FX^9;@G;6Z?PF>':X8Q,&W[H
MR4H)A$4?/P2+H79/M%TK,-D&8B0B>"-1>KHM+7P:&BCCK4G+,+:LFD/
MTVCHWGL@*.W`8)]M;4T^\?AC%_[\Z>FM?_7\\\_/GW_^>9Y[[KD3SKH#S@)K
MF-*JY#9`,KM:=A^AF'['=/T+DU'+N?<\A!Q=I:DK%.'"Z=-<>NA1ZFF.RR_P
MVANO?>I9;W_XV'B68+8(/7/K0=_.+O_,FHVQ!J):TZBBG6XF=*WTA
M2TSZLCKLG^B*4;K"T4+'M59$$FL\*)*58)IHVS'8+!#:-M78%>_;"-,'[?T"
MZ;U2-;ZGH4H(L>^CV\0Z9(@%C,CDNR[E3__1CTR>^;N_0;@-ZZ=>ONS+K+
M/'5M5ZVG^C+D#PRX8016!:+TWY,?/L_7?N$5=L8YVYO;;(Q+'G[XO>QIPS_]
MP@L<'-_B!__84]S8W:><3I']!8L[!URX>)[;Y.Q/SO#>)[:9'ARP^ZM?X>#.
M+L(#"5-=84+&Q/ITT$$!*0SQ#I,*61USPR8RDR(NVO.^+A(")LO0`$%"Y+PE
M']G%)#)H+5`CD0N,QEX/GP014N60H6#@@=.39S_PV+D_SF\1'PSS___#W"
MUQX3&X2H*?:3/D$Z`NOL57O_$"CS[^
M")^Z?(GI^!)?^?)7638Y'WWL-'YQ0%L=<6??<6T^Y\ZU6YSZX"
MK-$([1B)O7^#"IKT?8))&$%1FQB)(<26-XU^1KVB/DHQS\UF,1Z?C^H9$Z\3
M&C'H.>CI^)J<6PK_9%B[$-:J\Z12:H_XI/3"MYR:CIC:P'14<.=@%WTI<&9G
M"ZDL%SV.+JT1&W]RQGMDKF'&$:S_S@D.L'UWGYE;##IT"O]Q"\RH!C
M-:R:!QD4F.)GD=2@%H:^`AN[C=H$;C8ALC_MJ@X?Z?^)+Q4$X\,J/R$@UA'4
M1I\B`3%M[*)M/=H*:B(;Q@8AA*0ALBIIO4M"%U;SRDN7.3-W5>I
MPA:+:DSP!XBVO/+:VUQ]YR:///H^MLX]S'1T%$U3Z$@*IF]4Z6O@(JB$Z+Q3
M)Y(QT?8K!K&I^"01'8X=8C$A"_A(/+.FKT<$#;&K#6(GE`O@0U^$ZACO$A0Q
MT;$3(EJ@1)\1I$TA?8I(XVZ]MR!6[;-AE4SKHNHAVL8>TGIU3Y_"3,SSRQ!AG;G1HRHH`IZSZ_7I2H"&(K@@-(<1L.M'[UC*Q34X9HJUF!;"M.:0R;9$"##!BNO.G9&N>8_`*&P+PUO'-8HT7+
MP^?/<&9KA]GQ#.P"S7.^ZYEGF&Z^P8N_\R(?__X?X)M?_!)S;VC+L
M&JN>""Z%HR%T@4L"!E4Q(>%&6D>7+B#!KTJKJ2(7^]I"O[[)H`[5DO'[U
M'<+9]_#BC3G'DS_)%U\ZPYV#V'L=/^<@L4KA9N<3@C&H,SUC'&-[GJND?NT0
M(MNC[RZRB($'1U/.[>S@FX:WW[["K[[X&A<_\`Q_
MZ__X*?[3/_<7^-M__Q]P:KOF8]_S$!?.%8@JB\9PO("+IX\H,E9T_,Z1AN[+
MA+6F1\4B&A"3QDUT>9,QJV;*8(B=YYUS'Q#P.L("JRA?0NH-"?'=U`KX]#@K
M<<[(T$W?KV8M:\,'A#7T/66',NAYP\@Z_*9P>T_YTJ]_BPO9(9O;6QSL[X/"
M$X]_`*'AE_^_?T0SKWCLR6?YYF^_P.[>52X^\CY<-N5@=Q<+O/[66_S2;[W$
M?WSI<:KY$9__^_\GSSQ[F7_\L_^8+_SJBSQT\3V`X>CH&`VPL;')I4MG^<#C
MFWSH\8SS.VVRZ\,]__N>X_/1E?NV7?I7;U]_F(Q_Y,+_^R[_`V__JMW$N0Q5F
MLR7OJ/+2UPW_%,/VJ;.>`BSWSX03[T@5,\^_X:YTR,F'K>5?Q^01-CP\?5
MZ(:[B!I4?,]F7+4@=PTR(4W<214GLTIC-4B?YQB48%/OH"9M-;K&%;Z':5HQ
M]_KI&T;74-F>!*0,^B-63O2MZ\+Q[>N<?O,-MLH<,1EE
MX?#+748.\M$FM1>J1LE-SL'\F!!:1D7&S>O7J)]\DNFTY/K;;Y%O3-@YM<,[
MBQL<'\^QUN&LHZX;3%MAC>'HYE6.]F[Q^LN_P\]O;/&]W_UA_LPG+W'Q]!PA
M.G3MM3M]3SN`+A)(J%W3S3!\#`.^[H`!+`S'@\AJ<$OJVQ#1/OE4-7?9IGM7
MZ'2%&[^BW>N
MWR*H$-J0`CO#:#2BJBIR*WA?$7S%;&_);_[:,6]`II9
M:@(FRV/GJ!C:^1[7KWR3O_?YJ]P\F)P(0.+NE!C-K_G#%G]5^<7M,3@9S
M0]*$G)X?U45UP_E'@[*JG/`1YEX$L[Y56$>S7(1S790FKI"-#K8IEK@4M3D-:3ZA,-IPVO?^C+_
MX.!I%A,L-J8G+7P3?6@#,K,C(6U`X;.?I&2CD1X)@30,1:OF-675#W%<0*
M2!NP,W0PJZFSASIHIM#51("C(T]NA4Q@,9NCP'PQ9S&?D^3&<'#K#M,RQZ4$J5HN(G$M%8BL
M,?BFCBQZ!?$>]6U/6VR]XL3SY5_[#7[KF[;'TE8@VC:D#:(3^7$
M&&?;6-\GSVPJT+04F<6DUROR#(-29%F,AB20.P>JM$V-J.*L!0DT:4I:IC4O
M?_W+_-)7;-JU(0UZ#(GEWI6'ASUC.NBLX!4M?P``(`!)1$%4'>":W>099-F)>69PQBA
M6LYQSE`M%MBR0*QC6;<$70"&V7R!=R"INS
M7%0I$7-8V^)]P(IA5)8T;=US3$?-E1=-Z"FNQ-L.'FHW)!!,\66[(7,O/
M??Z7V"B_GX\];2-%1I-&V$$])B33)K+2J'Z#=@!C)Y7!H$C3-?:09HX,HJ?>
MK,EWW*2<;E".YOCON^^188X^GZEW0
MQ+?DQ/@Z&8RCZ/QIB%6[E#C&SN%T@S2KJAMK=S_0KW_Q8>AT8K;9211J5<05
M@GIJKS3&TK05[7).805KH_J6>4GK8U/Z:#S!N;APQF!*5P!>5HC,L5.F?($E=)1+#6
M]/\719&R4AB]^\46NW2Z3.Y34W9H&L#@++DO#
M6%*]H;N\A[;MZQ*]$&2%N<5V;UV;7M"W-HBY/\1Q5Q#NNEX
M\$R*5D,'G:>U\,0K*-:4#1?-F!F69Q=K8&YUEELS9GI?;"3
M_-=>P.L9B`Y3]@Z0["IVJBD2,+V
M]C99F6.=(R\*Q!BR/"?+,L;C\1J[Q)C(B!"!Z72"M7%$D7,VI9^!HL@IRX+@
M(T9DTNPF@^",(Q.+A,#NS5NI/!PO0X+Z>Q3/@LWB91R);3#$+-;@DI-E`R,I
MBM+U8MI]!&%6Q``]P5!9PUKE;EJ-K`!Q[Q,S7`--75-5"^JZB@L4`LOE@N5B
M05U5%'E.YG+*?$13MS1MBW4FS!^HJCHY>INFHBJSX^/5P@_II?UPKLYGNBB(3C/6%OVDU1B,
M,Z*C/R4A_*XT8L@@&VC'$.(81E0JJ\D#F#C$$!,0&L:EI2PR1!U(3M,H/B@V
MS>(P**%IF,\KZD7+V!2,;(ZJQ:ME<[H%HC2A0;5A8$
MKB(M69N@PU"H:4@]Z@K(MFJ,+)&M905(]!81]!8*PYH
M(E,ISA4$+$?+0R2`,T+M?1^AC<93\CQ'@&I9D96;4$5G>C@[2'RI:(:LL[1U
M0U&66%$R9VC:V`L1VF7T/46!JE(4!<[$PHPQ@GHAL2:''2-W=T5
MS8=^:6B_)F-#JSGSJL*)H1A/:>H:"4UJ4,\A)G4AX1(H3AG&4ZB5HCR5]U'6_J6YPS
M.&LH\PP!\J(@LX;CO5VJ^3&3Z8F>ZK7D+=5>NJ9^:V/?A*[.LV#(">NH14.8
MZ&2)X_[D@;!NL=8(97+"?.G@597)Q.+*#9;5@E/3DKJ=TP3P6&[=N4/`H$W-
M8K9D8V.#\2BC4D]6EK@R3A%HZP81%\^#4*6N*D+JR1)CL,XR'HTI\QP)GB8H
M&AK*HN34]@1KE+PH"#Y&6:H0@A!=B\<"19YAK2%@*7+'_NP`W[2K\6EK`X'O
MX2A-["HBQ)!Z#?99R[2[T10=YU8&6)5\APEFR%JMNB]RG)3!(&*0A/EN3I6M
M[3%J,U0B5-$J',^7J+%4/N!&4VJ-1.-YK2QJSZ*I$0-U4Z61#4J]6%!5%5F>
MD64995F0N2@L;4.L.;0U5@).6G:V)XQ+AQ/%5PM\4U'F#O4U@F*-](Y=5/%M
M0QN4,L_())W*8)TASS*"C]^B7LYI?;.>&_0H]""/ZC#]#@*R*0,W]\*"!E8C1,[LBLIZ
MMZ:9>[9N]>.!!IMCD*C<'61)#YQ=?,^(FC(Z-6O1K*!I&N:+173BHDQW3K'4
MEM8$]HZ.N+UWS.W]!:U:ZGJ)UYI@8%E5M*UEL1"L6D:98+7%XID?'\9.K,R1
MYP;?+&B:)7F>0>/)U=`L%E@+F0LXX\DS0Y:9?@"]XJD`W\SXVHO[@PC(#!#6
M05;J@;Y>#@B+II<6+23K>,QZ/!F+B&
MC=*16_"^H0UQ&H"8C-%X`Q%'O0S,CFKRK$00,IN166QI0\=_BVC@WL689J
M('-QQY:%XRM?WQTX5C,(3>]ANKNET_42\YKM7SOV(4T\$%8(K8;[Y1')E@W&
M-:TG=GJ?L1[Q;^][S)!-3F/L"&3_X-_B8H<]G<^:S!?-9
MPZU;^QP8R5")$5F&16.P_V;',YT.)\N60![
M#W,C)^K9:>B*GDB,NQII1U+K,O![+.6[)'3FG@TK])/*3C0U#N)G`3[PU`[>
MC:GJ!D5PY83#V9*;M_>H&Z5N6FQ1.7Z/F_=J;BV5[._J#FH:MZ9+=EO/'/O650S1%O&
M6<;F>$1I+?5\1F$MRV7%=%2P-1TQ<@V__L+1P"0-M&.X3/T),&:`@!K61D6+
MG+C/KFH>:^MZO_!5!AC*/37@1$1U\CX@N(+&N+@+J3A<+#EN(LU]?F<75TZY
ML[O/]NG35.T!DEEFRR73PE%EVI\-(1A\HRR7#<:4[!VWO'YMEZMW9N3EF!!@
M-IOC4C0U+11C,S9DQ).//<8KWWP9HPT/C*A@`@W:51[1IV-;PC*`.B^KRC?M#'#K0+!T4?>[M
M$U@[[&,UPOVQAQ7-2_+Q&)MGF+S`(]1-8'__D*9I&&]LX%7PP;!_<,S>\3'S
MNJ)J6^;5`D^@J1N,6)95S?[QDI=??XO=HX8\R_!M36@K)`1\TU(O:XZ6-;L+
MSX_^Z(?XB__%H_SX?_9QR+?P'NJJ2C5U3UTM`27/"M0KUEI$*^:'[_#BJ_6@
M.-81*KI%26UOW3Q9FW9[%\9F61RJE66QCN&R"(=T49(,AM3K?5D<2?+!KA?,
MN9<4=="+NM;1@K."=QM4M4,:CX0(MDF8H"+XIN6!HJ`?)A@29RZ":%TYHT]V!@+O_@#-9G_"J)TJF.IA[
M-Y#/9!S8V()F9AB7><+B#6VHR0I#5HRXO7_$AS[^<9YY9H>O_>JWN?+B[U`W
M$>:HEPML/D6LI6IJRE$1HZG-$0Y#65JR/*.J&DYM6^X<5NCN$6TP7'[J$H]<
M<+U9V=IPW-J;,Y+&TFEB'+L"H,-R\=I-7WWR(]S]>=#U7
MZYB$T7X@0!PKYU8M5)W_4(W*HS&;C\6E042J?(<*G9ZH2PQ&!O7:HB?]R=UJ
M)D!>.G2ZC[X(/
MPNYQQ=&RQ30-I0G8T(!(7S^/6\WC)."TY5_\^@W>__C#R0>8=>Z38;7[@T+(
MDF/TZUJR5O7T@RBTF[HZ'"V`+68%MZY<8>JR5??W2AIFORJC&H&C)=6/D7-[S*ANP<#_-ZQ--QMLZ(PO%<.YPU963(M,MYS;HLSFV.VIU/.GMK@
MP7,[/'+1]2AUJILK.]Q3@O$(6FJA%GJ;V/.]A:LLPR
M*BQ;TQ$?^]Y'V-EV]'S'I+6M5]ZX=HL[\X"W)7E18!0V1@6E,P3?XK+5^:;M
M\H`O?_TP+6XW'L^L3%._"'2B8C><;2JIE;@_!-9\)_+`8`K5\#Q0/<'\
MOJ<0AD"9H2R%5AOF5T[!:QW>^DF:-2Y`L-I]`2V@]DS(#&J;%B*W1
M-(61\?7+D65G8T1N6@(5M('<%#0(E0;JIJ5J6NJZPAI+EN61LF7BR/=EZVD[
MS&O0PAP`S10?6N[,#"^^=//[;%;+Y$
M@2QS:`A,$H7&I:..^WQ$,T2R2+ET<>!A$P*9BXAL:TJ.9TNJNB&(T'B/!UJO
M+)8-W@LNS5WJZ\NI3NU#BW,Y=55Q:_^(N=G@N+;47K#&D1E#(<((86(,TR+G
M[3??X>#X9(;=9:SF+B1C=129K!,+A@)Z-^[^NSKK$[#%&L5UL/!W/:=O-(H:
M-)Z4-"%.`5"@7BPH,H9-X-F/O8
M7/X@8@N$%J<+2O&,Q3`VAC/3@DU;\X_^WRLLZ]"?2AR15#-H96,51:W!&5($\=^3EF._[V`4VSS]*ZX5EW;!8UK1M2]LT9%WK;/#K
M)WI(;-UUZ?P(WT8F>M",[_V^4Y33,553D6=*[I3QJ&`\'I&),K8M+W[C95YZ
MK>X;^-K(W:9I_=]@'(2NFZ=N/D8;
MXAB%LBQIJB7-8D&19XPFDY7C2TF0-1ZQEB+/XR`J\9&]9S(>NFCXD?_H"?+1
ME+9N$YKLL08V)@6C7&(V/.C,B2\;Q_88#!Z+RW.*/*,H#-_W\4>IS)3@"K`6
MYR+UL\@MXPRLG_/..\?K0V'P@XY;$UF`7=VAV\3#N20Z.!XZI"'`W>G']^6^
MGF3XW2^%Z"<4G"!])+W=.37!JY#G!6W;)BT(9%82"4*2X&*I4@CI5.!N0&,D
M-4^F6PB>[W[V+(\\]B@&H:D:0NO)K$*S(#<-MV\>GLA,E=V#ECRS.".H=>29
M8S(:@;$\],B4'_GDA[@]L\P6`5J/;6N"5S(K[&R,N/+67F*%AU3@&5!M=-!+
M,JP=W!7`G-"8X9D6[UJS'A1$M)MQJB?@\7LX;H9M`ZF`?O9TD1RQQ]@"C"63
M"J-+1EO9*B0,L:,SS)8$WT:"\A*<+1G9@LYX^LE1_SW>2@@ZQV?#\6IZN\#0M$N@).WS4?^T[A
M:]<`?O*TDY.'R.K*7\BPZ7&-J@@F*Q&1N+A-`R%0554")#5M%*6M(W.RQ)DL#<%:T>;?^^@F'_Z>)[DUAV5US(@E$]=R9BNC-,?\BR_?2LV,
M;G5\IQEV$@TFX@R/KI=!`A@&RF#"=ZA9GSC?I!^_UCU,5PYY*)[5,W[9X#3UFY7TR;:E(/SL,!-_0-)YEU=*J!U\CUN!&TSY$M,YQ^6,?
M)-O8QAI#9G,:`IFQ%$98+HXA2Y!$FO9?N(R-T8C-\9AI.4F?T_:?WAC/QWY@
MA_&%A[B]=\31X8+,.+:F&>N7.?J+9NBH.Y@CP1SV,%Q.B=QJ;7I:F'E
M/,V]R:[K,+C)7Y*R`
M,-N_2>8B@5G%1A@9P&63->]:L)O/<27'CT<;)R1":1.6C%DN<3'GC@_`IZ
M4&%V'*&0HHBL\O=#\81=JU[<6Z\H]]\C'&YQ[CQIV:&V_?H#X^9FP$LSC@
MZ&`^H&":%3'9.&AY;'+_NAIR]@RBFC
M'!R!Q:+A<.FY]&B".=(TG6]^ZX"LS%$KY&7!TT_M#*(UUM#C[Q]E6F9,G24SCJJ:\R]?/F;9=*9%5D"@[32#!`SJO5&)_B!7[EDNO8<@[@&'
MZ-UPMVC7,&Y.&"JSDI<1,!EUXR/)RQJ*HHC3PUR19AZE+DQMF1T?,I\OJ*HF
MLON,)1\9\M(/V-:G$0AQD:P>0Y
M#SVXM7*R@S.ZN]U[^G3&,S_X*-.=TSAKF(Q+=B:&W9LW^>HK#632!)JZH@V*%ZA]S>A4
MLSK_5(3;K]U@DN>4B8^*0(E'PQ;+>KPZ3S1]J;H*N``NWR#+"T:YI=S'JT<[)#E/:#)?/#)38[L-JU7ZD7#=NF8RHS=
MO1HR&\T0,N@2U;OS!`:'HXNNXU'WH'&8^Q096)V8R3)H>'T[NGM!0-RUM&VO&/L"B#HPW-RFR=IU-I\*_?.$6I]NV[2N)!:%'B3
M8T0YMS5A0L7B>+[:F'8PI6=MSN``^P@VX5(G6!]A4.5[5],T*$NHGJQ3G&CC
M6DO\UNL1W<,WIL*R@:I)9S#X$,=N#J!['TJL!E0$ZQQUB)0;GT]YY/&=V)#>
MF1&!:U]!MUP_#V87%\1%VW9$61
MH)%`*'>X>&&9U%ZZL:M\_8M7R-L#0M/@0PVYX_RC%[ET:7,5":ER^_8^NX<+
MWKZ]SP,7MWG/A2+!T,.SY@;HZ*#EX,$+)957?/`<+Y:(R3CV;/T
MR,<:WB,AEDG7&'L,#^JX/PRN`ZGI(#=0W@5RO>MW'9S8+BSK0%"AR'+:UE,W
M?NUUF_F,MIYCG"-S&74;3\=ZY/&S=]7&;[Q]S/+F-8RT',YF+%O/,MOBHS_P
MR*`@%!__R1]]DFO7][F^>\3><3H>&0>:I>K;L)A#/_L/"9BBH`I*ZSVS^8*V
M:2C]DMNWF[7#U]>:>P:C5WL`54^0B(=YQKOG$2OU4;T[O&/0U7I/.N;)A"Y]
MT-HK/D">9X@(;>MIZJH/,6<'\WA8%)+J!TH;`MMGMY,SU?[_5UZZ0=X><7A\
M1!,:K"LI3CW(V0V'A1M9\93Z0I(.,NY`,=[`
M9D6D93I#)H$LU+SUMC^!&ZW%)H,>DZ[_>I53W;,Q\7ZETO4.+UUCJ\N)67_#
M,=5W/3G=/O?@)M5;5[$;FYC"4;-IZ
MVG$O?F/&.R^_@6DKCBI/I@9O2S[Z\?AMY?
M$'J/#JYWI]R\FPC7GVTQ-*TGM'&%;[]XR%>_=(/1IO#VRZ^RH0<<'B]9SI=,RA'%]GDN/;I]UXB*;L=.)L)S
M__D3X`=P]##"Z?Q
M>Y6J;C$V4&1*[N+Y/K_XS[^%W'J=FV^^S2N'4-4SMO*,>MEP>F20?)L__F-/
ML;$A@R\]^'`]X*;WH`G=2_V'MMMPX<*4%U^K.*+%B&%K*V>\,9S'\6Z+,."`
MF:&U"/<(2>_3NJ5WM7*]V^[GOG:O^VE;)2LC;-$V@:H)W+P6I]X'7U'/#E$L
M=>NQUN`%%JWEK2LW.=RK.#R"FW<:C-EFN3!DQ0;+D''ZX8L\_.CI-/W%KH-O
M,HS?T]G6ACC*`;\^A6SH^-I(!JL:^/HWW^9@%OCVM3N\N;O@SOXAU][X%J^_
MZE.8V_G"+N,?E@E8;_D=S@`\V8%Z+_15]5U,*>\2).E=HVK6DCM$<*$BTP8D
MD&5C]JHYM^[LX=O`E_[9KU-54^NYW.^@15[\20A?Y#"+-_[^]:^F-HPC"
M7_6LO5['\2NQ8R=1$B0D9)!RX`(("2X@;ESXOTAP0@(D2,1#.!&Q%3N)<>)'
MLO$^9KHX[/3,US4]WAQ0N-A2%%E1]M'54X^OOOKJWA\G^.G^(XP["]#%:WCX
M?(BA=K"[^S>^_^XO%(6+:ZGH?1-_(HJ_FS9G;9310`+L6F\^Y#I%HO)2#,0!
M/'LV1O_%2W3&9Q@,!GA^-,;1H(]U*/9V3[&[O8WE6:`C'OD)O+L/1R1!C`(N79S$C&7KS/7S^\48S.6#86,A/"^?N83<=?]-B
M`G.7<>.XKYA;6$2>=7!Y>0U/CG-(MX?K-VYB^\$.]@[>QZU-B15IJO8HI:NA
MD<1C<46I`75^UJ2U:[/[G%5:\"4CKB7`:%3@AV\?X/?\79Z!5T.)IH2D&P
MMG$=(^UA]]$A6G*S@]_@A[>WT<'Y]@MKN*X:4-=.9S++D97)HK
M3\EIDQ@9B,BAAHC6X4R6@*A.,8007::Z[9$:2WSWM:FI!0#X[=X^GC[\$UUX
M/'_M\6HTQLK\(K+,8>>?4PQFGV#[EQ>8&3B\Z$]PM'PTQ..GA[A]>W8B+22(
M<_54JHP6B%\E\;>CK,62J(-KT:KJ_N;KF_3ZE.EHPGT(XKU,H>&AI;83"VY5
M6,@YR@.LAR513-$&$UQ4:38B?C+.ACFR;@>+RU?Q>IAA;GX1EV8F2SHP(Z
M?HV9O(]WM^YB=W\?/=?'HX-CR&QW(E@E@2'A331CF0I#;K!33@&:"=TR3_S5
ML*6/F205"\35LC[*2W$1TW522;Y2=J1%W<]66XU/*>B$;HG:!@?'6^P;```$
MUDE$051;4=7$"-+F@IR@)VYC8PSL\P?VT)6A3P"IR\'.*@/\(-[6%S\P:R
M&6!S;0'92'$\*-!=6D6_R+!_,,;5=0(9C:9%C/DKFAL^Z/]&0X9:D:;"/7^2#K36L7EG'
M\&P,E1R#<8X\+U"HX"LXG)X`_<-C9,BQLKX.*/#.K0+B'):OK>+NW97RH`D^
M9G5(2:5RWOR;I\,.F[.()!P1+%@VU,N*[-N!OE\'8M$99C$O>
MQ!#\X$FSZA9!BS'B5]I<%P`S0,EI#3+6+LPD":VK"EQ(?0!/@4X3:."(+E_+1(^@T6!UU-KEP1-K/3&Q
MPM=Q02T$XXQ17,L,N7$QGH`[6EM`6Q/K^.%Y`E>;KDBUU96G]UF'T;&@5N9"
M0J'QQ(RYQ6+A$O+M8N)N(UA&3Z127BY)<#Y!OJ*)'*WQ),YT(E5G;X*BUH=9
M$(?5&UQ(E=+?\O?<1YM6&D]Q2%^CF#8-XD!B$LEF3\KCK*E)+FEF;)DT%G_4
MBB]:9RCB:I4P-;PJN^5$T2RJPGMX1X;P,;-"S9=T/))`Q.+("*0LX[5FS!7>M!F;-$T<:(4X>&,$?`O(*LT&BYH8+.5&$N$@ZU.W6>)@;/L*HDU,
M)QI83+G,Q!/$S9KH5MI:(0&ZJ3=R<1(M+J\V!&J11DRUA4W9&JPU[&73.IF0
MD$W9PB_1+BU7VX.#M'.Q-955O6BH(_CVB`E38L2ELBC$D!10R50
M$ZRKF3V0XE>`F"4LOW!U)>NE)GF)\<45@)91]\O&)U'HM4!4,(H:`!2_(D
M;1$*O"K0$KP=C!KTE:HGS9',G#3=IE(WKNI9LQ2I3(D18OO-$C>8H,POJ`EE
M')3%5+[>%B'2#$C!'SN)GQA+VQ%)%WQ\\!'Q5\WH5+!=&=1#<<8IK%++,V=-
M=!?#*E7OP<<71"61_!@`4MP;2$#8%R._+%JW/ZO%%!(]"^0^C%:'H&5&G@RG
MB<-OQ`\VI*L#8&'A>:W;E&%.P7/E3(<;?']!$`8KRB"KX6Z6PI`6H7:&WSVG
MS)32GP=Q[.P?/?[Y_LX]N.XYU2Z+_$FB4)58Z]3B*XVJ.BA]F3>CM6+UTT"S
M!A5%4B?^/&P_`37GQ9!_(\U"XP9]41O320U?A\(O%'>!#!WB3`C.7IOU`J??
M0O'*C[#S]/1QRAEU`,P!F$WV\2Y^_NN?<)M&``8`\@YB3.J@`````245.1*Y"8((`
`
end
srecord-1.58/etc/doc_chip.png.uue 644 0 0 45310 11673330631 15237 0 ustar Peter Miller #
# srecord - Manipulate EPROM load files
# Copyright (C) 2009 Peter Miller
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or (at
# your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
#
begin 644 doc_chip.png
MB5!.1PT*&@H````-24A$4@```&(```"`"`8```#P*;R'`````7-21T(`KLX<
MZ0````9B2T=$`/\`_P#_H+VGDP````EP2%ES```+$P``"Q,!`)J<&`````=T
M24U%!]D"$PL:%HDE[#T``"``241!5'C:[7UKC%W7==ZWUC[GW-<\.<.W*$J4
M1$E^RJ:1I$AMQT%:%WFX4!LD0*$&"!JHCU]"4""`FP)MBC@H$L-N"Q2(D3\-
MD/QHD#!)^R.)FS0Q'#MVI%JVHRO=Z]WKW>L==Y']X\LDG\8&CUW[S%W[V(T]R
MQB!6`!&$!<0$804P`6![(X(0`42`(-X/!@"(,8```@9!(*(!T?9OHD%D`&@`
M!A`#^R("&`T1`<$`9`!CXI\A$/L#(`8B!D8;B-%`.8&,1S#C"60\AAF7D'("
M8RK`B,#(M?%6_W>?_<8KO_[[EQ^Z_MO_^VOO*$%D-:D4#&KE$"$8LF(B`40;
M4&7L'4(`,80`$+MGVN4A(D!E$)`5,0$,`8P!206(0'1E?]9B!>.W@C80K0%C
MP!"(&+_D]GG&OZ38W\6`!&!CGV=T":HTN#(PVFX'8048`X.*C-9'L[SUBQ_Y
MR'N>^/`9^8/_^/BG?O?^?_''7WZG",*O)+[PA2]8#;'K#";W9<`08AC%$"9[
M4W#:X7>G77AA1MC;8C>Z&($N2YBRA%0E4)70905C*H@Q$"V02@"Q0K?K3A`A
MD)#[0`1B^P`1@8A39@%(",P*G!6`:H$HA\HRL%(@9I!28,K`*@/E&8FBPP;Z
M7[5HX\__XM<^^N4S9\Z\LP0!P-HB2@V6W^_^)M98_SM!#-L%+06D!:0K
M2#6!'@^!<@PIQY!J##$52/M=K"%:0RI["R]O[`8P`F@#&"&(L#51$&?.G##(
M?F`F`F<9D.<0R@#5`C@#-)<7I%__!__B>MI]])@B``
M.0@JM?4"N^M)!"QNW0D@,C!BW,YENT-%W$U#J@E,-0'&8V`\@M$30&M(J2&Z
MA,``1J*$26!`T"!H,`Q9+116WA@YO\2`^!NE.\2Z'X'5#I6!6($I!TP&0(%(
M`5Y+6($405*(#AHA-MT%,T\"`02OQ,%QOAU%Z?J=J
MB"EAI`*T!HFU]T0&8$E>TX`98/;OR/:=#((/L@\D0#'(?TSR3[(W(@HZ2TQ@
M)C`S*,M`S(!RBT_LOH,U=>*^EX!@JA(/'NT^^J>?^>C39\Z>%GQD2=B2[Q;/.VFAC=SNTM3%D(,QQH1F`B@X^+JKS.4P0L@M/_CD@
MNZA,03A"!"&Q,G-R`TD0E/49.3A3X$RY")"M0(C!1/;U&3!&0U7C[F,/+)_Y
MM9^>>_J99Y[YG@@C%023"$A,V.U&[#H;4+#31NR.,B(0J6!@H&$`4SGC8MVU
MD%C'[@(MN\@$`0.*((=.@#)E;XI!RCY>)#Y/`%2C(28[?7SXT:-GOO@;G_B>"(.;=XA;Z/!%@[]0
M,%X0WA>(@4@%2`42[4):`9&$Q:&,0,KM?*6B[?>A+R$(`2YD$VY$"5XS*#IG
MNZ/9:0?53!4Q@(Q!N0+G&3C+P+GU#\SV\XBRSS-&H"N-T>8&B`0??N^Q,U_\
M['=?&)R:)`%@B&"(8>!O%(4BY&)X#8&!0`->"\C%GWYGBKV/P"!23CM4,#_B
M[#S@=[S7'BM(&\OZ)$\@Q@4#2!>=K&9YK8"]/]R<6:-<@8H,E"L@5Z#,^P]K
M%D4TJG*,P<8Z\G8/9]Y[_,P7?_U'OZO"X'J8RLDMNF`10@Q\!EP@@U;*OD@S(#*
MK,-6.4CE$%:@(@?E[.("[YN`G9O7D?7FH#H]G'G_L3-?_.QW3Q@\C7AXV^U#
M"[^@;I%BT.*LEO4'(:07O_XN/(5VN]N]CDK"8U968"SV%IPH(5C%C`!%(:`+
MBP\"H$*('6*+)`D%;!3%*KN\[R#U/J6C*O`H00\@*1*2AVP00&(IL[L!*064%*,O#[Z*4TS#`
M0*,<;"/O=I"U>]9,O?]XT(S''W_\;1-&71!$80V\7V2"$T8,XUF1B]L18G=F
M`F4,5F3_3MX$4=04MU+A;W[EF((V&J*(,5'\7/&6`(XAS&6`E`V5P^,035]P
M]%:5V9M)=B$MVTTG`*KQ`%P44.T65*L-573PX?<<.?,;_^9#O[F]?O'>G9V=
MMQ_T\Q%/S52)OS^%/H+=BNBKTP`"+*!'QOE6KV,"(Q)MGI..P+\VU8.H5"!^
MRX@W2?%SA0B*K!XX@,N!BL:]G1<<@82=$)3S6V1_=XAN.=R&*MH@;<%*<>OQ
M\S_UZ).K"^V#O_V%SSUU\>+%UT^>//EV"L)].;=3)<3GSK1$W7?&),VLO3]Q
M@)&1B$^),ULD(`T;/3G?X*`KZS3]VSN38F4LP5>)H?A!F:P0$05$,/8>PQ!#
M(.,6,\G*22E`..!/'NX'V:]9]KKC#SXN7WH5O_&93]]U
M8?`L=(^<&0DU`;([UR*?XO((&\Y2Q#MEP7[&?(=<%"'D0EJ'%GOAVGC"!@+$RCIO9:,YZV^L69ML
M]P$J@*P#;K61M=O(.AUDW1ZR7@__^!,//GYFY?SG/_N93]_[Y)-/XN+%BV]#
M/4(DH*KD%QP>?D9PR''W)_F6I`&60V,A8)$8@1E`%(,]X.=@#^]#2&`3+;&.
M-^0B[+)AB>]+KD;AP7I;G_!FQN4U["(N(^%Q)-8L"3OSI-@*F^S&*L=CISTM
M(#?6?8$!PV%3?.KC#SZ.OWP%O_Q;WWAJ;6WM]8L7+^([U8YL.FI*<@(1))8A
MP@-!0"8L3@3@$",8(4!,$@4[,9(*]MMC?.%UQ,;TUK112+@1/$UTX`1;[TA]
M2\W3$P/*;00V@&:KZ0YR(8\\*H]#$