Методика
Смысл методики заключается в том, что все языки разбиты на 6 групп (вообще 7, но одна не задействована): LATIN (все основные языки); ARABIC; HEBREW; CHINESE; CYRILLIC (не используется и не возможно задействовать); THAI; VIETNAMESE. И для каждой группы определен свой шрифт в лэнге. Например, для группы LATIN определен шрифт под номером $01 в лэнге. В группу LATIN входят ВСЕ языки кроме языков $2D $08 $04 $05 $0B $0C. Вот получается, что можно добавить в лэнг языки из других групп, в эти языки загрузить русские строки и назначить на эти языки дополнительные шрифты, которые конечно нужно добавить в лэнг. В кодовой группе CG15, т.е. DRM находится таблица, в которой находятся указатели на шрифты для каждой группы языков. Получается, необходимо создать специальный лэнг с дополнительными шрифтами, отредактировать DRM и создать патч для переназначения языков группам. Теперь обо всем по порядку.
Создание лэнга
На данном этапе необходимо создать лэнг, в котором будут 6 шрифтов и 6 русских языков, только с разными ID. Редактирование будет происходить естественно через мою программу Moto Lang Editor v2.2 от 7.07.07 и немного через HEX редактор.
Для начала выберем языки, которые будем использовать для замены на русские. Выбрать надо 5 языков, они должны быть редкие и есть еще один нюанс, который я объясню в конце. Я советую брать языки: $0011 – CROATIAN; $0012 – CZECH; $0017 – GREEK; $0018 – HUNGARIAN; $0028 – TURKISH. Лучше выписать языки на листочке, чтоб потом было проще.
Теперь необходимо выбрать 5 не используемых шрифтов в лэнге, которые будут заменены на необходимые нам. Первый – это естественно будет шрифт $02, т.к. это дубль основного шрифта, который не используется. Только с ним связан один нюанс. Это не просто дубль шрифта, а он даже ссылается на основной шрифт $01 и моя программа не дает изменить данный шрифт. Но я специально переделал программу и добавил возможность редактирования данного шрифта, поэтому обязательно необходимо скачать последнюю версию программы 2.2. Для того, чтобы при сохранении в лэнге шрифт $02 сохранился – в этой версии необходимо поставить галочку Separate 1 & 2 font:
Далее выбор остальных 4 шрифтов зависит от конкретных лэнгов, в разных не используются разные шрифты. Еще, если в лэнге меньше 16 шрифтов, то можно добавлять свои, в программе для этого есть соответствующая функция (т.е. можно добавлять свои, пока номер шрифта не превысит $0F):
Например, во всех лэнгах можно заменять шрифт $06 – этот шрифт служит для подписей софт клавиш, но на моделях с экраном 176*220 он не используется, а на моделях с меньшим экраном, если заменять на шрифт высотой 15 пикселей, т.к. мелкий, то все будет нормально. Еще, во всех лэнгах можно заменять шрифты $0B – это тайские символы и $0C – он вроде вообще нигде не используется. Последний шрифт уж выбирайте сами, например, для прошивок R365 я добавлял 2 шрифта, а на R373 еще $08, т.к. на данной платформе он не используется.
Подробно процесс редактирования шрифта описывать не буду, т.к. это можно прочесть в темах Moto Lang Editor v2.2 от 7.07.07 и Создание Шрифтов . Скажу только, что для замены шрифтов, номер которых больше $02 необходимо иметь шрифты в отдельном файле формата MFF. Чтобы потом, выбрав шрифт – заменить его, нажав в программе Load Font в меню Font. Для того, чтобы получить шрифт в формате MFF надо редактировать два основных шрифта $01 и $02, а потом сохранять их в файл через функцию Save Font в том же меню Font программы Moto Lang Editor v2.2 от 7.07.07 . Это делается для того, чтобы шрифты, которые мы будем сами добавлять, имели тот же набор символов, что и основной шрифт.
Шрифты готовы, теперь необходимо добавить языки, которые будут использованы для назначения на них этих языков. Только добавлять их будем не через программу Moto Lang Editor v2.2 от 7.07.07 , а вручную в HEX редакторе, при чем физически добавлять их даже не будем, а просто в заголовке будем делать ссылку на русский язык. Лучше всего после того, как шрифты сделаны, в лэнге еще удалить все не нужные языки и оставить только русский и естественно английский. К слову, английский язык вообще нельзя удалять, потому что в нем есть информация, которая используется во всех других языках и он является базовым. Удалить языки можно на вкладке Strings кнопкой Delete Language:
После удаления языков лэнг необходимо сохранить в программе и открыть его через любой удобный для вас HEX редактор, я использую WinHEX.
Начиная со смещения $000018 идет описание языков, по 48 байт на язык. Например, вот описание английского языка:
Первый байт – это номер языка. Вообще размер этой таблицы 12 DWord'ов. Кроме первого байта – это адреса, указатели на определенные таблицы. Еще, кроме первого байта, нас будет интересовать 5-й DWord – это указатель на iTAP таблицу. Значит, теперь задача заключается в том, чтобы следующие 12 DWord'ов за английским языком, которые начинаются с байта $23 (русский язык) скопировать дальше еще 5 раз, при чем 5-й DWord у них убрать, чтоб в этих других языках не было iTAP. Должно получиться следующее:
Но сейчас мы получили 6 русских языков, что нам совершенно не нужно, поэтому теперь необходимо сменить ID 5 языков на ID, которые мы выбрали раннее. Т.е. Необходимо первые байты в описании языков заменить на $11 $12 $17 $18 $28. И еще, кроме этого теперь необходимо в заголовке сменить количество языков в лэнге. Если вы до этого удалил все языки кроме английского и русского, как я посоветовал, то теперь у нас будет 2 + 5 = 7 языков в лэнге. Количество языков в лэнге хранится по смещению $000014, т.е. этот байт надо заменить на $07. В итоге должно получиться следующее:
Все, лэнг полностью готов, сохраните его.
Редактирование DRM
Сначала необходимо найти таблицу в DRM, которую будем редактировать. В заголовке DRM по смещению $000070 или $00006С находится указатель на эту таблицу. Найти ее не сложно, потому что она имеет характерный вид:
На скрине выделенный текст – это вся таблица, а рамкой выделен ее кусок, который мы будем редактировать. Размер этой таблицы – 16*7=112 байт, т.е. на скрине одна строка – это одна запись в таблице. Каждая запись – это описание одной группы языков. Как видно их семь, но 5-я строка – это та самая группа CYRILLIC, которая не задействована в прошивке, поэтому, получается, сделать только 6 шрифтов, а не 7. Редактировать будем 1-е 4 байта в каждом описании. 2 байта – это описание основного шрифта, а следующие 2 байта – это описание шрифта для софт клавиш. При чем каждый байт разделен на 2 части, первые 4 бита это размер, что трогать мы не будем и другие 4 бита – это указатель на номер шрифта в лэнг, его мы и будем менять на те, что сделали в лэнге. Т.е. необходимо у каждой записи в первых 4 байтах заменить вторую часть байта на указатели новых шрифтов. При чем первую часть байта не трогать, если она совпадает с первой часть в первой записи, а если не совпадает, то изменить на нее, но это бывает редко, обычно ее вообще не надо трогать. В итоге должно получиться примерно следующее:
Следует еще сделать небольшую оговорку. На моделях с экраном шириной 128 пикселей лучше использовать шрифты высотой 15 пикселей или не менять указатели на шрифты к подписям софт клавиш, чтоб не было глюков.
Создание патча
В прошивке есть код, в котором распределяется какой язык – относится к какой группе. Мы будем менять это распределение, т.е. будем заменять своими, выбранными языками, чтобы отнести их к другим группам.
Вот паттерна для поиска данного кода: 2802D003282CD001282D
И вот для старых моделей с 16 метровыми флэшками: 28026809D003282CD001282D
В этой паттерне $02 меняем на ID первого, выбранного нами языка, т.е. на $12; затем ищем дальше по коду первое появление байта $08, по идее оно будет через 16 байт и меняем на $18; затем ищем байт $04 через 8 байт и меняем его на $28; затем байт $0B через 12 байт меняем на $11; и байт $0C через 8 байт меняем на $17. Например, для R373…49R я получил следующий патч:
Код
[Patch_Info]
Firmware=R373_G_0E.30.49R
Description=Патч для реализации 6 шрифтов.
Author=Dimka
[Patch_Code]
5EA65D: 12
5EA66D: 18
5EA675: 28
5EA681: 11
5EA689: 17
Firmware=R373_G_0E.30.49R
Description=Патч для реализации 6 шрифтов.
Author=Dimka
[Patch_Code]
5EA65D: 12
5EA66D: 18
5EA675: 28
5EA681: 11
5EA689: 17
В прошивке – это выглядит следующим образом:
Весь код выделен, а байты, которые редактировались, помечены красным цветом. Подробно описывать процесс создания самого патча я тоже не буду, т.к., если вы взялись за это дело, то явно это умеете.
Завершающий этап – имена шрифтов
Теперь, если прошить сделанные лэнг и DRM и применить патч, то все должно работать. Но в списке языков будут сплошные Русский, Русский и т.д. Поэтому необходим завершающий штрих, а именно названия языков. Делать это необходимо через пользовательский языковой пакет, т.е. через DNP.PRF во всем известной программе Language_Editor от Random. Номер строки, в которой хранится название языка - $0525, поэтому содержимое DNP.PRF должно выглядеть, например, следующим образом:
Еще стоит отметить небольшой нюанс. Со всеми языками, кроме реально русского языка будет небольшая недоработка, в справочнике не будет работать поиск по первой букве, т.к. TAP раскладки, которые хранятся в CG1 будут не правильные. Для исправления этого глюка по моей просьбе и с моей поддержкой GandjaFuzz сделал патч. А Мачо написал небольшой мануальчик по конвертации данного патча на другие платформы (мануал в прикрепленном архиве). Этот патч будет работать только, если точно следовать мануалу, т.е. брать те же языки, что я предложил и т.д.
З.Ы. Хочу обратить внимание, чтоб данный материал абсолютно уникален, выкладывается впервые и данная методика разработана полностью мной. Поэтому выкладывание на других форумах и ресурсах только при указании на первоисточник, и с указанием моего Ника!
Сообщение отредактировал Dimka - 15.10.2007, 11:45