/* DOS program to set the digital output port. Syntax: DOUT HEX_BYTE Optional LPT port number - defaults to LPT1 HEX_BYTE 8-bit hex value to write to output port On exit: ERRORLEVEL = 0 if all OK ERRORLEVEL = 1 if parameter error or invalid LPT port */ #include #include #include #define LPT1 0x00400008 /* BIOS printer address entries */ #define LPT2 0x0040000a #define LPT3 0x0040000c #define LPT4 0x0040000e #define STROBE 0x01 /* Strobe bit for digital output port */ /*----------------------------------------------------------------------*/ int main(int argc, char *argv[]) { unsigned int port, /* LPT port address */ data; /* Hex output data */ unsigned int far *bios_printer_addr; char status; /* Holds status of control port */ int lpt_number; /* Holds LPT port number passed via command line */ switch(argc) { case 1: printf("Set the digital output port to the specified hex value.\n\n"); printf("DOUT HEX_BYTE\n\n"); printf(" Optional LPT port number - defaults to LPT1.\n"); printf("HEX_BYTE 8-bit hex value to write to output port.\n\n"); printf("On exit, ERRORLEVEL = 1 if parameter error.\n"); exit(1); case 2: if (argv[1][0]=='/') { puts("Missing output data"); exit(1); } port=*(bios_printer_addr=LPT1); if (port==NULL) { puts("LPT1 does not exist"); exit(1); } sscanf(argv[1],"%x",&data); break; case 3: if (argv[1][0]=='/') lpt_number=atoi(argv[1]+1); switch(lpt_number) { case 1 : port=*(bios_printer_addr=LPT1); if (port==NULL) { puts("LPT1 does not exist"); exit(1); } sscanf(argv[2],"%x",&data); break; case 2 : port=*(bios_printer_addr=LPT2); if (port==NULL) { puts("LPT2 does not exist"); exit(1); } sscanf(argv[2],"%x",&data); break; case 3 : port=*(bios_printer_addr=LPT3); if (port==NULL) { puts("LPT3 does not exist"); exit(1); } sscanf(argv[2],"%x",&data); break; case 4 : port=*(bios_printer_addr=LPT4); if (port==NULL) { puts("LPT4 does not exist"); exit(1); } sscanf(argv[2],"%x",&data); break; default: puts("Invalid printer port"); exit(1); } } status=inportb(port+2); /* Save control port status */ outportb(port,(char)data); /* Set up data */ delay(1); outportb(port+2,status&~STROBE); /* Strobe high */ delay(1); outportb(port+2,status|STROBE); /* Strobe low */ delay(1); outportb(port+2,status&~STROBE); /* Strobe high */ return 0; }