



#ifndef _PARALLEL_H
  #define _PARALLEL_H


  #define PARALLEL_D0       0
  #define PARALLEL_D1       1
  #define PARALLEL_D2       2
  #define PARALLEL_D3       3
  #define PARALLEL_D4       4
  #define PARALLEL_D5       5
  #define PARALLEL_D6       6
  #define PARALLEL_D7       7

  #define PARALLEL_STROBE   0 /* hardware inverted */
  #define PARALLEL_LINEFEED 1 /* hardware inverted */
  #define PARALLEL_RESET    2
  #define PARALLEL_SELECT   3

  #define PARALLEL_OUT_NORMALIZED 0x03

  #define PARALLEL_ERROR    3
  #define PARALLEL_SELECTIN 4 /* hardware inverted */
  #define PARALLEL_PAPEROUT 5
  #define PARALLEL_ACK      6
  #define PARALLEL_BUSY     7 /* hardware inverted */
  
 #define PARALLEL_IN_NORMALIZED 0x90
 
   //----------------------------------------------------------

  #define UNIPPORT_D0       0
  #define UNIPPORT_D1       1
  #define UNIPPORT_D2       2
  #define UNIPPORT_D3       3
  #define UNIPPORT_D4       4
  #define UNIPPORT_D5       5
  #define UNIPPORT_D6       6
  #define UNIPPORT_D7       7

  #define UNIPPORT_STROBE   8  /* hardware inverted */
  #define UNIPPORT_LINEFEED 9  /* hardware inverted */
  #define UNIPPORT_RESET    10
  #define UNIPPORT_SELECT   11

  #define UNIPPORT_ERROR    12
  #define UNIPPORT_SELECTIN 13 /* hardware inverted */
  #define UNIPPORT_PAPEROUT 14
  #define UNIPPORT_ACK      15
  #define UNIPPORT_BUSY     16 /* hardware inverted */



  typedef struct parallel_s {
    long int     BaseAddress;  
    unsigned int ControlInversions ;
    unsigned int StatusInversions;
    unsigned int DataInversions;
    unsigned int LastControl;
    unsigned int LastData;
  } parallel_t;


  parallel_t *  parallel_Init            (long int base_address) ;
  void          parallel_Destroy         (parallel_t * self) ;
  unsigned int  parallel_ReadData        (parallel_t * self) ;
  unsigned int  parallel_ReadStatus      (parallel_t * self) ;
  unsigned int  parallel_ReadControl     (parallel_t * self) ;
  int           parallel_ReadDataBit     (parallel_t * self, int bit) ;
  int           parallel_ReadControlBit  (parallel_t * self, int bit) ;
  int           parallel_ReadStatusBit   (parallel_t * self, int bit) ;
  void          parallel_WriteControl    (parallel_t * self, unsigned int value) ;
  void          parallel_WriteData       (parallel_t * self, unsigned int value) ;
  void          parallel_WriteDataBit    (parallel_t * self, int bit, unsigned value) ;
  void          parallel_WriteControlBit (parallel_t * self, int bit, unsigned value) ;
  unsigned long parallel_Read            (parallel_t * self) ;
  void          parallel_Write           (parallel_t * self, unsigned long In ) ;
  int           parallel_ReadBit         (parallel_t * self, int bit);
  void          parallel_WriteBit        (parallel_t * self, int bit, unsigned value);


#endif
