I have had no problems with 95/98 with the following:
'------------------------------------------------------------------------------------------------
' TITLE: Out32
' DESC: Writes data (ByteValue)to I/O port (PortAddress).
' SYNTAX: Out32 PortAddress, ByteValue
' NOTES: This procedure is for use with I/O ports using 8 bit data ie. ISA expansion cards.
' This procedure may also be used to write data to SPP mode parallel ports
DECLARE SUB Out32(BYVAL PortAddress AS INTEGER,BYVAL ByteValue AS BYTE)
SUB Out32(BYVAL PortAddress AS INTEGER,BYVAL ByteValue AS BYTE)
! push dx
! mov dx,PortAddress
! mov al,ByteValue
! out dx,al
! pop dx
END SUB
'------------------------------------------------------------------------------------------------
' TITLE: In32
' DESC: Returns data from I/O port (PortAddress).
' SYNTAX: In32 PortAddress TO Variable?
' NOTES: This procedure is for use with I/O ports using 8 bit data ie. ISA expansion cards.
' This procedure may also be used to return the last data written to a SPP mode parallel
' port. It will NOT work with EPP mode parallel ports.
DECLARE FUNCTION In32(BYVAL PortAddress AS INTEGER) AS BYTE
FUNCTION In32(BYVAL PortAddress AS INTEGER) AS BYTE
LOCAL ByteValue AS BYTE
! push dx
! mov dx,PortAddress
! in al,dx
! mov ByteValue,al
! pop dx
FUNCTION = ByteValue
END FUNCTION
------------------
Announcement
Collapse
No announcement yet.
Port IO problem
Collapse
X
-
Guest repliedI am using Pbdll6 on P3-500 machine with Windows 98 Second edition OS, below are the source code for my control program,
using ISA bus, port address 608(Decimal),this program was transfer from VB6(working!) and modify to suit PBDll6, it compile,but have run time trouble with illegal call.
Code:'================================================================ 'Motion control by 8255 ' ' '================================================================ ' Set ID for all the dialog control items #COMPILE EXE #INCLUDE "Win32Api.Inc" %IDMOVE_X_MINUS = 1 %IDMOVE_X_PLUS = 2 %IDEXIT = 3 %BS_DEFAULT = 1 'Set the button appearance '------------------------------------------------------------ ' Global variable to recieve the user input and variable GLOBAL PORTBASE AS INTEGER '------------------------------------------------------------- 'Routine for outport data to port SUB pbOut(BYVAL oport AS INTEGER, BYVAL value AS INTEGER) '! mov DX, oport '! mov AL, value '! out DX, AL ! mov AX, value ! mov DX, oport ! out DX, AL END SUB '------------------------------------------------------------ 'Routine for replace doevents in VB SUB DOEVENT() EXPORT STATIC Msg AS tagMsg IF PeekMessage(Msg, %NULL, 0, 0, %PM_REMOVE) THEN TranslateMessage Msg DispatchMessage Msg END IF END SUB '---------------------------------------------------------------- 'Routine for delay timing SUB Delay(DelayInMilliseconds AS SINGLE) DIM tmout AS SINGLE tmout = DelayInMilliseconds + timeGetTime() DO UNTIL timeGetTime() >= tmout CALL DOEVENT LOOP END SUB '---------------------------------------------------------------- 'Routine for Pulsing the X-Axis motor in clockwise direction SUB Move_X_minu(STEPP AS SINGLE) DIM X AS INTEGER FOR X = 1 TO STEPP CALL pbOut(PORTBASE+1,3) 'turn on portB bit 2 'now bring control port bit 2 to high and low 'to latch the data to it's output. CALL pbOut(PORTBASE+2,2) CALL pbOut(PORTBASE+2,0) Delay(1) 'off time if current sinking CALL pbOut(PORTBASE+1,2) 'turn off portB bit 2 CALL pbOut(PORTBASE+2,2) 'but keep bit 1 low CALL pbOut(PORTBASE+2,0) Delay (1) 'on time if current sinking NEXT X END SUB '-------------------------------------------------------------- 'Routine for pulsing the x-axis motor anti-clockwise SUB Move_X_PLUS(STEPP AS SINGLE) DIM X AS INTEGER FOR X = 1 TO STEPP CALL pbOut(PORTBASE+1,3) 'turn on portB bit 2 'now bring control port bit 2 to high and low 'to latch the data to it's output. CALL pbOut(PORTBASE+2,2) CALL pbOut(PORTBASE+2,0) Delay(1) 'off time if current sinking CALL pbOut(PORTBASE+1,1) 'turn off portB bit 2 CALL pbOut(PORTBASE+2,2) 'but keep bit 1 low CALL pbOut(PORTBASE+2,0) Delay (1) 'on time if current sinking NEXT X END SUB '---------------------------------------------------------------- CALLBACK FUNCTION MoveXminus() Move_X_minu (200) END FUNCTION '-------------------------------------------------------- CALLBACK FUNCTION MoveXplus() Move_X_plus (200) END FUNCTION '-------------------------------------------------------- CALLBACK FUNCTION Exit_prog() DIALOG END CBHNDL, 0 END FUNCTION '-------------------------------------------------------------- FUNCTION PBMAIN () AS LONG $REGISTER NONE LOCAL hDlg AS LONG ' ** Create a new dialog template DIALOG NEW 0, "Motion of X-Y Table", ,, 300, 200, 0, 0 TO hDlg ' ** Add controls to it '------------------------------------------------------------- CONTROL ADD BUTTON, _ hDlg, _ %IDMOVE_X_MINUS, _ "MOVE X-", _ 100, _ 10, _ 50, _ 12, _ CALL MOVE_X_MINU '-------------------------------------------------------------- CONTROL ADD BUTTON, _ hDlg, _ %IDMOVE_X_PLUS, _ "MOVE X+", _ 100, _ 30, _ 50, _ 12, _ CALL MOVE_X_PLUS '-------------------------------------------------------------- CONTROL ADD BUTTON, hDlg, %IDEXIT, "Exit", _ 110, 75, 40, 14, 0 CALL exit_prog '------------------------------------------------------------ PORTBASE=608 'address IN ISA bus CALL pbOut(PORTBASE+3,128) '8255 control word,send data 128 to port 611 'for set all port are output ' ** Display the dialog DIALOG SHOW MODAL hDlg END FUNCTION
Leave a comment:
-
It is unlikely anyone is going to be able to suggest a solution, because you have not posted enough information on the problem.
If you single-step your program in the debugger, where *exactly* does the Illegal Operation occur? In otherwords, how do we know that it is occuring within these functions? (ie, you may have a problems elsewhere in your code that is causing this problem).
What port(s) are you trying to access? Does this code fail on the 1st attempt, or do they work for a while?
What exactly does your program do?
Also, which version of PB/DLL are you using?
------------------
Lance
PowerBASIC Support
mailto:[email protected][email protected]</A>
Leave a comment:
-
Port IO problem
Windows NT was designed so that (theoretically) no application could crash the operating system. Part of that security model is that NT will not allow any user-mode (Ring 3) application to access hardware ports. For this reason, INP and OUT was removed from the PowerBASIC language in PB/DLL 32-bit and PB/CC.
However, Windows 95/98 is not a true 32-bit operating system and does not support the NT security model. So technically, an application *can* directly access a hardware port (although we highly recommend that you NOT do it). To do so, you simply use the "in" and "out" assembler instructions.
The following code encapsulates this for those of you not familiar with assembler:
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
I have read this message and try to use the function,
everything fine when compiling, but when I run it
the windows illegal operation window come-up, I am
using Windows 98 SE.
What's wrong, anybody can help.
Tags: None
Leave a comment: