applications/PoP: порт Prince of Persia — PoC (roomtest) + пайплайн
Порт PoP на Sprinter. Текущий PoC — applications/PoP/roomtest/: комната 1 (фон-композиция тайлов) + Kid с управлением на raw-клавиатуре и коллизией с картой. - roomtest — pop_bg (фон), pop_kid (спрайты Kid, column-major флип, seqtbl-анимация), pop_ctrl (порт control() PoP на held-state kbd_raw), pop_map (коллизия seg004/005: бег/стоп у стены, падение/приземление, отскок seq_47, вертикальный прыжок K4.1). MEMORY=small (DATA сразу за CODE, ~23КБ кода не лезет в huge). - toolchain (PoP) — pop_pack_kid/pop_pack_bg/render_room/extract — распаковка res-графики MSDOS в атласы + композиция комнат. - toolchain/ (корень) — make_hdd.sh (быстрый HDD-тест вместо FDD), png_strip.py / room_compose.py (ассет-пайплайн). - docs — PORT_PLAN, KID_PLAN, форматы ресурсов (Apple II / MSDOS / DAT). - bgtest/coltest/poc — ранние PoC (фон, коллизия, первый прототип). .gitignore: build-артефакты applications/*/*/*; исключены внешние референс-репозитории (SDLPoP/mininim/PR/Apple-II — свои git-клоны) и оригинальные game-данные MSDOS/ (копирайт, только для реверса форматов). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,53 @@
|
||||
# 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)
|
||||
Reference in New Issue
Block a user