File "comhack.txt"
Path: /info/tips/comhack.txt
File size: 10.26 KB
MIME-type: message/rfc822
Charset: utf-8
From: tedm@agora.rain.com (Ted Mittelstaedt)
Subject: How to modify cheap com port cards
Date: Sat, 3 Oct 1992 21:35:49 GMT
Modifying a simple COM port is easy, I'll tell you how I modified an internal
modem card that I have to use IRQ2/9. Keep in mind that I have not done this
with the COM card I was referring to previously. I don't think it would be
difficult, however, as it appears to be the same setup as the internal modem.
HARDWARE HACKING: MODIFYING A SIMPLE(CHEAP) COM PORT TO
USE HIGHER IRQ's
First of all, lets discuss the idea of what an IRQ is, and how it's
implimented on an AT, just so we are all clear on the concept.
As most people probably know, on a standard AT there are 4 I/O port memory
locations commonly associated with serial communication ports, and there are
only 2 commonly associated IRQ's that are used with these locations. What
does this mean? Well, here goes:
A COM port on an IBM AT class computer usually consists of what are known as
UARTS. These are physical chips that translate the parallel data from the
computer's bus to serial data that the modem needs. These are usually stand-
alone chips that reside on a "serial port card", however in the case of
the cheaper internal modems they can be a small section of the modem chip,
which typically would be a larger chip containing the UART, the modem, and so
forth.
UARTS take up what is known as "I/O Port Memory" when they are plugged into
the computer. The memory locations referred to by COM port card makers and
others are actually the starting I/O memory address of a number of I/O ports
"a block" that contain various UART programming registers for the chip.
The memory locations on an AT that have come to be known as the "standard"
locations are:
03F8 02F8 03E8 02E8 (these are hexadecimal numbers)
Now, There are 2 ways to program UARTS, the first is "interrupt driven" and
the second is "polled" With Polled operation, the subject of IRQ's has no
relavence, because the IRQ is not even active. Instead, the Operating System
is supposed to periodically read some ports in the port block to see if a
character has arrived. Needless to say, this makes for very crude operation
since many characters can come and go before the OS gets around to checking
the port. Worse yet, if no characters are coming in at all, the OS is wasting
CPU cycles on useless instructions to get incoming characters when there
aren't any to get! Polled operation is the type of operation that the BIOS
sets up for the COM ports when the computer is started, it is what is going
on when you TYPE a file to the COM port from the DOS prompt.
This is how the designers of the AT could get away with supplying only 2
IRQ's to the 4 com ports. Since the BIOS programs the UART to go into polled
mode, there is never an IRQ conflict, at least when the machine starts, there
isin't.
Of course, communication programs have loads of characters coming in that
can't wait for the OS to poll. So, the concept of the IRQ comes into play.
An IRQ is simply this: a wire that runs from a chip deep in the bowls of the
AT called an "Interrupt controller" and connects to one or more of the UARTS.
When a UART receives a character, it "triggers the IRQ" by dropping the
voltage on the wire, this signals the Interrupt controller to wake up and
do something about the incoming character. If the Interrupt controller is
properly programmed, and the UART is programmed to be in the "interrupt
driven" mode, what happens is the controller interrupts the CPU and the CPU
supposedly starts executing a routine to fetch the character from the port.
This is where the fun and games start. With the "standard" AT, if you plug
4 UARTS (com ports) into the 4 I/O memory locations, the default settings on
the serial cards (or internal modems) will connect the IRQ wires from COM1 &
COM3 together, and COM2 & COM4 together. This pair of wires will then be
connected to the Interrupt Controller. This is great for Polled Operation,
because the IRQ lines are not active, but less than desirable for Interrupt
Driven operation. The reason is that software is generally not written to
expect this, the biggest problem is what if 2 ports connected together receive
a character at the same time? Software to support IRQ sharing must check
each port connected to the same IRQ to make sure that no character came in when
the Interrupt controller is triggered.
Because of this, various schemes have arisen to obtain more IRQ lines for
the COM ports/and or share the IRQ lines available. The problem with them is
that there is no standardization, and worse a lot of programmers are
"unclear on the concept" so even if there were a standard half the software
would probably not impliment it correctly.
Another problem is the difference between the XT and the AT. With an XT,
you get only 1 Interrupt Controller chip which limits you to a grand total
of 8 IRQ lines. Some of these are used for such essentials as the keyboard
and the clock, so you really only get 5 free. Of the 5, one is IRQ2, that
goes to the video card for the Horizontal Retrace (which is hardly ever
used unless you like CGA cards) and 2 others go to the Printer Ports. (of
which there are 2 on XT & AT's). So, you really only get 2 good ones, unless you
like to lose one of your printers, or take a chance on conflicting with your
SoundBlaster/Midi card (which is usually connected to IRQ2).
With an AT, you get 2 Interrupt Controllers, so you get 15 total. Wait, I
hear you saying, 8 + * = 16. Well, that is true, but the way that the AT
designers decided to implement the second Interrupt Controller is by hanging
it off IRQ2 on the first one. They then ran the wire from IRQ9 on the second
to the same buss connector used for IRQ2, and did some fiddley-fancy with the
BIOS so that your cards that expected to see IRQ2 thought that they were.
So, you can see that the problem of IRQ's on the AT is not just a hardware
one, it is software as well. This article will attempt to tell you how to
configure separate IRQ's for the 4 com ports, but if your software is not
written to use anything other than the default connections, you won't get
anywhere.
The first thing you need to know is where the physical contacts are for
the various IRQ's Here is the pinout for the standard AT:
B4 = IRQ9 }
B21 = IRQ7 }
B22 = IRQ6 }---- These are all on the "8-bit" buss connector
B23 = IRQ5 }
B24 = IRQ4 }
B25 = IRQ3 }
D3 = IRQ10 }
D4 = IRQ11 }
D5 = IRQ12 }---- These are all on the "16-bit" Buss connector
D4 = IRQ15 }
D5 = IRQ14 }
Standard AT Buss layout:
A1 A31 C1 C18
--------------------------- --------------
| | | | Front of Motherboard
| | | |
--------------------------- --------------
B1 B31 D1 D18
To find out which pin is which, start counting from the back go forward
Now, take a look at that port card that you are planning to modify. Find
IRQ3 on it and trace the circuit trace. It will usually go to a jumper block
that is configured something like this:
IRQ3 UART#2
-------------
| . . |
| . . |
-------------
UART#1 IRQ4
And the instructions with the card for configuring it will go something like
this:
Uart1 (com1) to IRQ4 set jumper like this:
----------------
| . . |
| --- |
----------------
Uart1 (com1) to IRQ3 set like this:
----------------
| | . |
| | . |
----------------
Uart2 (com2) to IRQ4 set like this:
----------------
| . | |
| . | |
----------------
Uart2 (com2) to IRQ3 set like this:
----------------
| --- |
| . . |
----------------
These instructions will usually be combined with other jumper settings,
so it may be difficult to see what the card maker is getting at. Remember,
these cards are CHEAP you aren't getting the red carpet here! :-) You might
be lucky to get docs at all! It is usually best to trace it out.
Now, what you want to do is to decide what IRQ you want to connect to. If
you are lucky enough to have a com card that is a full length card, you will
have access to the higher IRQ's, otherwise you may have to use IRQ5 which is
usually used for LPT2. (of course, you can't have a LPT2 printer port in
your system, either). If you have 2 printer ports, you may need to use IRQ2,
but use this as a last resort, since many card makers seem to have decided
that no one else uses it (ignoring the fact that all the video cards ever made
use it except for monochrome cards) and conflicts are most likely to result
with this IRQ line.
Now, take some tinfoil and wrap it around the fingers of the card, so that
ALL of them are connected. Run a wire from that to a cold water pipe or
other ground(assuming you don't live in a house with plastic pipes) Pick up
your soldering iron and wrap some wire around the barrel of it and run it
to the same ground.
Carefully, solder 6 inches of small hook-up wire to the IRQ you have decided
to use. Solder to a point at the very top of the contact on the card finger
that correcponds to the IRQ line you have selected.
Tin the other end of the wire, and let it cool. Now, gently remove the
jumper from the jumper block that corresponds to the UART you want to change
the setting on. Turn the jumper so that 1 side of it is positioned over the
connection to the UART, and the other side over empty air and push it down.
Take the other end of the wire and insert it into the jumper side that is
hanging over empty air, and tie bak any excess wire. The end will look like
this:
|---------
-----------|-- |
| . | | |
| . . | |--Wire
-------------- |
|
|
IRQ Card finger
Now, plug in the card and fire up the computer, configure your software and
you are done! :-)
I AM OF COURSE NOT RESPONSIBLE FOR THE CONTENT OF THESE INSTRUCTIONS. I USED
THEM TO CONNECT UP A MODEM TO COM3, BUT IF YOU BREAK YOUR MACHINE DON'T COME
CRYING TO ME. CAVEAT EMPTOR!
This file released into the Public Domain on this second day of October, 1992
Any editorial remarks please send to me at:
Ted Mittelstaedt
tedm@agora.rain.com