Системное программное обеспечение персональных ЭВМ


Пример 6



Пример 6

/*== ПРИМЕР 7.6 ==*/ /*====== Функции обслуживания стандартного ввода DOS =====*/ /* ВНИМАНИЕ! Для проверки реакции на Ctrl+Break программу следует запускать вне Турбо-среды */ #include <dos.h>

main() { union REGS in, rr; /* Регистры для вызовов DOS */ struct SREGS sr; /* Регистры для вызовов DOS */ int x,y; /* Коорд.курсора (1,6,7,8) или счетчик (A) */ unsigned char dosnum; /* Номер функции */ unsigned long d; /* Счетчик опросов (6) */ char string[13]; /* Буфер (A) */ char *s; /* Указатель в буфере (A) */ L0: clrscr(); printf("Укажите # функции DOS (1,6,7,8,B,A) >"); scanf("%x",&dosnum); printf("DOS-функция %02X.\n",dosnum); switch (dosnum) { case 1: printf("Ввод символа с эхо; "); printf("реагирует на Ctrl-Break.\n"); goto F; case 7: printf("Ввод символа без эхо; "); printf("не реагирует на Ctrl-Break.\n"); goto F; case 8: printf("Ввод символа без эхо; "); printf("реагирует на Ctrl-Break.\n"); goto F; case 6: printf("Ввод символа без эхо и без ожидания; "); printf("не реагирует на Ctrl-Break.\n"); printf("Окончание по Esc\n"); printf("Вводите >"); for(; ; ) { /* Цикл по клавишам */ for (d=0 ; ;d++ ) { /* Цикл ожидания нажатия клавиши */ rr.h.ah=6; rr.h.dl=0xff; /* FF в DL - запрос на ввод. */ intdos(&rr,&rr); /* Если символ готов, флаг ZF=0, а в AL - код символа, в противном случае ZF=1. */ if ((rr.x.flags&0x0040)==0) break; } x=wherex(); y=wherey(); gotoxy(1,7); clreol(); printf("Код==>%02x%c%d\n",rr.h.al); if (rr.h.al==0xff) break; delay(500); } break; case 0xa: printf("Буферизованный ввод строки; "); printf("реагирует на Ctrl-Break.\n"); string[0]=11; /* Макс.длина - 10 (без Enter) */ for(x=1; x"); for(x=0; x"); rr.h.ah=0x0a; sr.ds=FP_SEG(string); /* DS:DX - адрес буфера */ rr.x.dx=FP_OFF(string); intdosx(&rr,&rr,&sr); printf("\nБуфер после ввода>"); for(x=0; x"); for(s=string+2; *s!=13; printf("%c",*(s++))); printf("\n"); break; default: goto L0; } exit(); F: /* Общий алгоритм применения для функций 1,7,8 */ printf("Окончание по Esc\nВводите >"); for (; ; ) { rr.h.ah=dosnum; intdos(&rr,&rr); /* В AL - код символа. */ x=wherex(); y=wherey(); gotoxy(1,7); clreol(); printf(" Код==>%02x%c

И еще две возможности предоставляет DOS.

Функция 0x0C. При ее вызове в регистре AL должен быть номер одной из функций ввода (1, 6, 7, 8, 0x0A). Функция очищает буфер клавиатуры в памяти BIOS, а затем вызывает указанную в AL функцию.

Кроме того, поскольку стандартный ввод представляет собой файл DOS, с ним можно работать при помощи функции файлового ввода 0x3F, задавая дескриптор файла 1. Файловые функции будут рассмотрены позднее.




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