169 lines
5.1 KiB
Plaintext
169 lines
5.1 KiB
Plaintext
|
================= PROGRAMMING THE SERIAL PORT ==================
|
|||
|
|
|||
|
Here's some bits and pieces that might be of interest.
|
|||
|
|
|||
|
----------------------------------------------------------------
|
|||
|
INT 14 - SERIAL I/O - INITIALIZE USART
|
|||
|
REG AH = 0
|
|||
|
REG AL = INITIALIZING PARAMETERS
|
|||
|
BIT 7 - 6 - 5 4 - 3 2 1 - 0
|
|||
|
-BAUD RATE- PARITY STOP WORD
|
|||
|
BITS LENGTH
|
|||
|
000 110 BD 00 NONE 0-1 10 - 7
|
|||
|
001 150 BD 01 ODD 1-2 11 - 8
|
|||
|
010 300 BD 11 EVEN
|
|||
|
011 600 BD
|
|||
|
100 1200 BD
|
|||
|
101 2400 BD
|
|||
|
110 4800 BD
|
|||
|
111 9600 BD (4800 ON PCjr)
|
|||
|
DX = PORT NUMBER
|
|||
|
----------------------------------------------------------------
|
|||
|
INT 14 - SERIAL I/O - TRANSMIT CHARACTER
|
|||
|
REG AH = 1
|
|||
|
AL = CHARACTER
|
|||
|
DX = PORT NUMBER
|
|||
|
ON RETURN:
|
|||
|
REG AH = RS-232 STATUS CODE
|
|||
|
BIT 0 = DATA READY
|
|||
|
1 = OVERRUN ERROR
|
|||
|
2 = PARITY ERROR
|
|||
|
3 = FRAMING ERROR
|
|||
|
4 = BREAK DETECTED
|
|||
|
5 = TRANSMISSION BUFFER REG. EMPTY
|
|||
|
6 = TRANSMISSION SHIFT REG. EMPTY
|
|||
|
7 = TIME OUT
|
|||
|
AL = MODEM STATUS
|
|||
|
BIT 0 = DELTA CLEAR-TO-SEND
|
|||
|
1 = DELTA DATA-SET-READY
|
|||
|
2 = TRAILING EDGE RING DETECTED
|
|||
|
3 = CHANGE, RECEIVE LINE SIGNAL DETECTED
|
|||
|
4 = CLEAR-TO-SEND
|
|||
|
5 = DATA-SET-READY
|
|||
|
6 = RING DETECTED
|
|||
|
7 = RECEIVE LINE SIGNAL DETECTED
|
|||
|
----------------------------------------------------------------
|
|||
|
INT 14 - SERIAL I/O - RECEIVE CHARACTER
|
|||
|
REG AH = 2
|
|||
|
ON RETURN:
|
|||
|
REG AL = CHARACTER RECEIVED
|
|||
|
REG AH = RS-232 STATUS CODE (SEE ABOVE)
|
|||
|
----------------------------------------------------------------
|
|||
|
INT 14 - SERIAL I/O - GET USART STATUS
|
|||
|
REG AH = 3
|
|||
|
ON RETURN:
|
|||
|
REG AH = RS-232 STATUS CODE (SEE ABOVE)
|
|||
|
REG AL = MODEM STATUS CODE (SEE ABOVE)
|
|||
|
|
|||
|
----------------------------------------------------------------
|
|||
|
The following applies to COM1 (COM2 addresses are different).
|
|||
|
----------------------------------------------------------------
|
|||
|
|
|||
|
procedure SendChar(C: byte);
|
|||
|
begin
|
|||
|
while (Port[$3FD] and $20)=0 do ;
|
|||
|
Port[$3F8] := C;
|
|||
|
end;
|
|||
|
|
|||
|
Function ReadChar: byte;
|
|||
|
begin
|
|||
|
while not odd(Port[$3FD]) do ;
|
|||
|
ReadChar:= Port[$3F8];
|
|||
|
end;
|
|||
|
|
|||
|
procedure SetSerial(BaudRate: Integer);
|
|||
|
{ Set serial parameters on to COM1:BaudRate,N,8,1 }
|
|||
|
var
|
|||
|
x : integer;
|
|||
|
begin
|
|||
|
x := trunc(115200.0 / BaudRate);
|
|||
|
Port[$3FB] := 128;
|
|||
|
Port[$3F8] := x and 255;
|
|||
|
Port[$3F9] := x shr 8;
|
|||
|
Port[$3FB] := 3; {Line Control Register}
|
|||
|
Port[$3FC] := 3; {Modem Control Register}
|
|||
|
Port[$3F9] := 0; {Interupt Enable Register}
|
|||
|
end;
|
|||
|
|
|||
|
----------------------------------------------------------------
|
|||
|
|
|||
|
Port(hex) Description
|
|||
|
|
|||
|
3F8 I/O Transmitter Holding Register / Receiver Data Register
|
|||
|
3F8/3F9 O Baud Rate Divisor
|
|||
|
3F9 I/O Interupt Enable Register
|
|||
|
3FA I Interupt Identification Register
|
|||
|
3FB I/O Line Control Register
|
|||
|
3FC O Modem Control Register
|
|||
|
3FD I Line Status Register (see "RS-232 STATUS CODE" above)
|
|||
|
3FE I Modem Status Register (see above for bits)
|
|||
|
|
|||
|
Programming the 8250 Serial Chip.
|
|||
|
|
|||
|
1. Set Baud Rate.
|
|||
|
x := trunc(115200.0 / BaudRate);
|
|||
|
Port[$3FB] := 128;
|
|||
|
Port[$3F8] := x and 255;
|
|||
|
Port[$3F9] := x shr 8;
|
|||
|
|
|||
|
Take For example 2400 baud; the following would be needed
|
|||
|
in Assembly Language:
|
|||
|
|
|||
|
mov dx,3FBh
|
|||
|
mov al,128
|
|||
|
out dx,al
|
|||
|
mov dx,3F8h
|
|||
|
mov al,30H
|
|||
|
out dx,al
|
|||
|
inc dx
|
|||
|
mov al,0
|
|||
|
out dx,al
|
|||
|
|
|||
|
|
|||
|
- You might like to set up a table if more that one baud rate is used.
|
|||
|
|
|||
|
|
|||
|
2. Set LCR ($3FB)
|
|||
|
Bit 7 Normally 0, set to 1 to change baud rate
|
|||
|
6 Normally 0 (Break Disabled).
|
|||
|
5 Normally 0, "Stick Parity" disabled
|
|||
|
4 Parity: 0 = Odd, 1 = Even
|
|||
|
3 Parity: 0 = No parity generated, 1 = Generate parity
|
|||
|
2 Stop Bits: 0 = 1 bit, 1 = 2 bits (or 1.5 if Char len = 5 bits)
|
|||
|
1+0 Character Length:
|
|||
|
00 = 5 bits, 01 = 6 bits, 10 = 7 bits, 11 = 8 bits.
|
|||
|
|
|||
|
For 8 Data Bits, No Parity, 1 Stop Bit - value of LCR is 3
|
|||
|
|
|||
|
3. Set MCR ($3FC)
|
|||
|
|
|||
|
Bit 7..5 Always 0
|
|||
|
4 Loop Back (output goes straight to input)
|
|||
|
3 Normally 0, set to 1 for serial interrupt.
|
|||
|
2 Not Used
|
|||
|
1 Activate RTS line
|
|||
|
0 Activate DTR line
|
|||
|
|
|||
|
Value of MCR is normally 3. I won't go into the details of interrupts
|
|||
|
send me a message if you do need the info.
|
|||
|
|
|||
|
|
|||
|
4. Set up IER ($3F9)
|
|||
|
|
|||
|
This is normally 0.
|
|||
|
|
|||
|
|
|||
|
That's all that's needed to set it up.
|
|||
|
|
|||
|
|
|||
|
To receive a character:
|
|||
|
A character is ready in the Receiver Data Register when bit 0 ("Received
|
|||
|
Data Ready") of line status register is 1. See ReadChar function.
|
|||
|
|
|||
|
To send a character.
|
|||
|
You must wait until the previous character has been sent.
|
|||
|
Bit 5 ("Transmitter Holding Register Empty") will be zero when it is
|
|||
|
O.K for you to send a character. See the SendChar procedure.
|
|||
|
|
|||
|
==== PY ====
|
|||
|
|