private void loadBlock() throws IOException
		{
			int opensize = Integer.reverseBytes(fp.readInt());
			int packsize = Integer.reverseBytes(fp.readInt());
			int checksum = Integer.reverseBytes(fp.readInt());
			int ccount = 0xFFFF&(int)Short.reverseBytes(fp.readShort());
			System.out.printf("    unpacked size:  %08X\n", opensize);
			System.out.printf("    packed size:    %08X\n", packsize);
			System.out.printf("    checksum:       %08X\n", checksum);
			System.out.printf("    chunk count:    %04X\n", ccount);
			
			int[][] clist = new int[ccount][2];
			
			int bcat = 0xFFFF&(int)Short.reverseBytes(fp.readShort());
			int bcount = 0xFFFF&(int)Short.reverseBytes(fp.readShort());
			int bcomp = 0xFFFF&(int)Short.reverseBytes(fp.readShort());
			System.out.printf("    category:       %04X\n", bcat);
			System.out.printf("    byte orderings: %04X\n", bcount);
			System.out.printf("    compression:    %04X\n", bcomp);
			
			for(int i = 0; i < ccount; i++)
			{
				int cptr = Integer.reverseBytes(fp.readInt());
				int clen = Integer.reverseBytes(fp.readInt());
				clist[i][0] = cptr;
				clist[i][1] = clen;
				System.out.printf("      chunk %d data: destpos=%08X destlen=%08X\n", i+1, cptr, clen);
			}
			
			this.cbuf = new byte[opensize];
			
			// load huffman table if necessary
			hufftab_pos = new int[256];
			if(bcount == 0)
			{
				for(int i = 0; i < 256; i++)
					hufftab_pos[i] = i;
			} else {
				for(int i = 0; i < bcount; i++)
					hufftab_pos[i] = fp.read();
			}
			
			switch(bcomp)
			{
				case 0:
					for(int i = 0; i < opensize; i++)
						cbuf[i] = (byte)readHuffman();
					break;
				default:
					System.out.printf("TODO: crack compression %d\n", bcomp);
					break;
			}
			
			// copy that crap across.
			int p = 0;
			for(int i = 0; i < ccount; i++)
			{
				int ptr = clist[i][0];
				int len = clist[i][1];
				for(int j = 0; j < len; j++,p++)
					b[p] = cbuf[j];
			}
		}