1.3.8          Функції бібліотеки Turbo С для доступу
до обробників переривань

Зрештою, бібліотечні функції Turbo С, звертаються до ISR BIOS або MS-DOS. В тих випадках, коли необхідно безпосереднє звернення до BIOS або MS-DOS, використовуються спеціальні функції, що описуються далі.

#include <dos.h>
int bdos( int dosfun, unsigned dosdx, unsigned dosal )

Виконує переривання 21h зі значеннями регістрів АН=dosfun, DX=dosdx, AL=dosal. Значення що повертається функцією ‑ значення регістру АХ, передане обробником переривання. Функція повертає значення регістру АХ на виході з переривання і використовується в тих випадках, коли вимагається звернення до функцій MS-DOS з наданням значень тільки регістрів АХ і DX.

#include <dos.h>
void geninterrupt
( int intr_num )

Макрос, що виконує звернення, до обробника переривання з номером intr_num. Для завдання необхідних значень регістрам і отримання значення з обробника слід використати псевдозмінні. Перевагою макросу є мінімальний розмір і максимально можлива продуктивність коду при виконанні переривання. Недолік ‑ це можливість перепризначення при завантаженні регістрів раніше встановлених значень.

#include <dos.h>
int int86( int intno, union REGS *inregs, union REGS *outregs )

Функція завантажує внутрішні регістри мікропроцесора значеннями, записаними в об’єднанні по шаблону union REGS, на початок якого вказує inregs, і виконує переривання з номером intno. Значення внутрішніх регістрів на виході з переривання записуються в об’єднанні по шаблону union REGS, на початок якого вказує outregs. Опис об’єднань виконує точка виклику функції. Шаблон union REGS описаний в заголовочному файлі <dos.h> являє собою об’єднання двох структур:

struct WORDREGS {
unsigned int ax, bx, сx, dx, si, di, cflag, flags;
}
;

struct BYTEREGS {
unsigned char al, ah, bl, bh, cl, ch, dl, dh;
};

union REGS {
struct WORDREGS x;
struct BYTEREGS h;
};

Структура WORDREGS використовується для доступу до регістрів як до двобайтовим одиницям. Структура BYTEREGS дозволяє здійснювати доступ до окремих байтів РЗП. Поле структури flags дозволяє перед викликом задати, а після виклику прочитати значення регістру прапорів. Багато функцій MS-DOS використовують прапор переносу для сигналізації про помилки в програмі ‑ обробнику переривання, в структурі WORDREGS спеціально виділене поле cflag для значення прапора переносу.

Всі функції int...() повертають значення регістру АХ на виході з ISR. Недоліком функції int86() є можливість доступу лише до обмеженого числа регістрів. При виконанні деяких функцій MS-DOS значення задаються і в сегментних регістрах. В таких (щоправда, достатньо рідких) випадках належить використати більш загальну функцію int86x():

#include <dos.h>
int int86x( int intno,
      union REGS *inregs, union REGS *outregs,
      struct SREGS *segregs )

На відміну від int86() перед виконанням переривання intno додатково встановлюються сегментні регістри з структурної змінної по шаблону SREGS. В функцію передається покажчик на цю структурну змінну. По поверненні з ISR в структурну змінну по шаблону SREGS додатково копіюються значення всіх сегментних регістрів (про шаблон структури SREGS). Функції geninterrupt(), int86() і int86x() дозволяють виконати переривання з будь-яким номером. Якщо необхідно виконати звернення до функції MS-DOS (переривання 21h з заданим значенням АН), можна використати функцію intdos(), яка завжди звертається до переривання 21h.

#include <dos. h>
int intdos( union REGS *inregs, union REGS *outregs);

На відміну від раніше розглянутих функцій даній функції не передається номер переривання що генерується, бо завжди генерується переривання 21h.

#include <dos.h>
void intr (int intno, struct REGPACK *preg);

Функція завантажує внутрішні регістри мікропроцесора значеннями, записаними в області пам’яті, адресу якої задає покажчик preg, після цього генерує переривання intno. Значення внутрішніх регістрів на виході з обробника записуються в область пам’яті, на яку вказує preg. Структура REGPACK описана в файлі <dos.h>:

struct REGPACK {
unsigned r_ax, r_bx, r_cx, r_dx;
unsigned r_bp, r_si, r_di, r_ds, r_es, r_flags;

Функція не має значення що повертається і тому працює трохи швидше раніше розглянутих функцій.