keyboard.S
资源名称:kernel.rar [点击查看]
上传用户:qyj398
上传日期:2008-02-19
资源大小:71k
文件大小:17k
源码类别:
Linux/Unix编程
开发平台:
Unix_Linux
- /*
- * linux/kernel/keyboard.S
- *
- * (C) 1991 Linus Torvalds
- */
- /*
- * Thanks to Alfred Leung for US keyboard patches
- * Wolfgang Thiel for German keyboard patches
- * Marc Corsini for the French keyboard
- * LeBlanc@mcc.ac.uk for the UK keyboard
- * Tommy Thorn (tthorn@daimi.aau.dk) for Danish keyboard
- */
- /* KBD_FINNISH for Finnish keyboards
- * KBD_US for US-type
- * KBD_GR for German keyboards
- * KBD_FR for Frech keyboard
- * KBD_UK for British extended keyboard
- * KBD_DK for Danish keyboard
- */
- #define KBD_FINNISH
- .text
- .globl _hard_reset_now
- .globl _keyboard_interrupt
- .globl _kapplic
- .globl _kmode
- .globl _kleds
- .globl _set_leds
- /*
- * these are for the keyboard read functions
- */
- size = 1024 /* must be a power of two ! And MUST be the same
- as in tty_io.c !!!! */
- head = 4
- tail = 8
- proc_list = 12
- buf = 16
- _kapplic: .byte 0
- _kmode: .byte 0 /* caps, alt, ctrl and shift mode */
- _kleds: .byte 2 /* num-lock, caps, scroll-lock mode (nom-lock on) */
- e0: .byte 0
- /*
- * con_int is the real interrupt routine that reads the
- * keyboard scan-code and converts it into the appropriate
- * ascii character(s).
- */
- _keyboard_interrupt:
- cld
- pushl %eax
- pushl %ebx
- pushl %ecx
- pushl %edx
- push %ds
- push %es
- movl $0x10,%eax
- mov %ax,%ds
- mov %ax,%es
- xorl %eax,%eax /* %eax is scan code */
- inb $0x60,%al
- pushl %eax
- inb $0x61,%al
- jmp 1f
- 1: jmp 1f
- 1: orb $0x80,%al
- jmp 1f
- 1: jmp 1f
- 1: outb %al,$0x61
- jmp 1f
- 1: jmp 1f
- 1: andb $0x7F,%al
- outb %al,$0x61
- jmp 1f
- 1: jmp 1f
- 1: movb $0x20,%al
- outb %al,$0x20
- popl %eax
- movl $1,%ebx
- cmpb $0xE0,%al
- je end_intr
- movl $2,%ebx
- cmpb $0xE1,%al
- je end_intr
- sti
- call key_table(,%eax,4)
- call _do_keyboard_interrupt
- movl $0,%ebx
- end_intr:
- movb %bl,e0
- pop %es
- pop %ds
- popl %edx
- popl %ecx
- popl %ebx
- popl %eax
- iret
- /*
- * This routine fills the buffer with max 8 bytes, taken from
- * %ebx:%eax. (%edx is high). The bytes are written in the
- * order %al,%ah,%eal,%eah,%bl,%bh ... until %eax is zero.
- */
- put_queue:
- pushl %ecx
- pushl %edx
- movl _table_list,%edx # read-queue for console
- movl head(%edx),%ecx
- 1: movb %al,buf(%edx,%ecx)
- incl %ecx
- andl $size-1,%ecx
- cmpl tail(%edx),%ecx # buffer full - discard everything
- je 3f
- shrdl $8,%ebx,%eax
- je 2f
- shrl $8,%ebx
- jmp 1b
- 2: movl %ecx,head(%edx)
- movl proc_list(%edx),%ecx
- testl %ecx,%ecx
- je 3f
- movl $0,(%ecx)
- 3: popl %edx
- popl %ecx
- ret
- ctrl: movb $0x04,%al
- jmp 1f
- alt: movb $0x10,%al
- 1: cmpb $0,e0
- je 2f
- addb %al,%al
- 2: orb %al,_kmode
- ret
- unctrl: movb $0x04,%al
- jmp 1f
- unalt: movb $0x10,%al
- 1: cmpb $0,e0
- je 2f
- addb %al,%al
- 2: notb %al
- andb %al,_kmode
- ret
- lshift:
- orb $0x01,_kmode
- ret
- unlshift:
- andb $0xfe,_kmode
- ret
- rshift:
- orb $0x02,_kmode
- ret
- unrshift:
- andb $0xfd,_kmode
- ret
- old_leds:
- .byte 2
- caps: testb $0x80,_kmode
- jne 1f
- xorb $4,_kleds
- xorb $0x40,_kmode
- orb $0x80,_kmode
- _set_leds:
- movb _kleds,%al
- cmpb old_leds,%al
- je 1f
- movb %al,old_leds
- call kb_wait
- movb $0xed,%al /* set leds command */
- outb %al,$0x60
- call kb_wait
- movb _kleds,%al
- outb %al,$0x60
- 1: ret
- uncaps: andb $0x7f,_kmode
- ret
- scroll:
- testb $0x03,_kmode
- je 1f
- call _show_mem
- jmp 2f
- 1: call _show_state
- 2: xorb $1,_kleds
- jmp _set_leds
- num: cmpb $0x01,_kapplic
- jne notappl
- movw $0x0050,%ax
- applkey:
- shll $16,%eax
- movw $0x4f1b,%ax
- xorl %ebx,%ebx
- jmp put_queue
- notappl:
- xorb $2,_kleds
- jmp _set_leds
- /*
- * cursor-key/numeric keypad cursor keys are handled here.
- * checking for numeric keypad etc.
- */
- cursor:
- subb $0x47,%al
- jb 1f
- cmpb $12,%al
- ja 1f
- jne cur2 /* check for ctrl-alt-del */
- testb $0x0c,_kmode
- je cur2
- testb $0x30,_kmode
- jne _ctrl_alt_del
- cur2: cmpb $0x01,e0 /* e0 forces cursor movement */
- je cur
- testb $0x03,_kmode /* shift forces cursor */
- jne cur
- cmpb $0x01,_kapplic
- jne notcappl
- movb appl_table(%eax),%al
- jmp applkey
- notcappl:
- testb $0x02,_kleds /* not num-lock forces cursor */
- je cur
- xorl %ebx,%ebx
- movb num_table(%eax),%al
- jmp put_queue
- 1: ret
- /*
- * cursor keys send ^[ [ x if normal, ^[ O x if application mode
- */
- cur: movb cur_table(%eax),%al
- cmpb $'9,%al
- ja ok_cur
- movb $'~,%ah
- ok_cur: shll $16,%eax
- movw $0x5b1b,%ax
- xorl %ebx,%ebx
- cmpb $0x01,_kapplic
- jne put_queue
- movb $0x4f,%ah
- jmp put_queue
- #if defined(KBD_FR) /* || defined(KBD_DK) correct, but .. */
- num_table:
- .ascii "789-456+1230."
- #else
- num_table:
- .ascii "789-456+1230,"
- #endif
- cur_table:
- .ascii "HA5-DGC+YB623"
- /*
- Keypad / 35 B7 Q
- Keypad * (PrtSc) 37 B7 R
- Keypad NumLock 45 ?? P
- Keypad 7 (Home) 47 C7 w
- Keypad 8 (Up arrow) 48 C8 x
- Keypad 9 (PgUp) 49 C9 y
- Keypad - 4A CA S
- Keypad 4 (Left arrow) 4B CB t
- Keypad 5 4C CC u
- Keypad 6 (Right arrow) 4D CD v
- Keypad + 4E CE l
- Keypad 1 (End) 4F CF q
- Keypad 2 (Down arrow) 50 D0 r
- Keypad 3 (PgDn) 51 D1 s
- Keypad 0 (Ins) 52 D2 p
- Keypad . (Del) 53 D3 n
- */
- appl_table:
- .ascii "wxyStuvlqrspn"
- /*
- * this routine handles function keys
- */
- func:
- subb $0x3B,%al
- jb end_func
- cmpb $9,%al
- jbe ok_func
- subb $18,%al
- cmpb $10,%al
- jb end_func
- cmpb $11,%al
- ja end_func
- ok_func:
- testb $0x10,_kmode
- jne alt_func
- cmpl $4,%ecx /* check that there is enough room */
- jl end_func
- movl func_table(,%eax,4),%eax
- xorl %ebx,%ebx
- jmp put_queue
- alt_func:
- pushl %eax
- call _change_console
- popl %eax
- end_func:
- ret
- /*
- * function keys send F1:'esc [ [ A' F2:'esc [ [ B' etc.
- */
- func_table:
- .long 0x415b5b1b,0x425b5b1b,0x435b5b1b,0x445b5b1b
- .long 0x455b5b1b,0x465b5b1b,0x475b5b1b,0x485b5b1b
- .long 0x495b5b1b,0x4a5b5b1b,0x4b5b5b1b,0x4c5b5b1b
- #if defined(KBD_FINNISH)
- key_map:
- .byte 0,27
- .ascii "1234567890+'"
- .byte 127,9
- .ascii "qwertyuiop}"
- .byte 0,13,0
- .ascii "asdfghjkl|{"
- .byte 0,0
- .ascii "'zxcvbnm,.-"
- .byte 0,'*,0,32 /* 36-39 */
- .fill 16,1,0 /* 3A-49 */
- .byte '-,0,0,0,'+ /* 4A-4E */
- .byte 0,0,0,0,0,0,0 /* 4F-55 */
- .byte '<
- .fill 10,1,0
- shift_map:
- .byte 0,27
- .ascii "!"#$%&/()=?`"
- .byte 127,9
- .ascii "QWERTYUIOP]^"
- .byte 13,0
- .ascii "ASDFGHJKL\["
- .byte 0,0
- .ascii "*ZXCVBNM;:_"
- .byte 0,'*,0,32 /* 36-39 */
- .fill 16,1,0 /* 3A-49 */
- .byte '-,0,0,0,'+ /* 4A-4E */
- .byte 0,0,0,0,0,0,0 /* 4F-55 */
- .byte '>
- .fill 10,1,0
- alt_map:
- .byte 0,0
- .ascii "
English
