📄 low.c
字号:
if(XMSExist())
{
safe_printf("Xms not exist\n");
return;
}
if(XMS_Alloc(LOG_SIZE,&XmsHandle))
{
safe_printf("Xms can not alloc\n");
return;
}
if(XMS_Lock(XmsHandle,&AbsAddr))
{
safe_printf("Xms can not Lock\n");
return;
}
old_flush_handler = _dos_getvect(FLUSH_IRQ);
_dos_setvect(FLUSH_IRQ,new_flush_handler);
BeginCount = begin_count;
EndCount = end_count;
}
void CleanupLog(void)
{
if(XMS_Unlock(XmsHandle))
return;
XMS_Free(XmsHandle);
XmsHandle = 0;
if(old_flush_handler)
{
_dos_setvect(FLUSH_IRQ,old_flush_handler);
old_flush_handler = NULL;
}
}
#pragma check_stack(off)
long XMS_LoadFromXMS(unsigned short MemHandle, unsigned long lOffset,
unsigned char far * pcStr, short Length)
{
struct XMSSTRU sXmsMove;
if (Length <= 0)
return -EINVAL;
sXmsMove.lLength = (unsigned long)Length;
sXmsMove.iSrcHandle = MemHandle;
sXmsMove.lSrcOff = lOffset;
sXmsMove.lDestOff = (unsigned long)FP_SEG(pcStr) * 65536L;
sXmsMove.lDestOff += (unsigned long)FP_OFF(pcStr);
sXmsMove.iDestHandle = 0;
return(XMS_Move(&sXmsMove));
}
void FlushLog(void)
{
char far * buf;
FILE * fp;
unsigned long size;
unsigned long len;
if(LoggedSize)
{
buf = malloc(4096L);
if(!buf)
return;
fp = fopen(LogFileName,"w");
if(!fp)
{
free(buf);
return;
}
fclose(fp);
fp = fopen(LogFileName,"ab+");
if(!fp)
{
free(buf);
return;
}
size = 0;
len = BUF_SIZE;
for(size = 0;size <= LoggedSize;size += BUF_SIZE)
{
if(size + BUF_SIZE >= LoggedSize)
len = LoggedSize - size;
if(XMS_LoadFromXMS(XmsHandle,size,buf,len))
{
free(buf);
fclose(fp);
return;
}
fwrite(buf,len,1,fp);
}
free(buf);
fclose(fp);
}
}
void UnCheckLog(void)
{
IsLogChecked = 0;
}
#pragma check_stack(on)
#pragma check_stack(off)
long skip_atoi(char **s)
{
long i=0;
while (isdigit(**s))
i = i * 10 + *((*s)++) - '0';
return i;
}
unsigned do_div(unsigned long * pnum,unsigned short base)
{
unsigned long num;
unsigned long count;
num = *pnum;
if(num < base)
{
*pnum = 0;
return num;
}
else
{
num = *pnum - (unsigned long)((((float)(unsigned long)((float)num / (float)base))
* (float)base));
*pnum = (unsigned long)((float)(*pnum) / (float)base);
return num;
}
}
unsigned long strnlen(char far * string,unsigned long count)
{
unsigned long i;
for(i = 0;i < count && *string;++i)
{
++string;
}
return i;
}
char * number(char * buf, char * end, long num, long base, long size, long precision,
long type)
{
char c,sign,tmp[66];
const char *digits;
const char small_digits[] = "0123456789abcdefghijklmnopqrstuvwxyz";
const char large_digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
long i;
digits = (type & LARGE) ? large_digits : small_digits;
if (type & LEFT)
type &= ~ZEROPAD;
if (base < 2 || base > 36)
return 0;
c = (type & ZEROPAD) ? '0' : ' ';
sign = 0;
if (type & SIGN)
{
if (num < 0)
{
sign = '-';
num = -num;
size--;
}
else if (type & PLUS)
{
sign = '+';
size--;
}
else if (type & SPACE)
{
sign = ' ';
size--;
}
}
if (type & SPECIAL)
{
if (base == 16)
size -= 2;
else if (base == 8)
size--;
}
i = 0;
if (num == 0)
tmp[i++] = '0';
else
{
while (num != 0)
{
tmp[i++] = digits[do_div(&num,base)];
}
}
if (i > precision)
precision = i;
size -= precision;
if (!(type & (ZEROPAD+ LEFT)))
{
while(size-- > 0)
{
if (buf <= end)
*buf = ' ';
++buf;
}
}
if (sign)
{
if (buf <= end)
*buf = sign;
++buf;
}
if (type & SPECIAL)
{
if (base==8)
{
if (buf <= end)
*buf = '0';
++buf;
}
else if (base == 16)
{
if (buf <= end)
*buf = '0';
++buf;
if (buf <= end)
*buf = digits[33];
++buf;
}
}
if (!(type & LEFT))
{
while (size-- > 0)
{
if (buf <= end)
*buf = c;
++buf;
}
}
while (i < precision--)
{
if (buf <= end)
*buf = '0';
++buf;
}
while (i-- > 0)
{
if (buf <= end)
*buf = tmp[i];
++buf;
}
while (size-- > 0)
{
if (buf <= end)
*buf = ' ';
++buf;
}
return buf;
}
long vsnprintf(char *buf, size_t size, const char *fmt, va_list args)
{
long len;
unsigned long num;
long i, base;
char *str, *end, c;
char *s;
long flags; /* flags to number() */
long field_width; /* width of output field */
long precision; /* min. # of digits for integers; max
number of chars for from string */
long qualifier; /* 'h', 'l', or 'L' for integer fields */
/* 'z' support added 23/7/1999 S.H. */
/* 'z' changed to 'Z' --davidm 1/25/99 */
str = buf;
end = buf + size - 1;
if (end < buf - 1)
{
end = ((void *) -1);
size = end - buf + 1;
}
for (; *fmt ; ++fmt)
{
if (*fmt != '%')
{
if (str <= end)
*str = *fmt;
++str;
continue;
}
/* process flags */
flags = 0;
repeat:
++fmt; /* this also skips first '%' */
switch (*fmt)
{
case '-': flags |= LEFT; goto repeat;
case '+': flags |= PLUS; goto repeat;
case ' ': flags |= SPACE; goto repeat;
case '#': flags |= SPECIAL; goto repeat;
case '0': flags |= ZEROPAD; goto repeat;
}
/* get field width */
field_width = -1;
if (isdigit(*fmt))
field_width = skip_atoi(&fmt);
else if (*fmt == '*')
{
++fmt;
/* it's the next argument */
field_width = va_arg(args, int);
if (field_width < 0)
{
field_width = -field_width;
flags |= LEFT;
}
}
/* get the precision */
precision = -1;
if (*fmt == '.')
{
++fmt;
if (isdigit(*fmt))
precision = skip_atoi(&fmt);
else if (*fmt == '*')
{
++fmt;
/* it's the next argument */
precision = va_arg(args, int);
}
if (precision < 0)
precision = 0;
}
/* get the conversion qualifier */
qualifier = -1;
if (*fmt == 'h' || *fmt == 'l' || *fmt == 'L' || *fmt =='Z')
{
qualifier = *fmt;
++fmt;
if (qualifier == 'l' && *fmt == 'l')
{
qualifier = 'L';
++fmt;
}
}
/* default base */
base = 10;
switch (*fmt)
{
case 'c':
if (!(flags & LEFT))
{
while (--field_width > 0)
{
if (str <= end)
*str = ' ';
++str;
}
}
c = (unsigned char) va_arg(args, int);
if (str <= end)
*str = c;
++str;
while (--field_width > 0)
{
if (str <= end)
*str = ' ';
++str;
}
continue;
case 's':
s = va_arg(args, char *);
if (!s)
s = "<NULL>";
len = strnlen(s, precision);
if (!(flags & LEFT))
{
while (len < field_width--)
{
if (str <= end)
*str = ' ';
++str;
}
}
for (i = 0; i < len; ++i)
{
if (str <= end)
*str = *s;
++str;
++s;
}
while (len < field_width--)
{
if (str <= end)
*str = ' ';
++str;
}
continue;
case 'p':
if (field_width == -1)
{
field_width = 2 * sizeof(void far *);
flags |= ZEROPAD;
}
str = number(str, end,
(unsigned long) va_arg(args, void far *),
16, field_width, precision, flags);
continue;
case 'n':
/* FIXME:
* What does C99 say about the overflow case here? */
if (qualifier == 'l')
{
long far * ip = va_arg(args, long far *);
*ip = (str - buf);
}
else if (qualifier == 'Z')
{
size_t * ip = va_arg(args, size_t *);
*ip = (str - buf);
}
else
{
int * ip = va_arg(args, int *);
*ip = (str - buf);
}
continue;
case '%':
if (str <= end)
*str = '%';
++str;
continue;
/* integer number formats - set up the flags and "break" */
case 'o':
base = 8;
break;
case 'X':
flags |= LARGE;
case 'x':
base = 16;
break;
case 'd':
case 'i':
flags |= SIGN;
case 'u':
break;
default:
if (str <= end)
*str = '%';
++str;
if (*fmt)
{
if (str <= end)
*str = *fmt;
++str;
}
else
{
--fmt;
}
continue;
};
if (qualifier == 'L')
num = va_arg(args, long);
else if (qualifier == 'l')
{
num = va_arg(args, unsigned long);
if (flags & SIGN)
num = (signed long) num;
}
else if (qualifier == 'Z')
{
num = va_arg(args, size_t);
}
else if (qualifier == 'h')
{
num = (unsigned short) va_arg(args, int);
if (flags & SIGN)
num = (signed short) num;
}
else
{
num = va_arg(args, unsigned int);
if (flags & SIGN)
num = (signed int) num;
}
str = number(str, end, num, base,
field_width, precision, flags);
}
if (str <= end)
*str = '\0';
else if (size > 0)
/* don't write out a null byte if the buf size is zero */
*end = '\0';
/* the trailing null byte doesn't count towards the total
*++str;
*/
return str-buf;
}
long my_vsprintf(char *buf, const char *fmt, va_list args)
{
return vsnprintf(buf, 0xFFFFFFFFUL, fmt, args);
}
int IsXmsExist(void)
{
return (iOffset1 || iSeg1);
}
long movexms1(struct XMSSTRU far * psXmsStru)
{
unsigned short iDs, iSi, iAx;
unsigned long XmsEntryPoint;
XmsEntryPoint = ((unsigned long)iSeg1) * 65536L
+ (unsigned long)iOffset1;
if (psXmsStru->lLength%2l)
return -EINVAL; // must be even
iDs = FP_SEG((void far *)psXmsStru);
iSi = FP_OFF((void far *)psXmsStru);
_asm push ds
_asm push si
_asm mov ah, 0x0b
_asm mov si, iDs
_asm mov ds, si
_asm mov si, iSi
_asm call dword ptr XmsEntryPoint
_asm pop si
_asm pop ds
_asm cmp ax,0
_asm jz return_error6
_asm jmp return_success6
return_error6:
return -EINVAL;
return_success6:
return 0L;
}
long XMS_Move(struct XMSSTRU * psXmsStru)
{
struct XMSSTRU sStru;
unsigned char pcChar[2];
unsigned char far *pcChar1;
if ( !(psXmsStru->lLength%2L) )
return (movexms1(psXmsStru));
psXmsStru->lLength--;
if(movexms1(psXmsStru))
{
psXmsStru->lLength++;
return -EINVAL;
}
psXmsStru->lLength++;
if(!psXmsStru->iSrcHandle) // 从常规内存到 XMS
{
sStru.lLength = 2L;
sStru.iSrcHandle = psXmsStru->iDestHandle;
sStru.lSrcOff = psXmsStru->lDestOff + psXmsStru->lLength - 1L;
sStru.iDestHandle = 0;
sStru.lDestOff = ((unsigned long)FP_SEG(pcChar) << 16)
+ (unsigned long)FP_OFF(pcChar);
if (movexms1(&sStru))
return -EINVAL;
pcChar1 = (unsigned char far *)MK_FP(psXmsStru->lSrcOff);
pcChar[0] = pcChar1[psXmsStru->lLength - 1L];
sStru.lLength = 2L;
sStru.iSrcHandle = 0;
sStru.lSrcOff= ((unsigned long)FP_SEG(pcChar) * 65536L) +
(unsigned long)FP_OFF(pcChar);
sStru.iDestHandle = psXmsStru->iDestHandle;
sStru.lDestOff = psXmsStru->lDestOff + psXmsStru->lLength- 1L;
if (movexms1(&sStru))
return -EINVAL;
}
if (!psXmsStru->iDestHandle) // 从 XMS 到常规内存
{
sStru.lLength = 2L;
sStru.iSrcHandle = psXmsStru->iSrcHandle;
sStru.lSrcOff = psXmsStru->lSrcOff + psXmsStru->lLength -1L;
sStru.iDestHandle = 0;
sStru.lDestOff=((unsigned long)FP_SEG(pcChar) * 65536L) +
(unsigned long)FP_OFF(pcChar);
if (movexms1(&sStru))
return -EINVAL;
pcChar1 = (unsigned char *)MK_FP(psXmsStru->lDestOff);
pcChar1[psXmsStru->lLength-1l] = pcChar[0];
}
return 0L;
}
long XMS_StoreToXMS(unsigned char far * pcStr, unsigned short MemHandle,
unsigned long lOffset, short Length)
{
struct XMSSTRU sXmsMove;
if (Length <=0 )
return -EINVAL;
sXmsMove.lLength= (unsigned long)Length;
sXmsMove.iSrcHandle = 0;
sXmsMove.lSrcOff = (unsigned long)FP_SEG(pcStr) * 65536L;
sXmsMove.lSrcOff += (unsigned long)FP_OFF(pcStr);
sXmsMove.iDestHandle = MemHandle;
sXmsMove.lDestOff = lOffset;
return(XMS_Move(&sXmsMove));
}
void BeginLog(void)
{
++PassCount;
if(XmsHandle && PassCount >= BeginCount && PassCount < EndCount)
{
IsLogging = 1;
_asm sti
}
}
void EndLog(void)
{
if(IsLogging && PassCount >= EndCount)
{
IsLogChecked = 1;
IsLogging = 0;
}
}
#pragma check_stack(on)
#endif
#pragma check_stack(off)
extern unsigned char int1c_is_sti;
extern struct event_item far * int1c_item;
extern unsigned short int1c_temp;
void interrupt far new_int1c_handler(void)
{
unsigned short temp;
if(is_in_interrupt)
return;
int1c_temp = 0;
(* old_int1c_handler)();
if(!busy)
{
busy = 1;
_asm pushf
_asm pop temp
int1c_is_sti = 0;
if(temp & 0x0200)
{
_asm cli
int1c_is_sti = 1;
}
for(int1c_item = event_item_i(global_event_list.next);
int1c_item != event_item_i(&global_event_list);
int1c_item = event_item_i(int1c_item->node.next))
{
if(!int1c_item->is_active)
{
if(int1c_item->event_type == EVENT_TIMER ||
int1c_item->event_type == EVENT_THREAD)
{
++int1c_item->tick_count;
if(int1c_item->tick_count >=
int1c_item->tick_count_limit)
{
int1c_item->is_active = 1;
}
}
}
}
#ifdef DEBUG_HARDWARE_INTERRUPT
int1c_temp = IsLogChecked;
#endif
if(int1c_is_sti)
{
_asm cli
}
busy = 0;
}
#ifdef DEBUG_HARDWARE_INTERRUPT
if(int1c_temp)
{
_asm sti
_asm int FLUSH_IRQ
}
#endif
}
#pragma check_stack(on)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -