Фикс: чтение файлов нельзя выносить в банк — банковый код сам живёт в 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:
@@ -35,7 +35,7 @@ int pop_kid_load(uint8_t npages) __banked;
|
||||
* (kid_data.bin): в _CODE окна W1/W2 они занимали 3.5 КБ. Грузить ДО
|
||||
* первого kid_init/play_seq. 0 — OK, -1 — ошибка (без них Kid не оживёт).
|
||||
* Страница маппится в W0 внутри play_seq, раз за тик. */
|
||||
int pop_kid_data_load(const char *path) __banked;
|
||||
int pop_kid_data_load(const char *path);
|
||||
|
||||
/* Прочитать кадр из таблицы страницы данных: tbl_off — KID_BIN_FRAMES_OFF
|
||||
* (Kid) или KID_BIN_GFRAMES_OFF (страж, своя таблица frame_tbl_guard).
|
||||
|
||||
Reference in New Issue
Block a user