BlackChaos
|
Дата : 11-11-05, Птн, 14:30:42
Часть вторая
Все действия (просмотр фильма, переход в меню выбора глав или выбор языка) выполняются при помощи специального командного языка или, как его еще называют, виртуальными машинными командами VM. Всего существует около 40 (сорока) команд. Эти команды могут использоваться в различных местах DVD, но в основном вы будете использовать их в PRE – перед объектом и в POST – после объекта. В данном случае “объект” – это сам фильм или меню. Очень интересно использование Cell Commands (команды ячейки) – а если проще, то можно сделать такой диск, в котором определенные фрагменты будут пропускаться, если на проигрывателе стоит “родительский контроль”. Ну, или можно сделать две версии фильма, одна нормальная, а вторая, как говорят, с “альтернативным финалом”. Придумать можно много, а вот чтобы воплотить задумку в жизнь надо знать следующие операторы и команды.
GPRM операторы: Синтаксис в разных программа может выглядеть по разному и поэтому я буду приводить несколько примеров одного и того же оператора. А в качестве просто числа будет использовано число “15”.
Assign – оператор присваивания регистру значения в виде числа или значения из другого регистра. Примеры: GPRM1 = 15; GPRM1 = GPRM2; GPRM1 = SPRM1 Альтернативный: mov(GPRM1, 15); mov GPRM1, 15; GPRM1 mov 15
Swap – взаимный обмен регистров значениями. Пример: GPRM1 <-> GPRM2 Альтернативный: swp GPRM1, GPRM2; swp(GPRM1, GPRM2); GPRM1 swp GPRM2
Addition – оператор добавления (именно добавления). Примеры: GPRM1 += 15; GPRM1 += GPRM2; GPRM1 += GPRM1 + 15 Альтернативный: add GPRM1, 15; GPRM1 add 15; ADD(GPRM1,15) Здесь, людям не знакомым с программированием наверно требуется пояснить почему именно “добавления”. Я поясню это на следующем примере. В регистре GPRM1 содержится значение 2. Тогда, чтобы получить в регистре 5 (пятерку), следует выполнить следующее действие GPRM1 += 3. В обычной нотации будет выглядеть так: GPRM1 = GPRM1 + 3 (5 = 2 + 3).
Subtraction – вычитание. Принцип аналогичен вышеописанному оператору добавления. Примеры: GPRM1 -= 15; GPRM1 -= GPRM2 Альтернативный: sub GPRM1, 15; GPRM1 sub 15; sub(GPRM1, 15)
Multiply – умножение. Принцип аналогичен вышеописанному оператору добавления. Пример: GPRM1 *= 15; GPRM1 *= GPRM2 Альтернативный: mul GPRM1, 15; GPRM1 mul 15; mul(GPRM1, 15)
Divide – целочисленное деление. Принцип аналогичен вышеописанному оператору добавления. Пример: GPRM1 /= 15; GPRM1 /= GPRM2 Альтернативный: div GPRM1, 15; GPRM1 div 15; div(GPRM1, 15)
Remainder – остаток или модуль деления. Пример: GPRM1 %= 15; GPRM %= GPRM2 Альтернативный: mod GPRM1, 15; GPRM1 mod 15; mod(GPRM1, 15)
Random – случайное число. Пример: GPRM1 rnd 15 (Положить в регистр GPRM1 случайное число между 0-15); GPRM1 rnd GPRM2 (Положить в регистр GPRM1 случайное число между “0” и числом содержащимся в GPRM2). Альтернативный: rnd GPRM1, 15; rnd(GPRM1, 15)
AND – логическое “И”. Здесь я только скажу, что открывать ликбез по основам программирования не буду – так что кто не знает, что такое “булева алгебра” или работа с битами, поищите в нете информацию на эту тему. Примеры : GPRM1 &= 15; GPRM1 &= GPRM2 Альтернативный: and GPRM1, 15; GPRM1 and 15; and(GPRM1, 15)
OR – логическое “ИЛИ”. Примеры: GPRM1 |= 15; GPRM1 |= GPRM2 Альтернативный: or GPRM1, 15; GPRM1 or 15; or (GPRM1, 15)
XOR – логическое отрицание или неэквивалентность. Примеры: GPRM1 ^= 15; GPRM1 ^= GPRM2 Альтернативный: xor GPRM1, 15; GPRM1 xor 15; xor(GPRM1, 15)
Вот вроде и все операторы. Вы наверно обратили внимание, что слева может находиться только один из регистров общего пользования GPRM. Справа – число (ака константа), регистр GPRM или SPRM. Прошу так же обратить внимание, что знак “=” – это не сравнение, а именно оператор присваивания. Сравнение обозначается вот так “==” (два знака “=” вместе). Это очень важно, иначе вы рискуете долго искать причину, по которой ваш диск не работает так как задумано!
А теперь подробней об операторt сравнения “==” и прочих, а так же проверке состояния регистров при помощи “if” (если). Заметьте, что операторы сравнения используются только с “if”.
Пример: if (GPRM1 == 15) Goto 5 – расшифровка этого очень проста. Если регистр GPRM1 равен 15 то перейти на строку с номером 5. (Goto – это команда перехода с которой мы ознакомимся чуть дальше.) Конечно кроме оператора сравнения есть и другие, все они приведены ниже.
== – упомянутый уже оператор сравнения. Примеры: if (GPRM1 == 15); if (GPRM1 == GPRM2); if (GPRM1 == SPRM1) (если GPRM равно)
!= – оператор “не равно”. Примеры: if (GPRM1 != 15); if (GPRM1 != GPRM2); if (GPRM1 != SPRM1) (если GPRM не равно)
>= – оператор “больше или равно” Примеры: if (GPRM1 >= 15); if (GPRM1 >= GPRM2); if (GPRM1 >= SPRM1) (если GPRM больше или равен)
> – оператор “больше”. Примеры: if (GPRM1 > 15); if (GPRM1 > GPRM2); if (GPRM1 > SPRM1) (если GPRM больше)
<= – меньше или равно. Примеры: if (GPRM1 <= 15); if (GPRM1 <= GPRM2); if (GPRM1 <= SPRM1) (если GPRM меньше или равно)
< – оператор “меньше” Примеры: if (GPRM1 < 15); if (GPRM1 < GPRM2); if (GPRM1 < SPRM1) (если GPRM меньше)
& – логическое “И”. Примеры: if (GPRM1 & 15); if (GPRM1 & GPRM2); if (GPRM1 & SPRM1) (если GPRM при выполнении логического “И” не равно нулю)
Здесь так же нельзя использовать левым операндом ничего кроме регистров GPRM. Кроме того, почти все команды могут использоваться с операторами сравнения, за некоторым исключением. Например написав: if (GPRM1 == 15) LinkPGCN 1 или if (GPRM1 == GPRM2) Goto 10 будет правильно, то if (GPRM1 == 15) JumpSS VMGM 1 работать уже не будет. Вместо этого следует писать таким образом: GPRM2 = 15 if (GPRM1 == GPRM2) JumpSS VMGM 1
C чем это связано я точно не знаю, но думаю что это ограничения разрешенной длины команды в занимаемых ею байтах. Отсюда следует следующее ограничение: Команды JumpSS, CallSS и Set... не могут использоваться совместно со сравнением с константой!
В третьей части я расскажу и подробно объясню назначение и принятый синтаксис команд и приведу маленький пример их возможного использования. |