home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / listings / v_10_09 / 1009056a < prev    next >
Text File  |  1992-05-20  |  6KB  |  159 lines

  1. /*                    Listing 1                     */
  2. /*****************************************************
  3.                 Name: PAR_COMM.C
  4.          Description: Library of functions to support
  5.                       bidirection communications with
  6.                       PC parallel port.
  7. Global Function List: correct_bios_status
  8.                       correct_port_status
  9.                       get_prn_port
  10.                       in_bios_nibble
  11.                       in_bios_status
  12.                       in_port_nibble
  13.                       in_port_status
  14.                       invert_bit
  15.          Portability: MS-DOS Microsoft C or Borland C
  16. *****************************************************/
  17.  
  18. /* Standard C */
  19. #include <bios.h>
  20. #include <conio.h>
  21.  
  22. /* Own */
  23. #include <par_comm.h>
  24. #if !defined ( FAR )
  25.    #define FAR _far
  26. #endif
  27.  
  28. /*****************************************************
  29.        Name: correct_bios_status
  30.  Parameters: Status - printer port status
  31.      Return: Corrected printer port status
  32. Description: Corrects the printer status that was
  33.              obtained using the BIOS so it matches
  34.              the actual line levels.
  35. *****************************************************/
  36. unsigned correct_bios_status( unsigned Status )
  37.    {
  38.    Status = invert_bit( Status, 7 );
  39.    Status = invert_bit( Status, 6 );
  40.    return ( Status );
  41.    }
  42.  
  43. /*****************************************************
  44.        Name: correct_bios_status
  45.  Parameters: Status - printer port status
  46.      Return: Corrected printer port status
  47. Description: Corrects the printer status that was
  48.              obtained directly from the port so it
  49.              matches the actual line levels.
  50. *****************************************************/
  51. unsigned correct_port_status( unsigned Status )
  52.    {
  53.    Status = invert_bit( Status, 7 );
  54.    Status = invert_bit( Status, 3 );
  55.    return ( Status );
  56.    }
  57.  
  58. /*****************************************************
  59.        Name: get_prn_port
  60.  Parameters: PrnNum - number of the printer device
  61.              LPT1 - 0, LPT2 - 1, LPT3 - 2, LPT4 - 3
  62.      Return: printer port number
  63. Description: Retrives the printer port number from
  64.              the PC's printer data table.
  65. *****************************************************/
  66. unsigned get_prn_port( unsigned PrnNum )
  67.    {
  68.    return ( *((unsigned FAR *)(( 0x40LU << 16 ) |
  69.          ( 0x08U + 2 * PrnNum ))));
  70.    }
  71.  
  72. /*****************************************************
  73.        Name: in_bios_nibble
  74.  Parameters: PrnPort - address of printer port
  75.      Return: Nibble read in from printer port
  76. Description: Inputs a nibble from a printer port using
  77.              a call to the PC's BIOS.  The
  78.              status lines are read and corrected.  The
  79.              high nibble of the status lines is stored
  80.              in the low nibble of the return value.
  81.              Bit 3 of the status is used to set the
  82.              sign bit of the return value.
  83. *****************************************************/
  84. unsigned in_bios_nibble( unsigned PrnNum )
  85.    {
  86.    unsigned Nibble;
  87.  
  88.    Nibble = _bios_printer( _PRINTER_STATUS,
  89.          PrnNum, 0 );
  90.    Nibble = correct_bios_status( Nibble );
  91.    Nibble = ( Nibble << ( sizeof( unsigned ) * 8 - 4
  92.          )) | ( Nibble >> 4 );
  93.    return ( Nibble );
  94.    }
  95.  
  96. /*****************************************************
  97.        Name: in_bios_status
  98.  Parameters: PrnNum - number of the printer device
  99.              LPT1 - 0, LPT2 - 1, LPT3 - 2, LPT4 - 3
  100.      Return: printer status bits in low byte
  101. Description: Gets the status byte from a printer port
  102.              using the BIOS.
  103. *****************************************************/
  104. unsigned in_bios_status( unsigned PrnNum )
  105.    {
  106.    return ( _bios_printer( _PRINTER_STATUS,
  107.          PrnNum, 0 ));
  108.    }
  109.  
  110. /*****************************************************
  111.        Name: in_port_nibble
  112.  Parameters: PrnPort - address of printer port
  113.      Return: Nibble read in from printer port
  114. Description: Inputs a nibble from a printer port
  115.              with a direct read from the port.  The
  116.              status lines are read and corrected.  The
  117.              high nibble of the status lines is stored
  118.              in the low nibble of the return value.
  119.              Bit 3 of the status is used to set the
  120.              sign bit of the return value.
  121. *****************************************************/
  122. unsigned in_port_nibble( unsigned PrnPort )
  123.    {
  124.    unsigned Nibble;
  125.  
  126.    Nibble = in_port_status( PrnPort );
  127.    Nibble = correct_port_status( Nibble );
  128.    Nibble = ( Nibble << ( sizeof( unsigned ) * 8 - 4
  129.          )) | ( Nibble >> 4 );
  130.    return ( Nibble );
  131.    }
  132.  
  133. /*****************************************************
  134.        Name: in_port_status
  135.  Parameters: PrnPort - printer port number
  136.      Return: printer status bits in low byte
  137. Description: Gets the status byte from a printer port
  138.              and masks off the lower three bits.
  139. *****************************************************/
  140. unsigned in_port_status( unsigned PrnPort )
  141.    {
  142.    return ( 504 /* 11111000 */ & inp( PrnPort + 1 ));
  143.    }
  144.  
  145. /*****************************************************
  146.        Name: invert_bit
  147.  Parameters: Val - value to invert a single bit in
  148.              Bit - number of bit in Val to invert
  149.      Return: Val with Bit inverted
  150. Description: Inverts a single designated bit in Val.
  151. *****************************************************/
  152. unsigned invert_bit( unsigned Val, unsigned Bit )
  153.    {
  154.    return (( Val & ~( 1U << Bit )) |
  155.          (( !(( Val >> Bit ) & 1U )) << Bit ));
  156.    }
  157.  
  158. /* End of File */
  159.