opsys.c
来自「国外网站上的一些精典的C程序」· C语言 代码 · 共 254 行
C
254 行
/* * OPSYS.C Operating environment detection and time-slicing support for * MS-DOS applications. * * Written in June 1996 by Andrew Clarke and released to the public domain. */#include <dos.h>#include "opsys.h"int opsys_id = OS_MSDOS;int opsysDetect(void){#if defined(__TURBOC__) /* detect DESQview */ _AX = 0x2B01; _CX = 0x4445; _DX = 0x5351; geninterrupt(0x21); if (_AL != 0xFF) { opsys_id = OS_DESQVIEW; return opsys_id; } /* detect OS/2 */ _AH = 0x30; geninterrupt(0x21); if (_AL >= 10) { opsys_id = OS_OS2; return opsys_id; } /* detect Windows */ _AX = 0x160A; geninterrupt(0x2F); if (_AX == 0) { opsys_id = OS_WINDOWS; return opsys_id; }#else union REGS regs; /* detect DESQview */#if defined(__WATCOMC__) && defined(__386__) regs.w.ax = 0x2B01; regs.w.cx = 0x4445; regs.w.dx = 0x5351; int386(0x21, ®s, ®s);#else regs.x.ax = 0x2B01; regs.x.cx = 0x4445; regs.x.dx = 0x5351;#ifdef __EMX__ _int86(0x21, ®s, ®s);#else int86(0x21, ®s, ®s);#endif#endif if (regs.h.al != 0xFF) { opsys_id = OS_DESQVIEW; return opsys_id; } /* detect OS/2 */ regs.h.ah = 0x30;#if defined(__WATCOMC__) && defined(__386__) int386(0x21, ®s, ®s);#else#ifdef __EMX__ _int86(0x21, ®s, ®s);#else int86(0x21, ®s, ®s);#endif#endif if (regs.h.al >= 10) { opsys_id = OS_OS2; return opsys_id; } /* detect Windows */#if defined(__WATCOMC__) && defined(__386__) regs.w.ax = 0x160A; int386(0x2F, ®s, ®s); if (regs.w.ax == 0) { opsys_id = OS_WINDOWS; return opsys_id; }#else regs.x.ax = 0x160A;#ifdef __EMX__ _int86(0x2F, ®s, ®s);#else int86(0x2F, ®s, ®s);#endif if (regs.x.ax == 0) { opsys_id = OS_WINDOWS; return opsys_id; }#endif#endif /* must be MS-DOS */ opsys_id = OS_MSDOS; return opsys_id;}void opsysTimeSlice(void){#if defined(__TURBOC__) switch (opsys_id) { case OS_MSDOS: geninterrupt(0x28); break; case OS_OS2: case OS_WINDOWS: _AX = 0x1680; geninterrupt(0x2F); break; case OS_DESQVIEW: _AX = 0x1000; geninterrupt(0x15); break; case OS_DBLDOS: _AX = 0xEE01; geninterrupt(0x21); break; case OS_NETWARE: _BX = 0x000A; geninterrupt(0x7A); break; default: break; }#else union REGS regs; switch (opsys_id) { case OS_MSDOS:#if defined(__WATCOMC__) && defined(__386__) int386(0x28, ®s, ®s);#else#ifdef __EMX__ _int86(0x28, ®s, ®s);#else int86(0x28, ®s, ®s);#endif#endif break; case OS_OS2: case OS_WINDOWS:#if defined(__WATCOMC__) && defined(__386__) regs.w.ax = 0x1680; int386(0x2F, ®s, ®s);#else regs.x.ax = 0x1680;#ifdef __EMX__ _int86(0x2F, ®s, ®s);#else int86(0x2F, ®s, ®s);#endif#endif break; case OS_DESQVIEW:#if defined(__WATCOMC__) && defined(__386__) regs.w.ax = 0x1000; int386(0x15, ®s, ®s);#else regs.x.ax = 0x1000;#ifdef __EMX__ _int86(0x15, ®s, ®s);#else int86(0x15, ®s, ®s);#endif#endif break; case OS_DBLDOS:#if defined(__WATCOMC__) && defined(__386__) regs.w.ax = 0xEE01; int386(0x21, ®s, ®s);#else regs.x.ax = 0xEE01;#ifdef __EMX__ _int86(0x21, ®s, ®s);#else int86(0x21, ®s, ®s);#endif#endif break; case OS_NETWARE:#if defined(__WATCOMC__) && defined(__386__) regs.w.bx = 0x000A; int386(0x7A, ®s, ®s);#else regs.x.bx = 0x000A;#ifdef __EMX__ _int86(0x7A, ®s, ®s);#else int86(0x7A, ®s, ®s);#endif#endif break; default: break; }#endif}#ifndef __EMX__unsigned short opsysGetVideoSeg(unsigned short assumed_base){ if (opsys_id == OS_DESQVIEW) {#if defined(__TURBOC__) _ES = assumed_base; _DI = 0; _AX = 0xFE00; geninterrupt(0x10); return _ES;#else union REGS regs; struct SREGS sregs; sregs.es = assumed_base;#if defined(__WATCOMC__) && defined(__386__) regs.w.di = 0; regs.w.ax = 0xFE00; int386x(0x10, ®s, ®s, &sregs);#else regs.x.di = 0; regs.x.ax = 0xFE00; int86x(0x10, ®s, ®s, &sregs);#endif return sregs.es;#endif } return assumed_base;}#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?