> man operating_systems
Переход на страницу  [1] 2
Модераторы: Roman I Khimov, Wanderer, Dron
Автор Добавил
Димон
Воскресенье 26.08.2007 20:35
ID пользователя #761
Зарегистрирован: Пятница 10.11.2006 21:29
Сообщений: 27
Этот код не работает
#include "chrs.h"
//Здесь я храню состояние шифта
char shift = 0;

void Readkey(void)
{
  unsigned char scancode, ascii;
  unsigned char creg;

  //Прочитать скан-код из порта 0x60
  scancode = inportb(0x60);
  switch(scancode) {   
    //Скан-коды нажатого шифта
  case 0x36: 
  case 0x2A:
    shift = 1;
    break;
    //Скан-коды отпущенного шифта
  case 0x36 + 0x80:
  case 0x2A + 0x80:
    shift = 0;
    break;
    
  default:
  //Если клавиша отпущена...
    if(scancode >= 0x80) 
    {
        //То ничего не делать          
        } 
    else
    {
    //А если нажата...
      if(shift)
      {
      //Если шифт нажат, но преобразовать скан-код в "шифтнутое" ASCII
        ascii = scancodes_shifted[scancode];
      } 
      else 
      {
      //А если не нажат - то в обычное
        ascii = scancodes[scancode];
      }
      
      //Если в результате преобразования нажата клавиша с каким-либо
      //символом, то вывести его на экран
      if(ascii != 0) {
       putchar(ascii);
      }
    }
    break;
  }

  //Считаем байт состояния клавиатуры
  creg = inportb(0x61);
  
  //Установим в нем старший бит
  creg |= 1;

  //И запишем обратно
  outportb(0x61, creg);
}

Мне надо срочно его исправить.Я толком незнаю почему он не работает. Вроде scancode получает скан-код, но putchar нечего не выводит.(putchar 100% работает). Жду помощи.Если надо могу привести содержимое code.h.
Наверх
Dron
Воскресенье 26.08.2007 21:33


ID пользователя #13
Зарегистрирован: Понедельник 05.07.2004 11:16
Местонахождение: Москва
Сообщений: 651
Че-то как-то нелогично..

//Установим в нем старший бит
creg |= 1;


?-(

Одну из двух вечных российских проблем можно, в принципе, решить с помощью асфальтоукладчиков и катков. А вот с дорогами, конечно, будет труднее...

Андрей Валяев
Наверх
Сайт
Димон
Понедельник 27.08.2007 10:16
ID пользователя #761
Зарегистрирован: Пятница 10.11.2006 21:29
Сообщений: 27
Поправил ядро и всё заработало, но текст выводится с очень большой скоростю. Как мне сделать аналог функции sleep() если это поможет или подскажите другой выход из проблемы.
Наверх
Dron
Понедельник 27.08.2007 12:38


ID пользователя #13
Зарегистрирован: Понедельник 05.07.2004 11:16
Местонахождение: Москва
Сообщений: 651
Тебе наверное нужно просто корректно настроить клавиатуру...
там есть задержки повторов и всякое другое.

Одну из двух вечных российских проблем можно, в принципе, решить с помощью асфальтоукладчиков и катков. А вот с дорогами, конечно, будет труднее...

Андрей Валяев
Наверх
Сайт
Димон
Понедельник 27.08.2007 13:29
ID пользователя #761
Зарегистрирован: Пятница 10.11.2006 21:29
Сообщений: 27
Как её можно корректно настроить. Если можешь дай ссылку.

Мне нужно сделать аналог функции scanf.

[ Редактирование Понедельник 27.08.2007 13:31 ]
Наверх
Dron
Понедельник 27.08.2007 17:03


ID пользователя #13
Зарегистрирован: Понедельник 05.07.2004 11:16
Местонахождение: Москва
Сообщений: 651
Не вижу связи со scanf...
На wiki.osdev.ru был один документик... но че-то сайт не отзывается...

Одну из двух вечных российских проблем можно, в принципе, решить с помощью асфальтоукладчиков и катков. А вот с дорогами, конечно, будет труднее...

Андрей Валяев
Наверх
Сайт
alman
Понедельник 27.08.2007 18:56

ID пользователя #753
Зарегистрирован: Суббота 28.10.2006 01:21
Местонахождение: планета Земля
Сообщений: 95
Димон написал(а) ...

Поправил ядро и всё заработало, но текст выводится с очень большой скоростю. Как мне сделать аналог функции sleep() если это поможет или подскажите другой выход из проблемы.


Аналог sleep - команда процессора HLT. Я рекомендую не смеяться, а почитать про прерывания!
Использование HLT в вышеприведённом коде - простейшее решение. Обратите внимание, что возврат из HLT произойдет по любому прерыванию в системе, а не только по событию от контроллера клавиатуры.



[ Редактирование Вторник 28.08.2007 00:31 ]
Наверх
Сайт
alman
Понедельник 27.08.2007 19:16

ID пользователя #753
Зарегистрирован: Суббота 28.10.2006 01:21
Местонахождение: планета Земля
Сообщений: 95
Попробую пояснить предыдущий пост.
Вообще-то контроллер клавиатуры принято читать в прерываниях. В случае однозадачной системы, до прихода прерывания имеет смысл перевести процессор в режим низкого энергоптребления с помощью команды HLT.
В случае многозадачной системы, время задачи, которая ждёт события от клавиатуры, имеет смысл отдать другим задачам.

Кастельно scanf - попробуйте для начала реализовать sscanf, который парсит входную строку, а не стандартный поток ввода. Эта задача поинтереснее, и её всё равно придётся решать при написании scanf.
Наверх
Сайт
Димон
Вторник 28.08.2007 15:45
ID пользователя #761
Зарегистрирован: Пятница 10.11.2006 21:29
Сообщений: 27
Alman, в какое место нужно вписать asm("hlt")

//Если в результате преобразования нажата клавиша с каким-либо
//символом, то вывести его на экран
if(ascii != 0)
{
putchar(ascii);
}

После putchar(ascii) я ставил asm("hlt"), но вывелся один символ и подвисала вся система. В других случаях вообще ничего не выводилось.
Наверх
alman
Вторник 28.08.2007 18:19

ID пользователя #753
Зарегистрирован: Суббота 28.10.2006 01:21
Местонахождение: планета Земля
Сообщений: 95
Димон написал(а) ...

Alman, в какое место нужно вписать asm("hlt")
После putchar(ascii) я ставил asm("hlt"), но вывелся один символ и подвисала вся система. В других случаях вообще ничего не выводилось.


Из состояния hlt возможен выход по прерыванию.
Убедитесь, что прерывания разрешены.
Убедитесь что прерывания от клавиатуры разрешены:

#define IRQ_MASK_KEYBOARD 0x02

unsigned char irq_mask;

irq_mask = inb(0x21);
irq_mask &= ~IRQ_MASK_KEYBOARD;
outb(0x21, irq_mask);

Если мне не изменяет память, то "сбрасывать" прерывания от клавиатуры необходимо после каждого прерывания, иначе последующие не генерятся.

Кстати, прерывания от клавиатуры генерятся не только при нажатии клавиш, но и при их отпускании.


Наверх
Сайт
Переход на страницу  [1] 2  

Перейти:     Наверх

Транслировать сообщения этой темы: rss 0.92 Транслировать сообщения этой темы: rss 2.0 Транслировать сообщения этой темы: RDF
Powered by e107 Forum System

© OSRC.info, 2004-2010.
Авторские права на любые материалы, авторы которых явно указаны, принадлежат их авторам. По вопросам публикации таких материалов обращайтесь к авторам.
Авторские права на любые другие материалы принадлежат OSRC.info.
Сайт является помещением библиотеки. Копирование, сохранение на жестком диске или иной способ сохранения произведений осуществляются пользователями на свой риск.
При использовании материалов сайта ссылка на OSRC.info обязательна.