Недавно мне прислали интересный вопрос, который звучал примерно так: "Как поменять цвета рекавери меню?"
Чтож спрашивали, получите ответ:
Что нужно:
Хекс Редактор (например бесплатный хекс редактор HxD)
Разжатый файл рекавери меню
Немного теории. Цвет передаётся в первом аргументе функции, т.е. через регистр $a0
В нашем случае размер регистра совпадает с форматом цвета (32бита по 8 бит на каждый канал)
A Альфа канал (прозрачность, чем больше значение, тем прозрачнее)
B Синий
G Зелёный
R Красный
Регистр состоит из 4 байт (4*8 = 32бит)
Цвет хранится следующим образом
A B G R
00 FF FF FF
(так будет выглядеть белый цвет)
Первые 16бит называются верхней частью регистра и содержат значения: Альфа+Синий
Следующие 16бит называются нижней частью регистра и содержат значения: Зелёный+Красный
Архитектура процессора МИПС (который установлен в ПСП)
Позволяет одной командой загружать только 16битные константы
Т.е. мы можем загрузить либо верхнюю часть регистра, либо нижнюю
Команда 0424 загружает нижнюю часть (G+R)
Команда 043C загружает верхнюю часть (A+B) при этом значение нижней части обнуляется.
А теперь взглянем на файл recovery.prx (разжатый разумеется)
В примере рассматривается 5.00 m33-4 Перечислим какие цвета там можно изменить:
1. Заголовок меню
Здесь можно изменить только одну половину т.е. можно регулировать либо G+R, либо A+B (изменив при этом команду на 043С)
В дисассемблере это выглядит так:
disasm:
Code
0x000034D0: 0x240400FF '...$' - li $a0, 255
В хекс редакторе так:
Заметьте, смещение здесь немного больше (на 0х60 - размер заголовка)
Да и последовательность байт обратная.
hex:
0x3530: FF00 0424 Сделаем оранжевый цвет вместо красного подмешав немного зелёного цвета в пропорции 2:1, следовательно если у нас красный стоит на FF то зелёного добавим половину 7F
С помощью хекс редактора переходим на смещение 0x3530 (Ctrl+G -> Вписываем 3530 [при этом должны быть выбраны поля hex и begin]) и меняем значение зелёного цвета
Результат:
2. Пункты меню
Здесь можно изменить все 2 половины т.е. можно регулировать все цвета
disasm:
Code
0x00003520: 0x3C0400FF '...<' - lui $a0, 255
0x00003528: 0x3484FFFF '...4' - ori $a0, $a0, 0xFFFF
hex:
0x3580: FF00 043C
...
0x3588: FFFF 8434 Для начала необходимо изменить команды:
Первая команда нас устраивает а вот вторая нет, так изменим её на 0424
Результат:
Code
0x3580: FF00 043C
...
0x3588: FFFF 0424
Теперь давайте поменяем цвет на серый установив значения всех цветов одинаковыми и немного меньше FF (значение белого цвета)
Результат:
Code
0x3580: EE00 043C
...
0x3588: EEEE 0424
3. Выделеный пункт меню
Здесь, как и первом случае, можно изменить только одну половину т.е. можно регулировать либо G+R, либо A+B (изменив при этом команду на 043С)
disasm:
0x00003534: 0x240400FF '...$' - li $a0, 255
hex:
0x3594: FF00 0424 Поменяем на оранжевый:
Результат:
4. Нижняя статус строка
Это последнее что можно поменять, как и в предыдущий пункте, здесь тоже только одна половина.
disasm:
Code
0x00003568: 0x240400FF '...$' - li $a0, 255
hex:
0x35C8: FF00 0424 Поменяем на оранжевый:
Результат:
Вот результат: