serialint.s

来自「阿基米德操作系统的源代码」· S 代码 · 共 168 行

S
168
字号

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 serial_interrupt
.globl serial_Sbuf, serial_Rbuf
.globl serialSbuf_head, serialSbuf_tail, serialRbuf_head, serialRbuf_tail
.globl serial_state, serial_Scount, serial_Rcount, serialparam_ptr
.globl serial_BAUD

.align 4
serial_Sbuf:		.fill 1024,1,0
serial_Rbuf:		.fill 1024,1,0
serialSbuf_head:	.long 0
serialSbuf_tail:	.long 0
serialRbuf_head:	.long 0
serialRbuf_tail:	.long 0
serial_state:		.long 0
serial_Scount:		.long 0
serial_Rcount:		.long 0
serialparam_ptr:	.long 0
serial_BAUD:		.word 0x0001

.align 4serial_interrupt:
	cld	pushl	%eax
	pushl	%ebx	pushl	%ecx	pushl	%edx
	pushl	%esi
	pushl	%edi
	pushl	%ebp
	push	%ds	push	%es	push	%fs
	push	%gs
	movl	$0x10,%eax	mov		%ax,%ds	mov		%ax,%es
	mov		%ax,%fs


	//////////////////////////
	movw	$COM_MCR, %dx
	movb	$0x00, %al
	outb	%al, %dx

	movw	$COM_IIR, %dx
	inb		%dx, %al
	testb	$0x01, %al
	jnz		serial_end

serial_loop:
	andb	$0x0f, %al
	cmpb	$0x06, %al
	jnz		serial_L0
	movw	$COM_LSR, %dx
	inb		%dx, %al
	orl		$0x01, serial_state
	jmp		serial_L6

serial_L0:
	cmpb	$0x04, %al
	jnz		serial_L2
	movw	$COM_RDR, %dx
	inb		%dx, %al

	cmpl	$1023, serial_Rcount
	jnz		serial_L1
	orl		$0x02, serial_state
	jmp		serial_L6
serial_L1:
	movl	serialRbuf_head, %ebx
	movb	%al, serial_Rbuf(%ebx)
	incl	%ebx
	andl	$1023, %ebx
	movl	%ebx, serialRbuf_head
	incl	serial_Rcount
	jmp		serial_L6

serial_L2:
	cmpb	$0x0c, %al
	jnz		serial_L3
	jmp		serial_L6

serial_L3:
	cmpb	$0x02, %al
	jnz		serial_L5
	andl	$0xfffffffb, serial_state
	cmpl	$0, serial_Scount
	jz		serial_L4
	movw	$COM_THR, %dx
	movl	serialSbuf_tail, %ebx
	movb	serial_Sbuf(%ebx), %al
	outb	%al, %dx
	incl	%ebx
	andl	$1023, %ebx
	movl	%ebx, serialSbuf_tail
	decl	serial_Scount
	orl		$0x04, serial_state
serial_L4:
	jmp		serial_L6		

serial_L5:
	cmpb	$0x00, %al
	jnz		serial_L6
	movw	$COM_MSR, %dx
	inb		%dx, %al

serial_L6:
	movl	serialparam_ptr, %ebx
	cmpl	$0, %ebx
	jz		serial_L7
	movl	serial_state, %eax
	movl	%eax, %gs:(%ebx)
	addl	$0x04, %ebx
	movl	serial_Scount, %eax
	movl	%eax, %gs:(%ebx)
	addl	$0x04, %ebx
	movl	serial_Rcount, %eax
	movl	%eax, %gs:(%ebx)
	
serial_L7:
	movw	$COM_IIR, %dx
	inb		%dx, %al
	testb	$0x01, %al
	jnz		serial_end
	jmp		serial_loop

serial_end:
	movb	$0x20, %al
	outb	%al, $0x20

	movw	$COM_MCR, %dx
	movb	$0x08, %al
	outb	%al, %dx

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

	pop		%gs	pop		%fs	pop		%es	pop		%ds

	popl	%ebp
	popl	%edi
	popl	%esi	popl	%edx	popl	%ecx
	popl	%ebx	popl	%eax
	iret

⌨️ 快捷键说明

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