这段代码看不懂,帮帮我!
void addtobuffer(int c)/*向键盘缓冲区中增加一个DOWN*/
{
unsigned i;
i=*(unsigned far *)0x0040001CL;
*(unsigned far *)(0x00400000L | i)=c;
i+=2;
if (i>=*(unsigned far *)0x00400082L) i=*(unsigned far *)0x00400080L;
*(unsigned far *)0x0040001CL=i;
}
调用它的函数:
void interrupt newtimer()/*新的定时中断调用*/
{
int leveltemp;
leveltemp=11-level;
count++;
if(count>=leveltemp)
{
addtobuffer(DOWN);//#define DOWN 0x5000
count=0;
}
(*oldtimer)();
}
问题点数:20、回复次数:5Top
1 楼netty(程序员的眼睛。魔术师的手。)回复于 2002-01-22 16:01:56 得分 0
主要是addtobuffer看不懂,各位大侠有何高见Top
2 楼GuanXP(不能用于登录)回复于 2002-01-22 16:22:24 得分 10
void addtobuffer(int c)/*向键盘缓冲区中增加一个DOWN*/
{
unsigned i;
i=*(unsigned far *)0x0040001CL;
//将long 型数 0x0040001C转换成(unsigned far *)指针(地址)
//再将该地址处的数据赋值给i
*(unsigned far *)(0x00400000L ¦ i)=c;
//将i中内容与long型数0x00400000按位或,结果转换为(unsigned far *)指针
//再将c的内容复制到该指针所指地址处
i+=2;
//i自增2
if (i>=*(unsigned far *)0x00400082L) i=*(unsigned far *)0x00400080L;
//if(i中内容>地址0x00400082处内容)
//将地址0x00400080处内容复制到i中
*(unsigned far *)0x0040001CL=i;
//将i中内容复制到地址0x0040001C处
}
Top
3 楼eion(那个谁)回复于 2002-01-22 16:42:25 得分 2
因该是直接写向键盘缓冲的代码,但是我想下面的
i=*(unsigned far *)0x0040001CL;
可以猜想0x0040000是键盘缓冲的地址,你可以试试Top
4 楼jyc_nj(老蔣)回复于 2002-01-22 16:49:13 得分 8
把键值放到键盘缓冲区,具体地址不记得了,原理上是有一块键盘缓冲区,dos下是16个bytes,另外有一个首指针和一个尾指针,分别用于缓冲区数据的读和写。
上述函数中,先得到尾指针位置:i=*(unsigned far *)0x40001cL, 在*(0x40001 + i )处写入按下的键值,尾指针指向下一个位置:i+=2;如果超过范围(i>=*(unsigned far *)0x400082L), 尾指针值为*(unsigned far *)0x400080L的值。
好象与以前的键盘缓冲区管理方式有点不同了。Top
5 楼netty(程序员的眼睛。魔术师的手。)回复于 2002-01-22 16:51:00 得分 0
谢谢大侠相助Top




