Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| eef6eebd8c | |||
| 3de8c7500c | |||
| 8e33cd07bc |
Binary file not shown.
@@ -6,8 +6,13 @@ EXAMPLE := roomtest
|
||||
# small: W1+W2 как единое 32КБ-пространство, DATA сразу за CODE (иначе
|
||||
# CODE ~23КБ переполняет W1 и лезет в фиксированный DATA@0x8000 в huge).
|
||||
MEMORY ?= small
|
||||
EXTRA_FLAGS ?= --gfx 256 --w3 pop_trob.c pop_map.c --w3 pop_bg.c
|
||||
EXTRA_SRCS := pop_kid.c pop_ctrl.c pop_level.c
|
||||
# --w3 берёт ОДИН файл на флаг. В W3-резиденте держим ТОЛЬКО pop_bg —
|
||||
# отрисовку тайлов: она большая и её зовёт лишь главный цикл. Всё
|
||||
# остальное живёт в W1/W2, чтобы оставаться достижимым из будущих
|
||||
# __banked-модулей (стражи): из банка резидентная страница W3 не видна —
|
||||
# ни напрямую, ни транзитивно. См. docs/layout_plan_v2.md §2 (R2), §4.
|
||||
EXTRA_FLAGS ?= --gfx 256 --w3 pop_bg.c
|
||||
EXTRA_SRCS := pop_kid.c pop_ctrl.c pop_level.c pop_map.c pop_trob.c
|
||||
|
||||
BG_DIR := $(CURDIR)/../poc/res/bg
|
||||
KID_DIR := $(CURDIR)/../poc/res/kid
|
||||
@@ -22,8 +27,11 @@ BG_DATA := $(BG_DIR)/pop_env0.atl $(BG_DIR)/pop_env1.atl $(BG_DIR)/pop_env2.
|
||||
# ЕДИНАЯ игровая (env+wall+kid).
|
||||
KID_PAGES := $(foreach n,0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27,$(KID_DIR)/kid$(n).atl)
|
||||
KID_DATA := $(KID_PAGES) $(KID_DIR)/kid.pal $(KID_DIR)/sword.atl
|
||||
# Таблицы анимации (кадры+seqtbl) — отдельный бинарь в EMM-странице, его
|
||||
# делает pop_extract_kid_data.py (не упаковщик спрайтов) — своё правило ниже.
|
||||
KID_BIN := $(KID_DIR)/kid_data.bin
|
||||
|
||||
EXTRA_DATA := $(BG_DATA) $(KID_DATA) $(LVL_DATA)
|
||||
EXTRA_DATA := $(BG_DATA) $(KID_DATA) $(KID_BIN) $(LVL_DATA)
|
||||
include $(PROJ_ROOT)/app.mk
|
||||
|
||||
TC := $(PROJ_ROOT)/applications/PoP/toolchain
|
||||
@@ -31,7 +39,7 @@ $(BG_DATA): $(TC)/pop_pack_bg.py $(TC)/render_room.py
|
||||
cd $(TC) && python3 pop_pack_bg.py
|
||||
$(KID_DATA): $(TC)/pop_pack_kid.py $(TC)/pop_pack_bg.py
|
||||
cd $(TC) && python3 pop_pack_kid.py
|
||||
kid_data.h: $(TC)/pop_extract_kid_data.py
|
||||
kid_data.h $(KID_BIN): $(TC)/pop_extract_kid_data.py
|
||||
cd $(TC) && python3 pop_extract_kid_data.py
|
||||
|
||||
$(EXAMPLE).exe: pop_bg.c pop_bg.h pop_kid.c pop_kid.h pop_ctrl.c pop_ctrl.h pop_map.c pop_map.h pop_level.c pop_level.h pop_trob.c pop_trob.h kid_data.h $(BG_DATA) $(KID_DATA) $(LVL_DATA)
|
||||
$(EXAMPLE).exe: pop_bg.c pop_bg.h pop_kid.c pop_kid.h pop_ctrl.c pop_ctrl.h pop_map.c pop_map.h pop_level.c pop_level.h pop_trob.c pop_trob.h kid_data.h $(BG_DATA) $(KID_DATA) $(KID_BIN) $(LVL_DATA)
|
||||
|
||||
@@ -8,449 +8,16 @@
|
||||
|
||||
#define SEQTBL_BASE 0x196Eu
|
||||
|
||||
/* {image, dx, dy, flags, sword}; chtab = sword>>6 (0=kid). */
|
||||
/* {image, dx, dy, flags, sword}; chtab = sword>>6 (0=kid).
|
||||
* САМА таблица кадров и seqtbl лежат в kid_data.bin (EMM-
|
||||
* страница); здесь только тип и размеры. */
|
||||
typedef struct { uint8_t image; int8_t dx, dy; uint8_t flags, sword; } kframe;
|
||||
#define KID_NFRAMES 241
|
||||
static const kframe kid_frames[KID_NFRAMES] = {
|
||||
{255, 0, 0,0x00,0x00},
|
||||
{ 0, 1, 0,0xC4,0x00},
|
||||
{ 1, 1, 0,0x44,0x00},
|
||||
{ 2, 3, 0,0x47,0x00},
|
||||
{ 3, 4, 0,0x48,0x00},
|
||||
{ 4, 0, 0,0xE6,0x00},
|
||||
{ 5, 0, 0,0x49,0x00},
|
||||
{ 6, 0, 0,0x4A,0x00},
|
||||
{ 7, 0, 0,0xC5,0x00},
|
||||
{ 8, 0, 0,0x44,0x00},
|
||||
{ 9, 0, 0,0x47,0x00},
|
||||
{ 10, 0, 0,0x4B,0x00},
|
||||
{ 11, 0, 0,0x43,0x00},
|
||||
{ 12, 0, 0,0xC3,0x00},
|
||||
{ 13, 0, 0,0x47,0x00},
|
||||
{ 14, 0, 0,0x43,0x09},
|
||||
{ 15, 0, 0,0xC3,0x00},
|
||||
{ 16, 0, 0,0x44,0x00},
|
||||
{ 17, 0, 0,0x46,0x00},
|
||||
{ 18, 0, 0,0x48,0x00},
|
||||
{ 19, 0, 0,0x89,0x00},
|
||||
{ 20, 0, 0,0x0B,0x00},
|
||||
{ 21, 0, 0,0x8B,0x00},
|
||||
{ 22, 0, 0,0x11,0x00},
|
||||
{ 23, 0, 0,0x07,0x00},
|
||||
{ 24, 0, 0,0x05,0x00},
|
||||
{ 25, 0, 0,0xC1,0x00},
|
||||
{ 26, 0, 0,0xC6,0x00},
|
||||
{ 27, 0, 0,0x43,0x00},
|
||||
{ 28, 0, 0,0x48,0x00},
|
||||
{ 29, 0, 0,0x42,0x00},
|
||||
{ 30, 0, 0,0x42,0x00},
|
||||
{ 31, 0, 0,0xC2,0x00},
|
||||
{ 32, 0, 0,0xC2,0x00},
|
||||
{ 33, 0, 0,0x43,0x00},
|
||||
{ 34, 0, 0,0x48,0x00},
|
||||
{ 35, 0, 0,0xCE,0x00},
|
||||
{ 36, 0, 0,0xC1,0x00},
|
||||
{ 37, 0, 0,0x45,0x00},
|
||||
{ 38, 0, 0,0x8E,0x00},
|
||||
{ 39, 0, 0,0x0B,0x00},
|
||||
{ 40, 0, 0,0x8B,0x00},
|
||||
{ 41, 0, 0,0x8A,0x00},
|
||||
{ 42, 0, 0,0x01,0x00},
|
||||
{ 43, 0, 0,0xC4,0x00},
|
||||
{ 44, 0, 0,0xC3,0x00},
|
||||
{ 45, 0, 0,0xC3,0x00},
|
||||
{ 46, 0, 0,0xA5,0x00},
|
||||
{ 47, 0, 0,0xA4,0x00},
|
||||
{ 48, 0, 0,0x66,0x00},
|
||||
{ 49, 4, 0,0x67,0x00},
|
||||
{ 50, 3, 0,0x66,0x00},
|
||||
{ 51, 1, 0,0x44,0x00},
|
||||
{ 64, 0, 0,0xC2,0x00},
|
||||
{ 65, 0, 0,0x41,0x00},
|
||||
{ 66, 0, 0,0x42,0x00},
|
||||
{ 67, 0, 0,0x00,0x00},
|
||||
{ 68, 0, 0,0x00,0x00},
|
||||
{ 69, 0, 0,0x80,0x00},
|
||||
{ 70, 0, 0,0x00,0x00},
|
||||
{ 71, 0, 0,0x80,0x00},
|
||||
{ 72, 0, 0,0x00,0x00},
|
||||
{ 73, 0, 0,0x80,0x00},
|
||||
{ 74, 0, 0,0x00,0x00},
|
||||
{ 75, 0, 0,0x00,0x00},
|
||||
{ 76, 0, 0,0x80,0x00},
|
||||
{255, 0, 0,0x00,0x00},
|
||||
{ 80, -2, 0,0x41,0x00},
|
||||
{ 81, -2, 0,0x41,0x00},
|
||||
{ 82, -1, 0,0xC2,0x00},
|
||||
{ 83, -2, 0,0x42,0x00},
|
||||
{ 84, -2, 0,0x41,0x00},
|
||||
{ 85, -2, 0,0x41,0x00},
|
||||
{ 86, -2, 0,0x41,0x00},
|
||||
{ 87, -1, 0,0x07,0x00},
|
||||
{ 88, -1, 0,0x05,0x00},
|
||||
{ 89, 2, 0,0x07,0x00},
|
||||
{ 90, 2, 0,0x07,0x00},
|
||||
{ 91, 2, -3,0x00,0x00},
|
||||
{ 92, 2, -10,0x00,0x00},
|
||||
{ 93, 2, -11,0x80,0x00},
|
||||
{ 94, 3, -2,0x43,0x00},
|
||||
{ 95, 3, 0,0xC3,0x00},
|
||||
{ 96, 3, 0,0xC3,0x00},
|
||||
{ 97, 3, 0,0x63,0x00},
|
||||
{ 98, 4, 0,0xE3,0x00},
|
||||
{ 28, 0, 0,0x00,0x00},
|
||||
{ 99, 7, -14,0x80,0x00},
|
||||
{100, 7, -12,0x80,0x00},
|
||||
{101, 4, -12,0x00,0x00},
|
||||
{102, 3, -10,0x80,0x00},
|
||||
{103, 2, -10,0x80,0x00},
|
||||
{104, 1, -10,0x80,0x00},
|
||||
{105, 0, -11,0x00,0x00},
|
||||
{106, -1, -12,0x00,0x00},
|
||||
{107, -1, -14,0x00,0x00},
|
||||
{108, -1, -14,0x00,0x00},
|
||||
{109, -1, -15,0x80,0x00},
|
||||
{110, -1, -15,0x80,0x00},
|
||||
{111, 0, -15,0x00,0x00},
|
||||
{255, 0, 0,0x00,0x00},
|
||||
{255, 0, 0,0x00,0x00},
|
||||
{112, 0, 0,0xC6,0x00},
|
||||
{113, 0, 0,0x46,0x00},
|
||||
{114, 0, 0,0xC5,0x00},
|
||||
{115, 0, 0,0x45,0x00},
|
||||
{116, 0, 0,0xC2,0x00},
|
||||
{117, 0, 0,0xC4,0x00},
|
||||
{118, 0, 0,0xC5,0x00},
|
||||
{119, 0, 0,0x46,0x00},
|
||||
{120, 0, 0,0x47,0x00},
|
||||
{121, 0, 0,0x47,0x00},
|
||||
{122, 0, 0,0x49,0x00},
|
||||
{123, 0, 0,0xC8,0x00},
|
||||
{124, 0, 0,0xC9,0x00},
|
||||
{125, 0, 0,0x49,0x00},
|
||||
{126, 0, 0,0x45,0x00},
|
||||
{127, 2, 0,0x45,0x00},
|
||||
{128, 2, 0,0xC5,0x00},
|
||||
{129, 0, 0,0xC3,0x00},
|
||||
{255, 0, 0,0x00,0x00},
|
||||
{133, 0, 0,0x43,0x00},
|
||||
{134, 0, 0,0xC4,0x00},
|
||||
{135, 0, 0,0xC5,0x00},
|
||||
{136, 0, 0,0x48,0x00},
|
||||
{137, 0, 0,0x6C,0x00},
|
||||
{138, 0, 0,0xEF,0x00},
|
||||
{139, 0, 0,0x63,0x00},
|
||||
{140, 0, 0,0xC3,0x00},
|
||||
{141, 0, 0,0x43,0x00},
|
||||
{142, 0, 0,0x43,0x00},
|
||||
{143, 0, 0,0x44,0x00},
|
||||
{144, 0, 0,0x44,0x00},
|
||||
{172, 0, 1,0xC1,0x00},
|
||||
{173, 0, 1,0xC7,0x00},
|
||||
{145, 0, -12,0x01,0x00},
|
||||
{146, 0, -21,0x00,0x00},
|
||||
{147, 1, -26,0x80,0x00},
|
||||
{148, 4, -32,0x80,0x00},
|
||||
{149, 6, -36,0x81,0x00},
|
||||
{150, 7, -41,0x82,0x00},
|
||||
{151, 2, 17,0x42,0x00},
|
||||
{152, 4, 9,0xC4,0x00},
|
||||
{153, 4, 5,0xC9,0x00},
|
||||
{154, 4, 4,0xC8,0x00},
|
||||
{155, 5, 0,0x69,0x00},
|
||||
{156, 5, 0,0xE9,0x00},
|
||||
{157, 5, 0,0xE8,0x00},
|
||||
{158, 5, 0,0x69,0x00},
|
||||
{159, 5, 0,0x69,0x00},
|
||||
{184, 0, 2,0x80,0x10},
|
||||
{174, 0, 2,0x80,0x1A},
|
||||
{175, 3, 2,0x00,0x12},
|
||||
{176, 7, 2,0xC4,0x16},
|
||||
{177, 10, 2,0x00,0x15},
|
||||
{178, 7, 2,0x80,0x17},
|
||||
{179, 4, 2,0x80,0x19},
|
||||
{180, 0, 2,0xCE,0x18},
|
||||
{181, 0, 2,0xCD,0x0F},
|
||||
{182, 3, 2,0x00,0x14},
|
||||
{183, 3, 2,0x00,0x1F},
|
||||
{184, 0, 2,0x80,0x10},
|
||||
{185, 0, 2,0x80,0x11},
|
||||
{186, 0, 2,0x00,0x20},
|
||||
{187, 0, 2,0x80,0x21},
|
||||
{188, 2, 2,0xC3,0x22},
|
||||
{ 14, 0, 0,0x43,0x00},
|
||||
{189, 7, 2,0x80,0x13},
|
||||
{190, 1, 2,0x80,0x0E},
|
||||
{191, 0, 2,0x80,0x1B},
|
||||
{181, 0, 2,0xCD,0x0F},
|
||||
{181, 0, 2,0xCD,0x0F},
|
||||
{112, 0, 0,0xC6,0x2B},
|
||||
{113, 0, 0,0x46,0x2C},
|
||||
{114, 0, 0,0xC5,0x2D},
|
||||
{115, 0, 0,0x45,0x2E},
|
||||
{114, 0, 0,0xC5,0x00},
|
||||
{ 78, 0, 3,0x8A,0x00},
|
||||
{ 77, 4, 3,0x87,0x00},
|
||||
{211, 0, 1,0x44,0x00},
|
||||
{212, 0, 1,0x44,0x00},
|
||||
{213, 0, 1,0x44,0x00},
|
||||
{214, 0, 1,0x47,0x00},
|
||||
{215, 0, 7,0x4B,0x00},
|
||||
{255, 0, 0,0x00,0x00},
|
||||
{ 79, 4, 7,0x49,0x00},
|
||||
{130, 0, 0,0x44,0x00},
|
||||
{131, 0, 0,0x44,0x00},
|
||||
{132, 0, 2,0x44,0x00},
|
||||
{255, 0, 0,0x00,0x00},
|
||||
{255, 0, 0,0x00,0x00},
|
||||
{192, 0, 0,0x00,0x00},
|
||||
{193, 0, 1,0x00,0x00},
|
||||
{194, 0, 0,0x80,0x00},
|
||||
{195, 0, 0,0x00,0x00},
|
||||
{196, -1, 0,0x00,0x00},
|
||||
{197, -1, 0,0x00,0x00},
|
||||
{198, -1, 0,0x00,0x00},
|
||||
{199, -4, 0,0x00,0x00},
|
||||
{200, -4, 0,0x80,0x00},
|
||||
{201, -4, 0,0x00,0x00},
|
||||
{202, -4, 0,0x00,0x00},
|
||||
{203, -4, 0,0x00,0x00},
|
||||
{204, -4, 0,0x00,0x00},
|
||||
{205, -5, 0,0x00,0x00},
|
||||
{206, -5, 0,0x00,0x00},
|
||||
{255, 0, 0,0x00,0x00},
|
||||
{207, 0, 1,0x46,0x00},
|
||||
{208, 0, 1,0xC6,0x00},
|
||||
{209, 0, 1,0xC8,0x00},
|
||||
{210, 0, 1,0x4A,0x00},
|
||||
{255, 0, 0,0x00,0x00},
|
||||
{255, 0, 0,0x00,0x00},
|
||||
{255, 0, 0,0x00,0x00},
|
||||
{255, 0, 0,0x00,0x00},
|
||||
{255, 0, 0,0x00,0x00},
|
||||
{255, 0, 0,0x00,0x00},
|
||||
{ 52, 0, 0,0x80,0x00},
|
||||
{ 53, 0, 0,0x00,0x00},
|
||||
{ 54, 0, 0,0x00,0x00},
|
||||
{ 55, 0, 0,0x00,0x00},
|
||||
{ 56, 0, 0,0x80,0x00},
|
||||
{ 57, 0, 0,0x00,0x00},
|
||||
{ 58, 0, 0,0x00,0x00},
|
||||
{ 59, 0, 0,0x00,0x00},
|
||||
{ 60, 0, 0,0x80,0x00},
|
||||
{ 61, 0, 0,0x00,0x00},
|
||||
{ 62, 0, 0,0x80,0x00},
|
||||
{ 63, 0, 0,0x00,0x00},
|
||||
{160, 1, 1,0xC3,0x23},
|
||||
{161, 0, 1,0x49,0x24},
|
||||
{162, 0, 1,0xC3,0x25},
|
||||
{163, 0, 1,0x49,0x26},
|
||||
{164, 0, 1,0xC3,0x27},
|
||||
{165, 1, 1,0x49,0x28},
|
||||
{166, 1, 1,0x43,0x29},
|
||||
{167, 1, 1,0xC9,0x2A},
|
||||
{168, 4, 1,0xC6,0x00},
|
||||
{169, 3, 1,0xCA,0x00},
|
||||
{170, 1, 1,0x43,0x00},
|
||||
{171, 1, 1,0xC8,0x00},
|
||||
};
|
||||
|
||||
#define KID_SEQTBL_LEN 2310
|
||||
static const uint8_t kid_seqtbl[KID_SEQTBL_LEN] = {
|
||||
0xF9,0x01,0xFF,0x81,0x19,0xF9,0x01,0x01,0x02,0x03,0x04,0xFB,
|
||||
0x08,0x05,0xFB,0x03,0x06,0xFB,0x03,0x07,0xFB,0x05,0x08,0xFB,
|
||||
0x01,0xF2,0x01,0x09,0xFB,0x02,0x0A,0xFB,0x04,0x0B,0xFB,0x05,
|
||||
0x0C,0xFB,0x02,0xF2,0x01,0x0D,0xFB,0x03,0x0E,0xFB,0x04,0xFF,
|
||||
0x81,0x19,0xF9,0x00,0x0F,0xFF,0xA0,0x19,0xF9,0x01,0xA6,0xFF,
|
||||
0xA8,0x19,0xF9,0x05,0xFB,0x0A,0xB1,0xB1,0xFB,0xF9,0xFA,0xFE,
|
||||
0xB2,0xFB,0x05,0xFA,0x02,0xA6,0xFB,0xFF,0xFF,0xD2,0x19,0xFF,
|
||||
0xD2,0x19,0xF9,0x01,0xFB,0x02,0xCF,0xD0,0xFB,0x02,0xD1,0xFB,
|
||||
0x02,0xD2,0xFB,0x03,0xF9,0x01,0xF2,0x00,0x9E,0xAA,0xAB,0xFF,
|
||||
0xD8,0x19,0xF9,0x05,0xF8,0xFF,0x00,0xAC,0xFB,0xFF,0xFA,0x01,
|
||||
0xAD,0xFB,0xFF,0xAE,0xFB,0xFF,0xFA,0x02,0xFB,0xFE,0xFA,0x01,
|
||||
0xFB,0xFB,0xFA,0xFC,0xFF,0x4D,0x1A,0xF9,0x01,0xF8,0x01,0x00,
|
||||
0x9B,0xFB,0x02,0xA5,0xFB,0xFE,0xFF,0xD2,0x19,0xF9,0x01,0xF8,
|
||||
0xFF,0x00,0x9B,0x9C,0x9D,0x9E,0xFF,0x2E,0x1A,0xF9,0x01,0xF8,
|
||||
0x01,0x00,0xFB,0x02,0xA3,0xFB,0x04,0xA4,0xA5,0xFF,0xD2,0x19,
|
||||
0xF9,0x01,0xF8,0x01,0x00,0xFB,0x06,0xA4,0xA5,0xFF,0xD2,0x19,
|
||||
0xF9,0x01,0xF8,0xFF,0x00,0xFB,0xFD,0xA0,0xFB,0xFE,0x9D,0xFF,
|
||||
0xD2,0x19,0xF9,0x01,0xF8,0xFF,0x00,0xA8,0xF9,0x01,0x97,0xF9,
|
||||
0x01,0x98,0x99,0x9A,0xF9,0x05,0x9B,0xF9,0x01,0x9C,0x9D,0xFF,
|
||||
0xD2,0x19,0xF9,0x01,0xA7,0xFF,0x4A,0x1A,0xA2,0xFF,0x45,0x1A,
|
||||
0xA9,0x96,0xFF,0xD2,0x19,0x9F,0xA0,0xFF,0x5F,0x1A,0xF9,0x01,
|
||||
0xF4,0xFF,0xD2,0x19,0xF9,0x05,0xFB,0xF8,0xFF,0xD2,0x19,0xF9,
|
||||
0x05,0xA0,0x9D,0xFF,0xD2,0x19,0xF9,0x07,0xFB,0xF8,0xFF,0x39,
|
||||
0x1B,0xF9,0x05,0xFE,0xFB,0x05,0xFF,0x2E,0x1A,0xF9,0x05,0xFE,
|
||||
0xFB,0x12,0xFF,0xA6,0x19,0xF9,0x01,0x10,0x11,0xFB,0x02,0x12,
|
||||
0xFB,0x02,0x13,0xFB,0x02,0x14,0xFB,0x02,0x15,0xFB,0x02,0x16,
|
||||
0xFB,0x07,0x17,0xFB,0x09,0x18,0xFB,0x05,0xFA,0xFA,0x19,0xFB,
|
||||
0x01,0xFA,0x06,0x1A,0xFB,0x04,0xF4,0xF2,0x01,0x1B,0xFB,0xFD,
|
||||
0x1C,0xFB,0x05,0x1D,0xF2,0x01,0x1E,0x1F,0x20,0x21,0xFB,0x01,
|
||||
0xFF,0xA0,0x19,0xF9,0x01,0xF2,0x01,0x22,0xFB,0x05,0x23,0xFB,
|
||||
0x06,0x24,0xFB,0x03,0x25,0xFB,0x05,0xF2,0x01,0x26,0xFB,0x07,
|
||||
0x27,0xFB,0x0C,0xFA,0xFD,0x28,0xFB,0x08,0xFA,0xF7,0x29,0xFB,
|
||||
0x08,0xFA,0xFE,0x2A,0xFB,0x04,0xFA,0x0B,0x2B,0xFB,0x04,0xFA,
|
||||
0x03,0x2C,0xFB,0x05,0xF4,0xF2,0x01,0xFF,0x81,0x19,0xF9,0x01,
|
||||
0xFB,0x01,0x6B,0xFB,0x02,0xFB,0x02,0x6C,0xFB,0x02,0x6D,0xFB,
|
||||
0x02,0x6D,0xFB,0x02,0x6D,0xFF,0x16,0x1B,0x00,0xF9,0x01,0xFB,
|
||||
0x01,0x6E,0x6F,0xFB,0x02,0x70,0xFB,0x02,0x6C,0xFB,0x02,0x6D,
|
||||
0xFF,0x29,0x1B,0xF9,0x07,0xFE,0xFB,0x06,0x2D,0xFB,0x01,0x2E,
|
||||
0xFF,0xC4,0x19,0xF9,0x07,0xFE,0xFB,0x06,0x2D,0xFB,0x01,0x2E,
|
||||
0xFB,0x02,0x2F,0xFB,0xFF,0x30,0xFB,0x01,0x31,0xFB,0xFE,0x32,
|
||||
0x33,0x34,0xFF,0xA0,0x19,0xF9,0x01,0xFB,0xFF,0xFF,0x75,0x19,
|
||||
0xF9,0x01,0xFB,0x01,0x35,0xFB,0x01,0xF2,0x01,0x36,0xFB,0x08,
|
||||
0x37,0xF2,0x01,0x38,0xFB,0x07,0x39,0xFB,0x03,0x3A,0xFB,0x01,
|
||||
0x3B,0x3C,0xFB,0x02,0x3D,0xFB,0xFF,0x3E,0x3F,0x40,0xFB,0xFF,
|
||||
0x41,0xFB,0xF2,0xFE,0xFF,0x95,0x19,0xF9,0x03,0xFA,0xFF,0x66,
|
||||
0xFB,0xFE,0xFA,0x06,0x67,0xFB,0xFE,0xFA,0x09,0x68,0xFB,0xFF,
|
||||
0xFA,0x0C,0x69,0xFB,0xFD,0xF8,0x00,0x0F,0xFF,0x49,0x1D,0xF9,
|
||||
0x03,0xFA,0xFF,0xFB,0xFE,0x66,0xFB,0xFD,0xFA,0x06,0x67,0xFB,
|
||||
0xFD,0xFA,0x09,0x68,0xFB,0xFE,0xFA,0x0C,0x69,0xFB,0xFD,0xF8,
|
||||
0x00,0x0F,0xFF,0x49,0x1D,0xF9,0x03,0xFB,0x01,0xFA,0xFF,0x66,
|
||||
0xFB,0x02,0xFA,0x06,0x67,0xFB,0xFF,0xFA,0x09,0x68,0xFA,0x0C,
|
||||
0x69,0xFB,0xFE,0xF8,0x01,0x0F,0xFF,0x49,0x1D,0xF9,0x03,0xFB,
|
||||
0x01,0xFA,0x03,0xF7,0x06,0x1C,0x66,0xFB,0x02,0xFA,0x06,0x67,
|
||||
0xFB,0xFF,0xFA,0x09,0x68,0xFA,0x0C,0x69,0xFB,0xFE,0xF8,0x01,
|
||||
0x0F,0xFF,0x49,0x1D,0xFB,0xFF,0xFA,0xFD,0xFF,0xE4,0x1B,0xFB,
|
||||
0x01,0xFF,0xDB,0x1B,0x66,0xFB,0x02,0xFA,0x03,0x67,0xFB,0xFF,
|
||||
0xFA,0x04,0x68,0xFA,0x05,0x69,0xFB,0xFE,0xF8,0x01,0x06,0xFF,
|
||||
0x49,0x1D,0xF9,0x03,0xFB,0x01,0xFA,0x03,0x66,0xFB,0x02,0xFA,
|
||||
0x06,0x67,0xFB,0x01,0xFA,0x09,0x68,0xFB,0x02,0xFA,0x0C,0x69,
|
||||
0xF8,0x02,0x0F,0xFF,0x49,0x1D,0xF9,0x03,0xFB,0x01,0xFA,0x03,
|
||||
0x66,0xFB,0x03,0xFA,0x06,0x67,0xFB,0x02,0xFA,0x09,0x68,0xFB,
|
||||
0x03,0xFA,0x0C,0x69,0xF8,0x03,0x0F,0xFF,0x49,0x1D,0xF9,0x01,
|
||||
0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0xF9,
|
||||
0x02,0x4E,0x4F,0x50,0xFF,0xA1,0x1C,0xF9,0x01,0x43,0x44,0x45,
|
||||
0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0xF9,0x02,0xFB,0x01,
|
||||
0x4E,0xFB,0x02,0x4F,0xFB,0x01,0x50,0xFF,0xA1,0x1C,0xF9,0x01,
|
||||
0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0xFB,0xFF,
|
||||
0x4D,0xF9,0x02,0xFB,0xFE,0x4E,0xFB,0xFF,0x4F,0xFB,0xFF,0x50,
|
||||
0xFF,0xA1,0x1C,0xF9,0x02,0x5B,0x5A,0x59,0x58,0x57,0x57,0x57,
|
||||
0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,
|
||||
0x61,0x60,0x5F,0x5E,0x5D,0x5C,0x5B,0x5A,0x59,0x58,0x57,0x58,
|
||||
0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x5F,0x5E,0x5D,0x5C,
|
||||
0xFF,0x25,0x1D,0xF9,0x06,0x5C,0x5D,0x5D,0x5C,0x5C,0x5B,0xFF,
|
||||
0xD8,0x1C,0x87,0x88,0x89,0x89,0x8A,0x8A,0x8A,0x8A,0x89,0x88,
|
||||
0x87,0xFB,0xF9,0xFF,0x25,0x1D,0xF9,0x01,0x94,0x91,0x90,0x8F,
|
||||
0x8E,0x8D,0xFB,0xFB,0xFA,0x3F,0xFC,0xF9,0x03,0x8C,0x8A,0x88,
|
||||
0x5B,0xF9,0x02,0xFF,0xA4,0x1C,0xF9,0x01,0x87,0x88,0x89,0x8A,
|
||||
0x8B,0x8C,0xFB,0x05,0xFA,0xC1,0xFD,0x8D,0x8E,0x8F,0x90,0x91,
|
||||
0x92,0x93,0x94,0xF9,0x05,0x95,0xF9,0x01,0x76,0x77,0xFB,0x01,
|
||||
0xFF,0xA0,0x19,0x51,0x52,0xF9,0x05,0x53,0xF9,0x01,0xF4,0xF2,
|
||||
0x00,0x54,0x55,0xFB,0x03,0xFF,0xA0,0x19,0xF9,0x03,0x51,0xFA,
|
||||
0x06,0x51,0xFA,0x09,0x51,0xFA,0x0C,0xFB,0x02,0xF8,0x00,0x0C,
|
||||
0xFF,0x49,0x1D,0xF9,0x04,0x6A,0xFF,0x4B,0x1D,0xF9,0x01,0x35,
|
||||
0xFB,0x02,0xF2,0x01,0x36,0xFB,0x07,0x37,0xF2,0x01,0x38,0xFB,
|
||||
0x02,0x31,0xFB,0xFE,0x32,0x33,0x34,0xFF,0xA0,0x19,0xF9,0x01,
|
||||
0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,
|
||||
0xF9,0x00,0xF5,0x4F,0xFF,0x25,0x1D,0xF9,0x01,0x43,0x44,0x45,
|
||||
0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0xFA,0xFC,
|
||||
0x4F,0xFA,0xFE,0x4F,0x4F,0xFA,0x02,0x4F,0xFA,0x04,0xFF,0x25,
|
||||
0x1D,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0xFA,
|
||||
0xFF,0x4D,0xFA,0xFD,0x4E,0xFA,0xFC,0x4F,0xFA,0xF6,0x4F,0xFA,
|
||||
0xF7,0x4F,0xFA,0xF8,0x4F,0xFA,0xF9,0x4F,0xFA,0xFA,0x4F,0xFA,
|
||||
0xFB,0x4F,0xFA,0xFC,0x4F,0xFA,0xFD,0x4F,0xFA,0xFE,0x4F,0xFA,
|
||||
0xFE,0x4F,0xFA,0xFF,0x4F,0xFA,0xFF,0x4F,0xFA,0xFF,0x4F,0x4F,
|
||||
0x4F,0x4F,0xFA,0x01,0x4F,0xFA,0x01,0x4F,0xFA,0x02,0x4F,0xFA,
|
||||
0x02,0x4F,0xFA,0x03,0x4F,0xFA,0x04,0x4F,0xFA,0x05,0x4F,0xFA,
|
||||
0x06,0x4F,0xF8,0x00,0x06,0xFF,0x49,0x1D,0xF9,0x03,0x50,0xFF,
|
||||
0xA1,0x1C,0xF9,0x05,0xFB,0xFC,0x32,0x33,0x34,0xFF,0xA0,0x19,
|
||||
0xF9,0x05,0xFB,0x01,0xFA,0x03,0xF7,0x25,0x1E,0x66,0xFB,0x02,
|
||||
0xFA,0x06,0x67,0xFB,0xFF,0xFA,0x09,0x68,0xFA,0x0C,0x69,0xFB,
|
||||
0xFE,0xF8,0x00,0x0F,0xFF,0x49,0x1D,0x66,0xFB,0x02,0xFA,0x03,
|
||||
0x67,0xFB,0xFF,0xFA,0x04,0x68,0xFA,0x05,0x69,0xFB,0xFE,0xF8,
|
||||
0x00,0x06,0xFF,0x49,0x1D,0xF9,0x05,0xFB,0xFF,0xFA,0xFC,0x66,
|
||||
0xFB,0xFF,0xFA,0x03,0xFB,0xFD,0xFA,0x01,0xF4,0xFB,0x01,0xF2,
|
||||
0x01,0x6B,0xFB,0x02,0x6C,0xF2,0x01,0x6D,0xFF,0xB3,0x1F,0x79,
|
||||
0xFB,0x01,0x7A,0x7B,0xFB,0x02,0x7C,0xFB,0x04,0x7D,0xFB,0x03,
|
||||
0x7E,0xFB,0xFC,0x56,0xF2,0x01,0xF4,0xFB,0xFC,0x74,0xFB,0xFE,
|
||||
0x75,0x76,0x77,0xFF,0xA0,0x19,0xFB,0xFB,0xFF,0xA0,0x19,0xF9,
|
||||
0x01,0x79,0xFB,0x01,0x7A,0xFB,0x01,0x7B,0xFB,0x03,0x7C,0xFB,
|
||||
0x04,0x7D,0xFB,0x03,0x7E,0xFB,0xFF,0xFB,0x03,0x7F,0x80,0x81,
|
||||
0x82,0x83,0x84,0xFF,0xA0,0x19,0xF9,0x01,0x79,0xFB,0x01,0x7A,
|
||||
0xFB,0x01,0x7B,0xFB,0x03,0x7C,0xFB,0x04,0x7D,0xFB,0x03,0x7E,
|
||||
0xFB,0xFF,0xFB,0x02,0x7F,0x80,0x81,0x82,0x83,0x84,0xFF,0xA0,
|
||||
0x19,0xF9,0x01,0x79,0xFB,0x01,0x7A,0xFB,0x01,0x7B,0xFB,0x03,
|
||||
0x7C,0xFB,0x04,0x7D,0xFB,0x03,0x7E,0xFB,0xFF,0xFB,0x01,0x7F,
|
||||
0x80,0x81,0x82,0x83,0x84,0xFF,0xA0,0x19,0xF9,0x01,0x79,0xFB,
|
||||
0x01,0x7A,0xFB,0x01,0x7B,0xFB,0x03,0x7C,0xFB,0x04,0x7D,0xFB,
|
||||
0x03,0x7E,0xFB,0xFF,0x7F,0x80,0x81,0x82,0x83,0x84,0xFF,0xA0,
|
||||
0x19,0xF9,0x01,0x79,0xFB,0x01,0x7A,0xFB,0x01,0x7B,0xFB,0x03,
|
||||
0x7C,0xFB,0x04,0x7D,0xFB,0x03,0x7E,0xFB,0xFE,0x80,0x81,0x82,
|
||||
0x83,0x84,0xFF,0xA0,0x19,0xF9,0x01,0x79,0xFF,0xFC,0x1E,0xF9,
|
||||
0x01,0x79,0xFB,0x01,0x7A,0xFB,0x01,0x7B,0xFB,0x03,0x7C,0xFB,
|
||||
0x04,0x7D,0xFB,0xFF,0x7F,0x80,0x81,0x82,0x83,0x84,0xFF,0xA0,
|
||||
0x19,0xF9,0x01,0x79,0xFB,0x01,0x7A,0xFB,0x01,0x7B,0xFB,0x03,
|
||||
0x7C,0xFB,0x02,0x81,0x82,0x83,0x84,0xFF,0xA0,0x19,0xF9,0x01,
|
||||
0x79,0xFB,0x01,0x7A,0xFB,0x01,0x7B,0xFB,0x02,0x7C,0xFB,0x02,
|
||||
0x81,0x82,0x83,0x84,0xFF,0xA0,0x19,0xF9,0x01,0x79,0xFB,0x01,
|
||||
0x7A,0xFB,0x01,0x7B,0xFB,0x02,0x7C,0xFB,0x01,0x81,0x82,0x83,
|
||||
0x84,0xFF,0xA0,0x19,0xF9,0x01,0x79,0xFB,0x01,0x7A,0xFB,0x01,
|
||||
0x7B,0xFB,0x02,0x83,0x84,0xFF,0xA0,0x19,0xF9,0x01,0x79,0xFB,
|
||||
0x01,0x7A,0xFB,0x01,0x7B,0xFB,0x01,0x83,0x84,0xFF,0xA0,0x19,
|
||||
0xF9,0x01,0x79,0xFB,0x01,0x7A,0xFB,0x01,0x84,0xFF,0xA0,0x19,
|
||||
0xF9,0x01,0x79,0xFB,0x01,0x84,0xFF,0xA0,0x19,0xF9,0x01,0xFB,
|
||||
0x01,0x6B,0xFB,0x02,0x6C,0x6D,0xFF,0xAF,0x1F,0xF9,0x05,0xFB,
|
||||
0x01,0x6E,0x6F,0xFB,0x02,0x70,0x71,0xFB,0x01,0x72,0x73,0x74,
|
||||
0xFB,0xFC,0x75,0x76,0x77,0xFF,0xA0,0x19,0xF9,0x01,0xF3,0x01,
|
||||
0xE5,0xE5,0xE5,0xE5,0xE5,0xE5,0xE6,0xE7,0xE8,0xFF,0xDA,0x1F,
|
||||
0xF9,0x01,0xFB,0xFB,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,
|
||||
0x85,0x85,0x86,0x86,0x86,0x30,0xFB,0x01,0x31,0xFB,0xFE,0xF9,
|
||||
0x05,0x32,0xF9,0x01,0x33,0x34,0xFF,0xA0,0x19,0xF9,0x01,0xFB,
|
||||
0xFB,0xEA,0xEC,0xEE,0xF0,0x86,0xFB,0xFF,0xFF,0xA0,0x19,0xF9,
|
||||
0x01,0xFB,0x04,0xBF,0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xF2,0x03,
|
||||
0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCD,0xCD,0xF3,0x01,
|
||||
0xCD,0xCD,0xC9,0xC6,0xFB,0xFC,0xFF,0xA0,0x19,0xF9,0x05,0xF4,
|
||||
0xFB,0x01,0x6B,0xFB,0x02,0x6C,0xF9,0x01,0x6D,0xFF,0x36,0x20,
|
||||
0xF9,0x01,0xFA,0xFE,0xFB,0x01,0x6B,0xFB,0x02,0x6C,0x6D,0xFB,
|
||||
0x01,0x6E,0x6F,0xFB,0x02,0x70,0x71,0xFB,0x01,0xFA,0x01,0x72,
|
||||
0xFA,0x01,0x73,0xFB,0xFE,0xFF,0x78,0x19,0xF9,0x05,0xF4,0xFA,
|
||||
0xFE,0xFB,0x01,0xFB,0x02,0x6C,0x6D,0x6D,0x6D,0x6D,0x6D,0x6D,
|
||||
0x6D,0x6D,0x6D,0x6D,0x6D,0x6D,0x6D,0x6D,0x6D,0x6D,0x6D,0x6D,
|
||||
0x6D,0x6D,0x6D,0x6D,0x6D,0x6D,0x6D,0x6D,0x6D,0x6D,0x6D,0xFB,
|
||||
0x01,0x6E,0x6E,0x6E,0x6F,0xFB,0x02,0x70,0x71,0xFB,0x01,0xFA,
|
||||
0x01,0x72,0xFA,0x01,0x73,0x74,0xFB,0xFC,0x75,0x76,0x77,0xFF,
|
||||
0xA0,0x19,0xF9,0x05,0xF4,0xFA,0xFE,0xFB,0x03,0xB9,0xF6,0xB9,
|
||||
0xFF,0xA5,0x20,0xF9,0x05,0xFF,0xAE,0x20,0xF9,0x01,0xF6,0xB3,
|
||||
0xB4,0xB5,0xB6,0xFB,0x01,0xB7,0xFB,0xFC,0xB9,0xFF,0xBA,0x20,
|
||||
0xF9,0x01,0xF4,0xFB,0x04,0xB1,0xF6,0xB1,0xFF,0xC5,0x20,0xF9,
|
||||
0x01,0xB2,0xF6,0xB2,0xFF,0xCD,0x20,0xFF,0x5A,0x20,0xF8,0x00,
|
||||
0x00,0xF9,0x04,0xB9,0xFF,0xD9,0x20,0xF9,0x05,0xFB,0xFB,0xFA,
|
||||
0xFF,0xF2,0x01,0xD9,0xDA,0xDB,0xFB,0x01,0xDC,0xFB,0xFC,0xFA,
|
||||
0xFD,0xF2,0x01,0xDD,0xFB,0xFC,0xFA,0xFE,0xDE,0xFB,0xFE,0xFA,
|
||||
0xFD,0xDF,0xFB,0xFD,0xFA,0xF8,0xF2,0x04,0xF2,0x01,0xE0,0xFB,
|
||||
0xFF,0xFA,0xFF,0xE1,0xFB,0xFD,0xFA,0xFC,0xE2,0xFB,0xFF,0xFA,
|
||||
0xFB,0xF2,0x01,0xE3,0xFB,0xFE,0xFA,0xFF,0xE4,0x00,0xF2,0x01,
|
||||
0x00,0x00,0x00,0xF2,0x01,0x00,0x00,0x00,0xF2,0x01,0x00,0x00,
|
||||
0x00,0xF2,0x01,0xF1,0x00,0xFF,0x2E,0x21,0x36,0xFF,0x32,0x21,
|
||||
0x55,0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x44,
|
||||
0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x53,0x54,0x4C,0xFF,0x4B,
|
||||
0x21,0xFB,0x01,0x30,0xFB,0x02,0x31,0xFB,0x06,0x32,0xFB,0x01,
|
||||
0x33,0xFB,0xFF,0x34,0xFB,0x01,0x35,0xFB,0x01,0xFF,0x51,0x21,
|
||||
0xFB,0x01,0x37,0x38,0xFF,0x32,0x21,0x4D,0x4E,0x4F,0x50,0x51,
|
||||
0x52,0xFB,0x01,0x36,0x36,0x36,0x36,0x36,0x36,0x39,0x3A,0x3B,
|
||||
0x3C,0x3D,0xFB,0x02,0x3E,0xFB,0xFF,0x3F,0xFB,0xFD,0x40,0x41,
|
||||
0xFB,0xFF,0x42,0xFE,0xFB,0x10,0xFB,0x03,0xFF,0x54,0x21,0x0B,
|
||||
0xFF,0x95,0x21,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0xFE,
|
||||
0xFB,0x08,0x0B,0xFF,0x95,0x21,0xFE,0xFB,0x0B,0x0C,0xFB,0x01,
|
||||
0x0D,0xFB,0x01,0x0E,0xFB,0x03,0x0F,0xFB,0x01,0x10,0x11,0xFF,
|
||||
0xB8,0x21,0x13,0xFF,0xBC,0x21,0x14,0xFF,0xC0,0x21,0x15,0xFB,
|
||||
0x01,0x16,0x17,0x18,0xFB,0x01,0x19,0xFB,0xFD,0x1A,0xFB,0xFE,
|
||||
0x1B,0xFB,0xFC,0x1C,0xFB,0xFD,0x1D,0xFB,0xFE,0x1E,0xFB,0xFD,
|
||||
0x1F,0xFB,0xFF,0x20,0x21,0xFF,0xE2,0x21,0x25,0xFF,0xE6,0x21,
|
||||
0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0xFE,
|
||||
0xFB,0x0C,0x0B,0xFF,0xF8,0x21,0x0B,0x0B,0xFE,0xFB,0x0D,0x2F,
|
||||
0x2E,0x2D,0x2C,0x2B,0x2A,0x29,0x28,0x27,0x26,0x25,0x24,0x24,
|
||||
0x24,0x23,0x23,0x23,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x23,
|
||||
0x23,0x24,0x24,0x24,0x23,0x23,0x23,0x22,0x22,0x22,0x22,0x22,
|
||||
0x22,0x22,0x23,0x23,0x24,0x24,0x24,0x23,0x23,0x23,0x22,0x22,
|
||||
0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x23,0x23,0x23,0x24,0xFF,
|
||||
0x3C,0x22,0x01,0x12,0xFF,0x41,0x22,0xF9,0x01,0xBA,0xFB,0x05,
|
||||
0xBA,0xFB,0x03,0xBB,0xFB,0x04,0xFF,0x47,0x22,0xBA,0xFF,0x53,
|
||||
0x22,0xBC,0xFF,0x57,0x22,0xF9,0x00,0xBA,0xBA,0xBA,0xBC,0xBC,
|
||||
0xBC,0xBC,0xBC,0xBC,0xBC,0xBC,0xFE,0xFB,0x08,0xFF,0x47,0x22,
|
||||
0xBA,0xBA,0xBC,0xFF,0x70,0x22,
|
||||
};
|
||||
|
||||
/* Раскладка kid_data.bin: кадры (KID_NFRAMES*5), затем seqtbl. */
|
||||
#define KID_BIN_FRAMES_OFF 0
|
||||
#define KID_BIN_SEQTBL_OFF 1205
|
||||
|
||||
#define KID_NSEQ 115
|
||||
static const uint16_t kid_seq_off[KID_NSEQ] = {
|
||||
|
||||
@@ -2,6 +2,10 @@
|
||||
* pop_kid.c — движок Kid (Фаза K1): порт seg006.c play_seq/load_frame +
|
||||
* seqtbl-интерпретатор. Данные — kid_data.h.
|
||||
*/
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <sprinter.h>
|
||||
#include <sprinter_mem.h>
|
||||
#include <graphics.h>
|
||||
#include <gfx.h>
|
||||
#include <sprite.h>
|
||||
@@ -75,8 +79,90 @@ void pop_kid_free(void)
|
||||
kid_npages = 0;
|
||||
}
|
||||
|
||||
/* ---- seqtbl-доступ (база SEQTBL_BASE) ------------------------------ */
|
||||
#define SEQ(cs) kid_seqtbl[(uint16_t)((cs) - SEQTBL_BASE)]
|
||||
/* ---- Данные анимации в EMM-странице (kid_data.bin) ------------------ *
|
||||
* Таблица кадров (241*5 Б) и seqtbl (2310 Б) занимали 3.5 КБ в _CODE окна
|
||||
* W1/W2 — самый дефицитный ресурс. Теперь они лежат в отдельной EMM-
|
||||
* странице, которая маппится в W0 РОВНО на время play_seq (раз за тик), а
|
||||
* весь остальной код читает cur_frame — 5-байтовую копию текущего кадра.
|
||||
* Это ровно устройство оригинала: load_frame (seg006) заполняет cur_frame,
|
||||
* и коллизия/отрисовка работают с ним, а не с таблицей.
|
||||
* Страница адресуется как у pop_level: данные с 0x100, ниже — ISR-стаб. */
|
||||
extern void _gfx_w0_isr(void);
|
||||
|
||||
#define KD_DATA_OFF 0x100u
|
||||
/* Адрес кадра i в замапленной странице. Считаем В uint16_t и кастуем ОДИН
|
||||
* раз: запись `(const uint8_t *)CONST + (uint16_t)i * 5u` SDCC 4.5 собирает
|
||||
* НЕВЕРНО — умножение делает в 16 битах (add hl,hl / add hl,bc), а потом
|
||||
* берёт только МЛАДШИЙ байт результата и подставляет старший байт константы
|
||||
* (`ld c,l` / `inc b`). Для кадров i >= 52 (i*5 >= 256) адрес уезжает на
|
||||
* −256*k, и cur_frame наполняется чужой строкой таблицы: у бега/шага/подъёма
|
||||
* пропадал бит FRAME_NEEDS_FLOOR, и Kid проваливался сквозь пол.
|
||||
* Артефакт: .sprinter-cc-roomtest/pop_kid.asm, функция load_frame. */
|
||||
static const uint8_t *kd_frame_ptr(uint8_t i)
|
||||
{
|
||||
uint16_t off = (uint16_t)i;
|
||||
off += (uint16_t)(off << 2); /* i*5 = i + i*4, без умножения */
|
||||
off += (uint16_t)(KD_DATA_OFF + KID_BIN_FRAMES_OFF);
|
||||
return (const uint8_t *)off;
|
||||
}
|
||||
#define KD_SEQ(cs) (*((const uint8_t *)(KD_DATA_OFF + KID_BIN_SEQTBL_OFF) + \
|
||||
(uint16_t)((cs) - SEQTBL_BASE)))
|
||||
/* Байт seqtbl по адресу оригинала (база SEQTBL_BASE); ТОЛЬКО под замапленной
|
||||
* страницей данных — то есть внутри play_seq. */
|
||||
#define SEQ(cs) KD_SEQ(cs)
|
||||
|
||||
static uint8_t kdat_blk, kdat_page, kdat_ok;
|
||||
|
||||
/* Текущий кадр (порт глобала cur_frame, seg006): 5 байт вместо таблицы. */
|
||||
static kframe cur_frame;
|
||||
|
||||
int pop_kid_data_load(const char *path)
|
||||
{
|
||||
uint8_t *pg = (uint8_t *)0xC000; /* страница мапится в W3 на время чтения */
|
||||
uint8_t saved_w3, blk;
|
||||
uint16_t stub;
|
||||
int fd, n;
|
||||
|
||||
fd = open(path, O_RDONLY);
|
||||
if (fd < 0) return -1;
|
||||
blk = mem_alloc_pages(1);
|
||||
if (!blk) { close(fd); return -1; }
|
||||
kdat_blk = blk;
|
||||
kdat_page = mem_get_page(blk, 0);
|
||||
|
||||
saved_w3 = _io_page_w3;
|
||||
sprinter_page_w3(kdat_page);
|
||||
n = read(fd, pg + KD_DATA_OFF, 16384 - KD_DATA_OFF);
|
||||
if (n >= (int)(KID_BIN_SEQTBL_OFF + KID_SEQTBL_LEN)) {
|
||||
stub = (uint16_t)&_gfx_w0_isr; /* ISR-стаб W0-страницы (как pop_level) */
|
||||
pg[0x38] = 0xC3;
|
||||
pg[0x39] = (uint8_t)(stub & 0xFF);
|
||||
pg[0x3A] = (uint8_t)(stub >> 8);
|
||||
pg[0x66] = 0xED; pg[0x67] = 0x45; /* RETN */
|
||||
}
|
||||
sprinter_page_w3(saved_w3);
|
||||
close(fd);
|
||||
if (n < (int)(KID_BIN_SEQTBL_OFF + KID_SEQTBL_LEN)) { mem_free_block(blk); return -1; }
|
||||
kdat_ok = 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void pop_kid_data_free(void)
|
||||
{
|
||||
if (kdat_ok) { mem_free_block(kdat_blk); kdat_ok = 0; }
|
||||
}
|
||||
|
||||
/* load_frame (seg006:0293): скопировать кадр Kid.frame из таблицы в
|
||||
* cur_frame. Звать ТОЛЬКО когда страница данных замаплена в W0. */
|
||||
static void load_frame(void)
|
||||
{
|
||||
const uint8_t *f = kd_frame_ptr(Kid.frame);
|
||||
cur_frame.image = f[0];
|
||||
cur_frame.dx = (int8_t)f[1];
|
||||
cur_frame.dy = (int8_t)f[2];
|
||||
cur_frame.flags = f[3];
|
||||
cur_frame.sword = f[4];
|
||||
}
|
||||
|
||||
static uint8_t char_dx_forward(int8_t dx)
|
||||
{
|
||||
@@ -84,17 +170,23 @@ static uint8_t char_dx_forward(int8_t dx)
|
||||
return (uint8_t)(Kid.x + dx);
|
||||
}
|
||||
|
||||
/* Аксессоры к текущему кадру (для pop_map — без дублирования kid_frames). */
|
||||
int8_t kid_cur_dx(void) { return kid_frames[Kid.frame].dx; }
|
||||
uint8_t kid_cur_flags(void) { return kid_frames[Kid.frame].flags; }
|
||||
/* Аксессоры к текущему кадру (для pop_map): читают cur_frame, НЕ таблицу —
|
||||
* их дёргают несколько раз за кадр, маппинг страницы тут недопустим. */
|
||||
int8_t kid_cur_dx(void) { return cur_frame.dx; }
|
||||
uint8_t kid_cur_flags(void) { return cur_frame.flags; }
|
||||
|
||||
/* seqtbl_offset_char: сменить последовательность Kid (единая точка —
|
||||
* pop_ctrl/pop_map зовут ЕЁ, а не дублируют kid_seq_off/kid_seqtbl). */
|
||||
void kid_set_seq(uint8_t seq_id) { Kid.curr_seq = kid_seq_off[seq_id]; }
|
||||
|
||||
/* play_seq (seg006.c:570): крутит опкоды до КАДРА (байт < 0xF0). */
|
||||
/* play_seq (seg006.c:570): крутит опкоды до КАДРА (байт < 0xF0).
|
||||
* Страница данных маппится в W0 на ВЕСЬ разбор — один map/unmap за вызов
|
||||
* (в тике, до отрисовки: конфликта с атласом в W0 нет). В конце —
|
||||
* load_frame: пока страница ещё замаплена, копируем кадр в cur_frame. */
|
||||
void play_seq(void)
|
||||
{
|
||||
if (!kdat_ok) return;
|
||||
gfx_w0_map(kdat_page);
|
||||
for (;;) {
|
||||
uint8_t cmd = SEQ(Kid.curr_seq);
|
||||
Kid.curr_seq++;
|
||||
@@ -154,6 +246,8 @@ void play_seq(void)
|
||||
break;
|
||||
default: /* КАДР */
|
||||
Kid.frame = cmd;
|
||||
load_frame(); /* cur_frame := таблица[frame] (страница ещё в W0) */
|
||||
gfx_w0_unmap();
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -280,7 +374,7 @@ void kid_heal(void)
|
||||
|
||||
void kid_draw(void)
|
||||
{
|
||||
kframe fr = kid_frames[Kid.frame];
|
||||
kframe fr = cur_frame; /* load_frame уже положил кадр (play_seq) */
|
||||
int fwd, obj_x, obj_y, top;
|
||||
uint8_t page, idx;
|
||||
const uint8_t *img;
|
||||
|
||||
@@ -34,6 +34,13 @@ extern int8_t knock;
|
||||
* 0 — OK, -1 — ошибка. */
|
||||
int pop_kid_load(uint8_t npages);
|
||||
|
||||
/* Данные анимации (таблица кадров + seqtbl) — отдельная EMM-страница
|
||||
* (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);
|
||||
void pop_kid_data_free(void);
|
||||
|
||||
/* Атлас chtab_0 «меч в руке» (sword.atl) — спрайт клинка поверх Kid в кадрах
|
||||
* подъёма меча/убирания в ножны (add_sword_to_objtable, seg006:1798).
|
||||
* Грузить ДО initgraph, как и страницы Kid. 0 — OK, -1 — ошибка (тогда
|
||||
|
||||
@@ -202,6 +202,10 @@ int main(void)
|
||||
puts("pop_bg_load failed");
|
||||
return 1;
|
||||
}
|
||||
if (pop_kid_data_load("kid_data.bin") != 0) { /* кадры+seqtbl в EMM-странице */
|
||||
printf("kid_data.bin load failed\n");
|
||||
return 1;
|
||||
}
|
||||
pop_sword_load(); /* меч в руке (без него кадры 229+ без клинка) */
|
||||
if (pop_kid_load(28) != 0) { /* ВСЕ страницы: бег+стоп+разворот+присед+прыжок */
|
||||
puts("kid atlas load failed");
|
||||
@@ -484,6 +488,7 @@ int main(void)
|
||||
closegraph();
|
||||
pop_bg_free();
|
||||
pop_kid_free();
|
||||
pop_kid_data_free();
|
||||
pop_level_free();
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -15,6 +15,8 @@ import os
|
||||
import re
|
||||
|
||||
SRC = "/Users/alex/Projects/DIY/Z80/Sprinter/C-Compiler/applications/PoP/SDLPoP/src"
|
||||
OUT_BIN_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)),
|
||||
"..", "poc", "res", "kid")
|
||||
OUT = os.path.join(os.path.dirname(os.path.abspath(__file__)),
|
||||
"..", "roomtest", "kid_data.h")
|
||||
SEQTBL_BASE = 0x196E
|
||||
@@ -74,22 +76,21 @@ def main():
|
||||
f.write("#ifndef KID_DATA_H\n#define KID_DATA_H\n#include <stdint.h>\n\n")
|
||||
f.write("#define SEQTBL_BASE 0x%04Xu\n\n" % SEQTBL_BASE)
|
||||
|
||||
# frame table
|
||||
f.write("/* {image, dx, dy, flags, sword}; chtab = sword>>6 (0=kid). */\n")
|
||||
# frame table и seqtbl В .h НЕ ПОПАДАЮТ — они уезжают в kid_data.bin
|
||||
# (EMM-страница): 3.5 КБ в _CODE окна W1/W2 нам дороже, чем один
|
||||
# gfx_w0_map за тик. См. applications/PoP/docs/layout_plan_v2.md §5.1.
|
||||
f.write("/* {image, dx, dy, flags, sword}; chtab = sword>>6 (0=kid).\n"
|
||||
" * САМА таблица кадров и seqtbl лежат в kid_data.bin (EMM-\n"
|
||||
" * страница); здесь только тип и размеры. */\n")
|
||||
f.write("typedef struct { uint8_t image; int8_t dx, dy; "
|
||||
"uint8_t flags, sword; } kframe;\n")
|
||||
f.write("#define KID_NFRAMES %d\n" % len(frames))
|
||||
f.write("static const kframe kid_frames[KID_NFRAMES] = {\n")
|
||||
for (img, dx, dy, fl, sw) in frames:
|
||||
dxs = dx - 256 if dx > 127 else dx
|
||||
dys = dy - 256 if dy > 127 else dy
|
||||
f.write(" {%3d,%4d,%4d,0x%02X,0x%02X},\n" % (img, dxs, dys, fl, sw))
|
||||
f.write("};\n\n")
|
||||
f.write("#define KID_SEQTBL_LEN %d\n\n" % len(seqtbl))
|
||||
|
||||
# seqtbl bytes
|
||||
f.write("#define KID_SEQTBL_LEN %d\n" % len(seqtbl))
|
||||
f.write("static const uint8_t kid_seqtbl[KID_SEQTBL_LEN] = {\n")
|
||||
f.write(emit_c(seqtbl) + "\n};\n\n")
|
||||
# раскладка kid_data.bin (смещения ОТ НАЧАЛА ДАННЫХ страницы)
|
||||
f.write("/* Раскладка kid_data.bin: кадры (KID_NFRAMES*5), затем seqtbl. */\n")
|
||||
f.write("#define KID_BIN_FRAMES_OFF 0\n")
|
||||
f.write("#define KID_BIN_SEQTBL_OFF %d\n\n" % (len(frames) * 5))
|
||||
|
||||
# seq offsets
|
||||
f.write("#define KID_NSEQ %d\n" % len(offs))
|
||||
@@ -97,6 +98,15 @@ def main():
|
||||
f.write(emit_c(offs, 8, "0x%04X") + "\n};\n\n")
|
||||
f.write("#endif\n")
|
||||
|
||||
# kid_data.bin: кадры (по 5 байт) + seqtbl подряд
|
||||
os.makedirs(OUT_BIN_DIR, exist_ok=True)
|
||||
binpath = os.path.join(OUT_BIN_DIR, "kid_data.bin")
|
||||
with open(binpath, "wb") as b:
|
||||
for (img, dx, dy, fl, sw) in frames:
|
||||
b.write(bytes((img & 0xFF, dx & 0xFF, dy & 0xFF, fl & 0xFF, sw & 0xFF)))
|
||||
b.write(bytes(seqtbl))
|
||||
print(f"kid_data.bin: {len(frames)*5 + len(seqtbl)} Б -> {binpath}")
|
||||
|
||||
print(f"kid_data.h: {len(frames)} кадров, seqtbl {len(seqtbl)} Б, "
|
||||
f"{len(offs)} seq-оффсетов -> {OUT}")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user