Прошу прощения, действительно текст выводится через lk4_10WriteWindow. Просто печатал в пути, вот и задумался и перепутал Ну давай разберемся Буду объяснять на прошивке E200XEGJ2 Давай посмотрим например менюху сообщений (меню-5). Думаю, раз ты уже хочешь взяться за тумбу, то на мсс значит понимаешь. Так вот, смотрим адрес менюхи сообщений (202F353C)
202F353C 17 0B 1800 0000 0000 00000000 0000 0000 Выполнить 0xB x2=24 x3=0 x4=0 x5=0 x6=0
202F354C 1B 00 0000 0000 0000 D8CC4821 0000 0000 Вызов подпрограммы 0x2148CCD8
202F355C 5C 00 0000 0000 0000 00000000 0100 0000 Подготовка окна
202F356C 78 00 0000 0000 0000 00000000 0000 0000 Пункт меню 1 будет выбран по умолчанию
202F357C 75 00 0100 0041 0000 00000000 3000 0000 Начало меню, ширина 48
202F358C 6D 03 0000 0000 0000 00000000 0000 0000 MCC_SET_KEYBOARD
[b]202F359C 7C 24 0000 0800 0200 00000000 0000 0000 Меню 0x24 из 8 пунктов[/b]
202F35AC 76 24 0000 0000 C202 00000000 1000 0000 Отобразить меню 0x24 с параметром 2C2
202F35BC 79 00 0000 0000 0000 F02BBE20 0000 0000 По пункту меню 1 переход на адрес 0x20BE2BF0
202F35CC 79 00 0100 0000 0000 CC372F20 0000 0000 По пункту меню 2 переход на адрес 0x202F37CC
202F35DC 79 00 0200 0000 0000 0C3C2F20 0000 0000 По пункту меню 3 переход на адрес 0x202F3C0C
202F35EC 79 00 0300 0000 0000 48CA4821 0000 0000 По пункту меню 4 переход на адрес 0x2148CA48
202F35FC 79 00 0400 0000 0000 AC412F20 0000 0000 По пункту меню 5 переход на адрес 0x202F41AC
202F360C 79 00 0500 0000 0000 FC462F20 0000 0000 По пункту меню 6 переход на адрес 0x202F46FC
202F361C 79 00 0600 0000 0000 84EA7120 0000 0000 По пункту меню 7 переход на адрес 0x2071EA84
202F362C 79 00 0700 0000 0000 C40F8921 0000 0000 По пункту меню 8 переход на адрес 0x21890FC4
202F363C 18 09 0100 0F00 0000 B0D5BA20 0000 0000 Если нажать кнопку "правая софт" то переход на 0x20BAD5B0
202F364C 19 09 0100 0200 0000 B0D5BA20 0000 0000 Или если нажать кнопку "С кратко" то переход на 0x20BAD5B0
202F365C 19 09 0100 0900 0000 48D22A20 0000 0000 Или если нажать кнопку "вкл/выкл (красная)" то переход на 0x202AD248
202F366C 19 09 0100 0600 0000 6CD4BD20 0000 0000 Или если нажать кнопку "влево" то переход на 0x20BDD46C
202F367C 19 09 0100 0700 0000 10629121 0000 0000 Или если нажать кнопку "вправо" то переход на 0x21916210
202F368C 38 00 0000 0000 0000 00000000 0000 0000 Завершение МСС скрипта
Нас интересует 202F359C 7C 24 0000 0800 0200 00000000 0000 0000 Меню 0x24 из 8 пунктов Разберем эту строку =) 7C 24 - это означает - mcc_menu_config 0x24 00 00 - означает нулевой кейс в конфиге. 08 00 - Количество пунктов. 02 00 - Тип меню. Так вот мы выясняли, что строение этого меню находится в нулевом кейсе mcc_menu_config 0x24. Открываем в правой части бин едита вкладку MCC. Ищем там : 20E0FFFC 7C24 MCC_MENU_CONFIG 24 Дважды щелкаем по ней. Открылось нам строение MCC_MENU_CONFIG. Дальше вспоминаем какой кейс у меню. В данном случае нулевой. Вот "массив" всех кейсов в этой мсс.
20E10030: 2900 DCD 0x0029 ;B loc_20E10080 ;при 0x0000 ;Переход по адресу 0x20E10080
20E10032: 2800 DCD 0x0028 ;B loc_20E1007E ;при 0x0001 ;Переход по адресу 0x20E1007E
20E10034: EF00 DCD 0x00EF ;B loc_20E1020C ;при 0x0002 ;Переход по адресу 0x20E1020C
20E10036: 4501 DCD 0x0145 ;B loc_20E102B8 ;при 0x0003 ;Переход по адресу 0x20E102B8
20E10038: 8101 DCD 0x0181 ;B loc_20E10330 ;при 0x0004 ;Переход по адресу 0x20E10330
20E1003A: DF01 DCD 0x01DF ;B loc_20E103EC ;при 0x0005 ;Переход по адресу 0x20E103EC
20E1003C: 1002 DCD 0x0210 ;B loc_20E1044E ;при 0x0006 ;Переход по адресу 0x20E1044E
20E1003E: 4D02 DCD 0x024D ;B loc_20E104C8 ;при 0x0007 ;Переход по адресу 0x20E104C8
20E10040: F903 DCD 0x03F9 ;B loc_20E10820 ;при 0x0008 ;Переход по адресу 0x20E10820
20E10042: 5104 DCD 0x0451 ;B loc_20E108D0 ;при 0x0009 ;Переход по адресу 0x20E108D0
20E10044: 2903 DCD 0x0329 ;B loc_20E10680 ;при 0x000A ;Переход по адресу 0x20E10680
20E10046: 8E04 DCD 0x048E ;B loc_20E1094A ;при 0x000B ;Переход по адресу 0x20E1094A
20E10048: D604 DCD 0x04D6 ;B loc_20E109DA ;при 0x000C ;Переход по адресу 0x20E109DA
20E1004A: 6905 DCD 0x0569 ;B loc_20E10B00 ;при 0x000D ;Переход по адресу 0x20E10B00
20E1004C: 3006 DCD 0x0630 ;B loc_20E10C8E ;при 0x000E ;Переход по адресу 0x20E10C8E
20E1004E: B107 DCD 0x07B1 ;B loc_20E10F90 ;при 0x000F ;Переход по адресу 0x20E10F90
20E10050: 430A DCD 0x0A43 ;B loc_20E114B4 ;при 0x0010 ;Переход по адресу 0x20E114B4
20E10052: 2800 DCD 0x0028 ;B loc_20E1007E ;при 0x0011 ;Переход по адресу 0x20E1007E
20E10054: 8D08 DCD 0x088D ;B loc_20E11148 ;при 0x0012 ;Переход по адресу 0x20E11148
20E10056: D408 DCD 0x08D4 ;B loc_20E111D6 ;при 0x0013 ;Переход по адресу 0x20E111D6
20E10058: 4209 DCD 0x0942 ;B loc_20E112B2 ;при 0x0014 ;Переход по адресу 0x20E112B2
20E1005A: 150B DCD 0x0B15 ;B loc_20E11658 ;при 0x0015 ;Переход по адресу 0x20E11658
20E1005C: FD0B DCD 0x0BFD ;B loc_20E11828 ;при 0x0016 ;Переход по адресу 0x20E11828
20E1005E: 9103 DCD 0x0391 ;B loc_20E10750 ;при 0x0017 ;Переход по адресу 0x20E10750
20E10060: FE0C DCD 0x0CFE ;B loc_20E11A2A ;при 0x0018 ;Переход по адресу 0x20E11A2A
20E10062: CB0D DCD 0x0DCB ;B loc_20E11BC4 ;при 0x0019 ;Переход по адресу 0x20E11BC4
20E10064: 9B0E DCD 0x0E9B ;B loc_20E11D64 ;при 0x001A ;Переход по адресу 0x20E11D64
20E10066: 2E0F DCD 0x0F2E ;B loc_20E11E8A ;при 0x001B ;Переход по адресу 0x20E11E8A
20E10068: E30F DCD 0x0FE3 ;B loc_20E11FF4 ;при 0x001C ;Переход по адресу 0x20E11FF4
20E1006A: D710 DCD 0x10D7 ;B loc_20E121DC ;при 0x001D ;Переход по адресу 0x20E121DC
20E1006C: 9B10 DCD 0x109B ;B loc_20E12164 ;при 0x001E ;Переход по адресу 0x20E12164
20E1006E: 2411 DCD 0x1124 ;B loc_20E12276 ;при 0x001F ;Переход по адресу 0x20E12276
20E10070: 2800 DCD 0x0028 ;B loc_20E1007E ;при 0x0020 ;Переход по адресу 0x20E1007E
20E10072: C211 DCD 0x11C2 ;B loc_20E123B2 ;при 0x0021 ;Переход по адресу 0x20E123B2
20E10074: FD11 DCD 0x11FD ;B loc_20E12428 ;при 0x0022 ;Переход по адресу 0x20E12428
20E10076: 3812 DCD 0x1238 ;B loc_20E1249E ;при 0x0023 ;Переход по адресу 0x20E1249E
20E10078: C912 DCD 0x12C9 ;B loc_20E125C0 ;при 0x0024 ;Переход по адресу 0x20E125C0
20E1007A: 6C13 DCD 0x136C ;B loc_20E12706 ;при 0x0025 ;Переход по адресу 0x20E12706
20E1007C: F413 DCD 0x13F4 ;B loc_20E12816 ;при 0x0026 ;Переход по адресу 0x20E12816
Нас интересует нулевой кейс. Щелкаем по: ;при 0x0000 ;Переход по адресу 0x20E10080 Смотрим: loc_20E10080: ; CASE 0x0000 ; Переход с адреса 0x20E10030 20E10080: 0A2F CMP R7, #0xA ;Сравнить R7 и 10 20E10082: 55D1 BNE loc_20E10130 ;если не равно (not Z) то переход на адрес 0x20E10130 Здесь идет сравнение на тип меню (помнишь в мсс я показывал байт типа меню? ) Сравнивается байт с 0xA. Если не равно, то переход на... Вот в этом переходе описывается обычное меню. У нас был байт 02, а это не 0xA. Значит нам надо переходить по адресу 20E10130. Для примера, можешь открыть всплывающее меню сообщений. Там будет байт в мсс с типом меню не 02, а 0A. И тогда мы будет смотреть код дальше =) Итак, 20E10130. Не совсем удачное я выбрал меню. Тут текстовые ресурсы забивают на пункты с массива индексов. Вот : LDR R0, =0x214481EA ;R0 = значение по адресу (PC + 672)=[0x20E103D4]= 0x214481EA 20E10132: 0089 LDRH R0, [R0, #8] Загружаем адрес 214481EA, а потом с считываем 2 байта, прибавив 8 байт к адресу 214481EA Итак, в начале строения обычного меню (я буду рассматривать самые обычные случаи) - идет прорисовка заголовка. Заголовок нашего меню - это "Сообщения". Так вот, прибавляем к адресу 214481EA - 8 байт, получаем 214481F2. Открываем вкладку "Hex", вводим адрес - 214481F2. Берем первые 2 байта (т.к. команда ldrh означает, что загружаем 2 байта). Это AB04. Переворачиваем - получаем 0x04AB. Смотрим в текстовых ресурсах, что ж это за текст. Ага, это - "Сообщения". Дальше идет дальше. Потом идет дальний переход в процу lk_get_text. Она вычисляет смещение к текстовому ресурсу. А после этого идет прорисовка заголовка - Reg_Draw_Title. Потом идет прорисовка софтов:
20E10144: 0620 MOV R0, #0x6 ;R0 = 6
20E10146: 39F720ED BLX off_20D49B88 ;Переход по адресу 0x20D49B88 с сохранением адреса возврата (с переключением в ARM режим)
20E1014A: 3A90 STR R0, [sP, #0xE8] ;слово по адресу [sP + 232] = R0
20E1014C: 4820 MOV R0, #0x48 ;R0 = 72 "H"
20E1014E: 39F71CED BLX off_20D49B88
Сначала забивается индекс правого софта. это 0x6. Потом идет дальний переход в процу lk_get_sofk. Она подобна lk_get_text, только текстовые индексы для софтов в другом месте лежат. Потом смещение сохраняется в стек, дальше забивается индекс левого софта - это 0x48 и опять вычисляется смещение Дальше идет сама прорисовка софтов через процу Reg_Draw_Title. Потом вообще идут параметры создания меню через процедуру lk_CreateMenu,передавая различные параметры. mov r2,0x3 mov r1,6 mov r0,r7 bl lk_CreateMenu В R0 - должен хранится gs_DspMenu. В R1 - тип меню. в R2 - количество пунктов. Отсчет в данном случае с единицы. В данном меню не такое простое забивание регистров. 20E10168: 3906 LSL R1, R7, #24 20E1016A: 090E LSR R1, R1, #24 20E1016C: 2A1C MOV R2, R5 ;R2 = R5 = 0x2 (2) 20E1016E: 201C MOV R0, R4 ;R0 = R4 = gs_DspMenu 20E10170: 3EF73CEB BLX off_20D4E7EC В R1 должно получится 8... В R2 - в данном случае 0x2. это тип меню (обычное). Ну и в R0 копируем gs_DspMenu. И потом дальний переход в процу lk_CreateMenu. В чем проблема этого меню - здесь циклом создаются пункты меню. Давай разберем другое лучше, чтобы было проще объяснять. Давай глянем Меню-5-5 (Настройки). Смотрим : 202F41DC 7C 24 1800 0400 0200 00000000 0000 0000 Меню 0x24 из 4 пунктов mcc_menu_config 24 , 18-ый кейс. Открываем 18-ый кейс в mcc_menu_config 24. loc_20E11A2A: ; CASE 0x0018 ; Переход с адреса 0x20E10060 20E11A2A: 0A2F CMP R7, #0xA 20E11A2C: 57D1 BNE loc_20E11ADE .Переходим в 20E11ADE. Вот прорисовка заголовка: 20E11ADE MOV R0, #0xE5 ;R0 = 229 "е" 20E11AE0: LSL R0, R0, #3 ;R0 = R0 << 3 = 0x728 (1832) ЧТобы самому не мудиться, и не вычислять, что ж здесь получится, смотри коммент - в данном случае, текстовый индекс 0x728. Это настройки. Потом переход в процу lk_get_text. И т.д. Перейдем на тот этап, где в прошлый раз остановились. LSL R1, R7, #24 ;R1 = R7 << 24 = 0x3 (3) 20E11B14: 090E LSR R1, R1, #24 ;R1 = R1 >> 24 = 0x0 (0) 20E11B16: 2A1C MOV R2, R5 ;R2 = R5 = 0x74E (1870) 20E11B18: 201C MOV R0, R4 ;R0 = R4 = 0x302C55F4 (808211956) 20E11B1A: 3CF768EE BLX off_20D4E7EC ;Переход в lk_CreateMenu вот тут опять не очень явно видно, что и где получится. Комменты не верны,т.к. я перешел сразу на этот адрес. Дальше идет параметры меню (ширина и т.д.)
ADD R3, SP, #0xC0 ;R3 = SP + #192
20E11B20: 9E85 STRH R6, [R3, #44] ;слово по адресу [R3 + 44] = R6
20E11B22: 2E20 MOV R0, #0x2E ;R0 = 46 "."
20E11B24: D885 STRH R0, [R3, #46] ;слово по адресу [R3 + 46] = R0
20E11B26: B020 MOV R0, #0xB0 ;R0 = 176 "°"
20E11B28: 1886 STRH R0, [R3, #48] ;слово по адресу [R3 + 48] = R0
20E11B2A: 9620 MOV R0, #0x96 ;R0 = 150 "–"
20E11B2C: 5886 STRH R0, [R3, #50] ;слово по адресу [R3 + 50] = R0
20E11B2E: 1922 MOV R2, #0x19 ;R2 = 25
20E11B30: 0092 STR R2, [sP] ;слово по адресу [sP] = R2
20E11B32: 0022 MOV R2, #0x0 ;R2 = 0
20E11B34: 0123 MOV R3, #0x1 ;R3 = 1
20E11B36: 201C MOV R0, R4 ;R0 = R4 = 0x302C55F4 (808211956)
20E11B38: 3BA9 ADD R1, SP, #0xEC ;R1 = SP + #236
20E11B3A: F8F76DFB BL off_20E0A218 ;lk_PutMenuExtInfo
А вот теперь идут сами пункты. Смотрим: LDR R0, =0x00000967 ;R0 = значение по адресу (PC + 508)=[0x20E11D3C]= 0x00000967 20E11B40: 36F728EE BLX off_20D48794 ;Переход по адресу 0x20D48794 с сохранением адреса возврата (с переключением в ARM режим) 20E11B44: 0022 MOV R2, #0x0 ;R2 = 0 20E11B46: 031C MOV R3, R0 ;R3 = R0 = 0x967 (2407) 20E11B48: 0021 MOV R1, #0x0 ;R1 = 0 20E11B4A: 201C MOV R0, R4 ;R0 = R4 = 0x302C55F4 (808211956) 20E11B4C: 0092 STR R2, [sP] ;слово по адресу [sP] = R2 20E11B4E: 3BF7D8EC BLX off_20D4D500 Рассмотрим, что тут происходит >>LDR R0, =0x00000967 Сначала в R0 загружаем - 0x967. Это текстовый индекс первого пункта. Смотрим, что это за текст - это SMS сообщения. >> BLX off_20D48794 это дальний переход в процу lk_get_text >> MOV R2, #0x0 ;R2 = 0 загружаем в R2 - нолик. >>MOV R3, R0 ;R3 = R0 = 0x967 (2407) Сохраняем в R3 - регистр R0. А в R0 после процедуры lk_get_text лежит смещение текстового ресурса. >>MOV R1, #0x0 ;R1 = 0 В R1 это номер пункта меню. Это первый, т.к. отсчет с нуля. >>MOV R0, R4 ;R0 = R4 = 0x302C55F4 (808211956) в R0 копируем регистр R4 - это gs_DspMenu >>STR R2, [sP] ;слово по адресу [sP] = R2 сохраняем регистр в R2 в стек. То есть нолик сохраняем =) >>BLX off_20D4D500 ну а тут уже дальний переход в процу lk_AddMenu =) Ну вот в приципе и все. Итак надо бы еще эту инфу переварить, так что дальше пока не буду объясенять ) что не ясно - спрашивай)))