The Enhanced Parallel Printer Port
by Dhananjay V. Gadre and Larry A. Stein


Listing One
/* Routines for Digital I/O using the Enhanced Parallel Port. Routines invoke 
EPP BIOS calls. Typical results:
Block transfer rates: 65 Mbytes in 73 secs on 486/66
*/

#include<dos.h>
#include<time.h>
#include<stdio.h>

#define FALSE 0
#define TRUE 1

void far (*pointr)();
int epp_config(void);
int epp_write_byte(unsigned char tx_value);
int epp_write_block(unsigned char *source_ptr, int count);
int epp_read_byte(unsigned char *rx_value);
int epp_read_block(unsigned char *dest_ptr, int count);

int epp_config(void)
{
unsigned char temp_ah, temp_al, temp_cl, temp_ch;
_AX=0x0200;
_DX=0;
_CH='E';
_BL='P';
_BH='P';
geninterrupt(0x17);
temp_ah=_AH;
temp_al=_AL;
temp_ch=_CH;
temp_cl=_CL;

if(temp_ah != 0) return FALSE;
if(temp_al != 0x45) return FALSE;
if(temp_ch != 0x50) return FALSE;
if(temp_cl != 0x50) return FALSE;

pointr = MK_FP(_DX , _BX);
/*printf("\nEntry Address is %Fp", pointr);*/
_AH=1;

_DL=0;
_AL=0x04;
pointr();
temp_ah=_AH;
if(temp_ah != 0) return FALSE;
return TRUE;
}

int epp_write_byte(unsigned char tx_value)
{
unsigned char temp_ah;

_AH=7;
_DL=0;
_AL=tx_value;
pointr();
temp_ah=_AH;
if(temp_ah != 0) {return FALSE;}
return TRUE;
}
int epp_write_block(unsigned char *source_ptr, int count)
{
unsigned char temp_ah;

_SI=FP_OFF(source_ptr);
_ES=FP_SEG(source_ptr);
_AH=8;
_DL=0;
_CX=count;
pointr();
temp_ah=_AH;
if(temp_ah != 0) 
{printf("\nBlock write timeout error"); return FALSE;}
return TRUE;
}
int epp_read_byte(unsigned char *rx_value)
{
unsigned char temp_ah;
_AH=9;
_DL=0;
pointr();
*rx_value=_AL;
temp_ah=_AH;
if(temp_ah != 0) {return FALSE;}
return TRUE;
}
int epp_read_block(unsigned char *dest_ptr, int count)
{
unsigned char temp_ah;

_DI=FP_OFF(dest_ptr);
_ES=FP_SEG(dest_ptr);
_AH=0x0a;
_DL=0;
_CX=count;

pointr();
temp_ah=_AH;
if(temp_ah != 0) {return FALSE;}
return TRUE;
}
main()
{
int  ret_value, ret_val;
time_t start, end;
unsigned char buf_out[10000], buf_in[10000], rx_in;

clrscr();
printf("Fast Digital I/O using the Enhanced Parallel Port");
printf("\nUses EPP BIOS Calls\nDhananjay V. Gadre\nJuly 1996");
ret_value = epp_config();
if(ret_value == FALSE) { printf("\nNo EPP"); exit(1);}
printf("\nEPP Present");

printf("\n\nWriting Data Byte");
       ret_val = epp_write_byte(0xa5);
       if (ret_val == TRUE) printf("\nWrite Byte Successful");
       else printf("\nTimeout error");
printf("\n\nWriting Data Block");
start=time(NULL);
for(ret_value=0; ret_value<1000; ret_value++)
ret_val=epp_write_block(buf_out, 52428);
end=time(NULL);
printf("\nTime taken= %d seconds for 50 Mbytes", end-start);

printf("\n\nReading Data Byte..");
ret_val=epp_read_byte(&rx_in);
 if (ret_val == TRUE) 
 printf("\nRead Data Byte Successful, %x'', rx_in);
else printf("\nRead Data byte failed");

printf("\n\nReading Data Block..");
ret_val=epp_read_block(buf_in, 1000);
 if (ret_val == TRUE) printf("\nRead Data Block Successful");
  else printf("\nRead Data block failed");
}






1



