通过 TASM 组件中的扬声器播放音符

Playing music notes through speaker in TASM assembly

我正在尝试在 TASM 中编写一个播放音符的程序。我在网上找不到任何文档,我找到的最接近的是 ,它能够发出“哔”声。
我不知道的是:

  1. 此代码的工作原理

  2. 声音映射是什么

  3. 我如何弹奏特定的音符(重新练习...)

用PC音箱播放单音可以使用引用. It uses square-wave generator from system timer, activated by setting mode of operation 0xB6 to I/O port 0x43. See Timer Ports中提到的方法。 写入端口0x43的值182=0xB6=0y10110110指定

  • 选择定时器计数器 Nr.2(位 6-7)
  • endianess:LowByte 第一,HighByte 第二(位 4-5)
  • 模式 3:square-ware 生成(位 1-3)
  • 格式 0:二进制模式(位 0)。 然后您需要指定所需的频率 OUT 0x42,LowByteOUT 0x42,HighByte。这个 16 位二进制整数实际上指定了方波的周期,即从 0 到 1 翻转波形所必须经过的刻度数,反之亦然。

当您对频率进行编程后,要求可编程外围接口将扬声器连接到 square-wave 发生器。如果 PPI 端口为 0x61,这是通过设置两个最低有效位来完成的,请参见 PPI Ports

   IN AL,0x61   ; Get the previous value of PPI port B.
   OR AL,0x03   ; Set the two least significant bits.
   OUT 0x61,AL  ; Write it back to PPI port B.

现在您应该等待一段时间让音调播放,然后在 PPI 端口 B 将两位重置为 0。

将音调映射到您可以找到的频率 here。 您将需要一个 table 将 do、re、mi 等音调的频率转换为 16 位整数,您将作为 LowByte 将其放入系统计时器HighByte.

参见sample code如何获得LowByteHighByte。 PC 计时器以 1193180 Hz 的频率计时。当要播放音do时(注意C4=261.63Hz),计算1193180/261.63=4560=0x11D0。 LowByte=0xD0 和 HighByte=0x11.