diff --git a/applications/PoP/poc/res/kid/kid_data.bin b/applications/PoP/poc/res/kid/kid_data.bin new file mode 100644 index 0000000..cc643fe Binary files /dev/null and b/applications/PoP/poc/res/kid/kid_data.bin differ diff --git a/applications/PoP/roomtest/Makefile b/applications/PoP/roomtest/Makefile index 1ae97e0..7a67705 100644 --- a/applications/PoP/roomtest/Makefile +++ b/applications/PoP/roomtest/Makefile @@ -22,8 +22,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 +34,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) diff --git a/applications/PoP/roomtest/kid_data.h b/applications/PoP/roomtest/kid_data.h index 8f01566..8a0bdee 100644 --- a/applications/PoP/roomtest/kid_data.h +++ b/applications/PoP/roomtest/kid_data.h @@ -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] = { diff --git a/applications/PoP/roomtest/pop_kid.c b/applications/PoP/roomtest/pop_kid.c index 7861582..01700e8 100644 --- a/applications/PoP/roomtest/pop_kid.c +++ b/applications/PoP/roomtest/pop_kid.c @@ -2,6 +2,10 @@ * pop_kid.c — движок Kid (Фаза K1): порт seg006.c play_seq/load_frame + * seqtbl-интерпретатор. Данные — kid_data.h. */ +#include +#include +#include +#include #include #include #include @@ -75,8 +79,76 @@ 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 +#define KD_FRAMES(i) ((const uint8_t *)(KD_DATA_OFF + KID_BIN_FRAMES_OFF) + (uint16_t)(i) * 5u) +#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_FRAMES(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 +156,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 +232,8 @@ void play_seq(void) break; default: /* КАДР */ Kid.frame = cmd; + load_frame(); /* cur_frame := таблица[frame] (страница ещё в W0) */ + gfx_w0_unmap(); return; } } @@ -280,7 +360,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; diff --git a/applications/PoP/roomtest/pop_kid.h b/applications/PoP/roomtest/pop_kid.h index e79d929..47847ac 100644 --- a/applications/PoP/roomtest/pop_kid.h +++ b/applications/PoP/roomtest/pop_kid.h @@ -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 — ошибка (тогда diff --git a/applications/PoP/roomtest/roomtest.c b/applications/PoP/roomtest/roomtest.c index ee3713d..3df6f1d 100644 --- a/applications/PoP/roomtest/roomtest.c +++ b/applications/PoP/roomtest/roomtest.c @@ -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; } diff --git a/applications/PoP/toolchain/pop_extract_kid_data.py b/applications/PoP/toolchain/pop_extract_kid_data.py index b4f93a8..a13b55c 100644 --- a/applications/PoP/toolchain/pop_extract_kid_data.py +++ b/applications/PoP/toolchain/pop_extract_kid_data.py @@ -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 \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}")