Hey,
I working to the library and testing. I'm try to write
code for driving ports 4 bytes
Kind regards
Stephane
------------------
ICQ: 123632482
Announcement
Collapse
No announcement yet.
I need read/write 1-byte and 2-bytes ports routines for PBDOS
Collapse
X
-
Guest replied
-
Stephane and Lance ..
I have been following this one with interest. I dropped research
a while back on the use of the little IRMAN TV remote control unit
with PowerBASIC for DOS over what I found to be a minor issue with
one and two byte COMM port work.
The little IRMAN TV hand held remote control clicker uses only
one and two byte I/O commands. For test purposes it did fine on
my research with the ZOC terminal program which has both a native
OS/2 and WIN-9+ interface from a common user registration code.
IRMAN, when you open the COMM port, sends you back ONE and ONLY ONE
byte to tell you, "Success! I'm here!" Then you send it only
one or two byte commands and it confirms them that way. The
test lashup with ZOC for OS/2 as well as two different DOS-VDM
modem control programs could intitialize the COMM port and run it.
But my PowerBASIC 3.5 could not! In OS/2, as well as in WIN and
DOS, we have tools to look at what is acutally going across a COMM
port byte for byte. Mine in OS/2 come as part of the Ray Gwinn
SIO much better replacement for the IBM suppied COMM port drivers
in a package called SIO which inludes Poor Man's Line Monitor as
PMLM.EXE. Looking at this COMM port routine revealed that while
any of either the native OS/2 or DOS-VDM terminal programs such as
COMIT for DOS, could do it, PowerBASIC was failing for one reason.
As far as I can tell, it flushes the COMM port buffer on opening the
port! I never could determine from any way of timing it whether
that arises from an arbitrary action, or something else. In that
the later 16550AN serial port controller chips and so on that we
now use contain a 16 bit I/O buffer, it may be that there is a
glitch in the timing which simply cannot handle only a one bute
initial response back to the open action! To this extent, Ray's
SIO 160d has MUCH better control of such things. You and disable
the entire 16 bit buffer on the port if you want and switch it ot
single byte I/O and scrap the 16550 action if you want. You can
also stop OS/2 from emulating that or whatever. Regardless of that,
unsing no combination for control of CTS, TRS, hard or software
control of the port, buffer size, nothing ... could I ever get the
PowerBASIC comm port code to ever pass that single and one and only
one byte to acknowlege the device was on line.
So I temporarily shelved the project until I had time to go back
and look at the possibility of ASSEMBLER to handle this port job.
It is also important that I do not destroy the high speed functions
of the whole DOS-VDM session with which this will be used. The
reason for that is that this IRMAN device will have to control and
be used with two other COMM ports in the same executable which are
passing data back and forth between them at full data rates at the
same time the third port is hosting IRMAN and at the same time
the forth COMM port is assigned to TELNET over IP.
Do you folks think that this whole thread, together with ASSEMBLER
could be used to solve this problem?
I know better than to attempt to use ASSEMBLER to open a port,
then try to use PowerBASIC for the actual I/O or the reverse of
that!
Can you suggest a complete ASSMBLER operation which could be used
to handle the port open and close here as well? One that would
be able to see that single byte 'ready' flag from IRMAN?
I'm not fussing at all about PowerBASIC's COMM routines. The
average person would never, I think, ever have run on this. It
is just something I have to crack for this deal and I ASSURE
you I don't want to rewrite all the communicatios stuff in
ASSEMBLER for the rest of the game!
Thanks!
------------------
Mike Luther
[email protected]
Leave a comment:
-
Stephane, I don't see any variables in that code that would need to be PUBLIC or EXTERNAL, since you are using function parameters and return values for everything.
However, you might want to add a PUBLIC clause to the FUNCTION statements... see the Reference Guide for more info.
------------------
Lance
PowerBASIC Support
mailto:[email protected][email protected]</A>
Leave a comment:
-
Guest repliedHey Paul,
Thanks for your tips.
I have a new update of my code. Can you test my this code with an
example?
'==========================================================================='
'Read and Write the PC Ports in DOS '
'==========================================================================='
$COMPILE UNIT "PORTS16.PBU"
'Return an byte from the specific port
DECLARE FUNCTION InpB(BYVAL PortAddress AS WORD) AS BYTE
'Return an word from the specific port
DECLARE FUNCTION InpW(BYVAL PortAddress AS WORD) AS WORD
'Write an byte to the specific port
DECLARE SUB OutB(BYVAL PortAddress AS WORD, BYVAL Value AS BYTE)
'Write an word to the specific port
DECLARE SUB OutW(BYVAL PortAddress AS WORD, BYVAL Value AS WORD)
SUB OutB(BYVAL PortAddress AS WORD, BYVAL value AS BYTE)
ASM mov AX, value
ASM mov DX, PortAddress
ASM out DX, AL
END SUB
FUNCTION InpB(BYVAL PortAddress AS WORD) AS BYTE
ASM mov DX, PortAddress
ASM IN AL, DX
ASM mov FUNCTION[0], AL
END FUNCTION
SUB OutpW(BYVAL PortAddress AS WORD, BYVAL value AS WORD) PUBLIC
ASM mov AX, value
ASM mov DX, PortAddress
ASM out DX, AX
END SUB
FUNCTION InpW(BYVAL PortAddress AS WORD) AS WORD
ASM mov DX, PortAddress
ASM IN AX, DX
ASM mov FUNCTION[0], AX
END FUNCTION
Is that now corrected.
May I used the statements PUBLIC and EXTERNAL but where and how?
Greetz,
Stephane
------------------
ICQ: 123632482
Leave a comment:
-
Stephane,
you have got all your byte/integer/words mixed up. Try this,
Paul.
'Return an byte from the specific port
DECLARE FUNCTION InpB(BYVAL PortAddress AS word) AS byte
'Return an word from the specific port
DECLARE FUNCTION InpW(BYVAL PortAddress AS WORD) AS word
'Write an byte to the specific port
DECLARE SUB OutpB(BYVAL PortAddress AS word, BYVAL Value AS byte)
'Write an word to the specific port
DECLARE SUB OutpW(BYVAL PortAddress AS WORD, BYVAL Value AS word)
'Question :
'Is that FOR READ/WRITE 8-bits OR 16-bits ports?
SUB OutB(BYVAL PORT AS word, BYVAL value AS BYTE)
'Write an byte to the specific port
ASM mov AX, value
ASM mov DX, port
ASM out DX, AL
END SUB
FUNCTION InpB(BYVAL PORT AS word) AS BYTE
'Return an byte from the specific port
ASM mov DX, port
ASM in AL, DX
ASM mov FUNCTION[0], AL
END FUNCTION
SUB OutpW(BYVAL PORT AS WORD, BYVAL value AS WORD)
'Write an word to the specific port
ASM mov AX, value
ASM mov DX, port
ASM out DX, AX
END SUB
FUNCTION InpW(BYVAL PORT AS word) AS WORD
'Return an word from the specific port
ASM mov DX, port
ASM in AX, DX
ASM mov FUNCTION[0], AX
END FUNCTION
------------------
Leave a comment:
-
Guest repliedHey Paul,
Can you please corrected my declarations and sourcecode for PBDOS.
'Return an byte from the specific port
DECLARE FUNCTION InpB(BYVAL PortAddress AS BYTE) AS INTEGER
'Return an word from the specific port
DECLARE FUNCTION InpW(BYVAL PortAddress AS WORD) AS INTEGER
'Write an byte to the specific port
DECLARE SUB OutpB(BYVAL PortAddress AS BYTE, BYVAL Value AS INTEGER)
'Write an word to the specific port
DECLARE SUB OutpW(BYVAL PortAddress AS WORD, BYVAL Value AS INTEGER)
Question :
Is that FOR READ/WRITE 8-bits OR 16-bits ports?
SUB OutB(BYVAL PORT AS INTEGER, BYVAL value AS BYTE)
'Write an byte to the specific port
ASM mov AX, value
ASM mov DX, port
ASM out DX, AL
END SUB
FUNCTION InpB(BYVAL PORT AS INTEGER) AS BYTE
'Return an byte from the specific port
ASM mov DX, port
ASM in AL, DX
ASM mov FUNCTION[0], AL
END FUNCTION
SUB OutpW(BYVAL PORT AS WORD, BYVAL value AS WORD)
'Write an word to the specific port
ASM mov AX, value
ASM mov DX, port
ASM out DX, AX
END SUB
FUNCTION InpW(BYVAL PORT AS INTEGER) AS WORD
'Return an word from the specific port
ASM mov DX, port
ASM in AX, DX
ASM mov FUNCTION[0], AX
END FUNCTION
Thanks in advance
Stephane
------------------
ICQ: 123632482
Leave a comment:
-
Stephane,
these routines work with BYTEs if the IN/OUT instruction uses AL.
They work with WORDs if the IN/OUT instruction uses AX.
e.g OUT DX,AX will output the 16 bit word in AX to the port specified in DX.
OUT DX,AL will output the 8 bit byte in AL to the port specified in DX.
Paul.
------------------
Leave a comment:
-
I need read/write 1-byte and 2-bytes ports routines for PBDOS
Hey all,
I will an procedure for read/write: 1 byte port, 2 byte port for PBDOS.
How can I change the code for :
'Return an byte from the specific port
DECLARE FUNCTION InpB(BYVAL PortAddress AS BYTE) AS INTEGER
'Return an word from the specific port
DECLARE FUNCTION InpW(BYVAL PortAddress AS WORD) AS INTEGER
'Write an byte to the specific port
DECLARE SUB OutB(BYVAL PortAddress AS BYTE, BYVAL Value AS INTEGER)
'Write an word to the specific port
DECLARE SUB OutW(BYVAL PortAddress AS WORD, BYVAL Value AS INTEGER)
Question :
Is that for read/write 8-bits or 16-bits ports?
SUB pbOut(BYVAL port AS INTEGER, BYVAL value AS INTEGER)
! mov AX, value
! mov DX, port
! out DX, AL
END SUB
FUNCTION pbInp(BYVAL port AS INTEGER) AS INTEGER
! mov DX, port
! in AL, DX
! mov FUNCTION[0], AL
END FUNCTION
Please help me for changes how this code for PBDOS
Greetz
Stephane
------------------
ICQ: 123632482Tags: None
Leave a comment: