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

📄 sys_keybdxx.s

📁 阿基米德操作系统的源代码
💻 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 + -