Files
Sepp J Morris 31738079c4 Upload
Digital Research
2020-11-06 18:50:37 +01:00

108 lines
3.8 KiB
C
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/***************************************************************************
* Function: ttyinraw()
*
* Usage: ret = ttyinraw(chktype)
*
* Where: WORD ret Value determined by chktype parameter.
* WORD chktype What type of activity to check for, as in:
* 0 - ret==input_char (do NOT echo), wait for a key to be
* pressed. Appropriate for Raw I/O.
* 1 - ret==pressed_key (do NOT echo) if any key pressed,
* ret==0 if no key has been pressed.
* This would be appropriate for editors and other
* interactive programs.
* 2 - ret==input_char (NO echo) if user tries to interrupt,
* ret==0 otherwise. Always 0 for any O.S.
* with live CTRL C or equivalent.
* this allows compute bound programs to check kb
* periodically to see if user wants to interrupt,
* and live keyboard type-ahead if appropriate for O.S.)
* 3 - ret==1 if any key pressed,
* ret==0 otherwise. Appropriate for checking console
* status only, since the character is NOT input.
*
*****************************
*
* Function: _ttyinraw()
*
* Usage: retchar = _ttyinraw(do_wait)
*
* Where: WORD do_wait; Wait for input if non-zero.
* WORD retchar; Character input from keyboard (no echo).
* Notes:
* Handles single character input independent of (CP/M) OS.
* Problem is that different OSs handle Raw Input in different ways.
* CPM-86 and CPM68K use only 0xFF, but CPM68K waits for a character.
* Hard loops in multi-tasking, however, waste CPU cycles, so MPM and
* Concurrent use 0xFD.
*
****************************
*
* Edits:
* 28-Feb-84 whf Add ttyinraw().
* 26-Jan-84 whf simplify for 68k compiler.
* 8-Dec-83 whf handle PC-DOS like CPM-86
****************************************************************************/
#include "portab.h"
#include "osif.h"
#include "osiferr.h"
#include "osattr.h"
/****************************/
MLOCAL WORD CharInReq = 0xFF; /* Default CONIO Char In Rqs*/
/****************************/
WORD _ttyinraw(DoWait) /* */
WORD DoWait; /* Wait for key press? */
{ /****************************/
REG WORD ic; /* Input Char */
/* */
while((ic=__OSIF(CONIO,CharInReq))==0) /* Wait in loop if needed */
{ /* */
if( !DoWait ) /* Don't wait for keypress? */
break; /* no, don't wait. */
#if CPM /*================================================================*/
/* This goes inside the loop; for Concurrent, it will be called */
/* only once, while for other O.S.'s, it doesn't matter what we */
/* do while we're waiting for a char. */
__OSIF(S_BDOSVER,0); /* Puts AX in __cpmrv */
if( __cpmrv & 0x0500 ) /* Concurrent or MPM */
CharInReq = 0xFD; /* Change Char Input Parm */
#endif /*================================================================*/
} /* */
return ic; /* */
} /****************************/
/***************************************************************************
****************************************************************************/
WORD ttyinraw(chktype) /* CLEAR FUNCTION ***********/
WORD chktype; /* type of input */
{
WORD ch; /* character input */
switch(chktype) {
case 2: /* Check for interrupt? */
if( os_interrupts ) /* O.S. looks for CTRL C? */
return 0; /* yes, no interrupt check*/
/* no, drop thru... */
case 0: /* Return character or 0 */
return _ttyinraw(0); /* 0 means don't wait */
case 3: /* Return console status */
return __OSIF(C_STAT,0); /* 1 if key pressed */
default:
case 1: /* Return char with wait */
return _ttyinraw(1); /* 1 means wait */
}
}
 return _ttyinraw(1); /* 1 means wait */
}
}
 return _ttyinraw(1); /* 1 means wait */
}
}