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

📄 serialint.s

📁 阿基米德操作系统的源代码
💻 S
字号:

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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -