textfiles/computers/serial.txt

169 lines
5.1 KiB
Plaintext
Raw Normal View History

2021-04-15 11:31:59 -07:00
================= 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 ====