/* DOS program to set the output voltage of the analog port. The output voltage is passed as a parameter on the calling line. Syntax: ANOUT RANGE OUTPUT Optional LPT port number - defaults to LPT1 RANGE Voltage range setting of jumper "J1" - 2.5 or 10 OUTPUT Output voltage setting - must be less than RANGE On exit: ERRORLEVEL = 0 if all OK ERRORLEVEL = 1 if parameter error */ #include #include #include #define LPT1 0x00400008 /* BIOS printer address entries */ #define LPT2 0x0040000a #define LPT3 0x0040000c #define LPT4 0x0040000e #define ENABLE 0x02 /* Strobe bit for analog output port */ /*------------------ Program starts here -------------------------------*/ int main(int argc, char *argv[]) { unsigned int port; /* LPT port address */ float output, /* Output voltage */ range; /* Range setting */ unsigned int far *bios_printer_addr; unsigned char status, /* Status of control port */ data; /* Hex output data */ int lpt_number; /* LPT port number */ switch(argc) { case 1: printf("Set the output voltage of the analog port.\n\n"); printf("ANOUT RANGE OUTPUT\n\n"); printf(" Optional LPT port number - defaults to LPT1.\n"); printf("RANGE Voltage range - 2.5 or 10 volts.\n"); printf("OUTPUT Output voltage setting - must be less than RANGE.\n\n"); printf("On exit, ERRORLEVEL = 1 if parameter error.\n"); exit(1); case 2: case2: puts("No output voltage specified"); exit(1); case 3: if (argv[1][0]=='/') goto case2; port=*(bios_printer_addr=LPT1); if (port==NULL) { puts("LPT1 does not exist"); exit(1); } sscanf(argv[1],"%f",&range); /* Get range setting */ sscanf(argv[2],"%f",&output); /* Get output value */ break; case 4: 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],"%f",&range); sscanf(argv[3],"%f",&output); break; case 2 : port=*(bios_printer_addr=LPT2); if (port==NULL) { puts("LPT2 does not exist"); exit(1); } sscanf(argv[2],"%f",&range); sscanf(argv[3],"%f",&output); break; case 3 : port=*(bios_printer_addr=LPT3); if (port==NULL) { puts("LPT3 does not exist"); exit(1); } sscanf(argv[2],"%f",&range); sscanf(argv[3],"%f",&output); break; case 4 : port=*(bios_printer_addr=LPT4); if (port==NULL) { puts("LPT4 does not exist"); exit(1); } sscanf(argv[2],"%f",&range); sscanf(argv[3],"%f",&output); break; default: puts("Invalid printer port"); exit(1); } } if ((range!=2.5) && (range!=10)) { puts("Invalid range setting"); exit(1); } if (output<0) { puts("Cannot have negative output"); exit(1); } if (output>range) { puts("Output voltage > range"); exit(1); } data=(char)(output/range*255); /* Calculate hex output value */ status=inportb(port+2); /* Save control port status */ outportb(port,data); /* Set up hex output */ delay(1); outportb(port+2,status&~ENABLE); /* "CE" high */ delay(1); outportb(port+2,status|ENABLE); /* "CE" low */ delay(1); outportb(port+2,status&~ENABLE); /* "CE" high */ return 0; }