home *** CD-ROM | disk | FTP | other *** search
- #ifdef __linux__
- #include <unistd.h>
- #include <asm/io.h>
- #endif __linux__
- #include "prtrans.h"
-
- unsigned baseaddr, stataddr;
-
- int prinit (void) {
- #ifdef __linux__
- if (ioperm (baseaddr, 2, 1))
- return -1;
- #endif /* __linux__ */
-
- outb(128, baseaddr); /* set the -FLAG signal to high */
- stataddr = baseaddr + 1;
-
- return 0;
- }
-
- void prclose (void) {
- }
-
- void output (unsigned char byte) {
- send (&byte, 1);
- }
-
- unsigned input (void) {
- unsigned char byte;
-
- receive (&byte, 1);
- return byte;
- }
-
- unsigned wait_input (void) {
- register unsigned char data;
-
- outb(0, baseaddr);
- while (!(128 & inb(stataddr)))
- usleep (SLEEP_TIME); /* wait between each try */
-
- outb(128, baseaddr);
- data = (inb(stataddr) & 0x78) >> 3;
- outb(0, baseaddr);
- while (128 & inb(stataddr));
- data |= (inb(stataddr) & 0x78) << 1;
- outb(128, baseaddr);
-
- return data;
- }
-
- #if !defined(__i386__) && !defined(__GNU_C__)
- void send (unsigned char *buffer, unsigned length) {
- register unsigned char byte;
-
- while (length--) {
- byte = *buffer++;
-
- outb(byte & 0x0f, baseaddr);
- while (!(128 & inb(stataddr)));
- outb(128, baseaddr);
- outb(byte >> 4, baseaddr);
- while (128 & inb(stataddr));
- outb(128, baseaddr);
- }
- }
- #else /* __i386__ && __GNU_C__ */
- void send (unsigned char *buffer, unsigned length) {
- asm ("push %%ebp
- movw _baseaddr,%%dx
- movl %1,%%ecx
- movl %0,%%ebp
-
- sloop: movb (%%ebp),%%al
- andb $0x0f,%%al
- outb %%al,%%dx
- incw %%dx
-
- ewait: inb %%dx,%%al
- testb $0x80,%%al
- jz ewait
-
- decw %%dx
- movb $0x80,%%al
- outb %%al,%%dx
- movb (%%ebp),%%al
- shrb $4,%%al
- outb %%al,%%dx
- incw %%dx
-
- zwait: inb %%dx,%%al
- testb $0x80,%%al
- jnz zwait
-
- decw %%dx
- movb $0x80,%%al
- outb %%al,%%dx
-
- inc %%ebp
- loop sloop
- pop %%ebp"
- : /* no outputs */
- : "g" (buffer), "g" (length)
- : "ax", "ecx", "dx");
- }
- #endif /* __i386__ && __GNU_C__ */
-
- #if !defined(__i386__) && !defined(__GNU_C__)
- void receive (unsigned char *buffer, unsigned length) {
- register unsigned char data;
-
- while (length--) {
- outb(0, baseaddr);
- while (!(128 & inb(stataddr)));
- outb(128, baseaddr);
- data = (inb(stataddr) & 0x78) >> 3;
- outb(0, baseaddr);
- while (128 & inb(stataddr));
- *buffer++ = data | ((inb(stataddr) & 0x78) << 1);
- outb(128, baseaddr);
- }
- }
- #else /* __i386__ && __GNU_C__ */
- void receive (unsigned char *buffer, unsigned length) {
- asm ("push %%ebp
- movw _baseaddr,%%dx
- movl %1,%%ecx
- movl %0,%%ebp
-
- rloop: xorb %%al,%%al
- outb %%al,%%dx
- incw %%dx
-
- dwait: inb %%dx,%%al
- testb $0x80,%%al
- jz dwait
-
- andb $0x78,%%al
- shrb $3,%%al
- movb %%al,(%%ebp)
- decw %%dx
- movb $0x80,%%al
- outb %%al,%%dx
- xorb %%al,%%al
- outb %%al,%%dx
- incw %%dx
-
- vwait: inb %%dx,%%al
- testb $0x80,%%al
- jnz vwait
-
- andb $0x78,%%al
- shlb $1,%%al
- orb %%al,(%%ebp)
- decw %%dx
- movb $0x80,%%al
- outb %%al,%%dx
-
- inc %%ebp
- loop rloop
- pop %%ebp"
- : /* no outputs */
- : "g" (buffer), "g" (length)
- : "ax", "ecx", "dx");
- }
- #endif /* __i386__ && __GNU_C__ */
-