Group coded recording
In computer science, group coded recording or group code recording (GCR) refers to several distinct but related encoding methods for representing data on magnetic media. The first, used in 6250 bpi magnetic tape since 1973,[1][2] is an error-correcting code combined with a run-length limited (RLL) encoding scheme, belonging into the group of modulation codes.[3] The others are similar encoding methods used in mainframe hard disks or microcomputer floppy disks until the late 1980s. GCR is a modified form of a NRZI code, but necessarily with a higher transition density.[3]
Magnetic tape
[edit | edit source]Group coded recording was first used for magnetic-tape data storage on 9-track reel-to-reel tape.[3] The term was coined during the development of the IBM 3420 Model 4/6/8 Magnetic Tape Unit[1] and the corresponding 3803 Model 2 Tape Control Unit,[4][1] both introduced in 1973.[1][5] IBM referred to the error correcting code itself as "group coded recording". However, GCR has come to refer to the recording format of 6250 bpi (250 bits/mm[3]) tape as a whole, and later to formats which use similar RLL codes without the error correction code.
In order to reliably read and write to magnetic tape, several constraints on the signal to be written must be followed. The first is that two adjacent flux reversals must be separated by a certain distance on the media, defined by the magnetic properties of the media itself. The second is that there must be a reversal often enough to keep the reader's clock in phase with the written signal; that is, the signal must be self-clocking and most importantly to keep the playback output high enough as this is proportional to the density of flux transitions. Prior to 6250 bpi tapes, 1600 bpi tapes satisfied these constraints using a technique called phase encoding (PE), which was only 50% efficient. For 6250 bpi GCR tapes, a (0, 2) RLL code is used, or more specifically a 4/5 (0, 2) block code[3] sometimes also referred to as GCR (4B-5B) encoding.[6] This code requires five bits to be written for every four bits of data.[3] The code is structured so that no more than two zero bits (which are represented by lack of a flux reversal) can occur in a row,[3] either within a code or between codes, no matter what the data was. This RLL code is applied independently to the data going to each of the nine tracks.
Of the 32 five-bit patterns, eight begin with two consecutive zero bits, six others end with two consecutive zero bits, and one more (10001) contains three consecutive zero bits. Removing the all-ones pattern (11111) from the remainder leaves 16 suitable code words.
The 6250 bpi GCR RLL code:[7][8][9][6]
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
11 of the nibbles (other than xx00 and 0001) have their code formed by prepending the complement of the most significant bit; i.e. abcd is encoded as aabcd. The other five values are assigned codes beginning with 11. Nibbles of the form ab00 have codes 11baa, i.e. the bit reverse of the code for ab11. The code 0001 is assigned the remaining value 11011.
Because the all-ones code is not used in normal data, at most 8 one-bits can appear in a row. Sequences of 9 or more one-bits (in practice 14 all-ones codes, or 70 one-bits, were used) are used as a synchronization pattern.
Because of the extremely high density (for the time) of 6250 bpi tape, the RLL code is not sufficient to ensure reliable data storage. On top of the RLL code, an error-correcting code called the Optimal Rectangular Code (ORC) is applied.[10] This code is a combination of a parity track and polynomial code similar to a CRC, but structured for error correction rather than error detection. For every seven bytes written to the tape (before RLL encoding), an eighth check byte is calculated and written to the tape. When reading, the parity is calculated on each byte and exclusive-ORed with the contents of the parity track, and the polynomial check code calculated and exclusive-ORed with the received check code, resulting in two 8-bit syndrome words. If these are both zero, the data is error free. Otherwise, error-correction logic in the tape controller corrects the data before it is forwarded to the host. The error correcting code is able to correct any number of errors in any single track, or in any two tracks if the erroneous tracks can be identified by other means.
In newer IBM half-inch 18-track tape drives recording at 24000 bpi, 4/5 (0, 2) GCR was replaced by a more efficient 8/9 (0, 3) modulation code, mapping eight bits to nine bits.[3]
Hard disks
[edit | edit source]In the mid-1970s, Sperry Univac, ISS Division was working on large hard drives for the mainframe business using group coding.[11]
Floppy disks
[edit | edit source]Like magnetic tape drives, floppy disk drives have physical limits on the spacing of flux reversals (also called transitions, represented by one-bits).
Micropolis
[edit | edit source]Offering GCR-compatible diskette drives and floppy disk controllers (like the 100163-51-8 and 100163-52-6[12]), Micropolis endorsed data encoding with group coded recording[13] on 5¼-inch 100 tpi 77-track diskette drives to store twelve 512-byte sectors per track since 1977 or 1978.[14][15][16][17]
Micro Peripherals
[edit | edit source]Micro Peripherals, Inc. (MPI) marketed double-density 5¼-inch disk drives (like the single-sided B51 and double-sided B52 drives) and a controller solution implementing GCR since early 1978.[18][19]
Durango
[edit | edit source]The Durango Systems F-85 (introduced in September 1978[20][21]) used single-sided 5¼-inch 100 tpi diskette drives providing 480 KB utilizing a proprietary high-density 4/5 group coded encoding. The machine was using a Western Digital FD1781 floppy disk controller, designed by a former Sperry ISS engineer,[17] with 77-track Micropolis drives.[22] In later models such as the Durango 800[23] series this was expanded to a double-sided option for 960 KB (946 KB formatted[23][nb 1]) per diskette.[21][24][22][14]
Apple
[edit | edit source]For the Apple II floppy drive, Steve Wozniak invented a floppy controller which (along with the Disk II drive itself) imposed two constraints:
- Between any two one bits, there may be a maximum of one zero bit.
- Each 8-bit byte must start with a one bit.
The simplest scheme to ensure compliance with these limits is to record an extra "clock" transition before each data bit according to differential Manchester encoding or (digital) FM (frequency modulation). Known as 4-and-4 encoding, the resulting Apple implementation allowed only ten 256-byte sectors per track to be recorded on a single-density 5¼-inch floppy. It uses two bytes for each byte.
|
|
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Close to a month prior to the shipment of the disk drive in spring 1978,[26] Wozniak realized that a more complex encoding scheme would allow each eight-bit byte on disk to hold five bits of useful data rather than four bits. This is because there are 34 bytes which have the top bit set and no two zero bits in a row. This encoding scheme became known as 5-and-3 encoding, and allowed 13 sectors per track; it was used for Apple DOS 3.1, 3.2, and 3.2.1, as well as for the earliest version of Apple CP/M:[27]
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Reserved GCR-codes: 0xAA and 0xD5.[27]
Wozniak called the system "my most incredible experience at Apple and the finest job I did".[26]
Later, the design of the floppy drive controller was modified to allow a byte on disk to contain up to one pair of zero bits in a row. This allowed each eight-bit byte to hold six bits of useful data, and allowed 16 sectors per track. This scheme is known as 6-and-2 encoding,[27] and was used on Apple Pascal, Apple DOS 3.3[27] and ProDOS,[29] and later with Apple FileWare drives in the Apple Lisa and the 400K and 800K 3½-inch disks on the Macintosh and Apple II.[30][31] Apple did not originally call this scheme "GCR", but the term was later applied to it[31] to distinguish it from IBM PC floppies which used the MFM encoding scheme.
|
|
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Reserved GCR-codes: 0xAA and 0xD5.[27][29]
Commodore
[edit | edit source]Independently, Commodore Business Machines (CBM) created a group coded recording scheme for their Commodore 2040 floppy disk drive (launched in the spring of 1979). The relevant constraints on the 2040 drive were that no more than two zero bits could occur in a row; the drive imposed no special constraint on the first bit in a byte. This allowed the use of a scheme similar to that used in 6250 bpi tape drives. Every four bits of data are translated into five bits on disk, using the same 5-bit codes as IBM to ensure there are never more than two zero bits in a row, but in a different order:
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Like the IBM code, at most eight one bits in a row are possible, so Commodore used sequences of ten or more one bits in a row as a synchronization sequence.
This more efficient GCR scheme, combined with an approach at constant bit-density recording by gradually increasing the clock rate (zone constant angular velocity, ZCAV) and storing more physical sectors on the outer tracks than on the inner ones (zone bit recording, ZBR), enabled Commodore to fit 170 KiB on a standard single-sided single-density 5.25-inch floppy, where Apple fit 140 KiB (with 6-and-2 encoding) or 114 KiB (with 5-and-3 encoding) and an FM-encoded floppy held only 88 KiB.
Sirius/Victor
[edit | edit source]Similar, the 5.25-inch floppy drives of the Victor 9000 aka Sirius 1, designed by Chuck Peddle in 1981/1982, used a combination of GCR and zone bit recording by gradually decreasing a drive's rotational speed for the outer tracks in nine zones while increasing the number of sectors per track[33] to achieve formatted capacities of 606 KiB (single sided) / 1188 KiB (double-sided) on 96 tpi media.[34][35][36][37] The GCR code is identical to the Commodore one.[38]
Brother
[edit | edit source]Starting around 1985, Brother introduced a family of dedicated word processor typewriters with integrated 3.5-inch 38-track[nb 2] diskette drive. Early models of the WP and LW series used a Brother-specific group-coded recording scheme with twelve 256-byte sectors to store up to 120 KB[nb 3] on single-sided and up to 240 KB[nb 3] on double-sided double-density (DD) diskettes.[17][39][40][41] Reportedly, prototypes were already shown at the Internationale Funkausstellung 1979 (IFA) in Berlin.
Sharp
[edit | edit source]In 1986, Sharp introduced a turnable 2.5-inch pocket disk drive solution (drives: CE-1600F, CE-140F; internally based on the FDU-250 chassis; media: CE-1650F) for their series of pocket computers with a formatted capacity of 62464 bytes per side (2× 64 kB nominal, 16 tracks, 8 sectors/track, 512 bytes per sector, 48 tpi, 250 kbit/s, 270 rpm) with GCR (4/5) recording.[42][43]
Other uses
[edit | edit source]GCR was also evaluated for a possible use in bar code encoding schemes (packing efficiency, timing tolerances, amount of storage bytes for timing information, and DC output level).[44]
See also
[edit | edit source]- 4B5B, another rate-4/5 code, but with looser (0,3) RLL constraints
- 8b/10b encoding, a rate-4/5 (0,4) RLL code, which is also DC balanced
- Modified Frequency Modulation (MFM)
- Run Length Limited (RLL)
- Eight-to-Fourteen Modulation (EFM)
- Error-correcting code
- Group code
- Integrated Woz Machine (IWM, a GCR disk controller in Apple computers)
- Paula (MOS Technology 8364, a GCR-capable disk controller in Commodore Amiga computers)
- Individual Computers Catweasel (a special diskette controller able to read some GCR formats)
- KryoFlux (a special diskette controller able to read some GCR formats)
Notes
[edit | edit source]- ^ The product flyer for the Durango 800 series documents a formatted "on-line capacity" of 1.892 MB for the diskette drives. The system, however, was equipped with two 5¼-inch Micropolis 100 tpi 77-track floppy drives by default, and 1.892 MB is about twice as large as the physical drive capacity documented in various other sources (480 KB per side), therefore, by "on-line capacity" they must have meant the available storage capacity available to users for the combination of two drives.
- ^ The sources give slightly contradicting parameters regarding the Brother diskette formats. 12 sectors á 256 bytes would give 120 KB per side on a 40-track drive, but one source claims the drives were 38-track only.
- ^ a b The following Brother models are known to support a 120 KB diskette format (incomplete list): WP-1 (1985/1987), WP-5 (1987/1989), WP-6 (1989), WP-55 (1987/1989), WP-500 (1987/1989). The following models are known to support a 240 KB format (incomplete list): WP-70, WP-75 (1989), WP-80 (1985/1989), WP-3400, WP-3410, WP-3550, WP-3650D, WP-760D, WP-760D+, LW-1 (1989), LW-20, LW-30, LW-100, LW-400.
References
[edit | edit source]- ^ a b c d Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ a b c d e f g h Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value). (NB. An anonymous comment by one of the developers on the origin of the name "Group Coded Recording".)
- ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ a b Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value). (672 pages)
- ^ a b c Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ a b c Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value). (NB. This article about the 3PM code was also presented at the Intermag 1977 in June 1977.)
- ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).)
- ^ US 4261019, McClelland, S. Barry, "Compatible Digital Magnetic Recording System", published Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value)., assigned to Micropolis Corporation (NB. Application Number: US 06/098381)
- ^ a b Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value). (NB. Micropolis 100163-51-8 and 100163-52-6 are GCR-based.)
- ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ a b c Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).[1]
- ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ a b Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ a b Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ a b Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ a b c d e f g h Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ a b Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value). [2] (NB. Interview with Steve Wozniak, where he describes creating the Apple version of GCR.)
- ^ a b c d e f g h i j k Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value). [3] [4] [5] Archived 9 March 2016 at the Wayback Machine
- ^ a b c d e f Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ a b c d e f Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value). [6]
- ^ a b c d e Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ a b Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ a b Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value). [7] (NB. Commodore GCR codes—but this reference erroneously claims that a 1-bit indicates a lack of a transition.)
- ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value). (NB. Reportedly, the Brother WP-1 technical data was derived from page 109 of the user manual.)
- ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
Further reading
[edit | edit source]- ANSI INCITS 40-1993 (R2003) Unrecorded Magnetic Tape for Information Interchange (9-track, 800 bpi, NRZI; 1600 bpi, PE; and 6250 bpi, GCR)
- ANSI INCITS 54-1986 (R2002) Recorded Magnetic Tape for Information Interchange (6250 bpi, GCR)
- Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value). (NB. Mentions the 5/4 RLL code used on 6250 bpi tape drives.)
- Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value). (NB. Additional detail on the GCR tape format.)
- US 3685033, Agrawala, Ashok K. & Srivastava, Keshava, "Block encoding for magnetic recording systems", published Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value)., assigned to Honeywell Inc. (NB. Application No: US 66199. See also: CA993998A, CA993998A1, DE2142428A1)
- US 4210959, Wozniak, Stephen G., "Controller for magnetic disc, recorder, or the like", published Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value)., assigned to Apple Computer, Inc. (NB. Application Number: US 5/904420)
- US 4564941, Woolley, Richard N.; Glover, Neal & Williams, Richard, "Error detection system", published Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value)., assigned to Apple Computer, Inc. (NB. Application Number: US 06/559210. See also: CA1208794A, CA1208794A1, DE3443272A1, DE3443272C2)
- Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
External links
[edit | edit source]- Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value)., Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value)., Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).