Информатика и технология программирования


Реентерабельность и проблемы резидентных программ в DOS - часть 3


// Макроопределения переключения стека


&#35define SAVE if (LEVEL++ == 0) {CS=cs; SSI=_SS;SPI=_SP;
_SS=SS;_SP=(unsigned)SP;}
&#35define RESTORE if (LEVEL-- == 1) {CS=0; _SS=SSI,_SP=SPI;}


char fname[]="a.txt";
unsigned CtrlBrk;
int NKEY; // Скан-код горячей клавиши


int DS=0; // Значение DS в момент выполнения программы


int NSTACK=1000; // Размер внутреннего стека


char *SP; // Указатель внутреннего стека


int FORKH=0; // Флаг выполнения процесса


struct SREGS SG; // Значения сегментных регистров.


// Используются для определения


// размера резидентной части программы.


union REGS rg; // Значения регистров процессора.


// Используются при инициализации.



unsigned CS,SS,SPI,SSI,LEVEL=0,PIDS,PSP,PSPI,DOSSEG,DOSBUSY,DISKFLAG;


unsigned far *PSPADR; // far адрес PSP сетевого резидента


char far *PDOSBUSY; // Адрес флага занятости DOS


char far *DTA, far *DTAI; // Адрес DTA сетевого резидента


// и DTA прерванного процесса


unsigned SIZE; // Размер резидентной части программы


int WAITDOS=0, // Флаги занятости: DOS,


WAITDISK=0, // дисковой подсистемы,


WAITBIOS=0; // BIOS.



//Сохраненные значения перехваченных прерываний:


void interrupt (*TIMSAV)(...), // Таймер (INT 8h),


interrupt (*KBSAV)(...), // Клавиатура (INT 9h),


interrupt (*DOSOKSAV)(...), // Прерывание DOS O.K. (INT 28h),


interrupt (*DISKSAV)(...); // Дисковое прерывание (INT 13h),



//-----------Вывод данных в видеопамять-------------------------------


void putstr(char *s, int x, int y)
{
char (far *p)[25][80][2]=(char (far*)[25][80][2])0xB8000000;
while(*s !='\0')
{ (*p)[y][x ][0] = *s++; (*p)[y][x++][1] = 0x71; }
}


char *to10(int n,char *s)
{ char *p = s+2;
for (; p&#62=s; p--, n/=10) *s-- = n % 10;
s+=3; *s++ = ' '; return s;
}


// Сохранение регистра флагов в точке вызова newscrit


int cflag;
void interrupt newscrit(bp,di,si,ds,es,dx,cx,bx,ax,ip,cs,flgs)
{ ax=0; cflag=flgs; }


static void interrupt (*old24)(...);


void SETCONTEXT() // Переключение контекста с прерванной


{ // задачи на сетевой резидент




Начало  Назад  Вперед



Книжный магазин