home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 10 / 10.iso / l / l440 / 2.ddi / CHAP5 / INDOS.C < prev    next >
Encoding:
C/C++ Source or Header  |  1990-09-26  |  1.8 KB  |  70 lines

  1. /* INDOS.C - Functions to manage DOS flags */
  2.  
  3. #include <stdlib.h>
  4. #include <dos.h>
  5.  
  6. #define GET_INDOS       0x34
  7. #define GET_CRIT_ERR    0x5D06
  8.  
  9. char far *indos_ptr=0;
  10. char far *crit_err_ptr=0;
  11.  
  12. int   DosBusy(void);
  13. void  InitInDos(void);
  14.  
  15. /*****
  16. Function: Init InDos Pointers
  17. Initialize pointers to InDos Flags
  18. *****/
  19. void InitInDos(void)
  20.     union  REGS regs;
  21.     struct SREGS segregs;
  22.  
  23.     regs.h.ah = GET_INDOS;   
  24.     intdosx(®s,®s,&segregs);
  25.     /* pointer to flag is returned in ES:BX */
  26.     FP_SEG(indos_ptr) = segregs.es;
  27.     FP_OFF(indos_ptr) = regs.x.bx;
  28.  
  29.     if (_osmajor < 3)  /* flag is one byte after InDos */
  30.         crit_err_ptr = indos_ptr + 1;
  31.     else if (_osmajor==3 && _osminor == 0) /* flag is one byte before */     
  32.         crit_err_ptr = indos_ptr - 1;
  33.     else
  34.     {
  35.         regs.x.ax = GET_CRIT_ERR;   
  36.         intdosx(®s,®s,&segregs);
  37.         /* pointer to flag is returned in DS:SI */
  38.         FP_SEG(crit_err_ptr) = segregs.ds;
  39.         FP_OFF(crit_err_ptr) = regs.x.si;
  40.     }
  41. }
  42.  
  43. /*****
  44. Function: DosBusy
  45. This function will non-zero if DOS is busy
  46. *****/ 
  47. int DosBusy(void)
  48. {
  49.     if (indos_ptr && crit_err_ptr)
  50.         return (*crit_err_ptr || *indos_ptr);
  51.     else
  52.         return 0xFFFF;  /* return dos busy if flags are not set */
  53. }
  54.  
  55. /*****
  56. Function: Int28DosBusy
  57. This function will return non-zero if the InDos flag is > 1 or
  58. the critical error flag is non zero. To be used inside of an
  59. INT 28 loop. Note that inside INT 28, InDOS == 1 is normal, and
  60. indicates DOS is *not* busy; InDOS > 1 inside INT 28 means it is.
  61. *****/
  62. int Int28DosBusy(void)
  63. {
  64.     if (indos_ptr && crit_err_ptr)
  65.       return (*crit_err_ptr || (*indos_ptr > 1));
  66.     else
  67.       return 0xFFFF;  /* return dos busy if flags are not set */
  68. }   
  69.