Fact-checked by Grok 2 weeks ago

8250 UART

The 8250 UART, formally known as the INS8250 , is an developed by that serves as a serial data in systems, performing serial-to-parallel conversion on data characters received from peripherals or modems and parallel-to-serial conversion on data to be transmitted. It supports programmable asynchronous communication, including the addition or deletion of start, stop, and bits, and operates with an 8-bit bidirectional data bus for configuration by . Key features of the 8250 UART include a programmable baud rate generator capable of divisors from 1 to using a 16x clock input, enabling rates from up to 56 k with standard crystals such as 1.8432 MHz or 3.072 MHz; full programmability for 5- to 8-bit characters, even/odd/no options, and 1/1.5/2 stop bits; control functions via signals like CTS, RTS, DSR, DTR, RI, and DCD; and an system with prioritized handling for receiver ready, transmitter empty, line status changes, and status. The chip also provides line status reporting, diagnostic capabilities such as internal testing, and compatibility with popular microprocessors through its 40-pin package, operating at +5V ±5% and temperatures from 0°C to +70°C. Introduced in the late 1970s and widely adopted in the early 1980s, the 8250 UART gained prominence through its inclusion in the original IBM Personal Computer (IBM PC) released in 1981, where it handled serial port communications for peripherals like modems and printers, establishing a standard for PC serial interfaces. Later revisions, such as the 8250A and 8250B, offered improved timing and reliability while maintaining pin and functional compatibility, paving the way for successors like the NS16450 (with enhanced AC characteristics) and the NS16550 (adding FIFO buffers for higher throughput). Despite its limitations, such as single-byte buffering that restricted effective baud rates to around 9600 on slower systems, the 8250's register-based architecture influenced serial communication design for decades.

Overview

Introduction

The 8250 UART is an developed by for asynchronous and . It serves as a programmable communications that converts from a CPU or into format for over a communication line and reconstructs into format upon . The primary role of the 8250 UART is to facilitate communication between computers and external peripherals, such as modems, printers, and terminals, by managing serial I/O operations in systems. Introduced in the late , the chip gained immense popularity and was widely cloned by other manufacturers, including with its WD8250 variant, making it a foundational component in early personal computing hardware. In asynchronous communication as implemented by the 8250 UART, data frames begin with a start bit to synchronize the , followed by 5 to 8 bits, an optional for basic error checking, and one or more stop bits to signal the frame's end. This framing structure allows flexible, clockless data exchange without requiring a shared between sender and , distinguishing UARTs from synchronous protocols.

Key Specifications

The 8250 UART operates on a supply voltage of +5 V ±10%, with an average power consumption of 80 mA. It is typically housed in a 40-pin (DIP), though variants may use a 44-lead chip carrier. The chip supports baud rates up to 115,200 baud using a standard 1.8432 MHz , but standard configurations using a 1.8432 MHz limit practical rates to 115,200 bps for common asynchronous serial communications. In early systems, effective throughput was often restricted to 9,600 bps due to the 1 ms interrupt latency typical of operating systems like , which could lead to data overruns if the CPU failed to service interrupts promptly at higher speeds. Data buffering consists of a single-byte buffer and a single-byte transmitter holding , lacking deeper storage and thus increasing the risk of overrun errors during reception at elevated rates where inter-byte timing is short. Supported asynchronous data formats include 5 to 8 data bits per character, with 1, 1.5, or 2 stop bits (1.5 stop bits applicable only to 5-bit formats), and optional generation and checking (even, odd, or none). Baud rate generation requires an external timing reference clock, conventionally 1.8432 MHz for precise alignment with standard rates such as , 1,200, 2,400, 4,800, 9,600, 19,200, 38,400, 57,600, and 115,200 bps, achieved by programmable division of the input clock.

Architecture

Internal Components

The 8250 UART integrates several major functional blocks to facilitate asynchronous , including the , transmitter, programmable baud rate generator, control logic, and logic. These components interconnect via an internal 8-bit data bus that interfaces with the CPU, allowing software access to configuration and status registers. The baud rate generator provides a 16x oversampled to both the and transmitter shift registers for precise timing, while the control and blocks handle external signaling and event prioritization, respectively. The block converts incoming data into format using a that assembles bits from the serial input line (SIN) over multiple clock cycles. It includes a checker to verify by computing even or odd as programmed, flagging errors in the line status (bit 2 for parity error, PE). Overrun detection monitors for when new incoming data arrives before the previous byte is read from the buffer , setting the overrun error flag (bit 1, OE) in the same . These mechanisms ensure reliable reception of 5- to 8-bit characters with configurable stop bits and options. The transmitter block serializes parallel data for output, employing a to output bits sequentially on the serial output line (SOUT), appending start, , and stop bits as configured. It features a transmit holding that buffers a single byte of data from the CPU before loading it into the shift register, allowing double-buffering to prevent transmission gaps; the transmitter holding register empty (THRE) status is indicated in the line status (bit 5). This design supports efficient data flow without requiring constant CPU intervention during transmission. The modem control block manages handshaking and status signals for interfacing with s or similar devices, controlling outputs such as Request to Send (RTS) and (DTR) via the modem control register, and monitoring inputs including Clear to Send (CTS), Data Set Ready (DSR), (DCD), and Ring Indicator (RI). These signals enable flow control and connection status detection, with changes in input lines reflected in the modem for CPU polling or triggering. The block supports both modem-specific operations and general-purpose I/O modes. The interrupt logic prioritizes and generates s based on four sources to the CPU to events, using a fixed : line status (highest priority, covering errors like overrun or ), received data available, transmitter holding empty, and status changes (lowest priority). This prioritization is encoded in the interrupt identification , which identifies the active source, while the interrupt enable allows selective masking. The logic outputs a single signal (INTR) when enabled conditions occur, facilitating efficient event handling in multitasking environments.

Registers

The 8250 UART employs eight memory-mapped registers, selected by the three least significant bits of the address bus (A2–A0), to provide the for , data transfer, monitoring, and management. These registers are located at offsets from a base I/O port address, such as 0x3F8 for the first in PC-compatible systems. Access to certain registers, particularly those related to baud rate programming, is controlled by the Divisor Latch Access Bit (DLAB) in the Line Control Register. The original 8250 lacks dedicated buffering, using single-byte holding registers instead, which can limit performance under high data rates due to potential overrun errors. The register map is as follows:
Offset (hex)DLABRegister NameAccess Mode
0x000RBR (Receiver Buffer Register)Read only
0x000THR (Transmitter Holding Register)Write only
0x001DLL (Divisor Latch LSB)Read/Write
0x010IER (Interrupt Enable Register)Read/Write
0x011DLM (Divisor Latch MSB)Read/Write
0x02-IIR (Interrupt Identification Register)Read only
0x03-LCR (Line Control Register)Read/Write
0x04-MCR (Modem Control Register)Read/Write
0x05-LSR (Line Status Register)Read only
0x06-MSR (Modem Status Register)Read only
0x07-SCR (Scratch Register)Read/Write
The Receiver Buffer Register (RBR) at 0x00 (DLAB=0, read) holds the most recently received byte, while the Transmitter Holding Register (THR) at the same (write) stores the byte to be serialized for transmission. The Enable Register (IER) at 0x01 (DLAB=0) configures sources with the following bit fields: bit 0 enables interrupts for received available in the RBR; bit 1 enables transmitter holding register empty; bit 2 enables receiver line status errors (e.g., overrun or framing); bit 3 enables status changes; and bits 4–7 are reserved and read as 0. The Identification Register (IIR) at 0x02 indicates the highest-priority pending , with bits 0–3 encoding the source (e.g., 0x04 for received , 0x06 for receiver line status) and bit 0 cleared if no is pending. The Line Control Register (LCR) at offset 0x03 defines serial data format and includes bit fields for: bits 0–1 selecting word length (00 for 5 bits, 01 for 6 bits, 10 for 7 bits, 11 for 8 bits); bit 2 setting stop bits (0 for 1 stop bit, 1 for 1.5 or 2 stop bits based on word length); bit 3 enabling parity (1 enables); bit 4 selecting even parity (1 for even when parity enabled); bit 5 enabling stick parity (forces parity bit to bit 4's value); bit 6 transmitting a break condition (forces output to logic 0); and bit 7 as the DLAB (1 to access baud rate latches). The Modem Control Register (MCR) at offset 0x04 manages output signals with bit fields: bit 0 asserts Data Terminal Ready (DTR, active low); bit 1 asserts Request to Send (RTS, active low); bit 2 sets auxiliary output 1; bit 3 sets auxiliary output 2; bit 4 enables internal loopback testing; and bits 5–7 reserved. The Line Status Register (LSR) at offset 0x05 provides real-time flags: bit 0 indicates data ready in RBR; bit 1 signals overrun error (new data overwrote unread data); bit 2 indicates parity error; bit 3 signals framing error (missing stop bit); bit 4 detects break condition (spacing > full word time); bit 5 shows transmitter holding register empty; bit 6 indicates transmitter shift register empty; and bit 7 reserved. The Modem Status Register (MSR) at offset 0x06 reports input line changes: bits 0–3 reflect current states of Delta Clear to Send (DCTS), Delta Data Set Ready (DDSR), Trailing Edge Ring Indicator (TERI), and Delta Data Carrier Detect (DDCD); bits 4–7 mirror current Clear to Send (CTS), Data Set Ready (DSR), Ring Indicator (RI), and Carrier Detect (CD). The Scratch Register (SCR) at offset 0x07 serves as a general-purpose storage byte for software use. Access to the baud rate generator's divisor latches—DLL (least significant byte at offset 0x00, DLAB=1) and DLM (most significant byte at offset 0x01, DLAB=1)—is enabled by setting DLAB to 1 in the LCR; the 16-bit value determines the baud rate as crystal frequency divided by 16 times the . With DLAB=0, these offsets revert to RBR/THR and IER . The must be programmed before enabling the UART to establish the serial clock. The 8250A and 8250B variants improve upon the original 8250 with enhanced AC timing for faster bus operations and lower power consumption ( process in 82C50A), but retain the identical set without native FIFO support. The original 8250 and its A/B revisions lack a true , depending on single-byte buffers that require frequent CPU intervention to avoid ; the FIFO Control (FCR) at offset 0x02 (write-only) was added in the 16550 series to enable 16-byte transmit and receive FIFOs, reducing overhead. These s facilitate interrupt-driven operation by allowing selective enabling of events in the IER, with status details in the IIR and LSR.

Pinout and Interfaces

The 8250 UART is packaged in a 40-pin (DIP), providing interfaces for buses, serial data lines, modem control, clock generation, and power. This configuration enables seamless integration into early systems for asynchronous , supporting data rates up to 115.2 kbps under typical conditions. The pin assignments are optimized for compatibility with 8-bit microprocessors like the or Z80, using TTL-compatible logic levels. The parallel data interface connects to the host via an 8-bit bidirectional bus on pins 18 through 25 (D0 to D7, with D0 on pin 25 and D7 on pin 18), which transfers and configuration commands in tri-state mode to avoid bus conflicts. decoding for the registers occurs through A0 on pin 28, on pin 27, and A2 on pin 26, allowing selection of specific registers during read or write operations. Control signals include (CS, active low) on pin 29 to enable the device, read strobe (/RD, active low) on pin 24 to latch from the UART to the bus, and write strobe (/WR, active low) on pin 25 to load from the bus into the UART; these signals ensure synchronized access in bus architectures. The output (INTRPT, open-drain) on pin 30 signals the of events like ready or modem status changes, requiring a . Serial data interfaces are provided by the receiver input (SIN) on pin 10, which accepts asynchronous TTL-level serial data from external devices or modems, and the transmitter output (SOUT) on pin 11, which outputs serialized TTL-level data; both support configurable word lengths of 5 to 8 bits, with start/stop bits and optional parity. These pins form the core physical layer interface when connected through level shifters like the /1489 transceivers. Modem control interfaces enable hardware handshaking and status monitoring, with request to send (RTS, active low output) on pin 32 to request transmission clearance, clear to send (CTS, active low input) on pin 36 indicating remote readiness, data set ready (DSR, active low input) on pin 37 from indicating operational status, data terminal ready (, active low output) on pin 33 signaling local readiness, data carrier detect (, active low input) on pin 38 detecting signal, and ring indicator (RI, active low input) on pin 39 for incoming call detection. These TTL-level signals can trigger interrupts for changes in modem state, supporting full-duplex communication in dial-up applications. Clocking for baud rate generation uses input (XIN) on pin 16 and output (XOUT) on pin 17, typically driven by a 1.8432 MHz to produce standard rates (e.g., 300, 1200, 9600) via an internal divider; an external clock can alternatively be applied to XIN with XOUT left open. Power is supplied at +5 V DC on (pin 40), with multiple returns on pins 7, 20, and 31 to minimize noise and ensure stable operation across the full temperature range of 0°C to 70°C.
PinSignalTypeFunction
7Supply
16XINInputCrystal oscillator input
17XOUTOutputCrystal oscillator output
18D7Bidirectional8-bit data bus (MSB)
19D6Bidirectional8-bit data bus
20Supply
21D5Bidirectional8-bit data bus
22D4Bidirectional8-bit data bus
23D3Bidirectional8-bit data bus
24/RDInputRead strobe (active low)
25D0Bidirectional8-bit data bus (LSB)
26A2InputAddress input MSB for register selection
27A1InputAddress input
28A0InputAddress input LSB for register selection
29/CSInput (active low)
30INTRPTOutput (open drain)
31Supply
32RTSOutputRequest to send (active low)
33DTROutput (active low)
36CTSInputClear to send (active low)
37DSRInputData set ready (active low)
38DCDInput (active low)
39RIInputRing indicator (active low)
40Supply+5 V
10SINInputSerial data input ( level)
11SOUTOutputSerial data output ( level)

Operation

Data Transmission

The data transmission process in the 8250 UART begins when the CPU loads a data byte into the Transmitter Holding Register (THR). The Transmitter Holding Register Empty (THRE) flag in the Line Status Register (LSR) is then set to indicate that the THR is empty and ready for the next byte, which resets the flag upon loading. Once loaded, the byte is automatically transferred to the internal Transmitter (TSR) when the latter is available, initiating the serial output on the SOUT pin. The transmission sequence follows a asynchronous format: the UART shifts out a start bit (logic 0), followed by 5 to 8 data bits transmitted least significant bit (LSB) first, an optional if enabled, and 1 or 2 stop bits (logic 1). The word length, selection, and number of stop bits are configured via the Line Control Register (LCR). After the final stop bit, the transmitter returns to the idle state where SOUT remains high (logic 1, marking state) until new data is loaded. The transmitter operates in distinct states: idle, with SOUT held high; loading, when data is written to the THR; and shifting, during which the TSR serially outputs the formatted byte at the programmed baud rate. The Transmitter Empty (TEMT) flag in the LSR indicates when both the THR and TSR are empty, confirming completion of transmission. The 8250 UART does not generate native transmit error conditions such as underrun flags; however, to prevent transmission gaps or incomplete frames due to delayed data loading, software must poll the THRE flag before writing to the THR, ensuring timely transfer to the TSR. Break transmission, used to signal an or on the line, is initiated by setting bit 6 of the LCR to logic 1, which forces SOUT to a continuous spacing state (logic 0) for an indefinite duration until the bit is cleared. In mode (enabled via the Modem Control Register, MCR), bit 4 of the MCR can also control break output.

Data Reception

The 8250 UART receives data through the SIN (Serial Input) pin in an asynchronous format, beginning with the detection of a start bit, which is a falling edge transition from logic 1 (mark) to logic 0 (space). Upon detecting this transition, the receiver synchronizes its internal timing and initiates the sampling process for the subsequent data bits. The receiver uses a 16x clock derived from the rate generator to sample the input signal at the midpoint of each bit period, ensuring accurate bit detection despite potential noise or timing variations. This oversampling technique divides each bit time into 16 intervals, with samples taken after 8 intervals for the start bit confirmation and 8, 24, 40, etc., for data bits. The receiver operates through distinct states: idle, where it continuously monitors SIN for the start bit; start bit detection and verification, involving two samples to confirm the logic 0 state; data bit sampling, shifting each of the 5 to 8 data bits (depending on configuration) into the receive (RSR) on the rising of the sampling clock; and stop bit verification, checking for one or more logic 1 bits to validate the frame. If parity is enabled, an additional is sampled and checked immediately after the data bits. Once the full frame is received without errors, the assembled byte is transferred from the RSR to the buffer register (RBR). In case of a framing error, the receiver attempts to resynchronize by sampling the next potential start bit twice. Error detection is integral to the reception process, with flags set in the line status register (LSR) to indicate issues. An overrun error occurs if a new complete character arrives and is transferred to the RSR before the previous byte is read from the RBR, causing (LSR bit 1). A parity error is flagged if the received does not match the computed for the data bits when parity generation is enabled (LSR bit 2). Framing errors are detected when the stop bit(s) are not logic 1, indicating a misalignment or noise-induced corruption (LSR bit 3). A break condition is recognized when SIN remains at logic 0 for more than a full character frame, typically signaling a or fault (LSR bit 4). These errors do not prevent further reception but must be handled by software to maintain . The RBR serves as a single-byte holding for received in the 8250, lacking the FIFO buffering found in later variants. Upon transfer from the RSR, the ready () in the LSR (bit 0) is set to logic 1, potentially triggering a available if enabled in the enable (IER). Reading the RBR clears the and resets the , allowing the next byte to be stored. If the RBR is not read in time, subsequent leads to an overrun, highlighting the need for timely polling or interrupt-driven handling in software.

Baud Rate Generation

The baud rate generator in the 8250 UART is a programmable 16-bit that divides an input timing reference clock to produce the for and . It consists of two 8-bit latches forming the , which can range from to (2^16 - ), and generates a 16× clock output for the transmitter logic, with an option to route it to the receiver via the BAUDOUT pin. The input clock typically operates at 1.8432 MHz to enable precise rates, though it supports frequencies from to 3.1 MHz. To program the baud rate, the divisor value is loaded into the Divisor Latch Low (DLL) and Divisor Latch High (DLM) registers, accessed only when the Divisor Latch Access Bit (DLAB) in the Line Control Register is set to 1. The resulting baud rate is calculated as the input clock divided by (16 × divisor), where the factor of accounts for the × used in the UART's shift registers. For example, with a 1.8432 MHz clock, a divisor of 12 yields 9600 baud, since 1,843,200 / ( × 12) = 9,600 Hz exactly. Common baud rates are achieved using specific integer divisors with the 1.8432 MHz clock, ensuring minimal error for rates up to 38,400 baud. The following table lists representative divisors for standard rates:
Baud Rate (bps)Divisor (decimal)
300384
120096
240048
480024
960012
19,2006
38,4003
The baud rate generator's reliance on a fixed input clock frequency limits flexibility, as rates must be derived from integer divisors without support for fractional values, potentially introducing errors at higher speeds or with non-standard clocks. is undefined and should be avoided to prevent erratic behavior.

Programming

Configuration Process

The configuration of the 8250 UART begins with selecting the base I/O port address, typically 0x3F8 for COM1 or 0x2F8 for COM2 in early PC systems, which serves as the starting offset for accessing all registers. To initialize the , the software must first enable the Divisor Latch Access Bit (DLAB) by setting bit 7 of the Line Control Register (LCR) at offset 0x3 to 1, which remaps the Receive Buffer Register (RBR) and Interrupt Enable Register (IER) to the Divisor Latch Low (DLL) and Divisor Latch High (DLH) bytes at offsets 0x0 and 0x1, respectively. The is then programmed by writing the least significant byte to DLL and the most significant byte to DLH, using the where the equals the UART clock (usually 1.8432 MHz) divided by 16 times the desired ; for example, a of 12 (0x0C in DLL and 0x00 in DLH) yields 9600 . After setting the , DLAB is disabled by clearing LCR bit 7 to 0, restoring normal access to RBR and IER. Next, the LCR is configured to define the data format, with bits 1-0 selecting the word length (e.g., 11 for 8 bits), bit 2 setting the number of stop bits (0 for 1 stop bit, 1 for 1.5 or 2), and bits 5-3 controlling (e.g., 000 for no parity, 011 for even parity). The (MCR) at offset 0x4 is then programmed to manage hardware flow control signals, such as setting bit 0 to 1 to assert (DTR) and bit 1 to 1 to assert Request to Send (RTS), which signal the connected device that the UART is ready for communication. For self-testing, loopback mode can be enabled by setting MCR bit 4 to 1, which internally connects the transmitter output to the input, allowing transmitted to be verified on without external hardware. The UART can operate in polling mode, where software repeatedly checks the Line Status Register (LSR) at offset 0x5—such as bit 0 for data ready or bit 5 for transmitter holding register empty—or in interrupt mode by configuring the IER at offset 0x1 to enable notifications for events like received data (bit 0), transmitter empty (bit 1), line status changes (bit 2), or status changes (bit 3). In interrupt mode, the Identification Register (IIR) at offset 0x2 identifies the highest-priority pending upon servicing. The 8250 lacks a dedicated register, so initialization relies on the device or reinitializing all relevant as described to clear any prior state and prepare for operation.

Interrupt Management

The 8250 UART generates to notify the host processor of key events during , utilizing a prioritized scheme to ensure critical conditions are handled first. There are four interrupt sources, ordered by priority from highest to lowest: receiver line status (indicating errors such as overrun, , or framing issues), receiver data ready (signaling available incoming data), transmitter holding register empty (indicating the transmitter is ready for more data), and status change (reflecting alterations in control signals like carrier detect or ring indicator). The Identification Register (IIR), located at offset 2 from the base address, serves as the primary mechanism for identifying the highest-priority pending . When an occurs, bit 0 of the IIR is cleared to 0 to indicate a pending condition, while bits 3–1 encode the source: 011 for receiver line status, 010 for receiver data ready, 001 for transmitter holding register empty, and 000 for status. Interrupts are enabled through the Interrupt Enable Register (IER) at offset 1, where individual bits (0 through 3) correspond to the four sources: bit 0 for data ready, bit 1 for transmitter holding register empty, bit 2 for line status, and bit 3 for status. Once enabled, an interrupt condition triggers the assertion of the active-low INTRPT output pin, which connects to the host system's interrupt controller. To handle an , the processor first reads the IIR, which freezes all other pending interrupts and reveals the highest-priority one; subsequent reads of the IIR will reflect lower-priority events only after the current one is cleared. Clearing an involves servicing the specific source: reading the Line Status Register (LSR) for receiver line status errors, reading the Receive Buffer Register (RBR) for data ready, writing data to the Transmit Holding Register (THR) for transmitter empty, or reading the Modem Status Register (MSR) for modem changes. These actions reset the corresponding , deasserting the INTRPT pin once all enabled sources are cleared. A notable limitation of the 8250 is its use of a single shared line for all sources, which can lead to priority conflicts; for instance, at high rates, a higher-priority receiver data or line status may overwrite a pending lower-priority transmitter empty signal before it is serviced, potentially causing delays unless mitigated by low-latency operating system handling. This issue is exacerbated in the original 8250 without FIFO buffering, limiting reliable operation above certain speeds without software workarounds.

History

Development Origins

The 8250 UART was developed by National Semiconductor in the mid-1970s as a standalone integrated circuit to provide programmable asynchronous serial input/output for emerging microcomputer systems. Released around 1976–1978, it addressed the limitations of earlier fixed-rate UARTs by incorporating a programmable baud rate generator, double-buffered transmitter and receiver, and modem control functions, thereby minimizing CPU overhead and enabling flexible serial communication with devices like printers and modems. The original INS8250, fabricated using N-channel silicon-gate , suffered from several reliability issues, including random character transmission at power-on, which could lead to during initialization, and improper handling where enabling the transmitter triggered an immediate that might mask the first valid one. Additionally, status registers failed to update correctly if never disabled, contributing to race conditions in high-speed operations despite its single-byte buffering simulating basic behavior. These flaws limited its robustness in early applications. These problems were rectified in the 1983 INS8250A revision, which used improved process technology for better timing accuracy and reliability, ensuring status updates on the trailing edge of write signals and converting interrupts to level-sensitive for reduced missed events. The 8250A also introduced an 8-bit scratch register at offset 7 (when DLAB=0) for general-purpose storage, absent in , enhancing software without affecting core UART operations. Further details on the 8250A and related variants like the NS16450 appear in National Semiconductor's 1990 Data Communications, LAN, UARTs Handbook.

Integration in Early PCs

The 8250 UART was integrated directly onto the of the original Personal Computer (Model 5150), released in 1981, to provide asynchronous capabilities via two ports designated as COM1 and COM2. These ports were assigned I/O addresses at 0x3F8–0x3FF for COM1 and 0x2F8–0x2FF for COM2, utilizing the RS-232C standard with a 25-pin D-shell connector for compatibility with external devices. This hardware configuration supported essential peripherals such as modems for and serial printers for output, enabling the PC to interface with early networking and printing technologies without requiring additional expansion cards in basic setups. The PC's ROM provided software support for the 8250 UART through Interrupt 14h (INT 14h), which handled I/O operations including initialization, character transmission, character reception, and status querying. Specifically, subfunction =00 initialized the with parameters such as baud rate (from 110 to 9600 bps), , stop bits, and word length; =01 transmitted a character; =02 received a character; and =03 returned the status, including error conditions like overrun or framing errors. This interface abstracted the hardware details, allowing applications and the operating system to perform basic operations without direct manipulation, though it relied on polled I/O rather than interrupts for transmission and reception. Equipment detection for the was also facilitated via INT 11h, which read the interrupt identification at 0x3FA to confirm the presence of up to four adapters. IBM selected the National Semiconductor INS 8250 for its cost-effectiveness and integrated features tailored to asynchronous serial needs, including an on-chip programmable baud rate generator that supported standard rates from 50 to 9600 bps without external timing components—unlike the earlier 8251 USART, which required an external clock source for baud rate in asynchronous . The 8250's design offered double buffering for transmitter and receiver, prioritized interrupt handling, and flexible data formatting (5–8 data bits, odd/even/no , 1–2 stop bits), along with signals and a diagnostic , making it suitable for reliable PC peripheral integration. Additionally, the availability of cloned versions from multiple manufacturers helped reduce dependency on a single supplier and lowered production costs for PC clones. Despite its capabilities, the 8250's performance in early PCs running was constrained by the lack of a buffer, leading to s for every character received or transmitted, which incurred significant CPU overhead on the 4.77 MHz 8088 processor. Combined with 's approximate 1 ms latency from the system timer and polling mechanisms, this limited reliable operation to around 9600 , as higher rates risked data overruns due to servicing delays; the INT 14h routines explicitly supported up to this speed to maintain stability.

Variants and Evolution

The 8250 UART underwent several revisions in the early 1980s to address reliability issues in the original design. The 8250A, released around 1983, corrected bugs such as improper pulsing and improved for detection by software through an additional identification register. The subsequent 8250B revision in 1984 further refined these fixes with improved behavior and faster CPU bus timings for better with evolving systems. In 1984, coinciding with the IBM PC/AT release, introduced the NS16450 as a direct upgrade to the 8250 series. This variant maintained the single-byte transmit and receive buffers of its predecessors but featured a faster CPU interface compatible with the 80286 processor, eliminating wait states that had limited performance in earlier 8088-based systems. The NS16550, launched in , marked a significant evolution by incorporating 16-byte buffers for both transmit and receive operations, which substantially reduced CPU overhead and enabled reliable serial speeds up to 115,200 bps—far exceeding the practical limits of unbuffered designs like the 8250 and 16450. Early NS16550 versions suffered from implementation that caused data overrun, but these were resolved in the NS16550AF revision, which also supported higher clock rates up to 8 MHz and added compatibility. Clones such as the NS16550 maintained functional equivalence while improving manufacturing scalability. By the 1990s, the 8250 lineage evolved further through integration into multifunction chips within PC chipsets, combining UART functionality with floppy controllers, parallel ports, and other peripherals to reduce board space and costs in VLSI designs. This consolidation supported the growing demands of mid-1990s computing but began to wane in the 2000s as USB supplanted traditional serial ports for most applications due to its plug-and-play advantages and higher speeds. Despite hardware obsolescence, 8250-compatible UARTs persist through software and firmware emulation in to maintain legacy device support.

References

  1. [1]
    [PDF] National Semiconductor - Datasheet4U.com
    National. Semiconductor. INS8250, INS8250-B Universal. Asynchronous Receiver/T ransmitter. General Description ... selection of certain UART registers. The DLAB ...
  2. [2]
    Serial and UART Tutorial | FreeBSD Documentation Portal
    Oct 14, 2025 · Starting with the original IBM Personal Computer, IBM selected the National Semiconductor INS8250 UART for use in the IBM PC Parallel/Serial ...
  3. [3]
    None
    Error: Could not load webpage.<|control11|><|separator|>
  4. [4]
    PC Hardware in a Nutshell, 3rd Edition - O'Reilly
    The following are dumb UARTs: 8250. The 8250 is an eight-bit UART used in original IBM PCs and compatibles, and occasionally encountered in newer PCs with ...
  5. [5]
    [PDF] National Semiconductor Corporation - Bitsavers.org
    National Semiconductor Corporation is the leading supplier of Universal Asynchronous Receiver Transmitters (UART). ... original complement of registers ...
  6. [6]
    New IC Caps Two Decades of UART Development - Analog Devices
    Modern CMOS UARTs like the National Semiconductor 16550 and the Zilog 8630 are traceable to early classics like the Intel 8250 and Intersil 6402. In 1981 ...
  7. [7]
    [PDF] uart-8250a.pdf
    The UART performs serial-te-parallel conversion on data characters received from a peripheral device or a MODEM, and parallel-to-serial conversion on data ...
  8. [8]
    Serial HOWTO: What Are UARTs? How Do They Affect Performance?
    The obsolete 8250 and 16450 UARTs only have a 1 byte buffer. That means, that every time 1 byte is sent or received, the CPU is interrupted. At low transfer ...
  9. [9]
    [PDF] UNIVERSAL ASYNCHRONOUS RECEIVER/TRANSMITTER
    The FIFO control register (FCR) is present starting with the 16550 series. The behavior of the FIFOs in the UART is controlled by this register. If a logical ...<|control11|><|separator|>
  10. [10]
    INS8250 Datasheet(PDF) - National Semiconductor (TI)
    Part #: INS8250. Download. File Size: 673Kbytes. Page: 18 Pages. Description: PC16450C/NS16450,PC8250A/INS8250A UNIVERSAL ASYNCHRONOUS RECEIVER/TRANSMITTER.
  11. [11]
    8250 - UART
    A zero byte is placed in the Receiver Buffer Register (or 16550 FIFO). Reset by reading the LSR. (The 16550 maintains this information with each byte and ...
  12. [12]
    Serial UART, an in depth tutorial - Lammert Bies
    Serial communication on PC compatibles started with the 8250 UART in the IBM XT. In the years after, new family members were introduced like the 8250A and 8250B ...
  13. [13]
    8250 UART Information - Tech Edge
    This document briefly describes the registers of an 8250, the chip found in the original IBM PC. ... There are four main address that are used by the PC's UART.
  14. [14]
    8250 UART - L Break Into Program, 0:1
    This section covers the 8250 serial UART and compatibles including the 16450 and 16550A. It will also cover compatible UARTs embedded in microcontrollers.
  15. [15]
    RS-232 Serial Communication - voidstar
    The original IBM PC established a pace of 1.8432 MHz matched to its 4.77 MHz CPU. Technically, the 8250 UART that is used should be able to reach 115200 baud ( ...
  16. [16]
    [PDF] ~ Semiconductor - Bitsavers.org
    A Corporate Dedication to. Quality and Reliability. National Semiconductor is an industry leader in the manufacture of high quality, high reliability ...<|control11|><|separator|>
  17. [17]
    [PDF] IBM PC Technical Reference - Bitsavers.org
    ... 1981. Page 5. CONTENTS. SECTION 1. HARDWARE OVERVIEW ......... 1-1. System Block ... 8250 Functional Pin Description ............... 2-129. Input Signals ...Missing: UART | Show results with:UART
  18. [18]
    [PDF] 8251.pdf - DeRamp
    The 8251 is a Universal Synchronous/Asynchronous Receiver/Transmitter (USART) Chip designed for data communications in microcomputer systems. The USART is used ...
  19. [19]
    RS232/422/485 Serial Communications - MarshallSoft
    The National 8250 was the original UART used in the IBM PC and compatibles, and are only suitable up to 9600 baud on slower DOS (before the IBM/AT) machines.<|control11|><|separator|>
  20. [20]
    13.2.6 - INT 14h - Serial I/O - Plantation Productions
    Int 14h supports four subfunctions- initialize, transmit a character, receive a character, and status.- INT 14h - Serial I/O · - AH=0: Serial Port Initialization · - INT 17h - Printer Services
  21. [21]
    UARTs
    The Original UART was the 8250. By today's standards, this is a very slow chip. The 8250A revision added an extra register which allows software to detect that ...
  22. [22]
    Putting Serial-Port Technology in Perspective, Part 2
    May 26, 1992 · The processor controls the UART by writing to its registers. The National Semiconductor INS-8250 UART was used in the original PC, and its ...
  23. [23]
    [PDF] A Comparison of the INS8250, NS16450 and NS16550 ... - UMBC
    The INS8250A and NS16450 have level sensi- tive interrupts as opposed to edge-triggered interrupts. This requires a change in the UART driver software or.
  24. [24]