From: adrian@csqx.cs.rhbnc.ac.uk (A Johnstone)
Newsgroups: comp.os.msdos.programmer
Subject: Re: Parallel port I/O (mostly O : -)
Date: 19 Aug 92 19:40:16 GMT
Reply-To: adrian@csqx.cs.rhbnc.ac.uk (A Johnstone)
Organization: Dept of Comp Sci, Royal Holloway & Bedford New College Uni London

In article <1992Aug19.152509.18901@cs.ubc.ca>, yogi@cs.ubc.ca (Yossi Gil) writes:

<request for info on printer port programming deleted>

|> 
|> I recall a byte article on this exact topic few years back. I think it
|> was about 5 or so. I also recal that the max baud rate you can get
|> is 4500. That is 4.5 KB/sec. 
 
A bit of confusion here I think. Firstly baud rate is a term used in the 
context of serial channels. It is named after Baudot, one of the pioneers of
telegraph communication. In, for instance RS-232, the baud rate is the number 
of signal pulses sent per second. The data rate will be less than this because
some start and stop bits are required: hence 300 baud with eight data bits, one
start bit and one stop bit corresponds to a data rate of 30 bytes per second.
I've never seen baud rate used in the context of a parallel channel: assuming
fully parallel transfers I suppose the logical generalisation of the idea would
be the same as the word data rate which is as implied in Yossi's note.

A propos the original enquiry: it is very easy to send data out of the parallel
port under program control and you should be able to achieve far higher data
rates than 4.5KB/s with a decent PC. Here are the rough details:

The printer port pinout is:

1  OUT strobeL
2  OUT D0H
3  OUT D1H
4  OUT D2H
5  OUT D3H
6  OUT D4H
7  OUT D5H
8  OUT D6H
9  OUT D7H
10 IN  ackL
11 IN  busyH
12 IN  paperoutL
13 IN  selectH
14 OUT autofeedL
15 IN  errorL
16 OUT resetL
17 OUT selectackL
18-25 GND

The signal names pertain to the Centronics standard and are irrelevant if all you
want to do is send data out. The trailing H and L characters indicate active Low
or active High polarity.

The signals are accessed via three registers:

I/O port address 0378H printer data register
 
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0

I/O port address 037AH printer control register

x | x | x | enable int on ACK | select | reset | autofeed | strobe

I/O port address 0379H printer status register

busy | acknowledge | paperout | selectack | error | x | x| x

The x's above indicate bits that you should ignore on read or leave in their
original state on write. Don't just write zeroes because these bits are used on
some machines for other control purposes.

So the bottom line is that something like outportb(0x378,53) will cause decimal
53 to appear on the printer data lines, and x=inportb(0x379) will read the 
present state of the input lines. The speed at which you can do this is limited
only by the speed of your bus and processor. Normally you will want to handshake
the data transfer with the external device, so you'll need to write the data, 
assert one of the control lines by writing to port 037AH and then monitor one
of the inputs by polling address 0379H for a handshake signal. If you want to
avoid tying your machine up in a polling loop, use the acknowledge line on the
printer port for your external handshake and set bit 4 in the control register.
This will then trigger a printer interrupt every time the acknowledge line is
yanked, and you can then feed data out under interrupt control. For maximum
speed use polling. A grotty PC could probably manage at least 100Kbyte per second
A nice 486 running a tight loop out of internal cache RAM will go much faster.

There are other things you might want to know about, such as the fact that the
control outputs are actually open collector outputs and may be used as 
bidirctional I/O lines, and that many manufacturers now do what should have been
done in the first place and allow input from the data lines too. Portables
commonly use this to allow fast parallel I/O to external floppy disks attached
to the printer port for instance. However, I think I've rambled on enough here,
so try that for starters.

                                    Adrian
Newsgroups: comp.os.msdos.programmer
From: mt@kram.demon.co.uk (Mark Turner)