4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
5 p1 p2 D1 p1 D2 D3 D4 p4 D5 D6 D7 D8 D9 DA DB
6 -- xx xx xx xx xx xx xx
7 -- xx xx xx xx xx xx xx
8 -- xx xx xx xx xx xx xx
9 -- xx xx xx xx xx xx xx
11 p1 = D1 ^ D2 ^ D4 ^ D5 ^ D7 ^ D9 ^ D11
12 p2 = D1 ^ D3 ^ D4 ^ D6 ^ D7 ^ D10 ^ D11
13 p3 = D2 ^ D3 ^ D4 ^ D8 ^ D9 ^ D10 ^ D11
14 p4 = D5 ^ D6 ^ D7 ^ D8 ^ D9 ^ D10 ^ D11
16 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB
17 p1 xx xx xx xx xx xx xx
18 p2 xx xx xx xx xx xx xx
19 p3 xx xx xx xx xx xx xx
20 p4 xx xx xx xx xx xx xx
22 Add an extra parity bit p5 for detecting double-bit errors; this is simply
23 the XOR of all the bits, _including_ the other parity bits (see Wikipedia).
25 Strategy: lookup tables. Table of 2048 values -> 5 parity bits should be very
26 cheap (consume 2kB of RAM for unsigned char, fits nicely into L1
27 cache and all). Do we want to encode extra information here? Probably
28 not worth it at all...
32 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
33 p1 p2 D1 p1 D2 D3 D4 p4 D5 D6 D7 D8 D9 DA DB p5 DC DD DE DF DG DH DI DJ DK DL DM DN DO DP DQ
34 -- xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
35 -- xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
36 -- xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
37 -- xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
38 -- xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
42 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF DG DH DI DJ DK DL DM DN DO DP DQ
43 p1 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
44 p2 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
45 p3 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
46 p4 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
47 p5 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx
49 Last bit is the parity of all the data bits _and_ the parity bits, which means it gets
50 counted as follows (?):
52 p6 xx xx xx xx xx xx xx xx xx xx xx xx xx xx
54 Converted to bitmasks: