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

📄 sys_serialxx.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

COM_RDR		=	0x3F8
COM_THR		=	0x3F8
COM_IER		=	0x3F9
COM_BRDL	=	0x3F8
COM_BRDH	=	0x3F9
COM_IIR		=	0x3FA
COM_FCR		=	0x3FA
COM_LCR		=	0x3FB
COM_MCR		=	0x3FC
COM_LSR		=	0x3FD
COM_MSR		=	0x3FE

.globl	sys_serialNULL
.globl	sys_serialopen, sys_serialclose, sys_serialrefresh 
.globl	sys_serialgetbaud, sys_serialsetbaud
.globl	sys_serialSend, sys_serialReceive
////////////////////////////////////////////////////////
.align 4
sys_serialNULL:
	movl	$-1, %eax
	ret

.align 4
sys_serialopen:
	movl	EBX(%esp), %ebx
	cmpl	$0, %ebx
	jne		sys_serialopen_0
	movl	$-1, %eax
	ret
sys_serialopen_0:
	cmpl	$0x7fffff4, %ebx
	jna		sys_serialopen_1
	movl	$-1, %eax
	ret
sys_serialopen_1:
	cmpl	$0, serialparam_ptr
	je		sys_serialopen_2
	movl	$-1, %eax
	ret
sys_serialopen_2:
	xorl	%eax, %eax
	cli
	movl	%eax, serialSbuf_head
	movl	%eax, serialSbuf_tail
	movl	%eax, serialRbuf_head
	movl	%eax, serialRbuf_tail
	movl	%eax, serial_state
	movl	%eax, serial_Scount
	movl	%eax, serial_Rcount
	movl	%ebx, serialparam_ptr
	movl	%eax, %gs:(%ebx)
	addl	$0x04, %ebx
	movl	%eax, %gs:(%ebx)
	addl	$0x04, %ebx
	movl	%eax, %gs:(%ebx)
	sti

	ret

.align 4
sys_serialclose:
	cmpl	$0, serialparam_ptr
	jne		sys_serialclose_0
	movl	$-1, %eax
	ret
sys_serialclose_0:
	xorl	%eax, %eax
	cli
	movl	%eax, serialSbuf_head
	movl	%eax, serialSbuf_tail
	movl	%eax, serialRbuf_head
	movl	%eax, serialRbuf_tail
	movl	%eax, serial_state
	movl	%eax, serial_Scount
	movl	%eax, serial_Rcount
	movl	%eax, serialparam_ptr
	sti

	ret

.align 4
sys_serialrefresh:
	xorl	%eax, %eax
	cli
	movl	%eax, serialSbuf_head
	movl	%eax, serialSbuf_tail
	movl	%eax, serialRbuf_head
	movl	%eax, serialRbuf_tail
	movl	%eax, serial_state
	movl	%eax, serial_Scount
	movl	%eax, serial_Rcount
	movl	serialparam_ptr, %ebx
	cmpl	$0, %ebx
	je		sys_serialrefresh_0
	movl	%eax, %gs:(%ebx)
	addl	$0x04, %ebx
	movl	%eax, %gs:(%ebx)
	addl	$0x04, %ebx
	movl	%eax, %gs:(%ebx)
sys_serialrefresh_0:
	sti

	ret

.align 4
sys_serialgetbaud:
	xorl	%eax, %eax
	movw	serial_BAUD, %ax
	ret

.align 4
sys_serialsetbaud:

	cli
	///////////////////////////////////
	movl	EBX(%esp), %eax
	movw	%ax, serial_BAUD
	///////////////////////////////////
	movw	$COM_MCR, %dx
	movb	$0x00, %al
	outb	%al, %dx

	movw	$COM_LCR, %dx
	movb	$0x9f, %al
	outb	%al, %dx

	movw	$COM_BRDL, %dx
	movw	serial_BAUD, %ax
	outb	%al, %dx

	movw	$COM_BRDH, %dx
	movb	%ah, %al
	outb	%al, %dx

	movw	$COM_LCR, %dx
	movb	$0x1f, %al
	outb	%al, %dx

	movw	$COM_RDR, %dx
	inb		%dx, %al

	movw	$COM_LSR, %dx
	inb		%dx, %al

	movw	$COM_LSR, %dx
	movb	$0x60, %al
	outb	%al, %dx

	movw	$COM_MSR, %dx
	inb		%dx, %al

	movw	$COM_MSR, %dx
	movb	$0x00, %al
	outb	%al, %dx

	movw	$COM_IER, %dx
	movb	$0x07, %al
	outb	%al, %dx

	movw	$COM_IIR, %dx
	inb		%dx, %al
	inb		%dx, %al
	inb		%dx, %al

	movw	$COM_MCR, %dx
	movb	$0x08, %al
	outb	%al, %dx
	///////////////////////////////////
	xorl	%eax, %eax
	movl	%eax, serialSbuf_head
	movl	%eax, serialSbuf_tail
	movl	%eax, serialRbuf_head
	movl	%eax, serialRbuf_tail
	movl	%eax, serial_state
	movl	%eax, serial_Scount
	movl	%eax, serial_Rcount
	movl	serialparam_ptr, %ebx
	cmpl	$0, %ebx
	je		sys_serialsetbaud_0
	movl	%eax, %gs:(%ebx)
	addl	$0x04, %ebx
	movl	%eax, %gs:(%ebx)
	addl	$0x04, %ebx
	movl	%eax, %gs:(%ebx)
sys_serialsetbaud_0:
	///////////////////////////////////
	sti

	ret


.align 4
sys_serialSend:
	cmpl	$0, serialparam_ptr
	jne		sys_serialSend_0
	movl	$-1, %eax
	ret
sys_serialSend_0:
	movl	EBX(%esp), %ebx
	movl	ECX(%esp), %ecx
	movl	serialSbuf_head, %edi
sys_serialSend_1:
	cmpl	$0, %ecx
	je		sys_serialSend_5
sys_serialSend_2:
	nop
	nop
	nop
	nop
	nop
	cli
	cmpl	$1023, serial_Scount
	jne		sys_serialSend_3
	sti
	jmp		sys_serialSend_2
sys_serialSend_3:
	movb	%gs:(%ebx), %al
	movb	%al, serial_Sbuf(%edi)
	incl	%ebx
	decl	%ecx
	incl	%edi
	andl	$1023, %edi
	movl	%edi, serialSbuf_head
	incl	serial_Scount
	//////////////////////
	testl	$0x04, serial_state
	jnz		sys_serialSend_4
	movw	$COM_THR, %dx
	movl	serialSbuf_tail, %esi
	movb	serial_Sbuf(%esi), %al
	outb	%al, %dx
	incl	%esi
	andl	$1023, %esi
	movl	%esi, serialSbuf_tail
	decl	serial_Scount
	orl		$0x04, serial_state
sys_serialSend_4:
	//////////////////////
	sti
	jmp		sys_serialSend_1
sys_serialSend_5:
	movl	serialparam_ptr, %edi
	cli
	movl	serial_state, %eax
	movl	%eax, %gs:(%edi)
	addl	$0x04, %edi
	movl	serial_Scount, %eax
	movl	%eax, %gs:(%edi)
	addl	$0x04, %edi
	movl	serial_Rcount, %eax
	movl	%eax, %gs:(%edi)
	sti
	xorl	%eax, %eax	

	ret

.align 4
sys_serialReceive:
	cmpl	$0, serialparam_ptr
	jne		sys_serialReceive_0
	movl	$-1, %eax
	ret
sys_serialReceive_0:
	movl	EBX(%esp), %ebx
	movl	ECX(%esp), %ecx
	movl	serialRbuf_tail, %esi
sys_serialReceive_1:
	cmpl	$0, %ecx
	je		sys_serialReceive_2
	cmpl	$0, serial_Rcount
	je		sys_serialReceive_2
	cli
	movb	serial_Rbuf(%esi), %al
	movb	%al, %gs:(%ebx)
	incl	%ebx
	decl	%ecx
	incl	%esi
	andl	$1023, %esi
	movl	%esi, serialRbuf_tail
	decl	serial_Rcount
	sti
	jmp		sys_serialReceive_1
sys_serialReceive_2:
	movl	serialparam_ptr, %edi
	cli
	movl	serial_state, %eax
	movl	%eax, %gs:(%edi)
	addl	$0x04, %edi
	movl	serial_Scount, %eax
	movl	%eax, %gs:(%edi)
	addl	$0x04, %edi
	movl	serial_Rcount, %eax
	movl	%eax, %gs:(%edi)
	sti
	movl	ECX(%esp), %eax
	subl	%ecx, %eax

	ret

////////////////////////////////////////////////////////



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -