通过 TASM 组件中的扬声器播放音符
Playing music notes through speaker in TASM assembly
我正在尝试在 TASM 中编写一个播放音符的程序。我在网上找不到任何文档,我找到的最接近的是 ,它能够发出“哔”声。
我不知道的是:
此代码的工作原理
声音映射是什么
我如何弹奏特定的音符(重新练习...)
用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,LowByte
和 OUT 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如何获得LowByte和HighByte。 PC 计时器以 1193180 Hz 的频率计时。当要播放音do时(注意C4=261.63Hz),计算1193180/261.63=4560=0x11D0。 LowByte=0xD0 和 HighByte=0x11.
我正在尝试在 TASM 中编写一个播放音符的程序。我在网上找不到任何文档,我找到的最接近的是
我不知道的是:
此代码的工作原理
声音映射是什么
我如何弹奏特定的音符(重新练习...)
用PC音箱播放单音可以使用引用
- 选择定时器计数器 Nr.2(位 6-7)
- endianess:LowByte 第一,HighByte 第二(位 4-5)
- 模式 3:square-ware 生成(位 1-3)
- 格式 0:二进制模式(位 0)。
然后您需要指定所需的频率
OUT 0x42,LowByte
和OUT 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如何获得LowByte和HighByte。 PC 计时器以 1193180 Hz 的频率计时。当要播放音do时(注意C4=261.63Hz),计算1193180/261.63=4560=0x11D0。 LowByte=0xD0 和 HighByte=0x11.