|
|
1.1 ! root 1: ! 2: rioini(int,int); ! 3: 1st arg: can be 1-4 (com port) or base address, or 0 to terminate ! 4: 2nd arg: can be irq line (presently 1-7) or 0 (com1/3=4, com2/4=3) ! 5: returns: -1 if error, else 0 ! 6: setbaud(int); ! 7: returns: -1 if rioini() not called first, else 0 ! 8: dtr(char); ! 9: argument: 0 off, 1 on, 2-n off then wait n seconds for dcd off ! 10: returns: -1 if rioini() not called or timeout, else 0 ! 11: outcom(int); ! 12: argument: character to output (low 8 bits) ! 13: returns: state (high 8 bits) ! 14: incom(void); ! 15: returns: character from input buffer (low 8 bits), state (high 8 bits) ! 16: rioctl(int); ! 17: argument: action (see below) ! 18: returns: mode or state (high 8 bits), status (low 8 bits) ! 19: rioifc(char); ! 20: argument: defines what interrupts to intercept (see below) ! 21: returns: -1 if no action taken, else 0 ! 22: ! 23: ! 24: prototypes and equates: ! 25: ------------------------------------------------------------------------------ ! 26: int rioini(int com,int irq); /* initialize com,irq */ ! 27: int setbaud(int rate); /* set baud rate */ ! 28: int rioctl(int action); /* remote i/o control */ ! 29: int dtr(char onoff); /* set/reset dtr */ ! 30: int outcom(int ch); /* send character */ ! 31: int incom(void); /* receive character */ ! 32: int rioifc(char intcode); /* local i/o redirection */ ! 33: ! 34: /* i/o mode and state flags */ ! 35: ! 36: #define CTSCK 0x800 /* check cts (mode only) */ ! 37: #define ABORT 0x400 /* check for ^C (mode), aborting (state) */ ! 38: #define PAUSE 0x200 /* check for ^S (mode), pausing (state) */ ! 39: #define NOINP 0x100 /* input buffer empty (incom only) */ ! 40: ! 41: /* status flags */ ! 42: ! 43: #define DCD 0x80 /* DCD on */ ! 44: #define CTS 0x10 /* CTS on */ ! 45: #define RXLOST 1 /* Receive buffer overflow */ ! 46: ! 47: /* rioctl() arguments */ ! 48: /* returns mode or state flags in high 8 bits, status flags in low 8 bits */ ! 49: ! 50: /* the following return mode in high 8 bits */ ! 51: #define IOMODE 0 /* no operation */ ! 52: #define IOSM 1 /* i/o set mode flags */ ! 53: #define IOCM 2 /* i/o clear mode flags */ ! 54: /* the following return state in high 8 bits */ ! 55: #define IOSTATE 4 /* no operation */ ! 56: #define IOSS 5 /* i/o set state flags */ ! 57: #define IOCS 6 /* i/o clear state flags */ ! 58: #define IOFB 0x308 /* i/o buffer flush */ ! 59: #define IOFI 0x208 /* input buffer flush */ ! 60: #define IOFO 0x108 /* output buffer flush */ ! 61: #define IOSE 9 /* i/o set error flags */ ! 62: ! 63: /* rioifc() arguments */ ! 64: ! 65: #define INT29 1 /* copy int 29h output to remote */ ! 66: #define INT29B 3 /* copy int 29h, use BIOS locally (_putlc) */ ! 67: #define INT16 0x10 /* return remote chars to int 16h calls */ ! 68: #define INTCLR 0 /* release int 16h, int 29h */ ! 69: ------------------------------------------------------------------------------ ! 70: You can make whatever permutations of these make things easy, e.g., ! 71: ! 72: #define INCHK IOSM|PAUSE|ABORT /* check for ^C and ^S (mode) */ ! 73: #define NOCHK IOCM|PAUSE|ABORT /* turn off ^C and ^S checking */ ! 74: ! 75: Then rioctl(INCHK); turns checking on, and rioctl(NOCHK); turns it off. ! 76: ! 77: A sample calling sequence: ! 78: ! 79: rioini(3,0); ! 80: setbaud(2400); ! 81: rioctl(INCHK); ! 82: i=incom(); ! 83: if (!i&NOINP) putlc(i); ! 84: else if (i&ABORT) { ! 85: rioctl(IOCS|ABORT); /* reset abort flag */ ! 86: lprintf("YAAA!\n"); } ! 87: rioifc(INT29B|INT16); ! 88: spawn(or something); ! 89: rioifc(INTCLR); /* this puts the original int29/int16 vectors back */ ! 90: rioini(0,0); /* this puts the original int0b vector back ! 91: and will release the irq line */ ! 92: ! 93: Note: incom() returns 500h (not 400h) when in an abort wait, because the ! 94: input buffer is always cleared. If output is paused, incom may return ! 95: 2xxh or 300h, depending on whether there is a character in the input ! 96: buffer. Pause (200h) and abort (400h) will never be set at the same ! 97: time. ! 98: ! 99: No questions, right? Clear as a sky of azure blue?
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.