Фикс: чтение файлов нельзя выносить в банк — банковый код сам живёт в 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:
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user