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

📄 rs_io.s

📁 最早的linux操作系统源代码(3)
💻 S
字号:
/* *	rs_io.s * * This module implements the rs232 io interrupts. */.text.globl rs1_interrupt,rs2_interruptsize	= 1024				/* must be power of two !					   and must match the value					   in tty_io.c!!! *//* these are the offsets into the read/write buffer structures */rs_addr = 0head = 4tail = 8proc_list = 12buf = 16startup	= 256		/* chars left in write queue when we restart it *//* * These are the actual interrupt routines. They look where * the interrupt is coming from, and take appropriate action. */.align 2rs1_interrupt:	pushl $table_list+8	jmp rs_int.align 2rs2_interrupt:	pushl $table_list+16rs_int:	pushl %edx	pushl %ecx	pushl %ebx	pushl %eax	push %es	push %ds		/* as this is an interrupt, we cannot */	pushl $0x10		/* know that bs is ok. Load it */	pop %ds	pushl $0x10	pop %es	movl 24(%esp),%edx	movl (%edx),%edx	movl rs_addr(%edx),%edx	addl $2,%edx		/* interrupt ident. reg */rep_int:	xorl %eax,%eax	inb %dx,%al	testb $1,%al	jne end	cmpb $6,%al		/* this shouldn't happen, but ... */	ja end	movl 24(%esp),%ecx	pushl %edx	subl $2,%edx	call jmp_table(,%eax,2)		/* NOTE! not *4, bit0 is 0 already */	popl %edx	jmp rep_intend:	movb $0x20,%al	outb %al,$0x20		/* EOI */	pop %ds	pop %es	popl %eax	popl %ebx	popl %ecx	popl %edx	addl $4,%esp		# jump over _table_list entry	iretjmp_table:	.long modem_status,write_char,read_char,line_status.align 2modem_status:	addl $6,%edx		/* clear intr by reading modem status reg */	inb %dx,%al	ret.align 2line_status:	addl $5,%edx		/* clear intr by reading line status reg. */	inb %dx,%al	ret.align 2read_char:	inb %dx,%al	movl %ecx,%edx	subl $table_list,%edx	shrl $3,%edx	movl (%ecx),%ecx		# read-queue	movl head(%ecx),%ebx	movb %al,buf(%ecx,%ebx)	incl %ebx	andl $size-1,%ebx	cmpl tail(%ecx),%ebx	je 1f	movl %ebx,head(%ecx)	pushl %edx	call do_tty_interrupt	addl $4,%esp1:	ret.align 2write_char:	movl 4(%ecx),%ecx		# write-queue	movl head(%ecx),%ebx	subl tail(%ecx),%ebx	andl $size-1,%ebx		# nr chars in queue	je write_buffer_empty	cmpl $startup,%ebx	ja 1f	movl proc_list(%ecx),%ebx	# wake up sleeping process	testl %ebx,%ebx			# is there any?	je 1f	movl $0,(%ebx)1:	movl tail(%ecx),%ebx	movb buf(%ecx,%ebx),%al	outb %al,%dx	incl %ebx	andl $size-1,%ebx	movl %ebx,tail(%ecx)	cmpl head(%ecx),%ebx	je write_buffer_empty	ret.align 2write_buffer_empty:	movl proc_list(%ecx),%ebx	# wake up sleeping process	testl %ebx,%ebx			# is there any?	je 1f	movl $0,(%ebx)1:	incl %edx	inb %dx,%al	jmp 1f1:	jmp 1f1:	andb $0xd,%al		/* disable transmit interrupt */	outb %al,%dx	ret

⌨️ 快捷键说明

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