Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нужна помощь с обработчиком прерывания 
:(
    Опции темы
VerLinG
Дата 14.10.2008, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 19.12.2007

Репутация: нет
Всего: нет



Вообщем у меня есть такой вопрос. Есть программа, обрабатывающая прерывание

Сама она выполняет вот что :Если с клавиатуры последовательно вводятся буквы слова start, т.е. 's','t','a','r','t'  то дополнительно на экран должен вывестись закодированное слово “finish”. При нажатии на буквы на экран должен выдаваться '1', при нажатии на числа '0'. Выход из программы осуществляется при нажатии на клавишу <ESC>.


Код

#include "C:\qc\INCLUDE\CONIO.H"
#include "C:\qc\INCLUDE\dos.h"
#include "C:\qc\INCLUDE\graph.h"
#include "C:\qc\INCLUDE\stdio.h"
#include "C:\qc\INCLUDE\string.h"
#define intnum 0x09
#define EOI 0x20
#define ESC 27
unsigned char symbol;


void interrupt far int09(void);
char start[5] = "00000";

int main(){
void far *oldvector;
symbol = '0';
oldvector = _dos_getvect( intnum );

_dos_setvect( intnum, int09 );
 while (symbol != ESC){
 //printf ("%s", symbol);
 //getch();
 }
_dos_setvect( intnum, oldvector );
return 0;
}


//_dos_setvect( intnum, oldvector );
//return 0;


void interrupt far int09( void ) {
unsigned char scancode;
unsigned char byte1, byte2;

//_clearscreen(_GCLEARSCREEN);
scancode = inp(0x60);
byte1 = byte2 = inp(0x61);
byte1 = 0x80;
outp(0x61, byte1 );
outp(0x61, byte2 );



if (scancode==1){
symbol = ESC;
}

if ( scancode>1 && scancode <0x0C){ 
symbol = '0'; 
printf ("%c", symbol);
strcpy(start,"00000");
} 
if (
scancode >= 0x10 && scancode <= 0x1B ||
scancode >= 0x1E && scancode <= 0x28 ||
scancode >= 0x2C && scancode <= 0x35 ) 
{
 symbol = '1'; 
printf ("%c", symbol);

switch (scancode){
case 0x1f : start[0] = 's';  break;
case 0x14 : if (start[0] == 's' && start [1] == '0') { start[1] = 't';   break;}  else { 
           if (start[3] == 'r' && start [4] == '0') { start[4] = 't';  printf("finish"); break; } else {strcpy(start,"00000"); break;} }
case 0x1e : if (start[1] == 't' && start [2] == '0') {start[2] = 'a'; break;}  else { strcpy(start,"00000")  ; break;} 
case 0x13 : if (start[2] == 'a' && start [3] == '0') {start[3] = 'r'; break;  }  else {  strcpy(start,"00000");  break; } 
  
default : strcpy(start,"00000"); break;
}

}
outp(0x20, EOI );
}



Как сделать так, чтобы это прерывание выполнялось несколько по другому : все символы, короторые нам нужны помещались  бы в буфер клавиатуры, и уже из буфера считывались стандартными функциями, например getch();?
PM MAIL   Вверх
J0ker
Дата 14.10.2008, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 4
Всего: 14



настальгия прям  smile 
прерывание 09h аппаратное
возможно вам нужно прерывание 16h


--------------------
user posted image
PM MAIL   Вверх
VerLinG
Дата 15.10.2008, 08:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 19.12.2007

Репутация: нет
Всего: нет



16h - это байт прерывания....
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0461 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.