Files
Sprinter-SDCC/applications/PoP/roomtest/_pop_kid.h
T
snark13 055d6d7c89 Фикс: чтение файлов нельзя выносить в банк — банковый код сам живёт в W3
Первый запуск после разгрузки встал в halt по мусору в 0xC40E.  Причина:
pop_level_read_file и pop_kid_data_load маппят страницу данных в W3 на время
read() (файл читается по 0xC000), а модули банка исполняются ИЗ ЭТОГО ЖЕ
окна — после sprinter_page_w3() следующая инструкция приходит уже из чужой
страницы.  Обе функции вернулись в резидент; в банке остался код, который
ходит через W0 (gfx_w0_map) или окон не трогает вовсе.

Правило записано в _pop_level.h и _pop_kid.h: банковый модуль НЕ маппит W3
(через W0 — можно).  Поэтому же в резиденте живёт весь libbgi.

Куча 6095 Б (было 902 до разгрузки).  Проверено в MAME: игра стартует,
комната рисуется, Кид управляем.  tests-host 6/6.
2026-08-12 22:17:18 +03:00

30 lines
1.8 KiB
C

/*
* _pop_kid.h — ВНУТРЕННИЙ контракт движка Kid: pop_kid.c (резидент W1,
* интерпретатор seqtbl) ↔ pop_kboot.c (банк 8, загрузка ресурсов).
*
* Загрузка атласов Кида и страницы анимации отрабатывает РАЗ ЗА ИГРУ, и
* держать её в дефицитном W1 незачем; интерпретатор же зовут из четырёх
* банков каждый тик — он остался в резиденте. Общее между ними — только
* дескриптор страницы данных: он объявлен здесь и определён в pop_kid.c
* (данные банковых модулей всё равно линкуются в общий _DATA).
*/
#ifndef _POP_KID_H
#define _POP_KID_H
#include <stdint.h>
/* Смещение данных в странице анимации; ниже 0x100 — ISR-стаб W0. */
#define KD_DATA_OFF 0x100u
extern uint8_t kdat_blk; /* EMM-блок страницы kid_data.bin */
extern uint8_t kdat_page; /* её номер (маппится в W0 на время play_seq) */
extern uint8_t kdat_ok; /* данные загружены */
/* ПРАВИЛО ОКНА W3: банковый модуль исполняется из W3 и переключать это окно
* не может (следующая инструкция придёт уже из чужой страницы). Поэтому
* ЧТЕНИЕ kid_data.bin — pop_kid_data_load — осталось в резиденте, а в банк
* уехало только то, что читает через W0 или вообще не трогает окна.
* То же правило и в _pop_level.h. */
#endif /* _POP_KID_H */