private int decodeBlackCodeWord() {
		int current;
		int entry;
		int bits;
		int isT;
		int code = -1;
		int runLength = 0;
		boolean isWhite = false;

		while (!isWhite) {
			current = nextLesserThan8Bits(4);
			entry = initBlack[current];

			// Get the 3 fields from the entry
			isT = entry & 0x0001;
			bits = (entry >>> 1) & 0x000f;
			code = (entry >>> 5) & 0x07ff;

			if (code == 100) {
				current = nextNBits(9);
				entry = black[current];

				// Get the 3 fields from the entry
				isT = entry & 0x0001;
				bits = (entry >>> 1) & 0x000f;
				code = (entry >>> 5) & 0x07ff;

				if (bits == 12) {
					// Additional makeup codes
					updatePointer(5);
					current = nextLesserThan8Bits(4);
					entry = additionalMakeup[current];
					bits = (entry >>> 1) & 0x07; // 3 bits 0000 0111
					code = (entry >>> 4) & 0x0fff; // 12 bits
					runLength += code;

					updatePointer(4 - bits);
				} else if (bits == 15) {
					// EOL code
					throw new RuntimeException(
							"EOL code word encountered in Black run."); //$NON-NLS-1$
				} else {
					runLength += code;
					updatePointer(9 - bits);
					if (isT == 0) {
						isWhite = true;
					}
				}
			} else if (code == 200) {
				// Is a Terminating code
				current = nextLesserThan8Bits(2);
				entry = twoBitBlack[current];
				code = (entry >>> 5) & 0x07ff;
				runLength += code;
				bits = (entry >>> 1) & 0x0f;
				updatePointer(2 - bits);
				isWhite = true;
			} else {
				// Is a Terminating code
				runLength += code;
				updatePointer(4 - bits);
				isWhite = true;
			}
		}

		return runLength;
	}