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