'===========================================================================
' Subject: ACCESSING LPT PORT                 Date: 05-31-00 (10:25)       
'  Author: Stephan Verrips                    Code: RAPIDQ                 
'  Origin: Stephan@verrips.com              Packet: RAPIDQ.ABC
'===========================================================================
'***********************************************
'* LPTport for Windows 95/98 and Linux         *
'*                                             *
'* Written by Stephan Verrips,                 *
'* The netherlands                             *
'*                                             *
'* This program is public domain !             *
'*                                             *
'* You can use this program for making         *
'* a interface card on the LPT port.           *
'* Pen 18 = massa                              *
'*                                             *
'* Example:                                    *
'*                                             *
'* Switch D0 - pen 2 on with this              *
'* program, then Pen 2 (D0) and pen 18 (Massa) *
'* are 5 volt DC                               *
'*                                             *
'*     Pen 2--------- +5v ---------pen 18      *
'***********************************************

DECLARE SUB pen1
DECLARE SUB pen2
DECLARE SUB pen3
DECLARE SUB pen4
DECLARE SUB pen5
DECLARE SUB pen6
DECLARE SUB pen7
DECLARE SUB pen8
DECLARE SUB pen9
DECLARE SUB pen10
DECLARE SUB pen11
DECLARE SUB pen12
DECLARE SUB pen13
DECLARE SUB pen14
DECLARE SUB pen15
DECLARE SUB pen16
DECLARE SUB pen17
DECLARE SUB ready

DECLARE SUB status

DECLARE SUB P378
DECLARE SUB P3BC
DECLARE SUB P278

DIM Timer1 as QTimer
DIM port AS INTEGER

'***************
'* Create Form *
'***************

CREATE Form AS QFORM
    Caption = "LPTport for Windows"
    Width = 271
    Height = 387
    Center
    CREATE Label1 AS QLABEL
        Caption = "OUTPUTS"
        Left = 21
        Top = 10
        Width = 52
        Transparent = 1
    END CREATE
    CREATE Label2 AS QLABEL
        Caption = "LPT PORT"
        Left = 142
        Top = 10
        Width = 52
        Transparent = 1
    END CREATE
    CREATE Label3 AS QLABEL
        Caption = "INPUTS"
        Left = 142
        Top = 130
        Width = 42
        Transparent = 1
    END CREATE
    CREATE RadioButton2 AS QRADIOBUTTON
        Caption = "LP&T2 - H3BC"
        OnClick= P3BC
	  Left = 142
        Top = 70
        TabOrder = 1
    END CREATE
    CREATE CheckBox1 AS QCHECKBOX
        Caption = "D&0 - pen 2"
	   OnClick = pen2
        Left = 21
        Top = 49
        TabOrder = 3
    END CREATE
    CREATE CheckBox2 AS QCHECKBOX
        Caption = "D&1 - pen 3"
	  OnClick = pen3
        Left = 21
        Top = 72
        TabOrder = 4
    END CREATE
    CREATE CheckBox3 AS QCHECKBOX
        Caption = "D&2 - pen 4"
	  OnClick = pen4
        Left = 21
        Top = 95
        TabOrder = 5
    END CREATE
    CREATE CheckBox4 AS QCHECKBOX
        Caption = "D&3 - pen 5"
	  OnClick = pen5
        Left = 21
        Top = 118
        TabOrder = 6
    END CREATE
    CREATE CheckBox5 AS QCHECKBOX
        Caption = "D&4 - pen 6"
	  OnClick = pen6
        Left = 21
        Top = 143
        TabOrder = 7
    END CREATE
    CREATE CheckBox6 AS QCHECKBOX
        Caption = "D&5 - pen 7"
	  OnClick = pen7
        Left = 21
        Top = 167
        TabOrder = 8
    END CREATE
    CREATE CheckBox7 AS QCHECKBOX
        Caption = "D&6 - pen 8"
	  OnClick = pen8
        Left = 21
        Top = 191
        TabOrder = 9
    END CREATE
    CREATE CheckBox8 AS QCHECKBOX
        Caption = "D&7 - pen 9"
	  OnClick = pen9
        Left = 21
        Top = 216
        TabOrder = 10
    END CREATE
    CREATE CheckBox9 AS QCHECKBOX
        Caption = "&Strobe - pen 1"
	  OnClick = pen1
        Left = 21
        Top = 252
        TabOrder = 11
    END CREATE
    CREATE CheckBox10 AS QCHECKBOX
        Caption = "&Auto F - pen 14"
	  OnClick = pen14
        Left = 21
        Top = 275
        TabOrder = 12
    END CREATE
    CREATE CheckBox11 AS QCHECKBOX
        Caption = "&Init - pen 16"
	  OnClick = pen16
        Left = 21
        Top = 297
        TabOrder = 13
    END CREATE
    CREATE CheckBox12 AS QCHECKBOX
        Caption = "Sel I&n - pen 17"
	  OnClick = pen17
        Left = 21
        Top = 322
        TabOrder = 14
    END CREATE
    CREATE CheckBox13 AS QCHECKBOX
        Caption = "C Error - pen 15"
        Left = 142
        Top = 168
        TabOrder = 15
    END CREATE
    CREATE CheckBox14 AS QCHECKBOX
        Caption = "C Sel - pen 13"
        Left = 142
        Top = 191
        TabOrder = 16
    END CREATE
    CREATE CheckBox15 AS QCHECKBOX
        Caption = "C Pe - pen 12"
        Left = 142
        Top = 214
        TabOrder = 17
    END CREATE
    CREATE CheckBox16 AS QCHECKBOX
        Caption = "C Ack - pen 10"
        Left = 142
        Top = 238
        TabOrder = 18
    END CREATE
    CREATE Button1 AS QBUTTON
        Caption = "&Ready"
	  OnClick = ready
        Left = 142
        Top = 316
        TabOrder = 19
    END CREATE
    CREATE RadioButton3 AS QRADIOBUTTON
        Caption = "LPT3 - &H278"
        OnClick= P278
        Left = 142
        Top = 94
        TabOrder = 2
    END CREATE
    CREATE RadioButton1 AS QRADIOBUTTON
        Caption = "&LPT1 - H378"
        OnClick= P378
        Left = 142
        Top = 46
    END CREATE
    CREATE CheckBox17 AS QCHECKBOX
        Caption = "C Busy - pen 11"
        Left = 142
        Top = 264
        TabOrder = 20
    END CREATE
END CREATE

'******************
'* Strobe - pen 1 *
'******************

SUB pen1
    IF CheckBox9.Checked THEN
       OUT port+2, (INP(port+2) AND 254)
    ELSE  
       OUT port+2, (INP(port+2) OR 1)
    END IF
END SUB

'*******************
'* Auto F - pen 14 *
'*******************

SUB pen14
    IF CheckBox10.Checked THEN
       OUT port+2, (INP(port+2) AND 253)
    ELSE	
       OUT port+2, (INP(port+2) OR 2)
    END IF
END SUB

'*****************
'* Init - pen 16 *
'*****************

SUB pen16
    IF CheckBox11.Checked THEN
       OUT port+2, (INP(port+2) OR 4)
    ELSE	
       OUT port+2, (INP(port+2) AND 251)
    END IF
END SUB

'*******************
'* Sel In - pen 17 *
'*******************

SUB pen17
    IF CheckBox12.Checked THEN
       OUT port+2, (INP(port+2) AND 247)
    ELSE	
       OUT port+2, (INP(port+2) OR 8)
    END IF
END SUB

'**************
'* D0 - pen 2 *
'**************

SUB pen2
    IF CheckBox1.Checked THEN
       OUT port, (INP(port) OR 1)
    ELSE	
       OUT port, (INP(port) AND 254)
    END IF
END SUB

'**************
'* D1 - pen 3 *
'**************

SUB pen3
    IF CheckBox2.Checked THEN
       OUT port, (INP(port) OR 2)
    ELSE	
       OUT port, (INP(port) AND 253)
    END IF
END SUB

'**************
'* D2 - pen 4 *
'***************

SUB pen4
    IF CheckBox3.Checked THEN
       OUT port, (INP(port) OR 4)
    ELSE	
       OUT port, (INP(port) AND 251)
    END IF
END SUB

'**************
'* D3 - pen 5 *
'**************

SUB pen5
    IF CheckBox4.Checked THEN
       OUT port, (INP(port) OR 8)
    ELSE	
       OUT port, (INP(port) AND 247)
    END IF
END SUB

'**************
'* D4 - pen 6 *
'**************

SUB pen6
    IF CheckBox5.Checked THEN
       OUT port, (INP(port) OR 16)
    ELSE	
       OUT port, (INP(port) AND 255-16)
    END IF
END SUB

'**************
'* D5 - pen 7 *
'**************

SUB pen7
    IF CheckBox6.Checked THEN
       OUT port, (INP(port) OR 32)
    ELSE	
       OUT port, (INP(port) AND 255-32)
    END IF
END SUB

'**************
'* D6 - pen 8 *
'**************

SUB pen8
    IF CheckBox7.Checked THEN
       OUT port, (INP(port) OR 64)
    ELSE	
       OUT port, (INP(port) AND 255-64)
    END IF
END SUB

'**************
'* D7 - pen 9 *
'**************

SUB pen9
    IF CheckBox8.Checked THEN
       OUT port, (INP(port) OR 128)
    ELSE	
       OUT port, (INP(port) AND 255-128)
    END IF
END SUB

'********
'* LPT1 *
'********

SUB P378
 port=&H378
 status
END SUB

'**********
'* LPT1/2 *
'**********

SUB P3BC
 port=&H3BC
 status
END SUB

'********
'* LPT3 *
'********

SUB P278
 port=&H278
 status
END SUB

'******************
'* End of program *
'******************

SUB ready
 Form.Close
END SUB

'**************************
'* Refresh data on screen *
'**************************

SUB status

'***********
'* Outputs *
'***********

 CheckBox1.Checked=((INP(port) AND 1)/1)
 CheckBox2.Checked=((INP(port) AND 2)/2)
 CheckBox3.Checked=((INP(port) AND 4)/4)
 CheckBox4.Checked=((INP(port) AND 8)/8)
 CheckBox5.Checked=((INP(port) AND 16)/16)
 CheckBox6.Checked=((INP(port) AND 32)/32)
 CheckBox7.Checked=((INP(port) AND 64)/64)
 CheckBox8.Checked=((INP(port) AND 128)/128)

 CheckBox13.Checked=((INP(port+1) AND 8)/8)
 CheckBox14.Checked=((INP(port+1) AND 16)/16)
 CheckBox15.Checked=((INP(port+1) AND 32)/32)
 CheckBox16.Checked=((INP(port+1) AND 64)/64)
 CheckBox17.Checked=(1-((INP(port+1) AND 128)/128))

'*********
'*Inputs *
'*********

 CheckBox9.Checked=(1-(INP(port+2) AND 1)/1)
 CheckBox10.Checked=(1-(INP(port+2) AND 2)/2)
 CheckBox11.Checked=((INP(port+2) AND 4)/4)
 CheckBox12.Checked=(1-(INP(port+2) AND 8)/8)
END SUB

'***************************************
'* Timer for refesh the data on screen *
'***************************************

SUB TimerOver
    Timer1.Interval = 400
  
  '**************************
  '* refresh data on screen *
  '**************************

   status
END SUB

'*************************
'* Default on LPT1 &H378 *
'*************************

port=&H378
RadioButton1.Checked=1

'************************************
'* Timer for refresh data on screen *
'************************************

Timer1.Interval = 400
Timer1.Enabled = 1         
Timer1.OnTimer = TimerOver

'*****************
'* Start program *
'*****************

Form.ShowModal
