/* * _pop_config.h — внутренний бинарный контракт POP.CFG. * * Владелец формата ровно один — pop_config.c (банк 9). Внешний игровой * код видит только pop_settings.h и публичные pop_cfg_load/save. Формат * допускает добавление полей в конец payload той же версии: декодер знает * первые девять байтов, но контрольную сумму считает по ВСЕМУ payload. */ #ifndef _POP_CONFIG_H #define _POP_CONFIG_H #include #define POP_CFG_VERSION 1 #define POP_CFG_HEADER_SIZE 7 /* Ранний MS0-файл имел семь полей. Его продолжаем принимать: отсутствующие * поля берут исторический дефолт (лимит времени ON, отладочная полоса ON, * музыка ON), а новая запись содержит все десять. */ #define POP_CFG_LEGACY_PAYLOAD_SIZE 7 #define POP_CFG_TIMELIMIT_PAYLOAD_SIZE 8 #define POP_CFG_DEBUGBAR_PAYLOAD_SIZE 9 #define POP_CFG_PAYLOAD_SIZE 10 #define POP_CFG_TAIL_SIZE 2 /* CFG остаётся маленьким. Верхняя граница не даёт ручному мусору занять * стек W2, но оставляет запас для будущих полей версии 1. */ #define POP_CFG_MAX_PAYLOAD 64 #define POP_CFG_SIZE (POP_CFG_HEADER_SIZE + POP_CFG_PAYLOAD_SIZE + \ POP_CFG_TAIL_SIZE) #define POP_CFG_MIN_SIZE (POP_CFG_HEADER_SIZE + POP_CFG_LEGACY_PAYLOAD_SIZE + \ POP_CFG_TAIL_SIZE) #define POP_CFG_MAX_SIZE (POP_CFG_HEADER_SIZE + POP_CFG_MAX_PAYLOAD + \ POP_CFG_TAIL_SIZE) /* Чистое ядро формата: доступно host-тесту без DSS/EMM. encode пишет * текущий v1 размер, decode принимает прежние семи-/восьмибайтные и более * длинный v1 payload, игнорируя неизвестный хвост. */ void pop_cfg_encode(uint8_t *buf); uint8_t pop_cfg_decode(const uint8_t *buf, uint16_t size); #endif