Port Address
一般而言,COM口的I/O地址是固定的,
3F8/2F8 BaseAdd + 0 Transmit/Receive Buffer
3F9/2F9 BaseAdd + 1 IER
3FA/2FA BaseAdd + 2 IIR(Read)/FCR(write)
3FB/2FB BaseAdd + 3 LCR
3FC/2FC BaseAdd + 4 MCR
3FD/2FD BaseAdd + 5 LSR
3FE/2FE BaseAdd + 6 MSR
3FF/2FF BaseAdd + 7 Scratch Pad Register
Abbreviate
CD - Carrier Detect
CTS - Clear to Send
DCD - Data Carrier Detect
DCE - Data communication Equipment
DDCD - Delta Data Carrier Detect
DLAB - baud rate divisor
DSR - Data set ready
DTE - Data Terminal Equipment
DTR - Data terminal ready
FCR - FIFO Control Register
FIFO - First In First Out
IER - Interrupt Enable Register
IIR - Interrupt Identification Register
LCR - Line Control Register
LSR - Line Status Register
MCR - Modem Control Register
MSR - Modem Status Register
RD - Receive Data
RI - Ring indicator
RTS - Request to Send
TD - Transmit Data
THRE - Transmitter Holding Register Empty
TSRE - Transmitter Shift Register Empty
Set Baud Rate
当LCR(Base Address+3) BIT7是1的时候,往Base+0/Base+1这两个端口写的数据就是要设置的波特率。
Baud Rate |
Base+1 |
Base+0 |
Baud Rate |
Base+1 |
Base+0 |
50 |
0x09 |
0x00 |
2400 |
0x00 |
0x30 |
110 |
0x04 |
0x17 |
3600 |
0x00 |
0x20 |
150 |
0x03 |
0x00 |
4800 |
0x00 |
0x18 |
300 |
0x01 |
0x80 |
7200 |
0x00 |
0x10 |
600 |
0x00 |
0xC0 |
9600 |
0x00 |
0x0C |
1200 |
0x00 |
0x60 |
19200 |
0x00 |
0x06 |
1800 |
0x00 |
0x40 |
38400 |
0x00 |
0x03 |
2000 |
0x00 |
0x3A |
57600 |
0x00 |
0x02 |
|
|
|
115200 |
0x00 |
0x01 |
Example Code: BaudRateTable: dw 01h ; 115200 0 dw 02h ; 57600 1 dw 03h ; 38400 2 dw 06h ; 19200 3 dw 0Ch ; 9600 4
mov dx, Base+3 in al, dx jmp short $+2 ; delay or al, 80h out dx, al ; set LCR BIT7 jmp short $+2 push ax ; save the data
lea si, cs:BaudRateTable shl bx, 1 ; bx =0/1/2/3/4 add si, bx ; si point the divisor
mov ax, word ptr cs:[si] ; al, base+0 value ; ah, base+1 value
mov dx, Base+0 out dx, al jmp short $+2 xchg ah, al inc dx out dx, al jmp short $+2
pop ax and al, 07fh ; clear BIT7 mov dx, base+3 out dx, al jmp short $+2 
|