📄 sys_keybdxx.s
字号:
EAX = 0x00 + 8
EBX = 0x04 + 8
ECX = 0x08 + 8
EDX = 0x0C + 8
ESI = 0x10 + 8
EDI = 0x14 + 8
EBP = 0x18 + 8
DS = 0x1C + 8
ES = 0x20 + 8
FS = 0x24 + 8
GS = 0x28 + 8
EIP = 0x2C + 8
CS = 0x30 + 8
EFLAGS = 0x34 + 8
OLDESP = 0x38 + 8
OLDSS = 0x3C + 8
KEYBUF_SIZE = 1024
.align 4
temp_keybuf:
.long 0
temp_keylength:
.long 0
temp_keycount:
.long 0
temp_keytype:
.byte 0
.globl sys_keybdNULL
.globl sys_keybd00,sys_keybd01,sys_keybd02
.align 4
sys_keybdNULL:
movl $-1,%eax
ret
.align 4
sys_keybd00:
xorl %eax,%eax
movb keybuf_flag,%al
shll $16,%eax
movb mode,%ah
movb leds,%al
ret
.align 4
sys_keybd01:
movl keybuf_tail,%ebx
sys_keybd01_0:
cmpl keybuf_head,%ebx
je sys_keybd01_0
cli
xorl %eax,%eax
movw key_buf(%ebx),%ax
incl %ebx
incl %ebx
andl $KEYBUF_SIZE - 1,%ebx
movl %ebx,keybuf_tail
decb keybuf_num0
jne sys_keybd01_1
andb $0xfe,keybuf_flag
sys_keybd01_1:
cmpb $0,%al
je sys_keybd01_3
decb keybuf_num1
jne sys_keybd01_2
andb $0xfd,keybuf_flag
sys_keybd01_2:
cmpb $0x08,%al
je sys_keybd01_3
cmpb $0x09,%al
je sys_keybd01_3
cmpb $0x0d,%al
je sys_keybd01_3
cmpb $0x1b,%al
je sys_keybd01_3
decb keybuf_num2
jne sys_keybd01_3
andb $0xfb,keybuf_flag
sys_keybd01_3:
sti
ret
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
.align 4
sys_keybd02:
movl EBX(%esp),%eax
movl %eax,temp_keybuf
movl ECX(%esp),%eax
andl $0xff,%eax
movl %eax,temp_keylength
movl $0,temp_keycount
sys_keybd02_0:
movb $0,temp_keytype
movl keybuf_tail,%ebx
sys_keybd02_1:
cmpl keybuf_head,%ebx
je sys_keybd02_1
cli
xorl %eax,%eax
movw key_buf(%ebx),%ax
incl %ebx
incl %ebx
andl $KEYBUF_SIZE - 1,%ebx
movl %ebx,keybuf_tail
decb keybuf_num0
jne sys_keybd02_2
andb $0xfe,keybuf_flag
sys_keybd02_2:
cmpb $0,%al
je sys_keybd02_4
decb keybuf_num1
jne sys_keybd02_3
andb $0xfd,keybuf_flag
sys_keybd02_3:
cmpb $0x09,%al
je sys_keybd02_4
cmpb $0x1b,%al
je sys_keybd02_4
incb temp_keytype
cmpb $0x08,%al
je sys_keybd02_4
incb temp_keytype
cmpb $0x0d,%al
je sys_keybd02_4
incb temp_keytype
decb keybuf_num2
jne sys_keybd02_4
andb $0xfb,keybuf_flag
sys_keybd02_4:
sti
cmpb $0,temp_keytype
je sys_keybd02_7
cmpb $1,temp_keytype
jne sys_keybd02_5
cmpl $0,temp_keycount
je sys_keybd02_7
call do_delete_key
jmp sys_keybd02_7
sys_keybd02_5:
cmpb $2,temp_keytype
je sys_keybd02_8
movl temp_keycount,%ebx
cmpl temp_keylength,%ebx
je sys_keybd02_6
call do_insert_key
jmp sys_keybd02_7
sys_keybd02_6:
call do_alarm
sys_keybd02_7:
jmp sys_keybd02_0
sys_keybd02_8:
movl temp_keycount,%eax
ret
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
.align 4
do_delete_key:
decl temp_keycount
xorl %ebx,%ebx
movb current_cursor_L,%bl
movb current_cursor_H,%bh
decl %ebx
movb %bl,current_cursor_L
movb %bh,current_cursor_H
movb $0x20,%al
movb current_color_val,%ah
movw %ax,0xb8000(,%ebx,2)
movw $0x3D4,%dx
movb $15,%al
outb %al,%dx
incw %dx
movb %bl,%al
outb %al,%dx
decw %dx
movb $14,%al
outb %al,%dx
incw %dx
movb %bh,%al
outb %al,%dx
cmpb $0,current_col
jne do_delete_key_0
movb MAX_COL,%al
movb %al,current_col
decb current_row
do_delete_key_0:
decb current_col
ret
.align 4
do_insert_key:
movl temp_keybuf,%ebx
addl temp_keycount,%ebx
movb %al,%gs:(%ebx)
incl temp_keycount
movb current_color_val,%ah
xorl %ebx,%ebx
movb current_cursor_L,%bl
movb current_cursor_H,%bh
movw %ax,0xb8000(,%ebx,2)
incl %ebx
movb %bl,current_cursor_L
movb %bh,current_cursor_H
movb current_col,%al
incb %al
cmpb MAX_COL,%al
jne do_insert_key_0
movb $0,%al
incb current_row
do_insert_key_0:
movb %al,current_col
movb current_row,%al
cmpb MAX_ROW,%al
jne do_insert_key_2
decb current_row
xorl %ebx,%ebx
movb current_start_L,%bl
movb current_start_H,%bh
addb MAX_COL,%bl
adcb $0,%bh
movb %bl,current_start_L
movb %bh,current_start_H
cmpw current_end_HL,%bx
jna do_insert_key_1
movl %ebx,%esi
addl %esi,%esi
addl $0xb8000,%esi
movl $0xb8000,%edi
xorl %ecx,%ecx
movw MAX_SIZE,%cx
cld
rep
movsl
xorl %eax,%eax
movb current_cursor_L,%al
movb current_cursor_H,%ah
subl %ebx,%eax
movb %al,current_cursor_L
movb %ah,current_cursor_H
movb $0,current_start_L
movb $0,current_start_H
do_insert_key_1:
xorl %ebx,%ebx
movb current_cursor_L,%bl
movb current_cursor_H,%bh
movl %ebx,%edi
addl %edi,%edi
addl $0xb8000,%edi
movb current_color_val,%ah
movb $0x20,%al
shll $16,%eax
movb current_color_val,%ah
movb $0x20,%al
xorl %ecx,%ecx
movb MAX_COL,%cl
shrl $1,%ecx
cld
rep
stosl
movw $0x3D4,%dx
movb $13,%al
outb %al,%dx
incw %dx
movb current_start_L,%al
outb %al,%dx
decw %dx
movb $12,%al
outb %al,%dx
incw %dx
movb current_start_H,%al
outb %al,%dx
do_insert_key_2:
movw $0x3D4,%dx
movb $15,%al
outb %al,%dx
incw %dx
movb current_cursor_L,%al
outb %al,%dx
decw %dx
movb $14,%al
outb %al,%dx
incw %dx
movb current_cursor_H,%al
outb %al,%dx
ret
.align 4
do_alarm:
inb $0x61,%al
movb %al,%ah
orb $0x03,%al
outb %al,$0x61
movl $0x100000,%ecx
do_alarm_0:
loop do_alarm_0
movb %ah,%al
outb %al,$0x61
ret
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -