mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-26 09:54:20 +00:00
Upload
Digital Research
This commit is contained in:
107
CPM OPERATING SYSTEMS/CPM 68K/1.2 SOURCE/6/TTYINRAW.C
Normal file
107
CPM OPERATING SYSTEMS/CPM 68K/1.2 SOURCE/6/TTYINRAW.C
Normal file
@@ -0,0 +1,107 @@
|
||||
/***************************************************************************
|
||||
* 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 */
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user