Re: [Gambas-user] Parallel Port - Illegal Seek -

2010-04-08 Thread Doriano Blengino
mike ha scritto:
 On 04/07/2010 02:47 PM, nando wrote:
   
 Seek will not change the address.


 -- Original Message ---
 From: Doriano Blenginodoriano.bleng...@fastwebnet.it
 To: nand...@nothingsimple.com, mailing list for gambas users
 gambas-user@lists.sourceforge.net
 Sent: Wed, 07 Apr 2010 11:06:42 +0200
 Subject: Re: [Gambas-user] Parallel Port - Illegal Seek -


 
 nando ha scritto:
  
   
 Using SEEK is not correct.
 If you think of the parallel port as a file, you cannot seek.
 It doesn't make sense.
 You can only read and write.
 What are you trying to accomplish ?
 -Fernando


 
 He is trying to do low level access to the parallel port, which has 3
 hardware addresses.
 In that respect, seek() would make sense to select which IO address to
 read from/write to.
 Whether this works or not, depends on how the kernel driver interprets
 the seeks, but the following listing makes it clear that somewhere
 (other OSes?) this behavior works.
 The error could also arise from other problems: permissions, missing
 modules, wrong major/minor numbers and so on...

 Regards,
 Doriano
   
How already stated in a previous email, it is possible to access I/O 
ports in different manners.
After a research, I discovered two viable ways - direct access (I don't 
know if gambas has I/O instructions), and /dev/port, which is a device. 
In this last case seek() is used to address a port.

 From http://tldp.org/HOWTO/IO-Port-Programming-2.html :

 Another way to access I/O ports is to |open()| |/dev/port| (a 
 character device, major number 1, minor 4) for reading and/or writing 
 (the stdio |f*()| functions have internal buffering, so avoid them). 
 Then |lseek()| to the appropriate byte in the file (file position 0 = 
 port 0x00, file position 1 = port 0x01, and so on), and |read()| or 
 |write()| a byte or word from or to it.

 Naturally, for this to work your program needs read/write access to 
 |/dev/port|. This method is probably slower than the normal method 
 above, but does not need compiler optimisation nor |ioperm()|. It 
 doesn't need root access either, if you give a non-root user or group 
 access to |/dev/port| --- but this is a very bad thing... [about 
 security]...
Using /dev/port can be problematic: can gambas do unbuffered I/O?

Other methods would be to use some external program or library (shared 
object). If gambas does not have I/O (peek  poke), then an external 
library is the most performant way, though not the simpler. Gambas can 
interface with external libraries using EXTERNAL declaration.

Googling about this issue, I found some interesting page:
http://tldp.org/HOWTO/IO-Port-Programming-2.html
http://www.epanorama.net/circuits/parallel_output.html
http://www.faqs.org/docs/Linux-mini/IO-Port-Programming.html
http://cyberelk.net/tim/parport/parport.html
http://people.redhat.com/twaugh/parport/html/ppdev.html

The best way would be to write a gambas component, having either 
internal I/O instructions (a C component) or relying to an external 
library (a gambas component calling an external library; may be there is 
something already done somewhere).

Hey, gambas gurus out there... someone has the time? I do not.

Regards,
Doriano


--
Download Intel#174; Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
___
Gambas-user mailing list
Gambas-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/gambas-user


Re: [Gambas-user] Parallel Port - Illegal Seek -

2010-04-08 Thread Benoît Minisini
 Hi All,
 
 I am writing a parallel port interface, however I am struggling with how to
 write to the parallel port.  Below I have included the code that I have
 used.  Following that I have included the BASIC code that I am
 bastardizing.
 
 My Gambas version is Gambas2.13
 I am running Linux Mint 8
 I do have a parallel port on my PC. It is '0378' - '037a' and '0778' -
 '077a'
 The error code I am getting is System error. illegal seek
 
 Thanks in advance for any help anyone can give.
 -GAMBAS
 2 CODE FOLLOWS-- '
 Gambas module file
 PUBLIC SUB Main()
 
 DIM N AS Integer
 DIM pin AS Integer
 DIM pinout AS Integer[] = [0, 0, 0, 0, 0, 0, 0, 0]
 DIM pump AS Integer
 DIM Ptime AS Integer
 DIM Clock AS Integer
 DIM UClock AS Integer
 DIM DClock AS Integer
 DIM commit AS Integer
 DIM poweron AS Integer
 DIM switch AS Integer
 DIM gate AS File
 DIM base0, base1, base2 AS Integer
 
 base0 = 0
 base1 = 1
 base2 = 2
 poweron = 64
 commit = 144
 switch = 17
 UClock = 130
 DClock = 128
   gate = OPEN /dev/parport0 FOR READ WRITE
   SEEK #gate, base0
   WRITE #gate, poweron
   FOR Ptime = 1 TO 2000 STEP 1
   NEXT
 
   SEEK #gate, base2
   WRITE #gate, switch
 
   GOTO START
 CommitChanges:
   FOR N = 0 TO 7 STEP 1
 pump = CInt(100  pinout[Fix(N)])
 Clock = CInt(101  pinout[Fix(N)])
 SEEK #gate, base0
 WRITE #gate, pump
 FOR Ptime = 1 TO 2000 STEP 1
 NEXT
 SEEK #gate, base0
 WRITE #gate, Clock
 FOR Ptime = 1 TO 2000 STEP 1
 NEXT
 SEEK #gate, base0
 WRITE #gate, pump
   NEXT
 FOR Ptime = 1 TO 2000 STEP 1
 NEXT
 
   FOR N = 1 TO 16 STEP 1
 SEEK #gate, base0
 WRITE #gate, UClock
 FOR Ptime = 1 TO 2000 STEP 1
 NEXT
 SEEK #gate, base0
 WRITE #gate, DClock
   NEXT
 FOR Ptime = 1 TO 2000 STEP 1
 NEXT
   SEEK #gate, base0
   WRITE #gate, commit
 FOR Ptime = 1 TO 2000 STEP 1
 NEXT
   SEEK #gate, base0
   WRITE #gate, poweron
   GOTO PrintPinout
 
 PrintPinout:
   FOR N = 0 TO 7 STEP 1
 PRINT pinout[Fix(N)]
   NEXT
   GOTO START
 
 PinSelectFail:
   PRINT You have selected a pin that does not exist, careful as this may
 cause a divide by 0 and end the universe,  Select between pin 0 and pin 7
   GOTO START
 
 START:
   PRINT What input do you want to toggle? (pins 0 - 7 are outputs, Pin 8
 is the activation sequence)
   INPUT pin
   IF pin  0 OR pin  8 THEN
 GOTO PinSelectFail
   ELSE IF pin = 8 THEN
 GOTO CommitChanges
   ELSE IF pinout[Fix(pin)] = 0 THEN
 pinout[Fix(pin)] = 1
   ELSE IF pinout[Fix(pin)] = 1 THEN
 pinout[Fix(pin)] = 0
   ENDIF
 GOTO PrintPinout
 END
 -Gambas
 2
 END---
 -
 
 
 
 
 -BASIC
 CODE FOLLOWS--
 
 BASE0=H378
 
 'SWITCH POWER AND OUTPUTS ON
 OUT BASE0, H80
 OUT BASE0 + 2, 11
 
 'DEFINE ALL DIGITAL OUTPUTS [OUT(N)] AS BEING OFF (0)
 FOR N = 0 TO 7
 DOUT(N) = 0
 NEXT N
 DOUT=0
 
 START:
 INPUT WHICH DIGITAL OUTPUT DO YOU WANT TO TOGGLE (0 TO 7); N
 IF N  0 OR N  7 THEN GOTO START
 N = FIX(N)
 DOUT9N0=ABS(NOT (-DOUT(N))) ' THIS LINE TOGGLES THE OUTPUT
 
 
 'CREATE COMPLETE BYTE FOR IC3 CALLED DOUT
 FOR N = 0 TO 7
 IF DOUT(N) = 0 THEN
 DOUT = DOUT AND NOT (2^N)
 ELSE
 DOUT = DOUT OR 2^N
 ENDIF
 NEXT N
 
 'SEND 8 CLOCK PULSES AND DIGITAL OUT DATA (ALL ZERO'S)
 FOR BIT = 1 TO 8
 B = 8 - BIT
 BYTE = ((DOUT AND 2^B) / 2^B) OR H80
 OUT BASE0, BYTE
 OUT BASE0, BYTE OR 2
OUT BASE0 BYTE
 NEXT BIT
 
 'SEND ANOTHER 16 CLOCK PULSES TO SHIFT THE DATA INTO IC3
 FOR BIT = 9 TO 24
 OUT BASE0, H82
 OUT BASE0, H80
 NEXT BIT
 
 'LOAD IC3
 OUT BASE0, H90
 OUT BASE0, h80]
 
 -BASIC
 END
 
 
 Bjorn Macintosh

Have you read http://gambasdoc.org/help/howto/parport?

Your program should work as expected if you open /dev/port, not 
/dev/parport0, if you seek at the true port address, and if you write bytes.

DIM poweron AS Byte ' -- note that

gate = OPEN /dev/parport0 FOR READ WRITE
SEEK #gate, H378
poweron = 1
WRITE #gate, poweron

And if you need to wait a little, use the SLEEP or WAIT instruction. See the 
documentation for details on these instructions.

I imagine that if you write Integer instead of Byte, then you will actually 
write the four bytes of the integer to four successive ports.

Regards,

-- 
Benoît Minisini

--
Download Intel#174; Parallel Studio Eval
Try the new software 

Re: [Gambas-user] Parallel Port - Illegal Seek -

2010-04-07 Thread Doriano Blengino
nando ha scritto:
 Using SEEK is not correct.
 If you think of the parallel port as a file, you cannot seek.
 It doesn't make sense.
 You can only read and write.
 What are you trying to accomplish ?
 -Fernando
   
He is trying to do low level access to the parallel port, which has 3 
hardware addresses.
In that respect, seek() would make sense to select which IO address to 
read from/write to.
Whether this works or not, depends on how the kernel driver interprets 
the seeks, but the following listing makes it clear that somewhere 
(other OSes?) this behavior works.
The error could also arise from other problems: permissions, missing 
modules, wrong major/minor numbers and so on...

Regards,
Doriano



 -- Original Message ---
 From: Bjorn Macintosh bjorn.macint...@gmail.com
 To: gambas-user@lists.sourceforge.net
 Sent: Fri, 2 Apr 2010 21:09:58 +1300
 Subject: [Gambas-user] Parallel Port - Illegal Seek -

   
 Hi All,

 I am writing a parallel port interface, however I am struggling with how to
 write to the parallel port.  Below I have included the code that I have
 used.  Following that I have included the BASIC code that I am bastardizing.

 My Gambas version is Gambas2.13
 I am running Linux Mint 8
 I do have a parallel port on my PC. It is '0378' - '037a' and '0778' -
 '077a'
 The error code I am getting is System error. illegal seek

 Thanks in advance for any help anyone can give.
 -GAMBAS2
 CODE FOLLOWS--
 ' Gambas module file
 PUBLIC SUB Main()

 DIM N AS Integer
 DIM pin AS Integer
 DIM pinout AS Integer[] = [0, 0, 0, 0, 0, 0, 0, 0]
 DIM pump AS Integer
 DIM Ptime AS Integer
 DIM Clock AS Integer
 DIM UClock AS Integer
 DIM DClock AS Integer
 DIM commit AS Integer
 DIM poweron AS Integer
 DIM switch AS Integer
 DIM gate AS File
 DIM base0, base1, base2 AS Integer

 base0 = 0
 base1 = 1
 base2 = 2
 poweron = 64
 commit = 144
 switch = 17
 UClock = 130
 DClock = 128
   gate = OPEN /dev/parport0 FOR READ WRITE
   SEEK #gate, base0
   WRITE #gate, poweron
   FOR Ptime = 1 TO 2000 STEP 1
   NEXT

   SEEK #gate, base2
   WRITE #gate, switch

   GOTO START
 CommitChanges:
   FOR N = 0 TO 7 STEP 1
 pump = CInt(100  pinout[Fix(N)])
 Clock = CInt(101  pinout[Fix(N)])
 SEEK #gate, base0
 WRITE #gate, pump
 FOR Ptime = 1 TO 2000 STEP 1
 NEXT
 SEEK #gate, base0
 WRITE #gate, Clock
 FOR Ptime = 1 TO 2000 STEP 1
 NEXT
 SEEK #gate, base0
 WRITE #gate, pump
   NEXT
 FOR Ptime = 1 TO 2000 STEP 1
 NEXT

   FOR N = 1 TO 16 STEP 1
 SEEK #gate, base0
 WRITE #gate, UClock
 FOR Ptime = 1 TO 2000 STEP 1
 NEXT
 SEEK #gate, base0
 WRITE #gate, DClock
   NEXT
 FOR Ptime = 1 TO 2000 STEP 1
 NEXT
   SEEK #gate, base0
   WRITE #gate, commit
 FOR Ptime = 1 TO 2000 STEP 1
 NEXT
   SEEK #gate, base0
   WRITE #gate, poweron
   GOTO PrintPinout

 PrintPinout:
   FOR N = 0 TO 7 STEP 1
 PRINT pinout[Fix(N)]
   NEXT
   GOTO START

 PinSelectFail:
   PRINT You have selected a pin that does not exist, careful as this may
 cause a divide by 0 and end the universe,  Select between pin 0 and pin 7
   GOTO START

 START:
   PRINT What input do you want to toggle? (pins 0 - 7 are outputs, Pin 8
 is the activation sequence)
   INPUT pin
   IF pin  0 OR pin  8 THEN
 GOTO PinSelectFail
   ELSE IF pin = 8 THEN
 GOTO CommitChanges
   ELSE IF pinout[Fix(pin)] = 0 THEN
 pinout[Fix(pin)] = 1
   ELSE IF pinout[Fix(pin)] = 1 THEN
 pinout[Fix(pin)] = 0
   ENDIF
 GOTO PrintPinout
 END
 -Gambas2
 END

 -BASIC
 CODE FOLLOWS--

 BASE0=H378

 'SWITCH POWER AND OUTPUTS ON
 OUT BASE0, H80
 OUT BASE0 + 2, 11

 'DEFINE ALL DIGITAL OUTPUTS [OUT(N)] AS BEING OFF (0)
 FOR N = 0 TO 7
 DOUT(N) = 0
 NEXT N
 DOUT=0

 START:
 INPUT WHICH DIGITAL OUTPUT DO YOU WANT TO TOGGLE (0 TO 7); N
 IF N  0 OR N  7 THEN GOTO START
 N = FIX(N)
 DOUT9N0=ABS(NOT (-DOUT(N))) ' THIS LINE TOGGLES THE OUTPUT

 'CREATE COMPLETE BYTE FOR IC3 CALLED DOUT
 FOR N = 0 TO 7
 IF DOUT(N) = 0 THEN
 DOUT = DOUT AND NOT (2^N)
 ELSE
 DOUT = DOUT OR 2^N
 ENDIF
 NEXT N

 'SEND 8 CLOCK PULSES AND DIGITAL OUT DATA (ALL ZERO'S)
 FOR BIT = 1 TO 8
 B = 8 - BIT
 BYTE = ((DOUT AND 2^B) / 2^B) OR H80
 OUT BASE0, BYTE
 OUT BASE0, BYTE OR 2
OUT BASE0 BYTE
 NEXT BIT

 'SEND ANOTHER 16 CLOCK PULSES TO SHIFT THE DATA INTO IC3
 FOR BIT = 9 TO 24
 OUT BASE0, H82
 OUT BASE0, H80
 NEXT BIT

 'LOAD IC3
 OUT BASE0, H90
 OUT BASE0, h80]

 

Re: [Gambas-user] Parallel Port - Illegal Seek -

2010-04-07 Thread nando
Seek will not change the address.


-- Original Message ---
From: Doriano Blengino doriano.bleng...@fastwebnet.it
To: nand...@nothingsimple.com, mailing list for gambas users
gambas-user@lists.sourceforge.net
Sent: Wed, 07 Apr 2010 11:06:42 +0200
Subject: Re: [Gambas-user] Parallel Port - Illegal Seek -

 nando ha scritto:
  Using SEEK is not correct.
  If you think of the parallel port as a file, you cannot seek.
  It doesn't make sense.
  You can only read and write.
  What are you trying to accomplish ?
  -Fernando

 He is trying to do low level access to the parallel port, which has 3 
 hardware addresses.
 In that respect, seek() would make sense to select which IO address to 
 read from/write to.
 Whether this works or not, depends on how the kernel driver interprets 
 the seeks, but the following listing makes it clear that somewhere 
 (other OSes?) this behavior works.
 The error could also arise from other problems: permissions, missing 
 modules, wrong major/minor numbers and so on...
 
 Regards,
 Doriano
 
 
 
  -- Original Message ---
  From: Bjorn Macintosh bjorn.macint...@gmail.com
  To: gambas-user@lists.sourceforge.net
  Sent: Fri, 2 Apr 2010 21:09:58 +1300
  Subject: [Gambas-user] Parallel Port - Illegal Seek -
 

  Hi All,
 
  I am writing a parallel port interface, however I am struggling with how to
  write to the parallel port.  Below I have included the code that I have
  used.  Following that I have included the BASIC code that I am 
  bastardizing.
 
  My Gambas version is Gambas2.13
  I am running Linux Mint 8
  I do have a parallel port on my PC. It is '0378' - '037a' and '0778' -
  '077a'
  The error code I am getting is System error. illegal seek
 
  Thanks in advance for any help anyone can give.
  -GAMBAS2
  CODE FOLLOWS--
  ' Gambas module file
  PUBLIC SUB Main()
 
  DIM N AS Integer
  DIM pin AS Integer
  DIM pinout AS Integer[] = [0, 0, 0, 0, 0, 0, 0, 0]
  DIM pump AS Integer
  DIM Ptime AS Integer
  DIM Clock AS Integer
  DIM UClock AS Integer
  DIM DClock AS Integer
  DIM commit AS Integer
  DIM poweron AS Integer
  DIM switch AS Integer
  DIM gate AS File
  DIM base0, base1, base2 AS Integer
 
  base0 = 0
  base1 = 1
  base2 = 2
  poweron = 64
  commit = 144
  switch = 17
  UClock = 130
  DClock = 128
gate = OPEN /dev/parport0 FOR READ WRITE
SEEK #gate, base0
WRITE #gate, poweron
FOR Ptime = 1 TO 2000 STEP 1
NEXT
 
SEEK #gate, base2
WRITE #gate, switch
 
GOTO START
  CommitChanges:
FOR N = 0 TO 7 STEP 1
  pump = CInt(100  pinout[Fix(N)])
  Clock = CInt(101  pinout[Fix(N)])
  SEEK #gate, base0
  WRITE #gate, pump
  FOR Ptime = 1 TO 2000 STEP 1
  NEXT
  SEEK #gate, base0
  WRITE #gate, Clock
  FOR Ptime = 1 TO 2000 STEP 1
  NEXT
  SEEK #gate, base0
  WRITE #gate, pump
NEXT
  FOR Ptime = 1 TO 2000 STEP 1
  NEXT
 
FOR N = 1 TO 16 STEP 1
  SEEK #gate, base0
  WRITE #gate, UClock
  FOR Ptime = 1 TO 2000 STEP 1
  NEXT
  SEEK #gate, base0
  WRITE #gate, DClock
NEXT
  FOR Ptime = 1 TO 2000 STEP 1
  NEXT
SEEK #gate, base0
WRITE #gate, commit
  FOR Ptime = 1 TO 2000 STEP 1
  NEXT
SEEK #gate, base0
WRITE #gate, poweron
GOTO PrintPinout
 
  PrintPinout:
FOR N = 0 TO 7 STEP 1
  PRINT pinout[Fix(N)]
NEXT
GOTO START
 
  PinSelectFail:
PRINT You have selected a pin that does not exist, careful as this may
  cause a divide by 0 and end the universe,  Select between pin 0 and pin 7
GOTO START
 
  START:
PRINT What input do you want to toggle? (pins 0 - 7 are outputs, Pin 8
  is the activation sequence)
INPUT pin
IF pin  0 OR pin  8 THEN
  GOTO PinSelectFail
ELSE IF pin = 8 THEN
  GOTO CommitChanges
ELSE IF pinout[Fix(pin)] = 0 THEN
  pinout[Fix(pin)] = 1
ELSE IF pinout[Fix(pin)] = 1 THEN
  pinout[Fix(pin)] = 0
ENDIF
  GOTO PrintPinout
  END
  -Gambas2
  END
 
  -BASIC
  CODE FOLLOWS--
 
  BASE0=H378
 
  'SWITCH POWER AND OUTPUTS ON
  OUT BASE0, H80
  OUT BASE0 + 2, 11
 
  'DEFINE ALL DIGITAL OUTPUTS [OUT(N)] AS BEING OFF (0)
  FOR N = 0 TO 7
  DOUT(N) = 0
  NEXT N
  DOUT=0
 
  START:
  INPUT WHICH DIGITAL OUTPUT DO YOU WANT TO TOGGLE (0 TO 7); N
  IF N  0 OR N  7 THEN GOTO START
  N = FIX(N)
  DOUT9N0=ABS(NOT (-DOUT(N))) ' THIS LINE TOGGLES THE OUTPUT
 
  'CREATE COMPLETE BYTE FOR IC3 CALLED DOUT
  FOR N = 0 TO 7
  IF DOUT(N) = 0 THEN
  DOUT = DOUT AND NOT (2^N)
  ELSE

Re: [Gambas-user] Parallel Port - Illegal Seek -

2010-04-07 Thread mike
On 04/07/2010 02:47 PM, nando wrote:
 Seek will not change the address.


 -- Original Message ---
 From: Doriano Blenginodoriano.bleng...@fastwebnet.it
 To: nand...@nothingsimple.com, mailing list for gambas users
 gambas-user@lists.sourceforge.net
 Sent: Wed, 07 Apr 2010 11:06:42 +0200
 Subject: Re: [Gambas-user] Parallel Port - Illegal Seek -


 nando ha scritto:
  
 Using SEEK is not correct.
 If you think of the parallel port as a file, you cannot seek.
 It doesn't make sense.
 You can only read and write.
 What are you trying to accomplish ?
 -Fernando


 He is trying to do low level access to the parallel port, which has 3
 hardware addresses.
 In that respect, seek() would make sense to select which IO address to
 read from/write to.
 Whether this works or not, depends on how the kernel driver interprets
 the seeks, but the following listing makes it clear that somewhere
 (other OSes?) this behavior works.
 The error could also arise from other problems: permissions, missing
 modules, wrong major/minor numbers and so on...

 Regards,
 Doriano

  

 -- Original Message ---
 From: Bjorn Macintoshbjorn.macint...@gmail.com
 To: gambas-user@lists.sourceforge.net
 Sent: Fri, 2 Apr 2010 21:09:58 +1300
 Subject: [Gambas-user] Parallel Port - Illegal Seek -



 Hi All,

 I am writing a parallel port interface, however I am struggling with how to
 write to the parallel port.  Below I have included the code that I have
 used.  Following that I have included the BASIC code that I am 
 bastardizing.

 My Gambas version is Gambas2.13
 I am running Linux Mint 8
 I do have a parallel port on my PC. It is '0378' - '037a' and '0778' -
 '077a'
 The error code I am getting is System error. illegal seek

 Thanks in advance for any help anyone can give.
 -GAMBAS2
 CODE FOLLOWS--
 ' Gambas module file
 PUBLIC SUB Main()

 DIM N AS Integer
 DIM pin AS Integer
 DIM pinout AS Integer[] = [0, 0, 0, 0, 0, 0, 0, 0]
 DIM pump AS Integer
 DIM Ptime AS Integer
 DIM Clock AS Integer
 DIM UClock AS Integer
 DIM DClock AS Integer
 DIM commit AS Integer
 DIM poweron AS Integer
 DIM switch AS Integer
 DIM gate AS File
 DIM base0, base1, base2 AS Integer

 base0 = 0
 base1 = 1
 base2 = 2
 poweron = 64
 commit = 144
 switch = 17
 UClock = 130
 DClock = 128
gate = OPEN /dev/parport0 FOR READ WRITE
SEEK #gate, base0
WRITE #gate, poweron
FOR Ptime = 1 TO 2000 STEP 1
NEXT

SEEK #gate, base2
WRITE #gate, switch

GOTO START
 CommitChanges:
FOR N = 0 TO 7 STEP 1
  pump = CInt(100  pinout[Fix(N)])
  Clock = CInt(101  pinout[Fix(N)])
  SEEK #gate, base0
  WRITE #gate, pump
  FOR Ptime = 1 TO 2000 STEP 1
  NEXT
  SEEK #gate, base0
  WRITE #gate, Clock
  FOR Ptime = 1 TO 2000 STEP 1
  NEXT
  SEEK #gate, base0
  WRITE #gate, pump
NEXT
  FOR Ptime = 1 TO 2000 STEP 1
  NEXT

FOR N = 1 TO 16 STEP 1
  SEEK #gate, base0
  WRITE #gate, UClock
  FOR Ptime = 1 TO 2000 STEP 1
  NEXT
  SEEK #gate, base0
  WRITE #gate, DClock
NEXT
  FOR Ptime = 1 TO 2000 STEP 1
  NEXT
SEEK #gate, base0
WRITE #gate, commit
  FOR Ptime = 1 TO 2000 STEP 1
  NEXT
SEEK #gate, base0
WRITE #gate, poweron
GOTO PrintPinout

 PrintPinout:
FOR N = 0 TO 7 STEP 1
  PRINT pinout[Fix(N)]
NEXT
GOTO START

 PinSelectFail:
PRINT You have selected a pin that does not exist, careful as this may
 cause a divide by 0 and end the universe,  Select between pin 0 and pin 7
GOTO START

 START:
PRINT What input do you want to toggle? (pins 0 -  7 are outputs, Pin 
 8
 is the activation sequence)
INPUT pin
IF pin  0 OR pin  8 THEN
  GOTO PinSelectFail
ELSE IF pin = 8 THEN
  GOTO CommitChanges
ELSE IF pinout[Fix(pin)] = 0 THEN
  pinout[Fix(pin)] = 1
ELSE IF pinout[Fix(pin)] = 1 THEN
  pinout[Fix(pin)] = 0
ENDIF
 GOTO PrintPinout
 END
 -Gambas2
 END

 -BASIC
 CODE FOLLOWS--

 BASE0=H378

 'SWITCH POWER AND OUTPUTS ON
 OUT BASE0,H80
 OUT BASE0 + 2, 11

 'DEFINE ALL DIGITAL OUTPUTS [OUT(N)] AS BEING OFF (0)
 FOR N = 0 TO 7
  DOUT(N) = 0
 NEXT N
 DOUT=0

 START:
  INPUT WHICH DIGITAL OUTPUT DO YOU WANT TO TOGGLE (0 TO 7); N
  IF N  0 OR N  7 THEN GOTO START
  N = FIX(N)
  DOUT9N0=ABS(NOT (-DOUT(N))) ' THIS LINE TOGGLES THE OUTPUT

 'CREATE COMPLETE BYTE FOR IC3 CALLED DOUT
  FOR N = 0 TO 7
  IF DOUT(N) = 0 THEN
  DOUT = DOUT AND NOT (2^N)
  ELSE
  DOUT = DOUT OR 2^N

Re: [Gambas-user] Parallel Port - Illegal Seek -

2010-04-06 Thread nando
Using SEEK is not correct.
If you think of the parallel port as a file, you cannot seek.
It doesn't make sense.
You can only read and write.
What are you trying to accomplish ?
-Fernando



-- Original Message ---
From: Bjorn Macintosh bjorn.macint...@gmail.com
To: gambas-user@lists.sourceforge.net
Sent: Fri, 2 Apr 2010 21:09:58 +1300
Subject: [Gambas-user] Parallel Port - Illegal Seek -

 Hi All,
 
 I am writing a parallel port interface, however I am struggling with how to
 write to the parallel port.  Below I have included the code that I have
 used.  Following that I have included the BASIC code that I am bastardizing.
 
 My Gambas version is Gambas2.13
 I am running Linux Mint 8
 I do have a parallel port on my PC. It is '0378' - '037a' and '0778' -
 '077a'
 The error code I am getting is System error. illegal seek
 
 Thanks in advance for any help anyone can give.
 -GAMBAS2
 CODE FOLLOWS--
 ' Gambas module file
 PUBLIC SUB Main()
 
 DIM N AS Integer
 DIM pin AS Integer
 DIM pinout AS Integer[] = [0, 0, 0, 0, 0, 0, 0, 0]
 DIM pump AS Integer
 DIM Ptime AS Integer
 DIM Clock AS Integer
 DIM UClock AS Integer
 DIM DClock AS Integer
 DIM commit AS Integer
 DIM poweron AS Integer
 DIM switch AS Integer
 DIM gate AS File
 DIM base0, base1, base2 AS Integer
 
 base0 = 0
 base1 = 1
 base2 = 2
 poweron = 64
 commit = 144
 switch = 17
 UClock = 130
 DClock = 128
   gate = OPEN /dev/parport0 FOR READ WRITE
   SEEK #gate, base0
   WRITE #gate, poweron
   FOR Ptime = 1 TO 2000 STEP 1
   NEXT
 
   SEEK #gate, base2
   WRITE #gate, switch
 
   GOTO START
 CommitChanges:
   FOR N = 0 TO 7 STEP 1
 pump = CInt(100  pinout[Fix(N)])
 Clock = CInt(101  pinout[Fix(N)])
 SEEK #gate, base0
 WRITE #gate, pump
 FOR Ptime = 1 TO 2000 STEP 1
 NEXT
 SEEK #gate, base0
 WRITE #gate, Clock
 FOR Ptime = 1 TO 2000 STEP 1
 NEXT
 SEEK #gate, base0
 WRITE #gate, pump
   NEXT
 FOR Ptime = 1 TO 2000 STEP 1
 NEXT
 
   FOR N = 1 TO 16 STEP 1
 SEEK #gate, base0
 WRITE #gate, UClock
 FOR Ptime = 1 TO 2000 STEP 1
 NEXT
 SEEK #gate, base0
 WRITE #gate, DClock
   NEXT
 FOR Ptime = 1 TO 2000 STEP 1
 NEXT
   SEEK #gate, base0
   WRITE #gate, commit
 FOR Ptime = 1 TO 2000 STEP 1
 NEXT
   SEEK #gate, base0
   WRITE #gate, poweron
   GOTO PrintPinout
 
 PrintPinout:
   FOR N = 0 TO 7 STEP 1
 PRINT pinout[Fix(N)]
   NEXT
   GOTO START
 
 PinSelectFail:
   PRINT You have selected a pin that does not exist, careful as this may
 cause a divide by 0 and end the universe,  Select between pin 0 and pin 7
   GOTO START
 
 START:
   PRINT What input do you want to toggle? (pins 0 - 7 are outputs, Pin 8
 is the activation sequence)
   INPUT pin
   IF pin  0 OR pin  8 THEN
 GOTO PinSelectFail
   ELSE IF pin = 8 THEN
 GOTO CommitChanges
   ELSE IF pinout[Fix(pin)] = 0 THEN
 pinout[Fix(pin)] = 1
   ELSE IF pinout[Fix(pin)] = 1 THEN
 pinout[Fix(pin)] = 0
   ENDIF
 GOTO PrintPinout
 END
 -Gambas2
 END
 
 -BASIC
 CODE FOLLOWS--
 
 BASE0=H378
 
 'SWITCH POWER AND OUTPUTS ON
 OUT BASE0, H80
 OUT BASE0 + 2, 11
 
 'DEFINE ALL DIGITAL OUTPUTS [OUT(N)] AS BEING OFF (0)
 FOR N = 0 TO 7
 DOUT(N) = 0
 NEXT N
 DOUT=0
 
 START:
 INPUT WHICH DIGITAL OUTPUT DO YOU WANT TO TOGGLE (0 TO 7); N
 IF N  0 OR N  7 THEN GOTO START
 N = FIX(N)
 DOUT9N0=ABS(NOT (-DOUT(N))) ' THIS LINE TOGGLES THE OUTPUT
 
 'CREATE COMPLETE BYTE FOR IC3 CALLED DOUT
 FOR N = 0 TO 7
 IF DOUT(N) = 0 THEN
 DOUT = DOUT AND NOT (2^N)
 ELSE
 DOUT = DOUT OR 2^N
 ENDIF
 NEXT N
 
 'SEND 8 CLOCK PULSES AND DIGITAL OUT DATA (ALL ZERO'S)
 FOR BIT = 1 TO 8
 B = 8 - BIT
 BYTE = ((DOUT AND 2^B) / 2^B) OR H80
 OUT BASE0, BYTE
 OUT BASE0, BYTE OR 2
OUT BASE0 BYTE
 NEXT BIT
 
 'SEND ANOTHER 16 CLOCK PULSES TO SHIFT THE DATA INTO IC3
 FOR BIT = 9 TO 24
 OUT BASE0, H82
 OUT BASE0, H80
 NEXT BIT
 
 'LOAD IC3
 OUT BASE0, H90
 OUT BASE0, h80]
 
 -BASIC
 END
 
 Bjorn Macintosh
 --
 Download Intel#174; Parallel Studio Eval
 Try the new software tools for yourself. Speed compiling, find bugs
 proactively, and fine-tune applications for parallel performance.
 See why Intel Parallel Studio got high marks during beta.
 http://p.sf.net/sfu/intel-sw-dev