📄 indos.c
字号:
/* INDOS.C - Functions to manage DOS flags */
#include <stdlib.h>
#include <dos.h>
#define GET_INDOS 0x34
#define GET_CRIT_ERR 0x5D06
char far *indos_ptr=0;
char far *crit_err_ptr=0;
int DosBusy(void);
void InitInDos(void);
/*****
Function: Init InDos Pointers
Initialize pointers to InDos Flags
*****/
void InitInDos(void)
{
union REGS regs;
struct SREGS segregs;
regs.h.ah = GET_INDOS;
intdosx(®s,®s,&segregs);
/* pointer to flag is returned in ES:BX */
FP_SEG(indos_ptr) = segregs.es;
FP_OFF(indos_ptr) = regs.x.bx;
if (_osmajor < 3) /* flag is one byte after InDos */
crit_err_ptr = indos_ptr + 1;
else if (_osmajor==3 && _osminor == 0) /* flag is one byte before */
crit_err_ptr = indos_ptr - 1;
else
{
regs.x.ax = GET_CRIT_ERR;
intdosx(®s,®s,&segregs);
/* pointer to flag is returned in DS:SI */
FP_SEG(crit_err_ptr) = segregs.ds;
FP_OFF(crit_err_ptr) = regs.x.si;
}
}
/*****
Function: DosBusy
This function will non-zero if DOS is busy
*****/
int DosBusy(void)
{
if (indos_ptr && crit_err_ptr)
return (*crit_err_ptr || *indos_ptr);
else
return 0xFFFF; /* return dos busy if flags are not set */
}
/*****
Function: Int28DosBusy
This function will return non-zero if the InDos flag is > 1 or
the critical error flag is non zero. To be used inside of an
INT 28 loop. Note that inside INT 28, InDOS == 1 is normal, and
indicates DOS is *not* busy; InDOS > 1 inside INT 28 means it is.
*****/
int Int28DosBusy(void)
{
if (indos_ptr && crit_err_ptr)
return (*crit_err_ptr || (*indos_ptr > 1));
else
return 0xFFFF; /* return dos busy if flags are not set */
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -