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



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

 

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                   ;鼠标数据读指针     	  
	 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值