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

       

Резидентная программа - всплывающие часы


Данная программа при нажатии ALT+? выводит часы и при повторном нажатии восстанавливает старое содержимое экрана на месте часов.


//------------------------------------------------------bk63-01.cpp


&#35include &#60dos.h&#62
&#35include &#60stdlib.h&#62
&#35include &#60stdio.h&#62
&#35include &#60string.h&#62
unsigned SHO; // Признак высвечивания часов


unsigned SIZE; // Размер программы в параграфах


unsigned HIGH; // Верхняя граница сегмента данных


// Указатели на функции обработки прерываний -


// "старые" вектора прерываний


void interrupt (*TIMSAV)(...),interrupt (*KBSAV)(...);


char save[30][2]; // Массив для хранения строки экрана


// Указатель на страницу 0 видеопамяти


char (far *q)[25][80][2]=(char (far*)[25][80][2])0xB8000000;


static char sss[100],xx[8]={" "};




// Вывод строки непосредственно в 0-страницу видеопамяти


void putstr(char *s,int x, int y)
{
while(*s !=NULL) // 25 строк по 80 символов по 2


{ // байта на символ


(*q)[y][x ][0] = *s++; // запись символа в видеопамять


(*q)[y][x++][1] = 0xE; // запись атрибута - желтый на черном


}
}


char *to10(char *p,int n)
{
*p++ = n/10+'0';
*p++ = n%10+'0';
return p;
}


void interrupt KEYB(...)
{
&#35define SCAN 53 // Скан-код клавиши "?"


&#35define ALT 8 // Бит нажатия ALT в байте состояния клавиатуры


char kbval; // в байте 0000:0417


kbval=peekb(0,0x417);
if (inportb(0x60)==SCAN)
{ // Нажатие "?" при нажатой ALT


if ((kbval &#38 ALT) !=0)
{ // Сброс контроллера клавиатуры


kbval=inportb(0x61);
outportb(0x61,kbval | 0x80);
outportb(0x61,kbval);
outportb(0x20,0x20);
SHO=!SHO; // Переключение режима высвечивания


// часов и сохранение/восстановление


// строки экрана под часами


for (int x=50; x&#60 70; x++)
if (SHO)
{
save[x-50][0]=(*q)[0][x][0];
save[x-50][1]=(*q)[0][x][1];
}
else
{
(*q)[0][x][0]=save[x-50][0];
(*q)[0][x][1]=save[x-50][1];
}
return; // Выход из прерывания


}
} // Иначе эмуляция прерывания



Содержание раздела