|
|
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.