系统的简单注解 - 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 ;鼠标数据读指针
该文件处理键盘的中断和输入。
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 ;鼠标数据读指针
相关文章推荐
- 系统的简单注解 - 6 03_timer.asm文件
- 系统的简单注解 - 9 06_color.asm文件
- 系统的简单注解 - 2 core.asm文件
- 系统的简单注解 - 5 02_mouse.asm文件
- 系统的简单注解 - 4 01_interrupt.asm文件
- 系统的简单注解 - 7 04_process.asm文件
- 系统的简单注解 - 12 09_font.asm
- 系统的简单注解 - 11 08_bs16.asm文件
- Linxu笔记(10): 文件系统管理与简单命令
- 简单文件系统
- java实现的简单文件管理系统
- 【WEISS算法书】书上简单的文件系统
- 利用fsockopen制作简单远程文件监控系统
- 简单介绍Windows Mobile 05 中的一些重要的系统文件
- Linux下共享文件系统文件传输的简单设计(转载)
- 一个简单的系统配置文件使用DTD和XSD两种方式描述
- 利用busybox1.1.3进行简单的文件系统的创建
- 为LINUX 设计一个简单的二级文件系统。
- 数据库操作_连接SQL Server数据库示例;连接ACCESS数据库;连接到 Oracle 数据库示例;SqlCommand 执行SQL命令示例;SqlDataReader 读取数据示例;使用DataAdapter填充数据到DataSet;使用DataTable存储数据库表;将数据库数据填充到 XML 文件;10 使用带输入参数的存储过程;11 使用带输入、输出参数的存储过程示;12 获得数据库中表的数目和名称;13 保存图片到SQL Server数据库示例;14 获得插入记录标识号;Exce