home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / beehive / utilitys / chx8012b.arc / CHECKX.C < prev    next >
Text File  |  1990-07-21  |  5KB  |  158 lines

  1. /*  checkx.c -- direct bios input/output without bdos interaction
  2.  *              plus other operating system dependent functions
  3.  */
  4.  
  5. /*  copyright (c) 1986 by Jim Woolley and WoolleyWare, San Jose, CA          */
  6.  
  7. /*  vers. 1.0, 12/85 thru 4/86
  8.  *
  9.  *  vers. 1.2, 8/86
  10.  *  getchar(): add _Keymap, _Leadin, _Funkey, _Newkey, and _Savech
  11.  */
  12.  
  13. /*  this file contains:
  14.  *      getchar()
  15.  *      char ungetch( c)
  16.  *      putchar( c)
  17.  *      puts( s)
  18.  *      setlst()
  19.  *      resetlst()
  20.  *      kbhit()
  21.  *      resetdsk()
  22.  *      defdsk()
  23.  *  for use with the check register program
  24.  */
  25.  
  26. #include    "a:checks.h"                /*  see this file for further info   */
  27.  
  28. getchar()                               /*  substitute for library function  */
  29. {
  30.     char c;
  31.     int i, j, n;
  32.  
  33.     if ( _Lastch)
  34.     {
  35.         c = _Lastch;
  36.         _Lastch = 0;
  37.         return ( c);
  38.     }    
  39.     if ( _Savech[ 0])
  40.     {
  41.         c = _Savech[ 0];
  42.         _Savech[ 0] = _Savech[ 1];
  43.         _Savech[ 1] = 0;
  44.         return ( c);
  45.     }
  46.     if (( c = bios( 3)) < 32)           /*  direct keyboard input            */
  47.         c = _Keymap[ c];                /*  translate CTRL key               */
  48.     if ( c == _Leadin || c == ESC)      /*  check for _Funkey or BackTAB     */
  49.     {
  50.         _Savech[ 1] = 0;                /*  match when _Funkey[ n][ 1] = 0   */
  51.         for ( j = 0; j < 2; ++j)
  52.         {
  53.             for ( i = Dloop; i && !kbhit(); --i)
  54.                 continue;               /*  wait up to 0.1 sec for key       */
  55.             if ( !i)                    /*  if no key                        */
  56.                 break;                  /*  no match                         */
  57.             else if (( _Savech[ j] = bios( 3)) < 32)
  58.                 _Savech[ j] = _Keymap[ _Savech[ j]];
  59.             if ( c != _Leadin)
  60.                 break;                  /*  possible BackTAB                 */
  61.             for ( n = 0; n < 10; ++n)
  62.             {
  63.                 if ( _Savech[ 0] == _Funkey[ n][ 0] &&
  64.                      _Savech[ 1] == _Funkey[ n][ 1])
  65.                 {
  66.                     j = 1;              /*  force end of j loop              */
  67.                     break;              /*  matched _Funkey[ n]              */
  68.                 }
  69.                 if ( n == 10)           /*  if tried all                     */
  70.                     break;              /*  no match                         */
  71.             }
  72.         }
  73.         if ( j == 2)                    /*  if matched                       */
  74.         {
  75.             c = _Newkey[ n][ 0];
  76.             _Savech[ 0] = _Newkey[ n][ 1];
  77.             _Savech[ 1] = 0;
  78.         }
  79.         else if ( c == ESC && _Savech[ 0] == 'I')
  80.         {
  81.             c = CTRLA;                  /*  BackTAB                          */
  82.             _Savech[ 0] = 0;
  83.         }
  84.     }
  85.     return ( c);
  86. }
  87.  
  88. char ungetch( c)                        /*  substitute for library function  */
  89. char c;
  90. {
  91.     char a;
  92.  
  93.     a = _Lastch;
  94.     _Lastch = c;
  95.     return ( a);
  96. }
  97.  
  98. putchar( c)                             /*  substitute for library function  */
  99. char c;  
  100. {
  101.     if ( c == '\n')
  102.         bios( _Outdev, CR);             /*  _Outdev is CONOUT or LSTOUT      */
  103.     bios( _Outdev, c);
  104. }
  105.  
  106. puts( s)                                /*  display string                   */
  107. char *s;
  108. {
  109.     while ( *s)
  110.         putchar( *s++);
  111. }
  112.  
  113. setlst()                                /*  optionally redirect to printer   */
  114. {                                       /*  return TRUE if redirected        */
  115.                                         /*  else, return FALSE               */
  116.     prompt(
  117. "Press RETURN when printer is ready, or any other key to abandon print function"
  118.            );
  119.     if ( getchar() == CR)
  120.     {
  121.         prompt( "Printing ... ");
  122.         Printing = TRUE;
  123.         _Outdev = LSTOUT;               /*  direct putchar() to printer      */
  124.         return ( TRUE);
  125.     }
  126.     else return ( FALSE);
  127. }
  128.  
  129. resetlst()                              /*  redirect from list to console    */
  130. {
  131.     if ( Printing)
  132.     {
  133.         putchar( '\n');
  134.         putchar( FF);
  135.         Printing = FALSE;
  136.     }
  137.     _Outdev = CONOUT;                   /*  redirect putchar() to screen     */
  138. }
  139.  
  140. kbhit()                                 /*  return TRUE if key pressed       */
  141. {                                       /*  else, return FALSE               */
  142.     return ( bios( 2));
  143. }
  144.  
  145. resetdsk()                              /*  reset & reselect default disk    */
  146. {
  147.     int d;
  148.  
  149.     d = defdsk();                       /*  get default disk                 */
  150.     bdos( 13, 0);                       /*  reset disk system                */
  151.     bdos( 14, d);                       /*  reselect default disk            */
  152. }
  153.  
  154. defdsk()                                /*  return default disk number       */
  155. {
  156.     return ( bdos( 25, 0) & 0x0f);      /*  result will be 0 thru 15         */
  157. }
  158.