This Text file is old! In a 🏛️Museum, an unsorted archive of (user-)pages. (Saved from Geocities in Oct-2009. The archival story: oocities.org)
--------------------------------------- (To 🚫report any bad content: archivehelp @ gmail.com)
>

#include 
#include 	/* ioperm() */
#include 
#include 
#include 

#define NANOS
#define MICROS *1000
#define MILLIS *1000000

int portbase = 0;
int position = 0;
#define MAXPOS 4
int posmask[MAXPOS] = { 1,2,4,8 };
int halfstep = 0;
long delaytime = 10 MILLIS;

static void delay(long nanos) {
	struct timespec req = { 0,nanos };
	nanosleep(&req,NULL);
}

void singlerotate(int dir) {
	int maxpos = halfstep ? (MAXPOS*2) : MAXPOS;

	if (dir) {	/* right */
		position++;
		if (position>=maxpos) position = 0;
	} else {	/* left */
		position--;
		if (position < 0) position = maxpos-1;
	}

	/* strobe off, choose multiplexer line A0 */
	outb(2,portbase+2);
	delay(delaytime);
	/* datalines */
	if (!halfstep)
		outb(~posmask[position],portbase);
	else {
		if (position & 1) {	/* position is odd */
			int pos1 = position/2;
			int pos2 = pos1+1;
			int mask;
			if (pos2 >= MAXPOS) pos2 = 0;
			mask = posmask[pos1] | posmask[pos2];
			outb(~mask,portbase);
		} else {	/* position is even */
			outb(~posmask[position/2],portbase);
		}
	}
	delay(delaytime);
	/* strobe on */
	outb(1+2,portbase+2);
	delay(delaytime);
	/* strobe off */
	outb(0,portbase+2);
	delay(delaytime);
}

void rotate(int dir,int steps) {
	/* If user just says 'l' or 'r', steps==0 */
	if (steps == 0) steps = 1;
	while (steps > 0) {
		steps--;
		singlerotate(dir);
	}
}

int main(int argc,char **argv) {
	char keybuff[80];

	while (!portbase) {
		puts("Choose parallel port: 0 lp0\t1 lpt1\t 2 lpt2");
		gets(keybuff);
		switch(keybuff[0]) {
		case '0': portbase = 0x3bc; break;
		case '1': portbase = 0x378; break;
		case '2': portbase = 0x278; break;
		}
	}

	printf("Using port base 0x%x\n",portbase);

	if (ioperm(portbase,3,1)) {
		perror("partest: trying to get port");
		puts("Check if you are root.");
		return 10;
	}

	{
		struct sched_param par = { 50 };	/* priority */
		sched_setscheduler(0, SCHED_RR, &par);
	}

	while (1) {
		int iterate = 0;
		int i;

		puts("Command?");
		puts("\tl/r left/right 1 step; #l/#r left/right # steps (e.g. 10l)");
		puts("\t#n #u #m\t delay time # nanos/micros/millis");
		puts("\tf fullstep\t\th halfstep");
		puts("\tQ quit");
		printf("delaytime %ld nanos; ",delaytime);
		puts(halfstep ? "halfstep" : "fullstep");
		fflush(stdout);

		gets(keybuff);
		for (i = 0; keybuff[i]; i++) {
			switch(keybuff[i]) {
			case 'n': delaytime = iterate NANOS; break;
			case 'u': delaytime = iterate MICROS; break;
			case 'm': delaytime = iterate MILLIS; break;
			case 'l': rotate(0,iterate); break;
			case 'r': rotate(1,iterate); break;
			case 'f': halfstep = 0; break;
			case 'h': halfstep = 1; break;
			case 'q': case 'Q':
				return 0;
			case '0': case '1': case '2': case '3': case '4':
			case '5': case '6': case '7': case '8': case '9':
				iterate *= 10;
				iterate += (keybuff[i]) - '0';
				break;
			default: printf("I don't understand command '%c'\n",keybuff[0]);
				break;
			}
		}
	}
}

Text file Source (historic): geocities.com/g1tv/linuxpar

geocities.com/g1tv

(to report bad content: archivehelp @ gmail)