Abstract:
Encoding and decoding systems for data blocks based on forming corresponding code blocks having a maximum number of successive repetitions of a first symbol and a maximum number of successive repetitions of a second symbol, and having code blocks which can represent plural different ones of said data blocks unambiguously by having further code blocks aid in distinguishing data block is being represented.

Description:
BACKGROUND OF THE INVENTION 
     The present invention relates in general to information storage systems and, more particularly, to a method and apparatus for implementing maximum transition run (MTR) codes in a digital data magnetic recording system. In digital data magnetic recording systems, digital data is recorded in a moving magnetic media layer by a storage, or &#34;write&#34; electrical current-to-magnetic field transducer, or &#34;head&#34;, positioned immediately adjacent thereto. The data is stored or written to the magnetic media by switching the direction of flow of a substantially constant magnitude write current which flows through windings in the write transducer. Each write current direction transition results in a reversal of the magnetization direction in that portion of the magnetic media just passing by the transducer during current flow in the new direction, with respect to the magnetization direction in the media induced by the previous current flow in the opposite direction. In one scheme (NRZI), a magnetization direction reversal over a portion of the media moving past the transducer represents a binary digit &#34;1&#34;, and the lack of any reversal in that portion represents a binary digit &#34;0&#34;. 
     When such recorded data is to be recovered, a retrieval, or &#34;read&#34; magnetic field-to-voltage transducer, (which may be the same as the write transducer if both are inductive) is positioned to have the magnetic media, containing previously stored data, pass thereby such that flux reversal regions in that media either induce, or change a circuit parameter to provide, a voltage pulse to form an output read signal for that transducer. Such a read signal has an analog character in the recording retrieval process. In the scheme described above, each such voltage pulse due to the magnetizations in corresponding media portions is taken to represent a binary digit &#34;1&#34; and the absence of a pulse in correspondence with such portions because of no magnetization reversals therein is taken to represent a binary digit &#34;0&#34;. 
     In digital magnetic recording systems, the times between voltage pulses are used to reconstruct the timing information concerning the time base used in recording the data previously stored in the magnetic media to define the path portions described above. More specifically, the output of the read signal information detector is used as an input signal to a phase-locked loop forming a controlled oscillator, or phase-lock oscillator (PLO), or synchronizer, which produces an output clock signal from the positions of the detected peaks of the read signal. In other words, the PLO locks the phase of the timing clock signal to the phase of the signal resulting from peak detection of the read signal voltage pulses. Absolute time is not used in operating the data retrieval system portion since the rotational speed of the motor which drives the magnetic media varies over time both during recording and retrieval which results in nonuniform time intervals between read signal voltage pulses. 
     A data encoding scheme known as run-length-limited (RLL) coding is commonly used to improve the PLO&#39;s reconstructed clock signal accuracy based on avoiding drift in the frequency thereof because of too much time occurring between successive voltage read signal pulses. When RLL code is employed, the time durations between read signal voltage pulse transitions is bounded, that is, effectively, the number of binary digits of value &#34;0&#34; that can separate binary digits of value &#34;1&#34; in the read signal is limited. This constraint is known overall as a (d,k) constraint where the individual constraint &#34;d&#34; represents the minimum run length of zeros, or the number thereof between ones, while the individual constraint &#34;k&#34; represents the maximum run length of zeros permitted. The &#34;d&#34; portion of the constraint can be chosen so as to avoid crowding of voltage pulses in the read signals which can reduce intersymbol interference problems in which portions of read signal voltage pulses overlap. By limiting the number of consecutive zeros, the &#34;k&#34; constraint maintains the reliability of the PLO in providing an accurate clock signal for the retrieval system. An automatic gain control (AGC) system is usually used to maintain signal amplitude in the retrieval signal processing channel, and the &#34;k&#34; restraint also maintains the reliability of the AGC. 
     As the recording densities become greater, the result is that transitions representing binary &#34;1&#39;s&#34; become recorded very close to each other in the magnetic media such that severe intersymbol-interference results. At densities considerably greater than those in currently commercially available products, the most likely error sequence has been demonstrated to consist of write patterns that contain three or more unspaced consecutive transitions. A class of block codes that limits the number of consecutive symbol transitions, typically representing binary &#34;1&#39;s&#34;, are known as maximum transition run (MTR) codes. To avoid three or more consecutive transitions, codes with MTR values (no more than two successive binary &#34;1&#39;s&#34; in the coding result) equal to two are desirable. 
     When data is encoded into codewords that satisfy certain constraints, data words (blocks of successive coding symbols typically binary &#34;1&#39;s&#34; and &#34;0&#39;s&#34;) having &#34;m&#34; successive bits are translated into code words (blocks of successive coding symbols again typically binary &#34;1&#39;s&#34; and &#34;0&#39;s&#34;) having &#34;n&#34; bits where &#34;n&#34; is greater than &#34;m&#34;. The ratio &#34;m/n&#34; of the data word symbol length to the codeword symbol length is known as the code rate, &#34;r&#34;. The upper bound of the MTR=2 code rate in which k=∞ has been found to be 0.8791 as indicated in the Seagate Annual Report. This upper bound is also known as the capacity of the code. This means there exists MTR codes with MTR=2 that map m data bits into n code bits as long as the ratio of m to n is smaller than 0.8791. For practical implementation, m and n are usually chosen to be small integers and the ratio m/n is as close to the code capacity as possible. 
     To design a MTR code with MTR=2 having a rate of m/n and using one-to-one block mapping in which the &#34;m&#34; data symbols, or binary data bits, in a block are mapped into the &#34;n&#34; code symbols, or binary data bits, in a block, an exhaustive search of the possible n bit blocks is used to find 2 m  different n-bit words which satisfy the MTR=2 constraint. In addition, in order for these words to satisfy the MTR=2 constraint when concatenated as code words, the bit patterns therein must begin and end with `00`, `01` or `10`. That is, bit patterns can be considered in these words found in the exhaustive search which start or end with `11` and those words can be invalidated insofar as being used as code words. For instance, if n=5 and if one removes all the 5-bit words having three or more consecutive &#34;1&#39;s&#34;, having bit patterns that start or end with `11`, and the all zero bit pattern word, there are exactly 2 4  or 16 words which remain. This is just enough to form a 4/5 rate MTR code with MTR=2 using one-to-one mapping between the data words and the code words. 
     However, when attempting to extend this method to a 5/6 rate MTR code with MTR=2, there are only thirty words with valid bit patterns available, two short of the 2 5  or 32 words required. Although one may achieve the same code rate by mapping 10-bit data words to 12-bit data words, the 2 10  or 1024 code words will significantly complicate the encoder and decoder which use Boolean logic to implement the bit pattern mapping. Thus, in the context of the above example, there is a desire to provide an encoding algorithm which satisfies the MTR=2 constraint that is easy to implement using Boolean logic and is not limited by invalid patterns beginning or ending with `11`. Of course, the present invention is not limited to such codes which satisfy the MTR=2 constraint, but rather is applicable to any such code regardless of the coding constraints chosen. 
     SUMMARY OF THE INVENTION 
     The present invention provides a system for encoding selected data blocks having selected ordered symbols therein into corresponding code blocks having selected ordered symbols therein numbering more than the symbols in the data blocks with the data blocks received at a receiver in the system. An encoder provides a corresponding said code block for each of the data block, such that each of the code blocks, and any concatenations thereof, are without more than a preselected number of successive repetitions of a first symbol throughout, and without more than a preselected number of successive repetitions of a second symbol throughout. In addition, any of said code blocks that can be provided for more than one of different ones of the data blocks, in coming to the receiver to represent a data block, comes in a concatenation of code blocks such that such that a code block that can represent more than one different data block comes to the receiver together with at least one other code block in the concatenation so that they are together sufficient to determine which of the different ones of the data blocks that could be represented is being represented. The symbols in the blocks can be from the binary number system. 
    
    
     BRIEF DESCRIPTION OF THE DRAWINGS 
     FIG. 1 is a two-state trellis diagram for associating concatenated code word bit patterns with each other according to the present invention; 
     FIG. 2 is a table illustrating all of the 6obit binary patterns which satisfy the MTR=2 constraint according to the present invention; 
     FIG. 3 is a code word assignment and next state table of a 5/6 rate MTR=2, k=9 code according to the present invention; 
     FIG. 4A is a block diagram of an encoder for the 5/6 rate code of FIG. 3; 
     FIG. 4B is a block diagram of a decoder for the 5/6 rate code of FIG. 3; 
     FIG. 5 is a four-state trellis diagram for associating concatenated code word bit patterns with each other according to another embodiment of the present invention; 
     FIG. 6 is a table illustrating all of the 7-bit binary patterns which satisfy the MTR=2 constraint according to the present invention; 
     FIG. 7 is a table of sub-groups of the 7-bit patterns which satisfy the MTR=2 constraint according to the present invention; 
     FIGS. 8A and 8B are a code word assignment and next state table of a 6/7 rate MTR=2, k=9 code according to the present invention; 
     FIG. 9A is a block diagram of an encoder for the 6/7 rate code of FIG. 8; and 
     FIG. 9B is a block diagram of a decoder for the 6/7 rate code of FIG. 8. 
    
    
     DETAILED DESCRIPTION OF THE PREFERRED EMBODIMENTS 
     To achieve a m/n rate equal to 5/6 in an MTR code with MTR=2 using code words of 6 bits in length (n=6), an initial list is provided of all such 6 bit words including those that begin or end with bit patterns `11`. According to the present invention, these 6-bit words are assigned to branchings to the next state during a state transition from a selected corresponding state in a finite state machine represented by a two-state trellis diagram in such a manner that invalid patterns (three or more consecutive 1&#39;s) do not occur when these code words are concatenated. Referring to FIG. 1, the two states in the trellis diagram are indicated there as state S 0  and state S 1  which have been found to be sufficient in number for this code. Two branches are shown leading into and out of each of the states S 0  and S 1  if viewed across the entire diagram, but with each of the branches shown in fact representing several branches in parallel. 
     As shown in FIG. 2, an exhaustive search of this initial list is made to find all of the 6-bit words in the list having bit patterns therein which satisfy the MTR=2 constraint results in the listing shown there after being divided into four selected groups of words based on selected bit patterns in those words: 
     Group A: `1XXXX1` (9 different words), 
     Group B: `1XXXX0` (11 different words), 
     Group C: `0XXXX1` (11 different words), 
     Group D: `0XXXX0` (12 different words), 
     where X represents either a &#34;1&#34; or an &#34;0&#34;. This grouping is, as indicated, based on the bit patterns of the two end bits in each of these words. 
     In order to limit the resulting code to having the MTR value therefor equal to two in concatenations of the code words resulting from successive transmissions thereof, constraints are imposed on the transition branches in the trellis diagram so that the branches may only be associated with certain code words having suitable bit patterns to avoid the occurrence of three or more successive &#34;1&#39;s&#34;. If all code words arising upon state transitions leaving states along branches leading to a state S 0  in the diagram have bit patterns that are restricted to those that end with `0`, code words arising upon a subsequent state transition along branches leaving that S 0  state can be from any group. If all code words arising upon state transitions along branches leaving a state S 1  in the diagram have bit patterns that are restricted to those that begin with `0`, code words arising in an immediately preceding state transition along branches leading to that state S 1  can be from any group. As a result of following these constraints, the above code word groups are acceptable to arise along each branch as listed below: 
     S 0  to S 0  Branch: Groups B and D (end with &#34;0&#34;), 
     S 0  to S 1  Branch: Groups A, B and D (all but these chosen to allow a unique state assignment as set out below) 
     S 1  to S 0  Branch: Groups D (begin and end with &#34;0&#34;), 
     S 1  to S 1  Branch: Groups C and D (begin with &#34;0&#34;). 
     In order to make the code words uniquely decodable and limit the error propagation, code words arising upon leaving each state in a state transition must be unique. That means each code word cannot be used upon transitions from more than one state. Groups A and B are assigned so that code words arise therefrom upon state transitions along branches leaving just state S 0  in view of their association with branches leaving that state as shown above, and Groups C and D are assigned so that code words arise therefrom upon state transitions along branches leaving state S 1  for that same reason. However, since this is a 5/6 rate code, 2 5  or 32 different code words are necessary for transitions from each state so that a data word can be represented by each such transition, but code words assigned for branchings from a selected state can be repeated for branchings from that state to each of the different next states branched to therefrom since they will still be uniquely decodable because of their differing next state characteristics. The use of the fewest states possible, of course, tends to reduce complexity and cost. 
     One code word `011010` from Group D is therefore moved to arise on transitions from state S 0  (which group is also associated with branches leaving that state in the second listing above) to thereby provide 32 code words available to arise on transitions from that state. As a result, that moved code word now forms Group D&#34; leaving the rest of former Group D to now form Group D&#39;. The code words are, as a result, distributed to the branches as follows: 
     From S 0  to S 0  : B (11 different words) and D&#34; (1 word), 
     From S 0  to S 1  : A (9 different words) and B (11 different words), 
     From S 1  to S 0  : D&#39; (11 different words), 
     From S 1  to S 1  : C (11 different words) and D&#39; (11 different words). 
     There is thus a total of 32 code words for branchings from state S 0 , and 33 words for branchings from state S 1  thus showing two states in the finite state machine to be sufficient. To keep the &#34;0&#39;s&#34; run length &#34;k&#34; constraint small, we may eliminate the former code word `000001` from Group C to form Group C&#39; and so then leave 32 code words for branchings from state S 1  also. FIG. 3 shows the next state table of the resulting maximum transition run code having a 5/6 rate with MTR=2 and k=9, providing the next state and code word corresponding to each data word for branchings from both of states S 0  and S 1  during state transitions, and showing the corresponding hexadecimal value for these words. The k=9 constraint is equaled when the code words `100000` and `000010` occur successively in a transmission thereof. 
     Since the code words are unique to the branchings from each state, the decoder will only have to look ahead one code word. For example, the code word `36` (hex) may be received by the decoder. This code word from the table of FIG. 3 can be seen there to be the possible result of either data words `07` or `17` (hex). To determine which, the decoder must check on the next code word and determine whether it was associated branchings from either state S 0  or state S 1  as it is uniquely associated with one or the other. If the next code word is one resulting from a branching from state S 0 , the data word `07` (hex) will be the decoded output since state S 0  was the next state of the preceding code word `36` (hex) now being decoded that represented data word `07` (hex), otherwise the next code word is from state S 1  and data word `17` (hex) is decoded. Errors confined to a single code word will thus only affect two decoded data words, that data word represented by the erroneous code word and the preceding data word for which the erroneous code word was the next code word. 
     The logic structures of the encoder and decoder for the maximum transition run code set out in the table of FIG. 3, having a rate 5/6 with MR=2 and k=9, can be expressed in Boolean logic expressions in which a &#34;*&#34; between Boolean variables denotes an AND logic operation, a &#34;+&#34; between Boolean variables denotes an OR logic operation, and a &#34;-&#34; over a Boolean variable denotes a NOT logic operation. These Boolean functions can be implemented into such encoders and decoders by well known logic gate circuits in well known manners based on forming a finite state machine therewith. Alternatively, such encoders and decoders can be similarly implemented in a microprocessor, or microprocessors, in well known manners. 
     In the encoder system shown in block diagram form in FIG. 4A, each input data word of five bits A 4 , A 3 , A 2 , A 1  and A 0  is successively supplied to a clocked five bit input register, 10, as the data word receiver at a system input, 11, during a corresponding period of the system clocking signal supplied at a clock signal input, 12. Each such input data word stored in input register 10 is transferred during the next clock period from an output, 13, of that register into an input, 14, of an encoder, 15, comprising a finite state machine based on the table in FIG. 3 to be encoded into a code word of six bits C 5 , C 4 , C 3 , C 2 , C 1  and C 0  provided at a code word output, 16, of that encoder. From the table of FIG. 3, we can see the input data words are divided into two groups. The first group of data words extends `00` to `0A` (hex) and, for state transitions from either state S 0  or state S 1 , has state S 0  as its next state. The second group of data words extends from `0B` to `1F` (hex) and, for state transitions from either state S 0  or state S 1 , has state S 1  as its next state. Data words can be identified as being from two sublists in the data word listing, data words in the listing from `00` (hex) to `0A` (hex) and from `10` (hex) to `1A` (hex), by the following expression taking a Boolean value of 1: 
     
         KK=A.sub.3 +(A.sub.2 *(A.sub.1 +A.sub.0)).                  Eq. 1! 
    
     Since data words in this first group for state transitions from either state S 0  or state S 1  have the next state as S 0 , and the data words from the second group do not, negating KK and placing it in an OR relationship with the fourth data word digit A 4  allows the next state to be expressed by the equation 
     
         Ns=KK+A.sub.4                                               Eq. 2! 
    
     for use in encoder 15. Ns=0 represents state S 0  as the next state, and Ns=1 represents state S 1  as the next state. 
     The bits of the code words arising on branchings from state S 0  during state transitions as set out in the table of FIG. 3 can be expressed as follows for use in encoder 15: 
     
         YA.sub.5 =KK+A.sub.4 +A.sub.4 *(A.sub.2 +A.sub.2 +A.sub.0), Eq. 3! 
    
     
         YA.sub.4 =KK*(A.sub.3 +A.sub.2 *A.sub.1 *A.sub.0)+KK*(A.sub.4 *A.sub.2) Eq. 4! 
    
     
         YA.sub.3 =KK*(A.sub.2 *(A.sub.1 +A.sub.0))+KK*(A.sub.4 *A.sub.2 *A.sub.1 +A.sub.4 *A.sub.1 *A.sub.0),                               Eq. 5! 
    
     
         YA.sub.2 =KK*A.sub.1 +KK*(H.sub.13 +A.sub.4 *H.sub.11),     Eq. 6! 
    
     
         YA.sub.1 =KK*A.sub.0 +KK*(H.sub.12 +H.sub.15),              Eq. 7! 
    
     
         YA.sub.0 =KK*(A.sub.4 +H.sub.15),                           Eq. 8! 
    
     where the corresponding Boolean variables H x  are defined below. 
     The bits of the code words arising on branchings from state S 1  during state transitions as set out in the table of FIG. 3 can be expressed as follows again for use in encoder 15: 
     
         YB.sub.5 =0,                                                Eq. 9! 
    
     
         YB.sub.4 =KK*(A.sub.3 +A.sub.2 *A.sub.1 *A.sub.0)+KK*H.sub.0 +KK*A.sub.4, Eq. 10! 
    
     
         YB.sub.3 =KK*(A.sub.2 *(A.sub.1 +A.sub.0)+H.sub.0)+KK*(A.sub.4 A.sub.2 *A.sub.1 +A.sub.4 *A.sub.1),                               Eq. 11! 
    
     
         YB.sub.2 =KK*A.sub.1 +KK*(H.sub.13 +A.sub.4 *H.sub.11),     Eq. 12! 
    
     
         YB.sub.1 =KK*A.sub.0 +KK*(H.sub.12 +H.sub.15),              Eq. 13! 
    
     
         YB.sub.0 =KK.                                               Eq. 14! 
    
     The corresponding Boolean variables H x  used in the preceding encoding expressions for the code word bits are defined as follows: 
     
         H.sub.0 =A.sub.3 *A.sub.2 *A.sub.1 *A.sub.0,                Eq. 15! 
    
     
         H.sub.11 =A.sub.3 *A.sub.2 *A.sub.1 *A.sub.0,               Eq. 16! 
    
     
         H.sub.12 =A.sub.3 *A.sub.2 *A.sub.1 *A.sub.0,               Eq. 17! 
    
     
         H.sub.13 =A.sub.3 *A.sub.2 *A.sub.1 *A.sub.0,               Eq. 18! 
    
     
         H.sub.15 =A.sub.3 *A.sub.2 *A.sub.1 *A.sub.0.               Eq. 19! 
    
     The output code words of the encoder are provided by the code word bits C 5 , C 4 , C 3 , C 2 , C 1  and C 0  formed by selecting the proper one of the corresponding preceding code word bit expressions from the two sets thereof through use of the next state expression associated therewith delayed by one state transition (or one system clock period) to provide the current state indication therefor, the expressions for the six code word bits being as follows: 
     
         C.sub.5 =Ks*YA.sub.5 +Ks*YB.sub.5,                          Eq. 20! 
    
     
         C.sub.4 =Ks*YA.sub.4 +Ks*YB.sub.4,                          Eq. 21! 
    
     
         C.sub.3 =Ks*YA.sub.3 +Ks*YB.sub.3,                          Eq. 22! 
    
     
         C.sub.2 =Ks*YA.sub.2 +Ks*YB.sub.2,                          Eq. 23! 
    
     
         C.sub.1 =Ks*YA.sub.1 +Ks*YB.sub.1,                          Eq. 24! 
    
     
         C.sub.0 =Ks*YA.sub.0 +Ks*YB.sub.0,                          Eq. 25! 
    
     Here Ks is a bit representing the current state, and it is the bit Ns provided at a next state output, 17, of encoder 15 delayed by one state transition, or clock period, in a clocked one bit delay register, 18, having its next state input, 19, connected to encoder output 17. The system clock signal is also provided to register 18 at a clocking input, 20, thereof. An output, 21, of register 18 is connected to a current state input, 22, of encoder 15. 
     In the corresponding decoder system for this 5/6 rate MTR code shown in block diagram form in FIG. 4B, output data words formed of five bits A 4 , A 3 , A 2 , A 1  and A 0  are recovered based on successive pairs of input code words of six bits each taken from a sequence thereof where each input code word in such a pair occurs in succession the sequence thereof. Current code words, provided by bits C 5 , C 4 , C 3 , C 2 , C 1  and C 0 , carry the information as to corresponding current states of the encoder, and the code word next following the current code word, provided by the bits C 11 ,C 10 ,C 9 ,C 8 ,C 7 , and C 6 , carries the information as to the corresponding next encoder state. Together, they point to the corresponding unique data word to result from the decoding process in the decoder. 
     In this decoder system, each input code word of six bits is successively supplied to a clocked six bit input register, 30, at a system input, 31, during a corresponding period of the system clocking signal supplied at a clock signal input, 32. Each such input data word stored in input register 30 represents the following or next code word (C 11 ,C 10 ,C 9 ,C 8 ,C 7 ,C 6 ) after storage in input register 30, but is transferred during the next clock period from an output, 33, of that register into an input, 34, of another clocked six bit holding register, 35, where it becomes the current code word (C 5 ,C 4 , C 3 , C 2 ,C 1 ,C 0 ) after storage therein. The system clock signal is also applied to a clocking input, 36, of register 35. The new input code word stored in input register 30 during the time the preceding code word is stored in holding register 35 then becomes the next code word during the time held in register 30. 
     The code word in input register 30, as the next code word, is also supplied at output 33 thereof to a first input, 37, as is the current code word from an output, 38, of delay register 35 to a second input, 39, of a code word legality checker, 40. If the six code bits in any code word received form an illegal code word representing an eliminated six bit word (any of the words that were eliminated in forming Groups A, B, C, (D&#39; and D&#34; above), a flag signal taking a Boolean value of 1 at the output of checker 40 will indicate so as a basis for a user to arrange some corresponding action if desired. This flag signal LL as implemented in checker 40 can be expressed as: 
     
         LL=L.sub.1 +L.sub.2 +L.sub.3 +L.sub.4,                      Eq. 26! 
    
     where 
     
         L.sub.1 =C.sub.5 *C.sub.4 *C.sub.3 +C.sub.4 *C.sub.3 *C.sub.2 +C.sub.3 *C.sub.2 *C.sub.1 +C.sub.2 *C.sub.1 *C.sub.0,              Eq. 27! 
    
     
         L.sub.2 =C.sub.5 *C.sub.4 *C.sub.3 *C.sub.2 *C.sub.1,       Eq. 28! 
    
     
         L.sub.3 =C.sub.11 *C.sub.10 *C.sub.9 +C.sub.10 *C.sub.9 *C.sub.8 +C.sub.9 *C.sub.8 *C.sub.7 +C.sub.8 *C.sub.7 *C.sub.6,              Eq. 29! 
    
     
         L.sub.4 =C.sub.11 *C.sub.10 *C.sub.9 *C.sub.8 *C.sub.7.     Eq. 30! 
    
     The current states of the received code words imposed by the encoder can be expressed by the equations: 
     
         Ts.sub.0 =(C.sub.5 *C.sub.0)+(C.sub.5 *C.sub.0)+(G.sub.1 *H.sub.10), Eq. 31! 
    
     
         Ts.sub.1 =(C.sub.5 *C.sub.0)+(C.sub.5 *C.sub.0 *(C.sub.4 +C.sub.4 *(C.sub.3 +(C.sub.3 *C.sub.1)))),                                    Eq. 32! 
    
     where G 1  and H 10  are defined below. Ts 0  =1 indicates state S 0  is the current state and Ts 1  =1 indicates state S 1  is the current state. These two states can be represented in one bit by Ks by 
     
         Ks=Ts.sub.1.                                                Eq. 33! 
    
     Rather than using the expression preceding the last directly to form the last expression to obtain the current state, the decoder system determines the next state and then delays use of it for one state transition to thereby then have it represent the current state. This is accomplished through the code word in input register 30, as the next code word, being also supplied at output 33 thereof to an input, 41, of a state determiner, 42. The next states of the encoder corresponding to the input code words received in input register 30 can be expressed by the equation: 
     
         Ns=(C.sub.11 *C.sub.6)+(C.sub.11 *C.sub.6 *(C.sub.10 +C.sub.10 *(C.sub.9 +(C.sub.9 *C.sub.7)))).                                    Eq. 34! 
    
     Ns=0 indicates state S 0  is the next state, and Ns=1 indicates state S 1  is the next state. This expression, implemented in determiner 42, provides the next state at an output, 43, thereof connected to an input, 44, of a clocked one bit delay register, 45, having an output, 46, at which is provided the current state indication. Delay register 45 also has a further clocking input, 47, to receive the system clock signal. 
     Output 46 of delay register 45 is connected to a first input, 48, and output 38 of holding register 35 is connected to a second input, 49, of a decoder, 50, to thereby provide the current state indication and the current code word to that decoder. In addition, output 43 of state determiner 42 is connected to decoder 50 at a third input, 51, thereof to provide the next state indication thereto. For the implementation of the decoding logic gates in decoder 50, the code words are divided into four groups A&#39;=A+D&#34;, B, C and D&#39; as described above taking into account the final adjustments made in the assignment of code words to transition branchings from the states. Code words can be identified as belonging to these groups by the corresponding variables K a , K b , K c  and K d  in the expressions below taking a Boolean value of 1: 
     
         Group A&#39;) K.sub.a =(C.sub.5 *C.sub.0)+(G.sub.1 *H.sub.10),  Eq. 35! 
    
     
         Group B) K.sub.b =C.sub.5 *C.sub.0,                         Eq. 36! 
    
     
         Group C&#39;) K.sub.c =(C.sub.5 *C.sub.0)*(C.sub.4 +C.sub.3 +C.sub.2 +C.sub.1), Eq. 37! 
    
     
         Group D&#39;) K.sub.d =C.sub.5 *C.sub.0 *(C.sub.4 +C.sub.4 *(C.sub.3 +(C.sub.3 *C.sub.1))).                                               Eq. 38! 
    
     Here, the code word taken from Group D to thereby form Group D&#34; as described above has been added to Group A to form Group A&#39; leaving Group D&#39; consisting of the rest of former Group D. Group C&#39; is formed from Group C less the word eliminated therefrom above. 
     The data word bits recovered from received code words arising on branchings from state S 0  during state transitions as set out in the table of FIG. 3 can be expressed as follows for use in decoder 50 based on the variables for identifying code words from Groups A&#39; and B: 
     
         XA.sub.4 =(K.sub.a *(C.sub.4 +C.sub.3 *C.sub.2))+(K.sub.b *N.sub.s), Eq. 39! 
    
     
         XA.sub.3 =K.sub.a +(K.sub.b *(C.sub.4 *(C.sub.2 +C.sub.1))), Eq. 40! 
    
     
         XA.sub.2 =(K.sub.a *(C.sub.4 +C.sub.1 +H.sub.5 +H.sub.9))+(K.sub.b *(C.sub.3 +(C.sub.4 *C.sub.2 *C.sub.1))),                  Eq. 41! 
    
     
         XA.sub.1 =(K.sub.a *(C.sub.3 +H.sub.1))+(K.sub.b *C.sub.2), Eq. 42! 
    
     
         XA.sub.0 =(K.sub.a *(C.sub.2 +C.sub.5 +G.sub.2 *(H.sub.1 +H.sub.11)))+(K.sub.b *C.sub.1),                           Eq. 43! 
    
     where the corresponding Boolean variables G x  and H x  are defined below. 
     The data word bits recovered from received code words arising on branchings from state S 1  during state transitions as set out in the table of FIG. 3 can be expressed as follows again for use in decoder 50 but based on the variables for identifying code words from Groups C and D&#34;: 
     
         XB.sub.4 =(K.sub.c *C.sub.4)+(K.sub.d *N.sub.s),            Eq. 44! 
    
     
         XB.sub.3 =K.sub.c +(K.sub.d *(C.sub.4 *C.sub.3 *(C.sub.2 +C.sub.1))), Eq. 45! 
    
     
         XB.sub.2 =(K.sub.c *H.sub.1 *H.sub.13)+(K.sub.d *((C.sub.4 *C.sub.3)+(C.sub.4 *C.sub.2 *C.sub.1))),                   Eq. 46! 
    
     
         XB.sub.1 =(K.sub.c *(C.sub.3 +H.sub.1))+(K.sub.d *C.sub.2), Eq. 47! 
    
     
         XB.sub.0 =(K.sub.c *(C.sub.2 +H.sub.1 +H.sub.11))+(K.sub.d *C.sub.1). Eq. 48! 
    
     The corresponding Boolean variables G x  and H x  used in the preceding decoding expressions for the data word bits are defined as follows: 
     
         G.sub.1 =C.sub.5 *C.sub.4                                   Eq. 50! 
    
     
         H.sub.1 =C.sub.3 *C.sub.2 *C.sub.1 *C.sub.0                 Eq. 51! 
    
     
         H.sub.5 =C.sub.3 *C.sub.2 *C.sub.1 *C.sub.0                 Eq. 52! 
    
     
         H.sub.9 =C.sub.3 *C.sub.2 *C.sub.1 *C.sub.0                 Eq. 53! 
    
     
         H.sub.10 =C.sub.3 *C.sub.2 *C.sub.1 *C.sub.0                Eq. 54! 
    
     
         H.sub.11 =C.sub.3 *C.sub.2 *C.sub.1 *C.sub.0                Eq. 55! 
    
     
         H.sub.13 =C.sub.3 *C.sub.2 *C.sub.1 *C.sub.0                Eq. 56! 
    
     The output data words of the encoder are provided by the code word bits A 4 , A 3 , A 2 , A 1  and A 0  at the output of decoder 50 formed by selecting the proper one of the corresponding two preceding data word bit expressions through use of the next state expression delayed by one state transition (or one system clock period) to provide the current state indication, the expressions therefor being as follows: 
     
         A.sub.4 =Ks*XA.sub.4 +Ks*XB.sub.4,                          Eq. 57! 
    
     
         A.sub.3 =Ks*XA.sub.3 +Ks*XB.sub.3,                          Eq. 58! 
    
     
         A.sub.2 =Ks*XA.sub.2 +Ks*XB.sub.2,                          Eq. 59! 
    
     
         A.sub.1 =Ks*XA.sub.1 +Ks*XB.sub.1,                          Eq. 60! 
    
     
         A.sub.0 =Ks*XA.sub.0 +Ks*XB.sub.0,                          Eq. 61! 
    
     Ks is the current state indication provided at the output of delay register 45. 
     A further maximum transition run code example is provided by such a code having a 6/7 rate with MTR=2 and k=9 using a 4-state trellis diagram as shown in FIG. 5 with again the branches shown representing several branches in parallel. To implement this code, all of the possible 7-bit blocks or words, excluding those not satisfying MTR=2, are divided into four groups of possible code words based on those bit patterns involving the end bits of each such word just as was done for the 5/6 rate code design above. As a result, there are 17 such blocks or words in Group A with the bit pattern given therefor above, 20 such words in each of Groups B and C with the bit patterns corresponding to those patterns given above for those groups, and 23 such words in Group D with the corresponding bit pattern given therefor above, as shown in the table of FIG. 6. A 6/7 rate code needs 2 6  or 64 different code words for transitions from each state so that a different data word can be represented by each such transition from a state. The code words in these four groups have been found to be insufficient in number to implement such a code with this rate using either a 2-state or 3-state trellis. 
     To implement this code in a finite state machine represented by a 4-state trellis, we further restrict certain words for branchings from each state. Words arising on branchings from state S 0  may begin with any two bits including `11`, and so words arising on branchings leading to state S 0  must end with `0` to satisfy MTR=2 in code word concatenations arising from branchings into and out of that state. Words arising on branchings from state S 1  may only begin with `10`, and so words arising on branchings to state S 1  may end with `00` or `01` again to satisfy MTR=2 in code word concatenations arising from branchings into and out of that state. Words arising on branchings from either of states S 2  and S 3  only begin with `0`, and so any words arising on branchings leading to states S 2  and S 3  are satisfactory. With these restrictions, the four groups of words indicated above can be further divided into subgroups as follows: 
     Group A: 
     Group AA: `11XXX11` (2 different words), 
     Group AB: `11XXX01` (4 different words), 
     Group AC: `10XXX11` (4 different words), 
     Group AD: `10XXX01` (7 different words), 
     Group B: 
     Group BD: `10XXXX0` (13 different words), 
     Group BB: `11XXXX0` (7 different words), 
     Group C: 
     Group CD: `0XXXX01` (13 different words), 
     Group CC: `0XXXX11` (7 different words), 
     Group D: `0XXXXX0` (23 different words), 
     where X=`0` or `1`. Again, code words arising from branchings from in each state must be unique in order for the code words to be uniquely decodable and to limit any error propagation. Group D is further divided into two groups (D&#39; and D&#34; ) such that sixteen words therein are used in one state and the other seven words are used in another state. To satisfy the 64 different words per state requirement, we may assign the words to branches as follows: 
     From S 0  to S 0  : BB (7 different words), 
     From S 0  to S 1  : AB and BB (4+7=11 different words), 
     From S 0  to S 2  : AA, AB, AC, BB and CC (2+4+4+7+7=24 different words), 
     From S 0  to S 3  : AA, AB, AC, BB and CC (2+4+4+7+7=24 different words), 
     From S 1  to S 0  : BD (13 different words), 
     From S 1  to S 1  : AD and BD (7+13=20 different words), 
     From S 1  to S 2  : AD and BD (7+13=20 different words), 
     From S 1  to S 3  : AD and BD (7+13=20 different words), 
     From S 2  to S 0  : D&#39; (7 different words), 
     From S 2  to S 1  : CD and D&#39; (13+7=20 different words), 
     From S 2  to S 2  : CD and D&#39; (13+7=20 different words), 
     From S 2  to S 3  : CD and D&#39; (13+7=20 different words), 
     From S 3  to S 0  : D&#34; (16 different words), 
     From S 3  to S 1  : D&#34; (16 different words), 
     From S 3  to S 2  : D&#34; (16 different words), 
     From S 3  to S 3  : D&#34; (16 different words). 
     There is a total of 66 different words for S 0 , a total of 73 different words for S 1 , a total of 67 different words for S 2 , and a total of 64 different words for S 3  as shown in the table of FIG. 7. This satisfies the minimum requirement of a total of 64 different words per state with some to spare. Some adjustment can be made in order to keep the &#34;k&#34; constraint small. Words `1000000` from Group BD and `0000001` from Group CD are eliminated to avoid long runs of zero to form Groups BD&#39; and CD&#39;. Word `1000001` of Group AD is moved to transition from state S 0 . Word `0000011` of Group CC is moved to transition from state S 2 . FIG. 8 shows the next state table of the resulting maximum transition run code having a 6/7 rate with MTR=2 and k=9. The k=9 constraint is equaled when either of the code words `1010000` or `0010000` is followed by either of code words `0000010` or `0000011` in sequence. 
     In the encoder for implementing this maximum transition run code having a 6/7 rate shown in block diagram form in FIG. 9A comprising a finite state machine based on FIG. 8, each data word of six bits (A 5 , A 4 , A 3 , A 2 , A 1 , A 0 ) is successively supplied to a clocked six bit input register, 60, at a system input, 61, during a corresponding period of the system clocking signal supplied at a clock signal input, 62. Each such input data word stored in input register 60 is transferred during the next clock period from an output, 63, of that register into an input, 64, of an encoder, 65, comprising a finite state machine based on the table in FIG. 8 to be encoded into a code word of seven bits (C 6 , C 5 , C 4 , C 3 , C 2 , C 1 , C 0 ) provided at a code word output, 66, of that encoder. 
     The data words associated with code words of Group BD&#39; for branching from state S 1  (located by their hex values in FIGS. 7 and 8), and those data words associated with code words of Group CD&#39; for branching from state S 2  (similarly located) can be identified by the following equations taking a Boolean value of 1: 
     
         K.sub.bd =(A.sub.3 *H.sub.0 *H.sub.7)+(A.sub.3 *H.sub.14 *H.sub.15) Eq. 62! 
    
     and 
     
         K.sub.cd =((A.sub.3 *H.sub.0 *H.sub.7)+(A.sub.3 *H.sub.14 *H.sub.15))*(A.sub.4 +A.sub.5).                            Eq. 63! 
    
     The corresponding Boolean variables H x  are defined below. 
     The code word bits of the code words for branchings from state S 0  in the table of FIG. 8 can be expressed as follows for use in encoder 65: 
     
         YA.sub.6 =A.sub.5 +(A.sub.5 *(A.sub.3 +H.sub.0 +H.sub.7)),  Eq. 64! 
    
     
         YA.sub.5 =(H.sub.15 *(G.sub.0 +(G.sub.1 *(A.sub.3 +A.sub.2))))+A.sub.5 *H.sub.8 *H.sub.15 *(A.sub.3 *A.sub.0 +H.sub.0 +A.sub.3),  Eq. 65! 
    
     
         YA.sub.4 =(G.sub.1 *(H.sub.5 +H.sub.7))+A.sub.5 *(H.sub.2 +H.sub.3 +H.sub.6 +H.sub.15),                                                Eq. 66! 
    
     
         YA.sub.3 =((G.sub.0 +G.sub.1)*A.sub.3 *A.sub.1)+(A.sub.3 *A.sub.2 *H.sub.15)+((A.sub.5 +A.sub.4)*A.sub.3 *A.sub.2),          Eq. 67! 
    
     
         YA.sub.2 =(G.sub.0 *A.sub.3 *A.sub.0)+(A.sub.3 *A.sub.1 *H.sub.15)+(G.sub.1 *A.sub.3 *A.sub.2 *A.sub.0),                               Eq. 68! 
    
     
         YA.sub.1 =(A.sub.3 *A.sub.0)+(A.sub.4 *A.sub.3 *A.sub.2)+(A.sub.5 *A.sub.3), Eq. 69! 
    
     
         YA.sub.0 =(A.sub.3 +H.sub.15)+(A.sub.5 *H.sub.8),           Eq. 70! 
    
     where the corresponding Boolean variables G x  and H x  are defined below. 
     The two bits representing the next state for the code words for branchings from state S 0  out of the four possible next states can be expressed as follows for use in encoder 65: 
     
         NA.sub.1 =A.sub.5 +(G.sub.0 *(A.sub.3 +H.sub.15))+(G.sub.1 *(A.sub.3 *A.sub.2 +H.sub.15)),                                      Eq. 71! 
    
     
         NA.sub.0 =(G.sub.0 *A.sub.3 *A.sub.2)+(G.sub.1 *H.sub.4 *H.sub.5)+G.sub.3. Eq. 72! 
    
     The code word bits of the code words for branchings from state S 1  in the table of FIG. 8 can be expressed as follows for use in encoder 65: 
     
         YB.sub.6 =1                                                 Eq. 73! 
    
     
         YB.sub.5 =0                                                 Eq. 74! 
    
     
         YB.sub.4 =(K.sub.bd *A.sub.3)+H.sub.14 +H.sub.15            Eq. 75! 
    
     
         YB.sub.3 =(K.sub.bd *A.sub.2)+H.sub.7 +(H.sub.15 *(A.sub.4 +A.sub.5))+(H.sub.0 *A.sub.4 *A.sub.5)                     Eq. 76! 
    
     
         YB.sub.2 =(K.sub.bd *A.sub.1)+H.sub.0 +(H.sub.14 *(A.sub.4 +A.sub.5))+(H.sub.7 *A.sub.4 *A.sub.5)                     Eq. 77! 
    
     
         YB.sub.1 =(K.sub.bd *A.sub.0)                               Eq. 78! 
    
     
         YB.sub.0 =K.sub.bd                                          Eq. 79! 
    
     The two bits representing the next state for the code words for branchings from state S 1  can be expressed as follows for use in encoder 65: 
     
         NB.sub.1 =A.sub.5 +((H.sub.0 +H.sub.7 +H.sub.14 +H.sub.15)*G.sub.0) Eq. 80! 
    
     
         NB.sub.0 =A.sub.4 +(A.sub.2 *A.sub.1 *A.sub.0 *G.sub.0)     Eq. 81! 
    
     The code word bits of the code words for branchings from state S 2  in the table of FIG. 8 can be expressed as follows for use in encoder 65: 
     
         YC.sub.6 =0                                                 Eq. 82! 
    
     
         YC.sub.5 =(K.sub.cd *A.sub.0)+H.sub.14 +H.sub.15 +H.sub.5 +H.sub.13 Eq. 83! 
    
     
         YC.sub.4 =(K.sub.cd *A.sub.1)+(A.sub.1 *A.sub.2)+(G.sub.0 *(H.sub.1 +H.sub.4 +H.sub.9 +H.sub.12))                              Eq. 84! 
    
     
         YC.sub.3 =(K.sub.cd *A.sub.2)+(G.sub.0 *(A.sub.2 *(A.sub.1 +A.sub.0)))+H.sub.4 +H.sub.7 +H.sub.12 +H.sub.15           Eq. 85! 
    
     
         YC.sub.2 =(K.sub.cd *A.sub.3)+H.sub.7 +H.sub.15             Eq. 86! 
    
     
         YC.sub.1 =(G.sub.0 *A.sub.0)+H.sub.0 +H.sub.14              Eq. 87! 
    
     
         YC.sub.0 =K.sub.cd +H.sub.6 +H.sub.8                        Eq. 88! 
    
     The two bits representing the next state for the code words for branchings from state S 2  can be expressed as follows for use in encoder 65: 
     
         NC.sub.1 =A.sub.5 +(G.sub.0 *((A.sub.3 *A.sub.2)+H.sub.6 +H.sub.12)) Eq. 89! 
    
     
         NC.sub.0 =A.sub.4 +(G.sub.0 *(H.sub.3 +H.sub.4 +H.sub.5 +H.sub.6 +H.sub.11 +H.sub.12))                                                Eq. 90! 
    
     The code word bits of the code words for branchings from state S 3  in the table of FIG. 8 can be expressed as follows for use in encoder 65: 
     
         YD.sub.6 =0                                                 Eq. 91! 
    
     
         YD.sub.5 =A.sub.3                                           Eq. 92! 
    
     
         YD.sub.4 =A.sub.2                                           Eq. 93! 
    
     
         YD.sub.3 =A.sub.2 *A.sub.1                                  Eq. 94! 
    
     
         YD.sub.2 =(A.sub.2 *A.sub.1)+(A.sub.2 *A.sub.1)             Eq. 95! 
    
     
         YD.sub.1 =A.sub.0                                           Eq. 96! 
    
     
         YD.sub.0 =0                                                 Eq. 97! 
    
     The two bits representing the next state for the code words for branchings from state S 3  can be expressed as follows for use in encoder 65: 
     
         ND.sub.1 =A.sub.5                                           Eq. 98! 
    
     
         ND.sub.0 =A.sub.4                                           Eq. 99! 
    
     The corresponding Boolean variables G x  and H x  used in the preceding encoding expressions for the code word bits are defined as follows: 
     
         G.sub.0 =A.sub.5 *A.sub.4                                   Eq. 100! 
    
     
         G.sub.1 =A.sub.5 *A.sub.4                                   Eq. 101! 
    
     
         G.sub.2 =A.sub.5 *A.sub.4                                   Eq. 102! 
    
     
         G.sub.3 =A.sub.5 *A.sub.4                                   Eq. 103! 
    
     
         H.sub.0 =A.sub.3 *A.sub.2 *A.sub.1 *A.sub.0                 Eq. 104! 
    
     
         H.sub.1 =A.sub.3 *A.sub.2 *A.sub.1 *A.sub.0                 Eq. 105! 
    
     
         H.sub.2 =A.sub.3 *A.sub.2 *A.sub.1 *A.sub.0                 Eq. 106! 
    
     
         H.sub.3 =A.sub.3 *A.sub.2 *A.sub.1 *A.sub.0                 Eq. 107! 
    
     
         H.sub.4 =A.sub.3 *A.sub.2 *A.sub.1 *A.sub.0                 Eq. 108! 
    
     
         H.sub.5 =A.sub.3 *A.sub.2 *A.sub.1 *A.sub.0                 Eq. 109! 
    
     
         H.sub.6 =A.sub.3 *A.sub.2 *A.sub.1 *A.sub.0                 Eq. 110! 
    
     
         H.sub.7 =A.sub.3 *A.sub.2 *A.sub.1 *A.sub.0                 Eq. 111! 
    
     
         H.sub.8 =A.sub.3 *A.sub.2 *A.sub.1 *A.sub.0                 Eq. 112! 
    
     
         H.sub.9 =A.sub.3 *A.sub.2 *A.sub.1 *A.sub.0                 Eq. 113! 
    
     
         H.sub.10 =A.sub.3 *A.sub.2 *A.sub.1 *A.sub.0                Eq. 114! 
    
     
         H.sub.11 =A.sub.3 *A.sub.2 *A.sub.1 *A.sub.0                Eq. 115! 
    
     
         H.sub.12 =A.sub.3 *A.sub.2 *A.sub.1 *A.sub.0                Eq. 116! 
    
     
         H.sub.13 =A.sub.3 *A.sub.2 *A.sub.1 *A.sub.0                Eq. 117! 
    
     
         H.sub.14 =A.sub.3 *A.sub.2 *A.sub.1 *A.sub.0                Eq. 118! 
    
     
         H.sub.15 =A.sub.3 *A.sub.2 *A.sub.1 *A.sub.0                Eq. 119! 
    
     The output code words of the encoder are formed by the code word bits C 6 , C 5 , C 4 , C 3 , C 2 , C 1  and C 0  formed by selecting the proper one of the corresponding preceding code word bit expressions from each of the four sets thereof through use of the next state expression associated therewith delayed by one state transition (or one system clock period) to provide the current state indication therefor, the expressions for the seven code word bits being as follows: 
     
         C.sub.6 =(Ks.sub.1 *Ks.sub.0)*YA.sub.6 +(Ks.sub.1 *Ks.sub.0)*YB.sub.6 +(Ks.sub.1 *Ks.sub.0)*YC.sub.6 +(Ks.sub.1 *Ks.sub.0)*YD.sub.6 Eq. 120! 
    
     
         C.sub.5 =(Ks.sub.1 *Ks.sub.0)*YA.sub.5 +(Ks.sub.1 *Ks.sub.0)*YB.sub.5 +(Ks.sub.1 *Ks.sub.0)*YC.sub.5 +(Ks.sub.1 *Ks.sub.0)*YD.sub.5 Eq. 121! 
    
     
         C.sub.4 =(Ks.sub.1 *Ks.sub.0)*YA.sub.4 +(Ks.sub.1 *Ks.sub.0)*YB.sub.4 +(Ks.sub.1 *Ks.sub.0)*YC.sub.4 +(Ks.sub.1 *Ks.sub.0)*YD.sub.4 Eq. 122! 
    
     
         C.sub.3 =(Ks.sub.1 *Ks.sub.0)*YA.sub.3 +(Ks.sub.1 *Ks.sub.0)*YB.sub.3 +(Ks.sub.1 *Ks.sub.0)*YC.sub.3 +(Ks.sub.1 *Ks.sub.0)*YD.sub.3 Eq. 123! 
    
     
         C.sub.2 =(Ks.sub.1 *Ks.sub.0)*YA.sub.2 +(Ks.sub.1 *Ks.sub.0)*YB.sub.2 +(Ks.sub.1 *Ks.sub.0)*YC.sub.2 +(Ks.sub.1 *Ks.sub.0)*YD.sub.2 Eq. 124! 
    
     
         C.sub.1 =(Ks.sub.1 *Ks.sub.0)*YA.sub.1 +(Ks.sub.1 *Ks.sub.0)*YB.sub.1 +(Ks.sub.1 *Ks.sub.0)*YC.sub.1 +(Ks.sub.1 *Ks.sub.0)*YD.sub.1 Eq. 125! 
    
     
         C.sub.0 =(Ks.sub.1 *Ks.sub.0)*YA.sub.0 +(Ks.sub.1 *Ks.sub.0)*YB.sub.0 +(Ks.sub.1 *Ks.sub.0)*YC.sub.0 +(Ks.sub.1 *Ks.sub.0)*YD.sub.0 Eq. 126! 
    
     The associated next state is selected in the same manner resulting in the two bits representing the next state being expressed as follows: 
     
         Ns.sub.1 =(Ks.sub.1 *Ks.sub.0)*NA.sub.1 +(Ks.sub.1 *Ks.sub.0)*NB.sub.1 +(Ks.sub.1 *Ks.sub.0)*NC.sub.1 +(Ks.sub.1 *Ks.sub.0)*ND.sub.1 Eq. 127! 
    
     
         Ns.sub.0 =(Ks.sub.1 *Ks.sub.0)*NA.sub.0 +(Ks.sub.1 *Ks.sub.0)*NB.sub.0 +(Ks.sub.1 *Ks.sub.0)*NC.sub.0 +(Ks.sub.1 *Ks.sub.0)*ND.sub.0 Eq. 128! 
    
     where (Ks 1 ,Ks 0 ) is an ordered pair of bits representing the current state. (Ks 1 , Ks 0 ) equal to the Boolean values (0,0) represents state S 0 , equal to (0,1) represents state S 1 , equal to (1,0) represents state S 2  and equal to (1,1) represents state S 3 . Here (Ks 1 ,Ks 0 ) are bits representing the current state, and are the bits (Ns 1 ,Ns 0 ) provided at a next state output, 67, of encoder 65 delayed by one state transition, or clock period, in a clocked two bit delay register, 68, having its next state input, 69, connected to encoder output 67. The system clock signal is also provided to register 68 at a clocking input, 70, thereof. An output, 71, of register 68 is connected to a current state input, 72, of encoder 65. 
     In the corresponding decoder system for this 6/7 rate MTR code shown in block diagram form in FIG. 9B, output data words formed of six bits A 5 , A 4 , A 3 , A 2 , A 1  and A 0  are recovered based on successive pairs of input code words of seven bits each taken from the sequence of code words where each input code word in such a pair is in succession in the sequence thereof. Current code words, formed of the bits C 6 , C 5 , C 4 , C 3 , C 2 , C 1  and C 0 , provide the information as to the corresponding current states of the encoder, and the next following code word of each current code word, formed by the bits C 13 , C 12 , C 11 , C 10 , C 9 , C 8  and C 7 , provides the information as to the corresponding next state. Together, they point to the corresponding unique data word to result from the decoding. 
     In this decoder system, each input code word of seven bits is successively supplied to a clocked seven bit input register, 80, at a system input, 81, during a corresponding period of the system clocking signal supplied at a clock signal input, 82. Each such input data word stored in input register 80 represents the following or next code word (C 13 , C 12 , C 11 , C 10 , C 9 , C 8 , C 7 ) after storage in input register 80, but is transferred during the next clock period from an output, 83, of that register into an input, 84, of another clocked seven bit holding register, 85, where it becomes the current code word (C 6 , C 5 , C 4 , C 3 , C 2 , C 1 , C 0 ) after storage therein. The system clock signal is also applied to a clocking input, 86, of register 85. The new input code word stored in input register 80 during the time the preceding code word is stored in holding register 85 then becomes the next code word during the time held in register 80. 
     The code word in input register 80, as the next code word, is also supplied at output 83 thereof to a first input, 87, as is the current code word from an output, 88, of delay register 85 to a second input, 89, of a code word legality checker, 90. If the seven code bits in any code word received form an illegal code word representing an eliminated seven bit word (any of the words that were eliminated in forming Groups AA, AB, AC, AD, BB, BD&#39;, CC, CD&#39;, D&#39; and D&#34; above), a flag signal taking a Boolean value of 1 at the output of checker 90 will indicate so as a basis for a user to arrange some corresponding action if desired. This flag signal LL as implemented in checker 90 can be expressed as: 
     
         LL=L.sub.1 +L.sub.2 +L.sub.3 +L.sub.4,                      Eq. 129! 
    
     where 
     
         L.sub.1 =C.sub.6 *C.sub.5 *C.sub.4 +C.sub.5 *C.sub.4 *C.sub.3 +C.sub.4 *C.sub.3 *C.sub.2 +C.sub.3 *C.sub.2 *C.sub.1 +C.sub.2 *C.sub.1 *C.sub.0, Eq. 130! 
    
     
         L.sub.2 =C.sub.6 *C.sub.5 *C.sub.4 *C.sub.3 *C.sub.2 *C.sub.1 +C.sub.5 *C.sub.4 *C.sub.3 *C.sub.2 *C.sub.1 *C.sub.0,              Eq. 131! 
    
     
         L.sub.3 =C.sub.13 *C.sub.12 *C.sub.11 +C.sub.12 *C.sub.11 *C.sub.10 +C.sub.11 *C.sub.10 *C.sub.9 +C.sub.10 *C.sub.9 *C.sub.8 +C.sub.9 *C.sub.8 *C.sub.7,                                                  Eq. 132! 
    
     
         L.sub.4 =C.sub.13 *C.sub.12 *C.sub.11 *C.sub.10 *C.sub.9 *C.sub.8 +C.sub.12 *C.sub.11 *C.sub.10 *C.sub.9 *C.sub.8 *C.sub.7.            Eq. 133! 
    
     The code words can be divided into groups AA, AB, AC, AD&#39;, BB, BD, CC&#39;, CD, D&#39; and D&#34; as described above. Group AD&#39; is formed by removing code word 1000001 therefrom as indicated above, and its occurrence in a transition from state S 0  is provided for directly in the decoder data word digit expressions below. Similarly, Group CC&#39; is formed by removing code word 0000011 therefrom as indicated above, and its occurrence in a transition from state S 2  is also provided for directly in the decoder data word digit expressions below. Groups BD and CD are used rather than Groups BD&#39; and CD&#39; resulting from the removal of code words 1000000 and 0000001 therefrom, respectively, as indicated above, and relying on signal LL to indicate their occurrence. Current state code words can be identified as belonging to Groups AA, AB, AC, AD&#39;, BB, BD, CC&#39;, CD, D&#39; and D&#34; by the corresponding variables K aa , K ab , K ac , K ad , K bb , K bd , K cc , K cd , K d&#39;  and K d&#34;  in the expressions below taking a Boolean value of 1: 
     
         Group AA) K.sub.aa =C.sub.6 *C.sub.5 *C.sub.1 *C.sub.0,     Eq. 134! 
    
     
         Group AB) K.sub.ab =C.sub.6 *C.sub.5 *C.sub.1 *C.sub.0,     Eq. 135! 
    
     
         Group AC) K.sub.ac =C.sub.6 *C.sub.5 *C.sub.1 *C.sub.0,     Eq. 136! 
    
     
         Group AD&#39;) K.sub.ad =C.sub.6 *C.sub.5 *(C.sub.4 +C.sub.3 +C.sub.2)*C.sub.1 *C.sub.0,                                                  Eq. 137! 
    
     
         Group BB&#39;) K.sub.bb =C.sub.6 *C.sub.5 *C.sub.0,             Eq. 138! 
    
     
         Group BD) K.sub.bd =C.sub.6 *C.sub.5 *C.sub.0,              Eq. 139! 
    
     
         Group CC&#39;) K.sub.cc =C.sub.6 *C.sub.1 *C.sub.0 *(C.sub.5 +C.sub.4 +C.sub.3), Eq. 140! 
    
     
         Group CD) K.sub.cd =C.sub.6 *C.sub.1 *C.sub.0,              Eq. 141! 
    
     
         Group D&#34;) K.sub.d&#34; =C.sub.6 *C.sub.0 *(C.sub.3 *(C.sub.4 +C.sub.2)+C.sub.4 *C.sub.3 *C.sub.2),                                        Eq. 142! 
    
     
         Group D&#39;) K.sub.d&#39; =C.sub.6 *C.sub.0 *K.sub.d&#34;.             Eq. 143! 
    
     The current states of the received code words imposed by the encoder can be expressed by the equations: 
     
         Ts.sub.0 =K.sub.aa +K.sub.ab +K.sub.ac +K.sub.bb +K.sub.cc +(C.sub.6 *C.sub.4 *C.sub.3 *C.sub.2 *C.sub.1),                      Eq. 144! 
    
     
         Ts.sub.1 =K.sub.ad +K.sub.bd,                               Eq. 145! 
    
     
         Ts.sub.2 =K.sub.cd +K.sub.d&#39; +(C.sub.6 *C.sub.5 *C.sub.4 *C.sub.3 *C.sub.0), Eq. 146! 
    
     
         Ts.sub.3 =K.sub.d&#39;.                                         Eq. 147! 
    
     The occurrence of Ts 0 , Ts 1 , Ts 2  or Ts 3  taking a Boolean value of 1 indicates that the current state is the corresponding one of states S 0 , S 1 , S 2  and S 3 . These possible current four states can be represented in two bits by Ks 1 ,Ks 0  as follows: 
     
         Ks.sub.0 =Ts.sub.0 *Ts.sub.1 +Ts.sub.3,                     Eq. 148! 
    
     
         Ks.sub.1 =Ts.sub.0 *Ts.sub.2 +Ts.sub.3.                     Eq. 149! 
    
     (Ks 1 ,Ks 0 ) is an ordered pair of bits representing the current state. (Ks 1 ,Ks 0 ) equal to (0,0) represents state S 0 , equal to (0,1) represents state S 1 , equal to (1,0) represents state S 2  and equal to (1,1) represents state S 3 . 
     Rather than using those expressions directly preceding the last two expressions to form these last two expression to obtain the current state, the decoder system determines the next state and then delays use of it for one state transition to thereby then have it represent the current state. This is accomplished through the code word in input register 80, as the next code word, being also supplied at output 83 thereof to an input, 91, of a state determiner. 92. Next state code words can be identified as belonging to Groups AA, AB, AC, AD&#39;, BB, BD, CC&#39;, CD, D&#39; and D&#34; by the corresponding variables KK aa , KK ab , KK ac , KK ad , KK bb , KK bd , KK cc , KK cd , KK d&#39;  and KK d&#34;  in the expressions below taking a Boolean value of 1: 
     
         Group AA) KK.sub.aa =C.sub.13 *C.sub.12 *C.sub.8 *C.sub.7,  Eq. 150! 
    
     
         Group AB) KK.sub.ab =C.sub.13 *C.sub.12 *C.sub.8 *C.sub.7,  Eq. 151! 
    
     
         Group AC) KK.sub.ac =C.sub.13 *C.sub.12 *C.sub.8 *C.sub.7,  Eq. 152! 
    
     
         Group AD&#39;) KK.sub.ad =C.sub.13 *C.sub.12 *(C.sub.11 +C.sub.10 +C.sub.9)*C.sub.8 *C.sub.7,                                Eq. 153! 
    
     
         Group BB&#39;) KK.sub.bb =C.sub.13 *C.sub.12 *C.sub.7,          Eq. 154! 
    
     
         Group BD) KK.sub.bd =C.sub.13 *C.sub.12 *C.sub.7,           Eq. 155! 
    
     
         Group CC&#39;) KK.sub.cc =C.sub.-- *C.sub.8 *C.sub.7 *(C.sub.12 +C.sub.11 +C.sub.10),                                                Eq. 156! 
    
     
         Group CD) KK.sub.cd =C.sub.13 *C.sub.8 *C.sub.7,            Eq. 157! 
    
     
         Group D&#34;) KK.sub.d&#34; =C.sub.13 *C.sub.7 *(C.sub.10 *(C.sub.11 +C.sub.9)+C.sub.11 *C.sub.10 *C.sub.9),                    Eq. 158! 
    
     
         Group D&#39;) KK.sub.d&#39; =C.sub.13 *C.sub.7 *KK.sub.d&#34;.          Eq. 159! 
    
     The next states of the encoder corresponding to the received code words can be expressed by the equations: 
     
         TTs.sub.0 =KK.sub.aa +KK.sub.ab +KK.sub.ac +KK.sub.bb +KK.sub.cc +(C.sub.13 *C.sub.11 *C.sub.10 *C.sub.9 *C.sub.8),                    Eq. 160! 
    
     
         TTs.sub.1 =KK.sub.ad +KK.sub.bd,                            Eq. 161! 
    
     
         TTs.sub.2 =KK.sub.cd +KK.sub.d&#39; +(C.sub.13 *C.sub.12 *C.sub.11 *C.sub.10 *C.sub.7),                                                 Eq. 162! 
    
     
         TTs.sub.3 =KK.sub.d&#34;.                                       Eq. 163! 
    
     The occurrence of TTs 0 , TTs 1 , TTs 2  or TTs 3  taking a Boolean value of 1 indicates that the next state is the corresponding one of states S 0 , S 1 , S 2  and S 3 . These possible four next states can be represented in two bits by Ns 1 , Ns 0  as follows: 
     
         Ns.sub.0 =TTs.sub.0 *TTs.sub.1 +TTs.sub.3,                  Eq. 164! 
    
     
         Ns.sub.1 =TTs.sub.0 *TTs.sub.2 +TTs.sub.3,                  Eq. 165! 
    
     (Ns 1 , Ns 0 ) is an ordered pair of bits representing the next state. (Ns 1 ,Ns 0 ) equal to the Boolean values (0,0) represents state S 0 , equal to (0,1) represents state S 1 , equal to (1,0) represents state S 2 , and equal to (1,1) represents state S 3 . 
     These expressions, implemented in determiner 92, provide the next state at an output, 93, thereof connected to an input, 94, of a clocked two bit delay register, 95, having an output, 96, at which is provided the current state indication. Delay register 95 also has a further clocking input, 97, to receive the system clock signal. Output 96 of delay register 95 is connected to a first input, 98, and output 88 of holding register 35 is connected to a second input, 99, of a decoder, 100, to thereby provide the current state indication and the current code word to that decoder. In addition, output 93 of state determiner 92 is connected to decoder 100 at a third input, 101, thereof to provide the next state indication thereto. 
     The data word bits recovered from received code words arising on branchings from state S 0  during state transitions as set out in the table of FIG. 8 can be expressed as follows for use in decoder 100 based on the variables for identifying code words from Groups AA, AB, AC, BB and CC: 
     
         XA.sub.5 =K.sub.aa +(C.sub.4 *C.sub.3 *K.sub.ac)+(NS.sub.1 *(K.sub.bb +K.sub.cc +PP)),                                           Eq. 166! 
    
     
         XA.sub.4 (Ns.sub.0 *(K.sub.aa +K.sub.bb +K.sub.cc +PP))+(Ns.sub.1 *K.sub.ab)+((C.sub.3 +Ns.sub.0)*K.sub.ac,                  Eq. 167! 
    
     
         XA.sub.3 =(C.sub.3 *K.sub.ac)+K.sub.bb +PP,                 Eq. 168! 
    
     
         XA.sub.2 =(C.sub.3 *(K.sub.aa +K.sub.bb +K.sub.cc))+(Ns.sub.0 *Ns.sub.1 *K.sub.ab)+K.sub.ac,                                       Eq. 169! 
    
     
         XA.sub.1 =(C.sub.3 *(K.sub.aa +K.sub.ab))+(C.sub.3 +C.sub.3 *Ns.sub.0))*K.sub.ac +(C.sub.2 *K.sub.bb)+(C.sub.4 *K.sub.cc), Eq. 170! 
    
     
         XA.sub.0 =(C.sub.3 *K.sub.aa)+(C.sub.2 *K.sub.ab)+(C.sub.3 +(C.sub.3 *C.sub.4))*K.sub.ac +(C.sub.1 *K.sub.bb)+(C.sub.5 *K.sub.cc), Eq. 171! 
    
     where 
     
         PP=(G.sub.6 *H.sub.0)+(G.sub.4 *H.sub.1),                   Eq. 172! 
    
     and G x  and H x  are defined below. 
     The data word bits recovered from received code words arising on branchings from state S 1  during state transitions as set out in the table of FIG. 8 can be expressed as follows for use in decoder 100 based on the variables for identifying code words from Groups AD&#39; and BD: 
     
         XB.sub.5 =Ns.sub.1 *(K.sub.bd +(H.sub.5 +H.sub.9)*K.sub.ad), Eq. 173! 
    
     
         XB.sub.4 =Ns.sub.0 *(K.sub.bd +(H.sub.5 +H.sub.9)*K.sub.ad), Eq. 174! 
    
     
         XB.sub.3 =C.sub.4 *(K.sub.bd +K.sub.ad),                    Eq. 175! 
    
     
         XB.sub.2 =(C.sub.3 *K.sub.bd)+(C.sub.4 +H.sub.9 +H.sub.13 *Ns.sub.0)*K.sub.ad,                                       Eq. 176! 
    
     
         XB.sub.1 =(C.sub.2 *K.sub.bd)+(C.sub.4 +H.sub.9 +H.sub.13 *Ns.sub.0)*K.sub.ad,                                       Eq. 177! 
    
     
         XB.sub.0 =(C.sub.1 *K.sub.bd)+(C.sub.3 *C.sub.2 +H.sub.5 *Ns.sub.0)*K.sub.ad.                                       Eq. 178! 
    
     The data word bits recovered from received code words arising on branchings from state S 2  during state transitions as set out in the table of FIG. 8 can be expressed as follows for use in decoder 100 based on the variables for identifying code words from Groups CD and D&#39;: 
     
         XC.sub.5 =(Ns.sub.1 *K.sub.cd)+((C.sub.4 *C.sub.1 +C.sub.3 *C.sub.2)*Ns.sub.1 *K.sub.d&#39;),                             Eq. 179! 
    
     
         XC.sub.4 =(Ns.sub.0 *K.sub.cd)+((C.sub.4 *C.sub.1 +C.sub.3 *C.sub.2)*Ns.sub.0 *K.sub.d&#39;),                             Eq. 180! 
    
     
         XC.sub.3 =(C.sub.2 *K.sub.cd)+(C.sub.4 *NS.sub.1 +C.sub.5 *(C.sub.2 +C.sub.1 +(C.sub.2 *C.sub.1 *Ns.sub.0)))*K.sub.d&#39; +(G.sub.0 *H.sub.3 *Ns.sub.0),                                                Eq. 181! 
    
     
         XC.sub.2 =(C.sub.3 *K.sub.cd)+(C.sub.4 *C.sub.1 *Ns.sub.0 +C.sub.3 *C.sub.2 +C.sub.5)*K.sub.d&#39; +(G.sub.0 *H.sub.3 *Ns.sub.0),          Eq. 182! 
    
     
         XC.sub.1 =(C.sub.4 *K.sub.cd)+(C.sub.4 *(C.sub.1 *Ns.sub.0 +C.sub.1 *Ns.sub.0)++C.sub.3 *C.sub.2 +C.sub.5 *C.sub.1)*K.sub.d&#39; +(G.sub.0 *H.sub.3 *Ns.sub.0),                                       Eq. 183! 
    
     
         XC.sub.0 =(C.sub.5 *K.sub.cd)+(C.sub.1 *K.sub.d&#39;).          Eq. 184! 
    
     The data word bits recovered from received code words arising on branchings from state S 3  during state transitions as set out in the table of FIG. 8 can be expressed as follows for use in decoder 100 based on the variables for identifying code words from Group D&#34;: 
     
         XD.sub.5 =NS.sub.1 *K.sub.d&#34;,                               Eq. 185! 
    
     
         XD.sub.4 =NS.sub.0 *K.sub.d&#34;,                               Eq. 186! 
    
     
         XD.sub.3 =C.sub.5 *K.sub.d&#34;,                                Eq. 187! 
    
     
         XD.sub.2 =C.sub.4 *K.sub.d&#34;,                                Eq. 188! 
    
     
         XD.sub.1 =(C.sub.4 *C.sub.2 +C.sub.4 *C.sub.2)*K.sub.d&#34;,    Eq. 189! 
    
     
         XD.sub.0 =C.sub.1 *K.sub.d&#34;,                                Eq. 190! 
    
     The corresponding Boolean variables G x  and H x  used in the preceding decoding expressions for the data word bits are defined as follows: 
     
         G.sub.0 =C.sub.6 *C.sub.5 *C.sub.4,                         Eq. 191! 
    
     
         G.sub.1 =C.sub.6 *C.sub.5 *C.sub.4,                         Eq. 192! 
    
     
         G.sub.2 =C.sub.6 *C.sub.5 *C.sub.4,                         Eq. 193! 
    
     
         G.sub.3 =C.sub.6 *C.sub.5 *C.sub.4,                         Eq. 194! 
    
     
         G.sub.4 =C.sub.6 *C.sub.5 *C.sub.4,                         Eq. 195! 
    
     
         G.sub.5 =C.sub.6 *C.sub.5 *C.sub.4,                         Eq. 196! 
    
     
         G.sub.6 =C.sub.6 *C.sub.5 *C.sub.4,                         Eq. 197! 
    
     
         G.sub.7 =C.sub.6 *C.sub.5 *C.sub.4,                         Eq. 198! 
    
     
         H.sub.0 =C.sub.3 *C.sub.2 *C.sub.1 *C.sub.0,                Eq. 199! 
    
     
         H.sub.1 =C.sub.3 *C.sub.2 *C.sub.1 *C.sub.0,                Eq. 200! 
    
     
         H.sub.2 =C.sub.3 *C.sub.2 *C.sub.1 *C.sub.0,                Eq. 201! 
    
     
         H.sub.3 =C.sub.3 *C.sub.2 *C.sub.1 *C.sub.0,                Eq. 202! 
    
     
         H.sub.4 =C.sub.3 *C.sub.2 *C.sub.1 *C.sub.0,                Eq. 203! 
    
     
         H.sub.5 =C.sub.3 *C.sub.2 *C.sub.1 *C.sub.0,                Eq. 204! 
    
     
         H.sub.6 =C.sub.3 *C.sub.2 *C.sub.1 *C.sub.0,                Eq. 205! 
    
     
         H.sub.7 =C.sub.3 *C.sub.2 *C.sub.1 *C.sub.0,                Eq. 206! 
    
     
         H.sub.8 =C.sub.3 *C.sub.2 *C.sub.1 *C.sub.0,                Eq. 207! 
    
     
         H.sub.9 =C.sub.3 *C.sub.2 *C.sub.1 *C.sub.0,                Eq. 208! 
    
     
         H.sub.10 =C.sub.3 *C.sub.2 *C.sub.1 *C.sub.0,               Eq. 209! 
    
     
         H.sub.11 =C.sub.3 *C.sub.2 *C.sub.1 *C.sub.0,               Eq. 210! 
    
     
         H.sub.12 =C.sub.3 *C.sub.2 *C.sub.1 *C.sub.0,               Eq. 211! 
    
     
         H.sub.13 =C.sub.3 *C.sub.2 *C.sub.1 *C.sub.0,               Eq. 212! 
    
     
         H.sub.14 =C.sub.3 *C.sub.2 *C.sub.1 *C.sub.0,               Eq. 213! 
    
     
         H.sub.15 =C.sub.3 *C.sub.2 *C.sub.1 *C.sub.0,               Eq. 214! 
    
     The output data words of the encoder are provided by the code word bits A 5 , A 4 , A 3 , A 2 , A 1  and A 0  at the output of decoder 100 formed by selecting the proper one of the corresponding four preceding data word bit expressions through use of the two next state expressions delayed by one state transition (or one system clock period) to provide the current state indication, the expressions therefor being as follows: 
     
         A.sub.5 =(Ks.sub.1 *Ks.sub.0)*XA.sub.5 +(Ks.sub.1 *Ks.sub.0)*XB.sub.5 +(Ks.sub.1 *Ks.sub.0)*XC.sub.5 +(Ks.sub.1 *Ks.sub.0)*XD.sub.5, Eq. 215! 
    
     
         A.sub.4 =(Ks.sub.1 *Ks.sub.0)*XA.sub.4 +(Ks.sub.1 *Ks.sub.0)*XB.sub.4 +(Ks.sub.1 *Ks.sub.0)*XC.sub.4 +(Ks.sub.1 *Ks.sub.0)*XD.sub.4, Eq. 216! 
    
     
         A.sub.3 =(Ks.sub.1 *Ks.sub.0)*XA.sub.3 +(Ks.sub.1 *Ks.sub.0)*XB.sub.3 +(Ks.sub.1 *Ks.sub.0)*XC.sub.3 +(Ks.sub.1 *Ks.sub.0)*XD.sub.3, Eq. 217! 
    
     
         A.sub.2 =(Ks.sub.1 *Ks.sub.0)*XA.sub.2 +(Ks.sub.1 *Ks.sub.0)*XB.sub.2 +(Ks.sub.1 *Ks.sub.0)*XC.sub.2 +(Ks.sub.1 *Ks.sub.0)*XD.sub.2, Eq. 218! 
    
     
         A.sub.1 =(Ks.sub.1 *Ks.sub.0)*XA.sub.1 +(Ks.sub.1 *Ks.sub.0)*XB.sub.1 +(Ks.sub.1 *Ks.sub.0)*XC.sub.1 +(Ks.sub.1 *Ks.sub.0)*XD.sub.1, Eq. 219! 
    
     
         A.sub.0 =(Ks.sub.1 *Ks.sub.0)*XA.sub.0 +(Ks.sub.1 *Ks.sub.0)*XB.sub.0 +(Ks.sub.1 *Ks.sub.0)*XC.sub.0 +(Ks.sub.1 *Ks.sub.0)*XD.sub.0, Eq. 220! 
    
     (Ks 1 ,Ks 0 ) is an ordered pair of bits representing the current state indication provided at the output of delay register 95. 
     Although the present invention has been described with reference to preferred embodiments, workers skilled in the art will recognize that changes may be made in form and detail without departing from the spirit and scope of the invention.