📄 keyboard.s
字号:
<a name=L444 href="source/kernel/chr_drv/keyboard.S#L444">444</a> .fill 10,1,0<a name=L445 href="source/kernel/chr_drv/keyboard.S#L445">445</a> <a name=L446 href="source/kernel/chr_drv/keyboard.S#L446">446</a> #else<a name=L447 href="source/kernel/chr_drv/keyboard.S#L447">447</a> #error "KBD-type not defined"<a name=L448 href="source/kernel/chr_drv/keyboard.S#L448">448</a> #endif<a name=L449 href="source/kernel/chr_drv/keyboard.S#L449">449</a> /*<a name=L450 href="source/kernel/chr_drv/keyboard.S#L450">450</a> * do_self handles "normal" keys, ie keys that don't change meaning<a name=L451 href="source/kernel/chr_drv/keyboard.S#L451">451</a> * and which have just one character returns.<a name=L452 href="source/kernel/chr_drv/keyboard.S#L452">452</a> */<a name=L453 href="source/kernel/chr_drv/keyboard.S#L453">453</a> do_self:<a name=L454 href="source/kernel/chr_drv/keyboard.S#L454">454</a> lea alt_map,%ebx<a name=L455 href="source/kernel/chr_drv/keyboard.S#L455">455</a> testb $0x20,mode /* alt-gr */<a name=L456 href="source/kernel/chr_drv/keyboard.S#L456">456</a> jne 1f<a name=L457 href="source/kernel/chr_drv/keyboard.S#L457">457</a> lea shift_map,%ebx<a name=L458 href="source/kernel/chr_drv/keyboard.S#L458">458</a> testb $0x03,mode<a name=L459 href="source/kernel/chr_drv/keyboard.S#L459">459</a> jne 1f<a name=L460 href="source/kernel/chr_drv/keyboard.S#L460">460</a> lea key_map,%ebx<a name=L461 href="source/kernel/chr_drv/keyboard.S#L461">461</a> 1: movb (%ebx,%eax),%al<a name=L462 href="source/kernel/chr_drv/keyboard.S#L462">462</a> orb %al,%al<a name=L463 href="source/kernel/chr_drv/keyboard.S#L463">463</a> je none<a name=L464 href="source/kernel/chr_drv/keyboard.S#L464">464</a> testb $0x4c,mode /* ctrl or caps */<a name=L465 href="source/kernel/chr_drv/keyboard.S#L465">465</a> je 2f<a name=L466 href="source/kernel/chr_drv/keyboard.S#L466">466</a> cmpb $'a,%al<a name=L467 href="source/kernel/chr_drv/keyboard.S#L467">467</a> jb 2f<a name=L468 href="source/kernel/chr_drv/keyboard.S#L468">468</a> cmpb $'},%al<a name=L469 href="source/kernel/chr_drv/keyboard.S#L469">469</a> ja 2f<a name=L470 href="source/kernel/chr_drv/keyboard.S#L470">470</a> subb $32,%al<a name=L471 href="source/kernel/chr_drv/keyboard.S#L471">471</a> 2: testb $0x0c,mode /* ctrl */<a name=L472 href="source/kernel/chr_drv/keyboard.S#L472">472</a> je 3f<a name=L473 href="source/kernel/chr_drv/keyboard.S#L473">473</a> cmpb $64,%al<a name=L474 href="source/kernel/chr_drv/keyboard.S#L474">474</a> jb 3f<a name=L475 href="source/kernel/chr_drv/keyboard.S#L475">475</a> cmpb $64+32,%al<a name=L476 href="source/kernel/chr_drv/keyboard.S#L476">476</a> jae 3f<a name=L477 href="source/kernel/chr_drv/keyboard.S#L477">477</a> subb $64,%al<a name=L478 href="source/kernel/chr_drv/keyboard.S#L478">478</a> 3: testb $0x10,mode /* left alt */<a name=L479 href="source/kernel/chr_drv/keyboard.S#L479">479</a> je 4f<a name=L480 href="source/kernel/chr_drv/keyboard.S#L480">480</a> orb $0x80,%al<a name=L481 href="source/kernel/chr_drv/keyboard.S#L481">481</a> 4: andl $0xff,%eax<a name=L482 href="source/kernel/chr_drv/keyboard.S#L482">482</a> xorl %ebx,%ebx<a name=L483 href="source/kernel/chr_drv/keyboard.S#L483">483</a> call put_queue<a name=L484 href="source/kernel/chr_drv/keyboard.S#L484">484</a> none: ret<a name=L485 href="source/kernel/chr_drv/keyboard.S#L485">485</a> <a name=L486 href="source/kernel/chr_drv/keyboard.S#L486">486</a> /*<a name=L487 href="source/kernel/chr_drv/keyboard.S#L487">487</a> * minus has a routine of it's own, as a 'E0h' before<a name=L488 href="source/kernel/chr_drv/keyboard.S#L488">488</a> * the scan code for minus means that the numeric keypad<a name=L489 href="source/kernel/chr_drv/keyboard.S#L489">489</a> * slash was pushed.<a name=L490 href="source/kernel/chr_drv/keyboard.S#L490">490</a> */<a name=L491 href="source/kernel/chr_drv/keyboard.S#L491">491</a> minus: cmpb $1,e0<a name=L492 href="source/kernel/chr_drv/keyboard.S#L492">492</a> jne do_self<a name=L493 href="source/kernel/chr_drv/keyboard.S#L493">493</a> movl $'/,%eax<a name=L494 href="source/kernel/chr_drv/keyboard.S#L494">494</a> xorl %ebx,%ebx<a name=L495 href="source/kernel/chr_drv/keyboard.S#L495">495</a> jmp put_queue<a name=L496 href="source/kernel/chr_drv/keyboard.S#L496">496</a> <a name=L497 href="source/kernel/chr_drv/keyboard.S#L497">497</a> /*<a name=L498 href="source/kernel/chr_drv/keyboard.S#L498">498</a> * This table decides which routine to call when a scan-code has been<a name=L499 href="source/kernel/chr_drv/keyboard.S#L499">499</a> * gotten. Most routines just call do_self, or none, depending if<a name=L500 href="source/kernel/chr_drv/keyboard.S#L500">500</a> * they are make or break.<a name=L501 href="source/kernel/chr_drv/keyboard.S#L501">501</a> */<a name=L502 href="source/kernel/chr_drv/keyboard.S#L502">502</a> key_table:<a name=L503 href="source/kernel/chr_drv/keyboard.S#L503">503</a> .long none,do_self,do_self,do_self /* 00-03 s0 esc 1 2 */<a name=L504 href="source/kernel/chr_drv/keyboard.S#L504">504</a> .long do_self,do_self,do_self,do_self /* 04-07 3 4 5 6 */<a name=L505 href="source/kernel/chr_drv/keyboard.S#L505">505</a> .long do_self,do_self,do_self,do_self /* 08-0B 7 8 9 0 */<a name=L506 href="source/kernel/chr_drv/keyboard.S#L506">506</a> .long do_self,do_self,do_self,do_self /* 0C-0F + ' bs tab */<a name=L507 href="source/kernel/chr_drv/keyboard.S#L507">507</a> .long do_self,do_self,do_self,do_self /* 10-13 q w e r */<a name=L508 href="source/kernel/chr_drv/keyboard.S#L508">508</a> .long do_self,do_self,do_self,do_self /* 14-17 t y u i */<a name=L509 href="source/kernel/chr_drv/keyboard.S#L509">509</a> .long do_self,do_self,do_self,do_self /* 18-1B o p } ^ */<a name=L510 href="source/kernel/chr_drv/keyboard.S#L510">510</a> .long do_self,ctrl,do_self,do_self /* 1C-1F enter ctrl a s */<a name=L511 href="source/kernel/chr_drv/keyboard.S#L511">511</a> .long do_self,do_self,do_self,do_self /* 20-23 d f g h */<a name=L512 href="source/kernel/chr_drv/keyboard.S#L512">512</a> .long do_self,do_self,do_self,do_self /* 24-27 j k l | */<a name=L513 href="source/kernel/chr_drv/keyboard.S#L513">513</a> .long do_self,do_self,lshift,do_self /* 28-2B { para lshift , */<a name=L514 href="source/kernel/chr_drv/keyboard.S#L514">514</a> .long do_self,do_self,do_self,do_self /* 2C-2F z x c v */<a name=L515 href="source/kernel/chr_drv/keyboard.S#L515">515</a> .long do_self,do_self,do_self,do_self /* 30-33 b n m , */<a name=L516 href="source/kernel/chr_drv/keyboard.S#L516">516</a> .long do_self,minus,rshift,do_self /* 34-37 . - rshift * */<a name=L517 href="source/kernel/chr_drv/keyboard.S#L517">517</a> .long alt,do_self,caps,func /* 38-3B alt sp caps f1 */<a name=L518 href="source/kernel/chr_drv/keyboard.S#L518">518</a> .long func,func,func,func /* 3C-3F f2 f3 f4 f5 */<a name=L519 href="source/kernel/chr_drv/keyboard.S#L519">519</a> .long func,func,func,func /* 40-43 f6 f7 f8 f9 */<a name=L520 href="source/kernel/chr_drv/keyboard.S#L520">520</a> .long func,num,scroll,cursor /* 44-47 f10 num scr home */<a name=L521 href="source/kernel/chr_drv/keyboard.S#L521">521</a> .long cursor,cursor,do_self,cursor /* 48-4B up pgup - left */<a name=L522 href="source/kernel/chr_drv/keyboard.S#L522">522</a> .long cursor,cursor,do_self,cursor /* 4C-4F n5 right + end */<a name=L523 href="source/kernel/chr_drv/keyboard.S#L523">523</a> .long cursor,cursor,cursor,cursor /* 50-53 dn pgdn ins del */<a name=L524 href="source/kernel/chr_drv/keyboard.S#L524">524</a> .long none,none,do_self,func /* 54-57 sysreq ? < f11 */<a name=L525 href="source/kernel/chr_drv/keyboard.S#L525">525</a> .long func,none,none,none /* 58-5B f12 ? ? ? */<a name=L526 href="source/kernel/chr_drv/keyboard.S#L526">526</a> .long none,none,none,none /* 5C-5F ? ? ? ? */<a name=L527 href="source/kernel/chr_drv/keyboard.S#L527">527</a> .long none,none,none,none /* 60-63 ? ? ? ? */<a name=L528 href="source/kernel/chr_drv/keyboard.S#L528">528</a> .long none,none,none,none /* 64-67 ? ? ? ? */<a name=L529 href="source/kernel/chr_drv/keyboard.S#L529">529</a> .long none,none,none,none /* 68-6B ? ? ? ? */<a name=L530 href="source/kernel/chr_drv/keyboard.S#L530">530</a> .long none,none,none,none /* 6C-6F ? ? ? ? */<a name=L531 href="source/kernel/chr_drv/keyboard.S#L531">531</a> .long none,none,none,none /* 70-73 ? ? ? ? */<a name=L532 href="source/kernel/chr_drv/keyboard.S#L532">532</a> .long none,none,none,none /* 74-77 ? ? ? ? */<a name=L533 href="source/kernel/chr_drv/keyboard.S#L533">533</a> .long none,none,none,none /* 78-7B ? ? ? ? */<a name=L534 href="source/kernel/chr_drv/keyboard.S#L534">534</a> .long none,none,none,none /* 7C-7F ? ? ? ? */<a name=L535 href="source/kernel/chr_drv/keyboard.S#L535">535</a> .long none,none,none,none /* 80-83 ? br br br */<a name=L536 href="source/kernel/chr_drv/keyboard.S#L536">536</a> .long none,none,none,none /* 84-87 br br br br */<a name=L537 href="source/kernel/chr_drv/keyboard.S#L537">537</a> .long none,none,none,none /* 88-8B br br br br */<a name=L538 href="source/kernel/chr_drv/keyboard.S#L538">538</a> .long none,none,none,none /* 8C-8F br br br br */<a name=L539 href="source/kernel/chr_drv/keyboard.S#L539">539</a> .long none,none,none,none /* 90-93 br br br br */<a name=L540 href="source/kernel/chr_drv/keyboard.S#L540">540</a> .long none,none,none,none /* 94-97 br br br br */<a name=L541 href="source/kernel/chr_drv/keyboard.S#L541">541</a> .long none,none,none,none /* 98-9B br br br br */<a name=L542 href="source/kernel/chr_drv/keyboard.S#L542">542</a> .long none,unctrl,none,none /* 9C-9F br unctrl br br */<a name=L543 href="source/kernel/chr_drv/keyboard.S#L543">543</a> .long none,none,none,none /* A0-A3 br br br br */<a name=L544 href="source/kernel/chr_drv/keyboard.S#L544">544</a> .long none,none,none,none /* A4-A7 br br br br */<a name=L545 href="source/kernel/chr_drv/keyboard.S#L545">545</a> .long none,none,unlshift,none /* A8-AB br br unlshift br */<a name=L546 href="source/kernel/chr_drv/keyboard.S#L546">546</a> .long none,none,none,none /* AC-AF br br br br */<a name=L547 href="source/kernel/chr_drv/keyboard.S#L547">547</a> .long none,none,none,none /* B0-B3 br br br br */<a name=L548 href="source/kernel/chr_drv/keyboard.S#L548">548</a> .long none,none,unrshift,none /* B4-B7 br br unrshift br */<a name=L549 href="source/kernel/chr_drv/keyboard.S#L549">549</a> .long unalt,none,uncaps,none /* B8-BB unalt br uncaps br */<a name=L550 href="source/kernel/chr_drv/keyboard.S#L550">550</a> .long none,none,none,none /* BC-BF br br br br */<a name=L551 href="source/kernel/chr_drv/keyboard.S#L551">551</a> .long none,none,none,none /* C0-C3 br br br br */<a name=L552 href="source/kernel/chr_drv/keyboard.S#L552">552</a> .long none,none,none,none /* C4-C7 br br br br */<a name=L553 href="source/kernel/chr_drv/keyboard.S#L553">553</a> .long none,none,none,none /* C8-CB br br br br */<a name=L554 href="source/kernel/chr_drv/keyboard.S#L554">554</a> .long none,none,none,none /* CC-CF br br br br */<a name=L555 href="source/kernel/chr_drv/keyboard.S#L555">555</a> .long none,none,none,none /* D0-D3 br br br br */<a name=L556 href="source/kernel/chr_drv/keyboard.S#L556">556</a> .long none,none,none,none /* D4-D7 br br br br */<a name=L557 href="source/kernel/chr_drv/keyboard.S#L557">557</a> .long none,none,none,none /* D8-DB br ? ? ? */<a name=L558 href="source/kernel/chr_drv/keyboard.S#L558">558</a> .long none,none,none,none /* DC-DF ? ? ? ? */<a name=L559 href="source/kernel/chr_drv/keyboard.S#L559">559</a> .long none,none,none,none /* E0-E3 e0 e1 ? ? */<a name=L560 href="source/kernel/chr_drv/keyboard.S#L560">560</a> .long none,none,none,none /* E4-E7 ? ? ? ? */<a name=L561 href="source/kernel/chr_drv/keyboard.S#L561">561</a> .long none,none,none,none /* E8-EB ? ? ? ? */<a name=L562 href="source/kernel/chr_drv/keyboard.S#L562">562</a> .long none,none,none,none /* EC-EF ? ? ? ? */<a name=L563 href="source/kernel/chr_drv/keyboard.S#L563">563</a> .long none,none,none,none /* F0-F3 ? ? ? ? */<a name=L564 href="source/kernel/chr_drv/keyboard.S#L564">564</a> .long none,none,none,none /* F4-F7 ? ? ? ? */<a name=L565 href="source/kernel/chr_drv/keyboard.S#L565">565</a> .long none,none,none,none /* F8-FB ? ? ? ? */<a name=L566 href="source/kernel/chr_drv/keyboard.S#L566">566</a> .long none,none,none,none /* FC-FF ? ? ? ? */<a name=L567 href="source/kernel/chr_drv/keyboard.S#L567">567</a> <a name=L568 href="source/kernel/chr_drv/keyboard.S#L568">568</a> /*<a name=L569 href="source/kernel/chr_drv/keyboard.S#L569">569</a> * kb_wait waits for the keyboard controller buffer to empty.<a name=L570 href="source/kernel/chr_drv/keyboard.S#L570">570</a> * there is no timeout - if the buffer doesn't empty, we hang.<a name=L571 href="source/kernel/chr_drv/keyboard.S#L571">571</a> */<a name=L572 href="source/kernel/chr_drv/keyboard.S#L572">572</a> kb_wait:<a name=L573 href="source/kernel/chr_drv/keyboard.S#L573">573</a> pushl %eax<a name=L574 href="source/kernel/chr_drv/keyboard.S#L574">574</a> 1: inb $0x64,%al<a name=L575 href="source/kernel/chr_drv/keyboard.S#L575">575</a> testb $0x02,%al<a name=L576 href="source/kernel/chr_drv/keyboard.S#L576">576</a> jne 1b<a name=L577 href="source/kernel/chr_drv/keyboard.S#L577">577</a> popl %eax<a name=L578 href="source/kernel/chr_drv/keyboard.S#L578">578</a> ret<a name=L579 href="source/kernel/chr_drv/keyboard.S#L579">579</a> /*<a name=L580 href="source/kernel/chr_drv/keyboard.S#L580">580</a> * This routine reboots the machine by asking the keyboard<a name=L581 href="source/kernel/chr_drv/keyboard.S#L581">581</a> * controller to pulse the reset-line low.<a name=L582 href="source/kernel/chr_drv/keyboard.S#L582">582</a> */<a name=L583 href="source/kernel/chr_drv/keyboard.S#L583">583</a> reboot:<a name=L584 href="source/kernel/chr_drv/keyboard.S#L584">584</a> call kb_wait<a name=L585 href="source/kernel/chr_drv/keyboard.S#L585">585</a> movw $0x1234,0x472 /* don't do memory check */<a name=L586 href="source/kernel/chr_drv/keyboard.S#L586">586</a> movb $0xfc,%al /* pulse reset and A20 low */<a name=L587 href="source/kernel/chr_drv/keyboard.S#L587">587</a> outb %al,$0x64<a name=L588 href="source/kernel/chr_drv/keyboard.S#L588">588</a> die: jmp die</pre><hr><div align=center> [<b><i>源代码浏览</i></b>] [<a href="diff/kernel/chr_drv/keyboard.S">区别标定</a>] [<a href="ident">标识符搜索</a>] [<a href="search">文本搜索</a>] [<a href="find">文件搜索</a>] </div><hr>本网页由 <a href="http:blurb.html">LXR引擎</a> 自动生成.<br></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -