GENWiki

Premier IT Outsourcing and Support Services within the UK

User Tools

Site Tools


archive:computers:serial

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



/home/gen.uk/domains/wiki.gen.uk/public_html/data/pages/archive/computers/serial.txt · Last modified: 1999/08/01 17:51 by 127.0.0.1

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki