Инструкция по пересборке (реавторингу) Blu-Ray

Схемы всех алгоритмов приведены в отдельной папке. Анализируя их, можно сделать следующие выводы о навигации на данном диске:
1) Навигация завязана на ID кнопок. Все кнопки сгруппированы по общему признаку.

scheme

Из данного рисунка становится понятно назначение регистров GPR3558-GPR3560: они содержат ID кнопок, расположенных в одной строке (и используются при переходе влево/вправо в пределах строки).
GPR3558 = 040710
GPR3559 = 050801
GPR3560 = 060901
01 в конце регистров GPR3559 и GPR3560 означает, что переход произойдет вправо и вверх.
2) Назначение остальных регистров:
GPR3573 = 1, 2, 3 – позиция выбранной кнопки в меню по вертикали;
GPR3574 = 10000, 100, 1 – позиция выбранной кнопки в меню по горизонтали;
GPR3575 = 3 – количество аудиодорожек;
GPR3576 = 10 – ID последней Off-кнопки (Subs Off Off);
GPR3577 = 4 – ID первой Off-кнопки (Audio Eng Off);
GPR3578 – ID нажатой пользователем кнопки;

Пояснение к алгоритму Button#20 (ID 75):
1) Label 6 – Label 5 и Label 6 – Label 8 – после выполнения этих двух блоков:
GPR3573 = 1;
GPR3574 = 10000;
GPR3581 = 4;
2) Label 8 – Label 16 — анализируется 31й бит регистра PSR2 – он отвечает за показ в данный момент выбранной дорожки субтитров. Если он равен «0» (показ субтитров отключен) становится Enable кнопка Subs Off On (включенный флажок на фоне надписи Subs Off). Если бит равен «1», запускается цикл из 3 итераций, в результате которого значение 8-ми младших битов PSR2 сравнивается поочередно с “1”, “2”, “3” и в случае совпадения становится Enable одна из кнопок: Subs Eng On, Subs Eng HI On, Subs Rus On.
3) Label 11 – Label 25 – если активна английская ac3-дорожка (PSR1 == 1), управление переходит к неавтоматической кнопке Audio Eng On. Если она неактивна, запускается цикл из 2 итераций, в результате которого значение PSR1 сравнивается поочередно с “2”, “3” и в случае совпадения становится Enable одна из кнопок: Audio Eng THD On, Audio Rus On, после этого управление переходит к неавтоматической кнопке Audio Eng Off.
При нажатии на кнопку выбора аудиодорожки или субтитров выполняются команды из NavigationCommand этой кнопки. В нашем фильме эти команды одинаковы для всех кнопок выбора (включая варианты On и Off).

navicommand editor

 

Как видим, здесь идет обнуление регистра GPR3579, запись ID выбранной кнопки в GPR3578 и переход на автоматическую кнопку с ID 76 (Button#27). Пояснение работы алгоритма кнопки Button#27 приведены на блок-схеме (назначение регистров GPR2603 и GPR3579 мне не понятно, но это наверное и неважно :)).
Скопируем эти команды в созданные нами кнопки Button#35 и Button#36. Сделать это лучше всего через DataTree: Button#13 -> NavigationCommand -> Правая кнопка мыши -> Copy, затем Button#36 -> Правая кнопка мыши –> Paste.

Пояснение к алгоритму Button#12 (ID 77) – переход на одну кнопку вниз:
1) Значение GPR3573 увеличивается на 1.
2) Label 0 – Label 4 в зависимости от значения GPR3573 выбирается нужный GPR, отображающий ID кнопок в строке (здесь могут быть выбраны только GPR3558 – GPR3560, остальные – резерв для меню с большим количеством кнопок).
3) Label 4 – Label 36 – получение ID нижней кнопки.
4) Label 1 – переход к автоматической кнопке Button #10 (ID 81).
Пояснение к алгоритму Button#17 (ID 80) – переход на одну кнопку вверх:
1) То же, что и для предыдущей кнопки, только GPR3573 уменьшается на 1.
Пояснение к алгоритму Button#9 (ID 79) – переход на одну кнопку вправо:
1) Значение GPR3574 уменьшается в 100 раз.
2) Label 0 – Label 4 в зависимости от значения GPR3573 выбирается нужный GPR, отображающий ID кнопок в строке (здесь только GPR3558 – GPR3560, остальные – резерв для меню с большим количеством кнопок).
3) Label 4 – Label 36 – получение ID правой кнопки. Если ID == 1 или 2, переход на строку вверх и цикл Label 0 – Label 36 повторяется уже для другого значения регистра, отображающего ID кнопок.
4) Label 1 – переход к автоматической кнопке Button #10 (ID 81).
Пояснение к алгоритму Button#22 (ID 78) – переход на одну кнопку влево:
1) То же, что и для предыдущей кнопки, только GPR3574 увеличивается в 100 раз.
Пояснение к алгоритму Button#10 (ID 81) – выполняется после любого перехода:
1) Переход на кнопку с аудиодорожкой активной в данный момент:
Start > Label 0 > Label 3 > Label 19 > Label 20.
2) Переход на кнопку с аудиодорожкой неактивной в данный момент:
Start > Label 1 > Label 5 > Label 15 > Label 20.
3) Переход на кнопку с дорожкой субтитров активных в данный момент:
Start > Label 1 > Label 4 > Label 6 > Label 8 > Label 10 > Label 19 > Label 20.
4) Переход на кнопку с дорожкой субтитров неактивных в данный момент:
Start > Label 1 > Label 5 > Label 15 > Label 20.
5) Переход на кнопку Subs Off:
Start > Label 1 > Label 5 > Label 14.