View Full Version : Write data to I/O Port address

02-12-2003, 01:31 PM
I want to write a function in C++ to do the "channel selection" for a hardware which is a A-to-D card with 16 channels.

The information provided by the card manual is here:
I/O port address H278: output A/D channel number (low nibble)

I want to know how to write the code. Can you give me some examples in your explanation. Thanks

02-15-2003, 08:32 PM
I'm not sure I understand what you want. So here is my feeble attempt at answering your question.

Sound card?
First is this a sound card? If it is then I'm not familiar with multiple channels on a sound card. Multiple channels is basically software related and not hardware. Take for example a sound system in an auditorium. You have channels for guitar, keyboard, vocals, etc. All of the data or signals is sent to the mixer board which combines all of the channels into one signal that represent the mixture of the data. The signal is then sent to the amplifier and then to the speakers, etc. This is of course barring any effects like reverb and what have you, but you get the idea. Same thing is true in software. The sound card uses DMA transfer which basically only uses one portion of memory which could be considered the final or main mix of the sounds. Each individual sound or channel is basically a portion of memory that contains the data for one sound. The software then retrieves the byte or word data from each sound and performs some type of mixing algorithm which then results in the master or main mix.
I'm not aware of actual hard-coded channels on any sound card as this would probably be a waste of circuitry - but I'm not saying they do not exist - I just have not heard of them.

Low and high nibbles
A low nibble is the lower bits of a byte, word or dword.

In real and virtual 8086 mode
Byte: 8 bits (2 nibbles)
Word: 16 bits (2 bytes)
DWord: 32 bits (4 bytes, 2 words)

The low nibble of a byte is the lower 4 bits and the high nibble is the upper 4 bits. So you need to mask out the lower 4 bits of the byte.

In binary

So 00001111 is the bitmask that will effectively mask the lower 4 bits. Convert this to hexadecimal and you have your bitmask.

But what you want to do is even easier than that. Since your channel number will only be in the range from 0 to F (decimal 15) (16 channels counting 0) you can simply just pass that value to the port and it should work.

Perhaps I'm not understanding what you want but the low nibble portion here seems to be irrelevant based on the information you have given because 0 to F will always be in the lower nibble of the byte.

1*(2^0)+1*(2^1)+1*(2^2)+1*(2^3) or

1+2+4+8 or


which is 0Fh in hex and

00001111 in binary (0's are included to show a complete byte).

Notice that numbers in the range 0 to 15 are always contained in the low nibble of the byte. Please give more information so that I can help you - otherwise the answer to your question is:


where channel number is in the range 0x00 to 0x0F.

02-18-2003, 12:26 AM
Thank you very much, Bubba, Your help is very useful!
Here I give u more information and hope you can understand what I want to do.
Actually, the hardward is an Analog-to-digital (A-D) conversion card with resolution 12-bit and ISA slot. It's not a sound card.
Now, I need to develop a user programme using C/C++ to drive the card.

The programme can be able to:
1. select a channel (from 16 channels)
2. clear A-D register memory and then capture the analog singal(i.e. sampling), then convert it into digital form(binary number)
3. save the digital data into file
4. open data file and plot it in graph
5. adjust some setting e.g. sampling frequency, sampling time ...

Now, the 1st function seems to be completed. I want to go on for the 2nd function:

The manual provide me with the following information:
I/O port address Description
H27B Clear register
H27C A/D conversion loop(low)
H27D A/D conversion loop(high)

The manual suggest a programming technique:
Clear register
OUT (port +3), 0

Should I put '0' in 0x027B to clear the register. But which channel's register will be cleared by doing this? How should I know that?

Then, to start conversion, the manual suggest:

FOR I=1 to 5
A = INP (port +4)
NEXT I=1 to 9
A = INP (port +5)

To read high byte(low nibble)
C = INP (port +2)
HB = (C/16 -INT(C/16))*16

To read low byte(8 bits)
LB = INP (port +1)

converted data = HB*256 + LB

I don't know what 'INP' and 'INT' is about? Please explain them to me with sample code if possible. Thanks

Since my target system to run the programm is DOS, so where can I find a C/C++ compiler for DOS. Window based VC++ cannot compiler a exe programme executable in MS DOS.

02-18-2003, 01:00 PM
What is that port variable in your code? Is that the offset of a channel? Your AD-conversion card, is it a data acquisition card with 16 channels, in other words, with 16 inputs for data acquisition?

I don't know the language the manual uses. But I think:
OUT - write to port
INP - read from port
INT - make integer of a number, such like INT (5/2) = 3

Here you can find ports for GCC (C and C++), I'm not sure if they also have a DOS-port.


Another compiler is the Pacific C compiler: