📄 61.html
字号:
<a name='L518'><font color='darkred'>#endif</font>
<a name='L519'><i><font color='green'>/*</font></i>
<a name='L520'><i><font color='green'>* do_self handles "normal" keys, ie keys that don't change meaning</font></i>
<a name='L521'><i><font color='green'>* and which have just one character returns.</font></i>
<a name='L522'><i><font color='green'>*/</font></i>
<a name='L523'><i><font color='green'>/*</font></i>
<a name='L524'><i><font color='green'>* do_self 用于处理“普通”键,也即含义没有变化并且只有一个字符返回的键。</font></i>
<a name='L525'><i><font color='green'>*/</font></i>
<a name='L526'>do_self:
<a name='L527'><i><font color='green'>// 454-460 行用于根据模式标志mode 选择alt_map、shift_map 或key_map 映射表之一。</font></i>
<a name='L528'>lea alt_map,%ebx <i><font color='green'>// alt 键同时按下时的映射表基址alt_map??ebx。</font></i>
<a name='L529'>testb $0x20,mode <i><font color='green'>/* alt-gr */</font></i> <i><font color='green'>/* 右alt 键同时按下了? */</font></i>
<a name='L530'>jne 1f <i><font color='green'>// 是,则向前跳转到标号1 处。</font></i>
<a name='L531'>lea shift_map,%ebx <i><font color='green'>// shift 键同时按下时的映射表基址shift_map??ebx。</font></i>
<a name='L532'>testb $0x03,mode <i><font color='green'>// 有shift 键同时按下了吗?</font></i>
<a name='L533'>jne 1f <i><font color='green'>// 有,则向前跳转到标号1 处。</font></i>
<a name='L534'>lea key_map,%ebx <i><font color='green'>// 否则使用普通映射表key_map。</font></i>
<a name='L535'><i><font color='green'>// 取映射表中对应扫描码的ASCII 字符,若没有对应字符,则返回(转none)。</font></i>
<a name='L536'>1: movb (%ebx,%eax),%al <i><font color='green'>// 将扫描码作为索引值,取对应的ASCII 码??al。</font></i>
<a name='L537'>orb %al,%al <i><font color='green'>// 检测看是否有对应的ASCII 码。</font></i>
<a name='L538'>je none <i><font color='green'>// 若没有(对应的ASCII 码=0),则返回。</font></i>
<a name='L539'><i><font color='green'>// 若ctrl 键已按下或caps 键锁定,并且字符在'a'-'}'(0x61-0x7D)范围内,则将其转成大写字符</font></i>
<a name='L540'><i><font color='green'>// (0x41-0x5D)。</font></i>
<a name='L541'>testb $0x4c,mode <i><font color='green'>/* ctrl or caps */</font></i> <i><font color='green'>/* 控制键已按下或caps 亮?*/</font></i>
<a name='L542'>je 2f <i><font color='green'>// 没有,则向前跳转标号2 处。</font></i>
<a name='L543'>cmpb $'a,%al // 将al 中的字符与'a'比较。
<a name='L544'>jb 2f <i><font color='green'>// 若al 值<'a',则转标号2 处。</font></i>
<a name='L545'>cmpb $'},%al // 将al 中的字符与'<font color='red'>}</font>'比较。
<a name='L546'>ja 2f <i><font color='green'>// 若al 值>'}',则转标号2 处。</font></i>
<a name='L547'>subb $32,%al <i><font color='green'>// 将al 转换为大写字符(减0x20)。</font></i>
<a name='L548'><i><font color='green'>// 若ctrl 键已按下,并且字符在'`'--'_'(0x40-0x5F)之间(是大写字符),则将其转换为控制字符</font></i>
<a name='L549'><i><font color='green'>// (0x00-0x1F)。</font></i>
<a name='L550'>2: testb $0x0c,mode <i><font color='green'>/* ctrl */</font></i> <i><font color='green'>/* ctrl 键同时按下了吗?*/</font></i>
<a name='L551'>je 3f <i><font color='green'>// 若没有则转标号3。</font></i>
<a name='L552'>cmpb $64,%al <i><font color='green'>// 将al 与'@'(64)字符比较(即判断字符所属范围)。</font></i>
<a name='L553'>jb 3f <i><font color='green'>// 若值<'@',则转标号3。</font></i>
<a name='L554'>cmpb $64+32,%al <i><font color='green'>// 将al 与'`'(96)字符比较(即判断字符所属范围)。</font></i>
<a name='L555'>jae 3f <i><font color='green'>// 若值>='`',则转标号3。</font></i>
<a name='L556'>subb $64,%al <i><font color='green'>// 否则al 值减0x40,</font></i>
<a name='L557'><i><font color='green'>// 即将字符转换为0x00-0x1f 之间的控制字符。</font></i>
<a name='L558'><i><font color='green'>// 若左alt 键同时按下,则将字符的位7 置位。</font></i>
<a name='L559'>3: testb $0x10,mode <i><font color='green'>/* left alt */</font></i> <i><font color='green'>/* 左alt 键同时按下?*/</font></i>
<a name='L560'>je 4f <i><font color='green'>// 没有,则转标号4。</font></i>
<a name='L561'>orb $0x80,%al <i><font color='green'>// 字符的位7 置位。</font></i>
<a name='L562'><i><font color='green'>// 将al 中的字符放入读缓冲队列中。</font></i>
<a name='L563'>4: andl $0xff,%eax <i><font color='green'>// 清eax 的高字和ah。</font></i>
<a name='L564'>xorl %ebx,%ebx <i><font color='green'>// 清ebx。</font></i>
<a name='L565'>call put_queue <i><font color='green'>// 将字符放入缓冲队列中。</font></i>
<a name='L566'>none: ret
<a name='L567'>
<a name='L568'><i><font color='green'>/*</font></i>
<a name='L569'><i><font color='green'>* minus has a routine of it's own, as a 'E0h' before</font></i>
<a name='L570'><i><font color='green'>* the scan code for minus means that the numeric keypad</font></i>
<a name='L571'><i><font color='green'>* slash was pushed.</font></i>
<a name='L572'><i><font color='green'>*/</font></i>
<a name='L573'><i><font color='green'>/*</font></i>
<a name='L574'><i><font color='green'>* 减号有它自己的处理子程序,因为在减号扫描码之前的0xe0</font></i>
<a name='L575'><i><font color='green'>* 意味着按下了数字小键盘上的斜杠键。</font></i>
<a name='L576'><i><font color='green'>*/</font></i>
<a name='L577'>minus: cmpb $1,e0 <i><font color='green'>// e0 标志置位了吗?</font></i>
<a name='L578'>jne do_self <i><font color='green'>// 没有,则调用do_self 对减号符进行普通处理。</font></i>
<a name='L579'>movl $'/,%eax // 否则用'/'替换减号'-'??al。
<a name='L580'>xorl %ebx,%ebx
<a name='L581'>jmp put_queue <i><font color='green'>// 并将字符放入缓冲队列中。</font></i>
<a name='L582'>
<a name='L583'><i><font color='green'>/*</font></i>
<a name='L584'><i><font color='green'>* This table decides which routine to call when a scan-code has been</font></i>
<a name='L585'><i><font color='green'>* gotten. Most routines just call do_self, or none, depending if</font></i>
<a name='L586'><i><font color='green'>* they are make or break.</font></i>
<a name='L587'><i><font color='green'>*/</font></i>
<a name='L588'><i><font color='green'>/* 下面是一张子程序地址跳转表。当取得扫描码后就根据此表调用相应的扫描码处理子程序。</font></i>
<a name='L589'><i><font color='green'>* 大多数调用的子程序是do_self,或者是none,这起决于是按键(make)还是释放键(break)。</font></i>
<a name='L590'><i><font color='green'>*/</font></i>
<a name='L591'>key_table:
<a name='L592'>.long none,do_self,do_self,do_self <i><font color='green'>/* 00-03 s0 esc 1 2 */</font></i>
<a name='L593'>.long do_self,do_self,do_self,do_self <i><font color='green'>/* 04-07 3 4 5 6 */</font></i>
<a name='L594'>.long do_self,do_self,do_self,do_self <i><font color='green'>/* 08-0B 7 8 9 0 */</font></i>
<a name='L595'>.long do_self,do_self,do_self,do_self <i><font color='green'>/* 0C-0F + ' bs tab */</font></i>
<a name='L596'>.long do_self,do_self,do_self,do_self <i><font color='green'>/* 10-13 q w e r */</font></i>
<a name='L597'>.long do_self,do_self,do_self,do_self <i><font color='green'>/* 14-17 t y u i */</font></i>
<a name='L598'>.long do_self,do_self,do_self,do_self <i><font color='green'>/* 18-1B o p } ^ */</font></i>
<a name='L599'>.long do_self,ctrl,do_self,do_self <i><font color='green'>/* 1C-1F enter ctrl a s */</font></i>
<a name='L600'>.long do_self,do_self,do_self,do_self <i><font color='green'>/* 20-23 d f g h */</font></i>
<a name='L601'>.long do_self,do_self,do_self,do_self <i><font color='green'>/* 24-27 j k l | */</font></i>
<a name='L602'>.long do_self,do_self,lshift,do_self <i><font color='green'>/* 28-2B { para lshift , */</font></i>
<a name='L603'>.long do_self,do_self,do_self,do_self <i><font color='green'>/* 2C-2F z x c v */</font></i>
<a name='L604'>.long do_self,do_self,do_self,do_self <i><font color='green'>/* 30-33 b n m , */</font></i>
<a name='L605'>.long do_self,minus,rshift,do_self <i><font color='green'>/* 34-37 . - rshift * */</font></i>
<a name='L606'>.long alt,do_self,caps,func <i><font color='green'>/* 38-3B alt sp caps f1 */</font></i>
<a name='L607'>.long func,func,func,func <i><font color='green'>/* 3C-3F f2 f3 f4 f5 */</font></i>
<a name='L608'>.long func,func,func,func <i><font color='green'>/* 40-43 f6 f7 f8 f9 */</font></i>
<a name='L609'>.long func,num,scroll,cursor <i><font color='green'>/* 44-47 f10 num scr home */</font></i>
<a name='L610'>.long cursor,cursor,do_self,cursor <i><font color='green'>/* 48-4B up pgup - left */</font></i>
<a name='L611'>.long cursor,cursor,do_self,cursor <i><font color='green'>/* 4C-4F n5 right + end */</font></i>
<a name='L612'>.long cursor,cursor,cursor,cursor <i><font color='green'>/* 50-53 dn pgdn ins del */</font></i>
<a name='L613'>.long none,none,do_self,func <i><font color='green'>/* 54-57 sysreq ? < f11 */</font></i>
<a name='L614'>.long func,none,none,none <i><font color='green'>/* 58-5B f12 ? ? ? */</font></i>
<a name='L615'>.long none,none,none,none <i><font color='green'>/* 5C-5F ? ? ? ? */</font></i>
<a name='L616'>.long none,none,none,none <i><font color='green'>/* 60-63 ? ? ? ? */</font></i>
<a name='L617'>.long none,none,none,none <i><font color='green'>/* 64-67 ? ? ? ? */</font></i>
<a name='L618'>.long none,none,none,none <i><font color='green'>/* 68-6B ? ? ? ? */</font></i>
<a name='L619'>.long none,none,none,none <i><font color='green'>/* 6C-6F ? ? ? ? */</font></i>
<a name='L620'>.long none,none,none,none <i><font color='green'>/* 70-73 ? ? ? ? */</font></i>
<a name='L621'>.long none,none,none,none <i><font color='green'>/* 74-77 ? ? ? ? */</font></i>
<a name='L622'>.long none,none,none,none <i><font color='green'>/* 78-7B ? ? ? ? */</font></i>
<a name='L623'>.long none,none,none,none <i><font color='green'>/* 7C-7F ? ? ? ? */</font></i>
<a name='L624'>.long none,none,none,none <i><font color='green'>/* 80-83 ? br br br */</font></i>
<a name='L625'>.long none,none,none,none <i><font color='green'>/* 84-87 br br br br */</font></i>
<a name='L626'>.long none,none,none,none <i><font color='green'>/* 88-8B br br br br */</font></i>
<a name='L627'>.long none,none,none,none <i><font color='green'>/* 8C-8F br br br br */</font></i>
<a name='L628'>.long none,none,none,none <i><font color='green'>/* 90-93 br br br br */</font></i>
<a name='L629'>.long none,none,none,none <i><font color='green'>/* 94-97 br br br br */</font></i>
<a name='L630'>.long none,none,none,none <i><font color='green'>/* 98-9B br br br br */</font></i>
<a name='L631'>.long none,unctrl,none,none <i><font color='green'>/* 9C-9F br unctrl br br */</font></i>
<a name='L632'>.long none,none,none,none <i><font color='green'>/* A0-A3 br br br br */</font></i>
<a name='L633'>.long none,none,none,none <i><font color='green'>/* A4-A7 br br br br */</font></i>
<a name='L634'>.long none,none,unlshift,none <i><font color='green'>/* A8-AB br br unlshift br */</font></i>
<a name='L635'>.long none,none,none,none <i><font color='green'>/* AC-AF br br br br */</font></i>
<a name='L636'>.long none,none,none,none <i><font color='green'>/* B0-B3 br br br br */</font></i>
<a name='L637'>.long none,none,unrshift,none <i><font color='green'>/* B4-B7 br br unrshift br */</font></i>
<a name='L638'>.long unalt,none,uncaps,none <i><font color='green'>/* B8-BB unalt br uncaps br */</font></i>
<a name='L639'>.long none,none,none,none <i><font color='green'>/* BC-BF br br br br */</font></i>
<a name='L640'>.long none,none,none,none <i><font color='green'>/* C0-C3 br br br br */</font></i>
<a name='L641'>.long none,none,none,none <i><font color='green'>/* C4-C7 br br br br */</font></i>
<a name='L642'>.long none,none,none,none <i><font color='green'>/* C8-CB br br br br */</font></i>
<a name='L643'>.long none,none,none,none <i><font color='green'>/* CC-CF br br br br */</font></i>
<a name='L644'>.long none,none,none,none <i><font color='green'>/* D0-D3 br br br br */</font></i>
<a name='L645'>.long none,none,none,none <i><font color='green'>/* D4-D7 br br br br */</font></i>
<a name='L646'>.long none,none,none,none <i><font color='green'>/* D8-DB br ? ? ? */</font></i>
<a name='L647'>.long none,none,none,none <i><font color='green'>/* DC-DF ? ? ? ? */</font></i>
<a name='L648'>.long none,none,none,none <i><font color='green'>/* E0-E3 e0 e1 ? ? */</font></i>
<a name='L649'>.long none,none,none,none <i><font color='green'>/* E4-E7 ? ? ? ? */</font></i>
<a name='L650'>.long none,none,none,none <i><font color='green'>/* E8-EB ? ? ? ? */</font></i>
<a name='L651'>.long none,none,none,none <i><font color='green'>/* EC-EF ? ? ? ? */</font></i>
<a name='L652'>.long none,none,none,none <i><font color='green'>/* F0-F3 ? ? ? ? */</font></i>
<a name='L653'>.long none,none,none,none <i><font color='green'>/* F4-F7 ? ? ? ? */</font></i>
<a name='L654'>.long none,none,none,none <i><font color='green'>/* F8-FB ? ? ? ? */</font></i>
<a name='L655'>.long none,none,none,none <i><font color='green'>/* FC-FF ? ? ? ? */</font></i>
<a name='L656'>
<a name='L657'><i><font color='green'>/*</font></i>
<a name='L658'><i><font color='green'>* kb_wait waits for the keyboard controller buffer to empty.</font></i>
<a name='L659'><i><font color='green'>* there is no timeout - if the buffer doesn't empty, we hang.</font></i>
<a name='L660'><i><font color='green'>*/</font></i>
<a name='L661'><i><font color='green'>/*</font></i>
<a name='L662'><i><font color='green'>* 子程序kb_wait 用于等待键盘控制器缓冲空。不存在超时处理 - 如果</font></i>
<a name='L663'><i><font color='green'>* 缓冲永远不空的话,程序就会永远等待(死掉)。</font></i>
<a name='L664'><i><font color='green'>*/</font></i>
<a name='L665'>kb_wait:
<a name='L666'>pushl %eax
<a name='L667'>1: inb $0x64,%al <i><font color='green'>// 读键盘控制器状态。</font></i>
<a name='L668'>testb $0x02,%al <i><font color='green'>// 测试输入缓冲器是否为空(等于0)。</font></i>
<a name='L669'>jne 1b <i><font color='green'>// 若不空,则跳转循环等待。</font></i>
<a name='L670'>popl %eax
<a name='L671'>ret
<a name='L672'><i><font color='green'>/*</font></i>
<a name='L673'><i><font color='green'>* This routine reboots the machine by asking the keyboard</font></i>
<a name='L674'><i><font color='green'>* controller to pulse the reset-line low.</font></i>
<a name='L675'><i><font color='green'>*/</font></i>
<a name='L676'><i><font color='green'>/*</font></i>
<a name='L677'><i><font color='green'>* 该子程序通过设置键盘控制器,向复位线输出负脉冲,使系统复位重启(reboot)。</font></i>
<a name='L678'><i><font color='green'>*/</font></i>
<a name='L679'>reboot:
<a name='L680'>call kb_wait <i><font color='green'>// 首先等待键盘控制器输入缓冲器空。</font></i>
<a name='L681'>movw $0x1234,0x472 <i><font color='green'>/* don't do memory check */</font></i>
<a name='L682'>movb $0xfc,%al <i><font color='green'>/* pulse reset and A20 low */</font></i>
<a name='L683'>outb %al,$0x64 <i><font color='green'>// 向系统复位和A20 线输出负脉冲。</font></i>
<a name='L684'>die: jmp die <i><font color='green'>// 死机。</font></i>
</pre>
<hr>
<a name='BOTTOM'>
<i><font color='green'>/* [<][>][^][v]<a href='#TOP'>[top]</a>[bottom]<a href='../mains.html'>[index]</a><a href='../help.html'>[help]</a> */</font></i>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -