| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1842 人关注过本帖
标题:[讨论]键盘缓冲区解析
只看楼主 加入收藏
mikewolf
Rank: 1
等 级:新手上路
帖 子:175
专家分:0
注 册:2004-7-3
收藏
 问题点数:0 回复次数:11 
[讨论]键盘缓冲区解析
#include<time.h>
#include<stdio.h>
int main(void)
{
        unsigned far *buffer_head=0x0040001a;/*缓冲区头指针*/
        unsigned far *buffer_tail=0x0040001c;/*缓冲区尾指针*/
        /*sound bell until a key is pressed */
        while(*buffer_head==*buffer_tail)
                putchar(7);/*bell*/
        /*flush the buffer*/
        *buffer_head=*buffer_tail;
         getch();
         return 0;
}
搜索更多相关主题的帖子: 缓冲区 键盘 解析 讨论 
2004-07-06 13:51
mikewolf
Rank: 1
等 级:新手上路
帖 子:175
专家分:0
注 册:2004-7-3
收藏
得分:0 
showkey.c
#include<time.h>
int main(void)
{
      unsigned far *buffer_head=0x0040001A;
      unsigned far *buffer_tail=0x0040001C;
      unsigned far *buffer_start=0x00400080;
      unsigned far *buffer_end=0x00400082;
      char far *keystroke=0x00400000;/*bios data segment*/
      char letter;
      time_t start_time,end_time;
      printf("type your name (characters won't appear);");
      /*delay 10 seconds*/
     time(&start_time);
     do
            time(&end_time);
     while(end_time-start_time<10);
     printf("\nThe characters typed were:");
     /*display the characters from the keyboard buffer*/
     while(*buffer_head!=*buffer_tail)
              {
                letter=*(keystroke+*buffer_head);
                printf("%c",letter);
                /*check if we need to wrap around to the start of the buffer*/
                if(*buffer_head>=*buffer_end)
                            *buffer_head=*buffer_start;
               }
      getch();
      return 0;
}
2004-07-06 13:51
mikewolf
Rank: 1
等 级:新手上路
帖 子:175
专家分:0
注 册:2004-7-3
收藏
得分:0 
/*模仿键盘输入功能:*/ #include<stdio.h> #include<dos.h> int main(void) { unsigned far *buffer_head=0x0040001A; unsigned far *buffer_tail=0x0040001C; unsigned far *buffer_start=0x00400080; unsigned far *buffer_end=0x0040082; char far *ascii=0x00400000; char far *scancode=0x00400000; union REGS inregs,outregs; struct keystroke{ char ASCII; char ScanCode; }Buffer[]={'H',0x23,'e',0x12,'l',0x26,'l',0x26,'o',0x18, ',',0x33,' ',0x39,'w',0x11,'o',0x18,'r',0x13, 'l',0x26,'d',0x20,'!',0x02}; int i; /*flush the buffer*/ *buffer_head=*buffer_tail; /*assign the keystroke and scan code*/ for(i=0;i<(sizeof(Buffer)/2);i++) { ascii[*buffer_tail]=Buffer.ASCII; scancode[*buffer_tail+1]=Buffer.ScanCode; *buffer_tail+=2; if(*buffer_tail>=*buffer_end) *buffer_tail=*buffer_start; } /*read the buffer*/ for(i=0;i<(sizeof(Buffer)/2);i++) { inregs.h.ah=0;/*调用bios int 16h 0功能读键盘缓冲区*/ int86(0x16,&inregs,&outregs); printf("ASCII %c ScanCode %x\n",outregs.h.al,outregs.h.ah); } getch(); return 0; }
2004-07-06 13:51
mikewolf
Rank: 1
等 级:新手上路
帖 子:175
专家分:0
注 册:2004-7-3
收藏
得分:0 

#include<dos.h> #define FirstFitLow 0 int main(void) { unsigned far *buffer_head=0x0040001A; unsigned far *buffer_tail=0x0040001C; unsigned far *buffer_start=0x00400080; unsigned far *buffer_end=0x00400082; union REGS inregs,outregs; unsigned original_strategy; struct MCB{ char sibniture;/*4dh or 5ah*/ unsigned owner;/*owner psp segment sddress*/ unsigned size;/*in 16-byte paragraphs*/ char reserved[3];/*not used*/ char filename[8];/*starting with dos4*/ }far *mcb;

/*try to allocate memory with the BIOS data segment (0x40 through 0x103f).set the allocation strategy to find first low.*/ /*save current memory allocation strategy*/

inregs.x.ax=0x5800; intdos(&inregs,&outregs); original_strategy=outregs.x.ax;

/*select first fit low as memory strategy*/ inregs.x.ax=0x5801; inregs.x.bx=FirstFitLow; intdos(&inregs,&outregs);

/*allocate a 256 byte buffer*/ inregs.h.ah=0x48; inregs.x.bx=16;/*sixteen-byte paragraphs*/ intdos(&inregs,&outregs);

if(outregs.x.flags&1) printf("Insufficient memory for 256 byte buffer\n"); else if((outregs.x.ax>=0x40)&&(outregs.x.ax<=0x103F)) { mcb=(struct MCB far *)((long)(outregs.x.ax)<<16);

/*set the block's owner to 0xffff (a pid that will never beused)this prevent dos from freeing the memory when this program ends.*/ mcb->owner=0xFFFF;

/*update the keyboard buffer pointers*/ *buffer_head=(outregs.x.ax-0x40)*16; *buffer_start=(outregs.x.ax-0x40)*16; *buffer_tail=(outregs.x.ax-0x40)*16; *buffer_end=((outregs.x.ax-0x40)*16)+256; printf("New keyboard segment %x\n",outregs.x.ax); } else printf("No memory for buffer in BIOS data segment\n");

/*reset original strategy*/ inregs.x.ax=0x5801; inregs.x.bx=original_strategy; intdos(&inregs,&outregs);

getch(); return 0; }

2004-07-06 13:52
mikewolf
Rank: 1
等 级:新手上路
帖 子:175
专家分:0
注 册:2004-7-3
收藏
得分:0 
键盘输入码表

┌───┬───┬───┬───┬───┐ │键 位│常 态│高 位│控制态│变更态│ │ KEY │NORMAL│SHIFT │ CTRL │ ALT │ ├───┼───┼───┼───┼───┤ │ F1 │ 3B00 │ 5400 │ 5E00 │ 6800 │ │ F2 │ 3C00 │ 5500 │ 5F00 │ 6900 │ │ F3 │ 3D00 │ 5600 │ 6000 │ 6A00 │ │ F4 │ 3E00 │ 5700 │ 6100 │ 6B00 │ │ F5 │ 3F00 │ 5800 │ 6200 │ 6000 │ │ F6 │ 4000 │ 5900 │ 6300 │ 6D00 │ │ F7 │ 4100 │ 5A00 │ 6400 │ 6E00 │ │ F8 │ 4200 │ 5B00 │ 6500 │ 6F00 │ │ F9 │ 4300 │ 5C00 │ 6600 │ 7000 │ │ F10 │ 4400 │ 5D00 │ 6700 │ 7100 │ │ F11 │ 8500 │ 8700 │ 8900 │ 8B00 │ │ F12 │ 8600 │ 8800 │ 8A00 │ 8C00 │ │ 1 ! │ 0231 │ 0220 │ │ 7800 │ │ 2 @ │ 0332 │ 0340 │ 0300 │ 7900 │ │ 3 # │ 0433 │ 0423 │ │ 7A00 │ │ 4 $ │ 0534 │ 0524 │ │ 7B00 │ │ 5 % │ 0635 │ 0625 │ │ 7C00 │ │ 6 ^ │ 0736 │ 075E │ 071E │ 7D00 │ │ 7 & │ 0837 │ 0826 │ │ 7E00 │ │ 8 * │ 0938 │ 092A │ │ 7F00 │ └───┴───┴───┴───┴───┘ ┌───┬───┬───┬───┬───┐ │键 位│常 态│高 位│控制态│变更态│ │ KEY │NORMAL│SHIFT │ CTRL │ ALT │ ├───┼───┼───┼───┼───┤ │ 9 ( │ 0A39 │ 0A28 │ │ 8000 │ │ 0 ) │ 0B30 │ 0B29 │ │ 8100 │ │ - _ │ 0C2D │ 0C5F │ 0C1F │ 8200 │ │ = + │ 0D3D │ 0D2B │ │ 8300 │ │ \ | │ 2B5C │ 2B7C │ 2B1C │ │ │‘ ~ │ 2960 │ 297E │ │ │ │ A a │ 1E61 │ 1E41 │ 1E01 │ 1E00 │ │ B b │ 3062 │ 3042 │ 3002 │ 3000 │ │ C c │ 2E63 │ 2E43 │ 2E03 │ 2E00 │ │ D d │ 2064 │ 2044 │ 2004 │ 2000 │ │ E e │ 1265 │ 1245 │ 1205 │ 1200 │ │ F f │ 2166 │ 2146 │ 2106 │ 2100 │ │ G g │ 2267 │ 2247 │ 2207 │ 2200 │ │ H h │ 2368 │ 2348 │ 2308 │ 2300 │ │ I i │ 1769 │ 1749 │ 1709 │ 1700 │ │ J j │ 246A │ 244A │ 240A │ 2400 │ │ K k │ 256B │ 254B │ 250B │ 2500 │ │ L l │ 266C │ 264C │ 260C │ 2600 │ │ M m │ 326D │ 324D │ 320D │ 3200 │ │ N n │ 316E │ 314E │ 310E │ 3100 │ │ O o │ 186F │ 184F │ 180F │ 1800 │ │ P p │ 1970 │ 1950 │ 1910 │ 1900 │ │ Q q │ 1071 │ 1051 │ 1011 │ 1000 │ │ R r │ 1372 │ 1352 │ 1312 │ 1300 │ └───┴───┴───┴───┴───┘ ┌───┬───┬───┬───┬───┐ │键 位│常 态│高 位│控制态│变更态│ │ KEY │NORMAL│SHIFT │ CTRL │ ALT │ ├───┼───┼───┼───┼───┤ │ S s │ 1F73 │ 1F53 │ 1F13 │ 1F00 │ │ T t │ 1474 │ 1454 │ 1414 │ 1400 │ │ U u │ 1675 │ 1655 │ 1615 │ 1600 │ │ V v │ 2F76 │ 2F56 │ 2F16 │ 2F00 │ │ W w │ 1177 │ 1157 │ 1117 │ 1100 │ │ X x │ 2D78 │ 2D58 │ 2D18 │ 2D00 │ │ Y y │ 1579 │ 1559 │ 1519 │ 1500 │ │ Z z │ 2C7A │ 275A │ 2C1A │ 2C00 │ │Home 7│ 4700 │ 4737 │ 7700 │ 0007 │ │↑ 8│ 4800 │ 4838 │ │ 0008 │ │PgUp 9│ 4900 │ 4939 │ 8400 │ 0009 │ │ - │ 4A2D │ 4A2D │ │ │ │← 4│ 4B00 │ 4B34 │ 7300 │ 0004 │ │ 5 │ │ 4C35 │ │ 0005 │ │→ 6│ 4D00 │ 4D36 │ 7400 │ 0006 │ │ + │ 4E2B │ 4E2B │ │ │ │ End │ 4F00 │ 4F31 │ 7500 │ 0001 │ │↓ 2│ 5000 │ 5032 │ │ 0002 │ │PgDn 3│ 5100 │ 5133 │ 7600 │ 0003 │ │Ins 0│ 5200 │ 5230 │ 6200 │ 0000 │ │del .│ 5300 │ 532e │ │ │ │ PrSc │ 372A │ 5A00 │ 7200 │ │ │ [ { │ 1A5B │ 1A7B │ 1A1B │ │ │ ] } │ 1B5D │ 1B7D │ 1B1D │ │ └───┴───┴───┴───┴───┘ ┌───┬───┬───┬───┬───┐ │键 位│常 态│高 位│控制态│变更态│ │ KEY │NORMAL│SHIFT │ CTRL │ ALT │ ├───┼───┼───┼───┼───┤ │ ' " │ 2827 │ 2822 │ │ │ │ ; : │ 273B │ 273A │ │ │ │ / ? │ 352F │ 353F │ │ │ │ . > │ 342e │ 343e │ │ │ │ , < │ 332C │ 333C │ │ │ │※Home│ 4700 │ 4700 │ 7700 │ │ │※ 8 │ 4800 │ 4800 │ │ │ │※PgUp│ 4900 │ 4900 │ 8400 │ │ │※ ← │ 4B00 │ 4B00 │ 7300 │ │ │※ → │ 4D00 │ 4D00 │ 7400 │ │ │※ End│ 4F00 │ 4F00 │ 7500 │ │ │※ ↓ │ 5000 │ 5000 │ │ │ │※PgDn│ 5100 │ 5100 │ 7600 │ │ │※ Ins│ 5200 │ 5200 │ │ │ │※ Del│ 5300 │ 5300 │ │ │ │ Esc │ 011B │ 011B │ 011B │ │ │Enter │ 1C0D │ 1C0D │ 1C0A │ │ │BkSp │ 0E08 │ 0E08 │ 0E7F │ │ │ Tab │ 0F09 │ 0F00 │ │ │ │※Enter 1C0D │ 1C0D │ 1C0A │ │ │※ + │ 4E2B │ 4E2B │ │ │ │※ - │ 4A2D │ 4A2D │ │ │ │※ * │ 372A │ 372A │ │ │ │※ / │ 352F │ 352F │ │ │ └───┴───┴───┴───┴───┘ 注一:表中凡标※者,皆为101 键新增键位,其值来自INT 9H之键盘缓冲器。来自INT 16H 者,其值与未标※者相同。 注二:Ctrl+Alt+Break = 3800H

2004-07-06 13:53
chengstone
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
帖 子:562
专家分:226
注 册:2004-4-3
收藏
得分:0 
that is good ! thanks very much,up

qq:69558139
2004-07-06 17:15
jzh2004
Rank: 1
等 级:新手上路
帖 子:341
专家分:0
注 册:2004-4-30
收藏
得分:0 
好的,顶

我的主页 http://www.
2004-07-08 13:23
mikewolf
Rank: 1
等 级:新手上路
帖 子:175
专家分:0
注 册:2004-7-3
收藏
得分:0 

最近发这几个贴的目的是想让大家多探讨点c语言应用相关的问题,尤其是与硬件和操作系统相关,我学习c语言和汇编语言的目的:就是为了深入研究操作系统!

学习c++的目的就是为了开发应用程序!(当然道路很长)

2004-07-08 13:30
mikewolf
Rank: 1
等 级:新手上路
帖 子:175
专家分:0
注 册:2004-7-3
收藏
得分:0 

值得一提的是关于c语言本身的问题,自己上机验证不就得了吗?

语言没有什么困难的,重在应用,有人说c语言博大精深,要我看:

与其说c语言博大精深,倒不如说这个现实世界太复杂,太博大精深!

2004-07-08 13:35
amoeba321
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2004-8-14
收藏
得分:0 

2004-08-14 14:11
快速回复:[讨论]键盘缓冲区解析
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015591 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved