Резидентная программа - всплывающие часы
//------------------------------------------------------bk63-01.cpp
#include <dos.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
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(...)
{
#define SCAN 53 // Скан-код клавиши "?"
#define ALT 8 // Бит нажатия ALT в байте состояния клавиатуры
char kbval; // в байте 0000:0417
kbval=peekb(0,0x417);
if (inportb(0x60)==SCAN)
{ // Нажатие "?" при нажатой ALT
if ((kbval & ALT) !=0)
{ // Сброс контроллера клавиатуры
kbval=inportb(0x61);
outportb(0x61,kbval | 0x80);
outportb(0x61,kbval);
outportb(0x20,0x20);
SHO=!SHO; // Переключение режима высвечивания
// часов и сохранение/восстановление
// строки экрана под часами
for (int x=50; x< 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; // Выход из прерывания
}
} // Иначе эмуляция прерывания