055d6d7c89
Первый запуск после разгрузки встал в 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.
30 lines
1.8 KiB
C
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 */
|