📄 serialint.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 + -