您的位置:首页 > 其它

系统的简单注解 - 13 10_keyboard.asm文件

2017-04-21 14:34 225 查看


该文件处理键盘的中断和输入。

 

rtm_0x21_interrupt_handle:键盘中断处理过程,对用中断向量号0x21;

install_0x21_interrupt:安装0x21号中断(键盘);

keyboard_input:将键盘输入的字符放入缓冲区;

keyboard_output:从键盘缓冲区获得一个字符;

keyboard_char_type:判断输入字符的类型
--功能键还是可显字符;

;===============================================================================

;=== 本程序包括了键盘输入的主要功能:                                        ===

;=== 1.键盘中断处理程序                                                      ===

;=== 2.安装键盘中断处理程序                                                  ===

;=== 3.处理键盘输入字符                                                      ===

;===============================================================================
;-------------------------------------------------------------------------------

rtm_0x21_interrupt_handle:                  ;键盘中断处理过程,对用中断向量号0x21
     pushad

     mov al,0x20                            ;中断结束命令EOI

     out 0x20,al                            ;向8259A主片发送
     in al, 0x64                            ;键盘状态寄存器

     test al, 0x01                          ;数据缓冲是否有数据

     jz _rtm_0x21_end                       ;没有数据就退出

     in al,0x60                             ;从键盘字符寄存器读取输入字符

     cmp al, 0x80                           ;如果超过0x80,说明是按键弹起时产生的中断

     jae _rtm_0x21_end

 

     call keyboard_input                    ;保存字符到缓冲区
_rtm_0x21_end:

     popad

     iret

 

;-------------------------------------------------------------------------------

install_0x21_interrupt:                     ;安装0x21号中断(键盘)
     ;安装键盘中断向量,开启鼠标中断 

     mov eax, rtm_0x21_interrupt_handle     ;中断向量

     mov ebx, 0x21                          ;中断向量号

     mov ecx, 0x0001                        ;ch-0主片,cl-1对应bit1 (设置1,向左移1位)

     call install_XXX_interrupt

 

     ret

 

;-------------------------------------------------------------------------------

keyboard_input:                             ;将键盘输入的字符放入缓冲区

                                            ;输入:al-输入字符
     mov ebx, [keyboard_buf_wpnt]           ;获取缓冲区写指针                      

           

     ;将收到的键盘字符放入缓冲区

     mov [keyboard_buf_addr + ebx], al      ;数据写入鼠标缓冲区

     inc ebx                                ;写指针加一

     cmp ebx, keyboard_buf_end              ;判断写指针的位置

     jb _keyboard_input_end              ;如果未到了缓冲区尾部,结束

     xor ebx, ebx                           ;已到缓冲区尾部,写指针翻转
_keyboard_input_end:

     mov [keyboard_buf_wpnt], ebx           ;保存新的写指针       

  ret
;-------------------------------------------------------------------------------

keyboard_output:                            ;从键盘缓冲区获得一个字符

                                            ;输出:al-键盘字符
     cli                                    ;关中断

     push ebx

     push ecx

     push edx

 

     ;判断缓冲区是否有数据

     mov ecx, [keyboard_buf_wpnt]          ;获取写指针

     mov ebx, [keyboard_buf_rpnt]          ;获取读指针

     cmp ecx, ebx                          ;读、写指针比较

     jz _keyboard_output_end               ;如果读、写指针相同,退出   

  

     ;从缓冲区获取一个字符

     xor eax, eax                          ;eax清零

     mov al, [keyboard_buf_addr + ebx]     ;从读指针处获取一个字符

     inc ebx                               ;读指针后移

     cmp ebx, keyboard_buf_end             ;读指针是否已经到缓冲区末尾

     jb _keyboard_rpnt_wrt                 ;未到末尾,直接回写新的读指针值

     xor ebx, ebx                          ;读指针已经到了缓冲区末尾,清零                    

_keyboard_rpnt_wrt:

     mov [keyboard_buf_rpnt], ebx          ;保存新的读指针  

 

_keyboard_output_end: 

     pop edx

     pop ecx

     pop ebx

  sti                                    ;开中断

     ret
;-------------------------------------------------------------------------------

keyboard_char_type:                         ;判断输入字符的类型 -- 功能键、可显字符

                                            ;输入:al:进行判断的字符

                                            ;输出:bl:0功能键,1 - 可显字符

    

     cmp al, 0x35

     ja _keyboard_char_isnotletter          ;大于0x35,是功能键

 

     cmp al, 0x02

     jb _keyboard_char_isnotletter          ;小于0x2,是功能键
     cmp al, 0x0e

     jz _keyboard_char_isnotletter          ;等于0x0e,是功能键“退格键” 

 

     cmp al, 0x0f

     jz _keyboard_char_isnotletter          ;等于0x0f,是功能键“Tab” 
     cmp al, 0x1c

     jz _keyboard_char_isnotletter          ;等于0x1c,是功能键“回车键” 

 

     cmp al, 0x1d

     jz _keyboard_char_isnotletter          ;等于0x1d,这个是what
     cmp al, 0x2a

     jz _keyboard_char_isnotletter          ;等于0x2a,这个是what 

 

     mov bl, 1                              ;是可显字符

     ret
_keyboard_char_isnotletter:                 ;是功能键   

     mov bl, 0 

     ret

 

;--------------------------------全局变量---------------------------------------

align 4

     keyboard_buf_wpnt   dd 0x0                   ;鼠标数据写指针

     keyboard_buf_rpnt   dd 0x0                   ;鼠标数据读指针       

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: