home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The C Users' Group Library 1994 August
/
wc-cdrom-cusersgrouplibrary-1994-08.iso
/
listings
/
v_08_12
/
8n12044a
< prev
next >
Wrap
Text File
|
1990-10-15
|
4KB
|
123 lines
/*
* CHAR.C
*
* main interrupt routine; also keyboard read routine
*/
#include "char.h"
/*-------- Prototypes ---------*/
/* handle init call */
extern void char_init (void);
/* look up key code for reassignment */
extern char *k_seek (void);
/* read the keyboard */
extern void rawread (void);
/* see if char is available at the keyboard */
extern int rawstat (void);
/* write byte into ring buffer */
extern void r_write (char);
/* write character to screen */
extern void w_putc (void);
/*
* rd_getc()
*
* rd_getc() reads a character from the keyboard, hanging until
* there is one. If the character has been reassigned, copy the
* reassignment buffer into the ring buffer. Otherwise, write
* the character itself (with leading nul byte for extended
* keys) into the ring buffer
*/
void rd_getc()
{
if (r_index == w_index)
{
rawread();
if (k_seek())
{
for (k = 0; k < *len; k++)
r_write(*ptr++);
}
else
{
if (keycheck & 0177400)
r_write(0);
r_write(((char) keycheck) & 0000377);
}
}
}
/*
* interrupt()
*
* interrupt() takes care of the commands as they come in from
* the request header. Of all the commands, only the device
* initialization call is a separate function; this reduces
* stack overhead. char_init() is a separate function, alone in
* its own module, so that it can report its own address as the
* end of the driver.
*/
void interrupt()
{
count = rh->count;
transfer = rh->transfer;
switch (rh->command)
{
case 0: /* initialization */
char_init();
break;
case 4: /* read */
while (count)
{
rd_getc();
*transfer++ = r_buf[ r_index++ ] & 000377;
r_index &= RLIMIT;
count--;
}
rh->status = DONE;
break;
case 5: /* non-destructive read */
if (r_index == w_index)
{
if (!rawstat())
{
rh->status = BUSY | DONE;
break;
}
rd_getc();
}
rh->status = DONE;
rh->data = r_buf[ r_index ];
break;
case 7: /* flush input buffers */
r_index = w_index = 0;
while (rawstat())
rawread();
rh->status = DONE;
break;
case 8: /* write */
case 9: /* write with verify */
while (count)
{
outchar = *transfer++;
w_putc();
count--;
}
case 1: /* media check */
case 2: /* build parameter block */
case 6: /* input status */
case 10: /* output status */
case 11: /* flush output buffers */
rh->status = DONE;
break;
case 3: /* ioctl read */
default:
rh->status = UNKNOWN_COMMAND | ERROR | DONE;
break;
}
}