forked from arti/vt1200
The payload assembles KIND_DICT_CHUNK frames into a 32 KB dictionary at POOL_PTR + 2 * SLOT_BYTES and learns the tile kinds: * frame_parse.h gains FP_KIND_TILES_FULL (2), FP_KIND_TILES_DELTA (3) and FP_KIND_DICT_CHUNK (4), exactly frame.py's KINDS table, plus the marker cells DICT_READY/DICT_BYTES/DICT_BAD and TILES_DROP. A host test parses the header and compares it with KINDS so the two cannot drift apart. * dict_chunk() enforces an ascending, contiguous offset (no gap, overlap, duplicate or reorder; a mid-entry offset only as a continuation), a chunk that does not overrun the last entry, and no chunk after DICT_READY. A refused chunk leaves the prefix alone. Readiness is exactly 32768 bytes (256 whole entries), so a short upload never becomes ready. * The dispatcher routes STRIP to the blit, DICT_CHUNK to the assembler, and refuses TILES_FULL/TILES_DELTA without painting, counting them in TILES_DROP (Task 4 adds the tile blit). * A compile-time assertion refuses a POOL_BYTES that cannot hold the dictionary; the 1987 preprocessor does not fold macro arithmetic in #if, so it is a defined array whose negative length fails the build. * VT1200_MODE=dict injects both tile kinds before the dictionary, 23 contiguous chunks with a duplicate offset, a gap and an overrunning tail mixed in, and reads the stored 32 KB back byte for byte.