|
现在我们用的主板,都带有一个Intel8254兼容的可编程定时器/计数器。它提供了三个独立的16位计数通道。Intel8254在PC上的IO口说明如下: 0040H R/W 计数器0,系统时间计数器,产生18.2Hz的时钟频率(中断8) 0041H R/W 计数器1,RAM刷新计数器,乱改此计数器可能会发生系统崩溃 0042H R/W 计数器2,主板扬声器的频率发生器 0043H R/W 模式设置端口 要想进一步了解Intel8254的编程方法可以去找它的datasheet看,也可以找找一些教科书。对于控制扬声器,我们只要用其中的第三通道就可以了。另外,与扬声器控制有关的端口还有: 0061H R/W bit0: 计数器2的GATE引脚(可以当作计数器2计数的使能位) bit1: 扬声器的控制开关(通过与门和放大器接在扬声器上) 0061H端口的其他位用于控制其他硬件,操作扬声器时不能随便修改。 下面是从DOS下反汇编出来的C函数sound和nosound,可以用做控制扬声器。可见扬声器使用计数器2的方式3(方波速率发生器),且PC上8254的CLK脉冲频率是1.193181MHz。 sound: mov bx, freq mov ax, 0x34dd mov dx, 0x0012 cmp dx, bx jnb exit div bx mov bx, ax in al, 0x61 test al, 0x03 jne set_freq or al, 0x03 out 0x61, al mov al, 0xb6 out 0x43, al set_freq: mov al, bl out 0x42, al mov al, bh out 0x42, al exit: ret
nosound: in al, 0x61 and al, 0xfc out 0x61, al ret 当然,以上代码是不可能在WinNT以上的系统中运行成功的,Win95/Win98中可以。
|
一共有 0 条评论