Захотелось мне запустить мафон на столе, с целью изучения его внутреннего мира. Вот только засада — кода своей Гаммы я не знал — она прекрасно договаривалась с приборкой и проблем не было. Сервисная книжка далеко, к официалам за кодом ехать лениво — будем ковырять!
Погуглив я быстро выяснил, что код зашит в неявном виде в EEPROM-е мафона AT25160N.
Не проблема — взял свой программатор USBASP, модернизировал его по мануалу, считал дамп (микросхему не выпаивал, припаялся параллельно) и углубился внутрь.
Что мне дал гугл:
1) код лежит по адресу 0x4B0. И немного в другом виде — по адресам 0x4C0 и 0x4D0
2) алгоритмом вычисления кода никто не делится
3) существует крякалка, CalcGEN by I.S.A 2009 — скармливаешь ей дамп, она даёт код.
4) диапазон кодов 0000-1999. Вроде не так и много, можно и подобрать :)
Но это же неспортивно, надо выяснить алгоритм самостоятельно :)
Итак, вводная:
по адресу 0x4B0 — основное хранилище кода
по адресу 0x4C0 — его версия, сксореная с 0xFFFFFFFF
по адресу 0x4D0 — его версия, сксореная с 0x5A5A5A5A
Дальше работаем только с 0x4B0.
Еще нарыл пачку кодов из кусков дампов, обрывков фраз на форумах и других местах. Частично это уже восстановленные пост-фактум коды
дамп <-> код
2D F7 41 72 <-> 0324
2D 2C B4 D4 <-> 0972
1C 1D D6 0F <-> 1858
2D 33 B4 10 <-> 0776
1С С6 70 10 <-> 1236
Посидев над этими числами много часов с калькулятором, выяснилось следующее:
Для вычисления кода по дампу надо сделать XOR младших полубайт с числом 0xD436.
С одной оговоркой — если в полубайте число больше или равно A, то соответствующий разряд нужно увеличивать на 1 (кроме первого разряда). Возможно на самом деле в алгоритме это как-то учтено по-другому, но работает и так.
Примеры
Дамп: 2D F7 41 72. Младшие полубайты: D712. D712 XOR D436 => 0324 <- это и есть код
Ещё:
2D 2C B4 D4 -> DC44. XOR с D536 (увеличиваем вторую цифру на 1 из-за C) => 0972
Ещё:
1C 1D D6 0F
Младшие полубайты: CD6F
D и F больше A, поэтому XOR-им с D537, получаем 1858
Ещё:
2D 33 B4 10 -> D340. XOR с D436 => 0776
Ещё:
1С С6 70 10 -> C600. XOR с D436 => 1236
Соответственно, можно посчитать и обратно, установив любой код в мафон. Надо только не забыть вычислить две других версии кода (по адресам 0x4C0 и 0x4D0). Я пробовал закатать в свою прошивку произвольный код и потом проверял полученный дамп на крякалке — работает :)
Ещё код в каком-то виде хранится в приборке. Для Иммо2 — под адресам 0x2FE и 0x2FF, для Иммо3 — 0x398 и 0x399. У меня Иммо3, и лежит 30 AE по адресам 398/399 (в 0x2FE и 0x2FF лежит 30 5A)
Я полагаю, что передаётся из приборки не чистый код, а его вторая половинка, закодированная в СТАРШИХ полубайтах дампа мафона (то есть 11D0 для моего дампа). Скорее всего там обычный XOR, то есть рискну предположить, что для обучения приборки мафону надо заксорить число из приборки с 0x217E (11D0 XOR 30AE — из моей приборки и мафона), или наоборот — заксорить с ним же число из мафона.
Это предположение нуждается в проверке. Можно проверить, например, так:
0) делаем дампы приборки и EEPROM-а мафона
1) зашиваем в магнитолу како-нибудь известный код, например 0324:
0x4B0: 2D F7 41 72
0x4C0: D2 08 BE 8D
0x4D0: 77 AD 1B 28
2)XOR-им старшие байты кода с 217E (предположительно)
то есть 2F47 XOR 217E = 0E 39
3) Записываем 0E 39 по адресам 398-399 (для Иммо3)
4) Проверяем. Если слинкуюся — то ок, если нет — то надо откатить на дампы, созданные в пункте 0
У меня не получилось, мой программатор почему-то не хочет писать EEPROM мафона, каша получается :( Или, если кто-то имеет полный набор данных (дамп приборки-дамп мафона), то можно попробовать сделать XOR старших полубайт дампа мафона по адресу 0x4B0 (4 байта) с куском дампа приборки по адресу 398-399. Если получится 0x217E — значит это точно оно, если нет — значит я ошибаюсь.
Если у кого-то есть возможность проверить — было бы круто закрыть это бело пятно знаний! :)