首页
社区
课程
招聘
[原创]《送别》直接IO版
发表于: 2009-5-23 16:23 15673

[原创]《送别》直接IO版

2009-5-23 16:23
15673

很早以前就想写个这样的东西,不过自己是音痴,不会读乐谱.
上次在看雪上看到 玩命大牛写的用BEEP做的《送别》之后,摘抄了曲子,自己实现了直接IO版本.

有几个小细节需要解释: 
驱动喇叭的端口:0x61,0x40-0x43. 

0x40-0x42是3个计数器,0x40控制系统时钟,0x41控制DRAM刷新的,0x42就是留给一般应用,比如扬声器,我们要用到的就是0x42. 

0x43是这3个计数器的控制端口,下面详细解释. 

这些端口都是8位操作的,所以每次读写只能操作8位数据. 

我在程序中给0x43 OUT 的是0xB6,即10110100. 
第0位是0,表示写入的是二进制数, 
第1-3位代表计数器的运行方式,010代表以方式2运行,即分频器方式. 
第4-5位代表给0x40-0x42端口读写数据的方式,11代表先读低8位,再读高8位. 
第6-7位代表选择的计数器,10代表选择选择计数器2,即0x42端口. 

再来解释0x61端口. 
计数器2的时钟信号一个1193180Hz的输入,计数器2的另外一个输入是0x61端口的第0位,当第0位为1时,计数器2启动. 
另外,计数器2的输出端和0x61端口的第1位经过与门之后输出到喇叭,以此来驱动喇叭. 

所以要让喇叭启动,就把0x61端口的低两位置1就可以了,要停止就置0. 

详细的看代码.

解释完了,希望不是废话.

下面看代码. 


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 7
支持
分享
最新回复 (30)
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
2
强帖~~123456
2009-5-23 18:02
0
雪    币: 155
活跃值: (29)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
呵呵
都这么恶搞。。。
2009-5-23 18:59
0
雪    币: 256
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
**了,搞到驱动版的了!
2009-5-26 14:43
0
雪    币: 256
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
2003下没有声音啊!
上传的附件:
2009-5-26 14:47
0
雪    币: 239
活跃值: (190)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
6
我的本本上也没有声音,
大概是我把beep.sys替换过的原因吧,曾经被我替换过了
2009-5-26 19:39
0
雪    币: 412
活跃值: (30)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
7
估计你电脑没有喇叭,或者端口不对,可以到设备管理器那里看看喇叭的端口是不是和程序的端口对应.
2009-5-26 21:25
0
雪    币: 412
活跃值: (30)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
8
和beep.sys,没有关系,我这个是直接操作端口的.
2009-5-26 21:25
0
雪    币: 416
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
这个。。。。驱动级别了
2009-5-26 22:30
0
雪    币: 256
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
应该没有错吧!
上传的附件:
2009-5-27 16:36
0
雪    币: 412
活跃值: (30)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
11
你再看看System timer的端口号,是不是0x40-43

再没有估计就是没有喇叭了
2009-5-27 20:25
0
雪    币: 256
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
主板上有个小喇叭,开机时还能叫一下!
上传的附件:
2009-5-28 14:59
0
雪    币: 95
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
13
强帖。。。。
2009-5-30 10:39
0
雪    币: 86
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
关注驱动

谢谢楼主发布分享
2009-5-30 13:50
0
雪    币: 97
活跃值: (30)
能力值: ( LV2,RANK:140 )
在线值:
发帖
回帖
粉丝
16

/*计数器控制端口0x43,置位为10110100*/
Out_8((PUCHAR)0x43,0xB4);

应该是0xB6(10110110)吧
2009-9-15 22:19
0
雪    币: 104
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zjw
17
真会玩呀,服了~
2009-9-15 22:27
0
雪    币: 412
活跃值: (30)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
18
好像程序里的和文中的话不对头

0xB6是方波发生器的方式,0xB4是分频器方式
但两种方式都是定时器,会重复计数,不会在减到终值后停止
所以这两种方式应该都是可以的,不过按照名字来说应该是0xB4,分频器方式。
2009-9-15 22:56
0
雪    币: 97
活跃值: (30)
能力值: ( LV2,RANK:140 )
在线值:
发帖
回帖
粉丝
19
不对吧,0xB4也可以?,楼主有否"考证"过?
2009-9-16 18:10
0
雪    币: 412
活跃值: (30)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
20
0xB4是我测试的时候用的,可以成功
你可以自己试验一下
2009-9-16 18:19
0
雪    币: 97
活跃值: (30)
能力值: ( LV2,RANK:140 )
在线值:
发帖
回帖
粉丝
21
俺的机子只能用B6,用B4连个泡也没冒...要不然就不会跟贴了
2009-9-16 18:25
0
雪    币: 97
活跃值: (30)
能力值: ( LV2,RANK:140 )
在线值:
发帖
回帖
粉丝
22
可是我见到的大部分情况都用的是0xB6,连Hal.dll中的HalMakeBeep反汇编出来的代码也用的是0xB6.

不知道楼主用的是什么牌子的机器?
2009-9-16 18:32
0
雪    币: 412
活跃值: (30)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
23
刚才我又在我同学的机器上试了一下,用B4有声,但是声非常小,调整一下分频频率应该可以更大一些
原来我在虚拟机里测试的时候声音挺大的

用B6就是正常出声
2009-9-16 18:55
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
强悍!!!
2009-9-16 22:48
0
雪    币: 97
活跃值: (30)
能力值: ( LV2,RANK:140 )
在线值:
发帖
回帖
粉丝
25
虚拟机能用0xB4,是因为虚拟机根本就没有用0xB4.虚拟机并没有模拟0x43寄存器,而是直接修改了真实主机的0x43寄存器(这类指令是相当危险的).

结果虚拟机最终还是把0x43寄存器改成了0xB6,这个修改是不恢复的,可以在真实主机中找到它的特征.
2009-9-17 10:21
0
游客
登录 | 注册 方可回帖
返回
//