Обработка программного прерывания
#include <dos.h>
#define USERVEC 0x60 // Вектор программного прерывания
void interrupt
USERINT(bp,di,si,ds,es,dx,cx,bx,ax,ip,cs,flgs)
// ds:dx - начальный адрес буфера
// cx - размер буфера в байта
// ax,bx - координаты строки x,y
// Программное прерывание выводит строку из буфера
// непосредственно в видеопамять
{
char far *p; // Указатель на буфер строки
char (far *video)[25][80][2]; // Указатель на на страницу 0
video=0xB8000000; // видеопамяти
p = MK_FP(ds,dx); // Сформировать длинный
// указатель из регистров ds,dx
while(cx-- !=0) // bx,cx не сохраняются
{
(*video)[bx ][ax][0]= *p++;
(*video)[bx++][ax][1]= 0x5E;
}}
char name[80]="a-a-a-a-a-a-a-a";
void main()
{
union REGS R; // Union для установки содержимого
// регистров в программном прерывании
setvect(USERVEC, (void interrupt (far*)(...))USERINT);
// Установка вектора прерывания
R.x.ax=5; // Запись содержимого регистров
R.x.bx=10; // ax,bx - координаты строки
R.x.cx=strlen(name); // cx - длина строки
R.x.dx=name; // dx - начальный адрес строки
int86(USERVEC,&R,&R); // Выполнение программного
// прерывания по вектору USERVEC
_DX=name; // Альтернативный вариант
_CX=strlen(name); // с непосредственным
_BX=10; // использованием регистров
_AX=5;
geninterrupt(USERVEC);
}