跳到內容

NEC PC 程式設計參考/PC-98xx 系列程式設計參考/聲音 BIOS

來自華夏公益教科書,開放的書籍,開放的世界

聲音 BIOS 是一個用於操作 OPN 音樂播放/聲音生成系統的工具包。它沒有預設中斷 - 中斷必須由應用程式建立。


聲音 BIOS 需要支援 OPN 音樂 BIOS 的音效卡。它只能在正常模式下使用。

設定聲音 BIOS 中斷

[編輯 | 編輯原始碼]

聲音 BIOS 中斷是透過將地址 0xCEE00 的位元組設定為所需的 interrupt 號來建立的。

N88-BASIC 預設將聲音 BIOS 中斷設定為 0xD2。

聲音 BIOS 期待訪問記憶體的特定區域以進行操作,以及其他需求。

  • 從 0000:05E0 開始的 DWORD 必須保留給它。
  • 256 位元組的狀態區域
  • 512 位元組的工作區域
  • 96 位元組的堆疊空間

狀態區域和工作區域必須是連續的。要為聲音 BIOS 保留空間,將工作區域開始的段偏移量設定為 0xCEE06 的 WORD(0 是可接受的)。在使用聲音 BIOS 之前,將 ES 設定為 0xCEE0,將 DI 設定為 0xCEE06 的 WORD。將 SS 設定為指定的 BIOS 堆疊區域段,將 SI 設定為同一區域的偏移量。

聲音 BIOS 的操作

[編輯 | 編輯原始碼]

透過呼叫其指定的中斷並使用 CPU 暫存器 AH 中的命令號來訪問聲音 BIOS。每個聲音 BIOS 命令都需要特定的引數。以下聲音 BIOS 命令列表解釋了可用的命令以及如何將引數傳遞給它們。

聲音 BIOS 命令表
AH 命令 目的 設定 配置結構偏移量
0 INIT 設定 PLAY 命令環境和歌曲引數。將節奏設定為 1(120 bpm,48 步/分鐘),音符長度設定為全音符,所有軌道指標設定為空。在使用任何其他命令之前必須呼叫。

ES = 聲音 BIOS 配置/工作段。PLAY 緩衝區應在呼叫之前配置。

1 PLAY 播放儲存到緩衝區的音符/操作宏。 ES:BX 指向每個通道/軌道的 28 位元組指標表。

該表的第一個 DWORD 包含包含歌曲的段。隨後的 DWORD 包含段中軌道偏移量(以位元組 1-2 為單位)和長度(以位元組 3-4 為單位)。歌曲的總大小不能超過 64k 位元組。

  • 0x0: WORD 包含指標表的段
  • 0x2: WORD 指標表偏移量
  • 0x4: WORD 緩衝區長度
  • 0x6: WORD 指向歌曲資料開頭的指標
  • 0x8: WORD 分配給緩衝區的空間
2 CLEAR 清除 PLAY 緩衝區。 如果 AL = 0,則重置歌曲。如果 AL = 1,則清除以建立新歌曲。
10 READ REG 讀取音樂播放裝置上的埠。 將 AL 作為要讀取的埠;將資料返回給 BX
11 WRITE REG 寫入音樂播放裝置。此命令可以手動呼叫或在 PLAY 緩衝區中呼叫。
  • 手動使用:AL 接收要寫入的埠,BL 接收資料
  • 緩衝區:第 1 個位元組 = 0x81;第 2 個位元組 = 埠;第 3 個位元組 = 資料
12 SET TOUCH 指定音符長度(“門控”)作為節拍比例(稱為“步長”)。使用此函式設定一組音符的預設長度(或“譜表”)。比例表示為音符型別 - 1 / 8(0 = 八分音符,1 = 四分音符,3 = 二分音符,7 = 全音符)命令可以手動呼叫或在 PLAY 緩衝區中呼叫。
  • 手動使用:AL 接收要更改的播放通道,BL 接收音符與節拍的比例
  • 緩衝區:第 1 個位元組 = 0x82;第 2 個位元組 = 音符與節拍的比例
0x12
13 NOTE 在樂器通道上發出一個音符。音符範圍為 0-96(0-0x60),其中 0x80 為休止符。可以手動呼叫或在 PLAY 緩衝區中呼叫。此命令在 TOUCH 設定的上下文中操作。可以省略音符的長度,在這種情況下,將使用 SET LENGTH 建立的預設長度。
  • 手動使用:樂器通道到 AL。鍵到 BH。持續時間到 BL。
  • 緩衝區:第 1 個位元組 = 要播放的音符;第 2 個位元組 = 音符的持續時間。
0x10
14 SET LENGTH 通道上後續音符的預設音符持續時間,作為步長的分數。受 SUSTAIN 調製,在提供音符的持續時間時被忽略。可以手動呼叫或在 PLAY 緩衝區中呼叫。
  • 手動使用:樂器通道到 AL。持續時間到 BL。
  • 緩衝區:第 1 個位元組 = 83;第 2 個位元組 = 持續時間。
0x11
15 SET TEMPO 設定歌曲的播放速度。每個節奏點對應每分鐘 48 個節拍。可以手動呼叫或在 PLAY 緩衝區中呼叫。
  • 手動使用:歌曲節奏到 BL
  • 緩衝區:第 1 個位元組 = 84;第 2 個位元組 = 節奏。
0xC0
16 SET PARAM BLOCK 通道的引數輸入設定。可以手動呼叫或在 PLAY 緩衝區中呼叫。
  • 手動使用
    • AL = 要影響的樂器通道
    • ES:BX = 塊的開始
    • DL = 塊型別(0 為 WORD,1 為位元組)
  • 緩衝區:第 1 個位元組 = 85;第 2 個位元組 = 塊型別;WORD 3-4 = 塊偏移量;WORD 6-5 = 塊段
17 READ PARAMS 將 FM 合成器音調引數讀取到 BX 中。
  • AL = 要從中讀取的通道
  • BL = 音調引數的索引號
18 WRITE PARAMS 將音調引數寫入 FM 合成器通道。可以手動呼叫或在 PLAY 緩衝區中呼叫。
  • 手動使用
    • AL = 要修改的通道
    • BL = 要寫入的音調引數
    • DX = 要寫入的值
  • 緩衝區:第 1 個位元組 = 0x86;第 2 個位元組 = 目標引數;第 3 個位元組/字 = 值
19 STOP 停止從 PLAY 緩衝區播放。中斷回撥被停用。
1A RESUME 從 PLAY 緩衝區恢復音符播放。
1B LFO ON 無條件地將 LFO 效果應用於通道。可以手動呼叫或在 PLAY 緩衝區中呼叫。
  • 手動使用:AL = 要定位的通道
  • 緩衝區:位元組 = 0x87
1C LFO OFF 停用通道上的 LFO 效果。可以手動呼叫或在 PLAY 緩衝區中呼叫。
  • 手動使用:AL = 要定位的通道
  • 緩衝區:位元組 = 0x87
1D PROC ON END 啟用/停用軌道結束時的過程呼叫
  • AL = 要監視的通道
  • ES:BX = 要呼叫的地址
  • CX
    • MSB:1 - 已啟用;0 - 已停用
    • 其餘:軌道長度
  • 0xA: WORD 歌曲結束時的過程呼叫
    • MSB:1 - 已啟用;0 - 已停用
    • D14-0: 軌道長度
  • 0xC: DWORD 呼叫的絕對地址
1E SUSTAIN 保持通道輸出。使用 0 的持續時間來省略。可以手動呼叫或在 PLAY 緩衝區中呼叫。
  • 手動使用
    • AL = 要保持的通道
    • BL = 持續時間
  • 緩衝區:第 1 個位元組 = 0x89;第 2 個位元組 = 持續時間
1F VOLUME 通道音量。對載波波形的音量起作用。受引數 FB_ALG 的影響。可以手動呼叫或在 PLAY 緩衝區中呼叫。
  • 手動使用
    • AL = 通道
    • BL = 音量
  • 緩衝區:第 1 個位元組 = 0x8A;第 2 個位元組 = 音量

回撥計時

[編輯 | 編輯原始碼]

聲音 BIOS 使用 OPN 暫存器 A 作為節奏時鐘/節拍器,使用暫存器 B 進行調製計時。它鎖定了 PIC 並監視這些暫存器以確定根據給定的命令採取什麼行動。節拍器至少以 5 毫秒的速率滴答。

與手動埠操作的相容性

[編輯 | 編輯原始碼]

手動操作音效卡可能會干擾聲音 BIOS 命令的正常操作,導致意外行為。

華夏公益教科書