# PoC порта Prince of Persia (applications/PoP/docs/PORT_PLAN.md §5). # --memory huge, БЕЗ --bank. # # ПОЧЕМУ huge, а НЕ small (исправлено 2026-07-16): poc использует # raw-клавиатуру (kbd_raw_open → IM2-таблица). Буферы IM2 (_irq_vec_buf, # BSS) ОБЯЗАНЫ жить в W2 (0x8000-0xBFFF) — во время прерывания W1/W3 # могут быть перемаплены DSS (см. libc/irq/_irq_table.c, memory/ # fps_divider: «verified tiny/big/huge, small=EINVAL»). --memory small # пулит W1+W2 в плоские ~32КБ и чейнит DATA за CODE — при небольшом CODE # BSS уезжает в W1 (<0x8000), и _irq_table_ref отдаёт EINVAL → # kbd_raw_open молча возвращал -1, poc печатал ошибку УЖЕ в графическом # режиме (невидимо) и выходил в prompt. huge кладёт CODE в W1, а # DATA/BSS/STACK/HEAP жёстко в W2 → IM2 работает. Цена: раздел 16КБ # CODE / 16КБ DATA вместо общего 32КБ-пула small — сейчас влезает с # запасом; при росте настоящего PoP CODE>16КБ понадобится банк под код. # # --bank НЕ нужен: gfx_blit_part()/atlas_load() сами временно трогают W3 # (видеобанк / чтение атласа) — банк room.c в W3 давал вероятностный # «снег»; банк в W1 несовместим с CODE=W1 (трамплин переключения W1 сам # бы уехал). sprintf() заменён на ручное hex-форматирование пути в # tile_atlas_load() (единственный потребитель printf, ~2.9КБ). PROJ_ROOT := $(abspath $(CURDIR)/../../..) EXAMPLE := poc MEMORY ?= huge EXTRA_FLAGS ?= --gfx 256 EXTRA_SRCS := room.c TILE_ATLASES := res/tiles/tile01.atl res/tiles/tile14.atl res/tiles/tile03.atl \ res/tiles/tile13.atl res/tiles/tile0e.atl res/tiles/tile0b.atl EXTRA_DATA := tools/kid.atl tools/room.pal res/room1.dat $(TILE_ATLASES) include $(PROJ_ROOT)/app.mk LEVEL1_BIN := $(PROJ_ROOT)/applications/PoP/SDLPoP/data/LEVELS/res2001.bin tools/kid.raw tools/kid.pal: tools/gen_kid_placeholder.py cd tools && python3 gen_kid_placeholder.py tools/kid.atl: tools/kid.raw python3 $(PROJ_ROOT)/toolchain/mkatlas.py $@ tools/kid.raw:16x16:1x12 res/room1.dat: tools/extract_room.py $(LEVEL1_BIN) python3 tools/extract_room.py $(LEVEL1_BIN) 1 res/room1.dat res/tiles/1F-0.png: tools/gen_tile_placeholders.py cd tools && python3 gen_tile_placeholders.py tools/room.pal $(TILE_ATLASES): tools/kid.pal res/tiles/1F-0.png tools/build_room_palette.py cd tools && python3 build_room_palette.py # make_disk.py упаковывает EXTRA_DATA на диск ПОД БАЗОВЫМ ИМЕНЕМ # (плоская ФС) — tileNN.atl/room1.dat оказываются в корне рядом с # kid.atl/room.pal, room.c/poc.c грузят их без пути. $(EXAMPLE).exe: room.c tools/kid.atl tools/room.pal res/room1.dat $(TILE_ATLASES)