⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 61.html

📁 linux 0.11中文版 有注释
💻 HTML
📖 第 1 页 / 共 4 页
字号:
<a name='L166'>unctrl: movb $0x04,%al <i><font color='green'>// 模式标志mode 中左ctrl 键对应的比特位(位2)。</font></i>
<a name='L167'>jmp 1f
<a name='L168'>unalt: movb $0x10,%al <i><font color='green'>// 0x10 是模式标志mode 中左alt 键对应的比特位(位4)。</font></i>
<a name='L169'>1: cmpb $0,e0 <i><font color='green'>// e0 标志置位了吗(释放的是右边的ctrl 或alt 键吗)?</font></i>
<a name='L170'>je 2f <i><font color='green'>// 不是,则转。</font></i>
<a name='L171'>addb %al,%al <i><font color='green'>// 是,则该成复位相应右键的标志位(位3 或位5)。</font></i>
<a name='L172'>2: notb %al <i><font color='green'>// 复位模式标志mode 中对应的比特位。</font></i>
<a name='L173'>andb %al,mode
<a name='L174'>ret
<a name='L175'>
<a name='L176'>lshift:
<a name='L177'>orb $0x01,mode <i><font color='green'>// 是左shift 键按下,设置mode 中对应的标志位(位0)。</font></i>
<a name='L178'>ret
<a name='L179'>unlshift:
<a name='L180'>andb $0xfe,mode <i><font color='green'>// 是左shift 键松开,复位mode 中对应的标志位(位0)。</font></i>
<a name='L181'>ret
<a name='L182'>rshift:
<a name='L183'>orb $0x02,mode <i><font color='green'>// 是右shift 键按下,设置mode 中对应的标志位(位1)。</font></i>
<a name='L184'>ret
<a name='L185'>unrshift:
<a name='L186'>andb $0xfd,mode <i><font color='green'>// 是右shift 键松开,复位mode 中对应的标志位(位1)。</font></i>
<a name='L187'>ret
<a name='L188'>
<a name='L189'>caps: testb $0x80,mode <i><font color='green'>// 测试模式标志mode 中位7 是否已经置位(按下状态)。</font></i>
<a name='L190'>jne 1f <i><font color='green'>// 如果已处于按下状态,则返回(ret)。</font></i>
<a name='L191'>xorb $4,leds <i><font color='green'>// 翻转leds 标志中caps-lock 比特位(位2)。</font></i>
<a name='L192'>xorb $0x40,mode <i><font color='green'>// 翻转mode 标志中caps 键按下的比特位(位6)。</font></i>
<a name='L193'>orb $0x80,mode <i><font color='green'>// 设置mode 标志中caps 键已按下标志位(位7)。</font></i>
<a name='L194'><i><font color='green'>// 这段代码根据leds 标志,开启或关闭LED 指示器。</font></i>
<a name='L195'>set_leds:
<a name='L196'>call kb_wait <i><font color='green'>// 等待键盘控制器输入缓冲空。</font></i>
<a name='L197'>movb $0xed,%al <i><font color='green'>/* set leds command */</font></i> <i><font color='green'>/* 设置LED 的命令 */</font></i>
<a name='L198'>outb %al,$0x60 <i><font color='green'>// 发送键盘命令0xed 到0x60 端口。</font></i>
<a name='L199'>call kb_wait <i><font color='green'>// 等待键盘控制器输入缓冲空。</font></i>
<a name='L200'>movb leds,%al <i><font color='green'>// 取leds 标志,作为参数。</font></i>
<a name='L201'>outb %al,$0x60 <i><font color='green'>// 发送该参数。</font></i>
<a name='L202'>ret
<a name='L203'>uncaps: andb $0x7f,mode <i><font color='green'>// caps 键松开,则复位模式标志mode 中的对应位(位7)。</font></i>
<a name='L204'>ret
<a name='L205'>scroll:
<a name='L206'>xorb $1,leds <i><font color='green'>// scroll 键按下,则翻转leds 标志中的对应位(位0)。</font></i>
<a name='L207'>jmp set_leds <i><font color='green'>// 根据leds 标志重新开启或关闭LED 指示器。</font></i>
<a name='L208'>num: xorb $2,leds <i><font color='green'>// num 键按下,则翻转leds 标志中的对应位(位1)。</font></i>
<a name='L209'>jmp set_leds <i><font color='green'>// 根据leds 标志重新开启或关闭LED 指示器。</font></i>
<a name='L210'>
<a name='L211'><i><font color='green'>/*</font></i>
<a name='L212'><i><font color='green'>* curosr-key/numeric keypad cursor keys are handled here.</font></i>
<a name='L213'><i><font color='green'>* checking for numeric keypad etc.</font></i>
<a name='L214'><i><font color='green'>*/</font></i>
<a name='L215'><i><font color='green'>/*</font></i>
<a name='L216'><i><font color='green'>* 这里处理方向键/数字小键盘方向键,检测数字小键盘等。</font></i>
<a name='L217'><i><font color='green'>*/</font></i>
<a name='L218'>cursor:
<a name='L219'>subb $0x47,%al <i><font color='green'>// 扫描码是小数字键盘上的键(其扫描码&gt;=0x47)发出的?</font></i>
<a name='L220'>jb 1f <i><font color='green'>// 如果小于则不处理,返回。</font></i>
<a name='L221'>cmpb $12,%al <i><font color='green'>// 如果扫描码 &gt; 0x53(0x53 - 0x47= 12),则</font></i>
<a name='L222'>ja 1f <i><font color='green'>// 扫描码值超过83(0x53),不处理,返回。</font></i>
<a name='L223'>jne cur2 <i><font color='green'>/* check for ctrl-alt-del */</font></i> <i><font color='green'>/* 检查是否ctrl-alt-del */</font></i>
<a name='L224'><i><font color='green'>// 如果等于12,则说明del 键已被按下,则继续判断ctrl</font></i>
<a name='L225'><i><font color='green'>// 和alt 是否也同时按下。</font></i>
<a name='L226'>testb $0x0c,mode <i><font color='green'>// 有ctrl 键按下吗?</font></i>
<a name='L227'>je cur2 <i><font color='green'>// 无,则跳转。</font></i>
<a name='L228'>testb $0x30,mode <i><font color='green'>// 有alt 键按下吗?</font></i>
<a name='L229'>jne reboot <i><font color='green'>// 有,则跳转到重启动处理。</font></i>
<a name='L230'>cur2: cmpb $0x01,e0 <i><font color='green'>/* e0 forces cursor movement */</font></i> <i><font color='green'>/* e0 置位表示光标移动 */</font></i>
<a name='L231'><i><font color='green'>// e0 标志置位了吗?</font></i>
<a name='L232'>je cur <i><font color='green'>// 置位了,则跳转光标移动处理处cur。</font></i>
<a name='L233'>testb $0x02,leds <i><font color='green'>/* not num-lock forces cursor */</font></i> <i><font color='green'>/* num-lock 键则不许 */</font></i>
<a name='L234'><i><font color='green'>// 测试leds 中标志num-lock 键标志是否置位。</font></i>
<a name='L235'>je cur <i><font color='green'>// 如果没有置位(num 的LED 不亮),则也进行光标移动处理。</font></i>
<a name='L236'>testb $0x03,mode <i><font color='green'>/* shift forces cursor */</font></i> <i><font color='green'>/* shift 键也使光标移动 */</font></i>
<a name='L237'><i><font color='green'>// 测试模式标志mode 中shift 按下标志。</font></i>
<a name='L238'>jne cur <i><font color='green'>// 如果有shift 键按下,则也进行光标移动处理。</font></i>
<a name='L239'>xorl %ebx,%ebx <i><font color='green'>// 否则查询扫数字表(199 行),取对应键的数字ASCII 码。</font></i>
<a name='L240'>movb num_table(%eax),%al <i><font color='green'>// 以eax 作为索引值,取对应数字字符??al。</font></i>
<a name='L241'>jmp put_queue <i><font color='green'>// 将该字符放入缓冲队列中。</font></i>
<a name='L242'>1: ret
<a name='L243'>
<a name='L244'><i><font color='green'>// 这段代码处理光标的移动。</font></i>
<a name='L245'>cur: movb cur_table(%eax),%al <i><font color='green'>// 取光标字符表中相应键的代表字符??al。</font></i>
<a name='L246'>cmpb $'9,%al // 若该字符&lt;='9',说明是上一页、下一页、插入或删除键,
<a name='L247'>ja ok_cur <i><font color='green'>// 则功能字符序列中要添入字符'~'。</font></i>
<a name='L248'>movb $'~,%ah
<a name='L249'>ok_cur: shll $16,%eax <i><font color='green'>// 将ax 中内容移到eax 高字中。</font></i>
<a name='L250'>movw $0x5b1b,%ax <i><font color='green'>// 在ax 中放入'esc ['字符,与eax 高字中字符组成移动序列。</font></i>
<a name='L251'>xorl %ebx,%ebx
<a name='L252'>jmp put_queue <i><font color='green'>// 将该字符放入缓冲队列中。</font></i>
<a name='L253'>
<a name='L254'><font color='darkred'>#if</font> <b>defined</b>(KBD_FR)
<a name='L255'>num_table:
<a name='L256'>.ascii "789 456 1230." <i><font color='green'>// 数字小键盘上键对应的数字ASCII 码表。</font></i>
<a name='L257'><font color='darkred'>#else</font>
<a name='L258'>num_table:
<a name='L259'>.ascii "789 456 1230,"
<a name='L260'><font color='darkred'>#endif</font>
<a name='L261'>cur_table:
<a name='L262'>.ascii "HA5 DGC YB623" <i><font color='green'>// 数字小键盘上方向键或插入删除键对应的移动表示字符表。</font></i>
<a name='L263'>
<a name='L264'><i><font color='green'>/*</font></i>
<a name='L265'><i><font color='green'>* this routine handles function keys</font></i>
<a name='L266'><i><font color='green'>*/</font></i>
<a name='L267'><i><font color='green'>// 下面子程序处理功能键。</font></i>
<a name='L268'>func:
<a name='L269'>pushl %eax
<a name='L270'>pushl %ecx
<a name='L271'>pushl %edx
<a name='L272'>call _show_stat <i><font color='green'>// 调用显示各任务状态函数(kernl/sched.c, 37)。</font></i>
<a name='L273'>popl %edx
<a name='L274'>popl %ecx
<a name='L275'>popl %eax
<a name='L276'>subb $0x3B,%al <i><font color='green'>// 功能键'F1'的扫描码是0x3B,因此此时al 中是功能键索引号。</font></i>
<a name='L277'>jb end_func <i><font color='green'>// 如果扫描码小于0x3b,则不处理,返回。</font></i>
<a name='L278'>cmpb $9,%al <i><font color='green'>// 功能键是F1-F10?</font></i>
<a name='L279'>jbe ok_func <i><font color='green'>// 是,则跳转。</font></i>
<a name='L280'>subb $18,%al <i><font color='green'>// 是功能键F11,F12 吗?</font></i>
<a name='L281'>cmpb $10,%al <i><font color='green'>// 是功能键F11?</font></i>
<a name='L282'>jb end_func <i><font color='green'>// 不是,则不处理,返回。</font></i>
<a name='L283'>cmpb $11,%al <i><font color='green'>// 是功能键F12?</font></i>
<a name='L284'>ja end_func <i><font color='green'>// 不是,则不处理,返回。</font></i>
<a name='L285'>ok_func:
<a name='L286'>cmpl $4,%ecx <i><font color='green'>/* check that there is enough room */</font></i> * 检查是否有足够空间*/
<a name='L287'>jl end_func <i><font color='green'>// 需要放入4 个字符序列,如果放不下,则返回。</font></i>
<a name='L288'>movl func_table(,%eax,4),%eax <i><font color='green'>// 取功能键对应字符序列。</font></i>
<a name='L289'>xorl %ebx,%ebx
<a name='L290'>jmp put_queue <i><font color='green'>// 放入缓冲队列中。</font></i>
<a name='L291'>end_func:
<a name='L292'>ret
<a name='L293'>
<a name='L294'><i><font color='green'>/*</font></i>
<a name='L295'><i><font color='green'>* function keys send F1:'esc [ [ A' F2:'esc [ [ B' etc.</font></i>
<a name='L296'><i><font color='green'>*/</font></i>
<a name='L297'><i><font color='green'>/*</font></i>
<a name='L298'><i><font color='green'>* 功能键发送的扫描码,F1 键为:'esc [ [ A', F2 键为:'esc [ [ B'等。</font></i>
<a name='L299'><i><font color='green'>*/</font></i>
<a name='L300'>func_table:
<a name='L301'>.long 0x415b5b1b,0x425b5b1b,0x435b5b1b,0x445b5b1b
<a name='L302'>.long 0x455b5b1b,0x465b5b1b,0x475b5b1b,0x485b5b1b
<a name='L303'>.long 0x495b5b1b,0x4a5b5b1b,0x4b5b5b1b,0x4c5b5b1b
<a name='L304'>
<a name='L305'><i><font color='green'>// 扫描码-ASCII 字符映射表。</font></i>
<a name='L306'><i><font color='green'>// 根据在config.h 中定义的键盘类型(FINNISH,US,GERMEN,FRANCH),将相应键的扫描码映射</font></i>
<a name='L307'><i><font color='green'>// 到ASCII 字符。</font></i>
<a name='L308'><font color='darkred'>#if</font> <b>defined</b>(KBD_FINNISH)
<a name='L309'><i><font color='green'>// 以下是芬兰语键盘的扫描码映射表。</font></i>
<a name='L310'>key_map:
<a name='L311'>.byte 0,27 <i><font color='green'>// 扫描码0x00,0x01 对应的ASCII 码;</font></i>
<a name='L312'>.ascii "1234567890+'" <i><font color='green'>// 扫描码0x02,...0x0c,0x0d 对应的ASCII 码,以下类似。</font></i>
<a name='L313'>.byte 127,9
<a name='L314'>.ascii "qwertyuiop}"
<a name='L315'>.byte 0,13,0
<a name='L316'>.ascii "asdfghjkl|{"
<a name='L317'>.byte 0,0
<a name='L318'>.ascii "'zxcvbnm,.-"
<a name='L319'>.byte 0,'*,0,32 /* 36-39 */ /* 扫描码0x36-0x39 对应的ASCII 码 */
<a name='L320'>.fill 16,1,0 <i><font color='green'>/* 3A-49 */</font></i> <i><font color='green'>/* 扫描码0x3A-0x49 对应的ASCII 码 */</font></i>
<a name='L321'>.byte '-,0,0,0,'+ <i><font color='green'>/* 4A-4E */</font></i> <i><font color='green'>/* 扫描码0x4A-0x4E 对应的ASCII 码 */</font></i>
<a name='L322'>.byte 0,0,0,0,0,0,0 <i><font color='green'>/* 4F-55 */</font></i> <i><font color='green'>/* 扫描码0x4F-0x55 对应的ASCII 码 */</font></i>
<a name='L323'>.byte '&lt;
<a name='L324'>.fill 10,1,0
<a name='L325'>
<a name='L326'><i><font color='green'>// shift 键同时按下时的映射表。</font></i>
<a name='L327'>shift_map:
<a name='L328'>.byte 0,27
<a name='L329'>.ascii "!\"#$%&amp;/()=?`"
<a name='L330'>.byte 127,9
<a name='L331'>.ascii "QWERTYUIOP]^"
<a name='L332'>.byte 13,0
<a name='L333'>.ascii "ASDFGHJKL\\["
<a name='L334'>.byte 0,0
<a name='L335'>.ascii "*ZXCVBNM;:_"
<a name='L336'>.byte 0,'*,0,32 /* 36-39 */
<a name='L337'>.fill 16,1,0 <i><font color='green'>/* 3A-49 */</font></i>
<a name='L338'>.byte '-,0,0,0,'+ <i><font color='green'>/* 4A-4E */</font></i>
<a name='L339'>.byte 0,0,0,0,0,0,0 <i><font color='green'>/* 4F-55 */</font></i>
<a name='L340'>.byte '&gt;
<a name='L341'>.fill 10,1,0

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -