textfiles/computers/serial.txt

169 lines
5.1 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

================= 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 ====