/*
	.title inkey
;+
; index Read character from the keyboard
;
; usage
;	int inkey(&chara, &scancode, nowait)
;
; in
;   	int nowait;
;
; out
; 	char chara;
;	int  scancode;
;
; Description
;
;    this function reads the keyboard. The read can be wait or
;    nowait. With wait I/O a key is always read and the function always
;    returns with a true value. With no-wait if no key was pressed the
;    function would return with a false value. If a key is pressed in
;    no-wait mode, a wait read with guaranteed success is issued to
;    make sure that the keyboard buffer is updated accordingly.
;
;    When a key is read, a character code in character form , and a scan
;    code in int form is returned. See the Technical Reference Manual
;    pages 2-16 thru 2-17, and Appendix C for the codes. For the function
;    keys and sometimes the numeric key pad, there may not be a character
;    code returned, the value inserted is the null character, or 0
;
; status
;
; bugs
;
; updates
;	Date	Vers	Who	Description
;	8/31/83 0001	CMC	Initial version
;
;
;   Communications Programming Inc.
;   C. M. Cheng 8/83
;-
*/

#include "csig.h"

int inkey(chara, scancode, nowait)

char *chara;
int *scancode, nowait;

{

    int intnum;                             /* INTERRUPT NUMBER */
    int al, ah, flg;                       /* WORK VARIABLES */
    int inreg[4], outreg[4];                /* I/O REGISTERS */
    char *cax;

    if (nowait == 0)
       { al = 0; ah = 0; }
     else
       { al = 0, ah = 1; }
    inreg[0] = (ah << 8) + al;              /* FORMULATE AX */
    intnum = 22;                            /* FOR KEYNOARD */
                                            /*   INTERRUPT CALL */
    flg = sysint(intnum, &inreg, &outreg);
    if ( (nowait != 0) &&                   /* NOTHING AVAIL. ON */
         ( (flg & zf) != 0) )               /*   NOWAIT I/O */
          return(false);
    if (nowait != 0)                        /* SOMETHING THERE ON */
       {                                    /*    NOWAIT I/O, USE   */
          inreg[0] = 0;                     /*    WAIT I/O TO READ  */
          flg = sysint(intnum, &inreg, &outreg );  /*  IT FOR SYSTEM   */
       }                                    /*    POINTER SAKE      */
    cax = &outreg[0];
    *chara = *cax;
    *scancode = outreg[0] >> 8;
    return(true);
}

                                                                                                                           