DVD-Video/互動機內部
DVD-Video 指定了一個低階 機器語言 指令集,用於定義與使用者的互動。當用戶選擇螢幕上的按鈕時,會呼叫指令序列,並且還可能在其他各種點觸發,例如單元格或 PGC 的末尾,或者當光碟插入播放器時。
指令集通常被稱為“VM”(虛擬機器)語言,但將其稱為“虛擬”意味著不可能有真正的硬體直接實現該指令集。但為什麼不能呢?這就是我在這裡使用“互動機”一詞的原因,它更清楚地說明了指令集的用途。
(請注意,我避免在該指令集的指令序列中使用“程式”一詞,因為該詞在 DVD-Video 中已經有完全不同的含義。)
唯一可用的資料儲存包括 16 個通用引數暫存器 (GPRMs) 和 24 個系統引數暫存器 (SPRMs)。每個暫存器都包含一個 16 位無符號整數值。顧名思義,GPRMs 可以自由用於任何目的,而 SPRMs 具有預定義的含義。
任何 GPRM 也可置於計數器模式,其值每秒遞增一次。
每個指令為 8 個位元組,可以編碼最多 3 個獨立的操作,每個操作最多來自以下類別之一
- 設定暫存器
- 轉移控制
- 執行比較,其結果用於控制指令其餘部分的條件執行。
第一個位元組的最高三位定義了指令組,如下所示
- 組 0:雜項(包括指令序列內的控制轉移)。這些也可以根據格式 1(如下)進行條件化。
- 組 1:連結/跳轉/呼叫:影片流部分之間的控制轉移。連結指令可以根據格式 1 進行條件化,而跳轉和呼叫使用條件格式 2。
- 組 2:設定 SPRM。這也包括設定 GPRM 進入計數器模式的指令。這些可以根據格式 2 進行條件化,或者與連結結合使用,但不能同時使用兩者。
- 組 3:設定 GPRM。這些可以根據格式 3 進行條件化,或者與連結結合使用,但不能同時使用兩者。
組 4、5 和 6 執行設定 GPRM、比較和連結,全部在一個指令中,但三個操作相互作用如下
- 組 4:執行設定,執行比較,並有條件地連結。
- 組 5:執行比較,並有條件地設定和連結。
- 組 6:執行比較,並有條件地執行設定。始終連結。
組 7 似乎沒有使用。
暫存器編號:讀取暫存器值的欄位為 8 位寬,可以訪問 GPRMs 和 SPRMs。位 7 為 0 表示訪問 GPRM,1 表示訪問 SPRM。實際暫存器編號位於其他位的範圍內。
文字運算元:某些指令形式允許指令內包含 16 位文字運算元的值。這始終以大端序儲存,即最高有效位元組在前。
互動指令可以在以下位置找到
- 一個單元格可以以一個單一指令結束,該指令在單元格播放完畢時執行。
- 一個按鈕指定一個單一指令,在選中按鈕時執行。
- PGC 的前置部分和後置部分可以分別包含一系列指令,分別在 PGC 開始播放之前和播放完畢之後執行。
- FPC 包含一系列指令,這些指令在光碟插入播放器時自動開始執行。
按鈕上的單指令限制在實踐中不是一個大問題;單指令很容易是“將 GPRM i 設定為 j 並連結到 PGC 的後置部分”,以便在 PGC 後置部分執行一系列更長的指令,這些指令根據 GPRM i 的值對不同按鈕執行不同的操作。
在下表中,“可寫”表示是否存在明確寫入該暫存器的指令。不可寫暫存器可能會透過控制轉移指令或在播放過程中自動更改(這些可能會更改當前標題/PGC/章節),或者由使用者透過某些裝置提供的介面明確更改(例如首選影片和語言設定),或者可能是隻讀的(例如播放器音訊功能、區域掩碼)。
ISO-639 語言程式碼和 ISO-3166 國家程式碼表示為整數,高位元組包含第一個字元,低位元組包含第二個字元。
| 編號 | 名稱 | 含義 | 可寫 | ||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 首選選單語言,ISO-639 程式碼 | N | |||||||||||||||||||||||||||||
| 1 | ASTN | 音訊流號 0-7,或 15 表示無 | Y | ||||||||||||||||||||||||||||
| 2 | SPSTN | 字幕流號,位於位 0-5 中,位 6 也必須設定才能顯示。普通流號為 0-31,但特殊值 62 表示“無”,63 表示“強制”(選單需要)。 | Y | ||||||||||||||||||||||||||||
| 3 | AGLN | 角度號,1-9 | Y | ||||||||||||||||||||||||||||
| 4 | TTN | 整個光碟上的標題號,1-99 | N | ||||||||||||||||||||||||||||
| 5 | VTS_TTN | 標題集中的標題號,1-99 | N | ||||||||||||||||||||||||||||
| 6 | TT_PGCN | PGC 號,1-32767 | N | ||||||||||||||||||||||||||||
| 7 | PTTN | 章節 (PTT) 號,1-99 | N | ||||||||||||||||||||||||||||
| 8 | HL_BTNN | 高亮按鈕號 × 1024。因此,有效值為 0(無按鈕高亮)、1024(高亮按鈕 1)、2048(高亮按鈕 2).. 36864(高亮按鈕 36) | Y | ||||||||||||||||||||||||||||
| 9 | NVTMR | 導航計時器(以秒為單位),0-65535 | Y | ||||||||||||||||||||||||||||
| 10 | NV_PGCN | 導航計時器到期時要跳轉到的 PGC 號,1-32767,必須在當前標題中 | Y | ||||||||||||||||||||||||||||
| 11 | AMXMD | 卡拉 OK 音訊通道混音模式
|
Y | ||||||||||||||||||||||||||||
| 12 | CC_PLT | 家長控制 ISO-3166 國家程式碼 | N | ||||||||||||||||||||||||||||
| 13 | PLT | 家長控制級別,1-8,或 15 表示無 | Y | ||||||||||||||||||||||||||||
| 14 | 影片首選和當前模式
|
N | |||||||||||||||||||||||||||||
| 15 | 播放器音訊功能
|
N | |||||||||||||||||||||||||||||
| 16 | 首選音訊語言,ISO-639 程式碼 | N | |||||||||||||||||||||||||||||
| 17 | 首選音訊語言擴充套件
|
N | |||||||||||||||||||||||||||||
| 18 | 首選字幕語言,ISO-639 程式碼 | N | |||||||||||||||||||||||||||||
| 19 | 首選字幕語言擴充套件
|
N | |||||||||||||||||||||||||||||
| 20 | 播放器區域程式碼掩碼
|
N | |||||||||||||||||||||||||||||
| 21-23 | 保留 | ||||||||||||||||||||||||||||||
(SPRM 列表來自 這裡)
連結與跳轉與呼叫
[edit | edit source]用於改變播放流程的指令被劃分為 Link、Jump 和 Call 三類。Link 指令允許在 PGC/標題/域內進行轉移,或轉移到一組固定的相關 PGC(“next”,“previous” 和 “up”),而 Jump 和 Call 允許跨域、選單、標題和章節進行更廣泛的轉移。標題和章節可以透過 Jump 指令進入,而選單(和 FPC)可以透過 Jump 或 Call 指令進入。Jump-to-menu 和 Call-to-menu 集支援相同的轉移集,但 Jump-to-menu 指令僅允許在選單中使用,而 Call-to-menu 的等價指令僅允許在標題中使用。
Call 指令執行與 Jump 等價指令相同的操作,但它們還會儲存一個播放點以供以後恢復。(這可以是當前播放點,也可以是指令中明確指定的另一個點。)只能儲存一個恢復點:“恢復堆疊”(如果你能這樣稱呼它)只有一個元素深。
因此,從 Call 開始的恢復點始終在標題內,而不是在選單內。模型是,呼叫選單意味著暫時暫停標題的播放,這可以在選單被關閉時恢復(除非選單選項在其他地方開始播放)。
使用 Jump 或 Call 允許的轉移
| from\to | FPC | VMG | VTSM | VTST |
|---|---|---|---|---|
| FPC | JumpSS | JumpSS | JumpTT | |
| VMG | JumpSS | JumpSS | JumpSS | JumpTT |
| VTSM | JumpSS | JumpSS | JumpSS(僅限於相同標題集) | JumpVTS_TT, JumpVTS_PTT(僅限於相同標題集) |
| VTST | CallSS | CallSS | CallSS(僅限於相同標題集) | JumpVTS_TT, JumpVTS_PTT(僅限於相同標題集) |
請注意,從 VTS(選單或標題)開始,不允許直接跳入另一個 VTS。你必須透過 VMG 設定間接跳轉。
Link 子集中的 RSM 命令(見下文)從上次儲存的恢復點恢復播放。遙控器上的返回按鈕也執行相同的操作。
條件格式
[edit | edit source]每個指令都可以設定為條件指令,其中對兩個運算元進行比較,指令其餘部分的執行取決於比較結果是真還是假。
條件欄位的佈局在不同的指令組之間可能有所不同。在以下指令格式中,點表示根據指令的無條件形式編碼的位。3 位 cmp 欄位表示要應用於兩個運算元的比較運算子
| 程式碼 | 含義 |
|---|---|
| 0 | 始終為真(指令的無條件形式) |
| 1 | BC(“&”,當且僅當運算元的邏輯與不為零時為真) |
| 2 | = |
| 3 | ≠ |
| 4 | ≥ |
| 5 | > |
| 6 | ≤ |
| 7 | < |
這些特定格式可用於第 0、1、2、3 組中的指令。第 4、5 和 6 組中的指令使用相同的 cmp 程式碼,但它們有自己用於比較運算元的安排。但請注意,cmp 欄位(以及比較運算元 2 的立即標誌)在所有指令中都位於相同的位置。
格式 1
[edit | edit source]此形式允許對兩個暫存器進行比較,或對暫存器和一個 16 位字面值進行比較。
| 0 | 1:7 | 1:6-4 | 1:3-0 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|---|---|
| ........ | 0 | cmp | .... | creg1 | creg2 | ........ | ........ | ||
| ........ | 1 | cmp | .... | creg1 | cimmed2 | ........ | ........ | ||
格式 2
[edit | edit source]此形式只允許對兩個暫存器進行比較。
| 0 | 1:7 | 1:6-4 | 1:3-0 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|---|---|
| ........ | cmp | .... | ........ | ........ | ........ | ........ | creg1 | creg2 |
格式 3
[edit | edit source]此形式允許對兩個暫存器進行比較,或對暫存器和一個 16 位字面值進行比較。
| 0 | 1:7 | 1:6-4 | 1:3-0 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|---|---|
| ........ | 0 | cmp | .... | creg1 | ........ | ........ | ........ | creg2 | |
| ........ | 1 | cmp | .... | creg1 | ........ | ........ | ........ | cimmed2 | |
集合運算
[edit | edit source]將新值分配給 GPRM 的指令具有 op 欄位和源運算元欄位(指定暫存器或字面值)。目的地的新值是根據其現有值、源運算元和 op 計算得出的。此外,交換操作也會改變源運算元(其他操作不會)。op 的有效值(以及對源運算元的相應限制)如下所示
| op | 操作 | 允許的 source | ||
|---|---|---|---|---|
| 字面量 | GPRM | SPRM | ||
| 0 | 無操作;reg 不變 | Y | Y | Y |
| 1 | 直接賦值;reg := source | |||
| 2 | 交換 reg 和 source 的值 | N | Y | N |
| 3 | 將 source 加到 reg 中 | Y | Y | N |
| 4 | 從 reg 中減去 source | |||
| 5 | 將 reg 乘以 source | |||
| 6 | 將 reg 除以 source | |||
| 7 | 將 reg 設定為對 source 進行整數除法的餘數 | |||
| 8 | 將 reg 設定為 [1 .. source] 中的隨機整數 | |||
| 9 | 對 source 和 reg 進行按位與運算 | Y | Y | Y |
| 10 | 對 source 和 reg 進行按位或運算 | |||
| 11 | 對 source 和 reg 進行按位異或運算 | |||
指令集詳細資訊
[edit | edit source]參見下一頁。