Фикс: чтение файлов нельзя выносить в банк — банковый код сам живёт в 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.
This commit is contained in:
2026-08-12 22:17:18 +03:00
parent 147cb185b1
commit 055d6d7c89
7 changed files with 123 additions and 82 deletions
+8
View File
@@ -69,6 +69,14 @@ static const uint8_t *room_bg_ptr(uint8_t r)
return (const uint8_t *)(LVL_DATA_OFF + BP_BG) + (uint16_t)(r - 1) * ROOM_TILES;
}
/* ПРАВИЛО ОКНА W3. Банковый модуль исполняется ИЗ W3, поэтому сам он
* менять это окно НЕ МОЖЕТ: после sprinter_page_w3(другая_страница)
* следующая инструкция читается уже из чужой страницы. Всё чтение файлов
* (оно грузит данные по 0xC000) обязано жить в резиденте — отсюда
* pop_level_read_file здесь, а не в pop_level_cold.c. Через W0
* (gfx_w0_map) банкам работать можно: это другое окно. */
int pop_level_read_file(const char *path);
/* Живая копия стражей из данных уровня (загрузка/рестарт) — в холодной. */
void pop_gstate_init(void) __banked;