home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / snip9707.zip / OPSYS.C < prev    next >
C/C++ Source or Header  |  1997-07-05  |  5KB  |  256 lines

  1. /* +++Date last modified: 05-Jul-1997 */
  2.  
  3. /*
  4.  *  OPSYS.C  Operating environment detection and time-slicing support for
  5.  *           MS-DOS applications.
  6.  *
  7.  *  Written in June 1996 by Andrew Clarke and released to the public domain.
  8.  */
  9.  
  10. #include <dos.h>
  11. #include "opsys.h"
  12.  
  13. int opsys_id = OS_MSDOS;
  14.  
  15. int opsysDetect(void)
  16. {
  17. #if defined(__TURBOC__)
  18.     /* detect DESQview */
  19.     _AX = 0x2B01;
  20.     _CX = 0x4445;
  21.     _DX = 0x5351;
  22.     geninterrupt(0x21);
  23.     if (_AL != 0xFF)
  24.     {
  25.         opsys_id = OS_DESQVIEW;
  26.         return opsys_id;
  27.     }
  28.  
  29.     /* detect OS/2 */
  30.     _AH = 0x30;
  31.     geninterrupt(0x21);
  32.     if (_AL >= 10)
  33.     {
  34.         opsys_id = OS_OS2;
  35.         return opsys_id;
  36.     }
  37.  
  38.     /* detect Windows */
  39.     _AX = 0x160A;
  40.     geninterrupt(0x2F);
  41.     if (_AX == 0)
  42.     {
  43.         opsys_id = OS_WINDOWS;
  44.         return opsys_id;
  45.     }
  46. #else
  47.     union REGS regs;
  48.  
  49.     /* detect DESQview */
  50. #if defined(__WATCOMC__) && defined(__386__)
  51.     regs.w.ax = 0x2B01;
  52.     regs.w.cx = 0x4445;
  53.     regs.w.dx = 0x5351;
  54.     int386(0x21, ®s, ®s);
  55. #else
  56.     regs.x.ax = 0x2B01;
  57.     regs.x.cx = 0x4445;
  58.     regs.x.dx = 0x5351;
  59. #ifdef __EMX__
  60.     _int86(0x21, ®s, ®s);
  61. #else
  62.     int86(0x21, ®s, ®s);
  63. #endif
  64. #endif
  65.     if (regs.h.al != 0xFF)
  66.     {
  67.         opsys_id = OS_DESQVIEW;
  68.         return opsys_id;
  69.     }
  70.  
  71.     /* detect OS/2 */
  72.     regs.h.ah = 0x30;
  73. #if defined(__WATCOMC__) && defined(__386__)
  74.     int386(0x21, ®s, ®s);
  75. #else
  76. #ifdef __EMX__
  77.     _int86(0x21, ®s, ®s);
  78. #else
  79.     int86(0x21, ®s, ®s);
  80. #endif
  81. #endif
  82.     if (regs.h.al >= 10)
  83.     {
  84.         opsys_id = OS_OS2;
  85.         return opsys_id;
  86.     }
  87.  
  88.     /* detect Windows */
  89. #if defined(__WATCOMC__) && defined(__386__)
  90.     regs.w.ax = 0x160A;
  91.     int386(0x2F, ®s, ®s);
  92.     if (regs.w.ax == 0)
  93.     {
  94.         opsys_id = OS_WINDOWS;
  95.         return opsys_id;
  96.     }
  97. #else
  98.     regs.x.ax = 0x160A;
  99. #ifdef __EMX__
  100.     _int86(0x2F, ®s, ®s);
  101. #else
  102.     int86(0x2F, ®s, ®s);
  103. #endif
  104.     if (regs.x.ax == 0)
  105.     {
  106.         opsys_id = OS_WINDOWS;
  107.         return opsys_id;
  108.     }
  109. #endif
  110. #endif
  111.  
  112.     /* must be MS-DOS */
  113.     opsys_id = OS_MSDOS;
  114.     return opsys_id;
  115. }
  116.  
  117. void opsysTimeSlice(void)
  118. {
  119. #if defined(__TURBOC__)
  120.     switch (opsys_id)
  121.     {
  122.     case OS_MSDOS:
  123.         geninterrupt(0x28);
  124.         break;
  125.     case OS_OS2:
  126.     case OS_WINDOWS:
  127.         _AX = 0x1680;
  128.         geninterrupt(0x2F);
  129.         break;
  130.     case OS_DESQVIEW:
  131.         _AX = 0x1000;
  132.         geninterrupt(0x15);
  133.         break;
  134.     case OS_DBLDOS:
  135.         _AX = 0xEE01;
  136.         geninterrupt(0x21);
  137.         break;
  138.     case OS_NETWARE:
  139.         _BX = 0x000A;
  140.         geninterrupt(0x7A);
  141.         break;
  142.     default:
  143.         break;
  144.     }
  145. #else
  146.     union REGS regs;
  147.     switch (opsys_id)
  148.     {
  149.     case OS_MSDOS:
  150. #if defined(__WATCOMC__) && defined(__386__)
  151.         int386(0x28, ®s, ®s);
  152. #else
  153. #ifdef __EMX__
  154.         _int86(0x28, ®s, ®s);
  155. #else
  156.         int86(0x28, ®s, ®s);
  157. #endif
  158. #endif
  159.         break;
  160.  
  161.     case OS_OS2:
  162.     case OS_WINDOWS:
  163. #if defined(__WATCOMC__) && defined(__386__)
  164.         regs.w.ax = 0x1680;
  165.         int386(0x2F, ®s, ®s);
  166. #else
  167.         regs.x.ax = 0x1680;
  168. #ifdef __EMX__
  169.         _int86(0x2F, ®s, ®s);
  170. #else
  171.         int86(0x2F, ®s, ®s);
  172. #endif
  173. #endif
  174.         break;
  175.  
  176.     case OS_DESQVIEW:
  177. #if defined(__WATCOMC__) && defined(__386__)
  178.         regs.w.ax = 0x1000;
  179.         int386(0x15, ®s, ®s);
  180. #else
  181.         regs.x.ax = 0x1000;
  182. #ifdef __EMX__
  183.         _int86(0x15, ®s, ®s);
  184. #else
  185.         int86(0x15, ®s, ®s);
  186. #endif
  187. #endif
  188.         break;
  189.  
  190.     case OS_DBLDOS:
  191. #if defined(__WATCOMC__) && defined(__386__)
  192.         regs.w.ax = 0xEE01;
  193.         int386(0x21, ®s, ®s);
  194. #else
  195.         regs.x.ax = 0xEE01;
  196. #ifdef __EMX__
  197.         _int86(0x21, ®s, ®s);
  198. #else
  199.         int86(0x21, ®s, ®s);
  200. #endif
  201. #endif
  202.         break;
  203.  
  204.     case OS_NETWARE:
  205. #if defined(__WATCOMC__) && defined(__386__)
  206.         regs.w.bx = 0x000A;
  207.         int386(0x7A, ®s, ®s);
  208. #else
  209.         regs.x.bx = 0x000A;
  210. #ifdef __EMX__
  211.         _int86(0x7A, ®s, ®s);
  212. #else
  213.         int86(0x7A, ®s, ®s);
  214. #endif
  215. #endif
  216.         break;
  217.  
  218.     default:
  219.         break;
  220.     }
  221. #endif
  222. }
  223.  
  224. #ifndef __EMX__
  225.  
  226. unsigned short opsysGetVideoSeg(unsigned short assumed_base)
  227. {
  228.     if (opsys_id == OS_DESQVIEW)
  229.     {
  230. #if defined(__TURBOC__)
  231.         _ES = assumed_base;
  232.         _DI = 0;
  233.         _AX = 0xFE00;
  234.         geninterrupt(0x10);
  235.         return _ES;
  236. #else
  237.         union REGS regs;
  238.         struct SREGS sregs;
  239.         sregs.es = assumed_base;
  240. #if defined(__WATCOMC__) && defined(__386__)
  241.         regs.w.di = 0;
  242.         regs.w.ax = 0xFE00;
  243.         int386x(0x10, ®s, ®s, &sregs);
  244. #else
  245.         regs.x.di = 0;
  246.         regs.x.ax = 0xFE00;
  247.         int86x(0x10, ®s, ®s, &sregs);
  248. #endif
  249.         return sregs.es;
  250. #endif
  251.     }
  252.     return assumed_base;
  253. }
  254.  
  255. #endif
  256.