跳到内容

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 命令的正常操作,导致意外行为。

华夏公益教科书